Skip to content

Commit 8d7f2b1

Browse files
committed
Fixes to practice
1 parent 93adb12 commit 8d7f2b1

File tree

7 files changed

+50
-17
lines changed

7 files changed

+50
-17
lines changed

src/game/server/ddracechat.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,15 @@ void CGameContext::ConPractice(IConsole::IResult *pResult, void *pUserData)
447447
if(pSelf->ProcessSpamProtection(pResult->m_ClientID))
448448
return;
449449

450+
if(!g_Config.m_SvPractice)
451+
{
452+
pSelf->Console()->Print(
453+
IConsole::OUTPUT_LEVEL_STANDARD,
454+
"print",
455+
"Practice mode is disabled");
456+
return;
457+
}
458+
450459
CGameTeams &Teams = ((CGameControllerDDRace*) pSelf->m_pController)->m_Teams;
451460

452461
int Team = Teams.m_Core.Team(pResult->m_ClientID);

src/game/server/ddracecommands.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,9 @@ void CGameContext::ConSetDDRTeam(IConsole::IResult *pResult, void *pUserData)
499499
if (Team < TEAM_FLOCK || Team >= TEAM_SUPER)
500500
return;
501501

502-
if(pController->m_Teams.m_Core.Team(Target) && pController->m_Teams.GetDDRaceState(pSelf->m_apPlayers[Target]) == DDRACE_STARTED)
502+
CCharacter* pChr = pSelf->GetPlayerChar(Target);
503+
504+
if((pController->m_Teams.m_Core.Team(Target) && pController->m_Teams.GetDDRaceState(pSelf->m_apPlayers[Target]) == DDRACE_STARTED) || (pChr && pController->m_Teams.IsPractice(pChr->Team())))
503505
pSelf->m_apPlayers[Target]->KillCharacter(WEAPON_SELF);
504506

505507
pController->m_Teams.SetForceCharacterTeam(Target, Team);

src/game/server/entities/character.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,6 +1939,12 @@ void CCharacter::DDraceTick()
19391939
int ftile = GameServer()->Collision()->GetFTileIndex(index);
19401940
if (IsGrounded() && tile != TILE_FREEZE && tile != TILE_DFREEZE && ftile != TILE_FREEZE && ftile != TILE_DFREEZE) {
19411941
m_PrevSavePos = m_Pos;
1942+
for(int i = 0; i< NUM_WEAPONS; i++)
1943+
{
1944+
m_aPrevSaveWeapons[i].m_AmmoRegenStart = m_aWeapons[i].m_AmmoRegenStart;
1945+
m_aPrevSaveWeapons[i].m_Ammo = m_aWeapons[i].m_Ammo;
1946+
m_aPrevSaveWeapons[i].m_Got = m_aWeapons[i].m_Got;
1947+
}
19421948
m_SetSavePos = true;
19431949
}
19441950
}
@@ -2135,7 +2141,7 @@ void CCharacter::DDraceInit()
21352141

