Networking
Singleplayer
Singleplayer is the easiest of all, as there's no networking, so everything is already synced for you!
In singleplayer the global variable CLIENT
is set to true and Game.IsSingleplayer
is also true.
Server
The server is responsible for receiving inputs from clients and syncing state with all other clients.
The global variable SERVER
is set to true if we are a server.
The only difference between a Dedicated Server and a Player-Hosted Server in Barotrauma is the fact that the latter uses Steam Networking to communicate with clients, if you for some reason want to know if you are running inside a Dedicated Server, you can use Game.IsDedicated.
Client
The client is the one who connects to servers. The global variable CLIENT
is set to true and Game.IsMultiplayer
is also true.
Syncing
Serializable Properties
Serializable Properties are special members that are able to be synced with clients (and also with the server in some cases), they are very useful for server-side only code.
Example showing how to sync the sprite color of an item without any client-side code:
local item = ...
item.SpriteColor = Color(0, 0, 255, 255)
local property = item.SerializableProperties[Identifier("SpriteColor")]
Networking.CreateEntityEvent(item, Item.ChangePropertyEventData(property, item))
This is also possible to do with item components:
local item = ...
local light = item.GetComponentString("LightComponent")
light.LightColor = Color(0, 0, 255, 255)
local property = light.SerializableProperties[Identifier("LightColor")]
Networking.CreateEntityEvent(item, Item.ChangePropertyEventData(property, light))
Sending Custom Net Messages
This is one of the ways you can send data between the client and server.
Example on sending data from client to server
if CLIENT then
-- send from client to server
local message = Networking.Start("something")
message.WriteString("hello")
Networking.Send(message)
end
if SERVER then
-- receive in server
Networking.Receive("something", function(message, client)
print(client.Name .. " sent " .. message.ReadString())
end)
end
Example on sending data from server to client
if CLIENT then
Networking.Receive("something", function(message)
print(message.ReadString())
end)
end
if SERVER then
-- send from server to client
local message = Networking.Start("something")
message.WriteString("hello")
Networking.Send(message, Client.ClientList[1].Connection)
end