mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2024-12-27 07:15:31 +03:00
Added I/O/KV for custom healthkits, custom battery models, and health/power multipliers
This commit is contained in:
parent
d4311587c3
commit
f580801a33
@ -97,6 +97,7 @@
|
|||||||
|
|
||||||
#ifdef MAPBASE
|
#ifdef MAPBASE
|
||||||
#include "mapbase/matchers.h"
|
#include "mapbase/matchers.h"
|
||||||
|
#include "items.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "env_debughistory.h"
|
#include "env_debughistory.h"
|
||||||
@ -11509,17 +11510,9 @@ void CAI_BaseNPC::PickupItem( CBaseEntity *pItem )
|
|||||||
m_OnItemPickup.Set( pItem, pItem, this );
|
m_OnItemPickup.Set( pItem, pItem, this );
|
||||||
|
|
||||||
Assert( pItem != NULL );
|
Assert( pItem != NULL );
|
||||||
if( FClassnameIs( pItem, "item_healthkit" ) )
|
if( FClassnameIs( pItem, "item_health*" ) ) // item_healthkit, item_healthvial, item_healthkit_custom, etc.
|
||||||
{
|
{
|
||||||
if ( TakeHealth( sk_healthkit.GetFloat(), DMG_GENERIC ) )
|
if ( TakeHealth( static_cast<CItem*>(pItem)->GetItemAmount(), DMG_GENERIC ) )
|
||||||
{
|
|
||||||
RemoveAllDecals();
|
|
||||||
UTIL_Remove( pItem );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( FClassnameIs( pItem, "item_healthvial" ) )
|
|
||||||
{
|
|
||||||
if ( TakeHealth( sk_healthvial.GetFloat(), DMG_GENERIC ) )
|
|
||||||
{
|
{
|
||||||
RemoveAllDecals();
|
RemoveAllDecals();
|
||||||
UTIL_Remove( pItem );
|
UTIL_Remove( pItem );
|
||||||
|
@ -98,11 +98,6 @@ extern bool AIStrongOpt( void );
|
|||||||
#ifdef MAPBASE
|
#ifdef MAPBASE
|
||||||
// Defines Mapbase's extended NPC response system usage.
|
// Defines Mapbase's extended NPC response system usage.
|
||||||
#define EXPANDED_RESPONSE_SYSTEM_USAGE
|
#define EXPANDED_RESPONSE_SYSTEM_USAGE
|
||||||
|
|
||||||
// Use the model keyvalue if it is defined
|
|
||||||
#define DefaultOrCustomModel(defaultModel) GetModelName() != NULL_STRING ? STRING(GetModelName()) : defaultModel
|
|
||||||
#else
|
|
||||||
#define DefaultOrCustomModel() defaultModel
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EXPANDED_RESPONSE_SYSTEM_USAGE
|
#ifdef EXPANDED_RESPONSE_SYSTEM_USAGE
|
||||||
|
@ -104,6 +104,13 @@ extern void FireTargets( const char *targetName, CBaseEntity *pActivator, CBaseE
|
|||||||
|
|
||||||
#define MAX_OLD_ENEMIES 4 // how many old enemies to remember
|
#define MAX_OLD_ENEMIES 4 // how many old enemies to remember
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
// Use the model keyvalue if it is defined
|
||||||
|
#define DefaultOrCustomModel(defaultModel) GetModelName() != NULL_STRING ? STRING(GetModelName()) : defaultModel
|
||||||
|
#else
|
||||||
|
#define DefaultOrCustomModel() defaultModel
|
||||||
|
#endif
|
||||||
|
|
||||||
// used by suit voice to indicate damage sustained and repaired type to player
|
// used by suit voice to indicate damage sustained and repaired type to player
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -23,12 +23,12 @@ public:
|
|||||||
void Spawn( void )
|
void Spawn( void )
|
||||||
{
|
{
|
||||||
Precache( );
|
Precache( );
|
||||||
SetModel( "models/items/battery.mdl" );
|
SetModel( DefaultOrCustomModel( "models/items/battery.mdl" ) );
|
||||||
BaseClass::Spawn( );
|
BaseClass::Spawn( );
|
||||||
}
|
}
|
||||||
void Precache( void )
|
void Precache( void )
|
||||||
{
|
{
|
||||||
PrecacheModel ("models/items/battery.mdl");
|
PrecacheModel( DefaultOrCustomModel( "models/items/battery.mdl" ) );
|
||||||
|
|
||||||
PrecacheScriptSound( "ItemBattery.Touch" );
|
PrecacheScriptSound( "ItemBattery.Touch" );
|
||||||
|
|
||||||
@ -36,10 +36,30 @@ public:
|
|||||||
bool MyTouch( CBasePlayer *pPlayer )
|
bool MyTouch( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
CHL2_Player *pHL2Player = dynamic_cast<CHL2_Player *>( pPlayer );
|
CHL2_Player *pHL2Player = dynamic_cast<CHL2_Player *>( pPlayer );
|
||||||
|
#ifdef MAPBASE
|
||||||
|
return ( pHL2Player && pHL2Player->ApplyBattery( m_flPowerMultiplier ) );
|
||||||
|
#else
|
||||||
return ( pHL2Player && pHL2Player->ApplyBattery() );
|
return ( pHL2Player && pHL2Player->ApplyBattery() );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
void InputSetPowerMultiplier( inputdata_t &inputdata ) { m_flPowerMultiplier = inputdata.value.Float(); }
|
||||||
|
float m_flPowerMultiplier = 1.0f;
|
||||||
|
|
||||||
|
DECLARE_DATADESC();
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
LINK_ENTITY_TO_CLASS(item_battery, CItemBattery);
|
LINK_ENTITY_TO_CLASS(item_battery, CItemBattery);
|
||||||
PRECACHE_REGISTER(item_battery);
|
PRECACHE_REGISTER(item_battery);
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
BEGIN_DATADESC( CItemBattery )
|
||||||
|
|
||||||
|
DEFINE_KEYFIELD( m_flPowerMultiplier, FIELD_FLOAT, "PowerMultiplier" ),
|
||||||
|
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetPowerMultiplier", InputSetPowerMultiplier ),
|
||||||
|
|
||||||
|
END_DATADESC()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@ -30,11 +30,29 @@ public:
|
|||||||
void Spawn( void );
|
void Spawn( void );
|
||||||
void Precache( void );
|
void Precache( void );
|
||||||
bool MyTouch( CBasePlayer *pPlayer );
|
bool MyTouch( CBasePlayer *pPlayer );
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
float GetItemAmount() { return sk_healthkit.GetFloat() * m_flHealthMultiplier; }
|
||||||
|
|
||||||
|
void InputSetHealthMultiplier( inputdata_t &inputdata ) { m_flHealthMultiplier = inputdata.value.Float(); }
|
||||||
|
float m_flHealthMultiplier = 1.0f;
|
||||||
|
|
||||||
|
DECLARE_DATADESC();
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
LINK_ENTITY_TO_CLASS( item_healthkit, CHealthKit );
|
LINK_ENTITY_TO_CLASS( item_healthkit, CHealthKit );
|
||||||
PRECACHE_REGISTER(item_healthkit);
|
PRECACHE_REGISTER(item_healthkit);
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
BEGIN_DATADESC( CHealthKit )
|
||||||
|
|
||||||
|
DEFINE_KEYFIELD( m_flHealthMultiplier, FIELD_FLOAT, "HealthMultiplier" ),
|
||||||
|
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetHealthMultiplier", InputSetHealthMultiplier ),
|
||||||
|
|
||||||
|
END_DATADESC()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
@ -66,7 +84,11 @@ void CHealthKit::Precache( void )
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool CHealthKit::MyTouch( CBasePlayer *pPlayer )
|
bool CHealthKit::MyTouch( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
|
#ifdef MAPBASE
|
||||||
|
if ( pPlayer->TakeHealth( GetItemAmount(), DMG_GENERIC ) )
|
||||||
|
#else
|
||||||
if ( pPlayer->TakeHealth( sk_healthkit.GetFloat(), DMG_GENERIC ) )
|
if ( pPlayer->TakeHealth( sk_healthkit.GetFloat(), DMG_GENERIC ) )
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
CSingleUserRecipientFilter user( pPlayer );
|
CSingleUserRecipientFilter user( pPlayer );
|
||||||
user.MakeReliable();
|
user.MakeReliable();
|
||||||
@ -119,7 +141,11 @@ public:
|
|||||||
|
|
||||||
bool MyTouch( CBasePlayer *pPlayer )
|
bool MyTouch( CBasePlayer *pPlayer )
|
||||||
{
|
{
|
||||||
|
#ifdef MAPBASE
|
||||||
|
if ( pPlayer->TakeHealth( GetItemAmount(), DMG_GENERIC ) )
|
||||||
|
#else
|
||||||
if ( pPlayer->TakeHealth( sk_healthvial.GetFloat(), DMG_GENERIC ) )
|
if ( pPlayer->TakeHealth( sk_healthvial.GetFloat(), DMG_GENERIC ) )
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
CSingleUserRecipientFilter user( pPlayer );
|
CSingleUserRecipientFilter user( pPlayer );
|
||||||
user.MakeReliable();
|
user.MakeReliable();
|
||||||
@ -145,11 +171,132 @@ public:
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
float GetItemAmount() { return sk_healthvial.GetFloat() * m_flHealthMultiplier; }
|
||||||
|
|
||||||
|
void InputSetHealthMultiplier( inputdata_t &inputdata ) { m_flHealthMultiplier = inputdata.value.Float(); }
|
||||||
|
float m_flHealthMultiplier = 1.0f;
|
||||||
|
|
||||||
|
DECLARE_DATADESC();
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
LINK_ENTITY_TO_CLASS( item_healthvial, CHealthVial );
|
LINK_ENTITY_TO_CLASS( item_healthvial, CHealthVial );
|
||||||
PRECACHE_REGISTER( item_healthvial );
|
PRECACHE_REGISTER( item_healthvial );
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
BEGIN_DATADESC( CHealthVial )
|
||||||
|
|
||||||
|
DEFINE_KEYFIELD( m_flHealthMultiplier, FIELD_FLOAT, "HealthMultiplier" ),
|
||||||
|
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetHealthMultiplier", InputSetHealthMultiplier ),
|
||||||
|
|
||||||
|
END_DATADESC()
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Small health kit. Heals the player when picked up.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
class CHealthKitCustom : public CItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_CLASS( CHealthKitCustom, CItem );
|
||||||
|
CHealthKitCustom();
|
||||||
|
|
||||||
|
void Spawn( void );
|
||||||
|
void Precache( void );
|
||||||
|
bool MyTouch( CBasePlayer *pPlayer );
|
||||||
|
|
||||||
|
float GetItemAmount() { return m_flHealthAmount; }
|
||||||
|
|
||||||
|
void InputSetHealthAmount( inputdata_t &inputdata ) { m_flHealthAmount = inputdata.value.Float(); }
|
||||||
|
|
||||||
|
float m_flHealthAmount;
|
||||||
|
string_t m_iszTouchSound;
|
||||||
|
|
||||||
|
DECLARE_DATADESC();
|
||||||
|
};
|
||||||
|
|
||||||
|
LINK_ENTITY_TO_CLASS( item_healthkit_custom, CHealthKitCustom );
|
||||||
|
//PRECACHE_REGISTER(item_healthkit_custom);
|
||||||
|
|
||||||
|
#ifdef MAPBASE
|
||||||
|
BEGIN_DATADESC( CHealthKitCustom )
|
||||||
|
|
||||||
|
DEFINE_KEYFIELD( m_flHealthAmount, FIELD_FLOAT, "HealthAmount" ),
|
||||||
|
DEFINE_KEYFIELD( m_iszTouchSound, FIELD_STRING, "TouchSound" ),
|
||||||
|
|
||||||
|
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetHealthAmount", InputSetHealthAmount ),
|
||||||
|
|
||||||
|
END_DATADESC()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
CHealthKitCustom::CHealthKitCustom()
|
||||||
|
{
|
||||||
|
SetModelName( AllocPooledString( "models/items/healthkit.mdl" ) );
|
||||||
|
m_flHealthAmount = sk_healthkit.GetFloat();
|
||||||
|
m_iszTouchSound = AllocPooledString( "HealthKit.Touch" );
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Purpose:
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void CHealthKitCustom::Spawn( void )
|
||||||
|
{
|
||||||
|
Precache();
|
||||||
|
SetModel( STRING( GetModelName() ) );
|
||||||
|
|
||||||
|
BaseClass::Spawn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Purpose:
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void CHealthKitCustom::Precache( void )
|
||||||
|
{
|
||||||
|
PrecacheModel( STRING( GetModelName() ) );
|
||||||
|
|
||||||
|
PrecacheScriptSound( STRING( m_iszTouchSound ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Purpose:
|
||||||
|
// Input : *pPlayer -
|
||||||
|
// Output :
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
bool CHealthKitCustom::MyTouch( CBasePlayer *pPlayer )
|
||||||
|
{
|
||||||
|
if ( pPlayer->TakeHealth( GetItemAmount(), DMG_GENERIC ) )
|
||||||
|
{
|
||||||
|
CSingleUserRecipientFilter user( pPlayer );
|
||||||
|
user.MakeReliable();
|
||||||
|
|
||||||
|
UserMessageBegin( user, "ItemPickup" );
|
||||||
|
WRITE_STRING( GetClassname() );
|
||||||
|
MessageEnd();
|
||||||
|
|
||||||
|
CPASAttenuationFilter filter( pPlayer, STRING( m_iszTouchSound ) );
|
||||||
|
EmitSound( filter, pPlayer->entindex(), STRING( m_iszTouchSound ) );
|
||||||
|
|
||||||
|
if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_YES )
|
||||||
|
{
|
||||||
|
Respawn();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UTIL_Remove(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Wall mounted health kit. Heals the player when used.
|
// Wall mounted health kit. Heals the player when used.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -90,9 +90,12 @@ public:
|
|||||||
|
|
||||||
#ifdef MAPBASE
|
#ifdef MAPBASE
|
||||||
// This is in CBaseEntity, but I can't find a use for it anywhere.
|
// This is in CBaseEntity, but I can't find a use for it anywhere.
|
||||||
// Must not have been fully implemented. Please remove this if it turns out to be something important.
|
// It may have been originally intended for TF2 or some other game-specific item class. Please remove this if it turns out to be something important.
|
||||||
virtual bool IsCombatItem() { return true; }
|
virtual bool IsCombatItem() { return true; }
|
||||||
|
|
||||||
|
// Used to access item_healthkit values, etc. from outside of the class
|
||||||
|
virtual float GetItemAmount() { return 1.0f; }
|
||||||
|
|
||||||
void InputEnablePlayerPickup( inputdata_t &inputdata );
|
void InputEnablePlayerPickup( inputdata_t &inputdata );
|
||||||
void InputDisablePlayerPickup( inputdata_t &inputdata );
|
void InputDisablePlayerPickup( inputdata_t &inputdata );
|
||||||
void InputEnableNPCPickup( inputdata_t &inputdata );
|
void InputEnableNPCPickup( inputdata_t &inputdata );
|
||||||
|
Loading…
Reference in New Issue
Block a user