From 25900e24e25c4952a4140f28e8d2b1f62bb11fd6 Mon Sep 17 00:00:00 2001 From: biswop Date: Sun, 10 Jul 2022 16:42:56 +1000 Subject: [PATCH 1/4] added Mob Drop Radius so mob drops can work better with large kill aura's and added RadishDrop and CarrotDrop so the vacuum dont pick up the ones in the ground --- cheat-library/src/user/cheat/game/filters.cpp | 22 +-- cheat-library/src/user/cheat/game/filters.h | 6 +- .../src/user/cheat/world/VacuumLoot.cpp | 131 +++++++++++++++--- .../src/user/cheat/world/VacuumLoot.h | 9 ++ 4 files changed, 139 insertions(+), 29 deletions(-) diff --git a/cheat-library/src/user/cheat/game/filters.cpp b/cheat-library/src/user/cheat/game/filters.cpp index d3e54d0..93aca07 100644 --- a/cheat-library/src/user/cheat/game/filters.cpp +++ b/cheat-library/src/user/cheat/game/filters.cpp @@ -47,7 +47,7 @@ namespace cheat::game::filters SimpleFilter Electrogranum = { app::EntityType__Enum_1::Gadget, "ThunderSeedCreate" }; SimpleFilter FishingPoint = { app::EntityType__Enum_1::FishPool, "_FishingShoal" }; SimpleFilter Geoculus = { app::EntityType__Enum_1::GatherObject, "RockCrystalShell" }; - WhitelistFilter ItemDrops = { std::vector {app::EntityType__Enum_1::GatherObject, app::EntityType__Enum_1::DropItem }, std::vector {"_Food_BirdMeat", "_Food_Meat", "_DropItem" } }; + WhitelistFilter ItemDrops = { std::vector {app::EntityType__Enum_1::GatherObject, app::EntityType__Enum_1::DropItem }, std::vector {"_Food_BirdMeat", "_Food_Meat", "_DropItem","_Fishmeat" } }; SimpleFilter Lumenspar = { app::EntityType__Enum_1::GatherObject, "CelestiaSplinter" }; SimpleFilter KeySigil = { app::EntityType__Enum_1::GatherObject, "RuneContent" }; SimpleFilter ShrineOfDepth = { app::EntityType__Enum_1::Gadget, "Temple" }; @@ -103,7 +103,7 @@ namespace cheat::game::filters SimpleFilter WeaselThief = { app::EntityType__Enum_1::Monster, "Thoarder_Weasel" }; SimpleFilter Kitsune = { app::EntityType__Enum_1::EnvAnimal, "Vulpes" }; SimpleFilter BakeDanuki = { app::EntityType__Enum_1::Monster, "Inu_Tanuki" }; - SimpleFilter Meat = { app::EntityType__Enum_1::GatherObject , std::vector { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" }}; + SimpleFilter Meat = { app::EntityType__Enum_1::GatherObject , std::vector { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" } }; } namespace mineral @@ -125,7 +125,7 @@ namespace cheat::game::filters SimpleFilter DunlinsTooth = { app::EntityType__Enum_1::GatherObject, "_DunlinsTooth" }; SimpleFilter AmethystLumpDrop = { app::EntityType__Enum_1::GatherObject, "_Thundercrystaldrop" }; - SimpleFilter CrystalChunkDrop = { app::EntityType__Enum_1::GatherObject,"_Drop_Crystal"}; + SimpleFilter CrystalChunkDrop = { app::EntityType__Enum_1::GatherObject,"_Drop_Crystal" }; SimpleFilter ElectroCrystalDrop = { app::EntityType__Enum_1::GatherObject, "_Drop_Ore_ElectricRock" }; SimpleFilter IronChunkDrop = { app::EntityType__Enum_1::GatherObject, "_Drop_Stone" }; SimpleFilter NoctilucousJadeDrop = { app::EntityType__Enum_1::GatherObject,"_NightBerth" }; @@ -153,7 +153,7 @@ namespace cheat::game::filters SimpleFilter RuinGrader = { app::EntityType__Enum_1::Monster, "_Konungmathr" }; SimpleFilter RuinSentinel = { app::EntityType__Enum_1::Monster, "_Apparatus_Enigma" }; SimpleFilter Samachurl = { app::EntityType__Enum_1::Monster, "_Shaman" }; - SimpleFilter ShadowyHusk = { app::EntityType__Enum_1::Monster, "ForlornVessel_Strong" }; + SimpleFilter ShadowyHusk = { app::EntityType__Enum_1::Monster, "ForlornVessel_Strong" }; SimpleFilter Slime = { app::EntityType__Enum_1::Monster, "_Slime" }; SimpleFilter FloatingFungus = { app::EntityType__Enum_1::Monster, "_Fungus" }; SimpleFilter Specter = { app::EntityType__Enum_1::Monster, "_Sylph" }; @@ -250,6 +250,8 @@ namespace cheat::game::filters SimpleFilter Wheat = { app::EntityType__Enum_1::GatherObject, "_Plant_Wheat" }; SimpleFilter WindwheelAster = { app::EntityType__Enum_1::GatherObject, "_WindmilDaisy" }; SimpleFilter Wolfhook = { app::EntityType__Enum_1::GatherObject, "_GogoFruit" }; + SimpleFilter RadishDrop = { app::EntityType__Enum_1::GatherObject, "_Plant_Carrot02_Clear" }; + SimpleFilter CarrotDrop = { app::EntityType__Enum_1::GatherObject, "_Plant_Radish02_Clear" }; } namespace puzzle @@ -257,7 +259,7 @@ namespace cheat::game::filters SimpleFilter AncientRime = { app::EntityType__Enum_1::Gadget, "_IceSolidBulk" }; SimpleFilter BakeDanuki = { app::EntityType__Enum_1::Monster, "Animal_Inu_Tanuki_" }; SimpleFilter BloattyFloatty = { app::EntityType__Enum_1::Field, "_Flower_PongPongTree_" }; - WhitelistFilter CubeDevices = { std::vector {app::EntityType__Enum_1::Gadget, app::EntityType__Enum_1::Platform }, std::vector {"_ElecStone", "_ElecSwitch" }}; + WhitelistFilter CubeDevices = { std::vector {app::EntityType__Enum_1::Gadget, app::EntityType__Enum_1::Platform }, std::vector {"_ElecStone", "_ElecSwitch" } }; SimpleFilter EightStoneTablets = { app::EntityType__Enum_1::Gadget, "_HistoryBoard" }; SimpleFilter ElectricConduction = { app::EntityType__Enum_1::Gear, "_ElectricPowerSource" }; SimpleFilter RelayStone = { app::EntityType__Enum_1::Worktop, "_ElectricTransfer_" }; @@ -475,11 +477,11 @@ namespace cheat::game::filters app::EntityType__Enum_1::Monster }, std::vector { - // Environmental mobs - "Cat", "DogPrick", "Vulpues", "Inu_Tanuki", - // Overworld bosses - "Ningyo", "Regisvine", "Hypostasis", "Planelurker", "Nithhoggr" - } + // Environmental mobs + "Cat", "DogPrick", "Vulpues", "Inu_Tanuki", + // Overworld bosses + "Ningyo", "Regisvine", "Hypostasis", "Planelurker", "Nithhoggr" + } }; SimpleFilter OrganicTargets = Monsters + Animals; // Solael: Please don't mess around with this filter. //m0nkrel: We can choose the entities we need ourselves so as not to magnetize cats, dogs, etc. diff --git a/cheat-library/src/user/cheat/game/filters.h b/cheat-library/src/user/cheat/game/filters.h index 20617bf..5908042 100644 --- a/cheat-library/src/user/cheat/game/filters.h +++ b/cheat-library/src/user/cheat/game/filters.h @@ -247,6 +247,8 @@ namespace cheat::game::filters extern SimpleFilter Wheat; extern SimpleFilter WindwheelAster; extern SimpleFilter Wolfhook; + extern SimpleFilter RadishDrop; + extern SimpleFilter CarrotDrop; } namespace puzzle @@ -255,7 +257,7 @@ namespace cheat::game::filters extern SimpleFilter BakeDanuki; extern SimpleFilter BloattyFloatty; extern WhitelistFilter CubeDevices; - + extern SimpleFilter EightStoneTablets; extern SimpleFilter ElectricConduction; extern SimpleFilter RelayStone; @@ -302,7 +304,7 @@ namespace cheat::game::filters extern SimpleFilter MonsterBosses; extern SimpleFilter MonsterShielded; extern SimpleFilter MonsterEquips; - extern BlacklistFilter Living; + extern BlacklistFilter Living; extern SimpleFilter OrganicTargets; } } \ No newline at end of file diff --git a/cheat-library/src/user/cheat/world/VacuumLoot.cpp b/cheat-library/src/user/cheat/world/VacuumLoot.cpp index 851bc39..bbf2994 100644 --- a/cheat-library/src/user/cheat/world/VacuumLoot.cpp +++ b/cheat-library/src/user/cheat/world/VacuumLoot.cpp @@ -9,32 +9,34 @@ namespace cheat::feature { VacuumLoot::VacuumLoot() : Feature(), - NF(f_Enabled, "Vacuum Loot", "VacuumLoot", false), + NF(f_Enabled, "Vacuum Loot", "VacuumLoot", false), NF(f_DelayTime, "Delay time (in ms)", "VacuumLoot", 1000), - NF(f_Distance, "Distance", "VacuumLoot", 1.5f), - NF(f_Radius, "Radius", "VacuumLoot", 20.0f), + NF(f_Distance, "Distance", "VacuumLoot", 1.5f), + NF(f_MobDropRadius, "Mob Drop Radius", "VacuumLoot", 1.5f), + NF(f_Radius, "Radius", "VacuumLoot", 20.0f), nextTime(0) { InstallFilters(); + InstallFiltersMobDrop(); events::GameUpdateEvent += MY_METHOD_HANDLER(VacuumLoot::OnGameUpdate); } const FeatureGUIInfo& VacuumLoot::GetGUIInfo() const { - static const FeatureGUIInfo info{ "", "World", true }; + static const FeatureGUIInfo info{ "Vacuum Loot", "World", true }; return info; } void VacuumLoot::DrawMain() { - if (ImGui::BeginGroupPanel("Vacuum Loot", false)) - { + ConfigWidget("Enabled", f_Enabled, "Vacuum Loot drops"); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f); ConfigWidget("Delay Time (ms)", f_DelayTime, 1, 0, 1000, "Delay (in ms) between loot vacuum."); ConfigWidget("Radius (m)", f_Radius, 0.1f, 5.0f, 100.0f, "Radius of loot vacuum."); + ConfigWidget("Mob Drop Radius (m)", f_MobDropRadius, 0.1f, 5.0f, 100.0f, "Radius of Mob Drop vacuum."); ConfigWidget("Distance (m)", f_Distance, 0.1f, 1.0f, 10.0f, "Distance between the player and the loot.\n" "Values under 1.5 may be too intruding."); - if (ImGui::TreeNode(this, "Loot Types")) + if (ImGui::TreeNode("Loot Types")) { for (auto& [section, filters] : m_Sections) { @@ -44,8 +46,17 @@ namespace cheat::feature } ImGui::TreePop(); } - } - ImGui::EndGroupPanel(); + + if (ImGui::TreeNode("Mob Drop Types")) + { + for (auto& [sectionMobDrop, filtersMobDrop] : m_SectionsMobDrop) + { + ImGui::PushID(sectionMobDrop.c_str()); + DrawSectionMobDrop(sectionMobDrop, filtersMobDrop); + ImGui::PopID(); + } + ImGui::TreePop(); + } } bool VacuumLoot::NeedStatusDraw() const @@ -81,6 +92,23 @@ namespace cheat::feature return distance <= f_Radius; } + bool VacuumLoot::IsEntityForMobDropVac(game::Entity* entity) + { + // Go through all sections. For each section, go through all filters. + // If a filter matches the given entity and that filter is enabled, return true. + bool entityValid = std::any_of(m_SectionsMobDrop.begin(), m_SectionsMobDrop.end(), + [entity](std::pair const& sectionMobDrop) { + return std::any_of(sectionMobDrop.second.begin(), sectionMobDrop.second.end(), [entity](const FilterInfoMobDrop& FilterInfoMobDrop) { + return FilterInfoMobDrop.second->IsValid(entity) && FilterInfoMobDrop.first; }); + }); + + if (!entityValid)return false; + + auto& manager = game::EntityManager::instance(); + auto distance = manager.avatar()->distance(entity); + + return distance <= f_MobDropRadius; + } void VacuumLoot::OnGameUpdate() { @@ -93,7 +121,6 @@ namespace cheat::feature auto& manager = game::EntityManager::instance(); auto avatarEntity = manager.avatar(); - for (const auto& entity : manager.entities()) { if (!IsEntityForVac(entity)) @@ -102,6 +129,14 @@ namespace cheat::feature entity->setRelativePosition(avatarEntity->relativePosition() + avatarEntity->forward() * f_Distance); } nextTime = currentTime + f_DelayTime.value(); + for (const auto& entity : manager.entities()) + { + if (!IsEntityForMobDropVac(entity)) + continue; + + entity->setRelativePosition(avatarEntity->relativePosition() + avatarEntity->forward() * f_Distance); + } + nextTime = currentTime + f_DelayTime.value(); } void VacuumLoot::DrawSection(const std::string& section, const Filters& filters) @@ -120,13 +155,13 @@ namespace cheat::feature if (ImGui::BeginTable(section.c_str(), columns == 0 ? 1 : columns )) { int i = 0; for (std::pair, game::IEntityFilter*> filter : filters) { - + if (i % (columns == 0 ? 1 : columns) == 0) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); } - else + else ImGui::TableNextColumn(); ImGui::PushID(&filter); @@ -147,6 +182,52 @@ namespace cheat::feature info.first.FireChanged(); } } + + } + void VacuumLoot::DrawSectionMobDrop(const std::string& sectionMobDrop, const filtersMobDrop& filtersMobDrop) + { + bool checked = std::all_of(filtersMobDrop.begin(), filtersMobDrop.end(), [](const FilterInfoMobDrop& filterMobDrop) { return filterMobDrop.first; }); + bool changed = false; + + if (ImGui::BeginSelectableGroupPanel(sectionMobDrop.c_str(), checked, changed, true)) + { + // TODO : Get Max Container Width and Calculate Max Item Width of Checkbox + Text / or specify same width for all columns + // then divide MaxWidth by ItemWidth/ColumnWidth and asign a floor result >= 1 to columns. + // Though this is also just fine IMO. + + int columns = 2; + + if (ImGui::BeginTable(sectionMobDrop.c_str(), columns == 0 ? 1 : columns)) { + int i = 0; + for (std::pair, game::IEntityFilter*> filterMobDrop : filtersMobDrop) { + + if (i % (columns == 0 ? 1 : columns) == 0) + { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + } + else + ImGui::TableNextColumn(); + + ImGui::PushID(&filterMobDrop); + ConfigWidget(filterMobDrop.first); + ImGui::PopID(); + i++; + } + ImGui::EndTable(); + } + } + ImGui::EndSelectableGroupPanel(); + + if (changed) + { + for (const auto& info : filtersMobDrop) + { + info.first.value() = checked; + info.first.FireChanged(); + } + } + } void VacuumLoot::AddFilter(const std::string& section, const std::string& name, game::IEntityFilter* filter) @@ -158,14 +239,20 @@ namespace cheat::feature bool newItem(filter); filters.push_back({ config::CreateField(name,name,fmt::format("VacuumLoot::Filters::{}", section),false, newItem) , filter }); } + void VacuumLoot::AddFilterMobDrop(const std::string& sectionMobDrop, const std::string& nameMobDrop, game::IEntityFilter* filterMobDrop) + { + if (m_SectionsMobDrop.count(sectionMobDrop) == 0) + m_SectionsMobDrop[sectionMobDrop] = {}; + + auto& filtersMobDrop = m_SectionsMobDrop[sectionMobDrop]; + bool newItem(filterMobDrop); + filtersMobDrop.push_back({ config::CreateField(nameMobDrop,nameMobDrop,fmt::format("VacuumLoot::filtersMobDrop::{}", sectionMobDrop),false, newItem) , filterMobDrop }); + } #define ADD_FILTER_FIELD(section, name) AddFilter(util::MakeCapital(#section), util::SplitWords(#name), &game::filters::##section##::##name##) void VacuumLoot::InstallFilters() { // Add more in the future - - ADD_FILTER_FIELD(featured, ItemDrops); - // ADD_FILTER_FIELD(mineral, AmethystLump); // ADD_FILTER_FIELD(mineral, ArchaicStone); // ADD_FILTER_FIELD(mineral, CorLapis); @@ -193,9 +280,9 @@ namespace cheat::feature ADD_FILTER_FIELD(plant, Apple); ADD_FILTER_FIELD(plant, Cabbage); - ADD_FILTER_FIELD(plant, Carrot); + ADD_FILTER_FIELD(plant, CarrotDrop); ADD_FILTER_FIELD(plant, Potato); - ADD_FILTER_FIELD(plant, Radish); + ADD_FILTER_FIELD(plant, RadishDrop); ADD_FILTER_FIELD(plant, Sunsettia); ADD_FILTER_FIELD(plant, Wheat); @@ -204,6 +291,16 @@ namespace cheat::feature ADD_FILTER_FIELD(living, Crab); ADD_FILTER_FIELD(living, Eel); ADD_FILTER_FIELD(living, LizardTail); + ADD_FILTER_FIELD(living, Fish); + } +#undef ADD_FILTER_FIELD + +#define ADD_FILTER_FIELD(sectionMobDrop, nameMobDrop) AddFilterMobDrop(util::MakeCapital(#sectionMobDrop), util::SplitWords(#nameMobDrop), &game::filters::##sectionMobDrop##::##nameMobDrop##) + void VacuumLoot::InstallFiltersMobDrop() + { + // Add more in the future + + ADD_FILTER_FIELD(featured, ItemDrops); ADD_FILTER_FIELD(equipment, Artifacts); ADD_FILTER_FIELD(equipment, Bow); diff --git a/cheat-library/src/user/cheat/world/VacuumLoot.h b/cheat-library/src/user/cheat/world/VacuumLoot.h index 007d4bb..b544a83 100644 --- a/cheat-library/src/user/cheat/world/VacuumLoot.h +++ b/cheat-library/src/user/cheat/world/VacuumLoot.h @@ -15,6 +15,7 @@ namespace cheat::feature config::Field> f_Enabled; config::Field f_Distance; config::Field f_Radius; + config::Field f_MobDropRadius; config::Field f_DelayTime; static VacuumLoot& GetInstance(); @@ -31,14 +32,22 @@ namespace cheat::feature using FilterInfo = std::pair, game::IEntityFilter*>; using Filters = std::vector; using Sections = std::map; + using FilterInfoMobDrop = std::pair, game::IEntityFilter*>; + using filtersMobDrop = std::vector; + using SectionsMobDrop = std::map; Sections m_Sections; + SectionsMobDrop m_SectionsMobDrop; SafeValue nextTime; VacuumLoot(); void DrawSection(const std::string& section, const Filters& filters); + void DrawSectionMobDrop(const std::string& sectionMobDrop, const filtersMobDrop& filtersMobDrop); void InstallFilters(); + void InstallFiltersMobDrop(); void AddFilter(const std::string& section, const std::string& name, game::IEntityFilter* filter); + void AddFilterMobDrop(const std::string& sectionMobDrop, const std::string& nameMobDrop, game::IEntityFilter* filterMobDrop); bool IsEntityForVac(cheat::game::Entity* entity); + bool IsEntityForMobDropVac(cheat::game::Entity* entity); }; } From ceabb0aca35e0bbde1bccd7b15c1332580a11dc1 Mon Sep 17 00:00:00 2001 From: HarrySilan Date: Thu, 14 Jul 2022 20:56:50 +0800 Subject: [PATCH 2/4] simpler code and cleanup --- .../src/user/cheat/world/VacuumLoot.cpp | 143 +++--------------- .../src/user/cheat/world/VacuumLoot.h | 18 ++- 2 files changed, 27 insertions(+), 134 deletions(-) diff --git a/cheat-library/src/user/cheat/world/VacuumLoot.cpp b/cheat-library/src/user/cheat/world/VacuumLoot.cpp index bbf2994..2792ab3 100644 --- a/cheat-library/src/user/cheat/world/VacuumLoot.cpp +++ b/cheat-library/src/user/cheat/world/VacuumLoot.cpp @@ -17,7 +17,6 @@ namespace cheat::feature nextTime(0) { InstallFilters(); - InstallFiltersMobDrop(); events::GameUpdateEvent += MY_METHOD_HANDLER(VacuumLoot::OnGameUpdate); } @@ -32,8 +31,9 @@ namespace cheat::feature ConfigWidget("Enabled", f_Enabled, "Vacuum Loot drops"); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f); ConfigWidget("Delay Time (ms)", f_DelayTime, 1, 0, 1000, "Delay (in ms) between loot vacuum."); - ConfigWidget("Radius (m)", f_Radius, 0.1f, 5.0f, 100.0f, "Radius of loot vacuum."); - ConfigWidget("Mob Drop Radius (m)", f_MobDropRadius, 0.1f, 5.0f, 100.0f, "Radius of Mob Drop vacuum."); + ConfigWidget("Radius (m)", f_Radius, 0.1f, 5.0f, 100.0f, "Radius of common loot vacuum."); + ConfigWidget("Mob Drop Radius (m)", f_MobDropRadius, 0.1f, 5.0f, 150.0f, "Radius of mob drop vacuum.\n" + "(Item Drops and Equipments)"); ConfigWidget("Distance (m)", f_Distance, 0.1f, 1.0f, 10.0f, "Distance between the player and the loot.\n" "Values under 1.5 may be too intruding."); if (ImGui::TreeNode("Loot Types")) @@ -46,17 +46,6 @@ namespace cheat::feature } ImGui::TreePop(); } - - if (ImGui::TreeNode("Mob Drop Types")) - { - for (auto& [sectionMobDrop, filtersMobDrop] : m_SectionsMobDrop) - { - ImGui::PushID(sectionMobDrop.c_str()); - DrawSectionMobDrop(sectionMobDrop, filtersMobDrop); - ImGui::PopID(); - } - ImGui::TreePop(); - } } bool VacuumLoot::NeedStatusDraw() const @@ -79,35 +68,22 @@ namespace cheat::feature { // Go through all sections. For each section, go through all filters. // If a filter matches the given entity and that filter is enabled, return true. + bool entityValid = std::any_of(m_Sections.begin(), m_Sections.end(), [entity](std::pair const& section) { return std::any_of(section.second.begin(), section.second.end(), [entity](const FilterInfo& filterInfo) { return filterInfo.second->IsValid(entity) && filterInfo.first; }); }); - if (!entityValid)return false; + if (!entityValid) return false; + + bool isMobDrop = std::any_of(m_MobDropFilter.begin(), m_MobDropFilter.end(), + [entity](const game::IEntityFilter* filter) { return filter->IsValid(entity); }); auto& manager = game::EntityManager::instance(); auto distance = manager.avatar()->distance(entity); - return distance <= f_Radius; - } - bool VacuumLoot::IsEntityForMobDropVac(game::Entity* entity) - { - // Go through all sections. For each section, go through all filters. - // If a filter matches the given entity and that filter is enabled, return true. - bool entityValid = std::any_of(m_SectionsMobDrop.begin(), m_SectionsMobDrop.end(), - [entity](std::pair const& sectionMobDrop) { - return std::any_of(sectionMobDrop.second.begin(), sectionMobDrop.second.end(), [entity](const FilterInfoMobDrop& FilterInfoMobDrop) { - return FilterInfoMobDrop.second->IsValid(entity) && FilterInfoMobDrop.first; }); - }); - - if (!entityValid)return false; - - auto& manager = game::EntityManager::instance(); - auto distance = manager.avatar()->distance(entity); - - return distance <= f_MobDropRadius; + return distance <= isMobDrop ? f_MobDropRadius : f_Radius; } void VacuumLoot::OnGameUpdate() @@ -129,14 +105,6 @@ namespace cheat::feature entity->setRelativePosition(avatarEntity->relativePosition() + avatarEntity->forward() * f_Distance); } nextTime = currentTime + f_DelayTime.value(); - for (const auto& entity : manager.entities()) - { - if (!IsEntityForMobDropVac(entity)) - continue; - - entity->setRelativePosition(avatarEntity->relativePosition() + avatarEntity->forward() * f_Distance); - } - nextTime = currentTime + f_DelayTime.value(); } void VacuumLoot::DrawSection(const std::string& section, const Filters& filters) @@ -183,51 +151,6 @@ namespace cheat::feature } } - } - void VacuumLoot::DrawSectionMobDrop(const std::string& sectionMobDrop, const filtersMobDrop& filtersMobDrop) - { - bool checked = std::all_of(filtersMobDrop.begin(), filtersMobDrop.end(), [](const FilterInfoMobDrop& filterMobDrop) { return filterMobDrop.first; }); - bool changed = false; - - if (ImGui::BeginSelectableGroupPanel(sectionMobDrop.c_str(), checked, changed, true)) - { - // TODO : Get Max Container Width and Calculate Max Item Width of Checkbox + Text / or specify same width for all columns - // then divide MaxWidth by ItemWidth/ColumnWidth and asign a floor result >= 1 to columns. - // Though this is also just fine IMO. - - int columns = 2; - - if (ImGui::BeginTable(sectionMobDrop.c_str(), columns == 0 ? 1 : columns)) { - int i = 0; - for (std::pair, game::IEntityFilter*> filterMobDrop : filtersMobDrop) { - - if (i % (columns == 0 ? 1 : columns) == 0) - { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - } - else - ImGui::TableNextColumn(); - - ImGui::PushID(&filterMobDrop); - ConfigWidget(filterMobDrop.first); - ImGui::PopID(); - i++; - } - ImGui::EndTable(); - } - } - ImGui::EndSelectableGroupPanel(); - - if (changed) - { - for (const auto& info : filtersMobDrop) - { - info.first.value() = checked; - info.first.FireChanged(); - } - } - } void VacuumLoot::AddFilter(const std::string& section, const std::string& name, game::IEntityFilter* filter) @@ -239,35 +162,19 @@ namespace cheat::feature bool newItem(filter); filters.push_back({ config::CreateField(name,name,fmt::format("VacuumLoot::Filters::{}", section),false, newItem) , filter }); } - void VacuumLoot::AddFilterMobDrop(const std::string& sectionMobDrop, const std::string& nameMobDrop, game::IEntityFilter* filterMobDrop) - { - if (m_SectionsMobDrop.count(sectionMobDrop) == 0) - m_SectionsMobDrop[sectionMobDrop] = {}; - - auto& filtersMobDrop = m_SectionsMobDrop[sectionMobDrop]; - bool newItem(filterMobDrop); - filtersMobDrop.push_back({ config::CreateField(nameMobDrop,nameMobDrop,fmt::format("VacuumLoot::filtersMobDrop::{}", sectionMobDrop),false, newItem) , filterMobDrop }); - } #define ADD_FILTER_FIELD(section, name) AddFilter(util::MakeCapital(#section), util::SplitWords(#name), &game::filters::##section##::##name##) void VacuumLoot::InstallFilters() { - // Add more in the future - // ADD_FILTER_FIELD(mineral, AmethystLump); - // ADD_FILTER_FIELD(mineral, ArchaicStone); - // ADD_FILTER_FIELD(mineral, CorLapis); - // ADD_FILTER_FIELD(mineral, CrystalChunk); - // ADD_FILTER_FIELD(mineral, CrystalMarrow); - // ADD_FILTER_FIELD(mineral, ElectroCrystal); - // ADD_FILTER_FIELD(mineral, IronChunk); - // ADD_FILTER_FIELD(mineral, NoctilucousJade); - // ADD_FILTER_FIELD(mineral, MagicalCrystalChunk); - // ADD_FILTER_FIELD(mineral, ScarletQuartz); - // ADD_FILTER_FIELD(mineral, Starsilver); - // ADD_FILTER_FIELD(mineral, WhiteIronChunk); - // ADD_FILTER_FIELD(mineral, DunlinsTooth); + ADD_FILTER_FIELD(featured, ItemDrops); + + ADD_FILTER_FIELD(equipment, Artifacts); + ADD_FILTER_FIELD(equipment, Bow); + ADD_FILTER_FIELD(equipment, Catalyst); + ADD_FILTER_FIELD(equipment, Claymore); + ADD_FILTER_FIELD(equipment, Sword); + ADD_FILTER_FIELD(equipment, Pole); - // Ores that drops as a loot when destroyed ADD_FILTER_FIELD(mineral, AmethystLumpDrop); ADD_FILTER_FIELD(mineral, CrystalChunkDrop); ADD_FILTER_FIELD(mineral, ElectroCrystalDrop); @@ -294,20 +201,4 @@ namespace cheat::feature ADD_FILTER_FIELD(living, Fish); } #undef ADD_FILTER_FIELD - -#define ADD_FILTER_FIELD(sectionMobDrop, nameMobDrop) AddFilterMobDrop(util::MakeCapital(#sectionMobDrop), util::SplitWords(#nameMobDrop), &game::filters::##sectionMobDrop##::##nameMobDrop##) - void VacuumLoot::InstallFiltersMobDrop() - { - // Add more in the future - - ADD_FILTER_FIELD(featured, ItemDrops); - - ADD_FILTER_FIELD(equipment, Artifacts); - ADD_FILTER_FIELD(equipment, Bow); - ADD_FILTER_FIELD(equipment, Catalyst); - ADD_FILTER_FIELD(equipment, Claymore); - ADD_FILTER_FIELD(equipment, Sword); - ADD_FILTER_FIELD(equipment, Pole); - } -#undef ADD_FILTER_FIELD } diff --git a/cheat-library/src/user/cheat/world/VacuumLoot.h b/cheat-library/src/user/cheat/world/VacuumLoot.h index b544a83..8f56091 100644 --- a/cheat-library/src/user/cheat/world/VacuumLoot.h +++ b/cheat-library/src/user/cheat/world/VacuumLoot.h @@ -32,22 +32,24 @@ namespace cheat::feature using FilterInfo = std::pair, game::IEntityFilter*>; using Filters = std::vector; using Sections = std::map; - using FilterInfoMobDrop = std::pair, game::IEntityFilter*>; - using filtersMobDrop = std::vector; - using SectionsMobDrop = std::map; Sections m_Sections; - SectionsMobDrop m_SectionsMobDrop; SafeValue nextTime; + const std::vector m_MobDropFilter = { + & game::filters::featured::ItemDrops, + & game::filters::equipment::Artifacts, + & game::filters::equipment::Bow, + & game::filters::equipment::Catalyst, + & game::filters::equipment::Claymore, + & game::filters::equipment::Pole, + & game::filters::equipment::Sword + }; + VacuumLoot(); void DrawSection(const std::string& section, const Filters& filters); - void DrawSectionMobDrop(const std::string& sectionMobDrop, const filtersMobDrop& filtersMobDrop); void InstallFilters(); - void InstallFiltersMobDrop(); void AddFilter(const std::string& section, const std::string& name, game::IEntityFilter* filter); - void AddFilterMobDrop(const std::string& sectionMobDrop, const std::string& nameMobDrop, game::IEntityFilter* filterMobDrop); bool IsEntityForVac(cheat::game::Entity* entity); - bool IsEntityForMobDropVac(cheat::game::Entity* entity); }; } From db61d1b5a6db15c42a6cfbabaf4aed4e80d491d8 Mon Sep 17 00:00:00 2001 From: HarrySilan Date: Fri, 15 Jul 2022 18:49:53 +0800 Subject: [PATCH 3/4] radius condition fix --- cheat-library/src/user/cheat/world/VacuumLoot.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cheat-library/src/user/cheat/world/VacuumLoot.cpp b/cheat-library/src/user/cheat/world/VacuumLoot.cpp index 2792ab3..08e0271 100644 --- a/cheat-library/src/user/cheat/world/VacuumLoot.cpp +++ b/cheat-library/src/user/cheat/world/VacuumLoot.cpp @@ -12,7 +12,7 @@ namespace cheat::feature NF(f_Enabled, "Vacuum Loot", "VacuumLoot", false), NF(f_DelayTime, "Delay time (in ms)", "VacuumLoot", 1000), NF(f_Distance, "Distance", "VacuumLoot", 1.5f), - NF(f_MobDropRadius, "Mob Drop Radius", "VacuumLoot", 1.5f), + NF(f_MobDropRadius, "Mob Drop Radius", "VacuumLoot", 20.0f), NF(f_Radius, "Radius", "VacuumLoot", 20.0f), nextTime(0) { @@ -32,7 +32,7 @@ namespace cheat::feature ConfigWidget("Enabled", f_Enabled, "Vacuum Loot drops"); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f); ConfigWidget("Delay Time (ms)", f_DelayTime, 1, 0, 1000, "Delay (in ms) between loot vacuum."); ConfigWidget("Radius (m)", f_Radius, 0.1f, 5.0f, 100.0f, "Radius of common loot vacuum."); - ConfigWidget("Mob Drop Radius (m)", f_MobDropRadius, 0.1f, 5.0f, 150.0f, "Radius of mob drop vacuum.\n" + ConfigWidget("Mob Drop Radius (m)", f_MobDropRadius, 0.1f, 5.0f, 100.0f, "Radius of mob drop vacuum.\n" "(Item Drops and Equipments)"); ConfigWidget("Distance (m)", f_Distance, 0.1f, 1.0f, 10.0f, "Distance between the player and the loot.\n" "Values under 1.5 may be too intruding."); @@ -83,7 +83,7 @@ namespace cheat::feature auto& manager = game::EntityManager::instance(); auto distance = manager.avatar()->distance(entity); - return distance <= isMobDrop ? f_MobDropRadius : f_Radius; + return distance <= (isMobDrop ? f_MobDropRadius : f_Radius); } void VacuumLoot::OnGameUpdate() From 128007b5e1287836559e06f1e1fbb6e9bb00034c Mon Sep 17 00:00:00 2001 From: HarrySilan Date: Fri, 15 Jul 2022 19:08:14 +0800 Subject: [PATCH 4/4] status entry for vacuum loot properties --- cheat-library/src/user/cheat/world/VacuumLoot.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cheat-library/src/user/cheat/world/VacuumLoot.cpp b/cheat-library/src/user/cheat/world/VacuumLoot.cpp index 08e0271..66d8bc6 100644 --- a/cheat-library/src/user/cheat/world/VacuumLoot.cpp +++ b/cheat-library/src/user/cheat/world/VacuumLoot.cpp @@ -55,7 +55,12 @@ namespace cheat::feature void VacuumLoot::DrawStatus() { - ImGui::Text("VacuumLoot"); + ImGui::Text("VacuumLoot\n[%dms|%.01fm|%.01fm|%.01fm]", + f_DelayTime.value(), + f_Radius.value(), + f_MobDropRadius.value(), + f_Distance.value() + ); } VacuumLoot& VacuumLoot::GetInstance()