nitro/libs/renderer/src/nitro/communication/messages/parser/room/unit/RoomUnitStatusParser.ts

111 lines
2.7 KiB
TypeScript

import {IMessageDataWrapper, IMessageParser} from "../../../../../../api";
import {RoomUnitStatusAction} from "./RoomUnitStatusAction";
import {RoomUnitStatusMessage} from "./RoomUnitStatusMessage";
export class RoomUnitStatusParser implements IMessageParser {
private _statuses: RoomUnitStatusMessage[];
public flush(): boolean {
this._statuses = [];
return true;
}
public parse(wrapper: IMessageDataWrapper): boolean {
if (!wrapper) return false;
let totalUnits = wrapper.readInt();
while (totalUnits > 0) {
const status = this.parseStatus(wrapper);
if (!status) {
totalUnits--;
continue;
}
this._statuses.push(status);
totalUnits--;
}
return true;
}
public parseStatus(wrapper: IMessageDataWrapper): RoomUnitStatusMessage {
if (!wrapper) return null;
const unitId = wrapper.readInt();
const x = wrapper.readInt();
const y = wrapper.readInt();
const z = parseFloat(wrapper.readString());
const headDirection = (wrapper.readInt() % 8) * 45;
const direction = (wrapper.readInt() % 8) * 45;
const actions = wrapper.readString();
let targetX = 0;
let targetY = 0;
let targetZ = 0;
let height = 0;
let canStandUp = false;
let didMove = false;
const isSlide = false;
if (actions) {
const actionParts = actions.split("/");
const statusActions: RoomUnitStatusAction[] = [];
for (const action of actionParts) {
const parts = action.split(" ");
if (parts[0] === "") continue;
if (parts.length >= 2) {
switch (parts[0]) {
case "mv": {
const values = parts[1].split(",");
if (values.length >= 3) {
targetX = parseInt(values[0]);
targetY = parseInt(values[1]);
targetZ = parseFloat(values[2]);
didMove = true;
}
break;
}
case "sit": {
const sitHeight = parseFloat(parts[1]);
if (parts.length >= 3) canStandUp = parts[2] === "1";
height = sitHeight;
break;
}
case "lay": {
const layHeight = parseFloat(parts[1]);
height = Math.abs(layHeight);
break;
}
}
statusActions.push(new RoomUnitStatusAction(parts[0], parts[1]));
}
}
this._statuses.push(
new RoomUnitStatusMessage(unitId, x, y, z, height, headDirection, direction, targetX, targetY, targetZ, didMove, canStandUp, statusActions)
);
}
return null;
}
public get statuses(): RoomUnitStatusMessage[] {
return this._statuses;
}
}