This set of functions is to be able to query a server by IP:port for it's information or players list.
This is how xRedirect or other plugins show information about a server, but makes it easier for other coders who want to do it.
It is equipped with various functions and functionality for error reporting and statistics about the query.
Constants:
These constants are used inside the core plugin as well as the plugins that use this include:
Spoiler
Code:
// The different types of queries to performenum _:ServerQueryType
{
SQ_Server,
SQ_Players,
SQ_Challenge,
SQ_Ping,
SQ_Rules
};
// The different error codes that can be returned when a server is queriedenum _:ServerQueryErrors
{
SQError_NoError,
SQError_InvalidParams,
SQError_MaxConnections,
SQError_InvalidQueryType,
SQError_InvalidIP,
SQError_CouldNotConnect,
SQError_InvalidFunction,
SQError_AlreadyConnected
};
// The results of server types#define SERVERTYPE_LISTEN 'l' // listen#define SERVERTYPE_DEDICATED 'd' // dedicated#define SERVERTYPE_HLTV 'p' // HLTV// The results of The Ship's game modesenum _:SHIP_GAMEMODES
{
SHIP_GAMEMODE_HUNT,
SHIP_GAMEMODE_ELIM,
SHIP_GAMEMODE_DUEL,
SHIP_GAMEMODE_DM,
SHIP_GAMEMODE_TEAM_VIP,
SHIP_GAMEMODE_TEAM_ELIM
};
// The size of the rule names and values#define SQ_RULE_NAME_SIZE 256#define SQ_RULE_VALUE_SIZE 256
Primary Native:
Spoiler
Code:
/*
* Queries a server for information
*
* @param ip - IP of the server without port
* @param port - The port number of the server
* @param type - The type of query to perform (matches SQ_* constants)
* @param function - The callback function to be executed when the query is finished
* @param error - The error code given when there was a problem with the query (matches SQError_* constants)
* @param timeout - The time in seconds to wait for a response before setting as failed
* @param data - Extra data array to pass to the callback function
* @param data_size - Size of the extra data array being passed
*
* @note Only 1 query can be performed on the same ip:port combination at a time.
* Trying to use a different query type on the same ip:port while another is already taking place will throw an error.
*
* @return Returns unique SQuery ID (integer) on success, 0 on failure (and passes error code to param)
*
*
* Structure for callback function:
*
* sq_query("127.0.0.1", 27015, SQ_Server, "SQueryResults", errcode)
*
* public SQueryResults(squery_id, type, Trie:buffer, Float:query_time, bool:failed, data[], data_size)
*
* @param squery_id - The unique SQuery ID (integer) return value from sq_query()
* @param type - The type of query performed (matches SQ_* constants)
* @param buffer - The buffer containing the server info
* @param query_time - The time in seconds it took for the query to finish
* @param failed - false if results were found, true otherwise
* @param data - The data sent to the sq_query() native
* @param data_size - The size of the data sent to the sq_query() native
*
* @note The buffer is a Trie with key->value pairs for data
* Do not destroy this (or any Arrays or Tries it contains) in the callback!
*
* @return Return value is ignored
*
*/
native sq_query(const ip[],const port,const type,const function[],&error,const timeout=60,const data[]="",const data_size=0);
Error Checking:
There are 2 ways that a query can result in no results:
Problem with sq_query() call
Could not read results in time, so callback function has failed set to true
Error Check #1:
To check the first error, you need to check for a valid SQuery ID.
Spoiler
Code:
new errcode;
new squery_id = sq_query("12.34.56.78", 27015, SQ_Server, "SqueryResults", errcode);
if(squery_id){// successfully called query// now waiting for results}else{// there was a problem// "errcode" contains the error code// callback function is not called}
When this happens, you can get a descriptive string from the error code for reporting:
Spoiler
Code:
/*
* Gets a description of the errcode when sq_query() fails
*
* @param errcode - The error code from the sq_query() function (matches SQError_* constants)
* @param error - The output string to contain the description
* @param len - The max length of the result string
*
* @return The length of the result on success, 0 on failure
*
*/stock sq_error(const errcode,error[],const len)
Here is an example of using this:
Spoiler
Code:
new errcode;
new squery_id = sq_query("12.34.56.78", 27015, SQ_Server, "SqueryResults", errcode);
if(!squery_id){new error[32];
sq_error(errcode, error, charsmax(error));
log_amx("Error on querying server (%d): %s", errcode, error);
}
Error Check #2:
The second error checking takes place inside the callback function:
Spoiler
Code:
public SQueryResults(squery_id, type, Trie:buffer, Float:query_time, bool:failed, data[], data_size){if(failed){// no results were found for the query// buffer is empty and buffer_len is 0log_amx("No results were found for query.");
}else{// found results for query// buffer contains data that needs to be read}}
Buffer Reading:
When the query is successful and the callback function has a buffer that contains data, the buffer needs to be read into variables.
Depending on the query type and response type, the buffer Trie is filled data according to the query.
Server Response (Source)
Source servers and updated CS 1.6 Steam servers use this response.
Should also work for SourceTVs.
Spoiler
Code:
buffer
"response_type" => (string) "source"
"protocol" => (int) Protocol server users (should be 48)
"serveR_name" => (string) Server's host name
"map" => (string) Current map
"game_dir" => (string) Directory containing game files
"game_desc" => (string) Game description, such as "Counter-Strike: Source"
"appid" => (int) Steam's App ID for this game
"num_players" => (int) Number of players currently in the server
"max_players" => (int) Maximum number of players allowed
"num_bots" => (int) Number of bots in the server
"server_type" => (char) Type of server (use sq_servertype())
"windows" => (int) 1 (only exists if the server's OS is Windows)
"linux" => (int) 1 (only exists if the server's OS is Linux)
"password" => (int) 1 (only exists if server has password)
"secure" => (int) 1 (only exists if server is VAC secured)
"game_version" => (string) The version of the game
"game_port" => (int) The server's game port (only exists if response contains it)
"spectator_port" => (int) The spectator port # (only exists if response contains it)
"spectator_name" => (string) The spectator server name (only exists if response contains it)
"game_tags" => (string) The game tag string for the server (only exists if response contains it)
If the server is a The Ship server, then additional data is added to the buffer:
Spoiler
Code:
buffer
"game_mode" => (int) Game mode for the server (use sq_theship_gamemode())
"witness_count" => (int) The minimum number of witnesses for a player to be arrested
"witness_time" => (int) Time in seconds before a player is arrested while being witnessed
Server Response (GoldSource)
Original HL Games which are not updated to the latest 48 protocol.
This should only work for HLTVs, HL1-based games (not CS), and Non-Steam CS servers.
If a Steam server is running dproto, this will be the response that is given back.
Spoiler
Code:
buffer
"response_type" => (string) "goldsource"
"ip" => (string) IP of the server
"server_name" => (string) Server's host name
"map" => (string) Current map
"game_dir" => (string) Directory containing game files
"game_desc" => (string) Game description, such as "Counter-Strike"
"num_players" => (int) Number of players currently in the server
"max_players" => (int) Maximum number of players allowed
"num_bots" => (int) Number of bots in the server
"protocol" => (int) Protocol server uses (should be 47)
"server_type" => (char) Type of server (use sq_servertype())
"windows" => (int) 1 (only exists if the server's OS is Windows)
"linux" => (int) 1 (only exists if the server's OS is Linux)
"password" => (int) 1 (only exists if server has password)
"secure" => (int) 1 (only exists if server is VAC secured)
If the game is a mod for HL, the following will be added to the response buffer:
Spoiler
Code:
buffer
"is_mod" => (int) 1
"mod_url_info" => (string) URL containing information about this mod
"mod_url_download" => (string) URL to download this mod
"mod_version" => (int) Version of the installed mod
"mod_size" => (int) Size of the download for this mod
"mod_server_only" => (int) 1 (only set if this is a server-side mod only)
"mod_custom_cldll" => (int) 1 (only set if this mod uses a custom client DLL)
Players Response
Spoiler
Code:
buffer
"count" => (int) Number of players
"players" => (Array) Players
index => (Trie) Player data
"id" => (int) ID (always 0)
"name" => (string) Player name
"kills" => (int) player kills
"time" => (float) Played time
Example:
Spoiler
Code:
new count, Array:players;
TrieGetCell(buffer, "count", count);
TrieGetCell(buffer, "players", players);
new Trie:player;
new id, name[32], kills, Float:played_time;
for(new i = 0; i < count; i++){
player = ArrayGetCell(players, i);
TrieGetCell(player, "id", id);
TrieGetString(player, "name", name, charsmax(name));
TrieGetCell(player, "kills", kills);
TrieGetCell(player, "time", played_time);
}
buffer
"count" => (int) Number of rules
"rules" => (Array) Rule name strings
"values" => (Array) Rule value strings
Example:
Spoiler
Code:
new count, Array:rules, Array:values;
TrieGetCell(buffer, "count", count);
TrieGetCell(buffer, "rules", rules);
TrieGetCell(buffer, "valuse", values);
new rule[SQ_RULE_NAME_SIZE], value[SQ_RULE_VALUE_SIZE];
for(new i = 0; i < count; i++){
ArrayGetString(rules, i, rule, charsmax(rule));
ArrayGetString(values, i, value, charsmax(value));
// rule "value"// eg. sv_alltalk "1"}
You can use this function to get a description of the server type:
Spoiler
Code:
/*
* Gets a description of the server type based on it's servertype info from the buffer
*
* @param servertype - The servertype retrieved from the server info buffer (matches SERVERTYPE_* constants)
* @param result - The output string to contain the description
* @param len - The max length of the result string
*
* @return The length of the result on success, 0 on failure
*
*/stock sq_servertype(const servertype,result[],const len)
Here is how it is used:
Spoiler
Code:
public SQueryResults(squery_id, type, Trie:buffer, Float:query_time, bool:failed, data[], data_size){if(failed){log_amx("No results were found for query.");
}else{new servertype;
TrieGetCell(buffer, "server_type", servertype);
new servertype_desc[16];
sq_servertype(servertype, servertype_desc, charsmax(servertype_desc));
server_print("Server Type: %s", servertype_desc);
}}
A function exists to convert the time played into 2 formats:
Spoiler
Code:
/*
* Converts the time played in the server into a descriptive string
*
* @param time_played - The time played
* @param output - The output string
* @param output_len - The max length of the output string
* @param steam_format (optional) - If true, it will be in the Steam format of "View Game Info" (eg. 1h 59m 13s, or 12m 4s). If false, it will be in HH:MM:SS format (default: false)
*
* @return The length of the output string
*
*/stock sq_timeplayed(constFloat:time_played,output[],const output_len,bool:steam_format=false)
Here is an example usage:
Spoiler
Code:
public SQueryResults(squery_id, type, Trie:buffer, Float:query_time, bool:failed, data[], data_size){if(failed){log_amx("No results were found for query.");
}else{new pnum, Array:players;
TrieGetCell(buffer, "count", pnum);
TrieGetCell(buffer, "players", players);
new Trie:player;
newFloat:_time;
new time_desc[12];
for(new i = 0; i < pnum; i++){
player = ArrayGetCell(players, i)
TrieGetCell(player, "time", _time);
sq_timeplayed(_time, time_desc, charsmax(time_desc));
server_print("Time for %d: %s", (i + 1), time_desc);
}}}
Use this function for getting a description for The Ship's game mode:
Spoiler
Code:
/*
* Converts The Ship's response for game mode into a string
*
* @param game_mode - The game mode of the server
* @param output - The output string
* @param output_len - The max length of the output string
*
* @return The length of the output string on success, 0 on failure
*
*/stock sq_theship_gamemode(const game_mode,output[],const output_len)
Here is an example usage:
Spoiler
Code:
public SQueryResults(squery_id, type, Trie:buffer, Float:query_time, bool:failed, data[], data_size){if(failed){log_amx("No results were found for query.");
}else{new game_mode;
if(TrieGetCell(buffer, "game_mode", game_mode)){new game_mode_desc[32];
sq_theship_gamemode(game_mode, game_mode_desc, charsmax(game_mode_desc));
}}}
Notes About Callback Function:
When using callback functions, it is necessary to do consider each of the following:
If using the same callback function for different query types, the query type should be check inside the function before reading a buffer:
Spoiler
Code:
public SQueryResults(squery_id, type, buffer[], buffer_len, Float:query_time, bool:failed, data[], data_size){if(failed){log_amx("No results were found for query.");
}else{switch(type){case SQ_Server:
{// read server buffer}case SQ_Players:
{// read players buffer}}}}
If using the same callback for queries that are executed at the same time, you should check the squery_id to know which results are found.
This is because there is no guarantee that the queries are going to give results in the order that you called sq_query().
Spoiler
Code:
new g_squery_id1;
new g_squery_id2;
// ...new errcode, error[32];
g_squery_id1 = sq_query("12.34.56.78", 27015, SQ_Server, "SQueryResults", errcode);
if(!g_squery_id1){
sq_error(errcode, error, charsmax(error));
log_amx("Error on server query #1 (%d): %s", errcode, error);
}
g_squery_id2 = sq_query("87.65.43.21", 27015, SQ_Server, "SQueryResults", errcode);
if(!g_squery_id2){
sq_error(errcode, error, charsmax(error));
log_amx("Error on server query #2 (%d): %s", errcode, error);
}// ...public SQueryResults(squery_id, type, buffer[], buffer_len, Float:query_time, bool:failed, data[], data_size){if(failed){log_amx("No results were found for query.");
}else{switch(squery_id){case g_squery_id1:
{// results for query #1}case g_squery_id2:
{// results for query #2}}}}
Requirements:
AMX Mod X 1.8.1 or higher
Regex Module
Sockets Module
Installation:
server_query.inc should be placed in your scripting/include folder
When using these functions in your own plugin, you must include server_query.
There are more functions inside the include file that are used behind-the-scenes in the other functions or in the core plugin.
server_query_interface.sma is the test plugin I used if you would like to see what I did.
Here are the results from testing (server is the first server I found that had players in my "Internet" servers list).
Servers Info:
Spoiler
Code:
] sq_server 74.91.112.50:27015
Querying 74.91.112.50:27015
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] SQueryCallback(1, 0, buffer, 0.142002, 0, data[], 0)
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Success query for 0 type
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Response Type: goldsource
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Protocol: 47
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Host: [AoD] GunGame 2000FPS[NonSteam][AoDgamerZ.com]
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Map: gg_fy_deagle_dustworld3
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Game Dir: cstrike
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Game Desc: Counter-Strike
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Players: 8/32 (0 bots)
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Server Type: Dedicated
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] OS: Linux
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Password: No
L 06/11/2012 - 21:50:28: [server_query_interface.amxx] Valve Anti-Cheat: Insecure
] sq_server 66.150.155.12:27015
Querying 66.150.155.12:27015
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] SQueryCallback(2, 0, buffer, 0.109550, 0, data[], 0)
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Success query for 0 type
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Response Type: source
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Protocol: 48
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Host: PhooGi's 24/7 BHop Server [kz-na]
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Map: kzarg_challenge_bhop_h
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Game Dir: cstrike
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Game Desc: PhooGi-Bhop
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Players: 11/16 (0 bots)
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Server Type: Dedicated
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] OS: Windows
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Password: No
L 06/11/2012 - 21:51:04: [server_query_interface.amxx] Valve Anti-Cheat: Secure
Players Info:
Spoiler
Code:
] sq_players 66.150.155.12:27015
Querying 66.150.155.12:27015
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] SQueryCallback(3, 1, buffer, 0.224990, 0, data[], 0)
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] Success query for 1 type
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] Players: 11
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] # ID Name Frags Played Time
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 1 0 Osiris -1 15m 6s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 2 0 uG.~ sLoVeR -2 15m 6s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 3 0 XpDc| FdAngeL^ -3 14m 40s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 4 0 pjahjklatqista -1 14m 39s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 5 0 R3 | Superfreak -3 14m 20s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 6 0 Im'NoppaLito`emO -5 12m 34s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 7 0 bene -1 9m 14s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 8 0 pube_star -2 7m 27s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 9 0 UK-A| I'm Back for y 0 3m 56s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 10 0 `VinZ 0 3m 54s
L 06/11/2012 - 21:52:19: [server_query_interface.amxx] 11 0 8 0 2m 6s
Challenge Info:
Spoiler
Code:
] sq_challenge 66.150.155.12:27015
Querying 66.150.155.12:27015
L 06/11/2012 - 21:53:24: [server_query_interface.amxx] SQueryCallback(5, 2, buffer, 0.172973, 0, data[], 0)
L 06/11/2012 - 21:53:24: [server_query_interface.amxx] Success query for 2 type
L 06/11/2012 - 21:53:24: [server_query_interface.amxx] Challenge: 1C 44 B1 1
Ping Info:
Spoiler
Code:
] sq_ping 66.150.155.12:27015
Querying 66.150.155.12:27015
L 06/11/2012 - 21:53:21: [server_query_interface.amxx] SQueryCallback(4, 3, buffer, 0.169982, 0, data[], 0)
L 06/11/2012 - 21:53:21: [server_query_interface.amxx] Success query for 3 type
L 06/11/2012 - 21:53:21: [server_query_interface.amxx] Ping: 17
Rules Info:
Spoiler
Code:
] sq_rules 66.150.155.12:27015
Querying 66.150.155.12:27015
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] SQueryCallback(6, 4, buffer, 0.304016, 0, data[], 0)
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] Success query for 4 type
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] Rules:
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] allow_spectators "90"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] amxmodx_version "1.8.1.3746"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] amx_client_languages "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] amx_language "en"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] amx_nextmap "kzm_fatalisbhop"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] coop "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] Deags_Map_Manage "3.23"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] deathmatch "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] decalfrequency "40"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] edgefriction "2"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] hostage_debug "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] hostage_stop "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] humans_join_team "any"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] kz_plugin_by_lean "(PhooGi)"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] LongJumpStats "2.2b7 Lt.RAT`s edition v3d"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] max_queries_sec "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] max_queries_sec_global "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] max_queries_window "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] metamod_version "1.19p32"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_allowmonsters "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_autokick "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_autoteambalance "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_buytime "1.5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_c4timer "30"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_chattime "5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_consistency "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_fadetoblack "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_flashlight "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_footsteps "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_forcecamera "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_forcechasecam "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_fragsleft "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_freezetime "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_friendlyfire "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_ghostfrequency "0.1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_hostagepenalty "4"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_kickpercent "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_limitteams "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_logdetail "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_logfile "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_logmessages "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_mapvoteratio "0.66"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_maxrounds "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_mirrordamage "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_playerid "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_roundtime "4"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_startmoney "1337"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_timeleft "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_timelimit "19"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_tkpunish "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_windifference "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] mp_winlimit "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] pausable "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] redirect_version "1.0.3.2"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_accelerate "5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_aim "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_airaccelerate "10"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_airmove "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_allowupload "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_alltalk "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_bounce "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_cheats "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_clienttrace "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_clipmode "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_contact ""
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_friction "4"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_gravity "800"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_logblocks "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_maxrate "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_maxspeed "320"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_minrate "30000"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_password "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_proxies "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_region "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_restart "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_restartround "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_stepsize "18"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_stopspeed "75"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_uploadmax "0.5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_voiceenable "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_wateraccelerate "10"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] sv_waterfriction "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_bomb_viewable_check_interval "0.5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_debug_level "0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_examine_time "0.5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_hint_interval_time "10.0"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_look_angle "10"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_look_distance "200"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_message_character_display_time_coefficient "0.07"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_message_minimum_display_time "1"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_message_repeats "5"
L 06/11/2012 - 21:54:24: [server_query_interface.amxx] _tutor_view_distance "1000"
All suggestions and reported bugs are welcome.
Credits
xPaw helped me with few problems. Also, his PHP Source Query Class helped guide me along some questions I had.
__________________
No private work or selling mods.
Quote:
Originally Posted by xPaw
I love you exolent!
Last edited by Exolent[jNr]; 06-12-2012 at 09:34.
Reason: Added credits to xPaw.
You know, I see people doing this a lot, and there's absolutely no need for this:
Code:
register_native("sq_query", "_sq_query");
Unless for some obscure reason you include the .inc in your own plugin, you can use a callback with the same name of the command.
EDIT: you use amxx studio D:
Thanks
I do include the .inc file.
Nothing wrong with AMXX Studio. I use it for the syntax highlighting, the tooltip when writing a function or constant, and the function parameter list box on the right when you are calling a function.
lol I didn't open the include file, they are normally just the native/forward declarations.
Quote:
Nothing wrong with AMXX Studio. I use it for the syntax highlighting, the tooltip when writing a function or constant, and the function parameter list box on the right when you are calling a function.
Quote:
Originally Posted by Bugsy
What's wrong with using AMX-X studio? Just wondering.
I just find it freaking ugly. I was using Pawn Studio on Windows until I discovered there's gedit for Windows! And gedit > all:
You may think "teck no! dark themes suck!", but this one specifically besides being sexy doesn't hurt your eyes if you code in the dark (like I do most of the time)
Last edited by Seta00; 11-11-2010 at 19:48.
Reason: okay that image was a little too big :P
You may think "teck no! dark themes suck!", but this one specifically besides being sexy doesn't hurt your eyes if you code in the dark (like I do most of the time)
Link, please.
__________________
[ Paid Requests ] DO NOT PM ME ABOUT BLOCKMAKER
NO PRIVATE SUPPORT