game_player_equip fixes/enhancement (#618)

* game_player_equip: Check UseOnly flag
* New flag SF_PLAYEREQUIP_REMOVEWEAPONS
This commit is contained in:
Vaqtincha 2021-05-22 16:15:28 +05:00 committed by GitHub
parent 8d1f4fb673
commit d80d87366a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 11 deletions

View File

@ -102,4 +102,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@ -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<CBasePlayer *>(pEntity);
if (RemoveWeapons())
{
pPlayer->RemoveAllItems(FALSE);
}
for (int i = 0; i < MAX_EQUIP; i++)
{
if (FStringNull(m_weaponNames[i]))

View File

@ -245,6 +245,7 @@ public:
#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 @@ public:
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);

View File

@ -9889,11 +9889,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;
}
}
}

View File

@ -1407,6 +1407,7 @@
spawnflags(flags) =
[
1: "Use Only" : 0
2: "Remove Weapons" : 0
]
weapon_knife (choices) : "Give Knife" : 0 =
[