- 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 -
179 lines
6.3 KiB
TypeScript
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
|
|
}
|
|
}
|
|
}
|