like amiri in my mind
Пользователь
-
Автор темы
- #1
баги : неправильное отображение угла при использовании десинка, советую улучшить инициализацию, вам в дз будет это пофиксить, какой-то странный лин при взятии полуавтоматов, возможно у мя там кое какой хук это делает, но неважно, тоже пофиксите, однозначно это будет лучше деф лв. если честно это не самый правильный обновлять локал, как это делаю я, но да ладно, тем более это всего лишь визуальное восприятие.
видео, как работают -
пример использвания: вызов instance в конце create_move, вызовы в хуках upd_clientside_anims, setup_bones, делать reset_data() на раундстарте(hooked_events)
пример вызова в upd_clientside_anims
пример вызова setup_bones
видео, как работают -
Пожалуйста, авторизуйтесь для просмотра ссылки.
пример использвания: вызов instance в конце create_move, вызовы в хуках upd_clientside_anims, setup_bones, делать reset_data() на раундстарте(hooked_events)
local_anims.cpp:
#include "setup_bones.h"
#include "local_animations.h"
#include "../misc/misc.h"
void c_local_anims::instance(CUserCmd* m_pcmd) {
//set player angles
g_ctx.local()->m_angVisualAngles() = m_fake_angles; //fake angles
g_ctx.local()->m_angVisualAngles().z = 0.0f;
//update info about player for this tick
g_ctx.globals.updating_animation = true;
g_ctx.local()->update_clientside_animation();
g_ctx.globals.updating_animation = false;
//build new data on packet
if (g_ctx.send_packet) {
g_ctx.local()->setup_bones_rebuild(local_data.m_main_bones.data(), BONE_USED_BY_ANYTHING);
//move matrix
for (int i = 0; i < MAXSTUDIOBONES; i++)
local_data.m_bone_origins[i] = g_ctx.local()->GetAbsOrigin() - local_data.m_main_bones[i].GetOrigin();
}
}
bool c_local_anims::get_cached_mat(matrix3x4_t* matrix) {
return std::memcpy(matrix, local_data.m_main_bones.data(), sizeof(matrix3x4_t) * g_ctx.local()->m_CachedBoneData().Count());
}
void c_local_anims::on_update_clientside() {
for (int i = 0; i < MAXSTUDIOBONES; i++)
local_data.m_main_bones[i].SetOrigin(g_ctx.local()->GetAbsOrigin() - local_data.m_bone_origins[i]);
//copy built matrix
std::memcpy(g_ctx.local()->m_CachedBoneData().Base(), local_data.m_main_bones.data(), sizeof(matrix3x4_t) * g_ctx.local()->m_CachedBoneData().Count());
return g_ctx.local()->AttachmentHelper(); //fix attachments (flying weapon)
}
local_anims.h:
#pragma once
#include "..\..\..\includes.hpp"
class c_local_anims
{
private:
struct
{
std::array < matrix3x4_t, MAXSTUDIOBONES > m_main_bones;
std::array < Vector, MAXSTUDIOBONES > m_bone_origins;
} local_data;
public:
void instance(CUserCmd* m_pcmd);
bool get_cached_mat(matrix3x4_t* matrix);
void on_update_clientside();
Vector m_fake_angles = Vector(0, 0, 0);
Vector m_real_angles = Vector(0, 0, 0);
Vector m_stored_angles = Vector(0, 0, 0);
void reset_data()
{
local_data.m_main_bones = { };
local_data.m_bone_origins.fill(Vector(0, 0, 0));
}
};
inline c_local_anims* g_local_anims = new c_local_anims();
full clientside anims hook:
_declspec(noinline)void hooks::updateclientsideanimation_detour(player_t* player)
{
if (!player->valid(false, true))
return ((UpdateClientSideAnimationFn)original_updateclientsideanimation)(player);
if (player == g_ctx.local())
g_local_anims->on_update_clientside();
if (g_ctx.globals.updating_animation)
return ((UpdateClientSideAnimationFn)original_updateclientsideanimation)(player);
}
setup_bones part:
if (g_ctx.globals.setuping_bones)
result = ((SetupBonesFn)original_setupbones)(ecx, bone_world_out, max_bones, bone_mask, current_time);
else if (g_cfg.legitbot.enabled && player != g_ctx.local())
result = ((SetupBonesFn)original_setupbones)(ecx, bone_world_out, max_bones, bone_mask, current_time);
else if (!g_ctx.local()->is_alive())
result = ((SetupBonesFn)original_setupbones)(ecx, bone_world_out, max_bones, bone_mask, current_time);
else if (!player->m_CachedBoneData().Count())
result = ((SetupBonesFn)original_setupbones)(ecx, bone_world_out, max_bones, bone_mask, current_time);
else if (bone_world_out) {
if (player == g_ctx.local())
return g_local_anims->get_cached_mat(bone_world_out);
else
memcpy(bone_world_out, player->m_CachedBoneData().Base(), player->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
}
Последнее редактирование: