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