the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.network.packet.h"
3#include "net.minecraft.world.effect.h"
4#include "net.minecraft.world.entity.player.h"
5#include "net.minecraft.world.item.h"
6#include "net.minecraft.world.level.h"
7#include "net.minecraft.world.level.tile.h"
8#include "net.minecraft.world.phys.h"
9#include "BeaconTileEntity.h"
10
11shared_ptr<TileEntity> BeaconTileEntity::clone()
12{
13 shared_ptr<BeaconTileEntity> result = shared_ptr<BeaconTileEntity>( new BeaconTileEntity() );
14 TileEntity::clone(result);
15
16 result->primaryPower = primaryPower;
17 result->secondaryPower = secondaryPower;
18 result->levels = levels;
19
20 return result;
21}
22
23MobEffect *BeaconTileEntity::BEACON_EFFECTS[BeaconTileEntity::BEACON_EFFECTS_TIERS][BeaconTileEntity::BEACON_EFFECTS_EFFECTS];
24
25void BeaconTileEntity::staticCtor()
26{
27 for(unsigned int tier = 0; tier < BEACON_EFFECTS_TIERS; ++tier)
28 {
29 for(unsigned int effect = 0; effect < BEACON_EFFECTS_EFFECTS; ++effect)
30 {
31 BEACON_EFFECTS[tier][effect] = NULL;
32 }
33 }
34 BEACON_EFFECTS[0][0] = MobEffect::movementSpeed;
35 BEACON_EFFECTS[0][1] = MobEffect::digSpeed;
36 BEACON_EFFECTS[1][0] = MobEffect::damageResistance;
37 BEACON_EFFECTS[1][1] = MobEffect::jump;
38 BEACON_EFFECTS[2][0] = MobEffect::damageBoost;
39 BEACON_EFFECTS[3][0] = MobEffect::regeneration;
40}
41
42BeaconTileEntity::BeaconTileEntity()
43{
44 clientSideRenderTick = 0;
45 clientSideRenderScale = 0.0f;
46
47 isActive = false;
48 levels = -1;
49
50 primaryPower = 0;
51 secondaryPower = 0;
52
53 paymentItem = nullptr;
54 name = L"";
55}
56
57void BeaconTileEntity::tick()
58{
59 // 4J Stu - Added levels check to force an initial tick
60 if ( (!level->isClientSide && levels < 0) || (level->getGameTime() % (SharedConstants::TICKS_PER_SECOND * 4)) == 0)
61 {
62 updateShape();
63 applyEffects();
64 }
65
66}
67
68void BeaconTileEntity::applyEffects()
69{
70 if (isActive && levels > 0 && !level->isClientSide && primaryPower > 0)
71 {
72
73 double range = (levels * 10) + 10;
74 int baseAmp = 0;
75 if (levels >= 4 && primaryPower == secondaryPower)
76 {
77 baseAmp = 1;
78 }
79
80 AABB *bb = AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(range, range, range);
81 bb->y1 = level->getMaxBuildHeight();
82 vector<shared_ptr<Entity> > *players = level->getEntitiesOfClass(typeid(Player), bb);
83 for (AUTO_VAR(it,players->begin()); it != players->end(); ++it)
84 {
85 shared_ptr<Player> player = dynamic_pointer_cast<Player>(*it);
86 player->addEffect(new MobEffectInstance(primaryPower, SharedConstants::TICKS_PER_SECOND * 9, baseAmp, true));
87 }
88
89 if (levels >= 4 && primaryPower != secondaryPower && secondaryPower > 0)
90 {
91 for (AUTO_VAR(it,players->begin()); it != players->end(); ++it)
92 {
93 shared_ptr<Player> player = dynamic_pointer_cast<Player>(*it);
94 player->addEffect(new MobEffectInstance(secondaryPower, SharedConstants::TICKS_PER_SECOND * 9, 0, true));
95 }
96 }
97 delete players;
98 }
99}
100
101void BeaconTileEntity::updateShape()
102{
103
104 if (!level->canSeeSky(x, y + 1, z))
105 {
106 isActive = false;
107 levels = 0;
108 }
109 else
110 {
111 isActive = true;
112
113 levels = 0;
114 for (int step = 1; step <= 4; step++)
115 {
116
117 int ly = y - step;
118 if (ly < 0)
119 {
120 break;
121 }
122
123 bool isOk = true;
124 for (int lx = x - step; lx <= x + step && isOk; lx++)
125 {
126 for (int lz = z - step; lz <= z + step; lz++)
127 {
128 int tile = level->getTile(lx, ly, lz);
129 if (tile != Tile::emeraldBlock_Id && tile != Tile::goldBlock_Id && tile != Tile::diamondBlock_Id && tile != Tile::ironBlock_Id)
130 {
131 isOk = false;
132 break;
133 }
134 }
135 }
136 if (isOk)
137 {
138 levels = step;
139 }
140 else
141 {
142 break;
143 }
144 }
145 if (levels == 0)
146 {
147 isActive = false;
148 }
149 }
150
151}
152
153float BeaconTileEntity::getAndUpdateClientSideScale()
154{
155
156 if (!isActive)
157 {
158 return 0;
159 }
160
161 int renderDelta = (int) (level->getGameTime() - clientSideRenderTick);
162 clientSideRenderTick = level->getGameTime();
163 if (renderDelta > 1)
164 {
165 clientSideRenderScale -= ((float) renderDelta / (float) SCALE_TIME);
166
167 if (clientSideRenderScale < 0)
168 {
169 clientSideRenderScale = 0;
170 }
171 }
172 clientSideRenderScale += (1.0f / (float) SCALE_TIME);
173 if (clientSideRenderScale > 1)
174 {
175 clientSideRenderScale = 1;
176 }
177 return clientSideRenderScale;
178}
179
180int BeaconTileEntity::getPrimaryPower()
181{
182 return primaryPower;
183}
184
185int BeaconTileEntity::getSecondaryPower()
186{
187 return secondaryPower;
188}
189
190int BeaconTileEntity::getLevels()
191{
192 return levels;
193}
194
195// client-side method used by GUI
196void BeaconTileEntity::setLevels(int levels)
197{
198 this->levels = levels;
199}
200
201void BeaconTileEntity::setPrimaryPower(int primaryPower)
202{
203 this->primaryPower = 0;
204
205 // verify power
206 for (int tier = 0; tier < levels && tier < 3; tier++)
207 {
208 for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e)
209 {
210 MobEffect *effect = BEACON_EFFECTS[tier][e];
211 if(effect == NULL) break;
212
213 if (effect->id == primaryPower)
214 {
215 this->primaryPower = primaryPower;
216 return;
217 }
218 }
219 }
220}
221
222void BeaconTileEntity::setSecondaryPower(int secondaryPower)
223{
224 this->secondaryPower = 0;
225
226 // verify power
227 if (levels >= 4)
228 {
229 for (int tier = 0; tier < 4; tier++)
230 {
231 for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e)
232 {
233 MobEffect *effect = BEACON_EFFECTS[tier][e];
234 if(effect == NULL) break;
235
236 if (effect->id == secondaryPower)
237 {
238 this->secondaryPower = secondaryPower;
239 return;
240 }
241 }
242 }
243 }
244}
245
246shared_ptr<Packet> BeaconTileEntity::getUpdatePacket()
247{
248 CompoundTag *tag = new CompoundTag();
249 save(tag);
250 return shared_ptr<TileEntityDataPacket>( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_BEACON, tag) );
251}
252
253double BeaconTileEntity::getViewDistance()
254{
255 return 256 * 256;
256}
257
258void BeaconTileEntity::load(CompoundTag *tag)
259{
260 TileEntity::load(tag);
261
262 primaryPower = tag->getInt(L"Primary");
263 secondaryPower = tag->getInt(L"Secondary");
264 levels = tag->getInt(L"Levels");
265}
266
267void BeaconTileEntity::save(CompoundTag *tag)
268{
269 TileEntity::save(tag);
270
271 tag->putInt(L"Primary", primaryPower);
272 tag->putInt(L"Secondary", secondaryPower);
273 // this value is re-calculated, but save it anyway to avoid update lag
274 tag->putInt(L"Levels", levels);
275}
276
277unsigned int BeaconTileEntity::getContainerSize()
278{
279 return 1;
280}
281
282shared_ptr<ItemInstance> BeaconTileEntity::getItem(unsigned int slot)
283{
284 if (slot == 0)
285 {
286 return paymentItem;
287 }
288 return nullptr;
289}
290
291shared_ptr<ItemInstance> BeaconTileEntity::removeItem(unsigned int slot, int count)
292{
293 if (slot == 0 && paymentItem != NULL)
294 {
295 if (count >= paymentItem->count)
296 {
297 shared_ptr<ItemInstance> returnItem = paymentItem;
298 paymentItem = nullptr;
299 return returnItem;
300 }
301 else
302 {
303 paymentItem->count -= count;
304 return shared_ptr<ItemInstance>( new ItemInstance(paymentItem->id, count, paymentItem->getAuxValue()) );
305 }
306 }
307 return nullptr;
308}
309
310shared_ptr<ItemInstance> BeaconTileEntity::removeItemNoUpdate(int slot)
311{
312 if (slot == 0 && paymentItem != NULL)
313 {
314 shared_ptr<ItemInstance> returnItem = paymentItem;
315 paymentItem = nullptr;
316 return returnItem;
317 }
318 return nullptr;
319}
320
321void BeaconTileEntity::setItem(unsigned int slot, shared_ptr<ItemInstance> item)
322{
323 if (slot == 0)
324 {
325 paymentItem = item;
326 }
327}
328
329wstring BeaconTileEntity::getName()
330{
331 return hasCustomName() ? name : app.GetString(IDS_CONTAINER_BEACON);
332}
333
334wstring BeaconTileEntity::getCustomName()
335{
336 return hasCustomName() ? name : L"";
337}
338
339bool BeaconTileEntity::hasCustomName()
340{
341 return !name.empty();
342}
343
344void BeaconTileEntity::setCustomName(const wstring &name)
345{
346 this->name = name;
347}
348
349int BeaconTileEntity::getMaxStackSize() const
350{
351 return 1;
352}
353
354bool BeaconTileEntity::stillValid(shared_ptr<Player> player)
355{
356 if (level->getTileEntity(x, y, z) != shared_from_this()) return false;
357 if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false;
358 return true;
359}
360
361void BeaconTileEntity::startOpen()
362{
363}
364
365void BeaconTileEntity::stopOpen()
366{
367}
368
369bool BeaconTileEntity::canPlaceItem(int slot, shared_ptr<ItemInstance> item)
370{
371 return (item->id == Item::emerald_Id || item->id == Item::diamond_Id || item->id == Item::goldIngot_Id || item->id == Item::ironIngot_Id);
372}