Skip to content

Commit 9e376be

Browse files
authored
Merge pull request ddnet#8959 from Matodor/pr_character_tune_zone_override
Allow custom mods override client prediction tune zone (per-player)
2 parents 76ac425 + d0c88ca commit 9e376be

File tree

8 files changed

+46
-28
lines changed

8 files changed

+46
-28
lines changed

datasrc/network.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@
259259
# New data fields for improved target accuracy
260260
NetIntAny("m_TargetX", 0),
261261
NetIntAny("m_TargetY", 0),
262+
NetIntRange("m_TuneZoneOverride", -1, 'NUM_TUNEZONES-1', -1),
262263
], validate_size=False),
263264

264265
NetObjectEx("DDNetPlayer", "player@netobj.ddnet.tw", [

src/engine/shared/protocol.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ enum
131131
VERSION_DDNET_RECONNECT = 18090,
132132
};
133133

134+
enum
135+
{
136+
NUM_TUNEZONES = 256,
137+
};
138+
134139
typedef std::bitset<MAX_CLIENTS> CClientMask;
135140

136141
#endif

src/game/client/components/debughud.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ void CDebugHud::RenderNetCorrections()
6363
str_format(aBuf, sizeof(aBuf), "%d", pCharacter == nullptr ? -1 : pCharacter->m_TeleCheckpoint);
6464
RenderRow("Checkpoint:", aBuf);
6565

66-
str_format(aBuf, sizeof(aBuf), "%d", pCharacter == nullptr ? -1 : pCharacter->m_TuneZone);
67-
RenderRow("Tune zone:", aBuf);
66+
str_format(aBuf, sizeof(aBuf), "%d / %d", pCharacter == nullptr ? -1 : pCharacter->GetPureTuneZone(), pCharacter == nullptr ? -1 : pCharacter->GetOverriddenTuneZone());
67+
RenderRow("Tune zone (pure / override):", aBuf);
6868

6969
str_format(aBuf, sizeof(aBuf), "%.2f", m_pClient->m_Snap.m_pLocalCharacter->m_X / 32.0f);
7070
RenderRow("Pos.x:", aBuf);
@@ -96,7 +96,7 @@ void CDebugHud::RenderTuning()
9696

9797
const CTuningParams StandardTuning;
9898
const CTuningParams *pGlobalTuning = m_pClient->GetTuning(0);
99-
const CTuningParams *pZoneTuning = !m_pClient->m_GameWorld.m_WorldConfig.m_UseTuneZones || pCharacter == nullptr ? nullptr : m_pClient->GetTuning(pCharacter->m_TuneZone);
99+
const CTuningParams *pZoneTuning = !m_pClient->m_GameWorld.m_WorldConfig.m_UseTuneZones || pCharacter == nullptr ? nullptr : m_pClient->GetTuning(pCharacter->GetOverriddenTuneZone());
100100
const CTuningParams *pActiveTuning = pZoneTuning == nullptr ? pGlobalTuning : pZoneTuning;
101101

102102
const float Height = 300.0f;

src/game/client/gameclient.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2971,7 +2971,11 @@ void CGameClient::UpdatePrediction()
29712971

29722972
if(m_GameWorld.m_WorldConfig.m_UseTuneZones)
29732973
{
2974-
int TuneZone = Collision()->IsTune(Collision()->GetMapIndex(LocalCharPos));
2974+
int TuneZone =
2975+
m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_HasExtendedData &&
2976+
m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_ExtendedData.m_TuneZoneOverride != -1 ?
2977+
m_Snap.m_aCharacters[m_Snap.m_LocalClientId].m_ExtendedData.m_TuneZoneOverride :
2978+
Collision()->IsTune(Collision()->GetMapIndex(LocalCharPos));
29752979

29762980
if(TuneZone != m_aLocalTuneZone[g_Config.m_ClDummy])
29772981
{

src/game/client/gameclient.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -851,10 +851,6 @@ class CGameClient : public IGameClient
851851
CCharOrder m_CharOrder;
852852
int m_aSwitchStateTeam[NUM_DUMMIES];
853853

854-
enum
855-
{
856-
NUM_TUNEZONES = 256
857-
};
858854
void LoadMapSettings();
859855
CTuningParams m_aTuningList[NUM_TUNEZONES];
860856
CTuningParams *TuningList() { return m_aTuningList; }

src/game/client/prediction/entities/character.cpp

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,8 @@ void CCharacter::HandleJetpack()
8484
{
8585
if(m_Core.m_Jetpack)
8686
{
87-
float Strength = GetTuning(m_TuneZone)->m_JetpackStrength;
88-
if(!m_TuneZone)
89-
Strength = m_LastJetpackStrength;
87+
int TuneZone = GetOverriddenTuneZone();
88+
float Strength = TuneZone ? GetTuning(TuneZone)->m_JetpackStrength : m_LastJetpackStrength;
9089
TakeDamage(Direction * -1.0f * (Strength / 100.0f / 6.11f), 0, GetCid(), m_Core.m_ActiveWeapon);
9190
}
9291
}
@@ -130,7 +129,7 @@ void CCharacter::HandleNinja()
130129
// Set velocity
131130
m_Core.m_Vel = m_Core.m_Ninja.m_ActivationDir * g_pData->m_Weapons.m_Ninja.m_Velocity;
132131
vec2 OldPos = m_Pos;
133-
Collision()->MoveBox(&m_Core.m_Pos, &m_Core.m_Vel, vec2(m_ProximityRadius, m_ProximityRadius), vec2(GetTuning(m_TuneZone)->m_GroundElasticityX, GetTuning(m_TuneZone)->m_GroundElasticityY));
132+
Collision()->MoveBox(&m_Core.m_Pos, &m_Core.m_Vel, vec2(m_ProximityRadius, m_ProximityRadius), vec2(GetTuning(GetOverriddenTuneZone())->m_GroundElasticityX, GetTuning(GetOverriddenTuneZone())->m_GroundElasticityY));
134133

135134
// reset velocity so the client doesn't predict stuff
136135
m_Core.m_Vel = vec2(0.f, 0.f);
@@ -323,7 +322,7 @@ void CCharacter::FireWeapon()
323322
else
324323
Dir = vec2(0.f, -1.f);
325324

326-
float Strength = GetTuning(m_TuneZone)->m_HammerStrength;
325+
float Strength = GetTuning(GetOverriddenTuneZone())->m_HammerStrength;
327326

328327
vec2 Temp = pTarget->m_Core.m_Vel + normalize(Dir + vec2(0.f, -1.1f)) * 10.0f;
329328
Temp = ClampVel(pTarget->m_MoveRestrictions, Temp);
@@ -357,7 +356,7 @@ void CCharacter::FireWeapon()
357356
// if we Hit anything, we have to wait for the reload
358357
if(Hits)
359358
{
360-
float FireDelay = GetTuning(m_TuneZone)->m_HammerHitFireDelay;
359+
float FireDelay = GetTuning(GetOverriddenTuneZone())->m_HammerHitFireDelay;
361360
m_ReloadTimer = FireDelay * GameWorld()->GameTickSpeed() / 1000;
362361
}
363362
}
@@ -367,7 +366,7 @@ void CCharacter::FireWeapon()
367366
{
368367
if(!m_Core.m_Jetpack)
369368
{
370-
int Lifetime = (int)(GameWorld()->GameTickSpeed() * GetTuning(m_TuneZone)->m_GunLifetime);
369+
int Lifetime = (int)(GameWorld()->GameTickSpeed() * GetTuning(GetOverriddenTuneZone())->m_GunLifetime);
371370

372371
new CProjectile(
373372
GameWorld(),
@@ -412,7 +411,7 @@ void CCharacter::FireWeapon()
412411
}
413412
else if(GameWorld()->m_WorldConfig.m_IsDDRace)
414413
{
415-
float LaserReach = GetTuning(m_TuneZone)->m_LaserReach;
414+
float LaserReach = GetTuning(GetOverriddenTuneZone())->m_LaserReach;
416415

417416
new CLaser(GameWorld(), m_Pos, Direction, LaserReach, GetCid(), WEAPON_SHOTGUN);
418417
}
@@ -421,7 +420,7 @@ void CCharacter::FireWeapon()
421420

422421
case WEAPON_GRENADE:
423422
{
424-
int Lifetime = (int)(GameWorld()->GameTickSpeed() * GetTuning(m_TuneZone)->m_GrenadeLifetime);
423+
int Lifetime = (int)(GameWorld()->GameTickSpeed() * GetTuning(GetOverriddenTuneZone())->m_GrenadeLifetime);
425424

426425
new CProjectile(
427426
GameWorld(),
@@ -439,7 +438,7 @@ void CCharacter::FireWeapon()
439438

440439
case WEAPON_LASER:
441440
{
442-
float LaserReach = GetTuning(m_TuneZone)->m_LaserReach;
441+
float LaserReach = GetTuning(GetOverriddenTuneZone())->m_LaserReach;
443442

444443
new CLaser(GameWorld(), m_Pos, Direction, LaserReach, GetCid(), WEAPON_LASER);
445444
}
@@ -462,7 +461,7 @@ void CCharacter::FireWeapon()
462461
if(!m_ReloadTimer)
463462
{
464463
float FireDelay;
465-
GetTuning(m_TuneZone)->Get(38 + m_Core.m_ActiveWeapon, &FireDelay);
464+
GetTuning(GetOverriddenTuneZone())->Get(38 + m_Core.m_ActiveWeapon, &FireDelay);
466465

467466
m_ReloadTimer = FireDelay * GameWorld()->GameTickSpeed() / 1000;
468467
}
@@ -952,8 +951,8 @@ void CCharacter::HandleTuneLayer()
952951
SetTuneZone(GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(CurrentIndex) : 0);
953952

954953
if(m_IsLocal)
955-
GameWorld()->m_Core.m_aTuning[g_Config.m_ClDummy] = *GetTuning(m_TuneZone); // throw tunings (from specific zone if in a tunezone) into gamecore if the character is local
956-
m_Core.m_Tuning = *GetTuning(m_TuneZone);
954+
GameWorld()->m_Core.m_aTuning[g_Config.m_ClDummy] = *GetTuning(GetOverriddenTuneZone()); // throw tunings (from specific zone if in a tunezone) into gamecore if the character is local
955+
m_Core.m_Tuning = *GetTuning(GetOverriddenTuneZone());
957956
}
958957

959958
void CCharacter::DDRaceTick()
@@ -1240,6 +1239,7 @@ void CCharacter::Read(CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtende
12401239

12411240
m_TeleCheckpoint = pExtended->m_TeleCheckpoint;
12421241
m_StrongWeakId = pExtended->m_StrongWeakId;
1242+
m_TuneZoneOverride = pExtended->m_TuneZoneOverride;
12431243

12441244
const bool Ninja = (pExtended->m_Flags & CHARACTERFLAG_WEAPON_NINJA) != 0;
12451245
if(Ninja && m_Core.m_ActiveWeapon != WEAPON_NINJA)
@@ -1341,6 +1341,8 @@ void CCharacter::Read(CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtende
13411341
m_Core.m_DeepFrozen = false;
13421342
UnFreeze();
13431343
}
1344+
1345+
m_TuneZoneOverride = -1;
13441346
}
13451347

13461348
vec2 PosBefore = m_Pos;
@@ -1394,7 +1396,7 @@ void CCharacter::Read(CNetObj_Character *pChar, CNetObj_DDNetCharacter *pExtende
13941396
if(maximum(m_LastTuneZoneTick, m_LastWeaponSwitchTick) + GameWorld()->GameTickSpeed() < GameWorld()->GameTick())
13951397
{
13961398
float FireDelay;
1397-
GetTuning(m_TuneZone)->Get(38 + m_Core.m_ActiveWeapon, &FireDelay);
1399+
GetTuning(GetOverriddenTuneZone())->Get(38 + m_Core.m_ActiveWeapon, &FireDelay);
13981400
const int FireDelayTicks = FireDelay * GameWorld()->GameTickSpeed() / 1000;
13991401
m_ReloadTimer = maximum(0, m_AttackTick + FireDelayTicks - GameWorld()->GameTick());
14001402
}
@@ -1425,6 +1427,16 @@ void CCharacter::SetTuneZone(int Zone)
14251427
m_LastTuneZoneTick = GameWorld()->GameTick();
14261428
}
14271429

1430+
int CCharacter::GetOverriddenTuneZone() const
1431+
{
1432+
return m_TuneZoneOverride < 0 ? m_TuneZone : m_TuneZoneOverride;
1433+
}
1434+
1435+
int CCharacter::GetPureTuneZone() const
1436+
{
1437+
return m_TuneZone;
1438+
}
1439+
14281440
CCharacter::~CCharacter()
14291441
{
14301442
if(GameWorld())

src/game/client/prediction/entities/character.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ class CCharacter : public CEntity
7575
bool m_NinjaJetpack;
7676
int m_FreezeTime;
7777
bool m_FrozenLastTick;
78-
int m_TuneZone;
7978
vec2 m_PrevPos;
8079
vec2 m_PrevPrevPos;
8180
int m_TeleCheckpoint;
@@ -127,6 +126,8 @@ class CCharacter : public CEntity
127126
bool Match(CCharacter *pChar) const;
128127
void ResetPrediction();
129128
void SetTuneZone(int Zone);
129+
int GetOverriddenTuneZone() const;
130+
int GetPureTuneZone() const;
130131

131132
bool HammerHitDisabled() { return m_Core.m_HammerHitDisabled; }
132133
bool ShotgunHitDisabled() { return m_Core.m_ShotgunHitDisabled; }
@@ -159,6 +160,10 @@ class CCharacter : public CEntity
159160

160161
int m_NumInputs;
161162

163+
// tune
164+
int m_TuneZone;
165+
int m_TuneZoneOverride;
166+
162167
// the player core for the physics
163168
CCharacterCore m_Core;
164169

src/game/server/gamecontext.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@
4141
4242
*/
4343

44-
enum
45-
{
46-
NUM_TUNEZONES = 256
47-
};
48-
4944
class CCharacter;
5045
class IConfigManager;
5146
class CConfig;

0 commit comments

Comments
 (0)