Files
node-metaverse/dist/classes/commands/RegionCommands.js
2018-10-19 16:39:24 +01:00

363 lines
17 KiB
JavaScript

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const CommandsBase_1 = require("./CommandsBase");
const UUID_1 = require("../UUID");
const RegionHandleRequest_1 = require("../messages/RegionHandleRequest");
const Message_1 = require("../../enums/Message");
const FilterResponse_1 = require("../../enums/FilterResponse");
const __1 = require("../..");
const ObjectGrab_1 = require("../messages/ObjectGrab");
const ObjectDeGrab_1 = require("../messages/ObjectDeGrab");
const ObjectGrabUpdate_1 = require("../messages/ObjectGrabUpdate");
const ObjectSelect_1 = require("../messages/ObjectSelect");
const Utils_1 = require("../Utils");
const ObjectDeselect_1 = require("../messages/ObjectDeselect");
const PCode_1 = require("../../enums/PCode");
class RegionCommands extends CommandsBase_1.CommandsBase {
getRegionHandle(regionID) {
return __awaiter(this, void 0, void 0, function* () {
const circuit = this.currentRegion.circuit;
const msg = new RegionHandleRequest_1.RegionHandleRequestMessage();
msg.RequestBlock = {
RegionID: regionID,
};
circuit.sendMessage(msg, __1.PacketFlags.Reliable);
const responseMsg = yield circuit.waitForMessage(Message_1.Message.RegionIDAndHandleReply, 10000, (filterMsg) => {
if (filterMsg.ReplyBlock.RegionID.toString() === regionID.toString()) {
return FilterResponse_1.FilterResponse.Finish;
}
else {
return FilterResponse_1.FilterResponse.NoMatch;
}
});
return responseMsg.ReplyBlock.RegionHandle;
});
}
deselectObjects(objects) {
return __awaiter(this, void 0, void 0, function* () {
const selectLimit = 255;
if (objects.length > selectLimit) {
for (let x = 0; x < objects.length; x += selectLimit) {
const selectList = [];
for (let y = 0; y < selectLimit; y++) {
if (y < objects.length) {
selectList.push(objects[x + y]);
}
}
yield this.deselectObjects(selectList);
}
return;
}
else {
const deselectObject = new ObjectDeselect_1.ObjectDeselectMessage();
deselectObject.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
deselectObject.ObjectData = [];
const uuidMap = {};
for (const obj of objects) {
const uuidStr = obj.FullID.toString();
if (!uuidMap[uuidStr]) {
uuidMap[uuidStr] = obj;
deselectObject.ObjectData.push({
ObjectLocalID: obj.ID
});
}
}
const sequenceID = this.circuit.sendMessage(deselectObject, __1.PacketFlags.Reliable);
return yield this.circuit.waitForAck(sequenceID, 10000);
}
});
}
countObjects() {
return this.currentRegion.objects.getNumberOfObjects();
}
selectObjects(objects) {
return __awaiter(this, void 0, void 0, function* () {
const selectLimit = 255;
if (objects.length > selectLimit) {
for (let x = 0; x < objects.length; x += selectLimit) {
const selectList = [];
for (let y = 0; y < selectLimit; y++) {
if (y < objects.length) {
selectList.push(objects[x + y]);
}
}
yield this.selectObjects(selectList);
}
return;
}
else {
const selectObject = new ObjectSelect_1.ObjectSelectMessage();
selectObject.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
selectObject.ObjectData = [];
const uuidMap = {};
for (const obj of objects) {
const uuidStr = obj.FullID.toString();
if (!uuidMap[uuidStr]) {
uuidMap[uuidStr] = obj;
selectObject.ObjectData.push({
ObjectLocalID: obj.ID
});
}
}
let resolved = 0;
this.circuit.sendMessage(selectObject, __1.PacketFlags.Reliable);
return yield this.circuit.waitForMessage(Message_1.Message.ObjectProperties, 10000, (propertiesMessage) => {
let found = false;
for (const objData of propertiesMessage.ObjectData) {
const objDataUUID = objData.ObjectID.toString();
if (uuidMap[objDataUUID] !== undefined) {
resolved++;
const obj = uuidMap[objDataUUID];
obj.creatorID = objData.CreatorID;
obj.creationDate = objData.CreationDate;
obj.baseMask = objData.BaseMask;
obj.ownerMask = objData.OwnerMask;
obj.groupMask = objData.GroupMask;
obj.everyoneMask = objData.EveryoneMask;
obj.nextOwnerMask = objData.NextOwnerMask;
obj.ownershipCost = objData.OwnershipCost;
obj.saleType = objData.SaleType;
obj.salePrice = objData.SalePrice;
obj.aggregatePerms = objData.AggregatePerms;
obj.aggregatePermTextures = objData.AggregatePermTextures;
obj.aggregatePermTexturesOwner = objData.AggregatePermTexturesOwner;
obj.category = objData.Category;
obj.inventorySerial = objData.InventorySerial;
obj.itemID = objData.ItemID;
obj.folderID = objData.FolderID;
obj.fromTaskID = objData.FromTaskID;
obj.lastOwnerID = objData.LastOwnerID;
obj.name = Utils_1.Utils.BufferToStringSimple(objData.Name);
obj.description = Utils_1.Utils.BufferToStringSimple(objData.Description);
obj.touchName = Utils_1.Utils.BufferToStringSimple(objData.TouchName);
obj.sitName = Utils_1.Utils.BufferToStringSimple(objData.SitName);
obj.textureID = Utils_1.Utils.BufferToStringSimple(objData.TextureID);
obj.resolvedAt = new Date().getTime() / 1000;
delete uuidMap[objDataUUID];
found = true;
}
}
if (Object.keys(uuidMap).length === 0) {
return FilterResponse_1.FilterResponse.Finish;
}
if (!found) {
return FilterResponse_1.FilterResponse.NoMatch;
}
else {
return FilterResponse_1.FilterResponse.Match;
}
});
}
});
}
resolveObjects(objects) {
return __awaiter(this, void 0, void 0, function* () {
const objs = {};
const scanObject = function (obj) {
const localID = obj.ID;
if (!objs[localID]) {
objs[localID] = obj;
if (obj.children) {
for (const child of obj.children) {
scanObject(child);
}
}
}
};
for (const obj of objects) {
scanObject(obj);
}
const resolveTime = new Date().getTime() / 1000;
let objectList = [];
let totalRemaining = 0;
try {
for (const k of Object.keys(objs)) {
const ky = parseInt(k, 10);
if (objs[ky] !== undefined) {
const o = objs[ky];
if (o.resolvedAt === undefined) {
o.resolvedAt = 0;
}
if (o.resolvedAt !== undefined && o.resolvedAt < resolveTime && o.PCode !== PCode_1.PCode.Avatar) {
objs[ky].name = undefined;
totalRemaining++;
objectList.push(objs[ky]);
if (objectList.length > 254) {
try {
yield this.selectObjects(objectList);
yield this.deselectObjects(objectList);
for (const chk of objectList) {
if (chk.resolvedAt !== undefined && chk.resolvedAt >= resolveTime) {
totalRemaining--;
}
}
}
catch (ignore) {
}
finally {
objectList = [];
}
}
}
}
}
if (objectList.length > 0) {
yield this.selectObjects(objectList);
yield this.deselectObjects(objectList);
for (const chk of objectList) {
if (chk.resolvedAt !== undefined && chk.resolvedAt >= resolveTime) {
totalRemaining--;
}
}
}
}
catch (ignore) {
}
finally {
if (totalRemaining < 1) {
totalRemaining = 0;
for (const obj of objectList) {
if (obj.resolvedAt === undefined || obj.resolvedAt < resolveTime) {
totalRemaining++;
}
}
if (totalRemaining > 0) {
console.error(totalRemaining + ' objects could not be resolved');
}
}
}
});
}
getAllObjects(resolve = false) {
return __awaiter(this, void 0, void 0, function* () {
const objs = this.currentRegion.objects.getAllObjects();
if (resolve) {
yield this.resolveObjects(objs);
}
return objs;
});
}
getObjectsInArea(minX, maxX, minY, maxY, minZ, maxZ, resolve = false) {
return __awaiter(this, void 0, void 0, function* () {
const objs = this.currentRegion.objects.getObjectsInArea(minX, maxX, minY, maxY, minZ, maxZ);
if (resolve) {
yield this.resolveObjects(objs);
}
return objs;
});
}
grabObject(localID, grabOffset = __1.Vector3.getZero(), uvCoordinate = __1.Vector3.getZero(), stCoordinate = __1.Vector3.getZero(), faceIndex = 0, position = __1.Vector3.getZero(), normal = __1.Vector3.getZero(), binormal = __1.Vector3.getZero()) {
return __awaiter(this, void 0, void 0, function* () {
if (localID instanceof UUID_1.UUID) {
const obj = this.currentRegion.objects.getObjectByUUID(localID);
localID = obj.ID;
}
const msg = new ObjectGrab_1.ObjectGrabMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
msg.ObjectData = {
LocalID: localID,
GrabOffset: grabOffset
};
msg.SurfaceInfo = [
{
UVCoord: uvCoordinate,
STCoord: stCoordinate,
FaceIndex: faceIndex,
Position: position,
Normal: normal,
Binormal: binormal
}
];
const seqID = this.circuit.sendMessage(msg, __1.PacketFlags.Reliable);
yield this.circuit.waitForAck(seqID, 10000);
});
}
deGrabObject(localID, grabOffset = __1.Vector3.getZero(), uvCoordinate = __1.Vector3.getZero(), stCoordinate = __1.Vector3.getZero(), faceIndex = 0, position = __1.Vector3.getZero(), normal = __1.Vector3.getZero(), binormal = __1.Vector3.getZero()) {
return __awaiter(this, void 0, void 0, function* () {
if (localID instanceof UUID_1.UUID) {
const obj = this.currentRegion.objects.getObjectByUUID(localID);
localID = obj.ID;
}
const msg = new ObjectDeGrab_1.ObjectDeGrabMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
msg.ObjectData = {
LocalID: localID
};
msg.SurfaceInfo = [
{
UVCoord: uvCoordinate,
STCoord: stCoordinate,
FaceIndex: faceIndex,
Position: position,
Normal: normal,
Binormal: binormal
}
];
const seqID = this.circuit.sendMessage(msg, __1.PacketFlags.Reliable);
yield this.circuit.waitForAck(seqID, 10000);
});
}
dragGrabbedObject(localID, grabPosition, grabOffset = __1.Vector3.getZero(), uvCoordinate = __1.Vector3.getZero(), stCoordinate = __1.Vector3.getZero(), faceIndex = 0, position = __1.Vector3.getZero(), normal = __1.Vector3.getZero(), binormal = __1.Vector3.getZero()) {
return __awaiter(this, void 0, void 0, function* () {
if (!(localID instanceof UUID_1.UUID)) {
const obj = this.currentRegion.objects.getObjectByLocalID(localID);
localID = obj.FullID;
}
const msg = new ObjectGrabUpdate_1.ObjectGrabUpdateMessage();
msg.AgentData = {
AgentID: this.agent.agentID,
SessionID: this.circuit.sessionID
};
msg.ObjectData = {
ObjectID: localID,
GrabOffsetInitial: grabOffset,
GrabPosition: grabPosition,
TimeSinceLast: 0
};
msg.SurfaceInfo = [
{
UVCoord: uvCoordinate,
STCoord: stCoordinate,
FaceIndex: faceIndex,
Position: position,
Normal: normal,
Binormal: binormal
}
];
const seqID = this.circuit.sendMessage(msg, __1.PacketFlags.Reliable);
yield this.circuit.waitForAck(seqID, 10000);
});
}
touchObject(localID, grabOffset = __1.Vector3.getZero(), uvCoordinate = __1.Vector3.getZero(), stCoordinate = __1.Vector3.getZero(), faceIndex = 0, position = __1.Vector3.getZero(), normal = __1.Vector3.getZero(), binormal = __1.Vector3.getZero()) {
return __awaiter(this, void 0, void 0, function* () {
if (localID instanceof UUID_1.UUID) {
const obj = this.currentRegion.objects.getObjectByUUID(localID);
localID = obj.ID;
}
yield this.grabObject(localID, grabOffset, uvCoordinate, stCoordinate, faceIndex, position, normal, binormal);
yield this.deGrabObject(localID, grabOffset, uvCoordinate, stCoordinate, faceIndex, position, normal, binormal);
});
}
}
exports.RegionCommands = RegionCommands;
//# sourceMappingURL=RegionCommands.js.map