Jump to content

Recommended Posts

Posted
public class ModBlocksInit {

	public static ArrayList<Block> blockList = new ArrayList<Block>();
	public static ModBlockPlanksEW planksEW;
	public static ModBlockWainsCorner wainsCorner;
	public static ModBlockTudorSet tudorSet;
	
	
	public static IBlockState plankStair;
	static Block block0;
	
	public static void init(){
		block0 = new ModBlock("brick_ew",Material.ROCK,"brick_ew",Main.CREATIVE_TAB);
		//blockList.add(new ModBlock("brick_ew",Material.ROCK,"brick_ew",Main.CREATIVE_TAB));
		blockList.add(block0);
		blockList.add(new ModBlock("blue_marble",Material.ROCK,"blue_marble",Main.CREATIVE_TAB));
		blockList.add(new ModBlock("blocktudor1",Material.CLAY,"BlockTudor1",Main.CREATIVE_TAB));
		blockList.add(new ModBlock("blue_cobble_stone",Material.ROCK,"blue_cobble_stone",Main.CREATIVE_TAB));
		blockList.add(new ModBlock("blue_rug",Material.CARPET,"blue_rug",Main.CREATIVE_TAB));
		
		blockList.add(new ModBlockTudorSet1());
		blockList.add(new ModBlockWains());
		
		
		//new BlockStairs(block0.getDefaultState())).setUnlocalizedName("stairsStone"));


		Iterator<Block> it = blockList.iterator();
		while(it.hasNext()){
			Block block = it.next();
			GameRegistry.register(block);// registers the block
			
			// creates item from the block and registers it
			ItemBlock item = new ItemBlock(block);
			item.setRegistryName(block.getRegistryName());
			GameRegistry.register(item);
			
			// creates the item view for inventory
			ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(),"inventory"));
						
			
		}
		
		// for the variants *****************************
		// ModBlockPlanksEW
		planksEW = new ModBlockPlanksEW();
		GameRegistry.register(planksEW);

		ItemMultiTexture item = new ItemMultiTexture(planksEW, planksEW, ModBlockPlanksEW.subTypes);
		item.setRegistryName(planksEW.getRegistryName());
		
		GameRegistry.register(item);

		StateMapperBase b = new DefaultStateMapper();
		BlockStateContainer bsc = planksEW.getBlockState();

		ImmutableList<IBlockState> values = bsc.getValidStates();
		for(IBlockState state : values) {
			String str = b.getPropertyString(state.getProperties());
			_registerBlockItemModelForMeta(planksEW, planksEW.getMetaFromState(state), str);
			
		}
		
		// ModBlockWainsCorner ***********************************
		wainsCorner = new ModBlockWainsCorner();
		GameRegistry.register(wainsCorner);
		// using item , b , bsc, values  from above fix this
		item = new ItemMultiTexture(wainsCorner, wainsCorner, ModBlockWainsCorner.subTypes);
		item.setRegistryName(wainsCorner.getRegistryName());
				
		GameRegistry.register(item);

		b = new DefaultStateMapper();
		bsc = wainsCorner.getBlockState();
		values = bsc.getValidStates();
		for(IBlockState state : values) {
			String str = b.getPropertyString(state.getProperties());
			_registerBlockItemModelForMeta(wainsCorner, wainsCorner.getMetaFromState(state), str);
		}
		
		
		// ModBlockTudorSet ************************************
		tudorSet = new ModBlockTudorSet();
		GameRegistry.register(tudorSet);
		// using item , b , bsc, values  from above fix this
		item = new ItemMultiTexture(tudorSet, tudorSet, new String[] {"s0b0", "s0b1", "s0b2", "s0b3"});
		
		item.setRegistryName(tudorSet.getRegistryName());
				
		GameRegistry.register(item);

		b = new DefaultStateMapper();
		bsc = tudorSet.getBlockState();
		values = bsc.getValidStates();
		

		//System.out.println("##############################");
		for(IBlockState state : values) {
			String str = b.getPropertyString(state.getProperties());

			//System.out.println(tudorSet.getMetaFromState(state)+" : "+ str);

			_registerBlockItemModelForMeta(tudorSet, tudorSet.getMetaFromState(state), str);
		}
		
		//System.out.println("##############################");
				
	}
	
	
	
	// from Draco18s Minecraft Forge forum
	private static void _registerBlockItemModelForMeta(Block block, int metadata, String variant) {
		final Item item = Item.getItemFromBlock(block);
		if (item != null) {
			_registerItemModelForMeta(item, metadata, variant);
		}
	}
	
	private static void _registerItemModelForMeta(Item item, int metadata, String variant) {
		ModelResourceLocation res = new ModelResourceLocation(item.getRegistryName(), variant);
		_registerItemModelForMeta(item, metadata, res);
	}

	private static void _registerItemModelForMeta(Item item, int metadata, ModelResourceLocation modelResourceLocation) {
		ModelLoader.setCustomModelResourceLocation(item, metadata, modelResourceLocation);
	}
	

	

}

