diff --git a/MosswartMassacre/LiveInventoryTracker.cs b/MosswartMassacre/LiveInventoryTracker.cs
deleted file mode 100644
index 9dd54a9..0000000
--- a/MosswartMassacre/LiveInventoryTracker.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Decal.Adapter;
-using Decal.Adapter.Wrappers;
-using Mag.Shared;
-
-namespace MosswartMassacre
-{
- ///
- /// Sends inventory delta events (add/remove/update) via WebSocket
- /// whenever items change in the player's inventory.
- ///
- internal class LiveInventoryTracker
- {
- private readonly IPluginLogger _logger;
- private readonly HashSet _trackedItemIds = new HashSet();
-
- internal LiveInventoryTracker(IPluginLogger logger)
- {
- _logger = logger;
- }
-
- ///
- /// Initialize tracking for all current inventory items.
- /// Called after login or hot reload, after the full inventory dump.
- ///
- internal void Initialize()
- {
- _trackedItemIds.Clear();
- try
- {
- foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory())
- {
- _trackedItemIds.Add(wo.Id);
- }
- }
- catch (Exception ex)
- {
- _logger?.Log($"[LiveInv] Error initializing: {ex.Message}");
- }
- }
-
- internal void OnCreateObject(object sender, CreateObjectEventArgs e)
- {
- try
- {
- var item = e.New;
- if (!IsPlayerInventory(item)) return;
- if (_trackedItemIds.Contains(item.Id)) return;
-
- _trackedItemIds.Add(item.Id);
- var mwo = MyWorldObjectCreator.Create(item);
- _ = WebSocket.SendInventoryDeltaAsync("add", mwo);
- }
- catch (Exception ex)
- {
- _logger?.Log($"[LiveInv] Error in OnCreate: {ex.Message}");
- }
- }
-
- internal void OnReleaseObject(object sender, ReleaseObjectEventArgs e)
- {
- try
- {
- var item = e.Released;
- if (!_trackedItemIds.Contains(item.Id)) return;
-
- _trackedItemIds.Remove(item.Id);
- _ = WebSocket.SendInventoryRemoveAsync(item.Id);
- }
- catch (Exception ex)
- {
- _logger?.Log($"[LiveInv] Error in OnRelease: {ex.Message}");
- }
- }
-
- internal void OnChangeObject(object sender, ChangeObjectEventArgs e)
- {
- try
- {
- var item = e.Changed;
- if (!IsPlayerInventory(item))
- {
- // Item left our inventory
- if (_trackedItemIds.Contains(item.Id))
- {
- _trackedItemIds.Remove(item.Id);
- _ = WebSocket.SendInventoryRemoveAsync(item.Id);
- }
- return;
- }
-
- if (!_trackedItemIds.Contains(item.Id))
- {
- // New item appeared via ChangeObject
- _trackedItemIds.Add(item.Id);
- var mwo = MyWorldObjectCreator.Create(item);
- _ = WebSocket.SendInventoryDeltaAsync("add", mwo);
- }
- else
- {
- // Existing item changed (equip/unequip, stack change, container move)
- var mwo = MyWorldObjectCreator.Create(item);
- _ = WebSocket.SendInventoryDeltaAsync("update", mwo);
- }
- }
- catch (Exception ex)
- {
- _logger?.Log($"[LiveInv] Error in OnChange: {ex.Message}");
- }
- }
-
- internal void Cleanup()
- {
- _trackedItemIds.Clear();
- }
-
- private static bool IsPlayerInventory(WorldObject item)
- {
- try
- {
- int containerId = item.Container;
- int charId = CoreManager.Current.CharacterFilter.Id;
-
- // Directly in character's inventory
- if (containerId == charId) return true;
-
- // In a side pack owned by the character
- WorldObject container = CoreManager.Current.WorldFilter[containerId];
- if (container != null &&
- container.ObjectClass == ObjectClass.Container &&
- container.Container == charId)
- {
- return true;
- }
-
- return false;
- }
- catch
- {
- return false;
- }
- }
- }
-}
diff --git a/MosswartMassacre/MosswartMassacre.csproj b/MosswartMassacre/MosswartMassacre.csproj
index 56d93d1..93f65af 100644
--- a/MosswartMassacre/MosswartMassacre.csproj
+++ b/MosswartMassacre/MosswartMassacre.csproj
@@ -312,7 +312,6 @@
-
diff --git a/MosswartMassacre/PluginCore.cs b/MosswartMassacre/PluginCore.cs
index b78ebb6..e99459c 100644
--- a/MosswartMassacre/PluginCore.cs
+++ b/MosswartMassacre/PluginCore.cs
@@ -144,7 +144,6 @@ namespace MosswartMassacre
private GameEventRouter _gameEventRouter;
private QuestStreamingService _questStreamingService;
private CommandRouter _commandRouter;
- private LiveInventoryTracker _liveInventoryTracker;
protected override void Startup()
{
@@ -182,12 +181,6 @@ namespace MosswartMassacre
CoreManager.Current.WorldFilter.ReleaseObject -= _inventoryMonitor.OnInventoryRelease;
CoreManager.Current.WorldFilter.ChangeObject -= _inventoryMonitor.OnInventoryChange;
}
- if (_liveInventoryTracker != null)
- {
- CoreManager.Current.WorldFilter.CreateObject -= _liveInventoryTracker.OnCreateObject;
- CoreManager.Current.WorldFilter.ReleaseObject -= _liveInventoryTracker.OnReleaseObject;
- CoreManager.Current.WorldFilter.ChangeObject -= _liveInventoryTracker.OnChangeObject;
- }
if (_gameEventRouter != null)
CoreManager.Current.EchoFilter.ServerDispatch -= _gameEventRouter.OnServerDispatch;
WebSocket.OnServerCommand -= HandleServerCommand;
@@ -225,9 +218,6 @@ namespace MosswartMassacre
_inventoryMonitor = new InventoryMonitor(this);
_staticInventoryMonitor = _inventoryMonitor;
- // Initialize live inventory tracker (delta WebSocket messages)
- _liveInventoryTracker = new LiveInventoryTracker(this);
-
// Initialize chat event router (rareTracker set later in LoginComplete)
_chatEventRouter = new ChatEventRouter(
this, _killTracker, null,
@@ -250,9 +240,6 @@ namespace MosswartMassacre
CoreManager.Current.WorldFilter.CreateObject += _inventoryMonitor.OnInventoryCreate;
CoreManager.Current.WorldFilter.ReleaseObject += _inventoryMonitor.OnInventoryRelease;
CoreManager.Current.WorldFilter.ChangeObject += _inventoryMonitor.OnInventoryChange;
- CoreManager.Current.WorldFilter.CreateObject += _liveInventoryTracker.OnCreateObject;
- CoreManager.Current.WorldFilter.ReleaseObject += _liveInventoryTracker.OnReleaseObject;
- CoreManager.Current.WorldFilter.ChangeObject += _liveInventoryTracker.OnChangeObject;
// Initialize VVS view after character login
ViewManager.ViewInit();
@@ -426,15 +413,6 @@ namespace MosswartMassacre
// Clean up taper tracking
_inventoryMonitor?.Cleanup();
- // Clean up live inventory tracker
- if (_liveInventoryTracker != null)
- {
- CoreManager.Current.WorldFilter.CreateObject -= _liveInventoryTracker.OnCreateObject;
- CoreManager.Current.WorldFilter.ReleaseObject -= _liveInventoryTracker.OnReleaseObject;
- CoreManager.Current.WorldFilter.ChangeObject -= _liveInventoryTracker.OnChangeObject;
- _liveInventoryTracker.Cleanup();
- }
-
// Clean up Harmony patches
DecalHarmonyClean.Cleanup();
@@ -504,9 +482,6 @@ namespace MosswartMassacre
// Initialize cached Prismatic Taper count
_inventoryMonitor.Initialize();
- // Initialize live inventory tracking (after full inventory dump)
- _liveInventoryTracker?.Initialize();
-
// Initialize quest manager for always-on quest streaming
try
{
@@ -631,9 +606,6 @@ namespace MosswartMassacre
// 7. Reinitialize cached Prismatic Taper count
_inventoryMonitor?.Initialize();
- // 7b. Reinitialize live inventory tracking
- _liveInventoryTracker?.Initialize();
-
// 8. Reinitialize quest manager for hot reload
try
{
diff --git a/MosswartMassacre/WebSocket.cs b/MosswartMassacre/WebSocket.cs
index 4a07d82..e89cbe3 100644
--- a/MosswartMassacre/WebSocket.cs
+++ b/MosswartMassacre/WebSocket.cs
@@ -295,34 +295,6 @@ namespace MosswartMassacre
await SendEncodedAsync(json, CancellationToken.None);
}
- public static async Task SendInventoryDeltaAsync(string action, Mag.Shared.MyWorldObject item)
- {
- var envelope = new
- {
- type = "inventory_delta",
- timestamp = DateTime.UtcNow.ToString("o"),
- character_name = CoreManager.Current.CharacterFilter.Name,
- action = action,
- item = item
- };
- var json = JsonConvert.SerializeObject(envelope);
- await SendEncodedAsync(json, CancellationToken.None);
- }
-
- public static async Task SendInventoryRemoveAsync(int itemId)
- {
- var envelope = new
- {
- type = "inventory_delta",
- timestamp = DateTime.UtcNow.ToString("o"),
- character_name = CoreManager.Current.CharacterFilter.Name,
- action = "remove",
- item_id = itemId
- };
- var json = JsonConvert.SerializeObject(envelope);
- await SendEncodedAsync(json, CancellationToken.None);
- }
-
public static async Task SendVitalsAsync(object vitalsData)
{
var json = JsonConvert.SerializeObject(vitalsData);
diff --git a/MosswartMassacre/bin/Release/MosswartMassacre.dll b/MosswartMassacre/bin/Release/MosswartMassacre.dll
index e07fd43..b490983 100644
Binary files a/MosswartMassacre/bin/Release/MosswartMassacre.dll and b/MosswartMassacre/bin/Release/MosswartMassacre.dll differ
diff --git a/Shared/MyWorldObject.cs b/Shared/MyWorldObject.cs
index 347fc11..73234f5 100644
--- a/Shared/MyWorldObject.cs
+++ b/Shared/MyWorldObject.cs
@@ -18,7 +18,6 @@ namespace Mag.Shared
public int LastIdTime;
public int ObjectClass;
public int Icon;
- public int ContainerId;
public SerializableDictionary BoolValues = new SerializableDictionary();
public SerializableDictionary DoubleValues = new SerializableDictionary();
diff --git a/Shared/MyWorldObjectCreator.cs b/Shared/MyWorldObjectCreator.cs
index 85e5839..c8462d1 100644
--- a/Shared/MyWorldObjectCreator.cs
+++ b/Shared/MyWorldObjectCreator.cs
@@ -36,7 +36,6 @@ namespace Mag.Shared
spells.Add(wo.Spell(i));
mwo.Init(wo.HasIdData, wo.Id, wo.LastIdTime, (int)wo.ObjectClass, wo.Icon, boolValues, doubleValues, intValues, stringValues, activeSpells, spells);
- mwo.ContainerId = wo.Container;
return mwo;
}
@@ -55,7 +54,6 @@ namespace Mag.Shared
MyWorldObject mwo = Create(newer);
older.AddTo(mwo.BoolValues, mwo.DoubleValues, mwo.IntValues, mwo.StringValues);
- older.ContainerId = newer.Container;
return older;
}