From 6b66a09414a2eba16609c7a3bc3b4db97cd6ad99 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 14 Feb 2019 19:11:28 +0200 Subject: [PATCH] Added meadow brook's staff. It's a big stick. --- .../com/minelittlepony/unicopia/UItems.java | 6 + .../unicopia/item/ItemStaff.java | 136 ++++++++++++++++++ .../unicopia/spell/CasterUtils.java | 2 +- .../resources/assets/unicopia/lang/en_US.lang | 3 + .../unicopia/models/item/handheld_staff.json | 25 ++++ .../models/item/staff_meadow_brook.json | 6 + .../textures/items/staff_meadow_brook.png | Bin 0 -> 3216 bytes 7 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java create mode 100644 src/main/resources/assets/unicopia/models/item/handheld_staff.json create mode 100644 src/main/resources/assets/unicopia/models/item/staff_meadow_brook.json create mode 100644 src/main/resources/assets/unicopia/textures/items/staff_meadow_brook.png diff --git a/src/main/java/com/minelittlepony/unicopia/UItems.java b/src/main/java/com/minelittlepony/unicopia/UItems.java index 33fb2307..0b6ec375 100644 --- a/src/main/java/com/minelittlepony/unicopia/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/UItems.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.item.ItemOfHolding; import com.minelittlepony.unicopia.item.ItemRottenApple; import com.minelittlepony.unicopia.item.ItemSpell; import com.minelittlepony.unicopia.item.ItemSpellbook; +import com.minelittlepony.unicopia.item.ItemStaff; import com.minelittlepony.unicopia.item.ItemStick; import com.minelittlepony.unicopia.item.ItemTomato; import com.minelittlepony.unicopia.item.ItemTomatoSeeds; @@ -107,6 +108,8 @@ public class UItems { public static final ItemOfHolding bag_of_holding = new ItemOfHolding(Unicopia.MODID, "bag_of_holding"); public static final ItemSpellbook spellbook = new ItemSpellbook(Unicopia.MODID, "spellbook"); + public static final Item staff_meadow_brook = new ItemStaff(Unicopia.MODID, "staff_meadow_brook").setMaxDamage(2); + public static final Item alfalfa_seeds = new ItemSeedFood(1, 4, UBlocks.alfalfa, Blocks.FARMLAND) .setTranslationKey("alfalfa_seeds") @@ -206,6 +209,7 @@ public class UItems { cloud_farmland, mist_door, anvil, bag_of_holding, spell, curse, spellbook, mug, enchanted_torch, + staff_meadow_brook, alfalfa_seeds, alfalfa_leaves, cereal, sugar_cereal, sugar_block, @@ -233,7 +237,9 @@ public class UItems { cloud_spawner, cloud_matter, cloud_stairs, cloud_fence, cloud_banister, cloud_farmland, mist_door, anvil, + bag_of_holding, spell, curse, spellbook, mug, enchanted_torch, + staff_meadow_brook, alfalfa_seeds, alfalfa_leaves, cereal, sugar_cereal, sugar_block, diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java b/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java new file mode 100644 index 00000000..1cc81ca3 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemStaff.java @@ -0,0 +1,136 @@ +package com.minelittlepony.unicopia.item; + +import java.util.List; +import java.util.UUID; + +import javax.annotation.Nullable; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.minelittlepony.unicopia.Predicates; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.SoundEvents; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; + +public class ItemStaff extends ItemSword implements ITossable { + + protected static final UUID ATTACK_REACH_MODIFIER = UUID.fromString("FA235E1C-4280-A865-B01B-CBAE9985ACA3"); + + public ItemStaff(String domain, String name) { + super(ToolMaterial.WOOD); + + setTranslationKey(name); + setRegistryName(domain, name); + + setMaxStackSize(1); + } + + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack itemstack = player.getHeldItem(hand); + + if (canBeThrown(itemstack)) { + toss(world, itemstack, player); + + return new ActionResult(EnumActionResult.SUCCESS, itemstack); + } + + return super.onItemRightClick(world, player, hand); + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity target) { + World w = player.getEntityWorld(); + + for (int i = 0; i < 130; i++) { + w.spawnParticle(EnumParticleTypes.BLOCK_CRACK, + target.posX + (target.world.rand.nextFloat() - 0.5F) * (target.width + 1), + (target.posY + target.height/2) + (target.world.rand.nextFloat() - 0.5F) * target.height, + target.posZ + (target.world.rand.nextFloat() - 0.5F) * (target.width + 1), + 0, 0, 0, + Block.getStateId(Blocks.LOG.getDefaultState()) + ); + } + + return false; + } + + @Override + public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { + tooltip.add(I18n.format(getTranslationKey(stack) + ".tagline")); + } + + @Override + public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + super.hitEntity(stack, target, attacker); + + if (Predicates.MAGI.test(attacker)) { + return castContainedEffect(stack, target, attacker); + } + + return false; + } + + protected boolean castContainedEffect(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { + target.getEntityWorld().playSound(null, target.getPosition(), SoundEvents.ENTITY_PLAYER_ATTACK_CRIT, attacker.getSoundCategory(), 1, 1); + + target.knockBack(attacker, 2, + MathHelper.sin(attacker.rotationYaw * 0.017453292F), + -MathHelper.cos(attacker.rotationYaw * 0.017453292F) + ); + + return true; + } + + @Override + public boolean isFull3D() { + return true; + } + + @Override + public EnumAction getItemUseAction(ItemStack stack) { + return EnumAction.BOW; + } + + @Override + public boolean canBeThrown(ItemStack stack) { + return false; + } + + @Override + public void onImpact(World world, BlockPos pos, IBlockState state) { + + } + + @Override + public Multimap getItemAttributeModifiers(EntityEquipmentSlot slot) { + Multimap multimap = HashMultimap.create(); + + if (slot == EntityEquipmentSlot.MAINHAND) { + multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getAttackDamage(), 0)); + multimap.put(EntityPlayer.REACH_DISTANCE.getName(), new AttributeModifier(ATTACK_REACH_MODIFIER, "Weapon modifier", 3, 0)); + } + + return multimap; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/spell/CasterUtils.java b/src/main/java/com/minelittlepony/unicopia/spell/CasterUtils.java index 53381970..91e9ef54 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/CasterUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/CasterUtils.java @@ -54,7 +54,7 @@ public class CasterUtils { .filter(e -> !e.getDead()); } - static Optional> toCaster(@Nullable Entity entity) { + public static Optional> toCaster(@Nullable Entity entity) { if (entity instanceof ICaster) { return Optional.of((ICaster)entity); diff --git a/src/main/resources/assets/unicopia/lang/en_US.lang b/src/main/resources/assets/unicopia/lang/en_US.lang index 9e887920..d695bff8 100644 --- a/src/main/resources/assets/unicopia/lang/en_US.lang +++ b/src/main/resources/assets/unicopia/lang/en_US.lang @@ -27,6 +27,9 @@ item.mist_door.name=Cloud Door item.dew_drop.name=Dew Drop item.cloud_anvil.name=Anvilhead Anvil +item.staff_meadow_brook.name=Meadow Brook's Staff +item.staff_meadow_brook.tagline=It's a big stick + item.gem.name=Gem item.gem.enchanted.name=Gem of %s item.corrupted_gem.name=Fractured Gem diff --git a/src/main/resources/assets/unicopia/models/item/handheld_staff.json b/src/main/resources/assets/unicopia/models/item/handheld_staff.json new file mode 100644 index 00000000..6a51bd98 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/handheld_staff.json @@ -0,0 +1,25 @@ +{ + "parent": "item/handheld", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 55 ], + "translation": [ 0, 4.0, 2.5 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, -90, -55 ], + "translation": [ 0, 4.0, 2.5 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 25 ], + "translation": [ 0, 1.9, 0.8 ], + "scale": [ 0.88, 0.88, 0.88 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, -90, -25 ], + "translation": [ 0, 1.9, 0.8 ], + "scale": [ 0.88, 0.88, 0.88 ] + } + } +} diff --git a/src/main/resources/assets/unicopia/models/item/staff_meadow_brook.json b/src/main/resources/assets/unicopia/models/item/staff_meadow_brook.json new file mode 100644 index 00000000..ef5084be --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/staff_meadow_brook.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/handheld_staff", + "textures": { + "layer0": "unicopia:items/staff_meadow_brook" + } +} diff --git a/src/main/resources/assets/unicopia/textures/items/staff_meadow_brook.png b/src/main/resources/assets/unicopia/textures/items/staff_meadow_brook.png new file mode 100644 index 0000000000000000000000000000000000000000..230eedf5d33a1078fd9068ce25b58fb847020157 GIT binary patch literal 3216 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