HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2.   Fordította: BBk - Death of Legend
  3. */
  4.  
  5. #include <amxmodx>
  6. #include <cstrike>
  7. #include <engine>
  8. #include <fakemeta>
  9. #include <hamsandwich>
  10. #include <xs>
  11.  
  12. new const PLUGIN[] = "Trukkos Terrorista"
  13. new const AUTHOR[] = "joaquim e lucia andrade"
  14. new const VERSION[] = "1.0a"
  15.  
  16. const FlDefusedTime = 99 // ConnorMcLeod
  17. const FlDefusedTimeOffsetLinux = 5
  18.  
  19. new Array:Defusers
  20. new Trie:DefusersData
  21.  
  22. enum SparkSounds
  23. {
  24. Spark1,
  25. Spark2,
  26. Spark3,
  27. Spark4,
  28. Spark5,
  29. Spark6
  30. }
  31.  
  32. enum TrickedDefuseSounds
  33. {
  34. Menu2,
  35. Menu3,
  36. Cock1
  37. }
  38.  
  39. enum MiscSounds
  40. {
  41. Geiger
  42. }
  43.  
  44. new SparkSoundsPath[SparkSounds][] = {"buttons/spark1.wav","buttons/spark2.wav","buttons/spark3.wav","buttons/spark4.wav","buttons/spark5.wav","buttons/spark6.wav"}
  45.  
  46. new TrickedDefuseSoundsPath[TrickedDefuseSounds][] = {"common/menu2.wav","common/menu3.wav","weapons/357_cock1.wav"}
  47.  
  48. new MiscSoundsPath[MiscSounds][] = {"player/geiger2.wav"}
  49.  
  50. enum _:DefuserData
  51. {
  52. PlayersStartTime,
  53. Index,
  54. NotSoDummy
  55. }
  56.  
  57. new Float:defuserMaxDistance = 100.0
  58.  
  59. new LastDefuserWatched[33]
  60.  
  61. new msgBarTimeIndex
  62. new msgBarTime2Index
  63.  
  64. new cvarDefuserTrickingDuration
  65. new cvarDefuserTrickingReward
  66. new cvarDefuserTrickingMinTime
  67. new cvarDefuserTrickingMaxTime
  68.  
  69. new const TrickingDurationDefault[] = "5"
  70. new const TrickingRewardDefault[] = "0"
  71. new const TrickingMinTimeDefault[] = "2.0"
  72. new const TrickingMaxDefault[] = "4.0"
  73.  
  74. new TrickingDuration
  75.  
  76. new const DefuserClassname[] = "item_thighpack"
  77.  
  78. new BarTimeHandlerThinker
  79. new const BarTimeHandlerClassname[] = "barTimeHandler"
  80. new Float:BarTimeHandlerThinkDelay = 0.2
  81.  
  82. new playerDefusing
  83.  
  84. new FM_ClientDisconnectForward
  85.  
  86. new HamHook:Ham_UseForward
  87.  
  88. new bool:PlayersDefuseTricked[33]
  89.  
  90. new const EV_ENT_tricked = EV_ENT_euser4
  91.  
  92. new bool:HadDefuse[33]
  93.  
  94. new bool:DefuseTricked
  95.  
  96. new maxPlayers
  97.  
  98. public plugin_init()
  99. {
  100. register_plugin(PLUGIN, VERSION, AUTHOR)
  101.  
  102. register_event("HLTV", "newRound", "a", "1=0", "2=0")
  103.  
  104. register_forward(FM_CmdStart,"FMCmdStart");
  105.  
  106. RegisterHam(Ham_Spawn,DefuserClassname,"defuserSpawn",1)
  107.  
  108. RegisterHam(Ham_Touch,DefuserClassname,"defuserTouchedPre")
  109. RegisterHam(Ham_Touch,DefuserClassname,"defuserTouchedPost",1)
  110.  
  111. Ham_UseForward = RegisterHam(Ham_Use,"grenade","grenadeUse",1)
  112. DisableHamForward(Ham_UseForward)
  113.  
  114. register_event("TextMsg","defuseEnd","a","2=#Bomb_Defused")
  115.  
  116. register_event("TextMsg","defuseStart","b","2=#Defusing_Bomb_With_Defuse_Kit")
  117.  
  118. register_event("BarTime","barTime","b","1=0")
  119.  
  120. register_think(BarTimeHandlerClassname,"barTimeHandlerThink")
  121.  
  122. msgBarTimeIndex = get_user_msgid("BarTime")
  123. msgBarTime2Index = get_user_msgid("BarTime2")
  124.  
  125. cvarDefuserTrickingDuration = register_cvar("defuser_trick_duration",TrickingDurationDefault)
  126. cvarDefuserTrickingReward = register_cvar("defuser_trick_reward",TrickingRewardDefault)
  127. cvarDefuserTrickingMinTime = register_cvar("defuser_trick_mintime",TrickingMinTimeDefault)
  128. cvarDefuserTrickingMaxTime = register_cvar("defuser_trick_maxtime",TrickingMaxDefault)
  129.  
  130. TrickingDuration = clamp( get_pcvar_num(cvarDefuserTrickingDuration) , 1, 10)
  131.  
  132. maxPlayers = get_maxplayers()
  133.  
  134. register_cvar("trickyTerrorist_version",VERSION,FCVAR_SERVER|FCVAR_SPONLY);
  135. }
  136.  
  137. public plugin_cfg()
  138. {
  139. Defusers = ArrayCreate()
  140. DefusersData = TrieCreate()
  141. }
  142.  
  143. public plugin_precache()
  144. {
  145. for(new SparkSounds:i=SparkSounds:0 ; i<SparkSounds ;i++)
  146. precache_sound(SparkSoundsPath[i])
  147.  
  148. for(new MiscSounds:i=MiscSounds:0 ; i<MiscSounds ;i++)
  149. precache_sound(MiscSoundsPath[i])
  150.  
  151. for(new TrickedDefuseSounds:i=TrickedDefuseSounds:0 ; i<TrickedDefuseSounds ;i++)
  152. precache_sound(TrickedDefuseSoundsPath[i])
  153. }
  154.  
  155. public newRound(id)
  156. {
  157. ArrayClear(Defusers)
  158. TrieClear(DefusersData)
  159.  
  160. TrickingDuration = clamp( get_pcvar_num(cvarDefuserTrickingDuration) , 1, 10)
  161. }
  162.  
  163. public grenadeUse(this, idcaller, idactivator, use_type, Float:value)
  164. {
  165. DisableHamForward(Ham_UseForward)
  166.  
  167. new Float:minTime = get_pcvar_float(cvarDefuserTrickingMinTime)
  168. new Float:maxTime = get_pcvar_float(cvarDefuserTrickingMaxTime)
  169.  
  170. minTime = minTime < 0.0 ? 0.0 : minTime > 10.0 ? 10.0 : minTime
  171. maxTime = maxTime < minTime ? minTime : maxTime > 10.0 ? 10.0 : maxTime
  172.  
  173. set_pcvar_float(cvarDefuserTrickingMinTime,minTime)
  174. set_pcvar_float(cvarDefuserTrickingMaxTime,maxTime)
  175.  
  176. set_pdata_float(this,FlDefusedTime,get_pdata_float(this,FlDefusedTime,FlDefusedTimeOffsetLinux) + random_float(minTime,maxTime) , FlDefusedTimeOffsetLinux)
  177. }
  178.  
  179. public barTimeHandlerThink(id)
  180. {
  181. entity_set_float(id,EV_FL_nextthink, get_gametime() + BarTimeHandlerThinkDelay);
  182.  
  183. message_begin(MSG_ONE_UNRELIABLE, msgBarTime2Index, _, playerDefusing)
  184. write_short(TrickingDuration)
  185. write_short(random_num(1,100))
  186. message_end()
  187.  
  188. emit_sound(playerDefusing,CHAN_AUTO,TrickedDefuseSoundsPath[TrickedDefuseSounds:random(_:TrickedDefuseSounds)],1.0,ATTN_NORM, 1, PITCH_NORM)
  189. }
  190.  
  191. public defuseStart(id)
  192. {
  193. if(PlayersDefuseTricked[id])
  194. {
  195. defuseStarted(id)
  196. }
  197. }
  198.  
  199. public defuseStarted(id)
  200. {
  201. DefuseTricked = true;
  202.  
  203. playerDefusing = id;
  204.  
  205. EnableHamForward(Ham_UseForward)
  206.  
  207. BarTimeHandlerThinker = create_entity("info_target")
  208. assert is_valid_ent(BarTimeHandlerThinker);
  209. entity_set_string(BarTimeHandlerThinker,EV_SZ_classname,BarTimeHandlerClassname);
  210. entity_set_float(BarTimeHandlerThinker,EV_FL_nextthink, get_gametime());
  211.  
  212. FM_ClientDisconnectForward = register_forward(FM_ClientDisconnect,"clientDisconnect")
  213. }
  214.  
  215. public barTime(id)
  216. {
  217. if(DefuseTricked)
  218. {
  219. checkDefuseStop(playerDefusing)
  220. }
  221. }
  222.  
  223. defuseStop()
  224. {
  225. if(DefuseTricked)
  226. {
  227. DefuseTricked = false;
  228.  
  229. unregister_forward(FM_ClientDisconnect,FM_ClientDisconnectForward)
  230.  
  231. remove_entity(BarTimeHandlerThinker)
  232.  
  233. message_begin(MSG_ONE_UNRELIABLE, msgBarTimeIndex, _, playerDefusing)
  234. write_short(0)
  235. message_end()
  236.  
  237. playerDefusing = 0
  238. }
  239. }
  240.  
  241. checkDefuseStop(id)
  242. {
  243. if(id == playerDefusing)
  244. {
  245. defuseStop();
  246. }
  247. }
  248.  
  249. public clientDisconnect(id)
  250. {
  251. checkDefuseStop(id);
  252. }
  253.  
  254. public defuseEnd()
  255. {
  256. defuseStop();
  257. }
  258.  
  259. public defuserSpawn(id)
  260. {
  261. handleDroppedDefuser(id)
  262. }
  263.  
  264. public defuserTouchedPre(touched,toucher)
  265. {
  266. if(1<=toucher<=maxPlayers)
  267. {
  268. HadDefuse[toucher] = bool:cs_get_user_defuse(toucher)
  269. }
  270. }
  271.  
  272. public defuserTouchedPost(touched,toucher)
  273. {
  274. if(1<=toucher<=maxPlayers)
  275. {
  276. new hasDefuse = cs_get_user_defuse(toucher)
  277.  
  278. if(!HadDefuse[toucher] && hasDefuse)
  279. {
  280. PlayersDefuseTricked[toucher] = bool:entity_get_edict(touched,EV_ENT_tricked)
  281.  
  282. deleteDefuserData(touched)
  283. }
  284. }
  285. }
  286.  
  287. public handleDroppedDefuser(defuser)
  288. {
  289. new defuserData[DefuserData]
  290.  
  291. defuserData[PlayersStartTime] = _:ArrayCreate(1,maxPlayers+1);
  292.  
  293. for(new i=0;i<=maxPlayers;i++)
  294. ArrayPushCell(Array:defuserData[PlayersStartTime],0.0)
  295.  
  296. defuserData[Index] = ArraySize(Defusers)
  297.  
  298. ArrayPushCell(Defusers,defuser)
  299.  
  300. new defuserString[2]
  301. defuserString[0] = defuser;
  302.  
  303. TrieSetString(DefusersData,defuserString,defuserData);
  304. }
  305.  
  306. deleteDefuserData(defuser)
  307. {
  308. new defuserString[2]
  309. defuserString[0] = defuser
  310.  
  311. new defuserData[DefuserData]
  312.  
  313. if(TrieGetString(DefusersData,defuserString,defuserData,DefuserData-1))
  314. {
  315. new lastDefuserIndex = ArraySize(Defusers) - 1
  316.  
  317. new index = defuserData[Index]
  318.  
  319. if(index != lastDefuserIndex)
  320. {
  321. new lastDefuser = ArrayGetCell(Defusers,lastDefuserIndex)
  322.  
  323. new lastDefuserString[2]
  324. lastDefuserString[0] = lastDefuser
  325.  
  326. new lastDefuserData[DefuserData]
  327. TrieGetString(DefusersData,lastDefuserString,lastDefuserData,DefuserData-1);
  328.  
  329. lastDefuserData[Index] = index;
  330.  
  331. TrieSetString(DefusersData,lastDefuserString,lastDefuserData);
  332.  
  333. ArraySetCell(Defusers,index,lastDefuser);
  334.  
  335. }
  336.  
  337. ArrayDeleteItem(Defusers,lastDefuserIndex);
  338. TrieDeleteKey(DefusersData,defuserString);
  339. }
  340. }
  341.  
  342. increaseDefuserCounter(id,defuser)
  343. {
  344. new defuserString[2]
  345. defuserString[0] = defuser
  346.  
  347. new defuserData[DefuserData]
  348.  
  349. if(TrieGetString(DefusersData,defuserString,defuserData,DefuserData-1))
  350. {
  351. new Float:startTime = ArrayGetCell(Array:defuserData[PlayersStartTime],id)
  352.  
  353. if(!startTime)
  354. {
  355. ArraySetCell(Array:defuserData[PlayersStartTime],id, get_gametime() )
  356.  
  357. message_begin(MSG_ONE_UNRELIABLE, msgBarTimeIndex, _, id)
  358. write_short(TrickingDuration)
  359. message_end()
  360.  
  361. emit_sound(id,CHAN_AUTO,SparkSoundsPath[SparkSounds:random(_:SparkSounds)],1.0,ATTN_NORM, 1, PITCH_NORM)
  362. }
  363. else
  364. {
  365. new Float:timeTaken = get_gametime() - startTime;
  366.  
  367. if(timeTaken >= (TrickingDuration * 1.0))
  368. {
  369. entity_set_edict(defuser,EV_ENT_tricked,1)
  370.  
  371. deleteDefuserData(defuser)
  372.  
  373. emit_sound(id,CHAN_AUTO,MiscSoundsPath[Geiger],1.0,ATTN_NORM, 1, PITCH_NORM)
  374.  
  375. cs_set_user_money(id,cs_get_user_money(id) + clamp(get_pcvar_num(cvarDefuserTrickingReward),0,16000))
  376.  
  377. return false;
  378. }
  379. else
  380. {
  381. if(!random(100))
  382. {
  383. emit_sound(id,CHAN_AUTO,SparkSoundsPath[SparkSounds:random(_:SparkSounds)],1.0,ATTN_NORM, 1, PITCH_NORM)
  384. }
  385. }
  386. }
  387.  
  388. return true;
  389. }
  390.  
  391. return false;
  392. }
  393.  
  394. resetDefuserCounter(id,defuser)
  395. {
  396. new defuserString[2]
  397. defuserString[0] = defuser
  398.  
  399. new defuserData[DefuserData]
  400.  
  401. if(TrieGetString(DefusersData,defuserString,defuserData,DefuserData-1))
  402. {
  403. ArraySetCell(Array:defuserData[PlayersStartTime],id,0.0)
  404. }
  405.  
  406. message_begin(MSG_ONE_UNRELIABLE, msgBarTimeIndex, _, id)
  407. write_short(0)
  408. message_end()
  409. }
  410.  
  411. public FMCmdStart(id,uc_handle,random_seed)
  412. {
  413. if(cs_get_user_team(id) == CS_TEAM_T)
  414. {
  415. if(get_uc(uc_handle,UC_Buttons) & IN_USE)
  416. {
  417. new nDefusers = ArraySize(Defusers)
  418.  
  419. if(nDefusers)
  420. {
  421. static Float:start[3], Float:view_ofs[3], Float:origin[3], Float:dest[3]
  422.  
  423. pev(id, pev_origin, start);
  424. pev(id, pev_view_ofs, view_ofs);
  425. xs_vec_add(start, view_ofs, start);
  426.  
  427. pev(id, pev_v_angle, dest);
  428. engfunc(EngFunc_MakeVectors, dest);
  429. global_get(glb_v_forward, dest);
  430. xs_vec_mul_scalar(dest, defuserMaxDistance, dest);
  431. xs_vec_add(start, dest, dest);
  432.  
  433. engfunc(EngFunc_TraceLine, start, dest, 0, id, 0);
  434. get_tr2(0, TR_vecEndPos, origin);
  435.  
  436. new watchingDefuser
  437.  
  438. for(new i=0;i<nDefusers;i++)
  439. {
  440. new defuser = ArrayGetCell(Defusers,i);
  441.  
  442. if(is_valid_ent(defuser))
  443. {
  444. engfunc ( EngFunc_TraceModel, start, dest, HULL_POINT, defuser ,0)
  445.  
  446. new hit = get_tr2(0, TR_pHit);
  447.  
  448. if(hit == defuser)
  449. {
  450. watchingDefuser = defuser;
  451. break;
  452. }
  453. }
  454. }
  455.  
  456. if(watchingDefuser)
  457. {
  458. if(LastDefuserWatched[id] == watchingDefuser)
  459. {
  460. if( increaseDefuserCounter(id,watchingDefuser))
  461. LastDefuserWatched[id] = watchingDefuser
  462. else
  463. LastDefuserWatched[id] = 0
  464. }
  465. else
  466. {
  467. if(LastDefuserWatched[id])
  468. resetDefuserCounter(id,LastDefuserWatched[id]);
  469.  
  470. LastDefuserWatched[id] = watchingDefuser
  471. }
  472. }
  473. else if(LastDefuserWatched[id])
  474. {
  475. resetDefuserCounter(id,LastDefuserWatched[id])
  476. LastDefuserWatched[id] = 0;
  477. }
  478. }
  479. }
  480. else if(LastDefuserWatched[id])
  481. {
  482. resetDefuserCounter(id,LastDefuserWatched[id])
  483. LastDefuserWatched[id] = 0;
  484. }
  485. }
  486. }