From f4e1def666ec6ffae19748c9786483bcd14e2c48 Mon Sep 17 00:00:00 2001 From: Flerp Date: Sat, 1 Nov 2025 17:13:37 -0700 Subject: [PATCH] reworking looting to fully auto loot --- src/mod_autofish.cpp | 144 ++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 78 deletions(-) diff --git a/src/mod_autofish.cpp b/src/mod_autofish.cpp index 4f2eebf..700173a 100644 --- a/src/mod_autofish.cpp +++ b/src/mod_autofish.cpp @@ -1,98 +1,86 @@ #include "ScriptMgr.h" #include "Player.h" #include "GameObject.h" +#include "WorldSession.h" #include "ObjectAccessor.h" -#include "GridNotifiers.h" #include "CellImpl.h" -#include "Config.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "LootMgr.h" -namespace -{ - std::vector sBobberEntries; - bool sEnabled = true; - uint32 sTickMs = 200; - float sScanRange = 30.0f; - - std::vector ParseEntryList(std::string const& csv) - { - std::vector out; - std::stringstream ss(csv); - std::string item; - while (std::getline(ss, item, ',')) - { - auto trim = [](std::string& s) - { - s.erase(0, s.find_first_not_of(" \t\r\n")); - s.erase(s.find_last_not_of(" \t\r\n") + 1); - }; - trim(item); - if (!item.empty()) - out.push_back(static_cast(std::stoul(item))); - } - return out; - } - - void TryAutoLootNearbyBobber(Player* plr) - { - if (!plr || !plr->IsInWorld()) - return; - - std::list goList; - Acore::AllGameObjectsMatchingOneEntryInRange check(plr, sBobberEntries, sScanRange); - Acore::GameObjectListSearcher searcher(plr, goList, check); - Cell::VisitObjects(plr, searcher, sScanRange); - - for (GameObject* go : goList) - { - if (!go) - continue; - if (go->GetOwnerGUID() != plr->GetGUID()) - continue; - if (go->getLootState() == GO_READY) - { - plr->SendLoot(go->GetGUID(), LOOT_FISHING); - return; - } - } - } -} - -class AutoFish_WorldUpdate : public WorldScript +class mod_autofish_PlayerScript : public PlayerScript { public: - AutoFish_WorldUpdate() : WorldScript("AutoFish_WorldUpdate") {} + mod_autofish_PlayerScript() : PlayerScript("mod_autofish_PlayerScript") {} - void OnAfterConfigLoad(bool) override + void OnUpdate(Player* player, uint32) override { - sEnabled = sConfigMgr->GetOption("AutoFish.Enabled", true); - sTickMs = sConfigMgr->GetOption("AutoFish.TickMs", 200u); - sScanRange = sConfigMgr->GetOption("AutoFish.ScanRange", 30.0f); - sBobberEntries = ParseEntryList(sConfigMgr->GetOption("AutoFish.BobberEntries", "35591")); - } - - void OnUpdate(uint32 diff) override - { - if (!sEnabled) + if (!player->IsAlive() || player->IsInCombat() || player->GetMap()->IsBattlegroundOrArena()) return; - static uint32 acc = 0; - acc += diff; - if (acc < sTickMs) - return; - acc = 0; + Acore::GameObjectInRangeCheck check(player, player, 10.0f); + Acore::GameObjectSearcher searcher(player, foundBobber, check); + player->VisitNearbyGridObject(10.0f, searcher); - auto const& players = ObjectAccessor::GetPlayers(); - for (auto const& kv : players) + if (!foundBobber) + return; + + GameObject* go = foundBobber; + if (go->GetOwnerGUID() != player->GetGUID()) { - Player* plr = kv.second; - if (!plr || !plr->IsInWorld() || plr->IsGameMaster()) - continue; - TryAutoLootNearbyBobber(plr); + foundBobber = nullptr; + return; } + + if (go->GetGoState() != GO_STATE_READY) + { + foundBobber = nullptr; + return; + } + + player->SendLoot(go->GetGUID(), LOOT_FISHING); + Loot* loot = &go->loot; + for (uint32 i = 0; i < loot->items.size(); ++i) + player->StoreLootItem(i, loot); + player->SendLootRelease(go->GetGUID()); + + foundBobber = nullptr; } + +private: + static GameObject* foundBobber; }; -void AddSC_autofish_world() +GameObject* mod_autofish_PlayerScript::foundBobber = nullptr; + +class mod_autofish_WorldScript : public WorldScript { - new AutoFish_WorldUpdate(); +public: + mod_autofish_WorldScript() : WorldScript("mod_autofish_WorldScript") {} + + void OnGameObjectCreate(GameObject* go) override + { + if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE) + lastBobber = go; + } + + static GameObject* GetLastBobber() { return lastBobber; } + +private: + static GameObject* lastBobber; +}; + +GameObject* mod_autofish_WorldScript::lastBobber = nullptr; + +class mod_autofish_GridNotifier : public Acore::GameObjectSearcher +{ +public: + mod_autofish_GridNotifier(Player* p, GameObject*& result, Acore::GameObjectInRangeCheck const& check) + : Acore::GameObjectSearcher(p, result, check) {} +}; + +void Addmod_autofishScripts() +{ + new mod_autofish_PlayerScript(); + new mod_autofish_WorldScript(); }