21362142
void CCharacter::Rescue()
21372143
{
2138-
if (m_SetSavePos && !m_Super && !m_DeepFreeze && IsGrounded() && m_Pos == m_PrevPos) {
2144+
if (m_SetSavePos && !m_Super) {
21392145
if (m_LastRescue + g_Config.m_SvRescueDelay * Server()->TickSpeed() > Server()->Tick())
21402146
{
21412147
char aBuf[256];
@@ -2144,18 +2150,22 @@ void CCharacter::Rescue()
21442150
return;
21452151
}
21462152

2147-
int index = GameServer()->Collision()->GetPureMapIndex(m_Pos);
2148-
if (GameServer()->Collision()->GetTileIndex(index) == TILE_FREEZE || GameServer()->Collision()->GetFTileIndex(index) == TILE_FREEZE) {
2149-
m_LastRescue = Server()->Tick();
2150-
m_Core.m_Pos = m_PrevSavePos;
2151-
m_Pos = m_PrevSavePos;
2152-
m_PrevPos = m_PrevSavePos;
2153-
m_Core.m_Vel = vec2(0, 0);
2154-
m_Core.m_HookedPlayer = -1;
2155-
m_Core.m_HookState = HOOK_RETRACTED;
2156-
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
2157-
m_Core.m_HookPos = m_Core.m_Pos;
2158-
UnFreeze();
2153+
m_LastRescue = Server()->Tick();
2154+
m_Core.m_Pos = m_PrevSavePos;
2155+
m_Pos = m_PrevSavePos;
2156+
m_PrevPos = m_PrevSavePos;
2157+
m_Core.m_Vel = vec2(0, 0);
2158+
m_Core.m_HookedPlayer = -1;
2159+
m_Core.m_HookState = HOOK_RETRACTED;
2160+
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
2161+
m_Core.m_HookPos = m_Core.m_Pos;
2162+
UnFreeze();
2163+
2164+
for(int i = 0; i< NUM_WEAPONS; i++)
2165+
{
2166+
m_aWeapons[i].m_AmmoRegenStart = m_aPrevSaveWeapons[i].m_AmmoRegenStart;
2167+
m_aWeapons[i].m_Ammo = m_aPrevSaveWeapons[i].m_Ammo;
2168+
m_aWeapons[i].m_Got = m_aPrevSaveWeapons[i].m_Got;
21592169
}
21602170
}
21612171
}

src/game/server/entities/character.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class CCharacter : public CEntity
8888

8989
} m_aWeapons[NUM_WEAPONS];
9090

91+
struct WeaponStat m_aPrevSaveWeapons[NUM_WEAPONS];
92+
9193
int m_ActiveWeapon;
9294
int m_LastWeapon;
9395
int m_QueuedWeapon;

src/game/server/save.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ CCharacter* CSaveTeam::MatchCharacter(char name[16], int SaveID)
429429

430430
char* CSaveTeam::GetString()
431431
{
432-
str_format(m_aString, sizeof(m_aString), "%d\t%d\t%d\t%d\t%d", m_TeamState, m_MembersCount, m_NumSwitchers, m_TeamLocked, m_Practice);
432+
str_format(m_String, sizeof(m_String), "%d\t%d\t%d\t%d\t%d", m_TeamState, m_MembersCount, m_NumSwitchers, m_TeamLocked, m_Practice);
433433

434434
for(int i = 0; i < m_MembersCount; i++)
435435
{
@@ -443,8 +443,8 @@ char* CSaveTeam::GetString()
443443
for(int i=1; i < m_NumSwitchers+1; i++)
444444
{
445445
char aBuf[64];
446-
str_format(aBuf, sizeof(aBuf), "\n%d\t%d\t%d", m_Switchers[i].m_Status, m_pSwitchers[i].m_EndTime, m_pSwitchers[i].m_Type);
447-
str_append(m_aString, aBuf, sizeof(m_aString));
446+
str_format(aBuf, sizeof(aBuf), "\n%d\t%d\t%d", m_Switchers[i].m_Status, m_Switchers[i].m_EndTime, m_Switchers[i].m_Type);
447+
str_append(m_String, aBuf, sizeof(m_String));
448448
}
449449
}
450450

src/game/server/teams.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ bool CGameTeams::SetCharacterTeam(int ClientID, int Team)
243243
//if you begin race
244244
if (Character(ClientID)->m_DDRaceState != DDRACE_NONE && Team != TEAM_SUPER)
245245
return false;
246+
//No cheating through noob filter with practice and then leaving team
247+
if (m_Practice[m_Core.Team(ClientID)])
248+
return false;
246249

247250
SetForceCharacterTeam(ClientID, Team);
248251

@@ -654,9 +657,13 @@ void CGameTeams::OnCharacterDeath(int ClientID, int Weapon)
654657
char aBuf[512];
655658
str_format(aBuf, sizeof(aBuf), "Everyone in your locked team was killed because '%s' %s.", Server()->ClientName(ClientID), Weapon == WEAPON_SELF ? "killed" : "died");
656659

660+
m_Practice[Team] = false;
661+
657662
for(int i = 0; i < MAX_CLIENTS; i++)
658663
if(m_Core.Team(i) == Team && GameServer()->m_apPlayers[i])
659664
{
665+
GameServer()->m_apPlayers[i]->m_VotedForPractice = false;
666+
660667
if(i != ClientID)
661668
{
662669
GameServer()->m_apPlayers[i]->KillCharacter(WEAPON_SELF);
@@ -716,4 +723,6 @@ void CGameTeams::KillSavedTeam(int Team)
716723
// unlock team when last player leaves
717724
SetTeamLock(Team, false);
718725
ResetInvited(Team);
726+
727+
m_Practice[Team] = false;
719728
}

src/game/variables.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ MACRO_CONFIG_INT(SvTeleportHoldHook, sv_teleport_hold_hook, 0, 0, 1, CFGFLAG_SER
152152
MACRO_CONFIG_INT(SvTeleportLoseWeapons, sv_teleport_lose_weapons, 0, 0, 1, CFGFLAG_SERVER|CFGFLAG_GAME, "Lose weapons when teleported (useful for some race maps)")
153153
MACRO_CONFIG_INT(SvRescue, sv_rescue, 0, 0, 1, CFGFLAG_SERVER, "Allow /rescue command so players can teleport themselves out of freeze")
154154
MACRO_CONFIG_INT(SvRescueDelay, sv_rescue_delay, 1, 0, 1000, CFGFLAG_SERVER, "Number of seconds between two rescues")
155+
MACRO_CONFIG_INT(SvPractice, sv_practice, 1, 0, 1, CFGFLAG_SERVER, "Enable practice mode for teams. Means you can use /rescue, but in turn your rank doesn't count.", AUTHED_ADMIN)
155156
MACRO_CONFIG_INT(SvJoinVoteDelay, sv_join_vote_delay, 300, 0, 1000, CFGFLAG_SERVER, "Add a delay before recently joined players can call any vote or participate in a kick/spec vote (in seconds)")
156157
MACRO_CONFIG_INT(SvSpectatorSlots, sv_spectator_slots, 0, 0, 64, CFGFLAG_SERVER, "Number of slots to reserve for spectators")
157158
MACRO_CONFIG_INT(SvVotesPerTick, sv_votes_per_tick, 5, 1, 15, CFGFLAG_SERVER, "Number of vote options being sent per tick")

0 commit comments

Comments
 (0)