Merge pull request #680 from nullworks/testing

Testing -> master
This commit is contained in:
LightCat 2019-01-20 12:32:26 +00:00 committed by GitHub
commit 76c345475b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 107 additions and 60 deletions

View File

@ -20,22 +20,10 @@ int *g_PredictionRandomSeed = nullptr;
namespace criticals
{
CatCommand test("crit_debug_print", "debug", []() {
if (CE_BAD(LOCAL_E))
return;
if (CE_BAD(LOCAL_W))
return;
unsigned unk1 = *(unsigned *) (RAW_ENT(LOCAL_W) + 2832);
unsigned unk2 = *(unsigned *) (RAW_ENT(LOCAL_W) + 2820);
unsigned char CritSlots = *(unsigned char *) (unk1 + (unk2 << 6) + 1844);
int CritSlots2 = *(unsigned *) (unk1 + (unk2 << 6) + 1788);
unsigned CritSlots3 = *(unsigned *) (unk1 + (unk2 << 6) + 1788);
int CritSlots4 = *(int *) (unk1 + (unk2 << 6) + 1788);
logging::Info("%u %d %d %u %d", unk1, int(CritSlots), CritSlots2, CritSlots3, CritSlots4);
});
int find_next_random_crit_for_weapon(IClientEntity *weapon)
{
int tries = 0, number = current_user_cmd->command_number, found = 0, seed, seed_md5, seed_backup;
int tries = 0, number = current_user_cmd->command_number, found = 0, seed_backup;
crithack_saved_state state{};
state.Save(weapon);
@ -43,9 +31,7 @@ int find_next_random_crit_for_weapon(IClientEntity *weapon)
seed_backup = *g_PredictionRandomSeed;
while (!found && tries < 4096)
{
seed_md5 = MD5_PseudoRandom(number) & 0x7FFFFFFF;
*g_PredictionRandomSeed = seed_md5;
seed = seed_md5 ^ (LOCAL_E->m_IDX | (LOCAL_W->m_IDX << 8));
*g_PredictionRandomSeed = MD5_PseudoRandom(number) & 0x7FFFFFFF;
found = re::C_TFWeaponBase::CalcIsAttackCritical(weapon);
if (found)
break;
@ -54,7 +40,8 @@ int find_next_random_crit_for_weapon(IClientEntity *weapon)
}
*g_PredictionRandomSeed = seed_backup;
state.Load(weapon);
if (!crit_experimental || g_pLocalPlayer->weapon_mode == weaponmode::weapon_melee)
state.Load(weapon);
if (found)
return number;
return 0;
@ -90,7 +77,7 @@ struct cached_calculation_s
int weapon_entity;
};
cached_calculation_s cached_calculation{};
static cached_calculation_s cached_calculation{};
static int number = 0;
static int lastnumber = 0;
@ -103,37 +90,30 @@ bool force_crit(IClientEntity *weapon)
if (lastnumber < command_number || lastweapon != weapon->GetModel() || lastnumber - command_number > 1000)
{
if (cached_calculation.init_command > command_number || command_number - cached_calculation.init_command > 4096 || (command_number && (cached_calculation.command_number < command_number)))
cached_calculation.weapon_entity = 0;
if (cached_calculation.weapon_entity == weapon->entindex())
return bool(cached_calculation.command_number);
if (!*crit_experimental || g_pLocalPlayer->weapon_mode == weapon_melee)
{
if (cached_calculation.init_command > command_number || command_number - cached_calculation.init_command > 4096 || (command_number && (cached_calculation.command_number < command_number)))
cached_calculation.weapon_entity = 0;
if (cached_calculation.weapon_entity == weapon->entindex())
return bool(cached_calculation.command_number);
}
number = find_next_random_crit_for_weapon(weapon);
}
else
number = lastnumber;
// logging::Info("Found critical: %d -> %d", command_number,
// number);
lastweapon = weapon->GetModel();
lastnumber = number;
if (crit_experimental && GetWeaponMode() != weapon_melee)
{
cached_calculation.command_number = number;
cached_calculation.weapon_entity = LOCAL_W->m_IDX;
if (!crit_legiter)
{
if (number && number != command_number)
command_number_mod[command_number] = number;
cached_calculation.command_number = number;
cached_calculation.weapon_entity = LOCAL_W->m_IDX;
}
else
{
if (number && number - 30 < command_number)
command_number_mod[command_number] = number;
cached_calculation.command_number = number;
cached_calculation.weapon_entity = LOCAL_W->m_IDX;
}
else if (number && number - 30 < command_number)
command_number_mod[command_number] = number;
}
else
{
@ -152,6 +132,8 @@ bool force_crit(IClientEntity *weapon)
current_user_cmd->buttons |= IN_ATTACK;
}
}
lastweapon = weapon->GetModel();
lastnumber = number;
return number != 0;
}

View File

