Advertisement
Guest User

AardEntity

a guest
Jul 21st, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.80 KB | None | 0 0
  1. /***********************************************************************/
  2.  
  3. /** THE WITCHER® is a trademark of CD PROJEKT S. A.
  4. /** The Witcher game is based on the prose of Andrzej Sapkowski.
  5. /***********************************************************************/
  6.  
  7.  
  8.  
  9. struct SAardEffects
  10. {
  11. editable var baseCommonThrowEffect : name;
  12. editable var baseCommonThrowEffectUpgrade1 : name;
  13. editable var baseCommonThrowEffectUpgrade2 : name;
  14. editable var baseCommonThrowEffectUpgrade3 : name;
  15.  
  16. editable var throwEffectSoil : name;
  17. editable var throwEffectSoilUpgrade1 : name;
  18. editable var throwEffectSoilUpgrade2 : name;
  19. editable var throwEffectSoilUpgrade3 : name;
  20.  
  21. editable var throwEffectSPNoUpgrade : name;
  22. editable var throwEffectSPUpgrade1 : name;
  23. editable var throwEffectSPUpgrade2 : name;
  24. editable var throwEffectSPUpgrade3 : name;
  25.  
  26. editable var throwEffectDmgNoUpgrade : name;
  27. editable var throwEffectDmgUpgrade1 : name;
  28. editable var throwEffectDmgUpgrade2 : name;
  29. editable var throwEffectDmgUpgrade3 : name;
  30.  
  31. editable var throwEffectWater : name;
  32. editable var throwEffectWaterUpgrade1 : name;
  33. editable var throwEffectWaterUpgrade2 : name;
  34. editable var throwEffectWaterUpgrade3 : name;
  35.  
  36. editable var cameraShakeStrength : float;
  37. }
  38.  
  39. struct SAardAspect
  40. {
  41. editable var projTemplate : CEntityTemplate;
  42. editable var cone : float;
  43. editable var distance : float;
  44. editable var distanceUpgrade1 : float;
  45. editable var distanceUpgrade2 : float;
  46. editable var distanceUpgrade3 : float;
  47. }
  48.  
  49. statemachine class W3AardEntity extends W3SignEntity
  50. {
  51.  
  52. //addTomes
  53. var aardslowCustomEffect,rootef,poisoneff: SCustomEffectParams; var spadtomes : SAbilityAttributeValue;
  54. 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 >;
  55. var attackRange,attackRange2 : CAIAttackRange; var projectiletest,projectiletest2,projectiletest3 : W3AardProjectile; var test,test2,test3 : CEntity; var pos : Vector;
  56. var spikeTemplate : CEntityTemplate; var spikeEnt : CEntity; var rot : EulerAngles; var pos2, basePos : Vector; var i,j : int; var angle, radius,randRoll,randYaw : float;
  57. var polarAngle, unitAngle : float; var PositionLocal, PositionGlobal,blowpos : Vector; var lines: CEntity; var testtest : CEntity; var electra: W3DamageAction;
  58. var icefleff : SCustomEffectParams; var entities : array<CGameplayEntity>; var entity : CGameplayEntity;
  59. //addTomes
  60.  
  61. editable var aspects : array< SAardAspect >;
  62. editable var effects : array< SAardEffects >;
  63. editable var waterTestOffsetZ : float;
  64. editable var waterTestDistancePerc : float;
  65.  
  66. var projectileCollision : array< name >;
  67.  
  68. default skillEnum = S_Magic_1;
  69. default waterTestOffsetZ = -2;
  70. //VIO+
  71. default waterTestDistancePerc = 0.7;
  72. //VIO-
  73.  
  74. hint waterTestOffsetZ = "Z offset added to Aard Entity when testing for water level";
  75. hint waterTestDistancePerc = "Percentage of sign distance to use along heading for water test";
  76.  
  77. public function GetSignType() : ESignType
  78. {
  79. return ST_Aard;
  80. }
  81.  
  82. event OnStarted()
  83. {
  84. if(IsAlternateCast())
  85. {
  86. //in case of 360 aard don't call super since we don't want any attachment done
  87.  
  88. if((CPlayer)owner.GetActor())
  89. GetWitcherPlayer().FailFundamentalsFirstAchievementCondition();
  90. }
  91. else
  92. {
  93. super.OnStarted();
  94. }
  95.  
  96. projectileCollision.Clear();
  97. projectileCollision.PushBack( 'Projectile' );
  98. projectileCollision.PushBack( 'Door' );
  99. projectileCollision.PushBack( 'Static' );
  100. projectileCollision.PushBack( 'Character' );
  101. 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
  102.  
  103. if ( owner.ChangeAspect( this, S_Magic_s01 ) )
  104. {
  105.  
  106. //addTomes
  107. if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('aardslow_tome'))
  108. { theSound.SoundLoadBank( "qu_ep1_605.bnk", true ); }
  109. if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('neverwinter_tome'))
  110. { theSound.SoundLoadBank( "ep2_mutations_06.bnk", true ); }
  111. if(GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
  112. GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() )
  113. { theSound.SoundLoadBank( "magic_keira.bnk", true ); }
  114. //addTomes
  115.  
  116. CacheActionBuffsFromSkill();
  117. GotoState( 'AardCircleCast' );
  118. }
  119. else
  120. {
  121. //addTomes
  122. if(GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
  123. GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() )
  124. { theSound.SoundLoadBank( "magic_sorceress.bnk", true ); }
  125. if(GetWitcherPlayer().IsItemEquippedByName( 'witch_tome' ) &&
  126. GetWitcherPlayer().GetInventory().GetItemId( 'witch_tome' ) == GetWitcherPlayer().GetSelectedItemId())
  127. {
  128. rootdist = GetDistance();
  129. rootvic = GetWitcherPlayer().GetNPCsAndPlayersInCone(rootdist, VecHeading(GetWitcherPlayer().GetHeadingVector()), 60, 20, , FLAG_Attitude_Hostile + FLAG_OnlyAliveActors);
  130. spadtomes = GetWitcherPlayer().GetTotalSignSpellPower(skillEnum);
  131. thePlayer.SoundEvent("sign_axii_release");
  132. blowpos = GetWorldPosition();
  133. blowpos.Z -= 0.2; //fx\shaders\addtive_standard.w2mg
  134. lines = (CEntity)theGame.CreateEntity( (CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\energytest2.w2ent" ,true ), blowpos, GetWorldRotation() );
  135. lines.CreateAttachment( thePlayer, 'l_weapon' );
  136. lines.DestroyAfter(3);
  137. for( r = 0; r < rootvic.Size(); r += 1 )
  138. {
  139. victimr = (CNewNPC)rootvic[r];
  140.  
  141. lines.PlayEffect('drainenergy2',victimr);
  142.  
  143. roottemp = (CEntityTemplate)LoadResource('archespor_sfx_projectile');
  144. root = theGame.CreateEntity(roottemp,victimr.GetWorldPosition(),victimr.GetWorldRotation());
  145. roots.PushBack( root );
  146. AddTimer('destr',(spadtomes.valueMultiplicative*3)-0.5, , , , true);
  147. rootef.effectType = EET_Immobilized;
  148. rootef.creator = thePlayer;
  149. rootef.sourceName = thePlayer.GetName();
  150. rootef.duration = spadtomes.valueMultiplicative*3;
  151. victimr.AddEffectCustom(rootef);
  152. //theGame.witcherLog.AddMessage("dur: " + spadtomes.valueMultiplicative*3);
  153. if(RandF() <= (spadtomes.valueMultiplicative-1)*0.2 )
  154. {
  155. if(RandF() > 0.5)
  156. {
  157. poisoneff.effectType = EET_Poison;
  158. }
  159. else
  160. {
  161. poisoneff.effectType = EET_Bleeding;
  162. }
  163. }
  164. poisoneff.creator = thePlayer;
  165. poisoneff.sourceName = thePlayer.GetName();
  166. poisoneff.duration = spadtomes.valueMultiplicative*3;
  167. victimr.AddEffectCustom(poisoneff);
  168. victimr.EnablePathEngineAgent(false);
  169. rootvictims.PushBack( victimr );
  170. //AddTimer('destr2',(spadtomes.valueMultiplicative*3)-0.5, , , , true);
  171. AddTimer('destr2',(spadtomes.valueMultiplicative*3)-0.5, , , , true);
  172. }
  173. thePlayer.DrainStamina( ESAT_FixedValue, 99 );
  174. }
  175. else
  176. //addTomes
  177.  
  178. GotoState( 'AardConeCast' );
  179. }
  180. }
  181.  
  182. //addTomes
  183. timer function destr( delta : float , id : int)
  184. { var k:int;
  185.  
  186. for( k=0; k<roots.Size(); k+=1 )
  187. {
  188. roots[k].StopAllEffects();
  189. roots[k].DestroyAfter( 3.f );
  190. }
  191. }
  192. timer function destr2( delta : float , id : int)
  193. { var act:int;
  194. for( act=0; act<rootvictims.Size(); act+=1 )
  195. {
  196. rootvictims[act].EnablePathEngineAgent(true);
  197. }
  198. }
  199. //addTomes
  200.  
  201. event OnAardHit( sign : W3AardProjectile ) {}
  202.  
  203. // HACK: postponing ProcessThrow to MainTick
  204. // We do this to avoid calling StaticTrace during physics fetch - ProcessThrow is triggered by animation event.
  205.  
  206. var processThrow_alternateCast : bool;
  207.  
  208. protected function ProcessThrow( alternateCast : bool )
  209. {
  210. if ( owner.IsPlayer() )
  211. {
  212. // player's ProcessThrow() is already called on MainTick
  213. ProcessThrow_MainTick( alternateCast );
  214. }
  215. else
  216. {
  217. processThrow_alternateCast = alternateCast;
  218. AddTimer( 'ProcessThrowTimer', 0.00000001f, , , TICK_Main );
  219. }
  220. }
  221.  
  222. timer function ProcessThrowTimer( dt : float, id : int )
  223. {
  224. ProcessThrow_MainTick( processThrow_alternateCast );
  225. }
  226.  
  227. // HACK ends here
  228.  
  229. public final function GetDistance() : float
  230. {
  231.  
  232. //if ( owner.CanUseSkill( S_Magic_s20 ) ) //addTomes
  233. if ( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  234. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId())) //addTomes
  235. {
  236.  
  237. //addTomes
  238. if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  239. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
  240. {
  241. return aspects[ fireMode ].distanceUpgrade3;
  242. }
  243. else
  244. {
  245. //addTomes
  246. switch( owner.GetSkillLevel( S_Magic_s20 ) )
  247. {
  248. case 1 : return aspects[ fireMode ].distanceUpgrade1;
  249. case 2 : return aspects[ fireMode ].distanceUpgrade2;
  250. case 3 : return aspects[ fireMode ].distanceUpgrade3;
  251. }
  252. //addTomes
  253. }
  254. //addTomes
  255. }
  256.  
  257. return aspects[ fireMode ].distance;
  258. }
  259.  
  260. protected function ProcessThrow_MainTick( alternateCast : bool )
  261. {
  262. var projectile : W3AardProjectile;
  263. var spawnPos, collisionPos, collisionNormal, waterCollTestPos : Vector;
  264. var spawnRot : EulerAngles;
  265. var heading : Vector;
  266. var distance, waterZ, staminaDrain : float;
  267. var ownerActor : CActor;
  268. var dispersionLevel : int;
  269. var attackRange : CAIAttackRange;
  270. var movingAgent : CMovingPhysicalAgentComponent;
  271. var hitsWater : bool;
  272. var collisionGroupNames : array<name>;
  273.  
  274. ownerActor = owner.GetActor();
  275.  
  276.  
  277. if ( owner.IsPlayer() )
  278. {
  279. GCameraShake(effects[fireMode].cameraShakeStrength, true, this.GetWorldPosition(), 30.0f);
  280. }
  281.  
  282.  
  283. distance = GetDistance();
  284.  
  285. if ( owner.HasCustomAttackRange() )
  286. {
  287. attackRange = theGame.GetAttackRangeForEntity( this, owner.GetCustomAttackRange() );
  288. }
  289. //else if( owner.CanUseSkill( S_Magic_s20 ) ) //addTomes
  290. else if( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  291. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId())) //addTomes
  292. {
  293.  
  294. dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
  295.  
  296. //addTomes
  297. if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  298. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
  299. {
  300. dispersionLevel = 3;
  301. }
  302. //addTomes
  303.  
  304. if(dispersionLevel == 1)
  305. {
  306. if ( !alternateCast )
  307. attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade1' );
  308. else
  309. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
  310. }
  311. else if(dispersionLevel == 2)
  312. {
  313. if ( !alternateCast )
  314. attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade2' );
  315. else
  316. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade2' );
  317. }
  318. else if(dispersionLevel == 3)
  319. {
  320. if ( !alternateCast )
  321. attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade3' );
  322. else
  323. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade3' );
  324. }
  325. }
  326. else
  327. {
  328. if ( !alternateCast )
  329. attackRange = theGame.GetAttackRangeForEntity( this, 'cone' );
  330. else
  331. attackRange = theGame.GetAttackRangeForEntity( this, 'blast' );
  332. }
  333.  
  334.  
  335. spawnPos = GetWorldPosition();
  336. spawnRot = GetWorldRotation();
  337. heading = this.GetHeadingVector();
  338.  
  339.  
  340.  
  341.  
  342. if ( alternateCast )
  343. {
  344. spawnPos.Z -= 0.5;
  345.  
  346. //addTomes
  347. if(GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
  348. GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() && thePlayer.GetStat( BCS_Focus )>=1
  349. projectile = (W3AardProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos - heading * 0.8, spawnRot );
  350. && thePlayer.GetStat( BCS_Stamina )>=99
  351. )
  352. {
  353. pos = GetWorldPosition();rot = thePlayer.GetWorldRotation();
  354. pos += GetWitcherPlayer().GetHeadingVector();
  355. randYaw = RandRangeF( 180.0, -180.0 );
  356. rot.Yaw = randYaw;
  357. test = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_electro.w2ent",true),pos,rot);
  358. test.PlayEffect( 'blast_lv1' );
  359. test.PlayEffect( 'blast_lv1_damage' );// test.PlayEffect( 'blast_lv1_damage' );// blast
  360. test.PlayEffect( 'cone_ground_mutation_6' );
  361. test.PlayEffect( 'blast_lv3' );
  362. //rot = thePlayer.GetWorldRotation();
  363. rot.Yaw += 45.f;
  364. test2 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_electro.w2ent",true),pos,rot);
  365. test2.PlayEffect( 'blast_lv3' );
  366. thePlayer.SoundEvent('magic_keira_lightning');
  367. thePlayer.PlayEffectOnBone( 'yrden_shock', 'l_hand' );
  368. thePlayer.PlayEffect('mutation_1_yrden_power');
  369. test.DestroyAfter(10);
  370. test2.DestroyAfter(10);
  371. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
  372. distance = 9;
  373.  
  374. thePlayer.DrainStamina( ESAT_FixedValue, 99 );
  375. thePlayer.DrainFocus(0.99);
  376. FactsAdd("electroblast",,1);
  377. //theGame.witcherLog.AddMessage("electroblast " );
  378. }
  379. else if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('fire2_tome') && thePlayer.GetStat( BCS_Focus )>=1
  380. && thePlayer.GetStat( BCS_Stamina )>=99
  381. )
  382. {
  383. pos = GetWorldPosition();
  384. pos += GetWitcherPlayer().GetHeadingVector();pos.Z +=0.25;
  385. test2 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_quileg.w2ent",true), pos, GetWorldRotation());
  386. test2.PlayEffect( 'blast_cutscene' );
  387. test2.PlayEffect( 'blast_lv0' );
  388. test2.PlayEffect( 'blast_ground' );
  389. thePlayer.SoundEvent('sign_igni_charge_begin');
  390. thePlayer.SoundEvent('sign_igni_charge_begin');
  391. thePlayer.PlayEffect('mutation_1_igni_power');
  392. test2.DestroyAfter(10);
  393. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
  394. distance = 9;
  395. theGame.GetSurfacePostFX().AddSurfacePostFXGroup(GetWorldPosition(), 0.1f, 7.f, 2.f, 10, 1 );
  396. thePlayer.DrainStamina( ESAT_FixedValue, 99 );
  397. thePlayer.DrainFocus(0.99);
  398. FactsAdd("quilegblast",,1);
  399. //theGame.witcherLog.AddMessage("quilegblast " );
  400. }
  401. else if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('neverwinter_tome') && thePlayer.GetStat( BCS_Focus )>=1
  402. && thePlayer.GetStat( BCS_Stamina )>=99
  403. )
  404. {
  405. pos = GetWorldPosition();
  406. pos += GetWitcherPlayer().GetHeadingVector();pos.Z +=0.25;
  407. test3 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_frost.w2ent",true), pos, GetWorldRotation());
  408. //test3.PlayEffect( 'blast_cutscene' );
  409. //test3.PlayEffect( 'blast_ground' ); fx\textures\smoke\smoke_02.xbm
  410. test3.PlayEffect( 'blast_ground1' );
  411. test3.PlayEffect( 'blast_lv0' );
  412. test3.PlayEffect( 'cone_ground_mutation_6' );
  413.  
  414. test3.DestroyAfter(10);
  415.  
  416. thePlayer.SoundEvent('ep2_mutations_06_frosty_aard');
  417. thePlayer.PlayEffect( 'mutation_6_power' );
  418.  
  419. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
  420. distance = 9;
  421.  
  422. theGame.GetSurfacePostFX().AddSurfacePostFXGroup(GetWorldPosition(), 0.1f, 7.f, 2.f, 10, 0 );
  423.  
  424. basePos = GetWorldPosition();
  425. rot.Pitch = 0.f;
  426. rot.Roll = 0.f;
  427. rot.Yaw = 0.f;
  428.  
  429. spikeEnt = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\ice_spikes_large.w2ent", true ), TraceFloor(basePos), rot );
  430. spikeEnt.StopAllEffects();
  431. spikeEnt.DestroyAfter( 15.f );
  432.  
  433. unitAngle = 2 * Pi() / 10;
  434. for( j=0; j<10; j+=1 )
  435. {
  436. polarAngle = unitAngle * j;
  437.  
  438. PositionLocal.X = 4.5 * CosF( polarAngle );
  439. PositionLocal.Y = 4.5 * SinF( polarAngle );
  440. PositionLocal.Z = 0.f;
  441.  
  442. PositionGlobal = basePos + PositionLocal;
  443. spikeEnt = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\ice_spikes_large.w2ent", true ), TraceFloor( PositionGlobal ), rot );
  444. spikeEnt.StopAllEffects();
  445. spikeEnt.DestroyAfter( 15.f );
  446. }
  447.  
  448. thePlayer.DrainStamina( ESAT_FixedValue, 99 );
  449. thePlayer.DrainFocus(0.99);
  450. FactsAdd("neverwinterblast",,1);
  451. //theGame.witcherLog.AddMessage("neverwinterblast " );
  452. }
  453. else if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('aardslow_tome'))
  454. {
  455. aardslowCustomEffect.effectType = EET_Aardslow;
  456. aardslowCustomEffect.creator = ((W3PlayerWitcher)thePlayer);
  457. aardslowCustomEffect.duration = 11;
  458. ((W3PlayerWitcher)thePlayer).AddEffectCustom(aardslowCustomEffect);
  459. if(thePlayer.GetStat( BCS_Focus )>2.0f)
  460. {
  461. thePlayer.DrainFocus(2); FactsAdd("aardslow",,2);
  462.  
  463. pos = GetWorldPosition();
  464. pos += GetWitcherPlayer().GetHeadingVector();
  465. test2 = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\pc_aard_slow.w2ent",true), pos, GetWorldRotation());
  466.  
  467. if ( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  468. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()) )
  469. {
  470. dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
  471.  
  472. //addTomes
  473. if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  474. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
  475. { dispersionLevel = 3; }
  476.  
  477. if(dispersionLevel == 1)
  478. { test2.PlayEffect( 'blast_lv1' );}
  479. else if(dispersionLevel == 2)
  480. { test2.PlayEffect( 'blast_lv2' );}
  481. else if(dispersionLevel == 3)
  482. { test2.PlayEffect( 'blast_lv3' );}
  483. }
  484. else test2.PlayEffect( 'blast_lv0' );
  485.  
  486. thePlayer.SoundEvent("qu_605_time_freeze_bkg"); //sign_aard_blast
  487. }
  488. }
  489. //addTomes
  490.  
  491. projectile = (W3AardProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos - heading * 0.7, spawnRot );
  492. projectile.ExtInit( owner, skillEnum, this );
  493. projectile.SetAttackRange( attackRange );
  494. projectile.SphereOverlapTest( distance, projectileCollision );
  495.  
  496. }
  497. else
  498. {
  499. spawnPos -= 0.7 * heading;
  500.  
  501. projectile = (W3AardProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos, spawnRot );
  502. projectile.ExtInit( owner, skillEnum, this );
  503. projectile.SetAttackRange( attackRange );
  504.  
  505. //VIO+
  506. projectile.ShootCakeProjectileAtPosition( aspects[fireMode].cone, 4.5f, 0.0f, 30.0f, spawnPos + heading * distance, distance, projectileCollision );
  507. //VIO-
  508. }
  509.  
  510. if(ownerActor.HasAbility('Glyphword 6 _Stats', true))
  511. {
  512. staminaDrain = CalculateAttributeValue(ownerActor.GetAttributeValue('glyphword6_stamina_drain_perc'));
  513. projectile.SetStaminaDrainPerc(staminaDrain);
  514. }
  515.  
  516. //addTomes
  517. if ( GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('vampire_tome') && !alternateCast )
  518. { projectile.SetStaminaDrainPerc(0.75); }
  519. //addTomes
  520.  
  521. if(alternateCast)
  522. {
  523. movingAgent = (CMovingPhysicalAgentComponent)ownerActor.GetMovingAgentComponent();
  524. hitsWater = movingAgent.GetSubmergeDepth() < 0;
  525. }
  526. else
  527. {
  528. waterCollTestPos = GetWorldPosition() + heading * distance * waterTestDistancePerc;
  529. waterCollTestPos.Z += waterTestOffsetZ;
  530. collisionGroupNames.PushBack('Terrain');
  531.  
  532.  
  533. //water Z
  534. waterZ = theGame.GetWorld().GetWaterLevel(waterCollTestPos, true);
  535.  
  536. //terrain collision
  537. if(theGame.GetWorld().StaticTrace(GetWorldPosition(), waterCollTestPos, collisionPos, collisionNormal, collisionGroupNames))
  538. {
  539. //if water level is the highest of all
  540. if(waterZ > collisionPos.Z && waterZ > waterCollTestPos.Z)
  541. hitsWater = true;
  542. else
  543. hitsWater = false;
  544. }
  545. else
  546. {
  547. //no terrain - just water level check
  548. hitsWater = (waterCollTestPos.Z <= waterZ);
  549. }
  550. }
  551. //VIO+
  552. PlayAardFX(hitsWater);
  553. PlayAardFX(hitsWater);
  554. if (FactsQuerySum( "neverwinterblast" ) <= 0 && FactsQuerySum( "quilegblast" ) <= 0
  555. && FactsQuerySum( "electroblast" ) <= 0 && FactsQuerySum( "aardelectra" ) <= 0 && FactsQuerySum( "aardslow" ) <= 0)
  556. && FactsQuerySum( "electroblast" ) <= 0 && FactsQuerySum( "aardelectra" ) <= 0 && FactsQuerySum( "aardslow" ) <= 0}
  557.  
  558. //addTomes
  559.  
  560. PlayAardFX(hitsWater);
  561. //PlayAardFX(hitsWater);
  562. ownerActor.OnSignCastPerformed(ST_Aard, alternateCast);
  563. AddTimer('DelayedDestroyTimer', 0.1, true, , , true);
  564.  
  565.  
  566. //plays aard fx
  567. public final function PlayAardFX(hitsWater : bool)
  568. {
  569. var dispersionLevel : int;
  570. var hasMutation6 : bool;
  571.  
  572. //addTomes
  573. if((GetWitcherPlayer().IsItemEquippedByName( 'permafrost_tome' ) &&
  574. GetWitcherPlayer().GetInventory().GetItemId( 'permafrost_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
  575. {hasMutation6 = true;}
  576. else
  577. {//addTomes
  578.  
  579. hasMutation6 = owner.GetPlayer().IsMutationActive(EPMT_Mutation6);
  580.  
  581. //addTomes
  582. }
  583. //if ( owner.CanUseSkill( S_Magic_s20 ) ) //addTomes
  584. if ( owner.CanUseSkill( S_Magic_s20 ) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  585. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()) ) //addTomes
  586. {
  587. dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
  588.  
  589. //addTomes
  590. if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  591. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
  592. {
  593. dispersionLevel = 3;
  594. }
  595. //addTomes
  596.  
  597. if(dispersionLevel == 1)
  598. {
  599. //base
  600. PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade1 );
  601.  
  602. //terrain specific
  603. if(!hasMutation6)
  604. {
  605. if(hitsWater)
  606. PlayEffect( effects[fireMode].throwEffectWaterUpgrade1 );
  607. else
  608. PlayEffect( effects[fireMode].throwEffectSoilUpgrade1 );
  609. }
  610. }
  611. else if(dispersionLevel == 2)
  612. {
  613. //base
  614. PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade2 );
  615.  
  616. //terrain specific
  617. if(!hasMutation6)
  618. {
  619. if(hitsWater)
  620. PlayEffect( effects[fireMode].throwEffectWaterUpgrade2 );
  621. else
  622. PlayEffect( effects[fireMode].throwEffectSoilUpgrade2 );
  623. }
  624. }
  625. else if(dispersionLevel == 3)
  626. {
  627. //base
  628. PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade3 );
  629.  
  630. //terrain specific
  631. if(!hasMutation6)
  632. {
  633. if(hitsWater)
  634. PlayEffect( effects[fireMode].throwEffectWaterUpgrade3 );
  635. else
  636. PlayEffect( effects[fireMode].throwEffectSoilUpgrade3 );
  637. }
  638. }
  639. }
  640. else
  641. {
  642. //base
  643. PlayEffect( effects[fireMode].baseCommonThrowEffect );
  644.  
  645. //terrain specific
  646. if(!hasMutation6)
  647. {
  648. if(hitsWater)
  649. PlayEffect( effects[fireMode].throwEffectWater );
  650. else
  651. PlayEffect( effects[fireMode].throwEffectSoil );
  652. }
  653. }
  654.  
  655. //bonus sp fx
  656. if(owner.CanUseSkill(S_Magic_s12))
  657. {
  658. //different fx based on what is the current range of aard
  659. switch(dispersionLevel)
  660. {
  661. case 0:
  662. PlayEffect( effects[fireMode].throwEffectSPNoUpgrade );
  663. break;
  664. case 1:
  665. PlayEffect( effects[fireMode].throwEffectSPUpgrade1 );
  666. break;
  667. case 2:
  668. PlayEffect( effects[fireMode].throwEffectSPUpgrade2 );
  669. break;
  670. case 3:
  671. PlayEffect( effects[fireMode].throwEffectSPUpgrade3 );
  672. break;
  673. }
  674. }
  675.  
  676. //bonus dmg fx
  677. if(owner.CanUseSkill(S_Magic_s06))
  678. {
  679. //different fx based on what is the current range of aard
  680. switch(dispersionLevel)
  681. {
  682. case 0:
  683. PlayEffect( effects[fireMode].throwEffectDmgNoUpgrade );
  684. break;
  685. case 1:
  686. PlayEffect( effects[fireMode].throwEffectDmgUpgrade1 );
  687. break;
  688. case 2:
  689. PlayEffect( effects[fireMode].throwEffectDmgUpgrade2 );
  690. break;
  691. case 3:
  692. PlayEffect( effects[fireMode].throwEffectDmgUpgrade3 );
  693. break;
  694. }
  695. }
  696.  
  697. //mutation 6 bonus cast blast fx
  698. if( hasMutation6 )
  699. {
  700. thePlayer.PlayEffect( 'mutation_6_power' );
  701.  
  702. if( fireMode == 0 )
  703. {
  704. PlayEffect( 'cone_ground_mutation_6' );
  705. }
  706. else
  707. {
  708. PlayEffect( 'blast_ground_mutation_6' );
  709.  
  710. theGame.GetSurfacePostFX().AddSurfacePostFXGroup(GetWorldPosition(), 0.3f, 3.f, 2.f, GetDistance(), 0 );
  711. }
  712. }
  713. }
  714.  
  715. timer function DelayedDestroyTimer(dt : float, id : int)
  716. {
  717. var active : bool;
  718.  
  719. //if(owner.CanUseSkill(S_Magic_s20)) //addTomes
  720. if(owner.CanUseSkill(S_Magic_s20) || (GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  721. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId())) //addTomes
  722. {
  723.  
  724. //addTomes
  725. if ((GetWitcherPlayer().IsItemEquippedByName( 'distance_tome' ) &&
  726. GetWitcherPlayer().GetInventory().GetItemId( 'distance_tome' ) == GetWitcherPlayer().GetSelectedItemId()))
  727. {
  728. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade3 );
  729. }
  730. else
  731. {
  732. //addTomes
  733. switch(owner.GetSkillLevel(S_Magic_s20))
  734. {
  735. case 1 :
  736. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade1 );
  737. break;
  738. case 2 :
  739. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade2 );
  740. break;
  741. case 3 :
  742. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade3 );
  743. break;
  744. default :
  745. LogAssert(false, "W3AardEntity.DelayedDestroyTimer: S_Magic_s20 skill level out of bounds!");
  746. }
  747. //addTomes
  748. }
  749. //addTomes
  750. }
  751. else
  752. {
  753. active = IsEffectActive( effects[fireMode].baseCommonThrowEffect );
  754. }
  755.  
  756. if(!active)
  757. Destroy();
  758. }
  759.  
  760.  
  761. state AardConeCast in W3AardEntity extends NormalCast
  762. {
  763. event OnThrowing()
  764. {
  765. var player : CR4Player;
  766.  
  767. if( super.OnThrowing() )
  768. {
  769.  
  770. //addTomes
  771. if(caster.GetPlayer() && GetWitcherPlayer().IsItemEquippedByName( 'elaxii_tome' ) &&
  772. GetWitcherPlayer().GetInventory().GetItemId( 'elaxii_tome' ) == GetWitcherPlayer().GetSelectedItemId() && thePlayer.GetStat( BCS_Focus )>=1
  773. )
  774. {
  775. parent.pos = parent.GetWorldPosition();
  776. parent.rot = parent.GetWorldRotation();
  777. parent.randRoll = RandRangeF( 180.0, -180.0 );
  778. parent.rot.Roll = parent.randRoll;
  779. parent.testtest = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\bruxa_electra.w2ent",true),
  780. parent.pos,parent.rot);
  781. parent.testtest.CreateAttachment(thePlayer,'l_hand');
  782. parent.testtest.PlayEffect( 'fx_push' );
  783. parent.testtest.PlayEffect( 'fx_push0' );
  784. parent.testtest.BreakAttachment();
  785. thePlayer.PlayEffect('mutation_1_yrden_power');
  786. thePlayer.SoundEvent("sign_yrden_shock_activate");
  787.  
  788. thePlayer.SoundEvent("magic_sorceress_vfx_lightning_bolt");
  789. FactsAdd("aardelectra",,1);
  790. parent.testtest.DestroyAfter(2);
  791.  
  792. parent.rootvic = GetWitcherPlayer().GetNPCsAndPlayersInCone(13.5, VecHeading(caster.GetPlayer().GetHeadingVector()), 80, 200, , FLAG_Attitude_Hostile + FLAG_OnlyAliveActors);
  793. parent.spadtomes = GetWitcherPlayer().GetTotalSignSpellPower(parent.skillEnum);
  794. for( parent.r = 0; parent.r < parent.rootvic.Size(); parent.r += 1 )
  795. {
  796. parent.victimr = (CNewNPC)parent.rootvic[parent.r];
  797. parent.electra = new W3DamageAction in this;
  798. parent.electra.Initialize(thePlayer,parent.victimr,this,thePlayer.GetName()+"_sign",EHRT_Heavy,CPS_Undefined,false, false, true, false );
  799. parent.spadtomes = thePlayer.GetTotalSignSpellPower(parent.skillEnum);
  800. parent.electradmg = thePlayer.GetLevel()*13;
  801. parent.electradmg += parent.electradmg*((parent.spadtomes.valueMultiplicative-1)*0.4);
  802. if( !parent.victimr.IsHuman() && !parent.victimr.IsAnimal() )
  803. { parent.electradmg *= 1.6; }
  804. parent.electra.AddDamage( theGame.params.DAMAGE_NAME_DIRECT, parent.electradmg );
  805. parent.electra.AddEffectInfo( EET_Stagger );
  806. parent.electra.SetHitAnimationPlayType(EAHA_ForceYes);
  807. parent.electra.SetProcessBuffsIfNoDamage(true);
  808. parent.electra.SetForceExplosionDismemberment();
  809. theGame.damageMgr.ProcessAction( parent.electra );
  810. delete parent.electra;
  811. parent.victimr.PlayEffect('yrden_shock');
  812. }
  813.  
  814. }
  815. else if(caster.GetPlayer() && GetWitcherPlayer().IsItemEquippedByName( 'permafrost_tome' ) &&
  816. GetWitcherPlayer().GetInventory().GetItemId( 'permafrost_tome' ) == GetWitcherPlayer().GetSelectedItemId() && thePlayer.GetStat( BCS_Focus )>=1
  817. )
  818. {
  819. theSound.SoundLoadBank( "ep2_mutations_06.bnk", true );
  820. parent.testtest = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\bruxa_scream_attack_winter.w2ent",true ), GetWitcherPlayer().GetWorldPosition(),GetWitcherPlayer().GetWorldRotation() );
  821. parent.testtest.CreateAttachment(thePlayer,'l_hand');
  822. parent.testtest.PlayEffect( 'fx_push' );
  823. parent.pos = parent.GetWorldPosition()-GetWitcherPlayer().GetHeadingVector()*4;
  824. parent.pos.Z+=0.15;
  825. parent.testtest = theGame.CreateEntity( (CEntityTemplate) LoadResource( "dlc\adtomes\poisonyrden\bruxa_scream_attack_winter.w2ent",true ),
  826. parent.pos,GetWitcherPlayer().GetWorldRotation() );
  827. parent.testtest.CreateAttachment(thePlayer,'l_hand');
  828. parent.testtest.PlayEffect( 'fx_push0' );
  829.  
  830. for( parent.i = 4; parent.i <= 14; parent.i += 2 )
  831. { theGame.GetSurfacePostFX().AddSurfacePostFXGroup(parent.GetWorldPosition()+GetWitcherPlayer().GetHeadingVector()*parent.i, 0.1f+parent.i*0.05, 5.f, 2.f, 20, 0 ); }
  832.  
  833. parent.testtest.BreakAttachment();
  834. thePlayer.PlayEffect('mutation_6_power');
  835. thePlayer.SoundEvent("sign_aard_blast");
  836.  
  837. FactsAdd("winterbreath",,1);
  838. parent.testtest.DestroyAfter(2);
  839.  
  840. parent.rootvic = GetWitcherPlayer().GetNPCsAndPlayersInCone(13.5, VecHeading(caster.GetPlayer().GetHeadingVector()), 60, 200, , FLAG_Attitude_Hostile + FLAG_OnlyAliveActors);
  841. parent.spadtomes = GetWitcherPlayer().GetTotalSignSpellPower(parent.skillEnum);
  842. for( parent.r = 0; parent.r < parent.rootvic.Size(); parent.r += 1 )
  843. {
  844. parent.victimr = (CNewNPC)parent.rootvic[parent.r];
  845. parent.electra = new W3DamageAction in this;
  846. parent.electra.Initialize(thePlayer,parent.victimr,this,thePlayer.GetName()+"_sign",EHRT_Heavy,CPS_Undefined,false, false, true, false );
  847. parent.spadtomes = thePlayer.GetTotalSignSpellPower(parent.skillEnum);
  848. parent.electradmg = thePlayer.GetLevel()*8;
  849. parent.electradmg += parent.electradmg*((parent.spadtomes.valueMultiplicative-1)*0.4);
  850. if( !parent.victimr.IsHuman() && !parent.victimr.IsAnimal() )
  851. { parent.electradmg *= 1.6; }
  852. parent.electra.AddDamage( theGame.params.DAMAGE_NAME_FROST, parent.electradmg );
  853. parent.electra.AddEffectInfo( EET_Stagger );
  854.  
  855. if( RandF() <= (parent.spadtomes.valueMultiplicative-1)*0.5)
  856. {
  857. parent.icefleff.effectType = EET_Frozen;
  858. }
  859. else
  860. {
  861. parent.icefleff.effectType = EET_SlowdownFrost;
  862. }
  863. parent.icefleff.creator = thePlayer;
  864. parent.icefleff.sourceName = thePlayer.GetName();
  865. parent.icefleff.duration = parent.spadtomes.valueMultiplicative*5;
  866. parent.victimr.AddEffectCustom(parent.icefleff);
  867.  
  868. parent.electra.SetHitAnimationPlayType(EAHA_ForceYes);
  869. parent.electra.SetProcessBuffsIfNoDamage(true);
  870. parent.electra.SetForceExplosionDismemberment();
  871.  
  872. theGame.damageMgr.ProcessAction( parent.electra );
  873. delete parent.electra;
  874. }
  875.  
  876. FindGameplayEntitiesInCone(parent.entities, GetWitcherPlayer().GetWorldPosition(), VecHeading(caster.GetPlayer().GetHeadingVector()), 60, 13.5, 100);
  877. for( parent.z = 0; parent.z < parent.entities.Size(); parent.z += 1 )
  878. {
  879. parent.entity = parent.entities[parent.z];
  880. parent.entity.OnAardHit( NULL );
  881. }
  882. }
  883. else
  884. {
  885. //addTomes
  886.  
  887. parent.ProcessThrow( false );
  888.  
  889. //addTomes
  890. }
  891. //addTomes
  892.  
  893. player = caster.GetPlayer();
  894.  
  895. if( player )
  896. {
  897. parent.ManagePlayerStamina();
  898. parent.ManageGryphonSetBonusBuff();
  899.  
  900. //addTomes bloodmoon aard+
  901. if(GetWitcherPlayer().GetHorseManager().IsItemEquippedByName('vampire_tome'))
  902. {
  903. parent.pos = parent.GetWorldPosition();
  904. parent.pos.Z -= 0.7;
  905. parent.testtest = theGame.CreateEntity((CEntityTemplate)LoadResource("dlc\adtomes\poisonyrden\bruxa_scream_attack_vamp.w2ent",true),
  906. parent.pos,thePlayer.GetWorldRotation());
  907. //parent.testtest.CreateAttachment(thePlayer,'l_hand');
  908. parent.testtest.PlayEffect( 'cone' );
  909. //parent.testtest.BreakAttachment();
  910. parent.testtest.StopAllEffectsAfter(0.5);
  911. parent.testtest.DestroyAfter(2);
  912. }
  913. //addTomes bloodmoon aard-
  914.  
  915. }
  916. else
  917. {
  918. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  919. }
  920. }
  921. }
  922. }
  923.  
  924. state AardCircleCast in W3AardEntity extends NormalCast
  925. {
  926. event OnThrowing()
  927. {
  928. var player : CR4Player;
  929. var cost, stamina : float;
  930.  
  931. if( super.OnThrowing() )
  932. {
  933. parent.ProcessThrow( true );
  934.  
  935. player = caster.GetPlayer();
  936. if(player == caster.GetActor() && player && player.CanUseSkill(S_Perk_09))
  937. {
  938. cost = player.GetStaminaActionCost(ESAT_Ability, SkillEnumToName( parent.skillEnum ), 0);
  939. stamina = player.GetStat(BCS_Stamina, true);
  940.  
  941. if(cost > stamina)
  942. player.DrainFocus(1);
  943. else
  944. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  945. }
  946. else
  947. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  948. }
  949. }
  950. }
  951. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement