From 468ae4a21150302611866077522396c7126a76b0 Mon Sep 17 00:00:00 2001 From: EpikIzCool Date: Tue, 24 Mar 2026 00:24:16 +0200 Subject: [PATCH] Whool Fix part 1 --- src/client/gamemode/CreativeMode.cpp | 125 +++++----- src/client/gamemode/CreativeMode.h | 53 ++-- src/client/gamemode/CreatorMode.cpp | 217 ++++++++--------- src/client/gamemode/CreatorMode.h | 235 +++++++++--------- src/client/gamemode/GameMode.cpp | 348 +++++++++++++-------------- 5 files changed, 475 insertions(+), 503 deletions(-) diff --git a/src/client/gamemode/CreativeMode.cpp b/src/client/gamemode/CreativeMode.cpp index 8be511a..c33cf8d 100755 --- a/src/client/gamemode/CreativeMode.cpp +++ b/src/client/gamemode/CreativeMode.cpp @@ -1,69 +1,56 @@ -#include "CreativeMode.h" -#include "../Minecraft.h" -#ifndef STANDALONE_SERVER -#include "../particle/ParticleEngine.h" -#endif -#include "../player/LocalPlayer.h" -#ifndef STANDALONE_SERVER -#include "../renderer/LevelRenderer.h" -#include "../sound/SoundEngine.h" -#endif -#include "../../world/level/Level.h" -//#include "../../network/Packet.h" -#include "../../network/packet/RemoveBlockPacket.h" -#include "../../world/entity/player/Abilities.h" - -static const int DestructionTickDelay = 5; - -CreativeMode::CreativeMode(Minecraft* minecraft) -: super(minecraft) -{ -} - -void CreativeMode::startDestroyBlock(int x, int y, int z, int face) { - if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) - return; - - creativeDestroyBlock(x, y, z, face); - destroyDelay = DestructionTickDelay; -} - -void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) { - minecraft->level->extinguishFire(x, y, z, face); - destroyBlock(x, y, z, face); -} - -void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) { - destroyDelay--; - if (destroyDelay <= 0) { - destroyDelay = DestructionTickDelay; - creativeDestroyBlock(x, y, z, face); - } -} - -void CreativeMode::stopDestroyBlock() { - destroyDelay = 0; -} - -void CreativeMode::initAbilities( Abilities& abilities ) { - abilities.mayfly = true; - abilities.instabuild = true; - abilities.invulnerable = true; -} - -bool CreativeMode::isCreativeType() { - return true; -} - -void CreativeMode::releaseUsingItem( Player* player ) { - if(player->getCarriedItem() != NULL) { - int oldItemId = player->getCarriedItem()->id; - int oldAux = player->getAuxData(); - super::releaseUsingItem(player); - if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) { - player->getCarriedItem()->setAuxValue(oldAux); - } - } else { - super::releaseUsingItem(player); - } -} +#include "CreativeMode.h" +#include "../Minecraft.h" +#ifndef STANDALONE_SERVER +#include "../particle/ParticleEngine.h" +#endif +#include "../player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "../renderer/LevelRenderer.h" +#include "../sound/SoundEngine.h" +#endif +#include "../../world/level/Level.h" +//#include "../../network/Packet.h" +#include "../../network/packet/RemoveBlockPacket.h" +#include "../../world/entity/player/Abilities.h" + +static const int DestructionTickDelay = 5; + +CreativeMode::CreativeMode(Minecraft* minecraft) +: super(minecraft) +{ +} + +void CreativeMode::startDestroyBlock(int x, int y, int z, int face) { + if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) + return; + + creativeDestroyBlock(x, y, z, face); + destroyDelay = DestructionTickDelay; +} + +void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) { + minecraft->level->extinguishFire(x, y, z, face); + destroyBlock(x, y, z, face); +} + +void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) { + destroyDelay--; + if (destroyDelay <= 0) { + destroyDelay = DestructionTickDelay; + creativeDestroyBlock(x, y, z, face); + } +} + +void CreativeMode::stopDestroyBlock() { + destroyDelay = 0; +} + +void CreativeMode::initAbilities( Abilities& abilities ) { + abilities.mayfly = true; + abilities.instabuild = true; + abilities.invulnerable = true; +} + +bool CreativeMode::isCreativeType() { + return true; +} diff --git a/src/client/gamemode/CreativeMode.h b/src/client/gamemode/CreativeMode.h index b418111..61f7d1b 100755 --- a/src/client/gamemode/CreativeMode.h +++ b/src/client/gamemode/CreativeMode.h @@ -1,27 +1,26 @@ -#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__ -#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__ - -//package net.minecraft.client.gamemode; - -#include "GameMode.h" - -class CreativeMode: public GameMode -{ - typedef GameMode super; -public: - CreativeMode(Minecraft* minecraft); - - void startDestroyBlock(int x, int y, int z, int face); - void continueDestroyBlock(int x, int y, int z, int face); - void stopDestroyBlock(); - - bool isCreativeType(); - - void initAbilities(Abilities& abilities); - - void releaseUsingItem(Player* player); -private: - void creativeDestroyBlock(int x, int y, int z, int face); -}; - -#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/ +#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__ +#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__ + +//package net.minecraft.client.gamemode; + +#include "GameMode.h" + +class CreativeMode: public GameMode +{ + typedef GameMode super; +public: + CreativeMode(Minecraft* minecraft); + + void startDestroyBlock(int x, int y, int z, int face); + void continueDestroyBlock(int x, int y, int z, int face); + void stopDestroyBlock(); + + bool isCreativeType(); + + void initAbilities(Abilities& abilities); + +private: + void creativeDestroyBlock(int x, int y, int z, int face); +}; + +#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/ diff --git a/src/client/gamemode/CreatorMode.cpp b/src/client/gamemode/CreatorMode.cpp index e06d624..c33d0f5 100755 --- a/src/client/gamemode/CreatorMode.cpp +++ b/src/client/gamemode/CreatorMode.cpp @@ -1,115 +1,102 @@ -#include "CreatorMode.h" -#include "../Minecraft.h" -#include "../particle/ParticleEngine.h" -#include "../player/LocalPlayer.h" -#include "../renderer/LevelRenderer.h" -#include "../sound/SoundEngine.h" -#include "../../world/level/Level.h" -//#include "../../network/Packet.h" -#include "../../network/packet/RemoveBlockPacket.h" -#include "../../world/entity/player/Abilities.h" - -static const int DestructionTickDelay = 5; - -class Creator: public ICreator { - //virtual void getEvents(); - -public: - Creator(/*int eventLifeTime*/) - : _tileEvents(32), - _tickId(0) - { - } - - void setTick(int tick) { - _tickId = tick; - } - - EventList& getTileEvents() { return _tileEvents; } - - void addevent_blockUse(int entityId, int x, int y, int z, int face) { - TileEvent t = { - entityId, - x,y,z, - face - }; - _tileEvents.add(t, _tickId); - } - -private: - EventList _tileEvents; - int _tickId; -}; - -CreatorMode::CreatorMode(Minecraft* minecraft) -: super(minecraft) -{ - _creator = new Creator(); -} - -CreatorMode::~CreatorMode() { - delete _creator; -} - -void CreatorMode::startDestroyBlock(int x, int y, int z, int face) { - if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) - return; - - CreatorDestroyBlock(x, y, z, face); - destroyDelay = DestructionTickDelay; -} - -void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) { - minecraft->level->extinguishFire(x, y, z, face); - destroyBlock(x, y, z, face); -} - -void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) { - destroyDelay--; - if (destroyDelay <= 0) { - destroyDelay = DestructionTickDelay; - CreatorDestroyBlock(x, y, z, face); - } -} - -bool CreatorMode::useItemOn( Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit ) { - if (item && item->id == ((Item*)Item::sword_iron)->id) - _creator->addevent_blockUse(player->entityId, x, y, z, face); - return super::useItemOn(player, level, item, x, y, z, face, hit); -} - -void CreatorMode::stopDestroyBlock() { - destroyDelay = 0; -} - -void CreatorMode::initAbilities( Abilities& abilities ) { - abilities.mayfly = true; - abilities.instabuild = true; - abilities.invulnerable = true; -} - -bool CreatorMode::isCreativeType() { - return true; -} - -void CreatorMode::releaseUsingItem( Player* player ) { - if(player->getCarriedItem() != NULL) { - int oldItemId = player->getCarriedItem()->id; - int oldAux = player->getAuxData(); - super::releaseUsingItem(player); - if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) { - player->getCarriedItem()->setAuxValue(oldAux); - } - } else { - super::releaseUsingItem(player); - } -} - -ICreator* CreatorMode::getCreator() { - return _creator; -} - -void CreatorMode::tick() { - _creator->setTick(minecraft->level->getTime()); - super::tick(); -} +#include "CreatorMode.h" +#include "../Minecraft.h" +#include "../particle/ParticleEngine.h" +#include "../player/LocalPlayer.h" +#include "../renderer/LevelRenderer.h" +#include "../sound/SoundEngine.h" +#include "../../world/level/Level.h" +//#include "../../network/Packet.h" +#include "../../network/packet/RemoveBlockPacket.h" +#include "../../world/entity/player/Abilities.h" + +static const int DestructionTickDelay = 5; + +class Creator: public ICreator { + //virtual void getEvents(); + +public: + Creator(/*int eventLifeTime*/) + : _tileEvents(32), + _tickId(0) + { + } + + void setTick(int tick) { + _tickId = tick; + } + + EventList& getTileEvents() { return _tileEvents; } + + void addevent_blockUse(int entityId, int x, int y, int z, int face) { + TileEvent t = { + entityId, + x,y,z, + face + }; + _tileEvents.add(t, _tickId); + } + +private: + EventList _tileEvents; + int _tickId; +}; + +CreatorMode::CreatorMode(Minecraft* minecraft) +: super(minecraft) +{ + _creator = new Creator(); +} + +CreatorMode::~CreatorMode() { + delete _creator; +} + +void CreatorMode::startDestroyBlock(int x, int y, int z, int face) { + if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) + return; + + CreatorDestroyBlock(x, y, z, face); + destroyDelay = DestructionTickDelay; +} + +void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) { + minecraft->level->extinguishFire(x, y, z, face); + destroyBlock(x, y, z, face); +} + +void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) { + destroyDelay--; + if (destroyDelay <= 0) { + destroyDelay = DestructionTickDelay; + CreatorDestroyBlock(x, y, z, face); + } +} + +bool CreatorMode::useItemOn( Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit ) { + if (item && item->id == ((Item*)Item::sword_iron)->id) + _creator->addevent_blockUse(player->entityId, x, y, z, face); + return super::useItemOn(player, level, item, x, y, z, face, hit); +} + +void CreatorMode::stopDestroyBlock() { + destroyDelay = 0; +} + +void CreatorMode::initAbilities( Abilities& abilities ) { + abilities.mayfly = true; + abilities.instabuild = true; + abilities.invulnerable = true; +} + +bool CreatorMode::isCreativeType() { + return true; +} + +ICreator* CreatorMode::getCreator() { + return _creator; +} + +void CreatorMode::tick() { + _creator->setTick(minecraft->level->getTime()); + super::tick(); +} diff --git a/src/client/gamemode/CreatorMode.h b/src/client/gamemode/CreatorMode.h index a74fe52..8e0ece7 100755 --- a/src/client/gamemode/CreatorMode.h +++ b/src/client/gamemode/CreatorMode.h @@ -1,61 +1,61 @@ -#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__ -#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__ - -//package net.minecraft.client.gamemode; - -#include "GameMode.h" -#include "../../world/PosTranslator.h" - -class ICreator { -public: - virtual ~ICreator() {} - - struct TileEvent { - int entityId; - int x, y, z; - int face; - - void write(std::stringstream& ss, IPosTranslator& t) const { - int xx = x, yy = y, zz = z; - t.to(xx, yy, zz); - ss << xx << "," << yy << "," << zz << "," << face << "," << entityId; - } - }; - - template - class EventList { - public: - EventList(int size) { - _events.reserve(size); - _maxSize = (int)size; - clear(); - } - void clear() { - _index = -1; - _size = 0; - } - void add(const T& item, int tick) { - if (_size < _maxSize) { - _events.push_back(Item()); - ++_size; - } - Item& e = _events[_nextIndex()]; - e.item = item; - e.timestamp = tick; - } - int size() const { - return _size; - } - - const T& operator[](int i) const { - return _events[_getIndex(i)].item; - } - - T& operator[](int i) { - return _events[_getIndex(i)].item; - } - - void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const { +#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__ +#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__ + +//package net.minecraft.client.gamemode; + +#include "GameMode.h" +#include "../../world/PosTranslator.h" + +class ICreator { +public: + virtual ~ICreator() {} + + struct TileEvent { + int entityId; + int x, y, z; + int face; + + void write(std::stringstream& ss, IPosTranslator& t) const { + int xx = x, yy = y, zz = z; + t.to(xx, yy, zz); + ss << xx << "," << yy << "," << zz << "," << face << "," << entityId; + } + }; + + template + class EventList { + public: + EventList(int size) { + _events.reserve(size); + _maxSize = (int)size; + clear(); + } + void clear() { + _index = -1; + _size = 0; + } + void add(const T& item, int tick) { + if (_size < _maxSize) { + _events.push_back(Item()); + ++_size; + } + Item& e = _events[_nextIndex()]; + e.item = item; + e.timestamp = tick; + } + int size() const { + return _size; + } + + const T& operator[](int i) const { + return _events[_getIndex(i)].item; + } + + T& operator[](int i) { + return _events[_getIndex(i)].item; + } + + void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const { int i = _getFirstNewerIndex(minTimetamp); if (i < 0) return; @@ -66,63 +66,62 @@ public: ss << "|"; if (++i == _size) i = 0; } - } - - private: - int _getIndex(int i) const { return (1 + _index + i) % _size; } - int _nextIndex() { - if (++_index == _size) _index = 0; - return _index; - } - - int _getFirstNewerIndex(int timestamp) const { - for (int i = _index + 1, j = 0; j < _size; ++i, ++j) { - if (i == _size) i = 0; - if (_events[i].timestamp >= timestamp) return i; - } - return -1; - } - struct Item { - int timestamp; - T item; - }; - - int _index; - int _size; - int _maxSize; - std::vector _events; - }; - - virtual EventList& getTileEvents() = 0; -}; - -class Creator; - -class CreatorMode: public GameMode -{ - typedef GameMode super; -public: - CreatorMode(Minecraft* minecraft); - ~CreatorMode(); - - void startDestroyBlock(int x, int y, int z, int face); - void continueDestroyBlock(int x, int y, int z, int face); - void stopDestroyBlock(); - - bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit); - - void tick(); - ICreator* getCreator(); - - bool isCreativeType(); - - void initAbilities(Abilities& abilities); - - void releaseUsingItem(Player* player); -private: - void CreatorDestroyBlock(int x, int y, int z, int face); - - Creator* _creator; -}; - -#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/ + } + + private: + int _getIndex(int i) const { return (1 + _index + i) % _size; } + int _nextIndex() { + if (++_index == _size) _index = 0; + return _index; + } + + int _getFirstNewerIndex(int timestamp) const { + for (int i = _index + 1, j = 0; j < _size; ++i, ++j) { + if (i == _size) i = 0; + if (_events[i].timestamp >= timestamp) return i; + } + return -1; + } + struct Item { + int timestamp; + T item; + }; + + int _index; + int _size; + int _maxSize; + std::vector _events; + }; + + virtual EventList& getTileEvents() = 0; +}; + +class Creator; + +class CreatorMode: public GameMode +{ + typedef GameMode super; +public: + CreatorMode(Minecraft* minecraft); + ~CreatorMode(); + + void startDestroyBlock(int x, int y, int z, int face); + void continueDestroyBlock(int x, int y, int z, int face); + void stopDestroyBlock(); + + bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit); + + void tick(); + ICreator* getCreator(); + + bool isCreativeType(); + + void initAbilities(Abilities& abilities); + +private: + void CreatorDestroyBlock(int x, int y, int z, int face); + + Creator* _creator; +}; + +#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/ diff --git a/src/client/gamemode/GameMode.cpp b/src/client/gamemode/GameMode.cpp index 292165a..de6df50 100755 --- a/src/client/gamemode/GameMode.cpp +++ b/src/client/gamemode/GameMode.cpp @@ -1,174 +1,174 @@ -#include "GameMode.h" -#include "../Minecraft.h" -#include "../../network/packet/UseItemPacket.h" -#include "../../network/packet/PlayerActionPacket.h" -#include "../../world/level/Level.h" -#include "../../world/item/ItemInstance.h" -#include "../player/LocalPlayer.h" -#include "client/Options.h" -#ifndef STANDALONE_SERVER -#include "../sound/SoundEngine.h" -#include "../particle/ParticleEngine.h" -#endif -#include "../../network/RakNetInstance.h" -#include "../../network/packet/RemoveBlockPacket.h" -#ifndef STANDALONE_SERVER -#include "../renderer/LevelRenderer.h" -#endif -#include "../../world/level/material/Material.h" - -GameMode::GameMode( Minecraft* minecraft) -: minecraft(minecraft), - destroyProgress(0), - oDestroyProgress(0), - destroyTicks(0), - destroyDelay(0) -{ -} - -/*virtual*/ -Player* GameMode::createPlayer(Level* level) { - return new LocalPlayer(minecraft, level, minecraft->options.getStringValue(OPTIONS_USERNAME), level->dimension->id, isCreativeType()); -} - -/*virtual*/ -void GameMode::interact(Player* player, Entity* entity) { - player->interact(entity); -} - -/*virtual*/ -void GameMode::attack(Player* player, Entity* entity) { - if (minecraft->level->adventureSettings.noPvP && entity->isPlayer()) - return; - if (minecraft->level->adventureSettings.noPvM && entity->isMob()) - return; - player->attack(entity); -} - -/* virtual */ -void GameMode::startDestroyBlock( int x, int y, int z, int face ) { - if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) - return; - destroyBlock(x, y, z, face); -} - -/*virtual*/ -bool GameMode::destroyBlock(int x, int y, int z, int face) { - Level* level = minecraft->level; - Tile* oldTile = Tile::tiles[level->getTile(x, y, z)]; - if (!oldTile) - return false; - - if (level->adventureSettings.immutableWorld) { - if (oldTile != (Tile*)Tile::leaves - && oldTile->material != Material::plant) { - return false; - } - } -#ifndef STANDALONE_SERVER - minecraft->particleEngine->destroy(x, y, z); -#endif - int data = level->getData(x, y, z); - bool changed = level->setTile(x, y, z, 0); - if (changed) { -#ifndef STANDALONE_SERVER - minecraft->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f); -#endif - oldTile->destroy(level, x, y, z, data); - if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24); - - if (minecraft->isOnline()) { - RemoveBlockPacket packet(minecraft->player, x, y, z); - minecraft->raknetInstance->send(packet); - } - } - return changed; -} -/*virtual*/ -bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) { - float clickX = hit.x - x; - float clickY = hit.y - y; - float clickZ = hit.z - z; - item = player->inventory->getSelected(); - if(level->isClientSide) { - UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ); - minecraft->raknetInstance->send(packet); - } - int t = level->getTile(x, y, z); - if (t == Tile::invisible_bedrock->id) return false; - if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player)) - return true; - - if (item == NULL) return false; - if(isCreativeType()) { - int aux = item->getAuxValue(); - int count = item->count; - bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ); - item->setAuxValue(aux); - item->count = count; - return success; - } else { - return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ); - } -} - -bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) { - int oldCount = item->count; - - ItemInstance* itemInstance = item->use(level, player); - if(level->isClientSide) { - UseItemPacket packet(item, player->entityId, player->aimDirection); - minecraft->raknetInstance->send(packet); - } - if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) { - //player.inventory.items[player.inventory.selected] = itemInstance; - //if (itemInstance.count == 0) { - // player.inventory.items[player.inventory.selected] = NULL; - //} - return true; - } - return false; -} - -ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) { - //return player.containerMenu.clicked(slotNum, buttonNum, player); - return NULL; -} - -void GameMode::handleCloseInventory( int containerId, Player* player ) { - //player.containerMenu.removed(player); - //player.containerMenu = player.inventoryMenu; -} - -float GameMode::getPickRange() { - return 5.0f; -} - -void GameMode::initPlayer( Player* player ) { - initAbilities(player->abilities); -} - -void GameMode::releaseUsingItem(Player* player){ - if(minecraft->level->isClientSide) { - PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId); - minecraft->raknetInstance->send(packet); - } - player->releaseUsingItem(); -} - -void GameMode::tick() { - oDestroyProgress = destroyProgress; -} - -void GameMode::render( float a ) { -#ifndef STANDALONE_SERVER - if (destroyProgress <= 0) { - minecraft->gui.progress = 0; - minecraft->levelRenderer->destroyProgress = 0; - } else { - float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a; - minecraft->gui.progress = dp; - minecraft->levelRenderer->destroyProgress = dp; - } -#endif -} +#include "GameMode.h" +#include "../Minecraft.h" +#include "../../network/packet/UseItemPacket.h" +#include "../../network/packet/PlayerActionPacket.h" +#include "../../world/level/Level.h" +#include "../../world/item/ItemInstance.h" +#include "../player/LocalPlayer.h" +#include "client/Options.h" +#ifndef STANDALONE_SERVER +#include "../sound/SoundEngine.h" +#include "../particle/ParticleEngine.h" +#endif +#include "../../network/RakNetInstance.h" +#include "../../network/packet/RemoveBlockPacket.h" +#ifndef STANDALONE_SERVER +#include "../renderer/LevelRenderer.h" +#endif +#include "../../world/level/material/Material.h" + +GameMode::GameMode( Minecraft* minecraft) +: minecraft(minecraft), + destroyProgress(0), + oDestroyProgress(0), + destroyTicks(0), + destroyDelay(0) +{ +} + +/*virtual*/ +Player* GameMode::createPlayer(Level* level) { + return new LocalPlayer(minecraft, level, minecraft->options.getStringValue(OPTIONS_USERNAME), level->dimension->id, isCreativeType()); +} + +/*virtual*/ +void GameMode::interact(Player* player, Entity* entity) { + player->interact(entity); +} + +/*virtual*/ +void GameMode::attack(Player* player, Entity* entity) { + if (minecraft->level->adventureSettings.noPvP && entity->isPlayer()) + return; + if (minecraft->level->adventureSettings.noPvM && entity->isMob()) + return; + player->attack(entity); +} + +/* virtual */ +void GameMode::startDestroyBlock( int x, int y, int z, int face ) { + if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) + return; + destroyBlock(x, y, z, face); +} + +/*virtual*/ +bool GameMode::destroyBlock(int x, int y, int z, int face) { + Level* level = minecraft->level; + Tile* oldTile = Tile::tiles[level->getTile(x, y, z)]; + if (!oldTile) + return false; + + if (level->adventureSettings.immutableWorld) { + if (oldTile != (Tile*)Tile::leaves + && oldTile->material != Material::plant) { + return false; + } + } +#ifndef STANDALONE_SERVER + minecraft->particleEngine->destroy(x, y, z); +#endif + int data = level->getData(x, y, z); + bool changed = level->setTile(x, y, z, 0); + if (changed) { +#ifndef STANDALONE_SERVER + minecraft->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f); +#endif + oldTile->destroy(level, x, y, z, data); + if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24); + + if (minecraft->isOnline()) { + RemoveBlockPacket packet(minecraft->player, x, y, z); + minecraft->raknetInstance->send(packet); + } + } + return changed; +} +/*virtual*/ +bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) { + float clickX = hit.x - x; + float clickY = hit.y - y; + float clickZ = hit.z - z; + if (level->isClientSide) { + item = player->inventory->getSelected(); + UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ); + minecraft->raknetInstance->send(packet); + } + int t = level->getTile(x, y, z); + if (t == Tile::invisible_bedrock->id) return false; + if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player)) + return true; + + if (item == NULL) return false; + if(isCreativeType()) { + int aux = item->getAuxValue(); + int count = item->count; + bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ); + item->setAuxValue(aux); + item->count = count; + return success; + } else { + return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ); + } +} + +bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) { + int oldCount = item->count; + + ItemInstance* itemInstance = item->use(level, player); + if(level->isClientSide) { + UseItemPacket packet(item, player->entityId, player->aimDirection); + minecraft->raknetInstance->send(packet); + } + if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) { + //player.inventory.items[player.inventory.selected] = itemInstance; + //if (itemInstance.count == 0) { + // player.inventory.items[player.inventory.selected] = NULL; + //} + return true; + } + return false; +} + +ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) { + //return player.containerMenu.clicked(slotNum, buttonNum, player); + return NULL; +} + +void GameMode::handleCloseInventory( int containerId, Player* player ) { + //player.containerMenu.removed(player); + //player.containerMenu = player.inventoryMenu; +} + +float GameMode::getPickRange() { + return 5.0f; +} + +void GameMode::initPlayer( Player* player ) { + initAbilities(player->abilities); +} + +void GameMode::releaseUsingItem(Player* player){ + if (minecraft->level->isClientSide && player->isUsingItem()) { + PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId); + minecraft->raknetInstance->send(packet); + } + player->releaseUsingItem(); +} + +void GameMode::tick() { + oDestroyProgress = destroyProgress; +} + +void GameMode::render( float a ) { +#ifndef STANDALONE_SERVER + if (destroyProgress <= 0) { + minecraft->gui.progress = 0; + minecraft->levelRenderer->destroyProgress = 0; + } else { + float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a; + minecraft->gui.progress = dp; + minecraft->levelRenderer->destroyProgress = dp; + } +#endif +}