diff --git a/dep/cppunitlite/msvc/cppunitlite.vcxproj b/dep/cppunitlite/msvc/cppunitlite.vcxproj index e3cb49a66..fbda29b7b 100644 --- a/dep/cppunitlite/msvc/cppunitlite.vcxproj +++ b/dep/cppunitlite/msvc/cppunitlite.vcxproj @@ -102,4 +102,4 @@ - \ No newline at end of file + diff --git a/regamedll/dlls/maprules.cpp b/regamedll/dlls/maprules.cpp index b9e27fbca..2d73d2b44 100644 --- a/regamedll/dlls/maprules.cpp +++ b/regamedll/dlls/maprules.cpp @@ -565,13 +565,10 @@ void CGamePlayerEquip::KeyValue(KeyValueData *pkvd) void CGamePlayerEquip::Touch(CBaseEntity *pOther) { - if (!CanFireForActivator(pOther)) - return; - - if (UseOnly()) - return; - - EquipPlayer(pOther); + if (CanEquipOverTouch(pOther)) + { + EquipPlayer(pOther); + } } void CGamePlayerEquip::EquipPlayer(CBaseEntity *pEntity) @@ -580,6 +577,12 @@ void CGamePlayerEquip::EquipPlayer(CBaseEntity *pEntity) return; CBasePlayer *pPlayer = static_cast(pEntity); + + if (RemoveWeapons()) + { + pPlayer->RemoveAllItems(FALSE); + } + for (int i = 0; i < MAX_EQUIP; i++) { if (FStringNull(m_weaponNames[i])) diff --git a/regamedll/dlls/maprules.h b/regamedll/dlls/maprules.h index 80da1c8db..1690795e8 100644 --- a/regamedll/dlls/maprules.h +++ b/regamedll/dlls/maprules.h @@ -245,6 +245,7 @@ class CGameCounterSet: public CRulePointEntity #define MAX_EQUIP 32 #define SF_PLAYEREQUIP_USEONLY BIT(0) // If set, the game_player_equip entity will not equip respawning players, // but only react to direct triggering, equipping its activator. This makes its master obsolete. +#define SF_PLAYEREQUIP_REMOVEWEAPONS BIT(1) // Remove all weapons before give. // Sets the default player equipment class CGamePlayerEquip: public CRulePointEntity @@ -256,6 +257,18 @@ class CGamePlayerEquip: public CRulePointEntity public: bool UseOnly() const { return (pev->spawnflags & SF_PLAYEREQUIP_USEONLY) == SF_PLAYEREQUIP_USEONLY; } + bool RemoveWeapons() const { return (pev->spawnflags & SF_PLAYEREQUIP_REMOVEWEAPONS) == SF_PLAYEREQUIP_REMOVEWEAPONS; } + + bool CanEquipOverTouch(CBaseEntity *pOther) + { + if (!CanFireForActivator(pOther)) + return false; + + if (UseOnly()) + return false; + + return true; + } private: void EquipPlayer(CBaseEntity *pPlayer); diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 29cc90c1d..55ddbc903 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -9888,11 +9888,18 @@ void EXT_FUNC CBasePlayer::__API_HOOK(OnSpawnEquip)(bool addDefault, bool equipG { if (equipGame) { - CBaseEntity *pWeaponEntity = nullptr; + CGamePlayerEquip *pWeaponEntity = nullptr; while ((pWeaponEntity = UTIL_FindEntityByClassname(pWeaponEntity, "game_player_equip"))) { - pWeaponEntity->Touch(this); - addDefault = false; + +#ifdef REGAMEDLL_FIXES + if (pWeaponEntity->CanEquipOverTouch(this)) +#endif + { + pWeaponEntity->Touch(this); + + addDefault = false; + } } } diff --git a/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd b/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd index 861a7f6aa..50ca2b554 100644 --- a/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd +++ b/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd @@ -1407,6 +1407,7 @@ spawnflags(flags) = [ 1: "Use Only" : 0 + 2: "Remove Weapons" : 0 ] weapon_knife (choices) : "Give Knife" : 0 = [