Track LocalMods as part of monolith
This commit is contained in:
+110
@@ -0,0 +1,110 @@
|
||||
using Barotrauma;
|
||||
using Barotrauma.MoreLevelContent.Config;
|
||||
using Barotrauma.MoreLevelContent.Shared.Config;
|
||||
using Barotrauma.Networking;
|
||||
using HarmonyLib;
|
||||
using MoreLevelContent.Networking;
|
||||
using MoreLevelContent.Shared.Data;
|
||||
using MoreLevelContent.Shared.Generation.Interfaces;
|
||||
using MoreLevelContent.Shared.Store;
|
||||
using MoreLevelContent.Shared.Utils;
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
namespace MoreLevelContent.Shared.Generation.Pirate
|
||||
{
|
||||
public class PirateOutpostDirector : GenerationDirector<PirateOutpostDirector>, IGenerateSubmarine, IGenerateNPCs, ILevelStartGenerate, IRoundStatus
|
||||
{
|
||||
public string ForcedPirateOutpost = "";
|
||||
public bool ForceSpawn { get; set; } = false;
|
||||
public bool ForceHusk { get; set; } = false;
|
||||
|
||||
public static PirateConfig Config => ConfigManager.Instance.Config.NetworkedConfig.PirateConfig;
|
||||
|
||||
private PirateOutpost _PirateOutpost;
|
||||
|
||||
public override bool Active => PirateStore.HasContent;
|
||||
|
||||
public override void Setup()
|
||||
{
|
||||
PirateStore.Instance.Setup();
|
||||
Hooks.Instance.AddUpdateAction(Update);
|
||||
#if CLIENT
|
||||
NetUtil.Register(NetEvent.PIRATEBASE_STATUS, StatusUpdated);
|
||||
#endif
|
||||
}
|
||||
|
||||
internal static void UpdateStatus(PirateData data, LocationConnection con)
|
||||
{
|
||||
#if SERVER
|
||||
Log.Debug("Send status");
|
||||
var msg = NetUtil.CreateNetMsg(NetEvent.PIRATEBASE_STATUS);
|
||||
Int32 id = MapDirector.ConnectionIdLookup[con];
|
||||
msg.WriteInt32(id);
|
||||
msg.WriteBoolean(data.Revealed);
|
||||
msg.WriteInt16((short)data.Status);
|
||||
NetUtil.SendAll(msg);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if CLIENT
|
||||
public void StatusUpdated(object[] args)
|
||||
{
|
||||
IReadMessage inMsg = (IReadMessage)args[0];
|
||||
int conId = inMsg.ReadInt32();
|
||||
bool revealed = inMsg.ReadBoolean();
|
||||
PirateOutpostStatus status = (PirateOutpostStatus)inMsg.ReadInt16();
|
||||
// Look up connection
|
||||
var connection = MapDirector.IdConnectionLookup[conId];
|
||||
connection.LevelData.MLC().PirateData.Revealed = revealed;
|
||||
connection.LevelData.MLC().PirateData.Status = status;
|
||||
Log.Debug("Updated pirate status");
|
||||
}
|
||||
#endif
|
||||
|
||||
static void Update(float deltaTime, Camera cam)
|
||||
{
|
||||
if (Instance._PirateOutpost != null)
|
||||
{
|
||||
Instance._PirateOutpost.Update(deltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
void ILevelStartGenerate.OnLevelGenerationStart(LevelData levelData, bool _)
|
||||
{
|
||||
_PirateOutpost = null;
|
||||
|
||||
// Prevent an outpost from spawning if the mission is a pirate
|
||||
// It will brick the pirates if it does
|
||||
if (!Screen.Selected.IsEditor) // Don't check in editor
|
||||
{
|
||||
foreach (Mission mission in GameMain.GameSession.GameMode!.Missions)
|
||||
{
|
||||
if (mission is PirateMission) return;
|
||||
}
|
||||
}
|
||||
|
||||
if (levelData.MLC().PirateData.HasPirateBase && ConfigManager.Instance.Config.NetworkedConfig.PirateConfig.EnablePirateBases)
|
||||
{
|
||||
_PirateOutpost = new PirateOutpost(levelData.MLC().PirateData, ForcedPirateOutpost, levelData.Seed);
|
||||
Log.Verbose("Set pirate outpost");
|
||||
}
|
||||
}
|
||||
|
||||
public void GenerateSub() => _PirateOutpost?.Generate();
|
||||
public void SpawnNPCs() => _PirateOutpost?.Populate();
|
||||
public void BeforeRoundStart() { }
|
||||
public void RoundEnd()
|
||||
{
|
||||
Log.Debug("Pirate director round end");
|
||||
if (_PirateOutpost != null)
|
||||
{
|
||||
_PirateOutpost.OnRoundEnd(Level.Loaded.LevelData);
|
||||
_PirateOutpost = null;
|
||||
} else
|
||||
{
|
||||
Log.Debug("Pirate outpost not set");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user