Files
node-metaverse/lib/classes/commands/InventoryCommands.ts
Casper Warden 76b080757b - Mesh upload support
- LLMesh asset decoding and encoding (inc. LLPhysicsConvex, LLSkin, LLSubMesh)
- Query inventory folder by type
- onSelectedObject event
- fetchInventoryItem command
- Fix packing/unpacking of object shape
- Time sync with SimulatorViewerTimeMessage
- Changed several classes to a .from style rather than setting up in the constructor (exception friendly)
- Whole bunch of other improvements
- Object building
2018-11-15 03:22:07 +00:00

78 lines
2.9 KiB
TypeScript

import {CommandsBase} from './CommandsBase';
import {InventoryFolder} from '../InventoryFolder';
import {AssetType, ChatSourceType, InventoryOfferedEvent, PacketFlags, UUID, Vector3} from '../..';
import {InstantMessageDialog} from '../../enums/InstantMessageDialog';
import {ImprovedInstantMessageMessage} from '../messages/ImprovedInstantMessage';
import {Utils} from '../Utils';
import {InventoryType} from '../../enums/InventoryType';
import {FolderType} from '../../enums/FolderType';
export class InventoryCommands extends CommandsBase
{
getInventoryRoot(): InventoryFolder
{
return this.agent.inventory.getRootFolderMain();
}
getLibraryRoot(): InventoryFolder
{
return this.agent.inventory.getRootFolderLibrary();
}
private async respondToInventoryOffer(event: InventoryOfferedEvent, response: InstantMessageDialog): Promise<void>
{
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
const im: ImprovedInstantMessageMessage = new ImprovedInstantMessageMessage();
const folderType = (event.type as unknown) as FolderType;
const folder = this.agent.inventory.findFolderForType(folderType);
const binary = Buffer.allocUnsafe(16);
folder.writeToBuffer(binary, 0);
im.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
im.MessageBlock = {
FromGroup: false,
ToAgentID: event.from,
ParentEstateID: 0,
RegionID: UUID.zero(),
Position: Vector3.getZero(),
Offline: 0,
Dialog: response,
ID: event.requestID,
Timestamp: Math.floor(new Date().getTime() / 1000),
FromAgentName: Utils.StringToBuffer(agentName),
Message: Utils.StringToBuffer(''),
BinaryBucket: binary
};
im.EstateBlock = {
EstateID: 0
};
const sequenceNo = this.circuit.sendMessage(im, PacketFlags.Reliable);
return await this.circuit.waitForAck(sequenceNo, 10000);
}
async acceptInventoryOffer(event: InventoryOfferedEvent): Promise<void>
{
if (event.source === ChatSourceType.Object)
{
return await this.respondToInventoryOffer(event, InstantMessageDialog.TaskInventoryAccepted);
}
else
{
return await this.respondToInventoryOffer(event, InstantMessageDialog.InventoryAccepted);
}
}
async rejectInventoryOffer(event: InventoryOfferedEvent): Promise<void>
{
if (event.source === ChatSourceType.Object)
{
return await this.respondToInventoryOffer(event, InstantMessageDialog.TaskInventoryDeclined);
}
else
{
return await this.respondToInventoryOffer(event, InstantMessageDialog.InventoryDeclined);
}
}
}