refactored CFlag

This commit is contained in:
Choupom 2015-01-02 18:26:11 +01:00 committed by oy
parent e86a486688
commit b18d218c98
3 changed files with 73 additions and 46 deletions

View file

@ -10,28 +10,43 @@ CFlag::CFlag(CGameWorld *pGameWorld, int Team, vec2 StandPos)
: CEntity(pGameWorld, CGameWorld::ENTTYPE_FLAG, StandPos, ms_PhysSize)
{
m_Team = Team;
m_pCarryingCharacter = NULL;
m_StandPos = StandPos;
m_GrabTick = 0;
GameServer()->m_World.InsertEntity(this);
Reset();
}
void CFlag::Reset()
{
m_pCarryingCharacter = NULL;
m_AtStand = 1;
m_pCarrier = 0;
m_AtStand = true;
m_Pos = m_StandPos;
m_Vel = vec2(0, 0);
m_GrabTick = 0;
}
void CFlag::Grab(CCharacter *pChar)
{
m_AtStand = false;
m_pCarrier = pChar;
if(m_AtStand)
m_GrabTick = Server()->Tick();
}
void CFlag::Drop()
{
m_pCarrier = 0;
m_Vel = vec2(0, 0);
m_DropTick = Server()->Tick();
}
void CFlag::Tick()
{
if(m_pCarryingCharacter)
if(m_pCarrier)
{
// update flag position
m_Pos = m_pCarryingCharacter->GetPos();
m_Pos = m_pCarrier->GetPos();
}
else
{

View file

@ -7,23 +7,41 @@
class CFlag : public CEntity
{
public:
static const int ms_PhysSize = 14;
CCharacter *m_pCarryingCharacter;
vec2 m_Vel;
private:
/* Identity */
int m_Team;
vec2 m_StandPos;
int m_Team;
int m_AtStand;
int m_DropTick;
/* State */
bool m_AtStand;
CCharacter *m_pCarrier;
vec2 m_Vel;
int m_GrabTick;
int m_DropTick;
public:
/* Constants */
static int const ms_PhysSize = 14;
/* Constructor */
CFlag(CGameWorld *pGameWorld, int Team, vec2 StandPos);
/* Getters */
int GetTeam() const { return m_Team; }
bool IsAtStand() const { return m_AtStand; }
CCharacter *GetCarrier() const { return m_pCarrier; }
int GetGrabTick() const { return m_GrabTick; }
int GetDropTick() const { return m_DropTick; }
/* CEntity functions */
virtual void Reset();
virtual void TickPaused();
virtual void Snap(int SnappingClient);
virtual void Tick();
/* Functions */
void Grab(class CCharacter *pChar);
void Drop();
};
#endif

View file

@ -29,7 +29,7 @@ bool CGameControllerCTF::CanBeMovedOnBalance(int ClientID) const
for(int fi = 0; fi < 2; fi++)
{
CFlag *F = m_apFlags[fi];
if(F && F->m_pCarryingCharacter == Character)
if(F && F->GetCarrier() == Character)
return false;
}
}
@ -46,14 +46,12 @@ int CGameControllerCTF::OnCharacterDeath(CCharacter *pVictim, CPlayer *pKiller,
for(int i = 0; i < 2; i++)
{
CFlag *F = m_apFlags[i];
if(F && pKiller && pKiller->GetCharacter() && F->m_pCarryingCharacter == pKiller->GetCharacter())
if(F && pKiller && pKiller->GetCharacter() && F->GetCarrier() == pKiller->GetCharacter())
HadFlag |= 2;
if(F && F->m_pCarryingCharacter == pVictim)
if(F && F->GetCarrier() == pVictim)
{
GameServer()->SendGameMsg(GAMEMSG_CTF_DROP, -1);
F->m_DropTick = Server()->Tick();
F->m_pCarryingCharacter = 0;
F->m_Vel = vec2(0,0);
F->Drop();
if(pKiller && pKiller->GetTeam() != pVictim->GetPlayer()->GetTeam())
pKiller->m_Score++;
@ -84,7 +82,6 @@ bool CGameControllerCTF::OnEntity(int Index, vec2 Pos)
CFlag *F = new CFlag(&GameServer()->m_World, Team, Pos);
m_apFlags[Team] = F;
GameServer()->m_World.InsertEntity(F);
return true;
}
@ -122,14 +119,14 @@ void CGameControllerCTF::Snap(int SnappingClient)
pGameDataFlag->m_FlagDropTickRed = 0;
if(m_apFlags[TEAM_RED])
{
if(m_apFlags[TEAM_RED]->m_AtStand)
if(m_apFlags[TEAM_RED]->IsAtStand())
pGameDataFlag->m_FlagCarrierRed = FLAG_ATSTAND;
else if(m_apFlags[TEAM_RED]->m_pCarryingCharacter && m_apFlags[TEAM_RED]->m_pCarryingCharacter->GetPlayer())
pGameDataFlag->m_FlagCarrierRed = m_apFlags[TEAM_RED]->m_pCarryingCharacter->GetPlayer()->GetCID();
else if(m_apFlags[TEAM_RED]->GetCarrier() && m_apFlags[TEAM_RED]->GetCarrier()->GetPlayer())
pGameDataFlag->m_FlagCarrierRed = m_apFlags[TEAM_RED]->GetCarrier()->GetPlayer()->GetCID();
else
{
pGameDataFlag->m_FlagCarrierRed = FLAG_TAKEN;
pGameDataFlag->m_FlagDropTickRed = m_apFlags[TEAM_RED]->m_DropTick;
pGameDataFlag->m_FlagDropTickRed = m_apFlags[TEAM_RED]->GetDropTick();
}
}
else
@ -137,14 +134,14 @@ void CGameControllerCTF::Snap(int SnappingClient)
pGameDataFlag->m_FlagDropTickBlue = 0;
if(m_apFlags[TEAM_BLUE])
{
if(m_apFlags[TEAM_BLUE]->m_AtStand)
if(m_apFlags[TEAM_BLUE]->IsAtStand())
pGameDataFlag->m_FlagCarrierBlue = FLAG_ATSTAND;
else if(m_apFlags[TEAM_BLUE]->m_pCarryingCharacter && m_apFlags[TEAM_BLUE]->m_pCarryingCharacter->GetPlayer())
pGameDataFlag->m_FlagCarrierBlue = m_apFlags[TEAM_BLUE]->m_pCarryingCharacter->GetPlayer()->GetCID();
else if(m_apFlags[TEAM_BLUE]->GetCarrier() && m_apFlags[TEAM_BLUE]->GetCarrier()->GetPlayer())
pGameDataFlag->m_FlagCarrierBlue = m_apFlags[TEAM_BLUE]->GetCarrier()->GetPlayer()->GetCID();
else
{
pGameDataFlag->m_FlagCarrierBlue = FLAG_TAKEN;
pGameDataFlag->m_FlagDropTickBlue = m_apFlags[TEAM_BLUE]->m_DropTick;
pGameDataFlag->m_FlagDropTickBlue = m_apFlags[TEAM_BLUE]->GetDropTick();
}
}
else
@ -166,23 +163,23 @@ void CGameControllerCTF::Tick()
continue;
//
if(F->m_pCarryingCharacter)
if(F->GetCarrier())
{
if(m_apFlags[fi^1] && m_apFlags[fi^1]->m_AtStand)
if(m_apFlags[fi^1] && m_apFlags[fi^1]->IsAtStand())
{
if(distance(F->GetPos(), m_apFlags[fi^1]->GetPos()) < CFlag::ms_PhysSize + CCharacter::ms_PhysSize)
{
// CAPTURE! \o/
m_aTeamscore[fi^1] += 100;
F->m_pCarryingCharacter->GetPlayer()->m_Score += 5;
F->GetCarrier()->GetPlayer()->m_Score += 5;
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "flag_capture player='%d:%s'",
F->m_pCarryingCharacter->GetPlayer()->GetCID(),
Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
F->GetCarrier()->GetPlayer()->GetCID(),
Server()->ClientName(F->GetCarrier()->GetPlayer()->GetCID()));
GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
GameServer()->SendGameMsg(GAMEMSG_CTF_CAPTURE, fi, F->m_pCarryingCharacter->GetPlayer()->GetCID(), Server()->Tick()-F->m_GrabTick, -1);
GameServer()->SendGameMsg(GAMEMSG_CTF_CAPTURE, fi, F->GetCarrier()->GetPlayer()->GetCID(), Server()->Tick()-F->GetGrabTick(), -1);
for(int i = 0; i < 2; i++)
m_apFlags[i]->Reset();
}
@ -197,10 +194,10 @@ void CGameControllerCTF::Tick()
if(!apCloseCCharacters[i]->IsAlive() || apCloseCCharacters[i]->GetPlayer()->GetTeam() == TEAM_SPECTATORS || GameServer()->Collision()->IntersectLine(F->GetPos(), apCloseCCharacters[i]->GetPos(), NULL, NULL))
continue;
if(apCloseCCharacters[i]->GetPlayer()->GetTeam() == F->m_Team)
if(apCloseCCharacters[i]->GetPlayer()->GetTeam() == F->GetTeam())
{
// return the flag
if(!F->m_AtStand)
if(!F->IsAtStand())
{
CCharacter *pChr = apCloseCCharacters[i];
pChr->GetPlayer()->m_Score += 1;
@ -217,20 +214,17 @@ void CGameControllerCTF::Tick()
else
{
// take the flag
if(F->m_AtStand)
{
m_aTeamscore[fi^1]++;
F->m_GrabTick = Server()->Tick();
}
F->Grab(apCloseCCharacters[i]);
F->m_AtStand = 0;
F->m_pCarryingCharacter = apCloseCCharacters[i];
F->m_pCarryingCharacter->GetPlayer()->m_Score += 1;
if(F->IsAtStand())
m_aTeamscore[fi^1]++;
F->GetCarrier()->GetPlayer()->m_Score += 1;
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "flag_grab player='%d:%s'",
F->m_pCarryingCharacter->GetPlayer()->GetCID(),
Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
F->GetCarrier()->GetPlayer()->GetCID(),
Server()->ClientName(F->GetCarrier()->GetPlayer()->GetCID()));
GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
GameServer()->SendGameMsg(GAMEMSG_CTF_GRAB, fi, -1);
break;