Skip to content

Commit

Permalink
Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
rafradek committed Sep 13, 2024
1 parent 3596e41 commit cd9cfa8
Show file tree
Hide file tree
Showing 13 changed files with 228 additions and 83 deletions.
1 change: 1 addition & 0 deletions gamedata/sigsegv/entities.txt
Original file line number Diff line number Diff line change
Expand Up @@ -895,6 +895,7 @@
"CTFGrenadePipebombProjectile::PipebombTouch" "_ZN28CTFGrenadePipebombProjectile13PipebombTouchEP11CBaseEntity"
"CTFGrenadePipebombProjectile::SetPipebombMode" "_ZN28CTFGrenadePipebombProjectile15SetPipebombModeEi"
"CTFGrenadePipebombProjectile::StickybombTouch" "_ZN28CTFGrenadePipebombProjectile15StickybombTouchEP11CBaseEntity"
"CTFGrenadePipebombProjectile::DetonateStickies" "_ZN28CTFGrenadePipebombProjectile16DetonateStickiesEv"
"CTFGrenadePipebombProjectile::VPhysicsCollision" "_ZN28CTFGrenadePipebombProjectile17VPhysicsCollisionEiP21gamevcollisionevent_t"
"CTFJar::CreateJarProjectile" "_ZN6CTFJar19CreateJarProjectileERK6VectorRK6QAngleS2_S2_P20CBaseCombatCharacterRK13CTFWeaponInfo"
"CTFJar::FireJar" "_ZN6CTFJar7FireJarEP9CTFPlayer"
Expand Down
2 changes: 2 additions & 0 deletions scripts/mvm_bigrock_sigdemo.pop
Original file line number Diff line number Diff line change
Expand Up @@ -1486,6 +1486,8 @@ WaveSchedule
PreferClass Sniper // Prefer those classes over other
PreferClass Spy
PreferTeam Spectator // Prefer targets of those teams: Red, Blue, Spectator, Unassigned or a number
KeepAwayRadius 300 // Keep away distance from target
KeepAway All // Keep away from those players: All, Enemies, Allies, Target, "Enemies except target", "All except target", "Allies except target" (Default: Enemies)
}
}
WaveSpawn
Expand Down
6 changes: 3 additions & 3 deletions src/mod/ai/npc_nextbot/npc_nextbot_unlag.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ namespace Mod::AI::NPC_Nextbot
mins = body->GetHullMins();
maxs = body->GetHullMaxs();
if (loco->IsOnGround()) {
mins += loco->GetStepHeight();
mins.z += loco->GetStepHeight();
}
mins.z = Min(maxs.z - 2.0f, mins.z);
}
Expand Down Expand Up @@ -118,7 +118,7 @@ namespace Mod::AI::NPC_Nextbot
if ( track->Count() <= 0 )
return;

int curr = track->Head();
intp curr = track->Head();

LagRecord *prevRecord = NULL;
LagRecord *record = NULL;
Expand Down Expand Up @@ -590,7 +590,7 @@ namespace Mod::AI::NPC_Nextbot
Assert( track->Count() < 1000 ); // insanity check

