/* AMX Mod script. * * Anti-Camping * by sk_lionheart * email: lionheart@clansk.org * * Console Commands : * * "sv_anticamping" 1/0 - (enable/disable the plugin, default is 1) * "sv_anticamping_campmeter" 1/0 - (enable/disable displaying the camping metter, default is 1) * "sv_anticamping_camptime" seconds - (number of seconds before slap, default is 30) * "sv_anticamping_healthpunish" health - (number of health points per slap, default is 10) * "sv_anticamping_keepbomb_maxdistance" meters - (distance from the bomb where CTs or Terrorists are considered as being keeping the bomb, default is 30) * * @copyright clansk.org * */ #include public MultiKill public MultiKillSound public BombPlanting public BombDefusing public BombPlanted public BombDefused public BombFailed public BombPickUp public BombDrop public BombCountVoice public BombCountDef public BombReached public ItalyBonusKill public EnemyRemaining public LastMan public KnifeKill public KnifeKillSound public GrenadeKill public GrenadeSuicide public HeadShotKill public HeadShotKillSound public RoundCounterSound public RoundCounter public KillingStreak public KillingStreakSound public DoubleKill public DoubleKillSound public PlayerName public FirstBloodSound #define DEFAULT_CAMPTIME 30 #define DEFAULT_HEALTHPUNISH 10 new playercoord0[33][3] new playercoord1[33][3] new playercoord2[33][3] new playercoord3[33][3] new playercoord4[33][3] new campmeter[33] new bool:pausecounter[33] new bool:bombplanted new bool:bombdropped new bool:de_map new camptolerancedefending=180 new camptoleranceattacking=200 new campwarning[]="Attention ! Aucun camping autorise sur ce serveur !" new camppunish[]="Dernier Avertissement ! Bouge VITE !" new campslap[]="Tu l'auras voulu ! BOUGE si tu veux vivre !" new campkill[]="%s est mort en raison du camping!" new camprate[]="camping meter: %d%% (%s) %s" new planter new bombOrigin[3] public plugin_init() { register_plugin("Camping-meter","1.3","sk_lionheart") register_event("Damage", "damage_event", "b", "2!0") register_event("BarTime","bartime_event","b") register_event("ResetHUD", "new_round", "b") register_event("SendAudio", "bomb_planted", "a", "2&%!MRAD_BOMBPL") register_event("SendAudio", "round_end", "a", "2&%!MRAD_terwin","2&%!MRAD_ctwin","2&%!MRAD_rounddraw") register_event("TextMsg", "bomb_drop", "bc", "2&#Game_bomb_d") register_event("StatusIcon", "got_bomb", "be", "1=1", "1=2", "2=c4") register_cvar("sv_anticamping","1",0) register_cvar("sv_anticamping_campmeter","1",0) register_cvar("sv_anticamping_camptime","30",0) register_cvar("sv_anticamping_healthpunish","10",0) register_cvar("sv_anticamping_keepbomb_maxdistance","30",0) set_task(1.0,"checkcamping",1) return PLUGIN_CONTINUE } public sqrt(num) { new div = num; new result = 1; while (div > result) { // end when div == result, or just below div = (div + result) / 2 // take mean value as new divisor result = num / div } return div; } public unpausecounter(parm[]) { new id = parm[0] pausecounter[id]=false return PLUGIN_CONTINUE } public checkcamping() { if (get_cvar_num("sv_anticamping")==0) { set_task(1.0,"checkcamping",1) return PLUGIN_CONTINUE } new players[32] new numberofplayers new variance[3] new average[3] new variancetotal new standarddeviation new message[256] new id new team new i new j new behaviorMode // 0 = attacking 1 = defending 2 = bomb defending new behaviorLabel[50] new bombDistanceLabel[50] new distance = 0 new distanceMeter = 0 new camptime = get_cvar_num("sv_anticamping_camptime") new healthpunish = get_cvar_num("sv_anticamping_healthpunish") new maxdistance = get_cvar_num("sv_anticamping_keepbomb_maxdistance") if (camptime == 0) camptime = DEFAULT_CAMPTIME if (healthpunish == 0) healthpunish = DEFAULT_HEALTHPUNISH get_players(players, numberofplayers, "a") for (i = 0; i < numberofplayers; ++i) { while (i < numberofplayers && pausecounter[players[i]]) { ++i } if (i >= numberofplayers) { set_task(1.0,"checkcamping",1) return PLUGIN_CONTINUE } id=players[i] for (j = 0; j < 3; ++j) { playercoord4[id][j]=playercoord3[id][j] playercoord3[id][j]=playercoord2[id][j] playercoord2[id][j]=playercoord1[id][j] playercoord1[id][j]=playercoord0[id][j] } get_user_origin(id, playercoord0[id], 0) for (j = 0; j < 3; ++j) { average[j]=(playercoord0[id][j]+ playercoord1[id][j]+ playercoord2[id][j]+ playercoord3[id][j]+ playercoord4[id][j])/5 variance[j]=(((playercoord0[id][j]-average[j])*(playercoord0[id][j]-average[j])+ (playercoord1[id][j]-average[j])*(playercoord1[id][j]-average[j])+ (playercoord2[id][j]-average[j])*(playercoord2[id][j]-average[j])+ (playercoord3[id][j]-average[j])*(playercoord3[id][j]-average[j])+ (playercoord4[id][j]-average[j])*(playercoord4[id][j]-average[j]))/4) } variancetotal=variance[0]+variance[1]+variance[2] standarddeviation=sqrt(variancetotal) team = get_user_team(id) if (bombdropped) { distance = get_distance(bombOrigin,playercoord0[id]) distanceMeter = distance / 42 format(bombDistanceLabel,49,"distance bombe : %d m",distanceMeter) } if (!de_map) // it's an hostage map { if (team==2) // Team 1 = Terro, Team 2 = CT behaviorMode = 0 else behaviorMode = 1 } else if (bombplanted) { if (team==1) // Team 1 = Terro, Team 2 = CT behaviorMode = 2 else behaviorMode = 0 } else // it's a bomb map { if (team==2) // Team 1 = Terro, Team 2 = CT { behaviorMode = 1 if (bombdropped) { if (distanceMeter<=maxdistance) { behaviorMode = 3 } } } else { behaviorMode = 0 } } if (behaviorMode == 0) { campmeter[id]+=(camptoleranceattacking-standarddeviation)/camptime behaviorLabel = "attaque" } if (behaviorMode == 1) { campmeter[id]+=(camptolerancedefending-standarddeviation)/camptime behaviorLabel = "defense" } if (behaviorMode == 2) { campmeter[id] = 0 behaviorLabel = "defense bombe" } if (behaviorMode == 3) { campmeter[id] = 0 behaviorLabel = "garde bombe" } if (campmeter[id]<0) campmeter[id]=0 else if (campmeter[id]>100) { if (get_user_health(id)-healthpunish<=0) { set_hudmessage(200, 100, 0, -1.0, 0.3, 0, 1.0, 10.0, 0.1, 0.1, 3) new playername[64] get_user_name(id,playername,63) format(message,255,campkill,playername) show_hudmessage(0,message) } // set_user_health(id, get_user_health(id)-healthpunish) // Remove the comments from the line above if you rather just take health off without slap // Don't forget to comment the line below though if you do that user_slap(id,healthpunish) campmeter[id]=100 } if (campmeter[id]>=100) { set_hudmessage(240, 50, 40, -1.0, 0.35, 1, 1.0, 1.0, 0.1, 0.1, 1) show_hudmessage(id,campslap) } else if (campmeter[id]>=85) { set_hudmessage(240, 50, 40, -1.0, 0.35, 1, 1.0, 1.0, 0.1, 0.1, 1) show_hudmessage(id,camppunish) } else if (campmeter[id]>=55) { set_hudmessage(255, 255, 255, -1.0, 0.35, 0, 1.0, 1.0, 0.1, 0.1, 1) show_hudmessage(id,campwarning) } if (get_cvar_num("sv_anticamping_campmeter")==1) { set_hudmessage(255, 255, 255, -1.0, 0.93, 0, 1.0, 1.0, 0.1, 0.1, 4) show_hudmessage(id,camprate,campmeter[id],behaviorLabel,bombDistanceLabel) } } set_task(1.0,"checkcamping",1) return PLUGIN_CONTINUE } public damage_event(id) { if (get_cvar_num("sv_anticamping")==0) return PLUGIN_CONTINUE new enemy = get_user_attacker(id) if (get_user_team(id)!=get_user_team(enemy)) { campmeter[id]=0 campmeter[enemy]=0 } return PLUGIN_CONTINUE } public new_round(id) { if (get_cvar_num("sv_anticamping")==0) return PLUGIN_CONTINUE bombdropped=false bombplanted=false pausecounter[id]=true campmeter[id]=0 new Float:freezetime = get_cvar_float("mp_freezetime")+1.0 new parm[1] parm[0]=id set_task(freezetime,"unpausecounter",0,parm,1) return PLUGIN_CONTINUE } public bartime_event(id) { if (get_cvar_num("sv_anticamping")==0) return PLUGIN_CONTINUE pausecounter[id]=true campmeter[id]=0 new Float:bar_time=float(read_data(1)+1) new parm[1] parm[0]=id set_task(bar_time,"unpausecounter",0,parm,1) return PLUGIN_CONTINUE } public bomb_planted() { if (get_cvar_num("sv_anticamping")==0) return PLUGIN_CONTINUE bombplanted=true return PLUGIN_CONTINUE } public got_bomb(id) { bombdropped = false planter = id if (get_cvar_num("sv_anticamping")==0) return PLUGIN_CONTINUE de_map=true return PLUGIN_CONTINUE } public bomb_drop() { get_user_origin(planter, bombOrigin) bombdropped = true } public round_end(){ if (get_cvar_num("sv_anticamping")==0) return PLUGIN_CONTINUE new players[32] new numberofplayers new id new i get_players(players, numberofplayers, "a") for (i = 0; i < numberofplayers; ++i) { id=players[i] pausecounter[id]=true } return PLUGIN_CONTINUE }