2015-08-29 14:33:25 +02:00
|
|
|
/*
|
2016-05-16 22:52:27 +02:00
|
|
|
* This file ("ItemUtil.java") is part of the Actually Additions mod for Minecraft.
|
2015-08-29 14:33:25 +02:00
|
|
|
* It is created and owned by Ellpeck and distributed
|
|
|
|
* under the Actually Additions License to be found at
|
2016-05-16 22:52:27 +02:00
|
|
|
* http://ellpeck.de/actaddlicense
|
2015-08-29 14:33:25 +02:00
|
|
|
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
|
|
|
|
*
|
2016-05-16 22:54:42 +02:00
|
|
|
* © 2015-2016 Ellpeck
|
2015-08-29 14:33:25 +02:00
|
|
|
*/
|
|
|
|
|
2016-01-05 04:47:35 +01:00
|
|
|
package de.ellpeck.actuallyadditions.mod.util;
|
2015-03-29 15:29:05 +02:00
|
|
|
|
2016-03-19 15:10:20 +01:00
|
|
|
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
|
2016-03-18 18:38:39 +01:00
|
|
|
import de.ellpeck.actuallyadditions.mod.blocks.base.ItemBlockBase;
|
|
|
|
import de.ellpeck.actuallyadditions.mod.creative.CreativeTab;
|
|
|
|
import net.minecraft.block.Block;
|
2015-09-23 21:34:12 +02:00
|
|
|
import net.minecraft.enchantment.Enchantment;
|
2016-11-27 11:56:22 +01:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
2015-03-29 15:29:05 +02:00
|
|
|
import net.minecraft.item.Item;
|
2015-09-22 23:32:19 +02:00
|
|
|
import net.minecraft.item.ItemStack;
|
2016-11-27 11:56:22 +01:00
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
2015-09-23 21:34:12 +02:00
|
|
|
import net.minecraft.nbt.NBTTagList;
|
2016-11-27 11:56:22 +01:00
|
|
|
import net.minecraft.util.EnumHand;
|
2016-01-07 23:42:42 +01:00
|
|
|
import net.minecraft.util.ResourceLocation;
|
2016-11-19 21:54:43 +01:00
|
|
|
import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent;
|
2016-03-18 18:38:39 +01:00
|
|
|
import net.minecraftforge.fml.common.registry.GameRegistry;
|
2015-04-04 05:20:19 +02:00
|
|
|
|
2016-11-26 21:32:27 +01:00
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
2015-10-03 21:56:22 +02:00
|
|
|
|
2015-10-03 22:09:53 +02:00
|
|
|
|
2016-11-19 21:54:43 +01:00
|
|
|
//TODO Remove the whole registry name mapping thing once the 1.11 fading phase is over
|
2016-06-17 23:50:38 +02:00
|
|
|
public final class ItemUtil{
|
2015-03-29 15:29:05 +02:00
|
|
|
|
2016-11-19 21:54:43 +01:00
|
|
|
private static final Map<String, String> UNDERSCORELESS_TO_UNDERSCORED_NAMES = new HashMap<String, String>();
|
|
|
|
|
2015-07-12 22:05:34 +02:00
|
|
|
public static Item getItemFromName(String name){
|
2016-01-07 23:42:42 +01:00
|
|
|
ResourceLocation resLoc = new ResourceLocation(name);
|
2016-04-20 21:39:03 +02:00
|
|
|
if(Item.REGISTRY.containsKey(resLoc)){
|
|
|
|
return Item.REGISTRY.getObject(resLoc);
|
2015-07-12 22:05:34 +02:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2016-04-20 21:39:03 +02:00
|
|
|
public static void registerBlock(Block block, ItemBlockBase itemBlock, String name, boolean addTab){
|
|
|
|
block.setUnlocalizedName(ModUtil.MOD_ID+"."+name);
|
2016-03-18 18:38:39 +01:00
|
|
|
|
2016-03-18 20:39:24 +01:00
|
|
|
block.setRegistryName(ModUtil.MOD_ID, name);
|
2016-04-20 21:39:03 +02:00
|
|
|
GameRegistry.register(block);
|
|
|
|
|
|
|
|
itemBlock.setRegistryName(block.getRegistryName());
|
|
|
|
GameRegistry.register(itemBlock);
|
2016-03-18 18:38:39 +01:00
|
|
|
|
2016-06-17 23:50:38 +02:00
|
|
|
block.setCreativeTab(addTab ? CreativeTab.INSTANCE : null);
|
2016-11-19 21:54:43 +01:00
|
|
|
|
2016-11-19 23:12:22 +01:00
|
|
|
addUnderscoreNameToMapUnderscorelessName(block.getRegistryName());
|
2016-03-18 18:38:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void registerItem(Item item, String name, boolean addTab){
|
2016-04-20 21:39:03 +02:00
|
|
|
item.setUnlocalizedName(ModUtil.MOD_ID+"."+name);
|
2016-03-18 18:38:39 +01:00
|
|
|
|
2016-03-18 20:39:24 +01:00
|
|
|
item.setRegistryName(ModUtil.MOD_ID, name);
|
2016-04-20 21:39:03 +02:00
|
|
|
GameRegistry.register(item);
|
2016-03-18 18:38:39 +01:00
|
|
|
|
2016-06-17 23:50:38 +02:00
|
|
|
item.setCreativeTab(addTab ? CreativeTab.INSTANCE : null);
|
2016-03-19 15:10:20 +01:00
|
|
|
|
|
|
|
if(item instanceof IColorProvidingItem){
|
|
|
|
ActuallyAdditions.proxy.addColoredItem(item);
|
|
|
|
}
|
2016-11-19 21:54:43 +01:00
|
|
|
|
2016-11-19 23:12:22 +01:00
|
|
|
addUnderscoreNameToMapUnderscorelessName(item.getRegistryName());
|
2016-11-19 21:54:43 +01:00
|
|
|
}
|
|
|
|
|
2016-11-19 23:12:22 +01:00
|
|
|
private static void addUnderscoreNameToMapUnderscorelessName(ResourceLocation name){
|
|
|
|
String underscoreless = name.toString().replaceAll("_", "");
|
|
|
|
UNDERSCORELESS_TO_UNDERSCORED_NAMES.put(underscoreless, name.toString());
|
2016-11-19 21:54:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean remapName(FMLMissingMappingsEvent.MissingMapping mapping){
|
|
|
|
if(mapping != null && mapping.name != null){
|
|
|
|
if(UNDERSCORELESS_TO_UNDERSCORED_NAMES.containsKey(mapping.name)){
|
|
|
|
String newName = UNDERSCORELESS_TO_UNDERSCORED_NAMES.get(mapping.name);
|
|
|
|
ResourceLocation newResLoc = new ResourceLocation(newName);
|
|
|
|
|
2016-11-19 23:12:22 +01:00
|
|
|
if(Block.REGISTRY.containsKey(newResLoc) && mapping.type == GameRegistry.Type.BLOCK){
|
2016-11-19 21:54:43 +01:00
|
|
|
mapping.remap(Block.REGISTRY.getObject(newResLoc));
|
|
|
|
return true;
|
|
|
|
}
|
2016-11-19 23:12:22 +01:00
|
|
|
else if(Item.REGISTRY.containsKey(newResLoc) && mapping.type == GameRegistry.Type.ITEM){
|
2016-11-19 21:54:43 +01:00
|
|
|
mapping.remap(Item.REGISTRY.getObject(newResLoc));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
2016-03-18 18:38:39 +01:00
|
|
|
}
|
|
|
|
|
2015-09-28 23:39:34 +02:00
|
|
|
public static boolean contains(ItemStack[] array, ItemStack stack, boolean checkWildcard){
|
|
|
|
return getPlaceAt(array, stack, checkWildcard) != -1;
|
2015-09-22 23:48:27 +02:00
|
|
|
}
|
|
|
|
|
2016-08-03 04:01:47 +02:00
|
|
|
public static int getPlaceAt(ItemStack[] array, ItemStack stack, boolean checkWildcard){
|
|
|
|
return getPlaceAt(Arrays.asList(array), stack, checkWildcard);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getPlaceAt(List<ItemStack> list, ItemStack stack, boolean checkWildcard){
|
|
|
|
if(list != null && list.size() > 0){
|
|
|
|
for(int i = 0; i < list.size(); i++){
|
2016-11-16 20:31:16 +01:00
|
|
|
if((!StackUtil.isValid(stack) && !StackUtil.isValid(list.get(i))) || areItemsEqual(stack, list.get(i), checkWildcard)){
|
2015-09-28 23:39:34 +02:00
|
|
|
return i;
|
|
|
|
}
|
2015-09-22 23:32:19 +02:00
|
|
|
}
|
|
|
|
}
|
2015-09-22 23:48:27 +02:00
|
|
|
return -1;
|
2015-09-22 23:32:19 +02:00
|
|
|
}
|
2015-09-23 18:36:53 +02:00
|
|
|
|
|
|
|
public static boolean areItemsEqual(ItemStack stack1, ItemStack stack2, boolean checkWildcard){
|
2016-11-16 20:31:16 +01:00
|
|
|
return StackUtil.isValid(stack1) && StackUtil.isValid(stack2) && (stack1.isItemEqual(stack2) || (checkWildcard && stack1.getItem() == stack2.getItem() && (stack1.getItemDamage() == Util.WILDCARD || stack2.getItemDamage() == Util.WILDCARD)));
|
2015-09-23 18:36:53 +02:00
|
|
|
}
|
2015-09-23 21:34:12 +02:00
|
|
|
|
2015-10-03 22:13:57 +02:00
|
|
|
/**
|
|
|
|
* Returns true if list contains stack or if both contain null
|
|
|
|
*/
|
|
|
|
public static boolean contains(List<ItemStack> list, ItemStack stack, boolean checkWildcard){
|
2016-08-03 04:01:47 +02:00
|
|
|
return !(list == null || list.isEmpty()) && getPlaceAt(list, stack, checkWildcard) != -1;
|
2015-10-03 22:13:57 +02:00
|
|
|
}
|
|
|
|
|
2015-09-24 21:00:53 +02:00
|
|
|
public static void addEnchantment(ItemStack stack, Enchantment e, int level){
|
|
|
|
if(!hasEnchantment(stack, e)){
|
|
|
|
stack.addEnchantment(e, level);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-03 10:19:40 +02:00
|
|
|
public static boolean hasEnchantment(ItemStack stack, Enchantment e){
|
2015-09-23 21:34:12 +02:00
|
|
|
NBTTagList ench = stack.getEnchantmentTagList();
|
|
|
|
if(ench != null){
|
|
|
|
for(int i = 0; i < ench.tagCount(); i++){
|
|
|
|
short id = ench.getCompoundTagAt(i).getShort("id");
|
2016-03-18 23:47:22 +01:00
|
|
|
if(id == Enchantment.getEnchantmentID(e)){
|
2015-10-03 10:19:40 +02:00
|
|
|
return true;
|
2015-09-23 21:34:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-03 10:19:40 +02:00
|
|
|
return false;
|
2015-09-23 21:34:12 +02:00
|
|
|
}
|
2015-09-24 20:53:07 +02:00
|
|
|
|
2015-10-03 10:19:40 +02:00
|
|
|
public static void removeEnchantment(ItemStack stack, Enchantment e){
|
2015-09-24 20:53:07 +02:00
|
|
|
NBTTagList ench = stack.getEnchantmentTagList();
|
|
|
|
if(ench != null){
|
|
|
|
for(int i = 0; i < ench.tagCount(); i++){
|
|
|
|
short id = ench.getCompoundTagAt(i).getShort("id");
|
2016-03-18 23:47:22 +01:00
|
|
|
if(id == Enchantment.getEnchantmentID(e)){
|
2015-10-03 10:19:40 +02:00
|
|
|
ench.removeTag(i);
|
2015-09-24 20:53:07 +02:00
|
|
|
}
|
|
|
|
}
|
2016-07-20 10:42:41 +02:00
|
|
|
if(ench.hasNoTags() && stack.hasTagCompound()){
|
|
|
|
stack.getTagCompound().removeTag("ench");
|
|
|
|
}
|
2015-09-24 20:53:07 +02:00
|
|
|
}
|
|
|
|
}
|
2016-08-02 16:32:13 +02:00
|
|
|
|
|
|
|
public static boolean canBeStacked(ItemStack stack1, ItemStack stack2){
|
|
|
|
return ItemStack.areItemsEqual(stack1, stack2) && ItemStack.areItemStackTagsEqual(stack1, stack2);
|
|
|
|
}
|
2016-11-27 11:56:22 +01:00
|
|
|
|
|
|
|
public static boolean isEnabled(ItemStack stack){
|
|
|
|
return stack.hasTagCompound() && stack.getTagCompound().getBoolean("IsEnabled");
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void changeEnabled(EntityPlayer player, EnumHand hand){
|
2016-12-18 17:28:29 +01:00
|
|
|
changeEnabled(player.getHeldItem(hand));
|
|
|
|
}
|
2016-11-27 11:56:22 +01:00
|
|
|
|
2016-12-18 17:28:29 +01:00
|
|
|
public static void changeEnabled(ItemStack stack){
|
2016-11-27 11:56:22 +01:00
|
|
|
if(!stack.hasTagCompound()){
|
|
|
|
stack.setTagCompound(new NBTTagCompound());
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean isEnabled = isEnabled(stack);
|
|
|
|
stack.getTagCompound().setBoolean("IsEnabled", !isEnabled);
|
|
|
|
}
|
2015-03-29 15:29:05 +02:00
|
|
|
}
|