the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 249 lines 6.8 kB view raw
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}