Jump to content

Recommended Posts

Posted

Hello!

 

So during creation of a plant, I ran into an error, upon right clicking tilled soil:

 

 

 

[09:37:40] [server thread/FATAL]: Error executing task
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_101]
at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_101]
at net.minecraft.util.Util.runTask(Util.java:26) [util.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:742) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:687) [MinecraftServer.class:?]
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) [integratedServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:536) [MinecraftServer.class:?]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
Caused by: java.lang.NullPointerException
at net.minecraft.item.ItemSeeds.getPlant(ItemSeeds.java:52) ~[itemSeeds.class:?]
at net.minecraft.block.Block.canSustainPlant(Block.java:1826) ~[block.class:?]
at net.minecraft.item.ItemSeeds.onItemUse(ItemSeeds.java:31) ~[itemSeeds.class:?]
at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:755) ~[ForgeHooks.class:?]
at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:158) ~[itemStack.class:?]
at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:509) ~[PlayerInteractionManager.class:?]
at net.minecraft.network.NetHandlerPlayServer.processRightClickBlock(NetHandlerPlayServer.java:706) ~[NetHandlerPlayServer.class:?]
at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) ~[CPacketPlayerTryUseItemOnBlock.class:?]
at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) ~[CPacketPlayerTryUseItemOnBlock.class:?]
at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) ~[PacketThreadUtil$1.class:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_101]
at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_101]
at net.minecraft.util.Util.runTask(Util.java:25) ~[util.class:?]
... 5 more

 

 

 

Some of the lines leads me to believe its something to do about my seed. So here is my seed class:

 

 

 

package com.lambda.PlentifulMisc.main.block;

import com.lambda.PlentifulMisc.main.item.ModItems;

import net.minecraft.block.BlockCrops;
import net.minecraft.item.Item;

public class PMBlkCropWatermelon extends BlockCrops {

public PMBlkCropWatermelon() {
	setUnlocalizedName("pmcropwatermelon");
	setRegistryName("pmcropwatermelon");
}

@Override
protected Item getSeed() {
	return ModItems.watermelonSeed;
}

@Override
protected Item getCrop() {
	return ModItems.watermelon;
}

}

 

 

 

And here is where I'm Registering the item:

 

 

 

package com.lambda.PlentifulMisc.main.item;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ModItems {

public static PMItemBase cheese;
public static PMItemBase watermelon;
public static ItemWatermelonSeed watermelonSeed;

public static void init() {
	cheese = register(new PMItemBase("pmcheese").setCreativeTab(CreativeTabs.FOOD));
	watermelonSeed = register(new ItemWatermelonSeed());
	watermelon = register(new PMItemBase("pmwatermelon").setCreativeTab(CreativeTabs.FOOD));
}

private static <T extends Item> T register(T item) {
	GameRegistry.register(item);

	if (item instanceof ItemModelProvider ) {
		((ItemModelProvider )item).registerItemModel(item);
	}

	return item;
}

}

 

 

 

My Main Class.

 

 

 

package com.lambda.PlentifulMisc.main;

import com.lambda.PlentifulMisc.main.block.ModBlocks;
import com.lambda.PlentifulMisc.main.info.PMReference;
import com.lambda.PlentifulMisc.main.item.ModItems;
import com.lambda.PlentifulMisc.main.item.PMItemBase;
import com.lambda.PlentifulMisc.main.tab.PMTab;
import com.lambda.PlentifulMisc.proxy.CommonProxy;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

@Mod(modid = PMReference.MODID, version = PMReference.VERSION)
public class PlentifulMisc
{ 
@SidedProxy(serverSide = "com.lambda.PlentifulMisc.proxy.CommonProxy", clientSide = "com.lambda.PlentifulMisc.proxy.ClientProxy")
public static CommonProxy proxy;
@Mod.Instance(PMReference.MODID)

public static PlentifulMisc instance;
public static final PMTab creativeTab = new PMTab();



    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
	System.out.println("[Plentiful Misc] Plentiful Misc is loading!");
	System.out.println("[Plentiful Misc] Thanks for downloading!");