// remove tail records that are too old
int tailIndex = track->Tail();
intp tailIndex = track->Tail();
while ( track->IsValidIndex( tailIndex ) )
{
LagRecord &tail = track->Element( tailIndex );
Expand Down
58 changes: 47 additions & 11 deletions src/mod/attr/custom_attributes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2751,7 +2751,6 @@ namespace Mod::Attr::Custom_Attributes
DETOUR_DECL_MEMBER(bool, CTFPlayer_IsAllowedToTaunt) {
bool ret = DETOUR_MEMBER_CALL();
auto player = reinterpret_cast<CTFPlayer *>(this);
Msg("Is this called\n");
if (ret) {

int cannotTaunt = 0;
Expand Down Expand Up @@ -3625,6 +3624,32 @@ namespace Mod::Attr::Custom_Attributes
}
return DETOUR_MEMBER_CALL(info);
}

RefCount rc_CTFGrenadePipebombProjectile_DetonateStickies;
DETOUR_DECL_MEMBER(void, CTFGrenadePipebombProjectile_DetonateStickies)
{
SCOPED_INCREMENT(rc_CTFGrenadePipebombProjectile_DetonateStickies);
return DETOUR_MEMBER_CALL();
}

DETOUR_DECL_STATIC(int, UTIL_EntitiesInSphere, const Vector& center, float radius, CFlaggedEntitiesEnum *pEnum)
{
if (!rc_CTFGrenadePipebombProjectile_DetonateStickies) return DETOUR_STATIC_CALL(center, radius, pEnum);

auto result = DETOUR_STATIC_CALL(center, radius, pEnum);
auto list = pEnum->GetList();
for (auto i = 0; i < pEnum->GetCount(); i++) {
auto ent = rtti_cast<CBaseProjectile *>(list[i]);
if (ent != nullptr && !IsDeflectable(ent)) {
for (auto j = i + 1; j < pEnum->GetCount(); j++) {
list[j-1] = list[j];
}
result--;
}
}
return result;
}

// Stop short circuit from deflecting the projectile

RefCount rc_CTFProjectile_MechanicalArmOrb_CheckForProjectiles;
Expand Down Expand Up @@ -4095,6 +4120,7 @@ namespace Mod::Attr::Custom_Attributes
for (int i = 0; i < 4; i++) {
int addcond = (iCondOverride >> (i * 8)) & 255;
if (addcond != 0) {
raise(SIGTRAP);
nCond = (ETFCond) addcond;
DETOUR_MEMBER_CALL(nCond, bool1);
addcond_overridden = true;
Expand Down Expand Up @@ -4234,22 +4260,29 @@ namespace Mod::Attr::Custom_Attributes
RefCount rc_CTFWeaponInvis_CleanupInvisibilityWatch;
DETOUR_DECL_MEMBER(void, CTFPlayerShared_FadeInvis, float mult)
{
SCOPED_INCREMENT(rc_CTFPlayerShared_RemoveCond);
SCOPED_INCREMENT(rc_CTFPlayerShared_InCond);
auto me = reinterpret_cast<CTFPlayerShared *>(this);
addcond_provider = me->GetOuter();
if (!rc_CTFWeaponInvis_CleanupInvisibilityWatch)
addcond_provider_item = GetEconEntityAtLoadoutSlot(me->GetOuter(), LOADOUT_POSITION_PDA2);
int iCondOverride = 0;
CALL_ATTRIB_HOOK_INT_ON_OTHER(addcond_provider_item, iCondOverride, effect_cond_override);
if (iCondOverride) {
me->GetOuter()->HolsterOffHandWeapon();

bool shouldFadeOverride = addcond_provider_item != nullptr;

SCOPED_INCREMENT_IF(rc_CTFPlayerShared_RemoveCond, shouldFadeOverride);
SCOPED_INCREMENT_IF(rc_CTFPlayerShared_InCond, shouldFadeOverride);
if (shouldFadeOverride) {
int iCondOverride = 0;
CALL_ATTRIB_HOOK_INT_ON_OTHER(addcond_provider_item, iCondOverride, effect_cond_override);
if (iCondOverride) {
me->GetOuter()->HolsterOffHandWeapon();
}
ReplaceCond(*me, TF_COND_STEALTHED);
addcond_specific_cond = TF_COND_STEALTHED;
}
ReplaceCond(*me, TF_COND_STEALTHED);
addcond_specific_cond = TF_COND_STEALTHED;
DETOUR_MEMBER_CALL(mult);
addcond_specific_cond = TF_COND_INVALID;
ReplaceBackCond(*me, TF_COND_STEALTHED);
if (shouldFadeOverride) {
addcond_specific_cond = TF_COND_INVALID;
ReplaceBackCond(*me, TF_COND_STEALTHED);
}
}

DETOUR_DECL_MEMBER_CALL_CONVENTION(__gcc_regcall, void, CTFPlayerShared_UpdateCloakMeter)
Expand Down Expand Up @@ -9567,8 +9600,11 @@ namespace Mod::Attr::Custom_Attributes
MOD_ADD_DETOUR_MEMBER(CTFWeaponFlameBall_FireProjectile, "CTFWeaponFlameBall::FireProjectile");
MOD_ADD_DETOUR_MEMBER(CTFPlayer_ShouldGainInstantSpawn, "CTFPlayer::ShouldGainInstantSpawn");
MOD_ADD_DETOUR_MEMBER(CTFPlayer_IsReadyToSpawn, "CTFPlayer::IsReadyToSpawn");
MOD_ADD_DETOUR_MEMBER(CTFProjectile_MechanicalArmOrb_CheckForProjectiles, "CTFProjectile_MechanicalArmOrb::CheckForProjectiles");
MOD_ADD_DETOUR_STATIC(HandleRageGain, "HandleRageGain");
MOD_ADD_DETOUR_STATIC(TE_TFParticleEffect, "TE_TFParticleEffect [No attachment]");
MOD_ADD_DETOUR_STATIC(UTIL_EntitiesInSphere, "UTIL_EntitiesInSphere");
MOD_ADD_DETOUR_MEMBER(CTFGrenadePipebombProjectile_DetonateStickies, "CTFGrenadePipebombProjectile::DetonateStickies");

//MOD_ADD_VHOOK_INHERIT(CBaseProjectile_ShouldCollide, TypeName<CBaseProjectile>(), "CBaseEntity::ShouldCollide");

Expand Down
32 changes: 11 additions & 21 deletions src/mod/canteen/share_recall_canteen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,16 @@ namespace Mod::Canteen::Share_Recall_Canteen
RefCount rc_CTFPowerupBottle_ReapplyProvision;


bool got_attr;
int canteen_specialist;
DETOUR_DECL_STATIC(int, CAttributeManager_AttribHookValue_int, int value, const char *attr, const CBaseEntity *ent, CUtlVector<CBaseEntity *> *vec, bool b1)
{
auto result = DETOUR_STATIC_CALL(value, attr, ent, vec, b1);

if (rc_CTFPowerupBottle_ReapplyProvision > 0 && !got_attr && value == 0 && V_stricmp(attr, "canteen_specialist") == 0) {
canteen_specialist = result;

got_attr = true;
}

return result;
}

bool got_cond;
ETFCond cond;
float duration;
CTFPlayer *patient = nullptr;
int canteen_specialist = 0;
DETOUR_DECL_MEMBER(void, CTFPlayerShared_AddCond, ETFCond nCond, float flDuration, CBaseEntity *pProvider)
{
if (rc_CTFPowerupBottle_ReapplyProvision > 0 && !got_cond && nCond == TF_COND_SPEED_BOOST) {
cond = nCond;
flDuration += canteen_specialist;
duration = flDuration;

got_cond = true;
Expand All @@ -51,28 +39,31 @@ namespace Mod::Canteen::Share_Recall_Canteen
auto canteen = reinterpret_cast<CTFPowerupBottle *>(this);
CTFPlayer *medic = ToTFPlayer(canteen->GetOwnerEntity());

CTFPlayer *patient = nullptr;
patient = nullptr;
canteen_specialist = 0;
CALL_ATTRIB_HOOK_INT_ON_OTHER(medic, canteen_specialist, canteen_specialist);
int iRecall = 0;
CALL_ATTRIB_HOOK_INT_ON_OTHER(canteen, iRecall, recall);
if (medic != nullptr) {
auto medigun = rtti_cast<CWeaponMedigun *>(medic->GetActiveWeapon());
if (medigun != nullptr) {
patient = ToTFPlayer(medigun->GetHealTarget());
}
}

got_attr = false;
got_cond = false;

++rc_CTFPowerupBottle_ReapplyProvision;
DETOUR_MEMBER_CALL();
--rc_CTFPowerupBottle_ReapplyProvision;

if (!got_attr || !got_cond) return;
if (!got_cond) return;
if (canteen_specialist <= 0) return;
if (iRecall <= 0) return;
if (medic == nullptr) return;
if (patient == nullptr) return;

patient->ForceRespawn();
patient->m_Shared->AddCond(cond, duration);
patient->m_Shared->AddCond(TF_COND_SPEED_BOOST, duration, medic);

IGameEvent *event = gameeventmanager->CreateEvent("mvm_medic_powerup_shared");
if (event != nullptr) {
Expand All @@ -87,7 +78,6 @@ namespace Mod::Canteen::Share_Recall_Canteen
public:
CMod() : IMod("Canteen:Share_Recall_Canteen")
{
MOD_ADD_DETOUR_STATIC(CAttributeManager_AttribHookValue_int, "CAttributeManager::AttribHookValue<int>");
MOD_ADD_DETOUR_MEMBER(CTFPlayerShared_AddCond, "CTFPlayerShared::AddCond");
MOD_ADD_DETOUR_MEMBER(CTFPowerupBottle_ReapplyProvision, "CTFPowerupBottle::ReapplyProvision");
}
Expand Down
4 changes: 2 additions & 2 deletions src/mod/common/text_hud.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ namespace Mod::Common::Text_Hud
auto player = UTIL_PlayerByIndex(pFilter->GetRecipientIndex(i));
if (player != nullptr) {
auto mod = player->GetOrCreateEntityModule<HudTextDisplayModule>("huddisplaymodule");
mod->fadeoutTime[channel] = gpGlobals->curtime + fadein + holdtime + fadeout;
mod->internalId[channel] = 0;
mod->fadeoutTime[channel % 6] = gpGlobals->curtime + fadein + holdtime + fadeout;
mod->internalId[channel % 6] = 0;
}
}
}
Expand Down
58 changes: 42 additions & 16 deletions src/mod/etc/heat_seeking_rockets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "stub/extraentitydata.h"
#include "stub/tfweaponbase.h"
#include "stub/trace.h"
#include "stub/objects.h"
#include "util/misc.h"


Expand Down Expand Up @@ -111,22 +112,36 @@ namespace Mod::Etc::Heat_Seeking_Rockets

CBaseEntity *disallow_movetype = nullptr;
int disallow_movetype_tick = 0;
CBaseObject *newRocketOwner = nullptr;

DETOUR_DECL_STATIC(CTFBaseRocket *, CTFBaseRocket_Create, CBaseEntity *launcher, const char *classname, const Vector &vecOrigin, const QAngle &vecAngles, CBaseEntity *pOwner)
{
newRocketOwner = ToBaseObject(pOwner);
auto ret = DETOUR_STATIC_CALL(launcher, classname, vecOrigin, vecAngles, pOwner);
newRocketOwner = nullptr;
return ret;
}

DETOUR_DECL_MEMBER(void, CBaseProjectile_SetLauncher, CBaseEntity *launcher)
{
auto proj = reinterpret_cast<CBaseProjectile *>(this);
CBaseEntity *original = proj->GetOriginalLauncher();
DETOUR_MEMBER_CALL(launcher);

if (launcher == nullptr && newRocketOwner != nullptr && newRocketOwner->GetBuilder() != nullptr) {
launcher = newRocketOwner->GetBuilder();
}
if (launcher != nullptr && original == nullptr) {
auto weapon = static_cast<CTFWeaponBaseGun *>(launcher->MyCombatWeaponPointer());
if (weapon != nullptr && weapon->GetOwnerEntity() != nullptr && weapon->GetOwnerEntity()->IsPlayer()) {
CBaseEntity *provider = weapon != nullptr ? weapon : launcher;
if (provider != nullptr && (weapon == nullptr || weapon->GetOwnerEntity() != nullptr && weapon->GetOwnerEntity()->IsPlayer())) {

HomingRockets &homing = *(GetExtraProjectileData(proj)->homing = new HomingRockets());

CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, homing.turn_power, mod_projectile_heat_seek_power);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, homing.acceleration, projectile_acceleration);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, homing.gravity, projectile_gravity);
if (homing.turn_power != 0.0f || homing.acceleration != 0.0f || homing.gravity != 0.0f) {
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, homing.turn_power, mod_projectile_heat_seek_power);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, homing.acceleration, projectile_acceleration);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, homing.gravity, projectile_gravity);
CALL_ATTRIB_HOOK_INT_ON_OTHER(provider, homing.return_to_sender, return_to_sender);
if (homing.turn_power != 0.0f || homing.acceleration != 0.0f || homing.gravity != 0.0f || homing.return_to_sender != 0) {

proj->SetMoveType(MOVETYPE_CUSTOM, proj->GetMoveCollide());
if (proj->VPhysicsGetObject() != nullptr) {
Expand All @@ -137,41 +152,41 @@ namespace Mod::Etc::Heat_Seeking_Rockets

homing.enable = true;
float min_dot_product = 0.0f;
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, min_dot_product, mod_projectile_heat_aim_error);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, min_dot_product, mod_projectile_heat_aim_error);
if (min_dot_product != 0.0f)
homing.min_dot_product = FastCos(DEG2RAD(Clamp(min_dot_product, 0.0f, 180.0f)));

float aim_time = 0.0f;
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, aim_time, mod_projectile_heat_aim_time);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, aim_time, mod_projectile_heat_aim_time);
if (aim_time != 0.0f)
homing.aim_time = aim_time;

float aim_start_time = 0.0f;
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, aim_start_time, mod_projectile_heat_aim_start_time);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, aim_start_time, mod_projectile_heat_aim_start_time);
if (aim_start_time != 0.0f)
homing.aim_start_time = aim_start_time;

