Files
BarotraumaModServer/LocalMods/More Level Content/CSharp/Server/Generation/Map/MapDirector.cs
2026-06-09 00:42:10 +03:00

82 lines
3.2 KiBLFS
C#
Executable File

using Barotrauma;
using Barotrauma.MoreLevelContent.Shared.Utils;
using Barotrauma.Networking;
using MoreLevelContent.Networking;
using MoreLevelContent.Shared.Data;
using MoreLevelContent.Shared.Generation.Pirate;
using System;
using System.Linq;
namespace MoreLevelContent.Shared.Generation
{
// Server
public partial class MapDirector : Singleton<MapDirector>
{
partial void SetupProjSpecific()
{
NetUtil.Register(NetEvent.MAP_CONNECTION_EQUALITYCHECK_REQUEST, RequestConnectionEquality);
NetUtil.Register(NetEvent.MAP_REQUEST_STATE, RespondToMapStateRequest);
}
private void RespondToMapStateRequest(object[] args)
{
Client client = (Client)args[1];
IWriteMessage outMsg = NetUtil.CreateNetMsg(NetEvent.MAP_SEND_STATE);
WriteMsg();
NetUtil.SendClient(outMsg, client.Connection);
Log.Debug($"Sent map state request to {client.Name}");
void WriteMsg()
{
if (GameMain.GameSession.Campaign is not MultiPlayerCampaign campaign)
{
outMsg.WriteByte((byte)MapSyncState.NotCampaign);
return;
}
if (campaign.Map == null)
{
outMsg.WriteByte((byte)MapSyncState.MapNotCreated);
return;
}
outMsg.WriteByte((byte)MapSyncState.MapSynced);
var activeDistressBeacons = campaign.Map.Connections.Where(c => c.LevelData.MLC().HasDistress);
var count = activeDistressBeacons.Count();
if (count > byte.MaxValue)
{
DebugConsole.ThrowError("More Level Content detected more than 255 active distress beacons when trying to respond to a client map state request, what did you do??? This won't work, please reduce the numer!");
return;
}
outMsg.WriteByte((byte)count);
foreach (var connection in activeDistressBeacons)
{
int id = ConnectionIdLookup[connection];
outMsg.WriteInt16((short)id);
outMsg.WriteByte((byte)connection.LevelData.MLC().DistressStepsLeft);
}
}
}
internal void NotifyMapFeatureRevealed(LocationConnection con, MapFeatureData feature)
{
foreach (Client client in GameMain.Server.ConnectedClients)
{
NotifyMapFeatureRevealed(client, con, feature);
}
}
internal partial void RoundEnd(CampaignMode.TransitionType transitionType) { }
private void NotifyMapFeatureRevealed(Client client, LocationConnection con, MapFeatureData feature)
{
Int32 conId = MapDirector.ConnectionIdLookup[con];
var msg = NetUtil.CreateNetMsg(NetEvent.EVENT_REVEALMAPFEATURE);
msg.WriteIdentifier(feature.Name);
msg.WriteInt32(conId);
NetUtil.SendClient(msg, client.Connection);
}
}
}