#W# Fix: Dungeon traps and there spawners now get deleted if they where prevously enabled.

This commit is contained in:
WarrentyExpired 2026-10-16 12:57:41 -04:00
parent 9c3ae44601
commit a4d7500518
2 changed files with 64 additions and 6 deletions

View file

@ -4,6 +4,7 @@ using System.Linq;
using Server;
using Server.Commands;
using Server.Engines.Spawners;
using Server.Items;
namespace Server.Engines.Tasks;
@ -15,21 +16,78 @@ public static class TaskManager
public static void Initialize()
{
// 30-Minute Recurring Timer
EventSink.ServerStarted += OnServerBoot;
_timer30Min = Timer.DelayCall(TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(30), () => On30MinuteTick(null));
// 1-Hour Recurring Timer
_timer1Hour = Timer.DelayCall(TimeSpan.FromHours(1), TimeSpan.FromHours(1), () => On1HourTick(null));
// 24-Hour Recurring Timer
_timer24Hour = Timer.DelayCall(TimeSpan.FromHours(24), TimeSpan.FromHours(24), () => On24HourTick(null));
// Register developer commands for manual testing
CommandSystem.Register("ForceTask30", AccessLevel.Developer, e => On30MinuteTick(e.Mobile));
CommandSystem.Register("ForceTask1H", AccessLevel.Developer, e => On1HourTick(e.Mobile));
CommandSystem.Register("ForceTask24H", AccessLevel.Developer, e => On24HourTick(e.Mobile));
}
// ==========================================
// RUN ONCE ON SERVER BOOT
// ==========================================
private static void OnServerBoot()
{
// 1. Check if dungeon traps are disabled globally
if (!Settings.S_DungeonTraps)
{
List<Item> toDelete = new List<Item>();
foreach (Item item in World.Items.Values)
{
// 2. Mark any physical BaseTrap items on the floor
if (item is BaseTrap)
{
toDelete.Add(item);
continue;
}
// 3. Mark any type of Spawner (Standard or RegionSpawner) that spawns traps
if (item is BaseSpawner spawner)
{
bool spawnsTraps = false;
// Loop through the actual SpawnerEntry objects to check their SpawnedName
foreach (var entry in spawner.Entries)
{
if (entry?.SpawnedName != null && entry.SpawnedName.IndexOf("Trap", StringComparison.OrdinalIgnoreCase) >= 0)
{
spawnsTraps = true;
break;
}
}
if (spawnsTraps)
{
toDelete.Add(item);
}
}
}
// 4. Safely delete everything we collected
int count = toDelete.Count;
for (int i = 0; i < count; i++)
{
if (toDelete[i] != null && !toDelete[i].Deleted)
{
toDelete[i].Delete();
}
}
// Output a console log so you know it ran successfully on boot
if (count > 0)
{
Console.WriteLine($"TaskManager: S_DungeonTraps is FALSE. Purged {count} physical traps and trap spawners.");
}
}
}
// ==========================================
// 30-MINUTE INTERVAL LOGIC (Trap Reshuffle)
// ==========================================

View file

@ -115,7 +115,7 @@ namespace Server.Gumps
case 4:
if (Settings.S_DungeonTraps)
{
InvokeCommand("IS Data/Spawns/traps.json", from);
InvokeCommand("IS Data/Spawns/Underworld/traps.json", from);
}
InvokeCommand("IS Data/Spawns/Chests/**.json", from);
break;
@ -137,7 +137,7 @@ namespace Server.Gumps
InvokeCommand("IS Data/Spawns/Underworld/**.json", from);
if (Settings.S_DungeonTraps)
{
InvokeCommand("IS Data/Spawns/traps.json", from);
InvokeCommand("IS Data/Spawns/Underworld/traps.json", from);
}
InvokeCommand("IS Data/Spawns/Chests/**.json", from);