Jump to content

Recommended Posts

Posted (edited)

Heyo everyone! I'm trying to create a new crop for an upcoming mod of mine. I'm pretty good with java and have modded a bit before, but this being my first time delving into crops and such, I'm at a bit of a loss. I'm getting an error saying that there's no registry name set for my "ItemSeeds" which I can't find anywhere. I have "dpetal" set as my "ItemSeeds," and I think I registered dpetal properly, but apparently I didn't. Can someone help me here?

 

Crash Report: https://pastebin.com/FaR2DBd0

ModItems Class: https://pastebin.com/kCnJE216

ItemDpetal Class: https://pastebin.com/Hgqb3TX3

 

Thanks for your help! I know this is probably a stupid mistake, but it's just flying over my head here.

Edited by ModMCdl

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted

dpetal = new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND);

You never set the registry name for the dpetal(at least not in the code you've posted), and the ItemSeeds class does not do that for you. Your ItemDpeal class does but you do not use it.

 

Side note: do not use ItemModelMesher, it is outdated and buggy. Use ModelLoader.

Posted
1 minute ago, V0idWa1k3r said:

dpetal = new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND);

You never set the registry name for the dpetal(at least not in the code you've posted), and the ItemSeeds class does not do that for you. Your ItemDpeal class does but you do not use it.

 

Side note: do not use ItemModelMesher, it is outdated and buggy. Use ModelLoader.

Ohhh... so that's where I was going wrong. Lol, I knew it was something stupid, and I just needed another set of eyes. So I just would use dpetal= new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND), ItemDpetal(); or would I write a new line for it and have two dpetal = new etc.? (Stupid question probably, but bear with me here...)

 

As for the ItemModelMesher, I suppose it is a bad habit of mine. I've always used it since I was modding, and it never really failed me, but I should really get around to changing soon.

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted
1 minute ago, ModMCdl said:

So I just would use dpetal= new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND), ItemDpetal(); or would I write a new line for it and have two dpetal = new etc.?

What do you want the dpetal item to be? If it is supposed to be a ItemDpetal then you would set the value of dpetal to an instance of ItemDpetal. If it is supposed to be ItemSeeds you would need to set it's registry name explicidly with Item::setRegistryName

Posted
12 minutes ago, ModMCdl said:

Ohhh... so that's where I was going wrong. Lol, I knew it was something stupid, and I just needed another set of eyes. So I just would use dpetal= new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND), ItemDpetal(); or would I write a new line for it and have two dpetal = new etc.? (Stupid question probably, but bear with me here...)

Uh.

dpetal = new ItemDpetal(...)?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
11 minutes ago, V0idWa1k3r said:

What do you want the dpetal item to be? If it is supposed to be a ItemDpetal then you would set the value of dpetal to an instance of ItemDpetal. If it is supposed to be ItemSeeds you would need to set it's registry name explicidly with Item::setRegistryName

Hmmm...

dpetal = new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND).setUnlocalizedName("dpetal").setRegistryName(new ResourceLocation(Reference.MOD_ID, "dpetal"));

This is seemingly how I could go about it, but now I get a "Attempt to register a null object" error.

Just now, Draco18s said:

Uh.

dpetal = new ItemDpetal(...)?

So I would replace ItemSeeds with ItemDpetal? Wouldn't it not be recognized as a crop anymore? Or am I completely missing something here? Again, really stupid questions I'm asking, but crops are seemingly alluding me right now...

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted
5 minutes ago, ModMCdl said:

dpetal = new ItemSeeds(ModBlocks.darklilac, Blocks.FARMLAND).setUnlocalizedName("dpetal").setRegistryName(new ResourceLocation(Reference.MOD_ID, "dpetal"));

This is seemingly how I could go about it, but now I get a "Attempt to register a null object" error.

Looks correct to me unless I am missing something. Please show your updated code and the error log. 

 

5 minutes ago, ModMCdl said:

So I would replace ItemSeeds with ItemDpetal? Wouldn't it not be recognized as a crop anymore?

