Files
node-metaverse/lib/classes/LLWearable.ts
Casper Warden 4740b07e11 - Add LLWearable parsing
- Remove ExtraParams, TextureAnim, ParticleSystem binary data from GameObjects, instead encode on the fly when needed
- Add XML object decoding (WIP)
- Move FlexibleData, LightDate, LightImageData, MeshData, SculptData inside ExtraParams class
-
2018-11-05 11:45:04 +00:00

179 lines
6.3 KiB
TypeScript

import {UUID} from './UUID';
import {WearableType} from '../enums/WearableType';
import {SaleType} from '../enums/SaleType';
export class LLWearable
{
name: string;
type: WearableType;
parameters: {[key: number]: number} = {};
textures: {[key: number]: UUID} = {};
permission: {
baseMask: number,
ownerMask: number,
groupMask: number,
everyoneMask: number,
nextOwnerMask: number,
creatorID: UUID,
ownerID: UUID,
lastOwnerID: UUID,
groupID: UUID
} = {
baseMask: 0,
ownerMask: 0,
groupMask: 0,
everyoneMask: 0,
nextOwnerMask: 0,
creatorID: UUID.zero(),
ownerID: UUID.zero(),
lastOwnerID: UUID.zero(),
groupID: UUID.zero()
};
saleType: SaleType;
salePrice: number;
constructor(data: string)
{
const lines: string[] = data.replace(/\r\n/g, '\n').split('\n');
for (let index = 0; index < lines.length; index++)
{
if (index === 0)
{
const header = lines[index].split(' ');
if (header[0] !== 'LLWearable')
{
return;
}
}
else if (index === 1)
{
this.name = lines[index];
}
else
{
const parsedLine = this.parseLine(lines[index]);
if (parsedLine.key !== null)
{
switch (parsedLine.key)
{
case 'base_mask':
this.permission.baseMask = parseInt(parsedLine.value, 16);
break;
case 'owner_mask':
this.permission.ownerMask = parseInt(parsedLine.value, 16);
break;
case 'group_mask':
this.permission.groupMask = parseInt(parsedLine.value, 16);
break;
case 'everyone_mask':
this.permission.everyoneMask = parseInt(parsedLine.value, 16);
break;
case 'next_owner_mask':
this.permission.nextOwnerMask = parseInt(parsedLine.value, 16);
break;
case 'creator_id':
this.permission.creatorID = new UUID(parsedLine.value);
break;
case 'owner_id':
this.permission.ownerID = new UUID(parsedLine.value);
break;
case 'last_owner_id':
this.permission.lastOwnerID = new UUID(parsedLine.value);
break;
case 'group_id':
this.permission.groupID = new UUID(parsedLine.value);
break;
case 'sale_type':
this.saleType = parseInt(parsedLine.value, 10);
break;
case 'sale_price':
this.salePrice = parseInt(parsedLine.value, 10);
break;
case 'type':
this.type = parseInt(parsedLine.value, 10);
break;
case 'parameters':
{
const num = parseInt(parsedLine.value, 10);
const max = index + num;
for (index; index < max; index++)
{
const paramLine = this.parseLine(lines[index++]);
if (paramLine.key !== null)
{
this.parameters[parseInt(paramLine.key, 10)] = parseInt(paramLine.value, 10);
}
}
break;
}
case 'textures':
{
const num = parseInt(parsedLine.value, 10);
const max = index + num ;
for (index; index < max; index++)
{
const texLine = this.parseLine(lines[index + 1]);
if (texLine.key !== null)
{
this.textures[parseInt(texLine.key, 10)] = new UUID(texLine.value);
}
}
break;
}
case 'permissions':
case 'sale_info':
case '{':
case '}':
// ignore
break;
default:
console.log('skipping: ' + lines[index]);
break;
}
}
}
}
}
private parseLine(line: string): {
'key': string | null,
'value': string
}
{
line = line.trim().replace(/[\t]/gu, ' ').trim();
while (line.indexOf('\u0020\u0020') > 0)
{
line = line.replace(/\u0020\u0020/gu, '\u0020');
}
let key: string | null = null;
let value = '';
if (line.length > 2)
{
const sep = line.indexOf(' ');
if (sep > 0)
{
key = line.substr(0, sep);
value = line.substr(sep + 1);
}
}
else if (line.length === 1)
{
key = line;
}
else if (line.length > 0)
{
return {
'key': line,
'value': ''
}
}
if (key !== null)
{
key = key.trim();
}
return {
'key': key,
'value': value
}
}
}