Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.15.2] Error sending packets to the client?


Recommended Posts

Ive tried to get my old Message System to work. When i send a Message from client to server it will work, when i send a Message vom server to Client I get anError:

Can somebody help me.

image.png.e0223902780d7a5fade2a76626cedbe2.png

 

My Packet Handler:

package com.wilpito.wilpitomod.handler;


import com.wilpito.wilpitomod.network.MessageTileBase;

import net.minecraft.client.Minecraft;
import net.minecraft.network.NetworkManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkDirection;
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.simple.SimpleChannel;


public class PacketHandler {
	private static final String PROTICOL_VERSION = "1";
    public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(
    		new ResourceLocation("wilpitomod","main") 
    		,() -> PROTICOL_VERSION
    		, PROTICOL_VERSION::equals
    		, PROTICOL_VERSION::equals);

	public static final int TILEMSG=11;

	
	public PacketHandler()
	{
		CHANNEL.registerMessage(TILEMSG, MessageTileBase.class, MessageTileBase::encode, MessageTileBase::new,MessageTileBase::handle);		
	}
	
	public static void TileMsgSend(MessageTileBase msg,World World){
		if (!World.isRemote) return;
		CHANNEL.sendToServer(msg);
	}
	public static void TileMsgSendtoClient(MessageTileBase msg, World worldIn){
		
		NetworkManager manager = Minecraft.getInstance().getConnection().getNetworkManager();
		
			CHANNEL.sendTo(msg, manager, NetworkDirection.PLAY_TO_CLIENT);
		}
	}
}

My Message:

package com.wilpito.wilpitomod.network;

import net.minecraft.network.PacketBuffer;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.network.NetworkEvent;

import java.util.function.Supplier;

public class MessageTileBase { 
	// A default constructor is always required
	public MessageTileBase(){}
	// Coordinates of Tile
	protected BlockPos pos;
	protected String text;
	
	
	public MessageTileBase(BlockPos pos, String text){
		this.pos = pos;
		this.text = text;		
	}
	
    public MessageTileBase(PacketBuffer buf) {
		pos = buf.readBlockPos();
	    text = buf.readString();
    }
    
    public  void encode(PacketBuffer buf) {
    	buf.writeBlockPos(pos);
 	    buf.writeString(text);
 	    //.. Code on Client Side will folw hier..
    }
    public void handle(Supplier<NetworkEvent.Context> context) {
    	if (context == null) {
    		
    	}
    }
}

I Create the Messaeg for testing in My Tile Entity Tick() with 

PacketHandler.TileMsgSendtoClient(new MessageTileBase(this.pos ,"TEST"),this.world);

 

This will work when activating Message from Client to server:


PacketHandler.TileMsgSend(new MessageTileBase(new BlockPos(0,0,0),"TEST"),Minecraft.getInstance().world);

 

I think something is wrong with the network manager.

        NetworkManager manager = Minecraft.getInstance().getConnection().getNetworkManager();       
        CHANNEL.sendTo(msg, manager, NetworkDirection.PLAY_TO_CLIENT);
 

Link to post
Share on other sites

sendTo is used to send to a player (i.e. server to client). Use sendToServer to send something to the server.

 

Your packet code is also strange, you create your channel in a static initializer, this should happen in FMLCommonSetupEvent.

Moreover you then register your messages in the constructor, which means if there are multiple PacketHandler instances they all will register to the same channel. This probably doesn't happen in your code, but its still a strange design.

Link to post
Share on other sites

Oky it might be a little bit strange. But i dont find an easy way to do this elsewhere.

Normaly i have 6 Packet handler on the same CHANNEL.In my old Mod on 1.8 it works.

Do you have an example with will work? In this forrum i only found the message class and the command line for CHANNEL.registerMessage.

 

I kow the direction, but in this time i need to send update Information from Server to Client. In an other case i will send Setup Informations from Client to server. So i Need both directions.

Current problem:

i Have a tileEntity on server with wil be updatte automatiocally with new Energy by transfering Energy from nighbors. When i Open the  Client Screen the current value should be shown on Scrren and can be changed by server before the Screen close. The client can't change the energy level.

 

Link to post
Share on other sites
1 hour ago, wilpito said:

i Have a tileEntity on server with wil be updatte automatiocally with new Energy by transfering Energy from nighbors. When i Open the  Client Screen the current value should be shown on Scrren and can be changed by server before the Screen close. The client can't change the energy level.

In this case the syncing should be done on the Container level, not the tile entity. It only needs to sync while the GUI is open.

 

1 hour ago, wilpito said:

Oky it might be a little bit strange. But i dont find an easy way to do this elsewhere.

Normaly i have 6 Packet handler on the same CHANNEL.In my old Mod on 1.8 it works.

Do you have an example with will work? In this forrum i only found the message class and the command line for CHANNEL.registerMessage.

What are you talking about?

Link to post
Share on other sites
Quote

In this case the syncing should be done on the Container level, not the tile entity. It only needs to sync while the GUI is open.

Okay you are right. But the only way i know is to send an explicit message to sync between Client and Server. In old versions i've send an update when Tile value have be changed. This may have slow down perfomence.

 

At this time i down't know how to do a sync for some values to Client Container it in 1.15.2. I'm serching for anExample for do this in 1.15.2 about 3 days... but find nothing with will work.

It might verry helpfull to have some complete examples or an complete small mod to look at the code.

 

 

 

 

 

Link to post
Share on other sites

Override detectAndSendChanges in your Container class. Check if the value has changed since the last time the method was called. If so, send a custom packet to the player looking at the container (either store it yourself or use Container#listeners).

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

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



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.