Re: cerere plugin sandbags
Posted: 11 Jan 2019, 18:18
by levin
- LM | Afiseaza codul
[code] #include <amxmodx> #include <fakemeta> #include <hamsandwich> #include <xs> #include <zombie_plague_special> #include <engine> #include <cromchat> #pragma tabsize 0 #if defined BIOHAZARD_SUPPORT #include <biohazard> #endif #if defined UL_MONEY_SUPPORT #include <money_ul> #endif #define VIP_ACCESS ADMIN_LEVEL_H #if AMXX_VERSION_NUM < 180 #assert AMX Mod X v1.8.0 or greater library required! #endif #if defined BIOHAZARD_SUPPORT #define PLUGIN "LTM for BIOHAZARD" #define VERSION "+1.4" #else #define PLUGIN "Laser/Tripmine Entity" #define VERSION "2.3" #endif #define AUTHOR "SandStriker" #define RemoveEntity(%1) engfunc(EngFunc_RemoveEntity,%1) //#define ACCESSLEVEL ADMIN_LEVEL_H #define TASK_PLANT 15100 #define TASK_RESET 15500 #define TASK_RELEASE 15900 #define LASERMINE_TEAM pev_iuser1//EV_INT_iuser1 #define LASERMINE_OWNER pev_iuser2 //EV_INT_iuser3 #define LASERMINE_STEP pev_iuser3 #define LASERMINE_HITING pev_iuser4 #define LASERMINE_COUNT pev_fuser1 #define LASERMINE_POWERUP pev_fuser2 #define LASERMINE_BEAMTHINK pev_fuser3 #define LASERMINE_BEAMENDPOINT pev_vuser1 #define MAX_MINES 10 #define MODE_LASERMINE 0 #define OFFSET_TEAM 114 #define OFFSET_MONEY 115 #define OFFSET_DEATH 444 #define cs_get_user_team(%1) CsTeams:get_offset_value(%1,OFFSET_TEAM) #define cs_get_user_deaths(%1) get_offset_value(%1,OFFSET_DEATH) #define cs_get_user_money(%1) get_offset_value(%1,OFFSET_MONEY) #define cs_set_user_money(%1,%2) set_offset_value(%1,OFFSET_MONEY,%2) enum CsTeams { CS_TEAM_UNASSIGNED = 0, CS_TEAM_T = 1, CS_TEAM_CT = 2, CS_TEAM_SPECTATOR = 3 }; enum tripmine_e { TRIPMINE_IDLE1 = 0, TRIPMINE_IDLE2, TRIPMINE_ARM1, TRIPMINE_ARM2, TRIPMINE_FIDGET, TRIPMINE_HOLSTER, TRIPMINE_DRAW, TRIPMINE_WORLD, TRIPMINE_GROUND, }; enum { POWERUP_THINK, BEAMBREAK_THINK, EXPLOSE_THINK }; enum { POWERUP_SOUND, ACTIVATE_SOUND, STOP_SOUND }; new const ENT_MODELS[] = "models/zombie_plague/LaserMines/v_laser_mine.mdl", ENT_SOUND1[] = "weapons/mine_deploy.wav", ENT_SOUND2[] = "weapons/mine_charge.wav", ENT_SOUND3[] = "weapons/mine_activate.wav", ENT_SOUND4[] = "debris/beamstart9.wav", ENT_SOUND5[] = "items/gunpickup2.wav", ENT_SOUND6[] = "debris/bustglass1.wav", ENT_SOUND7[] = "debris/bustglass2.wav", ENT_SPRITE1[] = "sprites/lgtning.spr", ENT_SPRITE2[] = "sprites/lm_explode.spr"; new const ENT_CLASS_NAME[] = "lasermine", //ENT_CLASS_NAME2[] = "info_target", ENT_CLASS_NAME3[] = "func_breakable"; new const #if defined BIOHAZARD_SUPPORT CHATTAG[] = "[BioLaser]", #else CHATTAG[] = "[ZP][LM]", #endif //STR_MINEDETNATED[] = "Mina ta a fost detonata.", //STR_MINEDETNATED2[] = "a detonat mina ta.", STR_NOTACTIVE[] = "Laserele nu sunt activate.", STR_DONTHAVEMINE[] = "Nu ai nici un laser.", //STR_CANTDEPLOY[] = "Echipa ta nu paote planta lasere!", STR_MAXDEPLOY[] = "Numarul maxim de lasere a fost atins.", STR_MANYPPL[] = "Prea multe lasere in echipa ta...", STR_PLANTWALL[] = "Trebuie sa plantezi laserul pe zid!", STR_REF[] = "Refer to a lasermine rule with this server. say 'lasermine'", #if defined BIOHAZARD_SUPPORT STR_CBT[] = "Esti Zombie!Nu poti cumpara si planta un laser.", #else STR_CBT[] = "Echipa ta nu poate cumpara si planta lasere!", #endif STR_CANTBUY[] = "Nu poti cumpara pe acest server.", STR_HAVEMAX[] = "Ai numarul maxim de lasere.", STR_NOMONEY[] = "Nu ai destui bani sa cumperi un laser! ($", STR_NEEDED[] = "needed)", STR_DELAY[] = "Poti cumpara si planta lasere in", STR_SECONDS[] = "secunde.", STR_BOUGHT[] = "Tocmai ai cumparat un laser.", STR_STATE[] = "LaserMine Detinute:", STR_NOACCESS[] = "Nu ai acces la aceasta comanda."; new g_EntMine; new beam, boom new g_LENABLE,g_LFMONEY,g_LAMMO,g_LDMG, g_LTMAX,g_LCOST,g_LHEALTH,g_LMODE,g_LRADIUS,g_LRDMG,g_LFF,g_LCBT; new g_LDELAY,/*g_LTHINK,*/g_LVISIBLE, g_LSTAMMO,g_LACCESS,g_LGLOW,g_LDMGMODE,g_LCLMODE,g_LCBRIGHT,g_LDSEC,g_LCMDMODE,g_LBUYMODE,g_NEMROUND,g_SURVROUND, g_SNIPROUND, g_ASSASROUND; new g_dcount[33],g_nowtime,g_MaxPL new bool:g_settinglaser[33] new g_msgDeathMsg,g_msgScoreInfo,g_msgDamage,g_msgStatusText,g_msgMoney; new Float:plspeed[33] new plsetting[33] new g_havemine[33]; new g_deployed[33]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); CC_SetPrefix("&x04[&x01ZP Laser&x04]") // Add your code here... register_clcmd("+setlaser","CreateLaserMine_Progress_b"); register_clcmd("-setlaser","StopCreateLaserMine"); register_clcmd("+dellaser","ReturnLaserMine_Progress"); register_clcmd("-dellaser","StopReturnLaserMine"); register_clcmd("say","say_lasermine"); register_clcmd("buy_lasermine","BuyLasermine"); #if defined BIOHAZARD_SUPPORT g_LENABLE = register_cvar("bio_ltm","1"); g_LACCESS = register_cvar("bio_ltm_acs","0"); //0 all, 1 admin g_LMODE = register_cvar("bio_ltm_mode","0"); //0 lasermine, 1 tripmine g_LAMMO = register_cvar("bio_ltm_ammo","2"); g_LDMG = register_cvar("bio_ltm_dmg","100000"); //laser hit dmg g_LCOST = register_cvar("bio_ltm_cost","6000"); g_LFMONEY = register_cvar("bio_ltm_fragmoney","400"); g_LHEALTH = register_cvar("bio_ltm_health","850"); g_LTMAX = register_cvar("bio_ltm_teammax","15"); g_LRADIUS = register_cvar("bio_ltm_radius","320.0"); g_LRDMG = register_cvar("bio_ltm_rdmg","10000"); //radius damage g_LFF = register_cvar("bio_ltm_ff","0"); g_LCBT = register_cvar("bio_ltm_cbt","ALL"); g_LBUYMODE = register_cvar("bio_ltm_buymode","1"); g_LDELAY = register_cvar("bio_ltm_delay","31"); //g_LTHINK = register_cvar("bio_ltm_think","0.01"); g_LVISIBLE = register_cvar("bio_ltm_line","1"); g_LGLOW = register_cvar("bio_ltm_glow","0"); g_LCBRIGHT = register_cvar("bio_ltm_bright","255"); //laser line brightness. g_LCLMODE = register_cvar("bio_ltm_color","0"); //0 is team color,1 is green g_LDMGMODE = register_cvar("bio_ltm_ldmgmode","0"); //0 - frame dmg, 1 - once dmg, 2 - 1 second dmg g_LDSEC = register_cvar("bio_ltm_ldmgseconds","1"); //mode 2 only, damage / seconds. default 1 (sec) g_LSTAMMO = register_cvar("bio_ltm_startammo","2"); g_LCMDMODE = register_cvar("bio_ltm_cmdmode","1"); //0 is +USE key, 1 is bind, 2 is each. #else g_LENABLE = register_cvar("amx_ltm","1"); g_LACCESS = register_cvar("amx_ltm_acs","0"); //0 all, 1 admin g_LMODE = register_cvar("amx_ltm_mode","0"); //0 lasermine, 1 tripmine g_LAMMO = register_cvar("amx_ltm_ammo","2"); g_LDMG = register_cvar("amx_ltm_dmg","100000"); //laser hit dmg g_LCOST = register_cvar("amx_ltm_cost","0"); g_LFMONEY = register_cvar("amx_ltm_fragmoney","400"); g_LHEALTH = register_cvar("amx_ltm_health","850"); g_LTMAX = register_cvar("amx_ltm_teammax","15"); g_LRADIUS = register_cvar("amx_ltm_radius","320.0"); g_LRDMG = register_cvar("amx_ltm_rdmg","10000"); //radius damage g_LFF = register_cvar("amx_ltm_ff","0"); g_LCBT = register_cvar("amx_ltm_cbt","ALL"); g_LBUYMODE = register_cvar("amx_ltm_buymode","1"); g_LDELAY = register_cvar("amx_ltm_delay","33"); //g_LTHINK = register_cvar("amx_ltm_think","0.01") g_LVISIBLE = register_cvar("amx_ltm_line","1"); g_LGLOW = register_cvar("amx_ltm_glow","0"); g_LCBRIGHT = register_cvar("amx_ltm_bright","255"); //laser line brightness. g_LCLMODE = register_cvar("amx_ltm_color","0"); //0 is team color,1 is green g_LDMGMODE = register_cvar("amx_ltm_ldmgmode","0"); //0 - frame dmg, 1 - once dmg, 2 - 1 second dmg g_LDSEC = register_cvar("amx_ltm_ldmgseconds","1"); //mode 2 only, damage / seconds. default 1 (sec) g_LSTAMMO = register_cvar("amx_ltm_startammo","2"); g_LCMDMODE = register_cvar("amx_ltm_cmdmode","1"); //0 is +USE key, 1 is bind, 2 is each. g_NEMROUND = register_cvar("zp_ltm_nemround","0"); g_SURVROUND = register_cvar("zp_ltm_survround","1"); g_SNIPROUND = register_cvar("zp_ltm_snipround", "1"); g_ASSASROUND = register_cvar("zp_ltm_assasround", "1"); #endif register_event("DeathMsg", "DeathEvent", "a"); register_event("CurWeapon", "standing", "be", "1=1"); register_event("ResetHUD", "delaycount", "a"); register_event("ResetHUD", "newround", "b"); register_event("Damage","CutDeploy_onDamage","b"); g_msgDeathMsg = get_user_msgid("DeathMsg"); g_msgScoreInfo = get_user_msgid("ScoreInfo"); g_msgDamage = get_user_msgid("Damage"); g_msgStatusText = get_user_msgid("StatusText"); g_msgMoney = get_user_msgid("Money"); // -- Forward. register_forward(FM_Think, "ltm_Think" ); register_forward(FM_PlayerPostThink, "ltm_PostThink" ); register_forward(FM_PlayerPreThink, "ltm_PreThink"); RegisterHam(Ham_TakeDamage, "func_breakable", "fwHamTakeDamageBreakablePost", 1); } public plugin_natives( ) register_native( "get_lm_sts", "_get_lm_sts" ); public _get_lm_sts( ) return g_deployed[ get_param( 1 ) ]; public plugin_precache() { precache_sound(ENT_SOUND1); precache_sound(ENT_SOUND2); precache_sound(ENT_SOUND3); precache_sound(ENT_SOUND4); precache_sound(ENT_SOUND5); precache_sound(ENT_SOUND6); precache_sound(ENT_SOUND7); precache_model(ENT_MODELS); beam = precache_model(ENT_SPRITE1); boom = precache_model(ENT_SPRITE2); return PLUGIN_CONTINUE; } public plugin_modules() { require_module("fakemeta"); require_module("cstrike"); //require_module("fun") } public plugin_cfg() { g_EntMine = engfunc(EngFunc_AllocString,ENT_CLASS_NAME3); arrayset(g_havemine,0,sizeof(g_havemine)); arrayset(g_deployed,0,sizeof(g_deployed)); g_MaxPL = get_maxplayers(); new file[64]; get_localinfo("amxx_configsdir",file,63); #if defined BIOHAZARD_SUPPORT format(file, 63, "%s/bhltm_cvars.cfg", file); #else format(file, 63, "%s/ltm_cvars.cfg", file); #endif if(file_exists(file)) server_cmd("exec %s", file), server_exec(); } public fwHamTakeDamageBreakablePost(iVictim, iInflictor, iAttacker, Float:fDamage) { if (!is_valid_ent(iVictim) || entity_get_float(iVictim, EV_FL_health) > 0.0 || !is_user_connected(iAttacker)) return HAM_IGNORED; static szTempString[32]; entity_get_string(iVictim, EV_SZ_classname, szTempString, charsmax(szTempString)); if (!equali(szTempString, ENT_CLASS_NAME)) return HAM_IGNORED; new ownerName[32]; new own = pev(iVictim,LASERMINE_OWNER); get_user_name(iAttacker, szTempString, charsmax(szTempString)); get_user_name(own, ownerName, charsmax(ownerName)); if(!(get_user_flags(iAttacker)&VIP_ACCESS)) { zp_set_user_ammo_packs(iAttacker, zp_get_user_ammo_packs(iAttacker) + 10) CC_SendMessage(0, "&x04Jucator-ul &x07%s &x04a distrus lasermine-ul lui &x07%s &x04si a castigat &x0710 &x04Credite!",szTempString, ownerName); } else { zp_set_user_ammo_packs(iAttacker, zp_get_user_ammo_packs(iAttacker) + 20) CC_SendMessage(0, "&x04GoldMembr-ul &x07%s &x04a distrus lasermine-ul lui &x07%s &x04si a castigat &x0720 &x04Credite.!",szTempString, ownerName); } return HAM_IGNORED; } public delaycount(id) { g_dcount[id] = floatround(get_gametime()); } bool:CheckTime(id) { g_nowtime = floatround(get_gametime()) - g_dcount[id]; if(g_nowtime >= get_pcvar_num(g_LDELAY)) return true; return false; } public CreateLaserMine_Progress_b(id) { if(get_pcvar_num(g_LCMDMODE) != 0) CreateLaserMine_Progress(id); return PLUGIN_HANDLED; } public CreateLaserMine_Progress(id) { if (!CreateCheck(id)) return PLUGIN_HANDLED; g_settinglaser[id] = true; message_begin(MSG_ONE, 108, {0,0,0}, id); write_byte(1); write_byte(0); message_end(); set_task(1.2, "Spawn", (TASK_PLANT + id)); return PLUGIN_HANDLED; } public ReturnLaserMine_Progress(id) { new tgt,body; get_user_aiming(id,tgt,body); if(!ReturnCheck(id)) return PLUGIN_HANDLED; g_settinglaser[id] = true; message_begin(MSG_ONE, 108, {0,0,0}, id); write_byte(1); write_byte(0); message_end(); set_task(1.2, "ReturnMine", (TASK_RELEASE + id)); return PLUGIN_HANDLED; } public StopCreateLaserMine(id) { DeleteTask(id); message_begin(MSG_ONE, 108, {0,0,0}, id); write_byte(0); write_byte(0); message_end(); return PLUGIN_HANDLED; } public StopReturnLaserMine(id) { DeleteTask(id); message_begin(MSG_ONE, 108, {0,0,0}, id); write_byte(0); write_byte(0); message_end(); return PLUGIN_HANDLED; } public ReturnMine(id) { id -= TASK_RELEASE; new tgt,body,Float:vo[3],Float:to[3]; get_user_aiming(id,tgt,body); if(!pev_valid(tgt)) return; pev(id,pev_origin,vo); pev(tgt,pev_origin,to); if(get_distance_f(vo,to) > 70.0) return; new EntityName[32]; pev(tgt, pev_classname, EntityName, 31); if(!equal(EntityName, ENT_CLASS_NAME)) return; if(pev(tgt,LASERMINE_OWNER) != id) return; RemoveEntity(tgt); g_havemine[id] ++; g_deployed[id] --; emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ShowAmmo(id) return; } public Spawn( id ) { id -= TASK_PLANT // motor new i_Ent = engfunc(EngFunc_CreateNamedEntity,g_EntMine); if(!i_Ent) { client_print(id,print_chat,"[Laesrmine Debug] Can't Create Entity"); return PLUGIN_HANDLED_MAIN; } set_pev(i_Ent,pev_classname,ENT_CLASS_NAME); engfunc(EngFunc_SetModel,i_Ent,ENT_MODELS); set_pev(i_Ent,pev_solid,SOLID_NOT); set_pev(i_Ent,pev_movetype,MOVETYPE_FLY); set_pev(i_Ent,pev_frame,0); set_pev(i_Ent,pev_body,3); set_pev(i_Ent,pev_sequence,TRIPMINE_WORLD); set_pev(i_Ent,pev_framerate,0); set_pev(i_Ent,pev_takedamage,DAMAGE_YES); set_pev(i_Ent,pev_dmg,100.0); set_user_health(i_Ent,get_pcvar_num(g_LHEALTH)); new Float:vOrigin[3]; new Float:vNewOrigin[3],Float:vNormal[3],Float:vTraceDirection[3], Float:vTraceEnd[3],Float:vEntAngles[3]; pev( id, pev_origin, vOrigin ); velocity_by_aim( id, 128, vTraceDirection ); xs_vec_add( vTraceDirection, vOrigin, vTraceEnd ); engfunc( EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0 ); new Float:fFraction; get_tr2( 0, TR_flFraction, fFraction ); // -- We hit something! if ( fFraction < 1.0 ) { // -- Save results to be used later. get_tr2( 0, TR_vecEndPos, vTraceEnd ); get_tr2( 0, TR_vecPlaneNormal, vNormal ); } xs_vec_mul_scalar( vNormal, 8.0, vNormal ); xs_vec_add( vTraceEnd, vNormal, vNewOrigin ); engfunc(EngFunc_SetSize, i_Ent, Float:{ -4.0, -4.0, -4.0 }, Float:{ 4.0, 4.0, 4.0 } ); engfunc(EngFunc_SetOrigin, i_Ent, vNewOrigin ); // -- Rotate tripmine. vector_to_angle(vNormal,vEntAngles ); set_pev(i_Ent,pev_angles,vEntAngles ); // -- Calculate laser end origin. new Float:vBeamEnd[3], Float:vTracedBeamEnd[3]; xs_vec_mul_scalar(vNormal, 8192.0, vNormal ); xs_vec_add( vNewOrigin, vNormal, vBeamEnd ); engfunc( EngFunc_TraceLine, vNewOrigin, vBeamEnd, IGNORE_MONSTERS, -1, 0 ); get_tr2( 0, TR_vecPlaneNormal, vNormal ); get_tr2( 0, TR_vecEndPos, vTracedBeamEnd ); // -- Save results to be used later. set_pev(i_Ent, LASERMINE_OWNER, id ); set_pev(i_Ent,LASERMINE_BEAMENDPOINT,vTracedBeamEnd); set_pev(i_Ent,LASERMINE_TEAM,int:cs_get_user_team(id)); new Float:fCurrTime = get_gametime(); set_pev(i_Ent,LASERMINE_POWERUP, fCurrTime + 2.5 ); set_pev(i_Ent,LASERMINE_STEP,POWERUP_THINK); set_pev(i_Ent,pev_nextthink, fCurrTime + 0.2 ); PlaySound(i_Ent,POWERUP_SOUND ); g_deployed[id]++; g_havemine[id]--; DeleteTask(id); ShowAmmo(id); return 1; } stock TeamDeployedCount(id) { //new tid[32]; static i; static CsTeams:t;t = cs_get_user_team(id); static cnt;cnt=0; for(i = 1;i <= g_MaxPL;i++) { if(is_user_connected(i)) if(t == cs_get_user_team(i)) cnt += g_deployed; } return cnt; } bool:CheckCanTeam(id) { new arg[5],CsTeam:num; get_pcvar_string(g_LCBT,arg,3); if(equali(arg,"T")) { num = CsTeam:CS_TEAM_T; } else if(equali(arg,"CT")) { num = CsTeam:CS_TEAM_CT; } else if(equali(arg,"ALL")) { num = CsTeam:CS_TEAM_UNASSIGNED; } else { num = CsTeam:CS_TEAM_UNASSIGNED; } if(num != CsTeam:CS_TEAM_UNASSIGNED && num != CsTeam:cs_get_user_team(id)) return false; return true; } bool:CanCheck(id,mode) { if( !get_pcvar_num( g_LENABLE ) ) { client_print(id, print_chat, "%s %s",CHATTAG,STR_NOTACTIVE); return false; } if( get_pcvar_num(g_LACCESS) != 0) if(!(get_user_flags(id) & ADMIN_IMMUNITY)) { client_print(id, print_chat, "%s %s",CHATTAG,STR_NOACCESS); return false; } if(!pev_user_alive(id)) return false; #if defined BIOHAZARD_SUPPORT if(is_user_zombie(id)) { client_print(id, print_chat, "%s %s",CHATTAG,STR_CBT); return false; } #endif if (!CheckCanTeam(id)) { client_print(id, print_chat, "%s %s",CHATTAG,STR_CBT); return false; } if( mode == 0) { if(g_havemine[id] <= 0) { client_print(id, print_chat, "%s %s",CHATTAG,STR_DONTHAVEMINE); return false; } } if (mode == 1) { if (get_pcvar_num(g_LBUYMODE) == 0) { client_print(id, print_chat, "%s %s",CHATTAG,STR_CANTBUY); return false; } if (g_havemine[id] >= get_pcvar_num(g_LAMMO)) { client_print(id, print_chat, "%s %s",CHATTAG,STR_HAVEMAX); return false; } if (cs_get_user_money(id) < get_pcvar_num(g_LCOST)) { client_print(id, print_chat, "%s %s%d %s",CHATTAG, STR_NOMONEY,get_pcvar_num(g_LCOST),STR_NEEDED); return false; } } if(!CheckTime(id)) { client_print(id,print_chat, "%s %s %d %s",CHATTAG,STR_DELAY,get_pcvar_num(g_LDELAY)-g_nowtime,STR_SECONDS); return false; } return true; } bool:ReturnCheck( id ) { if(!CanCheck(id,-1)) return false; if(g_havemine[id] + 1 > get_pcvar_num(g_LAMMO)) return false; new tgt,body,Float:vo[3],Float:to[3]; get_user_aiming(id,tgt,body); if(!pev_valid(tgt)) return false; pev(id,pev_origin,vo); pev(tgt,pev_origin,to); if(get_distance_f(vo,to) > 70.0) return false; new EntityName[32]; pev(tgt, pev_classname, EntityName, 31); if(!equal(EntityName, ENT_CLASS_NAME)) return false; if(pev(tgt,LASERMINE_OWNER) != id) return false; return true; } bool:CreateCheck( id ) { if (!CanCheck(id,0)) return false; if(zp_is_nemesis_round() && get_pcvar_num(g_NEMROUND)) { client_print(id, print_chat, "Nu poti plata Laser la runda Nemesis"); return false; } if(zp_is_survivor_round() && get_pcvar_num(g_SURVROUND)) { client_print(id, print_chat, "Nu poti plata Laser la runda Survivor"); return false; } if(zp_is_sniper_round() && get_pcvar_num(g_SNIPROUND)) { client_print(id, print_chat, "Nu poti plata Laser la runda Sniper"); return false; } if(zp_is_assassin_round() && get_pcvar_num(g_ASSASROUND)) { client_print(id, print_chat, "Nu poti plata Laser la runda Assassin"); return false; } if (g_deployed[id] >= get_pcvar_num(g_LAMMO)) { client_print(id, print_chat, "%s %s",CHATTAG,STR_MAXDEPLOY); return false; } //client_print(id,print_chat,"[Lasermine] your team deployed %d",TeamDeployedCount(id)) if(TeamDeployedCount(id) >= get_pcvar_num(g_LTMAX)) { client_print(id, print_chat, "%s %s",CHATTAG,STR_MANYPPL); return false; } new Float:vTraceDirection[3], Float:vTraceEnd[3],Float:vOrigin[3]; pev( id, pev_origin, vOrigin ); velocity_by_aim( id, 128, vTraceDirection ); xs_vec_add( vTraceDirection, vOrigin, vTraceEnd ); engfunc( EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0 ); new Float:fFraction,Float:vTraceNormal[3]; get_tr2( 0, TR_flFraction, fFraction ); // -- We hit something! if ( fFraction < 1.0 ) { // -- Save results to be used later. get_tr2( 0, TR_vecEndPos, vTraceEnd ); get_tr2( 0, TR_vecPlaneNormal, vTraceNormal ); //get_tr2( 0, TR_pHit ); return true; } client_print(id, print_chat, "%s %s",CHATTAG,STR_PLANTWALL) DeleteTask(id); // -- Did not touched something. (not solid) return false; } public ltm_Think( i_Ent ) { if ( !pev_valid( i_Ent ) ) return FMRES_IGNORED; new EntityName[32]; pev( i_Ent, pev_classname, EntityName, 31); if(!get_pcvar_num(g_LENABLE)) return FMRES_IGNORED; // -- Entity is not a tripmine, ignoring the next... if ( !equal( EntityName, ENT_CLASS_NAME ) ) return FMRES_IGNORED; static Float:fCurrTime; fCurrTime = get_gametime(); switch( pev( i_Ent, LASERMINE_STEP ) ) { case POWERUP_THINK : { new Float:fPowerupTime; pev( i_Ent, LASERMINE_POWERUP, fPowerupTime ); if( fCurrTime > fPowerupTime ) { set_pev( i_Ent, pev_solid, SOLID_BBOX ); set_pev( i_Ent, LASERMINE_STEP, BEAMBREAK_THINK ); PlaySound( i_Ent, ACTIVATE_SOUND ); } if(get_pcvar_num(g_LGLOW)!=0) { if(get_pcvar_num(g_LCLMODE)==0) { new r,g,b; r = random_num(0,255) g = random_num(0,255) b = random_num(0,255) set_rendering(i_Ent,kRenderFxGlowShell,r,g,b,kRenderNormal,5); switch (pev(i_Ent,LASERMINE_TEAM)) { //case CS_TEAM_T: set_rendering(i_Ent,kRenderFxGlowShell,255,0,0,kRenderNormal,5); //case CS_TEAM_CT:set_rendering(i_Ent,kRenderFxGlowShell,0,0,255,kRenderNormal,5); } }else { set_rendering(i_Ent,kRenderFxGlowShell,random_num(50 , 200),random_num(50 , 200),random_num(50 , 200),kRenderNormal,5); } } set_pev( i_Ent, pev_nextthink, fCurrTime + 0.1 ); } case BEAMBREAK_THINK : { static Float:vEnd[3],Float:vOrigin[3]; pev( i_Ent, pev_origin, vOrigin ); pev( i_Ent, LASERMINE_BEAMENDPOINT, vEnd ); static iHit, Float:fFraction; engfunc( EngFunc_TraceLine, vOrigin, vEnd, DONT_IGNORE_MONSTERS, i_Ent, 0 ); get_tr2( 0, TR_flFraction, fFraction ); iHit = get_tr2( 0, TR_pHit ); // -- Something has passed the laser. if ( fFraction < 1.0 ) { // -- Ignoring others tripmines entity. if(pev_valid(iHit)) { pev( iHit, pev_classname, EntityName, 31 ); if( !equal( EntityName, ENT_CLASS_NAME ) ) { set_pev( i_Ent, pev_enemy, iHit ); if(get_pcvar_num(g_LMODE) == MODE_LASERMINE) CreateLaserDamage(i_Ent,iHit); else if(get_pcvar_num(g_LFF) || CsTeams:pev(i_Ent,LASERMINE_TEAM) != cs_get_user_team(iHit)) set_pev( i_Ent, LASERMINE_STEP, EXPLOSE_THINK ); set_pev( i_Ent, pev_nextthink, fCurrTime + random_float( 0.1, 0.3 ) ); } } } if(get_pcvar_num(g_LDMGMODE)!=0) if(pev(i_Ent,LASERMINE_HITING) != iHit) set_pev(i_Ent,LASERMINE_HITING,iHit); // -- Tripmine is still there. if ( pev_valid( i_Ent )) { static Float:fHealth; pev( i_Ent, pev_health, fHealth ); if( fHealth <= 0.0 || (pev(i_Ent,pev_flags) & FL_KILLME)) { set_pev( i_Ent, LASERMINE_STEP, EXPLOSE_THINK ); set_pev( i_Ent, pev_nextthink, fCurrTime + random_float( 0.1, 0.3 ) ); } static Float:fBeamthink; pev( i_Ent, LASERMINE_BEAMTHINK, fBeamthink ); if( fBeamthink < fCurrTime && get_pcvar_num(g_LVISIBLE)) { DrawLaser(i_Ent, vOrigin, vEnd ); set_pev( i_Ent, LASERMINE_BEAMTHINK, fCurrTime + 0.1 ); } set_pev( i_Ent, pev_nextthink, fCurrTime + 0.01 ); } } case EXPLOSE_THINK : { // -- Stopping entity to think set_pev( i_Ent, pev_nextthink, 0.0 ); PlaySound( i_Ent, STOP_SOUND ); g_deployed[pev(i_Ent,LASERMINE_OWNER)]--; CreateExplosion( i_Ent ); CreateDamage(i_Ent,get_pcvar_float(g_LRDMG),get_pcvar_float(g_LRADIUS)) RemoveEntity ( i_Ent ); } } return FMRES_IGNORED; } PlaySound( i_Ent, i_SoundType ) { switch ( i_SoundType ) { case POWERUP_SOUND : { emit_sound( i_Ent, CHAN_VOICE, ENT_SOUND1, VOL_NORM, ATTN_NORM, 0, PITCH_NORM ); emit_sound( i_Ent, CHAN_BODY , ENT_SOUND2, 0.2, ATTN_NORM, 0, PITCH_NORM ); } case ACTIVATE_SOUND : { emit_sound( i_Ent, CHAN_VOICE, ENT_SOUND3, 0.5, ATTN_NORM, 1, 75 ); } case STOP_SOUND : { emit_sound( i_Ent, CHAN_BODY , ENT_SOUND2, 0.2, ATTN_NORM, SND_STOP, PITCH_NORM ); emit_sound( i_Ent, CHAN_VOICE, ENT_SOUND3, 0.5, ATTN_NORM, SND_STOP, 75 ); } } } DrawLaser(i_Ent, const Float:v_Origin[3], const Float:v_EndOrigin[3] ) { new tcolor[3]; new teamid = pev(i_Ent, LASERMINE_TEAM); if(get_pcvar_num(g_LCLMODE) == 0) { switch(teamid){ case 1:{ tcolor[0] = random_num(0,255) tcolor[1] = random_num(0,255) tcolor[2] = random_num(0,255) } case 2:{ tcolor[0] = random_num(0,255) tcolor[1] = random_num(0,255) tcolor[2] = random_num(0,255) } } }else { tcolor[0] = random_num(50 , 200); tcolor[1] = random_num(50 , 200); tcolor[2] = random_num(50 , 200); } message_begin(MSG_BROADCAST,SVC_TEMPENTITY); write_byte(TE_BEAMPOINTS); engfunc(EngFunc_WriteCoord,v_Origin[0]); engfunc(EngFunc_WriteCoord,v_Origin[1]); engfunc(EngFunc_WriteCoord,v_Origin[2]); engfunc(EngFunc_WriteCoord,v_EndOrigin[0]); //Random engfunc(EngFunc_WriteCoord,v_EndOrigin[1]); //Random engfunc(EngFunc_WriteCoord,v_EndOrigin[2]); //Random write_short(beam); write_byte(0); write_byte(0); write_byte(1); //Life write_byte(5); //Width write_byte(0); //wave write_byte(tcolor[0]); // r write_byte(tcolor[1]); // g write_byte(tcolor[2]); // b write_byte(get_pcvar_num(g_LCBRIGHT)); write_byte(255); message_end(); } CreateDamage(iCurrent,Float:DmgMAX,Float:Radius) { // Get given parameters new Float:vecSrc[3]; pev(iCurrent, pev_origin, vecSrc); new AtkID =pev(iCurrent,LASERMINE_OWNER); new TeamID=pev(iCurrent,LASERMINE_TEAM); new ent = -1; new Float:tmpdmg = DmgMAX; new Float:kickback = 0.0; // Needed for doing some nice calculations - new Float:Tabsmin[3], Float:Tabsmax[3]; new Float:vecSpot[3]; new Float:Aabsmin[3], Float:Aabsmax[3]; new Float:vecSee[3]; new trRes; new Float:flFraction; new Float:vecEndPos[3]; new Float:distance; new Float:origin[3], Float:vecPush[3]; new Float:invlen; new Float:velocity[3]; new iHitHP,iHitTeam; // Calculate falloff new Float:falloff; if (Radius > 0.0) { falloff = DmgMAX / Radius; } else { falloff = 1.0; } // Find monsters and players inside a specifiec radius while((ent = engfunc(EngFunc_FindEntityInSphere, ent, vecSrc, Radius)) != 0) { if(!pev_valid(ent)) continue; if(!(pev(ent, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER))) { // Entity is not a player or monster, ignore it continue; } if(!pev_user_alive(ent)) continue; // Reset data kickback = 1.0; tmpdmg = DmgMAX; // The following calculations are provided by Orangutanz, THANKS! // We use absmin and absmax for the most accurate information pev(ent, pev_absmin, Tabsmin); pev(ent, pev_absmax, Tabsmax); xs_vec_add(Tabsmin,Tabsmax,Tabsmin); xs_vec_mul_scalar(Tabsmin,0.5,vecSpot); pev(iCurrent, pev_absmin, Aabsmin); pev(iCurrent, pev_absmax, Aabsmax); xs_vec_add(Aabsmin,Aabsmax,Aabsmin); xs_vec_mul_scalar(Aabsmin,0.5,vecSee); engfunc(EngFunc_TraceLine, vecSee, vecSpot, 0, iCurrent, trRes); get_tr2(trRes, TR_flFraction, flFraction); // Explosion can 'see' this entity, so hurt them! (or impact through objects has been enabled xD) if (flFraction >= 0.9 || get_tr2(trRes, TR_pHit) == ent) { // Work out the distance between impact and entity get_tr2(trRes, TR_vecEndPos, vecEndPos); distance = get_distance_f(vecSrc, vecEndPos) * falloff; tmpdmg -= distance; if(tmpdmg < 0.0) tmpdmg = 0.0; // Kickback Effect if(kickback != 0.0) { xs_vec_sub(vecSpot,vecSee,origin); invlen = 1.0/get_distance_f(vecSpot, vecSee); xs_vec_mul_scalar(origin,invlen,vecPush); pev(ent, pev_velocity, velocity) xs_vec_mul_scalar(vecPush,tmpdmg,vecPush); xs_vec_mul_scalar(vecPush,kickback,vecPush); xs_vec_add(velocity,vecPush,velocity); if(tmpdmg < 60.0) { xs_vec_mul_scalar(velocity,12.0,velocity); } else { xs_vec_mul_scalar(velocity,4.0,velocity); } if(velocity[0] != 0.0 || velocity[1] != 0.0 || velocity[2] != 0.0) { // There's some movement todo - set_pev(ent, pev_velocity, velocity) } } iHitHP = pev_user_health(ent) - floatround(tmpdmg) iHitTeam = int:cs_get_user_team(ent) if(iHitHP <= 0) { if(iHitTeam != TeamID) { cs_set_user_money(AtkID,cs_get_user_money(AtkID) + get_pcvar_num(g_LFMONEY)) set_score(AtkID,ent,1,iHitHP) }else { if(get_pcvar_num(g_LFF)) { cs_set_user_money(AtkID,cs_get_user_money(AtkID) - get_pcvar_num(g_LFMONEY)) set_score(AtkID,ent,-1,iHitHP) } } }else { if(iHitTeam != TeamID || get_pcvar_num(g_LFF)) { //set_pev(Player,pev_health,iHitHP) set_user_health(ent, iHitHP) engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},ent); write_byte(floatround(tmpdmg)) write_byte(floatround(tmpdmg)) write_long(DMG_BULLET) engfunc(EngFunc_WriteCoord,vecSrc[0]) engfunc(EngFunc_WriteCoord,vecSrc[1]) engfunc(EngFunc_WriteCoord,vecSrc[2]) message_end() } } } } return } bool:pev_user_alive(ent) { new deadflag = pev(ent,pev_deadflag); if(deadflag != DEAD_NO) return false; return true; } CreateExplosion(iCurrent) { new Float:vOrigin[3]; pev(iCurrent,pev_origin,vOrigin); message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(99); //99 = KillBeam write_short(iCurrent); message_end(); engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vOrigin, 0); write_byte(TE_EXPLOSION); engfunc(EngFunc_WriteCoord,vOrigin[0]); engfunc(EngFunc_WriteCoord,vOrigin[1]); engfunc(EngFunc_WriteCoord,vOrigin[2]); write_short(boom); write_byte(30); write_byte(15); write_byte(0); message_end(); } CreateLaserDamage(iCurrent,isHit) { if(isHit < 0 ) return PLUGIN_CONTINUE switch(get_pcvar_num(g_LDMGMODE)) { case 1: { if(pev(iCurrent,LASERMINE_HITING) == isHit) return PLUGIN_CONTINUE } case 2: { if(pev(iCurrent,LASERMINE_HITING) == isHit) { static Float:cnt static now,htime;now = floatround(get_gametime()) pev(iCurrent,LASERMINE_COUNT,cnt) htime = floatround(cnt) if(now - htime < get_pcvar_num(g_LDSEC)) { return PLUGIN_CONTINUE; }else{ set_pev(iCurrent,LASERMINE_COUNT,get_gametime()) } }else { set_pev(iCurrent,LASERMINE_COUNT,get_gametime()) } } } new Float:vOrigin[3],Float:vEnd[3] pev(iCurrent,pev_origin,vOrigin) pev(iCurrent,pev_vuser1,vEnd) new teamid = pev(iCurrent, LASERMINE_TEAM) new szClassName[32] new Alive,God new iHitTeam,iHitHP,id new hitscore szClassName[0] = '^0' pev(isHit,pev_classname,szClassName,32) if((pev(isHit, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER))) { Alive = pev_user_alive(isHit) God = get_user_godmode(isHit) if(!Alive || God) return PLUGIN_CONTINUE iHitTeam = int:cs_get_user_team(isHit) iHitHP = pev_user_health(isHit) - get_pcvar_num(g_LDMG) id = pev(iCurrent,LASERMINE_OWNER)//, szNetName[32] if(iHitHP <= 0) { if(iHitTeam != teamid) { emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM ) hitscore = 1 cs_set_user_money(id,cs_get_user_money(id) + get_pcvar_num(g_LFMONEY)) set_score(id,isHit,hitscore,iHitHP) }else { if(get_pcvar_num(g_LFF)) { emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM ) hitscore = -1 cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(g_LFMONEY)) set_score(id,isHit,hitscore,iHitHP) } } }else if(iHitTeam != teamid || get_pcvar_num(g_LFF)) { emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM ) set_user_health(isHit,iHitHP) set_pev(iCurrent,LASERMINE_HITING,isHit); engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},isHit); write_byte(get_pcvar_num(g_LDMG)) write_byte(get_pcvar_num(g_LDMG)) write_long(DMG_BULLET) engfunc(EngFunc_WriteCoord,vOrigin[0]) engfunc(EngFunc_WriteCoord,vOrigin[1]) engfunc(EngFunc_WriteCoord,vOrigin[2]) message_end() } }else if(equal(szClassName, ENT_CLASS_NAME3)) { new hl; hl = pev_user_health(isHit); set_user_health(isHit,hl-get_pcvar_num(g_LDMG)); } return PLUGIN_CONTINUE } stock pev_user_health(id) { new Float:health pev(id,pev_health,health) return floatround(health) } stock set_user_health(id,health) { health > 0 ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id); } stock get_user_godmode(index) { new Float:val pev(index, pev_takedamage, val) return (val == DAMAGE_NO) } stock set_user_frags(index, frags) { set_pev(index, pev_frags, float(frags)) return 1 } stock pev_user_frags(index) { new Float:frags; pev(index,pev_frags,frags); return floatround(frags); } set_score(id,target,hitscore,HP){ new idfrags = pev_user_frags(id) + hitscore// get_user_frags(id) + hitscore set_user_frags(id,idfrags) //set_user_frags(id, idfrags) //entity_set_float(id, EV_FL_frags, float(idfrags)) new tarfrags = pev_user_frags(target) + 1 //get_user_frags(target) + 1 set_user_frags(target,tarfrags) //set_user_frags(target,tarfrags) //entity_set_float(target, EV_FL_frags, float(tarfrags)) new idteam = int:cs_get_user_team(id) new iddeaths = cs_get_user_deaths(id) message_begin(MSG_ALL, g_msgDeathMsg, {0, 0, 0} ,0) write_byte(id) write_byte(target) write_byte(0) write_string(ENT_CLASS_NAME) message_end() message_begin(MSG_ALL, g_msgScoreInfo) write_byte(id) write_short(idfrags) write_short(iddeaths) write_short(0) write_short(idteam) message_end() set_msg_block(g_msgDeathMsg, BLOCK_ONCE) //entity_set_float(target, EV_FL_health,float(HP)) set_user_health(target, HP) //set_pev(target,pev_health,HP) } public BuyLasermine(id) { if( !CanCheck(id,1) ) return PLUGIN_CONTINUE cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(g_LCOST)) g_havemine[id]++; client_print(id, print_chat, "%s %s",CHATTAG,STR_BOUGHT) emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ShowAmmo(id) return PLUGIN_HANDLED } ShowAmmo(id) { new ammo[51] formatex(ammo, 50, "%s %i/%i",STR_STATE, g_havemine[id],get_pcvar_num(g_LAMMO)) message_begin(MSG_ONE, g_msgStatusText, {0,0,0}, id) write_byte(0) write_string(ammo) message_end() } public showInfo(id) { client_print(id, print_chat, STR_REF) } public say_lasermine(id){ new said[32] read_argv(1,said,31); if( !get_pcvar_num( g_LENABLE ) ){ // client_print(id, print_chat, "%s Lasermines are not currently active.",CHATTAG) return PLUGIN_CONTINUE } if (equali(said,"/buy lasermine")||equali(said,"/lm")){ BuyLasermine(id) }else if (equali(said, "lasermine") || equali(said, "/lasermine")){ const SIZE = 1024 new msg[SIZE+1],len = 0; len += formatex(msg[len], SIZE - len, "<html><body>") len += formatex(msg[len], SIZE - len, "<p><b>LaserMine</b></p><br/><br/>") len += formatex(msg[len], SIZE - len, "<p>You can be setting the mine on the wall.</p><br/>") len += formatex(msg[len], SIZE - len, "<p>That laser will give what touched it damage.</p><br/><br/>") len += formatex(msg[len], SIZE - len, "<p><b>LaserMine Commands</b></p><br/><br/>") len += formatex(msg[len], SIZE - len, "<p><b>Say /buy lasermine</b> or <b>Say /lm</b> //buying lasermine<br/>") len += formatex(msg[len], SIZE - len, "<b>buy_lasermine</b> //bind ^"F2^" buy_lasermine : using F2 buying lasermine<br/>") len += formatex(msg[len], SIZE - len, "<b>+setlaser</b> //bind mouse3 +setlaser : using mouse3 set lasermine on wall<br/>") len += formatex(msg[len], SIZE - len, "</body></html>") show_motd(id, msg, "Lasermine Entity help") return PLUGIN_CONTINUE } else if (containi(said, "laser") != -1) { showInfo(id) return PLUGIN_CONTINUE } return PLUGIN_CONTINUE } public standing(id) { if (!g_settinglaser[id]) return PLUGIN_CONTINUE set_pev(id, pev_maxspeed, 1.0) // ShowAmmo(id) return PLUGIN_CONTINUE } public ltm_PostThink(id) { if (!g_settinglaser[id] && plsetting[id]){ resetspeed(id) } else if (g_settinglaser[id] && !plsetting[id]) { pev(id, pev_maxspeed,plspeed[id]) set_pev(id, pev_maxspeed, 1.0) } plsetting[id] = g_settinglaser[id] return FMRES_IGNORED } public ltm_PreThink(id) { // if (!pev_user_alive(id) || g_settinglaser[id] == true || is_user_bot(id) || get_pcvar_num(g_LCMDMODE) == 1) // return; // if(pev(id, pev_button ) & IN_USE && !(pev(id, pev_oldbuttons ) & IN_USE )) // CreateLaserMine_Progress(id) new tgt,body,Float:vo[3],Float:to[3]; get_user_aiming(id,tgt,body); if(pev_valid(tgt)) { pev(id,pev_origin,vo); pev(tgt,pev_origin,to); new EntityName[32]; pev(tgt, pev_classname, EntityName, 31); if(equal(EntityName, ENT_CLASS_NAME)) { new OwnerName[32]; get_user_name(pev(tgt, LASERMINE_OWNER), OwnerName, 31); switch (pev(tgt,LASERMINE_TEAM)) { case CS_TEAM_T: set_hudmessage(200, 0, 0, -1.0, 0.60, 0, 6.0, 1.1, 0.0, 0.0, -1) case CS_TEAM_CT:set_hudmessage(0, 200, 230, -1.0, 0.60, 0, 6.0, 1.1, 0.0, 0.0, -1) } show_hudmessage(id, "Detinator: %s^nViata: %d ", OwnerName, pev(tgt,pev_health)) } } } resetspeed(id) { set_pev(id, pev_maxspeed, plspeed[id]) } public client_putinserver(id){ g_deployed[id] = 0; g_havemine[id] = 0; DeleteTask(id); return PLUGIN_CONTINUE } public client_disconnect(id){ if(!get_pcvar_num( g_LENABLE )) return PLUGIN_CONTINUE DeleteTask(id); RemoveAllTripmines(id); return PLUGIN_CONTINUE } public newround(id){ if(!get_pcvar_num( g_LENABLE )) return PLUGIN_CONTINUE pev(id, pev_maxspeed,plspeed[id]) DeleteTask(id); RemoveAllTripmines(id); delaycount(id); SetStartAmmo(id); return PLUGIN_CONTINUE } public DeathEvent(){ if(!get_pcvar_num( g_LENABLE )) return PLUGIN_CONTINUE new id = read_data(2) if(is_user_connected(id)) DeleteTask(id); return PLUGIN_CONTINUE } public RemoveAllTripmines( i_Owner ) { new iEnt = g_MaxPL + 1; new clsname[32]; while( ( iEnt = engfunc( EngFunc_FindEntityByString, iEnt, "classname", ENT_CLASS_NAME ) ) ) { if ( i_Owner ) { if( pev( iEnt, LASERMINE_OWNER ) != i_Owner ) continue; clsname[0] = '^0' pev( iEnt, pev_classname, clsname, sizeof(clsname)-1 ); if ( equali( clsname, ENT_CLASS_NAME ) ) { PlaySound( iEnt, STOP_SOUND ); RemoveEntity( iEnt ); } } else set_pev( iEnt, pev_flags, FL_KILLME ); } g_deployed[i_Owner]=0; } SetStartAmmo(id) { new stammo = get_pcvar_num(g_LSTAMMO); if(stammo <= 0) return PLUGIN_CONTINUE; g_havemine[id] = (g_havemine[id] <= stammo) ? stammo : g_havemine[id]; return PLUGIN_CONTINUE; } public CutDeploy_onDamage(id) { if(get_user_health(id) < 1) DeleteTask(id); } #if defined BIOHAZARD_SUPPORT public event_infect2(id) { DeleteTask(id); return PLUGIN_CONTINUE } #endif DeleteTask(id) { if (task_exists((TASK_PLANT + id))) { remove_task((TASK_PLANT + id)) } if (task_exists((TASK_RELEASE + id))) { remove_task((TASK_RELEASE + id)) } g_settinglaser[id] = false return PLUGIN_CONTINUE; } // Gets offset data get_offset_value(id, type) { new key = -1; switch(type) { case OFFSET_TEAM: key = OFFSET_TEAM; case OFFSET_MONEY: { #if defined UL_MONEY_SUPPORT return cs_get_user_money_ul(id); #else key = OFFSET_MONEY; #endif } case OFFSET_DEATH: key = OFFSET_DEATH; } if(key != -1) { if(is_amd64_server()) key += 25; return get_pdata_int(id, key); } return -1; } // Sets offset data set_offset_value(id, type, value) { new key = -1; switch(type) { case OFFSET_TEAM: key = OFFSET_TEAM; case OFFSET_MONEY: { #if defined UL_MONEY_SUPPORT return cs_set_user_money_ul(id, value); #else key = OFFSET_MONEY; // Send Money message to update player's HUD message_begin(MSG_ONE_UNRELIABLE, g_msgMoney, {0,0,0}, id); write_long(value); write_byte(1); // Flash (difference between new and old money) message_end(); #endif } case OFFSET_DEATH: key = OFFSET_DEATH; } if(key != -1) { if(is_amd64_server()) key += 25; set_pdata_int(id, key, value); } return PLUGIN_CONTINUE; } [/code]
- SB | Afiseaza codul
[code] #include <amxmodx> #include <amxmisc> #include <fakemeta> #include <hamsandwich> #include <engine> #include <xs> #include <fun> #include <cromchat> #include <zombie_plague_special> #pragma tabsize 0 native get_lm_sts(id) #define VIP_ACCESS ADMIN_LEVEL_H // The sizes of models #define PALLET_MINS Float:{ -27.260000, -22.280001, -22.290001 } #define PALLET_MAXS Float:{ 27.340000, 26.629999, 29.020000 } // from fakemeta util by VEN #define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2) #define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1) // this is mine #define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1) #define fm_get_user_noclip(%1) (pev(%1, pev_movetype) == MOVETYPE_NOCLIP) // cvars new pnumplugin, remove_nrnd, maxpallets, phealth; // num of pallets with bags new palletscout = 0; /* Models for pallets with bags . Are available 2 models, will be set a random of them */ new g_models[][] = { "models/pallet_with_bags2.mdl", "models/pallet_with_bags.mdl" } new stuck[33] new g_bolsas[33]; new cvar[3] new g_bag[33] new const Float:size[][3] = { {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}, {0.0, 1.0, 0.0}, {0.0, -1.0, 0.0}, {1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, -1.0}, {0.0, 0.0, 2.0}, {0.0, 0.0, -2.0}, {0.0, 2.0, 0.0}, {0.0, -2.0, 0.0}, {2.0, 0.0, 0.0}, {-2.0, 0.0, 0.0}, {-2.0, 2.0, 2.0}, {2.0, 2.0, 2.0}, {2.0, -2.0, 2.0}, {2.0, 2.0, -2.0}, {-2.0, -2.0, 2.0}, {2.0, -2.0, -2.0}, {-2.0, 2.0, -2.0}, {-2.0, -2.0, -2.0}, {0.0, 0.0, 3.0}, {0.0, 0.0, -3.0}, {0.0, 3.0, 0.0}, {0.0, -3.0, 0.0}, {3.0, 0.0, 0.0}, {-3.0, 0.0, 0.0}, {-3.0, 3.0, 3.0}, {3.0, 3.0, 3.0}, {3.0, -3.0, 3.0}, {3.0, 3.0, -3.0}, {-3.0, -3.0, 3.0}, {3.0, -3.0, -3.0}, {-3.0, 3.0, -3.0}, {-3.0, -3.0, -3.0}, {0.0, 0.0, 4.0}, {0.0, 0.0, -4.0}, {0.0, 4.0, 0.0}, {0.0, -4.0, 0.0}, {4.0, 0.0, 0.0}, {-4.0, 0.0, 0.0}, {-4.0, 4.0, 4.0}, {4.0, 4.0, 4.0}, {4.0, -4.0, 4.0}, {4.0, 4.0, -4.0}, {-4.0, -4.0, 4.0}, {4.0, -4.0, -4.0}, {-4.0, 4.0, -4.0}, {-4.0, -4.0, -4.0}, {0.0, 0.0, 5.0}, {0.0, 0.0, -5.0}, {0.0, 5.0, 0.0}, {0.0, -5.0, 0.0}, {5.0, 0.0, 0.0}, {-5.0, 0.0, 0.0}, {-5.0, 5.0, 5.0}, {5.0, 5.0, 5.0}, {5.0, -5.0, 5.0}, {5.0, 5.0, -5.0}, {-5.0, -5.0, 5.0}, {5.0, -5.0, -5.0}, {-5.0, 5.0, -5.0}, {-5.0, -5.0, -5.0} } new const g_item_name[] = { "Saci Baricada X10" } const g_item_bolsas = 35 new g_itemid_bolsas new ZPSTUCK, g_BINDMODE, g_MSGMODE /************************************************************* ************************* AMXX PLUGIN ************************* **************************************************************/ new ent/*,OWNER*/ public plugin_init() { /* Register the plugin */ //register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR) register_plugin("[ZP] Extra: SandBags", "1.1", "LARP") set_task(0.1,"checkstuck",0,"",0,"b") g_itemid_bolsas = zp_register_extra_item(g_item_name, g_item_bolsas, ZP_TEAM_HUMAN) /* Register the cvars */ g_BINDMODE = register_cvar("zp_pb_bind","0"); //Auto bind L Key! g_MSGMODE = register_cvar("zp_pb_msg","1"); // ZPSTUCK = register_cvar("zp_pb_stuck","1") pnumplugin = register_cvar("zp_pb_enable","1"); // 1 = ON ; 0 = OFF remove_nrnd = register_cvar("zp_pb_remround","1"); maxpallets = register_cvar("zp_pb_limit","200"); // max number of pallets with bags phealth = register_cvar("zp_pb_health","150"); // set the health to a pallet with bags /* Game Events */ register_event("HLTV","event_newround", "a","1=0", "2=0"); // it's called every on new round /* This is for menuz: */ register_menucmd(register_menuid("\ySand Bags:"), 1023, "menu_command" ); register_clcmd("say /pb","show_the_menu"); register_clcmd("/pb","show_the_menu"); //cvar[0] = register_cvar("zp_autounstuck","1") cvar[1] = register_cvar("zp_pb_stuckeffects","1") cvar[2] = register_cvar("zp_pb_stuckwait","7") register_clcmd("say /buypb","gbuy"); register_clcmd("say_team /buypb","gbuy"); RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage"); RegisterHam(Ham_Killed, "func_wall", "fw_PlayerKilled", 1) CC_SetPrefix("&x04[&x01ZP Saci&x04]") } //Here is what I am tryin to make just owner and zombie to be able to destroy sandbags public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) { //Victim is not lasermine. new sz_classname[32] entity_get_string( victim , EV_SZ_classname , sz_classname, 31 ) if( !equali(sz_classname,"amxx_pallets") ) return HAM_IGNORED; //Attacker is zombie if( zp_get_user_zombie( attacker ) ) return HAM_IGNORED; //Block Damage return HAM_SUPERCEDE; } public fw_PlayerKilled(victim, attacker, shouldgib) { new sz_classname[32], Float: health entity_get_string( victim , EV_SZ_classname , sz_classname, charsmax(sz_classname)) health = entity_get_float(victim, EV_FL_health) if(equal(sz_classname, "amxx_pallets") && is_valid_ent(victim) && zp_get_user_zombie(attacker) && health <= 0.0 &&pev_valid(ent)) { new name[32],name2[32] get_user_name(attacker, name, 31); new OWNER=pev(ent,pev_owner) if(!is_user_bot(OWNER)||!is_user_hltv(OWNER)) { get_user_name(OWNER, name2, 31); } if(!(get_user_flags(attacker)&VIP_ACCESS)) { zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + 5) CC_SendMessage(0, "&x04%s ai Primit &x075 &x04Credite Pentru Ca A Distrus Sacii lu %s!", name,name2); } else { zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + 10) CC_SendMessage(0, "(VIP)&x04 %s a Primit &x0710 &x04Credite Pentru Ca A Distrus Sacii lu %s!", name,name2); } return HAM_IGNORED; } return HAM_IGNORED; } public plugin_precache() { for(new i;i < sizeof g_models;i++) engfunc(EngFunc_PrecacheModel,g_models); } public show_the_menu(id,level,cid) { // check if user doesen't have admin /*if( ! cmd_access( id,level, cid , 0 )) return PLUGIN_HANDLED; */ // check if the plugin cvar is turned off if( ! get_pcvar_num( pnumplugin ) ) return PLUGIN_HANDLED; // check if user isn't alive if( ! is_user_alive( id ) ) { client_print( id, print_chat, "" ); //msg muerto return PLUGIN_HANDLED; } if ( !zp_get_user_zombie(id) ) { new szMenuBody[256]; new keys; new nLen = format( szMenuBody, 255, "\ySand Bags:^n" ); nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. Place a Sandbags (%i Remaining)", g_bolsas[id] ); //nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. Remove a pallet with bags" ); nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. Exit" ); keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<9) show_menu( id, keys, szMenuBody, -1 ); // depends what you want, if is continue will appear on chat what the admin sayd return PLUGIN_HANDLED; } client_print(id, print_chat, "[ZP] The zombies can not use this command!") return PLUGIN_HANDLED; } public menu_command(id,key,level,cid) { switch( key ) { // place a pallet with bags case 0: { if ( !zp_get_user_zombie(id) ) { if(get_lm_sts(id)>0) { client_print(id, print_chat, "[RoD|*] Nu poti pune saci, daca ai deja pus lasermine.") return PLUGIN_HANDLED } new money = g_bolsas[id] if ( money < 1 ) { client_print(id, print_chat, "[RoD|*] You do not have to place sandbags!") return PLUGIN_HANDLED } g_bolsas[id]-= 1 place_palletwbags(id); show_the_menu(id,level,cid); return PLUGIN_CONTINUE } client_print(id, print_chat, "[RoD|*] The zombies can not use this!!") return PLUGIN_HANDLED } // remove a pallet with bags /*case 1: { if ( !zp_get_user_zombie(id) ) { new ent, body, class[32]; get_user_aiming(id, ent, body); if (pev_valid(ent)) { pev(ent, pev_classname, class, 31); if (equal(class, "amxx_pallets")) { g_bolsas[id]+= 1 fm_remove_entity(ent); } else client_print(id, print_chat, "[RoD|*] You are not aiming at a pallet with bags"); } else client_print(id, print_chat, "[RoD|*] You are not aiming at a valid entity !"); show_the_menu(id,level,cid); } } */ // remove all pallets with bags /*case 2: { g_bolsas[id]= 0 remove_allpalletswbags(); client_print(id,print_chat,"[AMXX] You removed all pallets with bags !"); show_the_menu(id,level,cid); } */ } return PLUGIN_HANDLED; } public place_palletwbags(id) { if( palletscout == get_pcvar_num(maxpallets) ) { client_print(id,print_chat,"[ZP] For security reasons only allow %d Sandbags on the server!",get_pcvar_num (maxpallets)); return PLUGIN_HANDLED; } // create a new entity ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall")); // set a name to the entity set_pev(ent,pev_classname,"amxx_pallets"); if( ent <= get_maxplayers() ) return FMRES_IGNORED; // set model engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]); // register a new var. for origin static Float:xorigin[3]; get_user_hitpoint(id,xorigin); // check if user is aiming at the air if(engfunc(EngFunc_PointContents,xorigin) == CONTENTS_SKY) { client_print(id,print_chat,"[ZP] You can not put sandbags in the sky!"); return PLUGIN_HANDLED; } // set sizes static Float:p_mins[3], Float:p_maxs[3]; p_mins = PALLET_MINS; p_maxs = PALLET_MAXS; engfunc(EngFunc_SetSize, ent, p_mins, p_maxs); set_pev(ent, pev_mins, p_mins); set_pev(ent, pev_maxs, p_maxs ); set_pev(ent, pev_absmin, p_mins); set_pev(ent, pev_absmax, p_maxs ); // set the rock of origin where is user placed engfunc(EngFunc_SetOrigin, ent, xorigin); // make the rock solid set_pev(ent,pev_solid,SOLID_BBOX); // touch on edge, block // set the movetype set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff // now the damage stuff, to set to take it or no // if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags // else, if you want to make it destroyable, just set the health > 0 and will be // destroyable. new Float:p_cvar_health = get_pcvar_float(phealth); switch(p_cvar_health) { case 0.0 : { set_pev(ent,pev_takedamage,DAMAGE_NO); } default : { set_pev(ent,pev_health,p_cvar_health); set_pev(ent,pev_takedamage,DAMAGE_YES); } } static Float:rvec[3]; pev(id,pev_v_angle,rvec); rvec[0] = 0.0; set_pev(ent,pev_angles,rvec); // drop entity to floor fm_drop_to_floor(ent); /*OWNER=*/set_pev(ent, pev_owner, id); // num .. palletscout++; // confirm message client_print(id, print_chat, "[ZP] You have placed a Sandbags, you have %i remaining", g_bolsas[id]) return PLUGIN_HANDLED; } /* ==================================================== get_user_hitpoin stock . Was maked by P34nut, and is like get_user_aiming but is with floats and better :o ====================================================*/ stock get_user_hitpoint(id, Float:hOrigin[3]) { if ( ! is_user_alive( id )) return 0; new Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3]; new Float:fTemp[3]; pev(id, pev_origin, fOrigin); pev(id, pev_v_angle, fvAngle); pev(id, pev_view_ofs, fvOffset); xs_vec_add(fOrigin, fvOffset, fvOrigin); engfunc(EngFunc_AngleVectors, fvAngle, feOrigin, fTemp, fTemp); xs_vec_mul_scalar(feOrigin, 9999.9, feOrigin); xs_vec_add(fvOrigin, feOrigin, feOrigin); engfunc(EngFunc_TraceLine, fvOrigin, feOrigin, 0, id); global_get(glb_trace_endpos, hOrigin); return 1; } /* ==================================================== This is called on every round, at start up, with HLTV logevent. So if the "pallets_wbags_nroundrem" cvar is set to 1, all placed pallets with bugs will be removed. ====================================================*/ public event_newround() { if( get_pcvar_num ( remove_nrnd ) == 1) remove_allpalletswbags(); } /* ==================================================== This is a stock to help for remove all pallets with bags placed . Is called on new round if the cvar "pallets_wbags_nroundrem" is set 1. ====================================================*/ stock remove_allpalletswbags() { new pallets = -1; while((pallets = fm_find_ent_by_class(pallets, "amxx_pallets"))) fm_remove_entity(pallets); palletscout = 0; } public checkstuck() { if ( get_pcvar_num(ZPSTUCK) == 1 ) { static players[32], pnum, player get_players(players, pnum) static Float:origin[3] static Float:mins[3], hull static Float:vec[3] static o,i for(i=0; i<pnum; i++){ player = players if (is_user_connected(player) && is_user_alive(player)) { pev(player, pev_origin, origin) hull = pev(player, pev_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN if (!is_hull_vacant(origin, hull,player) && !fm_get_user_noclip(player) && !(pev(player,pev_solid) & SOLID_NOT)) { ++stuck[player] if(stuck[player] >= get_pcvar_num(cvar[2])) { pev(player, pev_mins, mins) vec[2] = origin[2] for (o=0; o < sizeof size; ++o) { vec[0] = origin[0] - mins[0] * size[o][0] vec[1] = origin[1] - mins[1] * size[o][1] vec[2] = origin[2] - mins[2] * size[o][2] if (is_hull_vacant(vec, hull,player)) { engfunc(EngFunc_SetOrigin, player, vec) effects(player) set_pev(player,pev_velocity,{0.0,0.0,0.0}) o = sizeof size } } } } else { stuck[player] = 0 } } } } } stock bool:is_hull_vacant(const Float:origin[3], hull,id) { static tr engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr) if (!get_tr2(tr, TR_StartSolid) || !get_tr2(tr, TR_AllSolid)) //get_tr2(tr, TR_InOpen)) return true return false } public effects(id) { if(get_pcvar_num(cvar[1])) { set_hudmessage(255,150,50, -1.0, 0.65, 0, 6.0, 1.5,0.1,0.7) // HUDMESSAGE show_hudmessage(id,"Automatic Unstuck!") // HUDMESSAGE message_begin(MSG_ONE_UNRELIABLE,105,{0,0,0},id ) write_short(1<<10) // fade lasts this long duration write_short(1<<10) // fade lasts this long hold time write_short(1<<1) // fade type (in / out) write_byte(20) // fade red write_byte(255) // fade green write_byte(255) // fade blue write_byte(255) // fade alpha message_end() client_cmd(id,"spk fvox/blip.wav") } } public zp_extra_item_selected(player, itemid) { if (itemid == g_itemid_bolsas) { g_bolsas[player]+= 15 cmd_bind(player) set_task(0.3,"show_the_menu",player) if ( get_pcvar_num(g_MSGMODE) == 1 ) { set_hudmessage(0, 0, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0) show_hudmessage(player, "Plugin By LARP^n Chile 2008") } } } public cmd_bind(id) { if ( get_pcvar_num(g_BINDMODE) == 1 ) { client_print(id, print_chat, "[ZP] You have %i sandbags, to use with the key 'L'", g_bolsas[id]) client_cmd(id,"bind l /pb") return PLUGIN_HANDLED } client_print(id, print_chat, "[ZP] You have %i sandbags, to use type 'say /pb'", g_bolsas[id]) return PLUGIN_HANDLED } public gbuy(id) { if ( zp_get_user_zombie(id) || !is_user_alive(id) ){ return PLUGIN_HANDLED } if (zp_get_user_ammo_packs(id) < g_item_bolsas) { client_print(id, print_chat, "You don't have enough ammo pack.") return PLUGIN_HANDLED } //if(!zp_core_is_zombie(id) && is_user_alive(id)) { if(g_bag[id] > 1) { client_print(id, print_chat, "Max Sandbags reached !!!") return ZP_PLUGIN_HANDLED } g_bolsas[id]+= 1 g_bag[id]++ set_task(0.3,"show_the_menu",id) client_print(id, print_chat, "[SACI] You have %i sandbags, to use type 'say / pb'", g_bolsas[id]) zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - g_item_bolsas) } return PLUGIN_CONTINUE } [/code]