From 6120966c05620ad803a3b2842d00ce2eb7c40260 Mon Sep 17 00:00:00 2001 From: erik Date: Sun, 22 Jun 2025 22:22:10 +0200 Subject: [PATCH] Added hashed based checking of updates. --- MosswartMassacre/PluginCore.backup.cs | 1654 +++++++++++++++++ MosswartMassacre/UpdateManager.cs | 75 +- .../bin/Release/MosswartMassacre.dll | Bin 1660416 -> 1660928 bytes 3 files changed, 1709 insertions(+), 20 deletions(-) create mode 100644 MosswartMassacre/PluginCore.backup.cs diff --git a/MosswartMassacre/PluginCore.backup.cs b/MosswartMassacre/PluginCore.backup.cs new file mode 100644 index 0000000..543fa88 --- /dev/null +++ b/MosswartMassacre/PluginCore.backup.cs @@ -0,0 +1,1654 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Timers; +using Decal.Adapter; +using Decal.Adapter.Wrappers; +using MosswartMassacre.Views; +using Mag.Shared.Constants; + +namespace MosswartMassacre +{ + [FriendlyName("Mosswart Massacre")] + public class PluginCore : PluginBase + { + // Hot Reload Support Properties + public static string AssemblyDirectory { get; set; } + public static bool IsHotReload { get; set; } + + internal static PluginHost MyHost; + internal static int totalKills = 0; + internal static int rareCount = 0; + internal static int sessionDeaths = 0; // Deaths this session + internal static int totalDeaths = 0; // Total deaths from character + internal static int cachedPrismaticCount = 0; // Cached Prismatic Taper count + internal static int lastPrismaticCount = 0; // For delta calculation + + // Track taper items and their containers for accurate release detection + private static readonly Dictionary trackedTaperContainers = new Dictionary(); + private static readonly Dictionary lastKnownStackSizes = new Dictionary(); + internal static DateTime lastKillTime = DateTime.Now; + internal static double killsPer5Min = 0; + internal static double killsPerHour = 0; + internal static DateTime statsStartTime = DateTime.Now; + internal static Timer updateTimer; + private static Timer vitalsTimer; + private static System.Windows.Forms.Timer commandTimer; + private static readonly Queue pendingCommands = new Queue(); + public static bool RareMetaEnabled { get; set; } = true; + + // VVS View Management + private static class ViewManager + { + public static void ViewInit() + { + Views.VVSTabbedMainView.ViewInit(); + } + + public static void ViewDestroy() + { + Views.VVSTabbedMainView.ViewDestroy(); + } + + public static void UpdateKillStats(int totalKills, double killsPer5Min, double killsPerHour) + { + Views.VVSTabbedMainView.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); + } + + public static void UpdateElapsedTime(TimeSpan elapsed) + { + Views.VVSTabbedMainView.UpdateElapsedTime(elapsed); + } + + public static void UpdateRareCount(int rareCount) + { + Views.VVSTabbedMainView.UpdateRareCount(rareCount); + } + + public static void SetRareMetaToggleState(bool enabled) + { + Views.VVSTabbedMainView.SetRareMetaToggleState(enabled); + } + + public static void RefreshSettingsFromConfig() + { + Views.VVSTabbedMainView.RefreshSettingsFromConfig(); + } + } + public static bool RemoteCommandsEnabled { get; set; } = false; + public static bool HttpServerEnabled { get; set; } = false; + public static string CharTag { get; set; } = ""; + public static bool TelemetryEnabled { get; set; } = false; + public static bool WebSocketEnabled { get; set; } = false; + public bool InventoryLogEnabled { get; set; } = false; + public static bool AggressiveChatStreamingEnabled { get; set; } = true; + private MossyInventory _inventoryLogger; + public static NavVisualization navVisualization; + + // Quest Management for always-on quest streaming + public static QuestManager questManager; + private static Timer questStreamingTimer; + + private static Queue rareMessageQueue = new Queue(); + private static DateTime _lastSent = DateTime.MinValue; + private static readonly Queue _chatQueue = new Queue(); + + protected override void Startup() + { + try + { + // DEBUG: Add startup debug message + WriteToChat("[DEBUG] PluginCore.Startup() called"); + + // Set MyHost - for hot reload scenarios, Host might be null + if (Host != null) + { + MyHost = Host; + } + else if (MyHost == null) + { + // Hot reload fallback - this is okay, WriteToChat will handle it + MyHost = null; + } + + // Check if this is a hot reload + var isCharacterLoaded = CoreManager.Current.CharacterFilter.LoginStatus == 3; + if (IsHotReload || isCharacterLoaded) + { + // Hot reload detected - reinitialize connections and state + WriteToChat("[INFO] Hot reload detected - reinitializing plugin"); + + // Reload settings if character is already logged in + if (isCharacterLoaded) + { + try + { + WriteToChat("Hot reload - reinitializing character-dependent systems"); + // Don't call LoginComplete - create hot reload specific initialization + InitializeForHotReload(); + WriteToChat("[INFO] Hot reload initialization complete"); + } + catch (Exception ex) + { + WriteToChat($"[ERROR] Hot reload initialization failed: {ex.Message}"); + } + } + } + + // Note: Startup messages will appear after character login + // Subscribe to chat message event + WriteToChat("[DEBUG] Subscribing to events..."); + CoreManager.Current.ChatBoxMessage += new EventHandler(OnChatText); + CoreManager.Current.ChatBoxMessage += new EventHandler(AllChatText); + CoreManager.Current.CommandLineText += OnChatCommand; + WriteToChat("[DEBUG] About to subscribe to LoginComplete event"); + CoreManager.Current.CharacterFilter.LoginComplete += CharacterFilter_LoginComplete; + WriteToChat("[DEBUG] LoginComplete event subscription successful"); + CoreManager.Current.CharacterFilter.Death += OnCharacterDeath; + CoreManager.Current.WorldFilter.CreateObject += OnSpawn; + CoreManager.Current.WorldFilter.CreateObject += OnPortalDetected; + CoreManager.Current.WorldFilter.ReleaseObject += OnDespawn; + // Subscribe to inventory change events for taper tracking + CoreManager.Current.WorldFilter.CreateObject += OnInventoryCreate; + CoreManager.Current.WorldFilter.ReleaseObject += OnInventoryRelease; + CoreManager.Current.WorldFilter.ChangeObject += OnInventoryChange; + // Initialize VVS view after character login + ViewManager.ViewInit(); + + // Initialize the timer + updateTimer = new Timer(1000); // Update every second + updateTimer.Elapsed += UpdateStats; + updateTimer.Start(); + + // Initialize vitals streaming timer + vitalsTimer = new Timer(5000); // Send vitals every 5 seconds + vitalsTimer.Elapsed += SendVitalsUpdate; + vitalsTimer.Start(); + + // Initialize command processing timer (Windows Forms timer for main thread) + commandTimer = new System.Windows.Forms.Timer(); + commandTimer.Interval = 10; // Process commands every 10ms + commandTimer.Tick += ProcessPendingCommands; + commandTimer.Start(); + + // Note: View initialization moved to LoginComplete for VVS compatibility + + // Enable TLS1.2 + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; + //Enable vTank interface + vTank.Enable(); + //lyssna på commands + WebSocket.OnServerCommand += HandleServerCommand; + //starta inventory. Hanterar subscriptions i den med + + _inventoryLogger = new MossyInventory(); + + // Initialize navigation visualization system + navVisualization = new NavVisualization(); + + // Note: DECAL Harmony patches will be initialized in LoginComplete event + // where the chat system is available for error messages + + } + catch (Exception ex) + { + WriteToChat("Error during startup: " + ex.Message); + } + } + + protected override void Shutdown() + { + try + { + PluginSettings.Save(); + if (TelemetryEnabled) + Telemetry.Stop(); // ensure no dangling timer / HttpClient + WriteToChat("Mosswart Massacre is shutting down..."); + + // Unsubscribe from chat message event + CoreManager.Current.ChatBoxMessage -= new EventHandler(OnChatText); + CoreManager.Current.CommandLineText -= OnChatCommand; + CoreManager.Current.ChatBoxMessage -= new EventHandler(AllChatText); + CoreManager.Current.CharacterFilter.Death -= OnCharacterDeath; + CoreManager.Current.WorldFilter.CreateObject -= OnSpawn; + CoreManager.Current.WorldFilter.CreateObject -= OnPortalDetected; + CoreManager.Current.WorldFilter.ReleaseObject -= OnDespawn; + // Unsubscribe from inventory change events + CoreManager.Current.WorldFilter.CreateObject -= OnInventoryCreate; + CoreManager.Current.WorldFilter.ReleaseObject -= OnInventoryRelease; + CoreManager.Current.WorldFilter.ChangeObject -= OnInventoryChange; + + + // Stop and dispose of the timers + if (updateTimer != null) + { + updateTimer.Stop(); + updateTimer.Dispose(); + updateTimer = null; + } + + if (vitalsTimer != null) + { + vitalsTimer.Stop(); + vitalsTimer.Dispose(); + vitalsTimer = null; + } + + if (commandTimer != null) + { + commandTimer.Stop(); + commandTimer.Dispose(); + commandTimer = null; + } + + // Stop and dispose quest streaming timer + if (questStreamingTimer != null) + { + questStreamingTimer.Stop(); + questStreamingTimer.Elapsed -= OnQuestStreamingUpdate; + questStreamingTimer.Dispose(); + questStreamingTimer = null; + } + + // Dispose quest manager + if (questManager != null) + { + questManager.Dispose(); + questManager = null; + } + + // Clean up the view + ViewManager.ViewDestroy(); + //Disable vtank interface + vTank.Disable(); + // sluta lyssna på commands + WebSocket.OnServerCommand -= HandleServerCommand; + WebSocket.Stop(); + //shutdown inv + _inventoryLogger.Dispose(); + + // Clean up navigation visualization + if (navVisualization != null) + { + navVisualization.Dispose(); + navVisualization = null; + } + + // Clean up taper tracking + trackedTaperContainers.Clear(); + lastKnownStackSizes.Clear(); + + // Clean up Harmony patches + DecalHarmonyClean.Cleanup(); + + MyHost = null; + } + catch (Exception ex) + { + WriteToChat("Error during shutdown: " + ex.Message); + } + } + private void CharacterFilter_LoginComplete(object sender, EventArgs e) + { + WriteToChat("[DEBUG] CharacterFilter_LoginComplete event fired!"); + CoreManager.Current.CharacterFilter.LoginComplete -= CharacterFilter_LoginComplete; + + WriteToChat("Mosswart Massacre has started!"); + + + + PluginSettings.Initialize(); // Safe to call now + + // Apply the values + RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; + WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; + RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; + HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; + TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; + CharTag = PluginSettings.Instance.CharTag; + ViewManager.SetRareMetaToggleState(RareMetaEnabled); + ViewManager.RefreshSettingsFromConfig(); // Refresh all UI settings after loading + if (TelemetryEnabled) + Telemetry.Start(); + if (WebSocketEnabled) + WebSocket.Start(); + + // Initialize Harmony patches using UtilityBelt's loaded DLL + try + { + bool success = DecalHarmonyClean.Initialize(); + if (success) + WriteToChat("[OK] Plugin message interception active"); + else + WriteToChat("[FAIL] Could not initialize message interception"); + } + catch (Exception ex) + { + WriteToChat($"[ERROR] Harmony initialization failed: {ex.Message}"); + } + + // Initialize death tracking + totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); + sessionDeaths = 0; + + // Initialize cached Prismatic Taper count + InitializePrismaticTaperCount(); + + // Initialize quest manager for always-on quest streaming + try + { + questManager = new QuestManager(); + questManager.RefreshQuests(); + + // Initialize quest streaming timer (30 seconds) + questStreamingTimer = new Timer(30000); + questStreamingTimer.Elapsed += OnQuestStreamingUpdate; + questStreamingTimer.AutoReset = true; + questStreamingTimer.Start(); + + WriteToChat("[OK] Quest streaming initialized"); + } + catch (Exception ex) + { + WriteToChat($"[ERROR] Quest streaming initialization failed: {ex.Message}"); + } + + } + + #region Quest Streaming Methods + private static void OnQuestStreamingUpdate(object sender, ElapsedEventArgs e) + { + try + { + // Stream high priority quest data via WebSocket + if (WebSocketEnabled && questManager?.QuestList != null && questManager.QuestList.Count > 0) + { + var currentTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + + // Find and stream priority quests (deduplicated by quest ID) + var priorityQuests = questManager.QuestList + .Where(q => IsHighPriorityQuest(q.Id)) + .GroupBy(q => q.Id) + .Select(g => g.First()) // Take first occurrence of each quest ID + .ToList(); + + foreach (var quest in priorityQuests) + { + try + { + string questName = questManager.GetFriendlyQuestName(quest.Id); + long timeRemaining = quest.ExpireTime - currentTime; + string countdown = FormatCountdown(timeRemaining); + + // Stream quest data + System.Threading.Tasks.Task.Run(() => WebSocket.SendQuestDataAsync(questName, countdown)); + } + catch (Exception) + { + // Silently handle individual quest streaming errors + } + } + } + } + catch (Exception) + { + // Silently handle quest streaming errors to avoid spam + } + } + + private static bool IsHighPriorityQuest(string questId) + { + return questId == "stipendtimer_0812" || // Changed from stipendtimer_monthly to stipendtimer_0812 + questId == "augmentationblankgemacquired" || + questId == "insatiableeaterjaw"; + } + + private static string FormatCountdown(long seconds) + { + if (seconds <= 0) + return "READY"; + + var timeSpan = TimeSpan.FromSeconds(seconds); + + if (timeSpan.TotalDays >= 1) + return $"{(int)timeSpan.TotalDays}d {timeSpan.Hours:D2}h"; + else if (timeSpan.TotalHours >= 1) + return $"{timeSpan.Hours}h {timeSpan.Minutes:D2}m"; + else if (timeSpan.TotalMinutes >= 1) + return $"{timeSpan.Minutes}m {timeSpan.Seconds:D2}s"; + else + return $"{timeSpan.Seconds}s"; + } + #endregion + + private void InitializeForHotReload() + { + // This method handles initialization that depends on character being logged in + // Similar to LoginComplete but designed for hot reload scenarios + + WriteToChat("Mosswart Massacre hot reload initialization started!"); + + // 1. Initialize settings - CRITICAL first step + PluginSettings.Initialize(); + + // 2. Apply the values from settings + RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; + WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; + RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; + HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; + TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; + CharTag = PluginSettings.Instance.CharTag; + + // 3. Update UI with current settings + ViewManager.SetRareMetaToggleState(RareMetaEnabled); + ViewManager.RefreshSettingsFromConfig(); + + // 4. Restart services if they were enabled (stop first, then start) + if (TelemetryEnabled) + { + Telemetry.Stop(); // Stop existing + Telemetry.Start(); // Restart + } + + if (WebSocketEnabled) + { + WebSocket.Stop(); // Stop existing + WebSocket.Start(); // Restart + } + + if (HttpServerEnabled) + { + HttpCommandServer.Stop(); // Stop existing + HttpCommandServer.Start(); // Restart + } + + // 5. Initialize Harmony patches (only if not already done) + // Note: Harmony patches are global and don't need reinitialization + if (!DecalHarmonyClean.IsActive()) + { + try + { + bool success = DecalHarmonyClean.Initialize(); + if (success) + WriteToChat("[OK] Plugin message interception active"); + else + WriteToChat("[FAIL] Could not initialize message interception"); + } + catch (Exception ex) + { + WriteToChat($"[ERROR] Harmony initialization failed: {ex.Message}"); + } + } + + // 6. Reinitialize death tracking + totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); + // Don't reset sessionDeaths - keep the current session count + + // 7. Reinitialize cached Prismatic Taper count + InitializePrismaticTaperCount(); + + WriteToChat("Hot reload initialization completed!"); + } + + private void InitializePrismaticTaperCount() + { + try + { + lastPrismaticCount = cachedPrismaticCount; + cachedPrismaticCount = Utils.GetItemStackSize("Prismatic Taper"); + + // Initialize tracking for existing tapers + trackedTaperContainers.Clear(); + lastKnownStackSizes.Clear(); + + foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) + { + if (wo.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase) && + IsPlayerOwnedContainer(wo.Container)) + { + int stackCount = wo.Values(LongValueKey.StackCount, 1); + trackedTaperContainers[wo.Id] = wo.Container; + lastKnownStackSizes[wo.Id] = stackCount; + } + } + + } + catch (Exception ex) + { + WriteToChat($"[TAPER] Error initializing count: {ex.Message}"); + cachedPrismaticCount = 0; + lastPrismaticCount = 0; + trackedTaperContainers.Clear(); + lastKnownStackSizes.Clear(); + } + } + + private bool IsPlayerOwnedContainer(int containerId) + { + try + { + // Check if it's the player's main inventory + if (containerId == CoreManager.Current.CharacterFilter.Id) + return true; + + // Check if it's one of the player's containers (side packs) + // Get the container object to verify it belongs to the player + WorldObject container = CoreManager.Current.WorldFilter[containerId]; + if (container != null && + container.ObjectClass == ObjectClass.Container && + container.Container == CoreManager.Current.CharacterFilter.Id) + { + return true; + } + + return false; + } + catch + { + return false; + } + } + + private void OnInventoryCreate(object sender, CreateObjectEventArgs e) + { + try + { + var item = e.New; + if (IsPlayerOwnedContainer(item.Container) && + item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) + { + lastPrismaticCount = cachedPrismaticCount; + int stackCount = item.Values(LongValueKey.StackCount, 1); + cachedPrismaticCount += stackCount; + int delta = cachedPrismaticCount - lastPrismaticCount; + + // Initialize tracking for this new taper + trackedTaperContainers[item.Id] = item.Container; + lastKnownStackSizes[item.Id] = stackCount; + + } + } + catch (Exception ex) + { + WriteToChat($"[TAPER] Error in OnInventoryCreate: {ex.Message}"); + } + } + + private void OnInventoryRelease(object sender, ReleaseObjectEventArgs e) + { + try + { + var item = e.Released; + if (item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) + { + // Check where this taper WAS before being released (not where it's going) + if (trackedTaperContainers.TryGetValue(item.Id, out int previousContainer)) + { + if (IsPlayerOwnedContainer(previousContainer)) + { + // This taper was in our inventory and is now being released + lastPrismaticCount = cachedPrismaticCount; + int stackCount = item.Values(LongValueKey.StackCount, 1); + cachedPrismaticCount -= stackCount; + } + + // Clean up tracking + trackedTaperContainers.Remove(item.Id); + lastKnownStackSizes.Remove(item.Id); + } + else + { + // Fallback: recalculate total count when untracked taper is released + lastPrismaticCount = cachedPrismaticCount; + cachedPrismaticCount = Utils.GetItemStackSize("Prismatic Taper"); + } + } + } + catch (Exception ex) + { + WriteToChat($"[TAPER] Error in OnInventoryRelease: {ex.Message}"); + } + } + + private void OnInventoryChange(object sender, ChangeObjectEventArgs e) + { + try + { + var item = e.Changed; + if (item.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) + { + bool isInPlayerContainer = IsPlayerOwnedContainer(item.Container); + + // Track container location for release detection + if (isInPlayerContainer) + { + bool wasAlreadyTracked = trackedTaperContainers.ContainsKey(item.Id); + trackedTaperContainers[item.Id] = item.Container; + + // Handle stack size changes with pure delta math + int currentStack = item.Values(LongValueKey.StackCount, 1); + + // Check if this is a pickup from ground (item not previously tracked) + if (!wasAlreadyTracked) + { + // This is likely a pickup from ground - increment count + lastPrismaticCount = cachedPrismaticCount; + cachedPrismaticCount += currentStack; + } + else if (lastKnownStackSizes.TryGetValue(item.Id, out int previousStack)) + { + int stackDelta = currentStack - previousStack; + if (stackDelta != 0) + { + lastPrismaticCount = cachedPrismaticCount; + cachedPrismaticCount += stackDelta; + } + } + + lastKnownStackSizes[item.Id] = currentStack; + } + // Item is no longer in player containers + // DON'T clean up tracking here - let OnInventoryRelease handle cleanup + // This ensures tracking data is available for the Release event + } + } + catch (Exception ex) + { + WriteToChat($"[TAPER] Error in OnInventoryChange: {ex.Message}"); + } + } + + private async void OnSpawn(object sender, CreateObjectEventArgs e) + { + var mob = e.New; + if (mob.ObjectClass != ObjectClass.Monster) return; + + try + { + // Get DECAL coordinates + var decalCoords = mob.Coordinates(); + if (decalCoords == null) return; + + const string fmt = "F7"; + string ns = decalCoords.NorthSouth.ToString(fmt, CultureInfo.InvariantCulture); + string ew = decalCoords.EastWest.ToString(fmt, CultureInfo.InvariantCulture); + + // Get Z coordinate using RawCoordinates() for accurate world Z position + string zCoord = "0"; + try + { + var rawCoords = mob.RawCoordinates(); + if (rawCoords != null) + { + zCoord = rawCoords.Z.ToString("F2", CultureInfo.InvariantCulture); + } + else + { + // Fallback to player Z approximation if RawCoordinates fails + var playerCoords = Coordinates.Me; + if (Math.Abs(playerCoords.Z) > 0.1) + { + zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); + } + } + } + catch + { + // Fallback to player Z approximation on error + try + { + var playerCoords = Coordinates.Me; + if (Math.Abs(playerCoords.Z) > 0.1) + { + zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); + } + } + catch + { + zCoord = "0"; + } + } + + await WebSocket.SendSpawnAsync(ns, ew, zCoord, mob.Name); + } + catch (Exception ex) + { + PluginCore.WriteToChat($"[WS] Spawn send failed: {ex}"); + } + } + + private async void OnPortalDetected(object sender, CreateObjectEventArgs e) + { + var portal = e.New; + if (portal.ObjectClass != ObjectClass.Portal) return; + + try + { + // Get portal coordinates from DECAL + var decalCoords = portal.Coordinates(); + if (decalCoords == null) return; + + const string fmt = "F7"; + string ns = decalCoords.NorthSouth.ToString(fmt, CultureInfo.InvariantCulture); + string ew = decalCoords.EastWest.ToString(fmt, CultureInfo.InvariantCulture); + + // Get Z coordinate using RawCoordinates() for accurate world Z position + string zCoord = "0"; + try + { + var rawCoords = portal.RawCoordinates(); + if (rawCoords != null) + { + zCoord = rawCoords.Z.ToString("F2", CultureInfo.InvariantCulture); + } + else + { + // Fallback to player Z approximation if RawCoordinates fails + var playerCoords = Coordinates.Me; + if (Math.Abs(playerCoords.Z) > 0.1) + { + zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); + } + } + } + catch + { + // Fallback to player Z approximation on error + try + { + var playerCoords = Coordinates.Me; + if (Math.Abs(playerCoords.Z) > 0.1) + { + zCoord = playerCoords.Z.ToString("F2", CultureInfo.InvariantCulture); + } + } + catch + { + zCoord = "0"; + } + } + + await WebSocket.SendPortalAsync(ns, ew, zCoord, portal.Name); + } + catch (Exception ex) + { + PluginCore.WriteToChat($"[PORTAL ERROR] {ex.Message}"); + PluginCore.WriteToChat($"[WS] Portal send failed: {ex}"); + } + } + + + private void OnDespawn(object sender, ReleaseObjectEventArgs e) + { + var mob = e.Released; + if (mob.ObjectClass != ObjectClass.Monster) return; + + + // var c = mob.Coordinates(); + // PluginCore.WriteToChat( + // $"[Despawn] {mob.Name} @ (NS={c.NorthSouth:F1}, EW={c.EastWest:F1})"); + } + + private async void AllChatText(object sender, ChatTextInterceptEventArgs e) + { + try + { + string cleaned = NormalizeChatLine(e.Text); + + // Send to WebSocket + await WebSocket.SendChatTextAsync(e.Color, cleaned); + + // Note: Plugin message analysis is now handled by Harmony patches + } + catch (Exception ex) + { + PluginCore.WriteToChat($"[WS] Chat send failed: {ex}"); + } + } + + private static string NormalizeChatLine(string raw) + { + if (string.IsNullOrEmpty(raw)) + return raw; + + // 1) Remove all <…> tags + var noTags = Regex.Replace(raw, "<[^>]+>", ""); + + // 2) Trim trailing newline or carriage-return + var trimmed = noTags.TrimEnd('\r', '\n'); + + // 3) Collapse multiple spaces into one + var collapsed = Regex.Replace(trimmed, @"[ ]{2,}", " "); + + return collapsed; + } + + private void OnCharacterDeath(object sender, Decal.Adapter.Wrappers.DeathEventArgs e) + { + sessionDeaths++; + totalDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); + } + + private void HandleServerCommand(CommandEnvelope env) + { + // This is called from WebSocket thread - queue for main thread execution + lock (pendingCommands) + { + pendingCommands.Enqueue(env.Command); + } + } + + private void ProcessPendingCommands(object sender, EventArgs e) + { + // This runs on the main UI thread via Windows Forms timer + string command = null; + + lock (pendingCommands) + { + if (pendingCommands.Count > 0) + command = pendingCommands.Dequeue(); + } + + if (command != null) + { + try + { + // Execute ALL WebSocket commands on main thread - fast and reliable + DispatchChatToBoxWithPluginIntercept(command); + } + catch (Exception ex) + { + WriteToChat($"[WS] Command execution error: {ex.Message}"); + } + } + } + + private void OnChatText(object sender, ChatTextInterceptEventArgs e) + { + try + { + + if (IsKilledByMeMessage(e.Text)) + { + totalKills++; + lastKillTime = DateTime.Now; + CalculateKillsPerInterval(); + ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); + } + + if (IsRareDiscoveryMessage(e.Text, out string rareText)) + { + rareCount++; + ViewManager.UpdateRareCount(rareCount); + + if (RareMetaEnabled) + { + Decal_DispatchOnChatCommand("/vt setmetastate loot_rare"); + } + + DelayedCommandManager.AddDelayedCommand($"/a {rareText}", 3000); + // Fire and forget: we don't await, since sending is not critical and we don't want to block. + _ = WebSocket.SendRareAsync(rareText); + } + + if (e.Color == 18 && e.Text.EndsWith("!report\"")) + { + TimeSpan elapsed = DateTime.Now - statsStartTime; + string reportMessage = $"Total Kills: {totalKills}, Kills per Hour: {killsPerHour:F2}, Elapsed Time: {elapsed:dd\\.hh\\:mm\\:ss}, Rares Found: {rareCount}"; + WriteToChat($"[Mosswart Massacre] Reporting to allegiance: {reportMessage}"); + MyHost.Actions.InvokeChatParser($"/a {reportMessage}"); + } + if (RemoteCommandsEnabled && e.Color == 18) + { + string characterName = Regex.Escape(CoreManager.Current.CharacterFilter.Name); + string pattern = $@"^\[Allegiance\].*Dunking Rares.*say[s]?, \""!do {characterName} (?.+)\""$"; + string tag = Regex.Escape(PluginCore.CharTag); + string patterntag = $@"^\[Allegiance\].*Dunking Rares.*say[s]?, \""!dot {tag} (?.+)\""$"; + + + var match = Regex.Match(e.Text, pattern); + var matchtag = Regex.Match(e.Text, patterntag); + + if (match.Success) + { + string command = match.Groups["command"].Value; + DispatchChatToBoxWithPluginIntercept(command); + DelayedCommandManager.AddDelayedCommand($"/a [Remote] Executing: {command}", 2000); + } + else if (matchtag.Success) + { + string command = matchtag.Groups["command"].Value; + DispatchChatToBoxWithPluginIntercept(command); + DelayedCommandManager.AddDelayedCommand($"/a [Remote] Executing: {command}", 2000); + } + + } + + + + + + + + + } + catch (Exception ex) + { + WriteToChat("Error processing chat message: " + ex.Message); + } + } + private void OnChatCommand(object sender, ChatParserInterceptEventArgs e) + { + try + { + if (e.Text.StartsWith("/mm", StringComparison.OrdinalIgnoreCase)) + { + e.Eat = true; // Prevent the message from showing in chat + HandleMmCommand(e.Text); + } + } + catch (Exception ex) + { + PluginCore.WriteToChat($"[Error] Failed to process /mm command: {ex.Message}"); + } + } + + private void UpdateStats(object sender, ElapsedEventArgs e) + { + try + { + // Update the elapsed time + TimeSpan elapsed = DateTime.Now - statsStartTime; + ViewManager.UpdateElapsedTime(elapsed); + + // Recalculate kill rates + CalculateKillsPerInterval(); + ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); + + } + catch (Exception ex) + { + WriteToChat("Error updating stats: " + ex.Message); + } + } + + private static void SendVitalsUpdate(object sender, ElapsedEventArgs e) + { + try + { + // Only send if WebSocket is enabled + if (!WebSocketEnabled) + return; + + // Collect vitals data + int currentHealth = CoreManager.Current.Actions.Vital[VitalType.CurrentHealth]; + int currentStamina = CoreManager.Current.Actions.Vital[VitalType.CurrentStamina]; + int currentMana = CoreManager.Current.Actions.Vital[VitalType.CurrentMana]; + + int maxHealth = CoreManager.Current.Actions.Vital[VitalType.MaximumHealth]; + int maxStamina = CoreManager.Current.Actions.Vital[VitalType.MaximumStamina]; + int maxMana = CoreManager.Current.Actions.Vital[VitalType.MaximumMana]; + + int vitae = CoreManager.Current.CharacterFilter.Vitae; + + // Create vitals data structure + var vitalsData = new + { + type = "vitals", + timestamp = DateTime.UtcNow.ToString("o"), + character_name = CoreManager.Current.CharacterFilter.Name, + health_current = currentHealth, + health_max = maxHealth, + health_percentage = maxHealth > 0 ? Math.Round((double)currentHealth / maxHealth * 100, 1) : 0, + stamina_current = currentStamina, + stamina_max = maxStamina, + stamina_percentage = maxStamina > 0 ? Math.Round((double)currentStamina / maxStamina * 100, 1) : 0, + mana_current = currentMana, + mana_max = maxMana, + mana_percentage = maxMana > 0 ? Math.Round((double)currentMana / maxMana * 100, 1) : 0, + vitae = vitae + }; + + // Send via WebSocket + _ = WebSocket.SendVitalsAsync(vitalsData); + } + catch (Exception ex) + { + WriteToChat($"Error sending vitals: {ex.Message}"); + } + } + + private void CalculateKillsPerInterval() + { + double minutesElapsed = (DateTime.Now - statsStartTime).TotalMinutes; + + if (minutesElapsed > 0) + { + killsPer5Min = (totalKills / minutesElapsed) * 5; + killsPerHour = (totalKills / minutesElapsed) * 60; + } + } + + private bool IsKilledByMeMessage(string text) + { + string[] killPatterns = new string[] + { + @"^You flatten (?.+)'s body with the force of your assault!$", + @"^You bring (?.+) to a fiery end!$", + @"^You beat (?.+) to a lifeless pulp!$", + @"^You smite (?.+) mightily!$", + @"^You obliterate (?.+)!$", + @"^You run (?.+) through!$", + @"^You reduce (?.+) to a sizzling, oozing mass!$", + @"^You knock (?.+) into next Morningthaw!$", + @"^You split (?.+) apart!$", + @"^You cleave (?.+) in twain!$", + @"^You slay (?.+) viciously enough to impart death several times over!$", + @"^You reduce (?.+) to a drained, twisted corpse!$", + @"^Your killing blow nearly turns (?.+) inside-out!$", + @"^Your attack stops (?.+) cold!$", + @"^Your lightning coruscates over (?.+)'s mortal remains!$", + @"^Your assault sends (?.+) to an icy death!$", + @"^You killed (?.+)!$", + @"^The thunder of crushing (?.+) is followed by the deafening silence of death!$", + @"^The deadly force of your attack is so strong that (?.+)'s ancestors feel it!$", + @"^(?.+)'s seared corpse smolders before you!$", + @"^(?.+) is reduced to cinders!$", + @"^(?.+) is shattered by your assault!$", + @"^(?.+) catches your attack, with dire consequences!$", + @"^(?.+) is utterly destroyed by your attack!$", + @"^(?.+) suffers a frozen fate!$", + @"^(?.+)'s perforated corpse falls before you!$", + @"^(?.+) is fatally punctured!$", + @"^(?.+)'s death is preceded by a sharp, stabbing pain!$", + @"^(?.+) is torn to ribbons by your assault!$", + @"^(?.+) is liquified by your attack!$", + @"^(?.+)'s last strength dissolves before you!$", + @"^Electricity tears (?.+) apart!$", + @"^Blistered by lightning, (?.+) falls!$", + @"^(?.+)'s last strength withers before you!$", + @"^(?.+) is dessicated by your attack!$", + @"^(?.+) is incinerated by your assault!$" + }; + + foreach (string pattern in killPatterns) + { + if (Regex.IsMatch(text, pattern)) + return true; + } + + return false; + } + private bool IsRareDiscoveryMessage(string text, out string rareTextOnly) + { + rareTextOnly = null; + + // Match pattern: " has discovered the !" + string pattern = @"^(?['A-Za-z ]+)\shas discovered the (?.*?)!$"; + Match match = Regex.Match(text, pattern); + + if (match.Success && match.Groups["name"].Value == CoreManager.Current.CharacterFilter.Name) + { + rareTextOnly = match.Groups["item"].Value; // just "Ancient Pickle" + return true; + } + + return false; + } + public static void WriteToChat(string message) + { + try + { + // For hot reload scenarios where MyHost might be null, use CoreManager directly + if (MyHost != null) + { + MyHost.Actions.AddChatText("[Mosswart Massacre] " + message, 0, 1); + } + else + { + // Hot reload fallback - use CoreManager directly like the original template + CoreManager.Current.Actions.AddChatText("[Mosswart Massacre] " + message, 1); + } + } + catch (Exception ex) + { + // Last resort fallback - try CoreManager even if MyHost was supposed to work + try + { + CoreManager.Current.Actions.AddChatText($"[Mosswart Massacre] {message} (WriteToChat error: {ex.Message})", 1); + } + catch + { + // Give up - can't write to chat at all + } + } + } + public static void RestartStats() + { + totalKills = 0; + rareCount = 0; + sessionDeaths = 0; // Reset session deaths only + statsStartTime = DateTime.Now; + killsPer5Min = 0; + killsPerHour = 0; + + WriteToChat($"Stats have been reset. Session deaths: {sessionDeaths}, Total deaths: {totalDeaths}"); + ViewManager.UpdateKillStats(totalKills, killsPer5Min, killsPerHour); + ViewManager.UpdateRareCount(rareCount); + } + public static void ToggleRareMeta() + { + PluginSettings.Instance.RareMetaEnabled = !PluginSettings.Instance.RareMetaEnabled; + RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; + ViewManager.SetRareMetaToggleState(RareMetaEnabled); + } + + [DllImport("Decal.dll")] + private static extern int DispatchOnChatCommand(ref IntPtr str, [MarshalAs(UnmanagedType.U4)] int target); + + public static bool Decal_DispatchOnChatCommand(string cmd) + { + IntPtr bstr = Marshal.StringToBSTR(cmd); + + try + { + bool eaten = (DispatchOnChatCommand(ref bstr, 1) & 0x1) > 0; + return eaten; + } + finally + { + Marshal.FreeBSTR(bstr); + } + } + public static void DispatchChatToBoxWithPluginIntercept(string cmd) + { + if (!Decal_DispatchOnChatCommand(cmd)) + CoreManager.Current.Actions.InvokeChatParser(cmd); + } + private void HandleMmCommand(string text) + { + // Remove the /mm prefix and trim extra whitespace + string[] args = text.Substring(3).Trim().Split(' '); + + if (args.Length == 0 || string.IsNullOrEmpty(args[0])) + { + WriteToChat("Usage: /mm . Try /mm help"); + return; + } + + string subCommand = args[0].ToLower(); + + switch (subCommand) + { + case "telemetry": + if (args.Length > 1) + { + if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) + { + TelemetryEnabled = true; + Telemetry.Start(); + PluginSettings.Instance.TelemetryEnabled = true; + WriteToChat("Telemetry streaming ENABLED."); + } + else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) + { + TelemetryEnabled = false; + Telemetry.Stop(); + PluginSettings.Instance.TelemetryEnabled = false; + WriteToChat("Telemetry streaming DISABLED."); + } + else + { + WriteToChat("Usage: /mm telemetry "); + } + } + else + { + WriteToChat("Usage: /mm telemetry "); + } + break; + case "ws": + if (args.Length > 1) + { + if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) + { + WebSocketEnabled = true; + WebSocket.Start(); + PluginSettings.Instance.WebSocketEnabled = true; + WriteToChat("WS streaming ENABLED."); + } + else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) + { + WebSocketEnabled = false; + WebSocket.Stop(); + PluginSettings.Instance.WebSocketEnabled = false; + WriteToChat("WS streaming DISABLED."); + } + else + { + WriteToChat("Usage: /mm ws "); + } + } + + else + { + WriteToChat("Usage: /mm ws "); + } + break; + case "help": + WriteToChat("Mosswart Massacre Commands:"); + WriteToChat("/mm report - Show current stats"); + WriteToChat("/mm loc - Show current location"); + WriteToChat("/mm telemetry - Telemetry streaming enable|disable"); + WriteToChat("/mm ws - Websocket streaming enable|disable"); + WriteToChat("/mm reset - Reset all counters"); + WriteToChat("/mm meta - Toggle rare meta state"); + WriteToChat("/mm http - Local http-command server enable|disable"); + WriteToChat("/mm remotecommand - Listen to allegiance !do/!dot enable|disable"); + WriteToChat("/mm getmetastate - Gets the current metastate"); + WriteToChat("/mm nextwp - Advance VTank to next waypoint"); + WriteToChat("/mm decalstatus - Check Harmony patch status (UtilityBelt version)"); + WriteToChat("/mm decaldebug - Enable/disable plugin message debug output + WebSocket streaming"); + WriteToChat("/mm harmonyraw - Show raw intercepted messages (debug output)"); + WriteToChat("/mm testprismatic - Test Prismatic Taper detection and icon lookup"); + WriteToChat("/mm deathstats - Show current death tracking statistics"); + WriteToChat("/mm testtaper - Test cached Prismatic Taper tracking"); + WriteToChat("/mm debugtaper - Show detailed taper tracking debug info"); + WriteToChat("/mm gui - Manually initialize/reinitialize GUI!!!"); + break; + case "report": + TimeSpan elapsed = DateTime.Now - statsStartTime; + string reportMessage = $"Total Kills: {totalKills}, Kills per Hour: {killsPerHour:F2}, Elapsed Time: {elapsed:dd\\.hh\\:mm\\:ss}, Rares Found: {rareCount}, Session Deaths: {sessionDeaths}, Total Deaths: {totalDeaths}"; + WriteToChat(reportMessage); + break; + case "getmetastate": + string metaState = VtankControl.VtGetMetaState(); + WriteToChat(metaState); + break; + + case "loc": + Coordinates here = Coordinates.Me; + var pos = Utils.GetPlayerPosition(); + WriteToChat($"Location: {here} (X={pos.X:F1}, Y={pos.Y:F1}, Z={pos.Z:F1})"); + break; + case "reset": + RestartStats(); + break; + case "meta": + RareMetaEnabled = !RareMetaEnabled; + WriteToChat($"Rare meta state is now {(RareMetaEnabled ? "ON" : "OFF")}"); + ViewManager.SetRareMetaToggleState(RareMetaEnabled); // <-- sync the UI + break; + case "http": + if (args.Length > 1) + { + if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) + { + PluginSettings.Instance.HttpServerEnabled = true; + HttpServerEnabled = true; + HttpCommandServer.Start(); + } + else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) + { + PluginSettings.Instance.HttpServerEnabled = false; + HttpServerEnabled = false; + HttpCommandServer.Stop(); + } + else + { + WriteToChat("Usage: /mm http "); + } + } + else + { + WriteToChat("Usage: /mm http "); + } + break; + + case "remotecommands": + if (args.Length > 1) + { + if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) + { + PluginSettings.Instance.RemoteCommandsEnabled = true; + RemoteCommandsEnabled = true; + WriteToChat("Remote command listening is now ENABLED."); + } + else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) + { + PluginSettings.Instance.RemoteCommandsEnabled = false; + RemoteCommandsEnabled = false; + WriteToChat("Remote command listening is now DISABLED."); + } + else + { + WriteToChat("Invalid remotecommands argument. Use 'enable' or 'disable'."); + } + } + else + { + WriteToChat("Usage: /mm remotecommands "); + } + break; + + case "nextwp": + double result = VtankControl.VtAdvanceWaypoint(); + if (result == 1) + { + WriteToChat("Advanced VTank to next waypoint."); + } + else + { + WriteToChat("Failed to advance VTank waypoint. Is VTank running?"); + } + break; + + case "vtanktest": + try + { + WriteToChat("Testing VTank interface..."); + WriteToChat($"VTank Instance: {(vTank.Instance != null ? "Found" : "NULL")}"); + WriteToChat($"VTank Type: {vTank.Instance?.GetType()?.Name ?? "NULL"}"); + WriteToChat($"NavCurrent: {vTank.Instance?.NavCurrent ?? -1}"); + WriteToChat($"NavNumPoints: {vTank.Instance?.NavNumPoints ?? -1}"); + WriteToChat($"NavType: {vTank.Instance?.NavType}"); + WriteToChat($"MacroEnabled: {vTank.Instance?.MacroEnabled}"); + } + catch (Exception ex) + { + WriteToChat($"VTank test error: {ex.Message}"); + } + break; + + case "decalstatus": + try + { + WriteToChat("=== Harmony Patch Status (UtilityBelt Pattern) ==="); + WriteToChat($"Patches Active: {DecalHarmonyClean.IsActive()}"); + WriteToChat($"Messages Intercepted: {DecalHarmonyClean.GetMessagesIntercepted()}"); + WriteToChat($"WebSocket Streaming: {(AggressiveChatStreamingEnabled && WebSocketEnabled ? "ACTIVE" : "INACTIVE")}"); + + // Test Harmony availability + WriteToChat("=== Harmony Version Status ==="); + try + { + var harmonyTest = Harmony.HarmonyInstance.Create("test.version.check"); + WriteToChat($"[OK] Harmony Available (ID: {harmonyTest.Id})"); + + // Check Harmony assembly version + var harmonyAssembly = typeof(Harmony.HarmonyInstance).Assembly; + WriteToChat($"[OK] Harmony Version: {harmonyAssembly.GetName().Version}"); + WriteToChat($"[OK] Harmony Location: {harmonyAssembly.Location}"); + } + catch (Exception harmonyEx) + { + WriteToChat($"[FAIL] Harmony Test Failed: {harmonyEx.Message}"); + } + } + catch (Exception ex) + { + WriteToChat($"Status check error: {ex.Message}"); + } + break; + + case "decaldebug": + if (args.Length > 1) + { + if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) + { + AggressiveChatStreamingEnabled = true; + WriteToChat("[OK] DECAL debug streaming ENABLED - will show captured messages + stream via WebSocket"); + } + else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) + { + AggressiveChatStreamingEnabled = false; + WriteToChat("[FAIL] DECAL debug streaming DISABLED - WebSocket streaming also disabled"); + } + else + { + WriteToChat("Usage: /mm decaldebug "); + } + } + else + { + WriteToChat("Usage: /mm decaldebug "); + } + break; + + + case "harmonyraw": + // Debug functionality removed + break; + + case "initgui": + case "gui": + try + { + WriteToChat("Attempting to manually initialize GUI..."); + ViewManager.ViewDestroy(); // Clean up any existing view + ViewManager.ViewInit(); // Reinitialize + WriteToChat("GUI initialization attempt completed."); + } + catch (Exception ex) + { + WriteToChat($"GUI initialization error: {ex.Message}"); + } + break; + + case "testprismatic": + try + { + WriteToChat("=== FULL INVENTORY DUMP ==="); + var worldFilter = CoreManager.Current.WorldFilter; + var playerInv = CoreManager.Current.CharacterFilter.Id; + + WriteToChat("Listing ALL items in your main inventory:"); + int itemNum = 1; + + foreach (WorldObject item in worldFilter.GetByContainer(playerInv)) + { + if (!string.IsNullOrEmpty(item.Name)) + { + int stackCount = item.Values(LongValueKey.StackCount, 0); + WriteToChat($"{itemNum:D2}: '{item.Name}' (count: {stackCount}, icon: 0x{item.Icon:X}, class: {item.ObjectClass})"); + itemNum++; + + // Highlight anything that might be a taper + string nameLower = item.Name.ToLower(); + if (nameLower.Contains("taper") || nameLower.Contains("prismatic") || + nameLower.Contains("prism") || nameLower.Contains("component")) + { + WriteToChat($" *** POSSIBLE MATCH: '{item.Name}' ***"); + } + } + } + + WriteToChat($"=== Total items listed: {itemNum - 1} ==="); + + // Now test our utility functions on the found Prismatic Taper + WriteToChat("=== Testing Utility Functions on Prismatic Taper ==="); + var foundItem = Utils.FindItemByName("Prismatic Taper"); + if (foundItem != null) + { + WriteToChat($"SUCCESS! Found: '{foundItem.Name}'"); + WriteToChat($"Utils.GetItemStackSize: {Utils.GetItemStackSize("Prismatic Taper")}"); + WriteToChat($"Utils.GetItemIcon: 0x{Utils.GetItemIcon("Prismatic Taper"):X}"); + WriteToChat($"Utils.GetItemDisplayIcon: 0x{Utils.GetItemDisplayIcon("Prismatic Taper"):X}"); + WriteToChat("=== TELEMETRY WILL NOW WORK! ==="); + } + else + { + WriteToChat("ERROR: Still can't find Prismatic Taper with utility functions!"); + } + } + catch (Exception ex) + { + WriteToChat($"Search error: {ex.Message}"); + } + break; + + case "deathstats": + try + { + WriteToChat("=== Death Tracking Statistics ==="); + WriteToChat($"Session Deaths: {sessionDeaths}"); + WriteToChat($"Total Deaths: {totalDeaths}"); + + // Get current character death count to verify sync + int currentCharDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); + WriteToChat($"Character Property NumDeaths: {currentCharDeaths}"); + + if (currentCharDeaths != totalDeaths) + { + WriteToChat($"[WARNING] Death count sync issue detected!"); + WriteToChat($"Updating totalDeaths from {totalDeaths} to {currentCharDeaths}"); + totalDeaths = currentCharDeaths; + } + + WriteToChat("Death tracking is active and will increment on character death."); + } + catch (Exception ex) + { + WriteToChat($"Death stats error: {ex.Message}"); + } + break; + + case "testdeath": + try + { + WriteToChat("=== Manual Death Test ==="); + WriteToChat($"Current sessionDeaths variable: {sessionDeaths}"); + WriteToChat($"Current totalDeaths variable: {totalDeaths}"); + + // Read directly from character property + int currentCharDeaths = CoreManager.Current.CharacterFilter.GetCharProperty((int)IntValueKey.NumDeaths); + WriteToChat($"Character Property NumDeaths (43): {currentCharDeaths}"); + + // Manually increment session deaths for testing + sessionDeaths++; + WriteToChat($"Manually incremented sessionDeaths to: {sessionDeaths}"); + WriteToChat("Note: This doesn't simulate a real death, just tests the tracking variables."); + + // Check if death event is properly subscribed + WriteToChat($"Death event subscription check:"); + var deathEvent = typeof(Decal.Adapter.Wrappers.CharacterFilter).GetEvent("Death"); + WriteToChat($"Death event exists: {deathEvent != null}"); + } + catch (Exception ex) + { + WriteToChat($"Test death error: {ex.Message}"); + } + break; + + case "testtaper": + try + { + WriteToChat("=== Cached Taper Tracking Test ==="); + WriteToChat($"Cached Count: {cachedPrismaticCount}"); + WriteToChat($"Last Count: {lastPrismaticCount}"); + + // Compare with Utils function + int utilsCount = Utils.GetItemStackSize("Prismatic Taper"); + WriteToChat($"Utils Count: {utilsCount}"); + + if (cachedPrismaticCount == utilsCount) + { + WriteToChat("[OK] Cached count matches Utils count"); + } + else + { + WriteToChat($"[WARNING] Count mismatch! Cached: {cachedPrismaticCount}, Utils: {utilsCount}"); + WriteToChat("Refreshing cached count..."); + InitializePrismaticTaperCount(); + } + + WriteToChat("=== Container Analysis ==="); + int mainPackCount = 0; + int sidePackCount = 0; + int playerId = CoreManager.Current.CharacterFilter.Id; + + foreach (WorldObject wo in CoreManager.Current.WorldFilter.GetInventory()) + { + if (wo.Name.Equals("Prismatic Taper", StringComparison.OrdinalIgnoreCase)) + { + int stackCount = wo.Values(LongValueKey.StackCount, 1); + if (wo.Container == playerId) + { + mainPackCount += stackCount; + } + else + { + sidePackCount += stackCount; + } + } + } + + WriteToChat($"Main Pack Tapers: {mainPackCount}"); + WriteToChat($"Side Pack Tapers: {sidePackCount}"); + WriteToChat($"Total: {mainPackCount + sidePackCount}"); + + WriteToChat("=== Event System Status ==="); + WriteToChat($"Tracking {trackedTaperContainers.Count} taper stacks for delta detection"); + WriteToChat($"Known stack sizes: {lastKnownStackSizes.Count} items"); + WriteToChat("Pure delta tracking - NO expensive inventory scans during events!"); + WriteToChat("Now tracks: consumption, drops, trades, container moves"); + WriteToChat("Try moving tapers between containers and casting spells!"); + } + catch (Exception ex) + { + WriteToChat($"Taper test error: {ex.Message}"); + } + break; + + case "debugtaper": + // Debug functionality removed + break; + + case "finditem": + if (args.Length > 1) + { + string itemName = string.Join(" ", args, 1, args.Length - 1).Trim('"'); + WriteToChat($"=== Searching for: '{itemName}' ==="); + + var foundItem = Utils.FindItemByName(itemName); + if (foundItem != null) + { + WriteToChat($"FOUND: '{foundItem.Name}'"); + WriteToChat($"Count: {foundItem.Values(LongValueKey.StackCount, 0)}"); + WriteToChat($"Icon: 0x{foundItem.Icon:X}"); + WriteToChat($"Display Icon: 0x{(foundItem.Icon + 0x6000000):X}"); + WriteToChat($"Object Class: {foundItem.ObjectClass}"); + } + else + { + WriteToChat($"NOT FOUND: '{itemName}'"); + WriteToChat("Make sure the name is exactly as it appears in-game."); + } + } + else + { + WriteToChat("Usage: /mm finditem \"Item Name\""); + WriteToChat("Example: /mm finditem \"Prismatic Taper\""); + } + break; + + + default: + WriteToChat($"Unknown /mm command: {subCommand}. Try /mm help"); + break; + } + } + + + } +} + + diff --git a/MosswartMassacre/UpdateManager.cs b/MosswartMassacre/UpdateManager.cs index af14e60..7f85741 100644 --- a/MosswartMassacre/UpdateManager.cs +++ b/MosswartMassacre/UpdateManager.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Net.Http; +using System.Security.Cryptography; using System.Threading.Tasks; namespace MosswartMassacre @@ -10,20 +11,47 @@ namespace MosswartMassacre private const string UPDATE_URL = "https://git.snakedesert.se/SawatoMosswartsEnjoyersClub/MosswartMassacre/raw/branch/spawn-detection/MosswartMassacre/bin/Release/MosswartMassacre.dll"; private static bool updateAvailable = false; - private static long remoteFileSize = 0; - private static long localFileSize = 0; + private static string remoteFileHash = string.Empty; + private static string localFileHash = string.Empty; private static DateTime lastCheckTime = DateTime.MinValue; public static bool IsUpdateAvailable => updateAvailable; public static DateTime LastCheckTime => lastCheckTime; + /// + /// Calculate SHA256 hash of a file + /// + private static string CalculateFileHash(string filePath) + { + using (var sha256 = SHA256.Create()) + { + using (var stream = File.OpenRead(filePath)) + { + byte[] hashBytes = sha256.ComputeHash(stream); + return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); + } + } + } + + /// + /// Calculate SHA256 hash of byte array + /// + private static string CalculateHash(byte[] data) + { + using (var sha256 = SHA256.Create()) + { + byte[] hashBytes = sha256.ComputeHash(data); + return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); + } + } + public static async Task CheckForUpdateAsync() { try { PluginCore.WriteToChat("[Update] Checking for updates..."); - // Get local file size + // Get local file hash string localPath = GetLocalDllPath(); if (!File.Exists(localPath)) { @@ -31,36 +59,40 @@ namespace MosswartMassacre return false; } - localFileSize = new FileInfo(localPath).Length; + PluginCore.WriteToChat("[Update] Calculating local file hash..."); + localFileHash = CalculateFileHash(localPath); - // Check remote file size + // Download remote file and calculate hash using (var client = new HttpClient()) { - client.Timeout = TimeSpan.FromSeconds(10); + client.Timeout = TimeSpan.FromSeconds(30); - var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, UPDATE_URL)); - response.EnsureSuccessStatusCode(); + PluginCore.WriteToChat("[Update] Downloading remote file for comparison..."); + var remoteData = await client.GetByteArrayAsync(UPDATE_URL); - remoteFileSize = response.Content.Headers.ContentLength ?? 0; - - if (remoteFileSize == 0) + if (remoteData == null || remoteData.Length == 0) { - PluginCore.WriteToChat("[Update] Error: Could not determine remote file size"); + PluginCore.WriteToChat("[Update] Error: Could not download remote file"); return false; } + + PluginCore.WriteToChat("[Update] Calculating remote file hash..."); + remoteFileHash = CalculateHash(remoteData); } - // Compare sizes - updateAvailable = (remoteFileSize != localFileSize); + // Compare hashes + updateAvailable = !string.Equals(localFileHash, remoteFileHash, StringComparison.OrdinalIgnoreCase); lastCheckTime = DateTime.Now; if (updateAvailable) { - PluginCore.WriteToChat($"[Update] Update available! Local: {localFileSize} bytes, Remote: {remoteFileSize} bytes"); + PluginCore.WriteToChat($"[Update] Update available!"); + PluginCore.WriteToChat($"[Update] Local hash: {localFileHash}"); + PluginCore.WriteToChat($"[Update] Remote hash: {remoteFileHash}"); } else { - PluginCore.WriteToChat("[Update] Up to date"); + PluginCore.WriteToChat("[Update] Up to date - hashes match"); } return true; @@ -112,12 +144,15 @@ namespace MosswartMassacre } } - // Validate downloaded file - var downloadedSize = new FileInfo(tempPath).Length; - if (downloadedSize != remoteFileSize) + // Validate downloaded file by hash + PluginCore.WriteToChat("[Update] Validating downloaded file..."); + var downloadedHash = CalculateFileHash(tempPath); + if (!string.Equals(downloadedHash, remoteFileHash, StringComparison.OrdinalIgnoreCase)) { File.Delete(tempPath); - PluginCore.WriteToChat($"[Update] Download validation failed. Expected {remoteFileSize} bytes, got {downloadedSize} bytes"); + PluginCore.WriteToChat($"[Update] Download validation failed. Hash mismatch!"); + PluginCore.WriteToChat($"[Update] Expected: {remoteFileHash}"); + PluginCore.WriteToChat($"[Update] Got: {downloadedHash}"); return false; } diff --git a/MosswartMassacre/bin/Release/MosswartMassacre.dll b/MosswartMassacre/bin/Release/MosswartMassacre.dll index db2d14d5dd42bfeb2051c1dd07a140930d345a43..f39aa621c087db670a90f01888fa25152b82dbe8 100644 GIT binary patch delta 84062 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

JK^=OmFj~3HRt(e63eie(^>zM&-hm8gQJA^ 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 Lj&Ft4sh0l(osh0i delta 83308 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