diff --git a/Minecraft.Client/Common/Media/MediaWindows64.arc b/Minecraft.Client/Common/Media/MediaWindows64.arc
index 67f9d188..3213e3a2 100644
Binary files a/Minecraft.Client/Common/Media/MediaWindows64.arc and b/Minecraft.Client/Common/Media/MediaWindows64.arc differ
diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp
index cbd89ca5..3a683654 100644
--- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp
+++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp
@@ -203,6 +203,8 @@ void IUIScene_CreativeMenu::staticCtor()
ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_EVERGREEN)
ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_BIRCH)
ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_JUNGLE)
+ ITEM_AUX(Tile::sapling2_Id, Sapling2::TYPE_ACACIA)
+ ITEM_AUX(Tile::sapling2_Id, Sapling2::TYPE_DARK_OAK)
ITEM_AUX(Tile::leaves_Id, LeafTile::NORMAL_LEAF)
ITEM_AUX(Tile::leaves_Id, LeafTile::EVERGREEN_LEAF)
ITEM_AUX(Tile::leaves_Id, LeafTile::BIRCH_LEAF)
diff --git a/Minecraft.Client/PreStitchedTextureMap.cpp b/Minecraft.Client/PreStitchedTextureMap.cpp
index 5330cf13..657d8436 100644
--- a/Minecraft.Client/PreStitchedTextureMap.cpp
+++ b/Minecraft.Client/PreStitchedTextureMap.cpp
@@ -1006,6 +1006,7 @@ void PreStitchedTextureMap::loadUVs()
ADD_ICON(20, 15, L"red_sandstone_top");
ADD_ICON(21, 5, L"flower_tulip_pink");
+
ADD_ICON(21, 8, L"log_dark");
ADD_ICON(21, 9, L"log_dark_top");
@@ -1022,6 +1023,8 @@ void PreStitchedTextureMap::loadUVs()
ADD_ICON(22, 3, L"flower_oxeye_daisy");
ADD_ICON(22, 4, L"flower_tulip_red");
ADD_ICON(22, 5, L"flower_tulip_white");
+ ADD_ICON(22, 6, L"sapling_acacia");
+ ADD_ICON(22, 7, L"sapling_dark_oak");
ADD_ICON(22, 8, L"coarse_dirt");
ADD_ICON(22, 9, L"dirt_podzol_side");
diff --git a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml
index 4ee26883..7e27a9f3 100644
--- a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml
+++ b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml
@@ -8979,5 +8979,29 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc
Restores 3{*ICON_SHANK_01*}. Created by cooking raw mutton in a furnace.
+
+ Acacia Sapling
+
+
+ Dark Oak Sapling
+
+
+ Acacia Leaves
+
+
+ Dark Oak Leaves
+
+
+ Red Sandstone
+
+
+ Red Sandstone Stairs
+
+
+ Prismarine Crystal
+
+
+ Sea Lantern
+
\ No newline at end of file
diff --git a/Minecraft.Client/Windows64Media/strings.h b/Minecraft.Client/Windows64Media/strings.h
index 0b03c0ba..f0c83fab 100644
--- a/Minecraft.Client/Windows64Media/strings.h
+++ b/Minecraft.Client/Windows64Media/strings.h
@@ -1,7 +1,7 @@
#pragma once
// Auto-generated by StringTable builder — do not edit manually.
// Source language: en-US
-// Total strings: 2331
+// Total strings: 2339
#define IDS_NULL 0
#define IDS_OK 1
@@ -2210,129 +2210,135 @@
#define IDS_DESC_MUTTON_RAW 2204
#define IDS_ITEM_MUTTON_COOKED 2205
#define IDS_DESC_MUTTON_COOKED 2206
-#define IDS_LANG_SYSTEM 2207
-#define IDS_LANG_ENGLISH 2208
-#define IDS_LANG_GERMAN 2209
-#define IDS_LANG_SPANISH 2210
-#define IDS_LANG_SPANISH_SPAIN 2211
-#define IDS_LANG_SPANISH_LATIN_AMERICA 2212
-#define IDS_LANG_FRENCH 2213
-#define IDS_LANG_ITALIAN 2214
-#define IDS_LANG_PORTUGUESE 2215
-#define IDS_LANG_PORTUGUESE_PORTUGAL 2216
-#define IDS_LANG_PORTUGUESE_BRAZIL 2217
-#define IDS_LANG_JAPANESE 2218
-#define IDS_LANG_KOREAN 2219
-#define IDS_LANG_CHINESE_TRADITIONAL 2220
-#define IDS_LANG_CHINESE_SIMPLIFIED 2221
-#define IDS_LANG_DANISH 2222
-#define IDS_LANG_FINISH 2223
-#define IDS_LANG_DUTCH 2224
-#define IDS_LANG_POLISH 2225
-#define IDS_LANG_RUSSIAN 2226
-#define IDS_LANG_SWEDISH 2227
-#define IDS_LANG_NORWEGIAN 2228
-#define IDS_LANG_GREEK 2229
-#define IDS_LANG_TURKISH 2230
-#define IDS_LEADERBOARD_KILLS_EASY 2231
-#define IDS_LEADERBOARD_KILLS_NORMAL 2232
-#define IDS_LEADERBOARD_KILLS_HARD 2233
-#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 2234
-#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 2235
-#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 2236
-#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 2237
-#define IDS_LEADERBOARD_FARMING_PEACEFUL 2238
-#define IDS_LEADERBOARD_FARMING_EASY 2239
-#define IDS_LEADERBOARD_FARMING_NORMAL 2240
-#define IDS_LEADERBOARD_FARMING_HARD 2241
-#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 2242
-#define IDS_LEADERBOARD_TRAVELLING_EASY 2243
-#define IDS_LEADERBOARD_TRAVELLING_NORMAL 2244
-#define IDS_LEADERBOARD_TRAVELLING_HARD 2245
-#define IDS_TIPS_GAMETIP_0 2246
-#define IDS_TIPS_GAMETIP_1 2247
-#define IDS_TIPS_GAMETIP_48 2248
-#define IDS_TIPS_GAMETIP_44 2249
-#define IDS_TIPS_GAMETIP_45 2250
-#define IDS_TIPS_TRIVIA_4 2251
-#define IDS_TIPS_TRIVIA_17 2252
-#define IDS_HOW_TO_PLAY_MULTIPLAYER 2253
-#define IDS_HOW_TO_PLAY_SOCIALMEDIA 2254
-#define IDS_HOW_TO_PLAY_CREATIVE 2255
-#define IDS_TUTORIAL_TASK_FLY 2256
-#define IDS_TOOLTIPS_SELECTDEVICE 2257
-#define IDS_TOOLTIPS_CHANGEDEVICE 2258
-#define IDS_TOOLTIPS_VIEW_GAMERCARD 2259
-#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 2260
-#define IDS_TOOLTIPS_INVITE_PARTY 2261
-#define IDS_CONFIRM_START_CREATIVE 2262
-#define IDS_CONFIRM_START_SAVEDINCREATIVE 2263
-#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 2264
-#define IDS_CONFIRM_START_HOST_PRIVILEGES 2265
-#define IDS_CONNECTION_LOST_LIVE 2266
-#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 2267
-#define IDS_AWARD_AVATAR1 2268
-#define IDS_AWARD_AVATAR2 2269
-#define IDS_AWARD_AVATAR3 2270
-#define IDS_AWARD_THEME 2271
-#define IDS_UNLOCK_ACHIEVEMENT_TEXT 2272
-#define IDS_UNLOCK_AVATAR_TEXT 2273
-#define IDS_UNLOCK_GAMERPIC_TEXT 2274
-#define IDS_UNLOCK_THEME_TEXT 2275
-#define IDS_UNLOCK_ACCEPT_INVITE 2276
-#define IDS_UNLOCK_GUEST_TEXT 2277
-#define IDS_LEADERBOARD_GAMERTAG 2278
-#define IDS_GROUPNAME_POTIONS_480 2279
-#define IDS_RETURNEDTOTITLESCREEN_TEXT 2280
-#define IDS_TRIALOVER_TEXT 2281
-#define IDS_FATAL_ERROR_TEXT 2282
-#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 2283
-#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 2284
-#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 2285
-#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 2286
-#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE 2287
-#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 2288
-#define IDS_SAVE_ICON_MESSAGE 2289
-#define IDS_GAMEOPTION_HOST_PRIVILEGES 2290
-#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 2291
-#define IDS_ACHIEVEMENTS 2292
-#define IDS_LABEL_GAMERTAGS 2293
-#define IDS_IN_GAME_GAMERTAGS 2294
-#define IDS_SOCIAL_DEFAULT_DESCRIPTION 2295
-#define IDS_TITLE_UPDATE_NAME 2296
-#define IDS_PLATFORM_NAME 2297
-#define IDS_BACK_BUTTON 2298
-#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 2299
-#define IDS_KICK_PLAYER_DESCRIPTION 2300
-#define IDS_USING_TRIAL_TEXUREPACK_WARNING 2301
-#define IDS_WORLD_SIZE_TITLE_SMALL 2302
-#define IDS_WORLD_SIZE_TITLE_MEDIUM 2303
-#define IDS_WORLD_SIZE_TITLE_LARGE 2304
-#define IDS_WORLD_SIZE_TITLE_CLASSIC 2305
-#define IDS_WORLD_SIZE 2306
-#define IDS_GAMEOPTION_WORLD_SIZE 2307
-#define IDS_DISABLE_SAVING 2308
-#define IDS_GAMEOPTION_DISABLE_SAVING 2309
-#define IDS_RICHPRESENCE_GAMESTATE 2310
-#define IDS_RICHPRESENCE_IDLE 2311
-#define IDS_RICHPRESENCE_MENUS 2312
-#define IDS_RICHPRESENCE_MULTIPLAYER 2313
-#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 2314
-#define IDS_RICHPRESENCE_MULTIPLAYER_1P 2315
-#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 2316
-#define IDS_RICHPRESENCESTATE_BLANK 2317
-#define IDS_RICHPRESENCESTATE_RIDING_PIG 2318
-#define IDS_RICHPRESENCESTATE_RIDING_MINECART 2319
-#define IDS_RICHPRESENCESTATE_BOATING 2320
-#define IDS_RICHPRESENCESTATE_FISHING 2321
-#define IDS_RICHPRESENCESTATE_CRAFTING 2322
-#define IDS_RICHPRESENCESTATE_FORGING 2323
-#define IDS_RICHPRESENCESTATE_NETHER 2324
-#define IDS_RICHPRESENCESTATE_CD 2325
-#define IDS_RICHPRESENCESTATE_MAP 2326
-#define IDS_RICHPRESENCESTATE_ENCHANTING 2327
-#define IDS_RICHPRESENCESTATE_BREWING 2328
-#define IDS_RICHPRESENCESTATE_ANVIL 2329
-#define IDS_RICHPRESENCESTATE_TRADING 2330
-#define IDS_TILE_SEA_LANTERN 2331
-#define IDS_ITEM_PRISMARINE_CRYSTAL 2332
\ No newline at end of file
+#define IDS_TILE_SAPLING_ACACIA 2207
+#define IDS_TILE_SAPLING_DARK_OAK 2208
+#define IDS_TILE_LEAVES_ACACIA 2209
+#define IDS_TILE_LEAVES_DARK_OAK 2210
+#define IDS_TILE_RED_SANDSTONE 2211
+#define IDS_TILE_STAIRS_RED_SANDSTONE 2212
+#define IDS_ITEM_PRISMARINE_CRYSTAL 2213
+#define IDS_TILE_SEA_LANTERN 2214
+#define IDS_LANG_SYSTEM 2215
+#define IDS_LANG_ENGLISH 2216
+#define IDS_LANG_GERMAN 2217
+#define IDS_LANG_SPANISH 2218
+#define IDS_LANG_SPANISH_SPAIN 2219
+#define IDS_LANG_SPANISH_LATIN_AMERICA 2220
+#define IDS_LANG_FRENCH 2221
+#define IDS_LANG_ITALIAN 2222
+#define IDS_LANG_PORTUGUESE 2223
+#define IDS_LANG_PORTUGUESE_PORTUGAL 2224
+#define IDS_LANG_PORTUGUESE_BRAZIL 2225
+#define IDS_LANG_JAPANESE 2226
+#define IDS_LANG_KOREAN 2227
+#define IDS_LANG_CHINESE_TRADITIONAL 2228
+#define IDS_LANG_CHINESE_SIMPLIFIED 2229
+#define IDS_LANG_DANISH 2230
+#define IDS_LANG_FINISH 2231
+#define IDS_LANG_DUTCH 2232
+#define IDS_LANG_POLISH 2233
+#define IDS_LANG_RUSSIAN 2234
+#define IDS_LANG_SWEDISH 2235
+#define IDS_LANG_NORWEGIAN 2236
+#define IDS_LANG_GREEK 2237
+#define IDS_LANG_TURKISH 2238
+#define IDS_LEADERBOARD_KILLS_EASY 2239
+#define IDS_LEADERBOARD_KILLS_NORMAL 2240
+#define IDS_LEADERBOARD_KILLS_HARD 2241
+#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 2242
+#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 2243
+#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 2244
+#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 2245
+#define IDS_LEADERBOARD_FARMING_PEACEFUL 2246
+#define IDS_LEADERBOARD_FARMING_EASY 2247
+#define IDS_LEADERBOARD_FARMING_NORMAL 2248
+#define IDS_LEADERBOARD_FARMING_HARD 2249
+#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 2250
+#define IDS_LEADERBOARD_TRAVELLING_EASY 2251
+#define IDS_LEADERBOARD_TRAVELLING_NORMAL 2252
+#define IDS_LEADERBOARD_TRAVELLING_HARD 2253
+#define IDS_TIPS_GAMETIP_0 2254
+#define IDS_TIPS_GAMETIP_1 2255
+#define IDS_TIPS_GAMETIP_48 2256
+#define IDS_TIPS_GAMETIP_44 2257
+#define IDS_TIPS_GAMETIP_45 2258
+#define IDS_TIPS_TRIVIA_4 2259
+#define IDS_TIPS_TRIVIA_17 2260
+#define IDS_HOW_TO_PLAY_MULTIPLAYER 2261
+#define IDS_HOW_TO_PLAY_SOCIALMEDIA 2262
+#define IDS_HOW_TO_PLAY_CREATIVE 2263
+#define IDS_TUTORIAL_TASK_FLY 2264
+#define IDS_TOOLTIPS_SELECTDEVICE 2265
+#define IDS_TOOLTIPS_CHANGEDEVICE 2266
+#define IDS_TOOLTIPS_VIEW_GAMERCARD 2267
+#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 2268
+#define IDS_TOOLTIPS_INVITE_PARTY 2269
+#define IDS_CONFIRM_START_CREATIVE 2270
+#define IDS_CONFIRM_START_SAVEDINCREATIVE 2271
+#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 2272
+#define IDS_CONFIRM_START_HOST_PRIVILEGES 2273
+#define IDS_CONNECTION_LOST_LIVE 2274
+#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 2275
+#define IDS_AWARD_AVATAR1 2276
+#define IDS_AWARD_AVATAR2 2277
+#define IDS_AWARD_AVATAR3 2278
+#define IDS_AWARD_THEME 2279
+#define IDS_UNLOCK_ACHIEVEMENT_TEXT 2280
+#define IDS_UNLOCK_AVATAR_TEXT 2281
+#define IDS_UNLOCK_GAMERPIC_TEXT 2282
+#define IDS_UNLOCK_THEME_TEXT 2283
+#define IDS_UNLOCK_ACCEPT_INVITE 2284
+#define IDS_UNLOCK_GUEST_TEXT 2285
+#define IDS_LEADERBOARD_GAMERTAG 2286
+#define IDS_GROUPNAME_POTIONS_480 2287
+#define IDS_RETURNEDTOTITLESCREEN_TEXT 2288
+#define IDS_TRIALOVER_TEXT 2289
+#define IDS_FATAL_ERROR_TEXT 2290
+#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 2291
+#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 2292
+#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 2293
+#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 2294
+#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE 2295
+#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 2296
+#define IDS_SAVE_ICON_MESSAGE 2297
+#define IDS_GAMEOPTION_HOST_PRIVILEGES 2298
+#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 2299
+#define IDS_ACHIEVEMENTS 2300
+#define IDS_LABEL_GAMERTAGS 2301
+#define IDS_IN_GAME_GAMERTAGS 2302
+#define IDS_SOCIAL_DEFAULT_DESCRIPTION 2303
+#define IDS_TITLE_UPDATE_NAME 2304
+#define IDS_PLATFORM_NAME 2305
+#define IDS_BACK_BUTTON 2306
+#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 2307
+#define IDS_KICK_PLAYER_DESCRIPTION 2308
+#define IDS_USING_TRIAL_TEXUREPACK_WARNING 2309
+#define IDS_WORLD_SIZE_TITLE_SMALL 2310
+#define IDS_WORLD_SIZE_TITLE_MEDIUM 2311
+#define IDS_WORLD_SIZE_TITLE_LARGE 2312
+#define IDS_WORLD_SIZE_TITLE_CLASSIC 2313
+#define IDS_WORLD_SIZE 2314
+#define IDS_GAMEOPTION_WORLD_SIZE 2315
+#define IDS_DISABLE_SAVING 2316
+#define IDS_GAMEOPTION_DISABLE_SAVING 2317
+#define IDS_RICHPRESENCE_GAMESTATE 2318
+#define IDS_RICHPRESENCE_IDLE 2319
+#define IDS_RICHPRESENCE_MENUS 2320
+#define IDS_RICHPRESENCE_MULTIPLAYER 2321
+#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 2322
+#define IDS_RICHPRESENCE_MULTIPLAYER_1P 2323
+#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 2324
+#define IDS_RICHPRESENCESTATE_BLANK 2325
+#define IDS_RICHPRESENCESTATE_RIDING_PIG 2326
+#define IDS_RICHPRESENCESTATE_RIDING_MINECART 2327
+#define IDS_RICHPRESENCESTATE_BOATING 2328
+#define IDS_RICHPRESENCESTATE_FISHING 2329
+#define IDS_RICHPRESENCESTATE_CRAFTING 2330
+#define IDS_RICHPRESENCESTATE_FORGING 2331
+#define IDS_RICHPRESENCESTATE_NETHER 2332
+#define IDS_RICHPRESENCESTATE_CD 2333
+#define IDS_RICHPRESENCESTATE_MAP 2334
+#define IDS_RICHPRESENCESTATE_ENCHANTING 2335
+#define IDS_RICHPRESENCESTATE_BREWING 2336
+#define IDS_RICHPRESENCESTATE_ANVIL 2337
+#define IDS_RICHPRESENCESTATE_TRADING 2338
diff --git a/Minecraft.World/Biome.cpp b/Minecraft.World/Biome.cpp
index f0f440bb..3dba97a0 100644
--- a/Minecraft.World/Biome.cpp
+++ b/Minecraft.World/Biome.cpp
@@ -42,6 +42,9 @@ Biome *Biome::smallerExtremeHills = nullptr;
Biome *Biome::jungle = nullptr;
Biome *Biome::jungleHills = nullptr;
+Biome *Biome::savanna = nullptr;
+Biome *Biome::roofedForest = nullptr;
+
void Biome::staticCtor()
{
@@ -78,6 +81,10 @@ void Biome::staticCtor()
Biome::jungle = (new JungleBiome(21))->setColor(0x537b09)->setName(L"Jungle")->setLeafColor(0x537b09)->setTemperatureAndDownfall(1.2f, 0.9f)->setDepthAndScale(0.2f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Jungle, eMinecraftColour_Foliage_Jungle, eMinecraftColour_Water_Jungle,eMinecraftColour_Sky_Jungle);
Biome::jungleHills = (new JungleBiome(22))->setColor(0x2c4205)->setName(L"JungleHills")->setLeafColor(0x537b09)->setTemperatureAndDownfall(1.2f, 0.9f)->setDepthAndScale(1.8f, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_JungleHills, eMinecraftColour_Foliage_JungleHills, eMinecraftColour_Water_JungleHills,eMinecraftColour_Sky_JungleHills);
+
+ Biome::savanna = (new Biome(35))->setName(L"Savanna")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Savanna, eMinecraftColour_Foliage_Savanna, eMinecraftColour_Sky_Desert, eMinecraftColour_Sky_Desert);
+ Biome::roofedForest = (new Biome(29))->setName(L"Roofed Forest")->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_RoofedForest, eMinecraftColour_Foliage_RoofedForest, eMinecraftColour_Water_Forest, eMinecraftColour_Sky_Forest);
+
}
Biome::Biome(int id) : id(id)
diff --git a/Minecraft.World/Biome.h b/Minecraft.World/Biome.h
index f7de3166..3b681169 100644
--- a/Minecraft.World/Biome.h
+++ b/Minecraft.World/Biome.h
@@ -46,6 +46,8 @@ public:
static Biome *smallerExtremeHills;
static Biome *jungle;
static Biome *jungleHills;
+ static Biome *savanna;
+ static Biome *roofedForest;
static const int BIOME_COUNT = 23; // 4J Stu added
diff --git a/Minecraft.World/DarkOakFeature.cpp b/Minecraft.World/DarkOakFeature.cpp
new file mode 100644
index 00000000..30759bce
--- /dev/null
+++ b/Minecraft.World/DarkOakFeature.cpp
@@ -0,0 +1,102 @@
+#include "stdafx.h"
+#include "DarkOakFeature.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "TreeTile2.h"
+#include "LeafTile2.h"
+
+DarkOakFeature::DarkOakFeature(bool doUpdate) : Feature(doUpdate)
+{
+ this->baseHeight = 6;
+}
+
+bool DarkOakFeature::place(Level *level, Random *random, int x, int y, int z)
+{
+ int treeHeight = random->nextInt(3) + baseHeight;
+
+
+ if (y < 1 || y + treeHeight + 1 > Level::maxBuildHeight) return false;
+
+ for (int ix = 0; ix <= 1; ix++) {
+ for (int iz = 0; iz <= 1; iz++) {
+ int below = level->getTile(x + ix, y - 1, z + iz);
+ if (below != Tile::grass_Id && below != Tile::dirt_Id) return false;
+ }
+ }
+
+
+ int dx = random->nextInt(3) - 1;
+ int dz = random->nextInt(3) - 1;
+ int bendStart = treeHeight - random->nextInt(4);
+ int bendLength = 2 - random->nextInt(3);
+
+ int curX = x;
+ int curZ = z;
+
+
+ for (int h = 0; h < treeHeight; h++)
+ {
+ if (h >= bendStart && bendLength > 0)
+ {
+ curX += dx;
+ curZ += dz;
+ bendLength--;
+ }
+
+ placeTrunk2x2(level, curX, y + h, curZ);
+ }
+
+
+ int topY = y + treeHeight;
+ for (int lx = -2; lx <= 3; lx++)
+ {
+ for (int lz = -2; lz <= 3; lz++)
+ {
+ for (int ly = -1; ly <= 1; ly++)
+ {
+
+ if ((lx == -2 && lz == -2) || (lx == 3 && lz == -2) || (lx == -2 && lz == 3) || (lx == 3 && lz == 3))
+ if (ly != 0) continue;
+
+ placeLeaf(level, curX + lx, topY + ly, curZ + lz);
+ }
+ }
+ }
+
+
+ for (int rx = -1; rx <= 2; rx++)
+ {
+ for (int rz = -1; rz <= 2; rz++)
+ {
+ if ((rx < 0 || rx > 1 || rz < 0 || rz > 1) && random->nextInt(3) == 0)
+ {
+ int branchLen = random->nextInt(3) + 2;
+ for (int bh = 0; bh < branchLen; bh++)
+ {
+ placeBlock(level, x + rx, topY - bh - 1, z + rz, Tile::tree2Trunk_Id, TreeTile2::DARK_TRUNK);
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+void DarkOakFeature::placeTrunk2x2(Level *level, int x, int y, int z)
+{
+
+ placeBlock(level, x, y, z, Tile::tree2Trunk_Id, TreeTile2::DARK_TRUNK);
+ placeBlock(level, x + 1, y, z, Tile::tree2Trunk_Id, TreeTile2::DARK_TRUNK);
+ placeBlock(level, x, y, z + 1, Tile::tree2Trunk_Id, TreeTile2::DARK_TRUNK);
+ placeBlock(level, x + 1, y, z + 1, Tile::tree2Trunk_Id, TreeTile2::DARK_TRUNK);
+}
+
+void DarkOakFeature::placeLeaf(Level *level, int x, int y, int z)
+{
+ int tile = level->getTile(x, y, z);
+ if (tile == 0 || tile == Tile::leaves_Id || tile == Tile::leaves2_Id)
+ {
+
+ placeBlock(level, x, y, z, Tile::leaves2_Id, 1);
+ }
+}
\ No newline at end of file
diff --git a/Minecraft.World/DarkOakFeature.h b/Minecraft.World/DarkOakFeature.h
new file mode 100644
index 00000000..dfce2405
--- /dev/null
+++ b/Minecraft.World/DarkOakFeature.h
@@ -0,0 +1,17 @@
+#pragma once
+#pragma once
+#include "Feature.h"
+
+class DarkOakFeature : public Feature
+{
+public:
+ DarkOakFeature(bool doUpdate);
+ virtual bool place(Level *level, Random *random, int x, int y, int z);
+
+private:
+ int baseHeight;
+
+ void placeTrunk2x2(Level *level, int x, int y, int z);
+
+ void placeLeaf(Level *level, int x, int y, int z);
+};
\ No newline at end of file
diff --git a/Minecraft.World/LeafTile2.cpp b/Minecraft.World/LeafTile2.cpp
index e9487f53..5a38a6d5 100644
--- a/Minecraft.World/LeafTile2.cpp
+++ b/Minecraft.World/LeafTile2.cpp
@@ -10,8 +10,8 @@
#include "IconRegister.h"
const unsigned int LeafTile2::LEAF2_NAMES[LEAF2_NAMES_SIZE] = {
- IDS_TILE_LEAVES_BIRCH,
- IDS_TILE_LEAVES_SPRUCE
+ IDS_TILE_LEAVES_ACACIA,
+ IDS_TILE_LEAVES_DARK_OAK
};
const wstring LeafTile2::TEXTURES[2][2] = {
diff --git a/Minecraft.World/LeafTile2.h b/Minecraft.World/LeafTile2.h
index 35257203..9f771e7b 100644
--- a/Minecraft.World/LeafTile2.h
+++ b/Minecraft.World/LeafTile2.h
@@ -24,10 +24,10 @@ public:
virtual unsigned int getDescriptionId(int iData = -1);
virtual void registerIcons(IconRegister *iconRegister);
- // Override per la colorazione del bioma
+
virtual int getColor(int data);
virtual int getColor(LevelSource *level, int x, int y, int z, int data);
- // Override per permettere alle cesoie di droppare il blocco giusto (leaves2)
+
virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data);
};
\ No newline at end of file
diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj
index 9094877f..5413f130 100644
--- a/Minecraft.World/Minecraft.World.vcxproj
+++ b/Minecraft.World/Minecraft.World.vcxproj
@@ -2466,6 +2466,7 @@
+
@@ -2716,6 +2717,8 @@
+
+
@@ -3546,6 +3549,7 @@
+
@@ -3653,6 +3657,8 @@
+
+
diff --git a/Minecraft.World/Minecraft.World.vcxproj.filters b/Minecraft.World/Minecraft.World.vcxproj.filters
index 7f1f0dc7..5a90c307 100644
--- a/Minecraft.World/Minecraft.World.vcxproj.filters
+++ b/Minecraft.World/Minecraft.World.vcxproj.filters
@@ -821,6 +821,9 @@
+
+
+
@@ -1811,6 +1814,9 @@
+
+
+
diff --git a/Minecraft.World/Sapling2.cpp b/Minecraft.World/Sapling2.cpp
new file mode 100644
index 00000000..36782729
--- /dev/null
+++ b/Minecraft.World/Sapling2.cpp
@@ -0,0 +1,141 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.level.levelgen.feature.h"
+#include "net.minecraft.world.h"
+
+#include "SavannaTreeFeature.h"
+#include "DarkOakFeature.h"
+#include "Sapling2.h"
+
+
+int Sapling2::SAPLING_NAMES[SAPLING_NAMES_SIZE] = {
+ IDS_TILE_SAPLING_ACACIA,
+ IDS_TILE_SAPLING_DARK_OAK
+};
+
+const wstring Sapling2::TEXTURE_NAMES[] = { L"sapling_acacia", L"sapling_dark_oak" };
+
+Sapling2::Sapling2(int id) : Bush(id)
+{
+ this->updateDefaultShape();
+ icons = nullptr;
+}
+
+void Sapling2::updateDefaultShape()
+{
+ float ss = 0.4f;
+ this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 2, 0.5f + ss);
+}
+
+bool Sapling2::isSapling(Level *level, int x, int y, int z, int type)
+{
+ return level->getTile(x, y, z) == this->id && (level->getData(x, y, z) & TYPE_MASK) == type;
+}
+
+void Sapling2::tick(Level *level, int x, int y, int z, Random *random)
+{
+ if (level->isClientSide) return;
+ Bush::tick(level, x, y, z, random);
+
+ if (level->getRawBrightness(x, y + 1, z) >= 9 && random->nextInt(7) == 0)
+ {
+ this->growTree(level, x, y, z, random);
+ }
+}
+
+Icon *Sapling2::getTexture(int face, int data)
+{
+
+ if (icons == nullptr)
+ {
+
+ return nullptr;
+ }
+
+ int type = data & TYPE_MASK;
+ if (type < 0 || type >= SAPLING_NAMES_SIZE) type = 0;
+ return icons[type];
+}
+
+void Sapling2::registerIcons(IconRegister *iconRegister)
+{
+ icons = new Icon*[SAPLING_NAMES_SIZE];
+ for (int i = 0; i < SAPLING_NAMES_SIZE; ++i)
+ {
+ icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]);
+ }
+}
+
+void Sapling2::growTree(Level *level, int x, int y, int z, Random *random)
+{
+ int data = level->getData(x, y, z) & TYPE_MASK;
+ Feature *f = nullptr;
+ int ox = 0, oz = 0;
+ bool multiblock = false;
+
+ if (data == TYPE_ACACIA)
+ {
+ f = new SavannaTreeFeature(true);
+ }
+ else if (data == TYPE_DARK_OAK)
+ {
+
+ for (ox = 0; ox >= -1; ox--)
+ {
+ for (oz = 0; oz >= -1; oz--)
+ {
+ if (isSapling(level, x + ox, y, z + oz, TYPE_DARK_OAK) &&
+ isSapling(level, x + ox + 1, y, z + oz, TYPE_DARK_OAK) &&
+ isSapling(level, x + ox, y, z + oz + 1, TYPE_DARK_OAK) &&
+ isSapling(level, x + ox + 1, y, z + oz + 1, TYPE_DARK_OAK))
+ {
+ f = new DarkOakFeature(true);
+ multiblock = true;
+ break;
+ }
+ }
+ if (f != nullptr) break;
+ }
+ if (f == nullptr) return;
+ }
+
+ // Deletion
+ if (multiblock)
+ {
+ level->setTileAndData(x + ox, y, z + oz, 0, 0, Tile::UPDATE_NONE);
+ level->setTileAndData(x + ox + 1, y, z + oz, 0, 0, Tile::UPDATE_NONE);
+ level->setTileAndData(x + ox, y, z + oz + 1, 0, 0, Tile::UPDATE_NONE);
+ level->setTileAndData(x + ox + 1, y, z + oz + 1, 0, 0, Tile::UPDATE_NONE);
+ }
+ else
+ {
+ level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_NONE);
+ }
+
+ // Generation
+ if (f != nullptr)
+ {
+ if (!f->place(level, random, x + ox, y, z + oz))
+ {
+ if (multiblock)
+ {
+ level->setTileAndData(x + ox, y, z + oz, id, data, Tile::UPDATE_NONE);
+ level->setTileAndData(x + ox + 1, y, z + oz, id, data, Tile::UPDATE_NONE);
+ level->setTileAndData(x + ox, y, z + oz + 1, id, data, Tile::UPDATE_NONE);
+ level->setTileAndData(x + ox + 1, y, z + oz + 1, id, data, Tile::UPDATE_NONE);
+ }
+ else
+ {
+ level->setTileAndData(x, y, z, id, data, Tile::UPDATE_NONE);
+ }
+ }
+ delete f;
+ }
+}
+
+bool Sapling2::fertilize(Level *level, int x, int y, int z)
+{
+ this->growTree(level, x, y, z, level->random);
+ return true;
+}
\ No newline at end of file
diff --git a/Minecraft.World/Sapling2.h b/Minecraft.World/Sapling2.h
new file mode 100644
index 00000000..fb988cb4
--- /dev/null
+++ b/Minecraft.World/Sapling2.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "LeafTile2.h"
+#include "Bush.h"
+#include "Sapling.h"
+
+class Sapling2 : public Bush
+{
+ friend class Tile;
+public:
+
+ static const int TYPE_ACACIA = 0;
+ static const int TYPE_DARK_OAK = 1;
+
+ static const int SAPLING_NAMES_SIZE = 2;
+ static int SAPLING_NAMES[SAPLING_NAMES_SIZE];
+
+private:
+ static const wstring TEXTURE_NAMES[];
+ Icon **icons;
+
+ static const int TYPE_MASK = 7;
+ static const int AGE_BIT = 8;
+
+protected:
+ Sapling2(int id);
+
+ bool isSapling(Level *level, int x, int y, int z, int type);
+public:
+ virtual void updateDefaultShape();
+ virtual void tick(Level *level, int x, int y, int z, Random *random);
+ virtual Icon *getTexture(int face, int data);
+ void growTree(Level *level, int x, int y, int z, Random *random);
+ virtual bool fertilize(Level *level, int x, int y, int z);
+
+ virtual void registerIcons(IconRegister *iconRegister);
+};
\ No newline at end of file
diff --git a/Minecraft.World/SavannaTreeFeature.cpp b/Minecraft.World/SavannaTreeFeature.cpp
new file mode 100644
index 00000000..302a788f
--- /dev/null
+++ b/Minecraft.World/SavannaTreeFeature.cpp
@@ -0,0 +1,51 @@
+#include "stdafx.h"
+#include "SavannaTreeFeature.h"
+#include "net.minecraft.world.level.tile.h"
+#include "TreeTile2.h"
+#include "LeafTile2.h"
+
+SavannaTreeFeature::SavannaTreeFeature(bool doUpdate) : Feature(doUpdate) {
+
+ this->baseHeight = 5;
+}
+
+bool SavannaTreeFeature::place(Level* level, Random* random, int x, int y, int z) {
+ int height = random->nextInt(3) + baseHeight;
+ int ground = level->getTile(x, y - 1, z);
+ if (ground != Tile::grass_Id && ground != Tile::dirt_Id) return false;
+
+ int curX = x;
+ int curZ = z;
+ int curY = y;
+
+
+ int dx = random->nextInt(3) - 1;
+ int dz = random->nextInt(3) - 1;
+
+ for (int h = 0; h < height; ++h) {
+
+ if (h >= height / 2 && (dx != 0 || dz != 0)) {
+ curX += dx;
+ curZ += dz;
+ }
+ placeBlock(level, curX, curY + h, curZ, Tile::tree2Trunk_Id, TreeTile2::ACACIA_TRUNK);
+
+
+ if (h == height - 1) {
+ for (int lx = -2; lx <= 2; ++lx) {
+ for (int lz = -2; lz <= 2; ++lz) {
+ if (abs(lx) == 2 && abs(lz) == 2) continue;
+ placeLeaf(level, curX + lx, curY + h, curZ + lz);
+ }
+ }
+ }
+ }
+ return true;
+}
+
+void SavannaTreeFeature::placeLeaf(Level* level, int x, int y, int z) {
+ int t = level->getTile(x, y, z);
+ if (t == 0 || t == Tile::leaves_Id) {
+ placeBlock(level, x, y, z, Tile::leaves2_Id, 0);
+ }
+}
\ No newline at end of file
diff --git a/Minecraft.World/SavannaTreeFeature.h b/Minecraft.World/SavannaTreeFeature.h
new file mode 100644
index 00000000..c7b31bfa
--- /dev/null
+++ b/Minecraft.World/SavannaTreeFeature.h
@@ -0,0 +1,12 @@
+#pragma once
+#include "Feature.h"
+#include "Level.h"
+
+class SavannaTreeFeature : public Feature {
+public:
+ SavannaTreeFeature(bool doUpdate);
+ virtual bool place(Level* level, Random* random, int x, int y, int z);
+private:
+ int baseHeight;
+ void placeLeaf(Level* level, int x, int y, int z);
+};
\ No newline at end of file
diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp
index 00d6d783..977ce3d7 100644
--- a/Minecraft.World/Tile.cpp
+++ b/Minecraft.World/Tile.cpp
@@ -51,6 +51,7 @@ Tile *Tile::dirt = nullptr;
Tile *Tile::cobblestone = nullptr;
Tile *Tile::wood = nullptr;
Tile *Tile::sapling = nullptr;
+Tile *Tile::sapling2 = nullptr;
Tile *Tile::unbreakable = nullptr;
LiquidTile *Tile::water = nullptr;
Tile *Tile::calmWater = nullptr;
@@ -297,6 +298,7 @@ void Tile::staticCtor()
Tile::cobblestone = (new Tile(4, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"cobblestone")->setDescriptionId(IDS_TILE_STONE_BRICK)->setUseDescriptionId(IDS_DESC_STONE_BRICK);
Tile::wood = (new WoodTile(5)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structwoodstuff, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"planks")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->sendTileData()->setUseDescriptionId(IDS_DESC_WOODENPLANKS);
Tile::sapling = (new Sapling(6)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->sendTileData()->setUseDescriptionId(IDS_DESC_SAPLING)->disableMipmap();
+ Tile::sapling2 = (new Sapling2(199)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sapling2")->setDescriptionId(IDS_TILE_SAPLING)->sendTileData()->setUseDescriptionId(IDS_DESC_SAPLING)->disableMipmap();
Tile::unbreakable = (new Tile(7, Material::stone)) ->setIndestructible()->setExplodeable(6000000)->setSoundType(Tile::SOUND_STONE)->setIconName(L"bedrock")->setDescriptionId(IDS_TILE_BEDROCK)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_BEDROCK);
Tile::water = static_cast((new LiquidTileDynamic(8, Material::water))->setDestroyTime(100.0f)->setLightBlock(3)->setIconName(L"water_flow")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER));
Tile::calmWater = (new LiquidTileStatic(9, Material::water)) ->setDestroyTime(100.0f)->setLightBlock(3)->setIconName(L"water_still")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER);
@@ -483,8 +485,8 @@ void Tile::staticCtor()
Tile::packed_ice = (new PackedIceTile(174))->setDestroyTime(0.5f)->setSoundType(SOUND_GLASS)->setIconName(L"packed_ice")->setDescriptionId(IDS_TILE_ICE)->setUseDescriptionId(IDS_DESC_ICE);
Tile::invertedDaylightDetector = static_cast((new DaylightDetectorTile(178, true))->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"daylight_detector")->setDescriptionId(IDS_TILE_DAYLIGHT_DETECTOR)->setUseDescriptionId(IDS_DESC_DAYLIGHT_DETECTOR));
- Tile::red_sandstone = (new RedSandStoneTile(179))->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_sand)->setSoundType(Tile::SOUND_STONE)->setDestroyTime(0.8f)->sendTileData()->setIconName(L"red_sandstone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE)->sendTileData();
- Tile::stairs_red_sandstone = (new StairTile(180, Tile::red_sandstone, 0))->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sand)->setIconName(L"stairsRedSandstone")->setDescriptionId(IDS_TILE_STAIRS_SANDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
+ Tile::red_sandstone = (new RedSandStoneTile(179))->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_sand)->setSoundType(Tile::SOUND_STONE)->setDestroyTime(0.8f)->sendTileData()->setIconName(L"red_sandstone")->setDescriptionId(IDS_TILE_RED_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE)->sendTileData();
+ Tile::stairs_red_sandstone = (new StairTile(180, Tile::red_sandstone, 0))->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sand)->setIconName(L"stairsRedSandstone")->setDescriptionId(IDS_TILE_STAIRS_RED_SANDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS);
Tile::spruceGate = (new FenceGateTile(183))->setBaseItemTypeAndMaterial(Item::eBaseItemType_fenceGate, Item::eMaterial_sprucewood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"planks_spruce")->setDescriptionId(IDS_TILE_SPRUCE_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE);
Tile::birchGate = (new FenceGateTile(184))->setBaseItemTypeAndMaterial(Item::eBaseItemType_fenceGate, Item::eMaterial_birchwood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"planks_birch")->setDescriptionId(IDS_TILE_BIRCH_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE);
@@ -524,6 +526,7 @@ void Tile::staticCtor()
Item::items[woodSlabHalf_Id] = ( new StoneSlabTileItem(Tile::woodSlabHalf_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, false))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB);
Item::items[woodSlab_Id] = ( new StoneSlabTileItem(Tile::woodSlab_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, true))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB);
Item::items[sapling_Id] = ( new MultiTextureTileItem(Tile::sapling_Id - 256, Tile::sapling, Sapling::SAPLING_NAMES, 4) )->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->setUseDescriptionId(IDS_DESC_SAPLING);
+ Item::items[sapling2_Id] = ( new MultiTextureTileItem(Tile::sapling2_Id - 256, Tile::sapling2, Sapling2::SAPLING_NAMES, 2) )->setIconName(L"sapling2")->setDescriptionId(IDS_TILE_SAPLING)->setUseDescriptionId(IDS_DESC_SAPLING);
Item::items[leaves_Id] = ( new LeafTileItem(Tile::leaves_Id - 256) )->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->setUseDescriptionId(IDS_DESC_LEAVES);
Item::items[leaves2_Id] = ( new LeafTileItem(Tile::leaves2_Id - 256) )->setIconName(L"leaves_acacia")->setDescriptionId(IDS_TILE_LEAVES)->setUseDescriptionId(IDS_DESC_LEAVES);
Item::items[vine_Id] = ( new ColoredTileItem(Tile::vine_Id - 256, false))->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE);
@@ -1636,6 +1639,7 @@ const int Tile::dirt_Id;
// 4
const int Tile::wood_Id;
const int Tile::sapling_Id;
+const int Tile::sapling2_Id;
const int Tile::unbreakable_Id;
const int Tile::water_Id;
const int Tile::calmWater_Id;
diff --git a/Minecraft.World/Tile.h b/Minecraft.World/Tile.h
index d586c079..75857b65 100644
--- a/Minecraft.World/Tile.h
+++ b/Minecraft.World/Tile.h
@@ -193,6 +193,7 @@ public:
static const int cobblestone_Id = 4;
static const int wood_Id = 5;
static const int sapling_Id = 6;
+ static const int sapling2_Id = 199;
static const int unbreakable_Id = 7;
static const int water_Id = 8;
static const int calmWater_Id = 9;
@@ -402,6 +403,7 @@ public:
static Tile *cobblestone;
static Tile *wood;
static Tile *sapling;
+ static Tile *sapling2;
static Tile *unbreakable;
static LiquidTile *water;
static Tile *calmWater;
diff --git a/Minecraft.World/net.minecraft.world.level.tile.h b/Minecraft.World/net.minecraft.world.level.tile.h
index f00cb637..e7c7707b 100644
--- a/Minecraft.World/net.minecraft.world.level.tile.h
+++ b/Minecraft.World/net.minecraft.world.level.tile.h
@@ -92,6 +92,7 @@
#include "RotatedPillarTile.h"
#include "SandStoneTile.h"
#include "Sapling.h"
+#include "Sapling2.h"
#include "SignTile.h"
#include "SkullTile.h"
#include "SmoothStoneBrickTile.h"