Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

> Правила форума

Этот раздел, как вы могли заметить по названию, предназначен для решения вопросов по поводу уже существующих модов и плагинов.
Пожалуйста, если у вас проблема с написанием плагина, не путайте этот раздел с разделом по скриптингу.
Для поиска плагинов и модов существует соответствующий раздел.

Название темы должно соответствовать содержанию. Темы с названием типа "Помогите", "Вопрос", "парни подскажите..." - будут удалены.
Все темы, не относящиеся к "Вопросам по модам и плагинам", будут удалены или перемещены в соответствующий раздел.

Правила оформления темы:
1. Помимо заголовка не забудьте верно сформулировать свой вопрос.
2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы.
3. Выложите лог с ошибками (если имеется) под спойлер

Вопрос по плагину pingfaker.amxx

, работа ping_control.amxx вместе с pingfaker.amxx
staff2517
сообщение 10.11.2014, 23:36
Сообщение #1
Стаж: 12 лет

Сообщений: 275
Благодарностей: 5
Полезность: 0

Здравствуйте форумчане.
Думаю себе установить pingfaker.amxx, но вот не знаю будет ли работать с ним ping_control.amxx.
Подскажите ping_control.amxx берет пинг из-таблицы "TAB" или настоящий ?
ping_control.sma
#include <amxmodx>

#define ACCESS_LEVEL_IMMUNITY ADMIN_LEVEL_B // Уровень доступа позволяющий пропускать проверку на пинг.
#define MAX_ALLOWED_PING 150 // Максимально допустимый пинг, превышение этого значения выкидывает игрока с сервера.
#define MAX_ALLOWED_LOSS 101 // Максимально допустимая потеря пакетов loss, превышение этого значения выкидывает игрока с сервера (101 = отключено по умолчанию, т.к. потеря пакетов не может быть больше 100).
#define MAX_WARNING_CHECK 1 // Количество предупреждений после которых последует наказание.
#define INTERVAL_CHECK 10.0 // Интервал между проверками, чем меньше значение, тем больше нагрузка на сервер.
#define CHECK_COUNT 3 // Количество проверок определенного игрока, после 3-х проверок игрока не будет проверять (снижаем еще максимальнее и без того итак маленькую нагрузку xD )

#pragma semicolon 1

#define MAX_PLAYERS 32
#define TASK_PING_CHECK 242984

#define BIT_VALID(%1,%2) (%1 & (1 << (%2 & 31)))
#define BIT_ADD(%1,%2) %1 |= (1 << (%2 & 31))
#define BIT_SUB(%1,%2) %1 &= ~(1 << (%2 & 31))

new g_iBitClientValid, g_iWarning[MAX_PLAYERS + 1];
new g_iMaxPlayers, g_iCountCheck[MAX_PLAYERS + 1];

public plugin_init()
{
register_plugin("Ping Control", "0.1.5", "Freedo.m | neygomon");
g_iMaxPlayers = get_maxplayers();
set_task(INTERVAL_CHECK, "PingCheck", TASK_PING_CHECK, _, _, "b");
}

public client_putinserver(id)
{
if(get_user_flags(id) & ACCESS_LEVEL_IMMUNITY || is_user_bot(id) || is_user_hltv(id)) return;
g_iWarning[id] = 0;
g_iCountCheck[id] = 0;
BIT_ADD(g_iBitClientValid, id);
}

public client_disconnect(id) BIT_SUB(g_iBitClientValid, id);

public PingCheck()
{
static i, iPing, iLoss;
for(i=1; i <= g_iMaxPlayers; i++)
{
if(BIT_VALID(g_iBitClientValid, i) && get_user_ping(i, iPing, iLoss))
{
if(g_iCountCheck[i] < CHECK_COUNT)
{
if(iPing > MAX_ALLOWED_PING || iLoss > MAX_ALLOWED_LOSS)
{
if(++g_iWarning[i] >= MAX_WARNING_CHECK)
{
//log_to_file("ping_control.log", "Ping: %d | Loss: %d", iPing, iLoss);
static name[32];
get_user_name(i, name, charsmax(name));
#if AMXX_VERSION_NUM < 183
client_print(0, print_chat, "[PingControl] %s был удален с сервера из-за большого пинга!", name);
#else
client_print_color(0, 0, "^1[^4PingControl^1] ^3%s ^1был удален с сервера из-за большого пинга!", name);
#endif
server_cmd("kick #%d ^"Вы были кикнуты из-за большого пинга^"", get_user_userid(i));

}
}
else if(g_iWarning[i]) g_iWarning[i]--;
g_iCountCheck[i]++;
}
}
}
}


pingfaker.sma
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

new const FAKEPINGS_FILE[] = "fakepings.ini"
const TASK_ARGUMENTS = 100

new cvar_enable, cvar_ping, cvar_flux, cvar_target, cvar_bots, cvar_multiplier, cvar_fileonly, cvar_showactivity
new g_maxplayers, g_connected[33], g_isbot[33], g_argping[33]
new g_loaded_counter, g_pingoverride[33] = { -1, ... }
new Array:g_loaded_authid, Array:g_loaded_ping

