Skip to content

Commit

Permalink
Merge pull request #652 from Learath2/dd_pr_invite
Browse files Browse the repository at this point in the history
Add /invite for locked teams. Fixes #647
  • Loading branch information
heinrich5991 committed Mar 12, 2017
2 parents b3b512b + 0b0783f commit ccb9db9
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 3 deletions.
110 changes: 107 additions & 3 deletions src/game/server/ddracechat.cpp
Expand Up @@ -770,9 +770,113 @@ void CGameContext::ConLockTeam(IConsole::IResult *pResult, void *pUserData)
"This team can't be locked");
}

void CGameContext::ConInviteTeam(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
CGameControllerDDRace *pController = (CGameControllerDDRace *)pSelf->m_pController;
const char *pName = pResult->GetString(0);

int Team = pController->m_Teams.m_Core.Team(pResult->m_ClientID);
if(Team > TEAM_FLOCK && Team < TEAM_SUPER)
{
int Target = -1;
for(int i = 0; i < MAX_CLIENTS; i++)
{
if(!str_comp(pName, pSelf->Server()->ClientName(i)))
{
Target = i;
break;
}
}

if(Target < 0)
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Player not found");
return;
}

if(pController->m_Teams.IsInvited(Team, Target))
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Player already invited");
return;
}

pController->m_Teams.SetClientInvited(Team, Target, true);

char aBuf[512];
str_format(aBuf, sizeof aBuf, "'%s' invited you to team %d.", pSelf->Server()->ClientName(pResult->m_ClientID), Team);
pSelf->SendChatTarget(Target, aBuf);

pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Player has been notified");
}
else
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Can't invite players to this team");
}

void CGameContext::ConUnInviteTeam(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
CGameControllerDDRace *pController = (CGameControllerDDRace *)pSelf->m_pController;

const char *pName = pResult->GetString(0);

int Target = -1;
if(pResult->NumArguments() == 1)
{
for(Target = 0; Target < MAX_CLIENTS; Target++)
if(!str_comp(pName, pSelf->Server()->ClientName(Target)))
break;

if(Target < 0)
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Player not found");
return;
}
}

int Team = pController->m_Teams.m_Core.Team(pResult->m_ClientID);
if(Team > TEAM_FLOCK && Team < TEAM_SUPER)
{
if(Target > 0)
{
if(!pController->m_Teams.IsInvited(Team, Target))
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Player already not invited");
return;
}

pController->m_Teams.SetClientInvited(Team, Target, false);

char aBuf[512];
str_format(aBuf, sizeof aBuf, "Your invite to team %d is no longer valid.", Team);
pSelf->SendChatTarget(Target, aBuf);

pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Player has been notified");
}
else
{
pController->m_Teams.ResetInvited(Team);
for(int i = 0; i < MAX_CLIENTS; i++)
{
if(pController->m_Teams.IsInvited(Team, i) && pController->m_Teams.m_Core.Team(i) != Team)
{
char aBuf[512];
str_format(aBuf, sizeof aBuf, "Your invite to team %d is no longer valid.", Team);
pSelf->SendChatTarget(i, aBuf);
}
}

pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "All invites have been invalidated");
}
}
else
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "invite", "Can't uninvite players from this team");
}

