New Gamerules: Difference between revisions
Jump to navigation
Jump to search
Lazypenguin (talk | contribs) (Added missing function that allows for networked gamerules) |
Lazypenguin (talk | contribs) No edit summary |
||
Line 154: | Line 154: | ||
#endif | #endif | ||
// Note: It is important for you to add the gamerules entity to the | |||
// preserved entity list or networked variables will not work. | |||
static const char *s_PreserveEnts[] = | |||
{ | |||
"ai_network", | |||
"ai_hint", | |||
"hl2mp_gamerules", | |||
"team_manager", | |||
"player_manager", | |||
"env_soundscape", | |||
"env_soundscape_proxy", | |||
"env_soundscape_triggerable", | |||
"env_sun", | |||
"env_wind", | |||
"env_fog_controller", | |||
"func_brush", | |||
"func_wall", | |||
"func_buyzone", | |||
"func_illusionary", | |||
"infodecal", | |||
"info_projecteddecal", | |||
"info_node", | |||
"info_target", | |||
"info_node_hint", | |||
"info_player_deathmatch", | |||
"info_player_combine", | |||
"info_player_rebel", | |||
"info_map_parameters", | |||
"keyframe_rope", | |||
"move_rope", | |||
"info_ladder", | |||
"player", | |||
"point_viewcontrol", | |||
"scene_manager", | |||
"shadow_control", | |||
"sky_camera", | |||
"soundent", | |||
"trigger_soundscape", | |||
"viewmodel", | |||
"predicted_viewmodel", | |||
"worldspawn", | |||
"point_devshot_camera", | |||
"inherited_gamerules", | |||
"", // END Marker | |||
}; | |||
CInheritedGameRules::CInheritedGameRules() | CInheritedGameRules::CInheritedGameRules() | ||
{ | { |
Revision as of 17:01, 6 October 2014
For all of those who need to implement new gamerules in their mod, or have tried and failed these two snippets will help you along.
You can find/replace
InheritedGameRules
and then replace with your game rules name.
The header file:
#ifndef INHERITED_GAMERULES_H #define INHERITED_GAMERULES_H #pragma once #include "gamerules.h" #include "teamplay_gamerules.h" #include "hl2mp_gamerules.h" #include "gamevars_shared.h" #ifndef CLIENT_DLL #include "hl2mp_player.h" #endif #ifdef CLIENT_DLL #define CInheritedGameRules C_InheritedGameRules #define CInheritedGameRulesProxy C_InheritedGameRulesProxy #endif class CInheritedGameRulesProxy : public CHL2MPGameRulesProxy { public: DECLARE_CLASS( CInheritedGameRulesProxy, CHL2MPGameRulesProxy ); DECLARE_NETWORKCLASS(); }; class CInheritedGameRules : public CHL2MPRules { public: DECLARE_CLASS( CInheritedGameRules, CHL2MPRules ); #ifdef CLIENT_DLL DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars. #else DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars. #endif // Constructor CInheritedGameRules(); // Destructor virtual ~CInheritedGameRules(); virtual void Precache( void ); virtual bool ClientCommand( const char *pcmd, CBaseEntity *pEdict ); virtual void Think( void ); virtual const char *GetGameDescription( void ){ return "Inherited"; } virtual void CreateStandardEntities( void ); #ifndef CLIENT_DLL #endif private: }; inline CInheritedGameRules* InheritedGameRules() { return static_cast<CInheritedGameRules*>(g_pGameRules); } #endif //INHERITED_GAMERULES_H
The main CPP file:
#include "cbase.h" #include "inherited_gamerules.h" #include "viewport_panel_names.h" #include "gameeventdefs.h" #include <KeyValues.h> #include "ammodef.h" #ifdef CLIENT_DLL #include "c_hl2mp_player.h" #else #include "eventqueue.h" #include "player.h" #include "gamerules.h" #include "game.h" #include "items.h" #include "entitylist.h" #include "mapentities.h" #include "in_buttons.h" #include <ctype.h> #include "voice_gamemgr.h" #include "iscorer.h" #include "hl2mp_player.h" #include "weapon_hl2mpbasehlmpcombatweapon.h" #include "team.h" #include "voice_gamemgr.h" #include "hl2mp_gameinterface.h" #include "hl2mp_cvars.h" #ifdef DEBUG #include "hl2mp_bot_temp.h" #endif #endif REGISTER_GAMERULES_CLASS( CInheritedGameRules ); BEGIN_NETWORK_TABLE_NOBASE( CInheritedGameRules, DT_InheritedGameRules ) #ifdef CLIENT_DLL #else #endif END_NETWORK_TABLE() LINK_ENTITY_TO_CLASS( inherited_gamerules, CInheritedGameRulesProxy ); IMPLEMENT_NETWORKCLASS_ALIASED( InheritedGameRulesProxy, DT_InheritedGameRulesProxy ) #ifdef CLIENT_DLL void RecvProxy_InheritedGameRules( const RecvProp *pProp, void **pOut, void *pData, int objectID ) { CInheritedGameRules *pRules = InheritedGameRules(); Assert( pRules ); *pOut = pRules; } BEGIN_RECV_TABLE( CInheritedGameRulesProxy, DT_InheritedGameRulesProxy ) RecvPropDataTable( "inherited_gamerules_data", 0, 0, &REFERENCE_RECV_TABLE( DT_InheritedGameRules ), RecvProxy_InheritedGameRules ) END_RECV_TABLE() #else void* SendProxy_InheritedGameRules( const SendProp *pProp, const void *pStructBase, const void *pData, CSendProxyRecipients *pRecipients, int objectID ) { CInheritedGameRules *pRules = InheritedGameRules(); Assert( pRules ); return pRules; } BEGIN_SEND_TABLE( CInheritedGameRulesProxy, DT_InheritedGameRulesProxy ) SendPropDataTable( "inherited_gamerules_data", 0, &REFERENCE_SEND_TABLE( DT_InheritedGameRules ), SendProxy_InheritedGameRules ) END_SEND_TABLE() #endif // Note: It is important for you to add the gamerules entity to the // preserved entity list or networked variables will not work. static const char *s_PreserveEnts[] = { "ai_network", "ai_hint", "hl2mp_gamerules", "team_manager", "player_manager", "env_soundscape", "env_soundscape_proxy", "env_soundscape_triggerable", "env_sun", "env_wind", "env_fog_controller", "func_brush", "func_wall", "func_buyzone", "func_illusionary", "infodecal", "info_projecteddecal", "info_node", "info_target", "info_node_hint", "info_player_deathmatch", "info_player_combine", "info_player_rebel", "info_map_parameters", "keyframe_rope", "move_rope", "info_ladder", "player", "point_viewcontrol", "scene_manager", "shadow_control", "sky_camera", "soundent", "trigger_soundscape", "viewmodel", "predicted_viewmodel", "worldspawn", "point_devshot_camera", "inherited_gamerules", "", // END Marker }; CInheritedGameRules::CInheritedGameRules() { #ifndef CLIENT_DLL #endif } CInheritedGameRules::~CInheritedGameRules( void ) { #ifndef CLIENT_DLL // Note, don't delete each team since they are in the gEntList and will // automatically be deleted from there, instead. g_Teams.Purge(); #endif } void CInheritedGameRules::Think( void ) { #ifndef CLIENT_DLL BaseClass::Think(); #endif } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CInheritedGameRules::Precache( void ) { BaseClass::Precache(); } bool CInheritedGameRules::ClientCommand(const char *pcmd, CBaseEntity *pEdict ) { return BaseClass::ClientCommand( pcmd, pEdict ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CInheritedGameRules::CreateStandardEntities( void ) { #ifndef CLIENT_DLL BaseClass::CreateStandardEntities(); // Create entity that will handle gamrules and networking for our entity CBaseEntity::Create( "inherited_gamerules", vec3_origin, vec3_angle ); #endif }