Extensive work on building, wearables, assets, inventory, attachments, serialization, etc.
Resolves #36
This commit is contained in:
159
lib/classes/LLGesture.ts
Normal file
159
lib/classes/LLGesture.ts
Normal file
@@ -0,0 +1,159 @@
|
||||
import { LLGestureStep } from './LLGestureStep';
|
||||
import { LLGestureStepType } from '../enums/LLGestureStepType';
|
||||
import { LLGestureAnimationStep } from './LLGestureAnimationStep';
|
||||
import { UUID } from './UUID';
|
||||
import { LLGestureSoundStep } from './LLGestureSoundStep';
|
||||
import { LLGestureWaitStep } from './LLGestureWaitStep';
|
||||
import { LLGestureChatStep } from './LLGestureChatStep';
|
||||
|
||||
export class LLGesture
|
||||
{
|
||||
version: number;
|
||||
key: number;
|
||||
mask: number;
|
||||
trigger: string;
|
||||
replace: string;
|
||||
steps: LLGestureStep[] = [];
|
||||
|
||||
constructor(data?: string)
|
||||
{
|
||||
if (data !== undefined)
|
||||
{
|
||||
const lines: string[] = data.replace(/\r\n/g, '\n').split('\n');
|
||||
if (lines.length > 5)
|
||||
{
|
||||
this.version = parseInt(lines[0].trim(), 10);
|
||||
this.key = parseInt(lines[1].trim(), 10);
|
||||
this.mask = parseInt(lines[2].trim(), 10);
|
||||
this.trigger = lines[3].trim();
|
||||
this.replace = lines[4].trim();
|
||||
|
||||
const stepCount = parseInt(lines[5].trim(), 10);
|
||||
let lineNumber = 6;
|
||||
for (let step = 0; step < stepCount; step++)
|
||||
{
|
||||
if (lineNumber >= lines.length)
|
||||
{
|
||||
throw new Error('Invalid gesture step - unexpected end of file');
|
||||
}
|
||||
const stepType: LLGestureStepType = parseInt(lines[lineNumber++].trim(), 10);
|
||||
let gestureStep: LLGestureStep | undefined = undefined;
|
||||
switch (stepType)
|
||||
{
|
||||
case LLGestureStepType.Animation:
|
||||
{
|
||||
if (lineNumber + 2 >= lines.length)
|
||||
{
|
||||
throw new Error('Invalid animation gesture step - unexpected end of file');
|
||||
}
|
||||
const animStep = new LLGestureAnimationStep();
|
||||
animStep.animationName = lines[lineNumber++].trim();
|
||||
animStep.assetID = new UUID(lines[lineNumber++].trim());
|
||||
animStep.flags = parseInt(lines[lineNumber++].trim(), 10);
|
||||
gestureStep = animStep;
|
||||
break;
|
||||
}
|
||||
case LLGestureStepType.Sound:
|
||||
{
|
||||
if (lineNumber + 2 >= lines.length)
|
||||
{
|
||||
throw new Error('Invalid sound gesture step - unexpected end of file');
|
||||
}
|
||||
const soundStep = new LLGestureSoundStep();
|
||||
soundStep.soundName = lines[lineNumber++].trim();
|
||||
soundStep.assetID = new UUID(lines[lineNumber++].trim());
|
||||
soundStep.flags = parseInt(lines[lineNumber++].trim(), 10);
|
||||
gestureStep = soundStep;
|
||||
break;
|
||||
}
|
||||
case LLGestureStepType.Chat:
|
||||
{
|
||||
if (lineNumber + 1 >= lines.length)
|
||||
{
|
||||
throw new Error('Invalid chat gesture step - unexpected end of file');
|
||||
}
|
||||
const chatStep = new LLGestureChatStep();
|
||||
chatStep.chatText = lines[lineNumber++].trim();
|
||||
chatStep.flags = parseInt(lines[lineNumber++].trim(), 10);
|
||||
gestureStep = chatStep;
|
||||
break;
|
||||
}
|
||||
case LLGestureStepType.Wait:
|
||||
{
|
||||
if (lineNumber + 1 >= lines.length)
|
||||
{
|
||||
throw new Error('Invalid wait gesture step - unexpected end of file');
|
||||
}
|
||||
const waitStep = new LLGestureWaitStep();
|
||||
waitStep.waitTime = parseFloat(lines[lineNumber++].trim());
|
||||
waitStep.flags = parseInt(lines[lineNumber++].trim(), 10);
|
||||
gestureStep = waitStep;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new Error('Unknown gesture step type: ' + stepType);
|
||||
}
|
||||
if (gestureStep !== undefined)
|
||||
{
|
||||
this.steps.push(gestureStep);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Error('Invalid gesture asset - unexpected end of file');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
toAsset(): string
|
||||
{
|
||||
const lines: string[] = [
|
||||
String(this.version),
|
||||
String(this.key),
|
||||
String(this.mask),
|
||||
this.trigger,
|
||||
this.replace,
|
||||
String(this.steps.length)
|
||||
];
|
||||
for (const step of this.steps)
|
||||
{
|
||||
lines.push(String(step.stepType));
|
||||
switch (step.stepType)
|
||||
{
|
||||
case LLGestureStepType.Animation:
|
||||
{
|
||||
const gStep = step as LLGestureAnimationStep;
|
||||
lines.push(gStep.animationName);
|
||||
lines.push(gStep.assetID.toString());
|
||||
lines.push(String(gStep.flags));
|
||||
break;
|
||||
}
|
||||
case LLGestureStepType.Sound:
|
||||
{
|
||||
const gStep = step as LLGestureSoundStep;
|
||||
lines.push(gStep.soundName);
|
||||
lines.push(gStep.assetID.toString());
|
||||
lines.push(String(gStep.flags));
|
||||
break;
|
||||
}
|
||||
case LLGestureStepType.Chat:
|
||||
{
|
||||
const gStep = step as LLGestureChatStep;
|
||||
lines.push(gStep.chatText);
|
||||
lines.push(String(gStep.flags));
|
||||
break;
|
||||
}
|
||||
case LLGestureStepType.Wait:
|
||||
{
|
||||
const gStep = step as LLGestureWaitStep;
|
||||
lines.push(gStep.waitTime.toFixed(6));
|
||||
lines.push(String(gStep.flags));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
lines.push('\n');
|
||||
return lines.join('\n');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user