Jump to content

[1.16.1]Game Crashes When I Shoot My Custom Arrow


Recommended Posts

Posted (edited)

First off, I had trouble finding a nice example for custom arrows. I had to look at vanilla classes and may have butchered some stuff. I am pretty new to Forge in general too (You can probably get this from my question). I am making a mod that implements Jade and some other cool stuff I was thinking of. It is a crystal that naturally generates in caves and I made blocks for it slabs, some cool recipes to go with it, etc. Now I wanted to make a Jade Arrow. The Jade Arrow is just a "sharper" arrow. I set the arrowHit() to deal excess damage to the LivingEntity that was hit. For some reason when I shoot my Jade Arrow the game crashes.

 

RegistryHandler:

package com.chuck.jademod.util;

import com.chuck.jademod.Jade;
import com.chuck.jademod.blocks.*;
import com.chuck.jademod.entities.EntityJadeArrow;
import com.chuck.jademod.items.ItemBase;
import com.chuck.jademod.items.JadeArrow;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.StairsBlock;
import net.minecraft.block.WallBlock;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.projectile.AbstractArrowEntity;
import net.minecraft.entity.projectile.ArrowEntity;
import net.minecraft.item.*;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

import java.rmi.registry.RegistryHandler;

import static com.chuck.jademod.Jade.MOD_ID;

public class RegisteryHandler {

    public static DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID);
    public static DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID);
    public static DeferredRegister<EntityType<?>> ENTITY_TYPES = DeferredRegister.create(ForgeRegistries.ENTITIES, MOD_ID);
    public static void init(){
        ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
        BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
    }
    // items
    public static final RegistryObject<Item> JADE_SHARD = ITEMS.register("jade_shard", ItemBase::new );
    public static final RegistryObject<Item> JADE_ARROW = ITEMS.register("jade_arrow", JadeArrow::new);
    // Blocks
    public static final RegistryObject<Block> JADE_CRYSTAL_BLOCK = BLOCKS.register("jade_crystal_block", JadeCrystalBlock::new);
    public static final RegistryObject<Block> JADE_ORE_BLOCK = BLOCKS.register("jade_ore_block", JadeOreBlock::new);
    public static final RegistryObject<Block> JADE_BLOCK = BLOCKS.register("jade_block", JadeBlock::new);
    public static final RegistryObject<Block> JADE_BLOCK_POLISHED = BLOCKS.register("jade_block_polished", JadeBlockPolished::new);


    public static final RegistryObject<Block> MOSSY_BRICKS = BLOCKS.register("mossy_brick", MossyBricks::new);
    public static final RegistryObject<Block> MOSSY_BRICK_WALL = BLOCKS.register("mossy_brick_wall",
            () -> new WallBlock(Block.Properties.from(Blocks.BRICK_WALL)));
    public static final RegistryObject<Block> MOSSY_BRICK_STAIR = BLOCKS.register("mossy_brick_stair", () -> new StairsBlock(() -> MOSSY_BRICKS.get().getDefaultState(), Block.Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 6.0F)));
    public static final RegistryObject<Block> MOSSY_BRICK_SLAB = BLOCKS.register("mossy_brick_slab", MossyBrickSlab::new);
    // Blocks Items
    public static final RegistryObject<Item> JADE_CRYSTAL_BLOCK_ITEM = ITEMS.register("jade_crystal_block", () -> new BlockItemBase(JADE_CRYSTAL_BLOCK.get()));
    public static final RegistryObject<Item> JADE_ORE_BLOCK_ITEM = ITEMS.register("jade_ore_block", () -> new BlockItemBase(JADE_ORE_BLOCK.get()));
    public static final RegistryObject<Item> JADE_BLOCK_ITEM = ITEMS.register("jade_block", () -> new BlockItemBase(JADE_BLOCK.get()));
    public static final RegistryObject<Item> JADE_BLOCK_POLISHED_ITEM = ITEMS.register("jade_block_polished", () -> new BlockItemBase(JADE_BLOCK_POLISHED.get()));


    public static final RegistryObject<Item> MOSSY_BRICK_ITEM = ITEMS.register("mossy_brick", () -> new BlockItemBase(MOSSY_BRICKS.get()));
    public static final RegistryObject<Item> MOSSY_BRICK_STAIR_ITEM = ITEMS.register("mossy_brick_stair", () -> new BlockItemBase(MOSSY_BRICK_STAIR.get()));
    public static final RegistryObject<Item> MOSSY_BRICK_SLAB_ITEM = ITEMS.register("mossy_brick_slab", () -> new BlockItemBase(MOSSY_BRICK_SLAB.get()));
    public static final RegistryObject<Item> MOSSY_BRICK_WALL_ITEM = ITEMS.register("mossy_brick_wall", () -> new BlockItemBase(MOSSY_BRICK_WALL.get()));
    // Entity Types
    public static final EntityType<EntityJadeArrow> JADE_ARROW_ENTITY = register("jade_arrow", EntityType.Builder.<EntityJadeArrow>create(EntityJadeArrow::new, EntityClassification.MISC).size(0.5F, 0.5F).func_233606_a_(4).func_233608_b_(20));


    private static <T extends Entity> EntityType<T> register(String key, EntityType.Builder<T> builder) {
        return Registry.register(Registry.ENTITY_TYPE, key, builder.build(key));
    }
}