float acceleration_time = 0.0f;
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, acceleration_time, projectile_acceleration_time);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, acceleration_time, projectile_acceleration_time);
if (acceleration_time != 0.0f)
homing.acceleration_time = acceleration_time;

float acceleration_start = 0.0f;
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(weapon, acceleration_start, projectile_acceleration_start_time);
CALL_ATTRIB_HOOK_FLOAT_ON_OTHER(provider, acceleration_start, projectile_acceleration_start_time);
if (acceleration_start != 0.0f)
homing.acceleration_start = acceleration_start;

int follow_crosshair = 0;
CALL_ATTRIB_HOOK_INT_ON_OTHER(weapon, follow_crosshair, mod_projectile_heat_follow_crosshair);
CALL_ATTRIB_HOOK_INT_ON_OTHER(provider, follow_crosshair, mod_projectile_heat_follow_crosshair);
if (follow_crosshair != 0)
homing.follow_crosshair = true;

int no_predict_target_speed = 0;
CALL_ATTRIB_HOOK_INT_ON_OTHER(weapon, follow_crosshair, mod_projectile_heat_no_predict_target_speed);
CALL_ATTRIB_HOOK_INT_ON_OTHER(provider, follow_crosshair, mod_projectile_heat_no_predict_target_speed);
if (follow_crosshair != 0)
homing.predict_target_speed = false;

