Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaServer/ServerSource/Steam/SteamManager.cs

109 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Barotrauma.Networking;
namespace Barotrauma.Steam
{
partial class SteamManager
{
private static void InitializeProjectSpecific() { }
private static bool IsInitializedProjectSpecific
=> Steamworks.SteamServer.IsValid;
public static bool CreateServer(Networking.GameServer server, bool isPublic)
{
Steamworks.SteamServerInit options = new Steamworks.SteamServerInit("Barotrauma", "Barotrauma")
{
GamePort = (ushort)server.Port,
QueryPort = isPublic ? (ushort)server.QueryPort : (ushort)0,
Mode = isPublic ? Steamworks.InitServerMode.Authentication : Steamworks.InitServerMode.NoAuthentication,
IpAddress = server.ServerSettings.ListenIPAddress
};
//options.QueryShareGamePort();
Steamworks.SteamServer.Init(AppID, options, false);
if (!Steamworks.SteamServer.IsValid)
{
Steamworks.SteamServer.Shutdown();
DebugConsole.ThrowError("Initializing Steam server failed.");
return false;
}
RefreshServerDetails(server);
Steamworks.SteamServer.LogOnAnonymous();
return true;
}
public static bool RefreshServerDetails(Networking.GameServer server)
{
if (!IsInitialized || !Steamworks.SteamServer.IsValid)
{
return false;
}
Steamworks.SteamServer.MapName = GameMain.NetLobbyScreen?.SelectedSub?.DisplayName?.Value ?? "";
server.ServerSettings.UpdateServerListInfo(SetServerListInfo);
Steamworks.SteamServer.DedicatedServer = true;
return true;
}
private static void SetServerListInfo(Identifier key, object value)
{
switch (value)
{
case string stringValue when key == "ServerName":
Steamworks.SteamServer.ServerName = stringValue;
return;
case int maxPlayers when key == "MaxPlayers":
Steamworks.SteamServer.MaxPlayers = maxPlayers;
return;
case bool hasPassword when key == "HasPassword":
Steamworks.SteamServer.Passworded = hasPassword;
return;
case string serverMessage when key == "message":
int maxValueLength = 127;
int totalMaxLength = 2000;
int chunkIndex = 0;
for (int charIndex = 0; charIndex < serverMessage.Length && charIndex < totalMaxLength; charIndex += maxValueLength)
{
Steamworks.SteamServer.SetKey(
$"message{chunkIndex}",
serverMessage.Substring(charIndex, Math.Min(maxValueLength, serverMessage.Length - charIndex)));
chunkIndex++;
}
return;
case IEnumerable<ContentPackage> contentPackages:
//a2s seems to break if too much data is added (seems to be related to MTU?)
//let's restrict the number of packages to 10, clients can use packagecount to tell when the list has been truncated
const int MaxPackagesToList = 10;
int index = 0;
foreach (var contentPackage in contentPackages.Take(MaxPackagesToList))
{
Steamworks.SteamServer.SetKey(
$"contentpackage{index}",
new ServerListContentPackageInfo(contentPackage).ToString());
index++;
}
return;
}
Steamworks.SteamServer.SetKey(key.Value.ToLowerInvariant(), value.ToString());
}
public static bool CloseServer()
{
if (!IsInitialized || !Steamworks.SteamServer.IsValid) return false;
Steamworks.SteamServer.Shutdown();
return true;
}
}
}