EntityJadeArrow:

package com.chuck.jademod.entities;

import com.chuck.jademod.util.RegisteryHandler;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.projectile.AbstractArrowEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.IPacket;
import net.minecraft.potion.*;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkHooks;


public class EntityJadeArrow extends AbstractArrowEntity {


    public EntityJadeArrow(World worldIn, LivingEntity shooter) {
        super(RegisteryHandler.JADE_ARROW_ENTITY, shooter, worldIn);
    }

    public EntityJadeArrow(EntityType<EntityJadeArrow> entityJadeArrowEntityType, World world) {
        super(entityJadeArrowEntityType, world);
    }

    protected void arrowHit(LivingEntity living) {
        super.arrowHit(living);
        EffectInstance effectinstance = new EffectInstance(Effects.INSTANT_DAMAGE, 1, 1);
        living.addPotionEffect(effectinstance);

    }

    protected ItemStack getArrowStack() { return new ItemStack(RegisteryHandler.JADE_ARROW.get());}

    public IPacket<?> createSpawnPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }
}

JadeArrow:

package com.chuck.jademod.items;

import com.chuck.jademod.entities.EntityJadeArrow;
import com.chuck.jademod.util.RegisteryHandler;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.projectile.AbstractArrowEntity;
import net.minecraft.entity.projectile.ArrowEntity;
import net.minecraft.entity.projectile.SpectralArrowEntity;
import net.minecraft.item.ArrowItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

public class JadeArrow extends ArrowItem {
    public JadeArrow() {
        super((new Item.Properties()).group(ItemGroup.COMBAT));
    }

    public AbstractArrowEntity createArrow(World worldIn, ItemStack stack, LivingEntity shooter) {
        return new EntityJadeArrow(worldIn, shooter);
    }
}

JadeArrowRenderer:

package com.chuck.jademod.render.entities;

import com.chuck.jademod.entities.EntityJadeArrow;
import net.minecraft.client.renderer.entity.ArrowRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

@OnlyIn(Dist.CLIENT)
public class JadeArrowRenderer extends ArrowRenderer<EntityJadeArrow> {
    public static final ResourceLocation RES_JADE_ARROW = new ResourceLocation("jade:textures/entity/projectiles/arrow.png");

    public JadeArrowRenderer(EntityRendererManager manager) {
        super(manager);
    }

    public ResourceLocation getEntityTexture(EntityJadeArrow entity) {
        return RES_JADE_ARROW;
    }

}

Thank you for any help at all.

The arrow.png entity resource is just the same as the default arrow

Edited by Chuck16
forgot some stuff
Posted

[17:30:58] [Render thread/FATAL] [minecraft/Minecraft]: Unreported exception thrown!
java.lang.NullPointerException: null
    at net.minecraft.client.renderer.entity.EntityRendererManager.shouldRender(EntityRendererManager.java:238) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.renderer.WorldRenderer.updateCameraAndRender(WorldRenderer.java:983) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
    at net.minecraft.client.renderer.GameRenderer.renderWorld(GameRenderer.java:613) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:434) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:988) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.Minecraft.run(Minecraft.java:587) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_261] {}
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_261] {}
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_261] {}
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_261] {}
    at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-6.1.3.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-6.1.3.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-6.1.3.jar:?] {}
    at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-6.1.3.jar:?] {}
    at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-6.1.3.jar:?] {}
    at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) [forge-1.16.1-32.0.108_mapped_snapshot_20200514-1.16-recomp.jar:?] {}

