make server update interval an inheritable trait on entities

This commit is contained in:
Elizabeth Hunt 2023-08-29 12:26:58 -06:00
parent fd1bb1cca9
commit c551f519ca
Signed by: simponic
GPG Key ID: 52B3774857EB24B1
4 changed files with 22 additions and 6 deletions

View File

@ -59,4 +59,6 @@ export abstract class Entity {
public abstract setFrom(args: Record<string, any>): void;
public abstract serialize(): Record<string, any>;
public abstract getNextUpdateInterval(): number;
}

View File

@ -45,4 +45,8 @@ export class Floor extends Entity {
)
);
}
public getNextUpdateInterval() {
return Math.random() * 500;
}
}

View File

@ -102,4 +102,8 @@ export class Player extends Entity {
new BoundingBox(center, boundingBox.dimension, boundingBox.rotation)
].forEach((component) => this.addComponent(component));
}
public getNextUpdateInterval() {
return Math.random() * 30 + 50;
}
}

View File

@ -16,9 +16,10 @@ export class NetworkUpdate extends System {
private queueProvider: MessageQueueProvider;
private publisher: MessagePublisher;
private messageProcessor: MessageProcessor;
private entityUpdateInfo: Map<string, EntityUpdateInfo>;
private nextPublishInterval: number;
constructor(
queueProvider: MessageQueueProvider,
publisher: MessagePublisher,
@ -31,6 +32,7 @@ export class NetworkUpdate extends System {
this.messageProcessor = messageProcessor;
this.entityUpdateInfo = new Map();
this.nextPublishInterval = 0;
}
public update(dt: number, game: Game) {
@ -69,7 +71,7 @@ export class NetworkUpdate extends System {
updateInfo.timer -= dt;
this.entityUpdateInfo.set(entity.id, updateInfo);
if (updateInfo.timer > 0) return;
updateInfo.timer = this.getNextUpdateTimeMs();
updateInfo.timer = entity.getNextUpdateInterval();
this.entityUpdateInfo.set(entity.id, updateInfo);
// maybe update if hash is not consitent
@ -92,11 +94,15 @@ export class NetworkUpdate extends System {
body: updateMessages
});
// 3. publish changes
this.publisher.publish();
// 3. maybe publish changes - we don't want to overload the socket
this.nextPublishInterval -= dt;
if (this.nextPublishInterval < 0) {
this.publisher.publish();
this.nextPublishInterval = this.getNextUpdateInterval();
}
}
private getNextUpdateTimeMs() {
return Math.random() * 30 + 50;
private getNextUpdateInterval(): number {
return Math.random() * 30;
}
}