Add support for getting grid map block data via a range request

This commit is contained in:
Casper Warden
2018-04-07 21:43:39 +01:00
parent fce9213ad7
commit 70f1faafdc
17 changed files with 183 additions and 31 deletions

File diff suppressed because one or more lines are too long

6
dist/classes/MapBlock.d.ts vendored Normal file
View File

@@ -0,0 +1,6 @@
import { UUID } from "./UUID";
export declare class MapBlock {
name: string;
mapImage: UUID;
accessFlags: number;
}

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

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

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

@@ -0,0 +1 @@
{"version":3,"file":"MapBlock.js","sourceRoot":"","sources":["../../lib/classes/MapBlock.ts"],"names":[],"mappings":";;AAEA;CAKC;AALD,4BAKC"}

View File

@@ -2,8 +2,10 @@ import { MapInfoReply } from '../../events/MapInfoReply';
import { UUID } from '../UUID';
import { CommandsBase } from './CommandsBase';
import { RegionInfoReply } from '../../events/RegionInfoReply';
import { MapInfoRangeReply } from '../../events/MapInfoRangeReply';
export declare class GridCommands extends CommandsBase {
getRegionByName(regionName: string): Promise<RegionInfoReply>;
getRegionMapInfo(gridX: number, gridY: number): Promise<MapInfoReply>;
getRegionMapInfoRange(minX: number, minY: number, maxX: number, maxY: number): Promise<MapInfoRangeReply>;
name2Key(name: string): Promise<UUID>;
}

View File

