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 "NotGateTile.h"
5#include "SoundTypes.h"
6#include "net.minecraft.world.h"
7
8unordered_map<Level *, deque<NotGateTile::Toggle> *> NotGateTile::recentToggles = unordered_map<Level *, deque<NotGateTile::Toggle> *>();
9
10// 4J - added, to tie in with other changes brought forward from 1.3.2 to associate toggles with a level. In addition to what the java
11// version does, we are also removing any references to levels that we are storing when they hit their dtor.
12void NotGateTile::removeLevelReferences(Level *level)
13{
14 if( recentToggles.find(level) != recentToggles.end() )
15 {
16 delete recentToggles[level];
17 recentToggles.erase(level);
18 }
19}
20
21bool NotGateTile::isToggledTooFrequently(Level *level, int x, int y, int z, bool add)
22{
23 // 4J - brought forward changes to associate toggles with a level from 1.3.2
24 if( recentToggles.find(level) == recentToggles.end() )
25 {
26 recentToggles[level] = new deque<Toggle>;
27 }
28 if (add) recentToggles[level]->push_back(Toggle(x, y, z, level->getGameTime()));
29 int count = 0;
30
31 AUTO_VAR(itEnd, recentToggles[level]->end());
32 for (AUTO_VAR(it, recentToggles[level]->begin()); it != itEnd; it++)
33 {
34 if (it->x == x && it->y == y && it->z == z)
35 {
36 count++;
37 if (count >= MAX_RECENT_TOGGLES)
38 {
39 return true;
40 }
41 }
42 }
43 return false;
44}
45
46NotGateTile::NotGateTile(int id, bool on) : TorchTile(id)
47{
48 this->on = on;
49 this->setTicking(true);
50}
51
52int NotGateTile::getTickDelay(Level *level)
53{
54 return 2;
55}
56
57void NotGateTile::onPlace(Level *level, int x, int y, int z)
58{
59 if (level->getData(x, y, z) == 0) TorchTile::onPlace(level, x, y, z);
60 if (on)
61 {
62 level->updateNeighborsAt(x, y - 1, z, id);
63 level->updateNeighborsAt(x, y + 1, z, id);
64 level->updateNeighborsAt(x - 1, y, z, id);
65 level->updateNeighborsAt(x + 1, y, z, id);
66 level->updateNeighborsAt(x, y, z - 1, id);
67 level->updateNeighborsAt(x, y, z + 1, id);
68 }
69}
70
71void NotGateTile::onRemove(Level *level, int x, int y, int z, int id, int data)
72{
73 if (on)
74 {
75 level->updateNeighborsAt(x, y - 1, z, this->id);
76 level->updateNeighborsAt(x, y + 1, z, this->id);
77 level->updateNeighborsAt(x - 1, y, z, this->id);
78 level->updateNeighborsAt(x + 1, y, z, this->id);
79 level->updateNeighborsAt(x, y, z - 1, this->id);
80 level->updateNeighborsAt(x, y, z + 1, this->id);
81 }
82}
83
84int NotGateTile::getSignal(LevelSource *level, int x, int y, int z, int face)
85{
86 if (!on) return Redstone::SIGNAL_NONE;
87
88 int dir = level->getData(x, y, z);
89
90 if (dir == 5 && face == 1) return Redstone::SIGNAL_NONE;
91 if (dir == 3 && face == 3) return Redstone::SIGNAL_NONE;
92 if (dir == 4 && face == 2) return Redstone::SIGNAL_NONE;
93 if (dir == 1 && face == 5) return Redstone::SIGNAL_NONE;
94 if (dir == 2 && face == 4) return Redstone::SIGNAL_NONE;
95
96 return Redstone::SIGNAL_MAX;
97}
98
99bool NotGateTile::hasNeighborSignal(Level *level, int x, int y, int z)
100{
101 int dir = level->getData(x, y, z);
102
103 if (dir == 5 && level->hasSignal(x, y - 1, z, 0)) return true;
104 if (dir == 3 && level->hasSignal(x, y, z - 1, 2)) return true;
105 if (dir == 4 && level->hasSignal(x, y, z + 1, 3)) return true;
106 if (dir == 1 && level->hasSignal(x - 1, y, z, 4)) return true;
107 if (dir == 2 && level->hasSignal(x + 1, y, z, 5)) return true;
108 return false;
109}
110
111void NotGateTile::tick(Level *level, int x, int y, int z, Random *random)
112{
113 bool neighborSignal = hasNeighborSignal(level, x, y, z);
114
115 // 4J - brought forward changes from 1.3.2 to associate toggles with level
116 if( recentToggles.find(level) != recentToggles.end() )
117 {
118 deque<Toggle> *toggles = recentToggles[level];
119 while (!toggles->empty() && level->getGameTime() - toggles->front().when > RECENT_TOGGLE_TIMER)
120 {
121 toggles->pop_front();
122 }
123 }
124
125 if (on)
126 {
127 if (neighborSignal)
128 {
129 level->setTileAndData(x, y, z, Tile::redstoneTorch_off_Id, level->getData(x, y, z), Tile::UPDATE_ALL);
130
131 if (isToggledTooFrequently(level, x, y, z, true))
132 {
133 app.DebugPrintf("Torch at (%d,%d,%d) has toggled too many times\n",x,y,z);
134
135 level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f);
136 for (int i = 0; i < 5; i++)
137 {
138 double xx = x + random->nextDouble() * 0.6 + 0.2;
139 double yy = y + random->nextDouble() * 0.6 + 0.2;
140 double zz = z + random->nextDouble() * 0.6 + 0.2;
141
142 level->addParticle(eParticleType_smoke, xx, yy, zz, 0, 0, 0);
143 }
144 }
145 }
146 }
147 else
148 {
149 if (!neighborSignal)
150 {
151 if (!isToggledTooFrequently(level, x, y, z, false))
152 {
153 level->setTileAndData(x, y, z, Tile::redstoneTorch_on_Id, level->getData(x, y, z), Tile::UPDATE_ALL);
154 }
155 else
156 {
157 app.DebugPrintf("Torch at (%d,%d,%d) has toggled too many times\n",x,y,z);
158 }
159 }
160 }
161}
162
163void NotGateTile::neighborChanged(Level *level, int x, int y, int z, int type)
164{
165 if (checkDoPop(level, x, y, z, type))
166 {
167 return;
168 }
169
170 bool neighborSignal = hasNeighborSignal(level, x, y, z);
171 if ((on && neighborSignal) || (!on && !neighborSignal))
172 {
173 level->addToTickNextTick(x, y, z, id, getTickDelay(level));
174 }
175}
176
177int NotGateTile::getDirectSignal(LevelSource *level, int x, int y, int z, int face)
178{
179 if (face == 0)
180 {
181 return getSignal(level, x, y, z, face);
182 }
183 return Redstone::SIGNAL_NONE;
184}
185
186int NotGateTile::getResource(int data, Random *random, int playerBonusLevel)
187{
188 return Tile::redstoneTorch_on_Id;
189}
190
191bool NotGateTile::isSignalSource()
192{
193 return true;
194}
195
196void NotGateTile::animateTick(Level *level, int xt, int yt, int zt, Random *random)
197{
198 if (!on) return;
199 int dir = level->getData(xt, yt, zt);
200 double x = xt + 0.5f + (random->nextFloat() - 0.5f) * 0.2;
201 double y = yt + 0.7f + (random->nextFloat() - 0.5f) * 0.2;
202 double z = zt + 0.5f + (random->nextFloat() - 0.5f) * 0.2;
203 double h = 0.22f;
204 double r = 0.27f;
205 if (dir == 1)
206 {
207 level->addParticle(eParticleType_reddust, x - r, y + h, z, 0, 0, 0);
208 }
209 else if(dir == 2)
210 {
211 level->addParticle(eParticleType_reddust, x + r, y + h, z, 0, 0, 0);
212 }
213 else if (dir == 3)
214 {
215 level->addParticle(eParticleType_reddust, x, y + h, z - r, 0, 0, 0);
216 }
217 else if (dir == 4)
218 {
219 level->addParticle(eParticleType_reddust, x, y + h, z + r, 0, 0, 0);
220 }
221 else
222 {
223 level->addParticle(eParticleType_reddust, x, y, z, 0, 0, 0);
224 }
225
226}
227
228int NotGateTile::cloneTileId(Level *level, int x, int y, int z)
229{
230 return Tile::redstoneTorch_on_Id;
231}
232
233void NotGateTile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime)
234{
235 deque<Toggle> *toggles = recentToggles[level];
236
237 if (toggles != NULL)
238 {
239 for (AUTO_VAR(it,toggles->begin()); it != toggles->end(); ++it)
240 {
241 (*it).when += delta;
242 }
243 }
244}
245
246bool NotGateTile::isMatching(int id)
247{
248 return id == Tile::redstoneTorch_off_Id || id == Tile::redstoneTorch_on_Id;
249}