summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandrew <xdotftw@gmail.com>2014-03-25 10:13:27 +0100
committerandrew <xdotftw@gmail.com>2014-03-25 10:13:27 +0100
commitba4216641120ec2f49464ed0b136af3198d48f89 (patch)
tree727d0a45024b8c25152379d7c5e28339c40006ff
parentProtocol: Wither metadata (diff)
downloadcuberite-ba4216641120ec2f49464ed0b136af3198d48f89.tar
cuberite-ba4216641120ec2f49464ed0b136af3198d48f89.tar.gz
cuberite-ba4216641120ec2f49464ed0b136af3198d48f89.tar.bz2
cuberite-ba4216641120ec2f49464ed0b136af3198d48f89.tar.lz
cuberite-ba4216641120ec2f49464ed0b136af3198d48f89.tar.xz
cuberite-ba4216641120ec2f49464ed0b136af3198d48f89.tar.zst
cuberite-ba4216641120ec2f49464ed0b136af3198d48f89.zip
-rw-r--r--src/Blocks/BlockMobHead.h25
-rw-r--r--src/Mobs/Wither.cpp14
-rw-r--r--src/Mobs/Wither.h1
3 files changed, 37 insertions, 3 deletions
diff --git a/src/Blocks/BlockMobHead.h b/src/Blocks/BlockMobHead.h
index 9935c2496..693240898 100644
--- a/src/Blocks/BlockMobHead.h
+++ b/src/Blocks/BlockMobHead.h
@@ -47,6 +47,15 @@ public:
void Reset(void) { m_IsWither = false; }
} CallbackA, CallbackB;
+
+ a_World->DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, CallbackA);
+
+ if (!CallbackA.IsWither())
+ {
+ return false;
+ }
+
+ CallbackA.Reset();
BLOCKTYPE BlockY1 = a_ChunkInterface.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ);
BLOCKTYPE BlockY2 = a_ChunkInterface.GetBlock(a_BlockX, a_BlockY - 2, a_BlockZ);
@@ -151,7 +160,21 @@ public:
World->DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, Callback);
a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, a_BlockMeta);
- TrySpawnWither(a_ChunkInterface, World, a_BlockX, a_BlockY, a_BlockZ);
+ static const Vector3i Coords[] =
+ {
+ Vector3i( 0, 0, 0),
+ Vector3i( 1, 0, 0),
+ Vector3i(-1, 0, 0),
+ Vector3i( 0, 0, 1),
+ Vector3i( 0, 0, -1),
+ };
+ for (size_t i = 0; i < ARRAYCOUNT(Coords); ++i)
+ {
+ if (TrySpawnWither(a_ChunkInterface, World, a_BlockX + Coords[i].x, a_BlockY, a_BlockZ + Coords[i].z))
+ {
+ break;
+ }
+ } // for i - Coords[]
}
} ;
diff --git a/src/Mobs/Wither.cpp b/src/Mobs/Wither.cpp
index 790f127f2..39dc6aab9 100644
--- a/src/Mobs/Wither.cpp
+++ b/src/Mobs/Wither.cpp
@@ -13,8 +13,6 @@ cWither::cWither(void) :
m_InvulnerableTicks(220)
{
SetMaxHealth(300);
-
- SetHealth(GetMaxHealth() / 3);
}
@@ -30,6 +28,18 @@ bool cWither::IsArmored(void) const
+bool cWither::Initialize(cWorld * a_World) override
+{
+ // Set health before BroadcastSpawnEntity()
+ SetHealth(GetMaxHealth() / 3);
+
+ return super::Initialize(a_World);
+}
+
+
+
+
+
void cWither::DoTakeDamage(TakeDamageInfo & a_TDI)
{
if (a_TDI.DamageType == dtDrowning)
diff --git a/src/Mobs/Wither.h b/src/Mobs/Wither.h
index 52666a190..bc78bfaad 100644
--- a/src/Mobs/Wither.h
+++ b/src/Mobs/Wither.h
@@ -25,6 +25,7 @@ public:
bool IsArmored(void) const;
// cEntity overrides
+ virtual bool Initialize(cWorld * a_World) override;
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void DoTakeDamage(TakeDamageInfo & a_TDI) override;
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;