pythonEffects.py (15197B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fittingScreen\pythonEffects.py 2 import dbuff.common.industrialInvulnConst as invulnConst 3 import dogma.data as dogma_data 4 from eve.common.lib import appConst as const 5 from eve.common.lib.appConst import MSEC 6 from dbuff.common import baseBurstEffect 7 from dogma import const as dogmaConst 8 from dogma.effects import Effect 9 from dogma.items.locationDogmaItem import LocationDogmaItem 10 from eve.common.script.dogma.pythonEffects.emergencyHullEnergizer import EmergencyHullEnergizer 11 from eve.common.script.dogma.pythonEffects.remoteTargetPaintFalloff import BaseRemoteTargetPaintFalloff 12 from eve.common.script.dogma.pythonEffects.remoteTrackingComputer import BaseRemoteTrackingComputer 13 from eve.common.script.dogma.pythonEffects.remoteWebifierFalloff import BaseRemoteWebifierFalloff 14 from eve.common.script.dogma.pythonEffects.sensorFalloff import BaseSensorFalloffEffect 15 from eve.common.script.dogma.pythonEffects.weaponDisruptionUtil import GetGuidanceDisruptionAttributes, GetTrackingDisruptionAttributes, GetWeaponDisruptionAttributes 16 import inventorycommon.const as invConst 17 from eveexceptions import UserError 18 19 class Attack(Effect): 20 __guid__ = 'testAttack' 21 __effectIDs__ = ['effectTargetAttack', 22 'effectTargetAttackForStructures', 23 'effectProjectileFired', 24 'effectProjectileFiredForEntities'] 25 26 def __init__(self, *args): 27 pass 28 29 30 class OnlineEffect(Effect): 31 __guid__ = 'OnlineEffect' 32 __effectIDs__ = ['effectOnline'] 33 __modifier_only__ = 0 34 35 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 36 containerDogmaItem = dogmaLM.GetDogmaItem(shipID) 37 if isinstance(containerDogmaItem, LocationDogmaItem): 38 containerDogmaItem.CheckCanOnlineItem(itemID) 39 dogma = sm.GetService('dogma') 40 cpuOutput = dogmaLM.GetAttributeValue(shipID, dogmaConst.attributeCpuOutput) 41 cpuLoad = dogmaLM.GetAttributeValue(shipID, dogmaConst.attributeCpuLoad) 42 cpu = dogmaLM.GetAttributeValue(itemID, dogmaConst.attributeCpu) 43 if self.HasEnoughCpuLeft(cpu, cpuLoad, cpuOutput): 44 powerOutput = dogmaLM.GetAttributeValue(shipID, dogmaConst.attributePowerOutput) 45 powerLoad = dogmaLM.GetAttributeValue(shipID, dogmaConst.attributePowerLoad) 46 power = dogmaLM.GetAttributeValue(itemID, dogmaConst.attributePower) 47 if self.HasEnoughPowerLeft(power, powerLoad, powerOutput): 48 dogmaLM.SetAttributeValue(itemID, dogmaConst.attributeIsOnline, 1) 49 dogmaLM.AddModifier(dogmaConst.dgmAssModAdd, shipID, dogmaConst.attributeCpuLoad, itemID, dogmaConst.attributeCpu) 50 dogmaLM.AddModifier(dogmaConst.dgmAssModAdd, shipID, dogmaConst.attributePowerLoad, itemID, dogmaConst.attributePower) 51 else: 52 dogma.UserError(env, 'NotEnoughPower', None) 53 else: 54 dogma.UserError(env, 'NotEnoughCpu', None) 55 56 def HasEnoughCpuLeft(self, cpu, cpuLoad, cpuOutput): 57 if self.ShouldIgnoreCpuPowerRestrictions(): 58 return True 59 hasEnoughPowerLeft = cpuOutput >= cpuLoad + cpu 60 return hasEnoughPowerLeft 61 62 def HasEnoughPowerLeft(self, power, powerLoad, powerOutput): 63 if self.ShouldIgnoreCpuPowerRestrictions(): 64 return True 65 if power == 0: 66 return True 67 return powerOutput >= powerLoad + power 68 69 def ShouldIgnoreCpuPowerRestrictions(self): 70 return True 71 72 def Stop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 73 dogmaLM.RemoveModifier(dogmaConst.dgmAssModAdd, shipID, const.attributeCpuLoad, itemID, const.attributeCpu) 74 dogmaLM.RemoveModifier(dogmaConst.dgmAssModAdd, shipID, const.attributePowerLoad, itemID, const.attributePower) 75 dogmaLM.SetAttributeValue(itemID, const.attributeIsOnline, 0) 76 77 def RestrictedStop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 78 dogmaLM.RemoveModifier(dogmaConst.dgmAssModAdd, shipID, const.attributeCpuLoad, itemID, const.attributeCpu) 79 dogmaLM.RemoveModifier(dogmaConst.dgmAssModAdd, shipID, const.attributePowerLoad, itemID, const.attributePower) 80 dogmaLM.SetAttributeValue(itemID, const.attributeIsOnline, 0) 81 82 83 class Powerboost(Effect): 84 __guid__ = 'dogmaXP.Effect_48' 85 __effectIDs__ = [48] 86 isPythonEffect = True 87 88 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 89 weaponID = env.itemID 90 shipID = env.shipID 91 item = dogmaLM.dogmaItems[weaponID] 92 chargeKey = dogmaLM.GetSubLocation(shipID, item.flagID) 93 if chargeKey is None: 94 return 1 95 chargeQuantity = dogmaLM.GetAttributeValue(chargeKey, const.attributeQuantity) 96 if chargeQuantity is None or chargeQuantity < 1: 97 return 1 98 capacitorBonus = dogmaLM.GetAttributeValue(chargeKey, const.attributeCapacitorBonus) 99 if capacitorBonus != 0: 100 new, old = dogmaLM.IncreaseItemAttributeEx(env.shipID, const.attributeCharge, capacitorBonus, alsoReturnOldValue=True) 101 return 1 102 103 def Stop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 104 return 1 105 106 def RestrictedStop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 107 return 1 108 109 110 class Mine(Effect): 111 __guid__ = 'dogmaXP.Mining' 112 __effectIDs__ = ['effectMining', 'effectMiningLaser', 'effectMiningClouds'] 113 114 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, asteroidID): 115 durationAttributeID = dogma_data.get_effect(env.effectID).durationAttributeID 116 duration = dogmaLM.GetAttributeValue(itemID, durationAttributeID) 117 env.miningDuration = duration 118 import blue 119 env.startedEffect = blue.os.GetSimTime() 120 121 def GetClamp(self, env, preferredDuration): 122 import blue 123 timePassed = blue.os.GetSimTime() - env.startedEffect 124 millisecondsPassed = timePassed / 10000 125 return float(millisecondsPassed) / preferredDuration 126 127 128 class FakeCloaking(Effect): 129 __guid__ = 'dogmaXP.Cloaking' 130 __effectIDs__ = ['effectCloaking', 'effectCloakingWarpSafe', 'effectCloakingPrototype'] 131 effectIDList = None 132 133 def PreStartChecks(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID, internal = False): 134 if dogmaLM.IsShipCloaked(): 135 raise UserError('CantCloakTooManyDevices') 136 if not dogmaLM.GetAttributeValue(shipID, const.attributeCanCloak): 137 raise UserError('CantCloakTooShipUnsuitable') 138 for effectID, itemID, activationInfo, typeID in dogmaLM.GetActivatedEffectsOnShip(): 139 if dogmaLM.dogmaStaticMgr.GetTypeAttribute2(typeID, const.attributeDisallowEarlyDeactivation): 140 raise UserError('CantCloakModuleActive', {'module': (const.UE_TYPEID, typeID)}) 141 142 if dogmaLM.GetAttributeValue(shipID, const.attributeDisallowCloaking): 143 raise UserError('CantCloak') 144 145 def EnforceActivationConditions(self, dogmaLM, shipID, itemID, effectID): 146 dogmaLM.DeactivateActivatedEffectsOfShip(excludeEffectKey=(effectID, itemID)) 147 148 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 149 env.cloaked = 0 150 self.EnforceActivationConditions(dogmaLM, shipID, itemID, env.effectID) 151 dogmaLM.AddModifier(4, shipID, const.attributeMaxVelocity, itemID, const.attributeMaxVelocityModifier) 152 self._Start_Effect(dogmaLM, env, shipID, itemID) 153 154 def _Start_Effect(self, dogmaLM, env, shipID, itemID): 155 try: 156 self.PreStartChecks(env, dogmaLM, itemID, shipID, env.charID, env.otherID, env.targetID, internal=True) 157 except UserError as e: 158 dogmaLM.StopEffect(env.effectID, itemID, 1, forced=1) 159 return 160 161 self.EnforceActivationConditions(dogmaLM, shipID, itemID, env.effectID) 162 env.cloaked = 1 163 164 def Stop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 165 self.RestrictedStop(env, dogmaLM, itemID, shipID, charID, otherID, targetID) 166 167 def RestrictedStop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 168 env.cloaked = -1 169 dogmaLM.RemoveModifier(4, shipID, const.attributeMaxVelocity, itemID, const.attributeMaxVelocityModifier) 170 171 172 class FakeBaseCommandBurstEffect(Effect): 173 sourceVFXEffect = None 174 targetVFXEffect = None 175 176 def PreStartChecks(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 177 pass 178 179 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID = None, targetID = None): 180 buffValues, effectDurationMillis = baseBurstEffect.GetBuffValuesAndDurationMillis(dogmaLM, itemID) 181 buffDuration = effectDurationMillis * MSEC 182 baseBurstEffect.ApplyBuffToSourceShip(dogmaLM, charID, shipID, buffDuration, buffValues) 183 184 185 @baseBurstEffect.BurstEffectDecorator(baseBurstEffect.GetArmorEffectClassVariables()) 186 187 class CommandBurstArmorEffect(FakeBaseCommandBurstEffect): 188 pass 189 190 191 @baseBurstEffect.BurstEffectDecorator(baseBurstEffect.GetInfoEffectClassVariables()) 192 193 class CommandBurstInfoEffect(FakeBaseCommandBurstEffect): 194 pass 195 196 197 @baseBurstEffect.BurstEffectDecorator(baseBurstEffect.GetMiningEffectClassVariables()) 198 199 class CommandBurstMiningEffect(FakeBaseCommandBurstEffect): 200 pass 201 202 203 @baseBurstEffect.BurstEffectDecorator(baseBurstEffect.GetShieldEffectClassVariables()) 204 205 class CommandBurstShieldEffect(FakeBaseCommandBurstEffect): 206 pass 207 208 209 @baseBurstEffect.BurstEffectDecorator(baseBurstEffect.GetSkirmishEffectClassVariables()) 210 211 class CommandBurstSkirmishEffect(FakeBaseCommandBurstEffect): 212 pass 213 214 215 class FakeTitanBurstEffect(Effect): 216 __guid__ = 'dogmaXP.TitanBurstEffect' 217 __effectIDs__ = ['effectModuleTitanBurst'] 218 219 def Start(self, env, dogmaLM, itemID, shipID, charID, *args): 220 effectDuration = 10000000 221 buffValues, effectDurationMillis = baseBurstEffect.GetBuffValuesAndDurationMillis(dogmaLM, itemID) 222 buffDuration = effectDurationMillis * MSEC 223 baseBurstEffect.ApplyBuffToSourceShip(dogmaLM, charID, shipID, buffDuration, buffValues) 224 225 226 class FakeIndustrialInvulnerability(Effect): 227 __guid__ = 'dogmaXP.IndustrialInvulnerability' 228 __effectIDs__ = ['effectModuleBonusIndustrialInvulnerability'] 229 DBUFF_VALUES = invulnConst.DBUFF_VALUES 230 231 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 232 effectDuration = 10000000 233 baseBurstEffect.ApplyBuffToSourceShip(dogmaLM, charID, shipID, effectDuration, self.DBUFF_VALUES) 234 dogmaLM.DeactivateBlockedActivatedEffectsOfShip() 235 236 237 class FakeCargoScan(Effect): 238 __guid__ = 'dogmaXP.Effect_47' 239 __effectIDs__ = [47] 240 isPythonEffect = True 241 242 243 class FakeShipScan(Effect): 244 __guid__ = 'dogmaXP.Effect_46' 245 __effectIDs__ = [46] 246 isPythonEffect = True 247 248 249 class FakePointDefense(Effect): 250 __guid__ = 'dogmaXP.Effect_6443' 251 __effectIDs__ = [6443] 252 isPythonEffect = False 253 254 255 class FakeTargetHostile(Effect): 256 __guid__ = 'dogmaXP.Effect_55' 257 __effectIDs__ = [55] 258 isPythonEffect = True 259 260 261 class FakeEmpWave(Effect): 262 __guid__ = 'dogmaXP.Effect_38' 263 __effectIDs__ = [38] 264 isPythonEffect = True 265 266 267 class FakeSurveyScan(Effect): 268 __guid__ = 'dogmaXP.Effect_81' 269 __effectIDs__ = [81] 270 isPythonEffect = True 271 272 273 class FakeTargetABCAttack(Effect): 274 __guid__ = 'dogmaXP.Effect_6995' 275 __effectIDs__ = [6995] 276 isPythonEffect = False 277 278 279 class FakeEntosisLinkEffect(Effect): 280 __guid__ = 'dogmaXP.Effect_6063' 281 __effectIDs__ = [6063] 282 isPythonEffect = False 283 MODIFIER_CHANGES = [(dogmaConst.dgmAssPostPercent, dogmaConst.attributeScanRadarStrength, dogmaConst.attributeScanRadarStrengthPercent), 284 (dogmaConst.dgmAssPostPercent, dogmaConst.attributeScanMagnetometricStrength, dogmaConst.attributeScanMagnetometricStrengthPercent), 285 (dogmaConst.dgmAssPostPercent, dogmaConst.attributeScanGravimetricStrength, dogmaConst.attributeScanGravimetricStrengthPercent), 286 (dogmaConst.dgmAssPostPercent, dogmaConst.attributeScanLadarStrength, dogmaConst.attributeScanLadarStrengthPercent)] 287 288 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 289 self.AddModifiers(dogmaLM, shipID, itemID) 290 291 def Stop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 292 self.RemoveModifiers(dogmaLM, shipID, itemID) 293 294 def RestrictedStop(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 295 self.RemoveModifiers(dogmaLM, shipID, itemID) 296 297 298 class FakeEmergencyHullEnergizer(EmergencyHullEnergizer): 299 300 def Start(self, env, dogmaLM, itemID, shipID, charID, otherID, targetID): 301 self.AddModifiers(dogmaLM, shipID, itemID) 302 303 304 class FakeSensorFalloffEffect(BaseSensorFalloffEffect): 305 __guid__ = 'dogmaXP.RemoteSensorBooster' 306 __effectIDs__ = [dogmaConst.effectRemoteSensorBoostFalloff, dogmaConst.effectRemoteSensorDampFalloff, dogmaConst.effectStructureModuleEffectRemoteSensorDampener] 307 308 309 class FakeRemoteTrackingComputer(BaseRemoteTrackingComputer): 310 __guid__ = 'dogmaXP.RemoteTrackingComputer' 311 __effectIDs__ = [dogmaConst.effectShipModuleRemoteTrackingComputer] 312 313 314 class FakeWeaponDisruption(Effect): 315 __guid__ = 'dogmaXP.WeaponDisruption' 316 __effectIDs__ = [dogmaConst.effectStructureModuleEffectWeaponDisruption] 317 WEAPON_DISRUPTION_ATTRIBUTES_BY_CATEGORY = GetWeaponDisruptionAttributes() 318 SKILL_MODIFIER_CHANGES_FOR_LOCATION = [ (dogmaConst.dgmAssPostPercent, 319 skillTypeID, 320 affectedAttributeID, 321 affectingAttributeID) for skillTypeID, affectingAttributeID, affectedAttributeID in WEAPON_DISRUPTION_ATTRIBUTES_BY_CATEGORY.get(invConst.categoryShip, []) ] 322 323 324 class FakeTrackingDisruption(Effect): 325 __guid__ = 'dogmaXP.TrackingDisruption' 326 __effectIDs__ = [dogmaConst.effectShipModuleTrackingDisruptor] 327 WEAPON_DISRUPTION_ATTRIBUTES_BY_CATEGORY = GetTrackingDisruptionAttributes() 328 SKILL_MODIFIER_CHANGES_FOR_LOCATION = [ (dogmaConst.dgmAssPostPercent, 329 skillTypeID, 330 affectedAttributeID, 331 affectingAttributeID) for skillTypeID, affectingAttributeID, affectedAttributeID in WEAPON_DISRUPTION_ATTRIBUTES_BY_CATEGORY.get(invConst.categoryShip, []) ] 332 333 334 class FakeGuidanceDisruption(Effect): 335 __guid__ = 'dogmaXP.GuidanceDisruption' 336 __effectIDs__ = [dogmaConst.effectShipModuleGuidanceDisruptor] 337 WEAPON_DISRUPTION_ATTRIBUTES_BY_CATEGORY = GetGuidanceDisruptionAttributes() 338 SKILL_MODIFIER_CHANGES_FOR_LOCATION = [ (dogmaConst.dgmAssPostPercent, 339 skillTypeID, 340 affectedAttributeID, 341 affectingAttributeID) for skillTypeID, affectingAttributeID, affectedAttributeID in WEAPON_DISRUPTION_ATTRIBUTES_BY_CATEGORY.get(invConst.categoryShip, []) ] 342 343 344 class FakeRemoteTargetPaintFalloff(BaseRemoteTargetPaintFalloff): 345 __guid__ = 'dogmaXP.RemoteTargetPaintFalloff' 346 __effectIDs__ = [dogmaConst.effectRemoteTargetPaintFalloff, dogmaConst.effectStructureModuleEffectTargetPainter] 347 348 349 class FakeRemoteWebifierFalloff(BaseRemoteWebifierFalloff): 350 __guid__ = 'dogmaXP.RemoteWebifierFalloff' 351 __effectIDs__ = [dogmaConst.effectRemoteWebifierFalloff, dogmaConst.effectStructureModuleEffectStasisWebifier]