Ok, first of all, this tutorial is 90%
Gooseman and 10% me (Pink), he just sent me the bit of code that reset
the rounds, I'm gonna comment his code, and explain what each part does.
So.. Here we go!.
First of all, Open multiplay_gamerules.cpp,
and go to the CHalfLifeMultiplay :: Think()
function, just click on Think on the wizard.
Lets see what he did...
void
CHalfLifeMultiplay :: Think ( void )
{
/////
Check game rules /////
if
( g_fGameOver ) // someone else quit the game already
{
if ( m_flIntermissionEndTime < gpGlobals->time )
{
if ( m_iEndIntermissionButtonHit // check that someone has pressed
a key, or the max intermission time is over
|| ((m_flIntermissionEndTime + MAX_INTERMISSION_TIME) < gpGlobals->time)
)
ChangeLevel(); // intermission is over
}
return;
}
float
flTimeLimit = timelimit.value * 60;
float
flFragLimit = fraglimit.value;
if
( flTimeLimit != 0 && gpGlobals->time >= flTimeLimit )
{
GoToIntermission();
return;
}
/*Gooseman's
Stuff*/
/*
I
belive this bit is when the time is over, and the teams are tied
thats
why he sets m_iCTWin = 3, m_iCTWin is the variable that handles wich team
won
the round, it goes like this:
m_iCTWin
= 1; // The Counter-Terrorists Won
m_iCTWin
= 2; // The Terrorist Won
m_iCTWin
= 3; // The teams tied.
*/
if
(gpGlobals->time > m_flRoundTime + 385.0 ) // here he checks if the 6 minutes
limit for the round are over.
{
m_iCTWin = 3; // Teams are Tied
m_flRestartRoundTime = gpGlobals->time + 5.0; // Next round starts in 5
seconds
m_flRoundTime = gpGlobals->time + 60; // 1 more minute (Suddent Dead?)
}
if
( (m_flRestartRoundTime != 0.0) && (m_flRestartRoundTime <=
gpGlobals->time) ) // Time is Up!
RestartRound(); // Restart Round!
/*End
of Gooseman's Stuff*/
}
Ok, that was easy, now lets go to the RestartRound
function, where all the exciting stuff happens.
First off all, you got to add the RestartRound
function to the CHalfLifeMultiplay class definition,
so, open up teamplay_gamerules.h, and add
it to the Class definition around line 60. also you got to add all the
new variables, so lets take a look:
Right now to get a Time Based round system
we need:
float
m_flRestartRoundTime; // Variable to store the time when the next round
is going to start
virtual
void RestartRound ( void ); // Function for restarting the round
float
m_flRoundTime; // Variable to store how long the round is going to last
void
CHalfLifeMultiplay :: RestartRound( void )
{
//
Clear the kicktable
for
(int i = 0; i <= 19; i++)
m_iKickTable
[i] = 0;
/*
Ok,
I'm going to comment out this part, this is all the hostage checking, respawning
and money award
code,
I'm still going to explain what it does, but right now we just want to
restart the round
when
the time is over
//
Update accounts based on number of hostages remaining.. SUB_Remove these
hostage entities.
CBaseEntity*
hostage = NULL;
CHostage*
temp;
hostage
= (CBaseMonster*) UTIL_FindEntityByClassname(NULL, "hostage_entity"); //
Here we search for the "hostage_entity" entity, that would be the hostage
dudes.
while
(hostage != NULL)
{
if (hostage->pev->solid != SOLID_NOT) // If they're alive (?), we check
what team won, so we can
// reward them.
{
if (m_iCTWin == 2) // terrorists won // Terrorist won
m_iAccountTerrorist += 400; // give 400$ for each hostage alive
else if (m_iCTWin == 1) // CT Won
m_iAccountCT += 400; // It is Pay Day (sorry, playing too much Dungeon
Keeper 2 =)
if (hostage->pev->deadflag == DEAD_DEAD) // If the hostage is dead
hostage->pev->deadflag = DEAD_RESPAWNABLE; // Make it respawnable
}
temp = (CHostage*) hostage;
temp->RePosition(); // Respawn the Hostage
hostage = (CBaseMonster*) UTIL_FindEntityByClassname(hostage, "hostage_entity");
}
//
Give the losing team a charity bonus.. that way, they can get back in the
game..
if
(m_iCTWin == 2) // Terrorist Won
m_iAccountCT += 800; // Give the CT some money
else
if (m_iCTWin == 1) // CT Won
m_iAccountTerrorist += 800; // Give the bad guys some money.
//Update
CT account based on number of hostages rescued
m_iAccountCT
+= m_iHostagesRescued * 350; // m_iHostageRescued, is a variable that updates
each time a hostage
// is rescued, so we know how many we saved.
*/
//
Update individual players accounts and respawn players
CBaseEntity*
pPlayer = NULL;
CBasePlayer*
player;
pPlayer
= UTIL_FindEntityByClassname ( pPlayer, "player" ); // We find the player
while
( (pPlayer != NULL) && (!FNullEnt(pPlayer->edict())) )
{
if ( pPlayer->IsPlayer() && pPlayer->pev->flags != FL_DORMANT )
{
player = GetClassPtr((CBasePlayer *)pPlayer->pev);
if ( (m_iNumCT != 0) && (m_iNumTerrorist != 0) ) // m_iNumCT and
m_iNumTerrorist are the variables
// were he stores the number of players on each team
{
if ( player->m_iTeam == CT ) // m_iTeam is the name of the team
player->AddAccount( m_iAccountCT ); // We update his checkbook
else if ( player->m_iTeam == TERRORIST )
player->AddAccount( m_iAccountTerrorist );
}
// Respawn players
if ( player->pev->deadflag == ( (DEAD_DYING) || (DEAD_DEAD) || (DEAD_RESPAWNABLE)
) ) // here he checks
every possible dead flag
{
respawn ( pPlayer->pev, FALSE ); // Respawn!, FALSE means that we're not
leaving a corpse behind
pPlayer->pev->button = 0;
player->m_iRespawnFrames = 0;
pPlayer->pev->nextthink = -1;
}
else
{
player->m_iRespawnFrames = 0;
respawn ( pPlayer->pev, FALSE ); // Respawn!, FALSE means that we're not
leaving a corpse behind
}
EMIT_SOUND(ENT(player->pev), CHAN_VOICE, "radio/go.wav", 1, ATTN_NORM);
// Ok lets go...
}
pPlayer = UTIL_FindEntityByClassname ( pPlayer, "player" ); // and we find
the player
}
//
Reset game variables
m_flIntermissionEndTime
= 0;
m_flRestartRoundTime
= 0.0; // the round is not going to restart anytime soon
m_iAccountTerrorist
= m_iAccountCT = 0; // No money on the floor to pick up until the end of
the round
m_iHostagesRescued
= 0; // They're all at the Terrorist's base
m_iHostagesTouched
= 0; // Hmm.. now this is just sick =P.
m_iCTWin
= 0; // Nobody has won the round yet.
m_flRoundTime
= gpGlobals->time; // Timer starts!
}
Now, for the next tutorial we are going
to make the rounds end when all the players on 1 team are dead. Right now
you'll probably, don't want players respawing as soon as they're dead,
so open player.cpp and go to the StartDeadCam function and comment out
the respawn call. Thats it!. Any comment you got about this tutorial, mail
me!, don't mail Gooseman, hes working hard on Counter-Strike, so any problem
you have, mail me. |