Merge pull request #540 from TotallyNotElite/master
Better Autobackstab
This commit is contained in:
commit
dae31355b3
@ -98,7 +98,6 @@ std::unique_ptr<char[]> strfmt(const char *fmt, ...);
|
|||||||
// TODO move that to weaponid.h
|
// TODO move that to weaponid.h
|
||||||
bool HasWeapon(CachedEntity *ent, int wantedId);
|
bool HasWeapon(CachedEntity *ent, int wantedId);
|
||||||
bool IsAmbassador(CachedEntity *ent);
|
bool IsAmbassador(CachedEntity *ent);
|
||||||
bool HasDarwins(CachedEntity *ent);
|
|
||||||
bool AmbassadorCanHeadshot();
|
bool AmbassadorCanHeadshot();
|
||||||
|
|
||||||
inline const char *teamname(int team)
|
inline const char *teamname(int team)
|
||||||
|
@ -108,7 +108,7 @@ bool EntityHitboxCache::VisibilityCheck(int id)
|
|||||||
|
|
||||||
static settings::Int setupbones_time{ "source.setupbones-time", "3" };
|
static settings::Int setupbones_time{ "source.setupbones-time", "3" };
|
||||||
|
|
||||||
std::mutex setupbones_mutex;
|
static std::mutex setupbones_mutex;
|
||||||
|
|
||||||
matrix3x4_t *EntityHitboxCache::GetBones()
|
matrix3x4_t *EntityHitboxCache::GetBones()
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <settings/Bool.hpp>
|
#include <settings/Bool.hpp>
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
#include "hacks/Backtrack.hpp"
|
#include "hacks/Backtrack.hpp"
|
||||||
|
#include "hacks/Aimbot.hpp"
|
||||||
|
|
||||||
static settings::Bool enable{ "autobackstab.enable", "0" };
|
static settings::Bool enable{ "autobackstab.enable", "0" };
|
||||||
static settings::Bool silent{ "autobackstab.silent", "1" };
|
static settings::Bool silent{ "autobackstab.silent", "1" };
|
||||||
@ -25,174 +26,121 @@ const Vector GetWorldSpaceCenter(CachedEntity *ent)
|
|||||||
return vWorldSpaceCenter;
|
return vWorldSpaceCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool found;
|
|
||||||
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
|
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
|
||||||
{
|
{
|
||||||
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max);
|
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
// TODO improve
|
|
||||||
bool CanBackstab(CachedEntity *tar, Vector Local_ang)
|
void traceEntity(int *result_eindex, Vector *result_pos, QAngle angle,
|
||||||
|
Vector loc)
|
||||||
{
|
{
|
||||||
if (CE_BAD(tar))
|
Ray_t ray;
|
||||||
return false;
|
Vector forward;
|
||||||
// Get the forward view vector of the target, ignore Z
|
float sp, sy, cp, cy;
|
||||||
Vector vecVictimForward = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
|
trace_t trace;
|
||||||
vecVictimForward.z = 0.0f;
|
|
||||||
vecVictimForward.NormalizeInPlace();
|
|
||||||
|
|
||||||
// Get a vector from my origin to my targets origin
|
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
|
||||||
Vector vecToTarget;
|
sy = sinf(DEG2RAD(angle[1]));
|
||||||
vecToTarget = GetWorldSpaceCenter(tar) - GetWorldSpaceCenter(LOCAL_E);
|
cy = cosf(DEG2RAD(angle[1]));
|
||||||
vecToTarget.z = 0.0f;
|
sp = sinf(DEG2RAD(angle[0]));
|
||||||
vecToTarget.NormalizeInPlace();
|
cp = cosf(DEG2RAD(angle[0]));
|
||||||
|
forward.x = cp * cy;
|
||||||
|
forward.y = cp * sy;
|
||||||
|
forward.z = -sp;
|
||||||
|
forward = forward * 8192.0f + loc;
|
||||||
|
ray.Init(loc, forward);
|
||||||
|
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
|
||||||
|
if (result_pos)
|
||||||
|
*result_pos = trace.endpos;
|
||||||
|
if (result_eindex)
|
||||||
|
{
|
||||||
|
*result_eindex = 0;
|
||||||
|
}
|
||||||
|
if (trace.m_pEnt && result_eindex)
|
||||||
|
{
|
||||||
|
*result_eindex = ((IClientEntity *) (trace.m_pEnt))->entindex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get a forward vector of the attacker.
|
bool canBackstab(CachedEntity *tar, Vector angle, Vector loc, Vector hitboxLoc)
|
||||||
Vector vecOwnerForward = Local_ang;
|
{
|
||||||
vecOwnerForward.z = 0.0f;
|
float meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||||
vecOwnerForward.NormalizeInPlace();
|
Vector targetAngle = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
|
||||||
|
if (fabsf(angle.y - targetAngle.y) < 80)
|
||||||
float flDotOwner = DotProduct(vecOwnerForward, vecToTarget);
|
{
|
||||||
float flDotVictim = DotProduct(vecVictimForward, vecToTarget);
|
int IDX;
|
||||||
|
Vector hitLoc;
|
||||||
// Make sure they're actually facing the target.
|
traceEntity(&IDX, &hitLoc, QAngle(angle.x, angle.y, angle.z), loc);
|
||||||
// This needs to be done because lag compensation can place target slightly
|
if (IDX == tar->m_IDX)
|
||||||
// behind the attacker.
|
{
|
||||||
if (flDotOwner > 0.5)
|
if (loc.DistTo(hitboxLoc) <= meleeRange)
|
||||||
return (flDotVictim > -0.1);
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreateMove()
|
void CreateMove()
|
||||||
{
|
{
|
||||||
if (!enable)
|
if (!enable)
|
||||||
return;
|
return;
|
||||||
if (!CE_GOOD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || !CE_GOOD(LOCAL_W))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W) || !LOCAL_E->m_bAlivePlayer())
|
||||||
return;
|
|
||||||
if (!LOCAL_E->m_bAlivePlayer())
|
|
||||||
return;
|
return;
|
||||||
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
|
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
|
||||||
return;
|
return;
|
||||||
int eid = -1;
|
CachedEntity *besttarget = nullptr;
|
||||||
Vector endpos;
|
|
||||||
ICollideable *p = RAW_ENT(LOCAL_E)->GetCollideable();
|
|
||||||
const Vector &max1 = p->OBBMaxs() + RAW_ENT(LOCAL_E)->GetAbsOrigin();
|
|
||||||
const Vector &min1 = p->OBBMins() + RAW_ENT(LOCAL_E)->GetAbsOrigin();
|
|
||||||
WhatIAmLookingAt(&eid, &endpos);
|
|
||||||
|
|
||||||
CachedEntity *target = nullptr;
|
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
|
||||||
if (eid > -1)
|
|
||||||
target = ENTITY(eid);
|
|
||||||
if (CE_GOOD(target) && target != LOCAL_E &&
|
|
||||||
target->m_iTeam() != LOCAL_E->m_iTeam() && target->m_bAlivePlayer() &&
|
|
||||||
target->m_Type() == ENTITY_PLAYER &&
|
|
||||||
!hacks::shared::backtrack::isBacktrackEnabled() &&
|
|
||||||
CanBackstab(target, g_pLocalPlayer->v_OrigViewangles))
|
|
||||||
{
|
{
|
||||||
float swingrange =
|
CachedEntity *target = ENTITY(i);
|
||||||
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
if (CE_BAD(target))
|
||||||
const Vector &max2 = GetHitboxBounds(target, 1).second +
|
continue;
|
||||||
Vector(swingrange, swingrange, swingrange);
|
if (target == LOCAL_E || target->m_iTeam() == LOCAL_E->m_iTeam() ||
|
||||||
const Vector &min2 = GetHitboxBounds(target, 1).first -
|
!target->m_bAlivePlayer() || target->m_Type() != ENTITY_PLAYER)
|
||||||
Vector(swingrange, swingrange, swingrange);
|
continue;
|
||||||
if ((min1.x <= max2.x && max1.x >= min2.x) &&
|
if (target->hitboxes.GetHitbox(spine_2)->center.DistTo(
|
||||||
(min1.y <= max2.y && max1.y >= min2.y) &&
|
g_pLocalPlayer->v_Eye) <= 300.0f)
|
||||||
(min1.z <= max2.z && max1.z >= min2.z))
|
|
||||||
current_user_cmd->buttons |= IN_ATTACK;
|
|
||||||
}
|
|
||||||
else if (!hacks::shared::backtrack::isBacktrackEnabled())
|
|
||||||
{
|
|
||||||
CachedEntity *tar = nullptr;
|
|
||||||
float bestscr = 9999.9f;
|
|
||||||
int bestent = -1;
|
|
||||||
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
|
|
||||||
{
|
{
|
||||||
CachedEntity *tmp = ENTITY(i);
|
if (CE_GOOD(besttarget))
|
||||||
if (CE_BAD(tmp))
|
|
||||||
continue;
|
|
||||||
if (tmp == LOCAL_E)
|
|
||||||
continue;
|
|
||||||
if (tmp->m_iTeam() == LOCAL_E->m_iTeam())
|
|
||||||
continue;
|
|
||||||
if (!tmp->m_bAlivePlayer())
|
|
||||||
continue;
|
|
||||||
if (tmp->m_Type() != ENTITY_PLAYER)
|
|
||||||
continue;
|
|
||||||
float swingrange =
|
|
||||||
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
|
||||||
ICollideable *c = RAW_ENT(tmp)->GetCollideable();
|
|
||||||
const Vector &max2 = c->OBBMaxs() + tmp->m_vecOrigin() +
|
|
||||||
Vector(swingrange, swingrange, swingrange);
|
|
||||||
const Vector &min2 = c->OBBMins() + tmp->m_vecOrigin() -
|
|
||||||
Vector(swingrange, swingrange, swingrange);
|
|
||||||
if ((min1.x <= max2.x && max1.x >= min2.x) &&
|
|
||||||
(min1.y <= max2.y && max1.y >= min2.y) &&
|
|
||||||
(min1.z <= max2.z && max1.z >= min2.z) &&
|
|
||||||
bestscr > tmp->m_flDistance())
|
|
||||||
{
|
{
|
||||||
bestent = tmp->m_IDX;
|
if (target->hitboxes.GetHitbox(spine_2)->center.DistTo(
|
||||||
bestscr = tmp->m_flDistance();
|
g_pLocalPlayer->v_Eye) <
|
||||||
|
besttarget->hitboxes.GetHitbox(spine_2)->center.DistTo(
|
||||||
|
g_pLocalPlayer->v_Eye))
|
||||||
|
besttarget = target;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
besttarget = target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bestent > -1)
|
|
||||||
tar = ENTITY(bestent);
|
|
||||||
if (CE_BAD(tar))
|
|
||||||
return;
|
|
||||||
Vector eyeang = g_pLocalPlayer->v_OrigViewangles;
|
|
||||||
for (float i = -180.0f; i < 180.0f; i += 30.0f)
|
|
||||||
{
|
|
||||||
eyeang.y = i;
|
|
||||||
if (CanBackstab(tar, eyeang))
|
|
||||||
{
|
|
||||||
current_user_cmd->viewangles.y = eyeang.y;
|
|
||||||
current_user_cmd->buttons |= IN_ATTACK;
|
|
||||||
if (silent)
|
|
||||||
g_pLocalPlayer->bUseSilentAngles = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
if (CE_GOOD(besttarget))
|
||||||
{
|
{
|
||||||
if (!hacks::shared::backtrack::isBacktrackEnabled())
|
Vector hitboxLoc =
|
||||||
return;
|
besttarget->hitboxes.GetHitbox(spine_2)
|
||||||
if (hacks::shared::backtrack::iBestTarget == -1)
|
->center;
|
||||||
return;
|
Vector angle = NET_VECTOR(RAW_ENT(LOCAL_E), netvar.m_angEyeAngles);
|
||||||
int iBestTarget = hacks::shared::backtrack::iBestTarget;
|
for (angle.y = -180.0f; angle.y < 180.0f; angle.y += 1.0f)
|
||||||
int tickcnt = 0;
|
|
||||||
int tickus = (float(hacks::shared::backtrack::getLatency()) > 800.0f || float(hacks::shared::backtrack::getLatency()) < 200.0f) ? 12 : 24;
|
|
||||||
for (auto i : hacks::shared::backtrack::headPositions[iBestTarget])
|
|
||||||
{
|
|
||||||
bool good_tick = false;
|
|
||||||
for (int j = 0; j < tickus; ++j)
|
|
||||||
if (tickcnt == hacks::shared::backtrack::sorted_ticks[j].tick &&
|
|
||||||
hacks::shared::backtrack::sorted_ticks[j].tickcount !=
|
|
||||||
INT_MAX)
|
|
||||||
good_tick = true;
|
|
||||||
tickcnt++;
|
|
||||||
if (!good_tick)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
float scr = abs(g_pLocalPlayer->v_OrigViewangles.y - i.viewangles);
|
|
||||||
|
|
||||||
if (scr <= 90.0f &&
|
|
||||||
i.origin.DistTo(g_pLocalPlayer->v_Eye) <=
|
|
||||||
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)))
|
|
||||||
{
|
{
|
||||||
CachedEntity *tar = ENTITY(iBestTarget);
|
// Get angles
|
||||||
// ok just in case
|
Vector tr = (hitboxLoc - g_pLocalPlayer->v_Eye);
|
||||||
if (CE_BAD(tar))
|
Vector xAngle;
|
||||||
continue;
|
VectorAngles(tr, xAngle);
|
||||||
Vector &angles =
|
// Clamping is important
|
||||||
NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
|
fClampAngle(xAngle);
|
||||||
float &simtime =
|
angle.x = xAngle.x;
|
||||||
NET_FLOAT(RAW_ENT(tar), netvar.m_flSimulationTime);
|
if (canBackstab(besttarget, angle, g_pLocalPlayer->v_Eye, hitboxLoc))
|
||||||
angles.y = i.viewangles;
|
{
|
||||||
simtime = i.simtime;
|
current_user_cmd->viewangles = angle;
|
||||||
current_user_cmd->tick_count = i.tickcount;
|
current_user_cmd->buttons |= IN_ATTACK;
|
||||||
current_user_cmd->buttons |= IN_ATTACK;
|
besttarget = nullptr;
|
||||||
break;
|
if (silent)
|
||||||
}
|
g_pLocalPlayer->bUseSilentAngles = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // namespace hacks::tf2::autobackstab
|
||||||
|
@ -76,7 +76,11 @@ int BulletDangerValue(CachedEntity *patient)
|
|||||||
any_zoomed_snipers = true;
|
any_zoomed_snipers = true;
|
||||||
// TODO VisCheck from patient.
|
// TODO VisCheck from patient.
|
||||||
if ((int) vacc_sniper == 1)
|
if ((int) vacc_sniper == 1)
|
||||||
if (!IsEntityVisible(ent, head))
|
if (!IsEntityVisible(ent, head) &&
|
||||||
|
!IsVectorVisible(ENTITY(m_iCurrentHealingTarget)
|
||||||
|
->hitboxes.GetHitbox(head)
|
||||||
|
->center,
|
||||||
|
ent->hitboxes.GetHitbox(head)->center, true))
|
||||||
continue;
|
continue;
|
||||||
return vacc_sniper ? 2 : 1;
|
return vacc_sniper ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <settings/Bool.hpp>
|
#include <settings/Bool.hpp>
|
||||||
|
|
||||||
static settings::Bool enable{ "follow-bot.enable", "false" };
|
static settings::Bool enable{ "follow-bot.enable", "false" };
|
||||||
static settings::Bool roambot{ "follow-bot.roaming", "false" };
|
static settings::Bool roambot{ "follow-bot.roaming", "true" };
|
||||||
static settings::Bool draw_crumb{ "follow-bot.draw-crumbs", "false" };
|
static settings::Bool draw_crumb{ "follow-bot.draw-crumbs", "false" };
|
||||||
static settings::Float follow_distance{ "follow-bot.distance", "175" };
|
static settings::Float follow_distance{ "follow-bot.distance", "175" };
|
||||||
static settings::Float follow_activation{ "follow-bot.max-range", "1000" };
|
static settings::Float follow_activation{ "follow-bot.max-range", "1000" };
|
||||||
|
@ -26,6 +26,7 @@ Timer lastVoicemenu{};
|
|||||||
|
|
||||||
void Draw()
|
void Draw()
|
||||||
{
|
{
|
||||||
|
PROF_SECTION(DRAW_SpyAlert)
|
||||||
if (!enable)
|
if (!enable)
|
||||||
return;
|
return;
|
||||||
CachedEntity *closest_spy, *ent;
|
CachedEntity *closest_spy, *ent;
|
||||||
|
@ -834,7 +834,6 @@ index_t SelectNextNode()
|
|||||||
return FindNearestNode(true);
|
return FindNearestNode(true);
|
||||||
}
|
}
|
||||||
auto &n = state::nodes[state::active_node];
|
auto &n = state::nodes[state::active_node];
|
||||||
// TODO medkit connections and shit
|
|
||||||
std::vector<index_t> chance{};
|
std::vector<index_t> chance{};
|
||||||
for (index_t i = 0; i < MAX_CONNECTIONS; i++)
|
for (index_t i = 0; i < MAX_CONNECTIONS; i++)
|
||||||
{
|
{
|
||||||
|
@ -546,20 +546,6 @@ bool HasWeapon(CachedEntity *ent, int wantedId)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasDarwins(CachedEntity *ent)
|
|
||||||
{
|
|
||||||
if (CE_BAD(ent))
|
|
||||||
return false;
|
|
||||||
// Check if player is sniper
|
|
||||||
if (CE_INT(ent, netvar.iClass) != tf_sniper)
|
|
||||||
return false;
|
|
||||||
// Check if player is using darwins, 231 is the id for darwins danger sheild
|
|
||||||
if (HasWeapon(ent, 231))
|
|
||||||
return true;
|
|
||||||
// Else return false
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VectorTransform(const float *in1, const matrix3x4_t &in2, float *out)
|
void VectorTransform(const float *in1, const matrix3x4_t &in2, float *out)
|
||||||
{
|
{
|
||||||
out[0] = (in1[0] * in2[0][0] + in1[1] * in2[0][1] + in1[2] * in2[0][2]) +
|
out[0] = (in1[0] * in2[0][0] + in1[1] * in2[0][1] + in1[2] * in2[0][2]) +
|
||||||
@ -726,7 +712,6 @@ float RandFloatRange(float min, float max)
|
|||||||
|
|
||||||
bool IsEntityVisible(CachedEntity *entity, int hb)
|
bool IsEntityVisible(CachedEntity *entity, int hb)
|
||||||
{
|
{
|
||||||
Vector hit;
|
|
||||||
if (g_Settings.bInvalid)
|
if (g_Settings.bInvalid)
|
||||||
return false;
|
return false;
|
||||||
if (entity == g_pLocalPlayer->entity)
|
if (entity == g_pLocalPlayer->entity)
|
||||||
@ -936,7 +921,10 @@ weaponmode GetWeaponMode()
|
|||||||
classid == CL_CLASS(CTFSyringeGun) ||
|
classid == CL_CLASS(CTFSyringeGun) ||
|
||||||
classid == CL_CLASS(CTFCrossbow) ||
|
classid == CL_CLASS(CTFCrossbow) ||
|
||||||
classid == CL_CLASS(CTFShotgunBuildingRescue) ||
|
classid == CL_CLASS(CTFShotgunBuildingRescue) ||
|
||||||
classid == CL_CLASS(CTFDRGPomson))
|
classid == CL_CLASS(CTFDRGPomson) ||
|
||||||
|
classid == CL_CLASS(CTFWeaponFlameBall) ||
|
||||||
|
classid == CL_CLASS(CTFRaygun) ||
|
||||||
|
classid == CL_CLASS(CTFGrapplingHook))
|
||||||
{
|
{
|
||||||
return weaponmode::weapon_projectile;
|
return weaponmode::weapon_projectile;
|
||||||
}
|
}
|
||||||
@ -968,8 +956,6 @@ bool LineIntersectsBox(Vector &bmin, Vector &bmax, Vector &lmin, Vector &lmax)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO add bison and grapple hook
|
|
||||||
// TODO FIX this function
|
|
||||||
bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
||||||
{
|
{
|
||||||
float rspeed, rgrav;
|
float rspeed, rgrav;
|
||||||
@ -982,16 +968,20 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
|||||||
rgrav = 0.0f;
|
rgrav = 0.0f;
|
||||||
typedef float(GetProjectileData)(IClientEntity *);
|
typedef float(GetProjectileData)(IClientEntity *);
|
||||||
|
|
||||||
int classid = weapon->m_iClassID();
|
|
||||||
if (classid == CL_CLASS(CTFRocketLauncher_DirectHit))
|
switch (weapon->m_iClassID())
|
||||||
|
{
|
||||||
|
case CL_CLASS(CTFRocketLauncher_DirectHit):
|
||||||
{
|
{
|
||||||
rspeed = 1980.0f;
|
rspeed = 1980.0f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFRocketLauncher))
|
case CL_CLASS(CTFRocketLauncher):
|
||||||
{
|
{
|
||||||
rspeed = 1100.0f;
|
rspeed = 1100.0f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFGrenadeLauncher))
|
case CL_CLASS(CTFGrenadeLauncher):
|
||||||
{
|
{
|
||||||
IF_GAME(IsTF2())
|
IF_GAME(IsTF2())
|
||||||
{
|
{
|
||||||
@ -1003,8 +993,9 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
|||||||
rspeed = 1100.0f;
|
rspeed = 1100.0f;
|
||||||
rgrav = 0.5f;
|
rgrav = 0.5f;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFPipebombLauncher))
|
case CL_CLASS(CTFPipebombLauncher):
|
||||||
{
|
{
|
||||||
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
|
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
|
||||||
float chargetime = g_GlobalVars->curtime - chargebegin;
|
float chargetime = g_GlobalVars->curtime - chargebegin;
|
||||||
@ -1012,50 +1003,71 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
|||||||
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * 1500.0f) + 900.0f;
|
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * 1500.0f) + 900.0f;
|
||||||
rgrav =
|
rgrav =
|
||||||
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * -0.70000001f) + 0.5f;
|
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * -0.70000001f) + 0.5f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFCompoundBow))
|
case CL_CLASS(CTFCompoundBow):
|
||||||
{
|
{
|
||||||
float chargetime =
|
float chargetime =
|
||||||
g_GlobalVars->curtime * g_GlobalVars->interval_per_tick -
|
g_GlobalVars->curtime - CE_FLOAT(weapon, netvar.flChargeBeginTime);
|
||||||
CE_FLOAT(weapon, netvar.flChargeBeginTime) *
|
rspeed = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) * 800.0) +
|
||||||
g_GlobalVars->interval_per_tick;
|
1800.0);
|
||||||
rspeed = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * 800.0f) + 1800.0f;
|
rgrav = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) *
|
||||||
rgrav = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * -0.40000001f) + 0.5f;
|
-0.40000001) +
|
||||||
|
0.5);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFBat_Wood))
|
case CL_CLASS(CTFBat_Wood):
|
||||||
{
|
{
|
||||||
rspeed = 3000.0f;
|
rspeed = 3000.0f;
|
||||||
rgrav = 0.5f;
|
rgrav = 0.5f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFFlareGun))
|
case CL_CLASS(CTFFlareGun):
|
||||||
{
|
{
|
||||||
rspeed = 2000.0f;
|
rspeed = 2000.0f;
|
||||||
rgrav = 0.25f;
|
rgrav = 0.25f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFSyringeGun))
|
case CL_CLASS(CTFSyringeGun):
|
||||||
{
|
{
|
||||||
rgrav = 0.2f;
|
rgrav = 0.2f;
|
||||||
rspeed = 990.0f;
|
rspeed = 990.0f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFCrossbow))
|
case CL_CLASS(CTFCrossbow):
|
||||||
{
|
{
|
||||||
rgrav = 0.2f;
|
rgrav = 0.2f;
|
||||||
rspeed = 2400.0f;
|
rspeed = 2400.0f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFShotgunBuildingRescue))
|
case CL_CLASS(CTFShotgunBuildingRescue):
|
||||||
{
|
{
|
||||||
rgrav = 0.2f;
|
rgrav = 0.2f;
|
||||||
rspeed = 2400.0f;
|
rspeed = 2400.0f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFDRGPomson))
|
case CL_CLASS(CTFDRGPomson):
|
||||||
{
|
{
|
||||||
rspeed = 1200.0f;
|
rspeed = 1200.0f;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFWeaponFlameBall))
|
case CL_CLASS(CTFWeaponFlameBall):
|
||||||
{
|
{
|
||||||
// ??
|
rspeed = 3000.0f;
|
||||||
rspeed = 2500.0f;
|
break;
|
||||||
}
|
}
|
||||||
|
case CL_CLASS(CTFRaygun):
|
||||||
|
{
|
||||||
|
rspeed = 1200.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CL_CLASS(CTFGrapplingHook):
|
||||||
|
{
|
||||||
|
rspeed = 1500.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
speed = rspeed;
|
speed = rspeed;
|
||||||
gravity = rgrav;
|
gravity = rgrav;
|
||||||
return (rspeed || rgrav);
|
return (rspeed || rgrav);
|
||||||
@ -1358,10 +1370,9 @@ void PrintChat(const char *fmt, ...)
|
|||||||
va_start(list, fmt);
|
va_start(list, fmt);
|
||||||
vsprintf(buf.get(), fmt, list);
|
vsprintf(buf.get(), fmt, list);
|
||||||
va_end(list);
|
va_end(list);
|
||||||
std::unique_ptr<char> str(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s",
|
std::unique_ptr<char[]> str =
|
||||||
0x5e3252, 0xba3d9a, 0x5e3252,
|
std::move(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s", 0x5e3252,
|
||||||
buf.get())
|
0xba3d9a, 0x5e3252, buf.get()));
|
||||||
.release());
|
|
||||||
// FIXME DEBUG LOG
|
// FIXME DEBUG LOG
|
||||||
logging::Info("%s", str.get());
|
logging::Info("%s", str.get());
|
||||||
chat->Printf(str.get());
|
chat->Printf(str.get());
|
||||||
|
@ -72,7 +72,6 @@ void AddCenterString(const std::string &string, const rgba_t &color)
|
|||||||
++center_strings_count;
|
++center_strings_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO globals
|
|
||||||
int draw::width = 0;
|
int draw::width = 0;
|
||||||
int draw::height = 0;
|
int draw::height = 0;
|
||||||
float draw::fov = 90.0f;
|
float draw::fov = 90.0f;
|
||||||
|
4
update
4
update
@ -2,5 +2,7 @@
|
|||||||
#Get updated source code
|
#Get updated source code
|
||||||
git fetch;git pull origin;git submodule update --init --recursive
|
git fetch;git pull origin;git submodule update --init --recursive
|
||||||
#Update cathook
|
#Update cathook
|
||||||
cd build; cmake ..; make -j$(grep -c '^processor' /proc/cpuinfo); cd ..; cd ..
|
cd build; cmake ..; make -j$(grep -c '^processor' /proc/cpuinfo)
|
||||||
|
#Update data
|
||||||
|
sudo make data; cd ..; cd ..
|
||||||
printf "\n\n";printf '\e[1;34m%-6s\e' "Cathook update complete!";printf "\n\n"
|
printf "\n\n";printf '\e[1;34m%-6s\e' "Cathook update complete!";printf "\n\n"
|
||||||
|
Reference in New Issue
Block a user