Browse Source

Update player spawn code. Define new cmds.

decay-pc
Night Owl 7 years ago
parent
commit
981ffd6085
  1. 23
      dlls/bot/bot.cpp
  2. 5
      dlls/cbase.h
  3. 44
      dlls/client.cpp
  4. 19
      dlls/enginecallback.h
  5. 9
      dlls/gamerules.cpp
  6. 13
      dlls/items.cpp
  7. 71
      dlls/player.cpp
  8. 2
      dlls/triggers.cpp
  9. 25
      dlls/world.cpp

23
dlls/bot/bot.cpp

@ -90,29 +90,6 @@ char scientist_sounds[][30] = { SC_SND1, SC_SND2, SC_SND3, SC_SND4, SC_SND5 };
LINK_ENTITY_TO_CLASS( bot, CBot ); LINK_ENTITY_TO_CLASS( bot, CBot );
inline edict_t *CREATE_FAKE_CLIENT( const char *netname )
{
return (*g_engfuncs.pfnCreateFakeClient)( netname );
}
inline char *GET_INFOBUFFER( edict_t *e )
{
return (*g_engfuncs.pfnGetInfoKeyBuffer)( e );
}
inline char *GET_INFO_KEY_VALUE( const char *infobuffer, const char *key )
{
return (g_engfuncs.pfnInfoKeyValue( infobuffer, key ));
}
inline void SET_CLIENT_KEY_VALUE( int clientIndex, const char *infobuffer,
const char *key, const char *value )
{
(*g_engfuncs.pfnSetClientKeyValue)( clientIndex, infobuffer, key, value );
}
void BotDebug( char *buffer ) void BotDebug( char *buffer )
{ {
// print out debug messages to the HUD of all players // print out debug messages to the HUD of all players

5
dlls/cbase.h

@ -350,7 +350,7 @@ public:
enum EGON_FIRESTATE { FIRE_OFF, FIRE_CHARGE }; enum EGON_FIRESTATE { FIRE_OFF, FIRE_CHARGE };
int m_fireState; int m_fireState;
int DecayID; int m_iDecay;
}; };
// Ugly technique to override base member functions // Ugly technique to override base member functions
@ -782,5 +782,8 @@ public:
void Spawn( void ); void Spawn( void );
void Precache( void ); void Precache( void );
void KeyValue( KeyValueData *pkvd ); void KeyValue( KeyValueData *pkvd );
private:
BOOL m_bIsSlaveCoOp;
}; };
#endif #endif

44
dlls/client.cpp