public plugin_init()
{
register_plugin("Ping Faker", "1.5a", "MeRcyLeZZ")

cvar_enable = register_cvar("pingfake_enable", "1")
cvar_ping = register_cvar("pingfake_ping", "1337")
cvar_flux = register_cvar("pingfake_flux", "0")
cvar_target = register_cvar("pingfake_target", "1")
cvar_bots = register_cvar("pingfake_bots", "0")
cvar_multiplier = register_cvar("pingfake_multiplier", "0.0")
cvar_fileonly = register_cvar("pingfake_fileonly", "0")
cvar_showactivity = get_cvar_pointer("amx_show_activity")

g_maxplayers = get_maxplayers()

// If mod is CS, register some additional events to fix a bug
new mymod[16]
get_modname(mymod, charsmax(mymod))
if (equal(mymod, "cstrike") || equal(mymod, "czero"))
{
register_event("DeathMsg", "fix_fake_pings", "a")
register_event("TeamInfo", "fix_fake_pings", "a")
}

register_forward(FM_UpdateClientData, "fw_UpdateClientData")

register_concmd("amx_fakeping", "cmd_fakeping", ADMIN_KICK, "<target> <ping> - Toggle fake ping override on player (-1 to disable)")

g_loaded_authid = ArrayCreate(32, 1)
g_loaded_ping = ArrayCreate(1, 1)

// Load list of IP/SteamIDs to fake pings for
load_pings_from_file()

// Calculate weird argument values regularly in case we are faking ping fluctuations or a multiple of the real ping
set_task(2.0, "calculate_arguments", TASK_ARGUMENTS, _, _, "b")
}

// After some events in CS, the fake pings are overriden for some reason, so we have to send them again...
public fix_fake_pings()
{
static player
for (player = 1; player <= g_maxplayers; player++)
{
// Player not in game?
if (!g_connected[player])
continue;

// Resend fake pings
fw_UpdateClientData(player)
}
}

public client_authorized(id)
{
check_for_loaded_pings(id)
}

public client_putinserver(id)
{
g_connected[id] = true
if (is_user_bot(id)) g_isbot[id] = true
check_for_loaded_pings(id)
}

public client_disconnect(id)
{
g_connected[id] = false
g_isbot[id] = false
g_pingoverride[id] = -1
}

public fw_UpdateClientData(id)
{
// Ping faking disabled?
if (!get_pcvar_num(cvar_enable)) return;

// Scoreboard key being pressed?
if (!(pev(id, pev_button) & IN_SCORE) && !(pev(id, pev_oldbuttons) & IN_SCORE))
return;

// Send fake player's pings
static player, sending, bits, bits_added
sending = false
bits = 0
bits_added = 0

for (player = 1; player <= g_maxplayers; player++)
{
// Player not in game?
if (!g_connected[player])
continue;

// Fake latency for its target too?
if (!get_pcvar_num(cvar_target) && id == player)
continue;

// Fake pings enabled for players on .INI file ONLY and this guy is not listed
if (get_pcvar_num(cvar_fileonly) && g_pingoverride[player] < 0)
continue;

// Only do these checks if not overriding ping for player
if (g_pingoverride[player] < 0)
{
// Is this a bot?
if (g_isbot[player])
{
// Bots setting disabled?
if (!get_pcvar_num(cvar_bots)) continue;
}
else
{
// Bots only setting?
if (get_pcvar_num(cvar_bots) == 2) continue;
}
}

// Start message
if (!sending)
{
message_begin(MSG_ONE_UNRELIABLE, SVC_PINGS, _, id)
sending = true
}

// Add bits for this player
AddBits(bits, bits_added, 1, 1) // flag = 1
AddBits(bits, bits_added, player-1, 5) // player-1 since HL uses ids 0-31
AddBits(bits, bits_added, g_argping[player], 12) // ping
AddBits(bits, bits_added, 0, 7) // loss

// Write group of 8 bits (bytes)
WriteBytes(bits, bits_added, false)
}

// End message
if (sending)
{
// Add empty bit at the end
AddBits(bits, bits_added, 0, 1) // flag = 0

// Write remaining bits
WriteBytes(bits, bits_added, true)

message_end()
}
}

public cmd_fakeping(id, level, cid)
{
// Check for access flag
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED;

// Retrieve arguments
static arg[32], player, ping
read_argv(1, arg, sizeof arg - 1)
player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
read_argv(2, arg, sizeof arg - 1)
ping = str_to_num(arg)

// Invalid target
if (!player) return PLUGIN_HANDLED;

// Update ping overrides for player
g_pingoverride[player] = min(ping, 4095)

// Get player's name for displaying/logging activity
static name1[32], name2[32]
get_user_name(id, name1, sizeof name1 - 1)
get_user_name(player, name2, sizeof name2 - 1)

// Negative value means disable fakeping
if (ping < 0)
{
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - fake ping override disabled on %s", name2)
case 2: client_print(0, print_chat, "ADMIN %s - fake ping override disabled on %s", name1, name2)
}

// Log activity
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - fake ping override disabled on %s", name1, authid, ip, name2)
log_amx(logdata)
}
else
{
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - fake ping override of %d enabled on %s", ping, name2)
case 2: client_print(0, print_chat, "ADMIN %s - fake ping override of %d enabled on %s", name1, ping, name2)
}

