2024-09-13 08:04:35 +02:00

120 lines
3.3 KiB
TypeScript

import { IMessageDataWrapper, IMessageParser } from '@nitrots/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));
}
}
public get statuses(): RoomUnitStatusMessage[]
{
return this._statuses;
}
}