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
client_server_detection [2019/08/26 04:18] korshunclient_server_detection [2019/09/05 23:54] (current) – [Writing robust multiplayer code] 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 30: Line 33:
 ===== Writing robust multiplayer code ===== ===== Writing robust multiplayer code =====
  
-The definitions above enable writing ACS code that functions correctly in both singleplayer and multiplayer without singleplayer being a special case. Just make sure +The definitions above enable writing ACS code that functions correctly in both singleplayer and multiplayer without singleplayer being a special case. Using ''IsClient'' and ''IsServer'' correctly ensures that your mod runs correctly in both singleplayer and multiplayer: 
 + 
 +<code acs> 
 +if (IsServer()) 
 +
 +    // Run serverside gameplay code. 
 +
 +if (IsClient()) 
 +
 +    // Draw hud, spawn effects. 
 +
 +</code> 
 + 
 +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 was called clientside"); 
 +         
 +    ... 
 +
 + 
 +function ClientsideOnlyFunction(void) 
 +
 +    // writing if (IsServer()) would incorrectly display the warning in singleplayer. 
 +    if (!IsClient()) 
 +        printbold(s:"Error: ClientsideOnlyFunction was 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'').
  
-===== How the functions work =====+''IsClient()'' simply checks if [[zdoom>ConsolePlayerNumber]] is not negative.
  
-All detection of clients and servers is founded on two functions: [[zdoom>ConsolePlayerNumber]] and [[zan>IsNetworkGame]] (formerly known as [[zan>IsMultiplayer]]).+''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]].
  
-''IsClient()'' simply checks if [[zdoom>ConsolePlayerNumber]] is not -1.+If the engine is not Zandronum, the function returns true, because in ZDoom/GZDoom multiplayer all players run gameplay code.
  
 +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.1566782285.txt.gz · Last modified: 2019/08/26 04:18 by korshun