starblast-modding
Version:
A powerful library for interacting with the Starblast Modding API
102 lines (95 loc) • 2.95 kB
JavaScript
;
const GameSocket = require("../utils/GameSocket.js");
const TeamManager = require("../managers/TeamManager.js");
const getEntity = require("../utils/getEntity.js");
const defineProperties = require("../utils/defineProperties.js");
const deepFreeze = require("../utils/deepFreeze.js");
const readBinaries = function (data, game) {
let dataView = new DataView(data), eventID = dataView.getUint8(0);
dataView = new DataView(data.slice(1));
switch (eventID) {
case eventIDs.STATION_UPDATE:
game.teams.socketUpdate(dataView);
break;
}
}
const eventIDs = {
STATION_UPDATE: 205
}
class GameClient {
constructor(game, api) {
this.#game = game;
this.#api = api;
}
#game;
#api
connect (ip, id, port, joinPacketName) {
let socket = this.socket = GameSocket.create(ip, port, null, this.#api.compressWSMessages), interval, game = this.#game, api = this.#api, ended = false;
socket.on("open", function () {
this.send(JSON.stringify({
name: joinPacketName,
data: {
player_name: "starblast-modding",
preferred: id
}
}))
});
socket.on("message", function (event, isBinary) {
if (socket.requestClose) {
if (!ended) {
socket.close();
ended = true;
}
return;
}
if (!isBinary) {
let parsed;
try { parsed = JSON.parse(event.toString()) ?? {} } catch (e) { parsed = {} }
let data = parsed.data
switch (parsed.name) {
case "welcome":
Object.assign(api.mod_data.options, {
map_name: data.name,
map_id: data.seed
});
deepFreeze(api.mod_data.options);
api.mod_data.optionsLocked = true;
for (let ship of game.ships) socket.send(JSON.stringify({
name: "get_name",
data: {
id: ship.id
}
}));
interval = setInterval(function(){socket.send(0)}, 1000);
break;
case "player_name":
data.customization = defineProperties({}, {
badge: data.custom?.badge ?? null,
finish: data.custom?.finish ?? "zinc",
laser: data.custom?.laser ?? "0"
});
getEntity(game, data, game.ships).update(data, true);
break;
}
}
else try {
if ("function" == typeof event.arrayBuffer) event.arrayBuffer().then(e => readBinaries.call(this, e, game));
else readBinaries.call(this, event.buffer.slice(event.byteOffset, event.byteOffset + event.byteLength), game)
} catch (e) {}
}.bind(this));
socket.on("close", function () {
if (interval != null) clearInterval(interval);
api.triggerStopEvent();
})
}
initTeamStats () {
if (this.#api.stopTriggered) return;
let teams = JSON.parse(JSON.stringify(this.#game.options.teams ?? null));
if (Array.isArray(teams)) {
let teamManager = new TeamManager(this.#game, this.#api);
teamManager.insert(...teams.map((team, i) => Object.assign(Object.create(null), team, {id: i})));
this.#api.mod_data.teams = teamManager
}
}
}
module.exports = GameClient