@@ -14,6 +14,8 @@ const FilterResponse_1 = require("../../enums/FilterResponse");
const MapNameRequest_1 = require("../messages/MapNameRequest");
const GridLayerType_1 = require("../../enums/GridLayerType");
const RegionInfoReply_1 = require("../../events/RegionInfoReply");
const MapInfoRangeReply_1 = require("../../events/MapInfoRangeReply");
const MapBlock_1 = require("../MapBlock");
class GridCommands extends CommandsBase_1.CommandsBase {
getRegionByName(regionName) {
return new Promise((resolve, reject) => {
@@ -75,15 +77,15 @@ class GridCommands extends CommandsBase_1.CommandsBase {
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
Flags: 65536,
Flags: 2,
EstateID: 0,
Godlike: false
};
msg.PositionData = {
MinX: (gridX / 256),
MaxX: (gridX / 256),
MinY: (gridY / 256),
MaxY: (gridY / 256)
MinX: gridX,
MaxX: gridX,
MinY: gridY,
MaxY: gridY
};
circuit.sendMessage(msg, PacketFlags_1.PacketFlags.Reliable);
circuit.waitForMessage(Message_1.Message.MapBlockReply, 10000, (packet) => {
@@ -102,9 +104,10 @@ class GridCommands extends CommandsBase_1.CommandsBase {
const responseMsg = packet.message;
responseMsg.Data.forEach((data) => {
if (data.X === (gridX / 256) && data.Y === (gridY / 256)) {
response.name = Utils_1.Utils.BufferToStringSimple(data.Name);
response.accessFlags = data.Access;
response.mapImage = data.MapImageID;
response.block = new MapBlock_1.MapBlock();
response.block.name = Utils_1.Utils.BufferToStringSimple(data.Name);
response.block.accessFlags = data.Access;
response.block.mapImage = data.MapImageID;
}
});
const regionHandle = Utils_1.Utils.RegionCoordinatesToHandle(gridX, gridY);
@@ -157,6 +160,53 @@ class GridCommands extends CommandsBase_1.CommandsBase {
});
});
}
getRegionMapInfoRange(minX, minY, maxX, maxY) {
return new Promise((resolve, reject) => {
const circuit = this.currentRegion.circuit;
const response = new MapInfoRangeReply_1.MapInfoRangeReply();
const msg = new MapBlockRequest_1.MapBlockRequestMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
Flags: 2,
EstateID: 0,
Godlike: false
};
msg.PositionData = {
MinX: minX,
MaxX: maxX,
MinY: minY,
MaxY: maxY
};
circuit.sendMessage(msg, PacketFlags_1.PacketFlags.Reliable);
circuit.waitForMessage(Message_1.Message.MapBlockReply, 30000, (packet) => {
const filterMsg = packet.message;
let found = false;
filterMsg.Data.forEach((data) => {
if (data.X >= minX && data.X <= maxX && data.Y >= minY && data.Y <= maxY) {
found = true;
const mapBlock = new MapBlock_1.MapBlock();
mapBlock.name = Utils_1.Utils.BufferToStringSimple(data.Name);
mapBlock.accessFlags = data.Access;
mapBlock.mapImage = data.MapImageID;
response.regions.push(mapBlock);
}
});
if (found) {
return FilterResponse_1.FilterResponse.Match;
}
return FilterResponse_1.FilterResponse.NoMatch;
}).then((packet) => {
}).catch((err) => {
if (err.message === 'Timeout') {
resolve(response);
}
else {
reject(err);
}
});
});
}
name2Key(name) {
const check = name.split('.');
if (check.length > 1) {
@@ -190,7 +240,8 @@ class GridCommands extends CommandsBase_1.CommandsBase {
let found = null;
const apr = packet.message;
apr.Data.forEach((dataBlock) => {
const resultName = (Utils_1.Utils.BufferToStringSimple(dataBlock.FirstName) + ' ' + Utils_1.Utils.BufferToStringSimple(dataBlock.LastName)).toLowerCase();
const resultName = (Utils_1.Utils.BufferToStringSimple(dataBlock.FirstName) + ' ' +
Utils_1.Utils.BufferToStringSimple(dataBlock.LastName)).toLowerCase();
if (resultName === name) {
found = dataBlock.AvatarID;
}

File diff suppressed because one or more lines are too long

4
dist/events/MapInfoRangeReply.d.ts vendored Normal file
View File

@@ -0,0 +1,4 @@
import { MapBlock } from '../classes/MapBlock';
export declare class MapInfoRangeReply {
regions: MapBlock[];
}

9
dist/events/MapInfoRangeReply.js vendored Normal file
View File

@@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class MapInfoRangeReply {
constructor() {
this.regions = [];
}
}
exports.MapInfoRangeReply = MapInfoRangeReply;
//# sourceMappingURL=MapInfoRangeReply.js.map

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

@@ -0,0 +1 @@
{"version":3,"file":"MapInfoRangeReply.js","sourceRoot":"","sources":["../../lib/events/MapInfoRangeReply.ts"],"names":[],"mappings":";;AAEA;IAAA;QAEI,YAAO,GAAe,EAAE,CAAC;IAC7B,CAAC;CAAA;AAHD,8CAGC"}

View File

@@ -1,8 +1,6 @@
import { UUID } from '../classes/UUID';
import { MapBlock } from '../classes/MapBlock';
export declare class MapInfoReply {
name: string;
mapImage: UUID;
accessFlags: number;
block: MapBlock;
avatars: {
X: number;
Y: number;

View File

@@ -1 +1 @@
{"version":3,"file":"MapInfoReply.js","sourceRoot":"","sources":["../../lib/events/MapInfoReply.ts"],"names":[],"mappings":";;AAEA;CASC;AATD,oCASC"}
{"version":3,"file":"MapInfoReply.js","sourceRoot":"","sources":["../../lib/events/MapInfoReply.ts"],"names":[],"mappings":";;AAEA;CAOC;AAPD,oCAOC"}

View File

@@ -299,8 +299,7 @@ export class Circuit
const keys: string[] = Object.keys(this.awaitingAck);
keys.forEach((seqID: string) =>
{
keys.forEach((seqID: string) => {
const nSeq = parseInt(seqID, 10);
if (oldest === -1 || this.awaitingAck[nSeq].sent < oldest)
{

8
lib/classes/MapBlock.ts Normal file
View File

@@ -0,0 +1,8 @@
import {UUID} from "./UUID";
export class MapBlock
{
name: string;
mapImage: UUID;
accessFlags: number;
}

View File

@@ -17,6 +17,8 @@ import {FilterResponse} from '../../enums/FilterResponse';
import {MapNameRequestMessage} from '../messages/MapNameRequest';
import {GridLayerType} from '../../enums/GridLayerType';
import {RegionInfoReply} from '../../events/RegionInfoReply';
import {MapInfoRangeReply} from '../../events/MapInfoRangeReply';
import {MapBlock} from '../MapBlock';
export class GridCommands extends CommandsBase
{
getRegionByName(regionName: string)
@@ -92,15 +94,15 @@ export class GridCommands extends CommandsBase
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
Flags: 65536,
Flags: 2,
EstateID: 0,
Godlike: false
};
msg.PositionData = {
MinX: (gridX / 256),
MaxX: (gridX / 256),
MinY: (gridY / 256),
MaxY: (gridY / 256)
MinX: gridX,
MaxX: gridX,
MinY: gridY,
MaxY: gridY
};
circuit.sendMessage(msg, PacketFlags.Reliable);
circuit.waitForMessage(Message.MapBlockReply, 10000, (packet: Packet): FilterResponse =>
@@ -126,9 +128,10 @@ export class GridCommands extends CommandsBase
{
if (data.X === (gridX / 256) && data.Y === (gridY / 256))
{
response.name = Utils.BufferToStringSimple(data.Name);
response.accessFlags = data.Access;
response.mapImage = data.MapImageID;
response.block = new MapBlock();
response.block.name = Utils.BufferToStringSimple(data.Name);
response.block.accessFlags = data.Access;
response.block.mapImage = data.MapImageID;
}
});
@@ -195,6 +198,65 @@ export class GridCommands extends CommandsBase
});
}
getRegionMapInfoRange(minX: number, minY: number, maxX: number, maxY: number): Promise<MapInfoRangeReply>
{
return new Promise<MapInfoRangeReply>((resolve, reject) =>
{
const circuit = this.currentRegion.circuit;
const response = new MapInfoRangeReply();
const msg: MapBlockRequestMessage = new MapBlockRequestMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: circuit.sessionID,
Flags: 2,
EstateID: 0,
Godlike: false
};
msg.PositionData = {
MinX: minX,
MaxX: maxX,
MinY: minY,
MaxY: maxY
};
circuit.sendMessage(msg, PacketFlags.Reliable);
circuit.waitForMessage(Message.MapBlockReply, 30000, (packet: Packet): FilterResponse =>
{
const filterMsg = packet.message as MapBlockReplyMessage;
let found = false;
filterMsg.Data.forEach((data) =>
{
if (data.X >= minX && data.X <= maxX && data.Y >= minY && data.Y <= maxY)
{
found = true;
const mapBlock = new MapBlock();
mapBlock.name = Utils.BufferToStringSimple(data.Name);
mapBlock.accessFlags = data.Access;
mapBlock.mapImage = data.MapImageID;
response.regions.push(mapBlock);
}
});
if (found)
{
return FilterResponse.Match;
}
return FilterResponse.NoMatch;
}).then((packet: Packet) =>
{
}).catch((err) =>
{
if (err.message === 'Timeout')
{
resolve(response);
}
else
{
reject(err);
}
});
});
}
name2Key(name: string): Promise<UUID>
{
const check = name.split('.');
@@ -239,7 +301,8 @@ export class GridCommands extends CommandsBase
const apr = packet.message as AvatarPickerReplyMessage;
apr.Data.forEach((dataBlock) =>
{
const resultName = (Utils.BufferToStringSimple(dataBlock.FirstName) + ' ' + Utils.BufferToStringSimple(dataBlock.LastName)).toLowerCase();
const resultName = (Utils.BufferToStringSimple(dataBlock.FirstName) + ' ' +
Utils.BufferToStringSimple(dataBlock.LastName)).toLowerCase();
if (resultName === name)
{
found = dataBlock.AvatarID;

View File

@@ -0,0 +1,6 @@
import {MapBlock} from '../classes/MapBlock';
export class MapInfoRangeReply
{
regions: MapBlock[] = [];
}

View File

@@ -1,10 +1,8 @@
import {UUID} from '../classes/UUID';
import {MapBlock} from '../classes/MapBlock';
export class MapInfoReply
{
name: string;
mapImage: UUID;
accessFlags: number;
block: MapBlock;
avatars: {
X: number,
Y: number