From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/GameMode.cpp | 182 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 Minecraft.Client/GameMode.cpp (limited to 'Minecraft.Client/GameMode.cpp') diff --git a/Minecraft.Client/GameMode.cpp b/Minecraft.Client/GameMode.cpp new file mode 100644 index 00000000..a11d6c07 --- /dev/null +++ b/Minecraft.Client/GameMode.cpp @@ -0,0 +1,182 @@ +#include "stdafx.h" +#include "GameMode.h" +#include "LocalPlayer.h" +#include "LevelRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" + +GameMode::GameMode(Minecraft *minecraft) +{ + instaBuild = false; // 4J - added + this->minecraft = minecraft; +} + +void GameMode::initLevel(Level *level) +{ +} + +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 == NULL) return false; + + // 4J - Let the rendering side of thing know we are about to destroy the tile, so we can synchronise collision with async render data upates. + minecraft->levelRenderer->destroyedTileManager->destroyingTileAt(level, x, y, z); + level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, oldTile->id + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); + int data = level->getData(x, y, z); + // 4J - before we remove the tile, recalc the heightmap - setTile depends on this being valid to be able to do + // a quick update of skylighting when the block is removed, and there are cases with falling tiles where this can get out of sync + level->getChunkAt(x,z)->recalcHeightmapOnly(); + bool changed = level->setTile(x, y, z, 0); + + if (oldTile != NULL && changed) + { + oldTile->destroy(level, x, y, z, data); + } + return changed; +} + +void GameMode::render(float a) +{ +} + +bool GameMode::useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly) +{ +} + +void GameMode::initPlayer(shared_ptr player) +{ +} + +void GameMode::tick() +{ +} + +void GameMode::adjustPlayer(shared_ptr player) +{ +} + +//bool GameMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly) +//{ +// // 4J-PB - Adding a test only version to allow tooltips to be displayed +// int t = level->getTile(x, y, z); +// if (t > 0) +// { +// if(bTestUseOnOnly) +// { +// switch(t) +// { +// case Tile::recordPlayer_Id: +// case Tile::bed_Id: // special case for a bed +// if (Tile::tiles[t]->TestUse(level, x, y, z, player )) +// { +// return true; +// } +// else +// { +// // bed is too far away, or something +// return false; +// } +// break; +// default: +// if (Tile::tiles[t]->TestUse()) return true; +// break; +// } +// } +// else +// { +// if (Tile::tiles[t]->use(level, x, y, z, player )) return true; +// } +// } +// +// if (item == NULL) return false; +// return item->useOn(player, level, x, y, z, face, bTestUseOnOnly); +//} + + +shared_ptr GameMode::createPlayer(Level *level) +{ + return shared_ptr( new LocalPlayer(minecraft, level, minecraft->user, level->dimension->id) ); +} + +bool GameMode::interact(shared_ptr player, shared_ptr entity) +{ + return player->interact(entity); +} + +void GameMode::attack(shared_ptr player, shared_ptr entity) +{ + player->attack(entity); +} + +shared_ptr GameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player) +{ + return nullptr; +} + +void GameMode::handleCloseInventory(int containerId, shared_ptr player) +{ + player->containerMenu->removed(player); + delete player->containerMenu; + player->containerMenu = player->inventoryMenu; +} + +void GameMode::handleInventoryButtonClick(int containerId, int buttonId) +{ + +} + +bool GameMode::isCutScene() +{ + return false; +} + +void GameMode::releaseUsingItem(shared_ptr player) +{ + player->releaseUsingItem(); +} + +bool GameMode::hasExperience() +{ + return false; +} + +bool GameMode::hasMissTime() +{ + return true; +} + +bool GameMode::hasInfiniteItems() +{ + return false; +} + +bool GameMode::hasFarPickRange() +{ + return false; +} + +void GameMode::handleCreativeModeItemAdd(shared_ptr clicked, int i) +{ +} + +void GameMode::handleCreativeModeItemDrop(shared_ptr clicked) +{ +} + +bool GameMode::handleCraftItem(int recipe, shared_ptr player) +{ + return true; +} + +// 4J-PB +void GameMode::handleDebugOptions(unsigned int uiVal, shared_ptr player) +{ + player->SetDebugOptions(uiVal); +} -- cgit v1.2.3