HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <hamsandwich>
  6. #include <xs>
  7.  
  8. #define PLUGIN "Drill Gun"
  9. #define VERSION "1.0"
  10. #define AUTHOR "Dias"
  11.  
  12. #define DRILL_ID CSW_M249
  13. #define DRILL_CN "weapon_m249"
  14. #define DRILL_AI 3
  15.  
  16. #define DRILL_MA 20
  17. #define DRILL_ST 1.035
  18. #define DRILL_RT 2.035
  19. #define DRILL_IT 1.7
  20.  
  21. #define NAIL_CN "drillgun"
  22.  
  23. #define NAIL_SPEED 2000.0
  24. #define NAIL_DAMAGE 500.0
  25.  
  26. #define NAIL_MODEL "models/drillgun_nail.mdl"
  27.  
  28. #define V_MODEL "models/v_drillgun.mdl"
  29. #define P_MODEL "models/p_drillgun.mdl"
  30. #define W_MODEL "models/w_drillgun.mdl"
  31.  
  32. #define SHOOT_SOUND "weapons/drillgun-1.wav"
  33. #define DRAW_SOUND "weapons/drillgun_draw.wav"
  34. #define RELOAD_SOUND "weapons/drillgun_reload.wav"
  35.  
  36. #define ORIG_W_MODEL "models/w_m249.mdl"
  37.  
  38. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  39. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  40. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  41.  
  42. #define CheckPlayer(%1,%2) if (%1 < 1 || %1 > 32) return %2; \
  43. if (!is_user_connected(%1)) return %2
  44.  
  45. new const Float:g_vecZero[3] = { 0.0, 0.0, 0.0 };
  46. new const PRIMARY_WEAPONS_BITSUM = ((1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90));
  47. new const WEAPONENTNAMES[][] =
  48. {
  49. "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
  50. "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
  51. "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
  52. "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
  53. "weapon_ak47", "weapon_knife", "weapon_p90"
  54. };
  55.  
  56. new g_fHasWeapon = 0;
  57. new g_TempAttack;
  58. new g_SprId_LaserBeam
  59.  
  60. public plugin_init()
  61. {
  62. register_plugin(PLUGIN, VERSION, AUTHOR);
  63.  
  64. register_clcmd("say /drill", "clcmd_buydrill");
  65.  
  66. register_clcmd("weapon_drillgun", "clcmd_weapon_drillgun");
  67.  
  68. register_message(get_user_msgid("AmmoX"), "Message_AmmoX");
  69. register_message(get_user_msgid("CurWeapon"), "Message_CurWeapon");
  70.  
  71. register_forward(FM_EmitSound, "fw_EmitSound");
  72. register_forward(FM_TraceLine, "fw_TraceLine");
  73. register_forward(FM_TraceHull, "fw_TraceHull");
  74.  
  75. register_forward(FM_UpdateClientData, "fw_FM_UpdateClientData_Post", 1);
  76. register_forward(FM_SetModel, "fw_FM_SetModel");
  77.  
  78. RegisterHam(Ham_Weapon_WeaponIdle, DRILL_CN, "fw_Ham_Weapon_WeaponIdle");
  79. RegisterHam(Ham_Weapon_PrimaryAttack, DRILL_CN, "fw_Ham_Weapon_PrimaryAttack");
  80. RegisterHam(Ham_Weapon_Reload, DRILL_CN, "fw_Ham_Weapon_Reload");
  81. RegisterHam(Ham_Item_Deploy, DRILL_CN, "fw_Ham_Item_Deploy_Post", 1);
  82. RegisterHam(Ham_Item_PostFrame, DRILL_CN, "fw_Ham_Item_PostFrame");
  83. RegisterHam(Ham_Item_AddToPlayer, DRILL_CN, "fw_Ham_Item_AddToPlayer_Post", 1);
  84. RegisterHam(Ham_Think, "info_target", "fw_Ham_Think");
  85. RegisterHam(Ham_Touch, "info_target", "fw_Ham_Touch");
  86. }
  87.  
  88. public plugin_precache()
  89. {
  90. engfunc(EngFunc_PrecacheModel, NAIL_MODEL);
  91.  
  92. engfunc(EngFunc_PrecacheModel, V_MODEL);
  93. engfunc(EngFunc_PrecacheModel, P_MODEL);
  94. engfunc(EngFunc_PrecacheModel, W_MODEL);
  95.  
  96. engfunc(EngFunc_PrecacheSound, SHOOT_SOUND);
  97. engfunc(EngFunc_PrecacheSound, DRAW_SOUND);
  98. engfunc(EngFunc_PrecacheSound, RELOAD_SOUND);
  99.  
  100. precache_model("sprites/640hud3_2.spr")
  101. precache_model("sprites/640hud100_2.spr")
  102. precache_generic("sprites/weapon_drillgun.txt")
  103.  
  104. g_SprId_LaserBeam = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
  105. }
  106.  
  107. public Message_AmmoX(iMsgId, iMsgDest, iMsgEnt)
  108. {
  109. CheckPlayer(iMsgEnt, PLUGIN_CONTINUE);
  110.  
  111. if (get_msg_arg_int(1) != DRILL_AI || !(g_fHasWeapon & (1 << iMsgEnt))) return PLUGIN_CONTINUE;
  112.  
  113. return PLUGIN_HANDLED;
  114. }
  115.  
  116. public Message_CurWeapon(iMsgId, iMsgDest, iMsgEnt)
  117. {
  118. CheckPlayer(iMsgEnt, PLUGIN_CONTINUE);
  119.  
  120. if (!get_msg_arg_int(1) || get_msg_arg_int(2) != DRILL_ID) return PLUGIN_CONTINUE;
  121.  
  122. if (g_fHasWeapon & (1 << iMsgEnt))
  123. {
  124. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), _, iMsgEnt);
  125. write_byte(DRILL_AI);
  126. write_byte(get_msg_arg_int(3));
  127. message_end();
  128.  
  129. set_msg_arg_int(3, ARG_BYTE, -1);
  130. }
  131. else
  132. {
  133. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), _, iMsgEnt);
  134. write_byte(DRILL_AI);
  135. write_byte(get_pdata_int(iMsgEnt, 376 + DRILL_AI));
  136. message_end();
  137. }
  138.  
  139. return PLUGIN_CONTINUE;
  140. }
  141.  
  142. public client_putinserver(id)
  143. {
  144. g_fHasWeapon &= ~(1 << id);
  145. }
  146.  
  147. public clcmd_buydrill(id)
  148. {
  149. CheckPlayer(id, PLUGIN_HANDLED);
  150.  
  151. if (!is_user_alive(id)) return PLUGIN_HANDLED;
  152.  
  153. DropAllPrimary(id);
  154.  
  155. g_fHasWeapon |= (1 << id);
  156.  
  157. fm_give_item(id, DRILL_CN);
  158.  
  159. new iEnt = fm_find_ent_by_owner(-1, DRILL_CN, id);
  160.  
  161. if (!pev_valid(iEnt)) return PLUGIN_HANDLED;
  162.  
  163. set_pdata_int(iEnt, 51, DRILL_MA, 4, 4);
  164.  
  165. return PLUGIN_HANDLED;
  166. }
  167.  
  168. public clcmd_weapon_drillgun(id)
  169. {
  170. client_cmd(id, DRILL_CN);
  171. }
  172.  
  173. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  174. {
  175. CheckPlayer(id, FMRES_IGNORED);
  176.  
  177. if(!Get_BitVar(g_TempAttack, id))
  178. return FMRES_IGNORED
  179.  
  180. if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  181. {
  182. if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  183. return FMRES_SUPERCEDE
  184. if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  185. {
  186. if (sample[17] == 'w') return FMRES_SUPERCEDE
  187. else return FMRES_SUPERCEDE
  188. }
  189. if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  190. return FMRES_SUPERCEDE;
  191. }
  192.  
  193. return FMRES_IGNORED
  194. }
  195.  
  196. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  197. {
  198. CheckPlayer(id, FMRES_IGNORED);
  199. if(!Get_BitVar(g_TempAttack, id))
  200. return FMRES_IGNORED
  201.  
  202. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  203.  
  204. pev(id, pev_origin, fOrigin)
  205. pev(id, pev_view_ofs, view_ofs)
  206. xs_vec_add(fOrigin, view_ofs, vecStart)
  207. pev(id, pev_v_angle, v_angle)
  208.  
  209. engfunc(EngFunc_MakeVectors, v_angle)
  210. get_global_vector(GL_v_forward, v_forward)
  211.  
  212. xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  213. xs_vec_add(vecStart, v_forward, vecEnd)
  214.  
  215. engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  216.  
  217. return FMRES_SUPERCEDE
  218. }
  219.  
  220. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  221. {
  222. CheckPlayer(id, FMRES_IGNORED);
  223. if(!Get_BitVar(g_TempAttack, id))
  224. return FMRES_IGNORED
  225.  
  226. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  227.  
  228. pev(id, pev_origin, fOrigin)
  229. pev(id, pev_view_ofs, view_ofs)
  230. xs_vec_add(fOrigin, view_ofs, vecStart)
  231. pev(id, pev_v_angle, v_angle)
  232.  
  233. engfunc(EngFunc_MakeVectors, v_angle)
  234. get_global_vector(GL_v_forward, v_forward)
  235.  
  236. xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  237. xs_vec_add(vecStart, v_forward, vecEnd)
  238.  
  239. engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  240.  
  241. return FMRES_SUPERCEDE
  242. }
  243.  
  244. public fw_FM_UpdateClientData_Post(id, iSendWeapons, cd_handle)
  245. {
  246. CheckPlayer(id, FMRES_IGNORED);
  247.  
  248. if (!is_user_alive(id) || !(g_fHasWeapon & (1 << id))) return FMRES_IGNORED;
  249.  
  250. if (get_player_curweapon(id) != DRILL_ID) return FMRES_IGNORED;
  251.  
  252. new Float:flTime;
  253. global_get(glb_time, flTime);
  254. set_cd(cd_handle, CD_flNextAttack, flTime + 9999.0);
  255.  
  256. return FMRES_IGNORED;
  257. }
  258.  
  259. public fw_FM_SetModel(iEnt, const szModel[])
  260. {
  261. if (!pev_valid(iEnt)) return FMRES_IGNORED;
  262.  
  263. new szClassname[32];
  264. pev(iEnt, pev_classname, szClassname, 31);
  265.  
  266. if (!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
  267.  
  268. if (equal(szModel, ORIG_W_MODEL))
  269. {
  270. new pPlayer = pev(iEnt, pev_owner);
  271. if (g_fHasWeapon & (1 << pPlayer))
  272. {
  273. g_fHasWeapon &= ~(1 << pPlayer);
  274.  
  275. new iWeapon = fm_find_ent_by_owner(-1, DRILL_CN, iEnt);
  276.  
  277. if (!pev_valid(iWeapon)) return FMRES_IGNORED;
  278.  
  279. set_pev(iWeapon, pev_iuser4, 310197);
  280.  
  281. engfunc(EngFunc_SetModel, iEnt, W_MODEL);
  282.  
  283. return FMRES_SUPERCEDE;
  284. }
  285. }
  286.  
  287. return FMRES_IGNORED;
  288. }
  289.  
  290. public fw_Ham_Weapon_WeaponIdle(this)
  291. {
  292. if (!pev_valid(this)) return HAM_IGNORED;
  293.  
  294. if (get_pdata_int(this, 43, 4, 4) != DRILL_ID) return HAM_IGNORED;
  295.  
  296. new pPlayer = get_pdata_cbase(this, 41, 4, 4);
  297.  
  298. CheckPlayer(pPlayer, HAM_IGNORED);
  299.  
  300. if (!is_user_alive(pPlayer) || !(g_fHasWeapon & (1 << pPlayer))) return HAM_IGNORED;
  301.  
  302. set_pdata_int(this, 44, 1, 4, 4);
  303.  
  304. new Float:m_flTimeWeaponIdle = get_pdata_float(this, 48, 4, 4);
  305.  
  306. if (m_flTimeWeaponIdle < 0.0)
  307. {
  308. if (get_pdata_int(this, 55, 4, 4))
  309. {
  310. UTIL_SendWeaponAnim(pPlayer, 2);
  311.  
  312. set_pdata_int(this, 55, 0, 4, 4);
  313.  
  314. m_flTimeWeaponIdle = DRILL_RT + 1.0;
  315. }
  316. else
  317. {
  318. UTIL_SendWeaponAnim(pPlayer, (!get_pdata_int(this, 51, 4, 4)) ? 5 : 0);
  319.  
  320. m_flTimeWeaponIdle = DRILL_IT;
  321. }
  322.  
  323. set_pdata_string(pPlayer, (492) * 4, "carbine", -1 , 20)
  324. }
  325.  
  326. set_pdata_float(this, 48, m_flTimeWeaponIdle, 4, 4);
  327.  
  328. return HAM_SUPERCEDE;
  329. }
  330.  
  331. public fw_Ham_Weapon_PrimaryAttack(this)
  332. {
  333. if (!pev_valid(this)) return HAM_IGNORED;
  334.  
  335. if (get_pdata_int(this, 43, 4, 4) != DRILL_ID) return HAM_IGNORED;
  336.  
  337. new pPlayer = get_pdata_cbase(this, 41, 4, 4);
  338.  
  339. CheckPlayer(pPlayer, HAM_IGNORED);
  340.  
  341. if (!is_user_alive(pPlayer) || !(g_fHasWeapon & (1 << pPlayer))) return HAM_IGNORED;
  342.  
  343. Set_BitVar(g_TempAttack, pPlayer)
  344. static Ent; Ent = fm_get_user_weapon_entity(pPlayer, CSW_KNIFE)
  345. if(pev_valid(Ent)) ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)
  346. UnSet_BitVar(g_TempAttack, pPlayer)
  347.  
  348. new m_iClip = get_pdata_int(this, 51, 4, 4);
  349.  
  350. if (!m_iClip) return HAM_SUPERCEDE;
  351.  
  352. m_iClip--;
  353. set_pdata_int(this, 51, m_iClip, 4, 4);
  354.  
  355. new Float:vV_Angle[3], Float:vPunchangle[3];
  356. pev(pPlayer, pev_v_angle, vV_Angle);
  357. pev(pPlayer, pev_punchangle, vPunchangle);
  358.  
  359. new Float:anglesAim[3];
  360. xs_vec_add(vV_Angle, vPunchangle, anglesAim);
  361. UTIL_MakeVectors(anglesAim);
  362.  
  363. new Float:vecSrc[3], Float:vecDir[3], Float:vVelocity[3];
  364. anglesAim[0] = -anglesAim[0];
  365. global_get(glb_v_up, vecSrc);
  366. xs_vec_mul_scalar(vecSrc, 2.0, vecSrc);
  367. GetGunPosition(pPlayer, vecDir);
  368. xs_vec_sub(vecDir, vecSrc, vecSrc);
  369. global_get(glb_v_forward, vecDir);
  370.  
  371. new iEnt = CreateNail(pPlayer);
  372.  
  373. if (pev_valid(iEnt))
  374. {
  375. set_pev(iEnt, pev_origin, vecSrc);
  376. set_pev(iEnt, pev_angles, anglesAim);
  377. set_pev(iEnt, pev_vuser1, anglesAim);
  378.  
  379. xs_vec_mul_scalar(vecDir, NAIL_SPEED, vVelocity);
  380. set_pev(iEnt, pev_velocity, vVelocity);
  381. set_pev(iEnt, pev_vuser2, vVelocity);
  382.  
  383. set_pev(iEnt, pev_speed, NAIL_SPEED);
  384.  
  385. pev(iEnt, pev_avelocity, vVelocity);
  386. vVelocity[2] = 10.0;
  387. set_pev(iEnt, pev_avelocity, vVelocity);
  388.  
  389. // Create Beam
  390. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  391. write_byte(TE_BEAMFOLLOW)
  392. write_short(iEnt)
  393. write_short(g_SprId_LaserBeam)
  394. write_byte(2)
  395. write_byte(1)
  396. write_byte(42)
  397. write_byte(255)
  398. write_byte(170)
  399. write_byte(150)
  400. message_end()
  401. }
  402.  
  403. set_pdata_float(this, 46, DRILL_ST + DRILL_RT, 4, 4);
  404.  
  405. set_pdata_float(this, 48, DRILL_ST, 4, 4);
  406.  
  407. if (m_iClip > 0) set_pdata_int(this, 55, 1, 4, 4);
  408.  
  409. UTIL_SendWeaponAnim(pPlayer, 1);
  410.  
  411. emit_sound(pPlayer, CHAN_WEAPON, SHOOT_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  412.  
  413.  
  414. return HAM_SUPERCEDE;
  415. }
  416.  
  417. public fw_Ham_Weapon_Reload(this)
  418. {
  419. if (!pev_valid(this)) return HAM_IGNORED;
  420.  
  421. if (get_pdata_int(this, 43, 4, 4) != DRILL_ID) return HAM_IGNORED;
  422.  
  423. new pPlayer = get_pdata_cbase(this, 41, 4, 4);
  424.  
  425. CheckPlayer(pPlayer, HAM_IGNORED);
  426.  
  427. if (!is_user_alive(pPlayer) || !(g_fHasWeapon & (1 << pPlayer))) return HAM_IGNORED;
  428.  
  429. return HAM_SUPERCEDE;
  430. }
  431.  
  432. public fw_Ham_Item_Deploy_Post(this)
  433. {
  434. if (!pev_valid(this)) return HAM_IGNORED;
  435.  
  436. if (get_pdata_int(this, 43, 4, 4) != DRILL_ID) return HAM_IGNORED;
  437.  
  438. new pPlayer = get_pdata_cbase(this, 41, 4, 4);
  439.  
  440. CheckPlayer(pPlayer, HAM_IGNORED);
  441.  
  442. if (!is_user_alive(pPlayer) || !(g_fHasWeapon & (1 << pPlayer))) return HAM_IGNORED;
  443.  
  444. set_pev(pPlayer, pev_viewmodel2, V_MODEL);
  445. set_pev(pPlayer, pev_weaponmodel2, P_MODEL);
  446.  
  447. set_pdata_int(this, 55, 0, 4, 4);
  448.  
  449. UTIL_SendWeaponAnim(pPlayer, (!get_pdata_int(this, 51, 4, 4)) ? 4 : 3);
  450.  
  451. return HAM_IGNORED;
  452. }
  453.  
  454. public fw_Ham_Item_PostFrame(this)
  455. {
  456. if (!pev_valid(this)) return HAM_IGNORED;
  457.  
  458. if (get_pdata_int(this, 43, 4, 4) != DRILL_ID) return HAM_IGNORED;
  459.  
  460. new pPlayer = get_pdata_cbase(this, 41, 4, 4);
  461.  
  462. CheckPlayer(pPlayer, HAM_IGNORED);
  463.  
  464. if (!is_user_alive(pPlayer) || !(g_fHasWeapon & (1 << pPlayer))) return HAM_IGNORED;
  465.  
  466. fw_Ham_Weapon_WeaponIdle(this);
  467.  
  468. return HAM_IGNORED;
  469. }
  470.  
  471. public fw_Ham_Item_AddToPlayer_Post(this, pPlayer)
  472. {
  473. if (!pev_valid(this)) return HAM_IGNORED;
  474.  
  475. if (get_pdata_int(this, 43, 4, 4) != DRILL_ID) return HAM_IGNORED;
  476.  
  477. new pPlayer = get_pdata_cbase(this, 41, 4, 4);
  478.  
  479. CheckPlayer(pPlayer, HAM_IGNORED);
  480.  
  481. if (!is_user_alive(pPlayer)) return HAM_IGNORED;
  482.  
  483. if (pev(this, pev_iuser4) == 310197 || (g_fHasWeapon & (1 << pPlayer)))
  484. {
  485. g_fHasWeapon |= (1 << pPlayer);
  486.  
  487. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, pPlayer);
  488. write_string("weapon_drillgun");
  489. write_byte(DRILL_AI);
  490. write_byte(DRILL_MA);
  491. write_byte(-1);
  492. write_byte(-1);
  493. write_byte(0);
  494. write_byte(1);
  495. write_byte(DRILL_ID);
  496. write_byte(0);
  497. message_end();
  498. }
  499. else
  500. {
  501. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, pPlayer);
  502. write_string(DRILL_CN);
  503. write_byte(DRILL_AI);
  504. write_byte(DRILL_MA);
  505. write_byte(-1);
  506. write_byte(-1);
  507. write_byte(0);
  508. write_byte(1);
  509. write_byte(DRILL_ID);
  510. write_byte(0);
  511. message_end();
  512. }
  513.  
  514. return HAM_IGNORED;
  515. }
  516.  
  517. public fw_Ham_Think(this)
  518. {
  519. if (!pev_valid(this)) return HAM_IGNORED;
  520.  
  521. new szClassname[32];
  522. pev(this, pev_classname, szClassname, 31);
  523.  
  524. if (!equal(szClassname, NAIL_CN)) return HAM_IGNORED;
  525.  
  526. set_pev(this, pev_flags, pev(this, pev_flags) | FL_KILLME);
  527. set_pev(this, pev_targetname, "");
  528.  
  529. return HAM_IGNORED;
  530. }
  531.  
  532. public fw_Ham_Touch(this, iOther)
  533. {
  534. if (!pev_valid(this)) return HAM_IGNORED;
  535.  
  536. new szClassname[32];
  537. pev(this, pev_classname, szClassname, 31);
  538.  
  539. if (!equal(szClassname, NAIL_CN)) return HAM_IGNORED;
  540.  
  541. new Float:vVelocity[3], Float:vecDir[3], Float:vOrigin[3];
  542. pev(this, pev_velocity, vVelocity);
  543. xs_vec_normalize(vVelocity, vecDir);
  544. pev(this, pev_origin, vOrigin);
  545.  
  546. if (pev_valid(iOther))
  547. {
  548. if (iOther == pev(this, pev_iuser1)) return HAM_IGNORED;
  549.  
  550. if (pev(iOther, pev_takedamage))
  551. {
  552. //new tr = create_tr2();
  553.  
  554. /*new Float:vEnd[3];
  555. xs_vec_mul_scalar(vecDir, 8192.0, vEnd);
  556. xs_vec_add(vOrigin, vEnd, vEnd);
  557.  
  558. fm_trace_line_tr(tr, this, vOrigin, vEnd);*/
  559.  
  560. new pOwner = pev(this, pev_owner);
  561.  
  562. //ExecuteHamB(Ham_TraceAttack, iOther, pOwner, NAIL_DAMAGE, vecDir, tr, DMG_BULLET | DMG_NEVERGIB);
  563.  
  564. ExecuteHamB(Ham_TakeDamage, iOther, this, pOwner, NAIL_DAMAGE * DamageMultiply(get_tr2(0, TR_iHitgroup)), DMG_BULLET | DMG_NEVERGIB);
  565.  
  566. //free_tr2(tr);
  567.  
  568. set_pev(this, pev_iuser1, iOther);
  569.  
  570. return HAM_IGNORED;
  571. }
  572. }
  573.  
  574. new Float:flTime;
  575. global_get(glb_time, flTime);
  576. set_pev(this, pev_nextthink, flTime + 3.0);
  577.  
  578. new Float:vAngles[3];
  579. vector_to_angle(vecDir, vAngles);
  580. set_pev(this, pev_angles, vAngles);
  581.  
  582. set_pev(this, pev_solid, SOLID_NOT);
  583. set_pev(this, pev_movetype, MOVETYPE_FLY);
  584. set_pev(this, pev_velocity, g_vecZero);
  585.  
  586. pev(this, pev_avelocity, vVelocity);
  587. vVelocity[2] = 0.0;
  588. set_pev(this, pev_avelocity, vVelocity);
  589.  
  590. DecalGunshot(vOrigin, iOther);
  591.  
  592. return HAM_IGNORED;
  593. }
  594.  
  595. CreateNail(iOwner)
  596. {
  597. new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
  598.  
  599. if (!pev_valid(iEnt)) return -1;
  600.  
  601. set_pev(iEnt, pev_classname, NAIL_CN);
  602. set_pev(iEnt, pev_movetype, MOVETYPE_FLY);
  603. set_pev(iEnt, pev_solid, SOLID_TRIGGER);
  604. set_pev(iEnt, pev_gravity, 0.5);
  605. set_pev(iEnt, pev_owner, iOwner);
  606. set_pev(iEnt, pev_iuser1, iOwner);
  607.  
  608. engfunc(EngFunc_SetModel, iEnt, NAIL_MODEL);
  609.  
  610. new Float:vOrigin[3];
  611. pev(iEnt, pev_origin, vOrigin);
  612. engfunc(EngFunc_SetOrigin, iEnt, vOrigin);
  613.  
  614. engfunc(EngFunc_SetSize, iEnt, g_vecZero, g_vecZero);
  615.  
  616. return iEnt;
  617. }
  618.  
  619. stock DropAllPrimary(id)
  620. {
  621. new weapons[32], num;
  622. get_user_weapons(id, weapons, num);
  623. for (new i = 0; i < num; i++)
  624. if (PRIMARY_WEAPONS_BITSUM & (1 << weapons[i])) client_cmd(id, "drop %s", WEAPONENTNAMES[weapons[i]]);
  625. }
  626.  
  627. stock Float:DamageMultiply(iHitGroup)
  628. {
  629. switch (iHitGroup)
  630. {
  631. case HIT_GENERIC: return 1.0;
  632. case HIT_HEAD: return 4.0;
  633. case HIT_CHEST: return 1.0;
  634. case HIT_STOMACH: return 1.25;
  635. case HIT_LEFTARM: return 1.0;
  636. case HIT_RIGHTARM: return 1.0;
  637. case HIT_LEFTLEG: return 0.75;
  638. case HIT_RIGHTLEG: return 0.75;
  639. default: return 1.0;
  640. }
  641.  
  642. return 1.0;
  643. }
  644.  
  645. stock GetGunPosition(id, Float:out[3])
  646. {
  647. new Float:origin[3], Float:view_ofs[3];
  648. pev(id, pev_origin, origin);
  649. pev(id, pev_view_ofs, view_ofs);
  650. xs_vec_add(origin, view_ofs, out);
  651. }
  652.  
  653. stock UTIL_MakeVectors(Float:vecAngles[3])
  654. {
  655. engfunc(EngFunc_MakeVectors, vecAngles);
  656. }
  657.  
  658. stock UTIL_SendWeaponAnim(id, iAnim)
  659. {
  660. set_pev(id, pev_weaponanim, iAnim);
  661.  
  662. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id);
  663. write_byte(iAnim);
  664. write_byte(0);
  665. message_end();
  666. }
  667.  
  668. stock DecalGunshot(Float:vecEndPos[3], pHit)
  669. {
  670. message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
  671. write_byte(TE_GUNSHOTDECAL);
  672. engfunc(EngFunc_WriteCoord, vecEndPos[0]);
  673. engfunc(EngFunc_WriteCoord, vecEndPos[1]);
  674. engfunc(EngFunc_WriteCoord, vecEndPos[2]);
  675. write_short(pHit);
  676. write_byte(random_num(41,45));
  677. message_end();
  678. }
  679.  
  680. stock get_player_curweapon(id)
  681. {
  682. return (get_pdata_int(get_pdata_cbase(id, 373), 43, 4, 4));
  683. }
  684. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  685. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
  686. */
  687.