mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-14 03:58:18 +00:00
Merge pull request #191 from timgame/DDRace64
added /r, /rescue: teleport yourself out of freeze
This commit is contained in:
commit
c4f615a916
|
@ -1222,7 +1222,29 @@ void CGameContext::ConSetTimerType(IConsole::IResult *pResult, void *pUserData)
|
||||||
}
|
}
|
||||||
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD,"timer",aBuf);
|
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD,"timer",aBuf);
|
||||||
}
|
}
|
||||||
void CGameContext::ConProtectedKill(IConsole::IResult *pResult, void *pUserData){
|
|
||||||
|
void CGameContext::ConRescue(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;
|
||||||
|
|
||||||
|
if (!g_Config.m_SvAllowRescue) {
|
||||||
|
pSelf->SendChatTarget(pPlayer->GetCID(), "Rescue is not enabled on this server");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pChr->Rescue();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGameContext::ConProtectedKill(IConsole::IResult *pResult, void *pUserData)
|
||||||
|
{
|
||||||
CGameContext *pSelf = (CGameContext *) pUserData;
|
CGameContext *pSelf = (CGameContext *) pUserData;
|
||||||
if (!CheckClientID(pResult->m_ClientID))
|
if (!CheckClientID(pResult->m_ClientID))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -41,6 +41,8 @@ CHAT_COMMAND("saytime", "?r", CFGFLAG_CHAT|CFGFLAG_SERVER, ConSayTime, this, "Pr
|
||||||
CHAT_COMMAND("saytimeall", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConSayTimeAll, this, "Publicly messages everyone your current time in this current running race")
|
CHAT_COMMAND("saytimeall", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConSayTimeAll, this, "Publicly messages everyone your current time in this current running race")
|
||||||
CHAT_COMMAND("time", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConTime, this, "Privately shows you your current time in this current running race in the broadcast message")
|
CHAT_COMMAND("time", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConTime, this, "Privately shows you your current time in this current running race in the broadcast message")
|
||||||
CHAT_COMMAND("timer", "?s", 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("timer", "?s", 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_allow_rescue 1 to enable this feature)")
|
||||||
|
CHAT_COMMAND("rescue", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConRescue, this, "Teleport yourself out of freeze (use sv_allow_rescue 1 to enable this feature)")
|
||||||
|
|
||||||
CHAT_COMMAND("kill", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConProtectedKill, this, "Kill yourself")
|
CHAT_COMMAND("kill", "", CFGFLAG_CHAT|CFGFLAG_SERVER, ConProtectedKill, this, "Kill yourself")
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,17 @@ bool CCharacter::IsGrounded()
|
||||||
return true;
|
return true;
|
||||||
if(GameServer()->Collision()->CheckPoint(m_Pos.x-m_ProximityRadius/2, m_Pos.y+m_ProximityRadius/2+5))
|
if(GameServer()->Collision()->CheckPoint(m_Pos.x-m_ProximityRadius/2, m_Pos.y+m_ProximityRadius/2+5))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
int index = GameServer()->Collision()->GetPureMapIndex(vec2(m_Pos.x, m_Pos.y+m_ProximityRadius/2+4));
|
||||||
|
int tile = GameServer()->Collision()->GetTileIndex(index);
|
||||||
|
int flags = GameServer()->Collision()->GetTileFlags(index);
|
||||||
|
if(tile == TILE_STOPA || (tile == TILE_STOP && flags == ROTATION_0) || (tile ==TILE_STOPS && (flags == ROTATION_0 || flags == ROTATION_180)))
|
||||||
|
return true;
|
||||||
|
tile = GameServer()->Collision()->GetFTileIndex(index);
|
||||||
|
flags = GameServer()->Collision()->GetFTileFlags(index);
|
||||||
|
if(tile == TILE_STOPA || (tile == TILE_STOP && flags == ROTATION_0) || (tile ==TILE_STOPS && (flags == ROTATION_0 || flags == ROTATION_180)))
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1994,6 +2005,17 @@ void CCharacter::DDRaceTick()
|
||||||
|
|
||||||
HandleTuneLayer(); // need this before coretick
|
HandleTuneLayer(); // need this before coretick
|
||||||
|
|
||||||
|
// look for save position for rescue feature
|
||||||
|
if(g_Config.m_SvAllowRescue) {
|
||||||
|
int index = GameServer()->Collision()->GetPureMapIndex(m_Pos);
|
||||||
|
int tile = GameServer()->Collision()->GetTileIndex(index);
|
||||||
|
int ftile = GameServer()->Collision()->GetFTileIndex(index);
|
||||||
|
if(IsGrounded() && tile != TILE_FREEZE && tile != TILE_DFREEZE && ftile != TILE_FREEZE && ftile != TILE_DFREEZE) {
|
||||||
|
m_PrevSavePos = m_Pos;
|
||||||
|
m_SetSavePos = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_Core.m_Id = GetPlayer()->GetCID();
|
m_Core.m_Id = GetPlayer()->GetCID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2127,6 +2149,7 @@ void CCharacter::DDRaceInit()
|
||||||
m_Paused = false;
|
m_Paused = false;
|
||||||
m_DDRaceState = DDRACE_NONE;
|
m_DDRaceState = DDRACE_NONE;
|
||||||
m_PrevPos = m_Pos;
|
m_PrevPos = m_Pos;
|
||||||
|
m_SetSavePos = false;
|
||||||
m_LastBroadcast = 0;
|
m_LastBroadcast = 0;
|
||||||
m_TeamBeforeSuper = 0;
|
m_TeamBeforeSuper = 0;
|
||||||
m_Core.m_Id = GetPlayer()->GetCID();
|
m_Core.m_Id = GetPlayer()->GetCID();
|
||||||
|
@ -2162,3 +2185,22 @@ void CCharacter::DDRaceInit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCharacter::Rescue()
|
||||||
|
{
|
||||||
|
if (m_SetSavePos && !m_Super && !m_DeepFreeze && IsGrounded() && m_Pos == m_PrevPos) {
|
||||||
|
int index = GameServer()->Collision()->GetPureMapIndex(m_Pos);
|
||||||
|
if (GameServer()->Collision()->GetTileIndex(index) == TILE_FREEZE || GameServer()->Collision()->GetFTileIndex(index) == TILE_FREEZE) {
|
||||||
|
m_Core.m_Pos = m_PrevSavePos;
|
||||||
|
m_Pos = m_PrevSavePos;
|
||||||
|
m_PrevPos = m_PrevSavePos;
|
||||||
|
m_Core.m_Vel = vec2(0, 0);
|
||||||
|
m_Core.m_HookedPlayer = -1;
|
||||||
|
m_Core.m_HookState = HOOK_RETRACTED;
|
||||||
|
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
||||||
|
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
|
||||||
|
m_Core.m_HookPos = m_Core.m_Pos;
|
||||||
|
UnFreeze();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -79,6 +79,8 @@ public:
|
||||||
|
|
||||||
void SetEmote(int Emote, int Tick);
|
void SetEmote(int Emote, int Tick);
|
||||||
|
|
||||||
|
void Rescue();
|
||||||
|
|
||||||
int NeededFaketuning() {return m_NeededFaketuning;}
|
int NeededFaketuning() {return m_NeededFaketuning;}
|
||||||
bool IsAlive() const { return m_Alive; }
|
bool IsAlive() const { return m_Alive; }
|
||||||
bool IsPaused() const { return m_Paused; }
|
bool IsPaused() const { return m_Paused; }
|
||||||
|
@ -165,6 +167,10 @@ private:
|
||||||
void HandleBroadcast();
|
void HandleBroadcast();
|
||||||
void HandleTuneLayer();
|
void HandleTuneLayer();
|
||||||
void SendZoneMsgs();
|
void SendZoneMsgs();
|
||||||
|
|
||||||
|
bool m_SetSavePos;
|
||||||
|
vec2 m_PrevSavePos;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CGameTeams* Teams();
|
CGameTeams* Teams();
|
||||||
void Pause(bool Pause);
|
void Pause(bool Pause);
|
||||||
|
|
|
@ -301,6 +301,7 @@ private:
|
||||||
static void ConSayTimeAll(IConsole::IResult *pResult, void *pUserData);
|
static void ConSayTimeAll(IConsole::IResult *pResult, void *pUserData);
|
||||||
static void ConTime(IConsole::IResult *pResult, void *pUserData);
|
static void ConTime(IConsole::IResult *pResult, void *pUserData);
|
||||||
static void ConSetTimerType(IConsole::IResult *pResult, void *pUserData);
|
static void ConSetTimerType(IConsole::IResult *pResult, void *pUserData);
|
||||||
|
static void ConRescue(IConsole::IResult *pResult, void *pUserData);
|
||||||
static void ConProtectedKill(IConsole::IResult *pResult, void *pUserData);
|
static void ConProtectedKill(IConsole::IResult *pResult, void *pUserData);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -142,6 +142,8 @@ MACRO_CONFIG_STR(SvServerType, sv_server_type, 64, "none", CFGFLAG_SERVER, "Type
|
||||||
|
|
||||||
MACRO_CONFIG_INT(SvSendVotesPerTick, sv_send_votes_per_tick, 5, 1, 15, CFGFLAG_SERVER, "Number of vote options being send per tick")
|
MACRO_CONFIG_INT(SvSendVotesPerTick, sv_send_votes_per_tick, 5, 1, 15, CFGFLAG_SERVER, "Number of vote options being send per tick")
|
||||||
|
|
||||||
|
MACRO_CONFIG_INT(SvAllowRescue, sv_allow_rescue, 0, 0, 1, CFGFLAG_SERVER, "Allow /rescue command so players can teleport themselves out of freeze");
|
||||||
|
|
||||||
// debug
|
// debug
|
||||||
#ifdef CONF_DEBUG // this one can crash the server if not used correctly
|
#ifdef CONF_DEBUG // this one can crash the server if not used correctly
|
||||||
MACRO_CONFIG_INT(DbgDummies, dbg_dummies, 0, 0, 15, CFGFLAG_SERVER, "")
|
MACRO_CONFIG_INT(DbgDummies, dbg_dummies, 0, 0, 15, CFGFLAG_SERVER, "")
|
||||||
|
|
Loading…
Reference in a new issue