Inventory skeleton refactor

This commit is contained in:
Casper Warden
2017-12-19 23:43:00 +00:00
parent 4743dbfeec
commit 7987f5b379
27 changed files with 304 additions and 90 deletions

View File

@@ -153,7 +153,8 @@ class Agent {
}
});
}
this.inventory.main.skeleton.forEach((folder) => {
Object.keys(this.inventory.main.skeleton).forEach((uuid) => {
const folder = this.inventory.main.skeleton[uuid];
if (folder.typeDefault === AssetType_1.AssetType.CurrentOutfitFolder) {
const folderID = folder.folderID;
const requestFolder = {

File diff suppressed because one or more lines are too long

View File

@@ -9,6 +9,7 @@ import { GridCommands } from './commands/GridCommands';
import { CommunicationsCommands } from './commands/CommunicationsCommands';
import { AgentCommands } from './commands/AgentCommands';
import { GroupCommands } from './commands/GroupCommands';
import { InventoryCommands } from './commands/InventoryCommands';
export declare class ClientCommands {
network: NetworkCommands;
asset: AssetCommands;
@@ -18,5 +19,6 @@ export declare class ClientCommands {
comms: CommunicationsCommands;
agent: AgentCommands;
group: GroupCommands;
inventory: InventoryCommands;
constructor(region: Region, agent: Agent, bot: Bot);
}

View File

@@ -8,6 +8,7 @@ const GridCommands_1 = require("./commands/GridCommands");
const CommunicationsCommands_1 = require("./commands/CommunicationsCommands");
const AgentCommands_1 = require("./commands/AgentCommands");
const GroupCommands_1 = require("./commands/GroupCommands");
const InventoryCommands_1 = require("./commands/InventoryCommands");
class ClientCommands {
constructor(region, agent, bot) {
this.network = new NetworkCommands_1.NetworkCommands(region, agent, bot);
@@ -18,6 +19,7 @@ class ClientCommands {
this.comms = new CommunicationsCommands_1.CommunicationsCommands(region, agent, bot);
this.agent = new AgentCommands_1.AgentCommands(region, agent, bot);
this.group = new GroupCommands_1.GroupCommands(region, agent, bot);
this.inventory = new InventoryCommands_1.InventoryCommands(region, agent, bot);
}
}
exports.ClientCommands = ClientCommands;

View File

@@ -1 +1 @@
{"version":3,"file":"ClientCommands.js","sourceRoot":"","sources":["../../lib/classes/ClientCommands.ts"],"names":[],"mappings":";;AAGA,gEAA2D;AAC3D,4DAAuD;AACvD,kEAA6D;AAC7D,8DAAyD;AACzD,0DAAqD;AACrD,8EAAyE;AACzE,4DAAuD;AACvD,4DAAuD;AAEvD;IAWI,YAAY,MAAc,EAAE,KAAY,EAAE,GAAQ;QAE9C,IAAI,CAAC,OAAO,GAAG,IAAI,iCAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,mCAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,IAAI,+BAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,IAAI,2BAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,+CAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;CACJ;AAtBD,wCAsBC"}
{"version":3,"file":"ClientCommands.js","sourceRoot":"","sources":["../../lib/classes/ClientCommands.ts"],"names":[],"mappings":";;AAGA,gEAA2D;AAC3D,4DAAuD;AACvD,kEAA6D;AAC7D,8DAAyD;AACzD,0DAAqD;AACrD,8EAAyE;AACzE,4DAAuD;AACvD,4DAAuD;AACvD,oEAA+D;AAE/D;IAYI,YAAY,MAAc,EAAE,KAAY,EAAE,GAAQ;QAE9C,IAAI,CAAC,OAAO,GAAG,IAAI,iCAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,mCAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,IAAI,+BAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,IAAI,2BAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,+CAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,qCAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;CACJ;AAxBD,wCAwBC"}

View File

@@ -1,29 +1,24 @@
import { UUID } from './UUID';
import { ClientEvents } from './ClientEvents';
import { AssetType } from '../enums/AssetType';
import { InventoryFolder } from './InventoryFolder';
export declare class Inventory {
main: {
skeleton: {
typeDefault: AssetType;
version: number;
name: string;
folderID: UUID;
parentID: UUID;
}[];
[key: string]: InventoryFolder;
};
root?: UUID;
};
library: {
owner?: UUID;
skeleton: {
typeDefault: number;
version: number;
name: string;
folderID: UUID;
parentID: UUID;
}[];
[key: string]: InventoryFolder;
};
root?: UUID;
};
private clientEvents;
constructor(clientEvents: ClientEvents);
getRootFolderLibrary(): InventoryFolder;
getRootFolderMain(): InventoryFolder;
findFolderForType(type: AssetType): UUID;
}

View File

@@ -2,16 +2,41 @@
Object.defineProperty(exports, "__esModule", { value: true });
const UUID_1 = require("./UUID");
const AssetType_1 = require("../enums/AssetType");
const InventoryFolder_1 = require("./InventoryFolder");
class Inventory {
constructor(clientEvents) {
this.main = {
skeleton: []
skeleton: {}
};
this.library = {
skeleton: []
skeleton: {}
};
this.clientEvents = clientEvents;
}
getRootFolderLibrary() {
if (this.library.root === undefined) {
return new InventoryFolder_1.InventoryFolder(this.library);
}
const uuidStr = this.library.root.toString();
if (this.library.skeleton[uuidStr]) {
return this.library.skeleton[uuidStr];
}
else {
return new InventoryFolder_1.InventoryFolder(this.library);
}
}
getRootFolderMain() {
if (this.main.root === undefined) {
return new InventoryFolder_1.InventoryFolder(this.main);
}
const uuidStr = this.main.root.toString();
if (this.main.skeleton[uuidStr]) {
return this.main.skeleton[uuidStr];
}
else {
return new InventoryFolder_1.InventoryFolder(this.main);
}
}
findFolderForType(type) {
if (this.main.root === undefined) {
return UUID_1.UUID.zero();
@@ -20,7 +45,8 @@ class Inventory {
return this.main.root;
}
let found = UUID_1.UUID.zero();
this.main.skeleton.forEach((folder) => {
Object.keys(this.main.skeleton).forEach((uuid) => {
const folder = this.main.skeleton[uuid];
if (folder.typeDefault === type) {
found = folder.folderID;
}

View File

@@ -1 +1 @@
{"version":3,"file":"Inventory.js","sourceRoot":"","sources":["../../lib/classes/Inventory.ts"],"names":[],"mappings":";;AAAA,iCAA4B;AAE5B,kDAA6C;AAE7C;IA6BI,YAAY,YAA0B;QA3BtC,SAAI,GASA;YACA,QAAQ,EAAE,EAAE;SACf,CAAC;QACF,YAAO,GAUH;YACA,QAAQ,EAAE,EAAE;SACf,CAAC;QAKE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IACD,iBAAiB,CAAC,IAAe;QAE7B,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CACjC,CAAC;YACG,MAAM,CAAC,WAAI,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QACD,EAAE,CAAC,CAAC,IAAI,KAAK,qBAAS,CAAC,MAAM,CAAC,CAC9B,CAAC;YACG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,GAAG,WAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAElC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,CAChC,CAAC;gBACG,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC5B,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;CACJ;AArDD,8BAqDC"}
{"version":3,"file":"Inventory.js","sourceRoot":"","sources":["../../lib/classes/Inventory.ts"],"names":[],"mappings":";;AAAA,iCAA4B;AAE5B,kDAA6C;AAC7C,uDAAkD;AAGlD;IAiBI,YAAY,YAA0B;QAftC,SAAI,GAGA;YACA,QAAQ,EAAE,EAAE;SACf,CAAC;QACF,YAAO,GAIH;YACA,QAAQ,EAAE,EAAE;SACf,CAAC;QAKE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IACD,oBAAoB;QAEhB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CACpC,CAAC;YACG,MAAM,CAAC,IAAI,iCAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7C,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CACnC,CAAC;YACG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CACJ,CAAC;YACG,MAAM,CAAC,IAAI,iCAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IACD,iBAAiB;QAEb,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CACjC,CAAC;YACG,MAAM,CAAC,IAAI,iCAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1C,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAChC,CAAC;YACG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CACJ,CAAC;YACG,MAAM,CAAC,IAAI,iCAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IACD,iBAAiB,CAAC,IAAe;QAE7B,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CACjC,CAAC;YACG,MAAM,CAAC,WAAI,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QACD,EAAE,CAAC,CAAC,IAAI,KAAK,qBAAS,CAAC,MAAM,CAAC,CAC9B,CAAC;YACG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,GAAG,WAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAE7C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,CAChC,CAAC;gBACG,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC5B,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;CACJ;AA1ED,8BA0EC"}

19
dist/classes/InventoryFolder.d.ts vendored Normal file
View File

@@ -0,0 +1,19 @@
import { UUID } from './UUID';
import { AssetType } from '../enums/AssetType';
import { InventoryItem } from './InventoryItem';
export declare class InventoryFolder {
typeDefault: AssetType;
version: number;
name: string;
folderID: UUID;
parentID: UUID;
items: InventoryItem[];
private inventoryBase;
constructor(invBase: {
skeleton: {
[key: string]: InventoryFolder;
};
root?: UUID;
});
getChildFolders(): InventoryFolder[];
}

21
dist/classes/InventoryFolder.js vendored Normal file
View File

@@ -0,0 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class InventoryFolder {
constructor(invBase) {
this.items = [];
this.inventoryBase = invBase;
}
getChildFolders() {
const children = [];
const ofi = this.folderID.toString();
Object.keys(this.inventoryBase.skeleton).forEach((uuid) => {
const folder = this.inventoryBase.skeleton[uuid];
if (folder.parentID.toString() === ofi) {
children.push(folder);
}
});
return children;
}
}
exports.InventoryFolder = InventoryFolder;
//# sourceMappingURL=InventoryFolder.js.map

1
dist/classes/InventoryFolder.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"InventoryFolder.js","sourceRoot":"","sources":["../../lib/classes/InventoryFolder.ts"],"names":[],"mappings":";;AAKA;IAcI,YAAY,OAGX;QAVD,UAAK,GAAoB,EAAE,CAAC;QAYxB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,eAAe;QAEX,MAAM,QAAQ,GAAsB,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjD,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CACvC,CAAC;gBACG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC;IACpB,CAAC;CACJ;AApCD,0CAoCC"}

2
dist/classes/InventoryItem.d.ts vendored Normal file
View File

@@ -0,0 +1,2 @@
export declare class InventoryItem {
}

6
dist/classes/InventoryItem.js vendored Normal file
View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class InventoryItem {
}
exports.InventoryItem = InventoryItem;
//# sourceMappingURL=InventoryItem.js.map

1
dist/classes/InventoryItem.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"InventoryItem.js","sourceRoot":"","sources":["../../lib/classes/InventoryItem.ts"],"names":[],"mappings":";;AAAA;CAGC;AAHD,sCAGC"}

View File

@@ -6,6 +6,7 @@ const Region_1 = require("./Region");
const LoginFlags_1 = require("../enums/LoginFlags");
const Vector3_1 = require("./Vector3");
const Long = require("long");
const InventoryFolder_1 = require("./InventoryFolder");
class LoginResponse {
constructor(json, clientEvents, options) {
this.events = {
@@ -23,37 +24,53 @@ class LoginResponse {
switch (key) {
case 'inventory-skeleton':
val.forEach((item) => {
const skeletonItem = {
typeDefault: parseInt(item['type_default'], 10),
version: parseInt(item['version'], 10),
name: String(item['name']),
folderID: new UUID_1.UUID(item['folder_id']),
parentID: new UUID_1.UUID(item['parent_id'])
};
this.agent.inventory.main.skeleton.push(skeletonItem);
const folder = new InventoryFolder_1.InventoryFolder(this.agent.inventory.main);
folder.typeDefault = parseInt(item['type_default'], 10);
folder.version = parseInt(item['version'], 10);
folder.name = String(item['name']);
folder.folderID = new UUID_1.UUID(item['folder_id']);
folder.parentID = new UUID_1.UUID(item['parent_id']);
this.agent.inventory.main.skeleton[folder.folderID.toString()] = folder;
});
break;
case 'inventory-skel-lib':
val.forEach((item) => {
const skeletonItem = {
typeDefault: parseInt(item['type_default'], 10),
version: parseInt(item['version'], 10),
name: String(item['name']),
folderID: new UUID_1.UUID(item['folder_id']),
parentID: new UUID_1.UUID(item['parent_id'])
};
this.agent.inventory.library.skeleton.push(skeletonItem);
const folder = new InventoryFolder_1.InventoryFolder(this.agent.inventory.library);
folder.typeDefault = parseInt(item['type_default'], 10);
folder.version = parseInt(item['version'], 10);
folder.name = String(item['name']);
folder.folderID = new UUID_1.UUID(item['folder_id']);
folder.parentID = new UUID_1.UUID(item['parent_id']);
this.agent.inventory.library.skeleton[folder.folderID.toString()] = folder;
});
break;
case 'inventory-root':
this.agent.inventory.main.root = new UUID_1.UUID(val[0]['folder_id']);
break;
{
this.agent.inventory.main.root = new UUID_1.UUID(val[0]['folder_id']);
const folder = new InventoryFolder_1.InventoryFolder(this.agent.inventory.main);
folder.typeDefault = 0;
folder.version = 0;
folder.name = 'root';
folder.folderID = new UUID_1.UUID(val[0]['folder_id']);
folder.parentID = UUID_1.UUID.zero();
this.agent.inventory.main.skeleton[folder.folderID.toString()] = folder;
break;
}
case 'inventory-lib-owner':
this.agent.inventory.library.owner = new UUID_1.UUID(val[0]['agent_id']);
break;
case 'inventory-lib-root':
this.agent.inventory.library.root = new UUID_1.UUID(val[0]['folder_id']);
break;
{
this.agent.inventory.library.root = new UUID_1.UUID(val[0]['folder_id']);
const folder = new InventoryFolder_1.InventoryFolder(this.agent.inventory.library);
folder.typeDefault = 0;
folder.version = 0;
folder.name = 'root';
folder.folderID = new UUID_1.UUID(val[0]['folder_id']);
folder.parentID = UUID_1.UUID.zero();
this.agent.inventory.library.skeleton[folder.folderID.toString()] = folder;
break;
}
case 'agent_access_max':
this.agent.accessMax = String(val);
break;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
import { CommandsBase } from './CommandsBase';
import { InventoryFolder } from '../InventoryFolder';
export declare class InventoryCommands extends CommandsBase {
getInventoryRoot(): InventoryFolder;
getLibraryRoot(): InventoryFolder;
}

View File

@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const CommandsBase_1 = require("./CommandsBase");
class InventoryCommands extends CommandsBase_1.CommandsBase {
getInventoryRoot() {
return this.agent.inventory.getRootFolderMain();
}
getLibraryRoot() {
return this.agent.inventory.getRootFolderLibrary();
}
}
exports.InventoryCommands = InventoryCommands;
//# sourceMappingURL=InventoryCommands.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"InventoryCommands.js","sourceRoot":"","sources":["../../../lib/classes/commands/InventoryCommands.ts"],"names":[],"mappings":";;AAAA,iDAA4C;AAG5C,uBAA+B,SAAQ,2BAAY;IAE/C,gBAAgB;QAEZ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;IACpD,CAAC;IACD,cAAc;QAEV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC;IACvD,CAAC;CACJ;AAVD,8CAUC"}

View File

@@ -194,7 +194,7 @@ function connect()
// Retrieve group roles
const userToInvite = new nmv.UUID("d1cd5b71-6209-4595-9bf0-771bf689ce00");
const groupID = new nmv.UUID("c6424e05-6e2c-fb03-220b-ca7904d11e04");
const groupID = new nmv.UUID("c6424e05-6e2c-fb03-220b-ca7904d11e04");
bot.clientCommands.group.getGroupRoles(groupID).then((roles) =>
{
@@ -220,7 +220,7 @@ function connect()
}
else
{
bot.clientCommands.group.sendGroupInvite(groupID, userToInvite , role.RoleID);
bot.clientCommands.group.sendGroupInvite(groupID, userToInvite, role.RoleID);
}
});
}
@@ -229,16 +229,25 @@ function connect()
setTimeout(() => // TODO: This 5 second delay is a fudge. We need to wait for the eventqueue to start properly
{
bot.clientCommands.teleport.teleportTo('Izanagi', new nmv.Vector3([128, 128, 20]), new nmv.Vector3([0, 1.0, 0])).then(() =>
bot.clientCommands.teleport.teleportTo('Izanagi', new nmv.Vector3([128, 128, 20]), new nmv.Vector3([0,
1.0,
0])).then(() =>
{
console.log("Teleport completed");
}).catch((err) => {
}).catch((err) =>
{
console.error(err);
});
}, 5000);
bot.clientCommands.comms.sendFriendRequest(master, 'Be friends with me?');
const folders = bot.clientCommands.inventory.getInventoryRoot().getChildFolders();
folders.forEach((folder) =>
{
console.log('Top level folder: ' + folder.name);
});
// When it's time to go home, call bot.close();
}).catch((error) =>
{

View File

@@ -242,8 +242,9 @@ export class Agent
});
}
this.inventory.main.skeleton.forEach((folder) =>
Object.keys(this.inventory.main.skeleton).forEach((uuid) =>
{
const folder = this.inventory.main.skeleton[uuid];
if (folder.typeDefault === AssetType.CurrentOutfitFolder)
{
const folderID = folder.folderID;

View File

@@ -9,6 +9,7 @@ import {GridCommands} from './commands/GridCommands';
import {CommunicationsCommands} from './commands/CommunicationsCommands';
import {AgentCommands} from './commands/AgentCommands';
import {GroupCommands} from './commands/GroupCommands';
import {InventoryCommands} from './commands/InventoryCommands';
export class ClientCommands
{
@@ -20,6 +21,7 @@ export class ClientCommands
public comms: CommunicationsCommands;
public agent: AgentCommands;
public group: GroupCommands;
public inventory: InventoryCommands;
constructor(region: Region, agent: Agent, bot: Bot)
{
@@ -31,5 +33,6 @@ export class ClientCommands
this.comms = new CommunicationsCommands(region, agent, bot);
this.agent = new AgentCommands(region, agent, bot);
this.group = new GroupCommands(region, agent, bot);
this.inventory = new InventoryCommands(region, agent, bot);
}
}

View File

@@ -1,33 +1,23 @@
import {UUID} from './UUID';
import {ClientEvents} from './ClientEvents';
import {AssetType} from '../enums/AssetType';
import {InventoryFolder} from './InventoryFolder';
import uuid = require('uuid');
export class Inventory
{
main: {
skeleton: {
typeDefault: AssetType,
version: number,
name: string,
folderID: UUID,
parentID: UUID
}[],
skeleton: {[key: string]: InventoryFolder},
root?: UUID
} = {
skeleton: []
skeleton: {}
};
library: {
owner?: UUID,
skeleton: {
typeDefault: number,
version: number,
name: string,
folderID: UUID,
parentID: UUID
}[],
skeleton: {[key: string]: InventoryFolder},
root?: UUID
} = {
skeleton: []
skeleton: {}
};
private clientEvents: ClientEvents;
@@ -35,6 +25,38 @@ export class Inventory
{
this.clientEvents = clientEvents;
}
getRootFolderLibrary(): InventoryFolder
{
if (this.library.root === undefined)
{
return new InventoryFolder(this.library);
}
const uuidStr = this.library.root.toString();
if (this.library.skeleton[uuidStr])
{
return this.library.skeleton[uuidStr];
}
else
{
return new InventoryFolder(this.library);
}
}
getRootFolderMain(): InventoryFolder
{
if (this.main.root === undefined)
{
return new InventoryFolder(this.main);
}
const uuidStr = this.main.root.toString();
if (this.main.skeleton[uuidStr])
{
return this.main.skeleton[uuidStr];
}
else
{
return new InventoryFolder(this.main);
}
}
findFolderForType(type: AssetType): UUID
{
if (this.main.root === undefined)
@@ -46,8 +68,9 @@ export class Inventory
return this.main.root;
}
let found = UUID.zero();
this.main.skeleton.forEach((folder) =>
Object.keys(this.main.skeleton).forEach((uuid) =>
{
const folder = this.main.skeleton[uuid];
if (folder.typeDefault === type)
{
found = folder.folderID;

View File

@@ -0,0 +1,42 @@
import {UUID} from './UUID';
import {AssetType} from '../enums/AssetType';
import {InventoryItem} from './InventoryItem';
import {Inventory} from './Inventory';
export class InventoryFolder
{
typeDefault: AssetType;
version: number;
name: string;
folderID: UUID;
parentID: UUID;
items: InventoryItem[] = [];
private inventoryBase: {
skeleton: {[key: string]: InventoryFolder},
root?: UUID
};
constructor(invBase: {
skeleton: {[key: string]: InventoryFolder},
root?: UUID
})
{
this.inventoryBase = invBase;
}
getChildFolders(): InventoryFolder[]
{
const children: InventoryFolder[] = [];
const ofi = this.folderID.toString();
Object.keys(this.inventoryBase.skeleton).forEach((uuid) =>
{
const folder = this.inventoryBase.skeleton[uuid];
if (folder.parentID.toString() === ofi)
{
children.push(folder);
}
});
return children;
}
}

View File

@@ -0,0 +1,4 @@
export class InventoryItem
{
}

View File

@@ -6,6 +6,7 @@ import {Vector3} from './Vector3';
import Long = require('long');
import {ClientEvents} from './ClientEvents';
import {BotOptionFlags} from '../enums/BotOptionFlags';
import {InventoryFolder} from './InventoryFolder';
export class LoginResponse
{
@@ -102,50 +103,54 @@ export class LoginResponse
case 'inventory-skeleton':
val.forEach((item: any) =>
{
const skeletonItem: {
typeDefault: number,
version: number,
name: string,
folderID: UUID,
parentID: UUID
} = {
typeDefault: parseInt(item['type_default'], 10),
version: parseInt(item['version'], 10),
name: String(item['name']),
folderID: new UUID(item['folder_id']),
parentID: new UUID(item['parent_id'])
};
this.agent.inventory.main.skeleton.push(skeletonItem);
const folder = new InventoryFolder(this.agent.inventory.main);
folder.typeDefault = parseInt(item['type_default'], 10);
folder.version = parseInt(item['version'], 10);
folder.name = String(item['name']);
folder.folderID = new UUID(item['folder_id']);
folder.parentID = new UUID(item['parent_id']);
this.agent.inventory.main.skeleton[folder.folderID.toString()] = folder;
});
break;
case 'inventory-skel-lib':
val.forEach((item: any) =>
{
const skeletonItem: {
typeDefault: number,
version: number,
name: string,
folderID: UUID,
parentID: UUID
} = {
typeDefault: parseInt(item['type_default'], 10),
version: parseInt(item['version'], 10),
name: String(item['name']),
folderID: new UUID(item['folder_id']),
parentID: new UUID(item['parent_id'])
};
this.agent.inventory.library.skeleton.push(skeletonItem);
const folder = new InventoryFolder(this.agent.inventory.library);
folder.typeDefault = parseInt(item['type_default'], 10);
folder.version = parseInt(item['version'], 10);
folder.name = String(item['name']);
folder.folderID = new UUID(item['folder_id']);
folder.parentID = new UUID(item['parent_id']);
this.agent.inventory.library.skeleton[folder.folderID.toString()] = folder;
});
break;
case 'inventory-root':
{
this.agent.inventory.main.root = new UUID(val[0]['folder_id']);
const folder = new InventoryFolder(this.agent.inventory.main);
folder.typeDefault = 0;
folder.version = 0;
folder.name = 'root';
folder.folderID = new UUID(val[0]['folder_id']);
folder.parentID = UUID.zero();
this.agent.inventory.main.skeleton[folder.folderID.toString()] = folder;
break;
}
case 'inventory-lib-owner':
this.agent.inventory.library.owner = new UUID(val[0]['agent_id']);
break;
case 'inventory-lib-root':
{
this.agent.inventory.library.root = new UUID(val[0]['folder_id']);
const folder = new InventoryFolder(this.agent.inventory.library);
folder.typeDefault = 0;
folder.version = 0;
folder.name = 'root';
folder.folderID = new UUID(val[0]['folder_id']);
folder.parentID = UUID.zero();
this.agent.inventory.library.skeleton[folder.folderID.toString()] = folder;
break;
}
case 'agent_access_max':
this.agent.accessMax = String(val);
break;

View File

@@ -0,0 +1,14 @@
import {CommandsBase} from './CommandsBase';
import {InventoryFolder} from '../InventoryFolder';
export class InventoryCommands extends CommandsBase
{
getInventoryRoot(): InventoryFolder
{
return this.agent.inventory.getRootFolderMain();
}
getLibraryRoot(): InventoryFolder
{
return this.agent.inventory.getRootFolderLibrary();
}
}