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