Fix tree farm

This commit is contained in:
Andrei Abrudan 2022-06-16 22:47:32 +01:00
parent 81b7256fde
commit 4a83fb0802

View File

@ -116,11 +116,48 @@ namespace cheat::feature
}
};
template <typename KeyT, typename ValT, uint32_t Size, class /*forward*/ _Hasher = std::hash<KeyT>>
class lra_map {
using key_value_pair = std::pair<KeyT, ValT>;
using list_iterator = typename std::list<key_value_pair>::iterator;
public:
void put(const KeyT& key, const ValT& val) {
auto it = elem_map.find(key);
// if element already in the map, don't modify it.
if (it != elem_map.end())
return;
items_list.push_front(key_value_pair(key, val));
elem_map[key] = items_list.begin();
if (Size < elem_map.size()) {
{
const KeyT& last_key = items_list.back().first;
elem_map.erase(last_key);
}
items_list.pop_back();
}
}
ValT& get(const KeyT& key) {
auto it = elem_map.find(key);
if (it == elem_map.end())
throw std::runtime_error("Tried to access key not present in map");
return it->second->second;
}
bool exists(const KeyT& key) const {
return elem_map.find(key) != elem_map.end();
}
protected:
std::list<key_value_pair> items_list;
std::unordered_map<KeyT, list_iterator, _Hasher> elem_map;
};
void AutoTreeFarm::OnGameUpdate()
{
static std::unordered_map<Vector3d, uint32_t, hash_fn> s_AttackCountMap;
static lra_map<Vector3d, uint32_t, 10, hash_fn> s_AttackCountMap;
static std::queue<app::SceneTreeObject*> s_AttackQueue;
static std::unordered_set<app::SceneTreeObject*> s_AttackQueueSet;
@ -173,11 +210,12 @@ namespace cheat::feature
if (m_AttackPerTree > 0)
{
if (s_AttackCountMap.count(position) == 0)
s_AttackCountMap[position] = 0;
if (!s_AttackCountMap.exists(position))
s_AttackCountMap.put(position, 0);
auto& attackCount = s_AttackCountMap[position];
auto& attackCount = s_AttackCountMap.get(position);
attackCount++;
if (attackCount > static_cast<uint32_t>(m_AttackPerTree))
continue;
}
@ -186,9 +224,6 @@ namespace cheat::feature
app::MoleMole_NetworkManager_RequestHitTreeDropNotify(networkManager, position, position, treeType, nullptr);
break;
}
if (s_AttackCountMap.size() > 1000)
s_AttackCountMap.clear();
}
}