Merge pull request #302 from thecodingmachine/roomswitching
Fixing room switching
This commit is contained in:
commit
9113ef4ff6
@ -5,6 +5,7 @@ export class Room {
|
|||||||
public readonly id: string;
|
public readonly id: string;
|
||||||
public readonly isPublic: boolean;
|
public readonly isPublic: boolean;
|
||||||
private mapUrl: string|undefined;
|
private mapUrl: string|undefined;
|
||||||
|
private instance: string|undefined;
|
||||||
|
|
||||||
constructor(id: string) {
|
constructor(id: string) {
|
||||||
if (id.startsWith('/')) {
|
if (id.startsWith('/')) {
|
||||||
@ -49,6 +50,29 @@ export class Room {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instance name is:
|
||||||
|
* - In a public URL: the second part of the URL ( _/[instance]/map.json)
|
||||||
|
* - In a private URL: [organizationId/worldId]
|
||||||
|
*/
|
||||||
|
public getInstance(): string {
|
||||||
|
if (this.instance !== undefined) {
|
||||||
|
return this.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.isPublic) {
|
||||||
|
const match = /_\/([^/]+)\/.+/.exec(this.id);
|
||||||
|
if (!match) throw new Error('Could not extract instance from "'+this.id+'"');
|
||||||
|
this.instance = match[1];
|
||||||
|
return this.instance;
|
||||||
|
} else {
|
||||||
|
const match = /_\/([^/]+)\/([^/]+)\/.+/.exec(this.id);
|
||||||
|
if (!match) throw new Error('Could not extract instance from "'+this.id+'"');
|
||||||
|
this.instance = match[1]+'/'+match[2];
|
||||||
|
return this.instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private parsePrivateUrl(url: string): { organizationSlug: string, worldSlug: string, roomSlug?: string } {
|
private parsePrivateUrl(url: string): { organizationSlug: string, worldSlug: string, roomSlug?: string } {
|
||||||
const regex = /@\/([^/]+)\/([^/]+)(?:\/([^/]*))?/gm;
|
const regex = /@\/([^/]+)\/([^/]+)(?:\/([^/]*))?/gm;
|
||||||
const match = regex.exec(url);
|
const match = regex.exec(url);
|
||||||
|
@ -48,7 +48,7 @@ export class GameManager {
|
|||||||
|
|
||||||
const gameIndex = scenePlugin.getIndex(mapUrl);
|
const gameIndex = scenePlugin.getIndex(mapUrl);
|
||||||
if(gameIndex === -1){
|
if(gameIndex === -1){
|
||||||
const game : Phaser.Scene = GameScene.createFromUrl(mapUrl, roomID);
|
const game : Phaser.Scene = GameScene.createFromUrl(room, mapUrl);
|
||||||
console.log('Adding scene '+mapUrl);
|
console.log('Adding scene '+mapUrl);
|
||||||
scenePlugin.add(mapUrl, game, false);
|
scenePlugin.add(mapUrl, game, false);
|
||||||
}
|
}
|
||||||
|
@ -139,15 +139,15 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
private outlinedItem: ActionableItem|null = null;
|
private outlinedItem: ActionableItem|null = null;
|
||||||
private userInputManager!: UserInputManager;
|
private userInputManager!: UserInputManager;
|
||||||
|
|
||||||
static createFromUrl(mapUrlFile: string, instance: string, gameSceneKey: string|null = null): GameScene {
|
static createFromUrl(room: Room, mapUrlFile: string, gameSceneKey: string|null = null): GameScene {
|
||||||
// We use the map URL as a key
|
// We use the map URL as a key
|
||||||
if (gameSceneKey === null) {
|
if (gameSceneKey === null) {
|
||||||
gameSceneKey = mapUrlFile;
|
gameSceneKey = mapUrlFile;
|
||||||
}
|
}
|
||||||
return new GameScene(mapUrlFile, mapUrlFile, instance, gameSceneKey);
|
return new GameScene(room, mapUrlFile, gameSceneKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(MapKey : string, MapUrlFile: string, instance: string, gameSceneKey: string) {
|
constructor(private room: Room, MapUrlFile: string, gameSceneKey: string) {
|
||||||
super({
|
super({
|
||||||
key: gameSceneKey
|
key: gameSceneKey
|
||||||
});
|
});
|
||||||
@ -155,11 +155,11 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
this.GameManager = gameManager;
|
this.GameManager = gameManager;
|
||||||
this.Terrains = [];
|
this.Terrains = [];
|
||||||
this.groups = new Map<number, Sprite>();
|
this.groups = new Map<number, Sprite>();
|
||||||
this.instance = instance;
|
this.instance = room.getInstance();
|
||||||
|
|
||||||
this.MapKey = MapKey;
|
this.MapKey = MapUrlFile;
|
||||||
this.MapUrlFile = MapUrlFile;
|
this.MapUrlFile = MapUrlFile;
|
||||||
this.RoomId = this.instance + '__' + MapKey;
|
this.RoomId = room.id;
|
||||||
|
|
||||||
this.createPromise = new Promise<void>((resolve, reject): void => {
|
this.createPromise = new Promise<void>((resolve, reject): void => {
|
||||||
this.createPromiseResolve = resolve;
|
this.createPromiseResolve = resolve;
|
||||||
@ -580,7 +580,7 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
this.simplePeer.unregister();
|
this.simplePeer.unregister();
|
||||||
|
|
||||||
const gameSceneKey = 'somekey'+Math.round(Math.random()*10000);
|
const gameSceneKey = 'somekey'+Math.round(Math.random()*10000);
|
||||||
const game : Phaser.Scene = GameScene.createFromUrl(this.MapUrlFile, this.instance, gameSceneKey);
|
const game : Phaser.Scene = GameScene.createFromUrl(this.room, this.MapUrlFile, gameSceneKey);
|
||||||
this.scene.add(gameSceneKey, game, true,
|
this.scene.add(gameSceneKey, game, true,
|
||||||
{
|
{
|
||||||
initPosition: {
|
initPosition: {
|
||||||
@ -690,6 +690,9 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
instance = this.instance;
|
instance = this.instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('existSceneUrl', exitSceneUrl);
|
||||||
|
console.log('existSceneInstance', instance);
|
||||||
|
|
||||||
// TODO: eventually compute a relative URL
|
// TODO: eventually compute a relative URL
|
||||||
|
|
||||||
// TODO: handle /@/ URL CASES!
|
// TODO: handle /@/ URL CASES!
|
||||||
@ -697,8 +700,10 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
const absoluteExitSceneUrl = new URL(exitSceneUrl, this.MapUrlFile).href;
|
const absoluteExitSceneUrl = new URL(exitSceneUrl, this.MapUrlFile).href;
|
||||||
const absoluteExitSceneUrlWithoutProtocol = absoluteExitSceneUrl.toString().substr(absoluteExitSceneUrl.toString().indexOf('://')+3);
|
const absoluteExitSceneUrlWithoutProtocol = absoluteExitSceneUrl.toString().substr(absoluteExitSceneUrl.toString().indexOf('://')+3);
|
||||||
const roomId = '_/'+instance+'/'+absoluteExitSceneUrlWithoutProtocol;
|
const roomId = '_/'+instance+'/'+absoluteExitSceneUrlWithoutProtocol;
|
||||||
gameManager.loadMap(new Room(roomId), this.scene);
|
console.log("Foo", instance, absoluteExitSceneUrlWithoutProtocol);
|
||||||
const exitSceneKey = instance;
|
const room = new Room(roomId);
|
||||||
|
gameManager.loadMap(room, this.scene);
|
||||||
|
const exitSceneKey = roomId;
|
||||||
|
|
||||||
const tiles : number[] = layer.data as number[];
|
const tiles : number[] = layer.data as number[];
|
||||||
for (let key=0; key < tiles.length; key++) {
|
for (let key=0; key < tiles.length; key++) {
|
||||||
@ -719,10 +724,12 @@ export class GameScene extends ResizableScene implements CenterListener {
|
|||||||
if (this.PositionNextScene[y] === undefined) {
|
if (this.PositionNextScene[y] === undefined) {
|
||||||
this.PositionNextScene[y] = new Array<{key: string, hash: string}>();
|
this.PositionNextScene[y] = new Array<{key: string, hash: string}>();
|
||||||
}
|
}
|
||||||
|
room.getMapUrl().then((url: string) => {
|
||||||
this.PositionNextScene[y][x] = {
|
this.PositionNextScene[y][x] = {
|
||||||
key: exitSceneKey,
|
key: url,
|
||||||
hash
|
hash
|
||||||
}
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user