UNPKG

@csegames/camelot-unchained

Version:

Camelot Unchained Client Library

138 lines (137 loc) 6.11 kB
"use strict"; function __export(m) { for (var p in m) { if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } } Object.defineProperty(exports, "__esModule", { value: true }); /** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ var BuildingMaterial_1 = require("./classes/BuildingMaterial"); var BuildingBlock_1 = require("./classes/BuildingBlock"); var client_1 = require("../core/client"); var events_1 = require("../events"); var materialsLoaded = false; var materialsRequested = false; var numBlocksToLoad = 0; var loadCallbacks = []; var materialsMap = {}; var materialsList = []; var blocks = {}; // tslint:disable-next-line var BLANK_IMAGE = 'iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuOWwzfk4AAALxSURBVHhe5dlLiI1xGMfx30pCRFkJCyXFYiRSsmBByWIipMiOWYiNjZSirCxcsrUZuUzKZSGxULNT5JJsKaXspJlcVsd7zDn1zPN+z5n38v/bPIvP5nee37//M73TnN5Rp9MJDcNIMIwEw0gwjATDSDCMBMNIMIwEw0gwjATDSDCMBMNIMIwEw8akHYXNhU1gBXaqkrYWuufvLKH5ijBsTDr470j2BjtVSNfdWdYe7FSEYSvShLmcdx47w0ij7gzrKnZqwLA1adpc0tuIHSItLnwzXesjdmrCsDVpxFzUm8QOke65rrUQOzVhmIR00VzWO4MdSxpzHWsXdhrAMBnptbm0tx47XdLawh8za13GTkMYJiMtMBf3nmKnS3rmZvve4XwLGCYlHTELeKdg/qybsZaX5lvCMDnpllnC+llYbea2mc+80VlnJoJhFtIXs4x118x8dp/1Jf29tzDMQtpiFvJOF+64rO8VnpcIhtlI58xiVa3CsxLBMCvpuVluLofxjIQwzEpaUvjdW3CYG9hPDMPspP1mUfIWexlg+F9I18zC3hh2MsAwu5lviN97y5IfhfnYTQzD7KT7vUWHeYjdxDDMSjphlpxL+atyYhhmI60xy1W1Ds9KBMNspJdmMWuy8Mhlfe/xrEQwzEK6YJbyFvVmvrq870rpvEQwTE7abpbxjpm5ve4za/esMxPBMDlpyixiPYHZQa/Ap0qzCWCYlDRulvBmHn1Lmlf4ZGasx6X5ljBMZvg/Sg5hp0va52at49hpCMMkpGXm0t4EdizpputYS7HTAIZJDH8jXH70vZkf4KCvyx+w0wCGrQ1/8TH40feko65rXcJOTRi2Im0wl/TGsTOM9MCdYY1gpwYMW5F+mQta3T+Fcz/6nrTSnOFNY6cGDBsb/GKzq/qj70kn3VnWbexUhGEj0gFzKa/+o+9JL9yZVuP/GWAYCYaRYBgJhpFgGAmGkWAYCYaRYBgJhpFgGAmGkWAYCYaRYBhHR38Boj2hpYws8QsAAAAASUVORK5CYII='; function getBlockForShapeId(shapeId, blocks) { for (var i in blocks) { var block = blocks[i]; if (block.shapeId === shapeId) { return block; } } return blocks[0]; } function getShapeIdFromBlockId(id) { return id >> 21 & 31; } function getMaterialIdFromBlockId(id) { return id >> 2 & 4095; } function recieveMaterials(subsRecieved) { for (var i in subsRecieved) { var id = parseInt(i, 10); var material = new BuildingMaterial_1.default({ id: id, icon: subsRecieved[i], tags: [], blocks: [] }); materialsMap[id] = material; materialsList.push(material); } client_1.default.RequestBlocks(); } function recieveBlocks(blocksRecieved) { for (var i in blocksRecieved) { numBlocksToLoad++; var id = parseInt(i, 10); blocks[id] = { id: id, icon: blocksRecieved[i], materialTags: [], shapeTags: [] }; } for (var i in blocksRecieved) { var id = parseInt(i, 10); client_1.default.RequestBlockTags(id); } } function recieveBlockTags(id, tags) { var block = blocks[id]; block.shapeId = getShapeIdFromBlockId(id); block.shapeTags = tags.Shapes; block.materialId = getMaterialIdFromBlockId(id); block.materialTags = tags.Types; var material = materialsMap[block.materialId]; if (material == null) { console.log('unknown material ' + block.materialId + ' for block ' + id + '-' + tags.Types.join(',')); } else { material.tags = tags.Types; material.blocks.push(block); } if (--numBlocksToLoad === 0) { // finished loading shapes and types events_1.default.fire(events_1.default.buildingEventTopics.handlesBlocks, { materials: materialsList }); } } function getBlockForBlockId(blockid) { var matId = getMaterialIdFromBlockId(blockid); var shapeId = getShapeIdFromBlockId(blockid); var sub = materialsMap[matId]; if (sub == null) return null; // select by shape instead of by block id, it is more reliable, the block id sent back // can have extra information stored in it return getBlockForShapeId(shapeId, sub.blocks); } exports.getBlockForBlockId = getBlockForBlockId; function getMaterialForBlockId(blockid) { var matId = getMaterialIdFromBlockId(blockid); return materialsMap[matId]; } exports.getMaterialForBlockId = getMaterialForBlockId; function requestBlockSelect(block) { client_1.default.ChangeBlockType(block.id); } exports.requestBlockSelect = requestBlockSelect; // some blocks don't show up in the list retrieved by Request Substances or RequestBlocks // make up the information based on the block id, so we can at least display the shape and material type to the user // returning this information as a promise in case it is possible to request meta data on the material function getMissingMaterial(blockid) { var block = new BuildingBlock_1.default({ id: blockid, shapeId: getShapeIdFromBlockId(blockid), materialId: getMaterialIdFromBlockId(blockid), icon: BLANK_IMAGE }); blocks[block.id] = block; var material = new BuildingMaterial_1.default({ id: block.materialId, blocks: [block], icon: BLANK_IMAGE }); materialsMap[material.id] = material; materialsList.push(material); events_1.default.fire(events_1.default.buildingEventTopics.handlesBlocks, { materials: materialsList }); return { material: material, block: block }; } exports.getMissingMaterial = getMissingMaterial; function requestMaterials() { if (!materialsRequested) { materialsRequested = false; client_1.default.OnReceiveSubstances(recieveMaterials); client_1.default.OnReceiveBlocks(recieveBlocks); client_1.default.OnReceiveBlockTags(recieveBlockTags); client_1.default.RequestSubstances(); } } exports.requestMaterials = requestMaterials; __export(require("./blueprints")); __export(require("./building-actions"));