J(ILT_QlqL7Dv?e?i?C|M#^|oa{~Pn7;ZR@JP86x
z(Ta*bcie6GZMQg%O|_1VG&5mQ+2mGS|ESd$qVTO
zUY>!e!AEP8&TPXBq6|$ZUN&rsvwAWyFl5>az8jlRSxhVle$1<76b<|UV$fj5Su5EC
z1?w>DKR!av4L#GjZigB|oUPR=Aw}c6v~#w|D+_{*Ai3&|4%=Ke=+ZwvwifxkbqcL8
ztaYGWr
zyZmKkmhI4L-#M^v*ZvjdS9f??w=}R(J<%j|P+D@4JPGbD?R=T-3(7II4A}d7_(z*i
zc}Xk=vx?RNVPBvVLlU!)27}flw4BwS%X|dO2ew&fDZzseXs54Z_RW4kF
zv9-uoSmRSh2gkxymO
ze?d<)KMEc~??;59aKKgDC#ZtXV*0gFFKGw{(_k!)Gd`veij^T5y^jnd8BU>x?y%pJ7Jzk2A
zw?yu%Jhd1-(h8@rsfJg7xENg%SwFE=HvmNWAfJ$VkuB?bq|8b~Il4RYP-TBP`ru7i
zVI$U`9!2v|8+`(0RgRUTK{nAXgu6{O`fa
z-#ys(<=}t+t{Oh~XPYlIN2>qzwZ=DZAzt75eq;P4p#J2^rWo=1`PZ99zEQc?YTnqy
z*xC`R^8Qbo`>Kyv%}HYM@l`$`18uWSK2o=GPZuavh%Tyo2m;}+J8Vo&wSYayP?o89q#xi
zK+YfO`0>tFIXvog9NJ2Hx$soSUwjLw-fwmO%K-kKdb0D0?^iB95F2P5mui#<6NJmHy_V_yJd&nvNudsb!8_2XFo?ZjYPf7b)A0QJ%Dbe)gmZ|4VH
zpZabeW6hU;@7c>=d3tgzYqa;N
zfmJ1MaC^6F|ypMCDVuRP6~-}~gNm(D#8$xB!J
jwzmM|b4~ru`HtX{Ja?Ae!1B=km
delta 1195
zcmZ`#drVtZ7(eHBiT6^XYr3u59QCpqW${a)ug
zG4K5AfU^}Lgyo|_DqiHCEJLKd45_MlZbtzkjzt-5jy|xM-_)ZXF7ZCfz
zNNeoU7%U|vt94IFQZ+BaY#ja#%P%kQ4%lFNJ#J>4Mu)rJ7M|NmeQvS75n0L_{7oKy
z4QAdh_&we=kfpduto5y>ty}S-?RLz=Z99G+>zP8I^b+q!N~hGw!_gGHk=$uRuczU0
ztb)TE@CA&u@L~p5Owf)woB*S9__!XVMV$9A#NS8m$Kc*fUfWm9)$DSW$TaOm>iuNo;PuB+ATyAc?ksv^u7{&*9|Q#Q&MX
zrA|_ !LO}6R8RT)U##E3~@620C<;^<%x$-p)A>mKq<>MAJ7*&yK)!k_l?fo!fZn7hVbT(Zx
z3zHd|AF@F%v0x8-w6#+axB4IiXY?~$
zpweWpriUW~4;U(r!TFyJ2eQDu-q>;0$b{PZLxaZ<6Z-IEXrK%JzGa+d;qrp9rG%E}
zn)>0_T$46Cl0Gk*_N0YvYN<&Wf{WYCw=!VDXC4MB*e&t!y4|vcg;SZ9>^yq=1r*DG?jjK`Wp54=Grt<8
diff --git a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml
index b8150a8a..776c0a4a 100644
--- a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml
+++ b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml
@@ -9100,7 +9100,7 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc
- {*ICON_SHANK_01*}
+ Rabbit Stew
@@ -9570,4 +9570,8 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc
Hold {*CONTROLLER_VK_Y*} to view
Classic Crafting
+
+
+ Restores 5{*ICON_SHANK_01*}.
+
diff --git a/Minecraft.World/Item.cpp b/Minecraft.World/Item.cpp
index f46a57e3..db644c77 100644
--- a/Minecraft.World/Item.cpp
+++ b/Minecraft.World/Item.cpp
@@ -360,7 +360,7 @@ void Item::staticCtor()
Item::diamond = ( new Item(8) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_diamond)->setIconName(L"diamond")->setDescriptionId(IDS_ITEM_DIAMOND)->setUseDescriptionId(IDS_DESC_DIAMONDS);
Item::stick = ( new Item(24) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stick, Item::eMaterial_wood)->setIconName(L"stick")->handEquipped()->setDescriptionId(IDS_ITEM_STICK)->setUseDescriptionId(IDS_DESC_STICK);
Item::mushroomStew = ( new BowlFoodItem(26, 6) ) ->setIconName(L"mushroomStew")->setDescriptionId(IDS_ITEM_MUSHROOM_STEW)->setUseDescriptionId(IDS_DESC_MUSHROOMSTEW);
- Item::rabbitStew = ( new BowlFoodItem(157, 10) ) ->setIconName(L"rabbitStew")->setDescriptionId(IDS_ITEM_MUSHROOM_STEW)->setUseDescriptionId(IDS_DESC_MUSHROOMSTEW);
+ Item::rabbitStew = ( new BowlFoodItem(157, 10) ) ->setIconName(L"rabbitStew")->setDescriptionId(IDS_ITEM_RABBIT_STEW)->setUseDescriptionId(IDS_DESC_RABBIT_STEW);
Item::string = ( new TilePlanterItem(31, Tile::tripWire) ) ->setIconName(L"string")->setDescriptionId(IDS_ITEM_STRING)->setUseDescriptionId(IDS_DESC_STRING);
Item::feather = ( new Item(32) ) ->setIconName(L"feather")->setDescriptionId(IDS_ITEM_FEATHER)->setUseDescriptionId(IDS_DESC_FEATHER);
From d7d38d4f8fd9789ed6c4cbebcf249630c52af30e Mon Sep 17 00:00:00 2001
From: NSDeathman <104826306+NSDeathman@users.noreply.github.com>
Date: Fri, 22 May 2026 15:07:06 +0400
Subject: [PATCH 22/32] fix: doubled grass upper block destroying (#104)
---
Minecraft.World/TallGrass2.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Minecraft.World/TallGrass2.cpp b/Minecraft.World/TallGrass2.cpp
index 93c0538c..e9998c21 100644
--- a/Minecraft.World/TallGrass2.cpp
+++ b/Minecraft.World/TallGrass2.cpp
@@ -189,11 +189,12 @@ void TallGrass2::neighborChanged(Level* level, int x, int y, int z, int type)
if (!isUpper)
{
- if (!canSurvive(level, x, y, z))
+ int upperTileId = level->getTile(x, y + 1, z);
+ if (!canSurvive(level, x, y, z) || (upperTileId != id))
{
spawnResources(level, x, y, z, data, 0);
level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_CLIENTS);
- if (level->getTile(x, y + 1, z) == id)
+ if (upperTileId == id)
level->removeTile(x, y + 1, z);
}
}
@@ -211,11 +212,12 @@ void TallGrass2::tick(Level* level, int x, int y, int z, Random* random)
if (!isUpper)
{
- if (!canSurvive(level, x, y, z))
+ int upperTileId = level->getTile(x, y + 1, z);
+ if (!canSurvive(level, x, y, z) || (upperTileId != id))
{
spawnResources(level, x, y, z, data, 0);
level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_CLIENTS);
- if (level->getTile(x, y + 1, z) == id)
+ if (upperTileId == id)
level->removeTile(x, y + 1, z);
}
}
@@ -224,7 +226,6 @@ void TallGrass2::tick(Level* level, int x, int y, int z, Random* random)
int TallGrass2::getResource(int data, Random* random, int playerBonusLevel)
{
-
return -1;
}
@@ -240,7 +241,6 @@ bool TallGrass2::isSilkTouchable()
shared_ptr TallGrass2::getSilkTouchItemInstance(int data)
{
-
if ((data & UPPER_BIT) != 0) return nullptr;
int variant = data & ~UPPER_BIT;
return std::make_shared(this, 1, variant);
From 0b762588d8a89f23007528fc045a6f8578e0898f Mon Sep 17 00:00:00 2001
From: neoapps-dev
Date: Fri, 22 May 2026 16:38:10 +0300
Subject: [PATCH 23/32] feat(CMake): add SDK generation
---
CMakeLists.txt | 26 +++++
cmake/GenerateSdk.cmake | 204 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 230 insertions(+)
create mode 100644 cmake/GenerateSdk.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 52391571..fe59b475 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -266,6 +266,32 @@ if(PLATFORM_NAME STREQUAL "Windows64")
add_dependencies(Minecraft.Server GenerateItemNameMap)
endif()
+#neo: added - SDK generation
+set(SDK_INPUT_DIRS
+ "${CMAKE_SOURCE_DIR}/Minecraft.World"
+ "${CMAKE_SOURCE_DIR}/Minecraft.Client"
+ "${CMAKE_SOURCE_DIR}/include"
+ "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs"
+)
+
+set(SDK_OUTPUT "${CMAKE_BINARY_DIR}/Minecraft.Client/$/sdk.h")
+add_custom_command(
+ OUTPUT "${SDK_OUTPUT}"
+ COMMAND ${CMAKE_COMMAND}
+ "-DINPUT_DIRS=${SDK_INPUT_DIRS}"
+ "-DOUTPUT_FILE=${SDK_OUTPUT}"
+ -P "${CMAKE_SOURCE_DIR}/cmake/GenerateSdk.cmake"
+ DEPENDS
+ "${CMAKE_SOURCE_DIR}/cmake/GenerateSdk.cmake"
+ COMMENT "Generating sdk.h..."
+ VERBATIM
+)
+
+add_custom_target(GenerateSdk ALL
+ DEPENDS "${SDK_OUTPUT}"
+)
+
+set_property(TARGET GenerateSdk PROPERTY FOLDER "Build")
target_include_directories(Minecraft.Client PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/generated"
)
diff --git a/cmake/GenerateSdk.cmake b/cmake/GenerateSdk.cmake
new file mode 100644
index 00000000..62b39a06
--- /dev/null
+++ b/cmake/GenerateSdk.cmake
@@ -0,0 +1,204 @@
+if(NOT INPUT_DIRS)
+ message(FATAL_ERROR "INPUT_DIRS must be set to a list of directories.")
+endif()
+if(NOT OUTPUT_FILE)
+ message(FATAL_ERROR "OUTPUT_FILE must be set.")
+endif()
+
+set(_all_headers "")
+foreach(_dir IN LISTS INPUT_DIRS)
+ if(EXISTS "${_dir}")
+ file(GLOB_RECURSE _hfiles "${_dir}/*.h")
+ list(APPEND _all_headers ${_hfiles})
+ endif()
+endforeach()
+
+if(NOT _all_headers)
+ message(FATAL_ERROR "No .h files found in INPUT_DIRS.")
+endif()
+list(REMOVE_DUPLICATES _all_headers)
+list(SORT _all_headers)
+
+foreach(_h IN LISTS _all_headers)
+ get_filename_component(_bn "${_h}" NAME)
+ string(TOLOWER "${_bn}" _k)
+ set(_idx_${_k} "${_h}")
+endforeach()
+
+foreach(_h IN LISTS _all_headers)
+ file(STRINGS "${_h}" _ll REGEX "^[ \t]*#[ \t]*include[ \t]+\"")
+ get_filename_component(_hd "${_h}" DIRECTORY)
+
+ set(_dd "")
+ foreach(_l IN LISTS _ll)
+ if(_l MATCHES "^[ \t]*#[ \t]*include[ \t]+\"([^\"]+)\"")
+ set(_in "${CMAKE_MATCH_1}")
+ set(_rv "")
+ set(_try "${_hd}/${_in}")
+ get_filename_component(_try "${_try}" ABSOLUTE)
+ if(EXISTS "${_try}")
+ set(_rv "${_try}")
+ else()
+ string(TOLOWER "${_in}" _k2)
+ if(DEFINED _idx_${_k2})
+ set(_rv "${_idx_${_k2}}")
+ endif()
+ endif()
+ if(_rv AND _rv IN_LIST _all_headers)
+ list(APPEND _dd "${_rv}")
+ endif()
+ endif()
+ endforeach()
+ if(_dd)
+ list(REMOVE_DUPLICATES _dd)
+ endif()
+ set(_de_${_h} "${_dd}")
+endforeach()
+
+set(_sorted "")
+set(_left ${_all_headers})
+while(_left)
+ set(_prog 0)
+ set(_next "")
+ foreach(_h IN LISTS _left)
+ set(_rdy 1)
+ foreach(_d IN LISTS _de_${_h})
+ if(_d IN_LIST _left)
+ set(_rdy 0)
+ break()
+ endif()
+ endforeach()
+ if(_rdy)
+ list(APPEND _sorted "${_h}")
+ set(_prog 1)
+ else()
+ list(APPEND _next "${_h}")
+ endif()
+ endforeach()
+ if(NOT _prog)
+ foreach(_h IN LISTS _next)
+ list(APPEND _sorted "${_h}")
+ endforeach()
+ break()
+ endif()
+ set(_left ${_next})
+endwhile()
+
+set(_sys "")
+set(_body "")
+
+foreach(_h IN LISTS _sorted)
+ file(STRINGS "${_h}" _ll)
+
+ set(_inbc 0)
+ set(_out "")
+ foreach(_l IN LISTS _ll)
+ if(_l STREQUAL "")
+ continue()
+ endif()
+
+ if(_inbc)
+ string(FIND "${_l}" "*/" _ce)
+ if(_ce GREATER -1)
+ math(EXPR _ca "${_ce} + 2")
+ string(SUBSTRING "${_l}" ${_ca} -1 _l)
+ set(_inbc 0)
+ else()
+ continue()
+ endif()
+ endif()
+
+ string(FIND "${_l}" "//" _sl)
+ if(_sl GREATER -1)
+ string(SUBSTRING "${_l}" 0 ${_sl} _l)
+ endif()
+
+ while(TRUE)
+ string(FIND "${_l}" "/*" _so)
+ if(_so EQUAL -1)
+ break()
+ endif()
+ string(SUBSTRING "${_l}" 0 ${_so} _bf)
+ string(SUBSTRING "${_l}" ${_so} -1 _ar)
+ string(FIND "${_ar}" "*/" _ce)
+ if(_ce EQUAL -1)
+ set(_l "${_bf}")
+ set(_inbc 1)
+ break()
+ else()
+ math(EXPR _ca "${_ce} + 2")
+ string(SUBSTRING "${_ar}" ${_ca} -1 _af)
+ set(_l "${_bf}${_af}")
+ endif()
+ endwhile()
+
+ string(STRIP "${_l}" _ls)
+
+ if(_ls MATCHES "^#[ \t]*pragma[ \t]+once")
+ continue()
+ endif()
+ if(_ls MATCHES "^#[ \t]*include[ \t]+\"([^\"]+)\"")
+ continue()
+ endif()
+ if(_ls MATCHES "^#[ \t]*include[ \t]+<([^>]+)>")
+ set(_sn "${CMAKE_MATCH_1}")
+ if(NOT _sn IN_LIST _sys)
+ list(APPEND _sys "${_sn}")
+ endif()
+ continue()
+ endif()
+
+ if(_ls STREQUAL "")
+ continue()
+ endif()
+
+ string(APPEND _out "${_l}\n")
+ endforeach()
+
+ if(_out)
+ if(_body)
+ string(APPEND _body "\n")
+ endif()
+ string(APPEND _body "${_out}")
+ endif()
+endforeach()
+
+set(_guard "MINECRAFT_LCE_SDK_H")
+set(_tmp "${OUTPUT_FILE}.tmp")
+
+file(WRITE "${_tmp}"
+ "#ifndef ${_guard}\n"
+ "#define ${_guard}\n"
+ "\n"
+ "// Auto-generated. Do not edit.\n"
+ "// Minecraft Console Edition SDK Header\n"
+ "\n"
+)
+
+if(_sys)
+ list(SORT _sys)
+ foreach(_s IN LISTS _sys)
+ file(APPEND "${_tmp}" "#include <${_s}>\n")
+ endforeach()
+ file(APPEND "${_tmp}" "\n")
+endif()
+
+file(APPEND "${_tmp}" "${_body}")
+file(APPEND "${_tmp}" "\n#endif // ${_guard}\n")
+
+if(EXISTS "${OUTPUT_FILE}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -E compare_files "${OUTPUT_FILE}" "${_tmp}"
+ RESULT_VARIABLE _ch
+ )
+else()
+ set(_ch 1)
+endif()
+
+if(_ch)
+ file(RENAME "${_tmp}" "${OUTPUT_FILE}")
+ message(STATUS "GenerateSdk: wrote ${OUTPUT_FILE}")
+else()
+ file(REMOVE "${_tmp}")
+ message(STATUS "GenerateSdk: ${OUTPUT_FILE} is up-to-date")
+endif()
From 28d9500eca266c32fcc15dbafa5384f58e2cbfad Mon Sep 17 00:00:00 2001
From: neoapps-dev
Date: Fri, 22 May 2026 17:53:44 +0300
Subject: [PATCH 24/32] cmake(sdk): includes
---
cmake/GenerateSdk.cmake | 52 ++++++++++++++++++++++++++++++-----------
1 file changed, 38 insertions(+), 14 deletions(-)
diff --git a/cmake/GenerateSdk.cmake b/cmake/GenerateSdk.cmake
index 62b39a06..e96a810e 100644
--- a/cmake/GenerateSdk.cmake
+++ b/cmake/GenerateSdk.cmake
@@ -84,7 +84,6 @@ while(_left)
set(_left ${_next})
endwhile()
-set(_sys "")
set(_body "")
foreach(_h IN LISTS _sorted)
@@ -140,11 +139,7 @@ foreach(_h IN LISTS _sorted)
if(_ls MATCHES "^#[ \t]*include[ \t]+\"([^\"]+)\"")
continue()
endif()
- if(_ls MATCHES "^#[ \t]*include[ \t]+<([^>]+)>")
- set(_sn "${CMAKE_MATCH_1}")
- if(NOT _sn IN_LIST _sys)
- list(APPEND _sys "${_sn}")
- endif()
+ if(_ls MATCHES "^#[ \t]*include[ \t]+<")
continue()
endif()
@@ -173,16 +168,45 @@ file(WRITE "${_tmp}"
"// Auto-generated. Do not edit.\n"
"// Minecraft Console Edition SDK Header\n"
"\n"
+ "#include \n"
+ "#include \n"
+ "#include \n"
+ "#include \n"
+ "#include \n"
+ "#include