Files
7d2dXG/Mods/zzz_REBIRTH__Utils/Harmony/Harmony_BlockSpawnEntity.cs
Nathaniel Cosford 062dfab2cd Patched
2025-05-30 01:04:40 +09:30

105 lines
5.5 KiB
C#

namespace Harmony.BlockSpawnEntityPatches
{
[HarmonyPatch(typeof(BlockSpawnEntity), "UpdateTick")]
public class UpdateTickPatch
{
const float _maxDist = 2f;
public static bool Prefix(BlockSpawnEntity __instance, ref bool __result, WorldBase _world, int _clrIdx, Vector3i _blockPos, BlockValue _blockValue, bool _bRandomTick, ulong _ticksIfLoaded, GameRandom _rnd)
{
//Log.Out($"BlockSpawnEntity::UpdateTick Prefix _blockValue: {_blockValue.Block.GetBlockName()}, pos: {_blockPos}, spawnClasses len: {__instance.spawnClasses.Length}");
__result = false;
if (!SingletonMonoBehaviour<ConnectionManager>.Instance.IsServer) return false;
if (__instance.spawnClasses.Length == 0)
{
Log.Error($"Harmony-BlockSpawnEntity:Block definition '{_blockValue.Block.GetBlockName()}' missing property SpawnClass values in entityclasses.xml");
return false;
}
if (!GameManager.Instance.IsEditMode())
{
string className = __instance.spawnClasses[_blockValue.meta % __instance.spawnClasses.Length];
//Log.Warning($"BlockSpawnEntityPatches-UpdateTick className: " + className);
//Log.Warning($"BlockSpawnEntityPatches-UpdateTick Contains: " + className.ToLower().Contains("tradermercenary_poi"));
bool flag1 = _blockValue.Block.blockName == "spawnTraderRebirth" && (className.ToLower() != "briston_poi_fr" && !className.ToLower().Contains("tradermercenary_poi"));
bool flag2 = _blockValue.Block.blockName == "spawnCustomTraderRebirth" && !className.ToLower().Contains("poppy_poi_");
bool flag3 = _blockValue.Block.blockName == "spawnCustomTraderRebirth" && className.ToLower().Contains("poppy_poi_");
//Log.Warning($"BlockSpawnEntityPatches-UpdateTick flag1: " + flag1);
//Log.Warning($"BlockSpawnEntityPatches-UpdateTick flag2: " + flag2);
//Log.Warning($"BlockSpawnEntityPatches-UpdateTick flag3: " + flag3);
if (RebirthUtilities.ScenarioSkip() && (flag1 || flag2) ||
!RebirthUtilities.ScenarioSkip() && (flag3)
)
{
//Log.Warning($"BlockSpawnEntityPatches-UpdateTick SKIP");
_world.GetWBT().AddScheduledBlockUpdate(0, _blockPos, __instance.blockID, 320uL);
return false;
}
var entities = GameManager.Instance.World.GetEntitiesInBounds(null, new Bounds(_blockPos.ToVector3(), Vector3.one * 25f));
int eClassID = EntityClass.FromString(className);
var matchedIDs = entities.FindAll(e => e.entityClass == eClassID);
if (matchedIDs.Count == 0)
{
ChunkCluster chunkCluster = _world.ChunkClusters[_clrIdx];
if (chunkCluster == null || (Chunk)chunkCluster.GetChunkFromWorldPos(_blockPos) == null) return false;
Vector3 transformPos = _blockPos.ToVector3() + new Vector3(0.5f, 0.25f, 0.5f);
Vector3 rotation = new Vector3(0f, 90 * (_blockValue.rotation & 3), 0f);
Entity entity = EntityFactory.CreateEntity(eClassID, transformPos, rotation);
entity.SetSpawnerSource(EnumSpawnerSource.StaticSpawner);
GameManager.Instance.World.SpawnEntityInWorld(entity);
//Log.Warning($"Harmony-BlockSpawnEntity:Spawn New Trader entity: {entity}");
}
else if (matchedIDs.Count == 1)
{
var trader = matchedIDs[0];
if (Vector3.Distance(_blockPos.ToVector3(), trader.position) > _maxDist)
{
//Log.Warning($"Harmony-BlockSpawnEntity:Repositioning Trader {_blockValue.Block.GetBlockName()}");
trader.SetPosition(_blockPos.ToVector3() + new Vector3(0.5f, 0.25f, 0.5f));
trader.SetRotation(new Vector3(0f, 90 * (_blockValue.rotation & 3), 0f));
}
}
else if (matchedIDs.Count >= 2)
{
//Log.Warning($"Harmony-BlockSpawnEntity:Found extra traders: {className} {matchedIDs.Count}");
for (int i = matchedIDs.Count - 1; i >= 0; i--)
{
var trader = matchedIDs[i];
var dist = Vector3.Distance(_blockPos.ToVector3(), trader.position);
//Log.Warning($" Trader: {trader}, pos: {trader.position}, distance: {dist}");
if (dist > _maxDist)
{
//Log.Warning($"Harmony-BlockSpawnEntity:Unloading extra EntityTrader: {trader}, distance from post: {dist}");
trader.MarkToUnload();
matchedIDs.RemoveAt(i);
}
}
if (matchedIDs.Count > 1)
{
//Log.Error($"Harmony-BlockSpawnEntity:Found an extra trader within the max distance."); // hope it doesn't happen
}
}
}
_world.GetWBT().AddScheduledBlockUpdate(0, _blockPos, __instance.blockID, 320uL);
// the base Block class simply returns false
return false; // base.UpdateTick(_world, _clrIdx, _blockPos, _blockValue, _bRandomTick, _ticksIfLoaded, _rnd);
}
}
}