M starkingdoms-client/src/hub.ts => starkingdoms-client/src/hub.ts +23 -0
@@ 1,11 1,13 @@
import createDebug from "debug";
import type {
+ DespawnPartPacket,
MessagePacket,
Packet,
PartPositionsPacket,
PlanetPositionsPacket,
PlayerLeavePacket,
PlayerListPacket,
+ SpawnPartPacket,
SpawnPlayerPacket,
} from "./protocol.ts";
import { MessageType, PacketType } from "./protocol.ts";
@@ 14,6 16,8 @@ import { global } from "./globals.ts";
import { startRender } from "./rendering.ts";
import { ButtonType } from "./protocol.ts";
import type Chatbox from "./components/Chatbox.svelte";
+import {part_texture_url} from "./textures.js";
+import * as PIXI from "pixi.js";
const logger = createDebug("hub");
@@ 257,6 261,25 @@ export async function hub_connect(
).toString();
}
}
+ } else if (packet.t == PacketType.SpawnPart) {
+ let p = <SpawnPartPacket>packet.c;
+ let id = p.id;
+ let part = p.part;
+ global.parts_map.set(id, part);
+
+ logger(`spawn part`);
+ let part_sprite = PIXI.Sprite.from(part_texture_url(part.part_type));
+ global.rendering!.part_sprite_map.set(id, part_sprite);
+ global.rendering!.app.stage.addChild(part_sprite);
+ } else if (packet.t == PacketType.DespawnPart) {
+ let p = <DespawnPartPacket>packet.c;
+ let id = p.id;
+ let part = global.parts_map.get(id);
+ let part_sprite = PIXI.Sprite.from(part_texture_url(part.part_type));
+ logger(`despawned part`);
+ global.parts_map.delete(id);
+ global.rendering!.part_sprite_map.delete(id);
+ global.rendering!.app.stage.removeChild(part_sprite);
} else if (packet.t == PacketType.PlayerLeave) {
let p = <PlayerLeavePacket>packet.c;
let username = global.players_map.get(p.id)!;
M starkingdoms-client/src/protocol.ts => starkingdoms-client/src/protocol.ts +14 -0
@@ 10,6 10,7 @@ export enum PlanetType {
export enum PartType {
Hearty = "Hearty",
Cargo = "Cargo",
+ Hub = "Hub",
}
export enum ButtonType {
Left = "Left",
@@ 39,6 40,13 @@ export interface PlanetPositionsPacket {
export interface PartPositionsPacket {
parts: [number, Part][];
}
+export interface SpawnPartPacket {
+ id: number;
+ part: Part;
+}
+export interface DespawnPartPacket {
+ id: number;
+}
export interface PlayerInputPacket {
up: boolean;
down: boolean;
@@ 84,6 92,8 @@ export enum PacketType {
PlayerList = "PlayerList",
PlanetPositions = "PlanetPositions",
PartPositions = "PartPositions",
+ SpawnPart = "SpawnPart",
+ DespawnPart = "DespawnPart",
PlayerLeave = "PlayerLeave",
Message = "Message",
}
@@ 96,6 106,8 @@ export interface Packet {
| PlayerListPacket
| PlanetPositionsPacket
| PartPositionsPacket
+ | SpawnPartPacket
+ | DespawnPartPacket
| PlayerLeavePacket
| SendMessagePacket
| MessagePacket
@@ 114,6 126,8 @@ export const CLIENTBOUND = [
PacketType.PlayerList,
PacketType.PlanetPositions,
PacketType.PartPositions,
+ PacketType.SpawnPart,
+ PacketType.DespawnPart,
PacketType.PlayerLeave,
PacketType.Message,
];
M starkingdoms-client/src/textures.ts => starkingdoms-client/src/textures.ts +3 -0
@@ 3,6 3,7 @@ import tex_earth from "./assets/earth.svg";
import tex_moon from "./assets/moon.svg";
import tex_hearty from "./assets/hearty.svg";
import tex_cargo_off from "./assets/cargo_off.svg";
+import tex_hub_off from "./assets/hub_off.svg";
import tex_missing from "./assets/missing.svg";
export function planet_texture_url(type: PlanetType): string {
@@ 19,6 20,8 @@ export function part_texture_url(type: PartType): string {
return tex_hearty;
} else if (type == PartType.Cargo) {
return tex_cargo_off;
+ } else if (type == PartType.Hub) {
+ return tex_hub_off;
}
return tex_missing;
}