hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2025.06.16. 20:45



Jelenlévő felhasználók

Jelenleg 364 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 363 vendég

A legtöbb felhasználó (2761 fő) 2025.01.09. 20:06-kor tartózkodott itt.

Regisztrált felhasználók: Google [Bot]az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása Hozzászólás a témához  [3 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: [ZP] LaserMine
HozzászólásElküldve:2015.10.02. 13:07 
Offline
Tiszteletbeli
Avatar

Csatlakozott:2015.03.11. 20:11
Hozzászólások:915
Megköszönt másnak: 52 alkalommal
Megköszönték neki: 317 alkalommal
Sziasztok!
Mi a hiba oka?

Hiba:

Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2013 ITB CompuPhase, AMX Mod X Team

Warning: Loose indentation on line 173
Error: Undefined symbol "g_sniperround" on line 173
Error: Undefined symbol "g_assassinround" on line 174
Warning: Loose indentation on line 176
Error: Undefined symbol "zp_is_assassin_round" on line 568
Error: Undefined symbol "zp_is_sniper_round" on line 574

4 Errors.


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


Köszönöm szépen.

_________________
viewtopic.php?f=101&t=25611#p184899
viewtopic.php?f=114&t=29544&p=209471#p209431


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: [ZP] LaserMine
HozzászólásElküldve:2015.10.02. 13:27 
Offline
Tiszteletbeli
Avatar

Csatlakozott:2014.09.08. 22:21
Hozzászólások:3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
Az is_asssassin meg is_sniper részhez olyan include kell ami tartalmazza. Mivel gőzöm nincs honnan szedted így nemtudok segíteni. A többi javítva

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

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: [ZP] LaserMine
HozzászólásElküldve:2015.10.02. 14:23 
Offline
Tud valamit
Avatar

Csatlakozott:2015.07.23. 17:45
Hozzászólások:103
Megköszönt másnak: 4 alkalommal
Megköszönték neki: 5 alkalommal
Használd egészséggel! :) :) :D
SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4. #include <xs>
  5. #include <zombieplague>
  6.  
  7. #tryinclude <biohazard>
  8.  
  9. #if !defined _biohazard_included
  10. #assert '/amxmodx/scripting/include/biohazard.inc'
  11. #assert '/amxmodx/scripting/biohazard.cfg'
  12. #endif
  13.  
  14. #define PLUGIN "[ZP] LaserMine"
  15. #define VERSION "2.8.1"
  16. #define AUTHOR "SandStriker / Shidla / QuZ/DJ_WEST"
  17.  
  18. #define RemoveEntity(%1) engfunc(EngFunc_RemoveEntity,%1)
  19. #define TASK_PLANT 15100
  20. #define TASK_RESET 15500
  21. #define TASK_RELEASE 15900
  22.  
  23. #define LASERMINE_TEAM pev_iuser1 //EV_INT_iuser1
  24. #define LASERMINE_OWNER pev_iuser2 //EV_INT_iuser3
  25. #define LASERMINE_STEP pev_iuser3
  26. #define LASERMINE_HITING pev_iuser4
  27. #define LASERMINE_COUNT pev_fuser1
  28.  
  29. #define LASERMINE_POWERUP pev_fuser2
  30. #define LASERMINE_BEAMTHINK pev_fuser3
  31.  
  32. #define LASERMINE_BEAMENDPOINT pev_vuser1
  33. #define MAX_MINES 10
  34. #define MODE_LASERMINE 0
  35. #define OFFSET_TEAM 114
  36. #define OFFSET_MONEY 115
  37. #define OFFSET_DEATH 444
  38.  
  39. #define cs_get_user_team(%1) CsTeams:get_offset_value(%1,OFFSET_TEAM)
  40. #define cs_get_user_deaths(%1) get_offset_value(%1,OFFSET_DEATH)
  41.  
  42. // Цена за мину ОТОБРАЖАЕМОЕ в Меню. Реальная цена задаётся КВАРом!
  43. new const LMCost = 2
  44.  
  45.  
  46. /*########### Цвета Мин и лазерных лучей ###########*/
  47. // Цвет мины и лазера людей
  48. new const
  49. Red_Hum = 255,
  50. Green_Hum = 255,
  51. Blue_Hum = 255;
  52.  
  53. // Цвет мины и лазера зомби
  54. new const
  55. Red_Zomb = 255,
  56. Green_Zomb = 0,
  57. Blue_Zomb = 0;
  58. /*####### Цвета Мин и лазерных лучей (конец) #######*/
  59.  
  60. enum CsTeams {
  61. CS_TEAM_UNASSIGNED = 0,
  62. CS_TEAM_T = 1,
  63. CS_TEAM_CT = 2,
  64. CS_TEAM_SPECTATOR = 3
  65. };
  66.  
  67. enum tripmine_e {
  68. TRIPMINE_IDLE1 = 0,
  69. TRIPMINE_IDLE2,
  70. TRIPMINE_ARM1,
  71. TRIPMINE_ARM2,
  72. TRIPMINE_FIDGET,
  73. TRIPMINE_HOLSTER,
  74. TRIPMINE_DRAW,
  75. TRIPMINE_WORLD,
  76. TRIPMINE_GROUND,
  77. };
  78.  
  79. enum
  80. {
  81. POWERUP_THINK,
  82. BEAMBREAK_THINK,
  83. EXPLOSE_THINK
  84. };
  85.  
  86. enum
  87. {
  88. POWERUP_SOUND,
  89. ACTIVATE_SOUND,
  90. STOP_SOUND
  91. };
  92.  
  93. new const
  94. ENT_MODELS[] = "models/zombie_plague/LaserMines/v_laser_mine.mdl",
  95. ENT_SOUND1[] = "weapons/mine_deploy.wav",
  96. ENT_SOUND2[] = "weapons/mine_charge.wav",
  97. ENT_SOUND3[] = "weapons/mine_activate.wav",
  98. ENT_SOUND4[] = "items/suitchargeok1.wav",
  99. ENT_SOUND5[] = "items/gunpickup2.wav",
  100. ENT_SOUND6[] = "debris/bustglass1.wav",
  101. ENT_SOUND7[] = "debris/bustglass2.wav",
  102. ENT_SPRITE1[] = "sprites/laserbeam.spr",
  103. ENT_SPRITE2[] = "sprites/lm_explode.spr";
  104.  
  105. new const
  106. ENT_CLASS_NAME[] = "lasermine",
  107. ENT_CLASS_NAME3[] = "func_breakable",
  108. gSnarkClassName[] = "wpn_snark", // Для совместимости с плагином "Snark"
  109. barnacle_class[] = "barnacle", // Для совместимости с плагином "Barnacle"
  110. weapon_box[] = "weaponbox";
  111.  
  112. new g_EntMine, beam, boom
  113. new g_LENABLE, g_LFMONEY, g_LAMMO, g_LDMG, g_LBEO, g_LTMAX, g_LCOST, g_LHEALTH, g_LMODE, g_LRADIUS, g_NOROUND, g_NEMROUND, g_SURVROUND, g_ASSASSINROUND , g_SNIPERROUND
  114. new g_LRDMG,g_LFF,g_LCBT, g_LDELAY, g_LVISIBLE, g_LSTAMMO, g_LACCESS, g_LGLOW, g_LDMGMODE, g_LCLMODE
  115. new g_LCBRIGHT, g_LDSEC, g_LCMDMODE, g_LBUYMODE, g_LME;
  116. new g_msgDeathMsg,g_msgScoreInfo,g_msgDamage,g_msgStatusText;
  117. new g_dcount[33],g_nowtime,g_MaxPL
  118. new bool:g_settinglaser[33]
  119. new Float:plspeed[33], plsetting[33], g_havemine[33], g_deployed[33];
  120. //new CVAR_LMCost
  121.  
  122. public plugin_init()
  123. {
  124. register_plugin(PLUGIN, VERSION, AUTHOR);
  125.  
  126. // Регистрируем ExtraItem
  127.  
  128. g_LME = zp_register_extra_item("Laser Mine", LMCost, ZP_TEAM_ANY)
  129.  
  130. // Вызываем функцию Laser_TakeDamage при получении урона объектом ENT_CLASS_NAME3 (func_breakable)
  131. RegisterHam(Ham_TakeDamage, ENT_CLASS_NAME3, "Laser_TakeDamage")
  132. // Add your code here...
  133. register_clcmd("+setlaser","CreateLaserMine_Progress_b");
  134. register_clcmd("-setlaser","StopCreateLaserMine");
  135. register_clcmd("+dellaser","ReturnLaserMine_Progress");
  136. register_clcmd("-dellaser","StopReturnLaserMine");
  137. register_clcmd("say","say_lasermine");
  138. register_clcmd("buy_lasermine","BuyLasermine");
  139.  
  140. g_LENABLE = register_cvar("zp_ltm","1")
  141. g_LACCESS = register_cvar("zp_ltm_acs","0") //0 all, 1 admin
  142. g_LMODE = register_cvar("zp_ltm_mode","0") //0 lasermine, 1 tripmine
  143. g_LAMMO = register_cvar("zp_ltm_ammo","5")
  144. g_LDMG = register_cvar("zp_ltm_dmg","60") //laser hit dmg
  145. g_LCOST = register_cvar("zp_ltm_cost","2")
  146. g_LFMONEY = register_cvar("zp_ltm_fragmoney","1")
  147. g_LHEALTH = register_cvar("zp_ltm_health","5")
  148. g_LTMAX = register_cvar("zp_ltm_teammax","100")
  149. g_LRADIUS = register_cvar("zp_ltm_radius","320.0")
  150. g_LRDMG = register_cvar("zp_ltm_rdmg","100") //radius damage
  151. g_LFF = register_cvar("zp_ltm_ff","0")
  152. g_LCBT = register_cvar("zp_ltm_cbt","ALL")
  153. g_LDELAY = register_cvar("zp_ltm_delay","0.1")
  154. g_LVISIBLE = register_cvar("zp_ltm_line","1")
  155. g_LGLOW = register_cvar("zp_ltm_glow","0")
  156. g_LCBRIGHT = register_cvar("zp_ltm_bright","255")//laser line brightness.
  157. g_LCLMODE = register_cvar("zp_ltm_color","0") //0 is team color,1 is green
  158. g_LDMGMODE = register_cvar("zp_ltm_ldmgmode","0") //0 - frame dmg, 1 - once dmg, 2 - 1 second dmg
  159. g_LDSEC = register_cvar("zp_ltm_ldmgseconds","1") //mode 2 only, damage / seconds. default 1 (sec)
  160. g_LSTAMMO = register_cvar("zp_ltm_startammo","1")
  161. g_LBUYMODE = register_cvar("zp_ltm_buymode","1");
  162. g_LCMDMODE = register_cvar("zp_ltm_cmdmode","0"); //0 is +USE key, 1 is bind, 2 is each.
  163. g_LBEO = register_cvar("zp_ltm_brokeenemy","1");
  164. g_NOROUND = register_cvar("zp_ltm_noround","1");
  165. g_NEMROUND = register_cvar("zp_ltm_nemround","1");
  166. g_SURVROUND = register_cvar("zp_ltm_survround","1");
  167. g_SNIPERROUND = register_cvar("zp_ltm_sniperround","1");
  168. g_ASSASSINROUND = register_cvar("zp_ltm_assassinround","1");
  169.  
  170. register_event("DeathMsg", "DeathEvent", "a");
  171. register_event("CurWeapon", "standing", "be", "1=1");
  172. register_event("ResetHUD", "delaycount", "a");
  173. register_event("ResetHUD", "newround", "b");
  174. register_logevent("endround", 2, "0=World triggered", "1=Round_End"); // Регистрируем конец раунда
  175. register_event("Damage","CutDeploy_onDamage","b");
  176. g_msgDeathMsg = get_user_msgid("DeathMsg");
  177. g_msgScoreInfo = get_user_msgid("ScoreInfo");
  178. g_msgDamage = get_user_msgid("Damage");
  179. g_msgStatusText = get_user_msgid("StatusText");
  180.  
  181. // Forward.
  182. register_forward(FM_Think, "ltm_Think");
  183. register_forward(FM_PlayerPostThink, "ltm_PostThink");
  184. register_forward(FM_PlayerPreThink, "ltm_PreThink");
  185.  
  186. // Регистируем файл языков
  187. register_dictionary("LaserMines.txt")
  188. register_cvar("Shidla", "[ZP] LaserMines v.2.8.1 Final", FCVAR_SERVER|FCVAR_SPONLY)
  189. }
  190.  
  191. public plugin_precache()
  192. {
  193. precache_sound(ENT_SOUND1);
  194. precache_sound(ENT_SOUND2);
  195. precache_sound(ENT_SOUND3);
  196. precache_sound(ENT_SOUND4);
  197. precache_sound(ENT_SOUND5);
  198. precache_sound(ENT_SOUND6);
  199. precache_sound(ENT_SOUND7);
  200. precache_model(ENT_MODELS);
  201. beam = precache_model(ENT_SPRITE1);
  202. boom = precache_model(ENT_SPRITE2);
  203. return PLUGIN_CONTINUE;
  204. }
  205.  
  206. public plugin_modules()
  207. {
  208. require_module("fakemeta");
  209. require_module("cstrike");
  210. }
  211.  
  212. public plugin_cfg()
  213. {
  214. g_EntMine = engfunc(EngFunc_AllocString,ENT_CLASS_NAME3);
  215. arrayset(g_havemine,0,sizeof(g_havemine));
  216. arrayset(g_deployed,0,sizeof(g_deployed));
  217. g_MaxPL = get_maxplayers();
  218.  
  219. new file[64]; get_localinfo("amxx_configsdir",file,63);
  220. format(file, 63, "%s/zp_ltm_cvars_ap.cfg", file);
  221. if(file_exists(file)) server_cmd("exec %s", file), server_exec();
  222. }
  223.  
  224. public Laser_TakeDamage(victim, inflictor, attacker, Float:f_Damage, bit_Damage)
  225. {
  226. if(get_pcvar_num(g_LBEO))
  227. {
  228. new i_Owner
  229.  
  230. // Получаем ID игрока, который поставил мину
  231. i_Owner = pev(victim, LASERMINE_OWNER)
  232.  
  233. // Если команда того, кто поставил мину и того, кто атаковал совпадают
  234. if(CsTeams:pev(victim, LASERMINE_TEAM) == cs_get_user_team(attacker))
  235. // Если тот кто поставил мину, не совпадает с тем, кто ее атаковал, то прекращаем выполнение
  236. if(i_Owner != attacker)
  237. return HAM_SUPERCEDE
  238. return PLUGIN_CONTINUE
  239. }
  240. return PLUGIN_CONTINUE
  241. }
  242.  
  243. public delaycount(id)
  244. {
  245. g_dcount[id] = floatround(get_gametime());
  246. }
  247.  
  248. bool:CheckTime(id)
  249. {
  250. g_nowtime = floatround(get_gametime()) - g_dcount[id];
  251. if(g_nowtime >= get_pcvar_num(g_LDELAY))
  252. return true;
  253. return false;
  254. }
  255.  
  256. public CreateLaserMine_Progress_b(id)
  257. {
  258. if(get_pcvar_num(g_LCMDMODE) != 0)
  259. CreateLaserMine_Progress(id);
  260. return PLUGIN_HANDLED;
  261. }
  262.  
  263. public CreateLaserMine_Progress(id)
  264. {
  265.  
  266. if(!CreateCheck(id))
  267. return PLUGIN_HANDLED;
  268. g_settinglaser[id] = true;
  269.  
  270. message_begin(MSG_ONE, 108, {0,0,0}, id);
  271. write_byte(1);
  272. write_byte(0);
  273. message_end();
  274.  
  275. set_task(1.2, "Spawn", (TASK_PLANT + id));
  276.  
  277. return PLUGIN_HANDLED;
  278. }
  279.  
  280. public ReturnLaserMine_Progress(id)
  281. {
  282.  
  283. if(!ReturnCheck(id))
  284. return PLUGIN_HANDLED;
  285. g_settinglaser[id] = true;
  286.  
  287. message_begin(MSG_ONE, 108, {0,0,0}, id);
  288. write_byte(1);
  289. write_byte(0);
  290. message_end();
  291.  
  292. set_task(1.2, "ReturnMine", (TASK_RELEASE + id));
  293.  
  294. return PLUGIN_HANDLED;
  295. }
  296.  
  297. public StopCreateLaserMine(id)
  298. {
  299.  
  300. DeleteTask(id);
  301. message_begin(MSG_ONE, 108, {0,0,0}, id);
  302. write_byte(0);
  303. write_byte(0);
  304. message_end();
  305.  
  306. return PLUGIN_HANDLED;
  307. }
  308.  
  309. public StopReturnLaserMine(id)
  310. {
  311.  
  312. DeleteTask(id);
  313. message_begin(MSG_ONE, 108, {0,0,0}, id);
  314. write_byte(0);
  315. write_byte(0);
  316. message_end();
  317.  
  318. return PLUGIN_HANDLED;
  319. }
  320.  
  321. public ReturnMine(id)
  322. {
  323. id -= TASK_RELEASE;
  324. new tgt,body,Float:vo[3],Float:to[3];
  325. get_user_aiming(id,tgt,body);
  326. if(!pev_valid(tgt)) return;
  327. pev(id,pev_origin,vo);
  328. pev(tgt,pev_origin,to);
  329. if(get_distance_f(vo,to) > 70.0) return;
  330. new EntityName[32];
  331. pev(tgt, pev_classname, EntityName, 31);
  332. if(!equal(EntityName, ENT_CLASS_NAME)) return;
  333. if(pev(tgt,LASERMINE_OWNER) != id) return;
  334. RemoveEntity(tgt);
  335.  
  336. g_havemine[id] ++;
  337. g_deployed[id] --;
  338. emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  339. ShowAmmo(id)
  340.  
  341. return;
  342. }
  343.  
  344. public Spawn(id)
  345. {
  346. id -= TASK_PLANT
  347. // motor
  348. new i_Ent = engfunc(EngFunc_CreateNamedEntity,g_EntMine);
  349. if(!i_Ent)
  350. {
  351. client_print(id, print_chat,"[Laesrmine Debug] Can't Create Entity");
  352. return PLUGIN_HANDLED_MAIN;
  353. }
  354. set_pev(i_Ent,pev_classname,ENT_CLASS_NAME);
  355.  
  356. engfunc(EngFunc_SetModel,i_Ent,ENT_MODELS);
  357.  
  358. set_pev(i_Ent,pev_solid,SOLID_NOT);
  359. set_pev(i_Ent,pev_movetype,MOVETYPE_FLY);
  360.  
  361. set_pev(i_Ent,pev_frame,0);
  362. set_pev(i_Ent,pev_body,3);
  363. set_pev(i_Ent,pev_sequence,TRIPMINE_WORLD);
  364. set_pev(i_Ent,pev_framerate,0);
  365. set_pev(i_Ent,pev_takedamage,DAMAGE_YES);
  366. set_pev(i_Ent,pev_dmg,100.0);
  367. set_user_health(i_Ent,get_pcvar_num(g_LHEALTH));
  368. new Float:vOrigin[3];
  369. new Float:vNewOrigin[3],Float:vNormal[3],Float:vTraceDirection[3],
  370. Float:vTraceEnd[3],Float:vEntAngles[3];
  371. pev(id, pev_origin, vOrigin);
  372. velocity_by_aim(id, 128, vTraceDirection);
  373. xs_vec_add(vTraceDirection, vOrigin, vTraceEnd);
  374. engfunc(EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0);
  375. new Float:fFraction;
  376. get_tr2(0, TR_flFraction, fFraction);
  377.  
  378. // -- We hit something!
  379. if(fFraction < 1.0)
  380. {
  381. // -- Save results to be used later.
  382. get_tr2(0, TR_vecEndPos, vTraceEnd);
  383. get_tr2(0, TR_vecPlaneNormal, vNormal);
  384. }
  385.  
  386.  
  387. xs_vec_mul_scalar(vNormal, 8.0, vNormal);
  388. xs_vec_add(vTraceEnd, vNormal, vNewOrigin);
  389.  
  390. engfunc(EngFunc_SetSize, i_Ent, Float:{ -4.0, -4.0, -4.0 }, Float:{ 4.0, 4.0, 4.0 });
  391. engfunc(EngFunc_SetOrigin, i_Ent, vNewOrigin);
  392.  
  393. // -- Rotate tripmine.
  394. vector_to_angle(vNormal,vEntAngles);
  395. set_pev(i_Ent,pev_angles,vEntAngles);
  396.  
  397. // -- Calculate laser end origin.
  398. new Float:vBeamEnd[3], Float:vTracedBeamEnd[3];
  399.  
  400. xs_vec_mul_scalar(vNormal, 8192.0, vNormal);
  401. xs_vec_add(vNewOrigin, vNormal, vBeamEnd);
  402.  
  403. engfunc(EngFunc_TraceLine, vNewOrigin, vBeamEnd, IGNORE_MONSTERS, -1, 0);
  404.  
  405. get_tr2(0, TR_vecPlaneNormal, vNormal);
  406. get_tr2(0, TR_vecEndPos, vTracedBeamEnd);
  407.  
  408. // -- Save results to be used later.
  409. set_pev(i_Ent, LASERMINE_OWNER, id);
  410. set_pev(i_Ent,LASERMINE_BEAMENDPOINT,vTracedBeamEnd);
  411. set_pev(i_Ent,LASERMINE_TEAM,int:cs_get_user_team(id));
  412. new Float:fCurrTime = get_gametime();
  413.  
  414. set_pev(i_Ent,LASERMINE_POWERUP, fCurrTime + 2.5);
  415. set_pev(i_Ent,LASERMINE_STEP,POWERUP_THINK);
  416. set_pev(i_Ent,pev_nextthink, fCurrTime + 0.2);
  417.  
  418. PlaySound(i_Ent,POWERUP_SOUND);
  419. g_deployed[id]++;
  420. g_havemine[id]--;
  421. DeleteTask(id);
  422. ShowAmmo(id);
  423. return 1;
  424. }
  425.  
  426. stock TeamDeployedCount(id)
  427. {
  428. static i;
  429. static CsTeams:t;t = cs_get_user_team(id);
  430. static cnt;cnt=0;
  431.  
  432. for(i = 1;i <= g_MaxPL;i++)
  433. {
  434. if(is_user_connected(i))
  435. if(t == cs_get_user_team(i))
  436. cnt += g_deployed[i];
  437. }
  438.  
  439. return cnt;
  440. }
  441.  
  442. bool:CheckCanTeam(id)
  443. {
  444. new arg[5],CsTeam:num;
  445. get_pcvar_string(g_LCBT,arg,3);
  446. if(equali(arg,"Z"))
  447. {
  448. num = CsTeam:CS_TEAM_T;
  449. }
  450. else if(equali(arg,"H"))
  451. {
  452. num = CsTeam:CS_TEAM_CT;
  453. }
  454. else if(equali(arg,"ALL") || equali(arg,"HZ") || equali(arg,"ZH"))
  455. {
  456. num = CsTeam:CS_TEAM_UNASSIGNED;
  457. }
  458. else
  459. {
  460. num = CsTeam:CS_TEAM_UNASSIGNED;
  461. }
  462. if(num != CsTeam:CS_TEAM_UNASSIGNED && num != CsTeam:cs_get_user_team(id))
  463. return false;
  464. return true;
  465. }
  466.  
  467. bool:CanCheck(id,mode) // Проверки: когда можно ставить мины
  468. {
  469. if(!get_pcvar_num(g_LENABLE))
  470. {
  471. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_NOTACTIVE")
  472.  
  473. return false;
  474. }
  475. if(get_pcvar_num(g_LACCESS) != 0)
  476. if(!(get_user_flags(id) & ADMIN_IMMUNITY))
  477. {
  478. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_NOACCESS")
  479. return false;
  480. }
  481. if(!pev_user_alive(id)) return false;
  482. if(!CheckCanTeam(id))
  483. {
  484. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_CBT")
  485. return false;
  486. }
  487. if(mode == 0)
  488. {
  489. if(g_havemine[id] <= 0)
  490. {
  491. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_DONTHAVEMINE")
  492. return false;
  493. }
  494. }
  495. if(mode == 1)
  496. {
  497. if(get_pcvar_num(g_LBUYMODE) == 0)
  498. {
  499. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_CANTBUY")
  500. return false;
  501. }
  502. if(g_havemine[id] >= get_pcvar_num(g_LAMMO))
  503. {
  504. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_HAVEMAX")
  505. return false;
  506. }
  507. if(zp_get_user_ammo_packs(id) < get_pcvar_num(g_LCOST))
  508. {
  509. client_print(id, print_chat, "%L %L%d %L", id, "CHATTAG",id, "STR_NOMONEY",get_pcvar_num(g_LCOST),id, "STR_NEEDED")
  510. return false;
  511. }
  512. }
  513. if(!CheckTime(id))
  514. {
  515. client_print(id, print_chat, "%L %L %d %L", id, "CHATTAG",id, "STR_DELAY",get_pcvar_num(g_LDELAY)-g_nowtime,id, "STR_SECONDS")
  516. return false;
  517. }
  518.  
  519. return true;
  520. }
  521.  
  522. bool:ReturnCheck(id)
  523. {
  524. if(!CanCheck(id,-1)) return false;
  525. if(g_havemine[id] + 1 > get_pcvar_num(g_LAMMO)) return false;
  526. new tgt,body,Float:vo[3],Float:to[3];
  527. get_user_aiming(id,tgt,body);
  528. if(!pev_valid(tgt)) return false;
  529. pev(id,pev_origin,vo);
  530. pev(tgt,pev_origin,to);
  531. if(get_distance_f(vo,to) > 70.0) return false;
  532. new EntityName[32];
  533. pev(tgt, pev_classname, EntityName, 31);
  534. if(!equal(EntityName, ENT_CLASS_NAME)) return false;
  535. if(pev(tgt,LASERMINE_OWNER) != id) return false;
  536. return true;
  537. }
  538.  
  539. bool:CreateCheck(id)
  540. {
  541. if(!CanCheck(id,0)) return false;
  542.  
  543. // Проверка на разрешение
  544. if(!zp_has_round_started() && get_pcvar_num(g_NOROUND))
  545. {
  546. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_NOROUND")
  547. return false;
  548. }
  549.  
  550. if(zp_is_nemesis_round() && get_pcvar_num(g_NEMROUND))
  551. {
  552. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_NEMROUND")
  553. return false;
  554. }
  555.  
  556. if(zp_is_survivor_round() && get_pcvar_num(g_SURVROUND))
  557. {
  558. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_SURVROUND")
  559. return false;
  560. }
  561.  
  562. if(zp_is_assassin_round() && get_pcvar_num(g_ASSASSINROUND))
  563. {
  564. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_ASSISSINROUND")
  565. return false;
  566. }
  567.  
  568. if(zp_is_sniper_round() && get_pcvar_num(g_SNIPERROUND))
  569. {
  570. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_SNIPERROUND")
  571. return false;
  572. }
  573.  
  574. if(g_deployed[id] >= get_pcvar_num(g_LAMMO))
  575. {
  576. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_MAXDEPLOY")
  577. return false;
  578. }
  579.  
  580. if(TeamDeployedCount(id) >= get_pcvar_num(g_LTMAX))
  581. {
  582. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_MANYPPL")
  583. return false;
  584. }
  585. new Float:vTraceDirection[3], Float:vTraceEnd[3],Float:vOrigin[3];
  586. pev(id, pev_origin, vOrigin);
  587. velocity_by_aim(id, 128, vTraceDirection);
  588. xs_vec_add(vTraceDirection, vOrigin, vTraceEnd);
  589. engfunc(EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0);
  590. new Float:fFraction,Float:vTraceNormal[3];
  591. get_tr2(0, TR_flFraction, fFraction);
  592. // -- We hit something!
  593. if(fFraction < 1.0)
  594. {
  595. // -- Save results to be used later.
  596. get_tr2(0, TR_vecEndPos, vTraceEnd);
  597. get_tr2(0, TR_vecPlaneNormal, vTraceNormal);
  598.  
  599. return true;
  600. }
  601.  
  602. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_PLANTWALL")
  603. DeleteTask(id);
  604. // -- Did not touched something. (not solid)
  605. return false;
  606. }
  607.  
  608. public ltm_Think(i_Ent)
  609. {
  610. if(!pev_valid(i_Ent))
  611. return FMRES_IGNORED;
  612. new EntityName[32];
  613. pev(i_Ent, pev_classname, EntityName, 31);
  614. if(!get_pcvar_num(g_LENABLE)) return FMRES_IGNORED;
  615. // -- Entity is not a tripmine, ignoring the next...
  616. if(!equal(EntityName, ENT_CLASS_NAME))
  617. return FMRES_IGNORED;
  618.  
  619. static Float:fCurrTime;
  620. fCurrTime = get_gametime();
  621.  
  622. switch(pev(i_Ent, LASERMINE_STEP))
  623. {
  624. case POWERUP_THINK :
  625. {
  626. new Float:fPowerupTime;
  627. pev(i_Ent, LASERMINE_POWERUP, fPowerupTime);
  628.  
  629. if(fCurrTime > fPowerupTime)
  630. {
  631. set_pev(i_Ent, pev_solid, SOLID_BBOX);
  632. set_pev(i_Ent, LASERMINE_STEP, BEAMBREAK_THINK);
  633.  
  634. PlaySound(i_Ent, ACTIVATE_SOUND);
  635. }
  636. if(get_pcvar_num(g_LGLOW)!=0)
  637. {
  638. if(get_pcvar_num(g_LCLMODE)==0)
  639. {
  640. switch (pev(i_Ent,LASERMINE_TEAM))
  641. {
  642. // цвет лазера Зомби
  643. case CS_TEAM_T: set_rendering(i_Ent,kRenderFxGlowShell,Red_Zomb,Green_Zomb,Blue_Zomb,kRenderNormal,5);
  644. // цвет лазера Человека
  645. case CS_TEAM_CT:set_rendering(i_Ent,kRenderFxGlowShell,Red_Hum,Green_Hum,Blue_Hum,kRenderNormal,5);
  646. }
  647. }else
  648. {
  649. // цвет лазера, если стоит "одинаковый для всех" цвет
  650. set_rendering(i_Ent,kRenderFxGlowShell,random_num(50 , 200),random_num(50 , 200),random_num(50 , 200),kRenderNormal,5);
  651. }
  652. }
  653. set_pev(i_Ent, pev_nextthink, fCurrTime + 0.1);
  654. }
  655. case BEAMBREAK_THINK :
  656. {
  657. static Float:vEnd[3],Float:vOrigin[3];
  658. pev(i_Ent, pev_origin, vOrigin);
  659. pev(i_Ent, LASERMINE_BEAMENDPOINT, vEnd);
  660.  
  661. static iHit, Float:fFraction;
  662. engfunc(EngFunc_TraceLine, vOrigin, vEnd, DONT_IGNORE_MONSTERS, i_Ent, 0);
  663.  
  664. get_tr2(0, TR_flFraction, fFraction);
  665. iHit = get_tr2(0, TR_pHit);
  666.  
  667. // -- Something has passed the laser.
  668. if(fFraction < 1.0)
  669. {
  670. // -- Ignoring others tripmines entity.
  671. if(pev_valid(iHit))
  672. {
  673. pev(iHit, pev_classname, EntityName, 31);
  674. // Игнорим всякую хрень
  675. if(!equal(EntityName, ENT_CLASS_NAME) && !equal(EntityName, gSnarkClassName) && !equal(EntityName, barnacle_class) && !equal(EntityName, weapon_box))
  676. {
  677. set_pev(i_Ent, pev_enemy, iHit);
  678.  
  679. if(get_pcvar_num(g_LMODE) == MODE_LASERMINE)
  680. CreateLaserDamage(i_Ent,iHit);
  681. else
  682. if(get_pcvar_num(g_LFF) || CsTeams:pev(i_Ent,LASERMINE_TEAM) != cs_get_user_team(iHit))
  683. set_pev(i_Ent, LASERMINE_STEP, EXPLOSE_THINK);
  684.  
  685. if (!pev_valid(i_Ent)) // если не верный объект - ничего не делаем. Спасибо DJ_WEST
  686. return FMRES_IGNORED;
  687.  
  688. set_pev(i_Ent, pev_nextthink, fCurrTime + random_float(0.1, 0.3));
  689. }
  690. }
  691. }
  692. if(get_pcvar_num(g_LDMGMODE)!=0)
  693. if(pev(i_Ent,LASERMINE_HITING) != iHit)
  694. set_pev(i_Ent,LASERMINE_HITING,iHit);
  695.  
  696. // -- Tripmine is still there.
  697. if(pev_valid(i_Ent))
  698. {
  699. static Float:fHealth;
  700. pev(i_Ent, pev_health, fHealth);
  701.  
  702. if(fHealth <= 0.0 || (pev(i_Ent,pev_flags) & FL_KILLME))
  703. {
  704. set_pev(i_Ent, LASERMINE_STEP, EXPLOSE_THINK);
  705. set_pev(i_Ent, pev_nextthink, fCurrTime + random_float(0.1, 0.3));
  706. }
  707.  
  708. static Float:fBeamthink;
  709. pev(i_Ent, LASERMINE_BEAMTHINK, fBeamthink);
  710.  
  711. if(fBeamthink < fCurrTime && get_pcvar_num(g_LVISIBLE))
  712. {
  713. DrawLaser(i_Ent, vOrigin, vEnd);
  714. set_pev(i_Ent, LASERMINE_BEAMTHINK, fCurrTime + 0.1);
  715. }
  716. set_pev(i_Ent, pev_nextthink, fCurrTime + 0.01);
  717. }
  718. }
  719. case EXPLOSE_THINK :
  720. {
  721. // -- Stopping entity to think
  722. set_pev(i_Ent, pev_nextthink, 0.0);
  723. PlaySound(i_Ent, STOP_SOUND);
  724. g_deployed[pev(i_Ent,LASERMINE_OWNER)]--;
  725. CreateExplosion(i_Ent);
  726. CreateDamage(i_Ent,get_pcvar_float(g_LRDMG),get_pcvar_float(g_LRADIUS))
  727. RemoveEntity (i_Ent);
  728. }
  729. }
  730.  
  731. return FMRES_IGNORED;
  732. }
  733.  
  734. PlaySound(i_Ent, i_SoundType)
  735. {
  736. switch (i_SoundType)
  737. {
  738. case POWERUP_SOUND :
  739. {
  740. emit_sound(i_Ent, CHAN_VOICE, ENT_SOUND1, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
  741. emit_sound(i_Ent, CHAN_BODY , ENT_SOUND2, 0.2, ATTN_NORM, 0, PITCH_NORM);
  742. }
  743. case ACTIVATE_SOUND :
  744. {
  745. emit_sound(i_Ent, CHAN_VOICE, ENT_SOUND3, 0.5, ATTN_NORM, 1, 75);
  746. }
  747. case STOP_SOUND :
  748. {
  749. emit_sound(i_Ent, CHAN_BODY , ENT_SOUND2, 0.2, ATTN_NORM, SND_STOP, PITCH_NORM);
  750. emit_sound(i_Ent, CHAN_VOICE, ENT_SOUND3, 0.5, ATTN_NORM, SND_STOP, 75);
  751. }
  752. }
  753. }
  754.  
  755. DrawLaser(i_Ent, const Float:v_Origin[3], const Float:v_EndOrigin[3])
  756. {
  757. new tcolor[3];
  758. new teamid = pev(i_Ent, LASERMINE_TEAM);
  759. if(get_pcvar_num(g_LCLMODE) == 0)
  760. {
  761. switch(teamid){
  762. case 1:{
  763. // Цвет луча для Зомби
  764. tcolor[0] = Red_Zomb;
  765. tcolor[1] = Green_Zomb;
  766. tcolor[2] = Blue_Zomb;
  767. }
  768. case 2:{
  769. // Цвет луча для Человека
  770. tcolor[0] = Red_Hum;
  771. tcolor[1] = Green_Hum;
  772. tcolor[2] = Blue_Hum;
  773. }
  774. }
  775. }else
  776. {
  777. // Цвет луча для всез при режиме 1-н луч для всех
  778. tcolor[0] = random_num(50 , 200);
  779. tcolor[1] = random_num(50 , 200);
  780. tcolor[2] = random_num(50 , 200);
  781. }
  782. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  783. write_byte(TE_BEAMPOINTS);
  784. engfunc(EngFunc_WriteCoord,v_Origin[0]);
  785. engfunc(EngFunc_WriteCoord,v_Origin[1]);
  786. engfunc(EngFunc_WriteCoord,v_Origin[2]);
  787. engfunc(EngFunc_WriteCoord,v_EndOrigin[0]); //Random
  788. engfunc(EngFunc_WriteCoord,v_EndOrigin[1]); //Random
  789. engfunc(EngFunc_WriteCoord,v_EndOrigin[2]); //Random
  790. write_short(beam);
  791. write_byte(0);
  792. write_byte(0);
  793. write_byte(1); //Life
  794. write_byte(5); //Width
  795. write_byte(0); //wave
  796. write_byte(tcolor[0]); // r
  797. write_byte(tcolor[1]); // g
  798. write_byte(tcolor[2]); // b
  799. write_byte(get_pcvar_num(g_LCBRIGHT));
  800. write_byte(255);
  801. message_end();
  802. }
  803.  
  804. CreateDamage(iCurrent,Float:DmgMAX,Float:Radius)
  805. {
  806. // Get given parameters
  807. new Float:vecSrc[3];
  808. pev(iCurrent, pev_origin, vecSrc);
  809.  
  810. new AtkID =pev(iCurrent,LASERMINE_OWNER);
  811. new TeamID=pev(iCurrent,LASERMINE_TEAM);
  812.  
  813. new ent = -1;
  814. new Float:tmpdmg = DmgMAX;
  815.  
  816. new Float:kickback = 0.0;
  817. // Needed for doing some nice calculations <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"vicces\" /><!-- s:P -->
  818. new Float:Tabsmin[3], Float:Tabsmax[3];
  819. new Float:vecSpot[3];
  820. new Float:Aabsmin[3], Float:Aabsmax[3];
  821. new Float:vecSee[3];
  822. new trRes;
  823. new Float:flFraction;
  824. new Float:vecEndPos[3];
  825. new Float:distance;
  826. new Float:origin[3], Float:vecPush[3];
  827. new Float:invlen;
  828. new Float:velocity[3];
  829. new iHitHP,iHitTeam;
  830. // Calculate falloff
  831. new Float:falloff;
  832. if(Radius > 0.0)
  833. {
  834. falloff = DmgMAX / Radius;
  835. } else {
  836. falloff = 1.0;
  837. }
  838. // Find monsters and players inside a specifiec radius
  839. while((ent = engfunc(EngFunc_FindEntityInSphere, ent, vecSrc, Radius)) != 0)
  840. {
  841. if(!pev_valid(ent)) continue;
  842. if(!(pev(ent, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
  843. {
  844. // Entity is not a player or monster, ignore it
  845. continue;
  846. }
  847. if(!pev_user_alive(ent)) continue;
  848. // Reset data
  849. kickback = 1.0;
  850. tmpdmg = DmgMAX;
  851. // The following calculations are provided by Orangutanz, THANKS!
  852. // We use absmin and absmax for the most accurate information
  853. pev(ent, pev_absmin, Tabsmin);
  854. pev(ent, pev_absmax, Tabsmax);
  855. xs_vec_add(Tabsmin,Tabsmax,Tabsmin);
  856. xs_vec_mul_scalar(Tabsmin,0.5,vecSpot);
  857. pev(iCurrent, pev_absmin, Aabsmin);
  858. pev(iCurrent, pev_absmax, Aabsmax);
  859. xs_vec_add(Aabsmin,Aabsmax,Aabsmin);
  860. xs_vec_mul_scalar(Aabsmin,0.5,vecSee);
  861. engfunc(EngFunc_TraceLine, vecSee, vecSpot, 0, iCurrent, trRes);
  862. get_tr2(trRes, TR_flFraction, flFraction);
  863. // Explosion can 'see' this entity, so hurt them! (or impact through objects has been enabled xD)
  864. if(flFraction >= 0.9 || get_tr2(trRes, TR_pHit) == ent)
  865. {
  866. // Work out the distance between impact and entity
  867. get_tr2(trRes, TR_vecEndPos, vecEndPos);
  868. distance = get_distance_f(vecSrc, vecEndPos) * falloff;
  869. tmpdmg -= distance;
  870. if(tmpdmg < 0.0)
  871. tmpdmg = 0.0;
  872. // Kickback Effect
  873. if(kickback != 0.0)
  874. {
  875. xs_vec_sub(vecSpot,vecSee,origin);
  876. invlen = 1.0/get_distance_f(vecSpot, vecSee);
  877.  
  878. xs_vec_mul_scalar(origin,invlen,vecPush);
  879. pev(ent, pev_velocity, velocity)
  880. xs_vec_mul_scalar(vecPush,tmpdmg,vecPush);
  881. xs_vec_mul_scalar(vecPush,kickback,vecPush);
  882. xs_vec_add(velocity,vecPush,velocity);
  883. if(tmpdmg < 60.0)
  884. {
  885. xs_vec_mul_scalar(velocity,12.0,velocity);
  886. } else {
  887. xs_vec_mul_scalar(velocity,4.0,velocity);
  888. }
  889. if(velocity[0] != 0.0 || velocity[1] != 0.0 || velocity[2] != 0.0)
  890. {
  891. // There's some movement todo <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->
  892. set_pev(ent, pev_velocity, velocity)
  893. }
  894. }
  895.  
  896. iHitHP = pev_user_health(ent) - floatround(tmpdmg)
  897. iHitTeam = int:cs_get_user_team(ent)
  898. if(iHitHP <= 0)
  899. {
  900. if(iHitTeam != TeamID)
  901. {
  902. zp_set_user_ammo_packs(AtkID,zp_get_user_ammo_packs(AtkID) + get_pcvar_num(g_LFMONEY))
  903. set_score(AtkID,ent,1,iHitHP)
  904. }else
  905. {
  906. if(get_pcvar_num(g_LFF))
  907. {
  908. zp_set_user_ammo_packs(AtkID,zp_get_user_ammo_packs(AtkID) - get_pcvar_num(g_LFMONEY))
  909. set_score(AtkID,ent,-1,iHitHP)
  910. }
  911. }
  912. }else
  913. {
  914. if(iHitTeam != TeamID || get_pcvar_num(g_LFF))
  915. {
  916. //set_pev(Player,pev_health,iHitHP)
  917. set_user_health(ent, iHitHP)
  918. engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},ent);
  919. write_byte(floatround(tmpdmg))
  920. write_byte(floatround(tmpdmg))
  921. write_long(DMG_BULLET)
  922. engfunc(EngFunc_WriteCoord,vecSrc[0])
  923. engfunc(EngFunc_WriteCoord,vecSrc[1])
  924. engfunc(EngFunc_WriteCoord,vecSrc[2])
  925. message_end()
  926. }
  927. }
  928. }
  929. }
  930. return
  931. }
  932.  
  933. bool:pev_user_alive(ent)
  934. {
  935. new deadflag = pev(ent,pev_deadflag);
  936. if(deadflag != DEAD_NO)
  937. return false;
  938. return true;
  939. }
  940.  
  941. CreateExplosion(iCurrent)
  942. {
  943. new Float:vOrigin[3];
  944. pev(iCurrent,pev_origin,vOrigin);
  945.  
  946. message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
  947. write_byte(99); //99 = KillBeam
  948. write_short(iCurrent);
  949. message_end();
  950.  
  951. engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vOrigin, 0);
  952. write_byte(TE_EXPLOSION);
  953. engfunc(EngFunc_WriteCoord,vOrigin[0]);
  954. engfunc(EngFunc_WriteCoord,vOrigin[1]);
  955. engfunc(EngFunc_WriteCoord,vOrigin[2]);
  956. write_short(boom);
  957. write_byte(30);
  958. write_byte(15);
  959. write_byte(0);
  960. message_end();
  961. }
  962.  
  963. CreateLaserDamage(iCurrent,isHit)
  964. {
  965. if(isHit < 0) return PLUGIN_CONTINUE
  966. switch(get_pcvar_num(g_LDMGMODE))
  967. {
  968. case 1:
  969. {
  970. if(pev(iCurrent,LASERMINE_HITING) == isHit)
  971. return PLUGIN_CONTINUE
  972. }
  973. case 2:
  974. {
  975. if(pev(iCurrent,LASERMINE_HITING) == isHit)
  976. {
  977. static Float:cnt
  978. static now,htime;now = floatround(get_gametime())
  979.  
  980. pev(iCurrent,LASERMINE_COUNT,cnt)
  981. htime = floatround(cnt)
  982. if(now - htime < get_pcvar_num(g_LDSEC))
  983. {
  984. return PLUGIN_CONTINUE;
  985. }else{
  986. set_pev(iCurrent,LASERMINE_COUNT,get_gametime())
  987. }
  988. }else
  989. {
  990. set_pev(iCurrent,LASERMINE_COUNT,get_gametime())
  991. }
  992. }
  993. }
  994.  
  995. new Float:vOrigin[3],Float:vEnd[3]
  996. pev(iCurrent,pev_origin,vOrigin)
  997. pev(iCurrent,pev_vuser1,vEnd)
  998.  
  999. new teamid = pev(iCurrent, LASERMINE_TEAM)
  1000.  
  1001. new szClassName[32]
  1002. new Alive,God
  1003. new iHitTeam,iHitHP,id
  1004. new hitscore
  1005.  
  1006. szClassName[0] = '^0'
  1007. pev(isHit,pev_classname,szClassName,32)
  1008. if((pev(isHit, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
  1009. {
  1010. Alive = pev_user_alive(isHit)
  1011. God = get_user_godmode(isHit)
  1012. if(!Alive || God) return PLUGIN_CONTINUE
  1013. iHitTeam = int:cs_get_user_team(isHit)
  1014. iHitHP = pev_user_health(isHit) - get_pcvar_num(g_LDMG)
  1015. id = pev(iCurrent,LASERMINE_OWNER)//, szNetName[32]
  1016. if(iHitHP <= 0)
  1017. {
  1018. if(iHitTeam != teamid)
  1019. {
  1020. emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM)
  1021. hitscore = 1
  1022. zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id) + get_pcvar_num(g_LFMONEY))
  1023. set_score(id,isHit,hitscore,iHitHP)
  1024. }else
  1025. {
  1026. if(get_pcvar_num(g_LFF))
  1027. {
  1028. emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM)
  1029. hitscore = -1
  1030. zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id) - get_pcvar_num(g_LFMONEY))
  1031. set_score(id,isHit,hitscore,iHitHP)
  1032. }
  1033. }
  1034. }else if(iHitTeam != teamid || get_pcvar_num(g_LFF))
  1035. {
  1036. emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM)
  1037. set_user_health(isHit,iHitHP)
  1038. set_pev(iCurrent,LASERMINE_HITING,isHit);
  1039. engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},isHit);
  1040. write_byte(get_pcvar_num(g_LDMG))
  1041. write_byte(get_pcvar_num(g_LDMG))
  1042. write_long(DMG_BULLET)
  1043. engfunc(EngFunc_WriteCoord,vOrigin[0])
  1044. engfunc(EngFunc_WriteCoord,vOrigin[1])
  1045. engfunc(EngFunc_WriteCoord,vOrigin[2])
  1046. message_end()
  1047. }
  1048. }else if(equal(szClassName, ENT_CLASS_NAME3))
  1049. {
  1050. new hl;
  1051. hl = pev_user_health(isHit);
  1052. set_user_health(isHit,hl-get_pcvar_num(g_LDMG));
  1053. }
  1054. return PLUGIN_CONTINUE
  1055. }
  1056.  
  1057. stock pev_user_health(id)
  1058. {
  1059. new Float:health
  1060. pev(id,pev_health,health)
  1061. return floatround(health)
  1062. }
  1063.  
  1064. stock set_user_health(id,health)
  1065. {
  1066. health > 0 ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
  1067. }
  1068.  
  1069. stock get_user_godmode(index) {
  1070. new Float:val
  1071. pev(index, pev_takedamage, val)
  1072.  
  1073. return (val == DAMAGE_NO)
  1074. }
  1075.  
  1076. stock set_user_frags(index, frags)
  1077. {
  1078. set_pev(index, pev_frags, float(frags))
  1079.  
  1080. return 1
  1081. }
  1082.  
  1083. stock pev_user_frags(index)
  1084. {
  1085. new Float:frags;
  1086. pev(index,pev_frags,frags);
  1087. return floatround(frags);
  1088. }
  1089.  
  1090. set_score(id,target,hitscore,HP){
  1091.  
  1092. new idfrags = pev_user_frags(id) + hitscore// get_user_frags(id) + hitscore
  1093. set_user_frags(id,idfrags)
  1094. new tarfrags = pev_user_frags(target) + 1 //get_user_frags(target) + 1
  1095. set_user_frags(target,tarfrags)
  1096. new idteam = int:cs_get_user_team(id)
  1097. new iddeaths = cs_get_user_deaths(id)
  1098.  
  1099.  
  1100. message_begin(MSG_ALL, g_msgDeathMsg, {0, 0, 0} ,0)
  1101. write_byte(id)
  1102. write_byte(target)
  1103. write_byte(0)
  1104. write_string(ENT_CLASS_NAME)
  1105. message_end()
  1106.  
  1107. message_begin(MSG_ALL, g_msgScoreInfo)
  1108. write_byte(id)
  1109. write_short(idfrags)
  1110. write_short(iddeaths)
  1111. write_short(0)
  1112. write_short(idteam)
  1113. message_end()
  1114.  
  1115. set_msg_block(g_msgDeathMsg, BLOCK_ONCE)
  1116.  
  1117. set_user_health(target, HP)
  1118.  
  1119. }
  1120.  
  1121. public BuyLasermine(id)
  1122. {
  1123. if(!CanCheck(id,1)) return PLUGIN_CONTINUE
  1124.  
  1125. zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id) - get_pcvar_num(g_LCOST))
  1126. g_havemine[id]++;
  1127.  
  1128. client_print(id, print_chat, "%L %L", id, "CHATTAG",id, "STR_BOUGHT")
  1129.  
  1130. emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  1131. ShowAmmo(id)
  1132. return PLUGIN_HANDLED
  1133. }
  1134.  
  1135. public zp_extra_item_selected(id, itemid)
  1136. {
  1137. if(itemid == g_LME)
  1138. {
  1139. zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + LMCost)
  1140. BuyLasermine(id)
  1141. }
  1142. return PLUGIN_CONTINUE
  1143. }
  1144.  
  1145. ShowAmmo(id)
  1146. {
  1147. new ammo[51]
  1148. new PlugStat[ 555 char ];
  1149. formatex(PlugStat, charsmax(PlugStat), "%L", LANG_PLAYER, "STR_STATE")
  1150. formatex(ammo, 50, "%s %i/%i",PlugStat, g_havemine[id],get_pcvar_num(g_LAMMO))
  1151.  
  1152. message_begin(MSG_ONE, g_msgStatusText, {0,0,0}, id)
  1153. write_byte(0)
  1154. write_string(ammo)
  1155. message_end()
  1156. }
  1157.  
  1158. public showInfo(id)
  1159. {
  1160. client_print(id, print_chat, "%L", id, "STR_REF")
  1161. }
  1162.  
  1163. public say_lasermine(id){
  1164. new said[32]
  1165. read_argv(1,said,31);
  1166. if(!get_pcvar_num(g_LENABLE))
  1167. {
  1168. return PLUGIN_CONTINUE
  1169. }
  1170. if(equali(said,"/buy lasermine")||equali(said,"/lm")||equali(said,"buy_lasermine")){
  1171. BuyLasermine(id)
  1172. }else if(equali(said, "lasermine") || equali(said, "/lasermine")){
  1173. const SIZE = 1024
  1174. new msg[SIZE+1],len = 0;
  1175. len += formatex(msg[len], SIZE - len, "<html><body>")
  1176. len += formatex(msg[len], SIZE - len, "<p><b>LaserMine</b></p><br/><br/>")
  1177. len += formatex(msg[len], SIZE - len, "<p>You can be setting the mine on the wall.</p><br/>")
  1178. len += formatex(msg[len], SIZE - len, "<p>That laser will give what touched it damage.</p><br/><br/>")
  1179. len += formatex(msg[len], SIZE - len, "<p><b>LaserMine Commands</b></p><br/><br/>")
  1180. len += formatex(msg[len], SIZE - len, "<p><b>Say /buy lasermine</b> or <b>Say /lm</b> //buying lasermine<br/>")
  1181. len += formatex(msg[len], SIZE - len, "<b>buy_lasermine</b> //bind ^"F2^" buy_lasermine : using F2 buying lasermine<br/>")
  1182. len += formatex(msg[len], SIZE - len, "<b>+setlaser</b> //bind mouse3 +setlaser : using mouse3 set lasermine on wall<br/>")
  1183. len += formatex(msg[len], SIZE - len, "</body></html>")
  1184. show_motd(id, msg, "Lasermine Entity help")
  1185. return PLUGIN_CONTINUE
  1186. }
  1187. else if(containi(said, "laser") != -1) {
  1188. showInfo(id)
  1189. return PLUGIN_CONTINUE
  1190. }
  1191. return PLUGIN_CONTINUE
  1192. }
  1193.  
  1194. public standing(id)
  1195. {
  1196. if(!g_settinglaser[id])
  1197. return PLUGIN_CONTINUE
  1198.  
  1199. set_pev(id, pev_maxspeed, 1.0)
  1200.  
  1201. return PLUGIN_CONTINUE
  1202. }
  1203.  
  1204. public ltm_PostThink(id)
  1205. {
  1206. if(!g_settinglaser[id] && plsetting[id]){
  1207. resetspeed(id)
  1208. }
  1209. else if(g_settinglaser[id] && !plsetting[id]) {
  1210. pev(id, pev_maxspeed,plspeed[id])
  1211. set_pev(id, pev_maxspeed, 1.0)
  1212. }
  1213. plsetting[id] = g_settinglaser[id]
  1214. return FMRES_IGNORED
  1215. }
  1216.  
  1217. public ltm_PreThink(id)
  1218. {
  1219. if(!pev_user_alive(id) || g_settinglaser[id] == true || is_user_bot(id) || get_pcvar_num(g_LCMDMODE) == 1)
  1220. return FMRES_IGNORED;
  1221.  
  1222. if(pev(id, pev_button) & IN_USE && !(pev(id, pev_oldbuttons) & IN_USE))
  1223. CreateLaserMine_Progress(id)
  1224. return FMRES_IGNORED;
  1225. }
  1226.  
  1227. resetspeed(id)
  1228. {
  1229. set_pev(id, pev_maxspeed, plspeed[id])
  1230. }
  1231.  
  1232. public client_putinserver(id){
  1233. g_deployed[id] = 0;
  1234. g_havemine[id] = 0;
  1235. DeleteTask(id);
  1236. return PLUGIN_CONTINUE
  1237. }
  1238.  
  1239. public client_disconnect(id){
  1240. if(!get_pcvar_num(g_LENABLE))
  1241. return PLUGIN_CONTINUE
  1242. DeleteTask(id);
  1243. RemoveAllTripmines(id);
  1244. return PLUGIN_CONTINUE
  1245. }
  1246.  
  1247.  
  1248. public newround(id){
  1249. if(!get_pcvar_num(g_LENABLE))
  1250. return PLUGIN_CONTINUE
  1251. pev(id, pev_maxspeed,plspeed[id])
  1252. DeleteTask(id);
  1253. RemoveAllTripmines(id);
  1254. //client_print(id, print_chat, "[ZP][LM][DeBug] All Mines removied!");
  1255. delaycount(id);
  1256. SetStartAmmo(id);
  1257. return PLUGIN_CONTINUE
  1258. }
  1259.  
  1260. public endround(id)
  1261. {
  1262. if(!get_pcvar_num(g_LENABLE))
  1263. return PLUGIN_CONTINUE
  1264.  
  1265. // Удаление мин после конца раунда
  1266. DeleteTask(id);
  1267. RemoveAllTripmines(id);
  1268.  
  1269. return PLUGIN_CONTINUE
  1270. }
  1271.  
  1272. public DeathEvent(){
  1273. if(!get_pcvar_num(g_LENABLE))
  1274. return PLUGIN_CONTINUE
  1275.  
  1276. new id = read_data(2)
  1277. if(is_user_connected(id)) DeleteTask(id);
  1278. return PLUGIN_CONTINUE
  1279. }
  1280.  
  1281. public RemoveAllTripmines(i_Owner)
  1282. {
  1283. new iEnt = g_MaxPL + 1;
  1284. new clsname[32];
  1285. while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", ENT_CLASS_NAME)))
  1286. {
  1287. if(i_Owner)
  1288. {
  1289. if(pev(iEnt, LASERMINE_OWNER) != i_Owner)
  1290. continue;
  1291. clsname[0] = '^0'
  1292. pev(iEnt, pev_classname, clsname, sizeof(clsname)-1);
  1293. if(equali(clsname, ENT_CLASS_NAME))
  1294. {
  1295. PlaySound(iEnt, STOP_SOUND);
  1296. RemoveEntity(iEnt);
  1297. }
  1298. }
  1299. else
  1300. set_pev(iEnt, pev_flags, FL_KILLME);
  1301. }
  1302. g_deployed[i_Owner]=0;
  1303. }
  1304.  
  1305. SetStartAmmo(id)
  1306. {
  1307. new stammo = get_pcvar_num(g_LSTAMMO);
  1308. if(stammo <= 0) return PLUGIN_CONTINUE;
  1309. g_havemine[id] = (g_havemine[id] <= stammo) ? stammo : g_havemine[id];
  1310. return PLUGIN_CONTINUE;
  1311. }
  1312.  
  1313. public CutDeploy_onDamage(id)
  1314. {
  1315. if(get_user_health(id) < 1)
  1316. DeleteTask(id);
  1317. }
  1318.  
  1319. DeleteTask(id)
  1320. {
  1321. if(task_exists((TASK_PLANT + id)))
  1322. {
  1323. remove_task((TASK_PLANT + id))
  1324. }
  1325. if(task_exists((TASK_RELEASE + id)))
  1326. {
  1327. remove_task((TASK_RELEASE + id))
  1328. }
  1329. g_settinglaser[id] = false
  1330. return PLUGIN_CONTINUE;
  1331. }
  1332.  
  1333. stock set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
  1334. {
  1335. static Float:RenderColor[3];
  1336. RenderColor[0] = float(r);
  1337. RenderColor[1] = float(g);
  1338. RenderColor[2] = float(b);
  1339.  
  1340. set_pev(entity, pev_renderfx, fx);
  1341. set_pev(entity, pev_rendercolor, RenderColor);
  1342. set_pev(entity, pev_rendermode, render);
  1343. set_pev(entity, pev_renderamt, float(amount));
  1344.  
  1345. return 1
  1346. }
  1347.  
  1348. // Gets offset data
  1349. get_offset_value(id, type)
  1350. {
  1351. new key = -1;
  1352. switch(type)
  1353. {
  1354. case OFFSET_TEAM: key = OFFSET_TEAM;
  1355. case OFFSET_MONEY:
  1356. key = OFFSET_MONEY;
  1357. case OFFSET_DEATH: key = OFFSET_DEATH;
  1358. }
  1359. if(key != -1)
  1360. {
  1361. if(is_amd64_server()) key += 25;
  1362. return get_pdata_int(id, key);
  1363. }
  1364. return -1;
  1365. }
  1366.  


Csatolmányok:
inc.rar [22.38KiB]
Letöltve 35 alkalommal.

_________________
Nokedli <3
Pöri (y) [kozep]Kép[/kozep]
Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése: Rendezés 
Új téma nyitása Hozzászólás a témához  [3 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 29 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole