mirror of
https://github.com/duckietm/Nitro-Cool-UI-Renderer.git
synced 2025-06-21 06:56:58 +00:00
120 lines
3.3 KiB
TypeScript
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;
|
|
}
|
|
}
|