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 "CauldronTile.h"
3#include "Facing.h"
4#include "net.minecraft.world.level.h"
5#include "net.minecraft.world.item.h"
6#include "net.minecraft.world.entity.item.h"
7#include "net.minecraft.world.entity.player.h"
8#include "net.minecraft.world.h"
9#include "..\Minecraft.Client\ServerPlayer.h"
10
11const wstring CauldronTile::TEXTURE_INSIDE = L"cauldron_inner";
12const wstring CauldronTile::TEXTURE_BOTTOM = L"cauldron_bottom";
13
14CauldronTile::CauldronTile(int id) : Tile(id, Material::metal, isSolidRender())
15{
16 iconInner = NULL;
17 iconTop = NULL;
18 iconBottom = NULL;
19}
20
21Icon *CauldronTile::getTexture(int face, int data)
22{
23 if (face == Facing::UP)
24 {
25 return iconTop;
26 }
27 if (face == Facing::DOWN)
28 {
29 return iconBottom;
30 }
31 return icon;
32}
33
34void CauldronTile::registerIcons(IconRegister *iconRegister)
35{
36 iconInner = iconRegister->registerIcon(L"cauldron_inner");
37 iconTop = iconRegister->registerIcon(L"cauldron_top");
38 iconBottom = iconRegister->registerIcon(L"cauldron_bottom");
39 icon = iconRegister->registerIcon(L"cauldron_side");
40}
41
42Icon *CauldronTile::getTexture(const wstring &name)
43{
44 if (name.compare(TEXTURE_INSIDE) == 0) return Tile::cauldron->iconInner;
45 if (name.compare(TEXTURE_BOTTOM) == 0) return Tile::cauldron->iconBottom;
46 return NULL;
47}
48
49void CauldronTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr<Entity> source)
50{
51 setShape(0, 0, 0, 1, 5.0f / 16.0f, 1);
52 Tile::addAABBs(level, x, y, z, box, boxes, source);
53 float thickness = 2.0f / 16.0f;
54 setShape(0, 0, 0, thickness, 1, 1);
55 Tile::addAABBs(level, x, y, z, box, boxes, source);
56 setShape(0, 0, 0, 1, 1, thickness);
57 Tile::addAABBs(level, x, y, z, box, boxes, source);
58 setShape(1 - thickness, 0, 0, 1, 1, 1);
59 Tile::addAABBs(level, x, y, z, box, boxes, source);
60 setShape(0, 0, 1 - thickness, 1, 1, 1);
61 Tile::addAABBs(level, x, y, z, box, boxes, source);
62
63 updateDefaultShape();
64}
65
66void CauldronTile::updateDefaultShape()
67{
68 setShape(0, 0, 0, 1, 1, 1);
69}
70
71bool CauldronTile::isSolidRender(bool isServerLevel)
72{
73 return false;
74}
75
76int CauldronTile::getRenderShape()
77{
78 return SHAPE_CAULDRON;
79}
80
81bool CauldronTile::isCubeShaped()
82{
83 return false;
84}
85
86bool CauldronTile::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
87{
88 if(soundOnly) return false;
89
90 if (level->isClientSide)
91 {
92 return true;
93 }
94
95 shared_ptr<ItemInstance> item = player->inventory->getSelected();
96 if (item == NULL)
97 {
98 return true;
99 }
100
101 int currentData = level->getData(x, y, z);
102 int fillLevel = getFillLevel(currentData);
103
104 if (item->id == Item::bucket_water_Id)
105 {
106 if (fillLevel < 3)
107 {
108 if (!player->abilities.instabuild)
109 {
110 player->inventory->setItem(player->inventory->selected, shared_ptr<ItemInstance>(new ItemInstance(Item::bucket_empty)));
111 }
112
113 level->setData(x, y, z, 3, Tile::UPDATE_CLIENTS);
114 level->updateNeighbourForOutputSignal(x, y, z, id);
115 }
116 return true;
117 }
118 else if (item->id == Item::glassBottle_Id)
119 {
120 if (fillLevel > 0)
121 {
122 shared_ptr<ItemInstance> potion = shared_ptr<ItemInstance>(new ItemInstance(Item::potion, 1, 0));
123 if (!player->inventory->add(potion))
124 {
125 level->addEntity(shared_ptr<ItemEntity>(new ItemEntity(level, x + 0.5, y + 1.5, z + 0.5, potion)));
126 }
127 // 4J Stu - Brought forward change to update inventory when filling bottles with water
128 else if (player->instanceof(eTYPE_SERVERPLAYER))
129 {
130 dynamic_pointer_cast<ServerPlayer>( player )->refreshContainer(player->inventoryMenu);
131 }
132 // 4J-PB - don't lose the water in creative mode
133 if (player->abilities.instabuild==false)
134 {
135 item->count--;
136 if (item->count <= 0)
137 {
138 player->inventory->setItem(player->inventory->selected, nullptr);
139 }
140 }
141 level->setData(x, y, z, fillLevel - 1, Tile::UPDATE_CLIENTS);
142 level->updateNeighbourForOutputSignal(x, y, z, id);
143 }
144 }
145 else if (fillLevel > 0)
146 {
147 ArmorItem *armor = dynamic_cast<ArmorItem *>(item->getItem());
148 if(armor && armor->getMaterial() == ArmorItem::ArmorMaterial::CLOTH)
149 {
150 armor->clearColor(item);
151 level->setData(x, y, z, fillLevel - 1, Tile::UPDATE_CLIENTS);
152 level->updateNeighbourForOutputSignal(x, y, z, id);
153 return true;
154 }
155 }
156
157 return true;
158
159}
160
161void CauldronTile::handleRain(Level *level, int x, int y, int z)
162{
163 if (level->random->nextInt(20) != 1) return;
164
165 int data = level->getData(x, y, z);
166
167 if (data < 3)
168 {
169 level->setData(x, y, z, data + 1, Tile::UPDATE_CLIENTS);
170 }
171}
172
173int CauldronTile::getResource(int data, Random *random, int playerBonusLevel)
174{
175 return Item::cauldron_Id;
176}
177
178int CauldronTile::cloneTileId(Level *level, int x, int y, int z)
179{
180 return Item::cauldron_Id;
181}
182
183bool CauldronTile::hasAnalogOutputSignal()
184{
185 return true;
186}
187
188int CauldronTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir)
189{
190 int data = level->getData(x, y, z);
191
192 return getFillLevel(data);
193}
194
195int CauldronTile::getFillLevel(int data)
196{
197 return data;
198}