HKS 27D Posted November 9, 2016 Posted November 9, 2016 Pe web exista doua versiuni de Ping Faker: Ping Faker 1.5 - realizat de MeRcyLeZZ de pe alliedmods.net Ping Faker 1.0 (intitulat de obicei pingfaker2.amxx) - realizat de claudiuhks/Hattrick (programator roman) Probleme Ping Faker 1.5: Din 31/32 vei avea serverul 5/32. Jucatorii vor fi dati afara cu eroarea: "Reliable channel overflow." Probleme Ping Faker 1.0 (pingfaker2.amxx): Are intreruperi in care va arata pingul real al jucatorilor in loc de pingul setat. Pe langa asta, serverul isi va da restart intamplator, in anumite momente. - - - - - - - - - - - - Sursa Ping Faker 1.5: Spoiler /*================================================================================ Ping Faker 1.5a =================================================================================*/ #include #include #include 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, " - 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 >= ? { // Write group of 8 bits write_byte(bits & ((1 << ? - 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 } } Sursa Ping Faker 1.0 (pingfaker2.amxx): Spoiler #include < amxmodx > #include < fakemeta > new g_iCvarPing, g_iCvarFlux; new g_iPing, g_iFlux; new g_iMaxPlayers; new g_iOffset[ 33 ][ 2 ] new g_iArgumentPing[ 33 ][ 3 ]; new g_iPingOverride[ 33 ] = { -1, ... }; public plugin_init( ) { register_plugin( "Ping Faker", "1.0", "Hattrick" ); register_forward( FM_UpdateClientData, "fw_UpdateClientData" ); g_iCvarPing = register_cvar( "pingfake_ping", "12", FCVAR_SERVER ); g_iCvarFlux = register_cvar( "pingfake_flux", "4", FCVAR_SERVER ); g_iMaxPlayers = get_maxplayers( ); } public plugin_cfg( ) set_task( 0.5, "ReadCommandVars", 3426422 ); public ReadCommandVars( ) { g_iPing = clamp( get_pcvar_num( g_iCvarPing ), 0, 4095 ); g_iFlux = clamp( get_pcvar_num( g_iCvarFlux ), 0, 4095 ); set_task( 2.0, "calculate_arguments", 4235621, _, _, "b" ); } public client_disconnect( id ) g_iPingOverride[ id ] = -1; public fw_UpdateClientData( id ) { if( !(pev( id, pev_button ) & IN_SCORE ) && !( pev( id, pev_oldbuttons ) & IN_SCORE ) ) return; static player, sending; sending = 0; for( player = 1; player <= g_iMaxPlayers; player++ ) { if( !is_user_connected( player ) ) continue; switch( sending ) { case 0: { message_begin( MSG_ONE_UNRELIABLE, SVC_PINGS, _, id ); write_byte( ( g_iOffset[ player ][ 0 ] * 64 ) + ( 1 + 2 * ( player - 1 ) ) ); write_short( g_iArgumentPing[ player ][ 0 ] ); sending++; } case 1: { write_byte( ( g_iOffset[ player ][ 1 ] * 128 ) + ( 2 + 4 * ( player - 1 ) ) ); write_short( g_iArgumentPing[ player ][ 1 ] ); sending++; } case 2: { write_byte( ( 4 + 8 * ( player - 1 ) ) ); write_short( g_iArgumentPing[ player ][ 2 ] ); write_byte( 0 ); message_end( ); sending = 0; } } } if (sending) { write_byte( 0 ); message_end( ); } } public calculate_arguments( ) { static player, ping; for( player = 1; player <= g_iMaxPlayers; player++ ) { if( g_iPingOverride[ player ] < 0 ) ping = clamp( g_iPing + random_num( -g_iFlux, g_iFlux ), 0, 4095 ); else ping = g_iPingOverride[ player ]; for( g_iOffset[ player ][ 0 ] = 0; g_iOffset[ player ][ 0 ] < 4; g_iOffset[ player ][ 0 ]++ ) { if( ( ping - g_iOffset[ player ][ 0 ] ) % 4 == 0 ) { g_iArgumentPing[ player ][ 0 ] = ( ping - g_iOffset[ player ][ 0 ] ) / 4; break; } } for (g_iOffset[player][1] = 0; g_iOffset[player][1] < 2; g_iOffset[player][1]++) { if( ( ping - g_iOffset[ player ][ 1 ] ) % 2 == 0 ) { g_iArgumentPing[ player ][ 1 ] = ( ping - g_iOffset[ player ][ 1 ] ) / 2; break; } } g_iArgumentPing[ player ][ 2 ] = ping; } } Pana acum nu s-a gasit o rezolvare permanenta a problemelor cauzate de codul pluginurilor. Echipa Administrativa www.fairside.ro nu recomanda Ping Faker pe serverele comunitare pana la rezolvarea problemelor. Riscati ca serverul dumneavoastra sa se autorestarteze periodic sau sa aveti serverul 0/32 deoarece jucatorii vor primi kick. Totusi, daca vreti neaparat, puneti pingfaker3 pana cand vom reveni cu actualizari ale acestuia. Cod sursa pingfaker3: #include < amxmodx > #include < fakemeta > new g_iCvarPing, g_iCvarFlux; new g_iPing, g_iFlux; new g_iMaxPlayers; new g_iOffset[ 33 ][ 2 ] new g_iArgumentPing[ 33 ][ 3 ]; new g_iPingOverride[ 33 ] = { -1, ... }; public plugin_init( ) { register_plugin( "Ping Faker", "1.1", "Hattrick+alliedmods" ); register_forward( FM_UpdateClientData, "fw_UpdateClientData" ); g_iCvarPing = register_cvar( "pingfake_ping", "11", FCVAR_SERVER ); g_iCvarFlux = register_cvar( "pingfake_flux", "2", FCVAR_SERVER ); g_iMaxPlayers = get_maxplayers( ); } public plugin_cfg( ) set_task( 0.1, "ReadCommandVars", 3426422 ); public ReadCommandVars( ) { g_iPing = clamp( get_pcvar_num( g_iCvarPing ), 0, 4095 ); g_iFlux = clamp( get_pcvar_num( g_iCvarFlux ), 0, 4095 ); set_task( 0.1, "calculate_arguments", 4235621, _, _, "b" ); } public client_disconnect( id ) g_iPingOverride[ id ] = -1; public fw_UpdateClientData( id ) { if( !(pev( id, pev_button ) & IN_SCORE ) && !( pev( id, pev_oldbuttons ) & IN_SCORE ) ) return; static player, sending; sending = 0; for( player = 1; player <= g_iMaxPlayers; player++ ) { if( !is_user_connected( player ) ) continue; switch( sending ) { case 0: { message_begin( MSG_ONE_UNRELIABLE, SVC_PINGS, _, id ); write_byte( ( g_iOffset[ player ][ 0 ] * 64 ) + ( 1 + 2 * ( player - 1 ) ) ); write_short( g_iArgumentPing[ player ][ 0 ] ); sending++; } case 1: { write_byte( ( g_iOffset[ player ][ 1 ] * 128 ) + ( 2 + 4 * ( player - 1 ) ) ); write_short( g_iArgumentPing[ player ][ 1 ] ); sending++; } case 2: { write_byte( ( 4 + 8 * ( player - 1 ) ) ); write_short( g_iArgumentPing[ player ][ 2 ] ); write_byte( 0 ); message_end( ); sending = 0; } } } if (sending) { write_byte( 0 ); message_end( ); } } public calculate_arguments( ) { static player, ping; for( player = 1; player <= g_iMaxPlayers; player++ ) { if( g_iPingOverride[ player ] < 0 ) ping = clamp( g_iPing + random_num( -g_iFlux, g_iFlux ), 0, 4095 ); else ping = g_iPingOverride[ player ]; for( g_iOffset[ player ][ 0 ] = 0; g_iOffset[ player ][ 0 ] < 4; g_iOffset[ player ][ 0 ]++ ) { if( ( ping - g_iOffset[ player ][ 0 ] ) % 4 == 0 ) { g_iArgumentPing[ player ][ 0 ] = ( ping - g_iOffset[ player ][ 0 ] ) / 4; break; } } for (g_iOffset[player][1] = 0; g_iOffset[player][1] < 2; g_iOffset[player][1]++) { if( ( ping - g_iOffset[ player ][ 1 ] ) % 2 == 0 ) { g_iArgumentPing[ player ][ 1 ] = ( ping - g_iOffset[ player ][ 1 ] ) / 2; break; } } g_iArgumentPing[ player ][ 2 ] = ping; } } Daca ne puteti ajuta sa rezolvam situatiile neplacute cauzate de acest plugin, lasati un mesaj mai jos.
adri Posted November 9, 2016 Posted November 9, 2016 Ping Faker 1.5: Plug-in-urile nu au erori, ceea ce inseamna ca nu ele sunt problema, ci ca in cazul plug-in-ului acestuia, clientul jucatorului are setari care pot provoca n unele cazuri deconectarea de la serverele publice. De multe ori configurari schimbate ale clientului de Counter Strike 1.6 primesc valori inimaginabile de mari sau de mici, ceea ce afecteaza calitatea functionarii acestuia si calitatea conexiunii la internet. Rezolvare posibilă: Aici este postat un plug-in care indeparteaza orice caz de deconectare de la un server neinitiata. Pentru Ping Faker 1.0 (pingfaker2.amxx) nu pot oferi o potentiala rezolvare deoarece ar trebui sa stau sa analizez codul sursa si in cel mai rau caz cererile clientului catre serverele publice, ceea ce e prea mult de facut pentru un joc care nu ma mai pasioneaza Merita verificat raspunsul meu la plug-in-ul scris de MeRcyLeZZ. Totusi nu inteleg de ce ar vrea cineva sa ascunda/mascheze viteza internetului jucatorilor conectati. Cu stima, @Adrian Plays. 1
HKS 27D Posted November 9, 2016 Author Posted November 9, 2016 Imi voi expune punctul de vedere argumentat. AHE (Anti Host Error) este un plugin fara o utilitate practica. Daca serverul este configurat perfect, nu vor exista cazuri in care sa ai nevoie de el. Erorile de pe server nu se rezolva adaugand alte pluginuri. Trebuie sa ai in vedere cauza problemelor, nu acoperirea lor pentru a nu mai putea fi observate. Gandeste-te la serverele care nu folosesc amxmodx, ci admin mod. Ele au AHE disponibil? Nu. Nici macar nu au nevoie. Rezolvarea propusa de tine nu este eficienta. Daca scot pingfaker 1.5 din plugins.ini, nimeni de pe server nu va mai primi "Reliable channel overflow." decat extrem de rar, din cauza conexiunii clientului. Ei bine, daca voi pune ping faker 1.5 inapoi pe server, in jur de 10-15 jucatori primesc dintr-o data eroarea si se deconecteaza de pe server. Din 30/32 serverul va ramane 6/32. Am testat pluginul si cauza nu era reprezentata de CS-ul folosit de jucatori sau internetul lor. Ceea ce vreau sa spun este ca problema nu este clientul jucatorului de CS, in cazul de fata, ci pluginul, chiar daca nu prezinta erori la compilare si pare ca ruleaza perfect. Iti multumesc pentru raspuns, Adrian! 1
csfweed01 Posted November 10, 2016 Posted November 10, 2016 Imi voi expune punctul de vedere argumentat. AHE (Anti Host Error) este un plugin fara o utilitate practica. Daca serverul este configurat perfect, nu vor exista cazuri in care sa ai nevoie de el. Erorile de pe server nu se rezolva adaugand alte pluginuri. Trebuie sa ai in vedere cauza problemelor, nu acoperirea lor pentru a nu mai putea fi observate. Gandeste-te la serverele care nu folosesc amxmodx, ci admin mod. Ele au AHE disponibil? Nu. Nici macar nu au nevoie. Rezolvarea propusa de tine nu este eficienta. Daca scot pingfaker 1.5 din plugins.ini, nimeni de pe server nu va mai primi "Reliable channel overflow." decat extrem de rar, din cauza conexiunii clientului. Ei bine, daca voi pune ping faker 1.5 inapoi pe server, in jur de 10-15 jucatori primesc dintr-o data eroarea si se deconecteaza de pe server. Din 30/32 serverul va ramane 6/32. Am testat pluginul si cauza nu era reprezentata de CS-ul folosit de jucatori sau internetul lor. Ceea ce vreau sa spun este ca problema nu este clientul jucatorului de CS, in cazul de fata, ci pluginul, chiar daca nu prezinta erori la compilare si pare ca ruleaza perfect. Iti multumesc pentru raspuns, Adrian! Intr-adevar am avut si eu acest plugin pe XMAS . ce-a ce mi-a spus HKS avea dreptate chiar le dadea unor playerii eroare si disconnect oricum e si nasol sa le vezi ping-ul alora de 250 etc . totusi nu e recomandat ping faker mai recomandat este HPK (High Ping Kicker) pt a da kick celor cu ping peste 200/100 gen
Guest Revenge Posted November 10, 2016 Posted November 10, 2016 Intr-adevar am avut si eu acest plugin pe XMAS . ce-a ce mi-a spus HKS avea dreptate chiar le dadea unor playerii eroare si disconnect oricum e si nasol sa le vezi ping-ul alora de 250 etc . totusi nu e recomandat ping faker mai recomandat este HPK (High Ping Kicker) pt a da kick celor cu ping peste 200/100 gen De acord cu tine, chiar putem discuta in privat, o veste buna pentru tine nu ? )
KraTTos Posted November 10, 2016 Posted November 10, 2016 Ping Faker 1.5: Plug-in-urile nu au erori, ceea ce înseamnă că nu ele sunt problema, ci în cazul plug-in-ului acestuia, clientul jucătorului are setări care pot provoca în unele cazuri deconectarea de la serverele publice. De multe ori configurări schimbate ale clientului de Counter Strike 1.6 primesc valori inimaginabile de mari sau de mici, ceea ce afectează calitatea funcționării acestuia și calitatea conexiunii la internet. Rezolvare posibilă: Aici este postat un plug-in care îndepărtează orice caz de deconectare de la un server neinițiată de jucător. Pentru Ping Faker 1.0 (pingfaker2.amxx) nu pot oferi o potențială rezolvare deoarece ar trebui să stau să analizez codul sursă și în cel mai rău caz cererile clientului către serverele publice, ceea ce e prea mult de făcut pentru un joc care nu mă mai pasionează. Merită verificat răspunsul meu la plug-in-ul scris de MeRcyLeZZ. Totuși nu înțeleg de ce ar vrea cineva să ascundă/mascheze viteza internetului jucătorilor conectați. Cu stimă, @Adrian Plays. aici gresesti ca nu au erori , daca nu sunt scriptate bine amx sau/si sursele nu o sa mearga , de accea trebe sa intelegi ce e acolo . Prima versiunea noua poate da erori de sv only steam ca aia e cu productie fara define dar are inclue asta inseamna ca merge doar pentru anumite addons . Sau va aparia errori La al doie e bine facut acela este un clasic si ala sigur nu va avea errori deci eu va sfatuiesc al doilea ( fakepingarul) secundar este mai bun findca este un universal nu zic ca nu ar putea avea bug dar ala e destul de usor de rezolvat . Depinde de scripter. Dar din cate vad eu in sursa e ok La primu inclue nu e definit ce include deci sar putea sa nu mearga cu metamod sau alte plugine din addons .
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now