I don't need to test my programs. I have an error-correcting modem.

Difference between revisions of "XServerQuery"

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search
(Introduction)
(Introduction)
 
(44 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Temp Notes: ==
 
<font color="#ff0000">This site is in work, so pls forgive me some pointless and/or bad/no english texts.</font>
 
 
 
== Introduction ==
 
== Introduction ==
XServerQuery is a new Version of IpServer.UdpServerQuery.
+
XServerQuery is a new Version of IpServer (classes UdpServerQuery and UdpServerUplink).
 +
 
 +
The latest version is 2.0.0.
  
XServerQuery is a much-improved way of showing your server's current
+
It is a much-improved way of showing your server's current
 
information. There are new headings like "Spectators" and "Protection
 
information. There are new headings like "Spectators" and "Protection
 
Type" as well as the country of the current players.
 
Type" as well as the country of the current players.
Line 11: Line 10:
 
There was some pointless commands removed and many new things added (see Query commands).
 
There was some pointless commands removed and many new things added (see Query commands).
  
== Where i can find it? ==
+
The Crash-Protection of SecureValidate is now working with XSQ. Thanks goes to JustDoIt.
*a link is comming soon
+
  
 
== How to Install? ==
 
== How to Install? ==
1. remove the old querymod, simply add at the front a semicolon.
+
1. Extract the XServerQuery.u file to your Server's System directory.
It should show so:
+
<pre>;ServerActors=IpServer.UdpServerQuery</pre>
+
  
2. add a new serveractor line:
+
2. Stop your Server.
<pre>ServerActors=XServerQuery.UdpXServerQuery</pre>
+
 
 +
3. Open your Server's "UnrealTournament.ini" file and then locate this
 +
line in the ServerActors. When you do simply add a ';' at the front, so
 +
your line looks like this:
 +
 
 +
<pre>
 +
;ServerActors=IpServer.UdpServerQuery
 +
;ServerActors=IpServer.UdpServerUplink MasterServerAddress=utmaster.epicgames.com MasterServerPort=27900
 +
;ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
 +
</pre>
 +
 
 +
- If you have SecureValidate installed:
 +
<pre>
 +
;ServerActors=SecureValidate.SVUdpServerQuery
 +
;ServerActors=SecureValidate.SVUdpServerUplink MasterServerAddress=utmaster.epicgames.com MasterServerPort=27900
 +
;ServerActors=SecureValidate.SVUdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
 +
</pre>
 +
 
 +
 
 +
4. Now add the following new actors to your ServerActors list:
 +
 
 +
<pre>
 +
ServerActors=XServerQuery.XServerQuery
 +
ServerActors=XServerQuery.XServerUplink MasterServerAddress=utmaster.epicgames.com MasterServerPort=27900
 +
ServerActors=XServerQuery.XServerUplink MasterServerAddress=333networks.com MasterServerPort=27900
 +
ServerActors=XServerQuery.XServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
 +
</pre>
 +
- You can add optional other master servers to the Uplink list.
 +
 
 +
 
 +
5. If you want to use IpToCountry to show the current country of the players
 +
and server, then you need to install IpToCountry.
 +
If you already are running IpToCountry then you are fine.
 +
 
 +
6. Go to the next heading <b>Settings</b> before going to step 7.
 +
 
 +
7. Save your server's "UnrealTournament.ini" file and restart your Server as usual.
  
 
== Settings ==
 
== Settings ==
 +
1. Add the following lines at the end of your "UnrealTournament.ini":
 +
<pre>[XServerQuery.UdpXServerQuery]
 +
NetAddress=
 +
Homepage=www.example-hp.com
 +
bSendMailURL=False
 +
bShowProtection=True
 +
bShowSpectators=True
 +
bShowPlayerCountry=True
 +
iMaxConnPerIPPerSec=2
 +
iNumPacketsBeforLog=8
 +
bLogSpecialQuerys=True
 +
bLogUnknownQuerys=True</pre>
 +
 +
2. Change the settings as you want them.
 
<pre>
 
<pre>
[XServerQuery.UdpXServerQuery]
+
NetAddress // This is optional and will only needed if the server don't returns the real networkaddress for ITC.
bShowProtaction=True // Returns True if the server is protected.
+
// Server will auto set IP if found.
bShowCPName=True // if bShowProtaction=True then return the name of the CP.
+
Homepage; // Returns your homepage if set. Adding "http://" or "https://" in front of your page will enable the link function in XBrowser for it.
bShowSpectators=True // Returns spectator infos.
+
bSendMailURL; // If True XSQ will send the admin e-mail with "mailto:" in front and will enable the link function in XBrowser for it.
bShowPlayerCountry=True // Returns the players country.
+
bShowProtection; // Valid values are "True", "Hidden" and something else mean "False".
Homepage=www.yourhomepage.com // Returns your homepage if set.
+
bShowSpectators; // Spectator informations will send, if your server allows spectators. False will hide specs on the player list.
 +
bShowPlayerCountry; // Allow sending the players country, if IPtoCountry is installed.
 +
iMaxConnPerIPPerSec; // Spam security. How many requests can a client send per second. 2 is the minimum.
 +
iNumPacketsBeforLog; // Spam security. After how many requests the server will log this client. 1 is the minimum.
 +
bLogSpecialQuerys; // Log query errors and 'secure' querys.
 +
bLogUnknownQuerys; // Log unknown querys.
 
</pre>
 
</pre>
 +
 +
<font color="#ff0000"><b>Note: When you updating from a older version, delete (and backup before) the old settings!!</b></font>
  
 
== Query commands ==
 
== Query commands ==
Line 39: Line 92:
 
In this case you not only send a QueryType, you send a QueryValue too. Only "\info\" will return old infos.
 
In this case you not only send a QueryType, you send a QueryValue too. Only "\info\" will return old infos.
  
<Das hat zur folge, dass, wenn der Server XServerQuery verwendet, er dir die neuen Infos sendet, ansonsten gibt er dir die alten Infos zurück.
+
That has to follow that, if the server uses XServerQuery, he sends you the new information, otherwise he'll give you back the old information.
  
Damit sollte es keine probleme mit der kommunikation zwischen "alten" Browsern und "neueren" Servern bzw. umgekehrt, geben.>
+
So there should be no problems with the communication between "old" browsers and "newer" servers or vice versa.
  
<font color="#ff0000">Note: <einige informationen wurden entfernt, da diese entweder '''hier''' nicht gebraucht werden, oder veraltet sind und nicht mehr benutzt werden.></font>
+
<font color="#ff0000">Note: Some information was removed because they are either '''here''' not needed, or outdated and they are no longer in use.</font>
  
 
<pre>
 
<pre>
Line 49: Line 102:
 
\Hostname\[Level.Game.GameReplicationInfo.ServerName]
 
\Hostname\[Level.Game.GameReplicationInfo.ServerName]
 
\Hostport\[Level.Game.GetServerPort()]
 
\Hostport\[Level.Game.GetServerPort()]
\CountryS\[Country-Prefix if IpToCountry used else none]
+
\CountryS\[Country-Code if IpToCountry used] //optional
\Protaction\[returns "False", "True", "Hidden" or eg.: "ACEv08h"]
+
\NewNet\[NN Version eg.: "0.9"] //optional
 +
\Protection\[returns "False", "Hidden" or eg.: "ACEv08h"]
 
\Password\[string(Level.ConsoleCommand("get Engine.GameInfo GamePassword")!="")]
 
\Password\[string(Level.ConsoleCommand("get Engine.GameInfo GamePassword")!="")]
\NumPlayers\[NumAllPlayers]
+
\NumPlayers\[Level.Game.NumPlayers]
\MaxPlayers\[Level.Game.MaxPlayers + Level.Game.NumSpectators]
+
\MaxPlayers\[Level.Game.MaxPlayers]
 
\GameType\[GetItemName(string(Level.Game.Class))]
 
\GameType\[GetItemName(string(Level.Game.Class))]
 
\MapName\[Left(string(Level), InStr(string(Level), "."))]
 
\MapName\[Left(string(Level), InStr(string(Level), "."))]
Line 62: Line 116:
 
=== \rules\xserverquery ===
 
=== \rules\xserverquery ===
 
<pre>
 
<pre>
\AdminName\[Level.Game.GameReplicationInfo.AdminName]
+
\AdminName\[Level.Game.GameReplicationInfo.AdminName] //optional
\AdminEMail\[Level.Game.GameReplicationInfo.AdminEmail]
+
\AdminEMail\[Level.Game.GameReplicationInfo.AdminEmail] //optional
\Homepage\Homepage
+
\Homepage\[Homepage] //optional
 
\Spectators\[returns "Level.Game.NumSpectators/Level.Game.MaxSpectators", "False" or "Hidden"]
 
\Spectators\[returns "Level.Game.NumSpectators/Level.Game.MaxSpectators", "False" or "Hidden"]
 
\NetMode\[returns "Dedicated Server" or "Listen Server"]
 
\NetMode\[returns "Dedicated Server" or "Listen Server"]
 
\GameStyle\[returns "Turbo", "Hardcore" or "Classic"]
 
\GameStyle\[returns "Turbo", "Hardcore" or "Classic"]
 
\Tournament\[DeathMatchPlus(Level.Game).bTournament]
 
\Tournament\[DeathMatchPlus(Level.Game).bTournament]
\MinNetVer\[Level.MinNetVersion]
+
 
 
\TimeLimit\[DeathMatchPlus(Level.Game).TimeLimit]
 
\TimeLimit\[DeathMatchPlus(Level.Game).TimeLimit]
 
+
\RemainingTime\[DeathMatchPlus(Level.Game).RemainingTime or DeathMatchPlus(Level.Game).ElapsedTime]
... if no TeamGame
+
\FragLimit\[DeathMatchPlus(Level.Game).FragLimit] //optional
\FragLimit\[DeathMatchPlus(Level.Game).FragLimit]
+
\GoalTeamScore\[TeamGamePlus(Level.Game).GoalTeamScore] //optional
... else
+
\FriendlyFire\[TeamGamePlus(Level.Game).FriendlyFireScale] //optional
\GoalTeamScore\[TeamGamePlus(Level.Game).GoalTeamScore]
+
\MaxTeams\[TeamGamePlus(Level.Game).MaxTeams] //optional
\FriendlyFire\[TeamGamePlus(Level.Game).FriendlyFireScale]
+
\TeamName_#\[TeamGamePlus(Level.Game).Teams[#].TeamName] //optional
\MaxTeams\[TeamGamePlus(Level.Game).MaxTeams]
+
\TeamScore_#\[TeamGamePlus(Level.Game).Teams[#].Score] //optional
\TeamName_#\[TeamGamePlus(Level.Game).Teams[#].TeamName]
+
\TeamSize_#\[TeamGamePlus(Level.Game).Teams[#].Size] //optional
\TeamScore_#\[TeamGamePlus(Level.Game).Teams[#].Score]
+
\TeamSize_#\[TeamGamePlus(Level.Game).Teams[#].Size]
+
... end if
+
  
 
\MapTitle\[Level.Title]
 
\MapTitle\[Level.Title]
 
\MapAuthor\[Level.Author]
 
\MapAuthor\[Level.Author]
 
\IdealPlayerCount\[Level.IdealPlayerCount]
 
\IdealPlayerCount\[Level.IdealPlayerCount]
 
 
\MinPlayers\[DeathMatchPlus(Level.Game).MinPlayers]
 
\MinPlayers\[DeathMatchPlus(Level.Game).MinPlayers]
\BotSkill\[class'ChallengeBotInfo'.default.Skills[Level.Game.Difficulty]]
+
\BotSkill\[class'ChallengeBotInfo'.default.Skills[Level.Game.Difficulty]] //optional
 
\Mutators\[Level.Game.EnabledMutators]
 
\Mutators\[Level.Game.EnabledMutators]
 
</pre>
 
</pre>
Line 95: Line 145:
 
<pre>
 
<pre>
 
\Player_#\[P.PlayerReplicationInfo.PlayerName]
 
\Player_#\[P.PlayerReplicationInfo.PlayerName]
\CountryC_#\[players country-prefix or "none"]
+
\CountryC_#\[players Country-Code if IpToCountry used] //optional
 
\Ping_#\[P.ConsoleCommand("GETPING")]
 
\Ping_#\[P.ConsoleCommand("GETPING")]
\Time_#\[Play Time //FIXME:TimeSeconds are not accurate to real seconds.]
+
\Time_#\[TimeResult]
\Frags_#\[P.PlayerReplicationInfo.Score]
+
\Frags_#\[P.PlayerReplicationInfo.Score] //optional
\Deaths_#\[P.PlayerReplicationInfo.Deaths]
+
\Deaths_#\[P.PlayerReplicationInfo.Deaths] //optional
\Health_#\[P.Health]
+
\Health_#\[P.Health] //optional
\Spree_#\[P.Spree]
+
\Spree_#\[P.Spree] //optional
 
\Team_#\[P.PlayerReplicationInfo.Team]
 
\Team_#\[P.PlayerReplicationInfo.Team]
 
\Mesh_#\[P.Menuname]
 
\Mesh_#\[P.Menuname]
\Skin_#\[SkinName]
+
\Skin_#\[SkinName] //optional
\Face_#\[FaceName]
+
\Face_#\[FaceName] //optional
 
</pre>
 
</pre>
  
Note: The Players Time don't count like ingame and both are not accurate to real minutes.
+
<s>Note: The Players Time don't count like ingame and both are not accurate to real minutes.</s>
  
I actually using this, maybe someone has a better solution:
+
Note: Players Time is fixed, accurate and returns now in seconds.
<uscript>
+
// Epic has done this in Scoreboards:
+
Time = Max(1, (Level.TimeSeconds + PlayerOwner.PlayerReplicationInfo.StartTime - PRI.StartTime)/60);
+
 
+
// if i use the same, it does not return the same Value. So i used this:
+
GameSpeed = Level.Game.GameSpeed * 100;
+
Seconds = (Level.TimeSeconds / GameSpeed) * 100;
+
StartTime = (float(P.PlayerReplicationInfo.StartTime) / GameSpeed) * 100;
+
TimeResult = Max(1, (Seconds - StartTime)/60);
+
 
+
ResultSet = ResultSet$"\\Time_"$PlayerNum$"\\"$TimeResult;
+
</uscript>
+
  
 
=== \status\xserverquery ===
 
=== \status\xserverquery ===
Line 128: Line 166:
  
 
Only QueryType is like the old one: \basic\\info\\rules\\players\
 
Only QueryType is like the old one: \basic\\info\\rules\\players\
 +
 +
=== \teams\ ===
 +
Its the same like in \rules\xserverquery, just separate to support the UT Watcher program.
 +
Thanks goes to El Muerte.
 +
<pre>
 +
\team_#\[TeamGamePlus(Level.Game).Teams[#].TeamName]
 +
\score_#\[TeamGamePlus(Level.Game).Teams[#].Score]
 +
\size_#\[TeamGamePlus(Level.Game).Teams[#].Size]
 +
</pre>
  
 
=== \echo\ ===
 
=== \echo\ ===

Latest revision as of 05:24, 18 December 2014

Introduction[edit]

XServerQuery is a new Version of IpServer (classes UdpServerQuery and UdpServerUplink).

The latest version is 2.0.0.

It is a much-improved way of showing your server's current information. There are new headings like "Spectators" and "Protection Type" as well as the country of the current players.

There was some pointless commands removed and many new things added (see Query commands).

The Crash-Protection of SecureValidate is now working with XSQ. Thanks goes to JustDoIt.

How to Install?[edit]

1. Extract the XServerQuery.u file to your Server's System directory.

2. Stop your Server.

3. Open your Server's "UnrealTournament.ini" file and then locate this line in the ServerActors. When you do simply add a ';' at the front, so your line looks like this:

;ServerActors=IpServer.UdpServerQuery
;ServerActors=IpServer.UdpServerUplink MasterServerAddress=utmaster.epicgames.com MasterServerPort=27900
;ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900

- If you have SecureValidate installed:

;ServerActors=SecureValidate.SVUdpServerQuery
;ServerActors=SecureValidate.SVUdpServerUplink MasterServerAddress=utmaster.epicgames.com MasterServerPort=27900
;ServerActors=SecureValidate.SVUdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900


4. Now add the following new actors to your ServerActors list:

ServerActors=XServerQuery.XServerQuery
ServerActors=XServerQuery.XServerUplink MasterServerAddress=utmaster.epicgames.com MasterServerPort=27900
ServerActors=XServerQuery.XServerUplink MasterServerAddress=333networks.com MasterServerPort=27900
ServerActors=XServerQuery.XServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900

- You can add optional other master servers to the Uplink list.


5. If you want to use IpToCountry to show the current country of the players and server, then you need to install IpToCountry. If you already are running IpToCountry then you are fine.

6. Go to the next heading Settings before going to step 7.

7. Save your server's "UnrealTournament.ini" file and restart your Server as usual.

Settings[edit]

1. Add the following lines at the end of your "UnrealTournament.ini":

[XServerQuery.UdpXServerQuery]
NetAddress=
Homepage=www.example-hp.com
bSendMailURL=False
bShowProtection=True
bShowSpectators=True
bShowPlayerCountry=True
iMaxConnPerIPPerSec=2
iNumPacketsBeforLog=8
bLogSpecialQuerys=True
bLogUnknownQuerys=True

2. Change the settings as you want them.

NetAddress              // This is optional and will only needed if the server don't returns the real networkaddress for ITC.
                        // Server will auto set IP if found.
Homepage;               // Returns your homepage if set. Adding "http://" or "https://" in front of your page will enable the link function in XBrowser for it.
bSendMailURL;           // If True XSQ will send the admin e-mail with "mailto:" in front and will enable the link function in XBrowser for it.
bShowProtection;        // Valid values are "True", "Hidden" and something else mean "False".
bShowSpectators;        // Spectator informations will send, if your server allows spectators. False will hide specs on the player list.
bShowPlayerCountry;     // Allow sending the players country, if IPtoCountry is installed.
iMaxConnPerIPPerSec;    // Spam security. How many requests can a client send per second. 2 is the minimum.
iNumPacketsBeforLog;    // Spam security. After how many requests the server will log this client. 1 is the minimum.
bLogSpecialQuerys;      // Log query errors and 'secure' querys.
bLogUnknownQuerys;      // Log unknown querys.

Note: When you updating from a older version, delete (and backup before) the old settings!!

Query commands[edit]

\basic\[edit]

Same like here UT_Server_Query

\info\xserverquery[edit]

In this case you not only send a QueryType, you send a QueryValue too. Only "\info\" will return old infos.

That has to follow that, if the server uses XServerQuery, he sends you the new information, otherwise he'll give you back the old information.

So there should be no problems with the communication between "old" browsers and "newer" servers or vice versa.

Note: Some information was removed because they are either here not needed, or outdated and they are no longer in use.

\XServerQuery\XVersion
\Hostname\[Level.Game.GameReplicationInfo.ServerName]
\Hostport\[Level.Game.GetServerPort()]
\CountryS\[Country-Code if IpToCountry used] //optional
\NewNet\[NN Version eg.: "0.9"] //optional
\Protection\[returns "False", "Hidden" or eg.: "ACEv08h"]
\Password\[string(Level.ConsoleCommand("get Engine.GameInfo GamePassword")!="")]
\NumPlayers\[Level.Game.NumPlayers]
\MaxPlayers\[Level.Game.MaxPlayers]
\GameType\[GetItemName(string(Level.Game.Class))]
\MapName\[Left(string(Level), InStr(string(Level), "."))]
\GameVer\[Level.EngineVersion]
\MinNetVer\[Level.MinNetVersion]

\rules\xserverquery[edit]

\AdminName\[Level.Game.GameReplicationInfo.AdminName] //optional
\AdminEMail\[Level.Game.GameReplicationInfo.AdminEmail] //optional
\Homepage\[Homepage] //optional
\Spectators\[returns "Level.Game.NumSpectators/Level.Game.MaxSpectators", "False" or "Hidden"]
\NetMode\[returns "Dedicated Server" or "Listen Server"]
\GameStyle\[returns "Turbo", "Hardcore" or "Classic"]
\Tournament\[DeathMatchPlus(Level.Game).bTournament]

\TimeLimit\[DeathMatchPlus(Level.Game).TimeLimit]
\RemainingTime\[DeathMatchPlus(Level.Game).RemainingTime or DeathMatchPlus(Level.Game).ElapsedTime]
\FragLimit\[DeathMatchPlus(Level.Game).FragLimit] //optional
\GoalTeamScore\[TeamGamePlus(Level.Game).GoalTeamScore] //optional
\FriendlyFire\[TeamGamePlus(Level.Game).FriendlyFireScale] //optional
\MaxTeams\[TeamGamePlus(Level.Game).MaxTeams] //optional
\TeamName_#\[TeamGamePlus(Level.Game).Teams[#].TeamName] //optional
\TeamScore_#\[TeamGamePlus(Level.Game).Teams[#].Score] //optional
\TeamSize_#\[TeamGamePlus(Level.Game).Teams[#].Size] //optional

\MapTitle\[Level.Title]
\MapAuthor\[Level.Author]
\IdealPlayerCount\[Level.IdealPlayerCount]
\MinPlayers\[DeathMatchPlus(Level.Game).MinPlayers]
\BotSkill\[class'ChallengeBotInfo'.default.Skills[Level.Game.Difficulty]] //optional
\Mutators\[Level.Game.EnabledMutators]

\players\xserverquery[edit]

\Player_#\[P.PlayerReplicationInfo.PlayerName]
\CountryC_#\[players Country-Code if IpToCountry used] //optional
\Ping_#\[P.ConsoleCommand("GETPING")]
\Time_#\[TimeResult]
\Frags_#\[P.PlayerReplicationInfo.Score] //optional
\Deaths_#\[P.PlayerReplicationInfo.Deaths] //optional
\Health_#\[P.Health] //optional
\Spree_#\[P.Spree] //optional
\Team_#\[P.PlayerReplicationInfo.Team]
\Mesh_#\[P.Menuname]
\Skin_#\[SkinName] //optional
\Face_#\[FaceName] //optional

Note: The Players Time don't count like ingame and both are not accurate to real minutes.

Note: Players Time is fixed, accurate and returns now in seconds.

\status\xserverquery[edit]

With QueryValue its something like: \info\xserverquery\rules\xserverquery\players\xserverquery

Only QueryType is like the old one: \basic\\info\\rules\\players\

\teams\[edit]

Its the same like in \rules\xserverquery, just separate to support the UT Watcher program. Thanks goes to El Muerte.

\team_#\[TeamGamePlus(Level.Game).Teams[#].TeamName]
\score_#\[TeamGamePlus(Level.Game).Teams[#].Score]
\size_#\[TeamGamePlus(Level.Game).Teams[#].Size]

\echo\[edit]

Same like here UT_Server_Query, but it returns only "\echo_replay\<your text>".

\level_property\, \game_property\ and \player_property\[edit]

This QueryType was removed, because of some secure things.