Make auto oob work better + auto place building when holding
This commit is contained in:
parent
2272afc7e1
commit
25cbf53349
@ -56,9 +56,11 @@ public:
|
||||
offset_t flChargedDamage;
|
||||
offset_t iUpgradeLevel;
|
||||
offset_t m_hBuilder;
|
||||
offset_t m_bCanPlace;
|
||||
offset_t m_iObjectType;
|
||||
offset_t m_bMiniBuilding;
|
||||
offset_t m_bHasSapper;
|
||||
offset_t m_bPlacing;
|
||||
offset_t m_bBuilding;
|
||||
offset_t m_iTeleState;
|
||||
offset_t m_flTeleRechargeTime;
|
||||
@ -145,6 +147,7 @@ public:
|
||||
offset_t m_rgflCoordinateFrame;
|
||||
offset_t m_bFeignDeathReady;
|
||||
offset_t m_bCarryingObject;
|
||||
offset_t m_hCarriedObject;
|
||||
|
||||
offset_t m_iTauntConcept;
|
||||
offset_t m_iTauntIndex;
|
||||
|
@ -56,6 +56,7 @@ void NetVars::Init()
|
||||
this->m_flChargeLevel = gNetvars.get_offset("DT_WeaponMedigun", "NonLocalTFWeaponMedigunData", "m_flChargeLevel");
|
||||
m_bFeignDeathReady = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_bFeignDeathReady");
|
||||
m_bCarryingObject = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_bCarryingObject");
|
||||
m_hCarriedObject = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_hCarriedObject");
|
||||
m_nSequence = gNetvars.get_offset("DT_BaseAnimating", "m_nSequence");
|
||||
m_iTauntIndex = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_iTauntIndex");
|
||||
m_iTauntConcept = gNetvars.get_offset("DT_TFPlayer", "m_Shared", "m_iTauntConcept");
|
||||
@ -76,9 +77,11 @@ void NetVars::Init()
|
||||
this->flChargedDamage = gNetvars.get_offset("DT_TFSniperRifle", "SniperRifleLocalData", "m_flChargedDamage");
|
||||
this->iUpgradeLevel = gNetvars.get_offset("DT_BaseObject", "m_iUpgradeLevel");
|
||||
this->m_hBuilder = gNetvars.get_offset("DT_BaseObject", "m_hBuilder");
|
||||
this->m_bCanPlace = gNetvars.get_offset("DT_BaseObject", "m_bServerOverridePlacement");
|
||||
this->m_bBuilding = gNetvars.get_offset("DT_BaseObject", "m_bBuilding");
|
||||
this->m_iObjectType = gNetvars.get_offset("DT_BaseObject", "m_iObjectType");
|
||||
this->m_bHasSapper = gNetvars.get_offset("DT_BaseObject", "m_bHasSapper");
|
||||
this->m_bPlacing = gNetvars.get_offset("DT_BaseObject", "m_bPlacing");
|
||||
this->m_bMiniBuilding = gNetvars.get_offset("DT_BaseObject", "m_bMiniBuilding");
|
||||
this->m_iTeleState = gNetvars.get_offset("DT_ObjectTeleporter", "m_iState");
|
||||
this->m_flTeleRechargeTime = gNetvars.get_offset("DT_ObjectTeleporter", "m_flRechargeTime");
|
||||
|
@ -588,9 +588,29 @@ void OutOfBoundsrun(const CCommand &args)
|
||||
to_path.usepitch = usepitch;
|
||||
to_path.active = true;
|
||||
}
|
||||
|
||||
int getCarriedBuilding()
|
||||
{
|
||||
if (CE_BYTE(LOCAL_E, netvar.m_bCarryingObject))
|
||||
return HandleToIDX(CE_INT(LOCAL_E, netvar.m_hCarriedObject));
|
||||
for (int i = 1; i < MAX_ENTITIES; i++)
|
||||
{
|
||||
auto ent = ENTITY(i);
|
||||
if (CE_BAD(ent) || ent->m_Type() != ENTITY_BUILDING)
|
||||
continue;
|
||||
if (HandleToIDX(CE_INT(ent, netvar.m_hBuilder)) != LOCAL_E->m_IDX)
|
||||
continue;
|
||||
if (!CE_BYTE(ent, netvar.m_bPlacing))
|
||||
continue;
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static CatCommand Outofbounds{ "outofbounds", "Out of bounds", OutOfBoundsrun };
|
||||
|
||||
static Timer timeout{};
|
||||
static float yaw_offset = 0.0f;
|
||||
void oobcm()
|
||||
{
|
||||
if (to_path.active)
|
||||
@ -600,20 +620,71 @@ void oobcm()
|
||||
Vector topath = { to_path.x, to_path.y, LOCAL_E->m_vecOrigin().z };
|
||||
if (LOCAL_E->m_vecOrigin().AsVector2D().DistTo(topath.AsVector2D()) <= 0.01f || timeout.test_and_set(10000))
|
||||
{
|
||||
if (LOCAL_E->m_vecOrigin().AsVector2D().DistTo(topath.AsVector2D()) <= 0.01f)
|
||||
{
|
||||
if (re::C_BaseCombatWeapon::GetSlot(RAW_ENT(LOCAL_W)) != 5)
|
||||
{
|
||||
yaw_offset = 0.0f;
|
||||
to_path.active = false;
|
||||
if (to_path.usepitch)
|
||||
current_user_cmd->viewangles.x = to_path.pitch;
|
||||
current_user_cmd->viewangles.y = to_path.yaw;
|
||||
if (LOCAL_E->m_vecOrigin().AsVector2D().DistTo(topath.AsVector2D()) <= 0.01f)
|
||||
logging::Info("Arrived at the destination! offset: %f %f", fabsf(LOCAL_E->m_vecOrigin().x - topath.x), fabsf(LOCAL_E->m_vecOrigin().y - topath.y));
|
||||
}
|
||||
else
|
||||
{
|
||||
timeout.update();
|
||||
if (to_path.usepitch)
|
||||
current_user_cmd->viewangles.x = to_path.pitch;
|
||||
current_user_cmd->viewangles.y = to_path.yaw;
|
||||
int carried_build = getCarriedBuilding();
|
||||
if (carried_build == -1)
|
||||
{
|
||||
logging::Info("No building held");
|
||||
return;
|
||||
}
|
||||
auto ent = ENTITY(carried_build);
|
||||
if (CE_BAD(ent))
|
||||
{
|
||||
logging::Info("No Building held");
|
||||
to_path.active = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (CE_BYTE(ent, netvar.m_bCanPlace))
|
||||
current_user_cmd->buttons |= IN_ATTACK;
|
||||
if (yaw_offset >= 0.1f)
|
||||
{
|
||||
logging::Info("Failed getting out of bounds, Yaw offset too large");
|
||||
to_path.active = false;
|
||||
return;
|
||||
}
|
||||
yaw_offset = -yaw_offset;
|
||||
if (yaw_offset >= 0.0f)
|
||||
yaw_offset += 0.0001f;
|
||||
current_user_cmd->viewangles.y = to_path.yaw + yaw_offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
yaw_offset = 0.0f;
|
||||
to_path.active = false;
|
||||
if (to_path.usepitch)
|
||||
current_user_cmd->viewangles.x = to_path.pitch;
|
||||
current_user_cmd->viewangles.y = to_path.yaw;
|
||||
logging::Info("Timed out trying to get to spot");
|
||||
}
|
||||
}
|
||||
if (yaw_offset == 0.0f)
|
||||
{
|
||||
auto move = ComputeMovePrecise(LOCAL_E->m_vecOrigin(), topath);
|
||||
current_user_cmd->forwardmove = move.first;
|
||||
current_user_cmd->sidemove = move.second;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
timeout.update();
|
||||
}
|
||||
|
@ -436,13 +436,19 @@ std::pair<float, float> ComputeMovePrecise(const Vector &a, const Vector &b)
|
||||
const float x = diff.x;
|
||||
const float y = diff.y;
|
||||
Vector vsilent(x, y, 0);
|
||||
float speed = sqrt(vsilent.x * vsilent.x + vsilent.y * vsilent.y);
|
||||
Vector ang;
|
||||
VectorAngles(vsilent, ang);
|
||||
float yaw = DEG2RAD(ang.y - current_user_cmd->viewangles.y);
|
||||
if (g_pLocalPlayer->bUseSilentAngles)
|
||||
yaw = DEG2RAD(ang.y - g_pLocalPlayer->v_OrigViewangles.y);
|
||||
return { cos(yaw) * MIN(MAX(diff.Length2D(), 1.05f), 450.0f), -sin(yaw) * MIN(MAX(diff.Length2D(), 1.05f), 450.0f) };
|
||||
float speed = 450.0f;
|
||||
if (diff.Length() <= 5.0f)
|
||||
speed = 1.05f;
|
||||
else if (diff.Length() <= 20.0f)
|
||||
speed = 10.0f;
|
||||
else if (diff.Length() <= 100.0f)
|
||||
speed = 225.0f;
|
||||
return { cos(yaw) * speed, -sin(yaw) * speed };
|
||||
}
|
||||
|
||||
std::pair<float, float> ComputeMove(const Vector &a, const Vector &b)
|
||||
|
Reference in New Issue
Block a user