the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 198 lines 5.0 kB view raw
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}