Защититься от этого нельзя, но можно свести на нет, усилия любителей реконнектов.
Вернее есть тупейшая защита, это когда тебя кикает если ты делаешь реконнект.
Но лучше применить плагин которые не дает преимуществ реконектчикам. Лучший на мой взгляд это reconnect_features от ConnorMcLeod.
Но вот моя переделка, ведет учет по именам адресам или стиму. Выставляеться параметром
amx_noreconnect_identity,
0 - steam_id
1 - IP
2 - name
Пользуйтесь :)
В Цербере у меня это много круче сделано, но то уже на любителя.
Блин файлик не прикрепляеться...
Прям сюда залью, надеюсь меня не забанят :):
Код
#include <amxmodx>
#include <fakemeta>
// Переделал Zefir, для запоминания по нику, IP или steam_id
#define MAX_ID 64
#if AMXX_VERSION_NUM < 180
#define charsmax(%1) sizeof(%1) - 1
#endif
#define MAX_PLAYERS 32
#define OFFSET_CSMONEY 115
#define OFFSET_CSDEATHS 444
enum storage {
steamid[32],
Float:frags,
deaths,
money,
round
}
new bool:g_RestartAttempt[MAX_PLAYERS+1]
new bool:g_will_restart
new bool:g_authorized[MAX_PLAYERS+1]
new bool:g_putinserved[MAX_PLAYERS+1]
new g_disconnected_roundnum[MAX_PLAYERS+1]
new g_player_info[MAX_ID][storage]
new g_roundnum
new maxstored = 1
new clear_after, nr_score, nr_money, nr_spawn, nr_startmoney, mp_startmoney, nr_identity
public plugin_init() {
register_plugin("Reconnect Features", "0.1b beta", "ConnorMcLeod")
clear_after = register_cvar("amx_noreconnect_time", "30")
nr_score = register_cvar("amx_noreconnect_score", "1")
nr_money = register_cvar("amx_noreconnect_money", "1")
nr_spawn = register_cvar("amx_noreconnect_spawn", "1")
nr_startmoney = register_cvar("amx_noreconnect_startmoney", "0")
nr_identity = register_cvar("amx_noreconnect_identity", "0")
mp_startmoney = get_cvar_pointer("mp_startmoney")
register_event("HLTV", "eNewRound", "a", "1=0", "2=0")
register_event("TextMsg", "eRestartAttempt", "a", "2=#Game_will_restart_in")
register_event("TextMsg", "eRestart", "a", "2&#Game_C", "2&#Game_w")
register_event("ResetHUD", "eResetHUD", "be")
register_clcmd("clcmd_fullupdate", "fullupdateCmd")
}
public fullupdateCmd() {
return PLUGIN_HANDLED_MAIN
}
public eRestartAttempt() {
new players[MAX_PLAYERS], num
get_players(players, num, "a")
for (new i; i < num; ++i)
g_RestartAttempt[players[i]] = true
}
public eRestart() {
g_will_restart = true
maxstored = 1
}
public eResetHUD(id) {
if (g_RestartAttempt[id]) {
g_RestartAttempt[id] = false
return
}
event_player_spawn(id)
}
public event_player_spawn(id) {
if(!g_disconnected_roundnum[id])
return
if(g_disconnected_roundnum[id] == g_roundnum) {
g_disconnected_roundnum[id] = 0
set_task(0.1, "delay_kill", id)
}
}
public delay_kill(id) {
user_kill(id)
}
public eNewRound() {
g_roundnum++
if(g_will_restart)
{
for(new i; i < maxstored; i++)
{
g_player_info[i][steamid][0] = '^0'
}
g_will_restart = false
}
}
public client_disconnect(id) {
new Float:task_time = get_pcvar_float(clear_after)
if(!task_time)
return
if(is_user_bot(id) || is_user_hltv(id))
return
g_authorized[id] = false
g_putinserved[id] = false
new free = -1
for(new i; i < maxstored; i++)
{
if(!g_player_info[i][steamid][0])
{
free = i
break
}
}
if(free == -1)
return
if(free == maxstored && free < MAX_ID)
maxstored++
switch(get_pcvar_num(nr_identity))
{
case 0:
get_user_authid(id, g_player_info[free][steamid], 31)
case 1:
get_user_ip(id, g_player_info[free][steamid], 31)
case 2:
get_user_name(id, g_player_info[free][steamid], 31)
}
pev(id, pev_frags, g_player_info[free][frags])
g_player_info[free][deaths] = get_pdata_int(id, OFFSET_CSDEATHS)
g_player_info[free][money] = get_pdata_int(id, OFFSET_CSMONEY)
g_player_info[free][round] = g_roundnum
g_disconnected_roundnum[id] = 0
set_task(task_time, "clear", free)
}
public clear(taskid) {
g_player_info[taskid][steamid][0] = '^0'
// g_player_info[taskid][round] = 0
}
public client_authorized(id) {
g_authorized[id] = true
if(g_putinserved[id])
check_player(id)
}
public client_putinserver(id) {
if(!get_pcvar_num(clear_after))
return
if(is_user_bot(id) || is_user_hltv(id))
return
if(g_authorized[id])
check_player(id)
else
g_putinserved[id] = true
}
check_player(id) {
new authid[32], len
len = 31
switch(get_pcvar_num(nr_identity))
{
case 0:
get_user_authid(id, authid, len)
case 1:
get_user_ip(id, authid, len)
case 2:
get_user_name(id, authid, len)
}
for(new i; i < maxstored; i++)
{
if(!g_player_info[i][steamid][0])
continue
if(equal(g_player_info[i][steamid], authid, len))
{
if(get_pcvar_num(nr_score)) {
set_pev(id, pev_frags, g_player_info[i][frags])
set_pdata_int(id, OFFSET_CSDEATHS, g_player_info[i][deaths])
}
if(get_pcvar_num(nr_money)) {
new _money = g_player_info[i][money]
new startmoney = get_pcvar_num(mp_startmoney)
if(get_pcvar_num(nr_startmoney) && _money > startmoney)
set_pdata_int(id, OFFSET_CSMONEY, startmoney)
else
set_pdata_int(id, OFFSET_CSMONEY, _money)
}
if(get_pcvar_num(nr_spawn)) {
g_disconnected_roundnum[id] = g_player_info[i][round]
}
remove_task(i)
clear(i)
return
}
}
}