LargeCollidableStructure.py (6312B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\spaceObject\LargeCollidableStructure.py 2 import evetypes 3 import uthread 4 from eve.client.script.environment.model.turretSet import TurretSet 5 from eve.client.script.environment.spaceObject.spaceObject import SpaceObject 6 from cosmetics.common.structures.fitting import StructurePaintwork 7 from cosmetics.common.structures.const import StructurePaintSlot 8 import paints.data.dataLoader as dl 9 from cosmetics.client.structures.fittingSignals import on_structure_cosmetic_state_changed 10 from evegraphics.graphicEffects.skinChange import RemoveAllTemporaryModels, ChangeStructureSkin 11 from uthread2 import StartTasklet 12 import blue 13 from eve.client.script.environment.spaceObject.spaceObject import modify_dna 14 from cosmetics.common.structures.const import PAINT_ELIGIBLE_STRUCTURE_TYPE_IDS 15 16 class LargeCollidableStructure(SpaceObject): 17 18 def __init__(self): 19 super(LargeCollidableStructure, self).__init__() 20 self.fitted = False 21 self.turrets = [] 22 self.modules = {} 23 self.paintwork = None 24 on_structure_cosmetic_state_changed.connect(self._on_cosmetic_state_changed) 25 26 def _on_cosmetic_state_changed(self, structure_id, paintwork): 27 if structure_id == self.id: 28 self.paintwork = paintwork 29 newDna = self.GetDNA() 30 self._skinChangeTasklets.append(StartTasklet(self.ChangeSkin, newDna)) 31 32 def _get_material_name(self, slot): 33 if slot is not None: 34 return dl.get_paint_material_name(slot) 35 36 def set_cosmetic_state(self, state): 37 for slot_name, paint_id in state.items(): 38 self.paintwork.set_slot(slot_name, paint_id) 39 40 def ChangeSkin(self, newDna = None): 41 if self.model is None: 42 return 43 oldModel = self.nextModel or self.model 44 nextModel = self._LoadModelResource(None) 45 blue.resMan.Wait() 46 handled = False 47 if sm.GetService('subway').InJump(): 48 handled = sm.GetService('subway').HandleSkinChange(nextModel) 49 if not handled: 50 self.fitted = False 51 self.nextModel = self._SetupModelAndAddToScene(loadedModel=nextModel, addToScene=False) 52 if self.nextModel is None: 53 return 54 self.SetupAnimationInformation(self.nextModel) 55 self._SetupModelAttributes(self.nextModel, '%d' % self.id) 56 self.ChangingSkin(self.nextModel) 57 ChangeStructureSkin(oldModel, self.nextModel, self.spaceMgr.GetScene(), newDna=newDna, paintwork=self.paintwork, postSkinChangeCallback=self.PostSkinChangeCallback) 58 59 def OnSlimItemUpdated(self, slimItem): 60 super(LargeCollidableStructure, self).OnSlimItemUpdated(slimItem) 61 if not slimItem.state and set([ i[0] for i in slimItem.modules or [] if evetypes.GetGraphicID(i[1]) is not None ]) != set(self.modules.keys()): 62 uthread.new(self.ReloadHardpoints) 63 64 def ReloadHardpoints(self): 65 self.UnfitHardpoints() 66 self.FitHardpoints() 67 68 def UnfitHardpoints(self): 69 if not self.fitted: 70 return 71 self.logger.debug('Unfitting hardpoints') 72 newModules = {} 73 for key, val in self.modules.iteritems(): 74 if val not in self.turrets: 75 newModules[key] = val 76 77 self.modules = newModules 78 del self.turrets[:] 79 self.fitted = False 80 81 def FitHardpoints(self, blocking = False): 82 if self.fitted: 83 return 84 if self.model is None: 85 self.logger.warning('FitHardpoints - No model') 86 return 87 self.logger.debug('Fitting hardpoints') 88 self.fitted = True 89 newTurretSetDict = TurretSet.FitTurrets(self.id, self.model, self.typeData.get('sofFactionName', None)) 90 self.turrets = [] 91 for key, val in newTurretSetDict.iteritems(): 92 self.modules[key] = val 93 self.turrets.append(val) 94 95 def LookAtMe(self): 96 if not self.model: 97 return 98 if not self.fitted: 99 self.FitHardpoints() 100 101 def Assemble(self): 102 if self.model is not None: 103 self.model.rotationCurve = None 104 self.SetStaticRotation() 105 if hasattr(self.model, 'ChainAnimationEx'): 106 self.model.ChainAnimationEx('NormalLoop', 0, 0, 1.0) 107 self.SetupSharedAmbientAudio() 108 self.SetStaticRotation() 109 self.ReloadHardpoints() 110 111 def _load_cosmetics(): 112 state = sm.GetService('cosmeticsSvc').get_cached_structure_cosmetic_state(self.id) 113 if state is not None: 114 self.set_cosmetic_state(state.get_slots()) 115 116 uthread.new(_load_cosmetics) 117 118 def OnDamageState(self, damageState): 119 self._OnDamageState(damageState) 120 121 def LoadModel(self, fileName = None, loadedModel = None, notify = True, addToScene = True): 122 123 def _load_cosmetics(): 124 state = sm.GetService('cosmeticsSvc').get_cached_structure_cosmetic_state(self.id) 125 if state is not None: 126 self.set_cosmetic_state(state.get_slots()) 127 128 uthread.new(_load_cosmetics) 129 self.model = self._SetupModelAndAddToScene(fileName, loadedModel, addToScene) 130 if self.model is None: 131 return 132 self.SetupAnimationInformation(self.model) 133 if notify: 134 self.NotifyModelLoaded() 135 136 def GetDNA(self): 137 sofDNA = super(LargeCollidableStructure, self).GetDNA() 138 if self.typeID not in PAINT_ELIGIBLE_STRUCTURE_TYPE_IDS: 139 return sofDNA 140 if not self.paintwork: 141 state = sm.GetService('cosmeticsSvc').get_cached_structure_cosmetic_state(self.id) 142 self.paintwork = StructurePaintwork() 143 if state is not None: 144 self.set_cosmetic_state(state.get_slots()) 145 if sofDNA is not None: 146 mat1 = self._get_material_name(self.paintwork.get_slot(StructurePaintSlot.PRIMARY)) 147 mat2 = self._get_material_name(self.paintwork.get_slot(StructurePaintSlot.SECONDARY)) 148 mat3 = self._get_material_name(self.paintwork.get_slot(StructurePaintSlot.DETAILING)) 149 sofDNA = modify_dna(base_dna=sofDNA, mat1=mat1, mat2=mat2, mat3=mat3, isStructure=True) 150 return sofDNA