Hird194

Unexpected end of file before comment at line '8' was closed

Oct 23rd, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.19 KB | None | 0 0
  1. /*
  2. /** © 2015 CD PROJEKT S.A. All rights reserved.
  3. /** THE WITCHER® is a trademark of CD PROJEKT S. A.
  4. /** The Witcher game is based on the prose of Andrzej Sapkowski.
  5. Copyright © CD Projekt RED 2015
  6. */
  7.  
  8. /** Copyright © 2012-2013 Patryk Fiutowski, Tomek Kozera
  9.  
  10. struct SAardEffects
  11. {
  12. editable var baseCommonThrowEffect : name;
  13. editable var baseCommonThrowEffectUpgrade1 : name;
  14. editable var baseCommonThrowEffectUpgrade2 : name;
  15. editable var baseCommonThrowEffectUpgrade3 : name;
  16.  
  17. editable var throwEffectSoil : name;
  18. editable var throwEffectSoilUpgrade1 : name;
  19. editable var throwEffectSoilUpgrade2 : name;
  20. editable var throwEffectSoilUpgrade3 : name;
  21.  
  22. editable var throwEffectSPNoUpgrade : name;
  23. editable var throwEffectSPUpgrade1 : name;
  24. editable var throwEffectSPUpgrade2 : name;
  25. editable var throwEffectSPUpgrade3 : name;
  26.  
  27. editable var throwEffectDmgNoUpgrade : name;
  28. editable var throwEffectDmgUpgrade1 : name;
  29. editable var throwEffectDmgUpgrade2 : name;
  30. editable var throwEffectDmgUpgrade3 : name;
  31.  
  32. editable var throwEffectWater : name;
  33. editable var throwEffectWaterUpgrade1 : name;
  34. editable var throwEffectWaterUpgrade2 : name;
  35. editable var throwEffectWaterUpgrade3 : name;
  36.  
  37. editable var cameraShakeStrength : float;
  38. }
  39.  
  40. struct SAardAspect
  41. {
  42. editable var projTemplate : CEntityTemplate;
  43. editable var cone : float;
  44. editable var distance : float;
  45. editable var distanceUpgrade1 : float;
  46. editable var distanceUpgrade2 : float;
  47. editable var distanceUpgrade3 : float;
  48. }
  49.  
  50. statemachine class W3AardEntity extends W3SignEntity
  51. {
  52. editable var aspects : array< SAardAspect >;
  53. editable var effects : array< SAardEffects >;
  54. editable var waterTestOffsetZ : float;
  55. editable var waterTestDistancePerc : float;
  56.  
  57. var projectileCollision : array< name >;
  58.  
  59. default skillEnum = S_Magic_1;
  60. default waterTestOffsetZ = -2;
  61. default waterTestDistancePerc = 0.7;
  62.  
  63. hint waterTestOffsetZ = "Z offset added to Aard Entity when testing for water level";
  64. hint waterTestDistancePerc = "Percentage of sign distance to use along heading for water test";
  65.  
  66. public function GetSignType() : ESignType
  67. {
  68. return ST_Aard;
  69. }
  70.  
  71. event OnStarted()
  72. {
  73. if(IsAlternateCast())
  74. {
  75. //in case of 360 aard don't call super since we don't want any attachment done
  76.  
  77. if((CPlayer)owner.GetActor())
  78. GetWitcherPlayer().FailFundamentalsFirstAchievementCondition();
  79. }
  80. else
  81. {
  82. super.OnStarted();
  83. }
  84.  
  85. projectileCollision.Clear();
  86. projectileCollision.PushBack( 'Projectile' );
  87. projectileCollision.PushBack( 'Door' );
  88. projectileCollision.PushBack( 'Static' );
  89. projectileCollision.PushBack( 'Character' );
  90. 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
  91.  
  92. if ( owner.ChangeAspect( this, S_Magic_s01 ) )
  93. {
  94. CacheActionBuffsFromSkill();
  95. GotoState( 'AardCircleCast' );
  96. }
  97. else
  98. {
  99. GotoState( 'AardConeCast' );
  100. }
  101. }
  102.  
  103. //ignore
  104. event OnAardHit( sign : W3AardProjectile ) {}
  105.  
  106. // HACK: postponing ProcessThrow to MainTick
  107. // We do this to avoid calling StaticTrace during physics fetch - ProcessThrow is triggered by animation event.
  108.  
  109. var processThrow_alternateCast : bool;
  110.  
  111. protected function ProcessThrow( alternateCast : bool )
  112. {
  113. if ( owner.IsPlayer() )
  114. {
  115. // player's ProcessThrow() is already called on MainTick
  116. ProcessThrow_MainTick( alternateCast );
  117. }
  118. else
  119. {
  120. processThrow_alternateCast = alternateCast;
  121. AddTimer( 'ProcessThrowTimer', 0.00000001f, , , TICK_Main );
  122. }
  123. }
  124.  
  125. timer function ProcessThrowTimer( dt : float, id : int )
  126. {
  127. ProcessThrow_MainTick( processThrow_alternateCast );
  128. }
  129.  
  130. // HACK ends here
  131.  
  132. protected function ProcessThrow_MainTick( alternateCast : bool )
  133. {
  134. var projectile : W3SignProjectile;
  135. var spawnPos, collisionPos, collisionNormal, waterCollTestPos : Vector;
  136. var spawnRot : EulerAngles;
  137. var heading : Vector;
  138. var distance, waterZ : float;
  139. var ownerActor : CActor;
  140. var dispersionLevel : int;
  141. var attackRange : CAIAttackRange;
  142. var movingAgent : CMovingPhysicalAgentComponent;
  143. var hitsWater : bool;
  144. var collisionGroupNames : array<name>;
  145.  
  146. ownerActor = owner.GetActor();
  147.  
  148. if ( owner.IsPlayer() )
  149. {
  150. GCameraShake(effects[fireMode].cameraShakeStrength, true, this.GetWorldPosition(), 30.0f);
  151. }
  152.  
  153. //set distance
  154. if ( owner.CanUseSkill( S_Magic_s20 ) )
  155. {
  156. switch(owner.GetSkillLevel(S_Magic_s20))
  157. {
  158. case 1 :
  159. distance = aspects[fireMode].distanceUpgrade1;
  160. break;
  161. case 2 :
  162. distance = aspects[fireMode].distanceUpgrade2;
  163. break;
  164. case 3 :
  165. distance = aspects[fireMode].distanceUpgrade3;
  166. break;
  167. default :
  168. LogAssert(false, "W3AardEntity.ProcessThrow: S_Magic_s20 skill level out of bounds!");
  169. }
  170. }
  171. else
  172. {
  173. distance = aspects[fireMode].distance;
  174. }
  175.  
  176. if ( owner.HasCustomAttackRange() )
  177. {
  178. attackRange = theGame.GetAttackRangeForEntity( this, owner.GetCustomAttackRange() );
  179. }
  180. else if( owner.CanUseSkill( S_Magic_s20 ) )
  181. {
  182. dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
  183.  
  184. if(dispersionLevel == 1)
  185. {
  186. if ( !alternateCast )
  187. attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade1' );
  188. else
  189. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade1' );
  190. }
  191. else if(dispersionLevel == 2)
  192. {
  193. if ( !alternateCast )
  194. attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade2' );
  195. else
  196. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade2' );
  197. }
  198. else if(dispersionLevel == 3)
  199. {
  200. if ( !alternateCast )
  201. attackRange = theGame.GetAttackRangeForEntity( this, 'cone_upgrade3' );
  202. else
  203. attackRange = theGame.GetAttackRangeForEntity( this, 'blast_upgrade3' );
  204. }
  205. }
  206. else
  207. {
  208. if ( !alternateCast )
  209. attackRange = theGame.GetAttackRangeForEntity( this, 'cone' );
  210. else
  211. attackRange = theGame.GetAttackRangeForEntity( this, 'blast' );
  212. }
  213.  
  214. // set spawning position
  215. spawnPos = GetWorldPosition();
  216. spawnRot = GetWorldRotation();
  217. heading = this.GetHeadingVector();
  218.  
  219. //we move the projectile back as a hackfix for situations where:
  220. // geralt would stand facing a wall and thus create projectile inside wall causing it to work on the other side of the collision
  221. // geralt would stande close to a fireplace and his projectile would be created 'beyond' it and thus not work with it
  222. if ( alternateCast )
  223. {
  224. spawnPos.Z -= 0.5;
  225. //VIO
  226. projectile = (W3SignProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos - heading * 0.7, spawnRot );
  227. projectile.ExtInit( owner, skillEnum, this );
  228. projectile.SetAttackRange( attackRange );
  229. projectile.SphereOverlapTest( distance, projectileCollision );
  230. }
  231. else
  232. {
  233. spawnPos -= 0.7 * heading;
  234.  
  235. projectile = (W3SignProjectile)theGame.CreateEntity( aspects[fireMode].projTemplate, spawnPos, spawnRot );
  236. projectile.ExtInit( owner, skillEnum, this );
  237. projectile.SetAttackRange( attackRange );
  238.  
  239. projectile.ShootCakeProjectileAtPosition( aspects[fireMode].cone, 4.5f, 0.0f, 30.0f, spawnPos + heading * distance, distance, projectileCollision );
  240. }
  241.  
  242. //FX - different fx when hitting water
  243. if(alternateCast)
  244. {
  245. movingAgent = (CMovingPhysicalAgentComponent)ownerActor.GetMovingAgentComponent();
  246. hitsWater = movingAgent.GetSubmergeDepth() < 0;
  247. }
  248. else
  249. {
  250. waterCollTestPos = GetWorldPosition() + heading * distance * waterTestDistancePerc;
  251. waterCollTestPos.Z += waterTestOffsetZ;
  252. collisionGroupNames.PushBack('Terrain');
  253.  
  254. //water Z
  255. waterZ = theGame.GetWorld().GetWaterLevel(waterCollTestPos, true);
  256.  
  257. //terrain collision
  258. if(theGame.GetWorld().StaticTrace(GetWorldPosition(), waterCollTestPos, collisionPos, collisionNormal, collisionGroupNames))
  259. {
  260. //if water level is the highest of all
  261. if(waterZ > collisionPos.Z && waterZ > waterCollTestPos.Z)
  262. hitsWater = true;
  263. else
  264. hitsWater = false;
  265. }
  266. else
  267. {
  268. //no terrain - just water level check
  269. hitsWater = (waterCollTestPos.Z <= waterZ);
  270. }
  271. }
  272. //VIO
  273. PlayAardFX(hitsWater);
  274. PlayAardFX(hitsWater);
  275. PlayAardFX(hitsWater);
  276. //PlayAardFX(hitsWater);
  277. AddTimer('DelayedDestroyTimer', 0.1, true, , , true);
  278. }
  279.  
  280. //plays aard fx
  281. public final function PlayAardFX(hitsWater : bool)
  282. {
  283. var dispersionLevel : int;
  284.  
  285. if ( owner.CanUseSkill( S_Magic_s20 ) )
  286. {
  287. dispersionLevel = owner.GetSkillLevel(S_Magic_s20);
  288.  
  289. if(dispersionLevel == 1)
  290. {
  291. //base
  292. PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade1 );
  293.  
  294. //terrain specific
  295. if(hitsWater)
  296. PlayEffect( effects[fireMode].throwEffectWaterUpgrade1 );
  297. else
  298. PlayEffect( effects[fireMode].throwEffectSoilUpgrade1 );
  299. }
  300. else if(dispersionLevel == 2)
  301. {
  302. //base
  303. PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade2 );
  304.  
  305. //terrain specific
  306. if(hitsWater)
  307. PlayEffect( effects[fireMode].throwEffectWaterUpgrade2 );
  308. else
  309. PlayEffect( effects[fireMode].throwEffectSoilUpgrade2 );
  310. }
  311. else if(dispersionLevel == 3)
  312. {
  313. //base
  314. PlayEffect( effects[fireMode].baseCommonThrowEffectUpgrade3 );
  315.  
  316. //terrain specific
  317. if(hitsWater)
  318. PlayEffect( effects[fireMode].throwEffectWaterUpgrade3 );
  319. else
  320. PlayEffect( effects[fireMode].throwEffectSoilUpgrade3 );
  321. }
  322. }
  323. else
  324. {
  325. //base
  326. PlayEffect( effects[fireMode].baseCommonThrowEffect );
  327.  
  328. //terrain specific
  329. if(hitsWater)
  330. PlayEffect( effects[fireMode].throwEffectWater );
  331. else
  332. PlayEffect( effects[fireMode].throwEffectSoil );
  333. }
  334.  
  335. //bonus sp fx
  336. if(owner.CanUseSkill(S_Magic_s12))
  337. {
  338. //different fx based on what is the current range of aard
  339. switch(dispersionLevel)
  340. {
  341. case 0:
  342. PlayEffect( effects[fireMode].throwEffectSPNoUpgrade );
  343. break;
  344. case 1:
  345. PlayEffect( effects[fireMode].throwEffectSPUpgrade1 );
  346. break;
  347. case 2:
  348. PlayEffect( effects[fireMode].throwEffectSPUpgrade2 );
  349. break;
  350. case 3:
  351. PlayEffect( effects[fireMode].throwEffectSPUpgrade3 );
  352. break;
  353. }
  354. }
  355.  
  356. //bonus dmg fx
  357. if(owner.CanUseSkill(S_Magic_s06))
  358. {
  359. //different fx based on what is the current range of aard
  360. switch(dispersionLevel)
  361. {
  362. case 0:
  363. PlayEffect( effects[fireMode].throwEffectDmgNoUpgrade );
  364. break;
  365. case 1:
  366. PlayEffect( effects[fireMode].throwEffectDmgUpgrade1 );
  367. break;
  368. case 2:
  369. PlayEffect( effects[fireMode].throwEffectDmgUpgrade2 );
  370. break;
  371. case 3:
  372. PlayEffect( effects[fireMode].throwEffectDmgUpgrade3 );
  373. break;
  374. }
  375. }
  376. //mutation 6 bonus cast blast fx
  377. }
  378.  
  379. timer function DelayedDestroyTimer(dt : float, id : int)
  380. {
  381. var active : bool;
  382.  
  383. if(owner.CanUseSkill(S_Magic_s20))
  384. {
  385. switch(owner.GetSkillLevel(S_Magic_s20))
  386. {
  387. case 1 :
  388. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade1 );
  389. break;
  390. case 2 :
  391. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade2 );
  392. break;
  393. case 3 :
  394. active = IsEffectActive( effects[fireMode].baseCommonThrowEffectUpgrade3 );
  395. break;
  396. default :
  397. LogAssert(false, "W3AardEntity.DelayedDestroyTimer: S_Magic_s20 skill level out of bounds!");
  398. }
  399. }
  400. else
  401. {
  402. active = IsEffectActive( effects[fireMode].baseCommonThrowEffect );
  403. }
  404.  
  405. if(!active)
  406. Destroy();
  407. }
  408. }
  409.  
  410. state AardConeCast in W3AardEntity extends NormalCast
  411. {
  412. event OnThrowing()
  413. {
  414. var player : CR4Player;
  415. var cost, stamina : float;
  416.  
  417. if( super.OnThrowing() )
  418. {
  419. parent.ProcessThrow( false );
  420.  
  421. player = caster.GetPlayer();
  422. if(player == caster.GetActor() && player && player.CanUseSkill(S_Perk_09))
  423. {
  424. cost = player.GetStaminaActionCost(ESAT_Ability, SkillEnumToName( parent.skillEnum ), 0);
  425. stamina = player.GetStat(BCS_Stamina, true);
  426.  
  427. if(cost > stamina)
  428. player.DrainFocus(1);
  429. else
  430. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  431. }
  432. else
  433. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  434. }
  435. }
  436. }
  437.  
  438. state AardCircleCast in W3AardEntity extends NormalCast
  439. {
  440. event OnThrowing()
  441. {
  442. var player : CR4Player;
  443. var cost, stamina : float;
  444.  
  445. if( super.OnThrowing() )
  446. {
  447. parent.ProcessThrow( true );
  448.  
  449. player = caster.GetPlayer();
  450. if(player == caster.GetActor() && player && player.CanUseSkill(S_Perk_09))
  451. {
  452. cost = player.GetStaminaActionCost(ESAT_Ability, SkillEnumToName( parent.skillEnum ), 0);
  453. stamina = player.GetStat(BCS_Stamina, true);
  454.  
  455. if(cost > stamina)
  456. player.DrainFocus(1);
  457. else
  458. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  459. }
  460. else
  461. caster.GetActor().DrainStamina( ESAT_Ability, 0, 0, SkillEnumToName( parent.skillEnum ) );
  462. }
  463. }
  464. }
Add Comment
Please, Sign In to add comment