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

droneFunctions.py (9817B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\menuSvcExtras\droneFunctions.py
      2 import blue
      3 import carbonui.const as uiconst
      4 import evetypes
      5 import localization
      6 import uthread
      7 from carbonui.control.message import QuickMessage
      8 from eve.client.script.environment import invControllers
      9 from eve.client.script.util import eveMisc
     10 from eve.common.lib import appConst as const, appConst
     11 from eve.common.script.net import eveMoniker
     12 from eve.common.script.sys.eveCfg import InStructure
     13 from eve.common.script.sys import idCheckers
     14 from eve.common.script.util.systemExclusions import IsStarterSystem
     15 from eveexceptions import UserError
     16 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     17 
     18 def HandleMultipleCallError(droneID, ret, messageName):
     19     if not len(ret):
     20         return
     21     if len(droneID) == 1:
     22         pick = droneID[0]
     23         raise UserError(ret[pick][0], ret[pick][1])
     24     elif len(droneID) >= len(ret):
     25         lastError = ''
     26         for error in ret.itervalues():
     27             if error[0] != lastError and lastError != '':
     28                 raise UserError(messageName, {'succeeded': len(droneID) - len(ret),
     29                  'failed': len(ret),
     30                  'total': len(droneID)})
     31             lastError = error[0]
     32         else:
     33             pick = ret.items()[0][1]
     34             raise UserError(pick[0], pick[1])
     35 
     36 
     37 def PerformPrimaryAction(droneItemAndTypeIDs):
     38     salvageDroneIDs = []
     39     combatDroneIDs = []
     40     miningDroneIDs = []
     41     for droneID, typeID in droneItemAndTypeIDs:
     42         groupID = evetypes.GetGroupID(typeID)
     43         if groupID == appConst.groupSalvageDrone:
     44             salvageDroneIDs.append(droneID)
     45         elif groupID == appConst.groupMiningDrone:
     46             miningDroneIDs.append(droneID)
     47         else:
     48             combatDroneIDs.append(droneID)
     49 
     50     if combatDroneIDs:
     51         EngageTarget(combatDroneIDs)
     52     if salvageDroneIDs:
     53         Salvage(salvageDroneIDs)
     54     if miningDroneIDs:
     55         MineRepeatedly(miningDroneIDs)
     56 
     57 
     58 def EngageTarget(droneIDs):
     59     michelle = sm.StartService('michelle')
     60     dronesRemoved = []
     61     for droneID in droneIDs:
     62         item = michelle.GetItem(droneID)
     63         if not item:
     64             dronesRemoved.append(droneID)
     65 
     66     for droneID in dronesRemoved:
     67         droneIDs.remove(droneID)
     68 
     69     targetID = sm.GetService('target').GetActiveTargetID()
     70     if targetID is None:
     71         raise UserError('DroneCommandRequiresActiveTarget')
     72     if IsStarterSystem(session.solarsystemid):
     73         targetItem = sm.StartService('michelle').GetItem(targetID)
     74         if targetItem and idCheckers.IsCharacter(targetItem.ownerID):
     75             errorMsg = localization.GetByLabel('UI/Corporations/AccessRestrictions/StarterSpaceAggressionBlocked')
     76             QuickMessage.show_message(errorMsg)
     77             return
     78     crimewatchSvc = sm.GetService('crimewatchSvc')
     79     requiredSafetyLevel = crimewatchSvc.GetRequiredSafetyLevelForEngagingDrones(droneIDs, targetID)
     80     considerSvc = sm.GetService('consider')
     81     if not considerSvc.SafetyCheckPasses(requiredSafetyLevel):
     82         if IsStarterSystem(session.solarsystemid):
     83             errorMsg = localization.GetByLabel('UI/Corporations/AccessRestrictions/StarterSpaceAggressionBlocked')
     84             QuickMessage.show_message(errorMsg)
     85         return
     86     isOffensive = crimewatchSvc.IsAnyEffectOffensive(droneIDs)
     87     if isOffensive and not considerSvc.ShowNPCAtttackConfirmationWindowIfAppropriate(requiredSafetyLevel, targetID):
     88         return
     89     entity = eveMoniker.GetEntityAccess()
     90     if entity:
     91         ret = entity.CmdEngage(droneIDs, targetID)
     92         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
     93         if droneIDs:
     94             name = sm.GetService('space').GetWarpDestinationName(targetID)
     95             prompt_player_fsd_dialog('CustomNotify', {'notify': localization.GetByLabel('UI/Inflight/DronesEngaging', name=name)})
     96 
     97 
     98 def Assist(charID, droneIDs):
     99     if charID is None:
    100         targetID = sm.StartService('target').GetActiveTargetID()
    101         if targetID is None:
    102             raise UserError('DroneCommandRequiresActiveTarget')
    103         michelle = sm.StartService('michelle')
    104         targetItem = michelle.GetItem(targetID)
    105         if targetItem.categoryID != const.categoryShip or targetItem.groupID == const.groupCapsule:
    106             raise UserError('DroneCommandRequiresShipButNotCapsule')
    107         targetBall = michelle.GetBall(targetID)
    108         if not targetBall.isInteractive or not sm.GetService('fleet').IsMember(targetItem.ownerID):
    109             raise UserError('DroneCommandRequiresShipPilotedFleetMember')
    110         assistID = targetItem.ownerID
    111     else:
    112         assistID = charID
    113     entity = eveMoniker.GetEntityAccess()
    114     if entity:
    115         ret = entity.CmdAssist(assistID, droneIDs)
    116         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    117 
    118 
    119 def Guard(charID, droneIDs):
    120     if charID is None:
    121         targetID = sm.StartService('target').GetActiveTargetID()
    122         if targetID is None:
    123             raise UserError('DroneCommandRequiresActiveTarget')
    124         michelle = sm.StartService('michelle')
    125         targetItem = michelle.GetItem(targetID)
    126         if targetItem.categoryID != const.categoryShip or targetItem.groupID == const.groupCapsule:
    127             raise UserError('DroneCommandRequiresShipButNotCapsule')
    128         targetBall = michelle.GetBall(targetID)
    129         if not targetBall.isInteractive or not sm.GetService('fleet').IsMember(targetItem.ownerID):
    130             raise UserError('DroneCommandRequiresShipPilotedFleetMember')
    131         guardID = targetItem.ownerID
    132     else:
    133         guardID = charID
    134     entity = eveMoniker.GetEntityAccess()
    135     if entity:
    136         ret = entity.CmdGuard(guardID, droneIDs)
    137         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    138 
    139 
    140 def MineRepeatedly(droneIDs):
    141     targetID = sm.StartService('target').GetActiveTargetID()
    142     if targetID is None:
    143         raise UserError('DroneCommandRequiresActiveTarget')
    144     entity = eveMoniker.GetEntityAccess()
    145     if entity:
    146         ret = entity.CmdMineRepeatedly(droneIDs, targetID)
    147         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    148 
    149 
    150 def Salvage(droneIDs):
    151     targetID = sm.GetService('target').GetActiveTargetID()
    152     entity = eveMoniker.GetEntityAccess()
    153     if entity:
    154         ret = entity.CmdSalvage(droneIDs, targetID)
    155         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    156 
    157 
    158 def DroneUnanchor(droneIDs):
    159     targetID = sm.StartService('target').GetActiveTargetID()
    160     if targetID is None:
    161         raise UserError('DroneCommandRequiresActiveTarget')
    162     entity = eveMoniker.GetEntityAccess()
    163     if entity:
    164         ret = entity.CmdUnanchor(droneIDs, targetID)
    165         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    166 
    167 
    168 def ReturnAndOrbit(droneIDs):
    169     entity = eveMoniker.GetEntityAccess()
    170     if entity:
    171         ret = entity.CmdReturnHome(droneIDs)
    172         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    173 
    174 
    175 def ReturnToDroneBay(droneIDs):
    176     entity = eveMoniker.GetEntityAccess()
    177     if entity:
    178         ret = entity.CmdReturnBay(droneIDs)
    179         HandleMultipleCallError(droneIDs, ret, 'MultiDroneCmdResult')
    180 
    181 
    182 def RealScoopToDroneBay(objectIDs):
    183     ship = sm.StartService('gameui').GetShipAccess()
    184     if ship:
    185         ret = ship.ScoopDrone(objectIDs)
    186         HandleMultipleCallError(objectIDs, ret, 'MultiDroneCmdResult')
    187 
    188 
    189 def AbandonDrone(droneIDs):
    190     if prompt_player_fsd_dialog('ConfirmAbandonDrone', {}, uiconst.YESNO, suppress=uiconst.ID_YES) != uiconst.ID_YES:
    191         return
    192     entity = eveMoniker.GetEntityAccess()
    193     if entity:
    194         ret = entity.CmdAbandonDrone(droneIDs)
    195         HandleMultipleCallError(droneIDs, ret, 'MultDroneCmdResult')
    196 
    197 
    198 def LaunchDrones(droneIDs):
    199     sm.GetService('godma').GetStateManager().SendDroneSettings()
    200     invItems = [ item for item in invControllers.ShipDroneBay().GetItems() if item.itemID in droneIDs ]
    201     eveMisc.LaunchFromShip(invItems)
    202 
    203 
    204 def ReconnectToDrones():
    205     ret = {}
    206     bp = sm.GetService('michelle').GetBallpark()
    207     if not bp:
    208         return ret
    209     if InStructure():
    210         return ret
    211     shipBall = bp.GetBall(session.shipid)
    212     if not shipBall:
    213         return ret
    214     drones = sm.GetService('michelle').GetDrones()
    215     droneCandidates = []
    216     for ball, slimItem in bp.GetBallsAndItems():
    217         if slimItem and slimItem.categoryID == const.categoryDrone:
    218             if slimItem.ownerID == session.charid and ball.id not in drones:
    219                 droneCandidates.append(ball.id)
    220                 if len(droneCandidates) >= const.MAX_DRONE_RECONNECTS:
    221                     break
    222 
    223     if droneCandidates:
    224         prompt_player_fsd_dialog('CustomNotify', {'notify': localization.GetByLabel('UI/Messages/ReconnectFoundDrones')})
    225         _ReconnectToDroneCandidates(droneCandidates)
    226     else:
    227         prompt_player_fsd_dialog('CustomNotify', {'notify': localization.GetByLabel('UI/Messages/ReconnectFoundNoDrones')})
    228     return ret
    229 
    230 
    231 def _ReconnectToDroneCandidates(droneCandidates):
    232     if not droneCandidates:
    233         return
    234     entity = eveMoniker.GetEntityAccess()
    235     if entity:
    236 
    237         def SpewError(*args):
    238             raise UserError(*args)
    239 
    240         ret = entity.CmdReconnectToDrones(droneCandidates)
    241         for errStr, dicty in ret.iteritems():
    242             uthread.new(SpewError, errStr, dicty)
    243             blue.pyos.synchro.Sleep(5000)
    244 
    245 
    246 def FitDrone(invItems, invCacheSvc):
    247     if type(invItems) is not list:
    248         invItems = [invItems]
    249     itemIDs = [ node.itemID for node in invItems ]
    250     if session.shipid:
    251         for itemID in itemIDs:
    252             invCacheSvc.UnlockItem(itemID)
    253 
    254         invCacheSvc.GetInventoryFromId(session.shipid).MultiAdd(itemIDs, invItems[0].locationID, flag=const.flagDroneBay)