NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)