Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /***********************************************************************/
- /** THE WITCHER® is a trademark of CD PROJEKT S. A.
- /** The Witcher game is based on the prose of Andrzej Sapkowski.
- /***********************************************************************/
- struct SAardEffects
- {
- editable var baseCommonThrowEffect : name;
- editable var baseCommonThrowEffectUpgrade1 : name;
- editable var baseCommonThrowEffectUpgrade2 : name;
- editable var baseCommonThrowEffectUpgrade3 : name;
- editable var throwEffectSoil : name;
- editable var throwEffectSoilUpgrade1 : name;
- editable var throwEffectSoilUpgrade2 : name;
- editable var throwEffectSoilUpgrade3 : name;
- editable var throwEffectSPNoUpgrade : name;
- editable var throwEffectSPUpgrade1 : name;
- editable var throwEffectSPUpgrade2 : name;
- editable var throwEffectSPUpgrade3 : name;
- editable var throwEffectDmgNoUpgrade : name;
- editable var throwEffectDmgUpgrade1 : name;
- editable var throwEffectDmgUpgrade2 : name;
- editable var throwEffectDmgUpgrade3 : name;
- editable var throwEffectWater : name;
- editable var throwEffectWaterUpgrade1 : name;
- editable var throwEffectWaterUpgrade2 : name;
- editable var throwEffectWaterUpgrade3 : name;
- editable var cameraShakeStrength : float;
- }
- struct SAardAspect
- {
- editable var projTemplate : CEntityTemplate;
- editable var cone : float;
- editable var distance : float;
- editable var distanceUpgrade1 : float;
- editable var distanceUpgrade2 : float;
- editable var distanceUpgrade3 : float;
- }
- statemachine class W3AardEntity extends W3SignEntity
- {
- //addTomes
- var aardslowCustomEffect,rootef,poisoneff: SCustomEffectParams; var spadtomes : SAbilityAttributeValue;
- var rootdist,electradmg : float; var rootvic : array<CActor>; var rootvictims : array<CActor>; var victimr : CNewNPC; var r,z :int; var roottemp : CEntityTemplate; var root : CEntity; public var roots : array< CEntity >;
- var attackRange,attackRange2 : CAIAttackRange; var projectiletest,projectiletest2,projectiletest3 : W3AardProjectile; var test,test2,test3 : CEntity; var pos : Vector;
- var spikeTemplate : CEntityTemplate; var spikeEnt : CEntity; var rot : EulerAngles; var pos2, basePos : Vector; var i,j : int; var angle, radius,randRoll,randYaw : float;
- var polarAngle, unitAngle : float; var PositionLocal, PositionGlobal,blowpos : Vector; var lines: CEntity; var testtest : CEntity; var electra: W3DamageAction;
- var icefleff : SCustomEffectParams; var entities : array<CGameplayEntity>; var entity : CGameplayEntity;
- //addTomes
- editable var aspects : array< SAardAspect >;
- editable var effects : array< SAardEffects >;
- editable var waterTestOffsetZ : float;
- editable var waterTestDistancePerc : float;
- var projectileCollision : array< name >;
- default skillEnum = S_Magic_1;
- default waterTestOffsetZ = -2;
- //VIO+
- default waterTestDistancePerc = 0.7;
- //VIO-
- hint waterTestOffsetZ = "Z offset added to Aard Entity when testing for water level";
- hint waterTestDistancePerc = "Percentage of sign distance to use along heading for water test";
- public function GetSignType() : ESignType
- {
- return ST_Aard;
- }
- event OnStarted()
- {
- if(IsAlternateCast())
- {
- //in case of 360 aard don't call super since we don't want any attachment done
- if((CPlayer)owner.GetActor())
- GetWitcherPlayer().FailFundamentalsFirstAchievementCondition();
- }
- else
- {
- super.OnStarted();
- }
- projectileCollision.Clear();
- projectileCollision.PushBack( 'Projectile' );
- projectileCollision.PushBack( 'Door' );
- projectileCollision.PushBack( 'Static' );
- projectileCollision.PushBack( 'Character' );
- projectileCollision.PushBack( 'ParticleCollider' ); //Added so it can collide with Aard, but Geralt isn't blocked. Used for QFM_Hit_By_Aard on otherwise non-colliding objects. DZ
- if ( owner.ChangeAspect( this, S_Magic_s01 ) )
- {
- //addTomes
- if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('aardslow_tome'))
- { theSound.SoundLoadBank( "qu_ep1_605.bnk", true ); }
- if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('neverwinter_tome'))
- { theSound.SoundLoadBank( "ep2_mutations_06.bnk", true ); }
- if(GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() )
- { theSound.SoundLoadBank( "magic_keira.bnk", true ); }
- //addTomes
- CacheActionBuffsFromSkill();
- GotoState( 'AardCircleCast' );
- }
- else
- {
- //addTomes
- if(GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() )
- { theSound.SoundLoadBank( "magic_sorceress.bnk", true ); }
- if(GetWitcherPlayer().IsItemEquippedByName( 'witch_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'witch_tome' ) == GetWitcherPlayer().GetSelectedItemId())
- {
- rootdist = GetDistance();
- rootvic = GetWitcherPlayer().GetNPCsAndPlayersInCone(rootdist, VecHeading(GetWitcherPlayer().GetHeadingVector()), 60, 20, , FLAG_Attitude_Hostile + FLAG_OnlyAliveActors);
- spadtomes = GetWitcherPlayer().GetTotalSignSpellPower(skillEnum);
- thePlayer.SoundEvent("sign_axii_release");
- blowpos = GetWorldPosition();
- blowpos.Z -= 0.2; //fx\shaders\addtive_standard.w2mg
- lines = (CEntity)theGame.CreateEntity( (CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\energytest2.w2ent" ,true ), blowpos, GetWorldRotation() );
- lines.CreateAttachment( thePlayer, 'l_weapon' );
- lines.DestroyAfter(3);
- for( r = 0; r < rootvic.Size(); r += 1 )
- {
- victimr = (CNewNPC)rootvic[r];
- lines.PlayEffect('drainenergy2',victimr);
- roottemp = (CEntityTemplate)LoadResource('archespor_sfx_projectile');
- root = theGame.CreateEntity(roottemp,victimr.GetWorldPosition(),victimr.GetWorldRotation());
- roots.PushBack( root );
- AddTimer('destr',(spadtomes.valueMultiplicative*3)-0.5, , , , true);
- rootef.effectType = EET_Immobilized;
- rootef.creator = thePlayer;
- rootef.sourceName = thePlayer.GetName();
- rootef.duration = spadtomes.valueMultiplicative*3;
- victimr.AddEffectCustom(rootef);
- //theGame.witcherLog.AddMessage("dur: " + spadtomes.valueMultiplicative*3);
- if(RandF() <= (spadtomes.valueMultiplicative-1)*0.2 )
- {
- if(RandF() > 0.5)
- {
- poisoneff.effectType = EET_Poison;
- }
- else
- {
- poisoneff.effectType = EET_Bleeding;
- }
- }
- poisoneff.creator = thePlayer;
- poisoneff.sourceName = thePlayer.GetName();
- poisoneff.duration = spadtomes.valueMultiplicative*3;
- victimr.AddEffectCustom(poisoneff);
- victimr.EnablePathEngineAgent(false);
- rootvictims.PushBack( victimr );
- //AddTimer('destr2',(spadtomes.valueMultiplicative*3)-0.5, , , , true);
- AddTimer('destr2',(spadtomes.valueMultiplicative*3)-0.5, , , , true);
- }
- thePlayer.DrainStamina( ESAT_FixedValue, 99 );
- }
- else
- //addTomes
- GotoState( 'AardConeCast' );
- }
- }
- //addTomes
- timer function destr( delta : float , id : int)
- { var k:int;
- for( k=0; k<roots.Size(); k+=1 )
- {
- roots[k].StopAllEffects();
- roots[k].DestroyAfter( 3.f );
- }
- }
- timer function destr2( delta : float , id : int)
- { var act:int;
- for( act=0; act<rootvictims.Size(); act+=1 )
- {
- rootvictims[act].EnablePathEngineAgent(true);
- }
- }
- //addTomes
- event OnAardHit( sign : W3AardProjectile ) {}
- // HACK: postponing ProcessThrow to MainTick
- // We do this to avoid calling StaticTrace during physics fetch - ProcessThrow is triggered by animation event.
- var processThrow_alternateCast : bool;
- protected function ProcessThrow( alternateCast : bool )
- {
- if ( owner.IsPlayer() )
- {
- // player's ProcessThrow() is already called on MainTick
- ProcessThrow_MainTick( alternateCast );
- }
- else
- {
- processThrow_alternateCast = alternateCast;
- AddTimer( 'ProcessThrowTimer', 0.00000001f, , , TICK_Main );
- }
- }
- timer function ProcessThrowTimer( dt : float, id : int )
- {
- ProcessThrow_MainTick( processThrow_alternateCast );
- }
- // HACK ends here
- public final function GetDistance() : float
- {
- //if ( owner.CanUseSkill( S_Magic_s20 ) ) //addTomes
- if ( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId())) //addTomes
- {
- //addTomes
- if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
- {
- return aspects[ fireMode ].distanceUpgrade3;
- }
- else
- {
- //addTomes
- switch( owner.GetSkillLevel( S_Magic_s20 ) )
- {
- case 1 : return aspects[ fireMode ].distanceUpgrade1;
- case 2 : return aspects[ fireMode ].distanceUpgrade2;
- case 3 : return aspects[ fireMode ].distanceUpgrade3;
- }
- //addTomes
- }
- //addTomes
- }
- return aspects[ fireMode ].distance;
- }
- protected function ProcessThrow_MainTick( alternateCast : bool )
- {
- var projectile : W3AardProjectile;
- var spawnPos, collisionPos, collisionNormal, waterCollTestPos : Vector;
- var spawnRot : EulerAngles;
- var heading : Vector;
- var distance, waterZ, staminaDrain : float;
- var ownerActor : CActor;
- var dispersionLevel : int;
- var attackRange : CAIAttackRange;
- var movingAgent : CMovingPhysicalAgentComponent;
- var hitsWater : bool;
- var collisionGroupNames : array<name>;
- ownerActor = owner.GetActor();
- if ( owner.IsPlayer() )
- {
- GCameraShake(effects[fireMode].cameraShakeStrength, true, this.GetWorldPosition(), 30.0f);
- }
- distance = GetDistance();
- if ( owner.HasCustomAttackRange() )
- {
- attackRange = theGame.GetAttackRangeForEntity( this, owner.GetCustomAttackRange() );
- }
- //else if( owner.CanUseSkill( S_Magic_s20 ) ) //addTomes
- else if( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId())) //addTomes
- {
- dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
- //addTomes
- if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
- {
- dispersionLevel = 3;
- }
- //addTomes
- if(dispersionLevel == 1)
- {
- if ( !alternateCast )
- attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade1' );
- else
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
- }
- else if(dispersionLevel == 2)
- {
- if ( !alternateCast )
- attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade2' );
- else
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade2' );
- }
- else if(dispersionLevel == 3)
- {
- if ( !alternateCast )
- attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade3' );
- else
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade3' );
- }
- }
- else
- {
- if ( !alternateCast )
- attackRange = theGame.GetAttackRangeForEntity( this, 'cone' );
- else
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast' );
- }
- spawnPos = GetWorldPosition();
- spawnRot = GetWorldRotation();
- heading = this.GetHeadingVector();
- if ( alternateCast )
- {
- spawnPos.Z -= 0.5;
- //addTomes
- if(GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() && thePlayer.GetStat( BCS_Focus )>=1
- projectile = (W3AardProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos - heading * 0.8, spawnRot );
- && thePlayer.GetStat( BCS_Stamina )>=99
- )
- {
- pos = GetWorldPosition();rot = thePlayer.GetWorldRotation();
- pos += GetWitcherPlayer().GetHeadingVector();
- randYaw = RandRangeF( 180.0, -180.0 );
- rot.Yaw = randYaw;
- test = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_electro.w2ent",true),pos,rot);
- test.PlayEffect( 'blast_lv1' );
- test.PlayEffect( 'blast_lv1_damage' );// test.PlayEffect( 'blast_lv1_damage' );// blast
- test.PlayEffect( 'cone_ground_mutation_6' );
- test.PlayEffect( 'blast_lv3' );
- //rot = thePlayer.GetWorldRotation();
- rot.Yaw += 45.f;
- test2 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_electro.w2ent",true),pos,rot);
- test2.PlayEffect( 'blast_lv3' );
- thePlayer.SoundEvent('magic_keira_lightning');
- thePlayer.PlayEffectOnBone( 'yrden_shock', 'l_hand' );
- thePlayer.PlayEffect('mutation_1_yrden_power');
- test.DestroyAfter(10);
- test2.DestroyAfter(10);
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
- distance = 9;
- thePlayer.DrainStamina( ESAT_FixedValue, 99 );
- thePlayer.DrainFocus(0.99);
- FactsAdd("electroblast",,1);
- //theGame.witcherLog.AddMessage("electroblast " );
- }
- else if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('fire2_tome') && thePlayer.GetStat( BCS_Focus )>=1
- && thePlayer.GetStat( BCS_Stamina )>=99
- )
- {
- pos = GetWorldPosition();
- pos += GetWitcherPlayer().GetHeadingVector();pos.Z +=0.25;
- test2 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_quileg.w2ent",true), pos, GetWorldRotation());
- test2.PlayEffect( 'blast_cutscene' );
- test2.PlayEffect( 'blast_lv0' );
- test2.PlayEffect( 'blast_ground' );
- thePlayer.SoundEvent('sign_igni_charge_begin');
- thePlayer.SoundEvent('sign_igni_charge_begin');
- thePlayer.PlayEffect('mutation_1_igni_power');
- test2.DestroyAfter(10);
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
- distance = 9;
- theGame.GetSurfacePostFX().AddSurfacePostFXGroup(GetWorldPosition(), 0.1f, 7.f, 2.f, 10, 1 );
- thePlayer.DrainStamina( ESAT_FixedValue, 99 );
- thePlayer.DrainFocus(0.99);
- FactsAdd("quilegblast",,1);
- //theGame.witcherLog.AddMessage("quilegblast " );
- }
- else if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('neverwinter_tome') && thePlayer.GetStat( BCS_Focus )>=1
- && thePlayer.GetStat( BCS_Stamina )>=99
- )
- {
- pos = GetWorldPosition();
- pos += GetWitcherPlayer().GetHeadingVector();pos.Z +=0.25;
- test3 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_frost.w2ent",true), pos, GetWorldRotation());
- //test3.PlayEffect( 'blast_cutscene' );
- //test3.PlayEffect( 'blast_ground' ); fx\textures\smoke\smoke_02.xbm
- test3.PlayEffect( 'blast_ground1' );
- test3.PlayEffect( 'blast_lv0' );
- test3.PlayEffect( 'cone_ground_mutation_6' );
- test3.DestroyAfter(10);
- thePlayer.SoundEvent('ep2_mutations_06_frosty_aard');
- thePlayer.PlayEffect( 'mutation_6_power' );
- attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
- distance = 9;
- theGame.GetSurfacePostFX().AddSurfacePostFXGroup(GetWorldPosition(), 0.1f, 7.f, 2.f, 10, 0 );
- basePos = GetWorldPosition();
- rot.Pitch = 0.f;
- rot.Roll = 0.f;
- rot.Yaw = 0.f;
- spikeEnt = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\ice_spikes_large.w2ent", true ), TraceFloor(basePos), rot );
- spikeEnt.StopAllEffects();
- spikeEnt.DestroyAfter( 15.f );
- unitAngle = 2 * Pi() / 10;
- for( j=0; j<10; j+=1 )
- {
- polarAngle = unitAngle * j;
- PositionLocal.X = 4.5 * CosF( polarAngle );
- PositionLocal.Y = 4.5 * SinF( polarAngle );
- PositionLocal.Z = 0.f;
- PositionGlobal = basePos + PositionLocal;
- spikeEnt = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\ice_spikes_large.w2ent", true ), TraceFloor( PositionGlobal ), rot );
- spikeEnt.StopAllEffects();
- spikeEnt.DestroyAfter( 15.f );
- }
- thePlayer.DrainStamina( ESAT_FixedValue, 99 );
- thePlayer.DrainFocus(0.99);
- FactsAdd("neverwinterblast",,1);
- //theGame.witcherLog.AddMessage("neverwinterblast " );
- }
- else if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('aardslow_tome'))
- {
- aardslowCustomEffect.effectType = EET_Aardslow;
- aardslowCustomEffect.creator = ((W3PlayerWitcher)thePlayer);
- aardslowCustomEffect.duration = 11;
- ((W3PlayerWitcher)thePlayer).AddEffectCustom(aardslowCustomEffect);
- if(thePlayer.GetStat( BCS_Focus )>2.0f)
- {
- thePlayer.DrainFocus(2); FactsAdd("aardslow",,2);
- pos = GetWorldPosition();
- pos += GetWitcherPlayer().GetHeadingVector();
- test2 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_slow.w2ent",true), pos, GetWorldRotation());
- if ( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()) )
- {
- dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
- //addTomes
- if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
- { dispersionLevel = 3; }
- if(dispersionLevel == 1)
- { test2.PlayEffect( 'blast_lv1' );}
- else if(dispersionLevel == 2)
- { test2.PlayEffect( 'blast_lv2' );}
- else if(dispersionLevel == 3)
- { test2.PlayEffect( 'blast_lv3' );}
- }
- else test2.PlayEffect( 'blast_lv0' );
- thePlayer.SoundEvent("qu_605_time_freeze_bkg"); //sign_aard_blast
- }
- }
- //addTomes
- projectile = (W3AardProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos - heading * 0.7, spawnRot );
- projectile.ExtInit( owner, skillEnum, this );
- projectile.SetAttackRange( attackRange );
- projectile.SphereOverlapTest( distance, projectileCollision );
- }
- else
- {
- spawnPos -= 0.7 * heading;
- projectile = (W3AardProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos, spawnRot );
- projectile.ExtInit( owner, skillEnum, this );
- projectile.SetAttackRange( attackRange );
- //VIO+
- projectile.ShootCakeProjectileAtPosition( aspects[fireMode].cone, 4.5f, 0.0f, 30.0f, spawnPos + heading * distance, distance, projectileCollision );
- //VIO-
- }
- if(ownerActor.HasAbility('Glyphword 6 _Stats', true))
- {
- staminaDrain = CalculateAttributeValue(ownerActor.GetAttributeValue('glyphword6_stamina_drain_perc'));
- projectile.SetStaminaDrainPerc(staminaDrain);
- }
- //addTomes
- if ( GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('vampire_tome') && !alternateCast )
- { projectile.SetStaminaDrainPerc(0.75); }
- //addTomes
- if(alternateCast)
- {
- movingAgent = (CMovingPhysicalAgentComponent)ownerActor.GetMovingAgentComponent();
- hitsWater = movingAgent.GetSubmergeDepth() < 0;
- }
- else
- {
- waterCollTestPos = GetWorldPosition() + heading * distance * waterTestDistancePerc;
- waterCollTestPos.Z += waterTestOffsetZ;
- collisionGroupNames.PushBack('Terrain');
- //water Z
- waterZ = theGame.GetWorld().GetWaterLevel(waterCollTestPos, true);
- //terrain collision
- if(theGame.GetWorld().StaticTrace(GetWorldPosition(), waterCollTestPos, collisionPos, collisionNormal, collisionGroupNames))
- {
- //if water level is the highest of all
- if(waterZ > collisionPos.Z && waterZ > waterCollTestPos.Z)
- hitsWater = true;
- else
- hitsWater = false;
- }
- else
- {
- //no terrain - just water level check
- hitsWater = (waterCollTestPos.Z <= waterZ);
- }
- }
- //VIO+
- PlayAardFX(hitsWater);
- PlayAardFX(hitsWater);
- if (FactsQuerySum( "neverwinterblast" ) <= 0 && FactsQuerySum( "quilegblast" ) <= 0
- && FactsQuerySum( "electroblast" ) <= 0 && FactsQuerySum( "aardelectra" ) <= 0 && FactsQuerySum( "aardslow" ) <= 0)
- && FactsQuerySum( "electroblast" ) <= 0 && FactsQuerySum( "aardelectra" ) <= 0 && FactsQuerySum( "aardslow" ) <= 0}
- //addTomes
- PlayAardFX(hitsWater);
- //PlayAardFX(hitsWater);
- ownerActor.OnSignCastPerformed(ST_Aard, alternateCast);
- AddTimer('DelayedDestroyTimer', 0.1, true, , , true);
- //plays aard fx
- public final function PlayAardFX(hitsWater : bool)
- {
- var dispersionLevel : int;
- var hasMutation6 : bool;
- //addTomes
- if((GetWitcherPlayer().IsItemEquippedByName( 'permafrost_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'permafrost_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
- {hasMutation6 = true;}
- else
- {//addTomes
- hasMutation6 = owner.GetPlayer().IsMutationActive(EPMT_Mutation6);
- //addTomes
- }
- //if ( owner.CanUseSkill( S_Magic_s20 ) ) //addTomes
- if ( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()) ) //addTomes
- {
- dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
- //addTomes
- if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
- {
- dispersionLevel = 3;
- }
- //addTomes
- if(dispersionLevel == 1)
- {
- //base
- PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade1 );
- //terrain specific
- if(!hasMutation6)
- {
- if(hitsWater)
- PlayEffect( effects[fireMode].throwEffectWaterUpgrade1 );
- else
- PlayEffect( effects[fireMode].throwEffectSoilUpgrade1 );
- }
- }
- else if(dispersionLevel == 2)
- {
- //base
- PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade2 );
- //terrain specific
- if(!hasMutation6)
- {
- if(hitsWater)
- PlayEffect( effects[fireMode].throwEffectWaterUpgrade2 );
- else
- PlayEffect( effects[fireMode].throwEffectSoilUpgrade2 );
- }
- }
- else if(dispersionLevel == 3)
- {
- //base
- PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade3 );
- //terrain specific
- if(!hasMutation6)
- {
- if(hitsWater)
- PlayEffect( effects[fireMode].throwEffectWaterUpgrade3 );
- else
- PlayEffect( effects[fireMode].throwEffectSoilUpgrade3 );
- }
- }
- }
- else
- {
- //base
- PlayEffect( effects[fireMode].baseCommonThrowEffect );
- //terrain specific
- if(!hasMutation6)
- {
- if(hitsWater)
- PlayEffect( effects[fireMode].throwEffectWater );
- else
- PlayEffect( effects[fireMode].throwEffectSoil );
- }
- }
- //bonus sp fx
- if(owner.CanUseSkill(S_Magic_s12))
- {
- //different fx based on what is the current range of aard
- switch(dispersionLevel)
- {
- case 0:
- PlayEffect( effects[fireMode].throwEffectSPNoUpgrade );
- break;
- case 1:
- PlayEffect( effects[fireMode].throwEffectSPUpgrade1 );
- break;
- case 2:
- PlayEffect( effects[fireMode].throwEffectSPUpgrade2 );
- break;
- case 3:
- PlayEffect( effects[fireMode].throwEffectSPUpgrade3 );
- break;
- }
- }
- //bonus dmg fx
- if(owner.CanUseSkill(S_Magic_s06))
- {
- //different fx based on what is the current range of aard
- switch(dispersionLevel)
- {
- case 0:
- PlayEffect( effects[fireMode].throwEffectDmgNoUpgrade );
- break;
- case 1:
- PlayEffect( effects[fireMode].throwEffectDmgUpgrade1 );
- break;
- case 2:
- PlayEffect( effects[fireMode].throwEffectDmgUpgrade2 );
- break;
- case 3:
- PlayEffect( effects[fireMode].throwEffectDmgUpgrade3 );
- break;
- }
- }
- //mutation 6 bonus cast blast fx
- if( hasMutation6 )
- {
- thePlayer.PlayEffect( 'mutation_6_power' );
- if( fireMode == 0 )
- {
- PlayEffect( 'cone_ground_mutation_6' );
- }
- else
- {
- PlayEffect( 'blast_ground_mutation_6' );
- theGame.GetSurfacePostFX().AddSurfacePostFXGroup(GetWorldPosition(), 0.3f, 3.f, 2.f, GetDistance(), 0 );
- }
- }
- }
- timer function DelayedDestroyTimer(dt : float, id : int)
- {
- var active : bool;
- //if(owner.CanUseSkill(S_Magic_s20)) //addTomes
- if(owner.CanUseSkill(S_Magic_s20) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId())) //addTomes
- {
- //addTomes
- if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
- {
- active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade3 );
- }
- else
- {
- //addTomes
- switch(owner.GetSkillLevel(S_Magic_s20))
- {
- case 1 :
- active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade1 );
- break;
- case 2 :
- active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade2 );
- break;
- case 3 :
- active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade3 );
- break;
- default :
- LogAssert(false, "W3AardEntity.DelayedDestroyTimer: S_Magic_s20 skill level out of bounds!");
- }
- //addTomes
- }
- //addTomes
- }
- else
- {
- active = IsEffectActive( effects[fireMode].baseCommonThrowEffect );
- }
- if(!active)
- Destroy();
- }
- state AardConeCast in W3AardEntity extends NormalCast
- {
- event OnThrowing()
- {
- var player : CR4Player;
- if( super.OnThrowing() )
- {
- //addTomes
- if(caster.GetPlayer() && GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() && thePlayer.GetStat( BCS_Focus )>=1
- )
- {
- parent.pos = parent.GetWorldPosition();
- parent.rot = parent.GetWorldRotation();
- parent.randRoll = RandRangeF( 180.0, -180.0 );
- parent.rot.Roll = parent.randRoll;
- parent.testtest = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\bruxa_electra.w2ent",true),
- parent.pos,parent.rot);
- parent.testtest.CreateAttachment(thePlayer,'l_hand');
- parent.testtest.PlayEffect( 'fx_push' );
- parent.testtest.PlayEffect( 'fx_push0' );
- parent.testtest.BreakAttachment();
- thePlayer.PlayEffect('mutation_1_yrden_power');
- thePlayer.SoundEvent("sign_yrden_shock_activate");
- thePlayer.SoundEvent("magic_sorceress_vfx_lightning_bolt");
- FactsAdd("aardelectra",,1);
- parent.testtest.DestroyAfter(2);
- parent.rootvic = GetWitcherPlayer().GetNPCsAndPlayersInCone(13.5, VecHeading(caster.GetPlayer().GetHeadingVector()), 80, 200, , FLAG_Attitude_Hostile + FLAG_OnlyAliveActors);
- parent.spadtomes = GetWitcherPlayer().GetTotalSignSpellPower(parent.skillEnum);
- for( parent.r = 0; parent.r < parent.rootvic.Size(); parent.r += 1 )
- {
- parent.victimr = (CNewNPC)parent.rootvic[parent.r];
- parent.electra = new W3DamageAction in this;
- parent.electra.Initialize(thePlayer,parent.victimr,this,thePlayer.GetName()+"_sign",EHRT_Heavy,CPS_Undefined,false, false, true, false );
- parent.spadtomes = thePlayer.GetTotalSignSpellPower(parent.skillEnum);
- parent.electradmg = thePlayer.GetLevel()*13;
- parent.electradmg += parent.electradmg*((parent.spadtomes.valueMultiplicative-1)*0.4);
- if( !parent.victimr.IsHuman() && !parent.victimr.IsAnimal() )
- { parent.electradmg *= 1.6; }
- parent.electra.AddDamage( theGame.params.DAMAGE_NAME_DIRECT, parent.electradmg );
- parent.electra.AddEffectInfo( EET_Stagger );
- parent.electra.SetHitAnimationPlayType(EAHA_ForceYes);
- parent.electra.SetProcessBuffsIfNoDamage(true);
- parent.electra.SetForceExplosionDismemberment();
- theGame.damageMgr.ProcessAction( parent.electra );
- delete parent.electra;
- parent.victimr.PlayEffect('yrden_shock');
- }
- }
- else if(caster.GetPlayer() && GetWitcherPlayer().IsItemEquippedByName( 'permafrost_tome' ) &&
- GetWitcherPlayer().GetInventory().GetItemId( 'permafrost_tome' ) == GetWitcherPlayer().GetSelectedItemId() && thePlayer.GetStat( BCS_Focus )>=1
- )
- {
- theSound.SoundLoadBank( "ep2_mutations_06.bnk", true );
- parent.testtest = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\bruxa_scream_attack_winter.w2ent",true ), GetWitcherPlayer().GetWorldPosition(),GetWitcherPlayer().GetWorldRotation() );
- parent.testtest.CreateAttachment(thePlayer,'l_hand');
- parent.testtest.PlayEffect( 'fx_push' );
- parent.pos = parent.GetWorldPosition()-GetWitcherPlayer().GetHeadingVector()*4;
- parent.pos.Z+=0.15;
- parent.testtest = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\bruxa_scream_attack_winter.w2ent",true ),
- parent.pos,GetWitcherPlayer().GetWorldRotation() );
- parent.testtest.CreateAttachment(thePlayer,'l_hand');
- parent.testtest.PlayEffect( 'fx_push0' );
- for( parent.i = 4; parent.i <= 14; parent.i += 2 )
- { theGame.GetSurfacePostFX().AddSurfacePostFXGroup(parent.GetWorldPosition()+GetWitcherPlayer().GetHeadingVector()*parent.i, 0.1f+parent.i*0.05, 5.f, 2.f, 20, 0 ); }
- parent.testtest.BreakAttachment();
- thePlayer.PlayEffect('mutation_6_power');
- thePlayer.SoundEvent("sign_aard_blast");
- FactsAdd("winterbreath",,1);
- parent.testtest.DestroyAfter(2);
- parent.rootvic = GetWitcherPlayer().GetNPCsAndPlayersInCone(13.5, VecHeading(caster.GetPlayer().GetHeadingVector()), 60, 200, , FLAG_Attitude_Hostile + FLAG_OnlyAliveActors);
- parent.spadtomes = GetWitcherPlayer().GetTotalSignSpellPower(parent.skillEnum);
- for( parent.r = 0; parent.r < parent.rootvic.Size(); parent.r += 1 )
- {
- parent.victimr = (CNewNPC)parent.rootvic[parent.r];
- parent.electra = new W3DamageAction in this;
- parent.electra.Initialize(thePlayer,parent.victimr,this,thePlayer.GetName()+"_sign",EHRT_Heavy,CPS_Undefined,false, false, true, false );
- parent.spadtomes = thePlayer.GetTotalSignSpellPower(parent.skillEnum);
- parent.electradmg = thePlayer.GetLevel()*8;
- parent.electradmg += parent.electradmg*((parent.spadtomes.valueMultiplicative-1)*0.4);
- if( !parent.victimr.IsHuman() && !parent.victimr.IsAnimal() )
- { parent.electradmg *= 1.6; }
- parent.electra.AddDamage( theGame.params.DAMAGE_NAME_FROST, parent.electradmg );
- parent.electra.AddEffectInfo( EET_Stagger );
- if( RandF() <= (parent.spadtomes.valueMultiplicative-1)*0.5)
- {
- parent.icefleff.effectType = EET_Frozen;
- }
- else
- {
- parent.icefleff.effectType = EET_SlowdownFrost;
- }
- parent.icefleff.creator = thePlayer;
- parent.icefleff.sourceName = thePlayer.GetName();
- parent.icefleff.duration = parent.spadtomes.valueMultiplicative*5;
- parent.victimr.AddEffectCustom(parent.icefleff);
- parent.electra.SetHitAnimationPlayType(EAHA_ForceYes);
- parent.electra.SetProcessBuffsIfNoDamage(true);
- parent.electra.SetForceExplosionDismemberment();
- theGame.damageMgr.ProcessAction( parent.electra );
- delete parent.electra;
- }
- FindGameplayEntitiesInCone(parent.entities, GetWitcherPlayer().GetWorldPosition(), VecHeading(caster.GetPlayer().GetHeadingVector()), 60, 13.5, 100);
- for( parent.z = 0; parent.z < parent.entities.Size(); parent.z += 1 )
- {
- parent.entity = parent.entities[parent.z];
- parent.entity.OnAardHit( NULL );
- }
- }
- else
- {
- //addTomes
- parent.ProcessThrow( false );
- //addTomes
- }
- //addTomes
- player = caster.GetPlayer();
- if( player )
- {
- parent.ManagePlayerStamina();
- parent.ManageGryphonSetBonusBuff();
- //addTomes bloodmoon aard+
- if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('vampire_tome'))
- {
- parent.pos = parent.GetWorldPosition();
- parent.pos.Z -= 0.7;
- parent.testtest = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\bruxa_scream_attack_vamp.w2ent",true),
- parent.pos,thePlayer.GetWorldRotation());
- //parent.testtest.CreateAttachment(thePlayer,'l_hand');
- parent.testtest.PlayEffect( 'cone' );
- //parent.testtest.BreakAttachment();
- parent.testtest.StopAllEffectsAfter(0.5);
- parent.testtest.DestroyAfter(2);
- }
- //addTomes bloodmoon aard-
- }
- else
- {
- caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
- }
- }
- }
- }
- state AardCircleCast in W3AardEntity extends NormalCast
- {
- event OnThrowing()
- {
- var player : CR4Player;
- var cost, stamina : float;
- if( super.OnThrowing() )
- {
- parent.ProcessThrow( true );
- player = caster.GetPlayer();
- if(player == caster.GetActor() && player && player.CanUseSkill(S_Perk_09))
- {
- cost = player.GetStaminaActionCost(ESAT_Ability, SkillEnumToName( parent.skillEnum ), 0);
- stamina = player.GetStat(BCS_Stamina, true);
- if(cost > stamina)
- player.DrainFocus(1);
- else
- caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
- }
- else
- caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement