Merge pull request #218 from andiabrudan/configurable_vacuum_loot
Add user configurable items to VacuumLoot
This commit is contained in:
commit
f644b32e71
@ -172,6 +172,30 @@ namespace util
|
|||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string SplitWords(const std::string& value)
|
||||||
|
{
|
||||||
|
std::stringstream outStream;
|
||||||
|
std::stringstream inStream(value);
|
||||||
|
|
||||||
|
char ch;
|
||||||
|
inStream >> ch;
|
||||||
|
outStream << ch;
|
||||||
|
while (inStream >> ch)
|
||||||
|
{
|
||||||
|
if (isupper(ch))
|
||||||
|
outStream << " ";
|
||||||
|
outStream << ch;
|
||||||
|
}
|
||||||
|
return outStream.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MakeCapital(std::string value)
|
||||||
|
{
|
||||||
|
if (islower(value[0]))
|
||||||
|
value[0] = toupper(value[0]);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
static const std::string base64_chars =
|
static const std::string base64_chars =
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
"abcdefghijklmnopqrstuvwxyz"
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
@ -37,6 +37,8 @@ namespace util
|
|||||||
int64_t GetCurrentTimeMillisec();
|
int64_t GetCurrentTimeMillisec();
|
||||||
|
|
||||||
std::vector<std::string> StringSplit(const std::string& delimiter, const std::string& content);
|
std::vector<std::string> StringSplit(const std::string& delimiter, const std::string& content);
|
||||||
|
std::string SplitWords(const std::string& value);
|
||||||
|
std::string MakeCapital(std::string value);
|
||||||
std::string to_hex_string(uint8_t* barray, int length);
|
std::string to_hex_string(uint8_t* barray, int length);
|
||||||
bool IsLittleEndian();
|
bool IsLittleEndian();
|
||||||
|
|
||||||
|
@ -409,31 +409,7 @@ namespace cheat::feature
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SplitWords(const std::string& value)
|
#define ADD_FILTER_FIELD(section, name) AddFilter(util::MakeCapital(#section), util::SplitWords(#name), &game::filters::##section##::##name##)
|
||||||
{
|
|
||||||
std::stringstream outStream;
|
|
||||||
std::stringstream inStream(value);
|
|
||||||
|
|
||||||
char ch;
|
|
||||||
inStream >> ch;
|
|
||||||
outStream << ch;
|
|
||||||
while (inStream >> ch)
|
|
||||||
{
|
|
||||||
if (isupper(ch))
|
|
||||||
outStream << " ";
|
|
||||||
outStream << ch;
|
|
||||||
}
|
|
||||||
return outStream.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string MakeCapital(std::string value)
|
|
||||||
{
|
|
||||||
if (islower(value[0]))
|
|
||||||
value[0] = toupper(value[0]);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ADD_FILTER_FIELD(section, name) AddFilter(MakeCapital(#section), SplitWords(#name), &game::filters::##section##::##name##)
|
|
||||||
void ESP::InstallFilters()
|
void ESP::InstallFilters()
|
||||||
{
|
{
|
||||||
ADD_FILTER_FIELD(collection, Book);
|
ADD_FILTER_FIELD(collection, Book);
|
||||||
|
@ -29,6 +29,16 @@ namespace cheat::game::filters
|
|||||||
ChestFilter STrap = ChestFilter(game::Chest::ChestState::Trap);
|
ChestFilter STrap = ChestFilter(game::Chest::ChestState::Trap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace equipment
|
||||||
|
{
|
||||||
|
SimpleFilter Artifacts = { app::EntityType__Enum_1::DropItem, "_Relic" };
|
||||||
|
SimpleFilter Bow = { app::EntityType__Enum_1::DropItem, "_Bow" };
|
||||||
|
SimpleFilter Claymore = { app::EntityType__Enum_1::DropItem, "_Claymore" };
|
||||||
|
SimpleFilter Catalyst = { app::EntityType__Enum_1::DropItem, "_Catalyst" };
|
||||||
|
SimpleFilter Pole = { app::EntityType__Enum_1::DropItem, "_Pole" };
|
||||||
|
SimpleFilter Sword = { app::EntityType__Enum_1::DropItem, "_Sword" };
|
||||||
|
}
|
||||||
|
|
||||||
namespace featured
|
namespace featured
|
||||||
{
|
{
|
||||||
SimpleFilter Anemoculus = { app::EntityType__Enum_1::GatherObject, "WindCrystalShell" };
|
SimpleFilter Anemoculus = { app::EntityType__Enum_1::GatherObject, "WindCrystalShell" };
|
||||||
@ -93,12 +103,13 @@ namespace cheat::game::filters
|
|||||||
SimpleFilter WeaselThief = { app::EntityType__Enum_1::Monster, "Thoarder_Weasel" };
|
SimpleFilter WeaselThief = { app::EntityType__Enum_1::Monster, "Thoarder_Weasel" };
|
||||||
SimpleFilter Kitsune = { app::EntityType__Enum_1::EnvAnimal, "Vulpes" };
|
SimpleFilter Kitsune = { app::EntityType__Enum_1::EnvAnimal, "Vulpes" };
|
||||||
SimpleFilter BakeDanuki = { app::EntityType__Enum_1::Monster, "Inu_Tanuki" };
|
SimpleFilter BakeDanuki = { app::EntityType__Enum_1::Monster, "Inu_Tanuki" };
|
||||||
|
SimpleFilter Meat = { app::EntityType__Enum_1::GatherObject , std::vector<std::string> { "_Food_BirdMeat", "_Food_Meat", "_Fishmeat" }};
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace mineral
|
namespace mineral
|
||||||
{
|
{
|
||||||
SimpleFilter AmethystLump = { app::EntityType__Enum_1::GatherObject, "_Thundercrystal" };
|
SimpleFilter AmethystLump = { app::EntityType__Enum_1::GatherObject, "_Thundercrystal" };
|
||||||
SimpleFilter ArchaicStone = { app::EntityType__Enum_1::GatherObject, "AncientOre" };
|
SimpleFilter ArchaicStone = { app::EntityType__Enum_1::GatherObject, "_AncientOre" };
|
||||||
SimpleFilter CorLapis = { app::EntityType__Enum_1::GatherObject, "_ElementRock" };
|
SimpleFilter CorLapis = { app::EntityType__Enum_1::GatherObject, "_ElementRock" };
|
||||||
SimpleFilter CrystalChunk = { app::EntityType__Enum_1::GatherObject,
|
SimpleFilter CrystalChunk = { app::EntityType__Enum_1::GatherObject,
|
||||||
std::vector<std::string> { "_OreCrystal", "_ShiningCrystalOre" } };
|
std::vector<std::string> { "_OreCrystal", "_ShiningCrystalOre" } };
|
||||||
@ -112,6 +123,16 @@ namespace cheat::game::filters
|
|||||||
SimpleFilter Starsilver = { app::EntityType__Enum_1::GatherObject, "_OreMoonMeteor" };
|
SimpleFilter Starsilver = { app::EntityType__Enum_1::GatherObject, "_OreMoonMeteor" };
|
||||||
SimpleFilter WhiteIronChunk = { app::EntityType__Enum_1::GatherObject, "_OreMetal" };
|
SimpleFilter WhiteIronChunk = { app::EntityType__Enum_1::GatherObject, "_OreMetal" };
|
||||||
SimpleFilter DunlinsTooth = { app::EntityType__Enum_1::GatherObject, "_DunlinsTooth" };
|
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 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" };
|
||||||
|
SimpleFilter MagicalCrystalChunkDrop = { app::EntityType__Enum_1::GatherObject, "_DropMagicCrystal" };
|
||||||
|
SimpleFilter ScarletQuartzDrop = { app::EntityType__Enum_1::GatherObject, "_DropDulinsBlood" };
|
||||||
|
SimpleFilter StarsilverDrop = { app::EntityType__Enum_1::GatherObject, "_DropMoonMeteor" };
|
||||||
|
SimpleFilter WhiteIronChunkDrop = { app::EntityType__Enum_1::GatherObject, "_Drop_Metal" };
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace monster
|
namespace monster
|
||||||
@ -193,6 +214,7 @@ namespace cheat::game::filters
|
|||||||
SimpleFilter BambooShoot = { app::EntityType__Enum_1::GatherObject, "_Bambooshoot" };
|
SimpleFilter BambooShoot = { app::EntityType__Enum_1::GatherObject, "_Bambooshoot" };
|
||||||
SimpleFilter Berry = { app::EntityType__Enum_1::GatherObject, "_Raspberry" };
|
SimpleFilter Berry = { app::EntityType__Enum_1::GatherObject, "_Raspberry" };
|
||||||
SimpleFilter CallaLily = { app::EntityType__Enum_1::GatherObject, "_Plant_Callas" };
|
SimpleFilter CallaLily = { app::EntityType__Enum_1::GatherObject, "_Plant_Callas" };
|
||||||
|
SimpleFilter Cabbage = { app::EntityType__Enum_1::GatherObject, "_Plant_Cabbage" };
|
||||||
SimpleFilter Carrot = { app::EntityType__Enum_1::GatherObject, "_Plant_Carrot" };
|
SimpleFilter Carrot = { app::EntityType__Enum_1::GatherObject, "_Plant_Carrot" };
|
||||||
SimpleFilter Cecilia = { app::EntityType__Enum_1::GatherObject, "_Cecilia" };
|
SimpleFilter Cecilia = { app::EntityType__Enum_1::GatherObject, "_Cecilia" };
|
||||||
SimpleFilter DandelionSeed = { app::EntityType__Enum_1::GatherObject, "_Plant_Dandelion" };
|
SimpleFilter DandelionSeed = { app::EntityType__Enum_1::GatherObject, "_Plant_Dandelion" };
|
||||||
@ -211,6 +233,7 @@ namespace cheat::game::filters
|
|||||||
SimpleFilter NakuWeed = { app::EntityType__Enum_1::GatherObject, "_Howlgrass" };
|
SimpleFilter NakuWeed = { app::EntityType__Enum_1::GatherObject, "_Howlgrass" };
|
||||||
SimpleFilter PhilanemoMushroom = { app::EntityType__Enum_1::GatherObject, "_WindmilHunter" };
|
SimpleFilter PhilanemoMushroom = { app::EntityType__Enum_1::GatherObject, "_WindmilHunter" };
|
||||||
SimpleFilter Pinecone = { app::EntityType__Enum_1::GatherObject, "_Drop_Plant_Pine" };
|
SimpleFilter Pinecone = { app::EntityType__Enum_1::GatherObject, "_Drop_Plant_Pine" };
|
||||||
|
SimpleFilter Potato = { app::EntityType__Enum_1::GatherObject, "_Plant_Potato" };
|
||||||
SimpleFilter Qingxin = { app::EntityType__Enum_1::GatherObject, "_QingXin" };
|
SimpleFilter Qingxin = { app::EntityType__Enum_1::GatherObject, "_QingXin" };
|
||||||
SimpleFilter Radish = { app::EntityType__Enum_1::GatherObject, "_Plant_Radish" };
|
SimpleFilter Radish = { app::EntityType__Enum_1::GatherObject, "_Plant_Radish" };
|
||||||
SimpleFilter SakuraBloom = { app::EntityType__Enum_1::GatherObject, "_Cherrypetals" };
|
SimpleFilter SakuraBloom = { app::EntityType__Enum_1::GatherObject, "_Cherrypetals" };
|
||||||
@ -224,6 +247,7 @@ namespace cheat::game::filters
|
|||||||
SimpleFilter SweetFlower = { app::EntityType__Enum_1::GatherObject, "_Plant_Whiteballet" };
|
SimpleFilter SweetFlower = { app::EntityType__Enum_1::GatherObject, "_Plant_Whiteballet" };
|
||||||
SimpleFilter Valberry = { app::EntityType__Enum_1::GatherObject, "_DropingBerry_Gather" };
|
SimpleFilter Valberry = { app::EntityType__Enum_1::GatherObject, "_DropingBerry_Gather" };
|
||||||
SimpleFilter Violetgrass = { app::EntityType__Enum_1::GatherObject, "_GlazedGrass" };
|
SimpleFilter Violetgrass = { app::EntityType__Enum_1::GatherObject, "_GlazedGrass" };
|
||||||
|
SimpleFilter Wheat = { app::EntityType__Enum_1::GatherObject, "_Plant_Wheat" };
|
||||||
SimpleFilter WindwheelAster = { app::EntityType__Enum_1::GatherObject, "_WindmilDaisy" };
|
SimpleFilter WindwheelAster = { app::EntityType__Enum_1::GatherObject, "_WindmilDaisy" };
|
||||||
SimpleFilter Wolfhook = { app::EntityType__Enum_1::GatherObject, "_GogoFruit" };
|
SimpleFilter Wolfhook = { app::EntityType__Enum_1::GatherObject, "_GogoFruit" };
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,16 @@ namespace cheat::game::filters
|
|||||||
extern ChestFilter STrap;
|
extern ChestFilter STrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace equipment
|
||||||
|
{
|
||||||
|
extern SimpleFilter Artifacts;
|
||||||
|
extern SimpleFilter Bow;
|
||||||
|
extern SimpleFilter Claymore;
|
||||||
|
extern SimpleFilter Catalyst;
|
||||||
|
extern SimpleFilter Pole;
|
||||||
|
extern SimpleFilter Sword;
|
||||||
|
}
|
||||||
|
|
||||||
namespace featured
|
namespace featured
|
||||||
{
|
{
|
||||||
extern SimpleFilter Anemoculus;
|
extern SimpleFilter Anemoculus;
|
||||||
@ -94,6 +104,7 @@ namespace cheat::game::filters
|
|||||||
extern SimpleFilter Weasel;
|
extern SimpleFilter Weasel;
|
||||||
extern SimpleFilter Kitsune;
|
extern SimpleFilter Kitsune;
|
||||||
extern SimpleFilter BakeDanuki;
|
extern SimpleFilter BakeDanuki;
|
||||||
|
extern SimpleFilter Meat;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace mineral
|
namespace mineral
|
||||||
@ -111,6 +122,16 @@ namespace cheat::game::filters
|
|||||||
extern SimpleFilter Starsilver;
|
extern SimpleFilter Starsilver;
|
||||||
extern SimpleFilter WhiteIronChunk;
|
extern SimpleFilter WhiteIronChunk;
|
||||||
extern SimpleFilter DunlinsTooth;
|
extern SimpleFilter DunlinsTooth;
|
||||||
|
|
||||||
|
extern SimpleFilter AmethystLumpDrop;
|
||||||
|
extern SimpleFilter CrystalChunkDrop;
|
||||||
|
extern SimpleFilter ElectroCrystalDrop;
|
||||||
|
extern SimpleFilter IronChunkDrop;
|
||||||
|
extern SimpleFilter NoctilucousJadeDrop;
|
||||||
|
extern SimpleFilter MagicalCrystalChunkDrop;
|
||||||
|
extern SimpleFilter ScarletQuartzDrop;
|
||||||
|
extern SimpleFilter StarsilverDrop;
|
||||||
|
extern SimpleFilter WhiteIronChunkDrop;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace monster
|
namespace monster
|
||||||
@ -189,6 +210,7 @@ namespace cheat::game::filters
|
|||||||
extern SimpleFilter Apple;
|
extern SimpleFilter Apple;
|
||||||
extern SimpleFilter BambooShoot;
|
extern SimpleFilter BambooShoot;
|
||||||
extern SimpleFilter Berry;
|
extern SimpleFilter Berry;
|
||||||
|
extern SimpleFilter Cabbage;
|
||||||
extern SimpleFilter CallaLily;
|
extern SimpleFilter CallaLily;
|
||||||
extern SimpleFilter Carrot;
|
extern SimpleFilter Carrot;
|
||||||
extern SimpleFilter Cecilia;
|
extern SimpleFilter Cecilia;
|
||||||
@ -208,6 +230,7 @@ namespace cheat::game::filters
|
|||||||
extern SimpleFilter NakuWeed;
|
extern SimpleFilter NakuWeed;
|
||||||
extern SimpleFilter PhilanemoMushroom;
|
extern SimpleFilter PhilanemoMushroom;
|
||||||
extern SimpleFilter Pinecone;
|
extern SimpleFilter Pinecone;
|
||||||
|
extern SimpleFilter Potato;
|
||||||
extern SimpleFilter Qingxin;
|
extern SimpleFilter Qingxin;
|
||||||
extern SimpleFilter Radish;
|
extern SimpleFilter Radish;
|
||||||
extern SimpleFilter SakuraBloom;
|
extern SimpleFilter SakuraBloom;
|
||||||
@ -221,6 +244,7 @@ namespace cheat::game::filters
|
|||||||
extern SimpleFilter SweetFlower;
|
extern SimpleFilter SweetFlower;
|
||||||
extern SimpleFilter Valberry;
|
extern SimpleFilter Valberry;
|
||||||
extern SimpleFilter Violetgrass;
|
extern SimpleFilter Violetgrass;
|
||||||
|
extern SimpleFilter Wheat;
|
||||||
extern SimpleFilter WindwheelAster;
|
extern SimpleFilter WindwheelAster;
|
||||||
extern SimpleFilter Wolfhook;
|
extern SimpleFilter Wolfhook;
|
||||||
}
|
}
|
||||||
|
@ -9,20 +9,44 @@
|
|||||||
namespace cheat::feature
|
namespace cheat::feature
|
||||||
{
|
{
|
||||||
VacuumLoot::VacuumLoot() : 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),
|
||||||
events::GameUpdateEvent += MY_METHOD_HANDLER(VacuumLoot::OnGameUpdate);
|
NF(f_Distance, "Distance", "VacuumLoot", 1.5f),
|
||||||
}
|
NF(f_Radius, "Radius", "VacuumLoot", 20.0f),
|
||||||
|
nextTime(0)
|
||||||
|
{
|
||||||
|
InstallFilters();
|
||||||
|
events::GameUpdateEvent += MY_METHOD_HANDLER(VacuumLoot::OnGameUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
const FeatureGUIInfo& VacuumLoot::GetGUIInfo() const
|
const FeatureGUIInfo& VacuumLoot::GetGUIInfo() const
|
||||||
{
|
{
|
||||||
static const FeatureGUIInfo info{ "", "World", true };
|
static const FeatureGUIInfo info{ "", "World", true };
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VacuumLoot::DrawMain()
|
void VacuumLoot::DrawMain()
|
||||||
{
|
{
|
||||||
ConfigWidget("Vacuum Loot", f_Enabled, "Vacuum Loot drops");
|
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("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"))
|
||||||
|
{
|
||||||
|
for (auto& [section, filters] : m_Sections)
|
||||||
|
{
|
||||||
|
ImGui::PushID(section.c_str());
|
||||||
|
DrawSection(section, filters);
|
||||||
|
ImGui::PopID();
|
||||||
|
}
|
||||||
|
ImGui::TreePop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndGroupPanel();
|
||||||
|
}
|
||||||
|
|
||||||
bool VacuumLoot::NeedStatusDraw() const
|
bool VacuumLoot::NeedStatusDraw() const
|
||||||
{
|
{
|
||||||
@ -31,7 +55,7 @@ namespace cheat::feature
|
|||||||
|
|
||||||
void VacuumLoot::DrawStatus()
|
void VacuumLoot::DrawStatus()
|
||||||
{
|
{
|
||||||
ImGui::Text ("VacuumLoot");
|
ImGui::Text("VacuumLoot");
|
||||||
}
|
}
|
||||||
|
|
||||||
VacuumLoot& VacuumLoot::GetInstance()
|
VacuumLoot& VacuumLoot::GetInstance()
|
||||||
@ -42,62 +66,151 @@ namespace cheat::feature
|
|||||||
|
|
||||||
bool VacuumLoot::IsEntityForVac(game::Entity* entity)
|
bool VacuumLoot::IsEntityForVac(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_Sections.begin(), m_Sections.end(),
|
||||||
|
[entity](std::pair<std::string, Filters> 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;
|
||||||
|
|
||||||
auto& manager = game::EntityManager::instance();
|
auto& manager = game::EntityManager::instance();
|
||||||
auto distance = manager.avatar()->distance(entity);
|
auto distance = manager.avatar()->distance(entity);
|
||||||
float radius = 100.0f;
|
|
||||||
|
|
||||||
// TODO: Add more on the filter list in the future
|
return distance <= f_Radius;
|
||||||
static std::vector<std::string> dropList
|
|
||||||
{
|
|
||||||
"SceneObj_DropItem",
|
|
||||||
"SceneObj_Ore_Drop",
|
|
||||||
"_DropMagicCrystal",
|
|
||||||
"_Thundercrystaldrop",
|
|
||||||
"_Ore_ElectricRock",
|
|
||||||
"_DropMoonMeteor_",
|
|
||||||
"_DropMagicCrystal",
|
|
||||||
"_Potato",
|
|
||||||
"_Radish02_Clear",
|
|
||||||
"_Cabbage",
|
|
||||||
"_Carrot02_Clear",
|
|
||||||
"_Wheat",
|
|
||||||
"Wisp",
|
|
||||||
"Meat",
|
|
||||||
"Fishmeat",
|
|
||||||
"Equip_Sword",
|
|
||||||
"Equip_Pole",
|
|
||||||
"Equip_Bow",
|
|
||||||
"Equip_Catalyst",
|
|
||||||
"Equip_Claymore",
|
|
||||||
"Eff_Animal"
|
|
||||||
};
|
|
||||||
|
|
||||||
for (auto& dropListNames : dropList)
|
|
||||||
if (entity->name().find(dropListNames) != std::string::npos)
|
|
||||||
return distance <= radius;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VacuumLoot::OnGameUpdate()
|
void VacuumLoot::OnGameUpdate()
|
||||||
{
|
{
|
||||||
if (!f_Enabled)
|
if (!f_Enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto currentTime = util::GetCurrentTimeMillisec();
|
auto currentTime = util::GetCurrentTimeMillisec();
|
||||||
if (currentTime < nextTime)
|
if (currentTime < nextTime)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& manager = game::EntityManager::instance();
|
auto& manager = game::EntityManager::instance();
|
||||||
auto avatarEntity = manager.avatar();
|
auto avatarEntity = manager.avatar();
|
||||||
for (const auto& entity : manager.entities())
|
|
||||||
{
|
|
||||||
if (!IsEntityForVac(entity))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
entity->setRelativePosition(avatarEntity->relativePosition());
|
for (const auto& entity : manager.entities())
|
||||||
}
|
{
|
||||||
nextTime = currentTime + 1000;
|
if (!IsEntityForVac(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)
|
||||||
|
{
|
||||||
|
bool checked = std::all_of(filters.begin(), filters.end(), [](const FilterInfo& filter) { return filter.first; });
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if (ImGui::BeginSelectableGroupPanel(section.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 = 3;
|
||||||
|
|
||||||
|
if (ImGui::BeginTable(section.c_str(), columns == 0 ? 1 : columns )) {
|
||||||
|
int i = 0;
|
||||||
|
for (std::pair<config::Field<bool>, game::IEntityFilter*> filter : filters) {
|
||||||
|
|
||||||
|
if (i % (columns == 0 ? 1 : columns) == 0)
|
||||||
|
{
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
ImGui::TableSetColumnIndex(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
|
||||||
|
ImGui::PushID(&filter);
|
||||||
|
ConfigWidget(filter.first);
|
||||||
|
ImGui::PopID();
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
ImGui::EndTable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndSelectableGroupPanel();
|
||||||
|
|
||||||
|
if (changed)
|
||||||
|
{
|
||||||
|
for (const auto& info : filters)
|
||||||
|
{
|
||||||
|
info.first.value() = checked;
|
||||||
|
info.first.FireChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VacuumLoot::AddFilter(const std::string& section, const std::string& name, game::IEntityFilter* filter)
|
||||||
|
{
|
||||||
|
if (m_Sections.count(section) == 0)
|
||||||
|
m_Sections[section] = {};
|
||||||
|
|
||||||
|
auto& filters = m_Sections[section];
|
||||||
|
bool newItem(filter);
|
||||||
|
filters.push_back({ config::CreateField<bool>(name,name,fmt::format("VacuumLoot::Filters::{}", section),false, newItem) , filter });
|
||||||
|
}
|
||||||
|
|
||||||
|
#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);
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// Ores that drops as a loot when destroyed
|
||||||
|
ADD_FILTER_FIELD(mineral, AmethystLumpDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, CrystalChunkDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, ElectroCrystalDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, IronChunkDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, NoctilucousJadeDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, MagicalCrystalChunkDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, ScarletQuartzDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, StarsilverDrop);
|
||||||
|
ADD_FILTER_FIELD(mineral, WhiteIronChunkDrop);
|
||||||
|
|
||||||
|
ADD_FILTER_FIELD(plant, Apple);
|
||||||
|
ADD_FILTER_FIELD(plant, Cabbage);
|
||||||
|
ADD_FILTER_FIELD(plant, Carrot);
|
||||||
|
ADD_FILTER_FIELD(plant, Potato);
|
||||||
|
ADD_FILTER_FIELD(plant, Radish);
|
||||||
|
ADD_FILTER_FIELD(plant, Sunsettia);
|
||||||
|
ADD_FILTER_FIELD(plant, Wheat);
|
||||||
|
|
||||||
|
ADD_FILTER_FIELD(living, CrystalCore);
|
||||||
|
ADD_FILTER_FIELD(living, Meat);
|
||||||
|
ADD_FILTER_FIELD(living, Crab);
|
||||||
|
ADD_FILTER_FIELD(living, Eel);
|
||||||
|
ADD_FILTER_FIELD(living, LizardTail);
|
||||||
|
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,17 @@
|
|||||||
#include <cheat/game/Entity.h>
|
#include <cheat/game/Entity.h>
|
||||||
#include <cheat/game/filters.h>
|
#include <cheat/game/filters.h>
|
||||||
#include <il2cpp-appdata.h>
|
#include <il2cpp-appdata.h>
|
||||||
|
#include <cheat-base/thread-safe.h>
|
||||||
|
|
||||||
namespace cheat::feature
|
namespace cheat::feature
|
||||||
{
|
{
|
||||||
|
|
||||||
class VacuumLoot : public Feature
|
class VacuumLoot : public Feature
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
config::Field<config::Toggle<Hotkey>> f_Enabled;
|
||||||
|
config::Field<float> f_Distance;
|
||||||
|
config::Field<float> f_Radius;
|
||||||
|
config::Field<int> f_DelayTime;
|
||||||
|
|
||||||
static VacuumLoot& GetInstance();
|
static VacuumLoot& GetInstance();
|
||||||
|
|
||||||
@ -23,11 +26,19 @@ namespace cheat::feature
|
|||||||
void DrawStatus() override;
|
void DrawStatus() override;
|
||||||
|
|
||||||
void OnGameUpdate();
|
void OnGameUpdate();
|
||||||
private:
|
|
||||||
|
|
||||||
std::vector<game::IEntityFilter*> m_Filters;
|
private:
|
||||||
|
using FilterInfo = std::pair<config::Field<bool>, game::IEntityFilter*>;
|
||||||
|
using Filters = std::vector<FilterInfo>;
|
||||||
|
using Sections = std::map<std::string, Filters>;
|
||||||
|
|
||||||
|
Sections m_Sections;
|
||||||
|
SafeValue<int64_t> nextTime;
|
||||||
|
|
||||||
VacuumLoot();
|
VacuumLoot();
|
||||||
int nextTime{};
|
void DrawSection(const std::string& section, const Filters& filters);
|
||||||
|
void InstallFilters();
|
||||||
|
void AddFilter(const std::string& section, const std::string& name, game::IEntityFilter* filter);
|
||||||
bool IsEntityForVac(cheat::game::Entity* entity);
|
bool IsEntityForVac(cheat::game::Entity* entity);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user