001package com.fs.starfarer.api.impl.campaign.velfield; 002 003import java.util.Iterator; 004import java.util.List; 005 006import org.lwjgl.util.vector.Vector2f; 007 008import com.fs.starfarer.api.Global; 009import com.fs.starfarer.api.campaign.CampaignTerrainAPI; 010import com.fs.starfarer.api.campaign.CoreUITabId; 011import com.fs.starfarer.api.campaign.econ.MarketAPI; 012import com.fs.starfarer.api.campaign.listeners.CoreUITabListener; 013import com.fs.starfarer.api.impl.campaign.ids.Stats; 014import com.fs.starfarer.api.impl.campaign.intel.events.ht.HyperspaceTopographyEventIntel; 015import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.CustomStreamRevealer; 016import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment; 017import com.fs.starfarer.api.util.CollisionGridUtil; 018import com.fs.starfarer.api.util.Misc; 019 020public class SlipstreamVisibilityManager implements CoreUITabListener { 021 022// public static String KEY = "$svm_ref"; 023// 024// protected transient CollisionGridUtil grid; 025// protected IntervalUtil interval = new IntervalUtil(1f, 2f); 026// protected Random random = new Random(); 027// 028// public static SlipstreamVisibilityManager get() { 029// return (SlipstreamVisibilityManager) Global.getSector().getMemoryWithoutUpdate().get(KEY); 030// } 031// 032// public SlipstreamVisibilityManager() { 033// Global.getSector().getMemoryWithoutUpdate().set(KEY, this); 034// } 035// 036// protected Object readResolve() { 037// return this; 038// } 039 040 public void reportAboutToOpenCoreTab(CoreUITabId tab, Object param) { 041 if (tab == CoreUITabId.MAP) { 042 043 HyperspaceTopographyEventIntel intel = HyperspaceTopographyEventIntel.get(); 044 if (intel != null) { 045 intel.updateMarketDetectionRanges(); 046 } 047 //System.out.println("OPENING MAP"); 048 //for (int i = 0; i < 100; i++) { 049 updateSlipstreamVisibility(null, 0f); 050 //} 051 } 052 } 053 054 public static void updateSlipstreamVisibility(Vector2f extraPoint, float extraRangeLY) { 055 float sw = Global.getSettings().getFloat("sectorWidth"); 056 float sh = Global.getSettings().getFloat("sectorHeight"); 057 float minCellSize = 12000f; 058 float cellSize = Math.max(minCellSize, sw * 0.05f); 059 060 CollisionGridUtil grid = new CollisionGridUtil(-sw/2f, sw/2f, -sh/2f, sh/2f, cellSize); 061 062 for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) { 063 if (market.isHidden()) continue; 064 if (market.getContainingLocation() == null) continue; 065 if (!market.isPlayerOwned()) continue; 066 067 float range = market.getStats().getDynamic().getMod(Stats.SLIPSTREAM_REVEAL_RANGE_LY_MOD).computeEffective(0f); 068 range *= Misc.getUnitsPerLightYear(); 069 if (range <= 0) continue; 070 071// Industry spaceport = market.getIndustry(Industries.SPACEPORT); 072// if (spaceport == null || !spaceport.isFunctional()) continue; 073 074 Vector2f loc = market.getLocationInHyperspace(); 075 CustomStreamRevealer revealer = new CustomStreamRevealer(loc, range); 076 grid.addObject(revealer, loc, range * 2f, range * 2f); 077 } 078 079 if (extraPoint != null && extraRangeLY > 0) { 080 float range = extraRangeLY * Misc.getUnitsPerLightYear(); 081 CustomStreamRevealer revealer = new CustomStreamRevealer(extraPoint, range); 082 grid.addObject(revealer, extraPoint, range * 2f, range * 2f); 083 } 084 085 //System.out.println("BEGIN"); 086 float maxDist = 0f; 087 List<CampaignTerrainAPI> terrainList = Global.getSector().getHyperspace().getTerrainCopy(); 088 for (CampaignTerrainAPI terrain : terrainList) { 089 if (terrain.getPlugin() instanceof SlipstreamTerrainPlugin2) { 090 //System.out.println("Processing: " + terrain.getId()); 091 SlipstreamTerrainPlugin2 stream = (SlipstreamTerrainPlugin2) terrain.getPlugin(); 092 if (stream.isDynamic()) continue; 093 094 for (SlipstreamSegment curr : stream.getSegments()) { 095 if (curr.discovered) continue; 096 Iterator<Object> iter = grid.getCheckIterator(curr.loc, curr.width / 2f, curr.width / 2f); 097 //Iterator<Object> iter = grid.getCheckIterator(curr.loc, 100f, 100f); 098 while (iter.hasNext()) { 099 Object obj = iter.next(); 100 if (obj instanceof CustomStreamRevealer) { 101 CustomStreamRevealer rev = (CustomStreamRevealer) obj; 102 Vector2f loc = rev.loc; 103 float radius = rev.radius; 104 105 float dist = Misc.getDistance(loc, curr.loc); 106 if (dist > maxDist) { 107 maxDist = dist; 108// if (dist >= 32500) { 109// System.out.println("Rev loc: " + rev.loc); 110// //grid.getCheckIterator(curr.loc, 100f, 100f); 111// } 112 } 113 if (dist < radius) { 114 curr.discovered = true; 115 break; 116 } 117 } 118 } 119 } 120 //break; 121 } 122 } 123 } 124 125 126}