Advertisement
Adam445

melee.gsc

Mar 26th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.38 KB | None | 0 0
  1. #using_animtree ("generic_human");
  2.  
  3. MeleeCombat( changeReason )
  4. {
  5. self trackScriptState( "melee", changeReason );
  6. self endon("killanimscript");
  7.  
  8.  
  9. /#[[anim.println]]("Entering combat::MeleeCombat");#/
  10. /#[[anim.assert]]((self GetClosestEnemySqDist()) <= anim.meleeRangeSq, "combat::MeleeCombat - not in range!");#/
  11. /#[[anim.assert]](isAlive(self.enemy),"Can't melee - I don't have an enemy.");#/
  12.  
  13. /#[[anim.assert]]( isDefined ( changeReason ) , "Script state called without reason.");#/
  14.  
  15. for ( ;; )
  16. {
  17. // self . scriptState = "melee";
  18. if ( !TryMeleeCharge() )
  19. {
  20. break;
  21. }
  22.  
  23. // If no one else is meleeing this person, tell the system that I am, so no one else will charge him.
  24. myTurn = animscripts\utility::okToMelee(self.enemy);
  25. if (myTurn)
  26. {
  27. animscripts\utility::IAmMeleeing(self.enemy);
  28. realMelee = true;
  29. }
  30. else
  31. {
  32. // If someone else is meleeing, I will still melee, but don't bother telling the system.
  33. ///#[[anim.println]]("Someone else is meleeing my enemy so I can't");#/
  34. //// Try to back off
  35. //backPedalled = tryBackPedal();
  36. //if (backPedalled)
  37. //{
  38. // continue;
  39. //}
  40. //println ("Cornered - I have to melee even though someone else already is.");
  41. realMelee = false;
  42. }
  43.  
  44.  
  45. [[anim.PutGunInHand]]("right");
  46. self thread animscripts\combat::EyesAtEnemy();
  47.  
  48. if ( (self.anim_movement=="run") && (self.anim_pose=="stand") )
  49. {
  50. Melee_RunToStop();
  51. }
  52. else
  53. {
  54. self [[anim.SetPoseMovement]]("stand","stop");
  55. }
  56. /#[[anim.assert]](self.anim_movement == "stop", "combat::MeleeCombat "+self.anim_movement);#/
  57. if (!isAlive(self.enemy))
  58. {
  59. break; // Enemy died while I was stopping.
  60. }
  61.  
  62. /#[[anim.locSpam]]("c30");#/
  63.  
  64. self animscripts\face::SayGenericDialogue("meleeattack"); // This does sound and facial animation.
  65.  
  66. self setanimknoball(%melee, %body, 1, .05, 1);
  67.  
  68. endmeleeState = self.anim_meleeState;
  69.  
  70. player = animscripts\utility::GetPlayer();
  71. if (self.enemy == player)
  72. {
  73. enemypose = player getstance();
  74. }
  75. else
  76. {
  77. enemypose = self.enemy.anim_pose;
  78. }
  79.  
  80. // Now whack!
  81. switch(self.anim_meleeState)
  82. {
  83. case "charge":
  84. /#[[anim.locSpam]]("c31a");#/
  85. self setflaggedanimknob("meleeanim", %melee_charge2right, 1, .1, 1); // anim, weight, xblend time, rate
  86. endmeleeState = "right";
  87. /#[[anim.locSpam]]("c32a");#/
  88. endmeleeState = "right";
  89. break;
  90. case "aim":
  91. if (enemypose == "stand")
  92. {
  93. /#[[anim.locSpam]]("c31b");#/
  94. self setflaggedanimknob("meleeanim", %aim2melee_right, 1, .15, 1); // anim, weight, xblend time, rate
  95. endmeleeState = "right";
  96. }
  97. else
  98. {
  99. /#[[anim.locSpam]]("c31c");#/
  100. self setflaggedanimknob("meleeanim", %aim2meleecrouch_left, 1, .15, 1);
  101. endmeleeState = "left";
  102. }
  103. /#[[anim.locSpam]]("c32b");#/
  104. break;
  105. case "right":
  106. rand = randomint(100);
  107. if (enemypose == "stand")
  108. {
  109. /#[[anim.locSpam]]("c33");#/
  110. if (rand<30)
  111. {
  112. /#[[anim.locSpam]]("c34");#/
  113. self setflaggedanimknob("meleeanim", %melee_right2right_1, 1, .1, 1);
  114. }
  115. else if (rand<60)
  116. {
  117. /#[[anim.locSpam]]("c35");#/
  118. self setflaggedanimknob("meleeanim", %melee_right2right_2, 1, .1, 1);
  119. }
  120. else
  121. {
  122. /#[[anim.locSpam]]("c36");#/
  123. self setflaggedanimknob("meleeanim", %melee_right2left, 1, .1, 1);
  124. endmeleeState = "left";
  125. }
  126. }
  127. else
  128. {
  129. if (rand<40)
  130. {
  131. /#[[anim.locSpam]]("c37");#/
  132. self setflaggedanimknob("meleeanim", %meleecrouch_right2right, 1, .1, 1);
  133. }
  134. else
  135. {
  136. /#[[anim.locSpam]]("c38");#/
  137. self setflaggedanimknob("meleeanim", %meleecrouch_right2left, 1, .1, 1);
  138. endmeleeState = "left";
  139. }
  140. }
  141. /#[[anim.locSpam]]("c39");#/
  142. break;
  143. case "left":
  144. rand = randomint(100);
  145. /#[[anim.locSpam]]("c40");#/
  146. if (enemypose == "stand")
  147. {
  148. if (rand<30)
  149. {
  150. /#[[anim.locSpam]]("c41");#/
  151. self setflaggedanimknob("meleeanim", %melee_left2left_1, 1, .1, 1);
  152. }
  153. else if (rand<60)
  154. {
  155. /#[[anim.locSpam]]("c41");#/
  156. self setflaggedanimknob("meleeanim", %melee_left2left_2, 1, .1, 1);
  157. }
  158. else
  159. {
  160. /#[[anim.locSpam]]("c42");#/
  161. self setflaggedanimknob("meleeanim", %melee_left2right, 1, .1, 1);
  162. endmeleeState = "right";
  163. }
  164. }
  165. else
  166. {
  167. if (rand<40)
  168. {
  169. /#[[anim.locSpam]]("c42b");#/
  170. self setflaggedanimknob("meleeanim", %meleecrouch_left2left, 1, .1, 1);
  171. }
  172. else
  173. {
  174. /#[[anim.locSpam]]("c42c");#/
  175. self setflaggedanimknob("meleeanim", %meleecrouch_left2right, 1, .1, 1);
  176. endmeleeState = "right";
  177. }
  178. }
  179. /#[[anim.locSpam]]("c42d");#/
  180. break;
  181. default:
  182. homemade_error = Unexpected_meleeState_value + meleeState;
  183. break;
  184. }
  185. animscripts\shared::DoNoteTracks("meleeanim", ::CatchMeleeNote);
  186. self.anim_meleeState = endmeleeState; // This is because I don't entirely trust notetracks yet.
  187. /#[[anim.locSpam]]("c43");#/
  188. if (!isAlive(self.enemy))
  189. {
  190. break; // Killed my enemy.
  191. }
  192. }
  193.  
  194. if (realMelee)
  195. {
  196. animscripts\utility::ImNotMeleeing(self.enemy);
  197. }
  198. /#[[anim.println]]("Leaving combat::MeleeCombat");#/
  199.  
  200. self thread animscripts\combat::main();
  201. self notify ("stop EyesAtEnemy");
  202. return; // transition back to combat - FIXME JBW decide on different states from here
  203. }
  204.  
  205.  
  206. TryMeleeCharge()
  207. {
  208. /#[[anim.println]]("Entering TryMeleeCharge");#/
  209.  
  210. if (!isAlive(self.enemy))
  211. {
  212. /#[[anim.println]]("Can't meleeCharge - I don't have an enemy.");#/
  213. return false;
  214. }
  215. // Should be aiming at this point, but it's not important enough to assert against
  216. /#
  217. if (self.anim_alertness != "aiming")
  218. [[anim.println]]("Not aiming on entry to meleeCharge - that's bad.");
  219. #/
  220.  
  221. if (self.anim_pose != "stand")
  222. {
  223. // Can't charge if we're not standing
  224. /#[[anim.println]]("Can't meleeCharge in pose "+self.anim_pose);#/
  225. return false;
  226. }
  227.  
  228. enemyPoint = self.enemy GetOrigin();
  229. self.enemyDistanceSq = lengthSquared ( self.origin - enemyPoint ); // TODO This should probably be a code function
  230. if (self.enemyDistanceSq <= anim.meleeRangeSq)
  231. {
  232. /#[[anim.println]](" Enemy is already close enough to melee.");#/
  233. return true;
  234. }
  235. if (self.enemyDistanceSq > anim.chargeRangeSq)
  236. {
  237. /#[[anim.println]](" Enemy isn't close enough to charge.");#/
  238. return false;
  239. }
  240.  
  241. myTurn = animscripts\utility::okToMelee(self.enemy);
  242. if (!myTurn)
  243. {
  244. /#[[anim.println]](" Someone else is meleeing my enemy so I can't charge");#/
  245. // Don't return false, because if enemy is already within melee range then this charge was actually successful.
  246. }
  247. else
  248. {
  249. self thread animscripts\combat::EyesAtEnemy();
  250. // Constants.
  251. localDeltaVector = GetMoveDelta (%melee_charge2right, 0, 1);
  252. // chargeCycleTime = getanimlength(%melee_charge);
  253. sampleTime = 0.2;
  254. // Values which change every time we resample.
  255. // (These first two are already known from just above)
  256. //enemyPoint = self.enemy GetOrigin();
  257. //self.enemyDistanceSq = lengthSquared ( self.origin - enemyPoint ); // TODO This should probably be a code function
  258. predictedDistanceSq = self.enemyDistanceSq;
  259. vecToEnemy = enemyPoint - self.origin;
  260. dirToEnemy = vectorNormalize (vecToEnemy);
  261. meleePoint = enemyPoint - (dirToEnemy[0]*32, dirToEnemy[1]*32, dirToEnemy[2]*32);
  262. clearPath = self maymovetopoint(meleePoint);
  263. success = false;
  264.  
  265. /#
  266. // Some debug info
  267. if (!clearPath)
  268. {
  269. thread animscripts\utility::drawDebugLine(self.origin, meleePoint, (1,0,0), 20);
  270. [[anim.println]](" Can't run to enemy.");
  271. }
  272. #/
  273. [[anim.PutGunInHand]]("right");
  274. firstTimeThrough = true;
  275. while ( (clearPath) &&
  276. (self.enemyDistanceSq <= anim.chargeRangeSq) &&
  277. (self.enemyDistanceSq > anim.meleeRangeSq) &&
  278. (predictedDistanceSq > anim.meleeRangeSq)
  279. )
  280. {
  281. /#thread animscripts\utility::drawDebugLine(self.origin, meleePoint, (0,1,0), 20);#/
  282. if (firstTimeThrough)
  283. {
  284. self animscripts\face::SayGenericDialogue("meleecharge");
  285. animscripts\utility::IAmMeleeing(self.enemy);
  286. firstTimeThrough = false;
  287. }
  288. self SetFlaggedAnimKnobAll("chargeanim", %melee_charge, %body, 1, .15, 1);
  289. self animscripts\shared::DoNoteTracksForTime(sampleTime, "chargeanim");
  290. self.anim_movement = "run"; // In case the note wasn't there or was missed.
  291.  
  292. if (!isAlive(self.enemy)) // Enemy died while I was charging
  293. {
  294. /#[[anim.println]](" Enemy died while I was charging.");#/
  295. self notify ("stop EyesAtEnemy");
  296. return false;
  297. }
  298. enemyPoint = self.enemy GetOrigin();
  299. self.enemyDistanceSq = lengthSquared ( self.origin - enemyPoint ); // TODO This is probably a code function
  300. predictedSelfOrigin = self LocalToWorldCoords( localDeltaVector );
  301. predictedDistanceSq = lengthSquared ( predictedSelfOrigin - enemyPoint );
  302. vecToEnemy = enemyPoint - self.origin;
  303. dirToEnemy = vectorNormalize (vecToEnemy);
  304. meleePoint = enemyPoint - (dirToEnemy[0]*32, dirToEnemy[1]*32, dirToEnemy[2]*32);
  305. clearPath = self maymovetopoint(meleePoint);
  306. success = true;
  307. }
  308.  
  309. // (We know enemy is alive at this point.) If we got to within running-striking distance, and we're
  310. // running, then play the running melee animation.
  311. if ( (predictedDistanceSq <= anim.meleeRangeSq) && clearPath && (self.anim_movement == "run") )
  312. {
  313. Melee_RunToStop();
  314. if (isAlive(self.enemy))
  315. {
  316. enemyPoint = self.enemy GetOrigin();
  317. self.enemyDistanceSq = lengthSquared ( self.origin - enemyPoint ); // TODO This should probably be a code function
  318. }
  319. else
  320. {
  321. self notify ("stop EyesAtEnemy");
  322. return false; // Enemy died while I was stopping.
  323. }
  324. }
  325. animscripts\utility::ImNotMeleeing(self.enemy);
  326. }
  327. if ( isAlive(self.enemy) && (self.enemyDistanceSq <= anim.meleeRangeSq) )
  328. success = true;
  329. else
  330. success = false;
  331. /#[[anim.println]]("Leaving meleecharge (result "+success+")");#/
  332. self notify ("stop EyesAtEnemy");
  333. return success;
  334. }
  335.  
  336.  
  337.  
  338.  
  339. Melee_RunToStop()
  340. {
  341. self animscripts\face::SayGenericDialogue("meleeattack"); // This does sound and facial animation.
  342. self SetFlaggedAnimKnobAll("meleeanim", %melee_charge2right, %body, 1, .1, 1); // name, anim, rootanim, weight, xblend time, rate
  343. animscripts\shared::DoNoteTracks("meleeanim", ::CatchMeleeNote);
  344. self.anim_meleeState = "right"; // This is because I don't entirely trust notetracks yet.
  345. self.anim_movement = "stop";
  346. }
  347.  
  348.  
  349.  
  350. CatchMeleeNote(note)
  351. {
  352. if (note == "melee")
  353. {
  354. self melee();
  355. }
  356. else
  357. {
  358. println ("Note "+note+" was not handled by DoNoteTrack or CatchMeleeNote.");
  359. }
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement