diff --git a/src/teleport-to-node.cpp b/src/teleport-to-node.cpp index 89c02f3..79d9e67 100644 --- a/src/teleport-to-node.cpp +++ b/src/teleport-to-node.cpp @@ -26,12 +26,20 @@ static const std::vector kVeinEntries = { 189978,189979,189980,189981,195036, }; -static GameObject* FindNearestReadyVein(Player* player, float maxRange) +static const std::vector kHerbEntries = { + 1618,1617,1619,1620,1621,2045,1622,1623,1628,1624,2041,2042,2046,2043,2044,2866, + 142140,142141,142142,142143,142144,142145,176583,176584,176639,176586,176640, + 176587,176641,176588,176589,181270,183044,181271,181272,183045,181277,181275, + 183043,181276,181278,181279,181282,181280,181285,181281,181284,190169,190170, + 189973,191019,190172,190171,190176 +}; + +static GameObject* FindNearestReady(Player* player, float maxRange, const std::vector& entries) { GameObject* nearest = nullptr; float nearestDist = std::numeric_limits::infinity(); - for (uint32 entry : kVeinEntries) + for (uint32 entry : entries) { if (GameObject* go = player->FindNearestGameObject(entry, maxRange)) { @@ -51,18 +59,18 @@ static GameObject* FindNearestReadyVein(Player* player, float maxRange) return nearest; } -class TeleNodeRecheckEvent : public BasicEvent +class TeleRecheckEvent : public BasicEvent { public: - TeleNodeRecheckEvent(Player* player, uint64 lastNodeGuidRaw) - : _player(player), _lastNodeGuidRaw(lastNodeGuidRaw) { } + TeleRecheckEvent(Player* player, uint64 lastNodeGuidRaw, const std::vector* entries) + : _player(player), _lastNodeGuidRaw(lastNodeGuidRaw), _entries(entries) { } bool Execute(uint64, uint32) override { if (!_player || !_player->IsInWorld()) return true; - if (GameObject* node = FindNearestReadyVein(_player, TELEPORT_DISTANCE)) + if (GameObject* node = FindNearestReady(_player, TELEPORT_DISTANCE, *_entries)) { if (node->GetGUID().GetRawValue() != _lastNodeGuidRaw) { @@ -84,9 +92,10 @@ public: private: Player* _player; uint64 _lastNodeGuidRaw; + const std::vector* _entries; }; -static bool DoTeleNode(Player* player) +static bool DoTeleToList(Player* player, const std::vector& entries) { if (!player) return false; @@ -97,7 +106,7 @@ static bool DoTeleNode(Player* player) return true; } - if (GameObject* node = FindNearestReadyVein(player, TELEPORT_DISTANCE)) + if (GameObject* node = FindNearestReady(player, TELEPORT_DISTANCE, entries)) { uint64 lastGuid = node->GetGUID().GetRawValue(); @@ -109,12 +118,12 @@ static bool DoTeleNode(Player* player) node->GetOrientation() ); - player->m_Events.AddEvent(new TeleNodeRecheckEvent(player, lastGuid), + player->m_Events.AddEvent(new TeleRecheckEvent(player, lastGuid, &entries), player->m_Events.CalculateTime(RECHECK_DELAY_MS)); } else { - ChatHandler(player->GetSession()).PSendSysMessage("No mining nodes found within range."); + ChatHandler(player->GetSession()).PSendSysMessage("No objects found within range."); } return true; @@ -130,6 +139,7 @@ public: static ChatCommandTable commandTable = { { "yaynode", HandleTeleNode, SEC_PLAYER, Console::No }, + { "yayherb", HandleTeleHerb, SEC_PLAYER, Console::No }, }; return commandTable; } @@ -148,7 +158,23 @@ private: return false; } - return DoTeleNode(player); + return DoTeleToList(player, kVeinEntries); + } + + static bool HandleTeleHerb(ChatHandler* handler) + { + if (!handler) + return false; + + Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr; + if (!player) + { + handler->SendSysMessage("Player only."); + handler->SetSentErrorMessage(true); + return false; + } + + return DoTeleToList(player, kHerbEntries); } };