silent aim and entity list
for simple silent aim that works with most projectiles you can hook the following functions and manipulate the paramaters they receive so velocity ( because the functions use that instead of angles ) match aimbot's:
you can even modify the projectile's origin ( position ) to teleport them, though the limit is 4 units from the character. you could still use the game's raycast function to achieve auto-wall by getting the position before the first collideable hit from the target to the character, checking if it's 4 units away from the character and placing it there if so.
for proper silent aim you would have to check where the game gets the camera angles from ( because ofc it uses that for the projectile's velocity, which you can also manipulate so the projectile goes further and faster, just like volatile velocity empowered gem effect ) and provide aimbot angles instead. i never bothered to do that.
the entity list is a linked list of metadata ( seemingly just "dormant" state ) XOR'd with actual entity pointer, located @ offset 0x7C in the World object 8B 0D ?? ?? ?? ?? 68 ?? ?? ?? ?? E8 ?? ?? ?? ?? 85 C0 0F 84 2A 01 00 00
World struct:
EntityInfo struct:
EntityInfoNode struct:
EntityInfoList struct:
- SetProjectileOrigin xref E8 ?? ?? ?? ?? 8B 06 8B CE FF 50 ?? 5E 8B E5 5D 8B E3 5B C3 C6 86
- SetProjectileOriginAndFire xref E8 ?? ?? ?? ?? 8B 06 8D 4D B8 51 8D 4D E8 C7 45 ?? ?? ?? ?? ?? 51 8B CE C7 45 ?? ?? ?? ?? ?? C7 45 F0 00 00 00 00 C7 45 F4 00 00 00 00 FF 50 ?? 8D 4D B8 E8 ?? ?? ?? ?? 8B CE
- there are other functions but i forgot them and lost their signatures
you can even modify the projectile's origin ( position ) to teleport them, though the limit is 4 units from the character. you could still use the game's raycast function to achieve auto-wall by getting the position before the first collideable hit from the target to the character, checking if it's 4 units away from the character and placing it there if so.
for proper silent aim you would have to check where the game gets the camera angles from ( because ofc it uses that for the projectile's velocity, which you can also manipulate so the projectile goes further and faster, just like volatile velocity empowered gem effect ) and provide aimbot angles instead. i never bothered to do that.
the entity list is a linked list of metadata ( seemingly just "dormant" state ) XOR'd with actual entity pointer, located @ offset 0x7C in the World object 8B 0D ?? ?? ?? ?? 68 ?? ?? ?? ?? E8 ?? ?? ?? ?? 85 C0 0F 84 2A 01 00 00
World struct:
Code:
namespace ChloeOwO::Trove {
namespace Entities {
struct EntityInfo;
}
namespace Core {
struct WorldMetadata;
struct World {
private:
std::uint8_t gap0[124]; /* 0x0 */
public:
ChloeOwO::Trove::Entities::EntityInfoList entity_info_list; /* 0x7C */
static inline ChloeOwO::Trove::Entities::EntityInfo *(__thiscall *UpdateEntities)(ChloeOwO::Trove::Core::World *const self) = nullptr; /* 55 8B EC 83 EC 20 53 8B D9 C7 45 F8 */
}; /* Size: -- */
}
}
ChloeOwO::Trove::Entities::EntityInfo *ChloeOwO::Trove::OwO::Ext::Trove::Core::WorldExt::UpdateEntities(ChloeOwO::Trove::Core::World &self) {
self.field_158 = 1;
const auto &entity_info_list = self.entity_info_list;
auto head = EntityInfoNode{};
head.entity_info_list = &self.entity_info_list;
head.field_4 = nullptr;
head.data = nullptr;
head.FindEntity(0);
const auto &metadata = *self.metadata;
const auto total_time = metadata.total_time;
auto i = head;
while (!i.IsEnd(entity_info_list)) {
auto &entity = *i.data->entity;
i.Next();
if (total_time > entity.field_88) {
head.field_4 = entity.field_28;
head.data = entity.field_2C;
Trove::Sub002AE910(&self.field_140, &head.field_4);
}
if ((entity.field_3C & 0x10) != 0) {
GameObjectExt::Update(entity);
}
}
auto *const tail = self.entity_info_list.GetTail();
self.field_158 = 0;
return tail;
}
Code:
namespace ChloeOwO::Trove {
namespace Entities {
struct GameObject;
struct EntityInfo {
std::int32_t field_0; /* 0x0 */
private:
std::uint8_t gap4[12]; /* 0x4 */
public:
ChloeOwO::Trove::Entities::GameObject *entity; /* 0x10 */
}; /* Size: 0x14 */
}
}
Code:
namespace ChloeOwO::Trove::Entities {
struct EntityInfo;
struct EntityInfoList;
struct EntityInfoNode {
ChloeOwO::Trove::Entities::EntityInfoList *entity_info_list; /* 0x0 */
ChloeOwO::Trove::Entities::EntityInfo *field_4; /* 0x4 */
ChloeOwO::Trove::Entities::EntityInfo *data; /* 0x8 */
void FindEntity(std::uint32_t start_index);
void FindEntity(std::uint32_t start_index, std::size_t upper_bound);
bool IsEnd(const ChloeOwO::Trove::Entities::EntityInfoList &list);
ChloeOwO::Trove::Entities::EntityInfoNode *Next();
}; /* Size: 0xC */
}
void ChloeOwO::Trove::Entities::EntityInfoNode::FindEntity(std::uint32_t start_index) {
this->FindEntity(start_index, this->entity_info_list->size);
}
void ChloeOwO::Trove::Entities::EntityInfoNode::FindEntity(std::uint32_t start_index, std::size_t upper_bound) {
auto current_index = start_index;
auto *const entity_info_list = this->entity_info_list;
this->data = 0;
if (start_index < entity_info_list->size) {
if (start_index < upper_bound) {
do {
auto *const current_entity_info_ptr = reinterpret_cast<EntityInfo *>(entity_info_list->base_address + current_index * entity_info_list->stride);
this->field_4 = current_entity_info_ptr;
if (((current_entity_info_ptr->field_0 & 1) == 0) || ((current_entity_info_ptr->field_0 & 0xFFFFFFFE) != 0)) {
break;
}
++current_index;
} while (current_index < upper_bound);
}
auto *const entity_info_ptr = this->field_4;
if ((entity_info_ptr != nullptr) && (((entity_info_ptr->field_0 & 1) == 0) || ((entity_info_ptr->field_0 & 0xFFFFFFFE) != 0))) {
if ((entity_info_ptr->field_0 & 1) != 0) {
this->data = reinterpret_cast<EntityInfo *>(entity_info_ptr->field_0 & 0xFFFFFFFE);
} else {
this->data = entity_info_ptr;
}
}
}
}
bool ChloeOwO::Trove::Entities::EntityInfoNode::IsEnd(const ChloeOwO::Trove::Entities::EntityInfoList &list) {
return (this->data == nullptr) && (this->field_4 == list.GetTail()) && (this->entity_info_list == &list);
}
ChloeOwO::Trove::Entities::EntityInfoNode *ChloeOwO::Trove::Entities::EntityInfoNode::Next() {
const auto v2 = (this->data->field_0 & 0xFFFFFFFE) == 0;
this->data = reinterpret_cast<EntityInfo *>(this->data->field_0 & 0xFFFFFFFE);
if (v2) {
this->FindEntity(
((reinterpret_cast<std::uintptr_t>(this->field_4) - this->entity_info_list->base_address) / this->entity_info_list->stride) + 1,
this->entity_info_list->size);
}
return this;
}
Code:
namespace ChloeOwO::Trove::Entities {
struct EntityInfo;
struct EntityInfoList {
std::uintptr_t base_address; /* 0x0 */
std::size_t stride; /* 0x4 */
std::size_t size; /* 0x8 */
ChloeOwO::Trove::Entities::EntityInfo *GetTail() const;
}; /* Size: 0xC */
}
ChloeOwO::Trove::Entities::EntityInfo *ChloeOwO::Trove::Entities::EntityInfoList::GetTail() const {
return (this->size != 0) ? reinterpret_cast<EntityInfo *>(this->base_address + (this->stride * (this->size - 1))) : nullptr;
}

for preload)