@ -63,6 +63,7 @@ extern void CopyToBodyQue( entvars_t* pev );
extern int giPrecacheGrunt; extern int giPrecacheGrunt;
extern int gmsgSayText; extern int gmsgSayText;
extern int gmsgBhopcap; extern int gmsgBhopcap;
extern BOOL g_bIsSlaveCoOp;
extern cvar_t allow_spectators; extern cvar_t allow_spectators;
@ -532,6 +533,44 @@ void ClientCommand( edict_t *pEntity )
{ {
Host_Say( pEntity, 1 ); Host_Say( pEntity, 1 );
} }
else if( FStrEq( pcmd, "changeplayer" ) )
{
if( g_pGameRules->IsCoOp() )
{
}
}
else if( FStrEq( pcmd, "changeplayer2" ) )
{
if( g_pGameRules->IsCoOp() )
{
CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );
pPlayer->m_iDecay = ( pPlayer->m_iDecay == 1 ) ? 2 : 1;
ALERT( at_console, "Player 1 index changed to %d\n", pPlayer->m_iDecay );
}
}
else if( FStrEq( pcmd, "euukraine" ) )
{
if( g_pGameRules->IsCoOp() )
{
if( FStrEq( CMD_ARGV( 1 ), "visafree" ) )
{
// Unlock alien campaign
}
}
}
else if( FStrEq( pcmd, "test1" ) )
{
MESSAGE_BEGIN( MSG_ALL, SVC_INTERMISSION );
MESSAGE_END();
}
else if( FStrEq( pcmd, "stripall" ) )
{
if( g_pGameRules->IsCoOp() )
{
GetClassPtr( (CBasePlayer *)pev )->PackDeadPlayerItems();
}
}
else if( FStrEq( pcmd, "fullupdate" ) ) else if( FStrEq( pcmd, "fullupdate" ) )
{ {
GetClassPtr( (CBasePlayer *)pev )->ForceClientDllUpdate(); GetClassPtr( (CBasePlayer *)pev )->ForceClientDllUpdate();
@ -654,7 +693,10 @@ void ClientCommand( edict_t *pEntity )
if( !IS_DEDICATED_SERVER() ) if( !IS_DEDICATED_SERVER() )
{ {
// If user types "addbot" in console, add a bot with skin and name // If user types "addbot" in console, add a bot with skin and name
BotCreate( CMD_ARGV( 1 ), CMD_ARGV( 2 ), CMD_ARGV( 3 ) ); if( g_bIsSlaveCoOp )
BotCreate( "player/dm_slave/dm_slave", "R-4913", 0 );
else
BotCreate( "ginacol", "Colette", 0 );// TODO: Give normal bodygroups/skins/names for bots.
} }
else else
CLIENT_PRINTF( pEntity, print_console, "addbot not allowed from client!\n" ); CLIENT_PRINTF( pEntity, print_console, "addbot not allowed from client!\n" );

19
dlls/enginecallback.h

@ -161,4 +161,23 @@ inline void *GET_PRIVATE( edict_t *pent )
#define PLAYER_CNX_STATS ( *g_engfuncs.pfnGetPlayerStats ) #define PLAYER_CNX_STATS ( *g_engfuncs.pfnGetPlayerStats )
inline edict_t *CREATE_FAKE_CLIENT( const char *netname )
{
return (*g_engfuncs.pfnCreateFakeClient)( netname );
}
inline char *GET_INFOBUFFER( edict_t *e )
{
return (*g_engfuncs.pfnGetInfoKeyBuffer)( e );
}
inline char *GET_INFO_KEY_VALUE( const char *infobuffer, const char *key )
{
return (g_engfuncs.pfnInfoKeyValue( infobuffer, key ) );
}
inline void SET_CLIENT_KEY_VALUE( int clientIndex, const char *infobuffer, const char *key, const char *value )
{
(*g_engfuncs.pfnSetClientKeyValue)( clientIndex, infobuffer, key, value );
}
#endif //ENGINECALLBACK_H #endif //ENGINECALLBACK_H

9
dlls/gamerules.cpp

@ -33,6 +33,7 @@ extern DLL_GLOBAL BOOL g_fGameOver;
extern int gmsgDeathMsg; // client dll messages extern int gmsgDeathMsg; // client dll messages
extern int gmsgMOTD; extern int gmsgMOTD;
extern BOOL g_bIsDecayGame;
int g_teamplay = 0; int g_teamplay = 0;
//========================================================= //=========================================================
@ -311,8 +312,14 @@ CGameRules *InstallGameRules( void )
{ {
SERVER_COMMAND( "exec game.cfg\n" ); SERVER_COMMAND( "exec game.cfg\n" );
SERVER_EXECUTE(); SERVER_EXECUTE();
ALERT( at_console, "Installing game rule...\n" );
if( !gpGlobals->deathmatch ) if( g_bIsDecayGame )
{
return new CHalfLifeRules;
//return new CDecayRules;
}
else if( !gpGlobals->deathmatch )
{ {
// generic half-life // generic half-life
g_teamplay = 0; g_teamplay = 0;

13
dlls/items.cpp

@ -170,7 +170,7 @@ void CItem::Materialize( void )
} }
#define SF_SUIT_SHORTLOGON 0x0001 #define SF_SUIT_SHORTLOGON 0x0001
extern int g_iStartSuit;
class CItemSuit : public CItem class CItemSuit : public CItem
{ {
void Spawn( void ) void Spawn( void )
@ -188,10 +188,13 @@ class CItemSuit : public CItem
if( pPlayer->pev->weapons & ( 1<<WEAPON_SUIT ) ) if( pPlayer->pev->weapons & ( 1<<WEAPON_SUIT ) )
return FALSE; return FALSE;
if( pev->spawnflags & SF_SUIT_SHORTLOGON ) if( !g_iStartSuit )
EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_A0" ); // short version of suit logon, {
else if( pev->spawnflags & SF_SUIT_SHORTLOGON )
EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_AAx" ); // long version of suit logon EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_A0" ); // short version of suit logon,
else
EMIT_SOUND_SUIT( pPlayer->edict(), "!HEV_AAx" ); // long version of suit logon
}
pPlayer->pev->weapons |= ( 1 << WEAPON_SUIT ); pPlayer->pev->weapons |= ( 1 << WEAPON_SUIT );
return TRUE; return TRUE;

71
dlls/player.cpp

@ -47,6 +47,10 @@ extern DLL_GLOBAL int g_iSkillLevel, gDisplayTitle;
extern "C" int g_bhopcap; extern "C" int g_bhopcap;
extern BOOL g_bIsSlaveCoOp;
extern BOOL g_bIsDecayGame;
extern int g_iStartSuit;
BOOL gInitHUD = TRUE; BOOL gInitHUD = TRUE;
extern void CopyToBodyQue( entvars_t *pev); extern void CopyToBodyQue( entvars_t *pev);
@ -192,7 +196,7 @@ int gmsgLensFlare = 0;
int gmsgAimFrame = 0; int gmsgAimFrame = 0;
int gmsgNotepad = 0; int gmsgNotepad = 0;
int gmsgChangeMode = 0; int gmsgChangeMode = 0;
int gmsgChangePlr = 0; int gmsgChangePlayer = 0;
int gmsgCamera = 0; int gmsgCamera = 0;
int gmsgSparePlayer = 0; int gmsgSparePlayer = 0;
int gmsgAlienState = 0; int gmsgAlienState = 0;
@ -249,7 +253,7 @@ void LinkUserMessages( void )
gmsgAimFrame = REG_USER_MSG( "AimFrame", 14 ); gmsgAimFrame = REG_USER_MSG( "AimFrame", 14 );
gmsgNotepad = REG_USER_MSG( "Notepad", -1 ); gmsgNotepad = REG_USER_MSG( "Notepad", -1 );
gmsgChangeMode = REG_USER_MSG( "ChangeMode", 1 ); gmsgChangeMode = REG_USER_MSG( "ChangeMode", 1 );
gmsgChangePlr = REG_USER_MSG( "ChangePlr", 1 ); gmsgChangePlayer = REG_USER_MSG( "ChangePlr", 1 );
gmsgCamera = REG_USER_MSG( "Camera", 7 ); gmsgCamera = REG_USER_MSG( "Camera", 7 );
gmsgSparePlayer = REG_USER_MSG( "SparePlayer", 1 ); gmsgSparePlayer = REG_USER_MSG( "SparePlayer", 1 );
gmsgAlienState = REG_USER_MSG( "AlienState", 1 ); gmsgAlienState = REG_USER_MSG( "AlienState", 1 );
@ -2839,7 +2843,11 @@ void CBasePlayer::Spawn( void )
m_iStepLeft = 0; m_iStepLeft = 0;
m_flFieldOfView = 0.5;// some monsters use this to determine whether or not the player is looking at them. m_flFieldOfView = 0.5;// some monsters use this to determine whether or not the player is looking at them.
m_bloodColor = BLOOD_COLOR_RED; if( g_bIsSlaveCoOp )
m_bloodColor = BLOOD_COLOR_GREEN;
else
m_bloodColor = BLOOD_COLOR_RED;
m_flNextAttack = UTIL_WeaponTimeBase(); m_flNextAttack = UTIL_WeaponTimeBase();
StartSneaking(); StartSneaking();
@ -2852,7 +2860,11 @@ void CBasePlayer::Spawn( void )
g_pGameRules->SetDefaultPlayerTeam( this ); g_pGameRules->SetDefaultPlayerTeam( this );
g_pGameRules->GetPlayerSpawnSpot( this ); g_pGameRules->GetPlayerSpawnSpot( this );
SET_MODEL( ENT( pev ), "models/player.mdl" ); if( g_bIsSlaveCoOp )
SET_MODEL( ENT( pev ), "models/player/dm_slave/dm_slave.mdl" );
else
SET_MODEL( ENT( pev ), "models/player.mdl" );
g_ulModelIndexPlayer = pev->modelindex; g_ulModelIndexPlayer = pev->modelindex;
pev->sequence = LookupActivity( ACT_IDLE ); pev->sequence = LookupActivity( ACT_IDLE );
@ -2894,6 +2906,50 @@ void CBasePlayer::Spawn( void )
pBotCam = NULL; pBotCam = NULL;
// END BOT // END BOT
g_pGameRules->PlayerSpawn( this ); g_pGameRules->PlayerSpawn( this );
if( g_bIsSlaveCoOp )
SET_CLIENT_KEY_VALUE( entindex(), GET_INFOBUFFER( edict() ), "model", "player/dm_slave/dm_slave" );
else
SET_CLIENT_KEY_VALUE( entindex(), GET_INFOBUFFER( edict() ), "model", "ginacol" );
if( m_iDecay == 1 )
{
SetBodygroup( 1, 1 );
pev->skin = 1;
}
else if( m_iDecay == 2 )
{
SetBodygroup( 1, 0 );
pev->skin = 0;
}
else
SetBodygroup( 0, 0 );
if( gmsgChangePlayer )
{
MESSAGE_BEGIN( MSG_ONE, gmsgChangePlayer, NULL, pev );
WRITE_BYTE( m_iDecay );
MESSAGE_END();
}
else
{
ALERT( at_console, "Message gmsgChangePlayer not found in client!\n" );
}
ALERT( at_console, "(CBasePlayer::Spawn) m_iDecay = %d\n", m_iDecay );
if( g_iStartSuit )
{
if( !g_bIsSlaveCoOp )
{
CBaseEntity *pWeaponEntity;
GiveNamedItem( "item_suit" );
while( ( pWeaponEntity = UTIL_FindEntityByClassname( pWeaponEntity, "game_player_equip" ) ) != NULL )
{
pWeaponEntity->Touch( this );
}
}
}
} }
void CBasePlayer::Precache( void ) void CBasePlayer::Precache( void )
@ -2981,7 +3037,10 @@ int CBasePlayer::Restore( CRestore &restore )
pev->fixangle = TRUE; // turn this way immediately pev->fixangle = TRUE; // turn this way immediately
// Copied from spawn() for now // Copied from spawn() for now
m_bloodColor = BLOOD_COLOR_RED; if( g_bIsSlaveCoOp )
m_bloodColor = BLOOD_COLOR_GREEN;
else
m_bloodColor = BLOOD_COLOR_RED;
g_ulModelIndexPlayer = pev->modelindex; g_ulModelIndexPlayer = pev->modelindex;
@ -4636,7 +4695,7 @@ void CDeadHEV::Spawn( void )
pev->effects = 0; pev->effects = 0;
pev->yaw_speed = 8; pev->yaw_speed = 8;
pev->sequence = 0; pev->sequence = 0;
pev->body = 1; SetBodygroup( 1, 4 );
m_bloodColor = BLOOD_COLOR_RED; m_bloodColor = BLOOD_COLOR_RED;
pev->sequence = LookupSequence( m_szPoses[m_iPose] ); pev->sequence = LookupSequence( m_szPoses[m_iPose] );

2
dlls/triggers.cpp

@ -2136,7 +2136,7 @@ void CPlayerSpawnTrigger::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, US
|| !pActivator || !pActivator
|| !pActivator->IsPlayer() || !pActivator->IsPlayer()
|| !m_iPlayerIndex || !m_iPlayerIndex
|| pActivator->DecayID == m_iPlayerIndex ) || pActivator->m_iDecay == m_iPlayerIndex )
{ {
SUB_UseTargets( this, triggerType, 0 ); SUB_UseTargets( this, triggerType, 0 );

25
dlls/world.cpp

@ -450,6 +450,9 @@ LINK_ENTITY_TO_CLASS( worldspawn, CWorld )
#define SF_WORLD_FORCETEAM 0x0004 // Force teams #define SF_WORLD_FORCETEAM 0x0004 // Force teams
extern DLL_GLOBAL BOOL g_fGameOver; extern DLL_GLOBAL BOOL g_fGameOver;
int g_iStartSuit = 0;
BOOL g_bIsSlaveCoOp = FALSE;
BOOL g_bIsDecayGame = FALSE;
float g_flWeaponCheat; float g_flWeaponCheat;
void CWorld::Spawn( void ) void CWorld::Spawn( void )
@ -477,6 +480,13 @@ void CWorld::Precache( void )
g_pGameRules = NULL; g_pGameRules = NULL;
} }
if( g_bIsDecayGame )
{
g_bIsSlaveCoOp = m_bIsSlaveCoOp;
if( !CBaseEntity::Create( "trigger_autobot", g_vecZero, g_vecZero, NULL ) );
ALERT( at_aiconsole, "Autobot entity was not created!\n" );
}
g_pGameRules = InstallGameRules(); g_pGameRules = InstallGameRules();
//!!!UNDONE why is there so much Spawn code in the Precache function? I'll just keep it here //!!!UNDONE why is there so much Spawn code in the Precache function? I'll just keep it here
@ -729,6 +739,21 @@ void CWorld::KeyValue( KeyValueData *pkvd )
} }
pkvd->fHandled = TRUE; pkvd->fHandled = TRUE;
} }
else if( FStrEq( pkvd->szKeyName, "startsuit" ) )
{
g_iStartSuit = atoi( pkvd->szValue );
pkvd->fHandled = TRUE;
}
else if( FStrEq( pkvd->szKeyName, "decay" ) )
{
g_bIsDecayGame = ( atoi( pkvd->szValue ) != 0 );
pkvd->fHandled = TRUE;
}
else if( FStrEq( pkvd->szKeyName, "slavecoop" ) )
{
m_bIsSlaveCoOp = ( atoi( pkvd->szValue ) != 0 );
pkvd->fHandled = TRUE;
}
else else
CBaseEntity::KeyValue( pkvd ); CBaseEntity::KeyValue( pkvd );
} }

Loading…
Cancel
Save