moonscan.py (5964B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\moonscan.py 2 from ballparkCommon.intersection import GetClosestIntersectionForRay 3 from carbon.common.script.sys.service import Service 4 from eve.client.script.ui.inflight.scannerFiles.moonScanner import MoonScanner 5 from eveexceptions import UserError 6 from inventorycommon.const import groupMoon, groupSurveyProbeLauncher 7 from localization import GetByLabel 8 from signals import Signal 9 10 class MoonScanSvc(Service): 11 __guid__ = 'svc.moonScan' 12 __update_on_reload__ = 1 13 __notifyevents__ = ['OnScanNoMaterials', 14 'OnMoonScanComplete', 15 'OnNewMoonProbe', 16 'OnRemoveMoonProbe', 17 'OnBallAdded', 18 'OnSessionChanged'] 19 20 def Run(self, *etc): 21 Service.Run(self, *etc) 22 self.scans = {} 23 self.moonProbeTracker = MoonProbeTracker() 24 25 def OnScanNoMaterials(self, moonID): 26 bp = sm.GetService('michelle').GetBallpark() 27 if not bp: 28 return 29 slimItem = bp.GetInvItem(moonID) 30 if slimItem is None: 31 return 32 if slimItem.groupID != groupMoon: 33 text = GetByLabel('UI/Inflight/Scanner/SurveyProbeHitNonMoon', itemName=slimItem.name) 34 raise UserError('CustomNotify', {'notify': text}) 35 self._UpdateScanMoonDict(moonID, {}) 36 37 def OnMoonScanComplete(self, moonID, results): 38 self._UpdateScanMoonDict(moonID, results) 39 40 def _UpdateScanMoonDict(self, moonID, results): 41 self.scans[moonID] = results 42 self.OpenAndLoadScanningWnd(moonID=moonID) 43 44 def GetWndIfOpen(self): 45 return MoonScanner.GetIfOpen() 46 47 def GetScans(self): 48 return self.scans 49 50 def GetProbeData(self): 51 return self.moonProbeTracker.GetProbeData() 52 53 def OpenAndLoadScanningWnd(self, moonID = None): 54 wnd = self.GetWndIfOpen() 55 if wnd: 56 wnd.Maximize() 57 wnd.LoadWnd(moonID=moonID) 58 else: 59 MoonScanner.Open(moonID=moonID) 60 61 def Clear(self): 62 self.scans = {} 63 wnd = self.GetWndIfOpen() 64 if wnd: 65 wnd.ClearMoons() 66 67 def ClearEntry(self, celestialID): 68 if celestialID in self.scans: 69 del self.scans[celestialID] 70 self.OpenAndLoadScanningWnd() 71 72 def OnNewMoonProbe(self, probe): 73 self.moonProbeTracker.AddProbe(probe) 74 self.OpenAndLoadScanningWnd() 75 76 def OnRemoveMoonProbe(self, probeID): 77 self.moonProbeTracker.RemoveProbe(probeID) 78 79 def GetActiveProbeTypeID(self): 80 typeID = self.moonProbeTracker.GetProbeTypeID() 81 if typeID: 82 return typeID 83 charges = self.GetChargesInProbeLauncher() 84 if charges: 85 return charges.typeID 86 87 def GetOnlineProbeLauncher(self): 88 launchers = self.GetOnlineProbeLaunchers() 89 if launchers: 90 return launchers[0] 91 else: 92 return None 93 94 def GetOnlineProbeLaunchers(self): 95 launchers = [] 96 ship = sm.GetService('godma').GetItem(session.shipid) 97 if ship: 98 for module in ship.modules: 99 if module.isOnline and module.groupID == groupSurveyProbeLauncher: 100 launchers.append(module) 101 102 return launchers 103 104 def HasOnlineProbeLauncher(self): 105 return bool(self.GetOnlineProbeLauncher()) 106 107 def GetChargesInProbeLauncher(self): 108 launcher = self.GetOnlineProbeLauncher() 109 if launcher is None: 110 return 111 flagID = launcher.flagID 112 return sm.GetService('godma').GetStateManager().GetSubLocation(session.shipid, flagID) 113 114 def OnBallAdded(self, slimItem): 115 probe = self.moonProbeTracker.GetProbeData().get(slimItem.itemID, None) 116 if not probe: 117 return 118 self.FindMoonForProbe(probe) 119 120 def OnSessionChanged(self, isremote, sess, change): 121 if 'solarsystemid' in change or 'structureid' in change: 122 self.moonProbeTracker.RemoveAllProbes() 123 124 def FindMoonForProbe(self, probe): 125 bp = sm.GetService('michelle').GetBallpark() 126 if not bp: 127 return 128 probeBall = bp.GetBall(probe.probeID) 129 if not probeBall: 130 return 131 origin = probe.pos 132 direction = (probeBall.vx, probeBall.vy, probeBall.vz) 133 celestialID, intersection = GetClosestIntersectionForRay(bp, origin, direction, probe.maxScanRange) 134 celestialSlimItem = bp.slimItems.get(celestialID, None) 135 if celestialSlimItem and celestialSlimItem.groupID == groupMoon: 136 toRegister = celestialID 137 else: 138 toRegister = None 139 self.moonProbeTracker.RegisterMoonToProbe(probe.probeID, toRegister) 140 141 def GetMoonForProbe(self, probeID): 142 return self.moonProbeTracker.GetMoonForProbe(probeID) 143 144 145 class MoonProbeTracker(object): 146 147 def __init__(self): 148 self.counter = 1 149 self.probeData = {} 150 self.moonsByProbIDs = {} 151 self.on_probes_changed = Signal(signalName='on_probes_changed') 152 153 def AddProbe(self, probe): 154 self.probeData[probe.probeID] = probe 155 probe.probeNumber = self.counter 156 self.counter += 1 157 self.on_probes_changed() 158 159 def RemoveProbe(self, probeID): 160 if probeID in self.probeData: 161 del self.probeData[probeID] 162 self.moonsByProbIDs.pop(probeID, None) 163 self.on_probes_changed() 164 165 def RemoveAllProbes(self): 166 self.probeData.clear() 167 self.moonsByProbIDs.clear() 168 self.on_probes_changed() 169 170 def GetProbeData(self): 171 return self.probeData 172 173 def GetProbeTypeID(self): 174 if self.probeData: 175 return self.probeData.values()[0].typeID 176 177 def RegisterMoonToProbe(self, probeID, moonID): 178 self.moonsByProbIDs[probeID] = moonID 179 180 def GetMoonForProbe(self, probeID): 181 return self.moonsByProbIDs.get(probeID, -1) 182 183 def GetNumProbes(self): 184 return len(self.probeData)