void CGameContext::ConJoinTeam(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
CGameControllerDDRace *pController = (CGameControllerDDRace *)pSelf->m_pController;
if (!CheckClientID(pResult->m_ClientID))
return;

Expand Down Expand Up @@ -820,12 +924,12 @@ void CGameContext::ConJoinTeam(IConsole::IResult *pResult, void *pUserData)
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "join",
"You can\'t change teams that fast!");
}
else if(pResult->GetInteger(0) > 0 && pResult->GetInteger(0) < MAX_CLIENTS && ((CGameControllerDDRace*) pSelf->m_pController)->m_Teams.TeamLocked(pResult->GetInteger(0)))
else if(pResult->GetInteger(0) > 0 && pResult->GetInteger(0) < MAX_CLIENTS && pController->m_Teams.TeamLocked(pResult->GetInteger(0)) && !pController->m_Teams.IsInvited(pResult->GetInteger(0), pResult->m_ClientID))
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "join",
"This team is locked using /lock. Only members of the team can unlock it using /lock.");
"This team is locked using /lock. Only members of the team can invite you or unlock it using /lock.");
}
else if(pResult->GetInteger(0) > 0 && pResult->GetInteger(0) < MAX_CLIENTS && ((CGameControllerDDRace*) pSelf->m_pController)->m_Teams.Count(pResult->GetInteger(0)) >= g_Config.m_SvTeamMaxSize)
else if(pResult->GetInteger(0) > 0 && pResult->GetInteger(0) < MAX_CLIENTS && pController->m_Teams.Count(pResult->GetInteger(0)) >= g_Config.m_SvTeamMaxSize)
{
char aBuf[512];
str_format(aBuf, sizeof(aBuf), "This team already has the maximum allowed size of %d players", g_Config.m_SvTeamMaxSize);
Expand Down
2 changes: 2 additions & 0 deletions src/game/server/ddracechat.h
Expand Up @@ -31,6 +31,8 @@ CHAT_COMMAND("rank", "?r[playername]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConRank, thi
CHAT_COMMAND("rules", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConRules, this, "Shows the server rules")
CHAT_COMMAND("team", "?i[id]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConJoinTeam, this, "Lets you join team i (shows your team if left blank)")
CHAT_COMMAND("lock", "?i['0'|'1']", CFGFLAG_CHAT|CFGFLAG_SERVER, ConLockTeam, this, "Lock team so no-one else can join it")
CHAT_COMMAND("invite", "r[player name]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConInviteTeam, this, "Invite a person to a locked team")
CHAT_COMMAND("uninvite", "?r[player name]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConUnInviteTeam, this, "Revoke a persons invitation to a locked team")
CHAT_COMMAND("top5team", "?i[rank to start with]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConTeamTop5, this, "Shows five team ranks of the ladder beginning with rank i (1 by default)")
CHAT_COMMAND("teamtop5", "?i[rank to start with]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConTeamTop5, this, "Shows five team ranks of the ladder beginning with rank i (1 by default)")
CHAT_COMMAND("top5", "?i[rank to start with]", CFGFLAG_CHAT|CFGFLAG_SERVER, ConTop5, this, "Shows five ranks of the ladder beginning with rank i (1 by default)")
Expand Down
2 changes: 2 additions & 0 deletions src/game/server/gamecontext.h
Expand Up @@ -298,6 +298,8 @@ class CGameContext : public IGameServer
static void ConBroadTime(IConsole::IResult *pResult, void *pUserData);
static void ConJoinTeam(IConsole::IResult *pResult, void *pUserData);
static void ConLockTeam(IConsole::IResult *pResult, void *pUserData);
static void ConInviteTeam(IConsole::IResult *pResult, void *pUserData);
static void ConUnInviteTeam(IConsole::IResult *pResult, void *pUserData);
static void ConMe(IConsole::IResult *pResult, void *pUserData);
static void ConWhisper(IConsole::IResult *pResult, void *pUserData);
static void ConConverse(IConsole::IResult *pResult, void *pUserData);
Expand Down
24 changes: 24 additions & 0 deletions src/game/server/teams.cpp
Expand Up @@ -20,6 +20,7 @@ void CGameTeams::Reset()
m_LastChat[i] = 0;
m_TeamLocked[i] = false;
m_IsSaving[i] = false;
m_Invited[i] = 0;
}
}

Expand Down Expand Up @@ -646,7 +647,30 @@ void CGameTeams::OnCharacterDeath(int ClientID, int Weapon)
void CGameTeams::SetTeamLock(int Team, bool Lock)
{
if(Team > TEAM_FLOCK && Team < TEAM_SUPER)
{
if(!m_TeamLocked[Team] && Lock)
ResetInvited(Team);
m_TeamLocked[Team] = Lock;
}
}

void CGameTeams::ResetInvited(int Team)
{
m_Invited[Team] = 0;
for (int i = 0; i < MAX_CLIENTS; i++)
if(m_Core.Team(i) == Team && GameServer()->m_apPlayers[i])
m_Invited[Team] |= 1ULL << i;
}

void CGameTeams::SetClientInvited(int Team, int ClientID, bool Invited)
{
if(Team > TEAM_FLOCK && Team < TEAM_SUPER)
{
if(Invited)
m_Invited[Team] |= 1ULL << ClientID;
else
m_Invited[Team] &= ~(1ULL << ClientID);
}
}

void CGameTeams::KillSavedTeam(int Team)
Expand Down
8 changes: 8 additions & 0 deletions src/game/server/teams.h
Expand Up @@ -12,6 +12,7 @@ class CGameTeams
bool m_TeeFinished[MAX_CLIENTS];
bool m_TeamLocked[MAX_CLIENTS];
bool m_IsSaving[MAX_CLIENTS];
uint64_t m_Invited[MAX_CLIENTS];

class CGameContext * m_pGameContext;

Expand Down Expand Up @@ -69,6 +70,8 @@ class CGameTeams

void SendTeamsState(int Cid);
void SetTeamLock(int Team, bool Lock);
void ResetInvited(int Team);
void SetClientInvited(int Team, int ClientID, bool Invited);

int m_LastChat[MAX_CLIENTS];

Expand Down Expand Up @@ -101,6 +104,11 @@ class CGameTeams
return m_TeamLocked[Team];
}

bool IsInvited(int Team, int ClientID)
{
return m_Invited[Team] & 1LL << ClientID;
}

void SetFinished(int ClientID, bool finished)
{
m_TeeFinished[ClientID] = finished;
Expand Down

0 comments on commit ccb9db9

Please sign in to comment.