[Tutorial] [1.12.2] How to make a shield.

Started by mega1134227 on

Topic category: User side tutorials

Last seen on 20:43, 14. Feb 2024
Joined Feb 2016
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
[Tutorial] [1.12.2] How to make a shield.
Thu, 04/09/2020 - 00:31 (edited)

Hi there, again... If you think your mod needs shields and you want to add them in but don't know how, then this is for you :D I'll be showing you how to add in shields via code in your mod in any version of MCreator :) (or so I believe)

First of all, you'll need to make an item. Lock the items code and then procede to edit it. You'll need to add in an import named import javax.annotation.Nullable; in the very top next to the other imports since the reformat code and imports function doesn't work with it. After that, you'll want to add in the shields property to the item in a section that looks like this :

public ItemCustom() {
            setMaxDamage(234);
            maxStackSize = 1;
            setUnlocalizedName("yourshield");
            setRegistryName("yourshield");
            setCreativeTab(MCreatorYourtab.tab);

}

The property looks like this :

this.addPropertyOverride(new ResourceLocation("blocking"), new IItemPropertyGetter() {

                @SideOnly(Side.CLIENT)
                public float apply(ItemStack stack, @Nullable World worldIn, @Nullable EntityLivingBase entityIn) {
                    return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F;
                }
            });

Your final bit of code should look like this :

public ItemCustom() {
            setMaxDamage(234);
            maxStackSize = 1;
            setUnlocalizedName("yourshield");
            setRegistryName("yourshield");
            setCreativeTab(MCreatorYourtab.tab);
            this.addPropertyOverride(new ResourceLocation("blocking"), new IItemPropertyGetter() {

                @SideOnly(Side.CLIENT)
                public float apply(ItemStack stack, @Nullable World worldIn, @Nullable EntityLivingBase entityIn) {
                    return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F;
                }
            });
        }

But your shield won't work with that simple and small bit of code only. You will also need to add in an argument under it that allows it to actually block stuff. It looks like this :

public EnumAction getItemUseAction(ItemStack stack) {
            return EnumAction.BLOCK;
        }

Then, you'll need to change the item duration to 72000, otherwise your shield won't be able to hold long enough to push back the arrow. Like so :

@Override
        public int getMaxItemUseDuration(ItemStack par1ItemStack) {
            return 72000;
        }

After that, you will also have to add in another bit of code that returns the success of your action. It looks like this :

public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
            ItemStack itemstack = playerIn.getHeldItem(handIn);
            playerIn.setActiveHand(handIn);
            return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, itemstack);
        }

Finaly, you only have to add two little bits of code close to the beginning to make it so that the shield actually looses durability. I'd like to thank CodingSuperNoob_JDV for providing me with it.

First, you have to add in these 7 little imports right at the beginning, around line 5 :
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.common.MinecraftForge;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;

Then, you will have to add this FMLPreInitialization register around line 40.

@Override
    public void preInit(FMLPreInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(this);
    }
 

Finaly, the last bit of code you'll have to add in looks like this. Put it right before the ItemCustom bit that should be around line 55 now. This is the code that makes it so that your shield takes damage.
 

@SubscribeEvent
    public void onEntityAttacked(LivingAttackEvent event){
        Entity entity = event != null ? event.getEntity() : null;
        float damage = event.getAmount();
        int damageInt = (int) damage;
        if (entity != null && entity instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer)entity;
            ItemStack activeItem = player.getActiveItemStack();

            if (player.isActiveItemStackBlocking() == true && ((activeItem).getItem() == new ItemStack(MCreatorYourShield.block, (int) (1)).getItem())) {
                
                activeItem.damageItem(damageInt, player);
            }
        }
    }

Do you see that "int damageint = (int) damage;" bit? The damageint part basically is the amount of damage your shield will take. In this case, it's basically equal to the amount of damage you've protected yourself from. If you say "int damageint = 1;", then your shield will only lose one durability everytime it gets hit and if you say "int damage int = (int) ((damage)*4);" then your shield will take 4 times the damage it protected you from. For a zombie, that would be 5 damage * 4, so 20 durability lost.

That's all! Remember to use the reformat code and imports function and use the right names instead of my yourshield and yourtab names.

Your final code should look somewhat like this :

package net.mcreator.yourmod;

import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.event.ModelRegistryEvent;

import net.minecraft.world.World;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.ActionResult;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Item;
import net.minecraft.item.IItemPropertyGetter;
import net.minecraft.item.EnumAction;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.Entity;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.block.state.IBlockState;

import javax.annotation.Nullable;

public class MCreatoryourshield extends yourmod.ModElement {

    @GameRegistry.ObjectHolder("yourmod:yourshield")
    public static final Item block = null;

    public MCreatoryourshield(yourmod instance) {
        super(instance);
        instance.items.add(() -> new ItemCustom());
    }
@Override
    public void preInit(FMLPreInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(this);
    }
 

