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
|
||||
bool HasWeapon(CachedEntity *ent, int wantedId);
|
||||
bool IsAmbassador(CachedEntity *ent);
|
||||
bool HasDarwins(CachedEntity *ent);
|
||||
bool AmbassadorCanHeadshot();
|
||||
|
||||
inline const char *teamname(int team)
|
||||
|
@ -108,7 +108,7 @@ bool EntityHitboxCache::VisibilityCheck(int id)
|
||||
|
||||
static settings::Int setupbones_time{ "source.setupbones-time", "3" };
|
||||
|
||||
std::mutex setupbones_mutex;
|
||||
static std::mutex setupbones_mutex;
|
||||
|
||||
matrix3x4_t *EntityHitboxCache::GetBones()
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <settings/Bool.hpp>
|
||||
#include "common.hpp"
|
||||
#include "hacks/Backtrack.hpp"
|
||||
#include "hacks/Aimbot.hpp"
|
||||
|
||||
static settings::Bool enable{ "autobackstab.enable", "0" };
|
||||
static settings::Bool silent{ "autobackstab.silent", "1" };
|
||||
@ -25,174 +26,121 @@ const Vector GetWorldSpaceCenter(CachedEntity *ent)
|
||||
return vWorldSpaceCenter;
|
||||
}
|
||||
|
||||
bool found;
|
||||
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
|
||||
{
|
||||
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max);
|
||||
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))
|
||||
return false;
|
||||
// Get the forward view vector of the target, ignore Z
|
||||
Vector vecVictimForward = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
|
||||
vecVictimForward.z = 0.0f;
|
||||
vecVictimForward.NormalizeInPlace();
|
||||
Ray_t ray;
|
||||
Vector forward;
|
||||
float sp, sy, cp, cy;
|
||||
trace_t trace;
|
||||
|
||||
// Get a vector from my origin to my targets origin
|
||||
Vector vecToTarget;
|
||||
vecToTarget = GetWorldSpaceCenter(tar) - GetWorldSpaceCenter(LOCAL_E);
|
||||
vecToTarget.z = 0.0f;
|
||||
vecToTarget.NormalizeInPlace();
|
||||
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
|
||||
sy = sinf(DEG2RAD(angle[1]));
|
||||
cy = cosf(DEG2RAD(angle[1]));
|
||||
sp = sinf(DEG2RAD(angle[0]));
|
||||
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.
|
||||
Vector vecOwnerForward = Local_ang;
|
||||
vecOwnerForward.z = 0.0f;
|
||||
vecOwnerForward.NormalizeInPlace();
|
||||
|
||||
float flDotOwner = DotProduct(vecOwnerForward, vecToTarget);
|
||||
float flDotVictim = DotProduct(vecVictimForward, vecToTarget);
|
||||
|
||||
// Make sure they're actually facing the target.
|
||||
// This needs to be done because lag compensation can place target slightly
|
||||
// behind the attacker.
|
||||
if (flDotOwner > 0.5)
|
||||
return (flDotVictim > -0.1);
|
||||
bool canBackstab(CachedEntity *tar, Vector angle, Vector loc, Vector hitboxLoc)
|
||||
{
|
||||
float meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||
Vector targetAngle = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
|
||||
if (fabsf(angle.y - targetAngle.y) < 80)
|
||||
{
|
||||
int IDX;
|
||||
Vector hitLoc;
|
||||
traceEntity(&IDX, &hitLoc, QAngle(angle.x, angle.y, angle.z), loc);
|
||||
if (IDX == tar->m_IDX)
|
||||
{
|
||||
if (loc.DistTo(hitboxLoc) <= meleeRange)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void CreateMove()
|
||||
{
|
||||
if (!enable)
|
||||
return;
|
||||
if (!CE_GOOD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || !CE_GOOD(LOCAL_W))
|
||||
return;
|
||||
if (!LOCAL_E->m_bAlivePlayer())
|
||||
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W) || !LOCAL_E->m_bAlivePlayer())
|
||||
return;
|
||||
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
|
||||
return;
|
||||
int eid = -1;
|
||||
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 *besttarget = nullptr;
|
||||
|
||||
CachedEntity *target = nullptr;
|
||||
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))
|
||||
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
|
||||
{
|
||||
float swingrange =
|
||||
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||
const Vector &max2 = GetHitboxBounds(target, 1).second +
|
||||
Vector(swingrange, swingrange, swingrange);
|
||||
const Vector &min2 = GetHitboxBounds(target, 1).first -
|
||||
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))
|
||||
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 *target = ENTITY(i);
|
||||
if (CE_BAD(target))
|
||||
continue;
|
||||
if (target == LOCAL_E || target->m_iTeam() == LOCAL_E->m_iTeam() ||
|
||||
!target->m_bAlivePlayer() || target->m_Type() != ENTITY_PLAYER)
|
||||
continue;
|
||||
if (target->hitboxes.GetHitbox(spine_2)->center.DistTo(
|
||||
g_pLocalPlayer->v_Eye) <= 300.0f)
|
||||
{
|
||||
CachedEntity *tmp = ENTITY(i);
|
||||
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())
|
||||
if (CE_GOOD(besttarget))
|
||||
{
|
||||
bestent = tmp->m_IDX;
|
||||
bestscr = tmp->m_flDistance();
|
||||
if (target->hitboxes.GetHitbox(spine_2)->center.DistTo(
|
||||
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())
|
||||
return;
|
||||
if (hacks::shared::backtrack::iBestTarget == -1)
|
||||
return;
|
||||
int iBestTarget = hacks::shared::backtrack::iBestTarget;
|
||||
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)))
|
||||
Vector hitboxLoc =
|
||||
besttarget->hitboxes.GetHitbox(spine_2)
|
||||
->center;
|
||||
Vector angle = NET_VECTOR(RAW_ENT(LOCAL_E), netvar.m_angEyeAngles);
|
||||
for (angle.y = -180.0f; angle.y < 180.0f; angle.y += 1.0f)
|
||||
{
|
||||
CachedEntity *tar = ENTITY(iBestTarget);
|
||||
// ok just in case
|
||||
if (CE_BAD(tar))
|
||||
continue;
|
||||
Vector &angles =
|
||||
NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
|
||||
float &simtime =
|
||||
NET_FLOAT(RAW_ENT(tar), netvar.m_flSimulationTime);
|
||||
angles.y = i.viewangles;
|
||||
simtime = i.simtime;
|
||||
current_user_cmd->tick_count = i.tickcount;
|
||||
current_user_cmd->buttons |= IN_ATTACK;
|
||||
break;
|
||||
}
|
||||
// Get angles
|
||||
Vector tr = (hitboxLoc - g_pLocalPlayer->v_Eye);
|
||||
Vector xAngle;
|
||||
VectorAngles(tr, xAngle);
|
||||
// Clamping is important
|
||||
fClampAngle(xAngle);
|
||||
angle.x = xAngle.x;
|
||||
if (canBackstab(besttarget, angle, g_pLocalPlayer->v_Eye, hitboxLoc))
|
||||
{
|
||||
current_user_cmd->viewangles = angle;
|
||||
current_user_cmd->buttons |= IN_ATTACK;
|
||||
besttarget = nullptr;
|
||||
if (silent)
|
||||
g_pLocalPlayer->bUseSilentAngles = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace hacks::tf2::autobackstab
|
||||
|
@ -76,7 +76,11 @@ int BulletDangerValue(CachedEntity *patient)
|
||||
any_zoomed_snipers = true;
|
||||
// TODO VisCheck from patient.
|
||||
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;
|
||||
return vacc_sniper ? 2 : 1;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <settings/Bool.hpp>
|
||||
|
||||
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::Float follow_distance{ "follow-bot.distance", "175" };
|
||||
static settings::Float follow_activation{ "follow-bot.max-range", "1000" };
|
||||
|
@ -26,6 +26,7 @@ Timer lastVoicemenu{};
|
||||
|
||||
void Draw()
|
||||
{
|
||||
PROF_SECTION(DRAW_SpyAlert)
|
||||
if (!enable)
|
||||
return;
|
||||
CachedEntity *closest_spy, *ent;
|
||||
|
@ -834,7 +834,6 @@ index_t SelectNextNode()
|
||||
return FindNearestNode(true);
|
||||
}
|
||||
auto &n = state::nodes[state::active_node];
|
||||
// TODO medkit connections and shit
|
||||
std::vector<index_t> chance{};
|
||||
for (index_t i = 0; i < MAX_CONNECTIONS; i++)
|
||||
{
|
||||
|
@ -546,20 +546,6 @@ bool HasWeapon(CachedEntity *ent, int wantedId)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
Vector hit;
|
||||
if (g_Settings.bInvalid)
|
||||
return false;
|
||||
if (entity == g_pLocalPlayer->entity)
|
||||
@ -936,7 +921,10 @@ weaponmode GetWeaponMode()
|
||||
classid == CL_CLASS(CTFSyringeGun) ||
|
||||
classid == CL_CLASS(CTFCrossbow) ||
|
||||
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;
|
||||
}
|
||||
@ -968,8 +956,6 @@ bool LineIntersectsBox(Vector &bmin, Vector &bmax, Vector &lmin, Vector &lmax)
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO add bison and grapple hook
|
||||
// TODO FIX this function
|
||||
bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
||||
{
|
||||
float rspeed, rgrav;
|
||||
@ -982,16 +968,20 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
||||
rgrav = 0.0f;
|
||||
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;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFRocketLauncher))
|
||||
case CL_CLASS(CTFRocketLauncher):
|
||||
{
|
||||
rspeed = 1100.0f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFGrenadeLauncher))
|
||||
case CL_CLASS(CTFGrenadeLauncher):
|
||||
{
|
||||
IF_GAME(IsTF2())
|
||||
{
|
||||
@ -1003,8 +993,9 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
|
||||
rspeed = 1100.0f;
|
||||
rgrav = 0.5f;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFPipebombLauncher))
|
||||
case CL_CLASS(CTFPipebombLauncher):
|
||||
{
|
||||
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
|
||||
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;
|
||||
rgrav =
|
||||
(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 =
|
||||
g_GlobalVars->curtime * g_GlobalVars->interval_per_tick -
|
||||
CE_FLOAT(weapon, netvar.flChargeBeginTime) *
|
||||
g_GlobalVars->interval_per_tick;
|
||||
rspeed = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * 800.0f) + 1800.0f;
|
||||
rgrav = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * -0.40000001f) + 0.5f;
|
||||
g_GlobalVars->curtime - CE_FLOAT(weapon, netvar.flChargeBeginTime);
|
||||
rspeed = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) * 800.0) +
|
||||
1800.0);
|
||||
rgrav = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) *
|
||||
-0.40000001) +
|
||||
0.5);
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFBat_Wood))
|
||||
case CL_CLASS(CTFBat_Wood):
|
||||
{
|
||||
rspeed = 3000.0f;
|
||||
rgrav = 0.5f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFFlareGun))
|
||||
case CL_CLASS(CTFFlareGun):
|
||||
{
|
||||
rspeed = 2000.0f;
|
||||
rgrav = 0.25f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFSyringeGun))
|
||||
case CL_CLASS(CTFSyringeGun):
|
||||
{
|
||||
rgrav = 0.2f;
|
||||
rspeed = 990.0f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFCrossbow))
|
||||
case CL_CLASS(CTFCrossbow):
|
||||
{
|
||||
rgrav = 0.2f;
|
||||
rspeed = 2400.0f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFShotgunBuildingRescue))
|
||||
case CL_CLASS(CTFShotgunBuildingRescue):
|
||||
{
|
||||
rgrav = 0.2f;
|
||||
rspeed = 2400.0f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFDRGPomson))
|
||||
case CL_CLASS(CTFDRGPomson):
|
||||
{
|
||||
rspeed = 1200.0f;
|
||||
break;
|
||||
}
|
||||
else if (classid == CL_CLASS(CTFWeaponFlameBall))
|
||||
case CL_CLASS(CTFWeaponFlameBall):
|
||||
{
|
||||
// ??
|
||||
rspeed = 2500.0f;
|
||||
rspeed = 3000.0f;
|
||||
break;
|
||||
}
|
||||
case CL_CLASS(CTFRaygun):
|
||||
{
|
||||
rspeed = 1200.0f;
|
||||
break;
|
||||
}
|
||||
case CL_CLASS(CTFGrapplingHook):
|
||||
{
|
||||
rspeed = 1500.0f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
speed = rspeed;
|
||||
gravity = rgrav;
|
||||
return (rspeed || rgrav);
|
||||
@ -1358,10 +1370,9 @@ void PrintChat(const char *fmt, ...)
|
||||
va_start(list, fmt);
|
||||
vsprintf(buf.get(), fmt, list);
|
||||
va_end(list);
|
||||
std::unique_ptr<char> str(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s",
|
||||
0x5e3252, 0xba3d9a, 0x5e3252,
|
||||
buf.get())
|
||||
.release());
|
||||
std::unique_ptr<char[]> str =
|
||||
std::move(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s", 0x5e3252,
|
||||
0xba3d9a, 0x5e3252, buf.get()));
|
||||
// FIXME DEBUG LOG
|
||||
logging::Info("%s", str.get());
|
||||
chat->Printf(str.get());
|
||||
|
@ -72,7 +72,6 @@ void AddCenterString(const std::string &string, const rgba_t &color)
|
||||
++center_strings_count;
|
||||
}
|
||||
|
||||
// TODO globals
|
||||
int draw::width = 0;
|
||||
int draw::height = 0;
|
||||
float draw::fov = 90.0f;
|
||||
|
4
update
4
update
@ -2,5 +2,7 @@
|
||||
#Get updated source code
|
||||
git fetch;git pull origin;git submodule update --init --recursive
|
||||
#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"
|
||||
|
Reference in New Issue
Block a user