@ -437,18 +437,49 @@ bool IsTargetStateGood(CachedEntity *entity)
}
else
{
float swingrange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
int hb = BestHitbox(entity);
if (hb == -1)
return false;
Vector newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, entity->hitboxes.GetHitbox(hb)->center);
trace_t trace;
Ray_t ray;
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange));
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
if ((IClientEntity *) trace.m_pEnt != RAW_ENT(entity))
float swingrange = EffectiveTargetingRange();
if (!IsBacktracking() || entity->m_Type() != ENTITY_PLAYER)
{
int hb = BestHitbox(entity);
if (hb == -1)
return false;
Vector newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, entity->hitboxes.GetHitbox(hb)->center);
trace_t trace;
Ray_t ray;
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
ray.Init(g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange));
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
if ((IClientEntity *) trace.m_pEnt != RAW_ENT(entity))
return false;
}
else
{
namespace bt = hacks::shared::backtrack;
for (int i = 0; i < 66; i++)
{
if (!bt::ValidTick(bt::headPositions[entity->m_IDX][i], entity))
continue;
Vector bbox_min = bt::headPositions[entity->m_IDX][i].collidable.min;
Vector bbox_max = bt::headPositions[entity->m_IDX][i].collidable.max;
for (int j = 17; j >= 0; j--)
{
Vector aim_at = bt::headPositions[entity->m_IDX][i].hitboxes[j].center;
Vector newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, aim_at);
Vector new_vec = GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange);
if (new_vec.x > bbox_min.x && new_vec.x < bbox_max.x && new_vec.y > bbox_min.y && new_vec.y < bbox_max.y && new_vec.z > bbox_min.z && new_vec.z < bbox_max.z)
{
/*auto it = bt::headPositions[entity->m_IDX][i];
current_user_cmd->tick_count = it.tickcount;
Vector &angles = NET_VECTOR(RAW_ENT(entity), netvar.m_angEyeAngles);
float &simtime = NET_FLOAT(RAW_ENT(entity), netvar.m_flSimulationTime);
angles.y = it.viewangles;
simtime = it.simtime;*/
return true;
}
}
}
return false;
}
}
}
// Rage only check
@ -907,11 +938,42 @@ const Vector &PredictEntity(CachedEntity *entity)
// Players only
if ((entity->m_Type() == ENTITY_PLAYER))
{
namespace bt = hacks::shared::backtrack;
auto hb = bt::headPositions[entity->m_IDX][good_tick.first];
cd.predict_tick = tickcount;
result = hb.hitboxes[cd.hitbox].center;
cd.fov = GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye, result);
if (GetWeaponMode() != weapon_melee)
{
namespace bt = hacks::shared::backtrack;
auto hb = bt::headPositions[entity->m_IDX][good_tick.first];
cd.predict_tick = tickcount;
result = hb.hitboxes[cd.hitbox].center;
cd.fov = GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye, result);
}
else
{
namespace bt = hacks::shared::backtrack;
for (int i = 0; i < 66; i++)
{
if (!bt::ValidTick(bt::headPositions[entity->m_IDX][i], entity))
continue;
Vector bbox_min = bt::headPositions[entity->m_IDX][i].collidable.min;
Vector bbox_max = bt::headPositions[entity->m_IDX][i].collidable.max;
for (int j = 17; j >= 0; j--)
{
float swingrange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
Vector aim_at = bt::headPositions[entity->m_IDX][i].hitboxes[j].center;
Vector newangle = GetAimAtAngles(g_pLocalPlayer->v_Eye, aim_at);
Vector new_vec = GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange);
if (new_vec.x > bbox_min.x && new_vec.x < bbox_max.x && new_vec.y > bbox_min.y && new_vec.y < bbox_max.y && new_vec.z > bbox_min.z && new_vec.z < bbox_max.z)
{
result = new_vec;
auto it = bt::headPositions[entity->m_IDX][i];
current_user_cmd->tick_count = it.tickcount;
Vector &angles = NET_VECTOR(RAW_ENT(entity), netvar.m_angEyeAngles);
float &simtime = NET_FLOAT(RAW_ENT(entity), netvar.m_flSimulationTime);
angles.y = it.viewangles;
simtime = it.simtime;
}
}
}
}
}
}
// Return the found vector
@ -1188,13 +1250,16 @@ bool VischeckPredictedEntity(CachedEntity *entity, bool Backtracking)
auto ticks = bt::headPositions[entity->m_IDX];
if (good_tick.first != -1 && good_tick.second == entity->m_IDX && IsEntityVectorVisible(entity, PredictEntity(entity)))
{
cd.vcheck_tick = tickcount;
cd.visible = true;
current_user_cmd->tick_count = ticks[good_tick.first].tickcount;
Vector &angles = CE_VECTOR(entity, netvar.m_angEyeAngles);
float &simtime = CE_FLOAT(entity, netvar.m_flSimulationTime);
angles.y = ticks[good_tick.first].viewangles;
simtime = ticks[good_tick.first].simtime;
cd.vcheck_tick = tickcount;
cd.visible = true;
if (g_pLocalPlayer->weapon_mode != weapon_melee)
{
current_user_cmd->tick_count = ticks[good_tick.first].tickcount;
Vector &angles = CE_VECTOR(entity, netvar.m_angEyeAngles);
float &simtime = CE_FLOAT(entity, netvar.m_flSimulationTime);
angles.y = ticks[good_tick.first].viewangles;
simtime = ticks[good_tick.first].simtime;
}
}
else
cd.visible = false;