diff options
Diffstat (limited to 'client/src/network')
-rw-r--r-- | client/src/network/MessageProcessor.ts | 74 | ||||
-rw-r--r-- | client/src/network/MessagePublisher.ts | 25 | ||||
-rw-r--r-- | client/src/network/MessageQueueReceiver.ts | 25 | ||||
-rw-r--r-- | client/src/network/index.ts | 3 |
4 files changed, 127 insertions, 0 deletions
diff --git a/client/src/network/MessageProcessor.ts b/client/src/network/MessageProcessor.ts new file mode 100644 index 0000000..539937a --- /dev/null +++ b/client/src/network/MessageProcessor.ts @@ -0,0 +1,74 @@ +import type { Game } from '@engine/Game'; +import { ComponentNames, Control, NetworkUpdateable } from '@engine/components'; +import { Entity } from '@engine/entities'; +import { + MessageType, + type Message, + type EntityAddBody, + type EntityUpdateBody, + type MessageProcessor +} from '@engine/network'; +import { Input, SystemNames } from '@engine/systems'; + +export class ClientMessageProcessor implements MessageProcessor { + private game: Game; + + constructor(game: Game) { + this.game = game; + } + + public process(message: Message) { + switch (message.type) { + case MessageType.NEW_ENTITIES: + const entityAdditions = message.body as unknown as EntityAddBody[]; + entityAdditions.forEach((addBody) => { + const entity = Entity.from( + addBody.entityName, + addBody.id, + addBody.args + ); + if (entity.hasComponent(ComponentNames.Control)) { + const clientId = this.game.getSystem<Input>( + SystemNames.Input + ).clientId; + const control = entity.getComponent<Control>( + ComponentNames.Control + ); + + if (control.controllableBy === clientId) { + entity.addComponent(new NetworkUpdateable()); + } + } + + this.game.addEntity(entity); + }); + break; + case MessageType.REMOVE_ENTITIES: + const ids = message.body as unknown as string[]; + ids.forEach((id) => this.game.removeEntity(id)); + break; + case MessageType.UPDATE_ENTITIES: + const entityUpdates = message.body as unknown as EntityUpdateBody[]; + entityUpdates.forEach(({ id, args }) => { + const entity = this.game.getEntity(id); + if (!entity) return; + + if (entity && entity.hasComponent(ComponentNames.Control)) { + const clientId = this.game.getSystem<Input>( + SystemNames.Input + ).clientId; + const control = entity.getComponent<Control>( + ComponentNames.Control + ); + + // don't listen to entities which we control + if (control.controllableBy === clientId) return; + } + entity.setFrom(args); + }); + break; + default: + break; + } + } +} diff --git a/client/src/network/MessagePublisher.ts b/client/src/network/MessagePublisher.ts new file mode 100644 index 0000000..de105c5 --- /dev/null +++ b/client/src/network/MessagePublisher.ts @@ -0,0 +1,25 @@ +import type { Message, MessagePublisher } from '@engine/network'; +import { stringify } from '@engine/utils'; + +export class ClientSocketMessagePublisher implements MessagePublisher { + private socket: WebSocket; + private messages: Message[]; + + constructor(socket: WebSocket) { + this.socket = socket; + this.messages = []; + } + + public addMessage(message: Message) { + this.messages.push(message); + } + + public publish() { + if (this.socket.readyState == WebSocket.OPEN) { + this.messages.forEach((message: Message) => + this.socket.send(stringify(message)) + ); + this.messages = []; + } + } +} diff --git a/client/src/network/MessageQueueReceiver.ts b/client/src/network/MessageQueueReceiver.ts new file mode 100644 index 0000000..46ca5cc --- /dev/null +++ b/client/src/network/MessageQueueReceiver.ts @@ -0,0 +1,25 @@ +import type { Message, MessageQueueProvider } from '@engine/network'; +import { parse } from '@engine/utils'; + +export class ClientSocketMessageQueueProvider implements MessageQueueProvider { + private socket: WebSocket; + private messages: Message[]; + + constructor(socket: WebSocket) { + this.socket = socket; + this.messages = []; + + this.socket.addEventListener('message', (e) => { + const messages = parse<Message[]>(e.data); + this.messages = this.messages.concat(messages); + }); + } + + public getNewMessages() { + return this.messages; + } + + public clearMessages() { + this.messages = []; + } +} diff --git a/client/src/network/index.ts b/client/src/network/index.ts new file mode 100644 index 0000000..1f4d1a4 --- /dev/null +++ b/client/src/network/index.ts @@ -0,0 +1,3 @@ +export * from './MessageProcessor'; +export * from './MessagePublisher'; +export * from './MessageQueueReceiver'; |