summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/Bindings.cpp3
-rw-r--r--source/Bindings.h2
-rw-r--r--source/Blocks/BlockHandler.cpp2
-rw-r--r--source/Blocks/BlockTNT.h38
-rw-r--r--source/ClientHandle.cpp9
-rw-r--r--source/ClientHandle.h1
-rw-r--r--source/Entity.h1
-rw-r--r--source/Protocol/Protocol.h1
-rw-r--r--source/Protocol/Protocol125.cpp28
-rw-r--r--source/Protocol/Protocol125.h1
-rw-r--r--source/Protocol/ProtocolRecognizer.cpp10
-rw-r--r--source/Protocol/ProtocolRecognizer.h1
-rw-r--r--source/TNTEntity.cpp70
-rw-r--r--source/TNTEntity.h33
-rw-r--r--source/Vector3i.h3
-rw-r--r--source/World.cpp62
-rw-r--r--source/World.h3
17 files changed, 266 insertions, 2 deletions
diff --git a/source/Bindings.cpp b/source/Bindings.cpp
index be95a05b3..cd6a057e4 100644
--- a/source/Bindings.cpp
+++ b/source/Bindings.cpp
@@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
-** Generated automatically by tolua++-1.0.92 on 04/13/13 22:59:55.
+** Generated automatically by tolua++-1.0.92 on 04/17/13 19:40:39.
*/
#ifndef __cplusplus
@@ -24409,6 +24409,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_constant(tolua_S,"etMob",cEntity::etMob);
tolua_constant(tolua_S,"etFallingBlock",cEntity::etFallingBlock);
tolua_constant(tolua_S,"etMinecart",cEntity::etMinecart);
+ tolua_constant(tolua_S,"etTNT",cEntity::etTNT);
tolua_constant(tolua_S,"eEntityType_Entity",cEntity::eEntityType_Entity);
tolua_constant(tolua_S,"eEntityType_Player",cEntity::eEntityType_Player);
tolua_constant(tolua_S,"eEntityType_Pickup",cEntity::eEntityType_Pickup);
diff --git a/source/Bindings.h b/source/Bindings.h
index 76098c6e4..ff29c1589 100644
--- a/source/Bindings.h
+++ b/source/Bindings.h
@@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
-** Generated automatically by tolua++-1.0.92 on 04/13/13 22:59:55.
+** Generated automatically by tolua++-1.0.92 on 04/17/13 19:40:39.
*/
/* Exported function */
diff --git a/source/Blocks/BlockHandler.cpp b/source/Blocks/BlockHandler.cpp
index 51051b7a6..4b7aa6fa2 100644
--- a/source/Blocks/BlockHandler.cpp
+++ b/source/Blocks/BlockHandler.cpp
@@ -56,6 +56,7 @@
#include "BlockCauldron.h"
#include "BlockBrewingStand.h"
#include "BlockCobWeb.h"
+#include "BlockTNT.h"
@@ -171,6 +172,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType)
case E_BLOCK_STONE_SLAB: return new cBlockSlabHandler (a_BlockType);
case E_BLOCK_SUGARCANE: return new cBlockSugarcaneHandler (a_BlockType);
case E_BLOCK_TALL_GRASS: return new cBlockTallGrassHandler (a_BlockType);
+ case E_BLOCK_TNT: return new cBlockTNTHandler (a_BlockType);
case E_BLOCK_TORCH: return new cBlockTorchHandler (a_BlockType);
case E_BLOCK_VINES: return new cBlockVineHandler (a_BlockType);
case E_BLOCK_WALLSIGN: return new cBlockSignHandler (a_BlockType);
diff --git a/source/Blocks/BlockTNT.h b/source/Blocks/BlockTNT.h
new file mode 100644
index 000000000..d9dcca67b
--- /dev/null
+++ b/source/Blocks/BlockTNT.h
@@ -0,0 +1,38 @@
+
+#pragma once
+
+#include "BlockHandler.h"
+#include "../Player.h"
+#include "../TNTEntity.h"
+
+
+
+
+class cBlockTNTHandler : public cBlockHandler
+{
+public:
+ cBlockTNTHandler(BLOCKTYPE a_BlockType)
+ : cBlockHandler(a_BlockType)
+ {
+ }
+
+ virtual void OnUse(cWorld * a_World, cPlayer *a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override
+ {
+ if (a_Player->GetEquippedWeapon().m_ItemType == E_ITEM_FLINT_AND_STEEL)
+ {
+ a_World->BroadcastSoundEffect("random.fuse", a_BlockX * 8, a_BlockY * 8, a_BlockZ * 8, 0.5f, 0.6f);
+ cTNTEntity *TNT = new cTNTEntity(a_BlockX,a_BlockY,a_BlockZ,4); //4 seconds to boom
+ TNT->Initialize(a_World);
+ a_World->SetBlock(a_BlockX,a_BlockY,a_BlockZ, E_BLOCK_AIR, 0);
+ }
+ }
+
+ virtual bool IsUseable() override
+ {
+ return true;
+ }
+};
+
+
+
+
diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp
index 497639649..2a8ceabc7 100644
--- a/source/ClientHandle.cpp
+++ b/source/ClientHandle.cpp
@@ -1552,6 +1552,15 @@ void cClientHandle::SendEntityStatus(const cEntity & a_Entity, char a_Status)
+void cClientHandle::SendExplosion(double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ)
+{
+ m_Protocol->SendExplosion(a_BlockX,a_BlockY,a_BlockZ,a_Radius, a_BlocksAffected, a_PlayerMotionX, a_PlayerMotionY,a_PlayerMotionZ);
+}
+
+
+
+
+
void cClientHandle::SendMetadata(const cPawn & a_Pawn)
{
m_Protocol->SendMetadata(a_Pawn);
diff --git a/source/ClientHandle.h b/source/ClientHandle.h
index a43b0ca9b..0a228af3d 100644
--- a/source/ClientHandle.h
+++ b/source/ClientHandle.h
@@ -98,6 +98,7 @@ public:
void SendEntRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ);
void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item);
void SendEntityStatus (const cEntity & a_Entity, char a_Status);
+ void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ);
void SendGameMode (eGameMode a_GameMode);
void SendHealth (void);
void SendInventoryProgress (char a_WindowID, short a_Progressbar, short a_Value);
diff --git a/source/Entity.h b/source/Entity.h
index 3d4d1244e..5871ce89c 100644
--- a/source/Entity.h
+++ b/source/Entity.h
@@ -67,6 +67,7 @@ public:
etMob = etMonster, // DEPRECATED, use etMonster instead!
etFallingBlock,
etMinecart,
+ etTNT,
// DEPRECATED older constants, left over for compatibility reasons (plugins)
eEntityType_Entity = etEntity,
diff --git a/source/Protocol/Protocol.h b/source/Protocol/Protocol.h
index 4cf041cdf..48d32384c 100644
--- a/source/Protocol/Protocol.h
+++ b/source/Protocol/Protocol.h
@@ -67,6 +67,7 @@ public:
virtual void SendEntRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) = 0;
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) = 0;
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) = 0;
+ virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ) = 0;
virtual void SendGameMode (eGameMode a_GameMode) = 0;
virtual void SendHealth (void) = 0;
virtual void SendInventoryProgress (char a_WindowID, short a_Progressbar, short a_Value) = 0;
diff --git a/source/Protocol/Protocol125.cpp b/source/Protocol/Protocol125.cpp
index c3cfdfd81..e588bc595 100644
--- a/source/Protocol/Protocol125.cpp
+++ b/source/Protocol/Protocol125.cpp
@@ -352,6 +352,34 @@ void cProtocol125::SendEntityStatus(const cEntity & a_Entity, char a_Status)
+void cProtocol125::SendExplosion(double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ)
+{
+ cCSLock Lock(m_CSPacket);
+ WriteByte(PACKET_EXPLOSION);
+ WriteDouble (a_BlockX);
+ WriteDouble (a_BlockY);
+ WriteDouble (a_BlockZ);
+ WriteFloat (a_Radius);
+ WriteInt (a_BlocksAffected.size());//it should be a_RecordCount
+ /*WriteByte (0); //It should be the record
+ WriteByte (0);
+ WriteByte (0);*/
+ for (cVector3iList::iterator itr = a_BlocksAffected.begin(); itr != a_BlocksAffected.end(); ++itr)
+ {
+ WriteByte ((Byte)((*itr)->x - a_BlockX));
+ WriteByte ((Byte)((*itr)->y - a_BlockY));
+ WriteByte ((Byte)((*itr)->z - a_BlockZ));
+ }
+ WriteFloat (a_PlayerMotionX);
+ WriteFloat (a_PlayerMotionY);
+ WriteFloat (a_PlayerMotionZ);
+ Flush();
+}
+
+
+
+
+
void cProtocol125::SendEntRelMove(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ)
{
ASSERT(a_Entity.GetUniqueID() != m_Client->GetPlayer()->GetUniqueID()); // Must not send for self
diff --git a/source/Protocol/Protocol125.h b/source/Protocol/Protocol125.h
index 4191d0793..1cf03357d 100644
--- a/source/Protocol/Protocol125.h
+++ b/source/Protocol/Protocol125.h
@@ -44,6 +44,7 @@ public:
virtual void SendEntRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
+ virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ) override;
virtual void SendGameMode (eGameMode a_GameMode) override;
virtual void SendHealth (void) override;
virtual void SendInventoryProgress (char a_WindowID, short a_Progressbar, short a_Value) override;
diff --git a/source/Protocol/ProtocolRecognizer.cpp b/source/Protocol/ProtocolRecognizer.cpp
index ad99839e4..ea60dafae 100644
--- a/source/Protocol/ProtocolRecognizer.cpp
+++ b/source/Protocol/ProtocolRecognizer.cpp
@@ -266,6 +266,16 @@ void cProtocolRecognizer::SendEntityStatus(const cEntity & a_Entity, char a_Stat
+void cProtocolRecognizer::SendExplosion(double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ)
+{
+ ASSERT(m_Protocol != NULL);
+ m_Protocol->SendExplosion(a_BlockX,a_BlockY,a_BlockZ,a_Radius, a_BlocksAffected, a_PlayerMotionX, a_PlayerMotionY,a_PlayerMotionZ);
+}
+
+
+
+
+
void cProtocolRecognizer::SendGameMode(eGameMode a_GameMode)
{
ASSERT(m_Protocol != NULL);
diff --git a/source/Protocol/ProtocolRecognizer.h b/source/Protocol/ProtocolRecognizer.h
index 8218dbcaa..f897f1804 100644
--- a/source/Protocol/ProtocolRecognizer.h
+++ b/source/Protocol/ProtocolRecognizer.h
@@ -71,6 +71,7 @@ public:
virtual void SendEntRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
+ virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, cVector3iList a_BlocksAffected, float a_PlayerMotionX, float a_PlayerMotionY, float a_PlayerMotionZ) override;
virtual void SendGameMode (eGameMode a_GameMode) override;
virtual void SendHealth (void) override;
virtual void SendInventoryProgress (char a_WindowID, short a_Progressbar, short a_Value) override;
diff --git a/source/TNTEntity.cpp b/source/TNTEntity.cpp
new file mode 100644
index 000000000..636c9535c
--- /dev/null
+++ b/source/TNTEntity.cpp
@@ -0,0 +1,70 @@
+#include "Globals.h"
+
+#include "TNTEntity.h"
+#include "World.h"
+#include "ClientHandle.h"
+
+
+
+
+
+cTNTEntity::cTNTEntity(int a_X,int a_Y,int a_Z,float a_MaxFuseTime) :
+ super(etTNT, a_X + 0.5f, a_Y + 0.5f, a_Z + 0.5f)
+{
+ m_MaxFuseTime = a_MaxFuseTime;
+ m_Counter = 0;
+}
+
+
+
+
+
+cTNTEntity::cTNTEntity(const Vector3i a_Pos,float a_MaxFuseTime) :
+ super(etTNT, a_Pos.x,a_Pos.y,a_Pos.z)
+{
+ m_MaxFuseTime = a_MaxFuseTime;
+ m_Counter = 0;
+}
+
+
+
+
+void cTNTEntity::Initialize(cWorld * a_World)
+{
+ super::Initialize(a_World);
+ a_World->BroadcastSpawn(*this);
+}
+
+
+
+
+
+void cTNTEntity::SpawnOn(cClientHandle & a_ClientHandle)
+{
+ a_ClientHandle.SendSpawnObject(*this,50,1,0,0); //50 means TNT
+ m_bDirtyPosition = false;
+ m_bDirtySpeed = false;
+ m_bDirtyOrientation = false;
+ m_bDirtyHead = false;
+}
+
+
+
+
+
+void cTNTEntity::Tick(float a_Dt, cChunk & a_Chunk)
+{
+ float delta_time = a_Dt / 1000; //Convert miliseconds to seconds
+ m_Counter += delta_time;
+ if (m_Counter > m_MaxFuseTime) //Check if we go KABOOOM
+ {
+ Destroy();
+ LOGD("BOOM at {%f,%f,%f}",GetPosX(),GetPosY(),GetPosZ());
+ m_World->DoExplosiontAt(4.0,(int)floor(GetPosX()),(int)floor(GetPosY()),(int)floor(GetPosZ()));
+ return;
+ }
+}
+
+
+
+
diff --git a/source/TNTEntity.h b/source/TNTEntity.h
new file mode 100644
index 000000000..8414b2430
--- /dev/null
+++ b/source/TNTEntity.h
@@ -0,0 +1,33 @@
+
+#pragma once
+
+#include "Entity.h"
+#include "Defines.h"
+
+
+
+
+
+class cTNTEntity :
+ public cEntity
+{
+typedef cEntity super;
+
+public:
+ CLASS_PROTODEF(cTNTEntity);
+
+ cTNTEntity(int a_X,int a_Y,int a_Z,float a_MaxFuseTime);
+ cTNTEntity(const Vector3i a_Pos,float a_MaxFuseTime);
+
+ // cEntity overrides:
+ virtual void Initialize(cWorld * a_World) override;
+ virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
+ virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
+private:
+ float m_Counter; //In seconds too
+ float m_MaxFuseTime; //in seconds
+};
+
+
+
+
diff --git a/source/Vector3i.h b/source/Vector3i.h
index fd9b95305..820368c28 100644
--- a/source/Vector3i.h
+++ b/source/Vector3i.h
@@ -36,3 +36,6 @@ public: // tolua_export
int x, y, z; // tolua_export
}; // tolua_export
+
+
+typedef std::list< Vector3i * > cVector3iList; \ No newline at end of file
diff --git a/source/World.cpp b/source/World.cpp
index 74a7ea399..6b1e5f8c8 100644
--- a/source/World.cpp
+++ b/source/World.cpp
@@ -703,6 +703,68 @@ bool cWorld::ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallback
+void cWorld::DoExplosiontAt(float a_ExplosionSize, int a_BlockX, int a_BlockY, int a_BlockZ)
+{
+ //TODO implement explosion using cBlockArea, add damage to pawns, add support for pickups, and implement block hardiness
+ Vector3d explosion_pos = Vector3d(a_BlockX,a_BlockY,a_BlockZ);
+ cVector3iList BlocksAffected;
+ for (int i=0;i<a_ExplosionSize;i++)
+ {
+ for (int j=0;j<a_ExplosionSize;j++)
+ {
+ for (int k=0;k<a_ExplosionSize;k++)
+ {
+ DigBlock(a_BlockX+i,a_BlockY+j,a_BlockZ+k);
+ DigBlock(a_BlockX+i,a_BlockY-j,a_BlockZ+k);
+ DigBlock(a_BlockX-i,a_BlockY-j,a_BlockZ-k);
+ DigBlock(a_BlockX-i,a_BlockY+j,a_BlockZ-k);
+ DigBlock(a_BlockX+i,a_BlockY+j,a_BlockZ-k);
+ DigBlock(a_BlockX+i,a_BlockY-j,a_BlockZ-k);
+ DigBlock(a_BlockX-i,a_BlockY+j,a_BlockZ+k);
+ DigBlock(a_BlockX-i,a_BlockY-j,a_BlockZ+k);
+ BlocksAffected.push_back(&Vector3i(a_BlockX+i,a_BlockY+j,a_BlockZ+k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX+i,a_BlockY-j,a_BlockZ+k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX-i,a_BlockY-j,a_BlockZ-k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX-i,a_BlockY+j,a_BlockZ-k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX+i,a_BlockY+j,a_BlockZ-k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX+i,a_BlockY-j,a_BlockZ-k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX-i,a_BlockY+j,a_BlockZ+k));
+ BlocksAffected.push_back(&Vector3i(a_BlockX-i,a_BlockY-j,a_BlockZ+k));
+ }
+ }
+
+ }
+ BroadcastSoundEffect("random.explode", a_BlockX * 8, a_BlockY * 8, a_BlockZ * 8, 1.0f, 0.6f);
+ {
+ cCSLock Lock(m_CSPlayers);
+ for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
+ {
+ cClientHandle * ch = (*itr)->GetClientHandle();
+ if ((ch == NULL) || !ch->IsLoggedIn() || ch->IsDestroyed())
+ {
+ continue;
+ }
+ Vector3d distance_explosion = (*itr)->GetPosition() - explosion_pos;
+ if (distance_explosion.SqrLength() < 4096.0)
+ {
+ double real_distance = sqrt( distance_explosion.SqrLength());
+ if (real_distance <= 0.0004)
+ real_distance = 0.0004;
+ double power = a_ExplosionSize / real_distance;
+ if (power <= 1)
+ power = 0;
+ distance_explosion.Normalize();
+ distance_explosion *= power;
+ ch->SendExplosion(a_BlockX,a_BlockY,a_BlockZ,a_ExplosionSize,BlocksAffected,(float)distance_explosion.x,(float)distance_explosion.y,(float)distance_explosion.z);
+ }
+ }
+ }
+}
+
+
+
+
+
bool cWorld::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback & a_Callback)
{
return m_ChunkMap->DoWithChestAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
diff --git a/source/World.h b/source/World.h
index 70e203bc3..c3aa0c25c 100644
--- a/source/World.h
+++ b/source/World.h
@@ -338,6 +338,9 @@ public:
/// Calls the callback for each furnace in the specified chunk; returns true if all furnaces processed, false if the callback aborted by returning true
bool ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallback & a_Callback); // Exported in ManualBindings.cpp
+ /// Does an explosion with the specified strength at the specified coordinate
+ void DoExplosiontAt (float a_ExplosionSzie, int a_BlockX, int a_BlockY, int a_BlockZ); //
+
/// Calls the callback for the chest at the specified coords; returns false if there's no chest at those coords, true if found
bool DoWithChestAt (int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback & a_Callback); // Exported in ManualBindings.cpp