2026-03-01 12:16:08 +08:00
# 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 )
{
}
2026-03-02 15:58:20 +07:00
bool GameMode : : useItem ( std : : shared_ptr < Player > player , Level * level , std : : shared_ptr < ItemInstance > item , bool bTestUseOnly )
2026-03-01 12:16:08 +08:00
{
}
2026-03-02 15:58:20 +07:00
void GameMode : : initPlayer ( std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
}
void GameMode : : tick ( )
{
}
2026-03-02 15:58:20 +07:00
void GameMode : : adjustPlayer ( std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
}
2026-03-02 15:58:20 +07:00
//bool GameMode::useItemOn(std::shared_ptr<Player> player, Level *level, std::shared_ptr<ItemInstance> item, int x, int y, int z, int face, bool bTestUseOnOnly)
2026-03-01 12:16:08 +08:00
//{
// // 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)
// {
2026-03-02 15:58:20 +07:00
// case Tile::recordPlayer_Id:
2026-03-01 12:16:08 +08:00
// case Tile::bed_Id: // special case for a bed
2026-03-02 15:58:20 +07:00
// if (Tile::tiles[t]->TestUse(level, x, y, z, player ))
2026-03-01 12:16:08 +08:00
// {
// return true;
// }
// else
// {
// // bed is too far away, or something
// return false;
// }
// break;
// default:
// if (Tile::tiles[t]->TestUse()) return true;
// break;
// }
// }
2026-03-02 15:58:20 +07:00
// else
2026-03-01 12:16:08 +08:00
// {
// if (Tile::tiles[t]->use(level, x, y, z, player )) return true;
// }
// }
2026-03-02 15:58:20 +07:00
//
2026-03-01 12:16:08 +08:00
// if (item == NULL) return false;
// return item->useOn(player, level, x, y, z, face, bTestUseOnOnly);
//}
2026-03-02 15:58:20 +07:00
std : : shared_ptr < Player > GameMode : : createPlayer ( Level * level )
2026-03-01 12:16:08 +08:00
{
2026-03-02 15:58:20 +07:00
return std : : shared_ptr < Player > ( new LocalPlayer ( minecraft , level , minecraft - > user , level - > dimension - > id ) ) ;
2026-03-01 12:16:08 +08:00
}
2026-03-02 15:58:20 +07:00
bool GameMode : : interact ( std : : shared_ptr < Player > player , std : : shared_ptr < Entity > entity )
2026-03-01 12:16:08 +08:00
{
return player - > interact ( entity ) ;
}
2026-03-02 15:58:20 +07:00
void GameMode : : attack ( std : : shared_ptr < Player > player , std : : shared_ptr < Entity > entity )
2026-03-01 12:16:08 +08:00
{
player - > attack ( entity ) ;
}
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > GameMode : : handleInventoryMouseClick ( int containerId , int slotNum , int buttonNum , bool quickKeyHeld , std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
return nullptr ;
}
2026-03-02 15:58:20 +07:00
void GameMode : : handleCloseInventory ( int containerId , std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
player - > containerMenu - > removed ( player ) ;
delete player - > containerMenu ;
player - > containerMenu = player - > inventoryMenu ;
}
void GameMode : : handleInventoryButtonClick ( int containerId , int buttonId )
{
}
bool GameMode : : isCutScene ( )
{
return false ;
}
2026-03-02 15:58:20 +07:00
void GameMode : : releaseUsingItem ( std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
player - > releaseUsingItem ( ) ;
}
bool GameMode : : hasExperience ( )
{
return false ;
}
bool GameMode : : hasMissTime ( )
{
return true ;
}
bool GameMode : : hasInfiniteItems ( )
{
return false ;
}
bool GameMode : : hasFarPickRange ( )
{
return false ;
}
2026-03-02 15:58:20 +07:00
void GameMode : : handleCreativeModeItemAdd ( std : : shared_ptr < ItemInstance > clicked , int i )
2026-03-01 12:16:08 +08:00
{
}
2026-03-02 15:58:20 +07:00
void GameMode : : handleCreativeModeItemDrop ( std : : shared_ptr < ItemInstance > clicked )
2026-03-01 12:16:08 +08:00
{
}
2026-03-02 15:58:20 +07:00
bool GameMode : : handleCraftItem ( int recipe , std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
return true ;
}
// 4J-PB
2026-03-02 15:58:20 +07:00
void GameMode : : handleDebugOptions ( unsigned int uiVal , std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
player - > SetDebugOptions ( uiVal ) ;
}