Guest User

Untitled

a guest
Jul 17th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.85 KB | None | 0 0
  1. #ifndef CLIENT_DLL
  2.  
  3. #include "extdll.h"
  4. #include "util.h"
  5. #include "cbase.h"
  6. #include "monsters.h"
  7. #include "weapons.h"
  8. #include "nodes.h"
  9. #include "effects.h"
  10. #include "baseclasses.h"
  11. #include "player.h"
  12. #include "gamerules.h"
  13.  
  14.  
  15. #include "game.h"
  16.  
  17.  
  18. #include <pakkun.h>
  19. #include <jutsuFx.h>
  20. #include <TsuigaJutsu.h>
  21. #include <rotationUtils.h>
  22. #include <pm_defs.h>
  23.  
  24. #define SPAWN_SOUND "jutsu/Poof.wav"
  25. #define DEFAULT_DISTANCE -50
  26.  
  27.  
  28. LINK_ENTITY_TO_CLASS( tsuiga_dog, Pakkun );
  29.  
  30.  
  31. void Pakkun::Spawn( )
  32. {
  33. Precache( );
  34. //pev->movetype = MOVETYPE_STEP;
  35. pev->solid = SOLID_SLIDEBOX;
  36.  
  37. pev->classname = MAKE_STRING(WEAPON_NAME_JUTSU_TSUIGA);
  38. pev->gravity = 1.0;
  39. pev->friction = 0.5;
  40. m_bloodColor = DONT_BLEED;
  41.  
  42. SET_MODEL(ENT(pev), PAKKUN_MODEL);
  43.  
  44.  
  45. EMIT_SOUND(ENT(pev), CHAN_WEAPON,SPAWN_SOUND, 1, ATTN_NORM);
  46. UTIL_SetSize(pev, Vector(-8, -8, -18.1), Vector(8, 8, 18));
  47. pev->renderfx = kRenderFxCellShaded; //hack for cel shading pakkun
  48. pev->origin.z += 10;
  49.  
  50.  
  51.  
  52. pev->flags |= FL_MONSTER;
  53. pev->health = 1;
  54. pev->takedamage = 1;
  55.  
  56. m_MonsterState = MONSTERSTATE_IDLE;
  57. //m_afCapability = bits_CAP_MELEE_ATTACK1;
  58. m_afCapability = bits_CAP_RANGE_ATTACK1;
  59.  
  60.  
  61. InitBoneControllers( );
  62. m_flFieldOfView = 0.7;
  63. m_timeToLive = 15;
  64. m_fLastTime = gpGlobals->time;
  65. m_pTarget = this->m_pUser->m_pTarget;
  66. MonsterInit();
  67.  
  68.  
  69.  
  70. ((CTsuigaJutsu*)m_pJutsu)->setPakkunReady(false);
  71. }
  72.  
  73. Pakkun* Pakkun::PakkunCreate( Vector vecOrigin, Vector vecAngles, CBasePlayer* pOwner, CTsuigaJutsu* pJutsu ){
  74. // Create a new entity with Pakkun private data
  75. Pakkun *pDog = GetClassPtr( (Pakkun *)NULL );
  76. pDog->pev->classname = MAKE_STRING("tsuiga_dog");
  77.  
  78. // B T
  79. //pDog->pev->origin = vecOrigin;
  80. UTIL_SetOrigin( pDog->pev, vecOrigin );
  81. vecAngles.x = 0;
  82. vecAngles.z = 0;
  83. // E T
  84.  
  85. pDog->pev->angles = vecAngles;
  86. //pDog->pev->owner = pOwner->edict();
  87. pDog->m_pUser = pOwner;
  88. pDog->m_pJutsu = pJutsu;
  89. pDog->Spawn();
  90. sendPuffFX(vecOrigin);
  91. pDog->pev->playerNormal = pOwner->pev->playerNormal;
  92.  
  93.  
  94. pDog->pev->euser1 = pOwner->edict();
  95. pDog->pev->ownerId = pOwner->entindex();
  96. pDog->pev->team = pOwner->pev->team;
  97. pDog->pev->speed = 50;
  98. pDog->pev->yaw_speed = 450;
  99.  
  100.  
  101. return pDog;
  102.  
  103.  
  104. }
  105.  
  106. void Pakkun::Precache(){}
  107.  
  108.  
  109. Vector Pakkun::getFormationPos(){
  110.  
  111. //UTIL_MakeVectors(m_pUser->pev->v_angle);
  112. //Vector dir = removeNormalComponent(gpGlobals->v_forward,m_pUser->pev->playerNormal);
  113.  
  114. Vector angle = Vector(0,0,0);//m_pJutsu->pev->angles;
  115. angle.y += 200; //start at the right
  116. UTIL_MakeVectors(angle);
  117.  
  118. Vector dir = gpGlobals->v_forward;
  119. dir = dir.Normalize();
  120. return m_pUser->pev->origin + dir * DEFAULT_DISTANCE;
  121. }
  122.  
  123.  
  124. void Pakkun::Killed(entvars_t *pevAttacker, int iGib ){
  125. if ( m_pJutsu )
  126. ((CTsuigaJutsu*)m_pJutsu)->setPakkunReady(true);
  127.  
  128. sendPuffFX(this->pev->origin);
  129.  
  130. FormationMonster::Killed( pevAttacker, GIB_ALWAYS );
  131. UTIL_Remove(this);
  132. }
  133.  
  134. void Pakkun::MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, float flInterval ){
  135. m_flGroundSpeed = 200; //TODO: change to constant or variable
  136. FormationMonster::MoveExecute(pTargetEnt, vecDir, flInterval);
  137. }
  138.  
  139. Task_t tlJumpOnPlayerFace1[] =
  140. {
  141. { TASK_STOP_MOVING, 0 },
  142. { TASK_FACE_ENEMY, (float)0 },
  143. { TASK_RANGE_ATTACK1, (float)0 },
  144. { TASK_SET_ACTIVITY, (float)ACT_IDLE },
  145. };
  146.  
  147. Schedule_t slJumpOnPlayerFace[] =
  148. {
  149. {
  150. tlJumpOnPlayerFace1,
  151. ARRAYSIZE ( tlJumpOnPlayerFace1 ),
  152. bits_COND_NEW_ENEMY |
  153. bits_COND_ENEMY_DEAD |
  154. bits_COND_LIGHT_DAMAGE |
  155. bits_COND_HEAVY_DAMAGE |
  156. bits_COND_ENEMY_OCCLUDED,
  157. 0,
  158. "JumpOnPlayerFace"
  159. },
  160. };
  161.  
  162.  
  163.  
  164. #define HC_AE_JUMPATTACK ( 2 )
  165.  
  166.  
  167. DEFINE_CUSTOM_SCHEDULES( Pakkun )
  168. {
  169. slJumpOnPlayerFace,
  170. };
  171.  
  172. Schedule_t* Pakkun :: GetScheduleOfType ( int Type )
  173. {
  174. switch ( Type )
  175. {
  176. case SCHED_RANGE_ATTACK1:
  177. {
  178. //ALERT ( at_console, "PAKKUN SCHED_RANGE_ATTACK1\n", Type );
  179. return &slJumpOnPlayerFace[ 0 ];
  180. }
  181. default:
  182. {
  183. return FormationMonster::GetScheduleOfType( Type );
  184. }
  185. }
  186. }
  187.  
  188. IMPLEMENT_CUSTOM_SCHEDULES( Pakkun, FormationMonster );
  189.  
  190. Schedule_t *Pakkun :: GetSchedule ( void )
  191. {
  192. return FormationMonster :: GetSchedule();
  193. }
  194.  
  195. void Pakkun :: startPakkunJumpToFace()
  196. {
  197. ClearBits( pev->flags, FL_ONGROUND );
  198.  
  199. UTIL_SetOrigin (pev, pev->origin + Vector ( 0 , 0 , 1) );// take him off ground so engine doesn't instantly reset onground
  200. UTIL_MakeVectors ( pev->angles );
  201.  
  202. Vector vecJumpDir;
  203. if (m_hEnemy != NULL)
  204. {
  205. float gravity = g_psv_gravity->value;
  206. if (gravity <= 1)
  207. gravity = 1;
  208.  
  209. // How fast does the headcrab need to travel to reach that height given gravity?
  210. float height = (m_hEnemy->pev->origin.z + m_hEnemy->pev->view_ofs.z - pev->origin.z);
  211. if (height < 16)
  212. height = 16;
  213. float speed = sqrt( 2 * gravity * height );
  214. float time = speed / gravity;
  215.  
  216. // Scale the sideways velocity to get there at the right time
  217. vecJumpDir = (m_hEnemy->pev->origin + m_hEnemy->pev->view_ofs - pev->origin);
  218. vecJumpDir = vecJumpDir * ( 1.0 / time );
  219.  
  220. // Speed to offset gravity at the desired height
  221. vecJumpDir.z = speed;
  222.  
  223. // Don't jump too far/fast
  224. float distance = vecJumpDir.Length();
  225.  
  226. if (distance > 650)
  227. {
  228. vecJumpDir = vecJumpDir * ( 650.0 / distance );
  229. }
  230. }
  231. else
  232. {
  233. // jump hop, don't care where
  234. vecJumpDir = Vector( gpGlobals->v_forward.x, gpGlobals->v_forward.y, gpGlobals->v_up.z ) * 350;
  235. }
  236.  
  237. pev->velocity = vecJumpDir;
  238. m_flNextAttack = gpGlobals->time + 2;
  239.  
  240. }
  241.  
  242. void Pakkun :: SetYawSpeed ( void )
  243. {
  244. int ys;
  245.  
  246. switch ( m_Activity )
  247. {
  248. case ACT_IDLE:
  249. ys = 60;
  250. break;
  251. case ACT_RUN:
  252. case ACT_WALK:
  253. ys = 60;
  254. break;
  255. case ACT_TURN_LEFT:
  256. case ACT_TURN_RIGHT:
  257. ys = 60;
  258. break;
  259. case ACT_RANGE_ATTACK1:
  260. //ALERT(at_console,"ACT_RANGE_ATTACK1 YS\n");
  261. ys = 20;
  262. break;
  263. default:
  264. ys = 60;
  265. break;
  266. }
  267.  
  268. pev->yaw_speed = ys;
  269. }
  270.  
  271. //=========================================================
  272. // RunTask
  273. //=========================================================
  274. void Pakkun :: StartTask ( Task_t *pTask )
  275. {
  276. m_iTaskStatus = TASKSTATUS_RUNNING;
  277.  
  278. switch ( pTask->iTask )
  279. {
  280. case TASK_RANGE_ATTACK1:
  281. {
  282. //m_IdealActivity = ACT_RANGE_ATTACK1;
  283. // ALERT(at_console,"TASK_RANGE_ATTACK1|m_IdealActivity: %i\n",m_IdealActivity);
  284. //SetTouch (&Pakkun::LeapTouch );
  285. startPakkunJumpToFace();
  286. break;
  287. }
  288. default:
  289. {
  290. FormationMonster :: StartTask(pTask);
  291. }
  292. }
  293. }
  294.  
  295.  
  296. void Pakkun :: RunTask ( Task_t *pTask )
  297. {
  298. switch ( pTask->iTask )
  299.  
  300. {
  301.  
  302.  
  303.  
  304. case TASK_RANGE_ATTACK1:
  305. case TASK_RANGE_ATTACK2:
  306. {
  307. if ( m_fSequenceFinished )
  308. {
  309. ALERT(at_console,"m_fSequenceFinished\n");
  310. TaskComplete();
  311. SetTouch( NULL );
  312. m_IdealActivity = ACT_IDLE;
  313. }
  314. break;
  315. }
  316. default:
  317. {
  318. FormationMonster :: RunTask(pTask);
  319. }
  320. }
  321. }
  322.  
  323. /*
  324. void Pakkun :: StartTask ( Task_t *pTask )
  325. {
  326. FormationMonster :: StartTask(pTask);
  327. }
  328. */
  329. //=========================================================
  330. // Center - returns the real center of the headcrab. The
  331. // bounding box is much larger than the actual creature so
  332. // this is needed for targeting
  333. //=========================================================
  334. Vector Pakkun :: Center ( void )
  335. {
  336. return Vector( pev->origin.x, pev->origin.y, pev->origin.z + 6 );
  337. }
  338.  
  339.  
  340. Vector Pakkun :: BodyTarget( const Vector &posSrc )
  341. {
  342. return Center( );
  343. }
  344.  
  345. void Pakkun :: LeapTouch ( CBaseEntity *pOther )
  346. {
  347. if ( !pOther->pev->takedamage )
  348. {
  349. return;
  350. }
  351.  
  352. if ( pOther->Classify() == Classify() )
  353. {
  354. return;
  355. }
  356.  
  357. // Don't hit if back on ground
  358. if ( !FBitSet( pev->flags, FL_ONGROUND ) )
  359. {
  360. pOther->TakeDamage( pev, pev, 0, DMG_SLASH );
  361. }
  362.  
  363. SetTouch( NULL );
  364. }
  365.  
  366.  
  367. //=========================================================
  368. // SetYawSpeed - allows each sequence to have a different
  369. // turn rate associated with it.
  370. //=========================================================
  371.  
  372. //=========================================================
  373. // CheckRangeAttack1
  374. //=========================================================
  375. BOOL Pakkun :: CheckRangeAttack1 ( float flDot, float flDist )
  376. {
  377. if ( FBitSet( pev->flags, FL_ONGROUND ) && flDist <= 256 && flDot >= 0.65 )
  378. {
  379. return TRUE;
  380. }
  381. return FALSE;
  382. }
  383.  
  384. //=========================================================
  385. // CheckRangeAttack2
  386. //=========================================================
  387. BOOL Pakkun :: CheckRangeAttack2 ( float flDot, float flDist )
  388. {
  389. return FALSE;
  390. }
  391.  
  392. int Pakkun :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
  393. {
  394. return FormationMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType );
  395. }
  396.  
  397.  
  398.  
  399. //==================================
  400. //Headcrab stuff end
  401. //==================================
  402.  
  403. #endif /*CLIENT_DLL*/
Add Comment
Please, Sign In to add comment