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

53 lines
2.2 KiBLFS
C#
Executable File

using Barotrauma;
using Barotrauma.MoreLevelContent.Config;
using HarmonyLib;
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text;
using static Barotrauma.Level;
namespace MoreLevelContent.Shared.Generation
{
public static class MoveRuins
{
public static void Init()
{
if (GameMain.IsMultiplayer) return;
var level_FindPosAwayFromMainPath = typeof(Level).GetMethod("FindPosAwayFromMainPath", BindingFlags.NonPublic | BindingFlags.Instance);
// Main.Patch(level_FindPosAwayFromMainPath, prefix: AccessTools.Method(typeof(MoveRuins), nameof(MoveRuinSpawnPos)));
}
readonly static Point ruinSize = new Point(5000);
public static object MoveRuinSpawnPos(object self, Dictionary<string, object> args)
{
// Broken in multiplayer
if (GameMain.IsMultiplayer) return null;
// Exit if caves haven't been generated yet
if (Loaded.Caves.Count < Loaded.GenerationParams.CaveCount) return null;
Random rand = new MTRandom(ToolBox.StringToInt(Loaded.Seed));
// Roll for move
if (rand.Next(100) > ConfigManager.Instance.Config.NetworkedConfig.GeneralConfig.RuinMoveChance) return null;
Log.Debug("Moving the ruins...");
// Generate ruin point
int limitLeft = Math.Max((int)Loaded.StartPosition.X, ruinSize.X / 2);
int limitRight = Math.Min((int)Loaded.EndPosition.X, Loaded.Size.X - (ruinSize.X / 2));
Point ruinPos = new Point(rand.Next(limitLeft, limitRight), rand.Next(Loaded.AbyssArea.Top + 5000, Loaded.AbyssArea.Bottom - 5000));
// Move the ruins above the sea floor, copied from Level.cs Line 1709
ruinPos.Y = Math.Max(ruinPos.Y, (int)Loaded.GetBottomPosition(ruinPos.X).Y + 500);
ruinPos.Y = Math.Max(ruinPos.Y, (int)Loaded.GetBottomPosition(ruinPos.X + 5000).Y + 500);
Log.Debug($"Ruins spawn point: {ruinPos}");
return ruinPos;
}
}
}