From 875c2557c30aa5254c2ec3f4062ec463418c7d09 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:01:15 +0200 Subject: Implemented the skeleton code for the beacon. There is no handling for the GUI. It can now check how big the pyramid is under the beacon. --- src/BlockEntities/BeaconEntity.cpp | 111 +++++++++++++++++++++++++++++++++++++ src/BlockEntities/BeaconEntity.h | 40 +++++++++++++ src/BlockEntities/BlockEntity.cpp | 2 + src/Chunk.cpp | 2 + 4 files changed, 155 insertions(+) create mode 100644 src/BlockEntities/BeaconEntity.cpp create mode 100644 src/BlockEntities/BeaconEntity.h (limited to 'src') diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp new file mode 100644 index 000000000..e5e890dbc --- /dev/null +++ b/src/BlockEntities/BeaconEntity.cpp @@ -0,0 +1,111 @@ + +#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules + +#include "BeaconEntity.h" +#include "../BlockArea.h" + + + + + +cBeaconEntity::cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) : + super(E_BLOCK_BEACON, a_BlockX, a_BlockY, a_BlockZ, a_World) +{ +} + + + + + +int cBeaconEntity::GetPyramidLevel() +{ + cBlockArea Area; + Area.Read( + m_World, + GetPosX() - 4, + GetPosX() + 4, + GetPosY() - 5, + GetPosY() - 1, + GetPosZ() - 4, + GetPosZ() + 4 + ); + + int Layer = 1; + int MiddleXZ = 4; + + for (int Y = Area.GetSizeY() - 1; Y > 0; Y--) + { + bool FullLayer = true; + for (int X = MiddleXZ - Layer; X <= (MiddleXZ + Layer); X++) + { + for (int Z = MiddleXZ - Layer; Z <= (MiddleXZ + Layer); Z++) + { + if (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z))) + { + FullLayer = false; + } + } + } + if (!FullLayer) + { + break; + } + else + { + Layer++; + } + } + + return Layer; +} + + + + + +bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType) +{ + switch(a_BlockType) + { + case E_BLOCK_DIAMOND_BLOCK: + case E_BLOCK_GOLD_BLOCK: + case E_BLOCK_IRON_BLOCK: + case E_BLOCK_EMERALD_BLOCK: + { + return true; + } + } + return false; +} + + + + + +bool cBeaconEntity::Tick(float a_Dt, cChunk & a_Chunk) +{ + return false; +} + + + + + +void cBeaconEntity::SaveToJson(Json::Value& a_Value) +{ +} + + + + +void cBeaconEntity::SendTo(cClientHandle & a_Client) +{ +} + + + + + +void cBeaconEntity::UsedBy(cPlayer * a_Player) +{ +} \ No newline at end of file diff --git a/src/BlockEntities/BeaconEntity.h b/src/BlockEntities/BeaconEntity.h new file mode 100644 index 000000000..1dfd745b2 --- /dev/null +++ b/src/BlockEntities/BeaconEntity.h @@ -0,0 +1,40 @@ + +#pragma once + +#include "BlockEntity.h" + + + + + +namespace Json +{ + class Value; +} + + + + + +class cBeaconEntity : + public cBlockEntity +{ + typedef cBlockEntity super; + +public: + + // The initial constructor + cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World); + + // Returns the amount of layers the pyramid below the beacon has. + int GetPyramidLevel(void); + + // Returns true if the block is a diamond block, an golden block, an iron block or an emerald block. + bool IsMineralBlock(BLOCKTYPE a_BlockType); + + // cBlockEntity overrides: + virtual void SaveToJson(Json::Value& a_Value ) override; + virtual void SendTo(cClientHandle & a_Client) override; + virtual void UsedBy(cPlayer * a_Player) override; + virtual bool Tick(float a_Dt, cChunk & /* a_Chunk */) override; +} ; \ No newline at end of file diff --git a/src/BlockEntities/BlockEntity.cpp b/src/BlockEntities/BlockEntity.cpp index b42318c2f..430f04551 100644 --- a/src/BlockEntities/BlockEntity.cpp +++ b/src/BlockEntities/BlockEntity.cpp @@ -4,6 +4,7 @@ // Implements the cBlockEntity class that is the common ancestor for all block entities #include "Globals.h" +#include "BeaconEntity.h" #include "BlockEntity.h" #include "ChestEntity.h" #include "CommandBlockEntity.h" @@ -26,6 +27,7 @@ cBlockEntity * cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE { switch (a_BlockType) { + case E_BLOCK_BEACON: return new cBeaconEntity (a_BlockX, a_BlockY, a_BlockZ, a_World); case E_BLOCK_CHEST: return new cChestEntity (a_BlockX, a_BlockY, a_BlockZ, a_World); case E_BLOCK_COMMAND_BLOCK: return new cCommandBlockEntity(a_BlockX, a_BlockY, a_BlockZ, a_World); case E_BLOCK_DISPENSER: return new cDispenserEntity (a_BlockX, a_BlockY, a_BlockZ, a_World); diff --git a/src/Chunk.cpp b/src/Chunk.cpp index fe9cd9b31..4366111ef 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -1299,6 +1299,7 @@ void cChunk::CreateBlockEntities(void) BLOCKTYPE BlockType = cChunkDef::GetBlock(m_BlockTypes, x, y, z); switch (BlockType) { + case E_BLOCK_BEACON: case E_BLOCK_CHEST: case E_BLOCK_COMMAND_BLOCK: case E_BLOCK_DISPENSER: @@ -1429,6 +1430,7 @@ void cChunk::SetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, // If the new block is a block entity, create the entity object: switch (a_BlockType) { + case E_BLOCK_BEACON: case E_BLOCK_CHEST: case E_BLOCK_COMMAND_BLOCK: case E_BLOCK_DISPENSER: -- cgit v1.2.3 From e19556ebf6a3a452a31b4e327f6018637418100a Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:13:16 +0200 Subject: Simplefied GetPyramidLevel --- src/BlockEntities/BeaconEntity.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index e5e890dbc..b5a503192 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -35,25 +35,17 @@ int cBeaconEntity::GetPyramidLevel() for (int Y = Area.GetSizeY() - 1; Y > 0; Y--) { - bool FullLayer = true; for (int X = MiddleXZ - Layer; X <= (MiddleXZ + Layer); X++) { for (int Z = MiddleXZ - Layer; Z <= (MiddleXZ + Layer); Z++) { if (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z))) { - FullLayer = false; + return Layer; } } } - if (!FullLayer) - { - break; - } - else - { - Layer++; - } + Layer++; } return Layer; @@ -84,6 +76,7 @@ bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType) bool cBeaconEntity::Tick(float a_Dt, cChunk & a_Chunk) { + std::cout << GetPyramidLevel() << "\n"; return false; } -- cgit v1.2.3 From eb4dd23775fa6de25d14bd485dcb96451a2b2989 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:21:37 +0200 Subject: Removed debug message. --- src/BlockEntities/BeaconEntity.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index b5a503192..65fda827c 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -76,7 +76,6 @@ bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType) bool cBeaconEntity::Tick(float a_Dt, cChunk & a_Chunk) { - std::cout << GetPyramidLevel() << "\n"; return false; } -- cgit v1.2.3 From 433bd530f38b78bb7e276acafef40fec47d43267 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:35:13 +0200 Subject: Some tweaks GetPyramidLevel returns 0 when no layers were found, 1 for one layer etc. Auto adjust the minY and/or maxY to 0 if the beacon is low. --- src/BlockEntities/BeaconEntity.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index 65fda827c..dd340f24f 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -20,14 +20,26 @@ cBeaconEntity::cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * int cBeaconEntity::GetPyramidLevel() { cBlockArea Area; + int MinY = GetPosY() - 4; + if (MinY < 0) + { + MinY = 0; + } + int MaxY = GetPosY() - 1; + if (MaxY < 0) + { + MaxY = 0; + } + Area.Read( m_World, GetPosX() - 4, GetPosX() + 4, - GetPosY() - 5, - GetPosY() - 1, + MinY, + MaxY, GetPosZ() - 4, - GetPosZ() + 4 + GetPosZ() + 4, + cBlockArea::baTypes ); int Layer = 1; @@ -41,14 +53,14 @@ int cBeaconEntity::GetPyramidLevel() { if (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z))) { - return Layer; + return Layer - 1; } } } Layer++; } - return Layer; + return Layer - 1; } -- cgit v1.2.3 From 200ea6254c28b73d419001ea1be7d2d4d1d1ee88 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 18 Apr 2014 12:54:17 +0100 Subject: Fixed #904 --- src/Mobs/Monster.cpp | 2 +- src/World.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index d63758b3d..27bd28045 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -540,7 +540,7 @@ void cMonster::KilledBy(cEntity * a_Killer) break; } } - if (a_Killer != NULL) + if ((a_Killer != NULL) && (!IsBaby()) { m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward); } diff --git a/src/World.cpp b/src/World.cpp index c23e255f8..800bdde0e 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -1691,6 +1691,11 @@ int cWorld::SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE BlockType, NI int cWorld::SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward) { + if (a_Reward < 1) + { + return -1; + } + cExpOrb * ExpOrb = new cExpOrb(a_X, a_Y, a_Z, a_Reward); ExpOrb->Initialize(this); return ExpOrb->GetUniqueID(); -- cgit v1.2.3 From 6cb63a768dd2356d0e41aef1ef086ae972449bdd Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 18 Apr 2014 12:59:14 +0100 Subject: Fixed #906 --- src/Entities/Entity.cpp | 10 ++++++++++ src/Mobs/Monster.cpp | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 86aee4c6f..56ef36ef8 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -771,6 +771,16 @@ void cEntity::TickBurning(cChunk & a_Chunk) { // Remember the current burning state: bool HasBeenBurning = (m_TicksLeftBurning > 0); + + if (GetWorld()->GetWeather() == eWeather_Rain) + { + if (HasBeenBurning) + { + m_TicksLeftBurning = 0; + OnFinishedBurning(); + } + return; + } // Do the burning damage: if (m_TicksLeftBurning > 0) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 27bd28045..9df5d5e3b 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -1003,7 +1003,8 @@ void cMonster::HandleDaylightBurning(cChunk & a_Chunk) (a_Chunk.GetSkyLight(RelX, RelY, RelZ) == 15) && // In the daylight (a_Chunk.GetBlock(RelX, RelY, RelZ) != E_BLOCK_SOULSAND) && // Not on soulsand (GetWorld()->GetTimeOfDay() < (12000 + 1000)) && // It is nighttime - !IsOnFire() // Not already burning + !IsOnFire() && // Not already burning + (GetWorld()->GetWeather() != eWeather_Rain) // Not raining ) { // Burn for 100 ticks, then decide again -- cgit v1.2.3 From 19358fc7d5cfde19d47a910adbf8a1d67dd48f5f Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 18 Apr 2014 20:20:00 +0100 Subject: Compilation fix --- src/Mobs/Monster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 9df5d5e3b..248e88f5d 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -540,7 +540,7 @@ void cMonster::KilledBy(cEntity * a_Killer) break; } } - if ((a_Killer != NULL) && (!IsBaby()) + if ((a_Killer != NULL) && (!IsBaby())) { m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward); } -- cgit v1.2.3 From 6eac5867945044eda62312f9657ff0c808ac2080 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 19 Apr 2014 13:05:58 +0200 Subject: Fixed formatting, made function static. --- src/BlockEntities/BeaconEntity.cpp | 17 +++++++++-------- src/BlockEntities/BeaconEntity.h | 14 +++++++++----- 2 files changed, 18 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index dd340f24f..0914353eb 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -17,7 +17,7 @@ cBeaconEntity::cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * -int cBeaconEntity::GetPyramidLevel() +int cBeaconEntity::GetPyramidLevel(void) { cBlockArea Area; int MinY = GetPosY() - 4; @@ -33,12 +33,9 @@ int cBeaconEntity::GetPyramidLevel() Area.Read( m_World, - GetPosX() - 4, - GetPosX() + 4, - MinY, - MaxY, - GetPosZ() - 4, - GetPosZ() + 4, + GetPosX() - 4, GetPosX() + 4, + MinY, MaxY, + GetPosZ() - 4, GetPosZ() + 4, cBlockArea::baTypes ); @@ -112,4 +109,8 @@ void cBeaconEntity::SendTo(cClientHandle & a_Client) void cBeaconEntity::UsedBy(cPlayer * a_Player) { -} \ No newline at end of file +} + + + + diff --git a/src/BlockEntities/BeaconEntity.h b/src/BlockEntities/BeaconEntity.h index 1dfd745b2..b1df68bc4 100644 --- a/src/BlockEntities/BeaconEntity.h +++ b/src/BlockEntities/BeaconEntity.h @@ -23,18 +23,22 @@ class cBeaconEntity : public: - // The initial constructor + /** The initial constructor */ cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World); - // Returns the amount of layers the pyramid below the beacon has. + /** Returns the amount of layers the pyramid below the beacon has. */ int GetPyramidLevel(void); - // Returns true if the block is a diamond block, an golden block, an iron block or an emerald block. - bool IsMineralBlock(BLOCKTYPE a_BlockType); + /** Returns true if the block is a diamond block, a golden block, an iron block or an emerald block. */ + static bool IsMineralBlock(BLOCKTYPE a_BlockType); // cBlockEntity overrides: virtual void SaveToJson(Json::Value& a_Value ) override; virtual void SendTo(cClientHandle & a_Client) override; virtual void UsedBy(cPlayer * a_Player) override; virtual bool Tick(float a_Dt, cChunk & /* a_Chunk */) override; -} ; \ No newline at end of file +} ; + + + + -- cgit v1.2.3