Chicken eggs and ender pearls can hit entities.
Fixed warning by adding dedicated m_HasTeleported for fired arrows.
This commit is contained in:
parent
8fc45c5730
commit
ec9787bae2
@ -562,12 +562,12 @@ void cArrowEntity::Tick(float a_Dt, cChunk & a_Chunk)
|
|||||||
// We can afford to do this because xoft's algorithm for trajectory is near perfect, so things are pretty close anyway without sync
|
// We can afford to do this because xoft's algorithm for trajectory is near perfect, so things are pretty close anyway without sync
|
||||||
// Besides, this seems to be what the vanilla server does, note how arrows teleport half a second after they hit to the server position
|
// Besides, this seems to be what the vanilla server does, note how arrows teleport half a second after they hit to the server position
|
||||||
|
|
||||||
if (m_HitGroundTimer != -1) // Sent a teleport already, don't do again
|
if (!m_HasTeleported) // Sent a teleport already, don't do again
|
||||||
{
|
{
|
||||||
if (m_HitGroundTimer > 1000.f) // Send after a second, could be less, but just in case
|
if (m_HitGroundTimer > 1000.f) // Send after a second, could be less, but just in case
|
||||||
{
|
{
|
||||||
m_World->BroadcastTeleportEntity(*this);
|
m_World->BroadcastTeleportEntity(*this);
|
||||||
m_HitGroundTimer = -1;
|
m_HasTeleported = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -610,6 +610,32 @@ cThrownEggEntity::cThrownEggEntity(cEntity * a_Creator, double a_X, double a_Y,
|
|||||||
|
|
||||||
|
|
||||||
void cThrownEggEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace)
|
void cThrownEggEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace)
|
||||||
|
{
|
||||||
|
TryForChicken(a_HitPos);
|
||||||
|
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
|
||||||
|
{
|
||||||
|
int TotalDamage = 0;
|
||||||
|
// TODO: If entity is Ender Crystal, destroy it
|
||||||
|
|
||||||
|
TryForChicken(a_HitPos);
|
||||||
|
a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1);
|
||||||
|
|
||||||
|
Destroy(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownEggEntity::TryForChicken(const Vector3d & a_HitPos)
|
||||||
{
|
{
|
||||||
if (m_World->GetTickRandomNumber(7) == 1)
|
if (m_World->GetTickRandomNumber(7) == 1)
|
||||||
{
|
{
|
||||||
@ -622,7 +648,6 @@ void cThrownEggEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_H
|
|||||||
m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, cMonster::mtChicken);
|
m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, cMonster::mtChicken);
|
||||||
m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, cMonster::mtChicken);
|
m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, cMonster::mtChicken);
|
||||||
}
|
}
|
||||||
Destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -643,16 +668,40 @@ cThrownEnderPearlEntity::cThrownEnderPearlEntity(cEntity * a_Creator, double a_X
|
|||||||
|
|
||||||
|
|
||||||
void cThrownEnderPearlEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace)
|
void cThrownEnderPearlEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace)
|
||||||
|
{
|
||||||
|
// TODO: Tweak a_HitPos based on block face.
|
||||||
|
TeleportUser(a_HitPos);
|
||||||
|
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
|
||||||
|
{
|
||||||
|
int TotalDamage = 0;
|
||||||
|
// TODO: If entity is Ender Crystal, destroy it
|
||||||
|
|
||||||
|
TeleportUser(a_HitPos);
|
||||||
|
a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1);
|
||||||
|
|
||||||
|
Destroy(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cThrownEnderPearlEntity::TeleportUser(const Vector3d & a_HitPos)
|
||||||
{
|
{
|
||||||
// Teleport the creator here, make them take 5 damage:
|
// Teleport the creator here, make them take 5 damage:
|
||||||
if (m_Creator != NULL)
|
if (m_Creator != NULL)
|
||||||
{
|
{
|
||||||
// TODO: The coords might need some tweaking based on the block face
|
|
||||||
m_Creator->TeleportToCoords(a_HitPos.x + 0.5, a_HitPos.y + 1.7, a_HitPos.z + 0.5);
|
m_Creator->TeleportToCoords(a_HitPos.x + 0.5, a_HitPos.y + 1.7, a_HitPos.z + 0.5);
|
||||||
m_Creator->TakeDamage(dtEnderPearl, this, 5, 0);
|
m_Creator->TakeDamage(dtEnderPearl, this, 5, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -696,6 +745,7 @@ void cThrownSnowballEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d &
|
|||||||
TotalDamage = 1;
|
TotalDamage = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: If entity is Ender Crystal, destroy it
|
||||||
a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1);
|
a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1);
|
||||||
|
|
||||||
Destroy(true);
|
Destroy(true);
|
||||||
|
@ -166,6 +166,9 @@ protected:
|
|||||||
|
|
||||||
/// Timer for client arrow position confirmation via TeleportEntity
|
/// Timer for client arrow position confirmation via TeleportEntity
|
||||||
float m_HitGroundTimer;
|
float m_HitGroundTimer;
|
||||||
|
|
||||||
|
// Whether the arrow has already been teleported into the proper position in the ground.
|
||||||
|
bool m_HasTeleported;
|
||||||
|
|
||||||
/// If true, the arrow is in the process of being collected - don't go to anyone else
|
/// If true, the arrow is in the process of being collected - don't go to anyone else
|
||||||
bool m_bIsCollected;
|
bool m_bIsCollected;
|
||||||
@ -205,7 +208,10 @@ protected:
|
|||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||||
|
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
|
|
||||||
|
void TryForChicken(const Vector3d & a_HitPos);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
@ -233,6 +239,9 @@ protected:
|
|||||||
|
|
||||||
// cProjectileEntity overrides:
|
// cProjectileEntity overrides:
|
||||||
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override;
|
||||||
|
virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override;
|
||||||
|
|
||||||
|
void TeleportUser(const Vector3d & a_HitPos);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user