Merge branch 'develop' of github.com:thecodingmachine/workadventure into main
This commit is contained in:
commit
3c52bb3dd4
@ -28,7 +28,7 @@
|
|||||||
- Use `WA.state.[any variable]: unknown` to access directly any variable (this is a shortcut to using `WA.state.loadVariable` and `WA.state.saveVariable`)
|
- Use `WA.state.[any variable]: unknown` to access directly any variable (this is a shortcut to using `WA.state.loadVariable` and `WA.state.saveVariable`)
|
||||||
- Users blocking now relies on UUID rather than ID. A blocked user that leaves a room and comes back will stay blocked.
|
- Users blocking now relies on UUID rather than ID. A blocked user that leaves a room and comes back will stay blocked.
|
||||||
- The text chat was redesigned to be prettier and to use more features :
|
- The text chat was redesigned to be prettier and to use more features :
|
||||||
- The chat is now persistent bewteen discussions and always accesible
|
- The chat is now persistent between discussions and always accessible
|
||||||
- The chat now tracks incoming and outcoming users in your conversation
|
- The chat now tracks incoming and outcoming users in your conversation
|
||||||
- The chat allows your to see the visit card of users
|
- The chat allows your to see the visit card of users
|
||||||
- You can close the chat window with the escape key
|
- You can close the chat window with the escape key
|
||||||
|
@ -21,7 +21,7 @@ interface ZoneDescriptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PositionNotifier {
|
export class PositionNotifier {
|
||||||
// TODO: we need a way to clean the zones if noone is in the zone and noone listening (to free memory!)
|
// TODO: we need a way to clean the zones if no one is in the zone and no one listening (to free memory!)
|
||||||
|
|
||||||
private zones: Zone[][] = [];
|
private zones: Zone[][] = [];
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ const roomManager: IRoomManagerServer = {
|
|||||||
room = gameRoom;
|
room = gameRoom;
|
||||||
user = myUser;
|
user = myUser;
|
||||||
} else {
|
} else {
|
||||||
//Connexion may have been closed before the init was finished, so we have to manually disconnect the user.
|
//Connection may have been closed before the init was finished, so we have to manually disconnect the user.
|
||||||
socketManager.leaveRoom(gameRoom, myUser);
|
socketManager.leaveRoom(gameRoom, myUser);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -56,7 +56,7 @@ A few things to notice:
|
|||||||
|
|
||||||
## Building walls and "collidable" areas
|
## Building walls and "collidable" areas
|
||||||
|
|
||||||
By default, the characters can traverse any tiles. If you want to prevent your characeter from going through a tile (like a wall or a desktop), you must make this tile "collidable". You can do this by settings the `collides` property on a given tile.
|
By default, the characters can traverse any tiles. If you want to prevent your character from going through a tile (like a wall or a desktop), you must make this tile "collidable". You can do this by settings the `collides` property on a given tile.
|
||||||
|
|
||||||
To make a tile "collidable", you should:
|
To make a tile "collidable", you should:
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ export const createLoadingPromise = (
|
|||||||
loadPlugin.spritesheet(playerResourceDescriptor.name, playerResourceDescriptor.img, frameConfig);
|
loadPlugin.spritesheet(playerResourceDescriptor.name, playerResourceDescriptor.img, frameConfig);
|
||||||
const errorCallback = (file: { src: string }) => {
|
const errorCallback = (file: { src: string }) => {
|
||||||
if (file.src !== playerResourceDescriptor.img) return;
|
if (file.src !== playerResourceDescriptor.img) return;
|
||||||
console.error("failed loading player ressource: ", playerResourceDescriptor);
|
console.error("failed loading player resource: ", playerResourceDescriptor);
|
||||||
rej(playerResourceDescriptor);
|
rej(playerResourceDescriptor);
|
||||||
loadPlugin.off("filecomplete-spritesheet-" + playerResourceDescriptor.name, successCallback);
|
loadPlugin.off("filecomplete-spritesheet-" + playerResourceDescriptor.name, successCallback);
|
||||||
loadPlugin.off("loaderror", errorCallback);
|
loadPlugin.off("loaderror", errorCallback);
|
||||||
|
@ -194,7 +194,7 @@ export class GameScene extends DirtyScene {
|
|||||||
private popUpElements: Map<number, DOMElement> = new Map<number, Phaser.GameObjects.DOMElement>();
|
private popUpElements: Map<number, DOMElement> = new Map<number, Phaser.GameObjects.DOMElement>();
|
||||||
private originalMapUrl: string | undefined;
|
private originalMapUrl: string | undefined;
|
||||||
private pinchManager: PinchManager | undefined;
|
private pinchManager: PinchManager | undefined;
|
||||||
private mapTransitioning: boolean = false; //used to prevent transitions happenning at the same time.
|
private mapTransitioning: boolean = false; //used to prevent transitions happening at the same time.
|
||||||
private emoteManager!: EmoteManager;
|
private emoteManager!: EmoteManager;
|
||||||
private preloading: boolean = true;
|
private preloading: boolean = true;
|
||||||
private startPositionCalculator!: StartPositionCalculator;
|
private startPositionCalculator!: StartPositionCalculator;
|
||||||
@ -436,7 +436,7 @@ export class GameScene extends DirtyScene {
|
|||||||
this.characterLayers = gameManager.getCharacterLayers();
|
this.characterLayers = gameManager.getCharacterLayers();
|
||||||
this.companion = gameManager.getCompanion();
|
this.companion = gameManager.getCompanion();
|
||||||
|
|
||||||
//initalise map
|
//initialise map
|
||||||
this.Map = this.add.tilemap(this.MapUrlFile);
|
this.Map = this.add.tilemap(this.MapUrlFile);
|
||||||
const mapDirUrl = this.MapUrlFile.substr(0, this.MapUrlFile.lastIndexOf("/"));
|
const mapDirUrl = this.MapUrlFile.substr(0, this.MapUrlFile.lastIndexOf("/"));
|
||||||
this.mapFile.tilesets.forEach((tileset: ITiledTileSet) => {
|
this.mapFile.tilesets.forEach((tileset: ITiledTileSet) => {
|
||||||
|
@ -45,7 +45,7 @@ export class StartPositionCalculator {
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param selectedLayer this is always the layer that is selected with the hash in the url
|
* @param selectedLayer this is always the layer that is selected with the hash in the url
|
||||||
* @param selectedOrDefaultLayer this can also be the {defaultStartLayerName} if the {selectedLayer} didnt yield any start points
|
* @param selectedOrDefaultLayer this can also be the {defaultStartLayerName} if the {selectedLayer} did not yield any start points
|
||||||
*/
|
*/
|
||||||
public initPositionFromLayerName(selectedOrDefaultLayer: string | null, selectedLayer: string | null) {
|
public initPositionFromLayerName(selectedOrDefaultLayer: string | null, selectedLayer: string | null) {
|
||||||
if (!selectedOrDefaultLayer) {
|
if (!selectedOrDefaultLayer) {
|
||||||
@ -73,7 +73,7 @@ export class StartPositionCalculator {
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param selectedLayer this is always the layer that is selected with the hash in the url
|
* @param selectedLayer this is always the layer that is selected with the hash in the url
|
||||||
* @param selectedOrDefaultLayer this can also be the default layer if the {selectedLayer} didnt yield any start points
|
* @param selectedOrDefaultLayer this can also be the default layer if the {selectedLayer} did not yield any start points
|
||||||
*/
|
*/
|
||||||
private startUser(selectedOrDefaultLayer: ITiledMapTileLayer, selectedLayer: string | null): PositionInterface {
|
private startUser(selectedOrDefaultLayer: ITiledMapTileLayer, selectedLayer: string | null): PositionInterface {
|
||||||
const tiles = selectedOrDefaultLayer.data;
|
const tiles = selectedOrDefaultLayer.data;
|
||||||
|
@ -21,7 +21,7 @@ export enum UserInputEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//we cannot use a map structure so we have to create a replacment
|
//we cannot use a map structure so we have to create a replacement
|
||||||
export class ActiveEventList {
|
export class ActiveEventList {
|
||||||
private eventMap : Map<UserInputEvent, boolean> = new Map<UserInputEvent, boolean>();
|
private eventMap : Map<UserInputEvent, boolean> = new Map<UserInputEvent, boolean>();
|
||||||
|
|
||||||
|
@ -274,12 +274,12 @@ export const mediaStreamConstraintsStore = derived(
|
|||||||
currentAudioConstraint = false;
|
currentAudioConstraint = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable webcam for privacy reasons (the game is not visible and we were talking to noone)
|
// Disable webcam for privacy reasons (the game is not visible and we were talking to no one)
|
||||||
if ($privacyShutdownStore === true) {
|
if ($privacyShutdownStore === true) {
|
||||||
currentVideoConstraint = false;
|
currentVideoConstraint = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable webcam for energy reasons (the user is not moving and we are talking to noone)
|
// Disable webcam for energy reasons (the user is not moving and we are talking to no one)
|
||||||
if ($cameraEnergySavingStore === true) {
|
if ($cameraEnergySavingStore === true) {
|
||||||
currentVideoConstraint = false;
|
currentVideoConstraint = false;
|
||||||
currentAudioConstraint = false;
|
currentAudioConstraint = false;
|
||||||
|
@ -295,7 +295,7 @@ export class SimplePeer {
|
|||||||
// I do understand the method closeConnection is called twice, but I don't understand how they manage to run in parallel.
|
// I do understand the method closeConnection is called twice, but I don't understand how they manage to run in parallel.
|
||||||
peer.destroy();
|
peer.destroy();
|
||||||
|
|
||||||
//Comment this peer connexion because if we delete and try to reshare screen, the RTCPeerConnection send renegociate event. This array will be remove when user left circle discussion
|
//Comment this peer connection because if we delete and try to reshare screen, the RTCPeerConnection send renegotiate event. This array will be remove when user left circle discussion
|
||||||
/*if(!this.PeerScreenSharingConnectionArray.delete(userId)){
|
/*if(!this.PeerScreenSharingConnectionArray.delete(userId)){
|
||||||
throw 'Couln\'t delete peer screen sharing connexion';
|
throw 'Couln\'t delete peer screen sharing connexion';
|
||||||
}*/
|
}*/
|
||||||
@ -370,14 +370,14 @@ export class SimplePeer {
|
|||||||
console.error(
|
console.error(
|
||||||
'Could not find peer whose ID is "' + data.userId + '" in receiveWebrtcScreenSharingSignal'
|
'Could not find peer whose ID is "' + data.userId + '" in receiveWebrtcScreenSharingSignal'
|
||||||
);
|
);
|
||||||
console.info("Attempt to create new peer connexion");
|
console.info("Attempt to create new peer connection");
|
||||||
if (stream) {
|
if (stream) {
|
||||||
this.sendLocalScreenSharingStreamToUser(data.userId, stream);
|
this.sendLocalScreenSharingStreamToUser(data.userId, stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(`receiveWebrtcSignal => ${data.userId}`, e);
|
console.error(`receiveWebrtcSignal => ${data.userId}`, e);
|
||||||
//Comment this peer connexion because if we delete and try to reshare screen, the RTCPeerConnection send renegociate event. This array will be remove when user left circle discussion
|
//Comment this peer connection because if we delete and try to reshare screen, the RTCPeerConnection send renegotiate event. This array will be remove when user left circle discussion
|
||||||
//this.PeerScreenSharingConnectionArray.delete(data.userId);
|
//this.PeerScreenSharingConnectionArray.delete(data.userId);
|
||||||
this.receiveWebrtcScreenSharingSignal(data);
|
this.receiveWebrtcScreenSharingSignal(data);
|
||||||
}
|
}
|
||||||
@ -485,7 +485,7 @@ export class SimplePeer {
|
|||||||
|
|
||||||
if (!PeerConnectionScreenSharing.isReceivingScreenSharingStream()) {
|
if (!PeerConnectionScreenSharing.isReceivingScreenSharingStream()) {
|
||||||
PeerConnectionScreenSharing.destroy();
|
PeerConnectionScreenSharing.destroy();
|
||||||
//Comment this peer connexion because if we delete and try to reshare screen, the RTCPeerConnection send renegociate event. This array will be remove when user left circle discussion
|
//Comment this peer connection because if we delete and try to reshare screen, the RTCPeerConnection send renegotiate event. This array will be remove when user left circle discussion
|
||||||
//this.PeerScreenSharingConnectionArray.delete(userId);
|
//this.PeerScreenSharingConnectionArray.delete(userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,19 +8,19 @@ describe("getRessourceDescriptor()", () => {
|
|||||||
expect(desc.img).toEqual('url');
|
expect(desc.img).toEqual('url');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(", if given a string as parameter, should search trough hardcoded values", () => {
|
it(", if given a string as parameter, should search through hardcoded values", () => {
|
||||||
const desc = getRessourceDescriptor('male1');
|
const desc = getRessourceDescriptor('male1');
|
||||||
expect(desc.name).toEqual('male1');
|
expect(desc.name).toEqual('male1');
|
||||||
expect(desc.img).toEqual("resources/characters/pipoya/Male 01-1.png");
|
expect(desc.img).toEqual("resources/characters/pipoya/Male 01-1.png");
|
||||||
});
|
});
|
||||||
|
|
||||||
it(", if given a string as parameter, should search trough hardcoded values (bis)", () => {
|
it(", if given a string as parameter, should search through hardcoded values (bis)", () => {
|
||||||
const desc = getRessourceDescriptor('color_2');
|
const desc = getRessourceDescriptor('color_2');
|
||||||
expect(desc.name).toEqual('color_2');
|
expect(desc.name).toEqual('color_2');
|
||||||
expect(desc.img).toEqual("resources/customisation/character_color/character_color1.png");
|
expect(desc.img).toEqual("resources/customisation/character_color/character_color1.png");
|
||||||
});
|
});
|
||||||
|
|
||||||
it(", if given a descriptor without url as parameter, should search trough hardcoded values", () => {
|
it(", if given a descriptor without url as parameter, should search through hardcoded values", () => {
|
||||||
const desc = getRessourceDescriptor({name: 'male1', img: ''});
|
const desc = getRessourceDescriptor({name: 'male1', img: ''});
|
||||||
expect(desc.name).toEqual('male1');
|
expect(desc.name).toEqual('male1');
|
||||||
expect(desc.img).toEqual("resources/characters/pipoya/Male 01-1.png");
|
expect(desc.img).toEqual("resources/characters/pipoya/Male 01-1.png");
|
||||||
|
@ -176,7 +176,7 @@ Tuomo Untinen CC-BY-3.0
|
|||||||
|
|
||||||
Casper Nilsson
|
Casper Nilsson
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
- Asain themed shrine including red lantern
|
- Asian themed shrine including red lantern
|
||||||
- foodog statue
|
- foodog statue
|
||||||
- Toro
|
- Toro
|
||||||
- Cherry blossom tree
|
- Cherry blossom tree
|
||||||
|
@ -21,7 +21,7 @@ interface ZoneDescriptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PositionDispatcher {
|
export class PositionDispatcher {
|
||||||
// TODO: we need a way to clean the zones if noone is in the zone and noone listening (to free memory!)
|
// TODO: we need a way to clean the zones if no one is in the zone and no one listening (to free memory!)
|
||||||
|
|
||||||
private zones: Zone[][] = [];
|
private zones: Zone[][] = [];
|
||||||
|
|
||||||
|
@ -463,7 +463,7 @@ export class SocketManager implements ZoneEventListener {
|
|||||||
|
|
||||||
client.send(serverToClientMessage.serializeBinary().buffer, true);
|
client.send(serverToClientMessage.serializeBinary().buffer, true);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("An error occured while generating the Jitsi JWT token: ", e);
|
console.error("An error occurred while generating the Jitsi JWT token: ", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user