	System.out.println("[Plentiful Misc] Initializing Blocks!");
	ModBlocks.init();
	System.out.println("[Plentiful Misc] Initializing Items!");
	ModItems.init();


    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    }

@EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {

    }
}

 

 

 

And finally, my Client Proxy:

 

 

 

package com.lambda.PlentifulMisc.proxy;

import com.lambda.PlentifulMisc.main.PlentifulMisc;
import com.lambda.PlentifulMisc.main.info.PMReference;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;

public class ClientProxy extends CommonProxy {
@Override
public void registerItemRenderer(Item item, int meta, String id) {
	ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(PMReference.MODID + ":" + id, "inventory"));
}
}

 

 

 

[NOTE:] Yes, I understand that my code is very messy, uncommented, etc, this is just a test project.

 

Thanks.

Not new to java >> New to modding.

Posted

So when you set a breakpoint at ItemSeeds.java:52 and re-ran in the debugger, what did you find? What's null there, and how could you make it not null before reaching that point?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted

Make sure you're registering your crop block and seed item at the exact same time (as in, put their registration in the same file. I use a separate class for items and blocks that need to be registered together).

I'm eager to learn and am prone to mistakes. Don't hesitate to tell me how I can improve.

Posted

You can't register them at the exact same time: one will always goes first.

Stop passing references to constructors and instead alter the class files to point to your items/blocks lists.

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

So when you set a breakpoint at ItemSeeds.java:52 and re-ran in the debugger, what did you find? What's null there, and how could you make it not null before reaching that point?

 

Seems like it doesn't like how its calculating which way its facing:

 

 

    public BlockPos offset(EnumFacing facing)
    {
        return this.offset(facing, 1);
    }

    /**
     * Offsets this BlockPos n blocks in the given direction
     */
    public BlockPos offset(EnumFacing facing, int n)
    {
        return n == 0 ? this : new BlockPos(this.getX() + facing.getFrontOffsetX() * n, this.getY() + facing.getFrontOffsetY() * n, this.getZ() + facing.getFrontOffsetZ() * n);
    }

 

 

 

These two functions is where the first null spits out; The code that I jumped inside of was:

        if (facing == EnumFacing.UP && playerIn.canPlayerEdit(pos.offset(facing), facing, stack) && state.getBlock().canSustainPlant(state, worldIn, pos, EnumFacing.UP, this) && worldIn.isAirBlock(pos.up()))

 

 

Not new to java >> New to modding.

Posted

So... Which value there was null? You did hover over each, right? When you have located the null element, then you should be able to see where you forgot to set it.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted

For crops, this usually happens when you construct / register the seed item before you construct / register the crop block. So you need to control the order they are constructed / registered.

 

But as JeffryFisher says you should practice your ability to debug this sort of thing yourself. Find the null pointer then think or trace back why the thing that is null is so at that point in the execution.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted

For crops, this usually happens when you construct / register the seed item before you construct / register the crop block. So you need to control the order they are constructed / registered.

 

Actually what usually happens is that they've set up their code in such a way that swapping the two results in a similar, but different, crash.  Because they're trying to pass the seed to the block constructor and the block to the seed constructor.

 

Not the case here (they posted the block class, which is not taking the seed as a parameter) but they didn't post the Item class, so who knows what it's doing.

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

I created a custom crop last night. In fact two. And both working fine!

 

You don't need to create a custom seed item. You need, however, to create a custom crop block because getSeed and getCrop needs to be overriden.

 

 

public class FennelCrop extends BlockCrops 
{
public FennelCrop() 
{
	super();
}

@Override
    protected Item getSeed()
    {
	return ModItems.FENNEL;
    }

@Override
    protected Item getCrop()
    {
        return ModItems.FENNEL;
    }

}

 

 

 

For seed you can use MC's own ItemSeed or even ItemSeedFood both will work.

 

In my ModItems I got this

 

 

