diff options
Diffstat (limited to 'sourcemod/scripting/include/smlib/server.inc')
| -rw-r--r-- | sourcemod/scripting/include/smlib/server.inc | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/sourcemod/scripting/include/smlib/server.inc b/sourcemod/scripting/include/smlib/server.inc new file mode 100644 index 0000000..ae54cc4 --- /dev/null +++ b/sourcemod/scripting/include/smlib/server.inc @@ -0,0 +1,135 @@ +#if defined _smlib_server_included + #endinput +#endif +#define _smlib_server_included + +#include <sourcemod> +#include <smlib/general> + +/* + * Gets the server's public/external (default) or + * private/local (usually server's behind a NAT) IP. + * If your server is behind a NAT Router, you need the SteamTools + * extension available at http://forums.alliedmods.net/showthread.php?t=129763 + * to get the public IP. <steamtools> has to be included BEFORE <smlib>. + * If the server is not behind NAT, the public IP is the same as the private IP. + * + * @param public Set to true to retrieve the server's public/external IP, false otherwise. + * @return Long IP or 0 if the IP couldn't be retrieved. + */ +stock int Server_GetIP(bool public_=true) +{ + int ip = 0; + + static ConVar cvHostip = null; + + if (cvHostip == INVALID_HANDLE) { + cvHostip = FindConVar("hostip"); + MarkNativeAsOptional("Steam_GetPublicIP"); + } + + if (cvHostip != INVALID_HANDLE) { + ip = cvHostip.IntValue; + } + + if (ip != 0 && IsIPLocal(ip) == public_) { + ip = 0; + } + +#if defined _steamtools_included + if (ip == 0) { + if (CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "Steam_GetPublicIP") == FeatureStatus_Available) { + int octets[4]; + Steam_GetPublicIP(octets); + + ip = + octets[0] << 24 | + octets[1] << 16 | + octets[2] << 8 | + octets[3]; + + if (IsIPLocal(ip) == public_) { + ip = 0; + } + } + } +#endif + + return ip; +} + +/* + * Gets the server's public/external (default) or + * private/local (usually server's behind a NAT) as IP String in dotted format. + * If your server is behind a NAT Router, you need the SteamTools + * extension available at http://forums.alliedmods.net/showthread.php?t=129763 + * to get the public IP. <steamtools> has to be included BEFORE <smlib>. + * If the public IP couldn't be found, an empty String is returned. + * If the server is not behind NAT, the public IP is the same as the private IP. + * + * @param buffer String buffer (size=16) + * @param size String buffer size. + * @param public Set to true to retrieve the server's public/external IP, false otherwise. + * @return True on success, false otherwise. + */ +stock bool Server_GetIPString(char[] buffer, int size, bool public_=true) +{ + int ip; + + if ((ip = Server_GetIP(public_)) == 0) { + buffer[0] = '\0'; + return false; + } + + LongToIP(ip, buffer, size); + + return true; +} + +/* + * Gets the server's local port. + * + * @noparam + * @return The server's port, 0 if there is no port. + */ +stock int Server_GetPort() +{ + static ConVar cvHostport = null; + + if (cvHostport == INVALID_HANDLE) { + cvHostport = FindConVar("hostport"); + } + + if (cvHostport == INVALID_HANDLE) { + return 0; + } + + int port = cvHostport.IntValue; + + return port; +} + +/* + * Gets the server's hostname + * + * @param hostname String buffer + * @param size String buffer size + * @return True on success, false otherwise. + */ +stock bool Server_GetHostName(char[] buffer, int size) +{ + static ConVar cvHostname = null; + + if (cvHostname == INVALID_HANDLE) { + cvHostname = FindConVar("hostname"); + } + + if (cvHostname == INVALID_HANDLE) { + buffer[0] = '\0'; + return false; + } + + cvHostname.GetString(buffer, size); + + return true; +} |
