// Read replicated discovery locally. A server-wide marker list never leaks // locations which have not been recovered through gameplay. modded class ERR_LocationComponent { protected ref SCR_MapMarkerBase m_ERRMarker; protected int m_ERRShown; protected override void EOnInit(IEntity owner) { super.EOnInit(owner); if (RplSession.Mode() != RplMode.Dedicated && !SCR_Global.IsEditMode()) GetGame().GetCallqueue().CallLater(ERR_UpdateMarker, 1500, true); } protected void ERR_UpdateMarker() { if (!GetGame().GetPlayerController() || Knowledge() <= 0 || Knowledge() == m_ERRShown) return; SCR_MapMarkerManagerComponent manager = SCR_MapMarkerManagerComponent.GetInstance(); if (!manager || !manager.GetMarkerConfig()) return; if (!m_ERRMarker) { m_ERRMarker = new SCR_MapMarkerBase(); m_ERRMarker.SetType(SCR_EMapMarkerType.PLACED_CUSTOM); vector p = Position(); m_ERRMarker.SetWorldPos(Math.Round(p[0]), Math.Round(p[2])); m_ERRMarker.SetMarkerConfigID(0); manager.InsertStaticMarker(m_ERRMarker, true); } string label = "Unknown location"; if (Knowledge() == 2) { if (Kind() == ERR_LocationKind.RADIO) label = "Radio station"; else if (Kind() == ERR_LocationKind.EXTRACTION) label = "Extraction helicopter"; else label = Id(); } m_ERRMarker.SetCustomText(label); m_ERRShown = Knowledge(); } protected override void OnDelete(IEntity owner) { if (GetGame()) GetGame().GetCallqueue().Remove(ERR_UpdateMarker); SCR_MapMarkerManagerComponent manager = SCR_MapMarkerManagerComponent.GetInstance(); if (manager && m_ERRMarker) manager.RemoveStaticMarker(m_ERRMarker); m_ERRMarker = null; super.OnDelete(owner); } }