summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authormadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-02-15 15:22:44 +0100
committermadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-02-15 15:22:44 +0100
commit1aebcea095e92572a39cb6555cba8517234b156c (patch)
treebbef44ce857aa49b2171ef43bedc2e802fbd5dd8 /source
parentCan now pass any argument to cWorld:ForEachPlayer in Lua! But I'm not even using it.. lol (diff)
downloadcuberite-1aebcea095e92572a39cb6555cba8517234b156c.tar
cuberite-1aebcea095e92572a39cb6555cba8517234b156c.tar.gz
cuberite-1aebcea095e92572a39cb6555cba8517234b156c.tar.bz2
cuberite-1aebcea095e92572a39cb6555cba8517234b156c.tar.lz
cuberite-1aebcea095e92572a39cb6555cba8517234b156c.tar.xz
cuberite-1aebcea095e92572a39cb6555cba8517234b156c.tar.zst
cuberite-1aebcea095e92572a39cb6555cba8517234b156c.zip
Diffstat (limited to 'source')
-rw-r--r--source/cBlockEntity.h2
-rw-r--r--source/cChestEntity.cpp10
-rw-r--r--source/cChestEntity.h4
-rw-r--r--source/cChunk.cpp13
-rw-r--r--source/cChunk.h2
-rw-r--r--source/cChunkMap.cpp38
-rw-r--r--source/cChunkMap.h35
-rw-r--r--source/cClientHandle.cpp172
-rw-r--r--source/cFurnaceEntity.cpp8
-rw-r--r--source/cFurnaceEntity.h3
-rw-r--r--source/cSignEntity.cpp2
-rw-r--r--source/cSignEntity.h4
-rw-r--r--source/cWorld.h5
13 files changed, 194 insertions, 104 deletions
diff --git a/source/cBlockEntity.h b/source/cBlockEntity.h
index 83a7ebffc..4ac453e6f 100644
--- a/source/cBlockEntity.h
+++ b/source/cBlockEntity.h
@@ -41,7 +41,7 @@ public:
cWorld * GetWorld(void) const {return m_World; }
- virtual void UsedBy( cPlayer & a_Player ) = 0;
+ virtual void UsedBy( cPlayer * a_Player ) = 0;
virtual void SendTo( cClientHandle* a_Client ) { (void)a_Client; }
protected:
diff --git a/source/cChestEntity.cpp b/source/cChestEntity.cpp
index e96d4bbb2..c79057829 100644
--- a/source/cChestEntity.cpp
+++ b/source/cChestEntity.cpp
@@ -184,7 +184,7 @@ void cChestEntity::SendTo( cClientHandle* a_Client, cServer* a_Server )
-void cChestEntity::UsedBy( cPlayer & a_Player )
+void cChestEntity::UsedBy( cPlayer * a_Player )
{
LOG("Used a chest");
// m_Content[0].m_ItemCount = 1;
@@ -203,10 +203,10 @@ void cChestEntity::UsedBy( cPlayer & a_Player )
}
if ( GetWindow() )
{
- if( a_Player.GetWindow() != GetWindow() )
+ if( a_Player->GetWindow() != GetWindow() )
{
- a_Player.OpenWindow( GetWindow() );
- GetWindow()->SendWholeWindow( a_Player.GetClientHandle() );
+ a_Player->OpenWindow( GetWindow() );
+ GetWindow()->SendWholeWindow( a_Player->GetClientHandle() );
}
}
cPacket_BlockAction ChestOpen;
@@ -215,7 +215,7 @@ void cChestEntity::UsedBy( cPlayer & a_Player )
ChestOpen.m_PosZ = GetPosZ();
ChestOpen.m_Byte1 = (char)1;
ChestOpen.m_Byte2 = (char)1;
- m_World->GetChunkOfBlock(m_PosX, m_PosY, m_PosZ)->Broadcast(&ChestOpen);
+ m_World->BroadcastToChunkOfBlock(m_PosX, m_PosY, m_PosZ, &ChestOpen);
}
diff --git a/source/cChestEntity.h b/source/cChestEntity.h
index 6d26d069f..d3d98739b 100644
--- a/source/cChestEntity.h
+++ b/source/cChestEntity.h
@@ -44,14 +44,14 @@ public:
void SendTo( cClientHandle* a_Client, cServer* a_Server );
- virtual void UsedBy( cPlayer & a_Player );
+ virtual void UsedBy( cPlayer * a_Player ) override;
cChestEntity *GetJoinedChest() { return m_JoinedChest; }
void SetJoinedChest(cChestEntity *a_Chest) { m_JoinedChest = a_Chest; }
void RemoveJoinedChest(cChestEntity *a_Chest) { if (m_JoinedChest && m_JoinedChest == a_Chest) { m_JoinedChest = NULL; m_TopChest = false; } }
int GetChestHeight() { return ((m_JoinedChest) ? c_ChestHeight * 2 : c_ChestHeight); }
- cItem *GetContents(bool a_OnlyThis = false);
+ cItem * GetContents(bool a_OnlyThis = false);
static const int c_ChestWidth = 9;
static const int c_ChestHeight = 3;
diff --git a/source/cChunk.cpp b/source/cChunk.cpp
index fec06e947..d1800c053 100644
--- a/source/cChunk.cpp
+++ b/source/cChunk.cpp
@@ -835,6 +835,19 @@ cBlockEntity * cChunk::GetBlockEntity(int a_X, int a_Y, int a_Z)
+void cChunk::UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z)
+{
+ cBlockEntity * be = GetBlockEntity(a_X, a_Y, a_Z);
+ if (be != NULL)
+ {
+ be->UsedBy(a_Player);
+ }
+}
+
+
+
+
+
void cChunk::CollectPickupsByPlayer(cPlayer * a_Player)
{
cCSLock Lock(m_CSEntities);
diff --git a/source/cChunk.h b/source/cChunk.h
index 4ff060b30..0cbc11117 100644
--- a/source/cChunk.h
+++ b/source/cChunk.h
@@ -85,6 +85,8 @@ public:
void AddEntity( cEntity * a_Entity );
void RemoveEntity( cEntity * a_Entity);
+
+ void UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z); // [x, y, z] in world block coords
inline void RecalculateLighting() { m_bCalculateLighting = true; } // Recalculate lighting next tick
inline void RecalculateHeightmap() { m_bCalculateHeightmap = true; } // Recalculate heightmap next tick
diff --git a/source/cChunkMap.cpp b/source/cChunkMap.cpp
index b864b9792..efb69aca0 100644
--- a/source/cChunkMap.cpp
+++ b/source/cChunkMap.cpp
@@ -136,6 +136,44 @@ cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ )
+void cChunkMap::BroadcastToChunkOfBlock(int a_X, int a_Y, int a_Z, cPacket * a_Packet, cClientHandle * a_Exclude)
+{
+ // Broadcasts a_Packet to all clients in the chunk where block [x, y, z] is, except to client a_Exclude
+
+ cCSLock Lock(m_CSLayers);
+ int ChunkX, ChunkZ;
+ BlockToChunk(a_X, a_Y, a_Z, ChunkX, ChunkZ);
+ cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ);
+ if (Chunk == NULL)
+ {
+ return;
+ }
+ // Packets can be broadcasted even to invalid chunks!
+ Chunk->Broadcast(a_Packet);
+}
+
+
+
+
+
+void cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z)
+{
+ // a_Player rclked block entity at the coords specified, handle it
+ cCSLock Lock(m_CSLayers);
+ int ChunkX, ChunkZ;
+ BlockToChunk(a_X, a_Y, a_Z, ChunkX, ChunkZ);
+ cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ);
+ if ((Chunk == NULL) || !Chunk->IsValid())
+ {
+ return;
+ }
+ Chunk->UseBlockEntity(a_Player, a_X, a_Y, a_Z);
+}
+
+
+
+
+
void cChunkMap::Tick( float a_Dt, MTRand & a_TickRandom )
{
cCSLock Lock(m_CSLayers);
diff --git a/source/cChunkMap.h b/source/cChunkMap.h
index 1d3ddf6aa..bc7bddd96 100644
--- a/source/cChunkMap.h
+++ b/source/cChunkMap.h
@@ -27,18 +27,51 @@ public:
cChunkMap(cWorld* a_World );
~cChunkMap();
+ // TODO: Get rid of these in favor of the direct action methods:
cChunkPtr GetChunk ( int a_ChunkX, int a_ChunkY, int a_ChunkZ ); // Also queues the chunk for loading / generating if not valid
cChunkPtr GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ ); // Also queues the chunk for loading if not valid; doesn't generate
+
+ // Direct action methods:
+ /// Broadcasts a_Packet to all clients in the chunk where block [x, y, z] is, except to client a_Exclude
+ void BroadcastToChunkOfBlock(int a_X, int a_Y, int a_Z, cPacket * a_Packet, cClientHandle * a_Exclude = NULL);
+ void UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z); // a_Player rclked block entity at the coords specified, handle it
void Tick( float a_Dt, MTRand & a_TickRand );
void UnloadUnusedChunks();
void SaveAllChunks();
- cWorld* GetWorld() { return m_World; }
+ cWorld * GetWorld() { return m_World; }
int GetNumChunks(void);
+ /// Converts absolute block coords into relative (chunk + block) coords:
+ inline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ )
+ {
+ BlockToChunk(a_X, a_Y, a_Z, a_ChunkX, a_ChunkZ);
+
+ a_X = a_X - a_ChunkX * 16;
+ a_Z = a_Z - a_ChunkZ*16;
+ }
+
+ /// Converts absolute block coords to chunk coords:
+ inline static void BlockToChunk( int a_X, int a_Y, int a_Z, int & a_ChunkX, int & a_ChunkZ )
+ {
+ (void)a_Y;
+ a_ChunkX = a_X / 16;
+ if ((a_X < 0) && (a_X % 16 != 0))
+ {
+ a_ChunkX--;
+ }
+ a_ChunkZ = a_Z / 16;
+ if ((a_Z < 0) && (a_Z % 16 != 0))
+ {
+ a_ChunkZ--;
+ }
+ }
+
+
+
private:
class cChunkLayer
diff --git a/source/cClientHandle.cpp b/source/cClientHandle.cpp
index 92dd93d73..a28d8a56c 100644
--- a/source/cClientHandle.cpp
+++ b/source/cClientHandle.cpp
@@ -466,9 +466,6 @@ void cClientHandle::HandlePacket(cPacket * a_Packet)
{
m_TimeLastPacket = cWorld::GetTime();
- // cPacket* CopiedPacket = a_Packet->Clone();
- // a_Packet = CopiedPacket;
-
// LOG("Recv packet 0x%02x from client \"%s\" (\"%s\")", a_Packet->m_PacketID, m_Socket.GetIPString().c_str(), m_Username.c_str());
if (m_bKicking)
@@ -908,41 +905,42 @@ void cClientHandle::HandleBlockPlace(cPacket_BlockPlace * a_Packet)
ENUM_BLOCK_ID BlockID = (ENUM_BLOCK_ID)m_Player->GetWorld()->GetBlock(a_Packet->m_PosX, a_Packet->m_PosY, a_Packet->m_PosZ);
switch (BlockID)
{
- case E_BLOCK_REDSTONE_REPEATER_ON:
- case E_BLOCK_REDSTONE_REPEATER_OFF:
+ case E_BLOCK_REDSTONE_REPEATER_ON:
+ case E_BLOCK_REDSTONE_REPEATER_OFF:
{
- //no need to update redstone current with a repeater
- //todo: Find meta value of repeater and change it to one step more.
+ // no need to update redstone current with a repeater
+ // TODO: Find meta value of repeater and change it to one step more.
+ break;
}
- break;
- case E_BLOCK_WORKBENCH:
+
+ case E_BLOCK_WORKBENCH:
{
bPlaceBlock = false;
cWindow* Window = new cCraftingWindow(0, true);
m_Player->OpenWindow(Window);
+ break;
}
- break;
- case E_BLOCK_FURNACE:
- case E_BLOCK_CHEST:
+
+ case E_BLOCK_FURNACE:
+ case E_BLOCK_CHEST:
{
bPlaceBlock = false;
- cBlockEntity* BlockEntity = m_Player->GetWorld()->GetBlockEntity(a_Packet->m_PosX, a_Packet->m_PosY, a_Packet->m_PosZ);
- if (BlockEntity)
- {
- BlockEntity->UsedBy(*m_Player);
- }
+ m_Player->GetWorld()->UseBlockEntity(m_Player, a_Packet->m_PosX, a_Packet->m_PosY, a_Packet->m_PosZ);
+ break;
}
- break;
- case E_BLOCK_WOODEN_DOOR:
+
+ case E_BLOCK_WOODEN_DOOR:
{
bPlaceBlock = false;
cDoors::ChangeDoor(m_Player->GetWorld(), a_Packet->m_PosX, a_Packet->m_PosY, a_Packet->m_PosZ);
+ break;
}
- break;
- default:
- break;
- };
- }
+ default:
+ {
+ break;
+ }
+ } // switch (BlockID)
+ } // if (Direction >= 0)
// Some checks to see if it's a placeable item :P
if (bPlaceBlock)
@@ -950,7 +948,7 @@ void cClientHandle::HandleBlockPlace(cPacket_BlockPlace * a_Packet)
cItem Item;
Item.m_ItemID = Equipped.m_ItemID;
Item.m_ItemCount = 1;
- LOG("a_Packet->m_ItemType: %i", (int)a_Packet->m_ItemType);
+ LOG("Placing item of type: %i", (int)a_Packet->m_ItemType);
// Hacked in edible items go!~
// TODO: Handle hunger
@@ -958,68 +956,68 @@ void cClientHandle::HandleBlockPlace(cPacket_BlockPlace * a_Packet)
bool isDoor = false;
switch (Item.m_ItemID)
{
- case E_ITEM_APPLE:
- //m_Player->Heal(4); // 2 hearts
- m_Player->Feed(24); // 2 food bars
- bEat = true;
- break;
- case E_ITEM_GOLDEN_APPLE:
- //m_Player->Heal(20); // 10 hearts
- m_Player->Feed(60); // 5 food
- bEat = true;
- break;
- case E_ITEM_MUSHROOM_SOUP:
- ///m_Player->Heal(10); // 5 hearts
- m_Player->Feed(48); // 4 food
- bEat = true;
- break;
- case E_ITEM_BREAD:
- //m_Player->Heal(5); // 2.5 hearts
- m_Player->Feed(30); // 2.5 food
- bEat = true;
- break;
- case E_ITEM_RAW_MEAT:
- //m_Player->Heal(3); // 1.5 hearts
- m_Player->Feed(18); // 1.5 food
- bEat = true;
- break;
- case E_ITEM_COOKED_MEAT:
- //m_Player->Heal(8); // 4 hearts
- m_Player->Feed(48); // 4 food
- bEat = true;
- break;
- case E_ITEM_RAW_FISH:
- //m_Player->Heal(2); // 1 heart
- m_Player->Feed(12); // 1 food
- bEat = true;
- break;
- case E_ITEM_COOKED_FISH:
- //m_Player->Heal(5); // 2.5 hearts
- m_Player->Feed(30); // 2.5 food
- bEat = true;
- break;
- case E_ITEM_RAW_CHICKEN:
- //m_Player->Heal(3);
- m_Player->Feed(12); // 1 food
- bEat = true;
- break;
- case E_ITEM_COOKED_CHICKEN:
- //m_Player->Heal(8);
- m_Player->Feed(36); // 3 food
- bEat = true;
- break;
- case E_ITEM_RAW_BEEF:
- //m_Player->Heal(3);
- m_Player->Feed(18); // 1.5 food
- bEat = true;
- break;
- case E_ITEM_STEAK:
- //m_Player->Heal(8);
- m_Player->Feed(48); // 4 food
- bEat = true;
- break;
- default:
- break;
+ case E_ITEM_APPLE:
+ //m_Player->Heal(4); // 2 hearts
+ m_Player->Feed(24); // 2 food bars
+ bEat = true;
+ break;
+ case E_ITEM_GOLDEN_APPLE:
+ //m_Player->Heal(20); // 10 hearts
+ m_Player->Feed(60); // 5 food
+ bEat = true;
+ break;
+ case E_ITEM_MUSHROOM_SOUP:
+ ///m_Player->Heal(10); // 5 hearts
+ m_Player->Feed(48); // 4 food
+ bEat = true;
+ break;
+ case E_ITEM_BREAD:
+ //m_Player->Heal(5); // 2.5 hearts
+ m_Player->Feed(30); // 2.5 food
+ bEat = true;
+ break;
+ case E_ITEM_RAW_MEAT:
+ //m_Player->Heal(3); // 1.5 hearts
+ m_Player->Feed(18); // 1.5 food
+ bEat = true;
+ break;
+ case E_ITEM_COOKED_MEAT:
+ //m_Player->Heal(8); // 4 hearts
+ m_Player->Feed(48); // 4 food
+ bEat = true;
+ break;
+ case E_ITEM_RAW_FISH:
+ //m_Player->Heal(2); // 1 heart
+ m_Player->Feed(12); // 1 food
+ bEat = true;
+ break;
+ case E_ITEM_COOKED_FISH:
+ //m_Player->Heal(5); // 2.5 hearts
+ m_Player->Feed(30); // 2.5 food
+ bEat = true;
+ break;
+ case E_ITEM_RAW_CHICKEN:
+ //m_Player->Heal(3);
+ m_Player->Feed(12); // 1 food
+ bEat = true;
+ break;
+ case E_ITEM_COOKED_CHICKEN:
+ //m_Player->Heal(8);
+ m_Player->Feed(36); // 3 food
+ bEat = true;
+ break;
+ case E_ITEM_RAW_BEEF:
+ //m_Player->Heal(3);
+ m_Player->Feed(18); // 1.5 food
+ bEat = true;
+ break;
+ case E_ITEM_STEAK:
+ //m_Player->Heal(8);
+ m_Player->Feed(48); // 4 food
+ bEat = true;
+ break;
+ default:
+ break;
};
if (bEat)
diff --git a/source/cFurnaceEntity.cpp b/source/cFurnaceEntity.cpp
index d5bd192c5..4485d2c01 100644
--- a/source/cFurnaceEntity.cpp
+++ b/source/cFurnaceEntity.cpp
@@ -74,7 +74,7 @@ void cFurnaceEntity::Destroy()
-void cFurnaceEntity::UsedBy( cPlayer & a_Player )
+void cFurnaceEntity::UsedBy( cPlayer * a_Player )
{
LOG("Used a furnace");
@@ -88,11 +88,11 @@ void cFurnaceEntity::UsedBy( cPlayer & a_Player )
}
if( GetWindow() )
{
- if( a_Player.GetWindow() != GetWindow() )
+ if( a_Player->GetWindow() != GetWindow() )
{
- a_Player.OpenWindow( GetWindow() );
+ a_Player->OpenWindow( GetWindow() );
- GetWindow()->SendWholeWindow( a_Player.GetClientHandle() );
+ GetWindow()->SendWholeWindow( a_Player->GetClientHandle() );
}
}
}
diff --git a/source/cFurnaceEntity.h b/source/cFurnaceEntity.h
index 19b518cda..647339b75 100644
--- a/source/cFurnaceEntity.h
+++ b/source/cFurnaceEntity.h
@@ -37,7 +37,8 @@ public:
void SaveToJson (Json::Value& a_Value );
bool Tick( float a_Dt );
- virtual void UsedBy( cPlayer & a_Player );
+
+ virtual void UsedBy( cPlayer * a_Player ) override;
bool StartCooking();
diff --git a/source/cSignEntity.cpp b/source/cSignEntity.cpp
index 463e1072a..618f5960e 100644
--- a/source/cSignEntity.cpp
+++ b/source/cSignEntity.cpp
@@ -35,7 +35,7 @@ cSignEntity::~cSignEntity()
// It don't do anything when 'used'
-void cSignEntity::UsedBy( cPlayer & a_Player )
+void cSignEntity::UsedBy( cPlayer * a_Player )
{
(void)a_Player;
}
diff --git a/source/cSignEntity.h b/source/cSignEntity.h
index 0c9e40710..33578e1be 100644
--- a/source/cSignEntity.h
+++ b/source/cSignEntity.h
@@ -33,8 +33,8 @@ public:
AString GetLine( int a_Index ) const;
- virtual void UsedBy( cPlayer & a_Player );
- virtual void SendTo( cClientHandle* a_Client );
+ virtual void UsedBy( cPlayer * a_Player ) override;
+ virtual void SendTo( cClientHandle* a_Client ) override;
private:
diff --git a/source/cWorld.h b/source/cWorld.h
index b8c1391fd..453b30a2a 100644
--- a/source/cWorld.h
+++ b/source/cWorld.h
@@ -67,6 +67,8 @@ public:
void Broadcast( const cPacket & a_Packet, cClientHandle* a_Exclude = 0 );
+ void BroadcastToChunkOfBlock(int a_X, int a_Y, int a_Z, cPacket * a_Packet, cClientHandle * a_Exclude = NULL) {return m_ChunkMap->BroadcastToChunkOfBlock(a_X, a_Y, a_Z, a_Packet, a_Exclude); }
+
// MOTD
const AString & GetDescription(void) const {return m_Description; }
@@ -117,6 +119,9 @@ public:
// TODO: This interface is dangerous!
cBlockEntity * GetBlockEntity( int a_X, int a_Y, int a_Z ); //tolua_export
+
+ /// a_Player is using block entity at [x, y, z], handle that:
+ void UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z) {m_ChunkMap->UseBlockEntity(a_Player, a_X, a_Y, a_Z); }
void GrowTree( int a_X, int a_Y, int a_Z ); //tolua_export