tacticalOverlay.py (11191B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\tacticalOverlay.py 2 import blue 3 import uthread2 4 from eve.client.script.parklife import states as stateConst 5 from eve.common.lib import appConst as const 6 from tacticalNavigation import ballparkFunctions as ballpark 7 from tacticalNavigation import tacticalCompass 8 from tacticalNavigation.ui import util as tacticalUI 9 _HIDE_VELOCITY_CATEGORIES = [const.categoryAsteroid] 10 11 class TacticalOverlay: 12 _interestStates = [stateConst.targeting, 13 stateConst.targeted, 14 stateConst.mouseOver, 15 stateConst.selected, 16 stateConst.lookingAt] 17 _aggressorStates = [stateConst.targeted, 18 stateConst.threatTargetsMe, 19 stateConst.threatAttackingMe, 20 stateConst.flagOutlaw, 21 stateConst.flagDangerous, 22 stateConst.flagAtWarCanFight, 23 stateConst.flagStandingBad, 24 stateConst.flagStandingHorrible, 25 stateConst.flagAtWarMilitia, 26 stateConst.flagAlliesAtWar, 27 stateConst.flagSuspect, 28 stateConst.flagCriminal, 29 stateConst.flagHasKillRight, 30 stateConst.flagLimitedEngagement, 31 stateConst.targeting] 32 _friendlyStates = [stateConst.flagSameFleet, 33 stateConst.flagSamePlayerCorp, 34 stateConst.flagSameNpcCorp, 35 stateConst.flagSameAlliance] 36 37 def __init__(self, tactical, actionDisplay): 38 self.tactical = tactical 39 self.actionDisplay = actionDisplay 40 self.tacticalCompass = None 41 self.initialized = False 42 self.initializing = False 43 self.showingModuleRange = False 44 self.selectedID = None 45 self.selectedConnector = None 46 self.rootPosition = None 47 self.navBalls = [] 48 self._ballInterests = {} 49 self._ballFriendly = {} 50 self._ballAggressive = {} 51 52 def Initialize(self): 53 if self.initialized or self.initializing: 54 return 55 self.initializing = True 56 self.tacticalCompass = tacticalCompass.TacticalCompass() 57 self.InitConnectors() 58 self.initialized = True 59 self.initializing = False 60 self.UpdateTargetingRange() 61 self.OnShipChange() 62 self.actionDisplay.EnableActionDisplay(True) 63 64 def IsInitialized(self): 65 return self.initialized 66 67 def EnableMoveMode(self, curve): 68 curveID = getattr(curve, 'id', None) 69 if not self.initialized: 70 return 71 self.tacticalCompass.SetMoveMode(True, curve) 72 if curveID == session.shipid or curve is None: 73 return 74 ego = ballpark.GetBall(session.shipid) 75 if ego is not None: 76 self.tacticalCompass.AddConnector(ego, True) 77 78 def DisableMoveMode(self): 79 if not self.initialized: 80 return 81 ego = ballpark.GetBall(session.shipid) 82 self.RemoveConnector(session.shipid) 83 self.tacticalCompass.SetMoveMode(False, ego) 84 85 def RegisterNavBall(self, ball): 86 if ball not in self.navBalls: 87 self.navBalls.append(ball) 88 self.tacticalCompass.AddConnector(ball, False) 89 90 def UnregisterNavBall(self, ball): 91 if ball in self.navBalls: 92 self.navBalls.remove(ball) 93 self.RemoveConnector(ball.id) 94 95 def TearDown(self): 96 if self.initialized: 97 self._ClearSelection() 98 self.tacticalCompass.ClearAll() 99 self.initialized = False 100 self.tacticalCompass = None 101 self.actionDisplay.EnableActionDisplay(False) 102 103 def _ShouldShowVelocity(self, slimItem): 104 categoryID = getattr(slimItem, 'categoryID', None) 105 return categoryID not in _HIDE_VELOCITY_CATEGORIES 106 107 def AddConnector(self, ball, slimItem): 108 if self.initialized: 109 self.tacticalCompass.AddConnector(ball, self._ShouldShowVelocity(slimItem)) 110 self._CheckAggressionStates(ball) 111 112 def HasConnector(self, ballID): 113 if not self.initialized: 114 return False 115 return self.tacticalCompass.HasConnector(ballID) or ballID == self.selectedID or self._HasInterest(ballID) 116 117 def RemoveConnector(self, ballID): 118 if not self.initialized: 119 return 120 self.tacticalCompass.RemoveConnector(ballID) 121 if ballID == self.selectedID: 122 self._ClearSelection() 123 self._ClearInterest(ballID) 124 125 def _UpdateInterest(self, ballID, state, flag): 126 if ballID not in self._ballInterests: 127 if flag: 128 self._ballInterests[ballID] = set([state]) 129 return 130 if not flag and state in self._ballInterests[ballID]: 131 self._ballInterests[ballID].remove(state) 132 if flag and state not in self._ballInterests[ballID]: 133 self._ballInterests[ballID].add(state) 134 135 def _HasInterest(self, ballID): 136 return ballID in self._ballInterests or ballID in self._ballAggressive 137 138 def _ClearInterest(self, ballID): 139 if ballID in self._ballInterests: 140 del self._ballInterests[ballID] 141 if ballID in self._ballAggressive: 142 del self._ballAggressive[ballID] 143 144 def _IsInteresting(self, ballID): 145 return ballID in self._ballInterests and len(self._ballInterests[ballID]) > 0 146 147 def _CheckInterest(self, ballID, state, flag): 148 if state not in self._interestStates: 149 return 150 if self.tacticalCompass is None: 151 return 152 self._UpdateInterest(ballID, state, flag) 153 if self._IsInteresting(ballID): 154 ball = ballpark.GetBall(ballID) 155 if ball is None: 156 return 157 bp = ballpark.GetBallpark() 158 slimItem = None 159 if bp is not None: 160 slimItem = bp.GetInvItem(ballID) 161 self.tacticalCompass.AddConnector(ball, self._ShouldShowVelocity(slimItem)) 162 else: 163 self._ClearInterest(ballID) 164 bp = ballpark.GetBallpark() 165 if bp is None: 166 return 167 slimItem = bp.GetInvItem(ballID) 168 filtered = self.tactical.GetFilteredStatesFunctionNames() 169 alwaysShown = self.tactical.GetAlwaysShownStatesFunctionNames() 170 if not self.tactical.WantIt(slimItem, filtered, alwaysShown): 171 self.RemoveConnector(ballID) 172 173 def CheckState(self, ballID, state, flag): 174 if not self.initialized or ballID == session.shipid: 175 return 176 if state == stateConst.selected and flag: 177 self._ShowDirectionTo(ballID) 178 self._CheckInterest(ballID, state, flag) 179 self._CheckAggression(ballID, state, flag) 180 181 def _CheckAggressionStates(self, ball): 182 checkStates = self._GetMatchingStates(ball.id, self._aggressorStates) 183 for state in checkStates: 184 self._CheckAggression(ball.id, state, True) 185 186 def _CheckAggression(self, ballID, state, flag): 187 if state not in self._aggressorStates: 188 return 189 if not self.initialized: 190 return 191 aggressionStates = self._ballAggressive.get(ballID, []) 192 if flag: 193 if state not in aggressionStates: 194 aggressionStates.append(state) 195 elif state in aggressionStates: 196 aggressionStates.remove(state) 197 self.tacticalCompass.SetAggressive(ballID, len(aggressionStates) > 0) 198 self._ballAggressive[ballID] = aggressionStates 199 200 def _GetMatchingStates(self, itemID, states): 201 active = sm.GetService('stateSvc').GetStates(itemID, states) 202 return [ x[1] for x in zip(active, states) if x[0] ] 203 204 def InitConnectors(self): 205 ballpark = sm.GetService('michelle').GetBallpark() 206 if ballpark is None: 207 return 208 self.tacticalCompass.ClearConnectors() 209 filtered = self.tactical.GetFilteredStatesFunctionNames() 210 alwaysShown = self.tactical.GetAlwaysShownStatesFunctionNames() 211 for itemID, ball in ballpark.balls.items(): 212 if itemID < 0 or itemID == session.shipid: 213 continue 214 if ballpark is None: 215 break 216 slimItem = ballpark.GetInvItem(itemID) 217 if slimItem and self.tactical.WantIt(slimItem, filtered, alwaysShown): 218 self.tacticalCompass.AddConnector(ball, self._ShouldShowVelocity(slimItem)) 219 checkStates = self._GetMatchingStates(itemID, self._interestStates) 220 checkStates.extend(self._GetMatchingStates(itemID, self._aggressorStates)) 221 for intrState in checkStates: 222 self.CheckState(itemID, intrState, True) 223 224 for ball in self.navBalls: 225 self.tacticalCompass.AddConnector(ball, False) 226 227 def _ClearSelection(self): 228 if self.selectedConnector is not None: 229 self.selectedConnector.Destroy() 230 self.selectedConnector = None 231 self.tacticalCompass.SetInterest(None) 232 self.selectedID = None 233 234 def _ShowDirectionTo(self, ballID): 235 if self.selectedID == ballID: 236 return 237 self._ClearSelection() 238 targetBall = ballpark.GetBall(ballID) 239 if targetBall is None: 240 return 241 self.tacticalCompass.SetInterest(targetBall) 242 self.selectedConnector = tacticalUI.CreateStraightConnector(tacticalUI.STYLE_FAINT, tacticalUI.COLOR_GENERIC, None, targetBall) 243 self.selectedID = ballID 244 245 def OnShipChange(self): 246 if not self.initialized: 247 return 248 ball = ballpark.GetBall(session.shipid) 249 self.tacticalCompass.SetRootBall(ball) 250 251 def UpdateTargetingRange(self): 252 253 def _inner(): 254 while self.initialized: 255 if not session.shipid: 256 if self.tacticalCompass is not None: 257 self.tacticalCompass.compassDisc.HideFiringRange() 258 else: 259 ship = sm.GetService('godma').GetItem(session.shipid) 260 if self.tacticalCompass is not None: 261 self.tacticalCompass.SetTargetingRange(ship.maxTargetRange, not self.showingModuleRange) 262 self.actionDisplay.SetMaxMoveRange(self.tacticalCompass.GetMaxRange()) 263 blue.synchro.SleepSim(1000) 264 265 uthread2.StartTasklet(_inner) 266 267 def UpdateModuleRange(self, module = None, charge = None): 268 if not self.initialized or self.tacticalCompass is None: 269 return 270 self.showingModuleRange = module is not None 271 self.tacticalCompass.HideBombRange() 272 if module is None: 273 self.tacticalCompass.compassDisc.HideFiringRange() 274 return 275 maxRange, falloff, bombRadius, cynoRadius = self.tactical.FindMaxRange(module, charge) 276 if bombRadius: 277 self.tacticalCompass.compassDisc.HideFiringRange() 278 ball = ballpark.GetBall(session.shipid) 279 self.tacticalCompass.ShowBombRange(bombRadius, maxRange, ball) 280 elif cynoRadius: 281 self.tacticalCompass.compassDisc.HideFiringRange() 282 radius = getattr(ballpark.GetBall(session.shipid), 'radius', 0.0) 283 self.tacticalCompass.ShowCynoRange(cynoRadius + radius) 284 else: 285 self.tacticalCompass.SetFiringRange(maxRange, falloff)