Skip to content

Commit 2a63552

Browse files
committed
allow weapons to define which marine class they can be picked up by
"ClassRequirementOverride" keyvalue and SetMarineClassRequirement vscript function -1 = default behaviour 0 = officer 1 = SW 2 = medic 3 = tech
1 parent 78ca92a commit 2a63552

15 files changed

Lines changed: 50 additions & 14 deletions

reactivedrop/fgd/swarm.fgd

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,6 +2995,14 @@
29952995
0 : "No"
29962996
1 : "Yes"
29972997
]
2998+
ClassRequirementOverride(choices) : "Class Requirement Override" : -1 : "Change which marine class can pickup this item" =
2999+
[
3000+
-1 : "No Change"
3001+
0 : "Officer"
3002+
1 : "Special Weapons"
3003+
2 : "Medic"
3004+
3 : "Tech"
3005+
]
29983006
]
29993007

30003008
@PointClass base(Targetname, Parentname, Angles) studio("models/items/Ammobag/AmmoBag.mdl") = asw_ammo_drop : "Generic ammo stash"

src/game/client/swarm/c_asw_pickup_weapon.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ IMPLEMENT_CLIENTCLASS_DT( C_ASW_Pickup_Weapon, DT_ASW_Pickup_Weapon, CASW_Pickup
2222
RecvPropInt (RECVINFO(m_iBulletsInGun)),
2323
RecvPropInt (RECVINFO(m_iClips)),
2424
RecvPropInt (RECVINFO(m_iSecondary)),
25-
RecvPropBool (RECVINFO(m_bIsTemporaryPickup)),
25+
RecvPropBool (RECVINFO(m_bIsTemporaryPickup)),
26+
RecvPropInt (RECVINFO(m_iClassRequirementOverride)),
2627
END_RECV_TABLE()
2728

2829
C_ASW_Pickup_Weapon::C_ASW_Pickup_Weapon()

src/game/client/swarm/c_asw_pickup_weapon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class C_ASW_Pickup_Weapon : public C_ASW_Pickup
2323
CNetworkVar(int, m_iClips);
2424
CNetworkVar(int, m_iSecondary);
2525
CNetworkVar(bool, m_bIsTemporaryPickup);
26+
CNetworkVar(int, m_iClassRequirementOverride);
2627

2728
int m_nUseIconTextureID;
2829
bool m_bWideIcon;

src/game/client/swarm/c_asw_weapon.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ BEGIN_NETWORK_TABLE( CASW_Weapon, DT_ASW_Weapon )
6464
RecvPropBool ( RECVINFO( m_bIsTemporaryPickup ) ),
6565
RecvPropEHandle( RECVINFO( m_hOriginalOwnerMR ) ),
6666
RecvPropInt( RECVINFO( m_iInventoryEquipSlot ) ),
67+
RecvPropInt( RECVINFO( m_iClassRequirementOverride ) ),
6768
END_NETWORK_TABLE()
6869

6970
BEGIN_PREDICTION_DATA( C_ASW_Weapon )
@@ -169,6 +170,7 @@ m_GlowObject( this, glow_outline_color_weapon.GetColorAsVector(), 1.0f, false, t
169170

170171
m_bPoweredUp = false;
171172
m_bIsTemporaryPickup = false;
173+
m_iClassRequirementOverride = -1;
172174
}
173175

174176

src/game/client/swarm/c_asw_weapon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ class C_ASW_Weapon : public C_BaseCombatWeapon, public IASW_Client_Usable_Entity
202202
virtual bool AllowedToPickup( C_ASW_Inhabitable_NPC *pNPC );
203203
bool m_bSwappingWeapon;
204204
bool m_bIsTemporaryPickup;
205+
int m_iClassRequirementOverride;
205206

206207
// check if this weapon wants to perform a sync kill
207208
virtual bool CheckSyncKill( byte &forced_action, short &sync_kill_ent ) { return false; }

src/game/server/swarm/asw_marine.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3000,9 +3000,9 @@ bool CASW_Marine::TakeWeaponPickup( CASW_Weapon *pWeapon )
30003000
// check we're allowed to take this item
30013001
bool bAllowed = true;
30023002
if (pOldWeapon) // we're swapping with an existing weapon
3003-
bAllowed = ASWGameRules()->MarineCanPickup(GetMarineResource(), pWeapon->GetClassname(), pOldWeapon->GetClassname());
3003+
bAllowed = ASWGameRules()->MarineCanPickup(GetMarineResource(), pWeapon->GetClassname(), pOldWeapon->GetClassname(), pWeapon->m_iClassRequirementOverride);
30043004
else // we're putting it into an empty slot
3005-
bAllowed = ASWGameRules()->MarineCanPickup(GetMarineResource(), pWeapon->GetClassname());
3005+
bAllowed = ASWGameRules()->MarineCanPickup(GetMarineResource(), pWeapon->GetClassname(), NULL, pWeapon->m_iClassRequirementOverride);
30063006
if (!bAllowed)
30073007
return false;
30083008

@@ -3096,11 +3096,11 @@ bool CASW_Marine::TakeWeaponPickup(CASW_Pickup_Weapon* pPickup)
30963096
bool bAllowed = true;
30973097
if ( pWeapon ) // we're swapping with an existing weapon
30983098
{
3099-
bAllowed = ASWGameRules()->MarineCanPickup( GetMarineResource(), pPickup->GetWeaponClass(), pWeapon->GetClassname() );
3099+
bAllowed = ASWGameRules()->MarineCanPickup( GetMarineResource(), pPickup->GetWeaponClass(), pWeapon->GetClassname(), pPickup->m_iClassRequirementOverride );
31003100
}
31013101
else // we're putting it into an empty slot
31023102
{
3103-
bAllowed = ASWGameRules()->MarineCanPickup( GetMarineResource(), pPickup->GetWeaponClass() );
3103+
bAllowed = ASWGameRules()->MarineCanPickup( GetMarineResource(), pPickup->GetWeaponClass(), NULL, pPickup->m_iClassRequirementOverride );
31043104
}
31053105

31063106
if ( !bAllowed )

src/game/server/swarm/asw_pickup_equipment.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ void CASW_Pickup_Weapon_Ammo_Bag::InitFrom(CASW_Marine* pMarine, CASW_Weapon* pW
212212
m_iClips = 0;
213213
m_iSecondary = 0;
214214
m_bIsTemporaryPickup = pWeapon->m_bIsTemporaryPickup;
215+
m_iClassRequirementOverride = pWeapon->m_iClassRequirementOverride;
215216

216217
for (int i=0;i<ASW_AMMO_BAG_SLOTS;i++)
217218
{
@@ -232,6 +233,7 @@ void CASW_Pickup_Weapon_Ammo_Bag::InitWeapon(CASW_Marine* pMarine, CASW_Weapon*
232233
pWeapon->SetClip1( 0 );
233234
pWeapon->SetClip2( 0 );
234235
pWeapon->m_bIsTemporaryPickup = m_bIsTemporaryPickup;
236+
pWeapon->m_iClassRequirementOverride = m_iClassRequirementOverride;
235237

236238
// equip the weapon
237239
pMarine->Weapon_Equip_In_Index( pWeapon, pMarine->GetWeaponPositionForPickup( GetWeaponClass(), m_bIsTemporaryPickup ) );
@@ -287,6 +289,7 @@ void CASW_Pickup_Weapon_Ammo_Satchel::InitFrom(CASW_Marine* pMarine, CASW_Weapon
287289

288290
//m_nAmmoDrops = pSatchel->m_nAmmoDrops;
289291
m_bIsTemporaryPickup = pWeapon->m_bIsTemporaryPickup;
292+
m_iClassRequirementOverride = pWeapon->m_iClassRequirementOverride;
290293
}
291294

292295
void CASW_Pickup_Weapon_Ammo_Satchel::InitWeapon(CASW_Marine* pMarine, CASW_Weapon* pWeapon)
@@ -301,6 +304,7 @@ void CASW_Pickup_Weapon_Ammo_Satchel::InitWeapon(CASW_Marine* pMarine, CASW_Weap
301304
//pWeapon->SetClip1( 0 );
302305
//pWeapon->SetClip2( 0 );
303306
pWeapon->m_bIsTemporaryPickup = m_bIsTemporaryPickup;
307+
m_iClassRequirementOverride = pWeapon->m_iClassRequirementOverride;
304308

305309
// equip the weapon
306310
pMarine->Weapon_Equip_In_Index( pWeapon, pMarine->GetWeaponPositionForPickup( GetWeaponClass(), m_bIsTemporaryPickup ) );

src/game/server/swarm/asw_pickup_weapon.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,22 @@ IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon, DT_ASW_Pickup_Weapon)
1616
SendPropInt (SENDINFO(m_iBulletsInGun), 16 ),
1717
SendPropInt (SENDINFO(m_iClips), 10 ),
1818
SendPropInt (SENDINFO(m_iSecondary), 10 ),
19-
SendPropBool (SENDINFO(m_bIsTemporaryPickup) ),
19+
SendPropBool (SENDINFO(m_bIsTemporaryPickup) ),
20+
SendPropInt (SENDINFO(m_iClassRequirementOverride) ),
2021
END_SEND_TABLE()
2122

2223
BEGIN_DATADESC( CASW_Pickup_Weapon )
2324
DEFINE_KEYFIELD( m_iBulletsInGun, FIELD_INTEGER, "BulletsInGun"),
2425
DEFINE_KEYFIELD( m_iClips, FIELD_INTEGER, "Clips"),
2526
DEFINE_KEYFIELD( m_iSecondary, FIELD_INTEGER, "SecondaryBullets"),
2627
DEFINE_KEYFIELD( m_bIsTemporaryPickup, FIELD_BOOLEAN, "IsTemporaryPickup"),
28+
DEFINE_KEYFIELD( m_iClassRequirementOverride, FIELD_INTEGER, "ClassRequirementOverride" ),
2729
END_DATADESC()
2830

2931
CASW_Pickup_Weapon::CASW_Pickup_Weapon()
3032
{
3133
m_bIsTemporaryPickup = false;
34+
m_iClassRequirementOverride = -1;
3235
}
3336

3437
//---------------------------------------------------------
@@ -79,6 +82,7 @@ void CASW_Pickup_Weapon::InitFrom(CASW_Marine* pMarine, CASW_Weapon* pWeapon)
7982
m_iClips = bullets_on_player / pWeapon->GetMaxClip1();
8083
m_iSecondary = pWeapon->Clip2();
8184
m_bIsTemporaryPickup = pWeapon->m_bIsTemporaryPickup;
85+
m_iClassRequirementOverride = pWeapon->m_iClassRequirementOverride;
8286

8387
if (pMarine->GetNumberOfWeaponsUsingAmmo(iAmmoIndex) > 1)
8488
{
@@ -107,6 +111,7 @@ void CASW_Pickup_Weapon::InitWeapon(CASW_Marine* pMarine, CASW_Weapon* pWeapon)
107111
pMarine->GiveAmmo(GetNumClips() * pWeapon->GetMaxClip1(), pWeapon->GetPrimaryAmmoType());
108112

109113
pWeapon->m_bIsTemporaryPickup = m_bIsTemporaryPickup;
114+
pWeapon->m_iClassRequirementOverride = m_iClassRequirementOverride;
110115
}
111116

112117
// player has used this item

src/game/server/swarm/asw_pickup_weapon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class CASW_Pickup_Weapon : public CASW_Pickup
3333
CNetworkVar(int, m_iClips);
3434
CNetworkVar(int, m_iSecondary);
3535
CNetworkVar(bool, m_bIsTemporaryPickup);
36+
CNetworkVar(int, m_iClassRequirementOverride);
3637
};
3738

3839
class CASW_Pickup_Weapon_Rifle : public CASW_Pickup_Weapon

src/game/server/swarm/asw_weapon.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ IMPLEMENT_SERVERCLASS_ST( CASW_Weapon, DT_ASW_Weapon )
5959
SendPropBool( SENDINFO( m_bIsTemporaryPickup ) ),
6060
SendPropEHandle( SENDINFO( m_hOriginalOwnerMR ) ),
6161
SendPropInt( SENDINFO( m_iInventoryEquipSlot ), 2, SPROP_UNSIGNED ),
62+
SendPropInt( SENDINFO( m_iClassRequirementOverride ) ),
6263
END_SEND_TABLE()
6364

6465
//---------------------------------------------------------
@@ -72,13 +73,15 @@ BEGIN_DATADESC( CASW_Weapon )
7273
DEFINE_FIELD( m_fFastReloadStart, FIELD_TIME ),
7374
DEFINE_FIELD( m_fFastReloadEnd, FIELD_TIME ),
7475
DEFINE_KEYFIELD( m_bIsTemporaryPickup, FIELD_BOOLEAN, "IsTemporaryPickup" ),
76+
DEFINE_KEYFIELD( m_iClassRequirementOverride, FIELD_INTEGER, "ClassRequirementOverride" ),
7577
DEFINE_INPUTFUNC( FIELD_EHANDLE, "ForcePickUp", InputForcePickUp ),
7678
DEFINE_INPUTFUNC( FIELD_VOID, "ForceDrop", InputForceDrop ),
7779
DEFINE_OUTPUT( m_OnPickedUp, "OnPickedUp" ),
7880
DEFINE_OUTPUT( m_OnDropped, "OnDropped" ),
7981
END_DATADESC()
8082

8183
BEGIN_ENT_SCRIPTDESC( CASW_Weapon, CBaseCombatWeapon, "Alien Swarm weapon" )
84+
DEFINE_SCRIPTFUNC( SetMarineClassRequirement, "-1 = default behaviour, 0 = officer, 1 = SW, 2 = medic, 3 = tech" )
8285
END_SCRIPTDESC()
8386

8487
ConVar asw_weapon_safety_hull("asw_weapon_safety_hull", "0", FCVAR_CHEAT, "Size of hull used to check for AI shots going too near a friendly");
@@ -109,6 +112,7 @@ CASW_Weapon::CASW_Weapon()
109112
m_bIsTemporaryPickup = false;
110113
m_hOriginalOwnerMR = NULL;
111114
m_iInventoryEquipSlot = 0;
115+
m_iClassRequirementOverride = -1;
112116
}
113117

114118

@@ -452,3 +456,8 @@ void CASW_Weapon::InputForceDrop( inputdata_t &data )
452456

453457
pMarine->DropWeapon( this, false );
454458
}
459+
460+
void CASW_Weapon::SetMarineClassRequirement( int nClass )
461+
{
462+
m_iClassRequirementOverride = nClass;
463+
}

0 commit comments

Comments
 (0)