Skip to content

Commit 667397a

Browse files
author
Picoseconds
committed
feat: made clans the same level they are in base game. also added kill count
1 parent b599e61 commit 667397a

File tree

6 files changed

+162
-7
lines changed

6 files changed

+162
-7
lines changed

src/moomoo/Client.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import WebSocket from "ws";
22
import Player from "./Player";
33

44
export default class Client {
5+
public tribeJoinQueue: Player[] = [];
6+
57
constructor(
68
public id: string,
79
public socket: WebSocket,

src/moomoo/Game.ts

+50-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import FileAsync from 'lowdb/adapters/FileAsync';
1616
import { PacketFactory } from "../packets/PacketFactory";
1717
import { getWeaponDamage, getWeaponAttackDetails, getItemCost, getPlaceable } from "../items/items";
1818
import { gameObjectSizes, GameObjectType } from "../gameobjects/gameobjects";
19+
import { isNull } from 'util';
1920

2021
let currentGame: Game | null = null;
2122

@@ -120,6 +121,13 @@ export default class Game {
120121
}
121122

122123
this.state.gameObjects.filter(gameObj => gameObj.ownerSID != client.player?.id);
124+
125+
let tribeIndex = this.state.tribes.findIndex(
126+
tribe => tribe.ownerSID == client.player?.id
127+
);
128+
129+
if (tribeIndex > -1)
130+
this.state.removeTribe(tribeIndex);
123131
}
124132
});
125133

@@ -394,11 +402,14 @@ export default class Game {
394402
);
395403

396404
for (let hitPlayer of hitPlayers) {
405+
if (hitPlayer.clanName == player.clanName && hitPlayer.clanName != null) continue;
406+
397407
let dmg = getWeaponDamage(player.weapon, player.weaponVariant);
398408

399409
hitPlayer.health -= dmg;
400410
if (hitPlayer.health <= 0 && hitPlayer.client) {
401411
this.killPlayer(hitPlayer);
412+
player.kills++;
402413
} else {
403414
let attackDetails = getWeaponAttackDetails(player.weapon);
404415
let knockback = attackDetails.kbMultiplier * 0.3;
@@ -706,14 +717,37 @@ export default class Game {
706717
let tribe = this.state.tribes.find(
707718
(tribe) => tribe.name === packet.data[0]
708719
);
720+
let ownerClient = this.state.players.find(player => player.id === tribe?.ownerSID)?.client;
709721

710722
if (tribe) {
711-
client.player.clanName = tribe.name;
723+
ownerClient?.tribeJoinQueue.push(client.player);
724+
ownerClient?.socket.send(
725+
packetFactory.serializePacket(
726+
new Packet(
727+
PacketType.JOIN_REQUEST,
728+
[client.player.id, client.player.name]
729+
)
730+
)
731+
)
732+
}
712733

713-
if (!tribe.membersSIDs.includes(client.player.id))
714-
tribe.membersSIDs.push(client.player.id);
734+
}
735+
break;
736+
case PacketType.CLAN_ACC_JOIN:
737+
if (client.tribeJoinQueue.length && client.player && packet.data[1]) {
738+
let tribe = this.state.tribes.find(
739+
(tribe) => tribe.ownerSID === client.player?.id
740+
);
741+
let player = client.tribeJoinQueue[0];
742+
743+
if (tribe && player.clanName === null) {
744+
player.clanName = tribe.name;
745+
746+
this.state.joinClan(player, tribe);
715747
}
716748
}
749+
750+
client.tribeJoinQueue.splice(0, 1);
717751
break;
718752
case PacketType.AUTO_ATK:
719753
if (client.player)
@@ -786,6 +820,19 @@ export default class Game {
786820
}
787821
}
788822
break;
823+
case PacketType.LEAVE_CLAN:
824+
if (client.player) {
825+
let tribeIndex = this.state.tribes.findIndex(tribe => tribe.membersSIDs.includes(client.player?.id as number));
826+
let tribe = this.state.tribes[tribeIndex];
827+
828+
if (tribe && tribe.ownerSID == client.player.id) {
829+
this.state.removeTribe(tribeIndex);
830+
client.tribeJoinQueue = [];
831+
} else {
832+
this.state.leaveClan(client.player, tribeIndex);
833+
}
834+
}
835+
break;
789836
}
790837
}
791838
}

src/moomoo/GameState.ts

+90-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,38 @@ export default class GameState {
1818
this.game = game;
1919
}
2020

