/******************************************************************** Minecraft: Pocket Edition - Decompilation Project Copyright (C) 2023 iProgramInCpp The following code is licensed under the BSD 1 clause license. SPDX-License-Identifier: BSD-1-Clause ********************************************************************/ #pragma once #include #include // have to include this to avoid it being included again later from being a problem #include #include #include #include #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES #endif #include #ifndef M_PI #define M_PI (3.14159265358979) #endif #include #include #ifdef USE_OLD_CPP #ifndef constexpr #define constexpr const #endif #ifndef nullptr #define nullptr NULL #endif #ifndef override #define override #endif #endif #ifdef _MSC_VER #pragma warning (disable : 4068) #endif #if defined(_WIN32) #ifndef _XBOX // assume we're on a normal Windows device #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #elif defined(_XBOX) #include #include #endif // XPL means "Cross PLatform" #define XPL_ACCESS _access #define XPL_MKDIR(path, mode) _mkdir(path) // Bare bones non conforming implementation, but good enough struct dirent { int d_type; char d_name[_MAX_PATH + 1]; }; struct DIR { HANDLE current; WIN32_FIND_DATA findData; bool returnedFirstFileData; }; #define DT_UNKNOWN (0) #define DT_DIR (4) #define DT_REG (8) DIR* opendir(const char* name); dirent* readdir(DIR* dir); void closedir(DIR* dir); #include #ifndef S_ISDIR #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif // https://stackoverflow.com/questions/341817/is-there-a-replacement-for-unistd-h-for-windows-visual-c /* Values for the second argument to access. These may be OR'd together. */ #define R_OK 4 /* Test for read permission. */ #define W_OK 2 /* Test for write permission. */ //#define X_OK 1 /* execute permission - unsupported in windows*/ #define F_OK 0 /* Test for existence. */ #else #include #include // XPL means "Cross PLatform" #define XPL_ACCESS access #define XPL_MKDIR(path, mode) mkdir(path, mode) #endif #include "../../compat/KeyCodes.hpp" #include "Logger.hpp" // options: #include "../../GameMods.hpp" // don't know where to declare these: #ifndef MOD_USE_BIGGER_SCREEN_SIZE #define C_DEFAULT_SCREEN_WIDTH (854) #define C_DEFAULT_SCREEN_HEIGHT (480) #else #define C_DEFAULT_SCREEN_WIDTH (1280) #define C_DEFAULT_SCREEN_HEIGHT (720) #endif #define C_MAX_TILES (256) #define C_DEFAULT_PORT (19132) #define C_MAX_CONNECTIONS (4) // pitiful constexpr int C_MIN_X = -32000000, C_MAX_X = 32000000; constexpr int C_MIN_Z = -32000000, C_MAX_Z = 32000000; constexpr int C_MIN_Y = 0, C_MAX_Y = 128; const char* GetTerrainName(); const char* GetItemsName(); const char* GetGUIBlocksName(); #ifdef ORIGINAL_CODE #define C_TERRAIN_NAME "terrain.png" #define C_ITEMS_NAME "gui/items.png" #define C_BLOCKS_NAME "gui/gui_blocks.png" #else #define C_TERRAIN_NAME GetTerrainName() #define C_ITEMS_NAME "gui/items.png" #define C_BLOCKS_NAME "gui/gui_blocks.png" #endif #define C_MAX_CHUNKS_X (16) #define C_MAX_CHUNKS_Z (16) // 9 chunks around a player things will tick #define C_TICK_DISTANCE_CHKS (9) // note: bunch of these are unimplemented. enum eTileID { TILE_AIR, TILE_STONE, TILE_GRASS, TILE_DIRT, TILE_STONEBRICK, TILE_WOOD, TILE_SAPLING, TILE_BEDROCK, TILE_WATER, TILE_WATER_CALM, TILE_LAVA, TILE_LAVA_CALM, TILE_SAND, TILE_GRAVEL, TILE_ORE_GOLD, TILE_ORE_IRON, TILE_ORE_COAL, TILE_TREE_TRUNK, TILE_LEAVES, TILE_SPONGE, TILE_GLASS, TILE_ORE_LAPIS, TILE_BLOCK_LAPIS, TILE_DISPENSER, TILE_SANDSTONE, TILE_NOTE_BLOCK, TILE_BED, TILE_RAIL_POWERED, TYPE_RAIL_ACTIVATOR, TILE_PISTON_STICKY, TILE_COBWEB, TILE_TALLGRASS, TILE_DEAD_BUSH, TILE_PISTON, TILE_PISTON_HEAD, TILE_CLOTH, TILE_PISTON_MOVING, TILE_FLOWER, TILE_ROSE, TILE_MUSHROOM_1, TILE_MUSHROOM_2, TILE_BLOCK_GOLD, TILE_BLOCK_IRON, TILE_STONESLAB_FULL, TILE_STONESLAB_HALF, TILE_BRICKS, TILE_TNT, TILE_BOOKSHELF, TILE_MOSS_STONE, TILE_OBSIDIAN, TILE_TORCH, TILE_FIRE, TILE_SPAWNER, TILE_STAIRS_WOOD, TILE_CHEST, TILE_WIRE, TILE_ORE_EMERALD, TILE_BLOCK_EMERALD, TILE_WORKBENCH, TILE_WHEAT, TILE_FARMLAND, TILE_FURNACE, TILE_FURNACE_LIT, TILE_SIGN, TILE_DOOR_WOOD, TILE_LADDER, TILE_RAIL, TILE_STAIRS_STONE, TILE_SIGN_WALL, TILE_LEVER, TILE_PLATE_STONE, TILE_DOOR_IRON, TILE_PLATE_WOOD, TILE_ORE_REDSTONE, TILE_ORE_REDSTONE_LIT, TILE_NOT_GATE_OFF, TILE_NOT_GATE_ON, TILE_BUTTON_STONE, TILE_TOPSNOW, TILE_ICE, TILE_SNOW, TILE_CACTUS, TILE_CLAY, TILE_REEDS, TILE_JUKEBOX, TILE_FENCE, TILE_PUMPKIN, TILE_NETHERRACK, TILE_SOUL_SAND, TILE_GLOWSTONE, TILE_PORTAL, TILE_PUMPKIN_LIT, TILE_CAKE, TILE_REPEATER_OFF, TILE_REPEATER_ON, TILE_INVISIBLE = 95, // in JE, this is a locked chest TILE_TRAPDOOR, TILE_STONE_MONSTER_EGG, TILE_STONE_BRICKS, TILE_MUSHROOM1_BLOCK, TILE_MUSHROOM2_BLOCK, TILE_CLOTH_00 = 101, TILE_CLOTH_10, TILE_CLOTH_20, TILE_CLOTH_30, TILE_CLOTH_40, TILE_CLOTH_50, TILE_CLOTH_60, TILE_CLOTH_70, TILE_CLOTH_01, TILE_CLOTH_11, TILE_CLOTH_21, TILE_CLOTH_31, TILE_CLOTH_41, TILE_CLOTH_51, TILE_CLOTH_61, TILE_UPDATE = 248, TILE_ATEUPD = 249, ITEM_SHOVEL_IRON = 256, ITEM_PICKAXE_IRON, ITEM_HATCHET_IRON, ITEM_FLINT_AND_STEEL, ITEM_APPLE, ITEM_BOW, ITEM_ARROW, ITEM_COAL, ITEM_EMERALD, ITEM_INGOT_IRON, ITEM_INGOT_GOLD, ITEM_SWORD_IRON, ITEM_SWORD_WOOD, ITEM_SHOVEL_WOOD, ITEM_PICKAXE_WOOD, ITEM_HATCHET_WOOD, ITEM_SWORD_STONE, ITEM_SHOVEL_STONE, ITEM_PICKAXE_STONE, ITEM_HATCHET_STONE, ITEM_SWORD_EMERALD, ITEM_SHOVEL_EMERALD, ITEM_PICKAXE_EMERALD, ITEM_HATCHET_EMERALD, ITEM_STICK, ITEM_BOWL, ITEM_STEW_MUSHROOM, ITEM_SWORD_GOLD, ITEM_SHOVEL_GOLD, ITEM_PICKAXE_GOLD, ITEM_HATCHET_GOLD, ITEM_STRING, ITEM_FEATHER, ITEM_SULPHUR, ITEM_HOE_WOOD, ITEM_HOE_STONE, ITEM_HOE_IRON, ITEM_HOE_EMERALD, ITEM_HOE_GOLD, ITEM_SEEDS, ITEM_WHEAT, ITEM_BREAD, ITEM_HELMET_CLOTH, ITEM_CHESTPLATE_CLOTH, ITEM_LEGGINGS_CLOTH, ITEM_BOOTS_CLOTH, ITEM_HELMET_CHAIN, ITEM_CHESTPLATE_CHAIN, ITEM_LEGGINGS_CHAIN, ITEM_BOOTS_CHAIN, ITEM_HELMET_IRON, ITEM_CHESTPLATE_IRON, ITEM_LEGGINGS_IRON, ITEM_BOOTS_IRON, ITEM_HELMET_EMERALD, ITEM_CHESTPLATE_EMERALD, ITEM_LEGGINGS_EMERALD, ITEM_BOOTS_EMERALD, ITEM_HELMET_GOLD, ITEM_CHESTPLATE_GOLD, ITEM_LEGGINGS_GOLD, ITEM_BOOTS_GOLD, ITEM_FLINT, ITEM_PORKCHOP_RAW, ITEM_PORKCHOP_COOKED, ITEM_PAINTING, ITEM_APPLE_GOLD, ITEM_SIGN, ITEM_DOOR_WOOD, ITEM_BUCKET, ITEM_BUCKET_WATER, ITEM_BUCKET_LAVA, ITEM_MINECART, ITEM_SADDLE, ITEM_DOOR_IRON, ITEM_REDSTONE, ITEM_SNOWBALL, ITEM_BOAT, ITEM_LEATHER, ITEM_BUCKET_MILK, ITEM_BRICK, ITEM_CLAY, ITEM_REEDS, ITEM_PAPER, ITEM_BOOK, ITEM_SLIME_BALL, ITEM_MINECART_CHEST, ITEM_MINECART_FURNACE, ITEM_EGG, ITEM_COMPASS, ITEM_FISHING_ROD, ITEM_CLOCK, ITEM_YELLOW_DUST, ITEM_FISH_RAW, ITEM_FISH_COOKED, ITEM_DYE_POWDER, ITEM_BONE, ITEM_SUGAR, ITEM_CAKE, ITEM_BED, ITEM_DIODE, ITEM_COOKIE, ITEM_RECORD_01, ITEM_RECORD_02, ITEM_CAMERA = 456, }; enum // Textures { TEXTURE_GRASS_TOP = 0, // unused in fact TEXTURE_STONE, TEXTURE_DIRT, TEXTURE_GRASS_SIDE, TEXTURE_PLANKS, TEXTURE_STONE_SLAB_SIDE, TEXTURE_STONE_SLAB_TOP, TEXTURE_BRICKS, TEXTURE_TNT_SIDE, TEXTURE_TNT_TOP, TEXTURE_TNT_BOTTOM, TEXTURE_COBWEB, TEXTURE_ROSE, TEXTURE_FLOWER, TEXTURE_WATER_STATIC, TEXTURE_SAPLING, TEXTURE_STONEBRICK, TEXTURE_BEDROCK, TEXTURE_SAND, TEXTURE_GRAVEL, TEXTURE_LOG_SIDE, TEXTURE_LOG_TOP, TEXTURE_IRON, TEXTURE_GOLD, TEXTURE_EMERALD, // diamond TEXTURE_CHEST_ONE_TOP, TEXTURE_CHEST_ONE_SIDE, TEXTURE_CHEST_ONE_FRONT, TEXTURE_MUSHROOM_RED, TEXTURE_MUSHROOM_BROWN, TEXTURE_NONE30, TEXTURE_FIRE1, TEXTURE_ORE_GOLD, TEXTURE_ORE_IRON, TEXTURE_ORE_COAL, TEXTURE_BOOKSHELF, TEXTURE_MOSSY_STONE, TEXTURE_OBSIDIAN, TEXTURE_NONE38, // grass block hat side without tint? TEXTURE_NONE39, // grass without tint? TEXTURE_NONE40, // grass block top without tint? TEXTURE_CHEST_TWO_FRONT_LEFT, TEXTURE_CHEST_TWO_FRONT_RIGHT, TEXTURE_WORKBENCH_TOP, TEXTURE_FURNACE_FRONT, TEXTURE_FURNACE_SIDE, TEXTURE_DISPENSER_SIDE, TEXTURE_FIRE2, TEXTURE_SPONGE, TEXTURE_GLASS, TEXTURE_ORE_EMERALD, // diamond TEXTURE_ORE_RED_STONE, TEXTURE_LEAVES_TRANSPARENT, // has tint TEXTURE_LEAVES_OPAQUE, // has tint TEXTURE_STONE_BRICK, TEXTURE_DEAD_BUSH, TEXTURE_GRASS_FERN, TEXTURE_CHEST_TWO_BACK_LEFT, TEXTURE_CHEST_TWO_BACK_RIGHT, TEXTURE_WORKBENCH_SIDE_1, TEXTURE_WORKBENCH_SIDE_2, TEXTURE_FURNACE_LIT, TEXTURE_FURNACE_TOP, TEXTURE_SPRUCE_SAPLING, TEXTURE_WOOL, TEXTURE_SPAWNER, TEXTURE_SNOW, TEXTURE_ICE, TEXTURE_GRASS_SIDE_SNOW, TEXTURE_CACTUS_TOP, TEXTURE_CACTUS_SIDE, TEXTURE_CACTUS_BOTTOM, TEXTURE_CLAY, TEXTURE_REEDS, TEXTURE_JUKEBOX_SIDE, TEXTURE_JUKEBOX_TOP, TEXTURE_LILY_PAD, // no tint TEXTURE_MICELIUM_SIDE, TEXTURE_MICELIUM_TOP, TEXTURE_BIRCH_SAPLING, TEXTURE_TORCH_LIT, TEXTURE_DOOR_TOP, TEXTURE_DOOR_IRON_TOP, TEXTURE_LADDER, TEXTURE_TRAPDOOR, TEXTURE_IRON_BARS, TEXTURE_FARMLAND, TEXTURE_FARMLAND_DRY, TEXTURE_WHEAT_0, TEXTURE_WHEAT_1, TEXTURE_WHEAT_2, TEXTURE_WHEAT_3, TEXTURE_WHEAT_4, TEXTURE_WHEAT_5, TEXTURE_WHEAT_6, TEXTURE_WHEAT_7, TEXTURE_LEVER, TEXTURE_DOOR_BOTTOM, TEXTURE_DOOR_IRON_BOTTOM, // wth with new texture TEXTURE_TORCH_RED_STONE, TEXTURE_STONE_BRICK_MOSSY, TEXTURE_STONE_BRICK_CRACKED, TEXTURE_PUMPKIN_TOP, TEXTURE_NETHERRACK, TEXTURE_SOULSAND, TEXTURE_GLOWSTONE, TEXTURE_STICKY_PISTON_HEAD, TEXTURE_PISTON_HEAD, TEXTURE_PISTON_SIDE, TEXTURE_PISTON_BACK, TEXTURE_PISTON_FRONT, TEXTURE_NONE111, // stage of plant growing TEXTURE_RAIL_CURVED, TEXTURE_WOOL_BLACK, TEXTURE_WOOL_GRAY, TEXTURE_TORCH_RED_STONE_OFF, TEXTURE_LOG_SPRUCE, TEXTURE_LOG_BIRCH, TEXTURE_PUMPKIN_SIDE, TEXTURE_PUMPKIN_FACE, TEXTURE_PUMPKIN_FACE_LIT, TEXTURE_CAKE_TOP, TEXTURE_CAKE_SIDE, TEXTURE_CAKE_SIDE_BIT, TEXTURE_CAKE_BOTTOM, TEXTURE_MUSHROOM_BLOCK_RED, TEXTURE_MUSHROOM_BLOCK_BROWN, TEXTURE_PUMPKIN_CONNECTION, // FIXME: Is that correct? TEXTURE_RAIL, TEXTURE_WOOL_RED, TEXTURE_WOOL_PINK, TEXTURE_REPEATER, TEXTURE_NONE132, TEXTURE_NONE133, TEXTURE_BED_LEFT, TEXTURE_BED_RIGHT, TEXTURE_WATERMELON_SIDE, TEXTURE_WATERMELON_TOP, TEXTURE_CAULDRON_TOP, TEXTURE_CAULDRON_SIDE_INSIDE, TEXTURE_CAKE_ITEM, TEXTURE_MUSHROOM_STEM_SIDE, TEXTURE_MUSHROOM_STEM, TEXTURE_NONE143, // wth? TEXTURE_LAPIS, TEXTURE_WOOL_GREEN, TEXTURE_WOOL_LIME, TEXTURE_REPEATER_LIT, TEXTURE_GLASS_PANE, TEXTURE_BED_BACK, TEXTURE_BED_SIDE_LEFT, TEXTURE_BED_SIDE_RIGHT, TEXTURE_BED_FRONT, TEXTURE_NONE153, TEXTURE_CAULDRON_SIDE_OUTSIDE, TEXTURE_CAULDRON_BOTTOM, TEXTURE_NONE156, // wth? TEXTURE_BREW_STAND, TEXTURE_END_FRAME_TOP, TEXTURE_END_FRAME_SIDE, TEXTURE_ORE_LAPIS, TEXTURE_WOOL_BROWN, TEXTURE_WOOL_YELLOW, TEXTURE_GOLD_RAIL, TEXTURE_REDSTONE_DUST_4SIDES, // no tint TEXTURE_REDSTOE_DUST_1SIDE, // no tint TEXTURE_ENCHANTING_TABLE_TOP, TEXTURE_NONE167, //TEXTURE_ENCHANTING_TABLE_BOTTOM, TEXTURE_NONE168, TEXTURE_NONE169, TEXTURE_NONE170, TEXTURE_NONE171, TEXTURE_NONE172, TEXTURE_NONE173, TEXTURE_ENDER_EYE, TEXTURE_END_FRAME_BOTTOM, TEXTURE_SANDSTONE_TOP, TEXTURE_WOOL_BLUE, TEXTURE_WOOL_LIGHT_BLUE, TEXTURE_GOLD_RAIL_LIT, TEXTURE_NONE180, // empty TEXTURE_NONE181, // empty TEXTURE_ENCHANTING_TABLE_SIDE, TEXTURE_ENCHANTING_TABLE_BOTTOM, TEXTURE_NONE184, TEXTURE_NONE185, TEXTURE_NONE186, TEXTURE_NONE187, TEXTURE_NONE188, TEXTURE_NONE189, TEXTURE_NONE190, TEXTURE_NONE191, TEXTURE_SANDSTONE_SIDE, TEXTURE_WOOL_PURPLE, TEXTURE_WOOL_MAGENTA, TEXTURE_RAIL_DETECTOR, TEXTURE_NONE196, TEXTURE_NONE197, TEXTURE_NONE198, TEXTURE_NONE199, TEXTURE_NONE200, TEXTURE_NONE201, TEXTURE_NONE202, TEXTURE_NONE203, TEXTURE_NONE204, TEXTURE_WATER, TEXTURE_WATER2, TEXTURE_WATER3, TEXTURE_SANDSTONE_BOTTOM, TEXTURE_WOOL_CYAN, TEXTURE_WOOL_ORANGE, TEXTURE_NONE211, TEXTURE_NONE212, TEXTURE_NONE213, TEXTURE_NONE214, TEXTURE_NONE215, TEXTURE_NONE216, TEXTURE_NONE217, TEXTURE_NONE218, TEXTURE_NONE219, TEXTURE_NONE220, TEXTURE_MORE, // '...' button TEXTURE_WATER4, TEXTURE_WATER5, TEXTURE_NETHER_BRICK, TEXTURE_WOOL_SILVER, TEXTURE_NETHER_WART_0, TEXTURE_NETHER_WART_1, TEXTURE_NETHER_WART_2, TEXTURE_NONE229, TEXTURE_NONE230, TEXTURE_NONE231, TEXTURE_NONE232, TEXTURE_NONE233, TEXTURE_NONE234, TEXTURE_NONE235, // oak leaves transparent TEXTURE_NONE236, // oak leaves TEXTURE_LAVA, TEXTURE_LAVA2, TEXTURE_LAVA3, TEXTURE_BLOCK_BREAK_0, TEXTURE_BLOCK_BREAK_1, TEXTURE_BLOCK_BREAK_2, TEXTURE_BLOCK_BREAK_3, TEXTURE_BLOCK_BREAK_4, TEXTURE_BLOCK_BREAK_5, TEXTURE_BLOCK_BREAK_6, TEXTURE_BLOCK_BREAK_7, TEXTURE_BLOCK_BREAK_8, TEXTURE_BLOCK_BREAK_9, TEXTURE_NONE250, // wth? TEXTURE_NONE251, // wth? TEXTURE_UPDATE, TEXTURE_ATEUPD, TEXTURE_LAVA4, TEXTURE_LAVA5, }; enum eRenderShape { SHAPE_NONE = -1, SHAPE_SOLID, SHAPE_CROSS, SHAPE_TORCH, SHAPE_FIRE, SHAPE_WATER, SHAPE_UNK5, SHAPE_UNK6, SHAPE_DOOR, SHAPE_LADDER, SHAPE_UNK9, SHAPE_STAIRS, }; enum eRenderLayer { LAYER_OPAQUE, LAYER_ALPHA }; enum eDirection { DIR_YNEG, DIR_YPOS, DIR_ZNEG, // North DIR_ZPOS, // South DIR_XNEG, // West DIR_XPOS, // East }; struct ChunkPos { int x, z; ChunkPos() { x = 0; z = 0; } ChunkPos(int _x, int _z) : x(_x), z(_z) {} bool operator<(const ChunkPos& b) const { if (x != b.x) return x < b.x; return z < b.z; } }; struct Pos { int x, y, z; Pos() { x = 0; y = 0; z = 0; } Pos(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {} }; struct TilePos : Pos { TilePos() : Pos() {} TilePos(int _x, int _y, int _z) : Pos(_x, _y, _z) {} bool operator<(const TilePos& b) const { if (x != b.x) return x < b.x; if (y != b.y) return y < b.y; return z < b.z; } }; #define SAFE_DELETE(ptr) do { if (ptr) delete ptr; } while (0) #define SAFE_DELETE_ARRAY(ptr) do { if (ptr) delete[] ptr; } while (0) #define SSTR( x ) static_cast< const std::ostringstream & >( \ ( std::ostringstream() << std::dec << x ) ).str() typedef uint8_t TileID; // functions from Mojang time_t getEpochTimeS(); time_t getRawTimeS(); float getTimeS(); int getTimeMs(); float Max(float a, float b); void sleepMs(int ms); // @NOTE: This is inlined. static constexpr float Lerp(float a, float b, float progress) { return a + progress * (b - a); } bool createFolderIfNotExists(const char* pDir); bool DeleteDirectory(const std::string& name, bool unused); // compress and decompress stuff with zlib: ( you must SAFE_DELETE_ARRAY what it returns ) uint8_t* ZlibInflateToMemory(uint8_t* pInput, size_t compressedSize, size_t decompressedSize); uint8_t* ZlibDeflateToMemory(uint8_t* pInput, size_t sizeBytes, size_t *compressedSizeOut); uint8_t* ZlibDeflateToMemoryLvl(uint8_t* pInput, size_t sizeBytes, size_t* compressedSizeOut, int level); // things that we added: #ifdef _WIN32 HINSTANCE GetInstance(); HWND GetHWND(); void CenterWindow(HWND hWnd); void EnableOpenGL(HWND hwnd, HDC*, HGLRC*); void DisableOpenGL(HWND, HDC, HGLRC); void SetInstance(HINSTANCE hinst); void SetHWND(HWND hwnd); #endif