/** * This class was created by <Vazkii>. It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania * * Botania is Open Source and distributed under the * Botania License: http://botaniamod.net/license.php * * File Created @ [Mar 29, 2015, 10:16:29 PM (GMT)] */ package vazkii.botania.common.item.relic; import java.util.List; import java.util.UUID; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import baubles.api.BaubleType; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.Achievement; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.item.ItemTossEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.RecipeSorter.Category; import vazkii.botania.api.item.IWireframeCoordinateListProvider; import vazkii.botania.common.achievement.ICraftAchievement; import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.handler.MethodHandles; import vazkii.botania.common.crafting.recipe.AesirRingRecipe; import vazkii.botania.common.item.ModItems; import vazkii.botania.common.lib.LibItemNames; public class ItemAesirRing extends ItemRelicBauble implements IWireframeCoordinateListProvider, ICraftAchievement { private final Multimap<String, AttributeModifier> attributes = HashMultimap.create(); public ItemAesirRing() { super(LibItemNames.AESIR_RING); GameRegistry.addRecipe(new AesirRingRecipe()); RecipeSorter.register("botania:aesirRing", AesirRingRecipe.class, Category.SHAPELESS, ""); MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onDropped(ItemTossEvent event) { if(event.getEntityItem() != null && !event.getEntityItem().getEntityItem().isEmpty() && !event.getEntityItem().world.isRemote) { ItemStack stack = event.getEntityItem().getEntityItem(); if(stack.getItem() == this) { event.getEntityItem().setDead(); UUID user = getSoulbindUUID(stack); for(Item item : new Item[] { ModItems.thorRing, ModItems.lokiRing, ModItems.odinRing }) { ItemStack stack1 = new ItemStack(item); bindToUUID(user, stack1); EntityItem entity = new EntityItem(event.getEntityItem().world, event.getEntityItem().posX, event.getEntityItem().posY, event.getEntityItem().posZ, stack1); entity.motionX = event.getEntityItem().motionX; entity.motionY = event.getEntityItem().motionY; entity.motionZ = event.getEntityItem().motionZ; try { MethodHandles.itemAge_setter.invokeExact(entity, MethodHandles.itemAge_getter.invokeExact(entity)); } catch (Throwable ignored) {} int pickupDelay = 0; try { pickupDelay = (int) MethodHandles.pickupDelay_getter.invokeExact(event.getEntityItem()); } catch (Throwable ignored) {} entity.setPickupDelay(pickupDelay); entity.world.spawnEntity(entity); } } } } @Override public void onValidPlayerWornTick(ItemStack stack, EntityPlayer player) { ((ItemOdinRing) ModItems.odinRing).onValidPlayerWornTick(stack, player); } @Override public BaubleType getBaubleType(ItemStack arg0) { return BaubleType.RING; } @Override public List<BlockPos> getWireframesToDraw(EntityPlayer player, ItemStack stack) { return ((IWireframeCoordinateListProvider) ModItems.lokiRing).getWireframesToDraw(player, stack); } @Override public BlockPos getSourceWireframe(EntityPlayer player, ItemStack stack) { return ((IWireframeCoordinateListProvider) ModItems.lokiRing).getSourceWireframe(player, stack); } @Override public void onEquippedOrLoadedIntoWorld(ItemStack stack, EntityLivingBase player) { attributes.clear(); fillModifiers(attributes, stack); player.getAttributeMap().applyAttributeModifiers(attributes); } @Override public void onUnequipped(ItemStack stack, EntityLivingBase player) { attributes.clear(); fillModifiers(attributes, stack); player.getAttributeMap().removeAttributeModifiers(attributes); } private void fillModifiers(Multimap<String, AttributeModifier> attributes, ItemStack stack) { if(stack.isEmpty()) // workaround for Azanor/Baubles#156 return; attributes.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(getBaubleUUID(stack), "Bauble modifier", 20, 0)); } @Override public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { return ModAchievements.relicAesirRing; } }