Files
BarotraumaModServer/LocalMods/More Level Content/CSharp/Shared/ScriptedEvents/RevealPirateBase.cs
2026-06-09 00:42:10 +03:00

134 lines
5.2 KiBLFS
C#
Executable File

using Barotrauma;
using Microsoft.Xna.Framework;
using MoreLevelContent.Shared;
using MoreLevelContent.Shared.Data;
using MoreLevelContent.Shared.Generation;
using MoreLevelContent.Shared.Generation.Pirate;
using MoreLevelContent.Shared.XML;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata.Ecma335;
namespace Barotrauma
{
/// <summary>
/// Changes what map feature the current level has.
/// </summary>
[InjectScriptedEvent]
internal class RevealPirateBaseAction //: BinaryOptionAction
{
/*
public RevealPirateBaseAction(ScriptedEvent parentEvent, ContentXElement element) : base(parentEvent, element) { }
private LocationConnection FindPirateBase()
{
if (GameMain.GameSession.GameMode is not CampaignMode campaign) return null;
LocationConnection startSearchConnection;
if (Level.Loaded.Type == LevelData.LevelType.LocationConnection)
{
var start = Level.Loaded.StartLocation;
var end = Level.Loaded.EndLocation;
startSearchConnection = start.Connections.Where(c => c.OtherLocation(start) == end).FirstOrDefault();
}
else
{
startSearchConnection = campaign.CurrentLocation.Connections.FirstOrDefault();
}
HashSet<LocationConnection> checkedConnections = new HashSet<LocationConnection>();
HashSet<LocationConnection> pendingConnections = new HashSet<LocationConnection>() { startSearchConnection };
do
{
List<LocationConnection> currentConnections = pendingConnections.ToList();
pendingConnections.Clear();
foreach (var connection in currentConnections)
{
checkedConnections.Add(connection);
var data = connection.LevelData.MLC();
if (data == null)
{
Log.Error("Missing data");
continue;
}
var pirateData = data.PirateData;
// Don't use the current connection, only look for active and not revealed bases
if (startSearchConnection != connection && pirateData.Status == PirateOutpostStatus.Active && !pirateData.Revealed)
{
Log.Debug("Found connection with pirate base");
return connection;
}
else
{
foreach (Location location in connection.Locations)
{
foreach (var item in location.Connections)
{
if (checkedConnections.Contains(item)) { continue; }
pendingConnections.Add(item);
}
}
}
}
} while (pendingConnections.Any());
return null;
}
protected override bool? DetermineSuccess()
{
if (GameMain.GameSession.GameMode is not CampaignMode campaign) return false;
try
{
LocationConnection connection = FindPirateBase();
if (connection != null)
{
#if CLIENT
ShowNotification(connection);
#endif
if (!Main.IsClient)
{
var data = connection.LevelData.MLC().PirateData;
data.Revealed = true;
PirateOutpostDirector.UpdateStatus(data, connection);
if (campaign is MultiPlayerCampaign mpCampaign)
{
mpCampaign.IncrementLastUpdateIdForFlag(MultiPlayerCampaign.NetFlags.MapAndMissions);
}
Log.Debug("Updated status of pirate base to revealed");
}
return true;
}
}
catch(Exception e)
{
Log.Error($"RevealMapFeatureAction crashed! {e.Message}");
}
return false;
}
#if CLIENT
public static void ShowNotification(LocationConnection connection)
{
if (GameMain.GameSession.GameMode is not CampaignMode) return;
_ = new GUIMessageBox
(TextManager.Get("mapupdate.generic.header"),
RichString.Rich(TextManager.GetWithVariables("mapupdate.piratebase.revealed",
("[location1]", $"‖color:gui.orange‖{connection.Locations[0].DisplayName}‖end‖"),
("[location2]", $"‖color:gui.orange‖{connection.Locations[1].DisplayName}‖end‖"))),
Array.Empty<LocalizedString>(), type: GUIMessageBox.Type.InGame, iconStyle: "PirateBase", relativeSize: new Vector2(0.2f, 0.06f), minSize: new Point(64, 74));
}
#endif
*/
}
}