mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Merge #5382
5382: let lasers bounce with zero energy for one tick r=def- a=C0D3D3V fixes #5380 ## Checklist - [x] Tested the change ingame - [ ] Provided screenshots if it is a visual change - [ ] Tested in combination with possibly related configuration options - [ ] Written a unit test if it works standalone, system.c especially - [x] Considered possible null pointers and out of bounds array indexing - [x] FIXES physics to old physics - [x] Tested the change with [ASan+UBSan or valgrind's memcheck](https://github.com/ddnet/ddnet/#using-addresssanitizer--undefinedbehavioursanitizer-or-valgrinds-memcheck) (optional) Co-authored-by: c0d3d3v <c0d3d3v@mag-keinen-spam.de>
This commit is contained in:
commit
2f08fcd469
|
@ -20,6 +20,7 @@ CLaser::CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEner
|
|||
m_EvalTick = 0;
|
||||
m_WasTele = false;
|
||||
m_Type = Type;
|
||||
m_ZeroEnergyBounceInLastTick = false;
|
||||
m_TuneZone = GameWorld()->m_WorldConfig.m_UseTuneZones ? Collision()->IsTune(Collision()->GetMapIndex(m_Pos)) : 0;
|
||||
GameWorld()->InsertEntity(this);
|
||||
DoBounce();
|
||||
|
@ -137,10 +138,15 @@ void CLaser::DoBounce()
|
|||
|
||||
const float Distance = distance(m_From, m_Pos);
|
||||
// Prevent infinite bounces
|
||||
if(Distance == 0.0f)
|
||||
if(Distance == 0.0f && m_ZeroEnergyBounceInLastTick)
|
||||
{
|
||||
m_Energy = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Energy -= Distance + GetTuning(m_TuneZone)->m_LaserBounceCost;
|
||||
}
|
||||
m_ZeroEnergyBounceInLastTick = Distance == 0.0f;
|
||||
|
||||
m_Bounces++;
|
||||
m_WasTele = false;
|
||||
|
|
|
@ -34,6 +34,7 @@ private:
|
|||
int m_Bounces;
|
||||
int m_EvalTick;
|
||||
int m_Owner;
|
||||
int m_ZeroEnergyBounceInLastTick;
|
||||
|
||||
// DDRace
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ CLaser::CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEner
|
|||
m_Type = Type;
|
||||
m_TeleportCancelled = false;
|
||||
m_IsBlueTeleport = false;
|
||||
m_ZeroEnergyBounceInLastTick = false;
|
||||
m_TuneZone = GameServer()->Collision()->IsTune(GameServer()->Collision()->GetMapIndex(m_Pos));
|
||||
CCharacter *pOwnerChar = GameServer()->GetPlayerChar(m_Owner);
|
||||
m_TeamMask = pOwnerChar ? pOwnerChar->TeamMask() : 0;
|
||||
|
@ -150,12 +151,19 @@ void CLaser::DoBounce()
|
|||
|
||||
const float Distance = distance(m_From, m_Pos);
|
||||
// Prevent infinite bounces
|
||||
if(Distance == 0.0f)
|
||||
if(Distance == 0.0f && m_ZeroEnergyBounceInLastTick)
|
||||
{
|
||||
m_Energy = -1;
|
||||
}
|
||||
else if(!m_TuneZone)
|
||||
{
|
||||
m_Energy -= Distance + GameServer()->Tuning()->m_LaserBounceCost;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Energy -= distance(m_From, m_Pos) + GameServer()->TuningList()[m_TuneZone].m_LaserBounceCost;
|
||||
}
|
||||
m_ZeroEnergyBounceInLastTick = Distance == 0.0f;
|
||||
|
||||
CGameControllerDDRace *pControllerDDRace = (CGameControllerDDRace *)GameServer()->m_pController;
|
||||
if(Res == TILE_TELEINWEAPON && !pControllerDDRace->m_TeleOuts[z - 1].empty())
|
||||
|
|
|
@ -30,6 +30,7 @@ private:
|
|||
int m_EvalTick;
|
||||
int m_Owner;
|
||||
int m_TeamMask;
|
||||
int m_ZeroEnergyBounceInLastTick;
|
||||
|
||||
// DDRace
|
||||
|
||||
|
|
Loading…
Reference in a new issue