For ModBlockTudorSet; it has to properties "facing" and a custom "style".    In the inventory i get four blocks, wrong models , correct names from the string when creating the ItemMultiTexture .  There is only one Blockstate ModBlockTudorSet.json, that seems to be fine for the block (i tested it with a hammer that runs through all 16 metas)     When the block is placed, it faces the player, but it is always style "s0b0" no matter which block i pick in the inventory.  It have watched registers all the states, but only the four show up in inventory, why not all 16?  dosn't matter how many entries in the   MultiTexture string.  What i am envisioning is four blocks in the inventory, 1 for each "style" the placement takes care of setting the facing.  Thanks in advance

Posted

Resolved:

 

ModBlockTudorSet.class

    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list)
    {
    	// item , amount, meta
        list.add(new ItemStack(itemIn));
        list.add(new ItemStack(itemIn, 1, 4));
        list.add(new ItemStack(itemIn, 1, 8));
        list.add(new ItemStack(itemIn, 1, 12));
    }

 

ModBlocksInit.class

		// ModBlockTudorSet ************************************
		tudorSet = new ModBlockTudorSet();
		GameRegistry.register(tudorSet);

		item = new ItemMultiTexture(tudorSet, tudorSet, ModBlockTudorSet.subTypes;
		
		item.setRegistryName(tudorSet.getRegistryName());
				
		GameRegistry.register(item);
		_registerBlockItemModelForMeta(tudorSet, 0, "facing=east,style=s0b0");
		_registerBlockItemModelForMeta(tudorSet, 4, "facing=east,style=s0b1");
		_registerBlockItemModelForMeta(tudorSet, 8, "facing=east,style=s0b2");
		_registerBlockItemModelForMeta(tudorSet, 12, "facing=east,style=s0b3");

 

i'm sure there is a cleaner way to get the meta strings

Posted

You mean?

for(IBlockState state : values) {
	String str = mapper.getPropertyString(state.getProperties());
	_registerBlockItemModelForMeta(block, block.getMetaFromState(state), str);
}

There's a reason I wrote registerBlockWithCustomItem(...)

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

When i did that, the 4  inventory blocks end up showing the blank side of the block, and all with the same name.  But they do place the correct block, with the correct name.

 

Why do i want to register ALL valid states as an item, when i only need the 4?

Posted

You don't. You only need to register the states that will exist as an item.  I'm not sure I wrote a helper function that falls between "all states exist as an item" and "completely custom statemapper" but adding it shouldn't be too difficult.
Just don't do it as you had, where the strings are specified next to the item registration. You want a generic way of handling it so that the item/block can specify.

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

Now im really confused. 

 

1) I found out the getsubBlocks() in the block is never called, so i am not sure how then inventory knows it will be using 4 blocks.

2) when i hard coded (which does place the correct blocks with meta, all tho all have the same name)

		_registerBlockItemModelForMeta(tudorSet, 0, "facing=east,style=s0b0");
		_registerBlockItemModelForMeta(tudorSet, 4, "facing=east,style=s0b1");
		_registerBlockItemModelForMeta(tudorSet, 8, "facing=east,style=s0b2");
		_registerBlockItemModelForMeta(tudorSet, 12, "facing=east,style=s0b3");

the metas' do not match the state from the block , meta 0 is not "facing=east,style=s0b0" , in the block it is "facing=south,style=s0b0."   If i use any other meta values , i get the missing texture block in the inventory.What are these metas' ?

3) the facing seems to mean the facing on the block in the inventory panel, east is the left face , north is the right face

 

i'm beginning to miss 1.7 :(

Posted
1 minute ago, blinky000 said:

Now im really confused. 

 

1) I found out the getsubBlocks() in the block is never called, so i am not sure how then inventory knows it will be using 4 blocks.

Again, that method is only used for populating the Creative inventory.

1 minute ago, blinky000 said:

2) when i hard coded (which does place the correct blocks with meta, all tho all have the same name)


		_registerBlockItemModelForMeta(tudorSet, 0, "facing=east,style=s0b0");
		_registerBlockItemModelForMeta(tudorSet, 4, "facing=east,style=s0b1");
		_registerBlockItemModelForMeta(tudorSet, 8, "facing=east,style=s0b2");
		_registerBlockItemModelForMeta(tudorSet, 12, "facing=east,style=s0b3");

the metas' do not match the state from the block , meta 0 is not "facing=east,style=s0b0" , in the block it is "facing=south,style=s0b0."   If i use any other meta values , i get the missing texture block in the inventory.What are these metas' ?