public static final Item FENNEL = new ItemSeedFood(1, 0.3F, ModBlocks.CROP_FENNEL, Blocks.FARMLAND).setUnlocalizedName("fennel").setRegistryName("fennel").setCreativeTab(ModData.CREATIVE_TAB);

 

 

after which I register in preInit

 

Note that I used MC's own ItemSeedFood . This is fine because it has the crop, seed in the constructor. Minecraft's or is it Forge's own BlockCrop does not have a way to change crop and seed so you need to create a custom one so you can override the return stuff.

 

Note that in ModBlocks I have to register the crop.

 

And finally I have a ModelsHandler class where I register the models for item and for the crop block. I can show you that too. You HAVE to to id properly or else it will not show up. YOu need various models for each crop stage from 0 to 7 . You need a blockstate with age=0 ... age=7 pointing at the above block model. And for the item you just do it  the regular way like any other non specific MC item.

 

Disclaimer:  I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it.

Posted

I created a custom crop last night. In fact two. And both working fine!

 

You don't need to create a custom seed item. You need, however, to create a custom crop block because getSeed and getCrop needs to be overriden.

 

 

public class FennelCrop extends BlockCrops 
{
public FennelCrop() 
{
	super();
}

@Override
    protected Item getSeed()
    {
	return ModItems.FENNEL;
    }

@Override
    protected Item getCrop()
    {
        return ModItems.FENNEL;
    }

}

 

 

 

For seed you can use MC's own ItemSeed or even ItemSeedFood both will work.

 

In my ModItems I got this

 

 

public static final Item FENNEL = new ItemSeedFood(1, 0.3F, ModBlocks.CROP_FENNEL, Blocks.FARMLAND).setUnlocalizedName("fennel").setRegistryName("fennel").setCreativeTab(ModData.CREATIVE_TAB);

 

 

after which I register in preInit

 

Note that I used MC's own ItemSeedFood . This is fine because it has the crop, seed in the constructor. Minecraft's or is it Forge's own BlockCrop does not have a way to change crop and seed so you need to create a custom one so you can override the return stuff.

 

Note that in ModBlocks I have to register the crop.

 

And finally I have a ModelsHandler class where I register the models for item and for the crop block. I can show you that too. You HAVE to to id properly or else it will not show up. YOu need various models for each crop stage from 0 to 7 . You need a blockstate with age=0 ... age=7 pointing at the above block model. And for the item you just do it  the regular way like any other non specific MC item.

 

By ModelsHandler, do you mean just a JSON?

I'm pretty sure this JSON will work out for a crop, or is there something more I need?

 

 

 

{
    "forge_marker": 1,
    "defaults": {
        "model": "cross"
    },
    "variants": {
        "age": {
            "0": {
                "textures": {
                    "cross": "pm:blocks/watermelon/0"
                }
            },
            "1": {
                "textures": {
                    "cross": "pm:blocks/watermelon/1"
                }
            },
            "2": {
                "textures": {
                    "cross": "pm:blocks/watermelon/2"
                }
            },
            "3": {
                "textures": {
                    "cross": "pm:blocks/watermelon/3"
                }
            },
            "4": {
                "textures": {
                    "cross": "pm:blocks/watermelon/4"
                }
            },
            "5": {
                "textures": {
                    "cross": "pm:blocks/watermelon/5"
                }
            },
            "6": {
                "textures": {
                    "cross": "pm:blocks/watermelon/6"
                }
            },
            "7": {
                "textures": {
                    "cross": "pm:blocks/watermelon/7"
                }
            }
        }
    }
}

 

 

Not new to java >> New to modding.

Posted

modelhandler is my own class name nothing to do with forge. I jsut call the class that registers all my models that.

 

feel free to have a look at my crop files  for ex wormwood crop

https://github.com/trollworkout/technorcery/blob/master/src/main/java/com/technorcery/blocks/WormwoodCrop.java

 

you can find the json and all the other stuff there

 

is FULLY functional tested and not only grows properly but also has a seed, and a crop drop and when you middle click on it in creative you get the wormwood seeds

Disclaimer:  I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave it.

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() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
  • Topics

×
×
  • Create New...

Important Information

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