Jump to content

How do i register a munition-entity, using my existing registration procedure?


Recommended Posts

Posted (edited)

Hello

 

Actual i register my entities like this:

RegistryEvent in the main-class:

        @SubscribeEvent
        public static void registerEntities(final RegistryEvent.Register<EntityType<?>> event)
        {
            event.getRegistry().registerAll(AngryBirdsEntities.RED,
                                            AngryBirdsEntities.CHUCK,
                                            AngryBirdsEntities.BLUES,
                                            AngryBirdsEntities.BOMB,
                                            AngryBirdsEntities.MATHILDA,
                                            AngryBirdsEntities.TERENCE,
                                            AngryBirdsEntities.SILVER,
                                            AngryBirdsEntities.BUBBLES,
                                            AngryBirdsEntities.HAL,
                                            AngryBirdsEntities.STELLA,
                                            AngryBirdsEntities.POPPY,
                                            AngryBirdsEntities.WILLOW,
                                            AngryBirdsEntities.DAHLIA,
                                            AngryBirdsEntities.LUCA,
                                            AngryBirdsEntities.ICE_BIRD);
        }

Prepared entities in the entity-list-class:

    public static EntityType<?> RED = EntityType.Builder.create(RedEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".red").setRegistryName("red");
    public static EntityType<?> CHUCK = EntityType.Builder.create(ChuckEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".chuck").setRegistryName("chuck");
    public static EntityType<?> BLUES = EntityType.Builder.create(BluesEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".blues").setRegistryName("blues");
    public static EntityType<?> BOMB = EntityType.Builder.create(BombEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".bomb").setRegistryName("bomb");
    public static EntityType<?> MATHILDA = EntityType.Builder.create(MathildaEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".mathilda").setRegistryName("mathilda");
    public static EntityType<?> TERENCE = EntityType.Builder.create(TerenceEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".terence").setRegistryName("terence");
    public static EntityType<?> SILVER = EntityType.Builder.create(SilverEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".silver").setRegistryName("silver");
    public static EntityType<?> BUBBLES = EntityType.Builder.create(BubblesEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".bubbles").setRegistryName("bubbles");
    public static EntityType<?> HAL = EntityType.Builder.create(HalEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".hal").setRegistryName("hal");
    public static EntityType<?> STELLA = EntityType.Builder.create(StellaEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".stella").setRegistryName("stella");
    public static EntityType<?> POPPY = EntityType.Builder.create(PoppyEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".poppy").setRegistryName("poppy");
    public static EntityType<?> WILLOW = EntityType.Builder.create(WillowEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".willow").setRegistryName("willow");
    public static EntityType<?> DAHLIA = EntityType.Builder.create(DahliaEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".dahlia").setRegistryName("dahlia");
    public static EntityType<?> LUCA = EntityType.Builder.create(LucaEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".luca").setRegistryName("luca");
    public static EntityType<?> ICE_BIRD = EntityType.Builder.create(IceBirdEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".ice_bird").setRegistryName("ice_bird");

How do i register a munition-entity (based on the arrow-entity) in a way, that i can put it into the RegistryEvent in the main-class, as well as the living entities?

Edited by Drachenbauer
Posted

Do not use static initializers.

Initialize and register your registries (in your case, the EntityTypes) in the according registry events.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted (edited)

I got the way with static initializers from a tutorial of Harry Talks.

My living entities work this way.

 

I made my own abstract entity class for my own munition, because i want no commections between the arrows and my munition.

I don´t know how else i can  make it impossible to use my munition with the bow and normal arrows with my slingshot.

Edited by Drachenbauer
Posted (edited)

Even if static fields are working for you, the experts will still tell you not to because they can fail in unpredictable and strange ways that can be hard to troubleshoot.   It’s not really that hard to implement.  

 

Extending ArrowEntity won't have an impact on launching your munitions, because ArrowItem is a separate Class, just use a generic Item, not one based on ArrowItem.

 

There are a lot of behaviors in AbstractArrowEntity that would be difficult to implement in a custom entity.  If you can find a way to extend ArrowEntity, you might get past the custom spawn packet problem i've run into.  

Edited by PhilipChonacky
correction
Posted

My classes don´t extent from the arrow classes.

i try to reproduce my own version of this system of classes with my own item-class and abstact entity-class included.

This is my only idea to prevent switching munitions between bow and slingshot.

 

