mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 09:34:19 +00:00
fix
This commit is contained in:
parent
0a91fef8c8
commit
be3cfe88e6
|
@ -1514,113 +1514,112 @@ void CGameClient::OnPredict()
|
||||||
bool NewPresses = false;
|
bool NewPresses = false;
|
||||||
|
|
||||||
// handle weapons
|
// handle weapons
|
||||||
if(ReloadTimer)
|
|
||||||
break;
|
|
||||||
if(!World.m_apCharacters[m_Snap.m_LocalClientID])
|
|
||||||
break;
|
|
||||||
if(!pInput || !pPrevInput)
|
|
||||||
break;
|
|
||||||
bool FullAuto = false;
|
|
||||||
if(Local->m_ActiveWeapon == WEAPON_GRENADE || Local->m_ActiveWeapon == WEAPON_SHOTGUN || Local->m_ActiveWeapon == WEAPON_RIFLE)
|
|
||||||
FullAuto = true;
|
|
||||||
bool WillFire = false;
|
|
||||||
if(CountInput(PrevInput.m_Fire, Input.m_Fire).m_Presses)
|
|
||||||
{
|
|
||||||
WillFire = true;
|
|
||||||
NewPresses = true;
|
|
||||||
}
|
|
||||||
if(FullAuto && (Input.m_Fire & 1))
|
|
||||||
WillFire = true;
|
|
||||||
if(!WillFire)
|
|
||||||
break;
|
|
||||||
if(!IsRace(&Info) && !m_Snap.m_pLocalCharacter->m_AmmoCount && Local->m_ActiveWeapon != WEAPON_HAMMER)
|
|
||||||
break;
|
|
||||||
int ExpectedStartTick = Tick - 1;
|
|
||||||
ReloadTimer = g_pData->m_Weapons.m_aId[Local->m_ActiveWeapon].m_Firedelay * SERVER_TICK_SPEED / 1000;
|
|
||||||
bool DirectInput = Client()->InputExists(Tick);
|
|
||||||
if(!DirectInput)
|
|
||||||
{
|
|
||||||
ReloadTimer++;
|
|
||||||
ExpectedStartTick++;
|
|
||||||
}
|
|
||||||
switch(Local->m_ActiveWeapon)
|
|
||||||
{
|
|
||||||
case WEAPON_RIFLE:
|
|
||||||
case WEAPON_SHOTGUN:
|
|
||||||
case WEAPON_GUN:
|
|
||||||
{
|
|
||||||
WeaponFired = true;
|
|
||||||
} break;
|
|
||||||
case WEAPON_GRENADE:
|
|
||||||
{
|
|
||||||
if(NumProjectiles >= MaxProjectiles)
|
|
||||||
break;
|
|
||||||
PredictedProjectiles[NumProjectiles].Init(
|
|
||||||
this, &World, Collision(),
|
|
||||||
Direction, //StartDir
|
|
||||||
ProjStartPos, //StartPos
|
|
||||||
ExpectedStartTick, //StartTick
|
|
||||||
WEAPON_GRENADE, //Type
|
|
||||||
m_Snap.m_LocalClientID, //Owner
|
|
||||||
WEAPON_GRENADE, //Weapon
|
|
||||||
1, 0, 0, 1); //Explosive, Bouncing, Freeze, ExtraInfo
|
|
||||||
NumProjectiles++;
|
|
||||||
WeaponFired = true;
|
|
||||||
} break;
|
|
||||||
case WEAPON_HAMMER:
|
|
||||||
{
|
|
||||||
vec2 ProjPos = ProjStartPos;
|
|
||||||
float Radius = ProximityRadius*0.5f;
|
|
||||||
|
|
||||||
int Hits = 0;
|
if(!ReloadTimer && World.m_apCharacters[m_Snap.m_LocalClientID] && (pInput && pPrevInput))
|
||||||
bool OwnerCanProbablyHitOthers = (m_Tuning[g_Config.m_ClDummy].m_PlayerCollision || m_Tuning[g_Config.m_ClDummy].m_PlayerHooking);
|
{
|
||||||
if(!OwnerCanProbablyHitOthers)
|
bool FullAuto = false;
|
||||||
break;
|
if(Local->m_ActiveWeapon == WEAPON_GRENADE || Local->m_ActiveWeapon == WEAPON_SHOTGUN || Local->m_ActiveWeapon == WEAPON_RIFLE)
|
||||||
for(int i = 0; i < MAX_CLIENTS; i++)
|
FullAuto = true;
|
||||||
{
|
|
||||||
if(!World.m_apCharacters[i])
|
|
||||||
continue;
|
|
||||||
if(i == m_Snap.m_LocalClientID)
|
|
||||||
continue;
|
|
||||||
if(distance(World.m_apCharacters[i]->m_Pos, ProjPos) >= Radius + ProximityRadius)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
CCharacterCore *pTarget = World.m_apCharacters[i];
|
bool WillFire = false;
|
||||||
|
if(CountInput(PrevInput.m_Fire, Input.m_Fire).m_Presses)
|
||||||
|
{
|
||||||
|
WillFire = true;
|
||||||
|
NewPresses = true;
|
||||||
|
}
|
||||||
|
|
||||||
if(m_aClients[i].m_Active && !m_Teams.CanCollide(i, m_Snap.m_LocalClientID))
|
if(FullAuto && (Input.m_Fire & 1))
|
||||||
continue;
|
WillFire = true;
|
||||||
|
|
||||||
vec2 Dir;
|
if(WillFire && ((IsRace(&Info) || m_Snap.m_pLocalCharacter->m_AmmoCount) || Local->m_ActiveWeapon == WEAPON_HAMMER)) {
|
||||||
if(length(pTarget->m_Pos - Pos) > 0.0f)
|
int ExpectedStartTick = Tick - 1;
|
||||||
Dir = normalize(pTarget->m_Pos - Pos);
|
ReloadTimer = g_pData->m_Weapons.m_aId[Local->m_ActiveWeapon].m_Firedelay * SERVER_TICK_SPEED / 1000;
|
||||||
else
|
bool DirectInput = Client()->InputExists(Tick);
|
||||||
Dir = vec2(0.f, -1.f);
|
if(!DirectInput)
|
||||||
|
{
|
||||||
|
ReloadTimer++;
|
||||||
|
ExpectedStartTick++;
|
||||||
|
}
|
||||||
|
switch(Local->m_ActiveWeapon)
|
||||||
|
{
|
||||||
|
case WEAPON_RIFLE:
|
||||||
|
case WEAPON_SHOTGUN:
|
||||||
|
case WEAPON_GUN:
|
||||||
|
{
|
||||||
|
WeaponFired = true;
|
||||||
|
} break;
|
||||||
|
case WEAPON_GRENADE:
|
||||||
|
{
|
||||||
|
if(NumProjectiles >= MaxProjectiles)
|
||||||
|
break;
|
||||||
|
PredictedProjectiles[NumProjectiles].Init(
|
||||||
|
this, &World, Collision(),
|
||||||
|
Direction, //StartDir
|
||||||
|
ProjStartPos, //StartPos
|
||||||
|
ExpectedStartTick, //StartTick
|
||||||
|
WEAPON_GRENADE, //Type
|
||||||
|
m_Snap.m_LocalClientID, //Owner
|
||||||
|
WEAPON_GRENADE, //Weapon
|
||||||
|
1, 0, 0, 1); //Explosive, Bouncing, Freeze, ExtraInfo
|
||||||
|
NumProjectiles++;
|
||||||
|
WeaponFired = true;
|
||||||
|
} break;
|
||||||
|
case WEAPON_HAMMER:
|
||||||
|
{
|
||||||
|
vec2 ProjPos = ProjStartPos;
|
||||||
|
float Radius = ProximityRadius*0.5f;
|
||||||
|
|
||||||
float Strength;
|
int Hits = 0;
|
||||||
Strength = World.m_Tuning[g_Config.m_ClDummy].m_HammerStrength;
|
bool OwnerCanProbablyHitOthers = (m_Tuning[g_Config.m_ClDummy].m_PlayerCollision || m_Tuning[g_Config.m_ClDummy].m_PlayerHooking);
|
||||||
|
if(!OwnerCanProbablyHitOthers)
|
||||||
|
break;
|
||||||
|
for(int i = 0; i < MAX_CLIENTS; i++)
|
||||||
|
{
|
||||||
|
if(!World.m_apCharacters[i])
|
||||||
|
continue;
|
||||||
|
if(i == m_Snap.m_LocalClientID)
|
||||||
|
continue;
|
||||||
|
if(distance(World.m_apCharacters[i]->m_Pos, ProjPos) >= Radius + ProximityRadius)
|
||||||
|
continue;
|
||||||
|
|
||||||
vec2 Temp = pTarget->m_Vel + normalize(Dir + vec2(0.f, -1.1f)) * 10.0f;
|
CCharacterCore *pTarget = World.m_apCharacters[i];
|
||||||
|
|
||||||
pTarget->LimitForce(&Temp);
|
if(m_aClients[i].m_Active && !m_Teams.CanCollide(i, m_Snap.m_LocalClientID))
|
||||||
|
continue;
|
||||||
|
|
||||||
Temp -= pTarget->m_Vel;
|
vec2 Dir;
|
||||||
pTarget->ApplyForce((vec2(0.f, -1.0f) + Temp) * Strength);
|
if(length(pTarget->m_Pos - Pos) > 0.0f)
|
||||||
Hits++;
|
Dir = normalize(pTarget->m_Pos - Pos);
|
||||||
}
|
else
|
||||||
// if we Hit anything, we have to wait for the reload
|
Dir = vec2(0.f, -1.f);
|
||||||
if(Hits)
|
|
||||||
{
|
float Strength;
|
||||||
ReloadTimer = SERVER_TICK_SPEED/3;
|
Strength = World.m_Tuning[g_Config.m_ClDummy].m_HammerStrength;
|
||||||
WeaponFired = true;
|
|
||||||
}
|
vec2 Temp = pTarget->m_Vel + normalize(Dir + vec2(0.f, -1.1f)) * 10.0f;
|
||||||
} break;
|
|
||||||
}
|
pTarget->LimitForce(&Temp);
|
||||||
if(!ReloadTimer)
|
|
||||||
{
|
Temp -= pTarget->m_Vel;
|
||||||
ReloadTimer = g_pData->m_Weapons.m_aId[Local->m_ActiveWeapon].m_Firedelay * SERVER_TICK_SPEED / 1000;
|
pTarget->ApplyForce((vec2(0.f, -1.0f) + Temp) * Strength);
|
||||||
if(!DirectInput)
|
Hits++;
|
||||||
ReloadTimer++;
|
}
|
||||||
}
|
// if we Hit anything, we have to wait for the reload
|
||||||
|
if(Hits)
|
||||||
|
{
|
||||||
|
ReloadTimer = SERVER_TICK_SPEED/3;
|
||||||
|
WeaponFired = true;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
if(!ReloadTimer)
|
||||||
|
{
|
||||||
|
ReloadTimer = g_pData->m_Weapons.m_aId[Local->m_ActiveWeapon].m_Firedelay * SERVER_TICK_SPEED / 1000;
|
||||||
|
if(!DirectInput)
|
||||||
|
ReloadTimer++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(ReloadTimer)
|
if(ReloadTimer)
|
||||||
ReloadTimer--;
|
ReloadTimer--;
|
||||||
|
@ -1679,7 +1678,7 @@ void CGameClient::OnPredict()
|
||||||
{
|
{
|
||||||
if(!World.m_apCharacters[c])
|
if(!World.m_apCharacters[c])
|
||||||
continue;
|
continue;
|
||||||
World.m_apCharacters[c]->Tick(m_Snap.m_LocalClientID == c, true);
|
World.m_apCharacters[c]->Tick(m_Snap.m_LocalClientID == c, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue