import {MessageUserPosition} from "../Model/Websocket/MessageUserPosition"; //TODO fix import by "_Model/.."
import {ExSocketInterface} from "../Model/Websocket/ExSocketInterface"; //TODO fix import by "_Model/.."
import Jwt, {JsonWebTokenError} from "jsonwebtoken";
-import {SECRET_KEY} from "../Enum/EnvironmentVariable"; //TODO fix import by "_Enum/..."
+import {SECRET_KEY, MINIMUM_DISTANCE, GROUP_RADIUS} from "../Enum/EnvironmentVariable"; //TODO fix import by "_Enum/..."
import {ExtRooms, RefreshUserPositionFunction} from "../Model/Websocket/ExtRoom";
import {ExtRoomsInterface} from "../Model/Websocket/ExtRoomsInterface";
import {World} from "../Model/World";
this.connectedUser(user1, user2);
}, (user1 : string, user2 : string) => {
this.disConnectedUser(user1, user2);
- });
+ }, MINIMUM_DISTANCE, GROUP_RADIUS);
}
ioConnection() {
import {PositionInterface} from "_Model/PositionInterface";
export class World {
- static readonly MIN_DISTANCE = 160;
+ private minDistance: number;
+ private groupRadius: number;
// Users, sorted by ID
private users: Map<string, UserInterface>;
private connectCallback: (user1: string, user2: string) => void;
private disconnectCallback: (user1: string, user2: string) => void;
- constructor(connectCallback: (user1: string, user2: string) => void, disconnectCallback: (user1: string, user2: string) => void)
+ constructor(connectCallback: (user1: string, user2: string) => void, disconnectCallback: (user1: string, user2: string) => void,
+ minDistance: number,
+ groupRadius: number)
{
this.users = new Map<string, UserInterface>();
this.groups = [];
this.connectCallback = connectCallback;
this.disconnectCallback = disconnectCallback;
+ this.minDistance = minDistance;
+ this.groupRadius = groupRadius;
}
public join(userPosition: MessageUserPosition): void {
// If the user is part of a group:
// should he leave the group?
let distance = World.computeDistanceBetweenPositions(user.position, user.group.getPosition());
- if (distance > World.MIN_DISTANCE) {
+ if (distance > this.groupRadius) {
this.leaveGroup(user);
}
}
/**
* Looks for the closest user that is:
- * - close enough (distance <= MIN_DISTANCE)
- * - not in a group OR in a group that is not full
+ * - close enough (distance <= minDistance)
+ * - not in a group
+ * OR
+ * - close enough to a group (distance <= groupRadius)
*/
private searchClosestAvailableUserOrGroup(user: UserInterface): UserInterface|Group|null
{
- let usersToBeGroupedWith: Distance[] = [];
- let minimumDistanceFound: number = World.MIN_DISTANCE;
+ let minimumDistanceFound: number = Math.max(this.minDistance, this.groupRadius);
let matchingItem: UserInterface | Group | null = null;
- this.users.forEach(function(currentUser, userId) {
+ this.users.forEach((currentUser, userId) => {
// Let's only check users that are not part of a group
if (typeof currentUser.group !== 'undefined') {
return;
let distance = World.computeDistance(user, currentUser); // compute distance between peers.
- if(distance <= minimumDistanceFound) {
+ if(distance <= minimumDistanceFound && distance <= this.minDistance) {
minimumDistanceFound = distance;
matchingItem = currentUser;
}
*/
});
- this.groups.forEach(function(group: Group) {
+ this.groups.forEach((group: Group) => {
if (group.isFull()) {
return;
}
let distance = World.computeDistanceBetweenPositions(user.position, group.getPosition());
- if(distance <= minimumDistanceFound) {
+ if(distance <= minimumDistanceFound && distance <= this.groupRadius) {
minimumDistanceFound = distance;
matchingItem = group;
}
}
- let world = new World(connect, disconnect);
+ let world = new World(connect, disconnect, 160, 160);
world.join(new MessageUserPosition({
userId: "foo",
}
- let world = new World(connect, disconnect);
+ let world = new World(connect, disconnect, 160, 160);
world.join(new MessageUserPosition({
userId: "foo",
disconnectCalled = true;
}
- let world = new World(connect, disconnect);
+ let world = new World(connect, disconnect, 160, 160);
world.join(new MessageUserPosition({
userId: "foo",