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.world.level.h"
3#include "net.minecraft.world.entity.item.h"
4#include "net.minecraft.world.entity.player.h"
5#include "net.minecraft.world.item.h"
6#include "net.minecraft.world.inventory.h"
7#include "net.minecraft.world.level.tile.entity.h"
8#include "net.minecraft.world.h"
9#include "FurnaceTile.h"
10#include "Mob.h"
11#include "Facing.h"
12
13bool FurnaceTile::noDrop = false;
14
15FurnaceTile::FurnaceTile(int id, bool lit) : BaseEntityTile(id, Material::stone)
16{
17 random = new Random();
18 this->lit = lit;
19
20 iconTop = NULL;
21 iconFront = NULL;
22}
23
24int FurnaceTile::getResource(int data, Random *random, int playerBonusLevel)
25{
26 return Tile::furnace_Id;
27}
28
29void FurnaceTile::onPlace(Level *level, int x, int y, int z)
30{
31 BaseEntityTile::onPlace(level, x, y, z);
32 recalcLockDir(level, x, y, z);
33}
34
35void FurnaceTile::recalcLockDir(Level *level, int x, int y, int z)
36{
37 if (level->isClientSide)
38 {
39 return;
40 }
41
42 int n = level->getTile(x, y, z - 1); // face = 2
43 int s = level->getTile(x, y, z + 1); // face = 3
44 int w = level->getTile(x - 1, y, z); // face = 4
45 int e = level->getTile(x + 1, y, z); // face = 5
46
47 int lockDir = 3;
48 if (Tile::solid[n] && !Tile::solid[s]) lockDir = 3;
49 if (Tile::solid[s] && !Tile::solid[n]) lockDir = 2;
50 if (Tile::solid[w] && !Tile::solid[e]) lockDir = 5;
51 if (Tile::solid[e] && !Tile::solid[w]) lockDir = 4;
52 level->setData(x, y, z, lockDir, Tile::UPDATE_CLIENTS);
53}
54
55Icon *FurnaceTile::getTexture(int face, int data)
56{
57 if (face == Facing::UP) return iconTop;
58 if (face == Facing::DOWN) return iconTop;
59
60 if (face != data) return icon;
61 return iconFront;
62}
63
64void FurnaceTile::registerIcons(IconRegister *iconRegister)
65{
66 icon = iconRegister->registerIcon(L"furnace_side");
67 iconFront = iconRegister->registerIcon(lit ? L"furnace_front_lit" : L"furnace_front");
68 iconTop = iconRegister->registerIcon(L"furnace_top");
69}
70
71void FurnaceTile::animateTick(Level *level, int xt, int yt, int zt, Random *random)
72{
73 if (!lit) return;
74
75 int dir = level->getData(xt, yt, zt);
76
77 float x = xt + 0.5f;
78 float y = yt + 0.0f + random->nextFloat() * 6 / 16.0f;
79 float z = zt + 0.5f;
80 float r = 0.52f;
81 float ss = random->nextFloat() * 0.6f - 0.3f;
82
83 if (dir == 4)
84 {
85 level->addParticle(eParticleType_smoke, x - r, y, z + ss, 0, 0, 0);
86 level->addParticle(eParticleType_flame, x - r, y, z + ss, 0, 0, 0);
87 }
88 else if (dir == 5)
89 {
90 level->addParticle(eParticleType_smoke, x + r, y, z + ss, 0, 0, 0);
91 level->addParticle(eParticleType_flame, x + r, y, z + ss, 0, 0, 0);
92 }
93 else if (dir == 2)
94 {
95 level->addParticle(eParticleType_smoke, x + ss, y, z - r, 0, 0, 0);
96 level->addParticle(eParticleType_flame, x + ss, y, z - r, 0, 0, 0);
97 }
98 else if (dir == 3)
99 {
100 level->addParticle(eParticleType_smoke, x + ss, y, z + r, 0, 0, 0);
101 level->addParticle(eParticleType_flame, x + ss, y, z + r, 0, 0, 0);
102 }
103}
104
105// 4J-PB - Adding a TestUse for tooltip display
106bool FurnaceTile::TestUse()
107{
108 return true;
109}
110
111bool FurnaceTile::use(Level *level, int x, int y, int z, shared_ptr<Player> player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param
112{
113 if( soundOnly) return false;
114
115 if (level->isClientSide)
116 {
117 return true;
118 }
119 shared_ptr<FurnaceTileEntity> furnace = dynamic_pointer_cast<FurnaceTileEntity>( level->getTileEntity(x, y, z) );
120 if (furnace != NULL ) player->openFurnace(furnace);
121 return true;
122}
123
124void FurnaceTile::setLit(bool lit, Level *level, int x, int y, int z)
125{
126 int data = level->getData(x, y, z);
127 shared_ptr<TileEntity> te = level->getTileEntity(x, y, z);
128
129 noDrop = true;
130 if (lit) level->setTileAndUpdate(x, y, z, Tile::furnace_lit_Id);
131 else level->setTileAndUpdate(x, y, z, Tile::furnace_Id);
132 noDrop = false;
133
134 level->setData(x, y, z, data, Tile::UPDATE_CLIENTS);
135 if( te != NULL )
136 {
137 te->clearRemoved();
138 level->setTileEntity(x, y, z, te);
139 }
140}
141
142shared_ptr<TileEntity> FurnaceTile::newTileEntity(Level *level)
143{
144 return shared_ptr<FurnaceTileEntity>( new FurnaceTileEntity() );
145}
146
147void FurnaceTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr<LivingEntity> by, shared_ptr<ItemInstance> itemInstance)
148{
149 int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3;
150
151 if (dir == 0) level->setData(x, y, z, Facing::NORTH, Tile::UPDATE_CLIENTS);
152 if (dir == 1) level->setData(x, y, z, Facing::EAST, Tile::UPDATE_CLIENTS);
153 if (dir == 2) level->setData(x, y, z, Facing::SOUTH, Tile::UPDATE_CLIENTS);
154 if (dir == 3) level->setData(x, y, z, Facing::WEST, Tile::UPDATE_CLIENTS);
155
156 if (itemInstance->hasCustomHoverName())
157 {
158 dynamic_pointer_cast<FurnaceTileEntity>( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName());
159 }
160}
161
162void FurnaceTile::onRemove(Level *level, int x, int y, int z, int id, int data)
163{
164 if (!noDrop)
165 {
166 shared_ptr<Container> container = dynamic_pointer_cast<FurnaceTileEntity>( level->getTileEntity(x, y, z) );
167 if( container != NULL )
168 {
169 for (unsigned int i = 0; i < container->getContainerSize(); i++)
170 {
171 shared_ptr<ItemInstance> item = container->getItem(i);
172 if (item != NULL)
173 {
174 float xo = random->nextFloat() * 0.8f + 0.1f;
175 float yo = random->nextFloat() * 0.8f + 0.1f;
176 float zo = random->nextFloat() * 0.8f + 0.1f;
177
178 while (item->count > 0)
179 {
180 int count = random->nextInt(21) + 10;
181 if (count > item->count) count = item->count;
182 item->count -= count;
183
184#ifndef _CONTENT_PACKAGE
185 if(level->isClientSide)
186 {
187 printf("Client furnace dropping %d of %d/%d\n", count, item->id, item->getAuxValue() );
188 }
189 else
190 {
191 printf("Server furnace dropping %d of %d/%d\n", count, item->id, item->getAuxValue() );
192 }
193#endif
194
195 shared_ptr<ItemInstance> newItem = shared_ptr<ItemInstance>( new ItemInstance(item->id, count, item->getAuxValue()) );
196 newItem->set4JData( item->get4JData() );
197 shared_ptr<ItemEntity> itemEntity = shared_ptr<ItemEntity>( new ItemEntity(level, x + xo, y + yo, z + zo, newItem) );
198 float pow = 0.05f;
199 itemEntity->xd = (float) random->nextGaussian() * pow;
200 itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f;
201 itemEntity->zd = (float) random->nextGaussian() * pow;
202 if (item->hasTag())
203 {
204 itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy());
205 }
206 level->addEntity(itemEntity);
207 }
208
209 // 4J Stu - Fix for duplication glitch
210 container->setItem(i,nullptr);
211 }
212 }
213 level->updateNeighbourForOutputSignal(x, y, z, id);
214 }
215 }
216 BaseEntityTile::onRemove(level, x, y, z, id, data);
217
218}
219
220bool FurnaceTile::hasAnalogOutputSignal()
221{
222 return true;
223}
224
225int FurnaceTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir)
226{
227 return AbstractContainerMenu::getRedstoneSignalFromContainer(dynamic_pointer_cast<Container>( level->getTileEntity(x, y, z)) );
228}
229
230int FurnaceTile::cloneTileId(Level *level, int x, int y, int z)
231{
232 return Tile::furnace_Id;
233}