1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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 Server_GetIP(bool:public_=true)
{
new ip = 0;
static Handle:cvHostip = INVALID_HANDLE;
if (cvHostip == INVALID_HANDLE) {
cvHostip = FindConVar("hostip");
MarkNativeAsOptional("Steam_GetPublicIP");
}
if (cvHostip != INVALID_HANDLE) {
ip = GetConVarInt(cvHostip);
}
if (ip != 0 && IsIPLocal(ip) == public_) {
ip = 0;
}
#if defined _steamtools_included
if (ip == 0) {
if (CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "Steam_GetPublicIP") == FeatureStatus_Available) {
decl 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(String:buffer[], size, bool:public_=true)
{
new 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 Server_GetPort()
{
static Handle:cvHostport = INVALID_HANDLE;
if (cvHostport == INVALID_HANDLE) {
cvHostport = FindConVar("hostport");
}
if (cvHostport == INVALID_HANDLE) {
return 0;
}
new port = GetConVarInt(cvHostport);
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(String:buffer[], size)
{
static Handle:cvHostname = INVALID_HANDLE;
if (cvHostname == INVALID_HANDLE) {
cvHostname = FindConVar("hostname");
}
if (cvHostname == INVALID_HANDLE) {
buffer[0] = '\0';
return false;
}
GetConVarString(cvHostname, buffer, size);
return true;
}
|