    @SideOnly(Side.CLIENT)
    @Override
    public void registerModels(ModelRegistryEvent event) {
        ModelLoader.setCustomModelResourceLocation(block, 0, new ModelResourceLocation("yourmod:yourshield", "inventory"));
    }

@SubscribeEvent
    public void onEntityAttacked(LivingAttackEvent event){
        Entity entity = event != null ? event.getEntity() : null;
        float damage = event.getAmount();
        int damageInt = (int) damage;
        if (entity != null && entity instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer)entity;
            ItemStack activeItem = player.getActiveItemStack();

            if (player.isActiveItemStackBlocking() == true && ((activeItem).getItem() == new ItemStack(MCreatorYourShield.block, (int) (1)).getItem())) {
                
                activeItem.damageItem(damageInt, player);
            }
        }
    }

    public static class ItemCustom extends Item {

        public ItemCustom() {
            setMaxDamage(234);
            maxStackSize = 1;
            setUnlocalizedName("yourshield");
            setRegistryName("yourshield");
            setCreativeTab(MCreatorYourtab.tab);
            this.addPropertyOverride(new ResourceLocation("blocking"), new IItemPropertyGetter() {

                @SideOnly(Side.CLIENT)
                public float apply(ItemStack stack, @Nullable World worldIn, @Nullable EntityLivingBase entityIn) {
                    return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F;
                }
            });
        }

        public EnumAction getItemUseAction(ItemStack stack) {
            return EnumAction.BLOCK;
        }

        @Override
        public int getItemEnchantability() {
            return 2;
        }

        @Override
        public int getMaxItemUseDuration(ItemStack par1ItemStack) {
            return 72000;
        }

        public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
            ItemStack itemstack = playerIn.getHeldItem(handIn);
            playerIn.setActiveHand(handIn);
            return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, itemstack);
        }

        @Override
        public float getDestroySpeed(ItemStack par1ItemStack, IBlockState par2Block) {
            return 1F;
        }
    }
}

Here's a workspace file for those of you it would help. I would like to thank NatePlays95 for providing us with this workspace.
https://mcreator.net/forum/58742/template-worspace-112-shield-bow-and-more

Edited by mega1134227 on Thu, 04/09/2020 - 00:31
Last seen on 04:26, 22. Oct 2021
Joined Feb 2020
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
So... First of all. I am…
Thu, 03/05/2020 - 04:26

So... First of all. I am running MCreator 2020.1, using 1.12.2. I don't know if it will work for 1.14.4.

Second! NatePlays95, I'm pretty sure that most if not all of the gradle errors that you got are easily fixable. The new code needs a LOT of new imports, and that is what it's missing and why its erroring. As I figured out the hard way, if you're trying to use fancy functions, they need to be imported first, or Minecraft/Forge/MCreator won't know what to do with it.

Last seen on 04:26, 22. Oct 2021
Joined Feb 2020
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
Basically, all the symbols …
Thu, 03/05/2020 - 04:34

Basically, all the symbols (not functions, sorry) that MCreator can't find, you need to import. Easy way to fix that is to go back you your code, and find all the the symbols in the code that the console says it can't find, EnumHand, ActionResult, etc.

If you delete the symbol in your code, and then rewrite it exactly, manually, it should come up to finish what you're typing. When it gives you the right option, select that so it autofills, and MCreator should automatically fill in the necessary import. It just wont do that if you paste the code.

 

Last seen on 00:51, 3. Nov 2020
Joined Apr 2016
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
I'm having the same issue…
Sat, 03/07/2020 - 00:39

I'm having the same issue and tried what you suggested but to no avail.

Last seen on 20:43, 14. Feb 2024
Joined Feb 2016
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
Or you're doing something…
Sat, 03/07/2020 - 02:33

Or you're doing something wrong, or you're probably having a problem with the version. Are you using 1.14.4?

Last seen on 20:38, 30. Dec 2022
Joined Jul 2017
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
I couldn't wrap my head…
Sat, 03/07/2020 - 23:29

I couldn't wrap my head around how 1.14 manages the event handler so I downgraded the mod to 1.12 and, it's working perfectly!!! That's incredible, I'm happy we could figure that out

 

gonna implement the stuff I have and post something soon!

Last seen on 04:26, 22. Oct 2021
Joined Feb 2020
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
@NatePlays95 Great!!! Glad…
Sat, 03/07/2020 - 23:42

@NatePlays95 Great!!! Glad someone else was able to get it to work too :D I'll be looking out for your post!

I'll see about looking into getting the event stuff to work for 1.14, and I'll let you know if I figure anything out.

Last seen on 03:10, 19. Feb 2022
Joined Jun 2019
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
I got it to work too in 1.12…
Sun, 03/08/2020 - 01:49

I got it to work too in 1.12 :D

Last seen on 00:51, 3. Nov 2020
Joined Apr 2016
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
im just gonna say it here if…
Sun, 03/15/2020 - 19:17

im just gonna say it here if you use the latest snapshot 20202b11618 then you will have to change this part 

if (player.isActiveItemStackBlocking() == true && ((activeItem).getItem() == new ItemStack(MCreatorYourShield.block, (int) (1)).getItem())) {

to 
 

if (player.isActiveItemStackBlocking() == true && ((activeItem).getItem() == new ItemStack(ItemYourShield.block, (int) (1)).getItem())) {

just the underlined part

Last seen on 20:38, 30. Dec 2022
Joined Jul 2017
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
Well, I have a workspace…
Fri, 03/27/2020 - 00:55

Well, I have a workspace with some interesting items people can take as examples, including shields, pulling bows, guns and different types of swords. Can I post on the forums? And if so, where?

Last seen on 20:43, 14. Feb 2024
Joined Feb 2016
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
To be honest, I'd strongly…
Fri, 03/27/2020 - 01:44

To be honest, I'd strongly suggest posting it as a Tutorial Mod on the website and to then post the link here.
I'll probably take the link and put it up in the main text of the tutorials I've made that the workspace covers.
It would be greatly appreciated btw, thanks. It would help me and a lot of the users that come here since it'd provide an example that's easier to follow and possibly other points of view on how to code the things.

Last seen on 21:07, 3. May 2020
Joined Nov 2019
Points:

User statistics:

  • Modifications:
  • Forum topics:
  • Wiki pages:
  • MCreator plugins:
  • Comments:
i dont understand  
Sat, 04/04/2020 - 01:04

i dont understand