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 "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}