Ter | Дата: Пятница, 07.08.2009, 17:55:42 | Сообщение # 4 |
Майор
Группа: Пользователи
Сообщений: 83
Статус: Не в сети
| Quote (Syava-g) пинг выдается, который нужен, но как сделать, чтобы он КОЛЕБАЛСЯ!? Тоесть был динамическим да можно так? Code #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_flags, cvar_bots, cvar_multiplier new g_enable, g_ping, g_flux, g_target, g_flags, g_bots, Float:g_multiplier, g_maxplayers new g_connected[33], g_isbot[33], g_offset[33][2], g_argping[33][3], g_hasflags[33] new g_loaded_counter, cvar_showactivity, g_pingoverride[33] = { -1, ... } new Array:g_loaded_authid, Array:g_loaded_ping
public plugin_init() { register_plugin("Ping Faker", "1.4", "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_flags = register_cvar("pingfake_flags", "") cvar_bots = register_cvar("pingfake_bots", "0") cvar_multiplier = register_cvar("pingfake_multiplier", "0.0") cvar_showactivity = get_cvar_pointer("amx_show_activity") g_maxplayers = get_maxplayers() register_event("HLTV", "event_round_start", "a", "1=0", "2=0") 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_pings_from_file() }
public plugin_cfg() { // Cache CVARs after configs are loaded set_task(0.5, "event_round_start") }
public event_round_start() { // Cache CVAR values g_ping = get_pcvar_num(cvar_ping) g_flux = abs(get_pcvar_num(cvar_flux)) g_target = get_pcvar_num(cvar_target) g_enable = get_pcvar_num(cvar_enable) g_bots = get_pcvar_num(cvar_bots) g_multiplier = get_pcvar_float(cvar_multiplier) // Calculate weird argument values based on target ping calculate_arguments() // Calculate them regularly if also faking ping fluctuations or if faking a multiple of the real ping remove_task(TASK_ARGUMENTS) if (g_flux || g_multiplier > 0.0) set_task(2.0, "calculate_arguments", TASK_ARGUMENTS, _, _, "b") // Cache flags new flags[6] get_pcvar_string(cvar_flags, flags, sizeof flags - 1) g_flags = read_flags(flags) // Check flags again for all players for (new id = 1; id <= g_maxplayers; id++) if (g_connected[id]) check_flags(id) }
public client_authorized(id) { check_for_loaded_pings(id) check_flags(id) }
public client_infochanged(id) { check_flags(id) }
public client_putinserver(id) { g_connected[id] = true if (is_user_bot(id)) g_isbot[id] = true }
public client_disconnect(id) { g_connected[id] = false g_isbot[id] = false g_pingoverride[id] = -1 g_hasflags[id] = 0 }
public fw_UpdateClientData(id) { // Ping faking disabled? if (!g_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 sending = 0 for (player = 1; player <= g_maxplayers; player++) { // Player not in game? if (!g_connected[player]) continue; // Fake latency for its target too? if (!g_target && id == player) 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 (!g_bots) continue; } else { // Bots only setting? if (g_bots == 2) continue; // Need to have specific flags? if (g_flags && !(g_hasflags[player])) continue; } } // Send message with the weird arguments switch (sending) { case 0: { // Start a new message message_begin(MSG_ONE_UNRELIABLE, SVC_PINGS, _, id) write_byte((g_offset[player][0] * 64) + (1 + 2 * (player - 1))) write_short(g_argping[player][0]) sending++ } case 1: { // Append additional data write_byte((g_offset[player][1] * 128) + (2 + 4 * (player - 1))) write_short(g_argping[player][1]) sending++ } case 2: { // Append additional data and end message write_byte((4 + 8 * (player - 1))) write_short(g_argping[player][2]) write_byte(0) message_end() sending = 0 } } } // End message if not yet sent if (sending) { write_byte(0) 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) calculate_arguments() // 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; }
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 (g_multiplier > 0.0) { get_user_ping(player, ping, loss) ping = clamp(floatround(ping * g_multiplier), 0, 4095) } else ping = clamp(g_ping + random_num(-g_flux, g_flux), 0, 4095) } else ping = g_pingoverride[player] // First argument's ping for (g_offset[player][0] = 0; g_offset[player][0] < 4; g_offset[player][0]++) { if ((ping - g_offset[player][0]) % 4 == 0) { g_argping[player][0] = (ping - g_offset[player][0]) / 4 break; } } // Second argument's ping for (g_offset[player][1] = 0; g_offset[player][1] < 2; g_offset[player][1]++) { if ((ping - g_offset[player][1]) % 2 == 0) { g_argping[player][1] = (ping - g_offset[player][1]) / 2 break; } } // Third argument's ping g_argping[player][2] = ping } }
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) calculate_arguments() break; } } }
check_flags(id) { g_hasflags[id] = get_user_flags(id) & g_flags }
Сообщение отредактировал Ter - Пятница, 07.08.2009, 17:58:18 |
|
| |