From d61990d029fb8521bd2a3aa0ae7ece70386549d3 Mon Sep 17 00:00:00 2001 From: Flerp Date: Fri, 31 Oct 2025 06:25:06 -0700 Subject: [PATCH] Trying to fix evaluation again --- src/teleport-to-node.cpp | 55 +++++++++++++--------------------------- 1 file changed, 17 insertions(+), 38 deletions(-) diff --git a/src/teleport-to-node.cpp b/src/teleport-to-node.cpp index d22d40c..4e59b49 100644 --- a/src/teleport-to-node.cpp +++ b/src/teleport-to-node.cpp @@ -1,70 +1,53 @@ -/* - * Teleport to nearest mining node (.telenode) - * - AzerothCore ChatCommandTable style (matches si_commandscript) - * - Skips depleted/in-use nodes using loot/go state - * - Avoids "sticky" re-teleport by skipping the last-node GUID and a min distance - */ - #include "ScriptMgr.h" #include "CommandScript.h" #include "Chat.h" #include "ChatCommand.h" #include "Player.h" #include "GameObject.h" -#include "ObjectGuid.h" #include #include #include +#include using namespace Acore::ChatCommands; -// === CONFIG === -static constexpr float TELEPORT_DISTANCE = 200.0f; // yards (search radius) -static constexpr float Z_BUMP = 1.5f; // anti-clip offset on Z -static constexpr float MIN_RETELEPORT_DIST = 8.0f; // don't pick nodes closer than this to the player +static constexpr float TELEPORT_DISTANCE = 200.0f; +static constexpr float Z_BUMP = 1.5f; +static constexpr float MIN_RETELEPORT_DIST = 8.0f; -// Mining node entries (trim to the entries you actually want) static const std::vector kVeinEntries = { - 324, 1610, 1667, 1731, 1732, 1733, 1734, 2054, 2055, 3763, 3764, 19903, - 73940, 73941, 103711, 103713, 105569, 123848, 150080, 150082, 175404, - 176643, 177388, 179144, 179224, 180215, 181109, 181248, 181249, 181557, - 185557, 191133, 1735, 2040, 2047, 2653, 73939, 123309, 123310, 150079, - 150081, 165658, 176645, 181108, 181555, 181556, 181569, 181570, 185877, - 189978, 189979, 189980, 189981, 195036, + 324,1610,1667,1731,1732,1733,1734,2054,2055,3763,3764,19903, + 73940,73941,103711,103713,105569,123848,150080,150082,175404, + 176643,177388,179144,179224,180215,181109,181248,181249,181557, + 185557,191133,1735,2040,2047,2653,73939,123309,123310,150079, + 150081,165658,176645,181108,181555,181556,181569,181570,185877, + 189978,189979,189980,189981,195036, }; -// Remember the last teleported-to node for each player (prevents “sticky” coords) -static std::unordered_map s_lastNodeByPlayer; +static std::unordered_map s_lastNodeByPlayer; static GameObject* FindNearestReadyVein(Player* player, float maxRange, float minDistanceFromPlayer) { GameObject* nearest = nullptr; float nearestDist = std::numeric_limits::infinity(); - - // Skip the last node we teleported to (if any) - ObjectGuid lastNodeGuid; - if (auto it = s_lastNodeByPlayer.find(player->GetGUID()); it != s_lastNodeByPlayer.end()) - lastNodeGuid = it->second; + uint64 lastNode = 0; + if (auto it = s_lastNodeByPlayer.find(player->GetGUID().GetRawValue()); it != s_lastNodeByPlayer.end()) + lastNode = it->second; for (uint32 entry : kVeinEntries) { - // Fast query: nearest object of this entry (we still validate it) if (GameObject* go = player->FindNearestGameObject(entry, maxRange)) { - // Don’t pick the node we just used - if (go->GetGUID() == lastNodeGuid) + if (go->GetGUID().GetRawValue() == lastNode) continue; - // Ignore nodes not in the default/usable state or not loot-ready - // (common depleted states are GO_ACTIVATED/GO_JUST_DEACTIVATED) if (go->GetLootState() != GO_READY) continue; if (go->GetGoState() != GO_STATE_READY) continue; - // Don’t pick a node that’s basically under the player float d = player->GetDistance(go); if (d < minDistanceFromPlayer) continue; @@ -87,14 +70,12 @@ static bool DoTeleNode(Player* player) if (player->IsInCombat()) { ChatHandler(player->GetSession()).PSendSysMessage("You can't use this while in combat."); - return true; // handled + return true; } if (GameObject* node = FindNearestReadyVein(player, TELEPORT_DISTANCE, MIN_RETELEPORT_DIST)) { - // Remember this node so the next call won’t bounce back here if it hasn’t despawned yet - s_lastNodeByPlayer[player->GetGUID()] = node->GetGUID(); - + s_lastNodeByPlayer[player->GetGUID().GetRawValue()] = node->GetGUID().GetRawValue(); player->TeleportTo( node->GetMapId(), node->GetPositionX(), @@ -116,7 +97,6 @@ class telenode_commandscript : public CommandScript public: telenode_commandscript() : CommandScript("telenode_commandscript") { } - // Matches your si_commandscript style: ChatCommandTable with { name, handler, SEC, Console } ChatCommandTable GetCommands() const override { static ChatCommandTable commandTable = @@ -144,7 +124,6 @@ private: } }; -// Export symbol; call this from your module loader (e.g., Addmod_teleport_to_nodeScripts) void AddSC_telenode_commandscript() { new telenode_commandscript();