diff --git a/src/gs-entbase/server/basevehicle.cpp b/src/gs-entbase/server/basevehicle.cpp index 116ead98..66a53043 100644 --- a/src/gs-entbase/server/basevehicle.cpp +++ b/src/gs-entbase/server/basevehicle.cpp @@ -14,13 +14,22 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +enumflags +{ + VHF_FROZEN, + VHF_NOATTACK +}; + class CBaseVehicle:CBaseTrigger { + int m_iVehicleFlags; + entity m_eDriver; void(void) CBaseVehicle; vector m_vecPlayerPos; + virtual void(void) PlayerUpdateFlags; virtual void(void) PlayerAlign; virtual void(base_player) PlayerEnter; virtual void(base_player) PlayerLeave; @@ -33,6 +42,16 @@ CBaseVehicle::PlayerInput(void) } +void +CBaseVehicle::PlayerUpdateFlags(void) +{ + if (m_iVehicleFlags & VHF_FROZEN) + m_eDriver.flags |= FL_FROZEN; + + if (m_iVehicleFlags & VHF_NOATTACK) + m_eDriver.flags |= FL_NOATTACK; +} + void CBaseVehicle::PlayerAlign(void) { @@ -70,7 +89,13 @@ void CBaseVehicle::PlayerLeave(base_player pl) { pl.movetype = MOVETYPE_WALK; - pl.flags &= ~FL_FROZEN; + + if (m_iVehicleFlags & VHF_FROZEN) + pl.flags &= ~FL_FROZEN; + + if (m_iVehicleFlags & VHF_NOATTACK) + pl.flags &= ~FL_NOATTACK; + pl.vehicle = __NULL__; m_eDriver = __NULL__; } diff --git a/src/gs-entbase/server/func_tank.cpp b/src/gs-entbase/server/func_tank.cpp index 916b2853..936d98ac 100644 --- a/src/gs-entbase/server/func_tank.cpp +++ b/src/gs-entbase/server/func_tank.cpp @@ -137,6 +137,7 @@ func_tank::customphysics(void) makevectors(m_eDriver.v_angle); endorg = v_forward * 4086; angles = vectoangles(endorg - origin); + PlayerUpdateFlags(); if (vlen(m_eDriver.origin - origin) > 128) PlayerLeave((base_player)m_eDriver); @@ -255,6 +256,7 @@ func_tank::SpawnKey(string strKey, string strValue) void func_tank::func_tank(void) { + m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; CBaseVehicle::CBaseVehicle(); if (m_strSpriteFlash) diff --git a/src/gs-entbase/server/func_tankmortar.cpp b/src/gs-entbase/server/func_tankmortar.cpp index c3b5b20e..ea1147fe 100644 --- a/src/gs-entbase/server/func_tankmortar.cpp +++ b/src/gs-entbase/server/func_tankmortar.cpp @@ -151,7 +151,7 @@ func_tankmortar::customphysics(void) endang[1] = Math_Lerp(v_forward[1], wantang[1], frametime); endang[2] = Math_Lerp(v_forward[2], wantang[2], frametime); angles = vectoangles(endang); - m_eDriver.flags |= FL_FROZEN; + PlayerUpdateFlags(); } } @@ -268,6 +268,8 @@ func_tankmortar::SpawnKey(string strKey, string strValue) void func_tankmortar::func_tankmortar(void) { + m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK; + CBaseVehicle::CBaseVehicle(); if (m_strSpriteFlash) diff --git a/src/gs-entbase/server/func_tracktrain.cpp b/src/gs-entbase/server/func_tracktrain.cpp index 441914cf..99b15269 100644 --- a/src/gs-entbase/server/func_tracktrain.cpp +++ b/src/gs-entbase/server/func_tracktrain.cpp @@ -166,7 +166,7 @@ func_tracktrain::customphysics(void) } else if (m_eDriver.movement[0] < 0) { m_flSpeed = bound(0, m_flSpeed -= frametime, 1.0f); } - m_eDriver.flags |= FL_FROZEN; + PlayerUpdateFlags(); } //m_flSpeed = autocvar_tracktrain_dir; @@ -316,5 +316,7 @@ func_tracktrain::SpawnKey(string strKey, string strValue) void func_tracktrain::func_tracktrain(void) { + m_iVehicleFlags |= VHF_FROZEN; + CBaseVehicle::CBaseVehicle(); } diff --git a/src/gs-entbase/server/func_vehicle.cpp b/src/gs-entbase/server/func_vehicle.cpp index 8fe5de17..bace471a 100644 --- a/src/gs-entbase/server/func_vehicle.cpp +++ b/src/gs-entbase/server/func_vehicle.cpp @@ -326,7 +326,8 @@ func_vehicle::customphysics(void) m_flTurn = max(0, m_flTurn - frametime * m_flStraightenFactor); } } - m_eDriver.flags |= FL_FROZEN; + + PlayerUpdateFlags(); } angles[0] = Math_FixDelta(angles[0]); @@ -563,6 +564,7 @@ func_vehicle::func_vehicle(void) m_flSteerFactor = 1.0f; m_flStraightenFactor = 1.0f; m_vecGravityDir = [0,0,-1]; + m_iVehicleFlags |= VHF_FROZEN; CBaseVehicle::CBaseVehicle(); diff --git a/src/shared/flags.h b/src/shared/flags.h index ef03cf63..64864aa1 100644 --- a/src/shared/flags.h +++ b/src/shared/flags.h @@ -37,7 +37,7 @@ #define FL_INVEHICLE (1<<18) #define FL_FROZEN (1<<19) #define FL_USE_RELEASED (1<<20) -#define FL_RESERVED1 (1<<15) -#define FL_RESERVED2 (1<<21) -#define FL_RESERVED3 (1<<22) -#define FL_RESERVED4 (1<<23) +#define FL_NOATTACK (1<<21) +#define FL_RESERVED1 (1<<22) +#define FL_RESERVED2 (1<<23) +#define FL_RESERVED3 (1<<15) diff --git a/src/shared/valve/weapon_common.c b/src/shared/valve/weapon_common.c index 404b25bf..b5fc342e 100644 --- a/src/shared/valve/weapon_common.c +++ b/src/shared/valve/weapon_common.c @@ -103,6 +103,9 @@ void Weapons_Primary(void) player pl = (player)self; int i = pl.activeweapon; + if (pl.flags & FL_NOATTACK) + return; + if (g_weapons[i].primary != __NULL__) { g_weapons[i].primary(); } @@ -118,6 +121,10 @@ void Weapons_Secondary(void) { player pl = (player)self; int i = pl.activeweapon; + + if (pl.flags & FL_NOATTACK) + return; + if (g_weapons[i].secondary != __NULL__) { g_weapons[i].secondary(); } @@ -132,6 +139,10 @@ void Weapons_Reload(void) { player pl = (player)self; int i = pl.activeweapon; + + if (pl.flags & FL_NOATTACK) + return; + if (g_weapons[i].reload != __NULL__) { g_weapons[i].reload(); }