HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Plugin generated by AMXX-Studio */
  2. // Magyarosította: smallR.#
  3. //MSN: smaller@warena.hu
  4. //#define BIOHAZARD_SUPPORT
  5. //#define UL_MONEY_SUPPORT
  6.  
  7. #include <amxmodx>
  8. #include <fakemeta>
  9. #include <xs>
  10.  
  11. #if defined BIOHAZARD_SUPPORT
  12. #include <biohazard>
  13. #endif
  14.  
  15. #if defined UL_MONEY_SUPPORT
  16. #include <money_ul>
  17. #endif
  18.  
  19.  
  20. #if AMXX_VERSION_NUM < 180
  21. #assert AMX Mod X v1.8.0 or greater library required!
  22. #endif
  23.  
  24. #if defined BIOHAZARD_SUPPORT
  25. #define PLUGIN "LTM for BIOHAZARD"
  26. #define VERSION "+1.4"
  27. #else
  28. #define PLUGIN "Laser/Tripmine Entity"
  29. #define VERSION "2.3"
  30. #endif
  31. #define AUTHOR "SandStriker"
  32.  
  33. #define RemoveEntity(%1) engfunc(EngFunc_RemoveEntity,%1)
  34. //#define ACCESSLEVEL ADMIN_LEVEL_H
  35. #define TASK_PLANT 15100
  36. #define TASK_RESET 15500
  37. #define TASK_RELEASE 15900
  38.  
  39. #define LASERMINE_TEAM pev_iuser1//EV_INT_iuser1
  40. #define LASERMINE_OWNER pev_iuser2 //EV_INT_iuser3
  41. #define LASERMINE_STEP pev_iuser3
  42. #define LASERMINE_HITING pev_iuser4
  43. #define LASERMINE_COUNT pev_fuser1
  44.  
  45. #define LASERMINE_POWERUP pev_fuser2
  46. #define LASERMINE_BEAMTHINK pev_fuser3
  47.  
  48. #define LASERMINE_BEAMENDPOINT pev_vuser1
  49. #define MAX_MINES 10
  50. #define MODE_LASERMINE 0
  51. #define OFFSET_TEAM 114
  52. #define OFFSET_MONEY 115
  53. #define OFFSET_DEATH 444
  54.  
  55. #define cs_get_user_team(%1) CsTeams:get_offset_value(%1,OFFSET_TEAM)
  56. #define cs_get_user_deaths(%1) get_offset_value(%1,OFFSET_DEATH)
  57. #define cs_get_user_money(%1) get_offset_value(%1,OFFSET_MONEY)
  58. #define cs_set_user_money(%1,%2) set_offset_value(%1,OFFSET_MONEY,%2)
  59.  
  60.  
  61.  
  62. enum CsTeams {
  63. CS_TEAM_UNASSIGNED = 0,
  64. CS_TEAM_T = 1,
  65. CS_TEAM_CT = 2,
  66. CS_TEAM_SPECTATOR = 3
  67. };
  68.  
  69. enum tripmine_e {
  70. TRIPMINE_IDLE1 = 0,
  71. TRIPMINE_IDLE2,
  72. TRIPMINE_ARM1,
  73. TRIPMINE_ARM2,
  74. TRIPMINE_FIDGET,
  75. TRIPMINE_HOLSTER,
  76. TRIPMINE_DRAW,
  77. TRIPMINE_WORLD,
  78. TRIPMINE_GROUND,
  79. };
  80.  
  81. enum
  82. {
  83. POWERUP_THINK,
  84. BEAMBREAK_THINK,
  85. EXPLOSE_THINK
  86. };
  87.  
  88. enum
  89. {
  90. POWERUP_SOUND,
  91. ACTIVATE_SOUND,
  92. STOP_SOUND
  93. };
  94.  
  95. new const
  96. ENT_MODELS[] = "models/v_tripmine.mdl",
  97. ENT_SOUND1[] = "weapons/mine_deploy.wav",
  98. ENT_SOUND2[] = "weapons/mine_charge.wav",
  99. ENT_SOUND3[] = "weapons/mine_activate.wav",
  100. ENT_SOUND4[] = "debris/beamstart9.wav",
  101. ENT_SOUND5[] = "items/gunpickup2.wav",
  102. ENT_SOUND6[] = "debris/bustglass1.wav",
  103. ENT_SOUND7[] = "debris/bustglass2.wav",
  104. ENT_SPRITE1[] = "sprites/laserbeam.spr",
  105. ENT_SPRITE2[] = "sprites/zerogxplode.spr";
  106.  
  107. new const
  108. ENT_CLASS_NAME[] = "lasermine",
  109. //ENT_CLASS_NAME2[] = "info_target",
  110. ENT_CLASS_NAME3[] = "func_breakable";
  111.  
  112. new const
  113. #if defined BIOHAZARD_SUPPORT
  114. CHATTAG[] = "[BioLezer]",
  115. #else
  116. CHATTAG[] = "[Lezer]",
  117. #endif
  118. //STR_MINEDETNATED[] = "Neked van Lezered.",
  119. //STR_MINEDETNATED2[] = "Felrobbant a te lezered.",
  120. STR_NOTACTIVE[] = "A lezer nem aktiv a szerveren.",
  121. STR_DONTHAVEMINE[] = "Nincs lezered. Vegyel!",
  122. //STR_CANTDEPLOY[] = "A csapat nem hasznalhat tobb lezert!",
  123. STR_MAXDEPLOY[] = "Az osszes lezered le tetted.",
  124. STR_MANYPPL[] = "A te csapatod nem tehet tobb lezert!",
  125. STR_PLANTWALL[] = "A lezert a falra tedd!",
  126. STR_REF[] = "Ha nem ismered a lezert ird a cset-be hogy 'lasermine'.",
  127. #if defined BIOHAZARD_SUPPORT
  128. STR_CBT[] = "Te Zombi vagy! Nem hasznalhatsz lezert!
  129. #else
  130. STR_CBT[] = "A te csapatod nem tehet lezert!",
  131. #endif
  132. STR_CANTBUY[] = "A vasarlas tiltott.",
  133. STR_HAVEMAX[] = "Osszes Lezered megvan.",
  134. STR_NOMONEY[] = "Neked nincs eleg penzed! ($",
  135. STR_NEEDED[] = "kell)",
  136. STR_DELAY[] = "Az ido leteltevel tudsz vasarolni es lezert tenni.",
  137. STR_SECONDS[] = "masodperc.",
  138. STR_BOUGHT[] = "Te Sikeressen vetel lezert.",
  139. STR_STATE[] = "Lezered szama:",
  140. STR_NOACCESS[] = "Nem hasznalhatod a lezert.";
  141.  
  142.  
  143. new g_EntMine;
  144. new beam, boom
  145. new
  146. g_LENABLE,g_LFMONEY,g_LAMMO,g_LDMG,
  147. g_LTMAX,g_LCOST,g_LHEALTH,g_LMODE,g_LRADIUS,g_LRDMG,g_LFF,g_LCBT;
  148. new
  149. g_LDELAY,/*g_LTHINK,*/g_LVISIBLE,
  150. g_LSTAMMO,g_LACCESS,g_LGLOW,g_LDMGMODE,g_LCLMODE,g_LCBRIGHT,g_LDSEC,g_LCMDMODE,g_LBUYMODE;
  151.  
  152. new g_dcount[33],g_nowtime,g_MaxPL
  153. new bool:g_settinglaser[33]
  154. new g_msgDeathMsg,g_msgScoreInfo,g_msgDamage,g_msgStatusText,g_msgMoney;
  155. new Float:plspeed[33]
  156. new plsetting[33]
  157. new g_havemine[33];
  158. new g_deployed[33];
  159.  
  160. public plugin_init() {
  161. register_plugin(PLUGIN, VERSION, AUTHOR);
  162.  
  163. // Add your code here...
  164. register_clcmd("+setlaser","CreateLaserMine_Progress_b");
  165. register_clcmd("-setlaser","StopCreateLaserMine");
  166. register_clcmd("+dellaser","ReturnLaserMine_Progress");
  167. register_clcmd("-dellaser","StopReturnLaserMine");
  168. register_clcmd("say","say_lasermine");
  169. register_clcmd("buy_lasermine","BuyLasermine");
  170.  
  171. #if defined BIOHAZARD_SUPPORT
  172. g_LENABLE = register_cvar("bio_ltm","1");
  173. g_LACCESS = register_cvar("bio_ltm_acs","0"); //0 all, 1 admin
  174. g_LMODE = register_cvar("bio_ltm_mode","0"); //0 lasermine, 1 tripmine
  175. g_LAMMO = register_cvar("bio_ltm_ammo","2");
  176. g_LDMG = register_cvar("bio_ltm_dmg","60"); //laser hit dmg
  177. g_LCOST = register_cvar("bio_ltm_cost","2500");
  178. g_LFMONEY = register_cvar("bio_ltm_fragmoney","300");
  179. g_LHEALTH = register_cvar("bio_ltm_health","500");
  180. g_LTMAX = register_cvar("bio_ltm_teammax","10");
  181. g_LRADIUS = register_cvar("bio_ltm_radius","320.0");
  182. g_LRDMG = register_cvar("bio_ltm_rdmg","100"); //radius damage
  183. g_LFF = register_cvar("bio_ltm_ff","0");
  184. g_LCBT = register_cvar("bio_ltm_cbt","ALL");
  185. g_LBUYMODE = register_cvar("bio_ltm_buymode","1");
  186. g_LDELAY = register_cvar("bio_ltm_delay","15");
  187. //g_LTHINK = register_cvar("bio_ltm_think","0.01");
  188. g_LVISIBLE = register_cvar("bio_ltm_line","1");
  189. g_LGLOW = register_cvar("bio_ltm_glow","0");
  190. g_LCBRIGHT = register_cvar("bio_ltm_bright","255"); //laser line brightness.
  191. g_LCLMODE = register_cvar("bio_ltm_color","0"); //0 is team color,1 is green
  192. g_LDMGMODE = register_cvar("bio_ltm_ldmgmode","0"); //0 - frame dmg, 1 - once dmg, 2 - 1 second dmg
  193. g_LDSEC = register_cvar("bio_ltm_ldmgseconds","1"); //mode 2 only, damage / seconds. default 1 (sec)
  194. g_LSTAMMO = register_cvar("bio_ltm_startammo","1");
  195. g_LCMDMODE = register_cvar("bio_ltm_cmdmode","0"); //0 is +USE key, 1 is bind, 2 is each.
  196. #else
  197. g_LENABLE = register_cvar("amx_ltm","1");
  198. g_LACCESS = register_cvar("amx_ltm_acs","0"); //0 all, 1 admin
  199. g_LMODE = register_cvar("amx_ltm_mode","0"); //0 lasermine, 1 tripmine
  200. g_LAMMO = register_cvar("amx_ltm_ammo","2");
  201. g_LDMG = register_cvar("amx_ltm_dmg","60"); //laser hit dmg
  202. g_LCOST = register_cvar("amx_ltm_cost","2500");
  203. g_LFMONEY = register_cvar("amx_ltm_fragmoney","300");
  204. g_LHEALTH = register_cvar("amx_ltm_health","500");
  205. g_LTMAX = register_cvar("amx_ltm_teammax","10");
  206. g_LRADIUS = register_cvar("amx_ltm_radius","320.0");
  207. g_LRDMG = register_cvar("amx_ltm_rdmg","100"); //radius damage
  208. g_LFF = register_cvar("amx_ltm_ff","0");
  209. g_LCBT = register_cvar("amx_ltm_cbt","ALL");
  210. g_LBUYMODE = register_cvar("amx_ltm_buymode","1");
  211. g_LDELAY = register_cvar("amx_ltm_delay","15");
  212. //g_LTHINK = register_cvar("amx_ltm_think","0.01")
  213. g_LVISIBLE = register_cvar("amx_ltm_line","1");
  214. g_LGLOW = register_cvar("amx_ltm_glow","0");
  215. g_LCBRIGHT = register_cvar("amx_ltm_bright","255"); //laser line brightness.
  216. g_LCLMODE = register_cvar("amx_ltm_color","0"); //0 is team color,1 is green
  217. g_LDMGMODE = register_cvar("amx_ltm_ldmgmode","0"); //0 - frame dmg, 1 - once dmg, 2 - 1 second dmg
  218. g_LDSEC = register_cvar("amx_ltm_ldmgseconds","1"); //mode 2 only, damage / seconds. default 1 (sec)
  219. g_LSTAMMO = register_cvar("amx_ltm_startammo","1");
  220. g_LCMDMODE = register_cvar("amx_ltm_cmdmode","0"); //0 is +USE key, 1 is bind, 2 is each.
  221. #endif
  222. register_event("DeathMsg", "DeathEvent", "a");
  223. register_event("CurWeapon", "standing", "be", "1=1");
  224. register_event("ResetHUD", "delaycount", "a");
  225. register_event("ResetHUD", "newround", "b");
  226. register_event("Damage","CutDeploy_onDamage","b");
  227. g_msgDeathMsg = get_user_msgid("DeathMsg");
  228. g_msgScoreInfo = get_user_msgid("ScoreInfo");
  229. g_msgDamage = get_user_msgid("Damage");
  230. g_msgStatusText = get_user_msgid("StatusText");
  231. g_msgMoney = get_user_msgid("Money");
  232. // -- Forward.
  233. register_forward(FM_Think, "ltm_Think" );
  234. register_forward(FM_PlayerPostThink, "ltm_PostThink" );
  235. register_forward(FM_PlayerPreThink, "ltm_PreThink");
  236. }
  237.  
  238. public plugin_precache()
  239. {
  240. precache_sound(ENT_SOUND1);
  241. precache_sound(ENT_SOUND2);
  242. precache_sound(ENT_SOUND3);
  243. precache_sound(ENT_SOUND4);
  244. precache_sound(ENT_SOUND5);
  245. precache_sound(ENT_SOUND6);
  246. precache_sound(ENT_SOUND7);
  247. precache_model(ENT_MODELS);
  248. beam = precache_model(ENT_SPRITE1);
  249. boom = precache_model(ENT_SPRITE2);
  250.  
  251. return PLUGIN_CONTINUE;
  252. }
  253.  
  254. public plugin_modules()
  255. {
  256. require_module("fakemeta");
  257. require_module("cstrike");
  258. //require_module("fun")
  259. }
  260.  
  261. public plugin_cfg()
  262. {
  263. g_EntMine = engfunc(EngFunc_AllocString,ENT_CLASS_NAME3);
  264. arrayset(g_havemine,0,sizeof(g_havemine));
  265. arrayset(g_deployed,0,sizeof(g_deployed));
  266. g_MaxPL = get_maxplayers();
  267.  
  268. new file[64]; get_localinfo("amxx_configsdir",file,63);
  269. #if defined BIOHAZARD_SUPPORT
  270. format(file, 63, "%s/bhltm_cvars.cfg", file);
  271. #else
  272. format(file, 63, "%s/ltm_cvars.cfg", file);
  273. #endif
  274. if(file_exists(file)) server_cmd("exec %s", file), server_exec();
  275.  
  276. }
  277.  
  278. public delaycount(id)
  279. {
  280. g_dcount[id] = floatround(get_gametime());
  281. }
  282.  
  283. bool:CheckTime(id)
  284. {
  285. g_nowtime = floatround(get_gametime()) - g_dcount[id];
  286. if(g_nowtime >= get_pcvar_num(g_LDELAY))
  287. return true;
  288. return false;
  289. }
  290.  
  291. public CreateLaserMine_Progress_b(id)
  292. {
  293. if(get_pcvar_num(g_LCMDMODE) != 0)
  294. CreateLaserMine_Progress(id);
  295. return PLUGIN_HANDLED;
  296. }
  297.  
  298. public CreateLaserMine_Progress(id)
  299. {
  300.  
  301. if (!CreateCheck(id))
  302. return PLUGIN_HANDLED;
  303. g_settinglaser[id] = true;
  304.  
  305. message_begin( MSG_ONE, 108, {0,0,0}, id );
  306. write_byte(1);
  307. write_byte(0);
  308. message_end();
  309.  
  310. set_task(1.2, "Spawn", (TASK_PLANT + id));
  311.  
  312. return PLUGIN_HANDLED;
  313. }
  314.  
  315. public ReturnLaserMine_Progress(id)
  316. {
  317.  
  318. if (!ReturnCheck(id))
  319. return PLUGIN_HANDLED;
  320. g_settinglaser[id] = true;
  321.  
  322. message_begin( MSG_ONE, 108, {0,0,0}, id );
  323. write_byte(1);
  324. write_byte(0);
  325. message_end();
  326.  
  327. set_task(1.2, "ReturnMine", (TASK_RELEASE + id));
  328.  
  329.  
  330. return PLUGIN_HANDLED;
  331. }
  332.  
  333. public StopCreateLaserMine(id)
  334. {
  335.  
  336. DeleteTask(id);
  337. message_begin(MSG_ONE, 108, {0,0,0}, id);
  338. write_byte(0);
  339. write_byte(0);
  340. message_end();
  341.  
  342. return PLUGIN_HANDLED;
  343. }
  344.  
  345. public StopReturnLaserMine(id)
  346. {
  347.  
  348. DeleteTask(id);
  349. message_begin(MSG_ONE, 108, {0,0,0}, id);
  350. write_byte(0);
  351. write_byte(0);
  352. message_end();
  353.  
  354. return PLUGIN_HANDLED;
  355. }
  356.  
  357. public ReturnMine(id)
  358. {
  359. id -= TASK_RELEASE;
  360. new tgt,body,Float:vo[3],Float:to[3];
  361. get_user_aiming(id,tgt,body);
  362. if(!pev_valid(tgt)) return;
  363. pev(id,pev_origin,vo);
  364. pev(tgt,pev_origin,to);
  365. if(get_distance_f(vo,to) > 70.0) return;
  366.  
  367. new EntityName[32];
  368. pev(tgt, pev_classname, EntityName, 31);
  369. if(!equal(EntityName, ENT_CLASS_NAME)) return;
  370. if(pev(tgt,LASERMINE_OWNER) != id) return;
  371. RemoveEntity(tgt);
  372.  
  373. g_havemine[id] ++;
  374. g_deployed[id] --;
  375. emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  376. ShowAmmo(id)
  377.  
  378. return;
  379. }
  380.  
  381. public Spawn( id )
  382. {
  383. id -= TASK_PLANT
  384. // motor
  385. new i_Ent = engfunc(EngFunc_CreateNamedEntity,g_EntMine);
  386. if(!i_Ent)
  387. {
  388. client_print(id,print_chat,"[Laesrmine Debug] Can't Create Entity");
  389. return PLUGIN_HANDLED_MAIN;
  390. }
  391. set_pev(i_Ent,pev_classname,ENT_CLASS_NAME);
  392.  
  393. engfunc(EngFunc_SetModel,i_Ent,ENT_MODELS);
  394.  
  395. set_pev(i_Ent,pev_solid,SOLID_NOT);
  396. set_pev(i_Ent,pev_movetype,MOVETYPE_FLY);
  397.  
  398. set_pev(i_Ent,pev_frame,0);
  399. set_pev(i_Ent,pev_body,3);
  400. set_pev(i_Ent,pev_sequence,TRIPMINE_WORLD);
  401. set_pev(i_Ent,pev_framerate,0);
  402.  
  403. set_pev(i_Ent,pev_takedamage,DAMAGE_YES);
  404.  
  405. set_pev(i_Ent,pev_dmg,100.0);
  406. set_user_health(i_Ent,get_pcvar_num(g_LHEALTH));
  407. new Float:vOrigin[3];
  408. new Float:vNewOrigin[3],Float:vNormal[3],Float:vTraceDirection[3],
  409. Float:vTraceEnd[3],Float:vEntAngles[3];
  410. pev( id, pev_origin, vOrigin );
  411. velocity_by_aim( id, 128, vTraceDirection );
  412. xs_vec_add( vTraceDirection, vOrigin, vTraceEnd );
  413.  
  414. engfunc( EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0 );
  415.  
  416. new Float:fFraction;
  417. get_tr2( 0, TR_flFraction, fFraction );
  418.  
  419.  
  420. // -- We hit something!
  421. if ( fFraction < 1.0 )
  422. {
  423. // -- Save results to be used later.
  424. get_tr2( 0, TR_vecEndPos, vTraceEnd );
  425. get_tr2( 0, TR_vecPlaneNormal, vNormal );
  426. }
  427.  
  428.  
  429. xs_vec_mul_scalar( vNormal, 8.0, vNormal );
  430. xs_vec_add( vTraceEnd, vNormal, vNewOrigin );
  431.  
  432. engfunc(EngFunc_SetSize, i_Ent, Float:{ -4.0, -4.0, -4.0 }, Float:{ 4.0, 4.0, 4.0 } );
  433. engfunc(EngFunc_SetOrigin, i_Ent, vNewOrigin );
  434.  
  435. // -- Rotate tripmine.
  436. vector_to_angle(vNormal,vEntAngles );
  437. set_pev(i_Ent,pev_angles,vEntAngles );
  438.  
  439. // -- Calculate laser end origin.
  440. new Float:vBeamEnd[3], Float:vTracedBeamEnd[3];
  441.  
  442. xs_vec_mul_scalar(vNormal, 8192.0, vNormal );
  443. xs_vec_add( vNewOrigin, vNormal, vBeamEnd );
  444.  
  445. engfunc( EngFunc_TraceLine, vNewOrigin, vBeamEnd, IGNORE_MONSTERS, -1, 0 );
  446.  
  447. get_tr2( 0, TR_vecPlaneNormal, vNormal );
  448. get_tr2( 0, TR_vecEndPos, vTracedBeamEnd );
  449.  
  450. // -- Save results to be used later.
  451. set_pev(i_Ent, LASERMINE_OWNER, id );
  452. set_pev(i_Ent,LASERMINE_BEAMENDPOINT,vTracedBeamEnd);
  453. set_pev(i_Ent,LASERMINE_TEAM,int:cs_get_user_team(id));
  454. new Float:fCurrTime = get_gametime();
  455.  
  456. set_pev(i_Ent,LASERMINE_POWERUP, fCurrTime + 2.5 );
  457.  
  458. set_pev(i_Ent,LASERMINE_STEP,POWERUP_THINK);
  459. set_pev(i_Ent,pev_nextthink, fCurrTime + 0.2 );
  460.  
  461. PlaySound(i_Ent,POWERUP_SOUND );
  462. g_deployed[id]++;
  463. g_havemine[id]--;
  464. DeleteTask(id);
  465. ShowAmmo(id);
  466. return 1;
  467. }
  468.  
  469. stock TeamDeployedCount(id)
  470. {
  471. //new tid[32];
  472.  
  473. static i;
  474. static CsTeams:t;t = cs_get_user_team(id);
  475. static cnt;cnt=0;
  476.  
  477. for(i = 1;i <= g_MaxPL;i++)
  478. {
  479. if(is_user_connected(i))
  480. if(t == cs_get_user_team(i))
  481. cnt += g_deployed[i];
  482. }
  483.  
  484. return cnt;
  485. }
  486.  
  487. bool:CheckCanTeam(id)
  488. {
  489. new arg[5],CsTeam:num;
  490. get_pcvar_string(g_LCBT,arg,3);
  491. if(equali(arg,"T"))
  492. {
  493. num = CsTeam:CS_TEAM_T;
  494. }
  495. else if(equali(arg,"CT"))
  496. {
  497. num = CsTeam:CS_TEAM_CT;
  498. }
  499. else if(equali(arg,"ALL"))
  500. {
  501. num = CsTeam:CS_TEAM_UNASSIGNED;
  502. }
  503. else
  504. {
  505. num = CsTeam:CS_TEAM_UNASSIGNED;
  506. }
  507. if(num != CsTeam:CS_TEAM_UNASSIGNED && num != CsTeam:cs_get_user_team(id))
  508. return false;
  509. return true;
  510. }
  511.  
  512. bool:CanCheck(id,mode)
  513. {
  514. if( !get_pcvar_num( g_LENABLE ) )
  515. {
  516. client_print(id, print_chat, "%s %s",CHATTAG,STR_NOTACTIVE);
  517. return false;
  518. }
  519. if( get_pcvar_num(g_LACCESS) != 0)
  520. if(!(get_user_flags(id) & ADMIN_IMMUNITY))
  521. {
  522. client_print(id, print_chat, "%s %s",CHATTAG,STR_NOACCESS);
  523. return false;
  524. }
  525. if(!pev_user_alive(id)) return false;
  526. #if defined BIOHAZARD_SUPPORT
  527. if(is_user_zombie(id))
  528. {
  529. client_print(id, print_chat, "%s %s",CHATTAG,STR_CBT);
  530. return false;
  531. }
  532. #endif
  533. if (!CheckCanTeam(id))
  534. {
  535. client_print(id, print_chat, "%s %s",CHATTAG,STR_CBT);
  536. return false;
  537. }
  538. if( mode == 0)
  539. {
  540. if(g_havemine[id] <= 0)
  541. {
  542. client_print(id, print_chat, "%s %s",CHATTAG,STR_DONTHAVEMINE);
  543. return false;
  544. }
  545. }
  546. if (mode == 1)
  547. {
  548. if (get_pcvar_num(g_LBUYMODE) == 0)
  549. {
  550. client_print(id, print_chat, "%s %s",CHATTAG,STR_CANTBUY);
  551. return false;
  552. }
  553. if (g_havemine[id] >= get_pcvar_num(g_LAMMO))
  554. {
  555. client_print(id, print_chat, "%s %s",CHATTAG,STR_HAVEMAX);
  556. return false;
  557. }
  558. if (cs_get_user_money(id) < get_pcvar_num(g_LCOST))
  559. {
  560. client_print(id, print_chat, "%s %s%d %s",CHATTAG, STR_NOMONEY,get_pcvar_num(g_LCOST),STR_NEEDED);
  561. return false;
  562. }
  563. }
  564. if(!CheckTime(id))
  565. {
  566. client_print(id,print_chat, "%s %s %d %s",CHATTAG,STR_DELAY,get_pcvar_num(g_LDELAY)-g_nowtime,STR_SECONDS);
  567. return false;
  568. }
  569.  
  570. return true;
  571. }
  572.  
  573. bool:ReturnCheck( id )
  574. {
  575. if(!CanCheck(id,-1)) return false;
  576. if(g_havemine[id] + 1 > get_pcvar_num(g_LAMMO)) return false;
  577. new tgt,body,Float:vo[3],Float:to[3];
  578. get_user_aiming(id,tgt,body);
  579. if(!pev_valid(tgt)) return false;
  580. pev(id,pev_origin,vo);
  581. pev(tgt,pev_origin,to);
  582. if(get_distance_f(vo,to) > 70.0) return false;
  583.  
  584. new EntityName[32];
  585. pev(tgt, pev_classname, EntityName, 31);
  586. if(!equal(EntityName, ENT_CLASS_NAME)) return false;
  587. if(pev(tgt,LASERMINE_OWNER) != id) return false;
  588.  
  589. return true;
  590. }
  591.  
  592. bool:CreateCheck( id )
  593. {
  594. if (!CanCheck(id,0)) return false;
  595. if (g_deployed[id] >= get_pcvar_num(g_LAMMO))
  596. {
  597. client_print(id, print_chat, "%s %s",CHATTAG,STR_MAXDEPLOY);
  598. return false;
  599. }
  600.  
  601. //client_print(id,print_chat,"[Lasermine] your team deployed %d",TeamDeployedCount(id))
  602. if(TeamDeployedCount(id) >= get_pcvar_num(g_LTMAX))
  603. {
  604. client_print(id, print_chat, "%s %s",CHATTAG,STR_MANYPPL);
  605. return false;
  606. }
  607.  
  608. new Float:vTraceDirection[3], Float:vTraceEnd[3],Float:vOrigin[3];
  609.  
  610. pev( id, pev_origin, vOrigin );
  611. velocity_by_aim( id, 128, vTraceDirection );
  612. xs_vec_add( vTraceDirection, vOrigin, vTraceEnd );
  613.  
  614. engfunc( EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0 );
  615.  
  616. new Float:fFraction,Float:vTraceNormal[3];
  617. get_tr2( 0, TR_flFraction, fFraction );
  618.  
  619. // -- We hit something!
  620. if ( fFraction < 1.0 )
  621. {
  622. // -- Save results to be used later.
  623. get_tr2( 0, TR_vecEndPos, vTraceEnd );
  624. get_tr2( 0, TR_vecPlaneNormal, vTraceNormal );
  625.  
  626. //get_tr2( 0, TR_pHit );
  627.  
  628. return true;
  629. }
  630.  
  631. client_print(id, print_chat, "%s %s",CHATTAG,STR_PLANTWALL)
  632. DeleteTask(id);
  633. // -- Did not touched something. (not solid)
  634. return false;
  635. }
  636.  
  637. public ltm_Think( i_Ent )
  638. {
  639. if ( !pev_valid( i_Ent ) )
  640. return FMRES_IGNORED;
  641. new EntityName[32];
  642. pev( i_Ent, pev_classname, EntityName, 31);
  643. if(!get_pcvar_num(g_LENABLE)) return FMRES_IGNORED;
  644. // -- Entity is not a tripmine, ignoring the next...
  645. if ( !equal( EntityName, ENT_CLASS_NAME ) )
  646. return FMRES_IGNORED;
  647.  
  648. static Float:fCurrTime;
  649. fCurrTime = get_gametime();
  650.  
  651. switch( pev( i_Ent, LASERMINE_STEP ) )
  652. {
  653. case POWERUP_THINK :
  654. {
  655. new Float:fPowerupTime;
  656. pev( i_Ent, LASERMINE_POWERUP, fPowerupTime );
  657.  
  658. if( fCurrTime > fPowerupTime )
  659. {
  660. set_pev( i_Ent, pev_solid, SOLID_BBOX );
  661. set_pev( i_Ent, LASERMINE_STEP, BEAMBREAK_THINK );
  662.  
  663. PlaySound( i_Ent, ACTIVATE_SOUND );
  664. }
  665. if(get_pcvar_num(g_LGLOW)!=0)
  666. {
  667. if(get_pcvar_num(g_LCLMODE)==0)
  668. {
  669. switch (pev(i_Ent,LASERMINE_TEAM))
  670. {
  671. case CS_TEAM_T: set_rendering(i_Ent,kRenderFxGlowShell,255,0,0,kRenderNormal,5);
  672. case CS_TEAM_CT:set_rendering(i_Ent,kRenderFxGlowShell,0,0,255,kRenderNormal,5);
  673. }
  674. }else
  675. {
  676. set_rendering(i_Ent,kRenderFxGlowShell,0,255,0,kRenderNormal,5);
  677. }
  678. }
  679. set_pev( i_Ent, pev_nextthink, fCurrTime + 0.1 );
  680. }
  681. case BEAMBREAK_THINK :
  682. {
  683. static Float:vEnd[3],Float:vOrigin[3];
  684. pev( i_Ent, pev_origin, vOrigin );
  685. pev( i_Ent, LASERMINE_BEAMENDPOINT, vEnd );
  686.  
  687. static iHit, Float:fFraction;
  688. engfunc( EngFunc_TraceLine, vOrigin, vEnd, DONT_IGNORE_MONSTERS, i_Ent, 0 );
  689.  
  690. get_tr2( 0, TR_flFraction, fFraction );
  691. iHit = get_tr2( 0, TR_pHit );
  692.  
  693. // -- Something has passed the laser.
  694. if ( fFraction < 1.0 )
  695. {
  696. // -- Ignoring others tripmines entity.
  697. if(pev_valid(iHit))
  698. {
  699. pev( iHit, pev_classname, EntityName, 31 );
  700.  
  701. if( !equal( EntityName, ENT_CLASS_NAME ) )
  702. {
  703. set_pev( i_Ent, pev_enemy, iHit );
  704. if(get_pcvar_num(g_LMODE) == MODE_LASERMINE)
  705. CreateLaserDamage(i_Ent,iHit);
  706. else
  707. if(get_pcvar_num(g_LFF) || CsTeams:pev(i_Ent,LASERMINE_TEAM) != cs_get_user_team(iHit))
  708. set_pev( i_Ent, LASERMINE_STEP, EXPLOSE_THINK );
  709.  
  710. set_pev( i_Ent, pev_nextthink, fCurrTime + random_float( 0.1, 0.3 ) );
  711. }
  712. }
  713. }
  714. if(get_pcvar_num(g_LDMGMODE)!=0)
  715. if(pev(i_Ent,LASERMINE_HITING) != iHit)
  716. set_pev(i_Ent,LASERMINE_HITING,iHit);
  717.  
  718. // -- Tripmine is still there.
  719. if ( pev_valid( i_Ent ))
  720. {
  721. static Float:fHealth;
  722. pev( i_Ent, pev_health, fHealth );
  723.  
  724. if( fHealth <= 0.0 || (pev(i_Ent,pev_flags) & FL_KILLME))
  725. {
  726. set_pev( i_Ent, LASERMINE_STEP, EXPLOSE_THINK );
  727. set_pev( i_Ent, pev_nextthink, fCurrTime + random_float( 0.1, 0.3 ) );
  728. }
  729.  
  730. static Float:fBeamthink;
  731. pev( i_Ent, LASERMINE_BEAMTHINK, fBeamthink );
  732.  
  733. if( fBeamthink < fCurrTime && get_pcvar_num(g_LVISIBLE))
  734. {
  735. DrawLaser(i_Ent, vOrigin, vEnd );
  736. set_pev( i_Ent, LASERMINE_BEAMTHINK, fCurrTime + 0.1 );
  737. }
  738. set_pev( i_Ent, pev_nextthink, fCurrTime + 0.01 );
  739. }
  740. }
  741. case EXPLOSE_THINK :
  742. {
  743. // -- Stopping entity to think
  744. set_pev( i_Ent, pev_nextthink, 0.0 );
  745. PlaySound( i_Ent, STOP_SOUND );
  746. g_deployed[pev(i_Ent,LASERMINE_OWNER)]--;
  747. CreateExplosion( i_Ent );
  748. CreateDamage(i_Ent,get_pcvar_float(g_LRDMG),get_pcvar_float(g_LRADIUS))
  749. RemoveEntity ( i_Ent );
  750. }
  751. }
  752.  
  753. return FMRES_IGNORED;
  754. }
  755.  
  756. PlaySound( i_Ent, i_SoundType )
  757. {
  758. switch ( i_SoundType )
  759. {
  760. case POWERUP_SOUND :
  761. {
  762. emit_sound( i_Ent, CHAN_VOICE, ENT_SOUND1, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
  763. emit_sound( i_Ent, CHAN_BODY , ENT_SOUND2, 0.2, ATTN_NORM, 0, PITCH_NORM );
  764. }
  765. case ACTIVATE_SOUND :
  766. {
  767. emit_sound( i_Ent, CHAN_VOICE, ENT_SOUND3, 0.5, ATTN_NORM, 1, 75 );
  768. }
  769. case STOP_SOUND :
  770. {
  771. emit_sound( i_Ent, CHAN_BODY , ENT_SOUND2, 0.2, ATTN_NORM, SND_STOP, PITCH_NORM );
  772. emit_sound( i_Ent, CHAN_VOICE, ENT_SOUND3, 0.5, ATTN_NORM, SND_STOP, 75 );
  773. }
  774. }
  775. }
  776.  
  777. DrawLaser(i_Ent, const Float:v_Origin[3], const Float:v_EndOrigin[3] )
  778. {
  779. new tcolor[3];
  780. new teamid = pev(i_Ent, LASERMINE_TEAM);
  781. if(get_pcvar_num(g_LCLMODE) == 0)
  782. {
  783. switch(teamid){
  784. case 1:{
  785. tcolor[0] = 255;
  786. tcolor[1] = 0;
  787. tcolor[2] = 0;
  788. }
  789. case 2:{
  790. tcolor[0] = 0;
  791. tcolor[1] = 0;
  792. tcolor[2] = 255;
  793. }
  794. }
  795. }else
  796. {
  797. tcolor[0] = 0;
  798. tcolor[1] = 255;
  799. tcolor[2] = 0;
  800. }
  801. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  802. write_byte(TE_BEAMPOINTS);
  803. engfunc(EngFunc_WriteCoord,v_Origin[0]);
  804. engfunc(EngFunc_WriteCoord,v_Origin[1]);
  805. engfunc(EngFunc_WriteCoord,v_Origin[2]);
  806. engfunc(EngFunc_WriteCoord,v_EndOrigin[0]); //Random
  807. engfunc(EngFunc_WriteCoord,v_EndOrigin[1]); //Random
  808. engfunc(EngFunc_WriteCoord,v_EndOrigin[2]); //Random
  809. write_short(beam);
  810. write_byte(0);
  811. write_byte(0);
  812. write_byte(1); //Life
  813. write_byte(5); //Width
  814. write_byte(0); //wave
  815. write_byte(tcolor[0]); // r
  816. write_byte(tcolor[1]); // g
  817. write_byte(tcolor[2]); // b
  818. write_byte(get_pcvar_num(g_LCBRIGHT));
  819. write_byte(255);
  820. message_end();
  821. }
  822. /*
  823. CreateDamage(iCurrent,DmgMAX,Float:Radius)
  824. {
  825. new AtkID = pev(iCurrent,LASERMINE_OWNER)// entity_get_int(iCurrent,LASERMINE_OWNER)
  826. new TeamID= pev(iCurrent,LASERMINE_TEAM) //entity_get_int(iCurrent,LASERMINE_INT_TEAM)
  827. new Player = -1;
  828. new Float:distance,dmg;
  829. new Float:tOrigin[3];
  830. new Float:vOrigin[3];
  831. new iHitHP,iHitTeam;
  832. pev(iCurrent,pev_origin,vOrigin);
  833. while((Player = engfunc(EngFunc_FindEntityInSphere, Player, vOrigin, Radius)) != 0)
  834. {
  835. if(is_user_alive(Player))
  836. {
  837. pev(Player,pev_origin,tOrigin)
  838. distance = get_distance_f(vOrigin, tOrigin)
  839. dmg = floatround(DmgMAX - ((DmgMAX / Radius) * distance))
  840. iHitHP = pev_user_health(Player) - dmg
  841. iHitTeam = int:bio_get_user_team(Player)
  842. if(iHitHP <= 0)
  843. {
  844. if(iHitTeam != TeamID)
  845. {
  846. cs_set_user_money(AtkID,cs_get_user_money(AtkID) + get_pcvar_num(g_LFMONEY))
  847. set_score(AtkID,Player,1,iHitHP)
  848. }else
  849. {
  850. if(get_pcvar_num(g_LFF))
  851. {
  852. cs_set_user_money(AtkID,cs_get_user_money(AtkID) - get_pcvar_num(g_LFMONEY))
  853. set_score(AtkID,Player,-1,iHitHP)
  854. }
  855. }
  856. }else
  857. {
  858. if(iHitTeam != TeamID || get_pcvar_num(g_LFF))
  859. {
  860. //set_pev(Player,pev_health,iHitHP)
  861. set_user_health(Player, iHitHP)
  862. message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, {0,0,0}, Player)
  863. write_byte(dmg)
  864. write_byte(dmg)
  865. write_long(DMG_BULLET)
  866. engfunc(EngFunc_WriteCoord,vOrigin[0])
  867. engfunc(EngFunc_WriteCoord,vOrigin[1])
  868. engfunc(EngFunc_WriteCoord,vOrigin[2])
  869. message_end()
  870. }
  871. }
  872. }
  873. Player = engfunc(EngFunc_FindEntityInSphere,Player,vOrigin,Radius)
  874. }
  875. return PLUGIN_CONTINUE
  876. }
  877. */
  878. CreateDamage(iCurrent,Float:DmgMAX,Float:Radius)
  879. {
  880. // Get given parameters
  881.  
  882. new Float:vecSrc[3];
  883. pev(iCurrent, pev_origin, vecSrc);
  884.  
  885. new AtkID =pev(iCurrent,LASERMINE_OWNER);
  886. new TeamID=pev(iCurrent,LASERMINE_TEAM);
  887.  
  888. new ent = -1;
  889. new Float:tmpdmg = DmgMAX;
  890.  
  891. new Float:kickback = 0.0;
  892.  
  893. // Needed for doing some nice calculations :P
  894. new Float:Tabsmin[3], Float:Tabsmax[3];
  895. new Float:vecSpot[3];
  896. new Float:Aabsmin[3], Float:Aabsmax[3];
  897. new Float:vecSee[3];
  898. new trRes;
  899. new Float:flFraction;
  900. new Float:vecEndPos[3];
  901. new Float:distance;
  902. new Float:origin[3], Float:vecPush[3];
  903. new Float:invlen;
  904. new Float:velocity[3];
  905. new iHitHP,iHitTeam;
  906. // Calculate falloff
  907. new Float:falloff;
  908. if (Radius > 0.0)
  909. {
  910. falloff = DmgMAX / Radius;
  911. } else {
  912. falloff = 1.0;
  913. }
  914.  
  915. // Find monsters and players inside a specifiec radius
  916. while((ent = engfunc(EngFunc_FindEntityInSphere, ent, vecSrc, Radius)) != 0)
  917. {
  918. if(!pev_valid(ent)) continue;
  919. if(!(pev(ent, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
  920. {
  921. // Entity is not a player or monster, ignore it
  922. continue;
  923. }
  924. if(!pev_user_alive(ent)) continue;
  925. // Reset data
  926. kickback = 1.0;
  927. tmpdmg = DmgMAX;
  928.  
  929. // The following calculations are provided by Orangutanz, THANKS!
  930. // We use absmin and absmax for the most accurate information
  931. pev(ent, pev_absmin, Tabsmin);
  932. pev(ent, pev_absmax, Tabsmax);
  933. xs_vec_add(Tabsmin,Tabsmax,Tabsmin);
  934. xs_vec_mul_scalar(Tabsmin,0.5,vecSpot);
  935.  
  936. pev(iCurrent, pev_absmin, Aabsmin);
  937. pev(iCurrent, pev_absmax, Aabsmax);
  938. xs_vec_add(Aabsmin,Aabsmax,Aabsmin);
  939. xs_vec_mul_scalar(Aabsmin,0.5,vecSee);
  940.  
  941. engfunc(EngFunc_TraceLine, vecSee, vecSpot, 0, iCurrent, trRes);
  942. get_tr2(trRes, TR_flFraction, flFraction);
  943. // Explosion can 'see' this entity, so hurt them! (or impact through objects has been enabled xD)
  944. if (flFraction >= 0.9 || get_tr2(trRes, TR_pHit) == ent)
  945. {
  946. // Work out the distance between impact and entity
  947. get_tr2(trRes, TR_vecEndPos, vecEndPos);
  948.  
  949. distance = get_distance_f(vecSrc, vecEndPos) * falloff;
  950. tmpdmg -= distance;
  951. if(tmpdmg < 0.0)
  952. tmpdmg = 0.0;
  953.  
  954. // Kickback Effect
  955. if(kickback != 0.0)
  956. {
  957. xs_vec_sub(vecSpot,vecSee,origin);
  958.  
  959. invlen = 1.0/get_distance_f(vecSpot, vecSee);
  960.  
  961. xs_vec_mul_scalar(origin,invlen,vecPush);
  962. pev(ent, pev_velocity, velocity)
  963. xs_vec_mul_scalar(vecPush,tmpdmg,vecPush);
  964. xs_vec_mul_scalar(vecPush,kickback,vecPush);
  965. xs_vec_add(velocity,vecPush,velocity);
  966.  
  967. if(tmpdmg < 60.0)
  968. {
  969. xs_vec_mul_scalar(velocity,12.0,velocity);
  970. } else {
  971. xs_vec_mul_scalar(velocity,4.0,velocity);
  972. }
  973.  
  974. if(velocity[0] != 0.0 || velocity[1] != 0.0 || velocity[2] != 0.0)
  975. {
  976. // There's some movement todo :)
  977. set_pev(ent, pev_velocity, velocity)
  978. }
  979. }
  980.  
  981. iHitHP = pev_user_health(ent) - floatround(tmpdmg)
  982. iHitTeam = int:cs_get_user_team(ent)
  983. if(iHitHP <= 0)
  984. {
  985. if(iHitTeam != TeamID)
  986. {
  987. cs_set_user_money(AtkID,cs_get_user_money(AtkID) + get_pcvar_num(g_LFMONEY))
  988. set_score(AtkID,ent,1,iHitHP)
  989. }else
  990. {
  991. if(get_pcvar_num(g_LFF))
  992. {
  993. cs_set_user_money(AtkID,cs_get_user_money(AtkID) - get_pcvar_num(g_LFMONEY))
  994. set_score(AtkID,ent,-1,iHitHP)
  995. }
  996. }
  997. }else
  998. {
  999. if(iHitTeam != TeamID || get_pcvar_num(g_LFF))
  1000. {
  1001. //set_pev(Player,pev_health,iHitHP)
  1002. set_user_health(ent, iHitHP)
  1003. engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},ent);
  1004. write_byte(floatround(tmpdmg))
  1005. write_byte(floatround(tmpdmg))
  1006. write_long(DMG_BULLET)
  1007. engfunc(EngFunc_WriteCoord,vecSrc[0])
  1008. engfunc(EngFunc_WriteCoord,vecSrc[1])
  1009. engfunc(EngFunc_WriteCoord,vecSrc[2])
  1010. message_end()
  1011. }
  1012. }
  1013. }
  1014. }
  1015.  
  1016. return
  1017. }
  1018.  
  1019. bool:pev_user_alive(ent)
  1020. {
  1021. new deadflag = pev(ent,pev_deadflag);
  1022. if(deadflag != DEAD_NO)
  1023. return false;
  1024. return true;
  1025. }
  1026.  
  1027. CreateExplosion(iCurrent)
  1028. {
  1029.  
  1030. new Float:vOrigin[3];
  1031. pev(iCurrent,pev_origin,vOrigin);
  1032.  
  1033. message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
  1034. write_byte(99); //99 = KillBeam
  1035. write_short(iCurrent);
  1036. message_end();
  1037.  
  1038. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vOrigin, 0);
  1039. write_byte(TE_EXPLOSION);
  1040. engfunc(EngFunc_WriteCoord,vOrigin[0]);
  1041. engfunc(EngFunc_WriteCoord,vOrigin[1]);
  1042. engfunc(EngFunc_WriteCoord,vOrigin[2]);
  1043. write_short(boom);
  1044. write_byte(30);
  1045. write_byte(15);
  1046. write_byte(0);
  1047. message_end();
  1048. }
  1049.  
  1050. CreateLaserDamage(iCurrent,isHit)
  1051. {
  1052. if(isHit < 0 ) return PLUGIN_CONTINUE
  1053. switch(get_pcvar_num(g_LDMGMODE))
  1054. {
  1055. case 1:
  1056. {
  1057. if(pev(iCurrent,LASERMINE_HITING) == isHit)
  1058. return PLUGIN_CONTINUE
  1059. }
  1060. case 2:
  1061. {
  1062. if(pev(iCurrent,LASERMINE_HITING) == isHit)
  1063. {
  1064. static Float:cnt
  1065. static now,htime;now = floatround(get_gametime())
  1066.  
  1067. pev(iCurrent,LASERMINE_COUNT,cnt)
  1068. htime = floatround(cnt)
  1069. if(now - htime < get_pcvar_num(g_LDSEC))
  1070. {
  1071. return PLUGIN_CONTINUE;
  1072. }else{
  1073. set_pev(iCurrent,LASERMINE_COUNT,get_gametime())
  1074. }
  1075. }else
  1076. {
  1077. set_pev(iCurrent,LASERMINE_COUNT,get_gametime())
  1078. }
  1079. }
  1080. }
  1081.  
  1082. new Float:vOrigin[3],Float:vEnd[3]
  1083. pev(iCurrent,pev_origin,vOrigin)
  1084. pev(iCurrent,pev_vuser1,vEnd)
  1085.  
  1086. new teamid = pev(iCurrent, LASERMINE_TEAM)
  1087.  
  1088. new szClassName[32]
  1089. new Alive,God
  1090. new iHitTeam,iHitHP,id
  1091. new hitscore
  1092.  
  1093.  
  1094. szClassName[0] = '^0'
  1095. pev(isHit,pev_classname,szClassName,32)
  1096.  
  1097. if((pev(isHit, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
  1098. {
  1099. Alive = pev_user_alive(isHit)
  1100. God = get_user_godmode(isHit)
  1101. if(!Alive || God) return PLUGIN_CONTINUE
  1102.  
  1103. iHitTeam = int:cs_get_user_team(isHit)
  1104. iHitHP = pev_user_health(isHit) - get_pcvar_num(g_LDMG)
  1105. id = pev(iCurrent,LASERMINE_OWNER)//, szNetName[32]
  1106. if(iHitHP <= 0)
  1107. {
  1108. if(iHitTeam != teamid)
  1109. {
  1110. emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM )
  1111. hitscore = 1
  1112. cs_set_user_money(id,cs_get_user_money(id) + get_pcvar_num(g_LFMONEY))
  1113. set_score(id,isHit,hitscore,iHitHP)
  1114. }else
  1115. {
  1116. if(get_pcvar_num(g_LFF))
  1117. {
  1118. emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM )
  1119. hitscore = -1
  1120. cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(g_LFMONEY))
  1121. set_score(id,isHit,hitscore,iHitHP)
  1122. }
  1123. }
  1124. }else if(iHitTeam != teamid || get_pcvar_num(g_LFF))
  1125. {
  1126. emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM )
  1127. set_user_health(isHit,iHitHP)
  1128. set_pev(iCurrent,LASERMINE_HITING,isHit);
  1129.  
  1130. engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},isHit);
  1131. write_byte(get_pcvar_num(g_LDMG))
  1132. write_byte(get_pcvar_num(g_LDMG))
  1133. write_long(DMG_BULLET)
  1134. engfunc(EngFunc_WriteCoord,vOrigin[0])
  1135. engfunc(EngFunc_WriteCoord,vOrigin[1])
  1136. engfunc(EngFunc_WriteCoord,vOrigin[2])
  1137. message_end()
  1138. }
  1139. }else if(equal(szClassName, ENT_CLASS_NAME3))
  1140. {
  1141. new hl;
  1142. hl = pev_user_health(isHit);
  1143. set_user_health(isHit,hl-get_pcvar_num(g_LDMG));
  1144. }
  1145. return PLUGIN_CONTINUE
  1146. }
  1147.  
  1148. stock pev_user_health(id)
  1149. {
  1150. new Float:health
  1151. pev(id,pev_health,health)
  1152. return floatround(health)
  1153. }
  1154.  
  1155. stock set_user_health(id,health)
  1156. {
  1157. health > 0 ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
  1158. }
  1159.  
  1160. stock get_user_godmode(index) {
  1161. new Float:val
  1162. pev(index, pev_takedamage, val)
  1163.  
  1164. return (val == DAMAGE_NO)
  1165. }
  1166.  
  1167. stock set_user_frags(index, frags)
  1168. {
  1169. set_pev(index, pev_frags, float(frags))
  1170.  
  1171. return 1
  1172. }
  1173.  
  1174. stock pev_user_frags(index)
  1175. {
  1176. new Float:frags;
  1177. pev(index,pev_frags,frags);
  1178. return floatround(frags);
  1179. }
  1180.  
  1181. set_score(id,target,hitscore,HP){
  1182.  
  1183. new idfrags = pev_user_frags(id) + hitscore// get_user_frags(id) + hitscore
  1184. set_user_frags(id,idfrags)
  1185. //set_user_frags(id, idfrags)
  1186. //entity_set_float(id, EV_FL_frags, float(idfrags))
  1187.  
  1188. new tarfrags = pev_user_frags(target) + 1 //get_user_frags(target) + 1
  1189. set_user_frags(target,tarfrags)
  1190. //set_user_frags(target,tarfrags)
  1191. //entity_set_float(target, EV_FL_frags, float(tarfrags))
  1192.  
  1193. new idteam = int:cs_get_user_team(id)
  1194. new iddeaths = cs_get_user_deaths(id)
  1195.  
  1196.  
  1197. message_begin(MSG_ALL, g_msgDeathMsg, {0, 0, 0} ,0)
  1198. write_byte(id)
  1199. write_byte(target)
  1200. write_byte(0)
  1201. write_string(ENT_CLASS_NAME)
  1202. message_end()
  1203.  
  1204. message_begin(MSG_ALL, g_msgScoreInfo)
  1205. write_byte(id)
  1206. write_short(idfrags)
  1207. write_short(iddeaths)
  1208. write_short(0)
  1209. write_short(idteam)
  1210. message_end()
  1211.  
  1212. set_msg_block(g_msgDeathMsg, BLOCK_ONCE)
  1213.  
  1214. //entity_set_float(target, EV_FL_health,float(HP))
  1215. set_user_health(target, HP)
  1216. //set_pev(target,pev_health,HP)
  1217.  
  1218. }
  1219.  
  1220. public BuyLasermine(id)
  1221. {
  1222. if( !CanCheck(id,1) ) return PLUGIN_CONTINUE
  1223. cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(g_LCOST))
  1224. g_havemine[id]++;
  1225. client_print(id, print_chat, "%s %s",CHATTAG,STR_BOUGHT)
  1226. emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  1227. ShowAmmo(id)
  1228. return PLUGIN_HANDLED
  1229. }
  1230.  
  1231. ShowAmmo(id)
  1232. {
  1233. new ammo[51]
  1234. formatex(ammo, 50, "%s %i/%i",STR_STATE, g_havemine[id],get_pcvar_num(g_LAMMO))
  1235.  
  1236. message_begin(MSG_ONE, g_msgStatusText, {0,0,0}, id)
  1237. write_byte(0)
  1238. write_string(ammo)
  1239. message_end()
  1240. }
  1241.  
  1242. public showInfo(id)
  1243. {
  1244. client_print(id, print_chat, STR_REF)
  1245. }
  1246.  
  1247. public say_lasermine(id){
  1248. new said[32]
  1249. read_argv(1,said,31);
  1250. if( !get_pcvar_num( g_LENABLE ) ){
  1251. // client_print(id, print_chat, "%s Lasermines are not currently active.",CHATTAG)
  1252. return PLUGIN_CONTINUE
  1253. }
  1254.  
  1255. if (equali(said,"/buy lasermine")||equali(said,"/lm")){
  1256. BuyLasermine(id)
  1257. }else if (equali(said, "lasermine") || equali(said, "/lasermine")){
  1258. const SIZE = 1024
  1259. new msg[SIZE+1],len = 0;
  1260. len += formatex(msg[len], SIZE - len, "<html><body>")
  1261. len += formatex(msg[len], SIZE - len, "<p><b>LaserMine</b></p><br/><br/>")
  1262. len += formatex(msg[len], SIZE - len, "<p>You can be setting the mine on the wall.</p><br/>")
  1263. len += formatex(msg[len], SIZE - len, "<p>That laser will give what touched it damage.</p><br/><br/>")
  1264. len += formatex(msg[len], SIZE - len, "<p><b>LaserMine Commands</b></p><br/><br/>")
  1265. len += formatex(msg[len], SIZE - len, "<p><b>Say /buy lasermine</b> or <b>Say /lm</b> //buying lasermine<br/>")
  1266. len += formatex(msg[len], SIZE - len, "<b>buy_lasermine</b> //bind ^"F2^" buy_lasermine : using F2 buying lasermine<br/>")
  1267. len += formatex(msg[len], SIZE - len, "<b>+setlaser</b> //bind mouse3 +setlaser : using mouse3 set lasermine on wall<br/>")
  1268. len += formatex(msg[len], SIZE - len, "</body></html>")
  1269. show_motd(id, msg, "Lasermine Entity help")
  1270. return PLUGIN_CONTINUE
  1271. }
  1272. else if (containi(said, "laser") != -1) {
  1273. showInfo(id)
  1274. return PLUGIN_CONTINUE
  1275. }
  1276. return PLUGIN_CONTINUE
  1277. }
  1278.  
  1279. public standing(id)
  1280. {
  1281. if (!g_settinglaser[id])
  1282. return PLUGIN_CONTINUE
  1283.  
  1284. set_pev(id, pev_maxspeed, 1.0)
  1285. // ShowAmmo(id)
  1286.  
  1287. return PLUGIN_CONTINUE
  1288. }
  1289.  
  1290. public ltm_PostThink(id)
  1291. {
  1292. if (!g_settinglaser[id] && plsetting[id]){
  1293. resetspeed(id)
  1294. }
  1295. else if (g_settinglaser[id] && !plsetting[id]) {
  1296. pev(id, pev_maxspeed,plspeed[id])
  1297. set_pev(id, pev_maxspeed, 1.0)
  1298. }
  1299. plsetting[id] = g_settinglaser[id]
  1300. return FMRES_IGNORED
  1301. }
  1302.  
  1303. public ltm_PreThink(id)
  1304. {
  1305. if (!pev_user_alive(id) || g_settinglaser[id] == true || is_user_bot(id) || get_pcvar_num(g_LCMDMODE) == 1)
  1306. return FMRES_IGNORED;
  1307.  
  1308. if(pev(id, pev_button ) & IN_USE && !(pev(id, pev_oldbuttons ) & IN_USE ))
  1309. //client_print(id,print_chat,"test");
  1310. CreateLaserMine_Progress(id)
  1311. return FMRES_IGNORED;
  1312. }
  1313.  
  1314. resetspeed(id)
  1315. {
  1316. set_pev(id, pev_maxspeed, plspeed[id])
  1317. }
  1318.  
  1319. public client_putinserver(id){
  1320. g_deployed[id] = 0;
  1321. g_havemine[id] = 0;
  1322. DeleteTask(id);
  1323. return PLUGIN_CONTINUE
  1324. }
  1325.  
  1326. public client_disconnect(id){
  1327. if(!get_pcvar_num( g_LENABLE ))
  1328. return PLUGIN_CONTINUE
  1329. DeleteTask(id);
  1330. RemoveAllTripmines(id);
  1331. return PLUGIN_CONTINUE
  1332. }
  1333.  
  1334.  
  1335. public newround(id){
  1336. if(!get_pcvar_num( g_LENABLE ))
  1337. return PLUGIN_CONTINUE
  1338. pev(id, pev_maxspeed,plspeed[id])
  1339. DeleteTask(id);
  1340. RemoveAllTripmines(id);
  1341. delaycount(id);
  1342. SetStartAmmo(id);
  1343. return PLUGIN_CONTINUE
  1344. }
  1345.  
  1346. public DeathEvent(){
  1347. if(!get_pcvar_num( g_LENABLE ))
  1348. return PLUGIN_CONTINUE
  1349.  
  1350. new id = read_data(2)
  1351. if(is_user_connected(id)) DeleteTask(id);
  1352. return PLUGIN_CONTINUE
  1353. }
  1354.  
  1355. public RemoveAllTripmines( i_Owner )
  1356. {
  1357. new iEnt = g_MaxPL + 1;
  1358. new clsname[32];
  1359. while( ( iEnt = engfunc( EngFunc_FindEntityByString, iEnt, "classname", ENT_CLASS_NAME ) ) )
  1360. {
  1361. if ( i_Owner )
  1362. {
  1363. if( pev( iEnt, LASERMINE_OWNER ) != i_Owner )
  1364. continue;
  1365. clsname[0] = '^0'
  1366. pev( iEnt, pev_classname, clsname, sizeof(clsname)-1 );
  1367.  
  1368. if ( equali( clsname, ENT_CLASS_NAME ) )
  1369. {
  1370. PlaySound( iEnt, STOP_SOUND );
  1371. RemoveEntity( iEnt );
  1372. }
  1373. }
  1374. else
  1375. set_pev( iEnt, pev_flags, FL_KILLME );
  1376. }
  1377. g_deployed[i_Owner]=0;
  1378. }
  1379.  
  1380. SetStartAmmo(id)
  1381. {
  1382. new stammo = get_pcvar_num(g_LSTAMMO);
  1383. if(stammo <= 0) return PLUGIN_CONTINUE;
  1384. g_havemine[id] = (g_havemine[id] <= stammo) ? stammo : g_havemine[id];
  1385. return PLUGIN_CONTINUE;
  1386. }
  1387.  
  1388. public CutDeploy_onDamage(id)
  1389. {
  1390. if(get_user_health(id) < 1)
  1391. DeleteTask(id);
  1392. }
  1393.  
  1394. #if defined BIOHAZARD_SUPPORT
  1395. public event_infect2(id)
  1396. {
  1397. DeleteTask(id);
  1398. return PLUGIN_CONTINUE
  1399. }
  1400. #endif
  1401.  
  1402. DeleteTask(id)
  1403. {
  1404. if (task_exists((TASK_PLANT + id)))
  1405. {
  1406. remove_task((TASK_PLANT + id))
  1407. }
  1408. if (task_exists((TASK_RELEASE + id)))
  1409. {
  1410. remove_task((TASK_RELEASE + id))
  1411. }
  1412. g_settinglaser[id] = false
  1413. return PLUGIN_CONTINUE;
  1414. }
  1415.  
  1416. stock set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
  1417. {
  1418. static Float:RenderColor[3];
  1419. RenderColor[0] = float(r);
  1420. RenderColor[1] = float(g);
  1421. RenderColor[2] = float(b);
  1422.  
  1423. set_pev(entity, pev_renderfx, fx);
  1424. set_pev(entity, pev_rendercolor, RenderColor);
  1425. set_pev(entity, pev_rendermode, render);
  1426. set_pev(entity, pev_renderamt, float(amount));
  1427.  
  1428. return 1
  1429. }
  1430.  
  1431. // Gets offset data
  1432. get_offset_value(id, type)
  1433. {
  1434. new key = -1;
  1435. switch(type)
  1436. {
  1437. case OFFSET_TEAM: key = OFFSET_TEAM;
  1438. case OFFSET_MONEY:
  1439. {
  1440. #if defined UL_MONEY_SUPPORT
  1441. return cs_get_user_money_ul(id);
  1442. #else
  1443. key = OFFSET_MONEY;
  1444. #endif
  1445. }
  1446. case OFFSET_DEATH: key = OFFSET_DEATH;
  1447. }
  1448.  
  1449. if(key != -1)
  1450. {
  1451. if(is_amd64_server()) key += 25;
  1452. return get_pdata_int(id, key);
  1453. }
  1454.  
  1455. return -1;
  1456. }
  1457.  
  1458. // Sets offset data
  1459. set_offset_value(id, type, value)
  1460. {
  1461. new key = -1;
  1462. switch(type)
  1463. {
  1464. case OFFSET_TEAM: key = OFFSET_TEAM;
  1465. case OFFSET_MONEY:
  1466. {
  1467. #if defined UL_MONEY_SUPPORT
  1468. return cs_set_user_money_ul(id, value);
  1469. #else
  1470. key = OFFSET_MONEY;
  1471.  
  1472. // Send Money message to update player's HUD
  1473. message_begin(MSG_ONE_UNRELIABLE, g_msgMoney, {0,0,0}, id);
  1474. write_long(value);
  1475. write_byte(1); // Flash (difference between new and old money)
  1476. message_end();
  1477. #endif
  1478. }
  1479. case OFFSET_DEATH: key = OFFSET_DEATH;
  1480. }
  1481.  
  1482. if(key != -1)
  1483. {
  1484. if(is_amd64_server()) key += 25;
  1485. set_pdata_int(id, key, value);
  1486. }
  1487.  
  1488. return PLUGIN_CONTINUE;
  1489. }
  1490.