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

cosmeticFittingController.py (5569B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fitting\cosmeticFittingController.py
      2 from eve.client.script.ui.inflight.shipstance import ShipStanceButtonController
      3 import logging
      4 from eve.client.script.ui.shared.fitting.fittingController import IsSubsystemBeingLoaded
      5 from eve.client.script.ui.shared.skins.controller import GetSkinnedShipModel, GetMultiHullTypeIDList
      6 from shipcosmetics.common.const import CosmeticsType
      7 from cosmetics.common.cosmeticsConst import BACKGROUND_PATH_BY_TYPE, HINT_BY_TYPE
      8 from eve.client.script.ui.shared.fitting.cosmeticSlotController import CosmeticSlotController
      9 import inventorycommon.const as invConst
     10 from eve.common.lib import appConst as const
     11 import signals
     12 from eve.client.script.ui.shared.fitting.fittingUtil import GetTypeIDForController
     13 from localization import GetByLabel
     14 logger = logging.getLogger(__name__)
     15 
     16 class CosmeticFittingController(object):
     17     __notifyevents__ = ['ProcessActiveShipChanged', 'OnDogmaItemChange']
     18     SLOT_GROUP_LAYOUT_ARCS = {0: (-34, 80),
     19      1: (55, 20),
     20      2: (75, 60),
     21      3: (145, 80),
     22      4: (236, 70),
     23      5: (306, 10)}
     24     SLOT_GROUPS = {0: (CosmeticsType.NONE,
     25          CosmeticsType.NONE,
     26          CosmeticsType.NONE,
     27          CosmeticsType.NONE,
     28          CosmeticsType.NONE,
     29          CosmeticsType.NONE,
     30          CosmeticsType.NONE,
     31          CosmeticsType.NONE),
     32      1: (CosmeticsType.ALLIANCE_LOGO, CosmeticsType.CORPORATION_LOGO),
     33      2: (CosmeticsType.NONE,
     34          CosmeticsType.NONE,
     35          CosmeticsType.NONE,
     36          CosmeticsType.NONE,
     37          CosmeticsType.NONE,
     38          CosmeticsType.NONE),
     39      3: (CosmeticsType.NONE,
     40          CosmeticsType.NONE,
     41          CosmeticsType.NONE,
     42          CosmeticsType.NONE,
     43          CosmeticsType.NONE,
     44          CosmeticsType.NONE,
     45          CosmeticsType.NONE,
     46          CosmeticsType.NONE),
     47      4: (CosmeticsType.NONE,
     48          CosmeticsType.NONE,
     49          CosmeticsType.NONE,
     50          CosmeticsType.NONE,
     51          CosmeticsType.NONE,
     52          CosmeticsType.NONE,
     53          CosmeticsType.NONE),
     54      5: (CosmeticsType.SKIN,)}
     55 
     56     def __init__(self, itemID, typeID = None):
     57         super(CosmeticFittingController, self).__init__()
     58         sm.RegisterNotify(self)
     59         self._dogmaLocation = None
     60         self._skin = None
     61         self._slotControllers = {}
     62         self._itemID = itemID
     63         self._typeID = typeID or GetTypeIDForController(itemID)
     64         self.on_skin_material_changed = signals.Signal(signalName='on_skin_material_changed')
     65         self.on_new_itemID = signals.Signal(signalName='on_new_itemID')
     66         self.on_hardpoints_fitted = signals.Signal(signalName='on_hardpoints_fitted')
     67         self.on_subsystem_fitted = signals.Signal(signalName='on_subsystem_fitted')
     68 
     69     def Close(self):
     70         self.on_new_itemID.clear()
     71         self.on_skin_material_changed.clear()
     72         sm.UnregisterNotify(self)
     73 
     74     @property
     75     def itemID(self):
     76         return self._itemID
     77 
     78     @property
     79     def typeID(self):
     80         return self._typeID
     81 
     82     @property
     83     def dogmaLocation(self):
     84         if not self._dogmaLocation:
     85             self._dogmaLocation = sm.GetService('clientDogmaIM').GetDogmaLocation()
     86         return self._dogmaLocation
     87 
     88     @property
     89     def dogmaItem(self):
     90         return self.dogmaLocation.SafeGetDogmaItem(self.itemID)
     91 
     92     @property
     93     def scenePath(self):
     94         return 'res:/dx9/scene/fitting/fitting.red'
     95 
     96     @property
     97     def model(self):
     98         multiHullTypeIDList = GetMultiHullTypeIDList(self.typeID, self.itemID, self.dogmaLocation)
     99         return GetSkinnedShipModel(self._skin, self.typeID, multiHullTypeIDList)
    100 
    101     @property
    102     def texturePath(self):
    103         if not self._skin:
    104             return None
    105         return self._skin.iconTexturePath
    106 
    107     def SetDisplayedSkin(self, skin):
    108         if self._skin == skin:
    109             return
    110         self._skin = skin
    111         self.on_skin_material_changed()
    112 
    113     def GetStanceBtnControllerClass(self):
    114         return ShipStanceButtonController
    115 
    116     def IsSimulated(self):
    117         return False
    118 
    119     def GetSlotController(self, cosmeticsType):
    120         if cosmeticsType == CosmeticsType.NONE:
    121             return
    122         backgroundIconPath = BACKGROUND_PATH_BY_TYPE.get(cosmeticsType, '')
    123         hintPath = HINT_BY_TYPE.get(cosmeticsType, '')
    124         hint = GetByLabel(hintPath) if hintPath else ''
    125         return CosmeticSlotController(backgroundIconPath, hint)
    126 
    127     def ProcessActiveShipChanged(self, shipID, oldShipID):
    128         if not self.IsSimulated():
    129             self.UpdateItem(shipID)
    130 
    131     def UpdateItem(self, itemID, typeID = None):
    132         oldItemID = self._itemID
    133         oldTypeID = self._typeID
    134         self._itemID = itemID
    135         if typeID is None:
    136             typeID = GetTypeIDForController(itemID)
    137         self._typeID = typeID
    138         self.on_new_itemID(itemID, oldItemID, typeID, oldTypeID)
    139 
    140     def OnDogmaItemChange(self, item, change):
    141         locationOrFlagIsInChange = const.ixFlag in change or const.ixLocationID in change
    142         didStacksizeFlagOrLocationChange = const.ixStackSize in change or locationOrFlagIsInChange
    143         if not didStacksizeFlagOrLocationChange:
    144             return
    145         oldLocationID = change.get(const.ixLocationID, None)
    146         if self.itemID not in (oldLocationID, item.locationID):
    147             return
    148         if item.groupID in invConst.turretModuleGroups:
    149             self.on_hardpoints_fitted()
    150         if IsSubsystemBeingLoaded(change, item, self.itemID):
    151             self.on_subsystem_fitted(throttle=True)