GameState is now save in cache

HasPlayerMoved is send when the player is actually moving on the map every 200ms.
This commit is contained in:
GRL 2021-05-18 11:33:16 +02:00
parent 8cef4f6e90
commit 3edfd5b285
13 changed files with 404 additions and 100 deletions

View file

@ -1,6 +1,6 @@
import * as tg from "generic-type-guard";
export const isPositionState = new tg.IsInterface().withProperties({
/*export const isPositionState = new tg.IsInterface().withProperties({
x: tg.isNumber,
y: tg.isNumber
}).get()
@ -12,19 +12,16 @@ export const isPlayerState = new tg.IsInterface()
}).get()
).get()
export type PlayerStateObject = tg.GuardedType<typeof isPlayerState>;
export type PlayerStateObject = tg.GuardedType<typeof isPlayerState>;*/
export const isGameStateEvent =
new tg.IsInterface().withProperties({
roomId: tg.isString,
data: tg.isObject,
mapUrl: tg.isString,
nickName: tg.isString,
uuid: tg.isUnion(tg.isString, tg.isUndefined),
players: isPlayerState,
startLayerName: tg.isUnion(tg.isString, tg.isNull)
}).get();
/**
* A message sent from the game to the iFrame when a user enters or leaves a zone marked with the "zone" property.
* A message sent from the game to the iFrame when the gameState is got by the script
*/
export type GameStateEvent = tg.GuardedType<typeof isGameStateEvent>;

View file

@ -0,0 +1,16 @@
import * as tg from "generic-type-guard";
export const isHasDataLayerChangedEvent =
new tg.IsInterface().withProperties({
data: tg.isObject
}).get();
/**
* A message sent from the game to the iFrame when the data of the layers change after the iFrame send a message to the game that it want to listen to the data of the layers
*/
export type HasDataLayerChangedEvent = tg.GuardedType<typeof isHasDataLayerChangedEvent>;
export type HasDataLayerChangedEventCallback = (event: HasDataLayerChangedEvent) => void

View file

@ -1,19 +0,0 @@
import * as tg from "generic-type-guard";
export const isHasMovedEvent =
new tg.IsInterface().withProperties({
direction: tg.isString,
moving: tg.isBoolean,
x: tg.isNumber,
y: tg.isNumber
}).get();
/**
* A message sent from the iFrame to the game to add a message in the chat.
*/
export type HasMovedEvent = tg.GuardedType<typeof isHasMovedEvent>;
export type HasMovedEventCallback = (event: HasMovedEvent) => void

View file

@ -0,0 +1,19 @@
import * as tg from "generic-type-guard";
export const isHasPlayerMovedEvent =
new tg.IsInterface().withProperties({
direction: tg.isString,
moving: tg.isBoolean,
x: tg.isNumber,
y: tg.isNumber
}).get();
/**
* A message sent from the game to the iFrame when the player move after the iFrame send a message to the game that it want to listen to the position of the player
*/
export type HasPlayerMovedEvent = tg.GuardedType<typeof isHasPlayerMovedEvent>;
export type HasPlayerMovedEventCallback = (event: HasPlayerMovedEvent) => void

View file

@ -1,15 +1,16 @@
import { GameStateEvent } from './ApiGameStateEvent';
import { GameStateEvent } from './GameStateEvent';
import { ButtonClickedEvent } from './ButtonClickedEvent';
import { ChatEvent } from './ChatEvent';
import { ClosePopupEvent } from './ClosePopupEvent';
import { EnterLeaveEvent } from './EnterLeaveEvent';
import { GoToPageEvent } from './GoToPageEvent';
import { HasMovedEvent } from './HasMovedEvent';
import { HasPlayerMovedEvent } from './HasPlayerMovedEvent';
import { OpenCoWebSiteEvent } from './OpenCoWebSiteEvent';
import { OpenPopupEvent } from './OpenPopupEvent';
import { OpenTabEvent } from './OpenTabEvent';
import { UserInputChatEvent } from './UserInputChatEvent';
import { HasDataLayerChangedEvent } from "./HasDataLayerChangedEvent";
export interface TypedMessageEvent<T> extends MessageEvent {
@ -30,7 +31,8 @@ export type IframeEventMap = {
restorePlayerControls: null
displayBubble: null
removeBubble: null
enableMoveEvents: undefined
onPlayerMove: undefined
onDataLayerChange: undefined
}
export interface IframeEvent<T extends keyof IframeEventMap> {
type: T;
@ -47,7 +49,8 @@ export interface IframeResponseEventMap {
leaveEvent: EnterLeaveEvent
buttonClickedEvent: ButtonClickedEvent
gameState: GameStateEvent
hasMovedEvent: HasMovedEvent
hasPlayerMoved: HasPlayerMovedEvent
hasDataLayerChanged: HasDataLayerChangedEvent
}
export interface IframeResponseEvent<T extends keyof IframeResponseEventMap> {
type: T;

View file

@ -12,10 +12,11 @@ import { GoToPageEvent, isGoToPageEvent } from "./Events/GoToPageEvent";
import { isOpenCoWebsite, OpenCoWebSiteEvent } from "./Events/OpenCoWebSiteEvent";
import { IframeEventMap, IframeEvent, IframeResponseEvent, IframeResponseEventMap, isIframeEventWrapper, TypedMessageEvent } from "./Events/IframeEvent";
import { UserInputChatEvent } from "./Events/UserInputChatEvent";
import { GameStateEvent } from './Events/ApiGameStateEvent';
import { GameStateEvent } from './Events/GameStateEvent';
import { deepFreezeClone as deepFreezeClone } from '../utility';
import { HasMovedEvent } from './Events/HasMovedEvent';
import { HasPlayerMovedEvent } from './Events/HasPlayerMovedEvent';
import { Math } from 'phaser';
import { HasDataLayerChangedEvent } from "./Events/HasDataLayerChangedEvent";
@ -58,14 +59,14 @@ class IframeListener {
private readonly _removeBubbleStream: Subject<void> = new Subject();
public readonly removeBubbleStream = this._removeBubbleStream.asObservable();
private readonly _gameStateStream: Subject<void> = new Subject();
public readonly gameStateStream = this._gameStateStream.asObservable();
private readonly iframes = new Set<HTMLIFrameElement>();
private readonly scripts = new Map<string, HTMLIFrameElement>();
private sendMoveEvents: boolean = false;
private lastMoveTimestamp: number = 0
private sendPlayerMove: boolean = false;
private sendDataLayerChange: boolean = false;
init() {
window.addEventListener("message", (message: TypedMessageEvent<IframeEvent<keyof IframeEventMap>>) => {
@ -119,8 +120,10 @@ class IframeListener {
this._removeBubbleStream.next();
} else if (payload.type == "getState") {
this._gameStateStream.next();
} else if (payload.type == "enableMoveEvents") {
this.sendMoveEvents = true
} else if (payload.type == "onPlayerMove") {
this.sendPlayerMove = true
} else if (payload.type == "onDataLayerChange") {
this.sendDataLayerChange = true
}
}
@ -133,7 +136,7 @@ class IframeListener {
sendFrozenGameStateEvent(gameStateEvent: GameStateEvent) {
this.postMessage({
'type': 'gameState',
'data': deepFreezeClone(gameStateEvent)
'data': gameStateEvent //deepFreezeClone(gameStateEvent)
});
}
@ -240,16 +243,21 @@ class IframeListener {
});
}
hasMovedEvent(event: HasMovedEvent) {
if (this.sendMoveEvents) {
if (this.lastMoveTimestamp < Date.now() - 100) {
this.lastMoveTimestamp = Date.now()
this.postMessage({
'type': 'hasMovedEvent',
'data': event
});
}
hasPlayerMoved(event: HasPlayerMovedEvent) {
if (this.sendPlayerMove) {
this.postMessage({
'type': 'hasPlayerMoved',
'data': event
});
}
}
hasDataLayerChanged(event: HasDataLayerChangedEvent) {
if (this.sendDataLayerChange) {
this.postMessage({
'type' : 'hasDataLayerChanged',
'data' : event
});
}
}