/*
* This file is part of LanternServer, licensed under the MIT License (MIT).
*
* Copyright (c) LanternPowered <https://www.lanternpowered.org>
* Copyright (c) SpongePowered <https://www.spongepowered.org>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the Software), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.lanternpowered.server.game.registry.type.item;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static org.lanternpowered.server.item.PropertyProviders.armorType;
import static org.lanternpowered.server.item.PropertyProviders.equipmentType;
import static org.lanternpowered.server.item.PropertyProviders.toolType;
import static org.lanternpowered.server.text.translation.TranslationHelper.tr;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import org.lanternpowered.server.data.key.LanternKeys;
import org.lanternpowered.server.data.property.LanternPropertyRegistry;
import org.lanternpowered.server.data.type.LanternDyeColor;
import org.lanternpowered.server.effect.potion.PotionType;
import org.lanternpowered.server.game.registry.AdditionalPluginCatalogRegistryModule;
import org.lanternpowered.server.game.registry.type.block.BlockRegistryModule;
import org.lanternpowered.server.game.registry.type.data.ArmorTypeRegistryModule;
import org.lanternpowered.server.game.registry.type.data.CookedFishRegistryModule;
import org.lanternpowered.server.game.registry.type.data.FishRegistryModule;
import org.lanternpowered.server.game.registry.type.data.ToolTypeRegistryModule;
import org.lanternpowered.server.game.registry.type.item.inventory.equipment.EquipmentTypeRegistryModule;
import org.lanternpowered.server.inventory.LanternItemStack;
import org.lanternpowered.server.item.ItemTypeBuilder;
import org.lanternpowered.server.item.ItemTypeBuilderImpl;
import org.lanternpowered.server.item.LanternItemType;
import org.lanternpowered.server.item.TranslationProvider;
import org.lanternpowered.server.item.behavior.vanilla.ArmorQuickEquipInteractionBehavior;
import org.lanternpowered.server.item.behavior.vanilla.OpenHeldBookBehavior;
import org.lanternpowered.server.util.ReflectionHelper;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.data.type.ArmorType;
import org.spongepowered.api.data.type.ArmorTypes;
import org.spongepowered.api.data.type.CoalTypes;
import org.spongepowered.api.data.type.CookedFishes;
import org.spongepowered.api.data.type.DyeColor;
import org.spongepowered.api.data.type.DyeColors;
import org.spongepowered.api.data.type.Fishes;
import org.spongepowered.api.data.type.GoldenApples;
import org.spongepowered.api.data.type.SkullTypes;
import org.spongepowered.api.data.type.ToolType;
import org.spongepowered.api.data.type.ToolTypes;
import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
import org.spongepowered.api.item.inventory.equipment.EquipmentType;
import org.spongepowered.api.item.inventory.equipment.EquipmentTypes;
import org.spongepowered.api.registry.util.RegistrationDependency;
import org.spongepowered.api.text.translation.Translation;
import java.util.Collections;
import java.util.Optional;
import java.util.function.Function;
@RegistrationDependency({
ArmorTypeRegistryModule.class,
BlockRegistryModule.class,
EquipmentTypeRegistryModule.class,
ToolTypeRegistryModule.class,
FishRegistryModule.class,
CookedFishRegistryModule.class
})
public final class ItemRegistryModule extends AdditionalPluginCatalogRegistryModule<ItemType> implements ItemRegistry {
private static class Holder {
private static final ItemRegistryModule INSTANCE = new ItemRegistryModule();
}
public static ItemRegistryModule get() {
return Holder.INSTANCE;
}
private final Int2ObjectMap<ItemType> itemTypeByInternalId = new Int2ObjectOpenHashMap<>();
private final Object2IntMap<ItemType> internalIdByItemType = new Object2IntOpenHashMap<>();
private ItemRegistryModule() {
super(ItemTypes.class);
this.internalIdByItemType.defaultReturnValue(-1);
}
/**
* Registers a {@link ItemType} with the specified internal id.
*
* @param internalId The internal id
* @param itemType The item type
*/
public void register(int internalId, ItemType itemType) {
checkState(!this.itemTypeByInternalId.containsKey(internalId), "The internal id is already used: %s", internalId);
super.register(itemType);
this.internalIdByItemType.put(itemType, internalId);
this.itemTypeByInternalId.put(internalId, itemType);
LanternPropertyRegistry.getInstance().registerItemPropertyStores(((LanternItemType) itemType).getPropertyProviderCollection());
}
@Override
public int getInternalId(ItemType itemType) {
checkNotNull(itemType, "itemType");
return this.internalIdByItemType.getInt(itemType);
}
@Override
public Optional<ItemType> getTypeByInternalId(int internalId) {
return Optional.ofNullable(this.itemTypeByInternalId.get(internalId));
}
@Override
public void registerDefaults() {
final LanternItemType none = builder().build("minecraft", "none");
register(0, none);
///////////////////
/// Iron Shovel ///
///////////////////
register(256, toolBuilder(ToolTypes.IRON)
.translation("item.shovelIron.name")
.build("minecraft", "iron_shovel"));
////////////////////
/// Iron Pickaxe ///
////////////////////
register(257, toolBuilder(ToolTypes.IRON)
.translation("item.pickaxeIron.name")
.build("minecraft", "iron_pickaxe"));
////////////////////
/// Iron Axe ///
////////////////////
register(258, toolBuilder(ToolTypes.IRON)
.translation("item.hatchetIron.name")
.build("minecraft", "iron_axe"));
///////////////////////
/// Flint and Steel ///
///////////////////////
register(259, durableBuilder()
.translation("item.flintAndSteel.name")
.build("minecraft", "flint_and_steel"));
///////////////////
/// Apple ///
///////////////////
register(260, builder()
.translation("item.apple.name")
.build("minecraft", "apple"));
///////////////////
/// Bow ///
///////////////////
register(261, durableBuilder()
.translation("item.bow.name")
.build("minecraft", "bow"));
///////////////////
/// Arrow ///
///////////////////
register(262, builder()
.translation("item.arrow.name")
.build("minecraft", "arrow"));
///////////////////
/// Coal ///
///////////////////
register(263, builder()
.translation(TranslationProvider.of(CoalTypes.COAL, Keys.COAL_TYPE))
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.COAL_TYPE, CoalTypes.COAL)
)
.build("minecraft", "coal"));
///////////////////
/// Diamond ///
///////////////////
register(264, builder()
.translation("item.diamond.name")
.build("minecraft", "diamond"));
///////////////////
/// Iron Ingot ///
///////////////////
register(265, builder()
.translation("item.ingotIron.name")
.build("minecraft", "iron_ingot"));
///////////////////
/// Gold Ingot ///
///////////////////
register(266, builder()
.translation("item.ingotGold.name")
.build("minecraft", "gold_ingot"));
///////////////////
/// Iron Sword ///
///////////////////
register(267, toolBuilder(ToolTypes.IRON)
.translation("item.swordIron.name")
.build("minecraft", "iron_sword"));
////////////////////
/// Wooden Sword ///
////////////////////
register(268, toolBuilder(ToolTypes.WOOD)
.translation("item.swordWood.name")
.build("minecraft", "wooden_sword"));
/////////////////////
/// Wooden Shovel ///
/////////////////////
register(269, toolBuilder(ToolTypes.WOOD)
.translation("item.shovelWood.name")
.build("minecraft", "wooden_shovel"));
//////////////////////
/// Wooden Pickaxe ///
//////////////////////
register(270, toolBuilder(ToolTypes.WOOD)
.translation("item.pickaxeWood.name")
.build("minecraft", "wooden_pickaxe"));
//////////////////////
/// Wooden Axe ///
//////////////////////
register(271, toolBuilder(ToolTypes.WOOD)
.translation("item.hatchetWood.name")
.build("minecraft", "wooden_axe"));
////////////////////
/// Stone Sword ///
////////////////////
register(272, toolBuilder(ToolTypes.STONE)
.translation("item.swordStone.name")
.build("minecraft", "stone_sword"));
/////////////////////
/// Stone Shovel ///
/////////////////////
register(273, toolBuilder(ToolTypes.STONE)
.translation("item.shovelStone.name")
.build("minecraft", "stone_shovel"));
//////////////////////
/// Stone Pickaxe ///
//////////////////////
register(274, toolBuilder(ToolTypes.STONE)
.translation("item.pickaxeStone.name")
.build("minecraft", "stone_pickaxe"));
//////////////////////
/// Stone Axe ///
//////////////////////
register(275, toolBuilder(ToolTypes.STONE)
.translation("item.hatchetStone.name")
.build("minecraft", "stone_axe"));
/////////////////////
/// Diamond Sword ///
/////////////////////
register(276, toolBuilder(ToolTypes.DIAMOND)
.translation("item.swordDiamond.name")
.build("minecraft", "diamond_sword"));
//////////////////////
/// Diamond Shovel ///
//////////////////////
register(277, toolBuilder(ToolTypes.DIAMOND)
.translation("item.shovelDiamond.name")
.build("minecraft", "diamond_shovel"));
///////////////////////
/// Diamond Pickaxe ///
///////////////////////
register(278, toolBuilder(ToolTypes.DIAMOND)
.translation("item.pickaxeDiamond.name")
.build("minecraft", "diamond_pickaxe"));
///////////////////////
/// Diamond Axe ///
///////////////////////
register(279, toolBuilder(ToolTypes.DIAMOND)
.translation("item.hatchetDiamond.name")
.build("minecraft", "diamond_axe"));
///////////////////////
/// Stick ///
///////////////////////
register(280, builder()
.translation("item.stick.name")
.build("minecraft", "stick"));
//////////////////////
/// Bowl ///
//////////////////////
register(281, builder()
.translation("item.bowl.name")
.build("minecraft", "bowl"));
//////////////////////
/// Mushroom Stew ///
//////////////////////
register(282, builder()
.translation("item.mushroomStew.name")
.build("minecraft", "mushroom_stew"));
/////////////////////
/// Golden Sword ///
/////////////////////
register(283, toolBuilder(ToolTypes.GOLD)
.translation("item.swordGold.name")
.build("minecraft", "golden_sword"));
//////////////////////
/// Golden Shovel ///
//////////////////////
register(284, toolBuilder(ToolTypes.GOLD)
.translation("item.shovelGold.name")
.build("minecraft", "golden_shovel"));
///////////////////////
/// Golden Pickaxe ///
///////////////////////
register(285, toolBuilder(ToolTypes.GOLD)
.translation("item.pickaxeGold.name")
.build("minecraft", "golden_pickaxe"));
///////////////////////
/// Golden Axe ///
///////////////////////
register(286, toolBuilder(ToolTypes.GOLD)
.translation("item.hatchetGold.name")
.build("minecraft", "golden_axe"));
///////////////////////
/// String ///
///////////////////////
register(287, builder()
.translation("item.string.name")
.build("minecraft", "string"));
///////////////////////
/// Feather ///
///////////////////////
register(288, builder()
.translation("item.feather.name")
.build("minecraft", "feather"));
///////////////////////
/// Gunpowder ///
///////////////////////
register(289, builder()
.translation("item.sulphur.name")
.build("minecraft", "gunpowder"));
///////////////////////
/// Wooden Hoe ///
///////////////////////
register(290, toolBuilder(ToolTypes.WOOD)
.translation("item.hoeWood.name")
.build("minecraft", "wooden_hoe"));
///////////////////////
/// Stone Hoe ///
///////////////////////
register(291, toolBuilder(ToolTypes.STONE)
.translation("item.hoeStone.name")
.build("minecraft", "stone_hoe"));
///////////////////////
/// Iron Hoe ///
///////////////////////
register(292, toolBuilder(ToolTypes.IRON)
.translation("item.hoeIron.name")
.build("minecraft", "iron_hoe"));
///////////////////////
/// Diamond Hoe ///
///////////////////////
register(293, toolBuilder(ToolTypes.DIAMOND)
.translation("item.hoeDiamond.name")
.build("minecraft", "diamond_hoe"));
///////////////////////
/// Golden Hoe ///
///////////////////////
register(294, toolBuilder(ToolTypes.GOLD)
.translation("item.hoeGold.name")
.build("minecraft", "golden_hoe"));
///////////////////////
/// Wheat Seeds ///
///////////////////////
register(295, builder()
.translation("item.seeds.name")
.build("minecraft", "wheat_seeds"));
///////////////////////
/// Wheat ///
///////////////////////
register(296, builder()
.translation("item.wheat.name")
.build("minecraft", "wheat"));
///////////////////////
/// Bread ///
///////////////////////
register(297, builder()
.translation("item.bread.name")
.build("minecraft", "bread"));
//////////////////////////
/// Leather Helmet ///
//////////////////////////
register(298, leatherArmorBuilder(EquipmentTypes.HEADWEAR)
.translation("item.helmetCloth.name")
.build("minecraft", "leather_helmet"));
//////////////////////////
/// Leather Chestplate ///
//////////////////////////
register(299, leatherArmorBuilder(EquipmentTypes.CHESTPLATE)
.translation("item.chestplateCloth.name")
.build("minecraft", "leather_chestplate"));
//////////////////////////
/// Leather Leggings ///
//////////////////////////
register(300, leatherArmorBuilder(EquipmentTypes.LEGGINGS)
.translation("item.leggingsCloth.name")
.build("minecraft", "leather_leggings"));
//////////////////////////
/// Leather Boots ///
//////////////////////////
register(301, leatherArmorBuilder(EquipmentTypes.BOOTS)
.translation("item.bootsCloth.name")
.build("minecraft", "leather_boots"));
////////////////////////////
/// Chainmail Helmet ///
////////////////////////////
register(302, armorBuilder(ArmorTypes.CHAIN, EquipmentTypes.HEADWEAR)
.translation("item.helmetChain.name")
.build("minecraft", "chainmail_helmet"));
////////////////////////////
/// Chainmail Chestplate ///
////////////////////////////
register(303, armorBuilder(ArmorTypes.CHAIN, EquipmentTypes.CHESTPLATE)
.translation("item.chestplateChain.name")
.build("minecraft", "chainmail_chestplate"));
////////////////////////////
/// Chainmail Leggings ///
////////////////////////////
register(304, armorBuilder(ArmorTypes.CHAIN, EquipmentTypes.LEGGINGS)
.translation("item.leggingsChain.name")
.build("minecraft", "chainmail_leggings"));
////////////////////////////
/// Chainmail Boots ///
////////////////////////////
register(305, armorBuilder(ArmorTypes.CHAIN, EquipmentTypes.BOOTS)
.translation("item.bootsChain.name")
.build("minecraft", "chainmail_boots"));
///////////////////////
/// Iron Helmet ///
///////////////////////
register(306, armorBuilder(ArmorTypes.IRON, EquipmentTypes.HEADWEAR)
.translation("item.helmetIron.name")
.build("minecraft", "iron_helmet"));
///////////////////////
/// Iron Chestplate ///
///////////////////////
register(307, armorBuilder(ArmorTypes.IRON, EquipmentTypes.CHESTPLATE)
.translation("item.chestplateIron.name")
.build("minecraft", "iron_chestplate"));
///////////////////////
/// Iron Leggings ///
///////////////////////
register(308, armorBuilder(ArmorTypes.IRON, EquipmentTypes.LEGGINGS)
.translation("item.leggingsIron.name")
.build("minecraft", "iron_leggings"));
///////////////////////
/// Iron Boots ///
///////////////////////
register(309, armorBuilder(ArmorTypes.IRON, EquipmentTypes.BOOTS)
.translation("item.bootsIron.name")
.build("minecraft", "iron_boots"));
//////////////////////////
/// Diamond Helmet ///
//////////////////////////
register(310, armorBuilder(ArmorTypes.DIAMOND, EquipmentTypes.HEADWEAR)
.translation("item.helmetDiamond.name")
.build("minecraft", "diamond_helmet"));
//////////////////////////
/// Diamond Chestplate ///
//////////////////////////
register(311, armorBuilder(ArmorTypes.DIAMOND, EquipmentTypes.CHESTPLATE)
.translation("item.chestplateDiamond.name")
.build("minecraft", "diamond_chestplate"));
//////////////////////////
/// Diamond Leggings ///
//////////////////////////
register(312, armorBuilder(ArmorTypes.DIAMOND, EquipmentTypes.LEGGINGS)
.translation("item.leggingsDiamond.name")
.build("minecraft", "diamond_leggings"));
//////////////////////////
/// Diamond Boots ///
//////////////////////////
register(313, armorBuilder(ArmorTypes.DIAMOND, EquipmentTypes.BOOTS)
.translation("item.bootsDiamond.name")
.build("minecraft", "diamond_boots"));
/////////////////////////
/// Golden Helmet ///
/////////////////////////
register(314, armorBuilder(ArmorTypes.GOLD, EquipmentTypes.HEADWEAR)
.translation("item.helmetGold.name")
.build("minecraft", "golden_helmet"));
/////////////////////////
/// Golden Chestplate ///
/////////////////////////
register(315, armorBuilder(ArmorTypes.GOLD, EquipmentTypes.CHESTPLATE)
.translation("item.chestplateGold.name")
.build("minecraft", "golden_chestplate"));
/////////////////////////
/// Golden Leggings ///
/////////////////////////
register(316, armorBuilder(ArmorTypes.GOLD, EquipmentTypes.LEGGINGS)
.translation("item.leggingsGold.name")
.build("minecraft", "golden_leggings"));
/////////////////////////
/// Golden Boots ///
/////////////////////////
register(317, armorBuilder(ArmorTypes.GOLD, EquipmentTypes.BOOTS)
.translation("item.bootsGold.name")
.build("minecraft", "golden_boots"));
///////////////////////
/// Flint ///
///////////////////////
register(318, builder()
.translation("item.flint.name")
.build("minecraft", "flint"));
///////////////////////
/// Porkchop ///
///////////////////////
register(319, builder()
.translation("item.porkchopRaw.name")
.build("minecraft", "porkchop"));
/////////////////////////
/// Cooked Porkchop ///
/////////////////////////
register(320, builder()
.translation("item.porkchopCooked.name")
.build("minecraft", "cooked_porkchop"));
/////////////////////////
/// Painting ///
/////////////////////////
register(321, builder()
.translation("item.painting.name")
.build("minecraft", "painting"));
////////////////////
/// Golden Apple ///
////////////////////
register(322, builder()
.translation("item.appleGold.name")
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.GOLDEN_APPLE_TYPE, GoldenApples.GOLDEN_APPLE)
)
.build("minecraft", "golden_apple"));
/////////////////////
/// Sign ///
/////////////////////
register(323, builder()
.translation("item.sign.name")
.maxStackQuantity(16)
.build("minecraft", "sign"));
///////////////////////
/// Wooden Door ///
///////////////////////
register(324, builder()
.translation("item.doorOak.name")
.build("minecraft", "wooden_door"));
/////////////////////
/// Bucket ///
/////////////////////
register(325, builder()
.translation("item.bucket.name")
.maxStackQuantity(16)
.build("minecraft", "bucket"));
////////////////////////
/// Water Bucket ///
////////////////////////
register(326, builder()
.translation("item.bucketWater.name")
.maxStackQuantity(1)
.build("minecraft", "water_bucket"));
///////////////////////
/// Lava Bucket ///
///////////////////////
register(327, builder()
.translation("item.bucketLava.name")
.maxStackQuantity(1)
.build("minecraft", "lava_bucket"));
////////////////////
/// Minecart ///
////////////////////
register(328, builder()
.translation("item.minecart.name")
.maxStackQuantity(1)
.build("minecraft", "minecart"));
//////////////////
/// Saddle ///
//////////////////
register(329, builder()
.translation("item.saddle.name")
.build("minecraft", "saddle"));
/////////////////////
/// Iron Door ///
/////////////////////
register(330, builder()
.translation("item.doorIron.name")
.build("minecraft", "iron_door"));
////////////////////
/// Redstone ///
////////////////////
register(331, builder()
.translation("item.redstone.name")
.build("minecraft", "redstone"));
////////////////////
/// Snowball ///
////////////////////
register(332, builder()
.translation("item.snowball.name")
.build("minecraft", "snowball"));
////////////////////
/// Oak Boat ///
////////////////////
register(333, builder()
.translation("item.boat.oak.name")
.build("minecraft", "boat"));
///////////////////
/// Leather ///
///////////////////
register(334, builder()
.translation("item.leather.name")
.build("minecraft", "leather"));
///////////////////////
/// Milk Bucket ///
///////////////////////
register(335, builder()
.translation("item.milk.name")
.maxStackQuantity(1)
.build("minecraft", "milk_bucket"));
/////////////////
/// Brick ///
/////////////////
register(336, builder()
.translation("item.brick.name")
.build("minecraft", "brick"));
/////////////////////
/// Clay Ball ///
/////////////////////
register(337, builder()
.translation("item.clay.name")
.build("minecraft", "clay_ball"));
/////////////////
/// Reeds ///
/////////////////
register(338, builder()
.translation("item.reeds.name")
.build("minecraft", "reeds"));
/////////////////
/// Paper ///
/////////////////
register(339, builder()
.translation("item.paper.name")
.build("minecraft", "paper"));
////////////////
/// Book ///
////////////////
register(340, builder()
.translation("item.book.name")
.build("minecraft", "book"));
//////////////////////
/// Slime Ball ///
//////////////////////
register(341, builder()
.translation("item.slimeball.name")
.build("minecraft", "slime_ball"));
//////////////////////////
/// Chest Minecart ///
//////////////////////////
register(342, builder()
.translation("item.minecartChest.name")
.maxStackQuantity(1)
.build("minecraft", "chest_minecart"));
////////////////////////////
/// Furnace Minecart ///
////////////////////////////
register(343, builder()
.translation("item.minecartFurnace.name")
.maxStackQuantity(1)
.build("minecraft", "furnace_minecart"));
///////////////
/// Egg ///
///////////////
register(344, builder()
.translation("item.egg.name")
.maxStackQuantity(16)
.build("minecraft", "egg"));
///////////////////
/// Compass ///
///////////////////
register(345, builder()
.translation("item.compass.name")
.build("minecraft", "compass"));
///////////////////////
/// Fishing Rod ///
///////////////////////
register(346, builder()
.translation("item.fishingRod.name")
.build("minecraft", "fishing_rod"));
/////////////////
/// Clock ///
/////////////////
register(347, builder()
.translation("item.clock.name")
.build("minecraft", "clock"));
//////////////////////////
/// Glowstone Dust ///
//////////////////////////
register(348, builder()
.translation("item.yellowDust.name")
.build("minecraft", "glowstone_dust"));
////////////////
/// Fish ///
////////////////
register(349, builder()
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.FISH_TYPE, Fishes.COD).notRemovable())
.translation(TranslationProvider.of(Fishes.COD, Keys.FISH_TYPE))
.build("minecraft", "fish"));
///////////////////////
/// Cooked Fish ///
///////////////////////
register(350, builder()
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.COOKED_FISH, CookedFishes.COD).notRemovable())
.translation(TranslationProvider.of(CookedFishes.COD, Keys.COOKED_FISH))
.build("minecraft", "cooked_fish"));
///////////////
/// Dye ///
///////////////
register(351, builder()
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.DYE_COLOR, DyeColors.WHITE).notRemovable())
.translation(coloredTranslation("item.dyePowder.%s.name", DyeColors.WHITE))
.build("minecraft", "dye"));
////////////////
/// Bone ///
////////////////
register(352, builder()
.translation("item.bone.name")
.build("minecraft", "bone"));
/////////////////
/// Sugar ///
/////////////////
register(353, builder()
.translation("item.sugar.name")
.build("minecraft", "sugar"));
////////////////
/// Cake ///
////////////////
register(354, builder()
.translation("item.cake.name")
.build("minecraft", "cake"));
///////////////
/// Bed ///
///////////////
register(355, builder()
.translation("item.bed.name")
.build("minecraft", "bed"));
////////////////////
/// Repeater ///
////////////////////
register(356, builder()
.translation("item.diode.name")
.build("minecraft", "repeater"));
//////////////////
/// Cookie ///
//////////////////
register(357, builder()
.translation("item.cookie.name")
.build("minecraft", "cookie"));
//////////////////////
/// Filled Map ///
//////////////////////
register(358, builder()
.translation("item.map.name")
.build("minecraft", "filled_map"));
//////////////////
/// Shears ///
//////////////////
register(359, builder()
.translation("item.shears.name")
.build("minecraft", "shears"));
/////////////////
/// Melon ///
/////////////////
register(360, builder()
.translation("item.melon.name")
.build("minecraft", "melon"));
/////////////////////////
/// Pumpkin Seeds ///
/////////////////////////
register(361, builder()
.translation("item.seeds_pumpkin.name")
.build("minecraft", "pumpkin_seeds"));
///////////////////////
/// Melon Seeds ///
///////////////////////
register(362, builder()
.translation("item.seeds_melon.name")
.build("minecraft", "melon_seeds"));
////////////////
/// Beef ///
////////////////
register(363, builder()
.translation("item.beefRaw.name")
.build("minecraft", "beef"));
///////////////////////
/// Cooked Beef ///
///////////////////////
register(364, builder()
.translation("item.beefCooked.name")
.build("minecraft", "cooked_beef"));
///////////////////
/// Chicken ///
///////////////////
register(365, builder()
.translation("item.chickenRaw.name")
.build("minecraft", "chicken"));
//////////////////////////
/// Cooked Chicken ///
//////////////////////////
register(366, builder()
.translation("item.chickenCooked.name")
.build("minecraft", "cooked_chicken"));
////////////////////////
/// Rotten Flesh ///
////////////////////////
register(367, builder()
.translation("item.rottenFlesh.name")
.build("minecraft", "rotten_flesh"));
///////////////////////
/// Ender Pearl ///
///////////////////////
register(368, builder()
.translation("item.enderPearl.name")
.build("minecraft", "ender_pearl"));
/////////////////////
/// Blaze Rod ///
/////////////////////
register(369, builder()
.translation("item.blazeRod.name")
.build("minecraft", "blaze_rod"));
//////////////////////
/// Ghast Tear ///
//////////////////////
register(370, builder()
.translation("item.ghastTear.name")
.build("minecraft", "ghast_tear"));
///////////////////////
/// Gold Nugget ///
///////////////////////
register(371, builder()
.translation("item.goldNugget.name")
.build("minecraft", "gold_nugget"));
///////////////////////
/// Nether Wart ///
///////////////////////
register(372, builder()
.translation("item.netherStalkSeeds.name")
.build("minecraft", "nether_wart"));
//////////////////
/// Potion ///
//////////////////
register(373, potionEffectsBuilder(PotionType::getTranslation)
.maxStackQuantity(1)
.build("minecraft", "potion"));
////////////////////////
/// Glass Bottle ///
////////////////////////
register(374, builder()
.translation("item.glassBottle.name")
.build("minecraft", "glass_bottle"));
//////////////////////
/// Spider Eye ///
//////////////////////
register(375, builder()
.translation("item.spiderEye.name")
.build("minecraft", "spider_eye"));
////////////////////////////////
/// Fermented Spider Eye ///
////////////////////////////////
register(376, builder()
.translation("item.fermentedSpiderEye.name")
.build("minecraft", "fermented_spider_eye"));
////////////////////////
/// Blaze Powder ///
////////////////////////
register(377, builder()
.translation("item.blazePowder.name")
.build("minecraft", "blaze_powder"));
///////////////////////
/// Magma Cream ///
///////////////////////
register(378, builder()
.translation("item.magmaCream.name")
.build("minecraft", "magma_cream"));
/////////////////////////
/// Brewing Stand ///
/////////////////////////
register(379, builder()
.translation("item.brewingStand.name")
.build("minecraft", "brewing_stand"));
////////////////////
/// Cauldron ///
////////////////////
register(380, builder()
.translation("item.cauldron.name")
.build("minecraft", "cauldron"));
/////////////////////
/// Ender Eye ///
/////////////////////
register(381, builder()
.translation("item.eyeOfEnder.name")
.build("minecraft", "ender_eye"));
//////////////////////////
/// Speckled Melon ///
//////////////////////////
register(382, builder()
.translation("item.speckledMelon.name")
.build("minecraft", "speckled_melon"));
/////////////////////
/// Spawn Egg ///
/////////////////////
register(383, builder()
.translation("item.monsterPlacer.name")
.build("minecraft", "spawn_egg"));
/////////////////////////////
/// Experience Bottle ///
/////////////////////////////
register(384, builder()
.translation("item.expBottle.name")
.build("minecraft", "experience_bottle"));
///////////////////////
/// Fire Charge ///
///////////////////////
register(385, builder()
.translation("item.fireball.name")
.build("minecraft", "fire_charge"));
/////////////////////////
/// Writable Book ///
/////////////////////////
register(386, builder()
.translation("item.writingBook.name")
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.BOOK_PAGES, null))
.build("minecraft", "writable_book"));
////////////////////////
/// Written Book ///
////////////////////////
register(387, builder()
.translation("item.writtenBook.name")
.keysProvider(valueContainer -> {
valueContainer.registerKey(Keys.BOOK_PAGES, null);
valueContainer.registerKey(Keys.BOOK_AUTHOR, null);
valueContainer.registerKey(Keys.GENERATION, null);
})
.behaviors(pipeline -> pipeline
.add(new OpenHeldBookBehavior()))
.build("minecraft", "written_book"));
///////////////////
/// Emerald ///
///////////////////
register(388, builder()
.translation("item.emerald.name")
.build("minecraft", "emerald"));
//////////////////////
/// Item Frame ///
//////////////////////
register(389, builder()
.translation("item.frame.name")
.build("minecraft", "item_frame"));
//////////////////////
/// Flower Pot ///
//////////////////////
register(390, builder()
.translation("item.flowerPot.name")
.build("minecraft", "flower_pot"));
//////////////////
/// Carrot ///
//////////////////
register(391, builder()
.translation("item.carrots.name")
.build("minecraft", "carrot"));
//////////////////
/// Potato ///
//////////////////
register(392, builder()
.translation("item.potato.name")
.build("minecraft", "potato"));
////////////////////////
/// Baked Potato ///
////////////////////////
register(393, builder()
.translation("item.potatoBaked.name")
.build("minecraft", "baked_potato"));
////////////////////////////
/// Poisonous Potato ///
////////////////////////////
register(394, builder()
.translation("item.potatoPoisonous.name")
.build("minecraft", "poisonous_potato"));
///////////////
/// Map ///
///////////////
register(395, builder()
.translation("item.emptyMap.name")
.build("minecraft", "map"));
/////////////////////////
/// Golden Carrot ///
/////////////////////////
register(396, builder()
.translation("item.carrotGolden.name")
.build("minecraft", "golden_carrot"));
/////////////////
/// Skull ///
/////////////////
register(397, builder()
.translation(TranslationProvider.of(SkullTypes.SKELETON, Keys.SKULL_TYPE))
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.SKULL_TYPE, SkullTypes.SKELETON))
.properties(builder -> builder
.add(equipmentType(EquipmentTypes.HEADWEAR)))
.build("minecraft", "skull"));
/////////////////////////////
/// Carrot On A Stick ///
/////////////////////////////
register(398, builder()
.translation("item.carrotOnAStick.name")
.build("minecraft", "carrot_on_a_stick"));
///////////////////////
/// Nether Star ///
///////////////////////
register(399, builder()
.translation("item.netherStar.name")
.build("minecraft", "nether_star"));
///////////////////////
/// Pumpkin Pie ///
///////////////////////
register(400, builder()
.translation("item.pumpkinPie.name")
.build("minecraft", "pumpkin_pie"));
////////////////////
/// Fireworks ///
////////////////////
register(401, builder()
.translation("item.fireworks.name")
.keysProvider(valueContainer -> {
valueContainer.registerKey(Keys.FIREWORK_EFFECTS, Collections.emptyList());
valueContainer.registerKey(Keys.FIREWORK_FLIGHT_MODIFIER, 1);
})
.build("minecraft", "fireworks"));
///////////////////////
/// Firework Charge ///
///////////////////////
register(402, builder()
.translation("item.fireworksCharge.name")
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.FIREWORK_EFFECTS, Collections.emptyList())
)
.maxStackQuantity(1)
.build("minecraft", "firework_charge"));
//////////////////////////
/// Enchanted Book ///
//////////////////////////
register(403, builder()
.translation("item.enchantedBook.name")
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.STORED_ENCHANTMENTS, null))
.maxStackQuantity(1)
.build("minecraft", "enchanted_book"));
//////////////////////
/// Comparator ///
//////////////////////
register(404, builder()
.translation("item.comparator.name")
.build("minecraft", "comparator"));
///////////////////////
/// Netherbrick ///
///////////////////////
register(405, builder()
.translation("item.netherbrick.name")
.build("minecraft", "netherbrick"));
//////////////////
/// Quartz ///
//////////////////
register(406, builder()
.translation("item.netherquartz.name")
.build("minecraft", "quartz"));
////////////////////////
/// TNT Minecart ///
////////////////////////
register(407, builder()
.translation("item.minecartTnt.name")
.maxStackQuantity(1)
.build("minecraft", "tnt_minecart"));
///////////////////////////
/// Hopper Minecart ///
///////////////////////////
register(408, builder()
.translation("item.minecartHopper.name")
.maxStackQuantity(1)
.build("minecraft", "hopper_minecart"));
////////////////////////////
/// Prismarine Shard ///
////////////////////////////
register(409, builder()
.translation("item.prismarineShard.name")
.build("minecraft", "prismarine_shard"));
///////////////////////////////
/// Prismarine Crystals ///
///////////////////////////////
register(410, builder()
.translation("item.prismarineCrystals.name")
.build("minecraft", "prismarine_crystals"));
//////////////////
/// Rabbit ///
//////////////////
register(411, builder()
.translation("item.rabbitRaw.name")
.build("minecraft", "rabbit"));
/////////////////////////
/// Cooked Rabbit ///
/////////////////////////
register(412, builder()
.translation("item.rabbitCooked.name")
.build("minecraft", "cooked_rabbit"));
///////////////////////
/// Rabbit Stew ///
///////////////////////
register(413, builder()
.translation("item.rabbitStew.name")
.build("minecraft", "rabbit_stew"));
///////////////////////
/// Rabbit Foot ///
///////////////////////
register(414, builder()
.translation("item.rabbitFoot.name")
.build("minecraft", "rabbit_foot"));
///////////////////////
/// Rabbit Hide ///
///////////////////////
register(415, builder()
.translation("item.rabbitHide.name")
.build("minecraft", "rabbit_hide"));
///////////////////////
/// Armor Stand ///
///////////////////////
register(416, builder()
.translation("item.armorStand.name")
.build("minecraft", "armor_stand"));
////////////////////////////
/// Iron Horse Armor ///
////////////////////////////
register(417, builder()
.translation("item.horsearmormetal.name")
.build("minecraft", "iron_horse_armor"));
//////////////////////////////
/// Golden Horse Armor ///
//////////////////////////////
register(418, builder()
.translation("item.horsearmorgold.name")
.build("minecraft", "golden_horse_armor"));
///////////////////////////////
/// Diamond Horse Armor ///
///////////////////////////////
register(419, builder()
.translation("item.horsearmordiamond.name")
.build("minecraft", "diamond_horse_armor"));
////////////////
/// Lead ///
////////////////
register(420, builder()
.translation("item.leash.name")
.build("minecraft", "lead"));
////////////////////
/// Name Tag ///
////////////////////
register(421, builder()
.translation("item.nameTag.name")
.build("minecraft", "name_tag"));
//////////////////////////////////
/// Command Block Minecart ///
//////////////////////////////////
register(422, builder()
.translation("item.minecartCommandBlock.name")
.maxStackQuantity(1)
.build("minecraft", "command_block_minecart"));
//////////////////
/// Mutton ///
//////////////////
register(423, builder()
.translation("item.muttonRaw.name")
.build("minecraft", "mutton"));
/////////////////////////
/// Cooked Mutton ///
/////////////////////////
register(424, builder()
.translation("item.muttonCooked.name")
.build("minecraft", "cooked_mutton"));
//////////////////
/// Banner ///
//////////////////
register(425, builder()
.translation(coloredTranslation("item.banner.%s.name", DyeColors.WHITE))
.maxStackQuantity(16)
.build("minecraft", "banner"));
///////////////////////
/// End Crystal ///
///////////////////////
register(426, builder()
.translation("item.end_crystal.name")
.build("minecraft", "end_crystal"));
///////////////////////
/// Spruce Door ///
///////////////////////
register(427, builder()
.translation("item.doorSpruce.name")
.build("minecraft", "spruce_door"));
//////////////////////
/// Bitch Door ///
//////////////////////
register(428, builder()
.translation("item.doorBirch.name")
.build("minecraft", "birch_door"));
///////////////////////
/// Jungle Door ///
///////////////////////
register(429, builder()
.translation("item.doorJungle.name")
.build("minecraft", "jungle_door"));
///////////////////////
/// Acacia Door ///
///////////////////////
register(430, builder()
.translation("item.doorAcacia.name")
.build("minecraft", "acacia_door"));
/////////////////////////
/// Dark Oak Door ///
/////////////////////////
register(431, builder()
.translation("item.doorDarkOak.name")
.build("minecraft", "dark_oak_door"));
////////////////////////
/// Chorus Fruit ///
////////////////////////
register(432, builder()
.translation("item.chorusFruit.name")
.build("minecraft", "chorus_fruit"));
///////////////////////////////
/// Chorus Fruit Popped ///
///////////////////////////////
register(433, builder()
.translation("item.chorusFruitPopped.name")
.build("minecraft", "chorus_fruit_popped"));
////////////////////
/// Beetroot ///
////////////////////
register(434, builder()
.translation("item.beetroot.name")
.build("minecraft", "beetroot"));
//////////////////////////
/// Beetroot Seeds ///
//////////////////////////
register(435, builder()
.translation("item.beetroot_seeds.name")
.build("minecraft", "beetroot_seeds"));
/////////////////////////
/// Beetroot Soup ///
/////////////////////////
register(436, builder()
.translation("item.beetroot_soup.name")
.build("minecraft", "beetroot_soup"));
/////////////////////////
/// Dragon Breath ///
/////////////////////////
register(437, builder()
.translation("item.dragon_breath.name")
.build("minecraft", "dragon_breath"));
/////////////////////////
/// Splash Potion ///
/////////////////////////
register(438, potionEffectsBuilder(PotionType::getSplashTranslation)
.translation("item.splash_potion.name")
.maxStackQuantity(1)
.build("minecraft", "splash_potion"));
//////////////////////////
/// Spectral Arrow ///
//////////////////////////
register(439, builder()
.translation("item.spectral_arrow.name")
.build("minecraft", "spectral_arrow"));
////////////////////////
/// Tipped Arrow ///
////////////////////////
register(440, potionEffectsBuilder(PotionType::getTippedArrowTranslation)
.translation("item.tipped_arrow.name")
.build("minecraft", "tipped_arrow"));
////////////////////////////
/// Lingering Potion ///
////////////////////////////
register(441, potionEffectsBuilder(PotionType::getLingeringTranslation)
.translation("item.lingering_potion.name")
.maxStackQuantity(1)
.build("minecraft", "lingering_potion"));
//////////////////
/// Shield ///
//////////////////
register(442, durableBuilder()
.translation("item.shield.name")
.build("minecraft", "shield"));
//////////////////
/// Elytra ///
//////////////////
register(443, durableBuilder()
.translation("item.elytra.name")
.properties(builder -> builder
.add(equipmentType(EquipmentTypes.CHESTPLATE)))
.behaviors(pipeline -> pipeline
.add(new ArmorQuickEquipInteractionBehavior()))
.build("minecraft", "elytra"));
///////////////////////
/// Spruce Boat ///
///////////////////////
register(444, builder()
.translation("item.boat.spruce.name")
.maxStackQuantity(1)
.build("minecraft", "spruce_boat"));
//////////////////////
/// Birch Boat ///
//////////////////////
register(445, builder()
.translation("item.boat.birch.name")
.maxStackQuantity(1)
.build("minecraft", "birch_boat"));
///////////////////////
/// Jungle Boat ///
///////////////////////
register(446, builder()
.translation("item.boat.jungle.name")
.maxStackQuantity(1)
.build("minecraft", "jungle_boat"));
///////////////////////
/// Acacia Boat ///
///////////////////////
register(447, builder()
.translation("item.boat.acacia.name")
.maxStackQuantity(1)
.build("minecraft", "acacia_boat"));
/////////////////////////
/// Dark Oak Boat ///
/////////////////////////
register(448, builder()
.translation("item.boat.dark_oak.name")
.maxStackQuantity(1)
.build("minecraft", "dark_oak_boat"));
/////////////////
/// Totem ///
/////////////////
register(449, builder()
.translation("item.totem.name")
.maxStackQuantity(1)
.build("minecraft", "totem_of_undying"));
/////////////////////////
/// Shulker Shell ///
/////////////////////////
register(450, builder()
.translation("item.shulkerShell.name")
.build("minecraft", "shulker_shell"));
///////////////////////
/// Iron Nugget ///
///////////////////////
register(452, builder()
.translation("item.ironNugget.name")
.build("minecraft", "iron_nugget"));
/////////////////////
/// Record 13 ///
/////////////////////
register(2256, recordBuilder("13")
.build("minecraft", "record_13"));
//////////////////////
/// Record Cat ///
//////////////////////
register(2257, recordBuilder("cat")
.build("minecraft", "record_cat"));
/////////////////////////
/// Record Blocks ///
/////////////////////////
register(2258, recordBuilder("blocks")
.build("minecraft", "record_blocks"));
////////////////////////
/// Record Chirp ///
////////////////////////
register(2259, recordBuilder("chirp")
.build("minecraft", "record_chirp"));
//////////////////////
/// Record Far ///
//////////////////////
register(2260, recordBuilder("far")
.build("minecraft", "record_far"));
///////////////////////
/// Record Mall ///
///////////////////////
register(2261, recordBuilder("mall")
.build("minecraft", "record_mall"));
//////////////////////////
/// Record Mellohi ///
//////////////////////////
register(2262, recordBuilder("mellohi")
.build("minecraft", "record_mellohi"));
///////////////////////
/// Record Stal ///
///////////////////////
register(2263, recordBuilder("stal")
.build("minecraft", "record_stal"));
/////////////////////
/// Record Strad ///
/////////////////////
register(2264, recordBuilder("strad")
.build("minecraft", "record_strad"));
///////////////////////
/// Record Ward ///
///////////////////////
register(2265, recordBuilder("ward")
.build("minecraft", "record_ward"));
/////////////////////
/// Record 11 ///
/////////////////////
register(2266, recordBuilder("11")
.build("minecraft", "record_11"));
///////////////////////
/// Record Wait ///
///////////////////////
register(2267, recordBuilder("wait")
.build("minecraft", "record_wait"));
try {
ReflectionHelper.setField(ItemStackSnapshot.class.getDeclaredField("NONE"), null,
new LanternItemStack(none, 0).createSnapshot());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private ItemTypeBuilder potionEffectsBuilder(Function<PotionType, Translation> translationFunction) {
return builder()
.translation((itemType, itemStack) -> {
if (itemStack != null) {
final PotionType potionType = itemStack.get(LanternKeys.POTION_TYPE).orElse(null);
if (potionType != null) {
return translationFunction.apply(potionType);
}
}
return tr("item.potion.name");
})
.keysProvider(valueContainer -> {
valueContainer.registerKey(Keys.COLOR, null);
valueContainer.registerKey(Keys.POTION_EFFECTS, null);
valueContainer.registerKey(LanternKeys.POTION_TYPE, null);
});
}
private ItemTypeBuilder recordBuilder(String name) {
return builder()
.maxStackQuantity(1)
.translation(String.format("item.record.%s.desc", name));
}
private TranslationProvider coloredTranslation(String pattern, DyeColor defaultColor) {
return (itemType, itemStack) -> tr(String.format(pattern,
((LanternDyeColor) (itemStack == null ? defaultColor : itemStack.get(Keys.DYE_COLOR).get())).getTranslationPart()));
}
private ItemTypeBuilder durableBuilder() {
return builder()
.maxStackQuantity(1)
.keysProvider(valueContainer -> {
valueContainer.registerKey(Keys.ITEM_DURABILITY, 0);
valueContainer.registerKey(Keys.UNBREAKABLE, true); // True until durability is implemented
});
}
private ItemTypeBuilder toolBuilder(ToolType toolType) {
return durableBuilder()
.properties(builder -> builder
.add(toolType(toolType)));
}
private ItemTypeBuilder leatherArmorBuilder(EquipmentType equipmentType) {
return armorBuilder(ArmorTypes.LEATHER, equipmentType)
.keysProvider(valueContainer -> valueContainer
.registerKey(Keys.COLOR, null));
}
private ItemTypeBuilder armorBuilder(ArmorType armorType, EquipmentType equipmentType) {
return durableBuilder()
.properties(builder -> builder
.add(armorType(armorType))
.add(equipmentType(equipmentType)))
.behaviors(pipeline -> pipeline
.add(new ArmorQuickEquipInteractionBehavior()));
}
private ItemTypeBuilder builder() {
return new ItemTypeBuilderImpl();
}
}