moomooio-client
Version:
MooMooIO-Client is a client-side wrapper API designed for the game MooMoo.io. This package aims to provide a simple yet powerful API for creating clones, mods, or plugins for MooMoo.io.
280 lines (233 loc) • 7.24 kB
text/typescript
import Player, { PlayerType } from "./instance/Player";
import MooMooIOConnection from "./MooMooIOConnection";
import { ServerPacket } from "./ServerPackets";
import MyPlayer from "./instance/MyPlayer";
import Team from "./instance/Team";
import GameObject from "./instance/GameObject";
import GameAI from "./instance/GameAI";
export default class MooMooIOClient {
// Require Destroy
public readonly connection = new MooMooIOConnection();
// Require Clear
public readonly myPlayer = new MyPlayer(this.connection);
protected players = new Map<number, PlayerType>();
protected gameAIs = new Map<number, GameAI>();
protected teams = new Map<string, Team>();
protected gameObjects: GameObject[] = [];
constructor() {
this.init();
}
protected init() {
this.connection.on("message", this.onMessage.bind(this));
this.connection.on("close", this.clear.bind(this));
this.connection.on("open", this.clear.bind(this));
}
public destroy() {
this.connection.destroy();
this.myPlayer.clear();
this.clear();
}
protected clear() {
this.gameObjects.forEach((gameObject) => gameObject.clear());
this.gameAIs.forEach((gameAI) => gameAI.clear());
this.players.forEach((player) => player.clear());
this.players.clear();
this.gameAIs.clear();
this.teams.clear();
this.gameObjects = [];
}
protected __update() {}
protected onMessage(packet: ServerPacket) {
switch (packet.PACKET_NAME) {
// GameAI:
case "UpdateGameAI": {
for (let aiData of packet.data) {
const ai = this.gameAIs.get(aiData.id) ?? new GameAI();
ai.init(aiData);
this.gameAIs.set(ai.id, ai);
console.log(ai.identity, ai.isFriendly, ai.isBoss);
}
break;
}
// GameObject:
case "SetObjectsData": {
for (let gameObjectData of packet.objects) {
const gameObject = new GameObject();
gameObject.init(gameObjectData);
this.players.forEach(gameObject.__auth.bind(gameObject));
this.gameObjects.push(gameObject);
}
break;
}
case "RemoveObject": {
this.gameObjects = this.gameObjects.filter(
(gameObject) => gameObject.id != packet.objectID
);
break;
}
case "RemoveObjects": {
this.gameObjects = this.gameObjects.filter(
(gameObject) => gameObject.ownerID != packet.ownerID
);
break;
}
case "ObjectStrike": {
const gameObject = this.gameObjects.find((gameObject) => gameObject.id == packet.objectID);
gameObject?.emit("strike", {
forceDirection: packet.forceDirection,
});
break;
}
case "TurretShoot": {
const turret = this.gameObjects.find((gameObject) => gameObject.id == packet.turretID);
turret?.emit("shoot", {
direction: packet.angle,
turret,
});
break;
}
// Team Stuff:
case "TeamNotification": {
this.myPlayer.emit("teamNotification", structuredClone(packet));
break;
}
case "TeamSignal": {
this.myPlayer.emit("teamSignal", structuredClone(packet));
break;
}
case "UpdateTeamMembersList": {
const myPlayerTeam = this.myPlayer.getTeam(this.teams);
if (myPlayerTeam) {
myPlayerTeam.membersList = structuredClone(packet.members);
}
break;
}
case "InitializeTeams": {
for (let team of packet.teams) {
this.teams.set(team.title, new Team(team.title, team.ownerID));
}
break;
}
case "CreateTeam": {
this.teams.set(packet.title, new Team(packet.title, packet.ownerID));
break;
}
case "DeleteTeam": {
this.teams.delete(packet.title);
break;
}
// myPlayer Stuff:
case "UpdateLeaderBoard": {
this.myPlayer.__updateLeaderBoard(packet);
break;
}
case "UpdateMiniMap": {
this.myPlayer.__updateMiniMap(packet);
break;
}
case "UpdateResource": {
this.myPlayer.__updateResource(packet);
break;
}
case "UpdateItemUsage": {
this.myPlayer.__updateItemUsage(packet);
break;
}
case "UpdateItemStore": {
this.myPlayer.__updateItemStore(packet);
break;
}
case "UpdateUpgrades": {
this.myPlayer.__updateUpgrades(packet);
break;
}
case "UpdateProgress": {
this.myPlayer.__updateProgress(packet);
break;
}
case "UpdateItems": {
this.myPlayer.__updateItems(packet);
break;
}
case "Pong": {
this.myPlayer.emit("pong", structuredClone(packet));
break;
}
case "IOInit": {
this.myPlayer.__init();
this.myPlayer.emit("init", structuredClone(packet));
break;
}
case "InitializeGame": {
break;
}
case "Death": {
this.myPlayer.__death();
break;
}
case "Disconnect": {
this.connection.disconnect();
break;
}
// Player Stuff:
case "InitializePlayer": {
if (packet.isMyPlayer) {
this.myPlayer.isInitialized && this.players.delete(this.myPlayer.playerID);
// @ts-ignore
this.players.set(packet.playerID, this.myPlayer);
}
let player = this.players.get(packet.playerID);
if (!player) {
player = new Player();
this.players.set(packet.playerID, player);
}
player.initialize(packet);
this.gameObjects.forEach((gameObject) => gameObject.__auth(player!));
if (packet.isMyPlayer) {
this.myPlayer.__spawn();
}
break;
}
case "UpdateHealth": {
let player = this.players.get(packet.playerID);
player?.setHealth(packet.playerHealth);
break;
}
case "UpdatePlayers": {
for (let playerData of packet.players) {
this.players.get(playerData.playerID)?.update(playerData);
}
this.__update();
break;
}
case "PlayerDisconnect": {
this.players.forEach((player) => {
if (player.initID == packet.initID) {
player.clear();
this.players.delete(player.playerID);
}
});
break;
}
case "Punch": {
const player = this.players.get(packet.ownerID);
player?.emit("punch", {
direction: player.angle,
didHit: packet.didHit,
player,
});
break;
}
case "ReceiveChat": {
const player = this.players.get(packet.ownerID);
player?.emit("chat", {
message: packet.message,
player,
});
break;
}
default:
break;
}
}
}