From c1e6fb454fc6d9e15e93665c9184503c0af6021f Mon Sep 17 00:00:00 2001 From: "keyboard.osh@gmail.com" Date: Sat, 4 May 2013 06:25:58 +0000 Subject: Explosion: Switched from a cube to a sphere. Implemented using cBlockArea and moved block changing code to ChunkMap git-svn-id: http://mc-server.googlecode.com/svn/trunk@1441 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/ChunkMap.cpp | 30 ++++++++++++++++++++++++++++++ source/ChunkMap.h | 3 +++ source/World.cpp | 35 ++++------------------------------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/source/ChunkMap.cpp b/source/ChunkMap.cpp index 7a7eeb25a..3e9fd4a81 100644 --- a/source/ChunkMap.cpp +++ b/source/ChunkMap.cpp @@ -1450,6 +1450,36 @@ bool cChunkMap::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback +cVector3iArray *cChunkMap::DoExplosiontAt(float a_ExplosionSize, int a_BlockX, int a_BlockY, int a_BlockZ) +{ + cBlockArea area; + cVector3iArray *BlocksAffected = new cVector3iArray(); + int ExplosionSizeInt = (int) ceil(a_ExplosionSize); + BlocksAffected->reserve(8 * ExplosionSizeInt * ExplosionSizeInt * ExplosionSizeInt); + area.Read(m_World,a_BlockX - ExplosionSizeInt,a_BlockX + ExplosionSizeInt,a_BlockY - ExplosionSizeInt,a_BlockY + ExplosionSizeInt,a_BlockZ - ExplosionSizeInt,a_BlockZ + ExplosionSizeInt); + for (int x = -ExplosionSizeInt; x < ExplosionSizeInt; x++) + { + for (int y = -ExplosionSizeInt; y < ExplosionSizeInt; y++) + { + for (int z = -ExplosionSizeInt; z < ExplosionSizeInt; z++) + { + if ((x*x + y*y + z*z) < (ExplosionSizeInt * ExplosionSizeInt)) + { + area.SetBlockType(a_BlockX + x, a_BlockY + y, a_BlockZ + z,E_BLOCK_AIR); + BlocksAffected->push_back(Vector3i(a_BlockX + x, a_BlockY + y, a_BlockZ + z)); + } + } + } + + } + area.Write(m_World,a_BlockX - ExplosionSizeInt,a_BlockY - ExplosionSizeInt,a_BlockZ - ExplosionSizeInt); + return BlocksAffected; +} + + + + + bool cChunkMap::DoWithEntityByID(int a_UniqueID, cEntityCallback & a_Callback) { cCSLock Lock(m_CSLayers); diff --git a/source/ChunkMap.h b/source/ChunkMap.h index e3dfdc88f..a2fb5abff 100644 --- a/source/ChunkMap.h +++ b/source/ChunkMap.h @@ -197,6 +197,9 @@ public: /// Calls the callback for each entity in the specified chunk; returns true if all entities processed, false if the callback aborted by returning true bool ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback & a_Callback); // Lua-accessible + + // Destroys and returns a list of blocks destroyed in the explosion at the specified coordinates + cVector3iArray * DoExplosiontAt(float a_ExplosionSize, int a_BlockX, int a_BlockY, int a_BlockZ); /// Calls the callback if the entity with the specified ID is found, with the entity object as the callback param. Returns true if entity found and callback returned false. bool DoWithEntityByID(int a_UniqueID, cEntityCallback & a_Callback); // Lua-accessible diff --git a/source/World.cpp b/source/World.cpp index 418f078eb..b10f68554 100644 --- a/source/World.cpp +++ b/source/World.cpp @@ -705,37 +705,9 @@ 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 / in cChunkMap, add damage to entities, add support for pickups, and implement block hardiness + // TODO: Add damage to entities, add support for pickups, and implement block hardiness Vector3d explosion_pos = Vector3d(a_BlockX,a_BlockY,a_BlockZ); - cVector3iArray BlocksAffected; - int ExplosionSizeInt = (int)a_ExplosionSize; - BlocksAffected.reserve(8 * ExplosionSizeInt * ExplosionSizeInt * ExplosionSizeInt); - for (int x = 0; x < ExplosionSizeInt; x++) - { - for (int y = 0; y < ExplosionSizeInt; y++) - { - for (int z = 0; z < ExplosionSizeInt; z++) - { - DigBlock(a_BlockX + x, a_BlockY + y, a_BlockZ + z); - DigBlock(a_BlockX + x, a_BlockY - y, a_BlockZ + z); - DigBlock(a_BlockX - x, a_BlockY - y, a_BlockZ - z); - DigBlock(a_BlockX - x, a_BlockY + y, a_BlockZ - z); - DigBlock(a_BlockX + x, a_BlockY + y, a_BlockZ - z); - DigBlock(a_BlockX + x, a_BlockY - y, a_BlockZ - z); - DigBlock(a_BlockX - x, a_BlockY + y, a_BlockZ + z); - DigBlock(a_BlockX - x, a_BlockY - y, a_BlockZ + z); - BlocksAffected.push_back(Vector3i(a_BlockX + x, a_BlockY + y, a_BlockZ + z)); - BlocksAffected.push_back(Vector3i(a_BlockX + x, a_BlockY - y, a_BlockZ + z)); - BlocksAffected.push_back(Vector3i(a_BlockX - x, a_BlockY - y, a_BlockZ - z)); - BlocksAffected.push_back(Vector3i(a_BlockX - x, a_BlockY + y, a_BlockZ - z)); - BlocksAffected.push_back(Vector3i(a_BlockX + x, a_BlockY + y, a_BlockZ - z)); - BlocksAffected.push_back(Vector3i(a_BlockX + x, a_BlockY - y, a_BlockZ - z)); - BlocksAffected.push_back(Vector3i(a_BlockX - x, a_BlockY + y, a_BlockZ + z)); - BlocksAffected.push_back(Vector3i(a_BlockX - x, a_BlockY - y, a_BlockZ + z)); - } - } - - } + cVector3iArray * BlocksAffected = m_ChunkMap->DoExplosiontAt(a_ExplosionSize,a_BlockX,a_BlockY,a_BlockZ); BroadcastSoundEffect("random.explode", a_BlockX * 8, a_BlockY * 8, a_BlockZ * 8, 1.0f, 0.6f); { cCSLock Lock(m_CSPlayers); @@ -757,10 +729,11 @@ void cWorld::DoExplosiontAt(float a_ExplosionSize, int a_BlockX, int a_BlockY, i } distance_explosion.Normalize(); distance_explosion *= power; - ch->SendExplosion(a_BlockX, a_BlockY, a_BlockZ, a_ExplosionSize, BlocksAffected, distance_explosion); + ch->SendExplosion(a_BlockX, a_BlockY, a_BlockZ, a_ExplosionSize, *BlocksAffected, distance_explosion); } } } + delete BlocksAffected; } -- cgit v1.2.3