the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 229 lines 5.5 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.world.item.h" 3#include "net.minecraft.world.level.h" 4#include "net.minecraft.world.level.tile.h" 5#include "net.minecraft.world.phys.h" 6#include "TripWireTile.h" 7 8TripWireTile::TripWireTile(int id) : Tile(id, Material::decoration, isSolidRender()) 9{ 10 setShape(0, 0, 0, 1, 2.5f / 16.0f, 1); 11 this->setTicking(true); 12} 13 14int TripWireTile::getTickDelay(Level *level) 15{ 16 // 4J: Increased (x2); quick update caused problems with shared 17 // data between client and server. 18 return 20; // 10; 19} 20 21AABB *TripWireTile::getAABB(Level *level, int x, int y, int z) 22{ 23 return NULL; 24} 25 26bool TripWireTile::blocksLight() 27{ 28 return false; 29} 30 31bool TripWireTile::isSolidRender(bool isServerLevel) 32{ 33 return false; 34} 35 36bool TripWireTile::isCubeShaped() 37{ 38 return false; 39} 40 41int TripWireTile::getRenderLayer() 42{ 43 return 1; 44} 45 46int TripWireTile::getRenderShape() 47{ 48 return Tile::SHAPE_TRIPWIRE; 49} 50 51int TripWireTile::getResource(int data, Random *random, int playerBonusLevel) 52{ 53 return Item::string_Id; 54} 55 56int TripWireTile::cloneTileId(Level *level, int x, int y, int z) 57{ 58 return Item::string_Id; 59} 60 61void TripWireTile::neighborChanged(Level *level, int x, int y, int z, int type) 62{ 63 int data = level->getData(x, y, z); 64 bool wasSuspended = (data & MASK_SUSPENDED) == MASK_SUSPENDED; 65 bool isSuspended = !level->isTopSolidBlocking(x, y - 1, z); 66 if (wasSuspended != isSuspended) 67 { 68 spawnResources(level, x, y, z, data, 0); 69 level->removeTile(x, y, z); 70 } 71} 72 73void TripWireTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity) 74{ 75 int data = level->getData(x, y, z); 76 bool attached = (data & MASK_ATTACHED) == MASK_ATTACHED; 77 bool suspended = (data & MASK_SUSPENDED) == MASK_SUSPENDED; 78 79 if (!suspended) 80 { 81 setShape(0, 0, 0, 1, 1.5f / 16.0f, 1); 82 } 83 else if (!attached) 84 { 85 setShape(0, 0, 0, 1, 8.0f / 16.0f, 1); 86 } 87 else 88 { 89 setShape(0, 1.0f / 16.0f, 0, 1, 2.5f / 16.0f, 1); 90 } 91} 92 93void TripWireTile::onPlace(Level *level, int x, int y, int z) 94{ 95 int data = level->isTopSolidBlocking(x, y - 1, z) ? 0 : MASK_SUSPENDED; 96 level->setData(x, y, z, data, Tile::UPDATE_ALL); 97 updateSource(level, x, y, z, data); 98} 99 100void TripWireTile::onRemove(Level *level, int x, int y, int z, int id, int data) 101{ 102 updateSource(level, x, y, z, data | MASK_POWERED); 103} 104 105void TripWireTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr<Player> player) 106{ 107 if (level->isClientSide) return; 108 109 if (player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears_Id) 110 { 111 level->setData(x, y, z, data | MASK_DISARMED, Tile::UPDATE_NONE); 112 } 113} 114 115void TripWireTile::updateSource(Level *level, int x, int y, int z, int data) 116{ 117 for (int dir = 0; dir < 2; dir++) 118 { 119 for (int i = 1; i < TripWireSourceTile::WIRE_DIST_MAX; i++) 120 { 121 int xx = x + Direction::STEP_X[dir] * i; 122 int zz = z + Direction::STEP_Z[dir] * i; 123 int tile = level->getTile(xx, y, zz); 124 125 if (tile == Tile::tripWireSource_Id) 126 { 127 int sourceDir = level->getData(xx, y, zz) & TripWireSourceTile::MASK_DIR; 128 129 if (sourceDir == Direction::DIRECTION_OPPOSITE[dir]) 130 { 131 Tile::tripWireSource->calculateState(level, xx, y, zz, tile, level->getData(xx, y, zz), true, i, data); 132 } 133 134 break; 135 } 136 else if (tile != Tile::tripWire_Id) 137 { 138 break; 139 } 140 } 141 } 142} 143 144void TripWireTile::entityInside(Level *level, int x, int y, int z, shared_ptr<Entity> entity) 145{ 146 if (level->isClientSide) return; 147 148 if ((level->getData(x, y, z) & MASK_POWERED) == MASK_POWERED) return; 149 150 checkPressed(level, x, y, z); 151} 152 153void TripWireTile::tick(Level *level, int x, int y, int z, Random *random) 154{ 155 if (level->isClientSide) return; 156 157 if ((level->getData(x, y, z) & MASK_POWERED) != MASK_POWERED) return; 158 159 checkPressed(level, x, y, z); 160} 161 162void TripWireTile::checkPressed(Level *level, int x, int y, int z) 163{ 164 int data = level->getData(x, y, z); 165 bool wasPressed = (data & MASK_POWERED) == MASK_POWERED; 166 bool shouldBePressed = false; 167 168 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); 169 vector<shared_ptr<Entity> > *entities = level->getEntities(nullptr, AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1)); 170 if (!entities->empty()) 171 { 172 for (AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) 173 { 174 shared_ptr<Entity> e = *it; 175 if (!e->isIgnoringTileTriggers()) 176 { 177 shouldBePressed = true; 178 break; 179 } 180 } 181 } 182 183 if (shouldBePressed && !wasPressed) 184 { 185 data |= MASK_POWERED; 186 } 187 188 if (!shouldBePressed && wasPressed) 189 { 190 data &= ~MASK_POWERED; 191 } 192 193 if (shouldBePressed != wasPressed) 194 { 195 level->setData(x, y, z, data, Tile::UPDATE_ALL); 196 updateSource(level, x, y, z, data); 197 } 198 199 if (shouldBePressed) 200 { 201 level->addToTickNextTick(x, y, z, id, getTickDelay(level)); 202 } 203} 204 205bool TripWireTile::shouldConnectTo(LevelSource *level, int x, int y, int z, int data, int dir) 206{ 207 int tx = x + Direction::STEP_X[dir]; 208 int ty = y; 209 int tz = z + Direction::STEP_Z[dir]; 210 int t = level->getTile(tx, ty, tz); 211 bool suspended = (data & MASK_SUSPENDED) == MASK_SUSPENDED; 212 213 if (t == Tile::tripWireSource_Id) 214 { 215 int otherData = level->getData(tx, ty, tz); 216 int facing = otherData & TripWireSourceTile::MASK_DIR; 217 218 return facing == Direction::DIRECTION_OPPOSITE[dir]; 219 } 220 221 if (t == Tile::tripWire_Id) 222 { 223 int otherData = level->getData(tx, ty, tz); 224 bool otherSuspended = (otherData & MASK_SUSPENDED) == MASK_SUSPENDED; 225 return suspended == otherSuspended; 226 } 227 228 return false; 229}