Veteran Member
Join Date: Jan 2010
Location: Brazil [<o>]
|
04-06-2015
, 23:56
Re: [INC] GoldSRC RCON Query
|
#15
|
The last post is from 2014, but i made a conversion of this include from engine to fakemeta, if someone needs for any reason.
PHP Code:
#if !defined _fakemeta_included #include <fakemeta> #endif
#if !defined _socket_included #include <sockets> #endif
/* GoldSRC RCON Query include v. 0.1 by serfreeman1337 http://gf.hldm.org/ Convert to fakemeta made by SmileY :D */
/* rcon_send(p[],port,szPass[],szCommand[],szForward[],Float:timeout) forward <my fwd>(iRconStatus,szResult[]) */
enum _:RconReturn { RCON_CONNECTION_FAILED = -4, RCON_GET_CHALLENGE_FAILED, RCON_CREATE_FWD_FAIL, RCON_TIMEOUT, RCON_OK }
enum _:RconSt { RCON_FAIL = -2, RCON_GET_CHALLENGE, RCON_IDLE }
enum RconDataArray { RconSocket = 0, RconCommand[128], RconPassword[32], RconChallenge[16], RconForward, RconEntity, RconPlugin, RconStatus }
const Float:RETRIVE_INTERVAL = 0.01
stock RconData[RconDataArray] stock Float:RconTimeoutTime stock Float:RconTimeout
stock rcon_send(ip[],port,szPass[],szCommand[],szForward[],Float:timeout = 5.0) { new iErr if(!RconData[RconSocket]) { RconData[RconSocket] = socket_open(ip,port,SOCKET_UDP,iErr) } if(iErr>0) { return RCON_CONNECTION_FAILED } RconData[RconStatus] = RCON_GET_CHALLENGE new send[256] formatex(send,255,"%c%c%c%cchallenge rcon",0xFF,0xFF,0xFF,0xFF) socket_send(RconData[RconSocket],send,strlen(send)) formatex(RconData[RconPassword],31,szPass) formatex(RconData[RconCommand],127,szCommand) if(!pev_valid(RconData[RconEntity])) { RconData[RconEntity] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")); set_pev(RconData[RconEntity],pev_classname,"rcon_think"); set_pev(RconData[RconEntity],pev_nextthink,get_gametime() + RETRIVE_INTERVAL); register_forward(FM_Think,"_Rcon_Think"); } else { set_pev(RconData[RconEntity],pev_nextthink,get_gametime() + RETRIVE_INTERVAL); } RconTimeoutTime = timeout RconTimeout = get_gametime() + timeout if(!RconData[RconPlugin]){ new plFile[64],plNull[1] get_plugin(-1,plFile,63,plNull,0,plNull,0,plNull,0,plNull,0) RconData[RconPlugin] = find_plugin_byfile(plFile,0) } if(!RconData[RconForward]){ RconData[RconForward] = CreateOneForward(RconData[RconPlugin],szForward,FP_CELL,FP_STRING) if(RconData[RconForward]<0) return RCON_CREATE_FWD_FAIL } RconTimeout = get_gametime() + RconTimeoutTime return RCON_OK }
public _Rcon_Disconnect() { set_pev(RconData[RconEntity],pev_nextthink,999999.0); if(RconData[RconPlugin]) RconData[RconPlugin] = 0 if(RconData[RconForward]){ DestroyForward(RconData[RconForward]) RconData[RconForward] = 0 } RconData[RconStatus] = 0 RconData[RconChallenge][0] = 0 RconData[RconPassword][0] = 0 if(RconData[RconSocket]){ socket_close(RconData[RconSocket]) RconData[RconSocket] = 0 } }
public _Rcon_Think(iEnt) { if(iEnt == RconData[RconEntity]) { if(RconData[RconStatus] == RCON_FAIL) { _Rcon_Disconnect() return } new data[512] if(socket_change(RconData[RconSocket],1000)){ socket_recv(RconData[RconSocket],data,511) if(strlen(data)){ set_pev(RconData[RconEntity],pev_nextthink,999999.0); }else{ set_pev(RconData[RconEntity],pev_nextthink,get_gametime() + RETRIVE_INTERVAL); } }else{ set_pev(RconData[RconEntity],pev_nextthink,get_gametime() + RETRIVE_INTERVAL); } if(strlen(data)>0){ new none[1],ret switch(RconData[RconStatus]){ case RCON_GET_CHALLENGE:{ parse(data,none,0,none,0,RconData[RconChallenge],10) if(strlen(RconData[RconChallenge])>0){ RconData[RconStatus] = RCON_IDLE formatex(data,511,"%c%c%c%crcon %s ^"%s^" %s",0xFF,0xFF,0xFF,0xFF,RconData[RconChallenge],RconData[RconPassword],RconData[RconCommand]) socket_send(RconData[RconSocket],data,strlen(data)) set_pev(RconData[RconEntity],pev_nextthink,get_gametime() + RETRIVE_INTERVAL); }else{ RconData[RconStatus] = RCON_FAIL ExecuteForward(RconData[RconForward],none[0],RCON_GET_CHALLENGE_FAILED,RconData[RconChallenge]) } } case RCON_IDLE:{ if(strlen(data) || (strlen(data) - 1)){ // remove ^n data[strlen(data)-1] = 0 } // 0,1,2 - NULL // 3,4 - WTF? formatex(data,511,data[5]) // remove l ExecuteForward(RconData[RconForward],ret,RCON_OK,data) _Rcon_Disconnect() } } } if(get_gametime() > RconTimeout && RconData[RconStatus] != RCON_FAIL){ new sda[12],ret formatex(sda,11,"%.2f",get_gametime()) RconData[RconStatus] = RCON_FAIL ExecuteForward(RconData[RconForward],ret,RCON_TIMEOUT,sda) set_pev(RconData[RconEntity],pev_nextthink,get_gametime() + RETRIVE_INTERVAL); } } }
__________________
Last edited by ^SmileY; 04-06-2015 at 23:58.
|
|