HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define PLUGIN "Fake C4"
  6. #define VERSION "1.1"
  7. #define AUTHOR "Alka"
  8.  
  9. #define OFFSET_CS_MONEY 115
  10. #define OFFSET_ENT_TO_INDEX 43
  11. #define CBASE_CURR_WPN_ENT 373
  12. #define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CS_MONEY)
  13. #define fm_create_entity(%1) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, %1))
  14.  
  15. #define C4_PLANT_TIME 3 //engine based.Don't modify.
  16.  
  17. new const g_szC4Sounds[][] = {
  18.  
  19. "weapons/c4_beep1.wav",
  20. "weapons/c4_beep2.wav",
  21. "weapons/c4_beep3.wav",
  22. "weapons/c4_beep4.wav",
  23. "weapons/c4_beep5.wav"
  24. };
  25.  
  26. new bool:g_bInPlant[33];
  27. new bool:g_bBuyedC4[33];
  28. new Float:g_fStartPlant[33];
  29. new Float:g_fOldMaxSpeed[33];
  30.  
  31. new g_iMaxPlayers;
  32. new g_iSprite;
  33.  
  34. new g_iTextMsg;
  35. new g_iMoneyMsg;
  36. new g_iBarTimeMsg;
  37.  
  38. enum _:max_cvars {
  39.  
  40. CVAR_COST,
  41. CVAR_EXPLODETIME,
  42. CVAR_DAMAGE,
  43. CVAR_RADIUS,
  44. CVAR_GIVE
  45. };
  46. new g_iCvar[max_cvars];
  47.  
  48. public plugin_init() {
  49.  
  50. register_plugin(PLUGIN, VERSION, AUTHOR);
  51.  
  52. register_clcmd("say /buyc4", "clcmdBuyBomb", -1, "");
  53.  
  54. g_iTextMsg = get_user_msgid("TextMsg");
  55. g_iMoneyMsg = get_user_msgid("Money");
  56. g_iBarTimeMsg = get_user_msgid("BarTime");
  57.  
  58. register_forward(FM_CmdStart, "fwd_CmdStart", 0);
  59. RegisterHam(Ham_Spawn, "player", "fwd_HamSpawn", 1);
  60. RegisterHam(Ham_Think, "info_target", "fwd_HamThink", 1);
  61.  
  62. register_message(g_iTextMsg, "message_TextMsg");
  63. register_logevent("logevent_RoundEnd", 2, "1=Round_End", "1=Round_Draw");
  64.  
  65. g_iCvar[CVAR_COST] = register_cvar("c4_cost", "5000");
  66. g_iCvar[CVAR_EXPLODETIME] = register_cvar("c4_timer", "35");
  67. g_iCvar[CVAR_DAMAGE] = register_cvar("c4_damage", "400");
  68. g_iCvar[CVAR_RADIUS] = register_cvar("c4_radius", "1000");
  69. g_iCvar[CVAR_GIVE] = register_cvar("c4_give", "0");
  70.  
  71. g_iMaxPlayers = get_maxplayers();
  72. }
  73.  
  74. public plugin_precache()
  75. g_iSprite = precache_model("sprites/eexplo.spr");
  76.  
  77. public clcmdBuyBomb(id)
  78. {
  79. if(!is_user_alive(id))
  80. return 1;
  81.  
  82. if(user_has_weapon(id, CSW_C4))
  83. {
  84. client_print(id, print_center, "Mar van C4-ed!");
  85. return 1;
  86. }
  87. else
  88. {
  89. if(fm_get_user_money(id) < get_pcvar_num(g_iCvar[CVAR_COST]))
  90. {
  91. client_print(id, print_center, "Nincs eleg penzed , hogy C4-et vegyel!");
  92. return 1;
  93. }
  94. else
  95. {
  96. fm_set_user_money(id, fm_get_user_money(id) - get_pcvar_num(g_iCvar[CVAR_COST]), 1);
  97.  
  98. ham_give_weapon(id, "weapon_c4");
  99. client_print(id, print_center, "Vettel egy C4-et!");
  100.  
  101. g_bBuyedC4[id] = true;
  102. }
  103. }
  104. return 0;
  105. }
  106.  
  107. public fwd_CmdStart(id, uc_handle, uc_seed)
  108. {
  109. if(!is_user_alive(id) || !g_bBuyedC4[id])
  110. return FMRES_IGNORED;
  111.  
  112. static iButton, iOldButton;
  113. iButton = get_uc(uc_handle, UC_Buttons);
  114. iOldButton = pev(id, pev_oldbuttons);
  115.  
  116. static iWpn;
  117. iWpn = get_pdata_cbase(id, CBASE_CURR_WPN_ENT);
  118.  
  119. if(!pev_valid(iWpn))
  120. return HAM_IGNORED;
  121.  
  122. if((get_pdata_int(iWpn, OFFSET_ENT_TO_INDEX) == CSW_C4))
  123. {
  124. if((iButton & IN_ATTACK) && (iOldButton & IN_ATTACK) && !g_bInPlant[id])
  125. {
  126. fm_set_animation(id, 3);
  127. g_bInPlant[id] = true;
  128. g_fStartPlant[id] = get_gametime();
  129.  
  130. msg_bar_time(id, C4_PLANT_TIME);
  131.  
  132. pev(id, pev_maxspeed, g_fOldMaxSpeed[id]);
  133. fm_set_user_maxspeed(id, 1.0);
  134. }
  135. else if((iButton & IN_ATTACK) && (iOldButton & IN_ATTACK) && g_bInPlant[id])
  136. {
  137. if(get_gametime() >= g_fStartPlant[id] + float(C4_PLANT_TIME))
  138. {
  139. g_bInPlant[id] = false;
  140. msg_bar_time(id, 0);
  141.  
  142. ham_strip_weapon(id, "weapon_c4");
  143.  
  144. new Float:vOrigin[3], Float:vEnd[3];
  145. pev(id, pev_origin, vOrigin);
  146.  
  147. vEnd[0] = vOrigin[0];
  148. vEnd[1] = vOrigin[1];
  149. vEnd[2] = -1337.0;
  150.  
  151. engfunc(EngFunc_TraceLine, vOrigin, vEnd, 0, id, 0);
  152. get_tr2(0, TR_vecEndPos, vEnd);
  153.  
  154. new iEnt = fm_create_entity("info_target");
  155. set_pev(iEnt, pev_classname, "c4_bomb");
  156. engfunc(EngFunc_SetOrigin, iEnt, vEnd);
  157. engfunc(EngFunc_SetModel, iEnt, "models/w_c4.mdl");
  158. set_pev(iEnt, pev_solid, SOLID_BBOX);
  159. set_pev(iEnt, pev_owner, id);
  160. set_pev(iEnt, pev_fuser1, get_pcvar_float(g_iCvar[CVAR_EXPLODETIME]));
  161.  
  162. set_pev(iEnt, pev_nextthink, get_gametime());
  163.  
  164. fm_set_user_maxspeed(id, g_fOldMaxSpeed[id]);
  165. }
  166. }
  167. else if(!(iButton & IN_ATTACK) && g_bInPlant[id])
  168. {
  169. fm_set_animation(id, 0);
  170. g_bInPlant[id] = false;
  171.  
  172. msg_bar_time(id, 0);
  173.  
  174. fm_set_user_maxspeed(id, g_fOldMaxSpeed[id]);
  175. }
  176. }
  177. else if((get_pdata_int(iWpn, OFFSET_ENT_TO_INDEX) != CSW_C4) && g_bInPlant[id])
  178. {
  179. msg_bar_time(id, 0);
  180. g_bInPlant[id] = false;
  181. }
  182. return FMRES_IGNORED;
  183. }
  184.  
  185. public fwd_HamSpawn(id)
  186. {
  187. if(!is_user_connected(id))
  188. return HAM_IGNORED;
  189.  
  190. if(!user_has_weapon(id, CSW_C4))
  191. g_bBuyedC4[id] = false;
  192.  
  193. if(get_pcvar_num(g_iCvar[CVAR_GIVE]))
  194. {
  195. if(!user_has_weapon(id, CSW_C4))
  196. ham_give_weapon(id, "weapon_c4");
  197. }
  198. return HAM_IGNORED;
  199. }
  200.  
  201. public fwd_HamThink(ent)
  202. {
  203. if(!pev_valid(ent))
  204. return HAM_IGNORED;
  205.  
  206. static szClassname[32];
  207. pev(ent, pev_classname, szClassname, sizeof szClassname - 1);
  208.  
  209. if(szClassname[0] == 'c' && szClassname[1] == '4' && szClassname[3] == 's')
  210. {
  211. switch(pev(ent, pev_iuser1))
  212. {
  213. case 3: { set_pev(ent, pev_renderamt, 100.0); }
  214. case 2: { set_pev(ent, pev_renderamt, 50.0); }
  215. case 1: { set_pev(ent, pev_renderamt, 10.0); }
  216. case 0:
  217. {
  218. engfunc(EngFunc_RemoveEntity, ent);
  219. return HAM_IGNORED;
  220. }
  221. }
  222. set_pev(ent, pev_iuser1, pev(ent, pev_iuser1) - 1);
  223. set_pev(ent, pev_nextthink, get_gametime() + 0.1);
  224. }
  225. else if(szClassname[0] == 'c' && szClassname[1] == '4' && szClassname[3] == 'b')
  226. {
  227. static Float:vOrigin[3];
  228. pev(ent, pev_origin, vOrigin);
  229.  
  230. vOrigin[2] += 7.0;
  231.  
  232. new iSprite = fm_create_entity("info_target");
  233. set_pev(iSprite, pev_classname, "c4_sprite");
  234. engfunc(EngFunc_SetOrigin, iSprite, vOrigin);
  235. set_pev(iSprite, pev_rendermode, 5);
  236. set_pev(iSprite, pev_renderamt, 200.0);
  237. set_pev(iSprite, pev_scale, 0.3);
  238. engfunc(EngFunc_SetModel, iSprite, "sprites/ledglow.spr");
  239. set_pev(iSprite, pev_iuser1, 3);
  240. set_pev(iSprite, pev_nextthink, get_gametime() + 0.1);
  241.  
  242. new Float:fTime;
  243. pev(ent, pev_fuser1, fTime);
  244. new Float:fExplodeTime = get_pcvar_float(g_iCvar[CVAR_EXPLODETIME]);
  245.  
  246. if(!fTime || fTime < 0.0)
  247. {
  248. client_print(pev(ent, pev_owner), print_center, "Your C4 has exploded!");
  249. ham_fakedamage_r(vOrigin, pev(ent, pev_owner), get_pcvar_float(g_iCvar[CVAR_DAMAGE]), get_pcvar_float(g_iCvar[CVAR_RADIUS]));
  250. engfunc(EngFunc_RemoveEntity, ent);
  251.  
  252. return HAM_IGNORED;
  253. }
  254.  
  255. if(0 <= fTime <= fExplodeTime / 5)
  256. emit_sound(ent, CHAN_AUTO, g_szC4Sounds[4], VOL_NORM, ATTN_STATIC, 0, PITCH_NORM);
  257. else if(fExplodeTime / 5 < fTime <= fExplodeTime / 4)
  258. emit_sound(ent, CHAN_AUTO, g_szC4Sounds[3], VOL_NORM, ATTN_STATIC, 0, PITCH_NORM);
  259. else if(fExplodeTime / 4 < fTime <= fExplodeTime / 3)
  260. emit_sound(ent, CHAN_AUTO, g_szC4Sounds[2], VOL_NORM, ATTN_STATIC, 0, PITCH_NORM);
  261. else if(fExplodeTime / 3 < fTime <= fExplodeTime / 2)
  262. emit_sound(ent, CHAN_AUTO, g_szC4Sounds[1], VOL_NORM, ATTN_STATIC, 0, PITCH_NORM);
  263. else if(fExplodeTime / 2 < fTime <= fExplodeTime)
  264. emit_sound(ent, CHAN_AUTO, g_szC4Sounds[0], VOL_NORM, ATTN_STATIC, 0, PITCH_NORM);
  265.  
  266. set_pev(ent, pev_fuser1, fTime - 1.5);
  267. set_pev(ent, pev_nextthink, get_gametime() + 1.5);
  268. }
  269. return HAM_IGNORED;
  270. }
  271.  
  272. public message_TextMsg(msg_id, msg_dest, msg_entity)
  273. {
  274. static szMessage[64];
  275. get_msg_arg_string(2, szMessage, sizeof szMessage - 1);
  276.  
  277. if(equal(szMessage, "#C4_Plant_At_Bomb_Spot") && g_bBuyedC4[msg_entity])
  278. return 1;
  279.  
  280. return 0;
  281. }
  282.  
  283. public logevent_RoundEnd()
  284. {
  285. new iEnt;
  286. while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "c4_bomb")))
  287. {
  288. if(pev_valid(iEnt))
  289. engfunc(EngFunc_RemoveEntity, iEnt);
  290. }
  291. }
  292.  
  293. stock ham_give_weapon(id, weapon[])
  294. {
  295. if(!equal(weapon, "weapon_",7)) return 0;
  296.  
  297. new wEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon));
  298. if(!pev_valid(wEnt)) return 0;
  299.  
  300. set_pev(wEnt,pev_spawnflags, SF_NORESPAWN);
  301. dllfunc(DLLFunc_Spawn, wEnt);
  302.  
  303. if(!ExecuteHamB(Ham_AddPlayerItem, id, any:wEnt))
  304. {
  305. if(pev_valid(wEnt)) set_pev(wEnt, pev_flags, pev(wEnt, pev_flags) | FL_KILLME);
  306. return 0;
  307. }
  308. ExecuteHamB(Ham_Item_AttachToPlayer, wEnt, any:id)
  309. return wEnt;
  310. }
  311.  
  312. stock ham_strip_weapon(id,weapon[])
  313. {
  314. if(!equal(weapon,"weapon_",7)) return 0;
  315.  
  316. new wId = get_weaponid(weapon);
  317. if(!wId) return 0;
  318.  
  319. new wEnt;
  320. while((wEnt = engfunc(EngFunc_FindEntityByString, wEnt, "classname", weapon)) && pev(wEnt, pev_owner) != id) {}
  321. if(!wEnt) return 0;
  322.  
  323. new iTmp;
  324. if(get_user_weapon(id, iTmp, iTmp) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon, wEnt);
  325.  
  326. if(!ExecuteHamB(Ham_RemovePlayerItem, id, any:wEnt)) return 0;
  327.  
  328. ExecuteHamB(Ham_Item_Kill, wEnt);
  329. set_pev(id, pev_weapons, pev(id, pev_weapons) & ~(1<<wId));
  330.  
  331. return 1;
  332. }
  333.  
  334. stock ham_fakedamage_r(Float:origin[3], inflictor, Float:damage, Float:range)
  335. {
  336. message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
  337. write_byte(TE_EXPLOSION);
  338. write_coord(floatround(origin[0]));
  339. write_coord(floatround(origin[1]));
  340. write_coord(floatround(origin[2]));
  341. write_short(g_iSprite);
  342. write_byte(80);
  343. write_byte(15);
  344. write_byte(0);
  345. message_end();
  346.  
  347. static Float:vOrigin[3], Float:fDistance, Float:fTmpDmg;
  348.  
  349. for(new i = 1 ; i <= g_iMaxPlayers ; i++)
  350. {
  351. if(!is_user_alive(i))
  352. continue;
  353.  
  354. pev(i, pev_origin, vOrigin);
  355. fDistance = vector_distance(origin, vOrigin);
  356.  
  357. if(fDistance <= range)
  358. {
  359. fTmpDmg = damage - (damage / range) * fDistance;
  360. ExecuteHamB(Ham_TakeDamage, i, any:inflictor, any:inflictor, any:fTmpDmg, any:DMG_BLAST);
  361. }
  362. }
  363. }
  364.  
  365. stock fm_set_user_money(index, money, flash = 1)
  366. {
  367. set_pdata_int(index, OFFSET_CS_MONEY, money);
  368.  
  369. message_begin(MSG_ONE, g_iMoneyMsg, _, index);
  370. write_long(money);
  371. write_byte(flash ? 1 : 0);
  372. message_end();
  373. }
  374.  
  375. stock fm_set_animation(id, animation)
  376. {
  377. set_pev(id, pev_weaponanim, animation);
  378.  
  379. message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, id);
  380. write_byte(animation);
  381. write_byte(pev(id, pev_body));
  382. message_end();
  383. }
  384.  
  385. stock fm_set_user_maxspeed(index, Float:speed = -1.0)
  386. {
  387. engfunc(EngFunc_SetClientMaxspeed, index, speed);
  388. set_pev(index, pev_maxspeed, speed);
  389.  
  390. return 1;
  391. }
  392.  
  393. stock msg_bar_time(id, scale)
  394. {
  395. message_begin(MSG_ONE, g_iBarTimeMsg, _, id);
  396. write_short(scale);
  397. message_end();
  398. }
  399.