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

state.py (78869B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\state.py
      2 from collections import namedtuple
      3 import utillib
      4 from carbon.common.script.sys.service import Service
      5 from carbon.common.script.util import timerstuff
      6 from carbonui.util import colorblind
      7 from carbonui.util.color import Color
      8 from eve.client.script.parklife.stateSetting import GetOrderConfigName, GetStateConfigName
      9 from eve.common.lib import appConst
     10 import overviewPresets.overviewSettingsConst as osConst
     11 import eve.client.script.ui.inflight.overview.overviewConst as oConst
     12 from eve.client.script.ui.inflight.overviewShipLabelObject import ShipLabel
     13 from eve.common.script.mgt import buffBarConst
     14 import inventorycommon.const as invConst
     15 from eve.common.script.sys import eveCfg, idCheckers
     16 from eve.common.script.sys.idCheckers import IsNPCCorporation
     17 from fwwarzone.client.facwarUtil import IsMyFwFaction, IsMyCombatEnemyFaction
     18 from localization import GetByLabel
     19 from eve.client.script.parklife import states as state
     20 import log
     21 import telemetry
     22 from eve.client.script.ui.crimewatch import crimewatchConst
     23 from evewar import warConst
     24 CRIMINAL_RED = crimewatchConst.Colors.Criminal.GetRGBA()
     25 SUSPECT_YELLOW = crimewatchConst.Colors.Suspect.GetRGBA()
     26 DISAPPROVAL_COLOR = crimewatchConst.Colors.Disapproval.GetRGBA()
     27 TURQUOISE = (0.0,
     28  0.63,
     29  0.57,
     30  1.0)
     31 DRONES_AND_FIGHTERS = (invConst.categoryDrone, invConst.categoryFighter)
     32 CATEGORIES_WITH_WARFACTIONID = DRONES_AND_FIGHTERS + (appConst.categoryStructure,)
     33 NORELATIONSHIP_SENTINEL = "Just a string which will be used as a sentinel value.  We use 'is' to compare it so it doesn't matter that it's hella long."
     34 
     35 def GetStateColors():
     36     STATE_COLORS = {'purple': ((0.6, 0.15, 0.9, 1.0), 'UI/Common/Colors/Purple'),
     37      'green': ((0.1, 0.6, 0.1, 1.0), 'UI/Common/Colors/Green'),
     38      'red': ((0.75, 0.0, 0.0, 1.0), 'UI/Common/Colors/Red'),
     39      'darkBlue': ((0.0, 0.15, 0.6, 1.0), 'UI/Common/Colors/DarkBlue'),
     40      'blue': ((0.2, 0.5, 1.0, 1.0), 'UI/Common/Colors/Blue'),
     41      'darkTurquoise': ((0.0, 0.34, 0.33, 1.0), 'UI/Common/Colors/DarkTurquoise'),
     42      'turquoise': (TURQUOISE, 'UI/Common/Colors/Turquoise'),
     43      'orange': ((1.0, 0.35, 0.0, 1.0), 'UI/Common/Colors/Orange'),
     44      'yellow': ((1.0, 0.7, 0.0, 1.0), 'UI/Common/Colors/Yellow'),
     45      'indigo': ((0.3, 0.0, 0.5, 1.0), 'UI/Common/Colors/Indigo')}
     46     if colorblind.IsReplacementEnabled():
     47         numColors = len(STATE_COLORS)
     48         STATE_COLORS = {name:(colorblind.GetEvenlyDistributedColor(color, i, numColors), label) for i, (name, (color, label)) in enumerate(STATE_COLORS.iteritems())}
     49     STATE_COLORS.update({'black': ((0.0, 0.0, 0.0, 1.0), 'UI/Common/Colors/Black'),
     50      'white': ((0.7, 0.7, 0.7, 1.0), 'UI/Common/Colors/White')})
     51     return STATE_COLORS
     52 
     53 
     54 StateProperty = namedtuple('StateProperty', 'text label defaultColor hint iconIndex iconColor defaultBackgroundColor ownerText')
     55 colorToNameMap = {color[0]:colorKey for colorKey, color in GetStateColors().iteritems()}
     56 
     57 def FindColorName(colorValue):
     58     return colorToNameMap.get(colorValue, None)
     59 
     60 
     61 def IsHighStanding(relationship):
     62     return relationship > appConst.contactGoodStanding
     63 
     64 
     65 def IsGoodStanding(relationship):
     66     return appConst.contactGoodStanding >= relationship > appConst.contactNeutralStanding
     67 
     68 
     69 def IsNeutralStanding(relationship):
     70     return relationship == appConst.contactNeutralStanding
     71 
     72 
     73 def IsBadStanding(relationship):
     74     return appConst.contactBadStanding <= relationship < appConst.contactNeutralStanding
     75 
     76 
     77 def IsHorribleStanding(relationship):
     78     return relationship < appConst.contactBadStanding
     79 
     80 
     81 def GetStateSvc():
     82     return sm.GetService('stateSvc')
     83 
     84 
     85 class StateSvc(Service):
     86     __guid__ = 'svc.stateSvc'
     87     __exportedcalls__ = {'GetExclState': [],
     88      'GetStates': [],
     89      'SetState': [],
     90      'RemoveWarOwners': []}
     91     __notifyevents__ = ['DoBallClear',
     92      'DoBallRemove',
     93      'OnSessionChanged',
     94      'DoBallsRemove']
     95     __update_on_reload__ = 0
     96     __startupdependencies__ = ['settings']
     97     __dependencies__ = ['bountySvc']
     98 
     99     def Run(self, *etc):
    100         Service.Run(self, *etc)
    101         self.logme = 0
    102         self.exclusive = [state.mouseOver,
    103          state.selected,
    104          state.activeTarget,
    105          state.lookingAt]
    106         self.exclusives = {}
    107         self.states = {}
    108         self.stateColors = {}
    109         self.stateBlinks = {}
    110         self.atWar = {}
    111         self.alliesAtWar = {}
    112         self.cachedStateSettings = {}
    113         self.stateColorsInited = 0
    114         self.props = None
    115         self.smartFilterProps = None
    116         self.defaultBackgroundOrder = [state.flagAtWarCanFight,
    117          state.flagAtWarMilitia,
    118          state.flagLimitedEngagement,
    119          state.flagSameFleet,
    120          state.flagSamePlayerCorp,
    121          state.flagSameAlliance,
    122          state.flagStandingHigh,
    123          state.flagStandingGood,
    124          state.flagSameMilitia,
    125          state.flagOutlaw,
    126          state.flagCriminal,
    127          state.flagSuspect,
    128          state.flagDisapproval,
    129          state.flagStandingHorrible,
    130          state.flagStandingBad,
    131          state.flagAlliesAtWar,
    132          state.flagDangerous,
    133          state.flagHasKillRight,
    134          state.flagSameNpcCorp,
    135          state.flagStandingNeutral,
    136          state.flagNoStanding,
    137          state.flagAgentInteractable,
    138          state.flagIsWanted]
    139         self.defaultBackgroundStates = [state.flagCriminal,
    140          state.flagSuspect,
    141          state.flagOutlaw,
    142          state.flagSameFleet,
    143          state.flagSamePlayerCorp,
    144          state.flagSameNpcCorp,
    145          state.flagSameAlliance,
    146          state.flagAtWarCanFight,
    147          state.flagAtWarMilitia,
    148          state.flagSameMilitia,
    149          state.flagLimitedEngagement]
    150         self.defaultFlagOrder = [state.flagAtWarCanFight,
    151          state.flagAtWarMilitia,
    152          state.flagLimitedEngagement,
    153          state.flagSameFleet,
    154          state.flagSamePlayerCorp,
    155          state.flagSameAlliance,
    156          state.flagStandingHigh,
    157          state.flagStandingGood,
    158          state.flagSameMilitia,
    159          state.flagOutlaw,
    160          state.flagCriminal,
    161          state.flagSuspect,
    162          state.flagDisapproval,
    163          state.flagStandingHorrible,
    164          state.flagStandingBad,
    165          state.flagAlliesAtWar,
    166          state.flagDangerous,
    167          state.flagHasKillRight,
    168          state.flagSameNpcCorp,
    169          state.flagStandingNeutral,
    170          state.flagNoStanding,
    171          state.flagAgentInteractable,
    172          state.flagIsWanted]
    173         self.defaultFlagStates = [state.flagSameFleet,
    174          state.flagSamePlayerCorp,
    175          state.flagSameNpcCorp,
    176          state.flagSameAlliance,
    177          state.flagAtWarCanFight,
    178          state.flagSameMilitia,
    179          state.flagAtWarMilitia,
    180          state.flagStandingHigh,
    181          state.flagStandingGood,
    182          state.flagStandingBad,
    183          state.flagStandingHorrible,
    184          state.flagCriminal,
    185          state.flagSuspect,
    186          state.flagDisapproval,
    187          state.flagOutlaw,
    188          state.flagAgentInteractable,
    189          state.flagStandingNeutral,
    190          state.flagAlliesAtWar,
    191          state.flagLimitedEngagement,
    192          state.flagDangerous,
    193          state.flagHasKillRight]
    194         self.defaultBlinkStates = {('flag', state.flagSuspect): True,
    195          ('flag', state.flagCriminal): True,
    196          ('flag', state.flagLimitedEngagement): True,
    197          ('flag', state.flagDisapproval): True,
    198          ('background', state.flagAtWarCanFight): True,
    199          ('background', state.flagAtWarMilitia): True}
    200         self.ewarStates = {buffBarConst.Slot_WarpScramblerMWD: (state.flagWarpScrambledMWD, appConst.iconModuleWarpScramblerMWD),
    201          buffBarConst.Slot_WarpScrambler: (state.flagWarpScrambled, appConst.iconModuleWarpScrambler),
    202          buffBarConst.Slot_FighterTackle: (state.flagWarpScrambled, appConst.iconModuleFighterTackle),
    203          buffBarConst.Slot_FocusedWarpScrambler: (state.flagWarpScrambledMWD, appConst.iconModuleFocusedWarpScrambler),
    204          buffBarConst.Slot_Webify: (state.flagWebified, appConst.iconModuleStasisWeb),
    205          buffBarConst.Slot_Electronic: (state.flagECMd, appConst.iconModuleECM),
    206          buffBarConst.Slot_EwRemoteSensorDamp: (state.flagSensorDampened, appConst.iconModuleSensorDamper),
    207          buffBarConst.Slot_EwTrackingDisrupt: (state.flagTrackingDisrupted, appConst.iconModuleTrackingDisruptor),
    208          buffBarConst.Slot_EwGuidanceDisrupt: (state.flagGuidanceDisrupted, appConst.iconModuleGuidanceDisruptor),
    209          buffBarConst.Slot_EwTargetPaint: (state.flagTargetPainted, appConst.iconModuleTargetPainter),
    210          buffBarConst.Slot_EwEnergyVampire: (state.flagEnergyLeeched, appConst.iconModuleNosferatu),
    211          buffBarConst.Slot_EwEnergyNeut: (state.flagEnergyNeut, appConst.iconModuleEnergyNeutralizer),
    212          buffBarConst.Slot_RemoteTracking: (state.flagRemoteTracking, appConst.iconModuleRemoteTracking),
    213          buffBarConst.Slot_EnergyTransfer: (state.flagEnergyTransfer, appConst.iconModuleEnergyTransfer),
    214          buffBarConst.Slot_SensorBooster: (state.flagSensorBooster, appConst.iconModuleSensorBooster),
    215          buffBarConst.Slot_EccmProjector: (state.flagECCMProjector, appConst.iconModuleECCMProjector),
    216          buffBarConst.Slot_RemoteHullRepair: (state.flagRemoteHullRepair, appConst.iconModuleHullRepairer),
    217          buffBarConst.Slot_RemoteArmorRepair: (state.flagRemoteArmorRepair, appConst.iconModuleArmorRepairer),
    218          buffBarConst.Slot_RemoteArmorMutadaptiveRepairer: (state.flagRemoteArmorRepair, appConst.iconModuleMutadaptiveArmorRepairer),
    219          buffBarConst.Slot_ShieldTransfer: (state.flagShieldTransfer, appConst.iconModuleShieldBooster)}
    220         self.ewarStateItems = self.ewarStates.items()
    221         self.shouldLogError = True
    222         self.InitFilter()
    223 
    224     def OnSessionChanged(self, isRemote, session, change):
    225         if 'corpid' in change or 'allianceid' in change:
    226             self.atWar = {}
    227             self.alliesAtWar = {}
    228 
    229     def RemoveWarOwners(self, ownerIDs):
    230         if not self.atWar:
    231             return
    232         for ownerID in ownerIDs:
    233             if ownerID in self.atWar:
    234                 del self.atWar[ownerID]
    235             if ownerID in self.alliesAtWar:
    236                 del self.alliesAtWar[ownerID]
    237 
    238     def GetProps(self):
    239         if self.props is None:
    240             criminalLabelAndHint = (GetByLabel('UI/Services/State/Standing/Criminal'), GetByLabel('UI/Services/State/Standing/CriminalHint'))
    241             suspectLabelAndHint = (GetByLabel('UI/Services/State/Standing/Suspect'), GetByLabel('UI/Services/State/Standing/SuspectHint'))
    242             outlawLabelAndHint = (GetByLabel('UI/Services/State/Standing/Outlaw'), GetByLabel('UI/Services/State/Standing/OutlawHint'))
    243             dangerousLabelAndHint = (GetByLabel('UI/Services/State/Standing/Dangerous'), GetByLabel('UI/Services/State/Standing/DangerousHint'))
    244             sameFleetLabelAndHint = (GetByLabel('UI/Services/State/Standing/SameFleet'), GetByLabel('UI/Services/State/Standing/SameFleetHint'))
    245             sameCorpLabelAndHint = (GetByLabel('UI/Services/State/Standing/SameCorporation'), GetByLabel('UI/Services/State/Standing/SameCorporationHint'), GetByLabel('UI/Services/State/Standing/SameCorporationOwner'))
    246             sameNpcCorpLabelAndHint = (GetByLabel('UI/Services/State/Standing/SameNpcCorporation'), GetByLabel('UI/Services/State/Standing/SameNpcCorporationHint'), GetByLabel('UI/Services/State/Standing/SameNpcCorporationOwner'))
    247             sameAllianceLabelAndHint = (GetByLabel('UI/Services/State/Standing/SameAlliance'), GetByLabel('UI/Services/State/Standing/SameAllianceHint'), GetByLabel('UI/Services/State/Standing/SameAllianceOwner'))
    248             sameMilitiaLabelAndHint = (GetByLabel('UI/Services/State/Standing/SameMilitia'), GetByLabel('UI/Services/State/Standing/SameMilitiaHint'), GetByLabel('UI/Services/State/Standing/SameMilitiaOwner'))
    249             atWarWithCorpLabelAndHint = (GetByLabel('UI/Services/State/Standing/AtWarWithCorporationOrAlliance'), GetByLabel('UI/Services/State/Standing/AtWarWithCorporationOrAllianceHint'), GetByLabel('UI/Services/State/Standing/AtWarWithCorporationOrAllianceOwner'))
    250             atWarWithMilitiaLabelAndHint = (GetByLabel('UI/Services/State/Standing/AtWarWithMilitia'), GetByLabel('UI/Services/State/Standing/AtWarWithMilitiaHint'), GetByLabel('UI/Services/State/Standing/AtWarWithMilitiaOwner'))
    251             excellentLabelAndHint = (GetByLabel('UI/Services/State/Standing/Excellent'), GetByLabel('UI/Services/State/Standing/ExcellentHint'), GetByLabel('UI/Services/State/Standing/ExcellentOwner'))
    252             goodLabelAndHint = (GetByLabel('UI/Services/State/Standing/Good'), GetByLabel('UI/Services/State/Standing/GoodHint'), GetByLabel('UI/Services/State/Standing/GoodOwner'))
    253             neutralLabelAndHint = (GetByLabel('UI/Services/State/Standing/Neutral'), GetByLabel('UI/Services/State/Standing/NeutralHint'), GetByLabel('UI/Services/State/Standing/NeutralOwner'))
    254             badLabelAndHint = (GetByLabel('UI/Services/State/Standing/Bad'), GetByLabel('UI/Services/State/Standing/BadHint'), GetByLabel('UI/Services/State/Standing/BadOwner'))
    255             terribleLabelAndHint = (GetByLabel('UI/Services/State/Standing/Terrible'), GetByLabel('UI/Services/State/Standing/TerribleHint'), GetByLabel('UI/Services/State/Standing/TerribleOwner'))
    256             isWantedLabelAndHint = (GetByLabel('UI/Services/State/Standing/IsWanted'), GetByLabel('UI/Services/State/Standing/IsWantedHint'))
    257             hasKillRightLabelAndHint = (GetByLabel('UI/Services/State/Standing/HasKillRight'), GetByLabel('UI/Services/State/Standing/HasKillRightHint'))
    258             agentInteractableLabelAndHint = (GetByLabel('UI/Services/State/Standing/AgentIsInteractable'), GetByLabel('UI/Services/State/Standing/AgentIsInteractableHint'))
    259             wreckIsViewedLabelAndHint = (GetByLabel('UI/Services/State/Standing/WreckIsViewed'), GetByLabel('UI/Services/State/Standing/WreckIsViewedHint'))
    260             wreckIsEmptyLabelAndHint = (GetByLabel('UI/Services/State/Standing/WreckIsEmpty'), GetByLabel('UI/Services/State/Standing/WreckIsEmptyHint'))
    261             noStandingLabelAndHint = (GetByLabel('UI/Services/State/Standing/NoStanding'), GetByLabel('UI/Services/State/Standing/NoStandingHint'), GetByLabel('UI/Services/State/Standing/NoStandingOwner'))
    262             alliesAtWar = (GetByLabel('UI/Services/State/Standing/AlliesAtWar'), GetByLabel('UI/Services/State/Standing/AlliesAtWarHint'), GetByLabel('UI/Services/State/Standing/AlliesAtWarOwner'))
    263             limitedEngagementLabelAndHint = (GetByLabel('UI/Services/State/Standing/LimitedEngagement'), GetByLabel('UI/Services/State/Standing/LimitedEngagementHint'))
    264             disapprovalLabelAndHint = (GetByLabel('UI/Services/State/Standing/Disapproval'), GetByLabel('UI/Services/State/Standing/DisapprovalHint'))
    265             self.props = {state.flagCriminal: StateProperty(criminalLabelAndHint[0], 'Criminal', 'black', criminalLabelAndHint[1], 5, CRIMINAL_RED, 'red', None),
    266              state.flagSuspect: StateProperty(suspectLabelAndHint[0], 'Suspect', 'black', suspectLabelAndHint[1], 5, SUSPECT_YELLOW, 'yellow', None),
    267              state.flagOutlaw: StateProperty(outlawLabelAndHint[0], 'Outlaw', 'red', outlawLabelAndHint[1], 5, Color.WHITE, None, None),
    268              state.flagDangerous: StateProperty(dangerousLabelAndHint[0], 'Dangerous', 'yellow', dangerousLabelAndHint[1], 5, Color.WHITE, None, None),
    269              state.flagSameFleet: StateProperty(sameFleetLabelAndHint[0], 'SameFleet', 'purple', sameFleetLabelAndHint[1], 0, Color.WHITE, None, None),
    270              state.flagSamePlayerCorp: StateProperty(sameCorpLabelAndHint[0], 'SamePlayerCorp', 'green', sameCorpLabelAndHint[1], 1, Color.WHITE, None, sameCorpLabelAndHint[2]),
    271              state.flagSameNpcCorp: StateProperty(sameNpcCorpLabelAndHint[0], 'SameNpcCorp', 'green', sameNpcCorpLabelAndHint[1], 1, Color.WHITE, None, sameNpcCorpLabelAndHint[2]),
    272              state.flagSameAlliance: StateProperty(sameAllianceLabelAndHint[0], 'SameAlliance', 'darkBlue', sameAllianceLabelAndHint[1], 1, Color.WHITE, None, sameAllianceLabelAndHint[2]),
    273              state.flagSameMilitia: StateProperty(sameMilitiaLabelAndHint[0], 'SameMilitia', 'indigo', sameMilitiaLabelAndHint[1], 1, Color.WHITE, None, sameMilitiaLabelAndHint[2]),
    274              state.flagAtWarCanFight: StateProperty(atWarWithCorpLabelAndHint[0], 'AtWarCanFight', 'red', atWarWithCorpLabelAndHint[1], 1, Color.WHITE, None, atWarWithCorpLabelAndHint[2]),
    275              state.flagAtWarMilitia: StateProperty(atWarWithMilitiaLabelAndHint[0], 'AtWarMilitia', 'orange', atWarWithMilitiaLabelAndHint[1], 1, Color.WHITE, None, atWarWithMilitiaLabelAndHint[2]),
    276              state.flagStandingHigh: StateProperty(excellentLabelAndHint[0], 'StandingHigh', 'darkBlue', excellentLabelAndHint[1], 2, Color.WHITE, None, excellentLabelAndHint[2]),
    277              state.flagStandingGood: StateProperty(goodLabelAndHint[0], 'StandingGood', 'blue', goodLabelAndHint[1], 2, Color.WHITE, None, goodLabelAndHint[2]),
    278              state.flagStandingNeutral: StateProperty(neutralLabelAndHint[0], 'StandingNeutral', 'white', neutralLabelAndHint[1], 4, Color.WHITE, None, neutralLabelAndHint[2]),
    279              state.flagStandingBad: StateProperty(badLabelAndHint[0], 'StandingBad', 'orange', badLabelAndHint[1], 3, Color.WHITE, None, badLabelAndHint[2]),
    280              state.flagStandingHorrible: StateProperty(terribleLabelAndHint[0], 'StandingHorrible', 'red', terribleLabelAndHint[1], 3, Color.WHITE, None, terribleLabelAndHint[2]),
    281              state.flagIsWanted: StateProperty(isWantedLabelAndHint[0], 'IsWanted', 'black', isWantedLabelAndHint[1], 5, Color.WHITE, None, None),
    282              state.flagHasKillRight: StateProperty(hasKillRightLabelAndHint[0], 'HasKillRight', 'orange', hasKillRightLabelAndHint[1], 7, Color.WHITE, None, None),
    283              state.flagAgentInteractable: StateProperty(agentInteractableLabelAndHint[0], 'AgentInteractable', 'blue', agentInteractableLabelAndHint[1], 6, Color.WHITE, None, None),
    284              state.flagWreckAlreadyOpened: StateProperty(wreckIsViewedLabelAndHint[0], 'WreckViewed', 'white', wreckIsViewedLabelAndHint[1], 1, Color.WHITE, None, None),
    285              state.flagWreckEmpty: StateProperty(wreckIsEmptyLabelAndHint[0], 'WreckEmpty', 'white', wreckIsEmptyLabelAndHint[1], 1, Color.WHITE, None, None),
    286              state.flagNoStanding: StateProperty(noStandingLabelAndHint[0], 'NoStanding', 'white', noStandingLabelAndHint[1], 4, Color.WHITE, None, noStandingLabelAndHint[0]),
    287              state.flagAlliesAtWar: StateProperty(alliesAtWar[0], 'AlliesAtWar', 'darkBlue', alliesAtWar[1], 1, Color.WHITE, None, alliesAtWar[0]),
    288              state.flagLimitedEngagement: StateProperty(limitedEngagementLabelAndHint[0], 'LimitedEngagement', 'black', limitedEngagementLabelAndHint[1], 5, TURQUOISE, 'turquoise', None),
    289              state.flagDisapproval: StateProperty(disapprovalLabelAndHint[0], 'Disapproval', 'black', disapprovalLabelAndHint[1], 5, DISAPPROVAL_COLOR, None, None),
    290              state.flagForcedOn: StateProperty('', 'ForcedOn', 'white', '', 4, Color.WHITE, None, None)}
    291             self.defaultProp = StateProperty('', '', 'white', '', 6, Color.WHITE, None, '')
    292         return self.props
    293 
    294     def GetSmartFilterProps(self):
    295         if self.smartFilterProps is None:
    296             self.smartFilterProps = {state.flagWarpScrambledMWD: GetByLabel('UI/Services/State/InflightState/WarpScramblingMWD'),
    297              state.flagWarpScrambled: GetByLabel('UI/Services/State/InflightState/WarpScrambling'),
    298              state.flagWebified: GetByLabel('UI/Services/State/InflightState/Webified'),
    299              state.flagECMd: GetByLabel('UI/Services/State/InflightState/Jamming'),
    300              state.flagSensorDampened: GetByLabel('UI/Services/State/InflightState/SensorDamping'),
    301              state.flagTrackingDisrupted: GetByLabel('UI/Services/State/InflightState/TrackingDisrupting'),
    302              state.flagGuidanceDisrupted: GetByLabel('UI/Services/State/InflightState/GuidanceDisrupting'),
    303              state.flagTargetPainted: GetByLabel('UI/Services/State/InflightState/Painting'),
    304              state.flagEnergyLeeched: GetByLabel('UI/Services/State/InflightState/EnergyLeeched'),
    305              state.flagEnergyNeut: GetByLabel('UI/Services/State/InflightState/EnergyNeutralizing'),
    306              state.flagRemoteTracking: GetByLabel('UI/Services/State/InflightState/RemoteTracking'),
    307              state.flagEnergyTransfer: GetByLabel('UI/Services/State/InflightState/EnergyTransfer'),
    308              state.flagSensorBooster: GetByLabel('UI/Services/State/InflightState/SensorBooster'),
    309              state.flagECCMProjector: GetByLabel('UI/Services/State/InflightState/ECCMProjector'),
    310              state.flagRemoteHullRepair: GetByLabel('UI/Services/State/InflightState/RemoteHullRepair'),
    311              state.flagRemoteArmorRepair: GetByLabel('UI/Services/State/InflightState/RemoteArmorRepair'),
    312              state.flagShieldTransfer: GetByLabel('UI/Services/State/InflightState/ShieldTransfer')}
    313         return self.smartFilterProps
    314 
    315     @telemetry.ZONE_METHOD
    316     def GetStateProps(self, st = None):
    317         props = self.GetProps()
    318         if st is not None:
    319             if st in props:
    320                 return props[st]
    321             else:
    322                 if self.shouldLogError:
    323                     log.LogTraceback('Bad state flag: %s' % st)
    324                     self.shouldLogError = False
    325                 return self.defaultProp
    326         else:
    327             return props
    328 
    329     @telemetry.ZONE_METHOD
    330     def GetActiveStateOrder(self, where):
    331         cacheKey = 'ActiveStateOrder_' + where
    332         if cacheKey in self.cachedStateSettings:
    333             return self.cachedStateSettings[cacheKey]
    334         return self.cachedStateSettings.setdefault(cacheKey, [ flag for flag in self.GetStateOrder(where) if self.GetStateState(where, flag) ])
    335 
    336     @telemetry.ZONE_METHOD
    337     def GetActiveStateOrderFunctionNames(self, where):
    338         cacheKey = 'ActiveStateOrderFunctionNames_' + where
    339         if cacheKey in self.cachedStateSettings:
    340             return self.cachedStateSettings[cacheKey]
    341         return self.cachedStateSettings.setdefault(cacheKey, [ self.GetStateProps(flag).label for flag in self.GetActiveStateOrder(where) ])
    342 
    343     @telemetry.ZONE_METHOD
    344     def GetStateOrder(self, where):
    345         where = where.lower()
    346         if where == 'background':
    347             default = self.defaultBackgroundOrder
    348         else:
    349             default = self.defaultFlagOrder
    350         configName = GetOrderConfigName(where)
    351         ret = settings.user.overview.Get(configName, default)
    352         if ret is None:
    353             return default
    354         ret.extend([ flag for flag in default if flag not in ret ])
    355         return ret
    356 
    357     @telemetry.ZONE_METHOD
    358     def GetStateState(self, where, flag):
    359         return flag in self.GetStateStates(where)
    360 
    361     @telemetry.ZONE_METHOD
    362     def GetStateStates(self, where):
    363         where = where.lower()
    364         configName = GetStateConfigName(where)
    365         ret = settings.user.overview.Get(configName)
    366         if ret is None:
    367             if where == 'background':
    368                 ret = self.defaultBackgroundStates
    369             else:
    370                 ret = self.defaultFlagStates
    371         return ret
    372 
    373     @telemetry.ZONE_METHOD
    374     def GetStateColors(self):
    375         return GetStateColors()
    376 
    377     @telemetry.ZONE_METHOD
    378     def GetStateColor(self, flag, where = 'flag'):
    379         self.InitColors()
    380         color = self.stateColors.get((where, flag))
    381         if color:
    382             return color
    383         else:
    384             color = self._GetDefaultColor(flag, where)
    385             return color
    386 
    387     def _GetDefaultColor(self, flag, where):
    388         colors = self.GetStateColors()
    389         defColor = None
    390         if where == 'background':
    391             defColor = self.GetStateProps(flag).defaultBackgroundColor
    392         if defColor is None:
    393             defColor = self.GetStateProps(flag).defaultColor
    394         color = colors[defColor][0]
    395         return color
    396 
    397     def GetStateFlagColor(self, flagCode):
    398         return self.GetStateColor(flagCode, 'flag')
    399 
    400     def GetStateBackgroundColor(self, flagCode):
    401         return self.GetStateColor(flagCode, 'background')
    402 
    403     def GetStatePropsColorAndBlink(self, flagCode):
    404         if not flagCode:
    405             return None
    406         return utillib.KeyVal(flagCode=flagCode, flagProperties=self.GetStateProps(flagCode), flagColor=self.GetStateFlagColor(flagCode), flagBlink=self.GetStateFlagBlink(flagCode))
    407 
    408     @telemetry.ZONE_METHOD
    409     def GetStateBlink(self, where, flag):
    410         defBlink = self.defaultBlinkStates.get((where, flag), 0)
    411         return settings.user.overview.Get(osConst.SETTING_STATE_BLINKS, {}).get((where, flag), defBlink)
    412 
    413     def GetStateFlagBlink(self, flagCode):
    414         return self.GetStateBlink('flag', flagCode)
    415 
    416     def GetStateBackgroundBlink(self, flagCode):
    417         return self.GetStateBlink('background', flagCode)
    418 
    419     @telemetry.ZONE_METHOD
    420     def GetEwarGraphicID(self, ewarType):
    421         flag, gid = self.ewarStates[ewarType]
    422         return gid
    423 
    424     def GetEwarTypes(self):
    425         return self.ewarStateItems
    426 
    427     def GetEwarFlag(self, ewarType):
    428         flag, gid = self.ewarStates[ewarType]
    429         return flag
    430 
    431     def GetEwarTypeByEwarState(self, flag = None):
    432         if not getattr(self, 'ewartypebystate', {}):
    433             ret = {}
    434             for ewarType, (f, gid) in self.ewarStateItems:
    435                 ret[f] = ewarType
    436 
    437             self.ewartypebystate = ret
    438         if flag:
    439             return self.ewartypebystate[flag]
    440         return self.ewartypebystate
    441 
    442     def GetEwarHint(self, ewarType):
    443         flag, gid = self.ewarStates[ewarType]
    444         return self.GetSmartFilterProps()[flag]
    445 
    446     def GetFixedColorSettings(self):
    447         stateColors = settings.user.overview.Get(osConst.SETTING_STATE_COLORS, {})
    448         newStatesColors = {}
    449         for flag, color in stateColors.iteritems():
    450             if isinstance(flag, tuple):
    451                 newStatesColors[flag] = color
    452             else:
    453                 newStatesColors['flag', flag] = color
    454                 newStatesColors['background', flag] = color
    455 
    456         settings.user.overview.Set(osConst.SETTING_STATE_COLORS, newStatesColors)
    457         return newStatesColors
    458 
    459     def SetStateColor(self, where, flag, color):
    460         self.InitColors()
    461         self.stateColors[where, flag] = color
    462         settings.user.overview.Set(osConst.SETTING_STATE_COLORS, self.stateColors.copy())
    463         self.cachedStateSettings = {}
    464         self.NotifyOnStateSetupChange('stateColor')
    465 
    466     def SetStateBlink(self, where, flag, blink):
    467         stateBlinks = settings.user.overview.Get(osConst.SETTING_STATE_BLINKS, {})
    468         stateBlinks[where, flag] = blink
    469         settings.user.overview.Set(osConst.SETTING_STATE_BLINKS, stateBlinks)
    470         self.cachedStateSettings = {}
    471         self.NotifyOnStateSetupChange('stateBlink')
    472 
    473     def InitColors(self, reset = 0):
    474         if reset:
    475             self.cachedStateSettings = {}
    476         if not self.stateColorsInited or reset:
    477             self.stateColors = self.GetFixedColorSettings()
    478             self.stateColorsInited = 1
    479 
    480     def ResetColors(self):
    481         settings.user.overview.Set(osConst.SETTING_STATE_COLORS, {})
    482         self.cachedStateSettings = {}
    483         self.InitColors(reset=True)
    484         self.NotifyOnStateSetupChange('stateColor')
    485 
    486     def InitFilter(self):
    487         self.filterCategs = {invConst.categoryShip,
    488          invConst.categoryEntity,
    489          invConst.categoryDrone,
    490          invConst.categoryFighter}
    491         self.updateCategs = self.filterCategs.copy()
    492         self.filterGroups = {invConst.groupCargoContainer,
    493          invConst.groupSecureCargoContainer,
    494          invConst.groupStargate,
    495          invConst.groupWarpGate,
    496          invConst.groupAbyssalTraces,
    497          invConst.groupAgentsinSpace,
    498          invConst.groupCosmicSignature,
    499          invConst.groupHarvestableCloud,
    500          invConst.groupForceField,
    501          invConst.groupWreck}
    502         applyToStructures = sm.GetService('overviewPresetSvc').GetSettingValueOrDefaultFromName(osConst.SETTING_NAME_APPLY_STRUCTURE, True)
    503         applyToOtherObjects = sm.GetService('overviewPresetSvc').GetSettingValueOrDefaultFromName(osConst.SETTING_NAME_APPLY_OTHER_OBJ, False)
    504         if applyToOtherObjects:
    505             self.updateGroups = self.filterGroups.copy()
    506         else:
    507             self.updateGroups = set()
    508         if applyToStructures:
    509             self.updateCategs.add(invConst.categoryStarbase)
    510             self.updateCategs.add(invConst.categorySovereigntyStructure)
    511             self.updateCategs.add(invConst.categoryStructure)
    512         self.updateCategs.add(invConst.categoryStation)
    513         self.updateGroups.add(invConst.groupStargate)
    514         settings.user.ui.Set('linkedWeapons_groupsDict', {})
    515 
    516     def ChangeStateOrder(self, where, flag, idx):
    517         current = self.GetStateOrder(where)[:]
    518         while flag in current:
    519             current.remove(flag)
    520 
    521         if idx == -1:
    522             idx = len(current)
    523         current.insert(idx, flag)
    524         configName = GetOrderConfigName(where.lower())
    525         settings.user.overview.Set(configName, current)
    526         self.cachedStateSettings = {}
    527         self.NotifyOnStateSetupChange('flagOrder')
    528 
    529     def ChangeStateState(self, where, flag, true):
    530         current = self.GetStateStates(where)[:]
    531         while flag in current:
    532             current.remove(flag)
    533 
    534         if true:
    535             current.append(flag)
    536         configName = GetStateConfigName(where.lower())
    537         settings.user.overview.Set(configName, current)
    538         self.cachedStateSettings = {}
    539         self.NotifyOnStateSetupChange('flagState')
    540 
    541     def ChangeLabelOrder(self, oldidx, idx):
    542         labels = self.GetShipLabels()
    543         label = labels.pop(oldidx)
    544         if idx == -1:
    545             idx = len(labels)
    546         labels.insert(idx, label)
    547         settings.user.overview.Set(osConst.SETTINGS_SHIP_LABELS, labels)
    548         self.cachedStateSettings = {}
    549         sm.GetService('bracket').UpdateLabels()
    550         sm.ScatterEvent('OnOverviewLabelOrderChanged')
    551 
    552     def ChangeShipLabels(self, flag, isSelected):
    553         labels = self.GetShipLabels()
    554         flagType = flag[oConst.LABEL_TYPE]
    555         flag[oConst.LABEL_STATE] = isSelected
    556         for i in xrange(len(labels)):
    557             if labels[i][oConst.LABEL_TYPE] == flagType:
    558                 labels[i] = flag
    559                 break
    560 
    561         settings.user.overview.Set(osConst.SETTINGS_SHIP_LABELS, labels)
    562         self.cachedStateSettings = {}
    563         sm.GetService('bracket').UpdateLabels()
    564         sm.ScatterEvent('OnShipLabelsUpdated')
    565 
    566     def SetDefaultShipLabel(self, setting):
    567         hideCorpTickerDefault = sm.GetService('overviewPresetSvc').GetDefaultSettingValueFromName(osConst.SETTING_HIDE_CORP_TICKER, False)
    568         allLabels = self.GetAllShipLabels()
    569         defaults = {'default': (hideCorpTickerDefault, allLabels),
    570          'ally': (hideCorpTickerDefault, [ShipLabel(onState=1, preText=oConst.CHAR_NONE, labelType=oConst.LABEL_TYPE_PILOT, postText=oConst.CHAR_NONE).GetDict(),
    571                    ShipLabel(onState=1, preText=oConst.CHAR_SPACE + oConst.L_SQ_BRACKET, labelType=oConst.LABEL_TYPE_CORP, postText=oConst.CHAR_NONE).GetDict(),
    572                    ShipLabel(onState=1, preText=oConst.CHAR_COMMA, labelType=oConst.LABEL_TYPE_ALLIANCE, postText=oConst.CHAR_NONE).GetDict(),
    573                    ShipLabel(onState=1, preText=oConst.R_SQ_BRACKET, labelType=oConst.LABEL_TYPE_NONE, postText=oConst.CHAR_NONE).GetDict(),
    574                    ShipLabel(onState=0, preText=oConst.APOSTROPHE, labelType=oConst.LABEL_TYPE_SHIP_NAME, postText=oConst.APOSTROPHE).GetDict(),
    575                    ShipLabel(onState=0, preText=oConst.L_BRACKET, labelType=oConst.LABEL_TYPE_SHIP_TYPE, postText=oConst.R_BRACKET).GetDict()]),
    576          'corpally': (hideCorpTickerDefault, [ShipLabel(onState=1, preText=oConst.CHAR_SPACE + oConst.L_SQ_BRACKET, labelType=oConst.LABEL_TYPE_CORP, postText=oConst.R_SQ_BRACKET).GetDict(),
    577                        ShipLabel(onState=1, preText=oConst.CHAR_NONE, labelType=oConst.LABEL_TYPE_PILOT, postText=oConst.CHAR_NONE).GetDict(),
    578                        ShipLabel(onState=1, preText=oConst.CODE_LT, labelType=oConst.LABEL_TYPE_ALLIANCE, postText=oConst.CODE_GT).GetDict(),
    579                        ShipLabel(onState=0, preText=oConst.APOSTROPHE, labelType=oConst.LABEL_TYPE_SHIP_NAME, postText=oConst.APOSTROPHE).GetDict(),
    580                        ShipLabel(onState=0, preText=oConst.L_BRACKET, labelType=oConst.LABEL_TYPE_SHIP_TYPE, postText=oConst.R_BRACKET).GetDict(),
    581                        ShipLabel(onState=0, preText=oConst.L_SQ_BRACKET, labelType=oConst.LABEL_TYPE_NONE, postText=oConst.R_SQ_BRACKET).GetDict()])}
    582         settings.user.overview.Set(osConst.SETTING_HIDE_CORP_TICKER, defaults.get(setting, 'default')[0])
    583         self.shipLabels = defaults.get(setting, 'default')[1]
    584         settings.user.overview.Set(osConst.SETTINGS_SHIP_LABELS, self.shipLabels)
    585         self.cachedStateSettings = {}
    586         sm.GetService('bracket').UpdateLabels()
    587 
    588     def NotifyOnStateSetupChange(self, reason):
    589         self.notifyStateChangeTimer = timerstuff.AutoTimer(1000, self._NotifyOnStateSetupChange, reason)
    590 
    591     def _NotifyOnStateSetupChange(self, reason):
    592         self.notifyStateChangeTimer = None
    593         sm.ScatterEvent('OnStateSetupChange', reason)
    594 
    595     @telemetry.ZONE_METHOD
    596     def CheckIfUpdateItem(self, slimItem):
    597         return getattr(slimItem, 'categoryID', None) in self.updateCategs or getattr(slimItem, 'groupID', None) in self.updateGroups
    598 
    599     @telemetry.ZONE_METHOD
    600     def CheckIfFilterItem(self, slimItem):
    601         return getattr(slimItem, 'categoryID', None) in self.filterCategs or getattr(slimItem, 'groupID', None) in self.filterGroups
    602 
    603     @telemetry.ZONE_METHOD
    604     def GetStates(self, itemID, flags):
    605         ret = []
    606         for flag in flags:
    607             if flag in self.exclusive:
    608                 ret.append(itemID == self.exclusives.get(flag, 0))
    609                 continue
    610             ret.append(self.states.get(flag, {}).get(itemID, 0))
    611 
    612         return ret
    613 
    614     def GetState(self, itemID, flag):
    615         if flag not in self.states:
    616             return False
    617         else:
    618             return itemID in self.states[flag]
    619 
    620     def GetStatesForFlag(self, flag):
    621         return self.states.get(flag, {}).keys()
    622 
    623     @telemetry.ZONE_METHOD
    624     def GetExclState(self, flag):
    625         return self.exclusives.get(flag, None)
    626 
    627     @telemetry.ZONE_METHOD
    628     def DoExclusive(self, itemID, flag, true, *args):
    629         excl = self.exclusives.get(flag, None)
    630         if true:
    631             if excl and excl != itemID:
    632                 sm.ScatterEvent('OnStateChange', excl, flag, 0, *args)
    633             sm.ScatterEvent('OnStateChange', itemID, flag, 1, *args)
    634             self.exclusives[flag] = itemID
    635         else:
    636             sm.ScatterEvent('OnStateChange', itemID, flag, 0, *args)
    637             self.exclusives[flag] = None
    638 
    639     @telemetry.ZONE_METHOD
    640     def SetState(self, itemID, flag, value, *args):
    641         self.LogInfo('SetState', itemID, flag, value, *args)
    642         if flag in self.exclusive:
    643             self.DoExclusive(itemID, flag, value, *args)
    644             return
    645         states = self.states.get(flag, {})
    646         if value:
    647             states[itemID] = value
    648         elif itemID in states:
    649             del states[itemID]
    650         if states:
    651             self.states[flag] = states
    652         elif flag in self.states:
    653             del self.states[flag]
    654         self.LogInfo('Before OnStateChange', itemID, flag, value, *args)
    655         sm.ScatterEvent('OnStateChange', itemID, flag, value, *args)
    656 
    657     def ResetByFlag(self, flag):
    658         if flag not in self.states:
    659             return
    660         for itemID in self.states[flag].keys():
    661             sm.ScatterEvent('OnStateChange', itemID, flag, False)
    662 
    663         del self.states[flag]
    664 
    665     def DoBallClear(self, *etc):
    666         self.states = {}
    667 
    668     @telemetry.ZONE_METHOD
    669     def DoBallsRemove(self, pythonBalls, isRelease):
    670         for ball, slimItem, terminal in pythonBalls:
    671             self.DoBallRemove(ball, slimItem, terminal)
    672 
    673     def DoBallRemove(self, ball, slimItem, terminal):
    674         if ball is None:
    675             return
    676         if ball.id in self.exclusives.itervalues():
    677             for state in self.exclusive:
    678                 if self.GetExclState(state) == ball.id:
    679                     self.SetState(ball.id, state, 0)
    680 
    681         if ball.id == session.shipid:
    682             return
    683         for stateDict in self.states.values():
    684             if ball.id in stateDict:
    685                 del stateDict[ball.id]
    686 
    687     def GetAllShipLabels(self):
    688         return [ShipLabel(onState=1, preText=oConst.CHAR_NONE, labelType=oConst.LABEL_TYPE_SHIP_TYPE, postText=oConst.CHAR_SPACE).GetDict(),
    689          ShipLabel(onState=1, preText=oConst.CODE_LT, labelType=oConst.LABEL_TYPE_ALLIANCE, postText=oConst.CODE_GT).GetDict(),
    690          ShipLabel(onState=1, preText=oConst.L_SQ_BRACKET, labelType=oConst.LABEL_TYPE_CORP, postText=oConst.R_SQ_BRACKET).GetDict(),
    691          ShipLabel(onState=1, preText=oConst.CHAR_SPACE, labelType=oConst.LABEL_TYPE_PILOT, postText=oConst.CHAR_SPACE).GetDict(),
    692          ShipLabel(onState=0, preText=oConst.APOSTROPHE, labelType=oConst.LABEL_TYPE_SHIP_NAME, postText=oConst.APOSTROPHE).GetDict(),
    693          ShipLabel(onState=0, preText=oConst.L_SQ_BRACKET, labelType=None, postText=oConst.CHAR_NONE).GetDict()]
    694 
    695     def GetShipLabels(self):
    696         if not getattr(self, 'shipLabels', None):
    697             self.shipLabels = settings.user.overview.Get(osConst.SETTINGS_SHIP_LABELS, None) or self.GetAllShipLabels()
    698         return self.shipLabels
    699 
    700     @telemetry.ZONE_METHOD
    701     def GetIconAndBackgroundFlags(self, slimItem):
    702         if slimItem is None:
    703             return (0, 0)
    704         flag = self.CheckStates(slimItem, 'flag')
    705         background = self.CheckStates(slimItem, 'background')
    706         return (flag or 0, background or 0)
    707 
    708     @telemetry.ZONE_METHOD
    709     def CheckStates(self, slimItem, what):
    710         if slimItem is None:
    711             return
    712         if not (slimItem.ownerID in [None, invConst.ownerSystem] or idCheckers.IsNPC(slimItem.ownerID)):
    713             relationships = self._GetRelationship(slimItem)
    714         else:
    715             relationships = None
    716         for functionName in self.GetActiveStateOrderFunctionNames(what):
    717             fullFunctionName = 'Check' + functionName
    718             checkFunction = getattr(self, fullFunctionName, None)
    719             if checkFunction:
    720                 if checkFunction(slimItem, relationships):
    721                     return getattr(state, 'flag' + functionName, None)
    722 
    723     @telemetry.ZONE_METHOD
    724     def CheckFilteredFlagState(self, slimItem, excludedFlags = ()):
    725         if slimItem is None:
    726             return 0
    727         if not (slimItem.ownerID in [None, invConst.ownerSystem] or idCheckers.IsNPC(slimItem.ownerID)):
    728             relationships = self._GetRelationship(slimItem)
    729         else:
    730             relationships = None
    731         for flag in self.GetActiveStateOrder('flag'):
    732             if flag in excludedFlags:
    733                 continue
    734             flagName = self.GetStateProps(flag).label
    735             fullFunctionName = 'Check' + flagName
    736             checkFunction = getattr(self, fullFunctionName, None)
    737             if checkFunction:
    738                 if checkFunction(slimItem, relationships):
    739                     return getattr(state, 'flag' + flagName, 0)
    740 
    741         return 0
    742 
    743     @telemetry.ZONE_METHOD
    744     def _GetRelationship(self, item):
    745         allianceID = getattr(item, 'allianceID', None)
    746         ownerID = getattr(item, 'ownerID', None)
    747         corpID = getattr(item, 'corpID', None)
    748         return sm.GetService('addressbook').GetRelationship(ownerID, corpID, allianceID)
    749 
    750     @telemetry.ZONE_METHOD
    751     def IsStandingRelevant(self, slimItem):
    752         ownerID = slimItem.ownerID
    753         if ownerID is None or ownerID == invConst.ownerSystem or idCheckers.IsNPC(ownerID):
    754             return False
    755         return True
    756 
    757     @telemetry.ZONE_METHOD
    758     def CheckStandingHigh(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    759         if not self.IsStandingRelevant(slimItem):
    760             return False
    761         if relationships is NORELATIONSHIP_SENTINEL:
    762             relationships = self._GetRelationship(slimItem)
    763         if not relationships:
    764             return False
    765         if getattr(slimItem, 'categoryID', None) not in invConst.stateFilteredCategories:
    766             return False
    767         if self.IfAnyRelations(IsHighStanding, self.GetAllRelationshipGroups(relationships)):
    768             return True
    769         return False
    770 
    771     @telemetry.ZONE_METHOD
    772     def CheckStandingGood(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    773         if not self.IsStandingRelevant(slimItem):
    774             return False
    775         if relationships is NORELATIONSHIP_SENTINEL:
    776             relationships = self._GetRelationship(slimItem)
    777         if not relationships:
    778             return False
    779         if getattr(slimItem, 'categoryID', None) not in invConst.stateFilteredCategories:
    780             return False
    781         if self.IfAnyRelations(IsGoodStanding, self.GetAllRelationshipGroups(relationships)):
    782             return True
    783         return False
    784 
    785     @telemetry.ZONE_METHOD
    786     def CheckStandingNeutral(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    787         if not self.IsStandingRelevant(slimItem):
    788             return False
    789         if relationships is NORELATIONSHIP_SENTINEL:
    790             relationships = self._GetRelationship(slimItem)
    791         if not relationships:
    792             return False
    793         if getattr(slimItem, 'categoryID', None) not in invConst.stateFilteredCategories:
    794             return False
    795         if relationships.hasRelationship:
    796             if not self.IfAllRelations(IsNeutralStanding, self.GetAllRelationshipGroups(relationships)):
    797                 return False
    798             if not self.CheckSamePlayerCorp(slimItem) and not self.CheckSameNpcCorp(slimItem) and not self.CheckSameAlliance(slimItem):
    799                 return True
    800         return False
    801 
    802     @telemetry.ZONE_METHOD
    803     def CheckStandingBad(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    804         if not self.IsStandingRelevant(slimItem):
    805             return False
    806         if relationships is NORELATIONSHIP_SENTINEL:
    807             relationships = self._GetRelationship(slimItem)
    808         if not relationships:
    809             return False
    810         if getattr(slimItem, 'categoryID', None) not in invConst.stateFilteredCategories:
    811             return False
    812         if self.IfAnyRelations(IsBadStanding, self.GetAllRelationshipGroups(relationships)):
    813             return True
    814         return False
    815 
    816     @telemetry.ZONE_METHOD
    817     def CheckStandingHorrible(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    818         if not self.IsStandingRelevant(slimItem):
    819             return False
    820         if relationships is NORELATIONSHIP_SENTINEL:
    821             relationships = self._GetRelationship(slimItem)
    822         if not relationships:
    823             return False
    824         if getattr(slimItem, 'categoryID', None) not in invConst.stateFilteredCategories:
    825             return False
    826         if self.IfAnyRelations(IsHorribleStanding, self.GetAllRelationshipGroups(relationships)):
    827             return True
    828         return False
    829 
    830     def GetAllRelationshipGroups(self, relationships):
    831         ret = []
    832         ret.extend(self.GetAllianceRelationshipGroups(relationships))
    833         ret.extend(self.GetCorpRelationshipGroups(relationships))
    834         ret.extend(self.GetPersonalRelationshipGroups(relationships))
    835         return ret
    836 
    837     def GetAllianceRelationshipGroups(self, relationships):
    838         return (relationships.allianceToPers, relationships.allianceToCorp, relationships.allianceToAlliance)
    839 
    840     def GetCorpRelationshipGroups(self, relationships):
    841         return (relationships.corpToPers, relationships.corpToCorp, relationships.corpToAlliance)
    842 
    843     def GetPersonalRelationshipGroups(self, relationships):
    844         return (relationships.persToPers, relationships.persToCorp, relationships.persToAlliance)
    845 
    846     def IfAnyRelations(self, standingCheck, relationshipGroup):
    847         return any((standingCheck(relationship) for relationship in relationshipGroup))
    848 
    849     def IfAllRelations(self, standingCheck, relationshipGroup):
    850         return all((standingCheck(relationship) for relationship in relationshipGroup))
    851 
    852     @telemetry.ZONE_METHOD
    853     def CheckSamePlayerCorp(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    854         if self.logme:
    855             self.LogInfo('Tactical::CheckSamePlayerCorp', slimItem)
    856         return not IsNPCCorporation(session.corpid) and self._CheckInSameCorp(slimItem)
    857 
    858     @telemetry.ZONE_METHOD
    859     def CheckSameNpcCorp(self, slimItem, *args):
    860         if self.logme:
    861             self.LogInfo('Tactical::CheckSameNpcCorp', slimItem)
    862         return IsNPCCorporation(session.corpid) and self._CheckInSameCorp(slimItem)
    863 
    864     def _CheckInSameCorp(self, slimItem):
    865         return getattr(slimItem, 'corpID', None) == session.corpid and getattr(slimItem, 'categoryID', None) in invConst.stateFilteredCategories
    866 
    867     @telemetry.ZONE_METHOD
    868     def CheckSameAlliance(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    869         if self.logme:
    870             self.LogInfo('Tactical::CheckSameAlliance', slimItem)
    871         return session.allianceid and getattr(slimItem, 'allianceID', None) == session.allianceid and getattr(slimItem, 'categoryID', None) in invConst.stateFilteredCategories
    872 
    873     @telemetry.ZONE_METHOD
    874     def CheckSameFleet(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    875         if self.logme:
    876             self.LogInfo('Tactical::CheckSameFleet', slimItem)
    877         if session.fleetid:
    878             charID = self.GetCharIDForSlimItem(slimItem)
    879             if charID or getattr(slimItem, 'categoryID', None) in DRONES_AND_FIGHTERS:
    880                 if charID is None:
    881                     charID = slimItem.ownerID
    882                 return sm.GetService('fleet').IsMember(charID)
    883         return 0
    884 
    885     @telemetry.ZONE_METHOD
    886     def CheckSameMilitia(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    887         if self.logme:
    888             self.LogInfo('Tactical::CheckSameMilitia', slimItem)
    889         if session.warfactionid:
    890             if (getattr(slimItem, 'charID', None) or getattr(slimItem, 'categoryID', None) in CATEGORIES_WITH_WARFACTIONID) and getattr(slimItem, 'corpID', None):
    891                 slimItemWarFactionID = getattr(slimItem, 'warFactionID', None)
    892                 if slimItemWarFactionID is not None:
    893                     return IsMyFwFaction(slimItemWarFactionID)
    894         return 0
    895 
    896     @telemetry.ZONE_METHOD
    897     def CheckAgentInteractable(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    898         if self.logme:
    899             self.LogInfo('Tactical::CheckAgentInteractable', slimItem)
    900         return getattr(slimItem, 'groupID', None) == invConst.groupAgentsinSpace
    901 
    902     @telemetry.ZONE_METHOD
    903     def CheckIsWanted(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    904         if self.logme:
    905             self.LogInfo('Tactical::CheckIsWanted', slimItem)
    906         return self.bountySvc.QuickHasBounty(slimItem)
    907 
    908     @telemetry.ZONE_METHOD
    909     def CheckHasKillRight(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    910         if self.logme:
    911             self.LogInfo('Tactical::CheckIsWanted', slimItem)
    912         charID = self.GetCharIDForSlimItem(slimItem)
    913         if not charID:
    914             return False
    915         return self.bountySvc.QuickHasKillRight(slimItem)
    916 
    917     @telemetry.ZONE_METHOD
    918     def CheckAtWarCanFight(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    919         if self.logme:
    920             self.LogInfo('Tactical::CheckAtWarCanFight', slimItem)
    921         ownerId = getattr(slimItem, 'allianceID', None) or getattr(slimItem, 'corpID', None)
    922         if ownerId:
    923             if ownerId not in self.atWar:
    924                 self.atWar[ownerId] = sm.StartService('war').GetRelationship(ownerId)
    925             return self.atWar[ownerId] == warConst.warRelationshipAtWarCanFight
    926         else:
    927             return 0
    928 
    929     @telemetry.ZONE_METHOD
    930     def CheckAlliesAtWar(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    931         if self.logme:
    932             self.LogInfo('Tactical::CheckAlliesAtWar', slimItem)
    933         ownerID = getattr(slimItem, 'allianceID', None) or getattr(slimItem, 'corpID', None)
    934         if ownerID is not None:
    935             if ownerID not in self.alliesAtWar:
    936                 self.alliesAtWar[ownerID] = sm.GetService('war').GetRelationship(ownerID)
    937             return self.alliesAtWar[ownerID] == warConst.warRelationshipAlliesAtWar
    938         return 0
    939 
    940     @telemetry.ZONE_METHOD
    941     def CheckAtWarMilitia(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    942         if self.logme:
    943             self.LogInfo('Tactical::CheckAtWarMilitia', slimItem)
    944         if session.warfactionid and getattr(slimItem, 'warFactionID', None):
    945             warKey = (slimItem.warFactionID, session.warfactionid)
    946             if warKey not in self.atWar:
    947                 self.atWar[warKey] = IsMyCombatEnemyFaction(slimItem.warFactionID)
    948             return self.atWar[warKey] == True
    949         return 0
    950 
    951     @telemetry.ZONE_METHOD
    952     def CheckDangerous(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    953         if self.logme:
    954             self.LogInfo('Tactical::CheckDangerous', slimItem)
    955         if self.GetCharIDForSlimItem(slimItem) and -0.1 > (getattr(slimItem, 'securityStatus', None) or 0) >= appConst.outlawSecurityStatus:
    956             return 1
    957         return 0
    958 
    959     @telemetry.ZONE_METHOD
    960     def CheckOutlaw(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    961         if self.logme:
    962             self.LogInfo('Tactical::CheckOutlaw', slimItem)
    963         if self.GetCharIDForSlimItem(slimItem) and eveCfg.IsOutlawStatus(getattr(slimItem, 'securityStatus', None) or 0):
    964             return 1
    965         return 0
    966 
    967     @telemetry.ZONE_METHOD
    968     def CheckWreckEmpty(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    969         return getattr(slimItem, 'groupID', None) == invConst.groupWreck and slimItem.isEmpty
    970 
    971     @telemetry.ZONE_METHOD
    972     def CheckNoStanding(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    973         if relationships is NORELATIONSHIP_SENTINEL:
    974             relationships = self._GetRelationship(slimItem)
    975         return (not relationships or not relationships.hasRelationship) and idCheckers.IsCharacter(getattr(slimItem, 'ownerID', None)) and getattr(slimItem, 'categoryID', None) in invConst.stateFilteredCategories
    976 
    977     @telemetry.ZONE_METHOD
    978     def CheckWreckViewed(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    979         return sm.GetService('wreck').IsViewedWreck(slimItem.itemID)
    980 
    981     @telemetry.ZONE_METHOD
    982     def CheckCriminal(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    983         charID = self.GetCharIDForSlimItem(slimItem)
    984         if charID is not None:
    985             return sm.GetService('crimewatchSvc').IsCriminal(charID)
    986         return False
    987 
    988     @telemetry.ZONE_METHOD
    989     def CheckSuspect(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    990         charID = self.GetCharIDForSlimItem(slimItem)
    991         if charID is not None:
    992             return sm.GetService('crimewatchSvc').IsSuspect(charID)
    993         return False
    994 
    995     @telemetry.ZONE_METHOD
    996     def CheckDisapproval(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
    997         charID = self.GetCharIDForSlimItem(slimItem)
    998         if charID is not None:
    999             return sm.GetService('crimewatchSvc').IsDisapproved(charID)
   1000         return False
   1001 
   1002     def CheckLimitedEngagement(self, slimItem, relationships = NORELATIONSHIP_SENTINEL):
   1003         charID = self.GetCharIDForSlimItem(slimItem)
   1004         if charID is not None:
   1005             return sm.GetService('crimewatchSvc').HasLimitedEngagmentWith(charID)
   1006         return False
   1007 
   1008     def CheckMultiSelected(self, slimItem):
   1009         return slimItem.itemID in self.states[state.multiSelected]
   1010 
   1011     def GetCharIDForSlimItem(self, slimItem):
   1012         charID = getattr(slimItem, 'charID', None)
   1013         if charID and self.IsSlimItemStructure(slimItem):
   1014             return
   1015         return charID
   1016 
   1017     def IsSlimItemStructure(self, slimItem):
   1018         return getattr(slimItem, 'categoryID', None) == appConst.categoryStructure
   1019 
   1020 
   1021 def GetNPCGroups():
   1022     npcGroups = {GetByLabel('UI/Services/State/NonPlayerCharacter/Generic'): {GetByLabel('UI/Services/State/NonPlayerCharacter/Pirate'): [invConst.groupAsteroidAngelCartelBattleCruiser,
   1023                                                                                                                               invConst.groupAsteroidAngelCartelBattleship,
   1024                                                                                                                               invConst.groupAsteroidAngelCartelCruiser,
   1025                                                                                                                               invConst.groupAsteroidAngelCartelDestroyer,
   1026                                                                                                                               invConst.groupAsteroidAngelCartelFrigate,
   1027                                                                                                                               invConst.groupAsteroidAngelCartelHauler,
   1028                                                                                                                               invConst.groupAsteroidAngelCartelOfficer,
   1029                                                                                                                               invConst.groupAsteroidBloodRaidersBattleCruiser,
   1030                                                                                                                               invConst.groupAsteroidBloodRaidersBattleship,
   1031                                                                                                                               invConst.groupAsteroidBloodRaidersCruiser,
   1032                                                                                                                               invConst.groupAsteroidBloodRaidersDestroyer,
   1033                                                                                                                               invConst.groupAsteroidBloodRaidersFrigate,
   1034                                                                                                                               invConst.groupAsteroidBloodRaidersHauler,
   1035                                                                                                                               invConst.groupAsteroidBloodRaidersOfficer,
   1036                                                                                                                               invConst.groupAsteroidGuristasBattleCruiser,
   1037                                                                                                                               invConst.groupAsteroidGuristasBattleship,
   1038                                                                                                                               invConst.groupAsteroidGuristasCruiser,
   1039                                                                                                                               invConst.groupAsteroidGuristasDestroyer,
   1040                                                                                                                               invConst.groupAsteroidGuristasFrigate,
   1041                                                                                                                               invConst.groupAsteroidGuristasHauler,
   1042                                                                                                                               invConst.groupAsteroidGuristasOfficer,
   1043                                                                                                                               invConst.groupAsteroidSanshasNationBattleCruiser,
   1044                                                                                                                               invConst.groupAsteroidSanshasNationBattleship,
   1045                                                                                                                               invConst.groupAsteroidSanshasNationCruiser,
   1046                                                                                                                               invConst.groupAsteroidSanshasNationDestroyer,
   1047                                                                                                                               invConst.groupAsteroidSanshasNationFrigate,
   1048                                                                                                                               invConst.groupAsteroidSanshasNationHauler,
   1049                                                                                                                               invConst.groupAsteroidSanshasNationOfficer,
   1050                                                                                                                               invConst.groupAsteroidSerpentisBattleCruiser,
   1051                                                                                                                               invConst.groupAsteroidSerpentisBattleship,
   1052                                                                                                                               invConst.groupAsteroidSerpentisCruiser,
   1053                                                                                                                               invConst.groupAsteroidSerpentisDestroyer,
   1054                                                                                                                               invConst.groupAsteroidSerpentisFrigate,
   1055                                                                                                                               invConst.groupAsteroidSerpentisHauler,
   1056                                                                                                                               invConst.groupAsteroidSerpentisOfficer,
   1057                                                                                                                               invConst.groupDeadspaceAngelCartelBattleCruiser,
   1058                                                                                                                               invConst.groupDeadspaceAngelCartelBattleship,
   1059                                                                                                                               invConst.groupDeadspaceAngelCartelCruiser,
   1060                                                                                                                               invConst.groupDeadspaceAngelCartelDestroyer,
   1061                                                                                                                               invConst.groupDeadspaceAngelCartelFrigate,
   1062                                                                                                                               invConst.groupDeadspaceBloodRaidersBattleCruiser,
   1063                                                                                                                               invConst.groupDeadspaceBloodRaidersBattleship,
   1064                                                                                                                               invConst.groupDeadspaceBloodRaidersCruiser,
   1065                                                                                                                               invConst.groupDeadspaceBloodRaidersDestroyer,
   1066                                                                                                                               invConst.groupDeadspaceBloodRaidersFrigate,
   1067                                                                                                                               invConst.groupDeadspaceGuristasBattleCruiser,
   1068                                                                                                                               invConst.groupDeadspaceGuristasBattleship,
   1069                                                                                                                               invConst.groupDeadspaceGuristasCruiser,
   1070                                                                                                                               invConst.groupDeadspaceGuristasDestroyer,
   1071                                                                                                                               invConst.groupDeadspaceGuristasFrigate,
   1072                                                                                                                               invConst.groupDeadspaceSanshasNationBattleCruiser,
   1073                                                                                                                               invConst.groupDeadspaceSanshasNationBattleship,
   1074                                                                                                                               invConst.groupDeadspaceSanshasNationCruiser,
   1075                                                                                                                               invConst.groupDeadspaceSanshasNationDestroyer,
   1076                                                                                                                               invConst.groupDeadspaceSanshasNationFrigate,
   1077                                                                                                                               invConst.groupDeadspaceSerpentisBattleCruiser,
   1078                                                                                                                               invConst.groupDeadspaceSerpentisBattleship,
   1079                                                                                                                               invConst.groupDeadspaceSerpentisCruiser,
   1080                                                                                                                               invConst.groupDeadspaceSerpentisDestroyer,
   1081                                                                                                                               invConst.groupDeadspaceSerpentisFrigate,
   1082                                                                                                                               invConst.groupDeadspaceSleeperSleeplessPatroller,
   1083                                                                                                                               invConst.groupDeadspaceSleeperSleeplessSentinel,
   1084                                                                                                                               invConst.groupDeadspaceSleeperSleeplessDefender,
   1085                                                                                                                               invConst.groupDeadspaceSleeperAwakenedPatroller,
   1086                                                                                                                               invConst.groupDeadspaceSleeperAwakenedSentinel,
   1087                                                                                                                               invConst.groupDeadspaceSleeperAwakenedDefender,
   1088                                                                                                                               invConst.groupDeadspaceSleeperEmergentPatroller,
   1089                                                                                                                               invConst.groupDeadspaceSleeperEmergentSentinel,
   1090                                                                                                                               invConst.groupDeadspaceSleeperEmergentDefender,
   1091                                                                                                                               invConst.groupAsteroidAngelCartelCommanderBattleCruiser,
   1092                                                                                                                               invConst.groupAsteroidAngelCartelCommanderCruiser,
   1093                                                                                                                               invConst.groupAsteroidAngelCartelCommanderDestroyer,
   1094                                                                                                                               invConst.groupAsteroidAngelCartelCommanderFrigate,
   1095                                                                                                                               invConst.groupAsteroidBloodRaidersCommanderBattleCruiser,
   1096                                                                                                                               invConst.groupAsteroidBloodRaidersCommanderCruiser,
   1097                                                                                                                               invConst.groupAsteroidBloodRaidersCommanderDestroyer,
   1098                                                                                                                               invConst.groupAsteroidBloodRaidersCommanderFrigate,
   1099                                                                                                                               invConst.groupAsteroidGuristasCommanderBattleCruiser,
   1100                                                                                                                               invConst.groupAsteroidGuristasCommanderCruiser,
   1101                                                                                                                               invConst.groupAsteroidGuristasCommanderDestroyer,
   1102                                                                                                                               invConst.groupAsteroidGuristasCommanderFrigate,
   1103                                                                                                                               invConst.groupAsteroidRogueDroneBattleCruiser,
   1104                                                                                                                               invConst.groupAsteroidRogueDroneBattleship,
   1105                                                                                                                               invConst.groupAsteroidRogueDroneCruiser,
   1106                                                                                                                               invConst.groupAsteroidRogueDroneDestroyer,
   1107                                                                                                                               invConst.groupAsteroidRogueDroneFrigate,
   1108                                                                                                                               invConst.groupAsteroidRogueDroneHauler,
   1109                                                                                                                               invConst.groupAsteroidRogueDroneSwarm,
   1110                                                                                                                               invConst.groupAsteroidRogueDroneOfficer,
   1111                                                                                                                               invConst.groupAsteroidSanshasNationCommanderBattleCruiser,
   1112                                                                                                                               invConst.groupAsteroidSanshasNationCommanderCruiser,
   1113                                                                                                                               invConst.groupAsteroidSanshasNationCommanderDestroyer,
   1114                                                                                                                               invConst.groupAsteroidSanshasNationCommanderFrigate,
   1115                                                                                                                               invConst.groupAsteroidSerpentisCommanderBattleCruiser,
   1116                                                                                                                               invConst.groupAsteroidSerpentisCommanderCruiser,
   1117                                                                                                                               invConst.groupAsteroidSerpentisCommanderDestroyer,
   1118                                                                                                                               invConst.groupAsteroidSerpentisCommanderFrigate,
   1119                                                                                                                               invConst.groupDeadspaceRogueDroneBattleCruiser,
   1120                                                                                                                               invConst.groupDeadspaceRogueDroneBattleship,
   1121                                                                                                                               invConst.groupDeadspaceRogueDroneCruiser,
   1122                                                                                                                               invConst.groupDeadspaceRogueDroneDestroyer,
   1123                                                                                                                               invConst.groupDeadspaceRogueDroneFrigate,
   1124                                                                                                                               invConst.groupDeadspaceRogueDroneSwarm,
   1125                                                                                                                               invConst.groupDeadspaceOverseerFrigate,
   1126                                                                                                                               invConst.groupDeadspaceOverseerCruiser,
   1127                                                                                                                               invConst.groupDeadspaceOverseerBattleship,
   1128                                                                                                                               invConst.groupAsteroidRogueDroneCommanderFrigate,
   1129                                                                                                                               invConst.groupAsteroidRogueDroneCommanderDestroyer,
   1130                                                                                                                               invConst.groupAsteroidRogueDroneCommanderCruiser,
   1131                                                                                                                               invConst.groupAsteroidRogueDroneCommanderBattleCruiser,
   1132                                                                                                                               invConst.groupAsteroidRogueDroneCommanderBattleship,
   1133                                                                                                                               invConst.groupAsteroidAngelCartelCommanderBattleship,
   1134                                                                                                                               invConst.groupAsteroidBloodRaidersCommanderBattleship,
   1135                                                                                                                               invConst.groupAsteroidGuristasCommanderBattleship,
   1136                                                                                                                               invConst.groupAsteroidSanshasNationCommanderBattleship,
   1137                                                                                                                               invConst.groupAsteroidSerpentisCommanderBattleship,
   1138                                                                                                                               invConst.groupMissionAmarrEmpireCarrier,
   1139                                                                                                                               invConst.groupMissionCaldariStateCarrier,
   1140                                                                                                                               invConst.groupMissionGallenteFederationCarrier,
   1141                                                                                                                               invConst.groupMissionMinmatarRepublicCarrier,
   1142                                                                                                                               invConst.groupMissionFighterDrone,
   1143                                                                                                                               invConst.groupMissionGenericFreighters,
   1144                                                                                                                               invConst.groupInvasionSanshaNationBattleship,
   1145                                                                                                                               invConst.groupInvasionSanshaNationCapital,
   1146                                                                                                                               invConst.groupInvasionSanshaNationCruiser,
   1147                                                                                                                               invConst.groupInvasionSanshaNationFrigate,
   1148                                                                                                                               invConst.groupInvasionSanshaNationIndustrial,
   1149                                                                                                                               invConst.groupGhostSitesAngelCartelCruiser,
   1150                                                                                                                               invConst.groupGhostSitesBloodRaidersCruiser,
   1151                                                                                                                               invConst.groupGhostSitesGuristasCruiser,
   1152                                                                                                                               invConst.groupGhostSitesSanshasCruiser,
   1153                                                                                                                               invConst.groupGhostSitesSerpentisCruiser,
   1154                                                                                                                               invConst.groupGhostSitesMordusLegion],
   1155                                                                   GetByLabel('UI/Services/State/NonPlayerCharacter/Mission'): [invConst.groupMissionDrone,
   1156                                                                                                                                invConst.groupStorylineBattleship,
   1157                                                                                                                                invConst.groupStorylineFrigate,
   1158                                                                                                                                invConst.groupStorylineCruiser,
   1159                                                                                                                                invConst.groupStorylineMissionBattleship,
   1160                                                                                                                                invConst.groupStorylineMissionFrigate,
   1161                                                                                                                                invConst.groupStorylineMissionCruiser,
   1162                                                                                                                                invConst.groupMissionGenericBattleships,
   1163                                                                                                                                invConst.groupMissionGenericCruisers,
   1164                                                                                                                                invConst.groupMissionGenericFrigates,
   1165                                                                                                                                invConst.groupMissionThukkerBattlecruiser,
   1166                                                                                                                                invConst.groupMissionThukkerBattleship,
   1167                                                                                                                                invConst.groupMissionThukkerCruiser,
   1168                                                                                                                                invConst.groupMissionThukkerDestroyer,
   1169                                                                                                                                invConst.groupMissionThukkerFrigate,
   1170                                                                                                                                invConst.groupMissionThukkerOther,
   1171                                                                                                                                invConst.groupMissionGenericBattleCruisers,
   1172                                                                                                                                invConst.groupMissionGenericDestroyers],
   1173                                                                   GetByLabel('UI/Services/State/NonPlayerCharacter/Police'): [invConst.groupPoliceDrone],
   1174                                                                   GetByLabel('UI/Services/State/NonPlayerCharacter/Concord'): [invConst.groupConcordDrone],
   1175                                                                   GetByLabel('UI/Services/State/NonPlayerCharacter/Customs'): [invConst.groupCustomsOfficial],
   1176                                                                   GetByLabel('UI/Services/State/NonPlayerCharacter/FactionNavy'): [invConst.groupFactionDrone]}}
   1177     return npcGroups