Posted

Do not follow Harry Talks tutorials; they are terrible in that they promotes bad coding practices and outdated/deprecated methods.

Static initializers will cause problems, and you cannot control when they are initialized.

 

Creating your own entity does not do anything in preventing your slingshot from using arrows.

You should override ItemBow#isArrow and return true if the given ItemStack contains your arrow item.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted (edited)

my slingshot does not extend the bow.

I used the code from the bow, and where the bow uses ArrowItem, i replaced this with my own munition-item class.

And inside the munition-item-class I have got a connection to my own munition-entity-class, that extends AbstractArrowEntity.

 

Where do i find better video tutorials for 1.14.3?

Is this better:

Jorrit Tyberghein modding tutorials

Edited by Drachenbauer
Posted

If your slingshot act like a bow, it shall extends the bow.

There is no point in copying everything again.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted (edited)

but how do i separate the munitions then to make it unable to use arrows?

 

About Static initializers for entities:

The EntityTypes - class in the minecraft-source also has such static fields (with all capital entity-names) for all entities.

Here is a sample for one of theese lines:

public static final EntityType<ArrowEntity> ARROW = register("arrow", EntityType.Builder.<ArrowEntity>create(ArrowEntity::new, EntityClassification.MISC).size(0.5F, 0.5F));
Edited by Drachenbauer
Posted (edited)

If you say, tha way, Harry Talks registers entities, is not good, then i need a tutorial-video, that shows it a better way.

 

Tutorial-videos work the best for me to make stuff in a mod working.

And Harry Talks was the only one, i found so far, who shows registering entities in 1.14.3

Edited by Drachenbauer
Posted (edited)
10 hours ago, Drachenbauer said:

Tutorial-videos work the best for me to make stuff in a mod working.

@EventBusSubscriber(bus=Bus.MOD, modid="modid")
public class EntityTypes {
  @ObjectHolder("modid:red")
  public static final EntityType RED = null;
  
  @SubscribeEvent
  public static void registerEntities(Register<EntityType<?>> event) {
    event.getRegistry().registerAll(
    	EntityType.Builder.create(RedEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".red").setRegistryName("red")
    );
  }
}

That's more or less what it should look like.

Edited by Animefan8888

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted (edited)

I have lot´s of different birds.

Should i give each one such an objectholder with their names?

 

I connected ti the modid-string in my Reference-Class, where you say "modid" i think, so it keeps working, if i think about changing the modid later in the reference-class.

 

your empty Entitytype-thing gives me a raw type warning.should i better add "<?>" behind "EntityType"?

Edited by Drachenbauer
Posted
6 minutes ago, Drachenbauer said:

your empty Entitytype-thing gives me a raw type warning.should i better add "<?>" behind "EntityType"?

Yes though unless the underline is red it doesn't matter.

8 minutes ago, Drachenbauer said:

Should i give each one such an objectholder with their names? 

You only need to add the ObjectHolder/Field if you need to access the field.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted (edited)

The entity-classes of my birds want an EntityType named in theri constructor.

So i think, i need theese fields for all of them to put theese all-capitals-names into the constructors..

 

in my main-class i have this:

@SubscribeEvent
        public static void registerEntities(final RegistryEvent.Register<EntityType<?>> event)
        {
            event.getRegistry().registerAll(AngryBirdsEntities.RED,
                                            AngryBirdsEntities.CHUCK,
                                            AngryBirdsEntities.BLUES,
                                            AngryBirdsEntities.BOMB,
                                            AngryBirdsEntities.MATHILDA,
                                            AngryBirdsEntities.TERENCE,
                                            AngryBirdsEntities.SILVER,
                                            AngryBirdsEntities.BUBBLES,
                                            AngryBirdsEntities.HAL,
                                            AngryBirdsEntities.STELLA,
                                            AngryBirdsEntities.POPPY,
                                            AngryBirdsEntities.WILLOW,
                                            AngryBirdsEntities.DAHLIA,
                                            AngryBirdsEntities.LUCA,
                                            AngryBirdsEntities.ICE_BIRD);
        }

Can i delete this, if i change all my birds to how you make it?

 

And in the headline of your method, i think, it should be "Register<EntityType<?>> event" instead of "Register<EntityTypes> event".

 

It seams like you forgot to tell me something.