Name: you need to override the getUnlocalizedName method in your item in order to supply a name that can be localized.

Meta: I don't understand your question

 

1 minute ago, blinky000 said:

3) the facing seems to mean the facing on the block in the inventory panel, east is the left face , north is the right face

I am not sure what you want to know here

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

The meta data i used when hard coding 0,4,8,12 and the state strings,  do not match the meta and  states in the block.  In the tudor block, meta 0 gives a state of "facing=south,style=s0b0".  If i hard code the meta and state from the block, i get the missing "texture" texture in the inventory.  If i change the hard coded metadata to any other numbers beside 0,4,8,12 , i get the missing "texture". 

 

I don't understand why using the metadata and block states that match the block don't work.

 

 

"Name: you need to override the getUnlocalizedName method in your item in order to supply a name that can be localized. "

I don't have an "item" block, do you mean in the "block" , and return an unlocalized name according to the state?

 

 

i'm probably not explaining very well

Posted (edited)
17 minutes ago, blinky000 said:

If i hard code the meta and state from the block, i get the missing "texture" texture in the inventory.  If i change the hard coded metadata to any other numbers beside 0,4,8,12 , i get the missing "texture". 

Probably because the item is still being given to the inventory as 0/4/8/12 but you registered an item renderer for a different metadata value.

i.e. this chunk:

    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list)
    {
    	// item , amount, meta
        list.add(new ItemStack(itemIn));
        list.add(new ItemStack(itemIn, 1, 4));
        list.add(new ItemStack(itemIn, 1, 8));
        list.add(new ItemStack(itemIn, 1, 12));
    }

If you're going to change your metadata values in one place, you need to change them in the other.  THIS IS IMPORTANT, IT IS NOT ARBITRARY.

Most importantly, you need to use the metadata values that your block actually drops when broken.

 

17 minutes ago, blinky000 said:

I don't have an "item" block, do you mean in the "block" , and return an unlocalized name according to the state?

If it exists in your inventory, then you have an item.

item = new ItemMultiTexture(tudorSet, tudorSet, ModBlockTudorSet.subTypes;

Surprise, there it is.

In order to override the unlocalized name you need a custom ItemBlock class.  Surprise!

Alternatively, pass a name function to the ItemMultiTexture's constructor.  E.g. here is how vanilla handles the stone variants:

        registerItemBlock(Blocks.STONE, (new ItemMultiTexture(Blocks.STONE, Blocks.STONE, new Function<ItemStack, String>()
        {
            @Nullable
            public String apply(@Nullable ItemStack p_apply_1_)
            {
                return BlockStone.EnumType.byMetadata(p_apply_1_.getMetadata()).getUnlocalizedName();
            }
        })).setUnlocalizedName("stone"));

 

Edited by Draco18s
  • Like 1

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
    @SideOnly(Side.CLIENT)
    public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list)
    {
    	System.out.println("getSubBlocks");
    	// item , amount, meta
        list.add(new ItemStack(itemIn,1,3));
        list.add(new ItemStack(itemIn, 1, 7));
        list.add(new ItemStack(itemIn, 1, 11));
        list.add(new ItemStack(itemIn, 1, 15));
    }
		_registerBlockItemModelForMeta(tudorSet, 3, "facing=east,style=s0b0");
		_registerBlockItemModelForMeta(tudorSet, 7, "facing=east,style=s0b1");
		_registerBlockItemModelForMeta(tudorSet, 11, "facing=east,style=s0b2");
		_registerBlockItemModelForMeta(tudorSet, 15, "facing=east,style=s0b3");

made them match, all looks good except unlocalized names, which i should take care of by creating my own itemBlock

 

Posted

This is what i came up with:

	// call from blockInit
	registerMultiPropertyBlock(new ModBlockTudorSet());
	
	private static void registerMultiPropertyBlock(ModBlock mBlock){
		GameRegistry.register(mBlock);

		// need to make a new class for item, extend ItemMultiTexture
		ItemMultiTexture item = new ItemMultiTexture(mBlock, mBlock, mBlock.getSubTypes());
		item.setRegistryName(mBlock.getRegistryName());
		GameRegistry.register(item);
		
		StateMapperBase b = new DefaultStateMapper();
		List<ItemStack> list = new ArrayList<ItemStack>();
		mBlock.getSubBlocks(item, Main.CREATIVE_TAB, list);
		for(ItemStack iStackItem : list){
			int meta = iStackItem.getMetadata();
			String str = b.getPropertyString(mBlock.getStateFromMeta(meta).getProperties());
			_registerBlockItemModelForMeta(mBlock, meta, str);
		}

Again thanks :D

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.