21+
joinClan(player: Player, tribe: Tribe) {
22+
if (!tribe.membersSIDs.includes(player.id))
23+
tribe.membersSIDs.push(player.id);
24+
25+
this.updateClanPlayers(tribe);
26+
}
27+
28+
updateClanPlayers(tribe: Tribe) {
29+
let packetFactory = PacketFactory.getInstance();
30+
let data: (string | number)[] = [];
31+
32+
for (let memberSID of tribe.membersSIDs) {
33+
let player = this.players.find(player => player.id == memberSID);
34+
if (player)
35+
data.push(player.id, player.name);
36+
}
37+
38+
for (let memberSID of tribe.membersSIDs) {
39+
let player = this.players.find(player => player.id == memberSID);
40+
let client = player?.client;
41+
42+
if (client) {
43+
client.socket.send(
44+
packetFactory.serializePacket(
45+
new Packet(PacketType.SET_CLAN_PLAYERS, data)
46+
)
47+
);
48+
console.log(data);
49+
}
50+
}
51+
}
52+
2153
addPlayer(sid: number, ownerID: string, client: Client, game: Game) {
2254
return this.players[
2355
this.players.push(new Player(sid, ownerID, new Vec2(0, 0), game, client)) - 1
@@ -35,7 +67,64 @@ export default class GameState {
3567
}
3668

3769
return this.tribes[
38-
this.tribes.push({name: name, ownerSID: ownerSID, membersSIDs: [ownerSID]}) - 1
70+
this.tribes.push({ name: name, ownerSID: ownerSID, membersSIDs: [ownerSID] }) - 1
3971
];
4072
}
73+
74+
removeTribe(tribeIndex: number) {
75+
let packetFactory = PacketFactory.getInstance();
76+
let tribe = this.tribes[tribeIndex];
77+
78+
if (tribe) {
79+
for (let client of this.game.clients) {
80+
client.socket?.send(packetFactory.serializePacket(new Packet(PacketType.CLAN_DEL, [tribe.name])));
81+
}
82+
83+
for (let memberSID of tribe.membersSIDs) {
84+
let player = this.players.find(player => player.id == memberSID);
85+
let client = player?.client;
86+
87+
if (player)
88+
player.clanName = null;
89+
90+
if (client) {
91+
client.socket.send(
92+
packetFactory.serializePacket(
93+
new Packet(PacketType.PLAYER_SET_CLAN, [null, 0])
94+
)
95+
);
96+
97+
if (client.player)
98+
client.player.isClanLeader = false;
99+
}
100+
}
101+
102+
this.tribes.splice(tribeIndex, 1);
103+
}
104+
}
105+
106+
leaveClan(player: Player, tribeIndex: number) {
107+
let packetFactory = PacketFactory.getInstance();
108+
let client = player?.client;
109+
110+
this.tribes[tribeIndex].membersSIDs = this.tribes[tribeIndex].membersSIDs.filter(
111+
memberSID => memberSID != player.id
112+
);
113+
114+
if (player)
115+
player.clanName = null;
116+
117+
if (client) {
118+
client.socket.send(
119+
packetFactory.serializePacket(
120+
new Packet(PacketType.PLAYER_SET_CLAN, [null, 0])
121+
)
122+
);
123+
124+
if (client.player)
125+
client.player.isClanLeader = false;
126+
}
127+
128+
this.updateClanPlayers(this.tribes[tribeIndex]);
129+
}
41130
}

src/moomoo/Player.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,22 @@ export default class Player extends Entity {
4646
public clanName: string | null = null;
4747
public isClanLeader = false;
4848

49-
public kills = 0;
49+
private _kills: number = 0;
50+
51+
public get kills(): number {
52+
return this._kills;
53+
}
54+
55+
public set kills(newKills: number) {
56+
let packetFactory = PacketFactory.getInstance();
57+
this.client?.socket.send(
58+
packetFactory.serializePacket(
59+
new Packet(PacketType.UPDATE_STATS, ["kills", newKills, 1])
60+
)
61+
);
62+
this._kills = newKills;
63+
}
64+
5065
public dead = false;
5166

5267
public inTrap = false;
@@ -206,7 +221,7 @@ export default class Player extends Entity {
206221
return false;
207222
}
208223

209-
gameState?.gameObjects.push(newGameObject);
224+
gameState?.gameObjects.push(newGameObject);
210225

211226
return true;
212227
}

src/packets/PacketFactory.ts

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ packetTypeMapping[PacketType.PLAYER_ADD] = { value: "2", side: Side.Client };
6565
packetTypeMapping[PacketType.UPDATE_STATS] = { value: "9", side: Side.Client };
6666
packetTypeMapping[PacketType.IO_INIT] = { value: "io-init", side: Side.Client };
6767
packetTypeMapping[PacketType.HEALTH_CHANGE] = { value: "t", side: Side.Client };
68+
packetTypeMapping[PacketType.JOIN_REQUEST] = { value: "an", side: Side.Client };
6869

6970
let reversePacketTypeMapping: ReverseMapping[] = [];
7071

src/packets/PacketType.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ enum PacketType {
4646
DEATH,
4747
CLAN_NOTIFY_SERVER,
4848
CLAN_NOTIFY_CLIENT,
49-
HEALTH_CHANGE
49+
HEALTH_CHANGE,
50+
JOIN_REQUEST
5051
}
5152

5253
export { PacketType };

0 commit comments

Comments
 (0)