ACSUtils Wiki

An ACS library for ZDoom-based ports

User Tools

Site Tools


client_server_detection

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
client_server_detection [2019/08/26 04:28] korshunclient_server_detection [2019/09/05 23:54] korshun
Line 1: Line 1:
-====== Clientside/Serverside detection ======+====== Clientside/serverside detection ====== 
 + 
 +===== Introduction =====
  
 You can check if a script is running serverside, clientside or in singleplayer using functions provided by ACSUtils. You can check if a script is running serverside, clientside or in singleplayer using functions provided by ACSUtils.
 +
  
 ===== Terminology ===== ===== Terminology =====
Line 14: Line 17:
 Zandronum multiplayer emulation is singleplayer. Just like in singleplayer, the same engine instance is both a server and a client. Zandronum multiplayer emulation is singleplayer. Just like in singleplayer, the same engine instance is both a server and a client.
  
-In regular Zandronum multiplayer, the server is only a server and clients are only clients, obviously.+In real Zandronum multiplayer, the server is only a server and clients are only clients, obviously.
  
 Yet, if Zandronum were to allow hosting non-dedicated servers, where a player allows others to connect to their singleplayer game without launching a separate engine instance, the hosting player would be both a server and a client, while other players in the game would be only clients. Yet, if Zandronum were to allow hosting non-dedicated servers, where a player allows others to connect to their singleplayer game without launching a separate engine instance, the hosting player would be both a server and a client, while other players in the game would be only clients.
Line 43: Line 46:
 </code> </code>
  
-===== How the functions work =====+You can also make sure that a serverside-only function is not called on the client, and a clientside-only function is not called on the server. 
 + 
 +<code> 
 +function ServersideOnlyFunction(void) 
 +
 +    // writing if (IsClient()) would incorrectly display the warning in singleplayer. 
 +    if (!IsServer()) 
 +        printbold(s:"Error: ServersideOnlyFunction must not be called clientside"); 
 +         
 +    ... 
 +
 + 
 +function ClientsideOnlyFunction(void) 
 +
 +    // writing if (IsServer()) would incorrectly display the warning in singleplayer. 
 +    if (!IsClient()) 
 +        printbold(s:"Error: ClientsideOnlyFunction must not be called serverside"); 
 +         
 +    ... 
 +
 +</code> 
 + 
 +===== How it works =====
  
 All detection of clients and servers is founded on two functions: [[zdoom>ConsolePlayerNumber]] and [[zan>IsNetworkGame]] (formerly known as ''IsMultiplayer''). All detection of clients and servers is founded on two functions: [[zdoom>ConsolePlayerNumber]] and [[zan>IsNetworkGame]] (formerly known as ''IsMultiplayer'').
Line 49: Line 74:
 ''IsClient()'' simply checks if [[zdoom>ConsolePlayerNumber]] is not negative. ''IsClient()'' simply checks if [[zdoom>ConsolePlayerNumber]] is not negative.
  
-''IsServer()'' is more complicated. It returns true if [[zdoom>ConsolePlayerNumber]] is negative. But if it's not negative, it needs to distinguish between multiplayer emulation and real multiplayer. The function needs to return true in multiplayer emulation but false in real multiplayer.+''IsServer()'' is more complicated. It returns true if [[zdoom>ConsolePlayerNumber]] is negative. But if it's not negative, it needs to distinguish between multiplayer emulation and real multiplayer. It checks if the multiplayer is real using [[zan>IsNetworkGame]]. But calling this function in ZDoom/GZDoom crashes the engine. Therefore, before calling ''IsNetworkGame'', it checks if the engine is Zandronum using [[source_port_detection|IsZandronum]].
  
-It checks if the multiplayer is real using [[zan>IsNetworkGame]]. But calling this function in ZDoom/GZDoom crashes the engine. Therefore, before calling ''IsNetworkGame'', it checks if the engine is Zandronum using [[source_port_detection|IsZandronum]].+If the engine is not Zandronum, the function returns true, because in ZDoom/GZDoom multiplayer all players run gameplay code.
  
-''IsServerOnly'' and ''IsClientOnly'' simply return ''IsServer() && !IsClient()'' and''IsClient() && !IsServer()'', respectively.+If the engine is Zandronum, the function returns false if it's real multiplayer, true if it's multiplayer emulation.
  
 +''IsServerOnly'' and ''IsClientOnly'' simply return ''IsServer() && !IsClient()'' and ''IsClient() && !IsServer()'', respectively.
  
client_server_detection.txt · Last modified: 2019/09/05 23:54 by korshun