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)