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; }