homing.speed = CalculateProjectileSpeed(weapon);
homing.speed = weapon != nullptr ? CalculateProjectileSpeed(weapon) : 1100;

if (homing.speed < 0) {
homing.speed = -homing.speed;
Expand Down Expand Up @@ -248,11 +263,17 @@ namespace Mod::Etc::Heat_Seeking_Rockets
float time = (float)(ent->m_flSimulationTime) - (float)(ent->m_flAnimTime);

float speed_calculated = homing.speed + homing.acceleration * Clamp(time - homing.acceleration_start, 0.0f, homing.acceleration_time);
if (speed_calculated < 0.0f && homing.return_to_sender && !homing.returning) {
homing.returning = true;
homing.speed = 0;
homing.acceleration = -homing.acceleration;
homing.acceleration_start = time;
}

// Faster projectiles update faster
float interval = (3000.0f / speed_calculated) * 0.014f;

if (homing.turn_power != 0.0f && time >= homing.aim_start_time && time < homing.aim_time && gpGlobals->tickcount % (int)ceil(interval / gpGlobals->interval_per_tick) == 0) {
if (!homing.returning && homing.turn_power != 0.0f && time >= homing.aim_start_time && time < homing.aim_time && gpGlobals->tickcount % (int)ceil(interval / gpGlobals->interval_per_tick) == 0) {
Vector target_vec = vec3_origin;

if (homing.follow_crosshair) {
Expand Down Expand Up @@ -334,7 +355,6 @@ namespace Mod::Etc::Heat_Seeking_Rockets
homing.homed_in = false;
}
}

if (homing.homed_in) {
float ticksPerSecond = 1.0f / gpGlobals->frametime;
pNewAngVelocity->x = (ApproachAngle(homing.homed_in_angle.x, pNewAngles->x, homing.turn_power * gpGlobals->frametime) - pNewAngles->x) * ticksPerSecond;
Expand All @@ -344,6 +364,10 @@ namespace Mod::Etc::Heat_Seeking_Rockets
if (time < homing.aim_time) {
*pNewAngles += (*pNewAngVelocity * gpGlobals->frametime);
}
if (homing.returning && proj->GetOwnerEntity() != nullptr) {
CBaseEntity *owner = proj->GetOwnerEntity();
VectorAngles(proj->WorldSpaceCenter() - owner->WorldSpaceCenter(), *pNewAngles);
}

Vector vecOrientation;
AngleVectors(*pNewAngles, &vecOrientation);
Expand Down Expand Up @@ -381,6 +405,8 @@ namespace Mod::Etc::Heat_Seeking_Rockets
MOD_ADD_DETOUR_MEMBER(CBaseProjectile_SetLauncher, "CBaseProjectile::SetLauncher");
MOD_ADD_DETOUR_MEMBER(CBaseEntity_PerformCustomPhysics, "CBaseEntity::PerformCustomPhysics");
MOD_ADD_DETOUR_MEMBER(CTFProjectile_Flare_PerformCustomPhysics, "CTFProjectile_Flare::PerformCustomPhysics");
MOD_ADD_DETOUR_STATIC(CTFBaseRocket_Create, "CTFBaseRocket::Create");

}
};
CMod s_Mod;
Expand Down
4 changes: 2 additions & 2 deletions src/mod/etc/mapentity_inputs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -996,7 +996,7 @@ namespace Mod::Etc::Mapentity_Additions
}},
{"ForceRespawn"sv, false, [](CBaseEntity *ent, const char *szInputName, CBaseEntity *pActivator, CBaseEntity *pCaller, variant_t &Value){
CTFPlayer *player = ToTFPlayer(ent);
if (player != nullptr && !player->IsBot()) {
if (player != nullptr) {
if (player->GetTeamNumber() >= TF_TEAM_RED && player->GetPlayerClass() != nullptr && player->GetPlayerClass()->GetClassIndex() != TF_CLASS_UNDEFINED) {
player->ForceRespawn();
}
Expand All @@ -1007,7 +1007,7 @@ namespace Mod::Etc::Mapentity_Additions
}},
{"ForceRespawnDead"sv, false, [](CBaseEntity *ent, const char *szInputName, CBaseEntity *pActivator, CBaseEntity *pCaller, variant_t &Value){
CTFPlayer *player = ToTFPlayer(ent);
if (player != nullptr && !player->IsBot() && !player->IsAlive()) {
if (player != nullptr && !player->IsAlive()) {
if (player->GetTeamNumber() >= TF_TEAM_RED && player->GetPlayerClass() != nullptr && player->GetPlayerClass()->GetClassIndex() != TF_CLASS_UNDEFINED) {
player->ForceRespawn();
}
Expand Down
Loading

0 comments on commit cd9cfa8

Please sign in to comment.