I cannot spwn them with a spawn-egg now.

 

This i how i actually made my SpawnEggs:

    public static void registerEntitySpawnEggs(final RegistryEvent.Register<Item>event)
    {
        event.getRegistry().registerAll(AngryBirdsItems.red_egg = registerEntitySpawnEgg(RED, 0xdf0000, 0xdfbf9f, "red_egg"),
                                        AngryBirdsItems.chuck_egg = registerEntitySpawnEgg(CHUCK, 0xffff00, 0xffffff, "chuck_egg"),
                                        AngryBirdsItems.blues_egg = registerEntitySpawnEgg(BLUES, 0x007fff, 0xff0000, "blues_egg"),
                                        AngryBirdsItems.bomb_egg = registerEntitySpawnEgg(BOMB, 0x3f3f3f, 0x7f7f7f, "bomb_egg"),
                                        AngryBirdsItems.mathilda_egg = registerEntitySpawnEgg(MATHILDA, 0xffffff, 0xffbfbf, "mathilda_egg"),
                                        AngryBirdsItems.terence_egg = registerEntitySpawnEgg(TERENCE, 0xbf002f, 0xbf9f7f, "terence_egg"),
                                        AngryBirdsItems.silver_egg = registerEntitySpawnEgg(SILVER, 0xbfbfbf, 0xffffff, "silver_egg"),
                                        AngryBirdsItems.bubbles_egg = registerEntitySpawnEgg(BUBBLES, 0xff7f00, 0x000000, "bubbles_egg"),
                                        AngryBirdsItems.hal_egg = registerEntitySpawnEgg(HAL, 0x00bf00, 0xffffff, "hal_egg"),
                                        AngryBirdsItems.stella_egg = registerEntitySpawnEgg(STELLA, 0xffadb7, 0xffd7dc, "stella_egg"),
                                        AngryBirdsItems.poppy_egg = registerEntitySpawnEgg(POPPY, 0xffff3f, 0xffffbf, "poppy_egg"),
                                        AngryBirdsItems.willow_egg = registerEntitySpawnEgg(WILLOW, 0x3f9fff, 0x7fbfff, "willow_egg"),
                                        AngryBirdsItems.dahlia_egg = registerEntitySpawnEgg(DAHLIA, 0xbf7f3f, 0xffdfbf, "dahlia_egg"),
                                        AngryBirdsItems.luca_egg = registerEntitySpawnEgg(LUCA, 0x7fbfff, 0xffffbf, "luca_egg"),
                                        AngryBirdsItems.ice_bird_egg = registerEntitySpawnEgg(ICE_BIRD, 0x7fbfff, 0x007fff, "ice_bird_egg"));	    
    }
    
    public static Item registerEntitySpawnEgg(EntityType<?> type, int color1, int color2, String name)
    {
        SpawnEggItem item = new SpawnEggItem(type, color1, color2, new Item.Properties().group(AngryBirds.ANGRY_BIRDS));
        item.setRegistryName(name);
        return item;
    }

 

If i try to use a spawn egg, i get this:

Spoiler

[23:13:29.614] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server
java.lang.NullPointerException: null
    at net.minecraft.item.SpawnEggItem.onItemUse(SourceFile:82) ~[?:?] {}
    at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:599) ~[?:?] {}
    at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:162) ~[?:?] {}
    at net.minecraft.server.management.PlayerInteractionManager.func_219441_a(PlayerInteractionManager.java:357) ~[?:?] {}
    at net.minecraft.network.play.ServerPlayNetHandler.processTryUseItemOnBlock(ServerPlayNetHandler.java:876) ~[?:?] {}
    at net.minecraft.network.play.client.CPlayerTryUseItemOnBlockPacket.processPacket(SourceFile:36) ~[?:?] {}
    at net.minecraft.network.play.client.CPlayerTryUseItemOnBlockPacket.processPacket(SourceFile:10) ~[?:?] {}
    at net.minecraft.network.PacketThreadUtil.func_210405_a(SourceFile:15) ~[?:?] {}
    at net.minecraft.util.concurrent.TickDelayedTask.run(SourceFile:18) ~[?:?] {}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.run(SourceFile:135) [?:?] {pl:accesstransformer:B}
    at net.minecraft.util.concurrent.RecursiveEventLoop.run(SourceFile:23) [?:?] {}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(SourceFile:114) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.func_213205_aW(MinecraftServer.java:683) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:677) [?:?] {pl:accesstransformer:B}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(SourceFile:99) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:662) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:613) [?:?] {pl:accesstransformer:B}
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_221] {}

