summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ClientHandle.cpp2
-rw-r--r--src/Items/ItemEmptyMap.h6
-rw-r--r--src/Map.cpp112
-rw-r--r--src/Map.h17
4 files changed, 121 insertions, 16 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index a2cbaefff..ff8775771 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -1199,6 +1199,8 @@ void cClientHandle::HandleSlotSelected(short a_SlotNum)
if (Map != NULL)
{
+ Map->UpdateRadius(*m_Player, 128); // Temporary
+
// TODO 2014-02-14 xdot: Optimization - Do not send the whole map.
Map->SendTo(*this);
}
diff --git a/src/Items/ItemEmptyMap.h b/src/Items/ItemEmptyMap.h
index 5516033a0..24d31151b 100644
--- a/src/Items/ItemEmptyMap.h
+++ b/src/Items/ItemEmptyMap.h
@@ -18,6 +18,8 @@ class cItemEmptyMapHandler :
public cItemHandler
{
typedef cItemHandler super;
+
+ static const unsigned int DEFAULT_SCALE = 0;
public:
cItemEmptyMapHandler() :
@@ -34,12 +36,12 @@ public:
// The map center is fixed at the central point of the 8x8 block of chunks you are standing in when you right-click it.
- const int RegionWidth = cChunkDef::Width * 8;
+ const int RegionWidth = cChunkDef::Width * 8 * pow(2, DEFAULT_SCALE);
int CenterX = round(a_Player->GetPosX() / (float) RegionWidth) * RegionWidth;
int CenterZ = round(a_Player->GetPosZ() / (float) RegionWidth) * RegionWidth;
- a_World->CreateMap(CenterX, CenterZ, 0);
+ a_World->CreateMap(CenterX, CenterZ, DEFAULT_SCALE);
return true;
}
diff --git a/src/Map.cpp b/src/Map.cpp
index 497cc9659..e0f991693 100644
--- a/src/Map.cpp
+++ b/src/Map.cpp
@@ -8,6 +8,7 @@
#include "ClientHandle.h"
#include "World.h"
#include "Chunk.h"
+#include "Entities/Player.h"
@@ -23,6 +24,8 @@ cMap::cMap(unsigned int a_ID, cWorld * a_World)
, m_World(a_World)
{
m_Data.assign(m_Width * m_Height, 0);
+
+ Printf(m_Name, "map_%i", m_ID);
}
@@ -40,12 +43,34 @@ cMap::cMap(unsigned int a_ID, int a_CenterX, int a_CenterZ, cWorld * a_World, un
{
m_Data.assign(m_Width * m_Height, 0);
- for (unsigned int X = 0; X < m_Width; ++X)
+ Printf(m_Name, "map_%i", m_ID);
+}
+
+
+
+
+
+void cMap::UpdateRadius(int a_PixelX, int a_PixelZ, unsigned int a_Radius)
+{
+ int PixelRadius = a_Radius / GetPixelWidth();
+
+ unsigned int StartX = std::max(a_PixelX - PixelRadius, 0);
+ unsigned int StartZ = std::max(a_PixelZ - PixelRadius, 0);
+
+ unsigned int EndX = std::min(a_PixelX + PixelRadius, (int)m_Width);
+ unsigned int EndZ = std::min(a_PixelZ + PixelRadius, (int)m_Height);
+
+ for (unsigned int X = StartX; X < EndX; ++X)
{
- for (unsigned int Y = 0; Y < m_Height; ++Y)
+ for (unsigned int Z = StartZ; Z < EndZ; ++Z)
{
- // Debug
- m_Data[Y + X * m_Height] = rand() % 100;
+ int dX = X - a_PixelX;
+ int dZ = Z - a_PixelZ;
+
+ if ((dX * dX) + (dZ * dZ) < (PixelRadius * PixelRadius))
+ {
+ UpdatePixel(X, Z);
+ }
}
}
}
@@ -54,20 +79,85 @@ cMap::cMap(unsigned int a_ID, int a_CenterX, int a_CenterZ, cWorld * a_World, un
+void cMap::UpdateRadius(cPlayer & a_Player, unsigned int a_Radius)
+{
+ unsigned int PixelWidth = GetPixelWidth();
+
+ int PixelX = (a_Player.GetPosX() - m_CenterX) / PixelWidth + (m_Width / 2);
+ int PixelZ = (a_Player.GetPosZ() - m_CenterZ) / PixelWidth + (m_Height / 2);
+
+ UpdateRadius(PixelX, PixelZ, a_Radius);
+}
+
+
+
+
+
bool cMap::UpdatePixel(unsigned int a_X, unsigned int a_Y)
{
ASSERT(m_World != NULL);
- cChunk * Chunk = NULL;
+ unsigned int PixelWidth = GetPixelWidth();
+
+ int BlockX = m_CenterX + ((a_X - m_Width) * PixelWidth);
+ int BlockZ = m_CenterZ + ((a_Y - m_Height) * PixelWidth);
+
+ int ChunkX, ChunkY, ChunkZ;
+ m_World->BlockToChunk(BlockX, 0, BlockZ, ChunkX, ChunkY, ChunkZ);
- if (Chunk == NULL)
+ int RelX = BlockX - (ChunkX * cChunkDef::Width);
+ int RelZ = BlockZ - (ChunkZ * cChunkDef::Width);
+
+ class cCalculatePixelCb :
+ public cChunkCallback
{
- return false;
- }
+ cMap * m_Map;
+
+ int m_RelX, m_RelZ;
+
+ ColorID m_PixelData;
+
+ public:
+ cCalculatePixelCb(cMap * a_Map, int a_RelX, int a_RelZ)
+ : m_Map(a_Map), m_RelX(a_RelX), m_RelZ(a_RelZ), m_PixelData(0) {}
+
+ virtual bool Item(cChunk * a_Chunk) override
+ {
+ if (a_Chunk == NULL)
+ {
+ return false;
+ }
- int Height = Chunk->GetHeight(a_X, a_Y);
+ unsigned int PixelWidth = m_Map->GetPixelWidth();
+
+ for (unsigned int X = m_RelX; X < m_RelX + PixelWidth; ++X)
+ {
+ for (unsigned int Z = m_RelZ; Z < m_RelZ + PixelWidth; ++Z)
+ {
+ int Height = a_Chunk->GetHeight(X, Z);
+
+ if (Height > 0)
+ {
+ // TODO
+ }
+ }
+ }
+
+ m_PixelData = 8; // Debug
+
+ return false;
+ }
+
+ ColorID GetPixelData(void) const
+ {
+ return m_PixelData;
+ }
+ } CalculatePixelCb(this, RelX, RelZ);
+
+ ASSERT(m_World != NULL);
+ m_World->DoWithChunk(ChunkX, ChunkZ, CalculatePixelCb);
- // TODO
+ m_Data[a_Y + (a_X * m_Height)] = CalculatePixelCb.GetPixelData();
return true;
}
@@ -167,7 +257,7 @@ unsigned int cMap::GetNumPixels(void) const
-unsigned int cMap::GetNumBlocksPerPixel(void) const
+unsigned int cMap::GetPixelWidth(void) const
{
return pow(2, m_Scale);
}
diff --git a/src/Map.h b/src/Map.h
index c443445de..4134d53a1 100644
--- a/src/Map.h
+++ b/src/Map.h
@@ -21,6 +21,7 @@
class cClientHandle;
class cWorld;
+class cPlayer;
@@ -48,6 +49,11 @@ public:
/** Send this map to the specified client. */
void SendTo(cClientHandle & a_Client);
+ /** Update a circular region with the specified radius and center (in pixels). */
+ void UpdateRadius(int a_PixelX, int a_PixelZ, unsigned int a_Radius);
+
+ void UpdateRadius(cPlayer & a_Player, unsigned int a_Radius);
+
// tolua_begin
/** Erase pixel data */
@@ -71,13 +77,15 @@ public:
cWorld * GetWorld(void) { return m_World; }
+ AString GetName(void) { return m_Name; }
+
eDimension GetDimension(void) const;
const cColorList & GetData(void) const { return m_Data; }
unsigned int GetNumPixels(void) const;
- unsigned int GetNumBlocksPerPixel(void) const;
+ unsigned int GetPixelWidth(void) const;
// tolua_end
@@ -87,8 +95,6 @@ private:
/** Update the specified pixel. */
bool UpdatePixel(unsigned int a_X, unsigned int a_Y);
- void PixelToWorldCoords(unsigned int a_X, unsigned int a_Y, int & a_WorldX, int & a_WorldY);
-
unsigned int m_ID;
unsigned int m_Width;
@@ -105,6 +111,11 @@ private:
cWorld * m_World;
+ //typedef std::vector<cPlayer*> cPlayerList;
+ //cPlayerList m_TrackedPlayers;
+
+ AString m_Name;
+
friend class cMapSerializer;
};