From d68e853ca7e8a9cec7f5b03324219c0b8e001f06 Mon Sep 17 00:00:00 2001 From: GreYFoXGTi Date: Mon, 14 Feb 2011 20:36:30 +0200 Subject: [PATCH] StickyTeams, TeamStrict Logic and fixed some team bugs --- src/engine/shared/config_variables.h | 2 + src/game/server/ddracecommands.cpp | 2 +- src/game/server/entities/character.cpp | 6 +-- src/game/server/teams.cpp | 59 ++++++++++++++++++++------ src/game/server/teams.h | 1 + src/game/version.h | 2 +- 6 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index 454d024a7..1074f73d6 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -166,6 +166,7 @@ MACRO_CONFIG_STR(SvRulesLine10, sv_rules_line10, 40, "", CFGFLAG_SERVER, "Rules MACRO_CONFIG_INT(SvTeam, sv_team, 0, -1, 1, CFGFLAG_SERVER, "Teams configuration", 4) MACRO_CONFIG_INT(SvTeamStrict, sv_team_strict, 0, 0, 1, CFGFLAG_SERVER, "Kill or not all team if someone left game in team", 4) +MACRO_CONFIG_INT(SvStickyTeams, sv_sticky_teams, 1, 0, 1, CFGFLAG_SERVER, "Whether players stays in a team after death or not", 4) MACRO_CONFIG_STR(SvAnnouncementFileName, sv_announcement_filename, 24, "announcement.txt", CFGFLAG_SERVER, "file which will have the announcement, each one at a line", 3) MACRO_CONFIG_INT(SvAnnouncementInterval, sv_announcement_interval, 30, 15, 9999, CFGFLAG_SERVER, "time(minutes) in which the announcement will be displayed from the announcement file", 3) @@ -206,4 +207,5 @@ MACRO_CONFIG_INT(SvChatPenalty, sv_chat_penalty, 250, 50, 1000, CFGFLAG_SERVER, MACRO_CONFIG_INT(SvChatThreshold, sv_chat_threshold, 1000, 50, 10000 , CFGFLAG_SERVER, "if chatscore exceeds this, the player will be muted for sv_spam_mute_duration seconds", 3) MACRO_CONFIG_INT(SvSpamMuteDuration, sv_spam_mute_duration, 60, 0, 3600 , CFGFLAG_SERVER, "how many seconds to mute, if player triggers mute on spam. 0 = off", 3) + #endif diff --git a/src/game/server/ddracecommands.cpp b/src/game/server/ddracecommands.cpp index da6bff486..a8660e882 100644 --- a/src/game/server/ddracecommands.cpp +++ b/src/game/server/ddracecommands.cpp @@ -687,7 +687,7 @@ void CGameContext::ConKill(IConsole::IResult *pResult, void *pUserData, int Clie CGameContext *pSelf = (CGameContext *)pUserData; CPlayer *pPlayer = pSelf->m_apPlayers[ClientID]; - if(pPlayer->m_Last_Kill && pPlayer->m_Last_Kill + pSelf->Server()->TickSpeed() * g_Config.m_SvKillDelay > pSelf->Server()->Tick()) + if(!pPlayer || (pPlayer->m_Last_Kill && pPlayer->m_Last_Kill + pSelf->Server()->TickSpeed() * g_Config.m_SvKillDelay > pSelf->Server()->Tick())) return; pPlayer->m_Last_Kill = pSelf->Server()->Tick(); diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index f665410e0..f5eaa8c86 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -756,15 +756,15 @@ void CCharacter::Die(int Killer, int Weapon) m_pPlayer->m_DieTick = Server()->Tick(); m_Alive = false; - MarkDestroy(); //GameServer()->m_World.RemoveEntity(this); + MarkDestroy(); GameServer()->m_World.m_Core.m_apCharacters[m_pPlayer->GetCID()] = 0; GameServer()->CreateDeath(m_Pos, m_pPlayer->GetCID(), Teams()->TeamMask(Team())); // we got to wait 0.5 secs before respawning m_pPlayer->m_RespawnTick = Server()->Tick()+Server()->TickSpeed()/2; - ((CGameControllerDDRace*)GameServer()->m_pController)->m_Teams.SetForceCharacterTeam(m_pPlayer->GetCID(), 0); + Teams()->OnCharacterDeath(m_pPlayer->GetCID()); } bool CCharacter::TakeDamage(vec2 Force, int Dmg, int From, int Weapon) @@ -1614,4 +1614,4 @@ void CCharacter::DDRaceInit() } m_DefEmote = EMOTE_NORMAL; m_DefEmoteReset = -1; -} \ No newline at end of file +} diff --git a/src/game/server/teams.cpp b/src/game/server/teams.cpp index 7e80f57a5..dcd2e9736 100644 --- a/src/game/server/teams.cpp +++ b/src/game/server/teams.cpp @@ -43,8 +43,8 @@ void CGameTeams::OnCharacterStart(int ClientID) { if(Team == m_Core.Team(i)) { - CCharacter* Char = Character(i); - if(Char->m_DDRaceState == DDRACE_FINISHED) + CCharacter* pChar = Character(i); + if(pChar && pChar->IsAlive() && pChar->m_DDRaceState == DDRACE_FINISHED) { Waiting = true; if(m_LastChat[ClientID] + Server()->TickSpeed() + g_Config.m_SvChatDelay < Tick) @@ -62,6 +62,17 @@ void CGameTeams::OnCharacterStart(int ClientID) m_LastChat[i] = Tick; } } + else if(pChar && pChar->IsAlive() && pChar->m_DDRaceState == DDRACE_STARTED) + { + Waiting = true; + if(m_LastChat[ClientID] + Server()->TickSpeed() + g_Config.m_SvChatDelay < Tick) + { + char aBuf[128]; + str_format(aBuf, sizeof(aBuf), "%s has started, wait for him, ask him to kill or join another team.", Server()->ClientName(i)); + GameServer()->SendChatTarget(ClientID, aBuf); + m_LastChat[ClientID] = Tick; + } + } } } @@ -72,12 +83,12 @@ void CGameTeams::OnCharacterStart(int ClientID) { if(Team == m_Core.Team(i)) { - CCharacter* Char = Character(i); - if(Char) + CCharacter* pChar = Character(i); + if(pChar && pChar->IsAlive()) { - Char->m_DDRaceState = DDRACE_STARTED; - Char->m_StartTime = Tick; - Char->m_RefreshTime = Tick; + pChar->m_DDRaceState = DDRACE_STARTED; + pChar->m_StartTime = Tick; + pChar->m_RefreshTime = Tick; } } } @@ -102,10 +113,10 @@ void CGameTeams::OnCharacterFinish(int ClientID) { if(Team == m_Core.Team(i)) { - CCharacter * Char = Character(i); - if(Char != 0) + CCharacter * pChar = Character(i); + if(pChar != 0 && pChar->m_DDRaceState == DDRACE_STARTED) { - Char->OnFinish(); + pChar->OnFinish(); m_TeeFinished[i] = false; } } @@ -115,6 +126,23 @@ void CGameTeams::OnCharacterFinish(int ClientID) } } +void CGameTeams::OnCharacterDeath(int ClientID) +{ + if(g_Config.m_SvTeamStrict && m_Core.Team(ClientID) != TEAM_FLOCK && m_Core.Team(ClientID) != TEAM_SUPER) + for(int LoopClientID = 0; LoopClientID < MAX_CLIENTS; ++LoopClientID) + { + if(m_Core.Team(ClientID) == m_Core.Team(LoopClientID)) + { + CCharacter* pChar = Character(LoopClientID); + if(pChar) + pChar->Die(ClientID, WEAPON_SELF); + } + } + + if(!g_Config.m_SvStickyTeams && m_Core.Team(ClientID) != TEAM_FLOCK && m_Core.Team(ClientID) != TEAM_SUPER) + SetForceCharacterTeam(ClientID, 0); +} + int CGameTeams::SetCharacterTeam(int ClientID, int Team) { //Check on wrong parameters. +1 for TEAM_SUPER @@ -157,12 +185,11 @@ void CGameTeams::SetForceCharacterTeam(int ClientID, int Team) m_TeamState[OldTeam] = TEAMSTATE_EMPTY; } - if(Count(OldTeam) > 0) m_MembersCount[OldTeam]--; m_Core.Team(ClientID, Team); - if(Team) + if(Team != TEAM_SUPER) { str_format(aBuf, sizeof(aBuf), "\'%s\' joined team %d.", pServ->ClientName(pPlayer->GetCID()), Team); GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aBuf); @@ -224,8 +251,12 @@ int CGameTeams::Count(int Team) const bool CGameTeams::TeamFinished(int Team) { for(int i = 0; i < MAX_CLIENTS; ++i) - if(m_Core.Team(i) == Team && !m_TeeFinished[i]) - return false; + { + CCharacter *pChar = (GameServer()->m_apPlayers[i]) ? GameServer()->m_apPlayers[i]->GetCharacter() : 0; + if(pChar) + if(m_Core.Team(i) == Team && (!m_TeeFinished[i] && pChar->m_DDRaceState == DDRACE_STARTED)) + return false; + } return true; } diff --git a/src/game/server/teams.h b/src/game/server/teams.h index 7ced2b74d..cb9c50238 100644 --- a/src/game/server/teams.h +++ b/src/game/server/teams.h @@ -36,6 +36,7 @@ public: void OnCharacterStart(int ClientID); void OnCharacterFinish(int ClientID); + void OnCharacterDeath(int ClientID); int SetCharacterTeam(int ClientID, int Team); enum TeamErrors diff --git a/src/game/version.h b/src/game/version.h index 25be30305..ec9902802 100644 --- a/src/game/version.h +++ b/src/game/version.h @@ -3,6 +3,6 @@ #ifndef GAME_VERSION_H #define GAME_VERSION_H -#define GAME_VERSION "0.5 trunk, 1.05a" +#define GAME_VERSION "0.5 trunk, 1.051a" #define GAME_NETVERSION "0.5 b67d1f1a1eea234e" #endif