From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- .../Common/UI/IUIScene_CreativeMenu.cpp | 1053 ++++++++++++++++++++ 1 file changed, 1053 insertions(+) create mode 100644 Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp (limited to 'Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp') diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp new file mode 100644 index 00000000..7ce33234 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -0,0 +1,1053 @@ +#include "stdafx.h" +#include "IUIScene_CreativeMenu.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" + +// 4J JEV - Images for each tab. +IUIScene_CreativeMenu::TabSpec **IUIScene_CreativeMenu::specs = NULL; + +vector< shared_ptr > IUIScene_CreativeMenu::categoryGroups[eCreativeInventoryGroupsCount]; + +#define ITEM(id) list->push_back( shared_ptr(new ItemInstance(id, 1, 0)) ); +#define ITEM_AUX(id, aux) list->push_back( shared_ptr(new ItemInstance(id, 1, aux)) ); +#define DEF(index) list = &categoryGroups[index]; + + +void IUIScene_CreativeMenu::staticCtor() +{ + vector< shared_ptr > *list; + + + // Building Blocks + DEF(eCreativeInventory_BuildingBlocks) + ITEM(Tile::rock_Id) + ITEM(Tile::grass_Id) + ITEM(Tile::dirt_Id) + ITEM(Tile::stoneBrick_Id) + ITEM(Tile::sand_Id) + ITEM(Tile::sandStone_Id) + ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE) + ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS) + ITEM(Tile::goldBlock_Id) + ITEM(Tile::ironBlock_Id) + ITEM(Tile::lapisBlock_Id) + ITEM(Tile::diamondBlock_Id) + ITEM(Tile::emeraldBlock_Id) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_DEFAULT) + ITEM(Tile::coalOre_Id) + ITEM(Tile::lapisOre_Id) + ITEM(Tile::diamondOre_Id) + ITEM(Tile::redStoneOre_Id) + ITEM(Tile::ironOre_Id) + ITEM(Tile::goldOre_Id) + ITEM(Tile::emeraldOre_Id) + ITEM(Tile::netherQuartz_Id) + ITEM(Tile::unbreakable_Id) + ITEM_AUX(Tile::wood_Id,0) + ITEM_AUX(Tile::wood_Id,TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::wood_Id,TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::wood_Id,TreeTile::JUNGLE_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, 0) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::JUNGLE_TRUNK) + ITEM(Tile::gravel_Id) + ITEM(Tile::redBrick_Id) + ITEM(Tile::mossStone_Id) + ITEM(Tile::obsidian_Id) + ITEM(Tile::clay) + ITEM(Tile::ice_Id) + ITEM(Tile::snow_Id) + ITEM(Tile::hellRock_Id) + ITEM(Tile::hellSand_Id) + ITEM(Tile::lightGem_Id) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_DEFAULT) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_MOSSY) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_CRACKED) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_DETAIL) + ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_ROCK) + ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_COBBLE) + ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_STONEBRICK) + ITEM(Tile::mycel_Id) + ITEM(Tile::netherBrick_Id) + ITEM(Tile::whiteStone_Id) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_CHISELED) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_LINES_Y) + ITEM(Tile::trapdoor_Id) + ITEM(Tile::fenceGate_Id) + ITEM(Item::door_wood_Id) + ITEM(Item::door_iron_Id) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::STONE_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::SAND_SLAB) + // AP - changed oak slab to be wood because it wouldn't burn +// ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::WOOD_SLAB) + ITEM_AUX(Tile::woodSlabHalf_Id,0) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::JUNGLE_TRUNK) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::COBBLESTONE_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::BRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::SMOOTHBRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::NETHERBRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::QUARTZ_SLAB) + ITEM(Tile::stairs_wood_Id) + ITEM(Tile::stairs_birchwood_Id) + ITEM(Tile::stairs_sprucewood_Id) + ITEM(Tile::stairs_junglewood_Id) + ITEM(Tile::stairs_stone_Id) + ITEM(Tile::stairs_bricks_Id) + ITEM(Tile::stairs_stoneBrickSmooth_Id) + ITEM(Tile::stairs_netherBricks_Id) + ITEM(Tile::stairs_sandstone_Id) + ITEM(Tile::stairs_quartz_Id) + + + // Decoration + DEF(eCreativeInventory_Decoration) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_SKELETON) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_WITHER) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_ZOMBIE) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_CHAR) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_CREEPER) + ITEM(Tile::sponge_Id) + ITEM(Tile::melon_Id) + ITEM(Tile::pumpkin_Id) + ITEM(Tile::litPumpkin_Id) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_DEFAULT) + 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::leaves_Id, LeafTile::NORMAL_LEAF) + 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(Tile::vine) + ITEM(Tile::waterLily_Id) + ITEM(Tile::torch_Id) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::DEAD_SHRUB) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::TALL_GRASS) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::FERN) + ITEM(Tile::deadBush_Id) + ITEM(Tile::flower_Id) + ITEM(Tile::rose_Id) + ITEM(Tile::mushroom1_Id) + ITEM(Tile::mushroom2_Id) + ITEM(Tile::cactus_Id) + ITEM(Tile::topSnow_Id) + // 4J-PB - Already got sugar cane in Materials ITEM_11(Tile::reeds_Id) + ITEM(Tile::web_Id) + ITEM(Tile::thinGlass_Id) + ITEM(Tile::glass_Id) + ITEM(Item::painting_Id) + ITEM(Item::itemFrame_Id) + ITEM(Item::sign_Id) + ITEM(Tile::bookshelf_Id) + ITEM(Item::flowerPot_Id) + ITEM_AUX(Tile::cloth_Id,14) // Red + ITEM_AUX(Tile::cloth_Id,1) // Orange + ITEM_AUX(Tile::cloth_Id,4) // Yellow + ITEM_AUX(Tile::cloth_Id,5) // Lime + ITEM_AUX(Tile::cloth_Id,3) // Light Blue + ITEM_AUX(Tile::cloth_Id,9) // Cyan + ITEM_AUX(Tile::cloth_Id,11) // Blue + ITEM_AUX(Tile::cloth_Id,10) // Purple + ITEM_AUX(Tile::cloth_Id,2) // Magenta + ITEM_AUX(Tile::cloth_Id,6) // Pink + ITEM_AUX(Tile::cloth_Id,0) // White + ITEM_AUX(Tile::cloth_Id,8) // Light Gray + ITEM_AUX(Tile::cloth_Id,7) // Gray + ITEM_AUX(Tile::cloth_Id,15) // Black + ITEM_AUX(Tile::cloth_Id,13) // Green + ITEM_AUX(Tile::cloth_Id,12) // Brown + + ITEM_AUX(Tile::woolCarpet_Id,14) // Red + ITEM_AUX(Tile::woolCarpet_Id,1) // Orange + ITEM_AUX(Tile::woolCarpet_Id,4) // Yellow + ITEM_AUX(Tile::woolCarpet_Id,5) // Lime + ITEM_AUX(Tile::woolCarpet_Id,3) // Light Blue + ITEM_AUX(Tile::woolCarpet_Id,9) // Cyan + ITEM_AUX(Tile::woolCarpet_Id,11) // Blue + ITEM_AUX(Tile::woolCarpet_Id,10) // Purple + ITEM_AUX(Tile::woolCarpet_Id,2) // Magenta + ITEM_AUX(Tile::woolCarpet_Id,6) // Pink + ITEM_AUX(Tile::woolCarpet_Id,0) // White + ITEM_AUX(Tile::woolCarpet_Id,8) // Light Gray + ITEM_AUX(Tile::woolCarpet_Id,7) // Gray + ITEM_AUX(Tile::woolCarpet_Id,15) // Black + ITEM_AUX(Tile::woolCarpet_Id,13) // Green + ITEM_AUX(Tile::woolCarpet_Id,12) // Brown + + + // Redstone + DEF(eCreativeInventory_Redstone) + ITEM(Tile::dispenser_Id) + ITEM(Tile::musicBlock_Id) + ITEM(Tile::pistonBase_Id) + ITEM(Tile::pistonStickyBase_Id) + ITEM(Tile::tnt_Id) + ITEM(Tile::lever_Id) + ITEM(Tile::button_stone_Id) + ITEM(Tile::button_wood_Id) + ITEM(Tile::pressurePlate_stone_Id) + ITEM(Tile::pressurePlate_wood_Id) + ITEM(Item::redStone_Id) + ITEM(Tile::notGate_on_Id) + ITEM(Item::diode_Id) + ITEM(Tile::redstoneLight_Id) + ITEM(Tile::tripWireSource_Id) + + // Transport + DEF(eCreativeInventory_Transport) + ITEM(Tile::rail_Id) + ITEM(Tile::goldenRail_Id) + ITEM(Tile::detectorRail_Id) + ITEM(Tile::ladder_Id) + ITEM(Item::minecart_Id) + ITEM(Item::minecart_chest_Id) + ITEM(Item::minecart_furnace_Id) + ITEM(Item::saddle_Id) + ITEM(Item::boat_Id) + + // Miscellaneous + DEF(eCreativeInventory_Misc) + ITEM(Tile::chest_Id) + ITEM(Tile::enderChest_Id) + ITEM(Tile::workBench_Id) + ITEM(Tile::furnace_Id) + ITEM(Item::brewingStand_Id) + ITEM(Tile::enchantTable_Id) + ITEM(Tile::endPortalFrameTile_Id) + ITEM(Tile::recordPlayer_Id) + ITEM(Tile::anvil_Id); + ITEM(Tile::fence_Id) + ITEM(Tile::netherFence_Id) + ITEM(Tile::ironFence_Id) + ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_NORMAL) + ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_MOSSY) + ITEM(Item::bed_Id) + ITEM(Item::bucket_empty_Id) + ITEM(Item::bucket_lava_Id) + ITEM(Item::bucket_water_Id) + ITEM(Item::milk_Id) + ITEM(Item::cauldron_Id) + ITEM(Item::snowBall_Id) + ITEM(Item::paper_Id) + ITEM(Item::book_Id) + ITEM(Item::enderPearl_Id) + ITEM(Item::eyeOfEnder_Id) + ITEM(Item::record_01_Id) + ITEM(Item::record_02_Id) + ITEM(Item::record_03_Id) + ITEM(Item::record_04_Id) + ITEM(Item::record_05_Id) + ITEM(Item::record_06_Id) + ITEM(Item::record_07_Id) + ITEM(Item::record_08_Id) + ITEM(Item::record_09_Id) + ITEM(Item::record_10_Id) + ITEM(Item::record_11_Id) + ITEM(Item::record_12_Id) + ITEM_AUX(Item::monsterPlacer_Id, 50); // Creeper + ITEM_AUX(Item::monsterPlacer_Id, 51); // Skeleton + ITEM_AUX(Item::monsterPlacer_Id, 52); // Spider + ITEM_AUX(Item::monsterPlacer_Id, 54); // Zombie + ITEM_AUX(Item::monsterPlacer_Id, 55); // Slime + ITEM_AUX(Item::monsterPlacer_Id, 56); // Ghast + ITEM_AUX(Item::monsterPlacer_Id, 57); // Zombie Pigman + ITEM_AUX(Item::monsterPlacer_Id, 58); // Enderman + ITEM_AUX(Item::monsterPlacer_Id, 59); // Cave Spider + ITEM_AUX(Item::monsterPlacer_Id, 60); // Silverfish + ITEM_AUX(Item::monsterPlacer_Id, 61); // Blaze + ITEM_AUX(Item::monsterPlacer_Id, 62); // Magma Cube + ITEM_AUX(Item::monsterPlacer_Id, 90); // Pig + ITEM_AUX(Item::monsterPlacer_Id, 91); // Sheep + ITEM_AUX(Item::monsterPlacer_Id, 92); // Cow + ITEM_AUX(Item::monsterPlacer_Id, 93); // Chicken + ITEM_AUX(Item::monsterPlacer_Id, 94); // Squid + ITEM_AUX(Item::monsterPlacer_Id, 95); // Wolf + ITEM_AUX(Item::monsterPlacer_Id, 96); // Mooshroom + ITEM_AUX(Item::monsterPlacer_Id, 98); // Ozelot + ITEM_AUX(Item::monsterPlacer_Id, 120); // Villager + + // Food + DEF(eCreativeInventory_Food) + ITEM(Item::apple_Id) + ITEM(Item::apple_gold_Id) + ITEM_AUX(Item::apple_gold_Id,1) // Enchanted + ITEM(Item::melon_Id) + ITEM(Item::mushroomStew_Id) + ITEM(Item::bread_Id) + ITEM(Item::cake_Id) + ITEM(Item::cookie_Id) + ITEM(Item::fish_cooked_Id) + ITEM(Item::fish_raw_Id) + ITEM(Item::porkChop_cooked_Id) + ITEM(Item::porkChop_raw_Id) + ITEM(Item::beef_cooked_Id) + ITEM(Item::beef_raw_Id) + ITEM(Item::chicken_raw_Id) + ITEM(Item::chicken_cooked_Id) + ITEM(Item::rotten_flesh_Id) + ITEM(Item::spiderEye_Id) + ITEM(Item::potato_Id) + ITEM(Item::potatoBaked_Id) + ITEM(Item::potatoPoisonous_Id) + ITEM(Item::carrots_Id) + ITEM(Item::carrotGolden_Id) + ITEM(Item::pumpkinPie_Id) + + // Tools, Armour and Weapons (Complete) + DEF(eCreativeInventory_ToolsArmourWeapons) + ITEM(Item::compass_Id) + ITEM(Item::helmet_cloth_Id) + ITEM(Item::chestplate_cloth_Id) + ITEM(Item::leggings_cloth_Id) + ITEM(Item::boots_cloth_Id) + ITEM(Item::sword_wood_Id) + ITEM(Item::shovel_wood_Id) + ITEM(Item::pickAxe_wood_Id) + ITEM(Item::hatchet_wood_Id) + ITEM(Item::hoe_wood_Id) + + ITEM(Item::map_Id) + ITEM(Item::helmet_chain_Id) + ITEM(Item::chestplate_chain_Id) + ITEM(Item::leggings_chain_Id) + ITEM(Item::boots_chain_Id) + ITEM(Item::sword_stone_Id) + ITEM(Item::shovel_stone_Id) + ITEM(Item::pickAxe_stone_Id) + ITEM(Item::hatchet_stone_Id) + ITEM(Item::hoe_stone_Id) + + ITEM(Item::bow_Id) + ITEM(Item::helmet_iron_Id) + ITEM(Item::chestplate_iron_Id) + ITEM(Item::leggings_iron_Id) + ITEM(Item::boots_iron_Id) + ITEM(Item::sword_iron_Id) + ITEM(Item::shovel_iron_Id) + ITEM(Item::pickAxe_iron_Id) + ITEM(Item::hatchet_iron_Id) + ITEM(Item::hoe_iron_Id) + + ITEM(Item::arrow_Id) + ITEM(Item::helmet_gold_Id) + ITEM(Item::chestplate_gold_Id) + ITEM(Item::leggings_gold_Id) + ITEM(Item::boots_gold_Id) + ITEM(Item::sword_gold_Id) + ITEM(Item::shovel_gold_Id) + ITEM(Item::pickAxe_gold_Id) + ITEM(Item::hatchet_gold_Id) + ITEM(Item::hoe_gold_Id) + + ITEM(Item::flintAndSteel_Id) + ITEM(Item::helmet_diamond_Id) + ITEM(Item::chestplate_diamond_Id) + ITEM(Item::leggings_diamond_Id) + ITEM(Item::boots_diamond_Id) + ITEM(Item::sword_diamond_Id) + ITEM(Item::shovel_diamond_Id) + ITEM(Item::pickAxe_diamond_Id) + ITEM(Item::hatchet_diamond_Id) + ITEM(Item::hoe_diamond_Id) + + ITEM(Item::fireball_Id) + ITEM(Item::clock_Id) + ITEM(Item::shears_Id) + ITEM(Item::fishingRod_Id) + ITEM(Item::carrotOnAStick_Id) + + for(unsigned int i = 0; i < Enchantment::enchantments.length; ++i) + { + Enchantment *enchantment = Enchantment::enchantments[i]; + if (enchantment == NULL || enchantment->category == NULL) continue; + list->push_back(Item::enchantedBook->createForEnchantment(new EnchantmentInstance(enchantment, enchantment->getMaxLevel()))); + } + + // Materials + DEF(eCreativeInventory_Materials) + ITEM(Item::coal_Id) + ITEM_AUX(Item::coal_Id,1) + ITEM(Item::diamond_Id) + ITEM(Item::emerald_Id) + ITEM(Item::ironIngot_Id) + ITEM(Item::goldIngot_Id) + ITEM(Item::netherQuartz_Id) + ITEM(Item::brick_Id) + ITEM(Item::netherbrick_Id) + ITEM(Item::stick_Id) + ITEM(Item::bowl_Id) + ITEM(Item::bone_Id) + ITEM(Item::string_Id) + ITEM(Item::feather_Id) + ITEM(Item::flint_Id) + ITEM(Item::leather_Id) + ITEM(Item::sulphur_Id) + ITEM(Item::clay_Id) + ITEM(Item::yellowDust_Id) + ITEM(Item::seeds_wheat_Id) + ITEM(Item::seeds_melon_Id) + ITEM(Item::seeds_pumpkin_Id) + ITEM(Item::wheat_Id) + ITEM(Item::reeds_Id) + ITEM(Item::egg_Id) + ITEM(Item::sugar_Id) + ITEM(Item::slimeBall_Id) + ITEM(Item::blazeRod_Id) + ITEM(Item::goldNugget_Id) + ITEM(Item::netherStalkSeeds_Id) + ITEM_AUX(Item::dye_powder_Id,1) // Red + ITEM_AUX(Item::dye_powder_Id,14) // Orange + ITEM_AUX(Item::dye_powder_Id,11) // Yellow + ITEM_AUX(Item::dye_powder_Id,10) // Lime + ITEM_AUX(Item::dye_powder_Id,12) // Light Blue + ITEM_AUX(Item::dye_powder_Id,6) // Cyan + ITEM_AUX(Item::dye_powder_Id,4) // Blue + ITEM_AUX(Item::dye_powder_Id,5) // Purple + ITEM_AUX(Item::dye_powder_Id,13) // Magenta + ITEM_AUX(Item::dye_powder_Id,9) // Pink + ITEM_AUX(Item::dye_powder_Id,15) // Bone Meal + ITEM_AUX(Item::dye_powder_Id,7) // Light gray + ITEM_AUX(Item::dye_powder_Id,8) // Gray + ITEM_AUX(Item::dye_powder_Id,0) // black (ink sac) + ITEM_AUX(Item::dye_powder_Id,2) // Green + ITEM_AUX(Item::dye_powder_Id,3) // Brown + + // Brewing (TODO) + DEF(eCreativeInventory_Brewing) + ITEM(Item::expBottle_Id) + + // 4J Stu - Anything else added here also needs to be added to the key handler below + ITEM(Item::ghastTear_Id) + ITEM(Item::fermentedSpiderEye_Id) + ITEM(Item::blazePowder_Id) + ITEM(Item::magmaCream_Id) + ITEM(Item::speckledMelon_Id) + ITEM(Item::glassBottle_Id) + ITEM_AUX(Item::potion_Id,0) // Water bottle + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_TYPE_AWKWARD)) // Awkward Potion + + + DEF(eCreativeInventory_Potions_Basic) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Level2) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INVISIBILITY)) + + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Extended) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Level2_Extended) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + + specs = new TabSpec*[eCreativeInventoryTab_COUNT]; + + // Top Row + ECreative_Inventory_Groups blocksGroup[] = {eCreativeInventory_BuildingBlocks}; + specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup, 0, NULL); + + ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; + specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup, 0, NULL); + + ECreative_Inventory_Groups redAndTranGroup[] = {eCreativeInventory_Transport, eCreativeInventory_Redstone}; + specs[eCreativeInventoryTab_RedstoneAndTransport] = new TabSpec(L"RedstoneAndTransport", IDS_GROUPNAME_REDSTONE_AND_TRANSPORT, 2, redAndTranGroup, 0, NULL); + + ECreative_Inventory_Groups materialsGroup[] = {eCreativeInventory_Materials}; + specs[eCreativeInventoryTab_Materials] = new TabSpec(L"Materials", IDS_GROUPNAME_MATERIALS, 1, materialsGroup, 0, NULL); + + ECreative_Inventory_Groups foodGroup[] = {eCreativeInventory_Food}; + specs[eCreativeInventoryTab_Food] = new TabSpec(L"Food", IDS_GROUPNAME_FOOD, 1, foodGroup, 0, NULL); + + ECreative_Inventory_Groups toolsGroup[] = {eCreativeInventory_ToolsArmourWeapons}; + specs[eCreativeInventoryTab_ToolsWeaponsArmor] = new TabSpec(L"Tools", IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR, 1, toolsGroup, 0, NULL); + + ECreative_Inventory_Groups brewingGroup[] = {eCreativeInventory_Brewing, eCreativeInventory_Potions_Level2_Extended, eCreativeInventory_Potions_Extended, eCreativeInventory_Potions_Level2, eCreativeInventory_Potions_Basic}; + + // Just use the text LT - the graphic doesn't fit in splitscreen either + // In 480p there's not enough room for the LT button, so use text instead + //if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"Brewing", IDS_GROUPNAME_POTIONS_480, 5, brewingGroup, 0, NULL); + } + // else + // { + // specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"icon_brewing.png", IDS_GROUPNAME_POTIONS, 1, brewingGroup, 4, potionsGroup); + // } + + ECreative_Inventory_Groups miscGroup[] = {eCreativeInventory_Misc}; + specs[eCreativeInventoryTab_Misc] = new TabSpec(L"Misc", IDS_GROUPNAME_MISCELLANEOUS, 1, miscGroup, 0, NULL); + +} + +IUIScene_CreativeMenu::IUIScene_CreativeMenu() +{ + m_bCarryingCreativeItem = false; + m_creativeSlotX = m_creativeSlotY = m_inventorySlotX = m_inventorySlotY = 0; + + // 4J JEV - Settup Tabs + for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) + { + m_tabDynamicPos[i] = 0; + m_tabPage[i] = 0; + } +} + +/* 4J JEV - Switches between tabs. +*/ +void IUIScene_CreativeMenu::switchTab(ECreativeInventoryTabs tab) +{ + // Could just be changing page on the current tab + if(tab != m_curTab) updateTabHighlightAndText(tab); + + m_curTab = tab; + + updateScrollCurrentPage(m_tabPage[m_curTab] + 1, specs[m_curTab]->getPageCount()); + + specs[tab]->populateMenu(itemPickerMenu,m_tabDynamicPos[m_curTab], m_tabPage[m_curTab]); +} + +// 4J JEV - Tab Spec Struct + +IUIScene_CreativeMenu::TabSpec::TabSpec(LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount, ECreative_Inventory_Groups *dynamicGroups) + : m_icon(icon), m_descriptionId(descriptionId), m_staticGroupsCount(staticGroupsCount), m_dynamicGroupsCount(dynamicGroupsCount) +{ + + m_pages = 0; + m_staticGroupsA = NULL; + + unsigned int dynamicItems = 0; + m_staticItems = 0; + + if(staticGroupsCount > 0) + { + m_staticGroupsA = new ECreative_Inventory_Groups[staticGroupsCount]; + for(int i = 0; i < staticGroupsCount; ++i) + { + m_staticGroupsA[i] = staticGroups[i]; + m_staticItems += categoryGroups[m_staticGroupsA[i]].size(); + } + } + + m_dynamicGroupsA = NULL; + if(dynamicGroupsCount > 0) + { + m_dynamicGroupsA = new ECreative_Inventory_Groups[dynamicGroupsCount]; + for(int i = 0; i < dynamicGroupsCount; ++i) + { + m_dynamicGroupsA[i] = dynamicGroups[i]; + dynamicItems += categoryGroups[m_dynamicGroupsA[i]].size(); + } + } + + m_staticPerPage = MAX_SIZE - dynamicItems; + m_pages = (int)ceil((float)m_staticItems / m_staticPerPage); +} + +IUIScene_CreativeMenu::TabSpec::~TabSpec() +{ + if(m_staticGroupsA != NULL) delete [] m_staticGroupsA; + if(m_dynamicGroupsA != NULL) delete [] m_dynamicGroupsA; +} + +void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page) +{ + int lastSlotIndex = 0; + + // Fill the dynamic group + if(m_dynamicGroupsCount > 0 && m_dynamicGroupsA != NULL) + { + for(AUTO_VAR(it, categoryGroups[m_dynamicGroupsA[dynamicIndex]].rbegin()); it != categoryGroups[m_dynamicGroupsA[dynamicIndex]].rend() && lastSlotIndex < MAX_SIZE; ++it) + { + Slot *slot = menu->getSlot(++lastSlotIndex); + slot->set( *it ); + } + } + + // Fill from the static groups + unsigned int startIndex = page * m_staticPerPage; + int remainingItems = m_staticItems - startIndex; + + // Work out the first group with an item the want to display, and which item in that group + unsigned int currentIndex = 0; + unsigned int currentGroup = 0; + unsigned int currentItem = 0; + for(; currentGroup < m_staticGroupsCount; ++currentGroup) + { + int size = categoryGroups[m_staticGroupsA[currentGroup]].size(); + if( currentIndex + size < startIndex) + { + currentIndex += size; + continue; + } + currentItem = size - ((currentIndex + size) - startIndex); + break; + } + + for(; lastSlotIndex < MAX_SIZE;) + { + Slot *slot = menu->getSlot(lastSlotIndex++); + slot->set(categoryGroups[m_staticGroupsA[currentGroup]][currentItem]); + + ++currentItem; + if(currentItem >= categoryGroups[m_staticGroupsA[currentGroup]].size()) + { + currentItem = 0; + ++currentGroup; + if(currentGroup >= m_staticGroupsCount) + { + break; + } + } + } + + for(; lastSlotIndex < MAX_SIZE; ++lastSlotIndex) + { + Slot *slot = menu->getSlot(lastSlotIndex); + slot->remove(1); + } +} + +unsigned int IUIScene_CreativeMenu::TabSpec::getPageCount() +{ + return m_pages; +} + + +// 4J JEV - Item Picker Menu +IUIScene_CreativeMenu::ItemPickerMenu::ItemPickerMenu( shared_ptr smp, shared_ptr inv ) : AbstractContainerMenu() +{ + inventory = inv; + creativeContainer = smp; + + //int startLength = slots->size(); + + Slot *slot = NULL; + for (int i = 0; i < TabSpec::MAX_SIZE; i++) + { + // 4J JEV - These values get set by addSlot anyway. + slot = new Slot( creativeContainer, i, -1, -1); + + ItemPickerMenu::addSlot( slot ); + } + + for (int i = 0; i < 9; i++) + { + slot = new Slot( inventory, i, -1, -1 ); + ItemPickerMenu::addSlot( slot ); + } + + // 4J Stu - Give the creative menu a unique container id + containerId = CONTAINER_ID_CREATIVE; +} + +bool IUIScene_CreativeMenu::ItemPickerMenu::stillValid(shared_ptr player) +{ + return true; +} + +bool IUIScene_CreativeMenu::ItemPickerMenu::isOverrideResultClick(int slotNum, int buttonNum) +{ + return slotNum >= 0 && slotNum < 9 && buttonNum == 0; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryCreativeUsing; + } + break; + case eSectionInventoryCreativeUsing: + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryCreativeSelector; + } + break; +#ifndef _XBOX + case eSectionInventoryCreativeTab_0: + case eSectionInventoryCreativeTab_1: + case eSectionInventoryCreativeTab_2: + case eSectionInventoryCreativeTab_3: + case eSectionInventoryCreativeTab_4: + case eSectionInventoryCreativeTab_5: + case eSectionInventoryCreativeTab_6: + case eSectionInventoryCreativeTab_7: + case eSectionInventoryCreativeSlider: + /* do nothing */ + break; +#endif + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0); + + return newSection; +} + +bool IUIScene_CreativeMenu::handleValidKeyPress(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // 4J Added - Make pressing the X button clear the hotbar + if(buttonNum == 1) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + shared_ptr newItem = m_menu->getSlot(i)->getItem(); + + if(newItem != NULL) + { + m_menu->getSlot(i)->set(nullptr); + // call this function to synchronize multiplayer item bar + pMinecraft->localgameModes[iPad]->handleCreativeModeItemAdd(nullptr, i - (int)m_menu->slots->size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + } + } + return true; + } + return false; +} + +void IUIScene_CreativeMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // Drop items. + Minecraft *pMinecraft = Minecraft::GetInstance(); + + shared_ptr playerInventory = pMinecraft->localplayers[iPad]->inventory; + if (playerInventory->getCarried() != NULL) + { + if (buttonNum == 0) + { + pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(playerInventory->getCarried()); + playerInventory->setCarried(nullptr); + } + if (buttonNum == 1) + { + shared_ptr removedItem = playerInventory->getCarried()->remove(1); + pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(removedItem); + if (playerInventory->getCarried()->count == 0) playerInventory->setCarried(nullptr); + } + } + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); +} + +void IUIScene_CreativeMenu::handleAdditionalKeyPress(int iAction) +{ + int dir = 1; + switch(iAction) + { + case ACTION_MENU_LEFT_SCROLL: + dir = -1; + // Fall through intentional + case ACTION_MENU_RIGHT_SCROLL: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)(m_curTab + dir); + if (tab < 0) tab = (ECreativeInventoryTabs)(eCreativeInventoryTab_COUNT - 1); + if (tab >= eCreativeInventoryTab_COUNT) tab = eCreativeInventoryTab_BuildingBlocks; + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + break; + case ACTION_MENU_PAGEUP: + // change the potion strength + { + ++m_tabDynamicPos[m_curTab]; + if(m_tabDynamicPos[m_curTab] >= specs[m_curTab]->m_dynamicGroupsCount) m_tabDynamicPos[m_curTab] = 0; + switchTab(m_curTab); + } + break; + case ACTION_MENU_OTHER_STICK_DOWN: + ++m_tabPage[m_curTab]; + if(m_tabPage[m_curTab] >= specs[m_curTab]->getPageCount()) + { + m_tabPage[m_curTab] = specs[m_curTab]->getPageCount() - 1; + } + else + { + switchTab(m_curTab); + } + break; + case ACTION_MENU_OTHER_STICK_UP: + --m_tabPage[m_curTab]; + if(m_tabPage[m_curTab] < 0) + { + m_tabPage[m_curTab] = 0; + } + else + { + switchTab(m_curTab); + } + break; + } +} + +void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld) +{ + int currentIndex = getCurrentIndex(eSection); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool instantPlace = false; + if (eSection == eSectionInventoryCreativeSelector) + { + if (buttonNum == 0) + { + + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + shared_ptr carried = playerInventory->getCarried(); + shared_ptr clicked = m_menu->getSlot(currentIndex)->getItem(); + if (clicked != NULL) + { + playerInventory->setCarried(ItemInstance::clone(clicked)); + carried = playerInventory->getCarried(); + if (quickKeyHeld == TRUE) + { + carried->count = carried->getMaxStackSize(); + } + m_creativeSlotX = m_iCurrSlotX; + m_creativeSlotY = m_iCurrSlotY; + m_eCurrSection = eSectionInventoryCreativeUsing; + m_eCurrTapState = eTapStateJump; + + instantPlace = getEmptyInventorySlot(carried, m_inventorySlotX); + m_iCurrSlotX = m_inventorySlotX; + m_iCurrSlotY = m_inventorySlotY; + + m_bCarryingCreativeItem = true; + } + } + } + if(instantPlace || eSection == eSectionInventoryCreativeUsing) + { + if(instantPlace) + { + setSectionSelectedSlot(eSectionInventoryCreativeUsing,m_iCurrSlotX,m_iCurrSlotY); + currentIndex = getCurrentIndex(eSectionInventoryCreativeUsing); + buttonNum = 0; + quickKeyHeld = FALSE; + } + m_menu->clicked(currentIndex, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, pMinecraft->localplayers[getPad()]); + shared_ptr newItem = m_menu->getSlot(currentIndex)->getItem(); + // call this function to synchronize multiplayer item bar + pMinecraft->localgameModes[getPad()]->handleCreativeModeItemAdd(newItem, currentIndex - (int)m_menu->slots->size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + + if(m_bCarryingCreativeItem) + { + m_inventorySlotX = m_iCurrSlotX; + m_inventorySlotY = m_iCurrSlotY; + m_eCurrSection = eSectionInventoryCreativeSelector; + m_eCurrTapState = eTapStateJump; + m_iCurrSlotX = m_creativeSlotX; + m_iCurrSlotY = m_creativeSlotY; + + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + playerInventory->setCarried(nullptr); + m_bCarryingCreativeItem = false; + } + } +} + +bool IUIScene_CreativeMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + case eSectionInventoryCreativeSelector: + return true; + } + return false; +} + +bool IUIScene_CreativeMenu::CanHaveFocus( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + case eSectionInventoryCreativeSelector: + return true; + } + return false; +} + +bool IUIScene_CreativeMenu::getEmptyInventorySlot(shared_ptr item, int &slotX) +{ + bool sameItemFound = false; + bool emptySlotFound = false; + // Jump to the slot with this item already on it, if we can stack more + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + shared_ptr slotItem = m_menu->getSlot(i)->getItem(); + if( slotItem != NULL && slotItem->sameItem(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) + { + sameItemFound = true; + slotX = i - TabSpec::MAX_SIZE; + break; + } + } + + if(!sameItemFound) + { + // Find an empty slot + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + if( m_menu->getSlot(i)->getItem() == NULL ) + { + slotX = i - TabSpec::MAX_SIZE; + emptySlotFound = true; + break; + } + } + } + return sameItemFound || emptySlotFound; +} + +int IUIScene_CreativeMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + offset = 0; + break; + case eSectionInventoryCreativeUsing: + offset = TabSpec::MAX_SIZE; + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT) +{ + bool _override = false; + + if(sectionUnderPointer == eSectionInventoryCreativeSelector) + { + if(bSlotHasItem) + { + buttonA = eToolTipPickUpGeneric; + buttonRT = eToolTipWhatIsThis; + + if(itemUnderPointer->isStackable()) + { + buttonY = eToolTipPickUpAll; + } + else + { + buttonY = eToolTipNone; //eToolTipPickUpGeneric; + } + } + } + else if(sectionUnderPointer == eSectionInventoryCreativeUsing) + { + buttonY = eToolTipNone; + } + buttonX = eToolTipClearQuickSelect; + _override = true; + + return _override; +} -- cgit v1.2.3