diff --git a/binaries/data/mods/public/simulation/components/Visibility.js b/binaries/data/mods/public/simulation/components/Visibility.js index 7dee381638..a231c15c3d 100644 --- a/binaries/data/mods/public/simulation/components/Visibility.js +++ b/binaries/data/mods/public/simulation/components/Visibility.js @@ -21,6 +21,8 @@ Visibility.prototype.Init = function() this.alwaysVisible = this.template.AlwaysVisible == "true"; this.preview = this.template.Preview == "true"; + this.activated = false; + if (this.preview) this.SetActivated(true); }; @@ -32,6 +34,18 @@ Visibility.prototype.SetActivated = function(status) { let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); cmpRangeManager.ActivateScriptedVisibility(this.entity, status); + + this.activated = status; +}; + +/** + * This function is a fallback for some entities whose visibility status + * cannot be cached by the range manager (especially local entities like previews). + * Calling the scripts is expensive, so only call it if really needed. + */ +Visibility.prototype.IsActivated = function() +{ + return this.activated; }; /** diff --git a/source/simulation2/components/CCmpRangeManager.cpp b/source/simulation2/components/CCmpRangeManager.cpp index fdbf151d17..f703c98381 100644 --- a/source/simulation2/components/CCmpRangeManager.cpp +++ b/source/simulation2/components/CCmpRangeManager.cpp @@ -1462,6 +1462,11 @@ public: if (it->second.scriptedVisibility == 1 && cmpVisibility) return cmpVisibility->GetVisibility(player, los.IsVisible(i, j), los.IsExplored(i, j)); } + else + { + if (cmpVisibility && cmpVisibility->IsActivated()) + return cmpVisibility->GetVisibility(player, los.IsVisible(i, j), los.IsExplored(i, j)); + } // Else, default behavior diff --git a/source/simulation2/components/ICmpVisibility.cpp b/source/simulation2/components/ICmpVisibility.cpp index 1719b8e959..824342828f 100644 --- a/source/simulation2/components/ICmpVisibility.cpp +++ b/source/simulation2/components/ICmpVisibility.cpp @@ -30,6 +30,11 @@ class CCmpVisibilityScripted : public ICmpVisibility public: DEFAULT_SCRIPT_WRAPPER(VisibilityScripted) + virtual bool IsActivated() + { + return m_Script.Call("IsActivated"); + } + virtual ICmpRangeManager::ELosVisibility GetVisibility(player_id_t player, bool isVisible, bool isExplored) { int visibility = m_Script.Call("GetVisibility", player, isVisible, isExplored); diff --git a/source/simulation2/components/ICmpVisibility.h b/source/simulation2/components/ICmpVisibility.h index 6da67b4b16..2eaaa6d3f2 100644 --- a/source/simulation2/components/ICmpVisibility.h +++ b/source/simulation2/components/ICmpVisibility.h @@ -35,6 +35,13 @@ class ICmpVisibility : public IComponent { public: + /** + * This function is a fallback for some entities whose visibility status + * cannot be cached by the range manager (especially local entities like previews). + * Calling the scripts is expensive, so only call it if really needed. + */ + virtual bool IsActivated() = 0; + virtual ICmpRangeManager::ELosVisibility GetVisibility(player_id_t player, bool isVisible, bool isExplored) = 0; virtual bool GetRetainInFog() = 0;