Do not leave group when following is active
This commit is contained in:
parent
0a410d289d
commit
c2f5501236
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user