the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 189 lines 4.7 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.world.level.h" 3#include "net.minecraft.world.level.redstone.h" 4#include "net.minecraft.world.level.tile.h" 5#include "net.minecraft.world.phys.h" 6#include "net.minecraft.h" 7#include "net.minecraft.world.h" 8#include "BasePressurePlateTile.h" 9 10BasePressurePlateTile::BasePressurePlateTile(int id, const wstring &tex, Material *material) : Tile(id, material, isSolidRender()) 11{ 12 texture = tex; 13 setTicking(true); 14 15 // 4J Stu - Move this to derived classes 16 //updateShape(getDataForSignal(Redstone::SIGNAL_MAX)); 17} 18 19void BasePressurePlateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity) 20{ 21 updateShape(level->getData(x, y, z)); 22} 23 24void BasePressurePlateTile::updateShape(int data) 25{ 26 bool pressed = getSignalForData(data) > Redstone::SIGNAL_NONE; 27 float o = 1 / 16.0f; 28 29 if (pressed) 30 { 31 setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); 32 } 33 else 34 { 35 setShape(o, 0, o, 1 - o, 1 / 16.0f, 1 - o); 36 } 37} 38 39int BasePressurePlateTile::getTickDelay(Level *level) 40{ 41 return SharedConstants::TICKS_PER_SECOND; 42} 43 44AABB *BasePressurePlateTile::getAABB(Level *level, int x, int y, int z) 45{ 46 return NULL; 47} 48 49bool BasePressurePlateTile::isSolidRender(bool isServerLevel) 50{ 51 return false; 52} 53 54bool BasePressurePlateTile::blocksLight() 55{ 56 return false; 57} 58 59bool BasePressurePlateTile::isCubeShaped() 60{ 61 return false; 62} 63 64bool BasePressurePlateTile::isPathfindable(LevelSource *level, int x, int y, int z) 65{ 66 return true; 67} 68 69bool BasePressurePlateTile::mayPlace(Level *level, int x, int y, int z) 70{ 71 return level->isTopSolidBlocking(x, y - 1, z) || FenceTile::isFence(level->getTile(x, y - 1, z)); 72} 73 74void BasePressurePlateTile::neighborChanged(Level *level, int x, int y, int z, int type) 75{ 76 bool replace = false; 77 78 if (!level->isTopSolidBlocking(x, y - 1, z) && !FenceTile::isFence(level->getTile(x, y - 1, z))) replace = true; 79 80 if (replace) 81 { 82 spawnResources(level, x, y, z, level->getData(x, y, z), 0); 83 level->removeTile(x, y, z); 84 } 85} 86 87void BasePressurePlateTile::tick(Level *level, int x, int y, int z, Random *random) 88{ 89 if (level->isClientSide) return; 90 int signal = getSignalForData(level->getData(x, y, z)); 91 if (signal > Redstone::SIGNAL_NONE) checkPressed(level, x, y, z, signal); 92} 93 94void BasePressurePlateTile::entityInside(Level *level, int x, int y, int z, shared_ptr<Entity> entity) 95{ 96 if (level->isClientSide) return; 97 int signal = getSignalForData(level->getData(x, y, z)); 98 if (signal == Redstone::SIGNAL_NONE) checkPressed(level, x, y, z, signal); 99} 100 101void BasePressurePlateTile::checkPressed(Level *level, int x, int y, int z, int oldSignal) 102{ 103 int signal = getSignalStrength(level, x, y, z); 104 bool wasPressed = oldSignal > Redstone::SIGNAL_NONE; 105 bool shouldBePressed = signal > Redstone::SIGNAL_NONE; 106 107 if (oldSignal != signal) 108 { 109 level->setData(x, y, z, getDataForSignal(signal), Tile::UPDATE_CLIENTS); 110 updateNeighbours(level, x, y, z); 111 level->setTilesDirty(x, y, z, x, y, z); 112 } 113 114 if (!shouldBePressed && wasPressed) 115 { 116 level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.5f); 117 } 118 else if (shouldBePressed && !wasPressed) 119 { 120 level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); 121 } 122 123 if (shouldBePressed) 124 { 125 level->addToTickNextTick(x, y, z, id, getTickDelay(level)); 126 } 127} 128 129AABB *BasePressurePlateTile::getSensitiveAABB(int x, int y, int z) 130{ 131 float b = 2 / 16.0f; 132 return AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b); 133} 134 135void BasePressurePlateTile::onRemove(Level *level, int x, int y, int z, int id, int data) 136{ 137 if (getSignalForData(data) > 0) 138 { 139 updateNeighbours(level, x, y, z); 140 } 141 142 Tile::onRemove(level, x, y, z, id, data); 143} 144 145void BasePressurePlateTile::updateNeighbours(Level *level, int x, int y, int z) 146{ 147 level->updateNeighborsAt(x, y, z, id); 148 level->updateNeighborsAt(x, y - 1, z, id); 149} 150 151int BasePressurePlateTile::getSignal(LevelSource *level, int x, int y, int z, int dir) 152{ 153 return getSignalForData(level->getData(x, y, z)); 154} 155 156int BasePressurePlateTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) 157{ 158 if (dir == Facing::UP) 159 { 160 return getSignalForData(level->getData(x, y, z)); 161 } 162 else 163 { 164 return Redstone::SIGNAL_NONE; 165 } 166} 167 168bool BasePressurePlateTile::isSignalSource() 169{ 170 return true; 171} 172 173void BasePressurePlateTile::updateDefaultShape() 174{ 175 float x = 8 / 16.0f; 176 float y = 2 / 16.0f; 177 float z = 8 / 16.0f; 178 setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); 179} 180 181int BasePressurePlateTile::getPistonPushReaction() 182{ 183 return Material::PUSH_DESTROY; 184} 185 186void BasePressurePlateTile::registerIcons(IconRegister *iconRegister) 187{ 188 icon = iconRegister->registerIcon(texture); 189}