diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp index 6e62c3b0..cbd89ca5 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -207,6 +207,8 @@ void IUIScene_CreativeMenu::staticCtor() ITEM_AUX(Tile::leaves_Id, LeafTile::EVERGREEN_LEAF) ITEM_AUX(Tile::leaves_Id, LeafTile::BIRCH_LEAF) ITEM_AUX(Tile::leaves_Id, LeafTile::JUNGLE_LEAF) + ITEM_AUX(Tile::leaves2_Id, LeafTile2::ACACIA_LEAF) + ITEM_AUX(Tile::leaves2_Id, LeafTile2::DARK_OAK_LEAF) ITEM(Tile::vine) ITEM(Tile::waterLily_Id) ITEM(Tile::torch_Id) diff --git a/Minecraft.Client/PreStitchedTextureMap.cpp b/Minecraft.Client/PreStitchedTextureMap.cpp index ef9faf37..5330cf13 100644 --- a/Minecraft.Client/PreStitchedTextureMap.cpp +++ b/Minecraft.Client/PreStitchedTextureMap.cpp @@ -1000,6 +1000,8 @@ void PreStitchedTextureMap::loadUVs() ADD_ICON(20, 8, L"log_acacia"); ADD_ICON(20, 9, L"log_acacia_top"); ADD_ICON(20, 10, L"planks_acacia"); + ADD_ICON(20, 11, L"leaves_acacia"); + ADD_ICON(20, 12, L"leaves_acacia_opaque"); ADD_ICON(20, 14, L"red_sand"); ADD_ICON(20, 15, L"red_sandstone_top"); @@ -1008,6 +1010,8 @@ void PreStitchedTextureMap::loadUVs() ADD_ICON(21, 8, L"log_dark"); ADD_ICON(21, 9, L"log_dark_top"); ADD_ICON(21, 10, L"planks_dark"); + ADD_ICON(21, 11, L"leaves_dark_oak"); + ADD_ICON(21, 12, L"leaves_dark_oak_opaque"); ADD_ICON(21, 14, L"red_sandstone_bottom"); ADD_ICON(21, 15, L"red_sandstone_normal"); diff --git a/Minecraft.World/LeafTile.h b/Minecraft.World/LeafTile.h index e6c39a7f..be60d7f4 100644 --- a/Minecraft.World/LeafTile.h +++ b/Minecraft.World/LeafTile.h @@ -1,6 +1,7 @@ #pragma once #include "TransparentTile.h" +class IconRegister; class Random; class ChunkRebuildData; diff --git a/Minecraft.World/LeafTile2.cpp b/Minecraft.World/LeafTile2.cpp new file mode 100644 index 00000000..e9487f53 --- /dev/null +++ b/Minecraft.World/LeafTile2.cpp @@ -0,0 +1,101 @@ +#include "stdafx.h" +#include "LeafTile2.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.stats.h" +#include "net.minecraft.world.level.biome.h" +#include "FoliageColor.h" +#include "IconRegister.h" + +const unsigned int LeafTile2::LEAF2_NAMES[LEAF2_NAMES_SIZE] = { + IDS_TILE_LEAVES_BIRCH, + IDS_TILE_LEAVES_SPRUCE +}; + +const wstring LeafTile2::TEXTURES[2][2] = { + { L"leaves_acacia", L"leaves_dark_oak" }, // Indice 0: Fancy + { L"leaves_acacia_opaque", L"leaves_dark_oak_opaque" } // Indice 1: Veloce/Opaca +}; + +LeafTile2::LeafTile2(int id) : LeafTile(id) +{ + // Non serve fare checkBuffer qui, ci pensa già la classe padre LeafTile! +} + +Icon *LeafTile2::getTexture(int face, int data) +{ + int type = data & 3; + if (type >= LEAF2_NAMES_SIZE) type = 0; + + // isSolidRender() in LeafTile restituisce 'true' se la grafica è su Veloce/Opaca. + // Quindi se è true usiamo l'indice 1, se è false (Trasparente) usiamo l'indice 0. + int textureSet = isSolidRender(false) ? 1 : 0; + + return icons[textureSet][type]; +} + +unsigned int LeafTile2::getDescriptionId(int iData) +{ + int type = iData & 3; + if (type < 0 || type >= LEAF2_NAMES_SIZE) type = 0; + return LeafTile2::LEAF2_NAMES[type]; +} + +void LeafTile2::registerIcons(IconRegister *iconRegister) +{ + for (int fancy = 0; fancy < 2; fancy++) + { + for (int i = 0; i < 2; i++) + { + icons[fancy][i] = iconRegister->registerIcon(TEXTURES[fancy][i]); + } + } +} + +int LeafTile2::getColor(int data) +{ + // In inventario o in mano, l'Acacia e la Dark Oak usano il verde base + return FoliageColor::getDefaultColor(); +} + +int LeafTile2::getColor(LevelSource *level, int x, int y, int z, int data) +{ + // Codice di blending per il colore del bioma (copiato dal tuo LeafTile.cpp) + int totalRed = 0; + int totalGreen = 0; + int totalBlue = 0; + + for (int oz = -1; oz <= 1; oz++) + { + for (int ox = -1; ox <= 1; ox++) + { + int foliageColor = level->getBiome(x + ox, z + oz)->getFolageColor(); // Attento, nel tuo engine si chiama getFolageColor() senza la 'i' + totalRed += (foliageColor & 0xff0000) >> 16; + totalGreen += (foliageColor & 0xff00) >> 8; + totalBlue += (foliageColor & 0xff); + } + } + + return (((totalRed / 9) & 0xFF) << 16) | (((totalGreen / 9) & 0xFF) << 8) | (((totalBlue / 9) & 0xFF)); +} + +void LeafTile2::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) +{ + // Se il giocatore usa le cesoie, vogliamo droppare "leaves2" (ID 161) e non "leaves" (ID 18) + if (!level->isClientSide && player->getSelectedItem() != nullptr && player->getSelectedItem()->id == Item::shears->id) + { + player->awardStat( + GenericStats::blocksMined(id), + GenericStats::param_blocksMined(id, data, 1) + ); + + popResource(level, x, y, z, std::make_shared(Tile::leaves2_Id, 1, data & 3)); + } + else + { + // Altrimenti usa la distruzione standard di TransparentTile + TransparentTile::playerDestroy(level, player, x, y, z, data); + } +} \ No newline at end of file diff --git a/Minecraft.World/LeafTile2.h b/Minecraft.World/LeafTile2.h new file mode 100644 index 00000000..35257203 --- /dev/null +++ b/Minecraft.World/LeafTile2.h @@ -0,0 +1,33 @@ +#pragma once + +#include "LeafTile.h" + +class IconRegister; +class LeafTile2 : public LeafTile +{ +public: + static const int ACACIA_LEAF = 0; + static const int DARK_OAK_LEAF = 1; + + static const int LEAF2_NAMES_SIZE = 2; + static const unsigned int LEAF2_NAMES[LEAF2_NAMES_SIZE]; + +private: + //[0] = Fancy (Trasparenti), [1] = Fast (Opache) + static const wstring TEXTURES[2][2]; + Icon *icons[2][2]; + +public: + LeafTile2(int id); + + virtual Icon *getTexture(int face, int data); + 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/LeafTileItem2.cpp b/Minecraft.World/LeafTileItem2.cpp new file mode 100644 index 00000000..e2bbeaed --- /dev/null +++ b/Minecraft.World/LeafTileItem2.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include "LeafTileItem2.h" +#include "LeafTile2.h" +#include "net.minecraft.world.level.tile.h" +#include "FoliageColor.h" + +LeafTileItem2::LeafTileItem2(int id) : LeafTileItem(id) +{ + setMaxDamage(0); + setStackedByData(true); +} + +int LeafTileItem2::getLevelDataForAuxValue(int auxValue) +{ + return auxValue; +} + +Icon *LeafTileItem2::getIcon(int itemAuxValue) +{ + + return Tile::leaves2->getTexture(0, itemAuxValue); +} + +unsigned int LeafTileItem2::getDescriptionId(shared_ptr instance) +{ + int auxValue = instance->getAuxValue(); + if (auxValue < 0 || auxValue >= LeafTile2::LEAF2_NAMES_SIZE) + { + auxValue = 0; + } + return LeafTile2::LEAF2_NAMES[auxValue]; +} + +int LeafTileItem2::getColor(shared_ptr item, int spriteLayer) +{ + + return FoliageColor::getDefaultColor(); +} \ No newline at end of file diff --git a/Minecraft.World/LeafTileItem2.h b/Minecraft.World/LeafTileItem2.h new file mode 100644 index 00000000..7340c9ea --- /dev/null +++ b/Minecraft.World/LeafTileItem2.h @@ -0,0 +1,14 @@ +#pragma once + +#include "LeafTileItem.h" + +class LeafTileItem2 : public LeafTileItem +{ +public: + LeafTileItem2(int id); + + virtual int getLevelDataForAuxValue(int auxValue); + virtual Icon *getIcon(int itemAuxValue); + virtual int getColor(shared_ptr item, int spriteLayer) override; + virtual unsigned int getDescriptionId(shared_ptr instance); +}; \ No newline at end of file diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index fcbdc8c1..9094877f 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -2490,6 +2490,8 @@ + + @@ -3566,6 +3568,8 @@ + + diff --git a/Minecraft.World/Minecraft.World.vcxproj.filters b/Minecraft.World/Minecraft.World.vcxproj.filters index 56483cbd..7f1f0dc7 100644 --- a/Minecraft.World/Minecraft.World.vcxproj.filters +++ b/Minecraft.World/Minecraft.World.vcxproj.filters @@ -818,6 +818,9 @@ + + + @@ -1805,6 +1808,9 @@ + + + diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp index 2ba65277..00d6d783 100644 --- a/Minecraft.World/Tile.cpp +++ b/Minecraft.World/Tile.cpp @@ -16,8 +16,7 @@ #include "net.minecraft.world.h" #include "net.minecraft.h" #include "Tile.h" -#include "SeaLanternTile.h" -#include "SeaLanternTile.cpp" + wstring Tile::TILE_DESCRIPTION_PREFIX = L"Tile."; @@ -64,6 +63,7 @@ Tile *Tile::ironOre = nullptr; Tile *Tile::coalOre = nullptr; Tile *Tile::treeTrunk = nullptr; LeafTile *Tile::leaves = nullptr; +LeafTile2 *Tile::leaves2 = nullptr; Tile *Tile::sponge = nullptr; Tile *Tile::glass = nullptr; Tile *Tile::lapisOre = nullptr; @@ -311,6 +311,7 @@ void Tile::staticCtor() Tile::treeTrunk = (new TreeTile(17))->setDestroyTime(2.0f) ->setSoundType(Tile::SOUND_WOOD)->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->sendTileData()->setUseDescriptionId(IDS_DESC_LOG); // 4J - for leaves, have specified that only the data bits that encode the type of leaf are important to be sent Tile::leaves = static_cast((new LeafTile(18))->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES)); + Tile::leaves2 = static_cast((new LeafTile2(161))->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"leaves_acacia")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES)); Tile::sponge = (new Sponge(19)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sponge")->setDescriptionId(IDS_TILE_SPONGE)->setUseDescriptionId(IDS_DESC_SPONGE)->sendTileData(); Tile::glass = (new GlassTile(20, Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_GLASS)->setUseDescriptionId(IDS_DESC_GLASS); @@ -524,6 +525,7 @@ void Tile::staticCtor() 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[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); int idsData[3] = {IDS_TILE_SHRUB, IDS_TILE_TALL_GRASS, IDS_TILE_FERN}; intArray ids = intArray(idsData, 3); @@ -542,6 +544,7 @@ void Tile::staticCtor() Item::items[tree2Trunk_Id] = (new MultiTextureTileItem(Tile::tree2Trunk_Id - 256, tree2Trunk, (int*)TreeTile2::TREE_NAMES, TreeTile2::TREE_NAMES_LENGTH))->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->setUseDescriptionId(IDS_DESC_LOG); Item::items[sponge_Id] = (new MultiTextureTileItem(Tile::sponge_Id - 256, sponge, (int*)Sponge::SPONGE_NAMES, Sponge::SPONGE_NAMES_LENGTH))->setIconName(L"sponge")->setDescriptionId(IDS_TILE_SPONGE)->setUseDescriptionId(IDS_DESC_SPONGE); + for (int i = 0; i < 256; i++) { if ( Tile::tiles[i] != nullptr ) @@ -858,8 +861,10 @@ Icon *Tile::getTexture(LevelSource *level, int x, int y, int z, int face) if(opaque) { Tile::leaves->setFancy(false); + Tile::leaves2->setFancy(false); icon = getTexture(face, tileData); Tile::leaves->setFancy(true); + Tile::leaves2->setFancy(true); } else { @@ -1643,6 +1648,7 @@ const int Tile::ironOre_Id; const int Tile::coalOre_Id; const int Tile::treeTrunk_Id; const int Tile::leaves_Id; +const int Tile::leaves2_Id; const int Tile::sponge_Id; const int Tile::glass_Id; const int Tile::lapisOre_Id; diff --git a/Minecraft.World/Tile.h b/Minecraft.World/Tile.h index e071a48e..d586c079 100644 --- a/Minecraft.World/Tile.h +++ b/Minecraft.World/Tile.h @@ -3,10 +3,13 @@ #include "Vec3.h" #include "Definitions.h" #include "SoundTypes.h" + + using namespace std; class GrassTile; class LeafTile; +class LeafTile2; class TallGrass; class DeadBushTile; class FireTile; @@ -203,6 +206,8 @@ public: static const int coalOre_Id = 16; static const int treeTrunk_Id = 17; static const int leaves_Id = 18; + static const int leaves2_Id = 161; + static const int sponge_Id = 19; static const int glass_Id = 20; @@ -409,6 +414,7 @@ public: static Tile *coalOre; static Tile *treeTrunk; static LeafTile *leaves; + static LeafTile2 *leaves2; static Tile *sponge; static Tile *glass; static Tile *lapisOre; diff --git a/Minecraft.World/net.minecraft.world.item.h b/Minecraft.World/net.minecraft.world.item.h index 07728069..6cd9e9c1 100644 --- a/Minecraft.World/net.minecraft.world.item.h +++ b/Minecraft.World/net.minecraft.world.item.h @@ -21,6 +21,7 @@ #include "Item.h" #include "ItemInstance.h" #include "LeafTileItem.h" +#include "LeafTileItem2.h" #include "MapItem.h" #include "MinecartItem.h" //#include "PaintingItem.h" diff --git a/Minecraft.World/net.minecraft.world.level.tile.h b/Minecraft.World/net.minecraft.world.level.tile.h index 031d00df..f00cb637 100644 --- a/Minecraft.World/net.minecraft.world.level.tile.h +++ b/Minecraft.World/net.minecraft.world.level.tile.h @@ -133,5 +133,7 @@ #include "SandTile.h" #include "RedSandStoneTile.h" #include "TreeTile2.h" +#include "SeaLanternTile.h" +#include "LeafTile2.h" #include "PackedIceTile.h" \ No newline at end of file