If you want the dpetal item to be an instance of ItemSeeds why have you created a ItemDpetal class in the first place?

Posted
5 minutes ago, ModMCdl said:

So I would replace ItemSeeds with ItemDpetal? Wouldn't it not be recognized as a crop anymore? Or am I completely missing something here? Again, really stupid questions I'm asking, but crops are seemingly alluding me right now...

Really depends on what you're doing. I had assumed that ItemDpetal was a class that extended ItemSeed, but it does not.

Option a: use the vanilla ItemSeeds class (but figure out what your error is, I don't see anything obviously wrong1)

Option b: make your class extend ItemSeeds (and possibly fix some other errors)

 

1Your unlocalized names should include your mode ID so it doesn't conflict with other mods using the same unlocalized name. The chance is low, but non-zero. This is usually done by doing item.setUnlocalizedName(item.getRegistryName()).

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
1 minute ago, V0idWa1k3r said:

Looks correct to me unless I am missing something. Please show your updated code and the error log. 

Updated error: https://pastebin.com/3miFG37w

 

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted
1 minute ago, Draco18s said:

Really depends on what you're doing. I had assumed that ItemDpetal was a class that extended ItemSeed, but it does not.

Option a: use the vanilla ItemSeeds class (but figure out what your error is, I don't see anything obviously wrong1)

Option b: make your class extend ItemSeeds (and possibly fix some other errors)

 

1Your unlocalized names should include your mode ID so it doesn't conflict with other mods using the same unlocalized name. The chance is low, but non-zero. This is usually done by doing item.setUnlocalizedName(item.getRegistryName()).

So I would define Dpetals as a ItemSeeds instead of a normal item like public class ItemDpetal extends ItemSeeds { instead of public class ItemDpetal extends Item {

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted

Your new error actually has nothing to do with the item, look at the stacktrace:

    at init.ModBlocks.registerBlock(ModBlocks.java:49)

    at init.ModBlocks.register(ModBlocks.java:37)

 

Something you are registering in your ModBlocks class is null. We can't tell what since you've never posted your ModBlocks class.

Posted

*facepalm* Lol I'm an idiot. Can't believe I missed that. Even more of an idiot because now I'm totally confused at what's happening.

 

ModBlocks class: https://pastebin.com/hsxtuxES

 

Am aware of the ItemModelMesher again, just a habit I need to break.

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted

While I do not see what is null there your registerBlock method is not doing what it is supposed to do. Currently it registeres all your blocks and an ItemBlock for the block you've passed. As you are calling it 4 times all your blocks get registered 4 times which is not what you want at all.

As for the null itself I would guess that you are calling the register method before the init method/not calling init method at all/calling registerBlock from one of the constructors of your blocks which causes the issue due to your method not doing what it is supposed to. 

Posted
4 minutes ago, V0idWa1k3r said:

While I do not see what is null there your registerBlock method is not doing what it is supposed to do. Currently it registeres all your blocks and an ItemBlock for the block you've passed. As you are calling it 4 times all your blocks get registered 4 times which is not what you want at all.

As for the null itself I would guess that you are calling the register method before the init method/not calling init method at all/calling registerBlock from one of the constructors of your blocks which causes the issue due to your method not doing what it is supposed to. 

This method has worked for me countless times in the past. I don't really know what you mean.

 

 

UPDATE: I can get the game to launch, but then it crashes upon planting with an unexpected error: https://pastebin.com/xBduBhmb

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted
1 minute ago, ModMCdl said:

This method has worked for me countless times in the past. I don't really know what you mean.

 

Spoiler

 

Your code:

 


private static void registerBlock(Block block) {
        GameRegistry.register(alog);
        GameRegistry.register(aleaf);
        GameRegistry.register(trune);
        GameRegistry.register(darklilac);
        ItemBlock item = new ItemBlock(block);
        item.setRegistryName(block.getRegistryName());
        GameRegistry.register(item);
    }

 

Let's pretend we are the JVM executing the register method.

Line 1: registerBlock(alog);

Executed code:


private static void registerBlock(Block block) {
        GameRegistry.register(alog);
        GameRegistry.register(aleaf);
        GameRegistry.register(trune);
        GameRegistry.register(darklilac);
        ItemBlock item = new ItemBlock(block);
        item.setRegistryName(block.getRegistryName());
        GameRegistry.register(item);
    }

.

 

Line 2: registerBlock(aleaf);

Executed code:


private static void registerBlock(Block block) {
        GameRegistry.register(alog);
        GameRegistry.register(aleaf);
        GameRegistry.register(trune);
        GameRegistry.register(darklilac);
        ItemBlock item = new ItemBlock(block);
        item.setRegistryName(block.getRegistryName());
        GameRegistry.register(item);
    }

 

etc.

 

 

Every time you call registerBlock you register all your blocks. Every single one of them. Again and again.

 

 

4 minutes ago, ModMCdl said:

I can get the game to launch, but then it crashes upon planting with an unexpected error

And this happens because your items are created before your blocks. Thus the dpetal item recieves null as it's soil block because at the time of it's initialization the ModBlocks.darklilac is null.

Posted
1 minute ago, V0idWa1k3r said:

And this happens because your items are created before your blocks. Thus the dpetal item recieves null as it's soil block because at the time of it's initialization the ModBlocks.darklilac is null.

So I should register my blocks before my Items? I swear, I've never encountered problems with this setup before in the past.

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted (edited)
3 minutes ago, V0idWa1k3r said:

And this happens because your items are created before your blocks. Thus the dpetal item recieves null as it's soil block because at the time of it's initialization the ModBlocks.darklilac is null.

And there's the error I expected to find when I saw the thread title. Cool!

/me likes not being wrong.

sunshine.png

1 minute ago, ModMCdl said:

So I should register my blocks before my Items? I swear, I've never encountered problems with this setup before in the past.


Yes.

And the reason you probably never encountered it before was because you'd never done crops before. ItemSeed requires a reference to a block, which means it MUST be created after the block.

Edited by Draco18s
  • Like 2

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
2 minutes ago, Draco18s said:

Yes

So, because I have never done it that way before, and this is the way I taught myself, how would I go about doing this?

(I feel like I'm learning to mod all over again)...

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted (edited)
3 minutes ago, V0idWa1k3r said:

Just initialize your blocks before your items. You know how to move a line or two of code higher, right?

Again, I am an idiot. Lol. But that still doesn't fix the "crash upon planting" problem.

 

So after all of this, do these changes make my dpetal class necessary?  Because I have defined everything for it in my ModItems now, I believe.

Edited by ModMCdl

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted
1 minute ago, ModMCdl said:

do these changes make my dpetal class necessary?

Do you need a custom class here or not is a question only you can answer. These changes do not have anything to do with your class. Do you need it for any custom behaviour or will ItemSeeds suffice is up to you.

Posted
Just now, V0idWa1k3r said:

Do you need a custom class here or not is a question only you can answer. These changes do not have anything to do with your class. Do you need it for any custom behaviour or will ItemSeeds suffice is up to you.

Then I'll keep it around. I'm planning on doing more with these in the future, so it will probably come in handy.

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted

So I'm still getting the crash upon planting, same error as before. Initializing my blocks first hasn't solved that. 

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

Posted

Please show your updated code(the part where you initialize your blocks, the part where you initialize your items and the part where you call both initializers). Additionally show your new log, just in case.

Posted

I figured it out. I had moved the block initialization up, but neglected to move up the registry as well. It seems to be working alright now.

 

I want to thank both of you sincerely for helping me out. I've been told in many places to just "leave and find a tutorial somewhere" rather than "waste their time" with my "pointless questions." You two have been a big help!

Follow these rules when talking to me, and we'll get along fine.

1).I know Java fairly well. I don't know as much about modding. They are not the same, don't compare them.

2). I consider myself to always be learning. I make mistakes, you make mistakes. Who doesn't?

3). Insult me, and I will leave the thread. I have a real life, I don't have time to throw petty insults in a Minecraft Modding forum.

 

ModMCdl - Co-Founder and Director of Design for Artemis Game Studios

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

    • 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.