It shows no class of my mod.

So i don´t know, what exactly i have to change to fix this eror.

Edited by Drachenbauer
Posted
2 minutes ago, Drachenbauer said:

Can i delete this, if i change all my birds to how you make it?

Yes

 

2 minutes ago, Drachenbauer said:

And in the headline of your method, i think, it should be "Register<EntityType<?>> event" instead of "Register<EntityTypes> event".

If that makes your IDE happy then yes.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
40 minutes ago, Drachenbauer said:

It seams like you forgot to tell me something.

I cannot spwn them with a spawn-egg now.

 

This i how i actually made my SpawnEggs:


    public static void registerEntitySpawnEggs(final RegistryEvent.Register<Item>event)
    {
        event.getRegistry().registerAll(AngryBirdsItems.red_egg = registerEntitySpawnEgg(RED, 0xdf0000, 0xdfbf9f, "red_egg"),
                                        AngryBirdsItems.chuck_egg = registerEntitySpawnEgg(CHUCK, 0xffff00, 0xffffff, "chuck_egg"),
                                        AngryBirdsItems.blues_egg = registerEntitySpawnEgg(BLUES, 0x007fff, 0xff0000, "blues_egg"),
                                        AngryBirdsItems.bomb_egg = registerEntitySpawnEgg(BOMB, 0x3f3f3f, 0x7f7f7f, "bomb_egg"),
                                        AngryBirdsItems.mathilda_egg = registerEntitySpawnEgg(MATHILDA, 0xffffff, 0xffbfbf, "mathilda_egg"),
                                        AngryBirdsItems.terence_egg = registerEntitySpawnEgg(TERENCE, 0xbf002f, 0xbf9f7f, "terence_egg"),
                                        AngryBirdsItems.silver_egg = registerEntitySpawnEgg(SILVER, 0xbfbfbf, 0xffffff, "silver_egg"),
                                        AngryBirdsItems.bubbles_egg = registerEntitySpawnEgg(BUBBLES, 0xff7f00, 0x000000, "bubbles_egg"),
                                        AngryBirdsItems.hal_egg = registerEntitySpawnEgg(HAL, 0x00bf00, 0xffffff, "hal_egg"),
                                        AngryBirdsItems.stella_egg = registerEntitySpawnEgg(STELLA, 0xffadb7, 0xffd7dc, "stella_egg"),
                                        AngryBirdsItems.poppy_egg = registerEntitySpawnEgg(POPPY, 0xffff3f, 0xffffbf, "poppy_egg"),
                                        AngryBirdsItems.willow_egg = registerEntitySpawnEgg(WILLOW, 0x3f9fff, 0x7fbfff, "willow_egg"),
                                        AngryBirdsItems.dahlia_egg = registerEntitySpawnEgg(DAHLIA, 0xbf7f3f, 0xffdfbf, "dahlia_egg"),
                                        AngryBirdsItems.luca_egg = registerEntitySpawnEgg(LUCA, 0x7fbfff, 0xffffbf, "luca_egg"),
                                        AngryBirdsItems.ice_bird_egg = registerEntitySpawnEgg(ICE_BIRD, 0x7fbfff, 0x007fff, "ice_bird_egg"));	    
    }
    
    public static Item registerEntitySpawnEgg(EntityType<?> type, int color1, int color2, String name)
    {
        SpawnEggItem item = new SpawnEggItem(type, color1, color2, new Item.Properties().group(AngryBirds.ANGRY_BIRDS));
        item.setRegistryName(name);
        return item;
    }

 

If i try to use a spawn egg, i get this:

  Reveal hidden contents

