summaryrefslogtreecommitdiffstats
path: root/src/Mobs
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@hotmail.co.uk>2014-01-25 20:02:13 +0100
committerTiger Wang <ziwei.tiger@hotmail.co.uk>2014-01-25 20:02:13 +0100
commit7468ba0f107ed01275f346c87ff5bb265dbbff3d (patch)
tree5c1c2563b5e95bfbfb999dee891150b99369f926 /src/Mobs
parentAttack() is no longer always called (diff)
downloadcuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.tar
cuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.tar.gz
cuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.tar.bz2
cuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.tar.lz
cuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.tar.xz
cuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.tar.zst
cuberite-7468ba0f107ed01275f346c87ff5bb265dbbff3d.zip
Diffstat (limited to 'src/Mobs')
-rw-r--r--src/Mobs/Monster.cpp31
-rw-r--r--src/Mobs/Monster.h8
2 files changed, 33 insertions, 6 deletions
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index 9ba18f4d1..42c7d2899 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -82,6 +82,7 @@ cMonster::cMonster(const AString & a_ConfigName, eType a_MobType, const AString
, m_AttackRange(2)
, m_AttackInterval(0)
, m_BurnsInDaylight(false)
+ , m_LastGroundHeight(POSY_TOINT)
{
if (!a_ConfigName.empty())
{
@@ -113,7 +114,7 @@ void cMonster::TickPathFinding()
std::vector<Vector3d> m_PotentialCoordinates;
m_TraversedCoordinates.push_back(Vector3i(PosX, PosY, PosZ));
- static const struct // Define which directions the torch can power
+ static const struct // Define which directions to try to move to
{
int x, z;
} gCrossCoords[] =
@@ -261,9 +262,9 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
{
if (m_bOnGround)
{
- int NextHeight = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
+ m_Destination.y = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
- if (DoesPosYRequireJump(NextHeight))
+ if (DoesPosYRequireJump(m_Destination.y))
{
m_bOnGround = false;
AddPosY(1.5); // Jump!!
@@ -298,10 +299,11 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
}
}
- if (ReachedFinalDestination())
+ if (ReachedFinalDestination() && (m_Target != NULL))
Attack(a_Dt);
SetPitchAndYawFromDestination();
+ HandleFalling();
switch (m_EMState)
{
@@ -369,6 +371,27 @@ void cMonster::SetPitchAndYawFromDestination()
+void cMonster::HandleFalling()
+{
+ if (m_bOnGround)
+ {
+ int Damage = (m_LastGroundHeight - POSY_TOINT) - 3;
+
+ if (Damage > 0)
+ {
+ TakeDamage(dtFalling, NULL, Damage, Damage, 0);
+
+ // Fall particles
+ GetWorld()->BroadcastSoundParticleEffect(2006, POSX_TOINT, POSY_TOINT - 1, POSZ_TOINT, Damage /* Used as particle effect speed modifier */);
+ }
+
+ m_LastGroundHeight = (int)floor(GetPosY());
+ }
+}
+
+
+
+
int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
{
int PosY = (int)floor(GetPosY());
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index d04cb8941..1dd302cdc 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -199,9 +199,13 @@ protected:
/** Sets the body yaw and head yaw/pitch based on next/ultimate destinations */
void SetPitchAndYawFromDestination(void);
- /* ===========================*/
+ /* =========================== */
+ /* ========= FALLING ========= */
-
+ virtual void HandleFalling(void);
+ int m_LastGroundHeight;
+
+ /* =========================== */
float m_IdleInterval;
float m_DestroyTimer;