You've already forked Nitro_Render_V3
mirror of
https://github.com/duckietm/Nitro_Render_V3.git
synced 2026-06-20 07:26:18 +00:00
123 lines
3.0 KiB
TypeScript
123 lines
3.0 KiB
TypeScript
import { IRoomObject, ITileObjectMap, RoomObjectVariable } from '@nitrots/api';
|
|
import { NitroLogger } from '@nitrots/utils';
|
|
|
|
export class TileObjectMap implements ITileObjectMap
|
|
{
|
|
private _tileObjectMap: Map<number, Map<number, IRoomObject>>;
|
|
private _width: number;
|
|
private _height: number;
|
|
|
|
constructor(k: number, _arg_2: number)
|
|
{
|
|
this._tileObjectMap = new Map();
|
|
|
|
let index = 0;
|
|
|
|
while(index < _arg_2)
|
|
{
|
|
this._tileObjectMap.set(index, new Map());
|
|
|
|
index++;
|
|
}
|
|
|
|
this._width = k;
|
|
this._height = _arg_2;
|
|
}
|
|
|
|
public clear(): void
|
|
{
|
|
for(const k of this._tileObjectMap.values())
|
|
{
|
|
if(!k) continue;
|
|
|
|
k.clear();
|
|
}
|
|
|
|
this._tileObjectMap.clear();
|
|
}
|
|
|
|
public populate(k: IRoomObject[]): void
|
|
{
|
|
this.clear();
|
|
|
|
for(const _local_2 of k) this.addRoomObject(_local_2);
|
|
}
|
|
|
|
public dispose(): void
|
|
{
|
|
this._tileObjectMap = null;
|
|
this._width = 0;
|
|
this._height = 0;
|
|
}
|
|
|
|
public getObjectIntTile(k: number, _arg_2: number): IRoomObject
|
|
{
|
|
if((((k >= 0) && (k < this._width)) && (_arg_2 >= 0)) && (_arg_2 < this._height))
|
|
{
|
|
const existing = this._tileObjectMap.get(_arg_2);
|
|
|
|
if(existing) return existing.get(k);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public setObjectInTile(k: number, _arg_2: number, _arg_3: IRoomObject): void
|
|
{
|
|
if(!_arg_3.isReady)
|
|
{
|
|
NitroLogger.log('Assigning non initialized object to tile object map!');
|
|
|
|
return;
|
|
}
|
|
|
|
if((((k >= 0) && (k < this._width)) && (_arg_2 >= 0)) && (_arg_2 < this._height))
|
|
{
|
|
const existing = this._tileObjectMap.get(_arg_2);
|
|
|
|
if(existing) existing.set(k, _arg_3);
|
|
}
|
|
}
|
|
|
|
public addRoomObject(k: IRoomObject): void
|
|
{
|
|
if(!k || !k.model || !k.isReady) return;
|
|
|
|
const location = k.getLocation();
|
|
const direction = k.getDirection();
|
|
|
|
if(!location || !direction) return;
|
|
|
|
let sizeX = k.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_X);
|
|
let sizeY = k.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Y);
|
|
|
|
if(sizeX < 1) sizeX = 1;
|
|
if(sizeY < 1) sizeY = 1;
|
|
|
|
const directionNumber = ((Math.trunc((direction.x + 45)) % 360) / 90);
|
|
|
|
if((directionNumber === 1) || (directionNumber === 3)) [sizeX, sizeY] = [sizeY, sizeX];
|
|
|
|
let y = location.y;
|
|
|
|
while(y < (location.y + sizeY))
|
|
{
|
|
let x = location.x;
|
|
|
|
while(x < (location.x + sizeX))
|
|
{
|
|
const roomObject = this.getObjectIntTile(x, y);
|
|
|
|
if((!(roomObject)) || ((!(roomObject === k)) && (roomObject.getLocation().z <= location.z)))
|
|
{
|
|
this.setObjectInTile(x, y, k);
|
|
}
|
|
|
|
x++;
|
|
}
|
|
|
|
y++;
|
|
}
|
|
}
|
|
}
|