Add TeleportTo command and map region lookup by name

This commit is contained in:
Casper Warden
2017-12-16 06:42:41 +00:00
parent f4c0f82760
commit d278bc359b
21 changed files with 362 additions and 60 deletions

View File

@@ -1,10 +1,9 @@
/// <reference types="long" />
import { MapInfoReply } from '../../events/MapInfoReply';
import * as Long from 'long';
import { UUID } from '../UUID';
import { CommandsBase } from './CommandsBase';
import { RegionInfoReply } from '../../events/RegionInfoReply';
export declare class GridCommands extends CommandsBase {
getRegionHandle(regionID: UUID): Promise<Long>;
getRegionByName(regionName: string): Promise<RegionInfoReply>;
getRegionMapInfo(gridX: number, gridY: number): Promise<MapInfoReply>;
name2Key(name: string): Promise<UUID>;
}

View File

@@ -1,7 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const MapInfoReply_1 = require("../../events/MapInfoReply");
const RegionHandleRequest_1 = require("../messages/RegionHandleRequest");
const Message_1 = require("../../enums/Message");
const MapBlockRequest_1 = require("../messages/MapBlockRequest");
const UUID_1 = require("../UUID");
@@ -12,26 +11,59 @@ const GridItemType_1 = require("../../enums/GridItemType");
const CommandsBase_1 = require("./CommandsBase");
const AvatarPickerRequest_1 = require("../messages/AvatarPickerRequest");
const FilterResponse_1 = require("../../enums/FilterResponse");
const MapNameRequest_1 = require("../messages/MapNameRequest");
const GridLayerType_1 = require("../../enums/GridLayerType");
const RegionInfoReply_1 = require("../../events/RegionInfoReply");
class GridCommands extends CommandsBase_1.CommandsBase {
getRegionHandle(regionID) {
getRegionByName(regionName) {
return new Promise((resolve, reject) => {
const circuit = this.currentRegion.circuit;
const msg = new RegionHandleRequest_1.RegionHandleRequestMessage();
msg.RequestBlock = {
RegionID: regionID,
const response = new MapInfoReply_1.MapInfoReply();
const msg = new MapNameRequest_1.MapNameRequestMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
Flags: GridLayerType_1.GridLayerType.Objects,
EstateID: 0,
Godlike: false
};
msg.NameData = {
Name: Utils_1.Utils.StringToBuffer(regionName)
};
circuit.sendMessage(msg, PacketFlags_1.PacketFlags.Reliable);
circuit.waitForMessage(Message_1.Message.RegionIDAndHandleReply, 10000, (packet) => {
circuit.waitForMessage(Message_1.Message.MapBlockReply, 10000, (packet) => {
const filterMsg = packet.message;
if (filterMsg.ReplyBlock.RegionID.toString() === regionID.toString()) {
let found = false;
filterMsg.Data.forEach((region) => {
const name = Utils_1.Utils.BufferToStringSimple(region.Name);
if (name.trim().toLowerCase() === regionName.trim().toLowerCase()) {
found = true;
}
});
if (found) {
return FilterResponse_1.FilterResponse.Finish;
}
else {
return FilterResponse_1.FilterResponse.NoMatch;
}
return FilterResponse_1.FilterResponse.NoMatch;
}).then((packet) => {
const responseMsg = packet.message;
resolve(responseMsg.ReplyBlock.RegionHandle);
responseMsg.Data.forEach((region) => {
const name = Utils_1.Utils.BufferToStringSimple(region.Name);
if (name.trim().toLowerCase() === regionName.trim().toLowerCase() && !(region.X === 0 && region.Y === 0)) {
const reply = new RegionInfoReply_1.RegionInfoReply();
reply.access = region.Access;
reply.X = region.X;
reply.Y = region.Y;
reply.name = name;
reply.regionFlags = region.RegionFlags;
reply.waterHeight = region.WaterHeight;
reply.agents = region.Agents;
reply.mapImageID = region.MapImageID;
reply.handle = Utils_1.Utils.RegionCoordinatesToHandle(region.X * 256, region.Y * 256);
resolve(reply);
}
});
}).catch((err) => {
reject(err);
});
});
}
@@ -45,7 +77,7 @@ class GridCommands extends CommandsBase_1.CommandsBase {
SessionID: circuit.sessionID,
Flags: 65536,
EstateID: 0,
Godlike: true
Godlike: false
};
msg.PositionData = {
MinX: (gridX / 256),

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,7 @@
/// <reference types="long" />
import { CommandsBase } from './CommandsBase';
import { UUID } from '../UUID';
import * as Long from 'long';
export declare class RegionCommands extends CommandsBase {
getRegionHandle(regionID: UUID): Promise<Long>;
}

View File

@@ -1,7 +1,33 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const CommandsBase_1 = require("./CommandsBase");
const PacketFlags_1 = require("../../enums/PacketFlags");
const RegionHandleRequest_1 = require("../messages/RegionHandleRequest");
const Message_1 = require("../../enums/Message");
const FilterResponse_1 = require("../../enums/FilterResponse");
class RegionCommands extends CommandsBase_1.CommandsBase {
getRegionHandle(regionID) {
return new Promise((resolve, reject) => {
const circuit = this.currentRegion.circuit;
const msg = new RegionHandleRequest_1.RegionHandleRequestMessage();
msg.RequestBlock = {
RegionID: regionID,
};
circuit.sendMessage(msg, PacketFlags_1.PacketFlags.Reliable);
circuit.waitForMessage(Message_1.Message.RegionIDAndHandleReply, 10000, (packet) => {
const filterMsg = packet.message;
if (filterMsg.ReplyBlock.RegionID.toString() === regionID.toString()) {
return FilterResponse_1.FilterResponse.Finish;
}
else {
return FilterResponse_1.FilterResponse.NoMatch;
}
}).then((packet) => {
const responseMsg = packet.message;
resolve(responseMsg.ReplyBlock.RegionHandle);
});
});
}
}
exports.RegionCommands = RegionCommands;
//# sourceMappingURL=RegionCommands.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"RegionCommands.js","sourceRoot":"","sources":["../../../lib/classes/commands/RegionCommands.ts"],"names":[],"mappings":";;AAAA,iDAA4C;AAE5C,oBAA4B,SAAQ,2BAAY;CAG/C;AAHD,wCAGC"}
{"version":3,"file":"RegionCommands.js","sourceRoot":"","sources":["../../../lib/classes/commands/RegionCommands.ts"],"names":[],"mappings":";;AAAA,iDAA4C;AAI5C,yDAAoD;AACpD,yEAA2E;AAC3E,iDAA4C;AAC5C,+DAA0D;AAG1D,oBAA4B,SAAQ,2BAAY;IAE5C,eAAe,CAAC,QAAc;QAE1B,MAAM,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC3C,MAAM,GAAG,GAA+B,IAAI,gDAA0B,EAAE,CAAC;YACzE,GAAG,CAAC,YAAY,GAAG;gBACf,QAAQ,EAAE,QAAQ;aACrB,CAAC;YACF,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,yBAAW,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,CAAC,cAAc,CAAC,iBAAO,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,MAAc,EAAkB,EAAE;gBAE7F,MAAM,SAAS,GAAG,MAAM,CAAC,OAAwC,CAAC;gBAClE,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,CACrE,CAAC;oBACG,MAAM,CAAC,+BAAc,CAAC,MAAM,CAAC;gBACjC,CAAC;gBACD,IAAI,CACJ,CAAC;oBACG,MAAM,CAAC,+BAAc,CAAC,OAAO,CAAC;gBAClC,CAAC;YACL,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAc,EAAE,EAAE;gBAEvB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAwC,CAAC;gBACpE,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AA9BD,wCA8BC"}

View File

@@ -1,6 +1,12 @@
/// <reference types="long" />
import { CommandsBase } from './CommandsBase';
import { LureEvent } from '../../events/LureEvent';
import { TeleportEvent } from '../../events/TeleportEvent';
import { Vector3 } from '../Vector3';
import * as Long from 'long';
export declare class TeleportCommands extends CommandsBase {
private awaitTeleportEvent();
acceptTeleport(lure: LureEvent): Promise<TeleportEvent>;
teleportToHandle(handle: Long, position: Vector3, lookAt: Vector3): Promise<TeleportEvent>;
teleportTo(regionName: string, position: Vector3, lookAt: Vector3): Promise<TeleportEvent>;
}

View File

@@ -6,18 +6,10 @@ const TeleportEventType_1 = require("../../enums/TeleportEventType");
const PacketFlags_1 = require("../../enums/PacketFlags");
const TeleportLureRequest_1 = require("../messages/TeleportLureRequest");
const TeleportFlags_1 = require("../../enums/TeleportFlags");
const TeleportLocationRequest_1 = require("../messages/TeleportLocationRequest");
class TeleportCommands extends CommandsBase_1.CommandsBase {
acceptTeleport(lure) {
awaitTeleportEvent() {
return new Promise((resolve, reject) => {
const circuit = this.currentRegion.circuit;
const tlr = new TeleportLureRequest_1.TeleportLureRequestMessage();
tlr.Info = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
LureID: lure.lureID,
TeleportFlags: TeleportFlags_1.TeleportFlags.ViaLure
};
circuit.sendMessage(tlr, PacketFlags_1.PacketFlags.Reliable);
if (this.currentRegion.caps.eventQueueClient) {
if (this.bot.clientEvents === null) {
reject(new Error('ClientEvents is null'));
@@ -58,6 +50,60 @@ class TeleportCommands extends CommandsBase_1.CommandsBase {
}
});
}
else {
reject(new Error('EventQueue not ready'));
}
});
}
acceptTeleport(lure) {
return new Promise((resolve, reject) => {
const circuit = this.currentRegion.circuit;
const tlr = new TeleportLureRequest_1.TeleportLureRequestMessage();
tlr.Info = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
LureID: lure.lureID,
TeleportFlags: TeleportFlags_1.TeleportFlags.ViaLure
};
circuit.sendMessage(tlr, PacketFlags_1.PacketFlags.Reliable);
this.awaitTeleportEvent().then((event) => {
resolve(event);
}).catch((err) => {
reject(err);
});
});
}
teleportToHandle(handle, position, lookAt) {
return new Promise((resolve, reject) => {
const rtm = new TeleportLocationRequest_1.TeleportLocationRequestMessage();
rtm.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
rtm.Info = {
LookAt: lookAt,
Position: position,
RegionHandle: handle
};
this.circuit.sendMessage(rtm, PacketFlags_1.PacketFlags.Reliable);
this.awaitTeleportEvent().then((event) => {
resolve(event);
}).catch((err) => {
reject(err);
});
});
}
teleportTo(regionName, position, lookAt) {
return new Promise((resolve, reject) => {
this.bot.clientCommands.grid.getRegionByName(regionName).then((region) => {
this.teleportToHandle(region.handle, position, lookAt).then((event) => {
resolve(event);
}).catch((err) => {
reject(err);
});
}).catch((err) => {
reject(err);
});
});
}
}

View File

@@ -1 +1 @@
{"version":3,"file":"TeleportCommands.js","sourceRoot":"","sources":["../../../lib/classes/commands/TeleportCommands.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"TeleportCommands.js","sourceRoot":"","sources":["../../../lib/classes/commands/TeleportCommands.ts"],"names":[],"mappings":"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"}

14
dist/events/RegionInfoReply.d.ts vendored Normal file
View File

@@ -0,0 +1,14 @@
/// <reference types="long" />
import { UUID } from '../classes/UUID';
import * as Long from 'long';
export declare class RegionInfoReply {
X: number;
Y: number;
name: string;
access: number;
regionFlags: number;
waterHeight: number;
agents: number;
mapImageID: UUID;
handle: Long;
}

6
dist/events/RegionInfoReply.js vendored Normal file
View File

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

1
dist/events/RegionInfoReply.js.map vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"RegionInfoReply.js","sourceRoot":"","sources":["../../lib/events/RegionInfoReply.ts"],"names":[],"mappings":";;AAGA;CAWC;AAXD,0CAWC"}

3
dist/index.d.ts vendored
View File

@@ -9,4 +9,5 @@ import { InstantMessageEvent } from './events/InstantMessageEvent';
import { ChatSourceType } from './enums/ChatSourceType';
import { BotOptionFlags } from './enums/BotOptionFlags';
import { UUID } from './classes/UUID';
export { Bot, LoginParameters, AssetType, HTTPAssets, ClientEvents, BVH, InstantMessageEvent, InstantMessageEventFlags, ChatSourceType, BotOptionFlags, UUID };
import { Vector3 } from './classes/Vector3';
export { Bot, LoginParameters, AssetType, HTTPAssets, ClientEvents, BVH, InstantMessageEvent, InstantMessageEventFlags, ChatSourceType, BotOptionFlags, UUID, Vector3 };

2
dist/index.js vendored
View File

@@ -22,4 +22,6 @@ const BotOptionFlags_1 = require("./enums/BotOptionFlags");
exports.BotOptionFlags = BotOptionFlags_1.BotOptionFlags;
const UUID_1 = require("./classes/UUID");
exports.UUID = UUID_1.UUID;
const Vector3_1 = require("./classes/Vector3");
exports.Vector3 = Vector3_1.Vector3;
//# sourceMappingURL=index.js.map

2
dist/index.js.map vendored
View File

@@ -1 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;AAAA,+BAA0B;AAiBtB,cAjBI,SAAG,CAiBJ;AAhBP,+DAA0D;AAiBtD,0BAjBI,iCAAe,CAiBJ;AAhBnB,yDAAoD;AAmBhD,uBAnBI,2BAAY,CAmBJ;AAlBhB,uCAAkC;AAmB9B,cAnBI,SAAG,CAmBJ;AAdP,iDAA4C;AAWxC,oBAXI,qBAAS,CAWJ;AAVb,mDAA8C;AAW1C,qBAXI,uBAAU,CAWJ;AAVd,+EAA0E;AActE,mCAdI,mDAAwB,CAcJ;AAb5B,sEAAiE;AAY7D,8BAZI,yCAAmB,CAYJ;AAXvB,2DAAsD;AAalD,yBAbI,+BAAc,CAaJ;AAZlB,2DAAsD;AAalD,yBAbI,+BAAc,CAaJ;AAZlB,yCAAoC;AAahC,eAbI,WAAI,CAaJ"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;AAAA,+BAA0B;AAmBtB,cAnBI,SAAG,CAmBJ;AAlBP,+DAA0D;AAmBtD,0BAnBI,iCAAe,CAmBJ;AAlBnB,yDAAoD;AAqBhD,uBArBI,2BAAY,CAqBJ;AApBhB,uCAAkC;AAqB9B,cArBI,SAAG,CAqBJ;AAhBP,iDAA4C;AAaxC,oBAbI,qBAAS,CAaJ;AAZb,mDAA8C;AAa1C,qBAbI,uBAAU,CAaJ;AAZd,+EAA0E;AAgBtE,mCAhBI,mDAAwB,CAgBJ;AAf5B,sEAAiE;AAc7D,8BAdI,yCAAmB,CAcJ;AAbvB,2DAAsD;AAelD,yBAfI,+BAAc,CAeJ;AAdlB,2DAAsD;AAelD,yBAfI,+BAAc,CAeJ;AAdlB,yCAAoC;AAehC,eAfI,WAAI,CAeJ;AAdR,+CAA0C;AAetC,kBAfI,iBAAO,CAeJ"}

View File

@@ -184,6 +184,16 @@ 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(() =>
{
console.log("Teleport completed");
}).catch((err) => {
console.error(err);
});
}, 5000);
// When it's time to go home, call bot.close();
}).catch((error) =>
{

View File

@@ -1,7 +1,6 @@
import {MapInfoReply} from '../../events/MapInfoReply';
import {Packet} from '../Packet';
import * as Long from 'long';
import {RegionHandleRequestMessage} from '../messages/RegionHandleRequest';
import {MapItemReplyMessage} from '../messages/MapItemReply';
import {Message} from '../../enums/Message';
import {MapBlockReplyMessage} from '../messages/MapBlockReply';
@@ -11,42 +10,78 @@ import {MapItemRequestMessage} from '../messages/MapItemRequest';
import {Utils} from '../Utils';
import {PacketFlags} from '../../enums/PacketFlags';
import {GridItemType} from '../../enums/GridItemType';
import {RegionIDAndHandleReplyMessage} from '../messages/RegionIDAndHandleReply';
import {CommandsBase} from './CommandsBase';
import {AvatarPickerRequestMessage} from '../messages/AvatarPickerRequest';
import {AvatarPickerReplyMessage} from '../messages/AvatarPickerReply';
import {FilterResponse} from '../../enums/FilterResponse';
import {MapNameRequestMessage} from '../messages/MapNameRequest';
import {GridLayerType} from '../../enums/GridLayerType';
import {RegionInfoReply} from '../../events/RegionInfoReply';
export class GridCommands extends CommandsBase
{
getRegionHandle(regionID: UUID): Promise<Long>
getRegionByName(regionName: string)
{
return new Promise<Long>((resolve, reject) =>
return new Promise<RegionInfoReply>((resolve, reject) =>
{
const circuit = this.currentRegion.circuit;
const msg: RegionHandleRequestMessage = new RegionHandleRequestMessage();
msg.RequestBlock = {
RegionID: regionID,
const response = new MapInfoReply();
const msg: MapNameRequestMessage = new MapNameRequestMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
Flags: GridLayerType.Objects,
EstateID: 0,
Godlike: false
};
msg.NameData = {
Name: Utils.StringToBuffer(regionName)
};
circuit.sendMessage(msg, PacketFlags.Reliable);
circuit.waitForMessage(Message.RegionIDAndHandleReply, 10000, (packet: Packet): FilterResponse =>
circuit.waitForMessage(Message.MapBlockReply, 10000, (packet: Packet): FilterResponse =>
{
const filterMsg = packet.message as RegionIDAndHandleReplyMessage;
if (filterMsg.ReplyBlock.RegionID.toString() === regionID.toString())
const filterMsg = packet.message as MapBlockReplyMessage;
let found = false;
filterMsg.Data.forEach((region) =>
{
const name = Utils.BufferToStringSimple(region.Name);
if (name.trim().toLowerCase() === regionName.trim().toLowerCase())
{
found = true;
}
});
if (found)
{
return FilterResponse.Finish;
}
else
{
return FilterResponse.NoMatch;
}
return FilterResponse.NoMatch;
}).then((packet: Packet) =>
{
const responseMsg = packet.message as RegionIDAndHandleReplyMessage;
resolve(responseMsg.ReplyBlock.RegionHandle);
const responseMsg = packet.message as MapBlockReplyMessage;
responseMsg.Data.forEach((region) =>
{
const name = Utils.BufferToStringSimple(region.Name);
if (name.trim().toLowerCase() === regionName.trim().toLowerCase() && !(region.X === 0 && region.Y === 0))
{
const reply = new RegionInfoReply();
reply.access = region.Access;
reply.X = region.X;
reply.Y = region.Y;
reply.name = name;
reply.regionFlags = region.RegionFlags;
reply.waterHeight = region.WaterHeight;
reply.agents = region.Agents;
reply.mapImageID = region.MapImageID;
reply.handle = Utils.RegionCoordinatesToHandle(region.X * 256, region.Y * 256);
resolve(reply);
}
});
}).catch((err) =>
{
reject(err);
});
});
}
getRegionMapInfo(gridX: number, gridY: number): Promise<MapInfoReply>
{
return new Promise<MapInfoReply>((resolve, reject) =>
@@ -59,7 +94,7 @@ export class GridCommands extends CommandsBase
SessionID: circuit.sessionID,
Flags: 65536,
EstateID: 0,
Godlike: true
Godlike: false
};
msg.PositionData = {
MinX: (gridX / 256),

View File

@@ -1,6 +1,41 @@
import {CommandsBase} from './CommandsBase';
import {UUID} from '../UUID';
import {Packet} from '../Packet';
import * as Long from 'long';
import {PacketFlags} from '../../enums/PacketFlags';
import {RegionHandleRequestMessage} from '../messages/RegionHandleRequest';
import {Message} from '../../enums/Message';
import {FilterResponse} from '../../enums/FilterResponse';
import {RegionIDAndHandleReplyMessage} from '../messages/RegionIDAndHandleReply';
export class RegionCommands extends CommandsBase
{
getRegionHandle(regionID: UUID): Promise<Long>
{
return new Promise<Long>((resolve, reject) =>
{
const circuit = this.currentRegion.circuit;
const msg: RegionHandleRequestMessage = new RegionHandleRequestMessage();
msg.RequestBlock = {
RegionID: regionID,
};
circuit.sendMessage(msg, PacketFlags.Reliable);
circuit.waitForMessage(Message.RegionIDAndHandleReply, 10000, (packet: Packet): FilterResponse =>
{
const filterMsg = packet.message as RegionIDAndHandleReplyMessage;
if (filterMsg.ReplyBlock.RegionID.toString() === regionID.toString())
{
return FilterResponse.Finish;
}
else
{
return FilterResponse.NoMatch;
}
}).then((packet: Packet) =>
{
const responseMsg = packet.message as RegionIDAndHandleReplyMessage;
resolve(responseMsg.ReplyBlock.RegionHandle);
});
});
}
}

View File

@@ -6,22 +6,17 @@ import {TeleportEvent} from '../../events/TeleportEvent';
import {PacketFlags} from '../../enums/PacketFlags';
import {TeleportLureRequestMessage} from '../messages/TeleportLureRequest';
import {TeleportFlags} from '../../enums/TeleportFlags';
import {Vector3} from '../Vector3';
import {RegionInfoReply} from '../../events/RegionInfoReply';
import {TeleportLocationRequestMessage} from '../messages/TeleportLocationRequest';
import * as Long from 'long';
export class TeleportCommands extends CommandsBase
{
acceptTeleport(lure: LureEvent): Promise<TeleportEvent>
private awaitTeleportEvent(): Promise<TeleportEvent>
{
return new Promise<TeleportEvent>((resolve, reject) =>
{
const circuit = this.currentRegion.circuit;
const tlr = new TeleportLureRequestMessage();
tlr.Info = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
LureID: lure.lureID,
TeleportFlags: TeleportFlags.ViaLure
};
circuit.sendMessage(tlr, PacketFlags.Reliable);
if (this.currentRegion.caps.eventQueueClient)
{
if (this.bot.clientEvents === null)
@@ -77,6 +72,78 @@ export class TeleportCommands extends CommandsBase
}
});
}
else
{
reject(new Error('EventQueue not ready'));
}
});
}
acceptTeleport(lure: LureEvent): Promise<TeleportEvent>
{
return new Promise<TeleportEvent>((resolve, reject) =>
{
const circuit = this.currentRegion.circuit;
const tlr = new TeleportLureRequestMessage();
tlr.Info = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
LureID: lure.lureID,
TeleportFlags: TeleportFlags.ViaLure
};
circuit.sendMessage(tlr, PacketFlags.Reliable);
this.awaitTeleportEvent().then((event: TeleportEvent) =>
{
resolve(event);
}).catch((err) =>
{
reject(err);
});
});
}
teleportToHandle(handle: Long, position: Vector3, lookAt: Vector3)
{
return new Promise<TeleportEvent>((resolve, reject) =>
{
const rtm = new TeleportLocationRequestMessage();
rtm.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
rtm.Info = {
LookAt: lookAt,
Position: position,
RegionHandle: handle
};
this.circuit.sendMessage(rtm, PacketFlags.Reliable);
this.awaitTeleportEvent().then((event: TeleportEvent) =>
{
resolve(event);
}).catch((err) =>
{
reject(err);
});
});
}
teleportTo(regionName: string, position: Vector3, lookAt: Vector3)
{
return new Promise<TeleportEvent>((resolve, reject) =>
{
this.bot.clientCommands.grid.getRegionByName(regionName).then((region: RegionInfoReply) =>
{
this.teleportToHandle(region.handle, position, lookAt).then((event: TeleportEvent) =>
{
resolve(event);
}).catch((err) =>
{
reject(err);
})
}).catch((err) =>
{
reject(err);
});
});
}
}

View File

@@ -0,0 +1,15 @@
import {UUID} from '../classes/UUID';
import * as Long from 'long';
export class RegionInfoReply
{
X: number;
Y: number;
name: string;
access: number;
regionFlags: number;
waterHeight: number;
agents: number;
mapImageID: UUID;
handle: Long
}

View File

@@ -13,6 +13,8 @@ import {InstantMessageEvent} from './events/InstantMessageEvent';
import {ChatSourceType} from './enums/ChatSourceType';
import {BotOptionFlags} from './enums/BotOptionFlags';
import {UUID} from './classes/UUID';
import {Vector3} from './classes/Vector3';
export {
Bot,
@@ -25,5 +27,6 @@ export {
InstantMessageEventFlags,
ChatSourceType,
BotOptionFlags,
UUID
UUID,
Vector3
};