Do not leave group when following is active

This commit is contained in:
PizZaKatZe 2021-12-13 05:06:52 +01:00
parent 0a410d289d
commit c2f5501236
4 changed files with 38 additions and 5 deletions

View File

@ -139,6 +139,7 @@ export class GameRoom {
joinRoomMessage.getIpaddress(), joinRoomMessage.getIpaddress(),
position, position,
false, false,
[],
this.positionNotifier, this.positionNotifier,
socket, socket,
joinRoomMessage.getTagList(), joinRoomMessage.getTagList(),
@ -231,7 +232,7 @@ export class GameRoom {
// If the user is part of a group: // If the user is part of a group:
// should he leave the group? // should he leave the group?
const distance = GameRoom.computeDistanceBetweenPositions(user.getPosition(), user.group.getPosition()); const distance = GameRoom.computeDistanceBetweenPositions(user.getPosition(), user.group.getPosition());
if (distance > this.groupRadius) { if (user.following.length === 0 && distance > this.groupRadius) {
this.leaveGroup(user); this.leaveGroup(user);
} }
} }

View File

@ -25,6 +25,7 @@ export class User implements Movable {
public readonly IPAddress: string, public readonly IPAddress: string,
private position: PointInterface, private position: PointInterface,
public silent: boolean, public silent: boolean,
public following: string[],
private positionNotifier: PositionNotifier, private positionNotifier: PositionNotifier,
public readonly socket: UserSocket, public readonly socket: UserSocket,
public readonly tags: string[], public readonly tags: string[],
@ -48,6 +49,21 @@ export class User implements Movable {
this.positionNotifier.updatePosition(this, position, oldPosition); this.positionNotifier.updatePosition(this, position, oldPosition);
} }
public addFollower(name: string): void {
if (this.following.includes(name)) {
return;
}
this.following.push(name);
}
public delFollower(name: string): void {
const idx = this.following.indexOf(name);
if (idx === -1) {
return;
}
this.following.splice(idx, 1);
}
private batchedMessages: BatchMessage = new BatchMessage(); private batchedMessages: BatchMessage = new BatchMessage();
private batchTimeout: NodeJS.Timeout | null = null; private batchTimeout: NodeJS.Timeout | null = null;

View File

@ -847,19 +847,35 @@ export class SocketManager {
const clientMessage = new ServerToClientMessage(); const clientMessage = new ServerToClientMessage();
clientMessage.setFollowconfirmationmessage(message); clientMessage.setFollowconfirmationmessage(message);
room.sendToUserWithName(message.getLeader(), clientMessage); room.sendToUserWithName(message.getLeader(), clientMessage);
room.getUserByName(message.getLeader())?.addFollower(user.name);
user.addFollower(message.getLeader());
} }
handleFollowAbortMessage(room: GameRoom, user: User, message: FollowAbortMessage) { handleFollowAbortMessage(room: GameRoom, user: User, message: FollowAbortMessage) {
if (message.getRole() === "leader") { if (message.getRole() === "leader") {
// Forward message
const clientMessage = new ServerToClientMessage(); const clientMessage = new ServerToClientMessage();
clientMessage.setFollowabortmessage(message); clientMessage.setFollowabortmessage(message);
room.sendToOthersInGroupIncludingUser(user, clientMessage); room.sendToOthersInGroupIncludingUser(user, clientMessage);
// Update followers
room.getGroupIncludingUser(user)
?.getUsers()
.forEach((user) => {
user.following = [];
});
} else { } else {
// Forward message
const recipient = message.getPlayername(); const recipient = message.getPlayername();
message.setPlayername(user.name); message.setPlayername(user.name);
const clientMessage = new ServerToClientMessage(); const clientMessage = new ServerToClientMessage();
clientMessage.setFollowabortmessage(message); clientMessage.setFollowabortmessage(message);
room.sendToUserWithName(recipient, clientMessage); room.sendToUserWithName(recipient, clientMessage);
// Update followers
room.getUserByName(recipient)?.delFollower(user.name);
user.following = [];
} }
} }
} }

View File

@ -26,14 +26,14 @@ describe("PositionNotifier", () => {
y: 500, y: 500,
moving: false, moving: false,
direction: 'down' direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []); }, false, [], positionNotifier, {} as UserSocket, [], null, 'foo', []);
const user2 = new User(2, 'test', '10.0.0.2', { const user2 = new User(2, 'test', '10.0.0.2', {
x: -9999, x: -9999,
y: -9999, y: -9999,
moving: false, moving: false,
direction: 'down' direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []); }, false, [], positionNotifier, {} as UserSocket, [], null, 'foo', []);
positionNotifier.addZoneListener({} as ZoneSocket, 0, 0); positionNotifier.addZoneListener({} as ZoneSocket, 0, 0);
positionNotifier.addZoneListener({} as ZoneSocket, 0, 1); positionNotifier.addZoneListener({} as ZoneSocket, 0, 1);
@ -101,14 +101,14 @@ describe("PositionNotifier", () => {
y: 500, y: 500,
moving: false, moving: false,
direction: 'down' direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []); }, false, [], positionNotifier, {} as UserSocket, [], null, 'foo', []);
const user2 = new User(2, 'test', '10.0.0.2', { const user2 = new User(2, 'test', '10.0.0.2', {
x: 0, x: 0,
y: 0, y: 0,
moving: false, moving: false,
direction: 'down' direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []); }, false, [], positionNotifier, {} as UserSocket, [], null, 'foo', []);
const listener = {} as ZoneSocket; const listener = {} as ZoneSocket;
positionNotifier.addZoneListener(listener, 0, 0); positionNotifier.addZoneListener(listener, 0, 0);