HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <cstrike>
  4. #include <dhudmessage>
  5. #include <fun>
  6. #include <fakemeta>
  7. #include <fakemeta_util>
  8. #include <engine>
  9. #include <hamsandwich>
  10. #include <mapname_patcher>
  11. #include <xs>
  12.  
  13. #define PLUGIN "[CSO] Hidden"
  14. #define VERSION "1.0"
  15. #define AUTHOR "RaZzoR"
  16.  
  17. #define DICTIONARY "cso_hidden.txt"
  18.  
  19. #define m_pPlayer 41
  20. #define m_flNextAttack 83
  21.  
  22. new change_team[33], g_hidden[33] , protection_time[33]
  23. new count_number, g_invis_timer, gMsgidShowTimer, gKnifeEntity
  24. new pcvar_max_kill
  25.  
  26. new allow_maps[][][]= {
  27. { "hd_harlem", "Hidden City" }
  28. }
  29.  
  30. new primary_weapons[][][] = {
  31. { "M4A1", "weapon_m4a1", "90" },
  32. { "AK47", "weapon_ak47", "90" },
  33. { "AUG", "weapon_aug", "90" },
  34. { "SG552", "weapon_sg552", "90" },
  35. { "GALIL", "weapon_galil", "90" },
  36. { "FAMAS", "weapon_famas", "90" },
  37. { "SCOUT", "weapon_scout", "90" },
  38. { "AWP", "weapon_awp", "30" },
  39. { "SG550", "weapon_sg550", "90" },
  40. { "M249", "weapon_m249", "200" },
  41. { "G3SG1", "weapon_g3sg1", "90" },
  42. { "MP5NAVY", "weapon_mp5navy", "120" },
  43. { "M3", "weapon_m3", "32" },
  44. { "XM1014", "weapon_xm1014", "32" },
  45. { "TMP", "weapon_tmp", "120" },
  46. { "MAC10", "weapon_mac10", "100" },
  47. { "P90", "weapon_p90", "100" }
  48. }
  49.  
  50. new secondary_weapons[][][] = {
  51. { "USP", "weapon_usp", "100" },
  52. { "GLOCK18", "weapon_glock18", "120" },
  53. { "DEAGLE", "weapon_deagle", "35" },
  54. { "P228", "weapon_p228", "52" },
  55. { "ELITE", "weapon_elite", "120" },
  56. { "FIVESEVEN", "weapon_fiveseven", "100" }
  57. }
  58.  
  59. new const hidden_countsounds[][] = {
  60. "cso_hidden/one.wav",
  61. "cso_hidden/two.wav",
  62. "cso_hidden/three.wav",
  63. "cso_hidden/four.wav",
  64. "cso_hidden/five.wav"
  65. }
  66.  
  67. new const hidden_laugh[][] = {
  68. "cso_hidden/hidden_laugh1.wav",
  69. "cso_hidden/hidden_laugh2.wav",
  70. "cso_hidden/hidden_laugh3.wav"
  71. }
  72.  
  73. new const hidden_speak[][] = {
  74. "cso_hidden/hidden_speak1.wav",
  75. "cso_hidden/hidden_speak2.wav",
  76. "cso_hidden/hidden_speak3.wav",
  77. "cso_hidden/hidden_speak4.wav",
  78. "cso_hidden/hidden_speak5.wav",
  79. "cso_hidden/hidden_speak6.wav",
  80. "cso_hidden/hidden_speak7.wav"
  81. }
  82.  
  83. new const hidden_slash[][] = {
  84. "cso_hidden/joker_slash1.wav",
  85. "cso_hidden/joker_slash2.wav",
  86. "cso_hidden/joker_slash3.wav"
  87. }
  88.  
  89. new const hidden_hit[][] = {
  90. "cso_hidden/joker_slash_hit1.wav",
  91. "cso_hidden/joker_slash_hit2.wav",
  92. "cso_hidden/joker_slash_hit3.wav"
  93. }
  94.  
  95. new const hidden_knife_model[][] = {
  96. "models/cso_hidden/v_joker.mdl",
  97. "models/cso_hidden/p_joker.mdl"
  98. }
  99.  
  100. new const hidden_sprites[][] = {
  101. "knife_joker_csohd",
  102. "sprites/cso_hidden/640hud68.spr"
  103. }
  104.  
  105. new const Float:PrimaryDamage[] = {
  106. 60.0,
  107. 65.0,
  108. 60.0,
  109. 60.0,
  110. 60.0,
  111. 60.0,
  112. 60.0,
  113. 60.0
  114. }
  115.  
  116. new const Float:SecondaryDamage[] = {
  117. 120.0,
  118. 260.0,
  119. 120.0,
  120. 120.0,
  121. 120.0,
  122. 120.0,
  123. 120.0,
  124. 120.0
  125. }
  126.  
  127. new const hidden_BHitFlesh[][] = {
  128. "player/bhit_flesh-1.wav",
  129. "player/bhit_flesh-2.wav",
  130. "player/bhit_flesh-3.wav"
  131. }
  132.  
  133. #define ATTACK_PRIMARY 1
  134. #define ATTACK_SECONDARY 2
  135.  
  136. new const hidden_death[] = "cso_hidden/hidden_death.wav"
  137. new const hidden_slash3_hit[] = "cso_hidden/joker_slash3_hit.wav"
  138. new const hidden_player_model[] = "cso_joker"
  139.  
  140. new const hidden_gamename[] = "Hidden"
  141.  
  142. new const FIRST_JOIN_MSG[] = "#Team_Select"
  143. new const FIRST_JOIN_MSG_SPEC[] = "#Team_Select_Spect"
  144. new const INGAME_JOIN_MSG[] = "#IG_Team_Select"
  145. new const INGAME_JOIN_MSG_SPEC[] = "#IG_Team_Select_Spect"
  146. const iMaxLen = sizeof(INGAME_JOIN_MSG_SPEC)
  147.  
  148. public plugin_init()
  149. {
  150. register_dictionary(DICTIONARY)
  151.  
  152. new map_name[32], buffer[128], index
  153. get_mapname(map_name, 31)
  154.  
  155. for(index=0;index<sizeof(allow_maps);index++)
  156. {
  157. if(equal(map_name, allow_maps[index][0]))
  158. {
  159. if(strlen(allow_maps[index][1]) > 0)
  160. Patch_MapName(allow_maps[index][1])
  161. break
  162. }
  163. }
  164.  
  165. if(index == sizeof(allow_maps))
  166. {
  167. formatex(buffer, sizeof(buffer), "%L", LANG_SERVER, "HIDDEN_WRONG_MAP")
  168. set_fail_state(buffer)
  169. return
  170. }
  171.  
  172. register_plugin(PLUGIN, VERSION, AUTHOR)
  173.  
  174. gMsgidShowTimer = get_user_msgid("ShowTimer")
  175.  
  176. set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
  177.  
  178. pcvar_max_kill = register_cvar("Hidden_Max_Score", "60")
  179.  
  180. RegisterHam(Ham_Spawn, "player", "Spawn", 1)
  181. RegisterHam(Ham_Touch, "armoury_entity", "FwdHamPickupWeapon")
  182. RegisterHam(Ham_Touch, "weaponbox", "FwdHamPickupWeapon")
  183. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "fwd_Weapon_PrimaryAttack_Pre");
  184. RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "fwd_Weapon_SecondaryAttack_Pre");
  185. RegisterHam(Ham_TraceAttack, "player", "fwd_TraceAttack_Pre")
  186.  
  187. if((gKnifeEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "weapon_knife"))))
  188. set_pdata_int(gKnifeEntity, m_pPlayer, 0, 4)
  189.  
  190. register_message(get_user_msgid("RoundTime"),"Event_RoundTime")
  191. register_message(get_user_msgid("StatusIcon"), "msgStatusIcon")
  192. register_message(get_user_msgid("HideWeapon"), "msgHideWeapon")
  193. register_message(get_user_msgid("ShowMenu"), "msgShowMenu")
  194. register_message(get_user_msgid("VGUIMenu"), "msgVGUIMenu")
  195. register_message(get_user_msgid("Health"), "message_Health")
  196.  
  197. register_clcmd("nightvision", "block_cmd")
  198. register_clcmd("chooseteam", "block_cmd")
  199.  
  200. register_forward(FM_EmitSound, "Forward_EmitSound")
  201. register_forward(FM_GetGameDescription, "GameDesc")
  202. register_forward(FM_ClientKill, "Forward_ClientKill")
  203. register_forward(FM_CmdStart, "fwCmdStart")
  204. register_forward(FM_SetModel, "SetModel")
  205.  
  206. register_event("RoundTime", "no_hostages", "bc")
  207. register_event("BombDrop", "Event_BombDropped", "a", "4=1")
  208. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  209. register_event("DeathMsg", "death", "a")
  210. register_event("ResetHUD", "onResetHUD", "b")
  211.  
  212. no_bomb()
  213. no_hostages()
  214. }
  215.  
  216. public plugin_cfg()
  217. {
  218. server_cmd("mp_limitteams 32")
  219. server_cmd("sv_restart 1")
  220. server_cmd("mp_playerid 1")
  221. server_cmd("mp_flashlight 1")
  222. server_cmd("sv_maxspeed 380")
  223. }
  224.  
  225. public plugin_precache()
  226. {
  227. new buffer[128]
  228.  
  229. for(new i;i<sizeof(hidden_countsounds);i++)
  230. precache_sound(hidden_countsounds[i])
  231.  
  232. for(new i;i<sizeof(hidden_laugh);i++)
  233. precache_sound(hidden_laugh[i])
  234.  
  235. for(new i;i<sizeof(hidden_speak);i++)
  236. precache_sound(hidden_speak[i])
  237.  
  238. for(new i;i<sizeof(hidden_slash);i++)
  239. precache_sound(hidden_slash[i])
  240.  
  241. for(new i;i<sizeof(hidden_hit);i++)
  242. precache_sound(hidden_hit[i])
  243.  
  244. for(new i;i<sizeof(hidden_knife_model);i++)
  245. precache_model(hidden_knife_model[i])
  246.  
  247. precache_sound(hidden_death)
  248. precache_sound(hidden_slash3_hit)
  249. precache_generic(hidden_sprites[1])
  250.  
  251. formatex(buffer, sizeof(buffer), "models/player/%s/%s.mdl", hidden_player_model, hidden_player_model)
  252. precache_model(buffer)
  253.  
  254. formatex(buffer, sizeof(buffer), "sprites/%s.txt", hidden_sprites[0])
  255. precache_generic(buffer)
  256.  
  257. register_clcmd(hidden_sprites[0], "weapon_hook")
  258. }
  259.  
  260. public weapon_hook(id)
  261. {
  262. engclient_cmd(id, "weapon_knife")
  263. return PLUGIN_HANDLED
  264. }
  265.  
  266. public block_cmd(id)
  267. return PLUGIN_HANDLED
  268.  
  269. public Forward_ClientKill(id)
  270. return FMRES_SUPERCEDE
  271.  
  272. public onResetHUD(id)
  273. {
  274. message_begin(MSG_ONE, get_user_msgid("HideWeapon"), _, id)
  275. write_byte((1<<5))
  276. message_end()
  277. }
  278.  
  279. public message_Health(msgid, dest, id)
  280. {
  281. if(!is_user_alive(id))
  282. return PLUGIN_CONTINUE
  283.  
  284. static hp
  285. hp = get_msg_arg_int(1)
  286.  
  287. if(hp > 255)
  288. set_msg_arg_int(1, ARG_BYTE, 255)
  289.  
  290. return PLUGIN_CONTINUE
  291. }
  292.  
  293. public msgHideWeapon()
  294. set_msg_arg_int(1, ARG_BYTE, get_msg_arg_int(1) | (1<<5))
  295.  
  296. public SetModel(iEnt, szModel[])
  297. {
  298. if(equal(szModel, "models/w_", 9))
  299. {
  300. if(szModel[9] != 'h' && !equal(szModel[9], "sm", 2) && !equal(szModel[9], "fl", 2))
  301. set_pev(iEnt, pev_nextthink, get_gametime() + 10.0)
  302. }
  303. }
  304.  
  305. public FwdHamPickupWeapon(ent, id)
  306. {
  307. if(is_user_alive(id) && g_hidden[id])
  308. return HAM_SUPERCEDE
  309. return HAM_IGNORED
  310. }
  311.  
  312. public fwCmdStart(id, uc_handle, seed)
  313. {
  314. if(get_uc(uc_handle, UC_Impulse) == 100)
  315. {
  316. if(g_hidden[id])
  317. {
  318. set_uc(uc_handle, UC_Impulse, 0)
  319. return FMRES_HANDLED
  320. }
  321.  
  322. else
  323. {
  324. if(pev(id, pev_effects) & EF_DIMLIGHT)
  325. set_pev(id, pev_impulse, 100)
  326. }
  327. }
  328.  
  329. return FMRES_IGNORED
  330. }
  331.  
  332. public msgShowMenu(iMsgid, iDest, id)
  333. {
  334. static sMenuCode[iMaxLen]
  335. get_msg_arg_string(4, sMenuCode, sizeof(sMenuCode) - 1)
  336.  
  337. if(equal(sMenuCode, FIRST_JOIN_MSG) || equal(sMenuCode, FIRST_JOIN_MSG_SPEC))
  338. {
  339. set_autojoin_task(id, iMsgid)
  340. return PLUGIN_HANDLED
  341. }
  342. else if(equal(sMenuCode, INGAME_JOIN_MSG) || equal(sMenuCode, INGAME_JOIN_MSG_SPEC))
  343. return PLUGIN_HANDLED
  344.  
  345. return PLUGIN_CONTINUE
  346. }
  347.  
  348. public msgVGUIMenu(iMsgid, iDest, id)
  349. {
  350. if(get_msg_arg_int(1) != 2)
  351. return PLUGIN_CONTINUE
  352.  
  353. set_autojoin_task(id, iMsgid)
  354.  
  355. return PLUGIN_HANDLED
  356. }
  357.  
  358. public task_Autojoin(iParam[], id)
  359. handle_join(id, iParam[0])
  360.  
  361. handle_join(id, iMsgid)
  362. {
  363. new iMsgBlock = get_msg_block(iMsgid)
  364. set_msg_block(iMsgid, BLOCK_SET)
  365.  
  366. new players[32], pnum
  367. get_players(players, pnum, "ae", "TERRORIST")
  368. if(pnum == 0)
  369. {
  370. engclient_cmd(id, "jointeam", "1")
  371. g_hidden[id] = true
  372. }
  373.  
  374. else
  375. engclient_cmd(id, "jointeam", "2")
  376.  
  377. new iClass[2]
  378. iClass[0] = random_num('1', '4')
  379. engclient_cmd(id, "joinclass", iClass)
  380.  
  381. if(is_user_alive(id))
  382. user_silentkill(id)
  383.  
  384. set_user_frags(id, 0)
  385. set_task(0.2, "respawn_task", id)
  386. set_task(1.0, "Hidden_HUD", id)
  387.  
  388. set_msg_block(iMsgid, iMsgBlock)
  389. }
  390.  
  391. set_autojoin_task(id, iMsgid)
  392. {
  393. new iParam[1]
  394. iParam[0] = iMsgid
  395. set_task(0.1, "task_Autojoin", id, iParam, sizeof(iParam))
  396. }
  397.  
  398. public Event_RoundTime(const MsgId, const MsgDest, const MsgEnt)
  399. set_msg_arg_int(1, ARG_SHORT, get_timeleft())
  400.  
  401. public Event_BombDropped()
  402. {
  403. message_begin(MSG_BROADCAST, gMsgidShowTimer)
  404. message_end()
  405. }
  406.  
  407. public msgStatusIcon(msgid, msgdest, id)
  408. {
  409. static szIcon[8]
  410. get_msg_arg_string(2, szIcon, 7)
  411.  
  412. if(equal(szIcon, "buyzone") && get_msg_arg_int(1))
  413. {
  414. set_pdata_int(id, 235, get_pdata_int(id, 235) & ~(1<<0))
  415. return PLUGIN_HANDLED
  416. }
  417.  
  418. return PLUGIN_CONTINUE
  419. }
  420.  
  421. public no_bomb()
  422. {
  423. new fhosr = find_ent_by_class(-1, "func_hostage_rescue")
  424. while(fhosr > get_maxplayers())
  425. {
  426. entity_set_int(fhosr, EV_INT_flags, FL_KILLME)
  427. fhosr = find_ent_by_class(fhosr, "func_hostage_rescue")
  428. }
  429.  
  430. new doneonce = 0
  431. new fbombt = find_ent_by_class(-1, "func_bomb_target")
  432. while(fbombt > get_maxplayers())
  433. {
  434. entity_set_int(fbombt, EV_INT_flags, FL_KILLME)
  435. doneonce = 1
  436. fbombt = find_ent_by_class(fbombt, "func_bomb_target")
  437. }
  438.  
  439. if(doneonce == 1)server_cmd("sv_restartround 1")
  440. new ibombt = find_ent_by_class(-1, "info_bomb_target")
  441. while(ibombt > get_maxplayers())
  442. {
  443. entity_set_int(ibombt, EV_INT_flags, FL_KILLME)
  444. ibombt = find_ent_by_class(ibombt, "info_bomb_target")
  445. }
  446.  
  447. new fescape = find_ent_by_class(-1, "func_escapezone")
  448. while(fescape > get_maxplayers())
  449. {
  450. entity_set_int(fescape, EV_INT_flags, FL_KILLME)
  451. fescape = find_ent_by_class(fescape, "func_escapezone")
  452. }
  453.  
  454. new fvips = find_ent_by_class(-1, "func_vip_safteyzone")
  455. while(fvips > get_maxplayers())
  456. {
  457. entity_set_int(fvips, EV_INT_flags, FL_KILLME)
  458. fvips = find_ent_by_class(fvips, "func_vip_safteyzone")
  459. }
  460.  
  461. new fvipst = find_ent_by_class(-1, "func_vip_start")
  462. while(fvipst > get_maxplayers())
  463. {
  464. entity_set_int(fvipst, EV_INT_flags, FL_KILLME)
  465. fvipst = find_ent_by_class(fvipst, "func_vip_start")
  466. }
  467.  
  468. return PLUGIN_CONTINUE
  469. }
  470.  
  471. public no_hostages()
  472. {
  473. new iHos = find_ent_by_class(-1, "hostage_entity")
  474. while(iHos > get_maxplayers())
  475. {
  476. entity_set_int(iHos, EV_INT_flags, FL_KILLME)
  477. iHos = find_ent_by_class(iHos, "hostage_entity")
  478. }
  479.  
  480. new jHos = find_ent_by_class(-1, "monster_scientist")
  481. while(iHos > get_maxplayers())
  482. {
  483. entity_set_int(jHos, EV_INT_flags, FL_KILLME)
  484. iHos = find_ent_by_class(jHos, "monster_scientist")
  485. }
  486. }
  487.  
  488. public client_disconnect(id)
  489. {
  490. if(g_hidden[id])
  491. {
  492. static player
  493. player = get_random_ct()
  494.  
  495. new random_name[32]
  496. get_user_name(player, random_name, charsmax(random_name))
  497.  
  498. new players[32], pnum, tempid
  499. get_players(players, pnum, "ae", "CT")
  500. for(new i=0;i<pnum;i++)
  501. {
  502. tempid = players[i]
  503. set_dhudmessage(0, 51, 255, -1.0, 0.28, 0, 6.0, 2.0, 0.1, 0.2)
  504. show_dhudmessage(tempid, "%L^n%L", tempid, "HIDDEN_LEFT", tempid, "HIDDEN_BECAME", random_name)
  505. }
  506.  
  507. if(player > 0)
  508. {
  509. cs_set_user_team(player, CS_TEAM_T)
  510. g_hidden[player] = true
  511. set_task(0.1, "respawn_task", player)
  512. }
  513. }
  514. }
  515.  
  516. public fwd_TraceAttack_Pre(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagebits)
  517. {
  518. if(1 <= attacker <= get_maxplayers() && g_hidden[attacker])
  519. return HAM_SUPERCEDE
  520.  
  521. return HAM_IGNORED
  522. }
  523.  
  524. public fwd_Weapon_PrimaryAttack_Pre(ent)
  525. ProcessAttack(ent, ATTACK_PRIMARY)
  526.  
  527. public fwd_Weapon_SecondaryAttack_Pre(ent)
  528. ProcessAttack(ent, ATTACK_SECONDARY)
  529.  
  530. ProcessAttack(ent, AttackType)
  531. {
  532. new id = get_pdata_cbase(ent, m_pPlayer, 4)
  533.  
  534. if(!g_hidden[id])
  535. return
  536.  
  537. new TaskData[2]
  538. TaskData[0] = id
  539. TaskData[1] = AttackType
  540.  
  541. set_pdata_float(id, m_flNextAttack, AttackType == ATTACK_PRIMARY ? 1.0 : 1.2, 5)
  542. set_task(AttackType == ATTACK_PRIMARY ? 0.1 : 0.9, "task_DelayAttack", id, TaskData, 2)
  543. }
  544.  
  545. public task_DelayAttack(TaskData[])
  546. {
  547. new id = TaskData[0]
  548. new AttackType = TaskData[1]
  549.  
  550. new Float:viewofs[3]
  551. new Float:start[3]
  552. new Float:end[3]
  553. new Float:AimVec[3]
  554.  
  555. pev(id, pev_origin, start)
  556. pev(id, pev_view_ofs, viewofs)
  557. xs_vec_add(start, viewofs, start)
  558.  
  559. velocity_by_aim(id, 1, AimVec)
  560. xs_vec_mul_scalar(AimVec, AttackType == ATTACK_PRIMARY ? 48.0 : 32.0, end)
  561. xs_vec_add(start, end, end)
  562.  
  563. new hTrace, Float:trFraction, bool:trHull
  564.  
  565. engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, id, hTrace)
  566. get_tr2(hTrace, TR_flFraction, trFraction)
  567.  
  568. if(trFraction >= 1.00)
  569. {
  570. engfunc(EngFunc_TraceHull, start, end, DONT_IGNORE_MONSTERS, HULL_HEAD, id, hTrace)
  571. get_tr2(hTrace, TR_flFraction, trFraction)
  572. trHull = true
  573. }
  574.  
  575. if (trFraction >= 1.00)
  576. emit_sound(id, CHAN_WEAPON, hidden_slash[random(sizeof hidden_slash)], VOL_NORM, ATTN_NORM, 0, 94)
  577. else
  578. {
  579. new trPlayer = get_tr2(hTrace, TR_pHit)
  580.  
  581. if(is_user_alive(id) && get_user_team(id) != get_user_team(trPlayer) && 1 <= trPlayer <= get_maxplayers())
  582. {
  583. emit_sound(trPlayer, CHAN_VOICE, hidden_BHitFlesh[random(sizeof hidden_BHitFlesh)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  584.  
  585. new hTraceAttack = create_tr2()
  586.  
  587. if(trHull)
  588. engfunc(EngFunc_TraceHull, start, end, DONT_IGNORE_MONSTERS, HULL_HEAD, id, hTraceAttack)
  589. else
  590. engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, id, hTraceAttack)
  591.  
  592. set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 175)
  593.  
  594. ExecuteHam(Ham_TraceAttack, trPlayer, id, AttackType == ATTACK_PRIMARY ? PrimaryDamage[0] : SecondaryDamage[0], AimVec, hTraceAttack, DMG_BULLET|DMG_NEVERGIB)
  595.  
  596. free_tr2(hTraceAttack)
  597.  
  598. if(AttackType == ATTACK_PRIMARY)
  599. {
  600. emit_sound(id, CHAN_WEAPON, hidden_hit[random(sizeof hidden_hit)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  601. ExecuteHam(Ham_TakeDamage, trPlayer, gKnifeEntity, id, PrimaryDamage[get_tr2(hTrace, TR_iHitgroup)] * 1.2, DMG_BULLET|DMG_NEVERGIB)
  602. }
  603.  
  604. else
  605. {
  606. emit_sound(id, CHAN_WEAPON, hidden_slash3_hit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  607. ExecuteHam(Ham_TakeDamage, trPlayer, gKnifeEntity, id, (SecondaryDamage[get_tr2(hTrace, TR_iHitgroup)] * 1.2 * ((IsBackstab(id, trPlayer)) ? 3.0 : 1.0)), DMG_BULLET|DMG_NEVERGIB)
  608. }
  609. }
  610.  
  611. else
  612. emit_sound(id, CHAN_ITEM, hidden_hit[1], VOL_NORM, ATTN_NORM, 0, random_num(98, 101))
  613. }
  614.  
  615. free_tr2(hTrace)
  616. }
  617.  
  618. bool:IsBackstab(const attacker, const victim)
  619. {
  620. new Float: vec1[3]
  621. new Float: vec2[3]
  622.  
  623. velocity_by_aim(attacker, 1, vec1)
  624.  
  625. new Float:invlen = xs_rsqrt(vec1[0] * vec1[0] + vec1[1] * vec1[1])
  626. vec1[0] *= invlen
  627. vec1[1] *= invlen
  628.  
  629. pev(victim, pev_angles, vec2)
  630. angle_vector(vec2, ANGLEVECTOR_FORWARD, vec2)
  631.  
  632. return vec1[0] * vec2[0] + vec1[1] * vec2[1] > 0.8 ? true : false
  633. }
  634.  
  635. public Forward_EmitSound(id, channel, const sound[], Float:vol, Float:attn, flags, pitch)
  636. {
  637. if(is_user_connected(id) && g_hidden[id] && (channel == CHAN_WEAPON || channel == CHAN_ITEM ) && equal(sound, "weapons/knife_", 14) && ! equal(sound[14], "deploy", 6))
  638. return FMRES_SUPERCEDE
  639.  
  640. return FMRES_IGNORED
  641. }
  642.  
  643. public death()
  644. {
  645. new attacker = read_data(1)
  646. new victim = read_data(2)
  647. new attacker_name[32]
  648.  
  649. get_user_name(attacker, attacker_name, charsmax(attacker_name))
  650.  
  651. if(attacker == victim || get_user_team(attacker) == get_user_team(victim) || !attacker || !victim)
  652. {
  653. set_task(3.0, "respawn_task", victim)
  654. remove_screenfade(victim)
  655. }
  656.  
  657. else if(g_hidden[attacker] && get_user_team(attacker) == 1)
  658. {
  659. g_invis_timer = 0
  660. invis_count()
  661.  
  662. set_task(3.0, "respawn_task", victim)
  663. client_cmd(0, "speak ^"%s^"", hidden_laugh[random(sizeof(hidden_laugh))])
  664.  
  665. give_screenfade(attacker)
  666. }
  667.  
  668. else
  669. {
  670. client_cmd(0, "speak ^"%s^"", hidden_death)
  671. set_user_frags(attacker, get_user_frags(attacker) + 2)
  672.  
  673. remove_screenfade(victim)
  674. set_rendering(victim, kRenderFxNone, 0, 0, 0, kRenderNormal, 0)
  675.  
  676. set_dhudmessage(0, 51, 255, -1.0, 0.28, 0, 6.0, 1.5, 0.1, 0.2)
  677. show_dhudmessage(0, "%L", LANG_PLAYER, "HIDDEN_KILLED", attacker_name)
  678.  
  679. g_hidden[victim] = false
  680.  
  681. change_team[attacker] = true
  682. change_team[victim] = true
  683. set_task(1.0, "Change_Teams", victim)
  684.  
  685. count_number = 5
  686. set_task(2.0, "count_and_choose_hidden")
  687. }
  688. }
  689.  
  690. public count_and_choose_hidden()
  691. {
  692. if(count_number <= 0)
  693. {
  694. set_task(0.2, "choose_hidden")
  695. return
  696. }
  697.  
  698. client_cmd(0, "speak ^"%s^"", hidden_countsounds[count_number-1])
  699.  
  700. set_dhudmessage(0, 51, 255, -1.0, 0.28, 0, 6.0, 0.5, 0.1, 0.2)
  701. show_dhudmessage(0, "%L", LANG_PLAYER, "HIDDEN_COUNTDOWN_MSG", count_number)
  702.  
  703. count_number--
  704.  
  705. set_task(1.0, "count_and_choose_hidden")
  706. }
  707.  
  708. public Change_Teams(id)
  709. {
  710. if(change_team[id])
  711. {
  712. switch(cs_get_user_team(id))
  713. {
  714. case CS_TEAM_CT:
  715. {
  716. g_hidden[id] = true
  717.  
  718. new hidden_name[32]
  719. get_user_name(id, hidden_name, charsmax(hidden_name))
  720.  
  721. cs_set_user_team(id, CS_TEAM_T)
  722. set_task(0.1, "respawn_task", id)
  723.  
  724. new players[32], pnum, tempid
  725. get_players(players, pnum, "ae", "CT")
  726. for(new i=0;i<pnum;i++)
  727. {
  728. tempid = players[i]
  729. set_dhudmessage(0, 51, 255, -1.0, 0.28, 0, 6.0, 2.0, 0.1, 0.2)
  730. show_dhudmessage(tempid, "%L", tempid, "HIDDEN_BECAME", hidden_name)
  731. }
  732. }
  733.  
  734. case CS_TEAM_T:
  735. {
  736. cs_set_user_team(id, CS_TEAM_CT)
  737. cs_set_user_model(id, "gsg9")
  738. set_task(3.0, "respawn_task", id)
  739. }
  740. }
  741. }
  742. }
  743.  
  744. public choose_hidden()
  745. {
  746. new players[32], pnum, tempid
  747. get_players(players, pnum, "ae", "CT")
  748.  
  749. for(new i=0;i<pnum;i++)
  750. {
  751. tempid = players[i]
  752. set_task(0.2, "Change_Teams", tempid)
  753. }
  754. }
  755.  
  756. public Spawn(id)
  757. {
  758. if(!is_user_alive(id))
  759. return
  760.  
  761. change_team[id] = false
  762.  
  763. strip_user_weapons(id)
  764. give_item(id, "weapon_knife")
  765.  
  766. if(g_hidden[id])
  767. set_task(0.2, "hidden_stuff", id)
  768. else
  769. set_task(0.2, "human_stuff", id)
  770. }
  771.  
  772. public Event_CurWeapon(id)
  773. {
  774. if(!g_hidden[id])
  775. return PLUGIN_HANDLED
  776.  
  777. new weapon = read_data(2)
  778. if(weapon == CSW_KNIFE)
  779. {
  780. entity_set_string(id, EV_SZ_viewmodel, hidden_knife_model[0])
  781. entity_set_string(id, EV_SZ_weaponmodel, hidden_knife_model[1])
  782. }
  783.  
  784. set_speed(id)
  785.  
  786. return PLUGIN_HANDLED
  787. }
  788.  
  789. public give_screenfade(id)
  790. {
  791. message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0, 0, 0}, id)
  792. write_short(~0)
  793. write_short(~0)
  794. write_short(0x0004)
  795. write_byte(110)
  796. write_byte(223)
  797. write_byte(69)
  798. write_byte(100)
  799. message_end()
  800. }
  801.  
  802. public remove_screenfade(id)
  803. {
  804. message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
  805. write_short(1<<12)
  806. write_short(1<<8)
  807. write_short(1<<1)
  808. write_byte(0)
  809. write_byte(0)
  810. write_byte(0)
  811. write_byte(255)
  812. message_end()
  813. }
  814.  
  815. public set_speed(id)
  816. {
  817. if(!is_user_alive(id))
  818. return PLUGIN_HANDLED
  819.  
  820. if(g_hidden[id])
  821. set_user_maxspeed(id, 380.0)
  822. else
  823. set_user_maxspeed(id, 250.0)
  824.  
  825. return PLUGIN_HANDLED
  826. }
  827.  
  828. public respawn_task(id)
  829. ExecuteHamB(Ham_CS_RoundRespawn, id)
  830.  
  831. public map_change()
  832. {
  833. new players[32], pnum, tempid
  834. get_players(players, pnum)
  835.  
  836. for(new i=0;i<pnum;i++)
  837. {
  838. tempid = players[i]
  839. set_user_godmode(tempid, 0)
  840. }
  841.  
  842. server_cmd("changelevel %s", allow_maps[random(sizeof(allow_maps))][0])
  843. }
  844.  
  845. public GameDesc()
  846. {
  847. forward_return(FMV_STRING, hidden_gamename)
  848. return FMRES_SUPERCEDE
  849. }
  850.  
  851. public CountDown(id)
  852. {
  853. if(protection_time[id] <= 0)
  854. {
  855. set_user_godmode(id, 0)
  856. set_rendering(id, kRenderFxNone, 0, 0, 0, kRenderNormal, 0)
  857.  
  858. return
  859. }
  860.  
  861. protection_time[id]--
  862.  
  863. set_task(1.0, "CountDown", id)
  864. }
  865.  
  866. public Hidden_HUD(id)
  867. {
  868. new players[32], num, top1
  869. new top1_name[32]
  870.  
  871. get_players(players, num)
  872. SortCustom1D(players, num, "sort_bestplayer")
  873.  
  874. top1 = players[0]
  875. get_user_name(top1, top1_name, charsmax(top1_name))
  876.  
  877. set_hudmessage(255, 255, 255, -1.0, 0.00, 0, 6.0, 2.0)
  878. show_hudmessage(id, "|%i| [%i %L] |%L %i|", get_user_frags(id), get_pcvar_num(pcvar_max_kill), LANG_PLAYER, "HIDDEN_HUD_KILL", LANG_PLAYER, "HIDDEN_HUD_1ST", get_user_frags(top1))
  879.  
  880. if(get_user_frags(top1) == get_pcvar_num(pcvar_max_kill) || get_timeleft() <= 0)
  881. {
  882. new players[32], pnum, tempid
  883. get_players(players, pnum)
  884.  
  885. for(new i=0;i<pnum;i++)
  886. {
  887. tempid = players[i]
  888. set_user_godmode(tempid, 1)
  889. }
  890.  
  891. client_print(0, print_center, "%L", LANG_PLAYER, "HIDDEN_WIN_NAME", top1_name)
  892. set_task(1.5, "map_change")
  893. }
  894.  
  895. set_task(1.0, "Hidden_HUD", id)
  896. }
  897.  
  898. public invis_count()
  899. {
  900. if(g_invis_timer >= 60)
  901. {
  902. new players[32], pnum, tempid
  903. get_players(players, pnum, "ae", "TERRORIST")
  904.  
  905. for(new i=0;i<pnum;i++)
  906. {
  907. tempid = players[i]
  908. set_user_rendering(tempid, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 152)
  909. }
  910. }
  911.  
  912. else
  913. {
  914. new players[32], pnum, tempid
  915. get_players(players, pnum, "ae", "TERRORIST")
  916.  
  917. for(new i=0;i<pnum;i++)
  918. {
  919. tempid = players[i]
  920. set_user_rendering(tempid, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0 + (g_invis_timer*(152/60)))
  921. }
  922.  
  923. g_invis_timer++
  924. set_task(1.0, "invis_count")
  925. }
  926. }
  927.  
  928. public hidden_stuff(id)
  929. {
  930. client_cmd(0, "speak ^"%s^"", hidden_speak[random(sizeof(hidden_speak))])
  931.  
  932. set_dhudmessage(0, 51, 255, -1.0, 0.28, 0, 6.0, 2.0, 0.1, 0.2)
  933. switch(random(4))
  934. {
  935. case 0: show_dhudmessage(id, "%L", id, "HIDDEN_SPEAKRAND1")
  936. case 1: show_dhudmessage(id, "%L", id, "HIDDEN_SPEAKRAND2")
  937. case 2: show_dhudmessage(id, "%L", id, "HIDDEN_SPEAKRAND3")
  938. case 3: show_dhudmessage(id, "%L", id, "HIDDEN_SPEAKRAND4")
  939. }
  940.  
  941. g_hidden[id] = true
  942.  
  943. cs_set_user_model(id, hidden_player_model)
  944.  
  945. set_user_footsteps(id, 1)
  946. set_user_health(id, 300)
  947. set_user_armor(id, 100)
  948. set_user_gravity(id, 0.6)
  949.  
  950. give_screenfade(id)
  951.  
  952. entity_set_string(id, EV_SZ_viewmodel, hidden_knife_model[0])
  953. entity_set_string(id, EV_SZ_weaponmodel, hidden_knife_model[1])
  954.  
  955. g_invis_timer = 0
  956. invis_count()
  957.  
  958. message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0,0,0}, id)
  959. write_string(hidden_sprites[0])
  960. write_byte(-1)
  961. write_byte(-1)
  962. write_byte(-1)
  963. write_byte(-1)
  964. write_byte(2)
  965. write_byte(1)
  966. write_byte(CSW_KNIFE)
  967. message_end()
  968. }
  969.  
  970. public human_stuff(id)
  971. {
  972. g_hidden[id] = false
  973.  
  974. set_user_footsteps(id, 0)
  975. set_user_health(id, 100)
  976. set_user_armor(id, 100)
  977. set_user_gravity(id, 1.0)
  978.  
  979. set_speed(id)
  980.  
  981. set_user_godmode(id, 1)
  982. set_rendering(id, kRenderFxGlowShell, 255, 255, 255, kRenderNormal, 16)
  983. protection_time[id] = 3
  984. CountDown(id)
  985.  
  986. message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0,0,0}, id)
  987. write_string("weapon_knife")
  988. write_byte(-1)
  989. write_byte(-1)
  990. write_byte(-1)
  991. write_byte(-1)
  992. write_byte(2)
  993. write_byte(1)
  994. write_byte(CSW_KNIFE)
  995. message_end()
  996.  
  997. weapon_menu_sec(id)
  998. }
  999.  
  1000. public weapon_menu_sec(id)
  1001. {
  1002. new menu_line[64], i_data[64]
  1003. format(menu_line, charsmax(menu_line), "%L", id, "HIDDEN_SEC")
  1004.  
  1005. new menu = menu_create(menu_line, "sec_handler")
  1006.  
  1007. for(new i=0;i<sizeof(secondary_weapons);i++)
  1008. {
  1009. num_to_str(i, i_data, sizeof(i_data))
  1010. menu_additem(menu, secondary_weapons[i][0], i_data, 0)
  1011. }
  1012.  
  1013. menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
  1014. menu_display(id, menu, 0)
  1015.  
  1016. return PLUGIN_HANDLED
  1017. }
  1018.  
  1019. public sec_handler(id, menu, item)
  1020. {
  1021. if(item == MENU_EXIT)
  1022. {
  1023. menu_destroy(menu)
  1024. return PLUGIN_HANDLED
  1025. }
  1026.  
  1027. new data[64], szName[64]
  1028. new access, callback
  1029. menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
  1030.  
  1031. new key = str_to_num(data)
  1032. new weapon_id = get_weaponid(secondary_weapons[key][1])
  1033. new convert_to_num = str_to_num(secondary_weapons[key][2])
  1034.  
  1035. give_item(id, secondary_weapons[key][1])
  1036.  
  1037. cs_set_user_bpammo(id, weapon_id, convert_to_num)
  1038.  
  1039. weapon_menu_pri(id)
  1040.  
  1041. return PLUGIN_CONTINUE
  1042. }
  1043.  
  1044. public weapon_menu_pri(id)
  1045. {
  1046. new menu_line[64], i_data[64]
  1047. format(menu_line, charsmax(menu_line), "%L", id, "HIDDEN_PRI")
  1048.  
  1049. new menu = menu_create(menu_line, "pri_handler")
  1050.  
  1051. for(new i=0;i<sizeof(primary_weapons);i++)
  1052. {
  1053. num_to_str(i, i_data, sizeof(i_data))
  1054. menu_additem(menu, primary_weapons[i][0], i_data, 0)
  1055. }
  1056.  
  1057. menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
  1058. menu_display(id, menu, 0)
  1059.  
  1060. return PLUGIN_HANDLED
  1061. }
  1062.  
  1063. public pri_handler(id, menu, item)
  1064. {
  1065. if(item == MENU_EXIT)
  1066. {
  1067. menu_destroy(menu)
  1068. return PLUGIN_HANDLED
  1069. }
  1070.  
  1071. new data[64], szName[64]
  1072. new access, callback
  1073. menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback)
  1074.  
  1075. new key = str_to_num(data)
  1076. new weapon_id = get_weaponid(primary_weapons[key][1])
  1077. new convert_to_num = str_to_num(primary_weapons[key][2])
  1078.  
  1079. give_item(id, primary_weapons[key][1])
  1080. give_item(id, "weapon_hegrenade")
  1081.  
  1082. cs_set_user_bpammo(id, weapon_id, convert_to_num)
  1083.  
  1084. return PLUGIN_CONTINUE
  1085. }
  1086.  
  1087. public sort_bestplayer(id1, id2)
  1088. {
  1089. if(get_user_frags(id1) > get_user_frags(id2))
  1090. return -1
  1091. else if(get_user_frags(id1) < get_user_frags(id2))
  1092. return 1
  1093.  
  1094. return 0
  1095. }
  1096.  
  1097. get_random_ct()
  1098. {
  1099. static iPlayers[32], iNum
  1100. get_players(iPlayers, iNum, "ae", "CT")
  1101. return iNum ? iPlayers[random(iNum)] : 0
  1102. }
  1103.