Posted

 

23 minutes ago, poopoodice said:

You should not register anything through Vanilla Registry (see the comment above the class), use the deferred register that you already have.

I can't figure out how to register my Arrow Entity under my ENTITY_TYPE registry because my EntityJadeArrow class does not extend EntityType. What is the way to register my EntityArrow under the ENTITY_TYPE registry?

Posted
4 minutes ago, Beethoven92 said:

You are already registering an entity type of your custom arrow entity in the code above...just use the ENTITY_TYPES#register method of your deferred register instead of using the vanilla registry. Also, did you remember to bind your entity to its renderer?

Thank you for all the help. When I use ENTITY_TYPES#register my IDE says "Inferred type 'I' for type parameter 'I' is not within its bound; should extend 'net.minecraft.entity.EntityType<?>'"

And how do I bind my Renderer to my entity?

Posted

Ok a little update. I was able to make my entity type but not register it:
public static EntityType<EntityJadeArrow> jadearrow = (EntityType<EntityJadeArrow>) EntityType.Builder.<EntityJadeArrow>create(EntityJadeArrow::new, EntityClassification.MISC)
            .size(0.25F, 0.25F)
            .build("jade:jade_arrow")
            .setRegistryName("jade_arrow");

When I call this as an entity type in JadeArrow, I kid you not it shoots pigs

This is not a joke. I get the same "Inferred type 'I' for type parameter 'I' is not within its bound; should extend 'net.minecraft.entity.EntityType<?>'" when I try to register jadearrow under ENTITY_TYPES.

2020-11-20_18.23.06.png

Posted (edited)
17 minutes ago, Chuck16 said:

public static EntityType<EntityJadeArrow> jadearrow = (EntityType<EntityJadeArrow>) EntityType.Builder.<EntityJadeArrow>create(EntityJadeArrow::new, EntityClassification.MISC)
            .size(0.25F, 0.25F)
            .build("jade:jade_arrow")
            .setRegistryName("jade_arrow");

 

You can either change the field type to EntityType<?> or you have to manually cast the entity type (which eventually you're gonna cast is somewhere else).

 

Edited by poopoodice
Posted
57 minutes ago, poopoodice said:

You can either change the field type to EntityType<?> or you have to manually cast the entity type (which eventually you're gonna cast is somewhere else).

public static EntityType<?> jadearrow = EntityType.Builder.<EntityJadeArrow>create(EntityJadeArrow::new, EntityClassification.MISC)
        .size(0.25F, 0.25F)
        .build("jade:jade_arrow")
        .setRegistryName("jade:jade_arrow");
public static final RegistryObject<EntityType<?>> JADE_ARROW_ENTITY = ENTITY_TYPES.register("jade_arrow", jadearrow);

Okay, I switched the field and still get the "Inferred type 'I' for type parameter 'I' is not within its bound; should extend 'net.minecraft.entity.EntityType<?>'"

Posted

Okay I think I successfully registered the arrow. Now when I shoot the arrow it does not take from the stack and does not shoot an arrow. Only the bow animation plays.

public static EntityType<EntityJadeArrow> jadeArrow;

@SubscribeEvent
public static void onEntityTypeRegistration(RegistryEvent.Register<EntityType<?>> entityTypeRegisterEvent) {
    jadeArrow = EntityType.Builder.<EntityJadeArrow>create(EntityJadeArrow::new, EntityClassification.MISC)
            .size(0.25F, 0.25F)
            .build("jade:jade_arrow");
    jadeArrow.setRegistryName("jade:jade_arrow");
    entityTypeRegisterEvent.getRegistry().register(jadeArrow);
}

I still need to know how to bind my entity to the renderer

Posted (edited)

Ok thank you soo much. That was more helpful than you will ever know. I am left with one arrow on rendering: [15:42:06] [Render thread/ERROR] [minecraft/Util]: No data fixer registered for jade_arrow. I think I can figure this out but I just wanted to put that out there. This error is thrown when I shoot the arrow and crashes the game. When I load the game back up the mob I shot is dead.

Edited by Chuck16

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.