Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaServer/ServerSource/Screens/NetLobbyScreen.cs
2024-04-24 18:09:05 +03:00

216 lines
7.4 KiB
C#

using Barotrauma.Networking;
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Barotrauma
{
partial class NetLobbyScreen : Screen
{
private SubmarineInfo selectedSub;
private SubmarineInfo selectedShuttle;
public bool RadiationEnabled = true;
public SubmarineInfo SelectedSub
{
get { return selectedSub; }
set
{
selectedSub = value;
lastUpdateID++;
if (GameMain.NetworkMember?.ServerSettings != null)
{
GameMain.NetworkMember.ServerSettings.ServerDetailsChanged = true;
}
}
}
public SubmarineInfo SelectedShuttle
{
get { return selectedShuttle; }
set { selectedShuttle = value; lastUpdateID++; }
}
public GameModePreset[] GameModes { get; }
private int selectedModeIndex;
public int SelectedModeIndex
{
get { return selectedModeIndex; }
set
{
lastUpdateID++;
selectedModeIndex = MathHelper.Clamp(value, 0, GameModes.Length - 1);
if (SelectedMode != GameModePreset.MultiPlayerCampaign && GameMain.GameSession?.GameMode is CampaignMode && Selected == this)
{
GameMain.GameSession = null;
}
if (GameMain.NetworkMember?.ServerSettings != null)
{
GameMain.NetworkMember.ServerSettings.GameModeIdentifier = SelectedModeIdentifier;
GameMain.NetworkMember.ServerSettings.ServerDetailsChanged = true;
}
}
}
public Identifier SelectedModeIdentifier
{
get { return GameModes[SelectedModeIndex].Identifier; }
set
{
if (SelectedModeIdentifier == value) { return; }
for (int i = 0; i < GameModes.Length; i++)
{
if (GameModes[i].Identifier == value)
{
SelectedModeIndex = i;
break;
}
}
if (GameMain.NetworkMember?.ServerSettings != null)
{
GameMain.NetworkMember.ServerSettings.GameModeIdentifier = SelectedModeIdentifier;
GameMain.NetworkMember.ServerSettings.ServerDetailsChanged = true;
}
}
}
public GameModePreset SelectedMode
{
get { return GameModes[SelectedModeIndex]; }
}
private MissionType missionType;
public MissionType MissionType
{
get { return missionType; }
set
{
lastUpdateID++;
missionType = value;
if (GameMain.NetworkMember?.ServerSettings != null)
{
GameMain.NetworkMember.ServerSettings.MissionType = missionType.ToString();
}
}
}
public string MissionTypeName
{
get { return missionType.ToString(); }
set
{
Enum.TryParse(value, out MissionType type);
MissionType = type;
}
}
public NetLobbyScreen()
{
LevelSeed = ToolBox.RandomSeed(8);
subs = SubmarineInfo.SavedSubmarines
.Where(s => s.Type == SubmarineType.Player && !s.HasTag(SubmarineTag.HideInMenus))
.ToList();
if (subs == null || subs.Count == 0)
{
throw new Exception("No submarines are available.");
}
selectedSub = subs.FirstOrDefault(s => !s.HasTag(SubmarineTag.Shuttle));
if (selectedSub == null)
{
//no subs available, use a shuttle
DebugConsole.ThrowError("No full-size submarines available - choosing a shuttle as the main submarine.");
selectedSub = subs[0];
}
selectedShuttle = subs.First(s => s.HasTag(SubmarineTag.Shuttle));
if (selectedShuttle == null)
{
//no shuttles available, use a sub
DebugConsole.ThrowError("No shuttles available - choosing a full-size submarine as the shuttle.");
selectedShuttle = subs[0];
}
DebugConsole.NewMessage("Selected sub: " + SelectedSub.Name, Color.White);
DebugConsole.NewMessage("Selected shuttle: " + SelectedShuttle.Name, Color.White);
GameModes = GameModePreset.List.ToArray();
}
private readonly List<SubmarineInfo> subs;
public IReadOnlyList<SubmarineInfo> GetSubList() => subs;
public string LevelSeed
{
get
{
return levelSeed;
}
set
{
if (levelSeed == value) { return; }
lastUpdateID++;
levelSeed = value;
LocationType.Random(new MTRandom(ToolBox.StringToInt(levelSeed))); //call to sync up with clients
}
}
public void ToggleCampaignMode(bool enabled)
{
for (int i = 0; i < GameModes.Length; i++)
{
if ((GameModes[i] == GameModePreset.MultiPlayerCampaign) == enabled)
{
selectedModeIndex = i;
break;
}
}
lastUpdateID++;
}
public override void Select()
{
base.Select();
Voting.ResetVotes(GameMain.Server.ConnectedClients, resetKickVotes: false);
if (SelectedMode != GameModePreset.MultiPlayerCampaign && GameMain.GameSession?.GameMode is CampaignMode && Selected == this)
{
GameMain.GameSession = null;
}
if (GameMain.Server.ServerSettings.SelectedSubmarine.IsNullOrEmpty())
{
//if no sub is selected in the settings,
//select the random sub we selected in the constructor
GameMain.Server.ServerSettings.SelectedSubmarine = SelectedSub?.Name;
}
}
public void RandomizeSettings()
{
if (GameMain.Server.ServerSettings.RandomizeSeed) { LevelSeed = ToolBox.RandomSeed(8); }
//don't touch any of these settings if a campaign is running!
if (GameMain.GameSession?.Campaign == null)
{
if (GameMain.Server.ServerSettings.SubSelectionMode == SelectionMode.Random)
{
var nonShuttles = SubmarineInfo.SavedSubmarines.Where(c => !c.HasTag(SubmarineTag.Shuttle) && !c.HasTag(SubmarineTag.HideInMenus) && c.IsPlayer).ToList();
SelectedSub = nonShuttles[Rand.Range(0, nonShuttles.Count)];
}
if (GameMain.Server.ServerSettings.ModeSelectionMode == SelectionMode.Random)
{
var allowedGameModes = Array.FindAll(GameModes, m => !m.IsSinglePlayer && m != GameModePreset.MultiPlayerCampaign);
SelectedModeIdentifier = allowedGameModes[Rand.Range(0, allowedGameModes.Length)].Identifier;
}
GameMain.Server.ServerSettings.SelectNonHiddenSubmarine();
}
}
}
}