[23:13:29.614] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server
java.lang.NullPointerException: null
    at net.minecraft.item.SpawnEggItem.onItemUse(SourceFile:82) ~[?:?] {}
    at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:599) ~[?:?] {}
    at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:162) ~[?:?] {}
    at net.minecraft.server.management.PlayerInteractionManager.func_219441_a(PlayerInteractionManager.java:357) ~[?:?] {}
    at net.minecraft.network.play.ServerPlayNetHandler.processTryUseItemOnBlock(ServerPlayNetHandler.java:876) ~[?:?] {}
    at net.minecraft.network.play.client.CPlayerTryUseItemOnBlockPacket.processPacket(SourceFile:36) ~[?:?] {}
    at net.minecraft.network.play.client.CPlayerTryUseItemOnBlockPacket.processPacket(SourceFile:10) ~[?:?] {}
    at net.minecraft.network.PacketThreadUtil.func_210405_a(SourceFile:15) ~[?:?] {}
    at net.minecraft.util.concurrent.TickDelayedTask.run(SourceFile:18) ~[?:?] {}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.run(SourceFile:135) [?:?] {pl:accesstransformer:B}
    at net.minecraft.util.concurrent.RecursiveEventLoop.run(SourceFile:23) [?:?] {}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(SourceFile:114) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.func_213205_aW(MinecraftServer.java:683) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:677) [?:?] {pl:accesstransformer:B}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(SourceFile:99) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:662) [?:?] {pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:613) [?:?] {pl:accesstransformer:B}
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_221] {}

It shows no class of my mod.

So i don´t know, what exactly i have to change to fix this eror.

And how about this?

Posted
43 minutes ago, Drachenbauer said:

If i try to use a spawn egg, i get this:

That is caused because Items are registered before EntityTypes. This is probably a bug and you'll want to report it here. For now it is probably better to get rid of the ObjectHolders on EntityType fields and initialize them in the Item registry event then register them in the EntityType registry event.

 

