UNPKG

adventureland-gui

Version:

Basic UI for headless AdventureLand clients

186 lines 6.6 kB
import Express from "express"; import Http from "http"; import fs from "fs"; import { fileURLToPath } from "url"; import Path, { dirname } from "path"; import * as SocketIO from "socket.io"; import axios from "axios"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const clientFolder = Path.join(__dirname, "../client"); const app = Express(); const server = Http.createServer(app); const bots = new Map(); let bankCache = undefined; let io; const observers = new Map(); export async function startServer(port = 8080) { const G = await getGData(); app.use(Express.static(clientFolder)); server.listen(port, () => { console.log(`Server started at http://localhost:${port}`); }); io = new SocketIO.Server(server); io.on("connection", (connection) => { for (const [id, data] of bots) connection.emit("addBot", id, data); if (bankCache) connection.emit("bank", bankCache); }); } export function addBot(id, socket, character) { if (!bots.has(id)) { const uiData = { character: { cx: character.cx, going_x: character.going_x, going_y: character.going_y, hp: character.hp, id: character.id, level: character.level, max_hp: character.max_hp, max_mp: character.max_mp, moving: character.moving, mp: character.mp, rip: character.rip, s: character.s, skin: character.skin, speed: character.speed, x: character.x, xp: character.xp, y: character.y }, inventory: { equipment: character.slots, gold: character.gold, items: character.items }, map: { map: character.map, x: character.x, y: character.y } }; io.emit("addBot", id, uiData); bots.set(id, uiData); } socket.onAny((eventName, args) => { switch (eventName) { case "entities": { const data = args; for (const player of data.players) { if (player.id == id) { const botData = bots.get(id); const charData = { cx: player.cx, going_x: player.going_x, going_y: player.going_y, hp: player.hp, id: player.id, level: player.level, max_hp: player.max_hp, max_mp: player.max_mp, moving: player.moving, mp: player.mp, rip: player.rip, s: player.s, skin: player.skin, speed: player.speed, x: player.x, xp: player.xp, y: player.y }; botData.character = charData; io.emit("player", id, charData); bots.set(id, botData); } else { } } break; } case "player": { const data = args; const botData = bots.get(id); const charData = { cx: data.cx, going_x: data.going_x, going_y: data.going_y, hp: data.hp, id: data.id, level: data.level, max_hp: data.max_hp, max_mp: data.max_mp, moving: data.moving, mp: data.mp, rip: data.rip, s: data.s, skin: data.skin, speed: data.speed, x: data.x, xp: data.xp, y: data.y }; botData.character = charData; io.emit("player", id, charData); const invData = { equipment: data.slots, gold: data.gold, items: data.items }; botData.inventory = invData; io.emit("inventory", id, invData); if (data.user) { bankCache = data.user; io.emit("bank", data.user); } bots.set(id, botData); break; } case "new_map": { const data = args; const botData = bots.get(id); const mapData = { map: data.name, x: data.x, y: data.y }; botData.map = mapData; io.emit("map", id, mapData); bots.set(id, botData); break; } case "welcome": { const data = args; const botData = bots.get(id); const mapData = { map: data.map, x: data.x, y: data.y }; botData.map = mapData; io.emit("map", id, mapData); bots.set(id, botData); break; } default: { break; } } }); socket.emit("send_updates", {}); } async function getGData() { const response = await axios.get("https://adventure.land/data.js"); if (response.status == 200) { const matches = response.data.match(/var\s+G\s*=\s*(\{.+\});/); const rawG = matches[1]; const G = JSON.parse(rawG); fs.writeFileSync(`${clientFolder}/G.json`, JSON.stringify(G)); return Promise.resolve(G); } else { return Promise.reject(`${response}\nError fetching https://adventure.land/data.js`); } } //# sourceMappingURL=index.js.map