mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-03-30 20:13:31 +00:00
100 lines
2.8 KiB
C++
Executable File
100 lines
2.8 KiB
C++
Executable File
#include "SurvivalMode.h"
|
|
#include "../Minecraft.h"
|
|
#include "../player/LocalPlayer.h"
|
|
#ifndef STANDALONE_SERVER
|
|
#include "../particle/ParticleEngine.h"
|
|
#include "../sound/SoundEngine.h"
|
|
#endif
|
|
#include "../../world/level/Level.h"
|
|
#include "../../world/entity/player/Abilities.h"
|
|
|
|
SurvivalMode::SurvivalMode( Minecraft* minecraft )
|
|
: super(minecraft),
|
|
xDestroyBlock(-1),
|
|
yDestroyBlock(-1),
|
|
zDestroyBlock(-1)
|
|
{
|
|
}
|
|
|
|
void SurvivalMode::continueDestroyBlock( int x, int y, int z, int face ) {
|
|
if (destroyDelay > 0) {
|
|
destroyDelay--;
|
|
return;
|
|
}
|
|
|
|
if (x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock) {
|
|
int t = minecraft->level->getTile(x, y, z);
|
|
if (t == 0) return;
|
|
Tile* tile = Tile::tiles[t];
|
|
|
|
destroyProgress += tile->getDestroyProgress(minecraft->player);
|
|
|
|
if ((++destroyTicks & 3) == 1) {
|
|
#ifndef STANDALONE_SERVER
|
|
if (tile != NULL) {
|
|
minecraft->soundEngine->play(tile->soundType->getStepSound(), x + 0.5f, y + 0.5f, z + 0.5f, (tile->soundType->getVolume() + 1) / 8, tile->soundType->getPitch() * 0.5f);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if (destroyProgress >= 1) {
|
|
destroyBlock(x, y, z, face);
|
|
destroyProgress = 0;
|
|
oDestroyProgress = 0;
|
|
destroyTicks = 0;
|
|
destroyDelay = 5;
|
|
}
|
|
} else {
|
|
destroyProgress = 0;
|
|
oDestroyProgress = 0;
|
|
destroyTicks = 0;
|
|
xDestroyBlock = x;
|
|
yDestroyBlock = y;
|
|
zDestroyBlock = z;
|
|
}
|
|
}
|
|
|
|
bool SurvivalMode::destroyBlock( int x, int y, int z, int face ) {
|
|
int t = minecraft->level->getTile(x, y, z);
|
|
int data = minecraft->level->getData(x, y, z);
|
|
bool changed = GameMode::destroyBlock(x, y, z, face);
|
|
bool couldDestroy = minecraft->player->canDestroy(Tile::tiles[t]);
|
|
|
|
ItemInstance* item = minecraft->player->inventory->getSelected();
|
|
if (item != NULL) {
|
|
item->mineBlock(t, x, y, z);
|
|
if (item->count == 0) {
|
|
//item->snap(minecraft->player);
|
|
minecraft->player->inventory->clearSlot(minecraft->player->inventory->selected);
|
|
}
|
|
}
|
|
|
|
if (changed && couldDestroy) {
|
|
ItemInstance instance(t, 1, data);
|
|
Tile::tiles[t]->playerDestroy(minecraft->level, minecraft->player, x, y, z, data);
|
|
}
|
|
return changed;
|
|
}
|
|
|
|
void SurvivalMode::stopDestroyBlock() {
|
|
destroyProgress = 0;
|
|
destroyDelay = 0;
|
|
}
|
|
|
|
void SurvivalMode::initAbilities( Abilities& abilities ) {
|
|
abilities.flying = false;
|
|
abilities.mayfly = false;
|
|
abilities.instabuild = false;
|
|
abilities.invulnerable = false;
|
|
}
|
|
|
|
void SurvivalMode::startDestroyBlock( int x, int y, int z, int face ) {
|
|
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
|
return;
|
|
|
|
int t = minecraft->level->getTile(x, y, z);
|
|
if (t > 0 && destroyProgress == 0) Tile::tiles[t]->attack(minecraft->level, x, y, z, minecraft->player);
|
|
if (t > 0 && Tile::tiles[t]->getDestroyProgress(minecraft->player) >= 1)
|
|
destroyBlock(x, y, z, face);
|
|
}
|