public static EntityType<?> RED;
public static void registerSpawnEggs(Register<Item> event) {
  RED = ...
  event.getRegistry().registerAll(
  	new SpawnEggItem(...)
  );
}
public static void registerEntityTypes(Register<EntityType<?>> event) {
  event.getRegistry().registerAll(
  	RED,
    ...
  );

This is obvious psuedocode, but what you should do until that is addressed.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted (edited)

Now my code for this looks like this:

    @SubscribeEvent
    public static void registerEntitySpawnEggs(Register<Item>event)
    {
        RED = EntityType.Builder.create(RedEntity::new, EntityClassification.CREATURE).build(Reference.MOD_ID + ".red").setRegistryName("red");
        
        event.getRegistry().registerAll(AngryBirdsItems.red_egg = registerEntitySpawnEgg(RED, 0xdf0000, 0xdfbf9f, "red_egg"),
                                        AngryBirdsItems.chuck_egg = registerEntitySpawnEgg(CHUCK, 0xffff00, 0xffffff, "chuck_egg"),
                                        AngryBirdsItems.blues_egg = registerEntitySpawnEgg(BLUES, 0x007fff, 0xff0000, "blues_egg"),
                                        AngryBirdsItems.bomb_egg = registerEntitySpawnEgg(BOMB, 0x3f3f3f, 0x7f7f7f, "bomb_egg"),
                                        AngryBirdsItems.mathilda_egg = registerEntitySpawnEgg(MATHILDA, 0xffffff, 0xffbfbf, "mathilda_egg"),
                                        AngryBirdsItems.terence_egg = registerEntitySpawnEgg(TERENCE, 0xbf002f, 0xbf9f7f, "terence_egg"),
                                        AngryBirdsItems.silver_egg = registerEntitySpawnEgg(SILVER, 0xbfbfbf, 0xffffff, "silver_egg"),
                                        AngryBirdsItems.bubbles_egg = registerEntitySpawnEgg(BUBBLES, 0xff7f00, 0x000000, "bubbles_egg"),
                                        AngryBirdsItems.hal_egg = registerEntitySpawnEgg(HAL, 0x00bf00, 0xffffff, "hal_egg"),
                                        AngryBirdsItems.stella_egg = registerEntitySpawnEgg(STELLA, 0xffadb7, 0xffd7dc, "stella_egg"),
                                        AngryBirdsItems.poppy_egg = registerEntitySpawnEgg(POPPY, 0xffff3f, 0xffffbf, "poppy_egg"),
                                        AngryBirdsItems.willow_egg = registerEntitySpawnEgg(WILLOW, 0x3f9fff, 0x7fbfff, "willow_egg"),
                                        AngryBirdsItems.dahlia_egg = registerEntitySpawnEgg(DAHLIA, 0xbf7f3f, 0xffdfbf, "dahlia_egg"),
                                        AngryBirdsItems.luca_egg = registerEntitySpawnEgg(LUCA, 0x7fbfff, 0xffffbf, "luca_egg"),
                                        AngryBirdsItems.ice_bird_egg = registerEntitySpawnEgg(ICE_BIRD, 0x7fbfff, 0x007fff, "ice_bird_egg"));       
    }
    
    @SubscribeEvent
    public static void registerEntities(Register<EntityType<?>> event)
    {
      event.getRegistry().registerAll(RED);
      
      //event.getRegistry().registerAll(EntityType.Builder.<RedShotEntity>create(RedShotEntity::new, EntityClassification.MISC).size(0.5F, 0.5F));
    }
    
    public static Item registerEntitySpawnEgg(EntityType<?> type, int color1, int color2, String name)
    {
        SpawnEggItem item = new SpawnEggItem(type, color1, color2, new Item.Properties().group(AngryBirds.ANGRY_BIRDS));
        item.setRegistryName(name);
        return item;
    }

But it crashes, bevore the red loading bar is full.

I create the entity in the item register method and then register it in the registerEntity-method, like you say.

What did i understand wrong in your last code-template?

It says this errors:

Spoiler

[10:59:31.457] [Client thread/FATAL] [minecraft/Minecraft]: Reported exception thrown!
net.minecraft.crash.ReportedException: Rendering overlay

 

then

 

Caused by: java.lang.RuntimeException: One of more entry values did not copy to the correct id. Check log for details!

 

Each one followed by a stack of locations, wich are not inside my mod...

for the seccond part of the error, i cannot find out, wich entry value it means...

it didn´t write it into the lines below and i also cannot find it in the logs.

Edited by Drachenbauer
Posted (edited)

OK crash fixed:

Now i have placed theese registry-events in my main-class, where i already had some of theese events in a sub-class,

So all registry events are located together at one spot..

And now i can spawn this entity again with the egg.

And so i keep my old entity-registering event, because it still needs only the all-capitals-entity-type-names, like i already use them there.

 

Another question:

How can i register my munitions this way?

If i try to make theese lines exactly the same:

RED_SHOT = EntityType.Builder.<RedShotEntity>create(RedShotEntity::new, EntityClassification.MISC).size(0.5F, 0.5F);

It says, that the constructor of my munition mismatches...

But one of it´s three constructors is similar to the ones of the other entities.

Edited by Drachenbauer
Posted (edited)

My living entities are registred this way, but i still don´t know, how to register the munitions the same way.

I still don´t know how to fix this constructor-mismatch.

Edited by Drachenbauer
Posted (edited)

Since i made my SlingshotItem extend the BowItem, it does not load it´s extra item-models for it´s pulling-animation any more.

What must i do to get this to work again?

 

Edit: finally fixed this:

I noticed, that the json for the item-model of the bow has an area "overrides", that leads to the pulling-states.

This was removed in the matching file of my slingshot.

it seams like i deleted it while modifying the file, and didnt notice that.

Now i readded it and the pulling-animation works.

 

Now i think, that my munitions don´t start flying, must be causef by the way, i registered them or by the renderer, i created for them.

For the renderer, i created a renderer-class, that extends EntityRender, like LivingRenderer does, but at the place, there the LivingRenderer has "LivingEntity" in it´s class-header, i used just the basic Entity-class.

Then i copyed all content of the Living-Renderer into my renderer and removed all about living (i think so).

Then the renderers for the different birds extend this one.

AngryBirdsMod Github

Search here for "AbstractBirdShotRenderer" to find my renderer class.

Can anyone pleas check it, if the error is located there?

Edited by Drachenbauer

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • So me and a couple of friends are playing with a shitpost mod pack and one of the mods in the pack is corail tombstone and for some reason there is a problem with it, where on death to fire the player will get kicked out of the server and the tombstone will not spawn basically deleting an entire inventory, it doesn't matter what type of fire it is, whether it's from vanilla fire/lava, or from modded fire like ice&fire/lycanites and it's common enough to where everyone on the server has experienced at least once or twice and it doesn't give any crash log. a solution to this would be much appreciated thank you!
    • It is 1.12.2 - I have no idea if there is a 1.12 pack
    • Okay, but does the modpack works with 1.12 or just with 1.12.2, because I need the Forge client specifically for Minecraft 1.12, not 1.12.2
    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
  • Topics

×
×
  • Create New...

Important Information

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