Add teleport/tp chat command to teleport yourself

to another player or spectated location. Requires /practice mode

As suggested by Rockus on Discord
This commit is contained in:
def 2022-01-09 14:27:59 +01:00 committed by Dennis Felsing
parent 2411049a5c
commit 1bdf960945
4 changed files with 62 additions and 14 deletions

View file

@ -59,6 +59,8 @@ CHAT_COMMAND("time", "", CFGFLAG_CHAT | CFGFLAG_SERVER, ConTime, this, "Privatel
CHAT_COMMAND("timer", "?s['gametimer'|'broadcast'|'both'|'none'|'cycle']", CFGFLAG_CHAT | CFGFLAG_SERVER, ConSetTimerType, this, "Personal Setting of showing time in either broadcast or game/round timer, timer s, where s = broadcast for broadcast, gametimer for game/round timer, cycle for cycle, both for both, none for no timer and nothing to show current status")
CHAT_COMMAND("r", "", CFGFLAG_CHAT | CFGFLAG_SERVER, ConRescue, this, "Teleport yourself out of freeze (use sv_rescue 1 to enable this feature)")
CHAT_COMMAND("rescue", "", CFGFLAG_CHAT | CFGFLAG_SERVER, ConRescue, this, "Teleport yourself out of freeze (use sv_rescue 1 to enable this feature)")
CHAT_COMMAND("tp", "?r[player name]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConTele, this, "Teleport yourself to player or to where you are spectating if no player name is given")
CHAT_COMMAND("teleport", "?r[player name]", CFGFLAG_CHAT | CFGFLAG_SERVER, ConTele, this, "Teleport yourself to player or to where you are spectating if no player name is given")
CHAT_COMMAND("kill", "", CFGFLAG_CHAT | CFGFLAG_SERVER, ConProtectedKill, this, "Kill yourself when kill-protected during a long game (use f1, kill for regular kill)")

View file

@ -1462,6 +1462,53 @@ void CGameContext::ConRescue(IConsole::IResult *pResult, void *pUserData)
pChr->Rescue();
}
void CGameContext::ConTele(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
if(!CheckClientID(pResult->m_ClientID))
return;
CPlayer *pPlayer = pSelf->m_apPlayers[pResult->m_ClientID];
if(!pPlayer)
return;
CCharacter *pChr = pPlayer->GetCharacter();
if(!pChr)
return;
CGameTeams &Teams = ((CGameControllerDDRace *)pSelf->m_pController)->m_Teams;
int Team = Teams.m_Core.Team(pResult->m_ClientID);
if(!Teams.IsPractice(Team))
{
pSelf->SendChatTarget(pPlayer->GetCID(), "You're not in a team with /practice turned on. Note that you can't earn a rank with practice enabled.");
return;
}
vec2 Pos = pPlayer->m_ViewPos;
if(pResult->NumArguments() > 0)
{
int ClientID;
for(ClientID = 0; ClientID < MAX_CLIENTS; ClientID++)
{
if(str_comp(pResult->GetString(0), pSelf->Server()->ClientName(ClientID)) == 0)
break;
}
if(ClientID == MAX_CLIENTS)
{
pSelf->SendChatTarget(pPlayer->GetCID(), "No player with this name found.");
return;
}
CPlayer *pPlayerTo = pSelf->m_apPlayers[ClientID];
if(!pPlayerTo)
return;
CCharacter *pChrTo = pPlayerTo->GetCharacter();
if(!pChrTo)
return;
Pos = pChrTo->m_Pos;
}
pSelf->Teleport(pChr, Pos);
}
void CGameContext::ConProtectedKill(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;

View file

@ -277,6 +277,14 @@ void CGameContext::ModifyWeapons(IConsole::IResult *pResult, void *pUserData,
pChr->m_DDRaceState = DDRACE_CHEAT;
}
void CGameContext::Teleport(CCharacter *pChr, vec2 Pos)
{
pChr->Core()->m_Pos = Pos;
pChr->m_Pos = Pos;
pChr->m_PrevPos = Pos;
pChr->m_DDRaceState = DDRACE_CHEAT;
}
void CGameContext::ConToTeleporter(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
@ -289,11 +297,7 @@ void CGameContext::ConToTeleporter(IConsole::IResult *pResult, void *pUserData)
if(pChr)
{
int TeleOut = pSelf->m_World.m_Core.RandomOr0(pGameControllerDDRace->m_TeleOuts[TeleTo - 1].size());
vec2 TelePos = pGameControllerDDRace->m_TeleOuts[TeleTo - 1][TeleOut];
pChr->Core()->m_Pos = TelePos;
pChr->m_Pos = TelePos;
pChr->m_PrevPos = TelePos;
pChr->m_DDRaceState = DDRACE_CHEAT;
pSelf->Teleport(pChr, pGameControllerDDRace->m_TeleOuts[TeleTo - 1][TeleOut]);
}
}
}
@ -310,11 +314,7 @@ void CGameContext::ConToCheckTeleporter(IConsole::IResult *pResult, void *pUserD
if(pChr)
{
int TeleOut = pSelf->m_World.m_Core.RandomOr0(pGameControllerDDRace->m_TeleCheckOuts[TeleTo - 1].size());
vec2 TelePos = pGameControllerDDRace->m_TeleCheckOuts[TeleTo - 1][TeleOut];
pChr->Core()->m_Pos = TelePos;
pChr->m_Pos = TelePos;
pChr->m_PrevPos = TelePos;
pChr->m_DDRaceState = DDRACE_CHEAT;
pSelf->Teleport(pChr, pGameControllerDDRace->m_TeleCheckOuts[TeleTo - 1][TeleOut]);
pChr->m_TeleCheckpoint = TeleTo;
}
}
@ -336,10 +336,7 @@ void CGameContext::ConTeleport(IConsole::IResult *pResult, void *pUserData)
CCharacter *pChr = pSelf->GetPlayerChar(Tele);
if(pChr && pSelf->GetPlayerChar(TeleTo))
{
pChr->Core()->m_Pos = pSelf->m_apPlayers[TeleTo]->m_ViewPos;
pChr->m_Pos = pSelf->m_apPlayers[TeleTo]->m_ViewPos;
pChr->m_PrevPos = pSelf->m_apPlayers[TeleTo]->m_ViewPos;
pChr->m_DDRaceState = DDRACE_CHEAT;
pSelf->Teleport(pChr, pSelf->m_apPlayers[TeleTo]->m_ViewPos);
}
}

View file

@ -333,6 +333,7 @@ private:
static void ConToTeleporter(IConsole::IResult *pResult, void *pUserData);
static void ConToCheckTeleporter(IConsole::IResult *pResult, void *pUserData);
void Teleport(CCharacter *pChar, vec2 Pos);
static void ConTeleport(IConsole::IResult *pResult, void *pUserData);
static void ConCredits(IConsole::IResult *pResult, void *pUserData);
@ -383,6 +384,7 @@ private:
static void ConTime(IConsole::IResult *pResult, void *pUserData);
static void ConSetTimerType(IConsole::IResult *pResult, void *pUserData);
static void ConRescue(IConsole::IResult *pResult, void *pUserData);
static void ConTele(IConsole::IResult *pResult, void *pUserData);
static void ConProtectedKill(IConsole::IResult *pResult, void *pUserData);
static void ConVoteMute(IConsole::IResult *pResult, void *pUserData);