From 23a8db11de110e5e0886f4e3cf143d7ea1f4522b Mon Sep 17 00:00:00 2001 From: Vantha Date: Wed, 11 Sep 2024 11:35:58 +0200 Subject: [PATCH] Enable observers to see and send flares --- .../data/mods/public/gui/session/input.js | 9 ++--- .../data/mods/public/gui/session/messages.js | 34 ++++++++++--------- .../mods/public/gui/session/unit_actions.js | 3 +- .../public/simulation/helpers/Commands.js | 8 +++++ 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/binaries/data/mods/public/gui/session/input.js b/binaries/data/mods/public/gui/session/input.js index 2710979f3e..91b58a81aa 100644 --- a/binaries/data/mods/public/gui/session/input.js +++ b/binaries/data/mods/public/gui/session/input.js @@ -101,9 +101,10 @@ function updateCursorAndTooltip() let cursorSet = false; let tooltipSet = false; let informationTooltip = Engine.GetGUIObjectByName("informationTooltip"); - if (inputState == INPUT_FLARE || inputState == INPUT_NORMAL && Engine.HotkeyIsPressed("session.flare") && !g_IsObserver) + if (inputState == INPUT_FLARE || inputState == INPUT_NORMAL && Engine.HotkeyIsPressed("session.flare")) { - Engine.SetCursor("action-flare"); + const playerOrObserver = g_IsObserver ? "observer" : "player"; + Engine.SetCursor("action-" + playerOrObserver + "-flare"); cursorSet = true; } else if (!mouseIsOverObject && (inputState == INPUT_NORMAL || inputState == INPUT_PRESELECTEDACTION) || g_MiniMapPanel.isMouseOverMiniMap()) @@ -825,7 +826,7 @@ function handleInputAfterGui(ev) return false; case "mousebuttondown": - if (Engine.HotkeyIsPressed("session.flare") && controlsPlayer(g_ViewedPlayer)) + if (Engine.HotkeyIsPressed("session.flare")) { triggerFlareAction(Engine.GetTerrainAtScreenPoint(ev.x, ev.y)); return true; @@ -1134,7 +1135,7 @@ function handleInputAfterGui(ev) case INPUT_FLARE: if (ev.type == "mousebuttondown") { - if (ev.button == SDL_BUTTON_LEFT && controlsPlayer(g_ViewedPlayer)) + if (ev.button == SDL_BUTTON_LEFT) { triggerFlareAction(Engine.GetTerrainAtScreenPoint(ev.x, ev.y)); inputState = INPUT_NORMAL; diff --git a/binaries/data/mods/public/gui/session/messages.js b/binaries/data/mods/public/gui/session/messages.js index 6ba46ebac1..1ff84cc904 100644 --- a/binaries/data/mods/public/gui/session/messages.js +++ b/binaries/data/mods/public/gui/session/messages.js @@ -290,24 +290,26 @@ var g_NotificationsTypes = }, "map-flare": function(notification, player) { - // Don't display for the player that did the flare because they will see it immediately - if (player != Engine.GetPlayerID() && g_Players[player].isMutualAlly[Engine.GetPlayerID()]) - { - let now = Date.now(); - if (g_FlareRateLimitLastTimes.length) - { - g_FlareRateLimitLastTimes = g_FlareRateLimitLastTimes.filter(t => now - t < g_FlareRateLimitScope * 1000); - if (g_FlareRateLimitLastTimes.length >= g_FlareRateLimitMaximumFlares) - { - warn("Received too many flares. Dropping a flare request by '" + g_Players[player].name + "'."); - return; - } - } - g_FlareRateLimitLastTimes.push(now); + const shouldSeeFlare = g_IsObserver || g_Players[player]?.isMutualAlly[Engine.GetPlayerID()]; - displayFlare(notification.position, notification.guid); - Engine.PlayUISound(g_FlareSound, false); + // Don't display for the player that did the flare because they will see it immediately. + if (!shouldSeeFlare || notification.guid == Engine.GetPlayerGUID()) + return; + + let now = Date.now(); + if (g_FlareRateLimitLastTimes.length) + { + g_FlareRateLimitLastTimes = g_FlareRateLimitLastTimes.filter(t => now - t < g_FlareRateLimitScope * 1000); + if (g_FlareRateLimitLastTimes.length >= g_FlareRateLimitMaximumFlares) + { + warn("Received too many flares. Dropping a flare request by '" + g_Players[player].name + "'."); + return; + } } + g_FlareRateLimitLastTimes.push(now); + + displayFlare(notification.position, notification.guid); + Engine.PlayUISound(g_FlareSound, false); } }; diff --git a/binaries/data/mods/public/gui/session/unit_actions.js b/binaries/data/mods/public/gui/session/unit_actions.js index c40731bcf2..3caff305b7 100644 --- a/binaries/data/mods/public/gui/session/unit_actions.js +++ b/binaries/data/mods/public/gui/session/unit_actions.js @@ -1944,7 +1944,8 @@ function displayFlare(position, playerGUID) "template": g_TargetMarker.map_flare, "x": position.x, "z": position.z, - "owner": playerID + // If the flare was sent by an observer we set the owner to gaia to color the target marker in white. + "owner": playerID != -1 ? playerID : 0 }); g_MiniMapPanel.flare(position, playerID); addChatMessage({ diff --git a/binaries/data/mods/public/simulation/helpers/Commands.js b/binaries/data/mods/public/simulation/helpers/Commands.js index 8498388f0d..e3fc8e5fcd 100644 --- a/binaries/data/mods/public/simulation/helpers/Commands.js +++ b/binaries/data/mods/public/simulation/helpers/Commands.js @@ -6,7 +6,11 @@ function ProcessCommand(player, cmd) { let cmpPlayer = QueryPlayerIDInterface(player); if (!cmpPlayer) + { + if (player == -1 && g_ObserverCommands[cmd.type]) + g_ObserverCommands[cmd.type](player, cmd, {}); return; + } let data = { "cmpPlayer": cmpPlayer, @@ -908,6 +912,10 @@ var g_Commands = { }; +var g_ObserverCommands = { + "map-flare": g_Commands["map-flare"] +}; + /** * Sends a GUI notification about unit(s) that failed to ungarrison. */