1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
// Map.h
// Implementation of in-game coloured maps
#pragma once
#include "BlockID.h"
class cClientHandle;
class cWorld;
class cPlayer;
class cMap;
class cMapDecorator
{
public:
enum eType
{
E_TYPE_PLAYER = 0x00,
E_TYPE_ITEM_FRAME = 0x01,
E_TYPE_PLAYER_OUTSIDE = 0x06
};
public:
cMapDecorator(cMap * a_Map, eType a_Type, int a_X, int a_Z, unsigned int a_Rot);
cMapDecorator(cMap * a_Map, cPlayer * a_Player);
void Update(void);
unsigned int GetPixelX(void) const { return m_PixelX; }
unsigned int GetPixelZ(void) const { return m_PixelZ; }
unsigned int GetRot(void) const { return m_Rot; }
eType GetType(void) const { return m_Type; }
cPlayer * GetPlayer(void) { return m_Player; }
protected:
cMap * m_Map;
eType m_Type;
unsigned int m_PixelX;
unsigned int m_PixelZ;
unsigned int m_Rot;
cPlayer * m_Player;
};
typedef std::list<cMapDecorator> cMapDecoratorList;
// tolua_begin
class cMap
{
public:
typedef Byte ColorID;
// tolua_end
typedef std::vector<ColorID> cColorList;
struct cMapClient
{
cClientHandle * m_Handle;
bool m_SendInfo;
unsigned int m_NextDecoratorUpdate;
Int64 m_DataUpdate;
Int64 m_LastUpdate;
};
typedef std::list<cMapClient> cMapClientList;
public:
/** Construct an empty map. */
cMap(unsigned int a_ID, cWorld * a_World);
cMap(unsigned int a_ID, int a_CenterX, int a_CenterZ, cWorld * a_World, unsigned int a_Scale = 3);
/** 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);
/** Send next update packet and remove invalid decorators */
void UpdateClient(cPlayer * a_Player);
// tolua_begin
/** Erase pixel data */
void EraseData(void);
void Resize(unsigned int a_Width, unsigned int a_Height);
void SetPosition(int a_CenterX, int a_CenterZ);
void SetScale(unsigned int a_Scale);
unsigned int GetWidth (void) const { return m_Width; }
unsigned int GetHeight(void) const { return m_Height; }
unsigned int GetScale(void) const { return m_Scale; }
int GetCenterX(void) const { return m_CenterX; }
int GetCenterZ(void) const { return m_CenterZ; }
unsigned int GetID(void) const { return m_ID; }
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 GetPixelWidth(void) const;
// tolua_end
private:
/** Update the associated decorators. */
void UpdateDecorators(void);
/** Update the specified pixel. */
bool UpdatePixel(unsigned int a_X, unsigned int a_Z);
unsigned int m_ID;
unsigned int m_Width;
unsigned int m_Height;
/** The zoom level, 2^scale square blocks per pixel */
unsigned int m_Scale;
int m_CenterX;
int m_CenterZ;
/** Column-major array of colours */
cColorList m_Data;
cWorld * m_World;
cMapDecoratorList m_Decorators;
cMapClientList m_Clients;
AString m_Name;
friend class cMapSerializer;
};
|