FEATURE: improved the room capacity warning visuals
This commit is contained in:
parent
2a1af2a131
commit
41ac51f291
@ -790,7 +790,7 @@ export class SocketManager {
|
|||||||
if (!room) {
|
if (!room) {
|
||||||
//todo: this should cause the http call to return a 500
|
//todo: this should cause the http call to return a 500
|
||||||
console.error(
|
console.error(
|
||||||
"In sendAdminRoomMessage, could not find room with id '" +
|
"In dispatchWorldFullWarning, could not find room with id '" +
|
||||||
roomId +
|
roomId +
|
||||||
"'. Maybe the room was closed a few milliseconds ago and there was a race condition?"
|
"'. Maybe the room was closed a few milliseconds ago and there was a race condition?"
|
||||||
);
|
);
|
||||||
|
18
front/dist/resources/html/warningContainer.html
vendored
18
front/dist/resources/html/warningContainer.html
vendored
@ -1,18 +0,0 @@
|
|||||||
<style>
|
|
||||||
#warningMain {
|
|
||||||
border-radius: 5px;
|
|
||||||
height: 100px;
|
|
||||||
width: 300px;
|
|
||||||
background-color: red;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#warningMain h2 {
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<main id="warningMain">
|
|
||||||
<h2>Warning!</h2>
|
|
||||||
<p>This world is close to its limit!</p>
|
|
||||||
</main>
|
|
@ -27,6 +27,8 @@
|
|||||||
import {gameOverlayVisibilityStore} from "../Stores/GameOverlayStoreVisibility";
|
import {gameOverlayVisibilityStore} from "../Stores/GameOverlayStoreVisibility";
|
||||||
import {consoleGlobalMessageManagerVisibleStore} from "../Stores/ConsoleGlobalMessageManagerStore";
|
import {consoleGlobalMessageManagerVisibleStore} from "../Stores/ConsoleGlobalMessageManagerStore";
|
||||||
import ConsoleGlobalMessageManager from "./ConsoleGlobalMessageManager/ConsoleGlobalMessageManager.svelte";
|
import ConsoleGlobalMessageManager from "./ConsoleGlobalMessageManager/ConsoleGlobalMessageManager.svelte";
|
||||||
|
import {warningContainerStore} from "../Stores/MenuStore";
|
||||||
|
import WarningContainer from "./WarningContainer/WarningContainer.svelte";
|
||||||
|
|
||||||
export let game: Game;
|
export let game: Game;
|
||||||
|
|
||||||
@ -91,4 +93,7 @@
|
|||||||
{#if $chatVisibilityStore}
|
{#if $chatVisibilityStore}
|
||||||
<Chat></Chat>
|
<Chat></Chat>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if $warningContainerStore}
|
||||||
|
<WarningContainer></WarningContainer>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
<script lang="typescript">
|
||||||
|
import { fly } from 'svelte/transition';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main class="warningMain" transition:fly="{{ y: -200, duration: 500 }}">
|
||||||
|
<h2>Warning!</h2>
|
||||||
|
<p>This world is close to its limit!</p>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
main.warningMain {
|
||||||
|
width: 100vw;
|
||||||
|
background-color: red;
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
font-family: Lato;
|
||||||
|
min-width: 300px;
|
||||||
|
opacity: 0.9;
|
||||||
|
z-index: 2;
|
||||||
|
h2 {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -32,7 +32,8 @@ import {
|
|||||||
EmotePromptMessage,
|
EmotePromptMessage,
|
||||||
SendUserMessage,
|
SendUserMessage,
|
||||||
BanUserMessage,
|
BanUserMessage,
|
||||||
VariableMessage, ErrorMessage,
|
VariableMessage,
|
||||||
|
ErrorMessage,
|
||||||
} from "../Messages/generated/messages_pb";
|
} from "../Messages/generated/messages_pb";
|
||||||
|
|
||||||
import type { UserSimplePeerInterface } from "../WebRtc/SimplePeer";
|
import type { UserSimplePeerInterface } from "../WebRtc/SimplePeer";
|
||||||
@ -54,9 +55,9 @@ import {
|
|||||||
import type { BodyResourceDescriptionInterface } from "../Phaser/Entity/PlayerTextures";
|
import type { BodyResourceDescriptionInterface } from "../Phaser/Entity/PlayerTextures";
|
||||||
import { adminMessagesService } from "./AdminMessagesService";
|
import { adminMessagesService } from "./AdminMessagesService";
|
||||||
import { worldFullMessageStream } from "./WorldFullMessageStream";
|
import { worldFullMessageStream } from "./WorldFullMessageStream";
|
||||||
import { worldFullWarningStream } from "./WorldFullWarningStream";
|
|
||||||
import { connectionManager } from "./ConnectionManager";
|
import { connectionManager } from "./ConnectionManager";
|
||||||
import { emoteEventStream } from "./EmoteEventStream";
|
import { emoteEventStream } from "./EmoteEventStream";
|
||||||
|
import { warningContainerStore } from "../Stores/MenuStore";
|
||||||
|
|
||||||
const manualPingDelay = 20000;
|
const manualPingDelay = 20000;
|
||||||
|
|
||||||
@ -167,7 +168,7 @@ export class RoomConnection implements RoomConnection {
|
|||||||
emoteEventStream.fire(emoteMessage.getActoruserid(), emoteMessage.getEmote());
|
emoteEventStream.fire(emoteMessage.getActoruserid(), emoteMessage.getEmote());
|
||||||
} else if (subMessage.hasErrormessage()) {
|
} else if (subMessage.hasErrormessage()) {
|
||||||
const errorMessage = subMessage.getErrormessage() as ErrorMessage;
|
const errorMessage = subMessage.getErrormessage() as ErrorMessage;
|
||||||
console.error('An error occurred server side: '+errorMessage.getMessage());
|
console.error("An error occurred server side: " + errorMessage.getMessage());
|
||||||
} else if (subMessage.hasVariablemessage()) {
|
} else if (subMessage.hasVariablemessage()) {
|
||||||
event = EventMessage.SET_VARIABLE;
|
event = EventMessage.SET_VARIABLE;
|
||||||
payload = subMessage.getVariablemessage();
|
payload = subMessage.getVariablemessage();
|
||||||
@ -192,7 +193,14 @@ export class RoomConnection implements RoomConnection {
|
|||||||
try {
|
try {
|
||||||
variables.set(variable.getName(), JSON.parse(variable.getValue()));
|
variables.set(variable.getName(), JSON.parse(variable.getValue()));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Unable to unserialize value received from server for variable "'+variable.getName()+'". Value received: "'+variable.getValue()+'". Error: ', e);
|
console.error(
|
||||||
|
'Unable to unserialize value received from server for variable "' +
|
||||||
|
variable.getName() +
|
||||||
|
'". Value received: "' +
|
||||||
|
variable.getValue() +
|
||||||
|
'". Error: ',
|
||||||
|
e
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +244,7 @@ export class RoomConnection implements RoomConnection {
|
|||||||
} else if (message.hasBanusermessage()) {
|
} else if (message.hasBanusermessage()) {
|
||||||
adminMessagesService.onSendusermessage(message.getBanusermessage() as BanUserMessage);
|
adminMessagesService.onSendusermessage(message.getBanusermessage() as BanUserMessage);
|
||||||
} else if (message.hasWorldfullwarningmessage()) {
|
} else if (message.hasWorldfullwarningmessage()) {
|
||||||
worldFullWarningStream.onMessage();
|
warningContainerStore.activateWarningContainer();
|
||||||
} else if (message.hasRefreshroommessage()) {
|
} else if (message.hasRefreshroommessage()) {
|
||||||
//todo: implement a way to notify the user the room was refreshed.
|
//todo: implement a way to notify the user the room was refreshed.
|
||||||
} else {
|
} else {
|
||||||
@ -659,7 +667,14 @@ export class RoomConnection implements RoomConnection {
|
|||||||
try {
|
try {
|
||||||
value = JSON.parse(serializedValue);
|
value = JSON.parse(serializedValue);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Unable to unserialize value received from server for variable "'+name+'". Value received: "'+serializedValue+'". Error: ', e);
|
console.error(
|
||||||
|
'Unable to unserialize value received from server for variable "' +
|
||||||
|
name +
|
||||||
|
'". Value received: "' +
|
||||||
|
serializedValue +
|
||||||
|
'". Error: ',
|
||||||
|
e
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
callback(name, value);
|
callback(name, value);
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
import {Subject} from "rxjs";
|
|
||||||
|
|
||||||
class WorldFullWarningStream {
|
|
||||||
|
|
||||||
private _stream:Subject<void> = new Subject();
|
|
||||||
public stream = this._stream.asObservable();
|
|
||||||
|
|
||||||
|
|
||||||
onMessage() {
|
|
||||||
this._stream.next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const worldFullWarningStream = new WorldFullWarningStream();
|
|
@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
export const warningContainerKey = 'warningContainer';
|
|
||||||
export const warningContainerHtml = 'resources/html/warningContainer.html';
|
|
||||||
|
|
||||||
export class WarningContainer extends Phaser.GameObjects.DOMElement {
|
|
||||||
|
|
||||||
constructor(scene: Phaser.Scene) {
|
|
||||||
super(scene, 100, 0);
|
|
||||||
this.setOrigin(0, 0);
|
|
||||||
this.createFromCache(warningContainerKey);
|
|
||||||
this.scene.add.existing(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -6,8 +6,6 @@ import { localUserStore } from "../../Connexion/LocalUserStore";
|
|||||||
import { gameReportKey, gameReportRessource, ReportMenu } from "./ReportMenu";
|
import { gameReportKey, gameReportRessource, ReportMenu } from "./ReportMenu";
|
||||||
import { connectionManager } from "../../Connexion/ConnectionManager";
|
import { connectionManager } from "../../Connexion/ConnectionManager";
|
||||||
import { GameConnexionTypes } from "../../Url/UrlManager";
|
import { GameConnexionTypes } from "../../Url/UrlManager";
|
||||||
import { WarningContainer, warningContainerHtml, warningContainerKey } from "../Components/WarningContainer";
|
|
||||||
import { worldFullWarningStream } from "../../Connexion/WorldFullWarningStream";
|
|
||||||
import { menuIconVisible } from "../../Stores/MenuStore";
|
import { menuIconVisible } from "../../Stores/MenuStore";
|
||||||
import { videoConstraintStore } from "../../Stores/MediaStore";
|
import { videoConstraintStore } from "../../Stores/MediaStore";
|
||||||
import { showReportScreenStore } from "../../Stores/ShowReportScreenStore";
|
import { showReportScreenStore } from "../../Stores/ShowReportScreenStore";
|
||||||
@ -45,8 +43,6 @@ export class MenuScene extends Phaser.Scene {
|
|||||||
private gameQualityValue: number;
|
private gameQualityValue: number;
|
||||||
private videoQualityValue: number;
|
private videoQualityValue: number;
|
||||||
private menuButton!: Phaser.GameObjects.DOMElement;
|
private menuButton!: Phaser.GameObjects.DOMElement;
|
||||||
private warningContainer: WarningContainer | null = null;
|
|
||||||
private warningContainerTimeout: NodeJS.Timeout | null = null;
|
|
||||||
private subscriptions = new Subscription();
|
private subscriptions = new Subscription();
|
||||||
constructor() {
|
constructor() {
|
||||||
super({ key: MenuSceneName });
|
super({ key: MenuSceneName });
|
||||||
@ -91,7 +87,6 @@ export class MenuScene extends Phaser.Scene {
|
|||||||
this.load.html(gameSettingsMenuKey, "resources/html/gameQualityMenu.html");
|
this.load.html(gameSettingsMenuKey, "resources/html/gameQualityMenu.html");
|
||||||
this.load.html(gameShare, "resources/html/gameShare.html");
|
this.load.html(gameShare, "resources/html/gameShare.html");
|
||||||
this.load.html(gameReportKey, gameReportRessource);
|
this.load.html(gameReportKey, gameReportRessource);
|
||||||
this.load.html(warningContainerKey, warningContainerHtml);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
create() {
|
create() {
|
||||||
@ -147,7 +142,6 @@ export class MenuScene extends Phaser.Scene {
|
|||||||
this.menuElement.addListener("click");
|
this.menuElement.addListener("click");
|
||||||
this.menuElement.on("click", this.onMenuClick.bind(this));
|
this.menuElement.on("click", this.onMenuClick.bind(this));
|
||||||
|
|
||||||
worldFullWarningStream.stream.subscribe(() => this.showWorldCapacityWarning());
|
|
||||||
chatVisibilityStore.subscribe((v) => {
|
chatVisibilityStore.subscribe((v) => {
|
||||||
this.menuButton.setVisible(!v);
|
this.menuButton.setVisible(!v);
|
||||||
});
|
});
|
||||||
@ -194,20 +188,6 @@ export class MenuScene extends Phaser.Scene {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private showWorldCapacityWarning() {
|
|
||||||
if (!this.warningContainer) {
|
|
||||||
this.warningContainer = new WarningContainer(this);
|
|
||||||
}
|
|
||||||
if (this.warningContainerTimeout) {
|
|
||||||
clearTimeout(this.warningContainerTimeout);
|
|
||||||
}
|
|
||||||
this.warningContainerTimeout = setTimeout(() => {
|
|
||||||
this.warningContainer?.destroy();
|
|
||||||
this.warningContainer = null;
|
|
||||||
this.warningContainerTimeout = null;
|
|
||||||
}, 120000);
|
|
||||||
}
|
|
||||||
|
|
||||||
private closeSideMenu(): void {
|
private closeSideMenu(): void {
|
||||||
if (!this.sideMenuOpened) return;
|
if (!this.sideMenuOpened) return;
|
||||||
this.sideMenuOpened = false;
|
this.sideMenuOpened = false;
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
import { derived, writable, Writable } from "svelte/store";
|
import { writable } from "svelte/store";
|
||||||
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
export const menuIconVisible = writable(false);
|
export const menuIconVisible = writable(false);
|
||||||
|
|
||||||
|
let warningContainerTimeout: Timeout | null = null;
|
||||||
|
function createWarningContainerStore() {
|
||||||
|
const { subscribe, set } = writable<boolean>(false);
|
||||||
|
|
||||||
|
return {
|
||||||
|
subscribe,
|
||||||
|
activateWarningContainer() {
|
||||||
|
set(true);
|
||||||
|
if (warningContainerTimeout) clearTimeout(warningContainerTimeout);
|
||||||
|
warningContainerTimeout = setTimeout(() => {
|
||||||
|
set(false);
|
||||||
|
warningContainerTimeout = null;
|
||||||
|
}, 120000);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const warningContainerStore = createWarningContainerStore();
|
||||||
|
Loading…
Reference in New Issue
Block a user