// Log activity
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - fake ping override of %d enabled on %s", name1, authid, ip, ping, name2)
log_amx(logdata)
}

return PLUGIN_HANDLED;
}

// Calculate argument values based on target ping
public calculate_arguments()
{
static player, ping, loss
for (player = 1; player <= g_maxplayers; player++)
{
// Calculate target ping (clamp if out of bounds)
if (g_pingoverride[player] < 0)
{
if (get_pcvar_float(cvar_multiplier) > 0.0)
{
get_user_ping(player, ping, loss)
g_argping[player] = clamp(floatround(ping * get_pcvar_float(cvar_multiplier)), 0, 4095)
}
else
g_argping[player] = clamp(get_pcvar_num(cvar_ping) + random_num(-abs(get_pcvar_num(cvar_flux)), abs(get_pcvar_num(cvar_flux))), 0, 4095)
}
else
g_argping[player] = g_pingoverride[player]
}
}

load_pings_from_file()
{
// Build file path
new path[64]
get_configsdir(path, sizeof path - 1)
format(path, sizeof path - 1, "%s/%s", path, FAKEPINGS_FILE)

// File not present, skip loading
if (!file_exists(path)) return;

// Open file for reading
new linedata[40], authid[32], ping[8], file = fopen(path, "rt")

while (file && !feof(file))
{
// Read one line at a time
fgets(file, linedata, sizeof linedata - 1)

// Replace newlines with a null character to prevent headaches
replace(linedata, sizeof linedata - 1, "^n", "")

// Blank line or comment
if (!linedata[0] || linedata[0] == ';') continue;

// Get authid and ping
strbreak(linedata, authid, sizeof authid - 1, ping, sizeof ping -1)
remove_quotes(ping)

// Store data into global arrays
ArrayPushString(g_loaded_authid, authid)
ArrayPushCell(g_loaded_ping, clamp(str_to_num(ping), 0, 4095))

// Increase loaded data counter
g_loaded_counter++
}
if (file) fclose(file)
}

check_for_loaded_pings(id)
{
// Nothing to check for
if (g_loaded_counter <= 0) return;

// Get steamid and ip
static authid[32], ip[16], i, buffer[32]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)

for (i = 0; i < g_loaded_counter; i++)
{
// Retrieve authid
ArrayGetString(g_loaded_authid, i, buffer, sizeof buffer - 1)

// Compare it with this player's steamid and ip
if (equali(buffer, authid) || equal(buffer, ip))
{
// We've got a match!
g_pingoverride[id] = ArrayGetCell(g_loaded_ping, i)
break;
}
}
}

AddBits(&bits, &bits_added, value, bit_count)
{
// No more room (max 32 bits / 1 cell)
if (bit_count > (32 - bits_added) || bit_count < 1)
return;

// Clamp value if its too high
if (value >= (1 << bit_count))
value = ((1 << bit_count) - 1)

// Add new bits
bits = bits + (value << bits_added)
// Increase bits added counter
bits_added += bit_count
}

WriteBytes(&bits, &bits_added, write_remaining)
{
// Keep looping if there are more bytes to write
while (bits_added >= 8)
{
// Write group of 8 bits
write_byte(bits & ((1 << 8) - 1))

// Remove bits we just sent by moving all bits to the right 8 times
bits = bits >> 8
bits_added -= 8
}

// Write remaining bits too?
if (write_remaining && bits_added > 0)
{
write_byte(bits)
bits = 0
bits_added = 0
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя csnet
сообщение 11.11.2014, 0:41
Сообщение #2
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

попробуй, нам расскажешь
faker ничего не сможет сделать с настоящим пингом, на то он и fake

Отредактировал: csnet, - 11.11.2014, 0:42


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
staff2517
сообщение 11.11.2014, 1:44
Сообщение #3
Стаж: 12 лет

Сообщений: 275
Благодарностей: 5
Полезность: 0

Цитата(csnet @ 11.11.2014, 0:41) *
попробуй, нам расскажешь
faker ничего не сможет сделать с настоящим пингом, на то он и fake

Потестил, работает нормально. Игроки с большим пингом кикаются не смотря фейковый пинг.


Кто может добавить в плагин pingfaker.amxx чтобы в поиске серверов тоже отображался фейковый пинг а не реальный.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя csnet
сообщение 11.11.2014, 1:59
Сообщение #4
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

клиент кс сам определяет пинг.


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
staff2517
сообщение 11.11.2014, 10:57
Сообщение #5
Стаж: 12 лет

Сообщений: 275
Благодарностей: 5
Полезность: 0

Цитата(csnet @ 11.11.2014, 1:59) *
клиент кс сам определяет пинг.

Понял. Спасибо
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 11.11.2014, 11:07
Сообщение #6


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Я как-то изначально поставил ping_control.amxx выше в списке плагов по сравнению с pingfaker.amxx (на всяк случай) - полет нормальный.


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: