Files
minecraft-pe-0.6.1/src/world/level/tile/NetherReactor.cpp
2026-03-02 22:04:18 +03:00

75 lines
2.7 KiB
C++
Executable File

#include "NetherReactor.h"
#include "../../entity/player/Player.h"
#include "../Level.h"
#include "entity/NetherReactorTileEntity.h"
#include "NetherReactorPattern.h"
NetherReactor::NetherReactor( int id, int tex, const Material* material ) : super(id, tex, material) { }
bool NetherReactor::use( Level* level, int x, int y, int z, Player* player ) {
if(level->getLevelData()->getGameType() != GameType::Survival)
return false;
// Level, X, Z
NetherReactorPattern pattern;
for(int checkLevel = 0; checkLevel <= 2; ++checkLevel) {
for(int checkX = -1; checkX <= 1; ++checkX) {
for(int checkZ = -1; checkZ <= 1; ++checkZ) {
if(level->getTile(x + checkX, y + checkLevel - 1, z + checkZ) != pattern.getTileAt(checkLevel, checkX + 1, checkZ + 1)) {
player->displayClientMessage("Not the correct pattern!");
return false;
}
}
}
}
if(!canSpawnStartNetherReactor(level, x, y, z, player)) return false;
player->displayClientMessage("Active!");
NetherReactorTileEntity* reactor = static_cast<NetherReactorTileEntity*>(level->getTileEntity(x, y, z));
if (reactor != NULL) {
reactor->lightItUp(x, y, z);
}
return true;
}
TileEntity* NetherReactor::newTileEntity() {
return TileEntityFactory::createTileEntity(TileEntityType::NetherReactor);
}
void NetherReactor::setPhase(Level* level, int x, int y, int z, int phase) {
int curPhase = level->getData(x, y, z);
if(curPhase != phase) {
level->setData(x, y, z, phase);
}
}
int NetherReactor::getTexture( int face, int data ) {
switch(data) {
case 1: return tex-1;
case 2: return tex-2;
default: return tex;
}
}
bool NetherReactor::canSpawnStartNetherReactor( Level* level, int x, int y, int z, Player* player ) {
if(!allPlayersCloseToReactor(level, x, y, z)) {
player->displayClientMessage("All players need to be close to the reactor.");
return false;
} else if(y > LEVEL_HEIGHT - 28) {
player->displayClientMessage("The nether reactor needs to be built lower down.");
return false;
} else if(y < 2) {
player->displayClientMessage("The nether reactor needs to be built higher up.");
return false;
}
return true;
}
bool NetherReactor::allPlayersCloseToReactor( Level* level, int x, int y, int z ) {
for(PlayerList::const_iterator i = level->players.begin(); i != level->players.end(); ++i) {
Player* currentPlayer = (*i);
if(!(currentPlayer->x >= x - 5 && currentPlayer->x <= x + 5)) return false;
if(!(currentPlayer->y - currentPlayer->heightOffset >= y -1 && currentPlayer->y - currentPlayer->heightOffset <= y + 1)) return false;
if(!(currentPlayer->z >= z - 5 && currentPlayer->z <= z + 5)) return false;
}
return true;
}