Witam bardzo serdecznie
Potrzebowal bym edycji tej laserminy.
Chce aby po najechaniu na laser mine pokazywalo sie info w postaci HP danej laserminy.
Oraz dodanie opcji gdzie po zniszczeniu laserminy gracz otrzymuje nagrode w postaci Exp'a oraz AP
Kod LM'a:
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <fakemeta> #include <xs> #include <zombieplague.inc> #include <colorchat> #if defined UL_MONEY_SUPPORT #include <money_ul> #endif #if AMXX_VERSION_NUM < 180 #assert AMX Mod X v1.8.0 or greater library required! #endif #define PLUGIN "Laser/Tripmine Entity" #define VERSION "2.3" #define AUTHOR "SandStriker" #define RemoveEntity(%1) engfunc(EngFunc_RemoveEntity,%1) //#define ACCESSLEVEL ADMIN_LEVEL_H #define TASK_PLANT 30100 #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) ////////////// Define ZP EXTRA! ////////////////////// const g_item_lmines = 10 new g_itemid_lminas //new id //new proban; ////////////////////////////////////////////////////// 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/v_newtripmine.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/laserbeam.spr", ENT_SPRITE2[] = "sprites/zerogxplode.spr"; new const ENT_CLASS_NAME[] = "lasermine", //ENT_CLASS_NAME2[] = "info_target", ENT_CLASS_NAME3[] = "func_breakable"; 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,g_BINDMODE,g_NEMROUND; 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; new g_dcount[33],/*g_nowtime,*/g_MaxPL new bool:g_settinglaser[33] new g_msgDeathMsg,g_msgScoreInfo,g_msgDamage,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); register_plugin("[ZP] Extra: LaserMines", "1.4", "LARP") g_itemid_lminas = zp_register_extra_item("ML_LASERMINE", g_item_lmines, ZP_TEAM_HUMAN) // Add your code here... register_clcmd("say /lm","buy_lmines"); register_clcmd("say /lasermine","buy_lmines"); register_clcmd("+setlaser","CreateLaserMine_Progress_b"); register_clcmd("-setlaser","StopCreateLaserMine"); register_clcmd("+dellaser","ReturnLaserMine_Progress"); register_clcmd("-dellaser","StopReturnLaserMine"); //register_clcmd("say","say_lasermine"); g_LENABLE = register_cvar("zp_ltm","1"); g_BINDMODE = register_cvar("zp_ltm_bind","1"); //Auto bind P Key! g_LACCESS = register_cvar("zp_ltm_acs","0"); //0 all, 1 admin g_LMODE = register_cvar("zp_ltm_mode","1"); //0 lasermine, 1 tripmine g_LAMMO = register_cvar("zp_ltm_ammo","99999"); g_LDMG = register_cvar("zp_ltm_dmg","1000"); //laser hit dmg g_LCOST = register_cvar("zp_ltm_cost","0"); g_LFMONEY = register_cvar("zp_ltm_fragmoney","0"); g_LHEALTH = register_cvar("zp_ltm_health","500"); g_LTMAX = register_cvar("zp_ltm_teammax","22"); g_LRADIUS = register_cvar("zp_ltm_radius","800"); g_LRDMG = register_cvar("zp_ltm_rdmg","1200"); //radius damage g_LFF = register_cvar("zp_ltm_ff","0"); g_LCBT = register_cvar("zp_ltm_team","ALL"); //NO MODIFY!! g_LBUYMODE = register_cvar("zp_ltm_buymode","1"); g_NEMROUND = register_cvar("zp_ltm_nemround","0"); /******************** NONONONO!!! **************************/ //g_LDELAY = register_cvar("zp_delay",""); //NO CHANGE!!! /******************** NONONONO!!! **************************/ //g_LTHINK = register_cvar("amx_ltm_think","0.01") g_LVISIBLE = register_cvar("zp_ltm_line","1"); g_LGLOW = register_cvar("zp_ltm_glow","0"); g_LCBRIGHT = register_cvar("zp_ltm_bright","100"); //laser line brightness. g_LCLMODE = register_cvar("zp_ltm_color","0"); //0 is team color,1 is green g_LDMGMODE = register_cvar("zp_ltm_ldmgmode","0"); //0 - frame dmg, 1 - once dmg, 2 - 1 second dmg g_LDSEC = register_cvar("zp_ltm_ldmgseconds","1"); //mode 2 only, damage / seconds. default 1 (sec) g_LSTAMMO = register_cvar("zp_ltm_startammo","1"); g_LCMDMODE = register_cvar("zp_ltm_cmdmode","1"); //0 is +USE key, 1 is bind, 2 is each. //g_ACT = register_cvar("zp_ltm_act","0"); 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"); register_dictionary("zombie_plague.txt") } 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); format(file, 63, "%s/ltm_cvars.cfg", file); if(file_exists(file)) server_cmd("exec %s", file), server_exec(); } 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)+ 5) //Check time of ZP_DELAY return true; return false; }*/ public CreateLaserMine_Progress_b(id) { /*if (!CheckTime(id)) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_ZOMBIE" ) return false; }*/ if (!zp_has_round_started()) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_ZOMBIE" ) return false; } if (!zp_get_user_zombie(id)) { if(get_pcvar_num(g_LCMDMODE) != 0) CreateLaserMine_Progress(id); return PLUGIN_HANDLED; } //ColorChat(id,GREEN,"[ZP]^x01 Zombie nie moga uzywac tej komendy!"); return false; } 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) { 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) { ColorChat(id,GREEN,"[ZP]^x01 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,2); 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); ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_PLANTED", g_havemine[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[i]; } 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 ) ) { ColorChat(id,GREEN,"[ZP]^x01 Lasermines are not currently active."); return false; } if( get_pcvar_num(g_LACCESS) != 0) if(!(get_user_flags(id) & ADMIN_IMMUNITY)) { ColorChat(id,GREEN,"[ZP]^x01 You have no access to this command."); return false; } if(!pev_user_alive(id)) return false; if (!CheckCanTeam(id)) { ColorChat(id,GREEN,"[ZP]^x01 Your Zombie! Can't buy and deploying lasermine!"); return false; } if( mode == 0) { if(g_havemine[id] <= 0) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_NOT" ); return false; } } if (mode == 1) { if (get_pcvar_num(g_LBUYMODE) == 0) { ColorChat(id,GREEN,"[ZP]^x01 Can't buying this server."); return false; } if (g_havemine[id] >= get_pcvar_num(g_LAMMO)) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_END" ) return false; } if (cs_get_user_money(id) < get_pcvar_num(g_LCOST)) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_AP" ) return false; } } /*if(!CheckTime(id)) { client_print(id,print_chat, "%s %s %d %s",CHATTAG,STR_DELAY); 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 (g_deployed[id] >= get_pcvar_num(g_LAMMO)) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_END" ) return false; } if(zp_is_nemesis_round() && get_pcvar_num(g_NEMROUND)) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_NEMESIS" ) return false; } //client_print(id,print_chat,"[Lasermine] your team deployed %d",TeamDeployedCount(id)) if(TeamDeployedCount(id) >= get_pcvar_num(g_LTMAX)) { ColorChat(id,GREEN,"[ZP]^x01 Too many ppl on your team..."); 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; } ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_WALL" ); 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) { 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,0,255,0,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] = 255; tcolor[1] = 0; tcolor[2] = 0; } case 2:{ tcolor[0] = 0; tcolor[1] = 0; tcolor[2] = 255; } } }else { tcolor[0] = 0; tcolor[1] = 255; tcolor[2] = 0; } 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,DmgMAX,Float:Radius) { new AtkID = pev(iCurrent,LASERMINE_OWNER)// entity_get_int(iCurrent,LASERMINE_OWNER) new TeamID= pev(iCurrent,LASERMINE_TEAM) //entity_get_int(iCurrent,LASERMINE_INT_TEAM) new Player = -1; new Float:distance,dmg; new Float:tOrigin[3]; new Float:vOrigin[3]; new iHitHP,iHitTeam; pev(iCurrent,pev_origin,vOrigin); while((Player = engfunc(EngFunc_FindEntityInSphere, Player, vOrigin, Radius)) != 0) { if(is_user_alive(Player)) { pev(Player,pev_origin,tOrigin) distance = get_distance_f(vOrigin, tOrigin) dmg = floatround(DmgMAX - ((DmgMAX / Radius) * distance)) iHitHP = pev_user_health(Player) - dmg iHitTeam = int:bio_get_user_team(Player) if(iHitHP <= 0) { if(iHitTeam != TeamID) { cs_set_user_money(AtkID,cs_get_user_money(AtkID) + get_pcvar_num(g_LFMONEY)) set_score(AtkID,Player,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,Player,-1,iHitHP) } } }else { if(iHitTeam != TeamID || get_pcvar_num(g_LFF)) { //set_pev(Player,pev_health,iHitHP) set_user_health(Player, iHitHP) message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, {0,0,0}, Player) write_byte(dmg) write_byte(dmg) write_long(DMG_BULLET) engfunc(EngFunc_WriteCoord,vOrigin[0]) engfunc(EngFunc_WriteCoord,vOrigin[1]) engfunc(EngFunc_WriteCoord,vOrigin[2]) message_end() } } } Player = engfunc(EngFunc_FindEntityInSphere,Player,vOrigin,Radius) } return PLUGIN_CONTINUE } */ 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 :P 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 = 0.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(); //client_print(0,print_chat,"asdasdasd") } 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 cmd_bind(id) zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - g_item_lmines) g_havemine[id]++; emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) 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() set_hudmessage(0, 0, 255, 0.0, 0.27, 0, 6.0, 12.0) show_hudmessage(id, "%s %i/%i",STR_STATE, g_havemine[id],get_pcvar_num(g_LAMMO)) } */ public showInfo(id) { ColorChat(id,GREEN,"[ZP]^x01 Refer to a lasermine rule with this server. say 'lasermine'") } 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 FMRES_IGNORED; if(pev(id, pev_button ) & IN_USE && !(pev(id, pev_oldbuttons ) & IN_USE )) //client_print(id,print_chat,"test"); CreateLaserMine_Progress(id) return FMRES_IGNORED; } 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); g_havemine[id] = 0 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); } 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; } stock set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) { static Float:RenderColor[3]; RenderColor[0] = float(r); RenderColor[1] = float(g); RenderColor[2] = float(b); set_pev(entity, pev_renderfx, fx); set_pev(entity, pev_rendercolor, RenderColor); set_pev(entity, pev_rendermode, render); set_pev(entity, pev_renderamt, float(amount)); return 1 } // 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; } public zp_extra_item_selected(id, itemid) { if (itemid == g_itemid_lminas) { if( !CanCheck(id,1) ) return PLUGIN_CONTINUE cmd_bind(id) g_havemine[id]++; emit_sound(id, CHAN_ITEM, ENT_SOUND5, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) return PLUGIN_HANDLED } return PLUGIN_CONTINUE; } public cmd_bind(id) { //new Lcount //Lcount = g_havemine[id] if ( get_pcvar_num(g_LCMDMODE) == 1 ) { if ( get_pcvar_num(g_BINDMODE) == 1 ) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_READY" ) ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_HAVE", g_havemine[id]+1) client_cmd(id, "bind ^"p^" ^"+setlaser^"") return PLUGIN_HANDLED } ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_READY" ) ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_HAVE", g_havemine[id]+1) return PLUGIN_HANDLED } if ( get_pcvar_num(g_LCMDMODE) == 0 ) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_READY" ) ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_HAVE", g_havemine[id]+1) return PLUGIN_HANDLED } return PLUGIN_CONTINUE } public buy_lmines(id) { if ( get_pcvar_num(g_LENABLE) == 0 ) { ColorChat(id,GREEN,"[ZP]^x01 LaserMiny sa wylaczone.") return PLUGIN_HANDLED } if (!zp_get_user_survivor(id) && !zp_get_user_zombie(id)) { new money = zp_get_user_ammo_packs(id) new cost = g_item_lmines if ( money < cost ) { ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_AP", g_item_lmines) return PLUGIN_CONTINUE } BuyLasermine(id) return PLUGIN_CONTINUE } if ( !zp_get_user_zombie(id) ){ ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_SURVIVOR" ) return PLUGIN_HANDLED } if ( !zp_get_user_survivor(id) ){ ColorChat(id,GREEN,"[ZP]^x01 %L", id, "LASERMINE_ZOMBIES" ) return PLUGIN_HANDLED } return PLUGIN_CONTINUE }
Kod Leveling Systemu:
#include <amxmodx> #include <amxmisc> #include <nvault> #include <fun> #include <fakemeta_util> #include <hamsandwich> #include <dhudmessage> #include <zombieplague> #define PLUGIN "[ZP] Level System 3.2c" #define VERSION "3.2c" #define AUTHOR "Re.Act!ve" const ACCESS = ADMIN_CVAR; new SayText; new bool:g_FreezeTime; new g_level[32], g_level_data, g_frags_level, g_ScreenFade; new g_level_max, g_give_ammo, g_give_ammopacks, g_level_num, g_level_info, g_player_name, g_levels[32], g_h_damage; new g_h_health, g_h_speed, g_z_damage, h_health[32], h_speed[32], h_damage[32], z_damage[32], level_exp[32]; new g_level_exp[32], g_exp_data, g_Players, nameid[32]; new bool:g_bonus[32], g_trime[33]; new sound_level_up[] = { "misc/zp_level_up.wav"}; new sound_health[] = { "items/medshot4.wav" }; // Zombie Classes MUST be registered on plugin_precache public plugin_precache() { precache_sound( sound_level_up ); precache_sound( sound_health ); } public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); g_frags_level = register_cvar("zp_level_frags", "40"); g_level_max = register_cvar("zp_level_max", "50"); g_give_ammo = register_cvar("zp_level_give_ammo", "1"); g_give_ammopacks = register_cvar("zp_level_ammo", "50"); g_h_damage = register_cvar("zp_level_h_damage", "1"); g_h_health = register_cvar("zp_level_h_health", "5"); g_h_speed = register_cvar("zp_level_h_speed", "1.0"); g_z_damage = register_cvar("zp_level_z_damage", "2"); g_level_info = register_cvar("zp_level_info", "1"); g_player_name = register_cvar("zp_player_name", "1"); g_level_num = register_cvar("zp_level_number", "100"); g_level_data = nvault_open("Leveling_Save"); g_exp_data = nvault_open("Exp_Save"); register_clcmd("say","say_info"); register_clcmd("say_team","say_info"); register_clcmd("zp_levelexp","expa_give", ADMIN_CVAR, "use to give Exp"); register_clcmd("zp_level_is","level_give", ADMIN_CVAR, "use to give Level"); SayText = get_user_msgid("SayText"); g_Players = get_maxplayers(); register_event("HLTV", "Round_Start", "a", "1=0", "2=0"); register_event("DeathMsg", "Frags_Manager", "a", "1>0"); RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage"); register_event("StatusValue","show_status","be","1=2","2!0"); register_event("StatusValue","hide_status","be","1=1","2=0"); g_ScreenFade = get_user_msgid( "ScreenFade" ); RegisterHam(Ham_Item_PreFrame, "player", "fw_Player_ResetMaxSpeed", 1); register_logevent("logevent_round_start", 2, "1=Round_Start"); } public plugin_natives() { register_native("zp_get_user_level", "native_get_level", 1); register_native("zp_add_user_level", "native_add_level", 1); register_native("zp_get_user_exp", "native_get_exp", 1); register_native("zp_add_user_exp", "native_add_exp", 1); } public native_get_level(index) { return g_level[index]; } public native_add_level(index, amount) { g_level[index] += amount; } public native_get_exp(index) { return level_exp[index]; } public native_add_exp(index, amount) { level_exp[index] += amount; } public Round_Start() { for(new id = 0; id < g_Players; id++) { set_task(3.0, "Level", id); } } public fw_Player_ResetMaxSpeed(id) { if(is_user_alive(id) && !zp_get_user_zombie(id)) { fw_Player_ResetMaxSpeedVip(id); } } public logevent_round_start() { g_FreezeTime = false; } public event_new_round() { g_FreezeTime = true; } public fw_Player_ResetMaxSpeedVip(id) { if(!g_FreezeTime) { set_user_maxspeed(id,get_user_maxspeed(id) + h_speed[id]); } } public Level(id) { if( !zp_get_user_zombie(id) && is_user_alive(id) ) { g_trime[id] = false; new n = 1; while( n < g_level[id] ) { h_health[id] = n * get_pcvar_num(g_h_health); h_damage[id] = n * get_pcvar_num(g_h_damage); z_damage[id] = n * get_pcvar_num(g_z_damage); h_speed[id] = n * get_pcvar_num(g_h_speed); n = n + 1; } new Float:speed[32]; speed[id] = fm_get_user_maxspeed(id) + h_speed[id]; fm_set_user_health( id, get_user_health(id) + h_health[id] ); set_pev(id, pev_maxspeed, speed[id] ); //set_user_maxspeed(id, speed[id]) emit_sound(id, CHAN_STREAM, sound_health, 1.0, ATTN_NORM, 0, PITCH_HIGH ); } } public expa_give(id, level, cid) { if (!cmd_access(id, level, cid, 2)) { console_print(id, "Nie mozesz uzyc tej komendy"); return PLUGIN_HANDLED; } new target[32]; new count[32]; read_argv(1, target, charsmax(target)); read_argv(2, count, charsmax(count)); new target_id, name[32], nameid[32]; target_id = find_player("bl", target); get_user_name(target_id, name, sizeof name - 1); get_user_name(id, nameid, sizeof nameid - 1); if(!target_id) { console_print(id, "Nie ma takiego gracza"); return PLUGIN_HANDLED; } if(read_argc() != 3) { return PLUGIN_HANDLED; } if(str_to_num(count) < (g_level_exp[target_id] - level_exp[target_id]) ) { if(str_to_num(count) == 0) { console_print(id, "Exp Player %s in %i / %i", name, level_exp[target_id], g_level_exp[target_id]); } else { console_print(id, "Gracz %s otrzymal exp za %i exp, Jego maksymalny exp %i", name, str_to_num(count), g_level_exp[target_id]); level_exp[target_id] = level_exp[target_id] + str_to_num(count); } } else { console_print(id, "Minimalny exp dla gracza %i", g_level_exp[target_id]); } return PLUGIN_HANDLED; } public level_give(id, level, cid) { if (!cmd_access(id, level, cid, 2)) { console_print(id, "Nie mozesz uzyc tej komendy"); return PLUGIN_HANDLED; } new target[32]; new count[32]; read_argv(1, target, charsmax(target)); read_argv(2, count, charsmax(count)); new target_id, name[32], level_id; level_id = str_to_num(count); target_id = find_player("bl", target); get_user_name(target_id, name, sizeof name - 1); if(!target_id) { console_print(id, "Nie ma takiego gracza"); return PLUGIN_HANDLED; } if(read_argc() != 3) { return PLUGIN_HANDLED; } if( ((g_level[target_id] + level_id) <=get_pcvar_num(g_level_max)) && (level_id != 0) && ((g_level[target_id] + level_id) > 0 ) ) { if(level_id > 0) { g_level[target_id] = g_level[target_id] + level_id; message_begin(MSG_ONE_UNRELIABLE, g_ScreenFade, _, target_id); write_short(1<<12); // duration write_short(1); // hold time write_short(0x0000); // fade type write_byte(1); // red write_byte(200); // green write_byte(0); // blue write_byte(205); // alpha message_end(); emit_sound(target_id, CHAN_STREAM, sound_level_up, 1.0, ATTN_NORM, 0, PITCH_HIGH ); } else { g_level[target_id] = g_level[target_id] + level_id; message_begin(MSG_ONE_UNRELIABLE, g_ScreenFade, _, target_id); write_short(1<<12); // duration write_short(1); // hold time write_short(0x0000); // fade type write_byte(200); // red write_byte(40); // green write_byte(0); // blue write_byte(205); // alpha message_end(); } console_print(id, "Gracz %s otrzymal %i Level.", name, level_id); } else { console_print(id, "Operation Invalid"); } return PLUGIN_HANDLED; } public client_putinserver(id) { Level_Load(id); new name[32]; g_trime[id] = false; g_bonus[id] = true; nameid[id] = get_user_name(id, name, sizeof name - 1); if( !zp_get_user_zombie(id) && is_user_alive(id)) { g_trime[id] = false; new n = 1; while( n != g_level[id] ) { h_health[id] = n * get_pcvar_num(g_h_health); h_damage[id] = n * get_pcvar_num(g_h_damage); z_damage[id] = n * get_pcvar_num(g_z_damage); h_speed[id] = n * get_pcvar_num(g_h_speed); n = n + 1; } new Float:speed[32]; speed[id] = fm_get_user_maxspeed(id) + h_speed[id]; fm_set_user_health( id, get_user_health(id) + h_health[id] ); set_pev(id, pev_maxspeed, speed[id] ); //set_user_maxspeed(id, speed[id]) emit_sound(id, CHAN_STREAM, sound_health, 1.0, ATTN_NORM, 0, PITCH_HIGH ); } if( g_level[id] == 0) { g_level[id] = 1; } if( level_exp[id] == g_level[id] ) { level_exp[id] = 0; } if(g_level[id] < get_pcvar_num(g_level_num)) { g_levels[id] = get_pcvar_num(g_level_num); } else { if(g_level[id] != g_levels[id]) { new x = 1; while( g_level[id] > ( x * get_pcvar_num(g_level_num)) ) { x = x + 1; g_levels[id] = x * get_pcvar_num(g_level_num); } } } new y = 1; while( g_level[id] != y ) { y = y + 1; g_level_exp[id] = y * get_pcvar_num(g_frags_level); } } public client_disconnect(id) { new name[32], player_nick[32]; player_nick[id] = get_user_name(id, name, sizeof name - 1); if(player_nick[id] == nameid[id]) { Level_Save(id); } g_trime[id] = false; } public hide_status(id) { set_hudmessage(0,0,0,0.0,0.0,0, 0.0, 0.01, 0.0, 0.0, 4); show_hudmessage(id, ""); } public show_status(id) { new name[32], pid = read_data(2); get_user_name(pid, name, charsmax(name)); if (!zp_get_user_zombie(pid) && !zp_get_user_zombie(id) && (get_pcvar_num(g_player_name) == 1) ) { set_hudmessage(0,0,255,-1.0,0.60,1, 0.01, 3.0, 0.01, 0.01, 4); show_hudmessage(id,"", name, g_level[pid], get_user_health(pid), get_user_armor(pid), zp_get_user_ammo_packs(pid)); } if(zp_get_user_zombie(id) && zp_get_user_zombie(pid) && (get_pcvar_num(g_player_name) == 1) ) { set_hudmessage(255,0,0,-1.0,0.60,1, 0.01, 3.0, 0.01, 0.01, 4); show_hudmessage(id,"", name, g_level[pid], get_user_health(pid), zp_get_user_ammo_packs(pid)); } } public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_bits) { if (!(1 <= attacker <= 23)) { return; } if ( !zp_get_user_zombie(attacker) && is_user_alive(attacker) ) { SetHamParamFloat(4, damage + h_damage[attacker]); } else { if ( zp_get_user_zombie(attacker) && is_user_alive(attacker) && !zp_get_user_nemesis(attacker)) { SetHamParamFloat(4, damage + z_damage[attacker]); } } } public say_info(id) { new text[70], arg1[32], target[32], count[32] read_args(text, sizeof(text)-1); remove_quotes(text); arg1[0] = '^0'; target[0] = '^0'; count[0] = '^0'; parse(text, arg1, sizeof(arg1)-1, target, sizeof(target)-1, count, sizeof(count)-1); if ( equali(arg1, "info", 4) ) { info_player(id, target); } if ( equali(arg1, "level", 7) && (get_pcvar_num(g_level_info) == 1)) { expa_player(id); } return PLUGIN_CONTINUE; } public zp_extra_item_selected(id, itemid) { Level_Save(id) } public zp_user_infected_pre(id, infector) { if( is_user_alive(infector) && (level_exp[infector] < (g_level_exp[infector] - 1)) && zp_get_user_zombie(infector)) { level_exp[infector] = level_exp[infector] + 1; Level_Save(infector); } } public info_player(id, target[]) { new target_2; target_2 = find_player("bl", target); static name[32], nameid[32]; get_user_name(target_2, name, sizeof name - 1); get_user_name(id, nameid, sizeof nameid - 1); if(!target_2) { ChatColor(id, "!g[L4D2]!y Taki nick nie zostal znaleziony na serwerze lub nie istnieje"); return PLUGIN_HANDLED; } if(zp_get_user_zombie(id)) { if(id != target_2) { ChatColor(id, "!g[L4D2]!y Statystyki Gracza !g%s !y| Level : !g%i !y, !yExp : !g%i !y| Posiada aktualnie : !g%i !yAmmo Packow", name, g_level[target_2], level_exp[target_2], zp_get_user_ammo_packs(target_2) ); ChatColor(target_2, "!g[L4D2]!y Gracz %s sprawdzil twoje statystyki", nameid); } else { ChatColor(id, "!g[L4D2]!y Wiecej obrazen z lapy !tzombie!y : !g+%i", z_damage[target_2] ); } } else { if(id != target_2) { ChatColor(id, "!g[L4D2]!y Statystyki Gracza !g%s !y| Level : !g%i !y, !yExp : !g%i !y| Posiada aktualnie : !g%i !yAmmo Packow", name, g_level[target_2], level_exp[target_2], zp_get_user_ammo_packs(target_2) ); ChatColor(target_2, "!g[L4D2]!y Gracz %s sprawdzil twoje statystyki", nameid); } else { ChatColor(id, "!g[L4D2]!y Wiecej obrazen z !tbroni!y : !g+%i !y, !tszybkosci!y : !g+%i !y, !tHP!y : !g+%i", h_damage[target_2], h_speed[target_2], h_health[target_2] ); } } return PLUGIN_HANDLED; } public expa_player(id) { ChatColor(id, "!g[L4D2]!y Twoj Exp: !g%i !y/ !g%i", level_exp[id], g_level_exp[id]); return PLUGIN_HANDLED; } public level_status(id) { if( is_user_alive(id)) { if( !zp_get_user_zombie(id) ) { set_hudmessage(200, 250, 0, -1.0, 0.90, 0, 1.0, 1.1, 0.0, 0.0, -1); show_hudmessage(id,"[Level: %i/60] | [Exp: %i/%i]", g_level[id], level_exp[id], g_level_exp[id]); } else { set_hudmessage(200, 250, 0, -1.0, 0.90, 0, 1.0, 1.1, 0.0, 0.0, -1); show_hudmessage(id,"[Level: %i/60] | Exp: %i/%i]", g_level[id], level_exp[id], g_level_exp[id]); } } } public Level_Save(id) { new key[64], data[256], data_exp[256], key_exp[64]; new name[33]; get_user_name(id,name,charsmax(name)); format(key, charsmax(key), "%s-/", name); format(data, charsmax(data), "%i#", g_level[id]); format(key_exp, charsmax(key_exp), "%s-/", name); format(data_exp, charsmax(data_exp), "%i#", level_exp[id]); nvault_set(g_level_data, key, data); nvault_set(g_exp_data, key_exp, data_exp); return PLUGIN_CONTINUE; } public Level_Load(id) { new key[64], data[256], data_exp[256], key_exp[64]; new name[33]; get_user_name(id,name,charsmax(name)); format(key, charsmax(key), "%s-/", name); format(data, charsmax(data), "%i#", g_level[id]); format(key_exp, charsmax(key_exp), "%s-/", name); format(data_exp, charsmax(data_exp), "%i#", level_exp[id]); nvault_get(g_level_data, key, data, charsmax(data)); nvault_get(g_exp_data, key_exp, data_exp, charsmax(data_exp)); replace_all(data, charsmax(data), "#", " "); replace_all(data_exp, charsmax(data_exp), "#", " "); new givelevel[32], give_exp[32]; parse(data, givelevel, charsmax(givelevel)); parse(data_exp, give_exp, charsmax(give_exp)); g_level[id] = str_to_num(givelevel); level_exp[id] = str_to_num(give_exp); set_task(1.0, "level_status", id, _, _, "b"); return PLUGIN_CONTINUE; } public Frags_Manager() { new aname[32], attacker, y; attacker = read_data(1); get_user_name(attacker, aname, sizeof aname - 1) if( ( level_exp[attacker] >= (g_level_exp[attacker] - 1) ) && (g_level[attacker] <= get_pcvar_num(g_level_max)) && is_user_alive(attacker) ) { g_bonus[attacker] = true; g_level[attacker] = g_level[attacker] + 1; level_exp[attacker] = 0; while( g_level[attacker] != y ) { y = y + 1; g_level_exp[attacker] = y * get_pcvar_num(g_frags_level); } message_begin(MSG_ONE_UNRELIABLE, g_ScreenFade, _, attacker); write_short(1<<12); // duration write_short(1); // hold time write_short(0x0000); // fade type write_byte(1); // red write_byte(200); // green write_byte(0); // blue write_byte(205); // alpha message_end(); emit_sound(attacker, CHAN_STREAM, sound_level_up, 1.0, ATTN_NORM, 0, PITCH_HIGH ); set_dhudmessage(0, 200, 0, -1.0, 0.12, 0, 0.0, 3.0, 2.0, 1.0); show_dhudmessage(0, "%s awansowal na %i level", aname, g_level[attacker]); if(get_pcvar_num(g_give_ammo) == 1) { ChatColor(attacker, "!g[L4D2]!y Zdobyles bonus w postaci !g%i !yAmmo Packow za nowy level", get_pcvar_num(g_give_ammopacks) ); zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_give_ammopacks)); } Level_Save(attacker); } else { if(g_level[attacker] == get_pcvar_num(g_level_max)) { ChatColor(attacker, "!g[L4D2]!y Osiagneles maksymalny level:!g%i !yGratulujemy !", g_level[attacker]); } level_exp[attacker] = level_exp[attacker] + 1; Level_Save(attacker); } } public zp_round_ended(winteam) { for(new id = 0; id < g_Players; id++) { g_trime[id] = true; } } stock ChatColor(const id, const input[], any:...) { new count = 1, players[32]; static msg[191]; vformat(msg, charsmax(msg), input, 3); replace_all(msg, charsmax(msg), "!g", "^4"); // Green Color replace_all(msg, charsmax(msg), "!y", "^1"); // Default Color replace_all(msg, charsmax(msg), "!t", "^3"); // Team Color replace_all(msg, charsmax(msg), "!t2", "^0"); // Team2 Color if (id) { players[0] = id; } else { get_players(players, count, "ch"); } for (new i = 0; i < count; i++) { if (is_user_connected(players[i])) { message_begin(MSG_ONE_UNRELIABLE, SayText, _, players[i]); write_byte(players[i]); write_string(msg); message_end(); } } }