Jump to content

[Half - solved] Key handler called twice, crash on the server side


Recommended Posts

Posted

I have a problem i couldn't solve on my own for more than a day. It seems, that keyHandler code is called not only on the client side, but also on the server side, which sucks. I wanted to use this keybind to toggle flag, which means that two packets are sent and the flag is toggled twice, staying the same.

 

Plus, it makes "real server" crash, if any player presses the button.

 

Key handler code:

 

 

import net.minecraft.client.settings.KeyBinding;
import cpw.mods.fml.client.registry.KeyBindingRegistry.KeyHandler;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.TickType;
import cpw.mods.fml.relauncher.Side;


public class KeyHandlerFireMode extends KeyHandler 
{
public static final String label = "Senitiels Space Marine Keys";
 public KeyHandlerFireMode(KeyBinding[] keyBindings, boolean[] isRepeat) 
 {
  super(keyBindings, isRepeat);
 }

 @Override
 public String getLabel() 
 {
  return label;
 }

 @Override
 public void keyDown(EnumSet<TickType> types, KeyBinding kb, boolean tickEnd, boolean isRepeat) 
 {
 }

 @Override
 public void keyUp(EnumSet<TickType> types, KeyBinding kb, boolean tickEnd) 
 {
           //It doesn't matter wheather or not this line's here. I also tried "getSide" method, to no avail. 
	 if(FMLCommonHandler.instance().getEffectiveSide()==Side.CLIENT) 
	 {
		 System.out.println("Key up");
		 FireModeHandler.sendPacket();

	 }
 }
 //FireModeHandler.switchFireMode();
 @Override
 public EnumSet<TickType> ticks() 
 {
	 return EnumSet.of(TickType.CLIENT);
 }


}

 

 

 

Client Proxy

 

 

import net.minecraft.client.settings.KeyBinding;
import net.minecraftforge.client.MinecraftForgeClient;
import cpw.mods.fml.client.registry.KeyBindingRegistry;
import cpw.mods.fml.client.registry.KeyBindingRegistry.KeyHandler;



        public void registerKeys() //overriden from CommonProxy, which has an empty method of the same name
        {
            KeyBinding[] fireModeBind = { new KeyBinding(KeyHandlerFireMode.label, Keyboard.KEY_X)};
            boolean[] fireModeRepeatFlags = { false};
            KeyHandler fireMode = new KeyHandlerFireMode(fireModeBind, fireModeRepeatFlags);
            KeyBindingRegistry.registerKeyBinding(fireMode);
        }

 

 

 

Packet Handler

 

 

@Override
public void onPacketData(INetworkManager manager,
		Packet250CustomPayload packet, Player player) {

        if (packet.channel.equals(JET)) {
            ItemJetBoots.handlePacket(packet,player);
    }
        if(packet.channel.equals(FIST))
        {
        	ItemPowerFist.handleFistPacket(packet, player); 
        }
        //The two cases above work normally when I start a server and then connect to it,
//but the case below causes server to crash, telling EntityClientPlayerMP is unknown server side
        if(packet.channel.equals(FIRE))
        {
        	FireModeHandler.handlePacket(packet, player);
        }

}

 

 

 

Post Init method of main mod class

 

 

     @PostInit
     public void postInit(FMLPostInitializationEvent event) throws Exception {
// ...
    	 proxy.registerKeys();

 

 

 

Did anybody experience similar problem? Does anyone know of how to correctly do a keybinding? Is it a FML bug perhaps, because I'm not sure if client/server side checkers work correctly now?

Posted

Thanks, diesieben07, I couldn't figure it out, ant it turns out to be so simple.

Solution

 

 

 @Override
 public void keyUp(EnumSet<TickType> types, KeyBinding kb, boolean tickEnd) 
 {
	 if(tickEnd)
	 {
		 System.out.println("Key up");
		 FireModeHandler.sendPacket();
	 }
 }

 

 

 

This, however, leaves me completely idea-less when it comes to server crash.

 

Crash-log

 

 

[sEVERE] Encountered an unexpected exception NoClassDefFoundError
java.lang.NoClassDefFoundError: net/minecraft/client/entity/EntityClientPlayerMP
at mods.senitielsSpaceMarineModCode.SenitielsSpaceMarineModPacketHandler.onPacketData(SenitielsSpaceMarineModPacketHandler.java:37)
at cpw.mods.fml.common.network.NetworkRegistry.handlePacket(NetworkRegistry.java:255)
at cpw.mods.fml.common.network.NetworkRegistry.handleCustomPacket(NetworkRegistry.java:245)
at cpw.mods.fml.common.network.FMLNetworkHandler.handlePacket250Packet(FMLNetworkHandler.java:83)
at net.minecraft.network.NetServerHandler.handleCustomPayload(NetServerHandler.java:1098)
at net.minecraft.network.packet.Packet250CustomPayload.processPacket(Packet250CustomPayload.java:70)
at net.minecraft.network.TcpConnection.processReadPackets(TcpConnection.java:461)
at net.minecraft.network.NetServerHandler.networkTick(NetServerHandler.java:134)
at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:53)
at net.minecraft.server.dedicated.DedicatedServerListenThread.networkTick(DedicatedServerListenThread.java:34)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:675)
at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:275)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:571)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:469)
at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
Caused by: java.lang.ClassNotFoundException: net.minecraft.client.entity.EntityClientPlayerMP
at cpw.mods.fml.relauncher.RelaunchClassLoader.findClass(RelaunchClassLoader.java:238)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 15 more
Caused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/entity/EntityClientPlayerMP for invalid side SERVER
at cpw.mods.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:50)
at cpw.mods.fml.relauncher.RelaunchClassLoader.runTransformers(RelaunchClassLoader.java:352)
at cpw.mods.fml.relauncher.RelaunchClassLoader.findClass(RelaunchClassLoader.java:225)
... 17 more

 

 

 

Mentioned line 37 in packet handler:

 

 

 

        if(packet.channel.equals(FIRE))
        {
        	FireModeHandler.handlePacket(packet, player);
        }

 

 

FireModeHanlder.handlePacket is blank

 

 

public static void handlePacket(Packet250CustomPayload packet, Player player)
{
        }

 

 

 

And send packet, called on key press looks like this:

 

 

 

public static void sendPacket()
{
	EntityPlayer player = Minecraft.getMinecraft().thePlayer;
	ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(byteOutputStream);
        try
        {
        	dataOutputStream.writeInt(player.entityId);
        }
        catch (Exception e)
        {
        	e.printStackTrace();
        }
	Packet250CustomPayload packet = new Packet250CustomPayload(SenitielsSpaceMarineModPacketHandler.FIRE, byteOutputStream.toByteArray());

	FMLClientHandler.instance().sendPacket(packet);
}

 

 

 

I'm not sure why it fails. I've been sending packets before, but then I always had EntityPlayer from onUpdate and onItemRightClick methods, I didn't use Minecraft.getMinecraft() before.

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

    • Reach Out To Rapid Digital: What sapp Info: +1 41 4 80 7 14 85 Email INFO: rap iddi gita lrecov ery @ exe cs. com Hello, my name is Jayson, and I’m 35 years old from the United Kingdom. My family and I recently endured an incredibly challenging experience that I wouldn’t wish on anyone. We became victims of a cryptocurrency investment fraud scheme that saw us lose a staggering $807,000 in USDT and Bitcoins. The fraudsters had created a convincing facade, and we were lured into investing, only to discover later that the platform was a complete scam. We were left devastated, not just financially, but emotionally, as we had trusted these people and believed in the legitimacy of the investment. After the initial shock wore off, we desperately searched for ways to recover the lost funds. It seemed like an impossible task, and we felt as though there was no hope. That’s when, by sheer luck, we stumbled across a post about Rapid Digital Recovery, a cryptocurrency and funds recovery organization with a proven track record in cybersecurity and fraud recovery. We decided to reach out to them, and from the first interaction, we were impressed with their professionalism and transparency. They explained the recovery process in detail and reassured us that they had the skills and expertise to track down the perpetrators and recover our funds. This gave us a renewed sense of hope, something we hadn’t felt in months. What truly stood out during our experience with Rapid Digital Recovery was their dedication to the recovery process. The team went above and beyond, using sophisticated tracking tools and cyber forensics to gather critical information. Within a matter of weeks, they had successfully located the funds and traced the scam back to the fraudsters responsible. They worked with the authorities to ensure the criminals were held accountable for their actions. To our relief, the team at Rapid Digital Recovery was able to recover every single penny we had lost. The funds were returned in full, and the sense of closure we felt was invaluable. We couldn’t have imagined such a positive outcome in the early stages of our recovery journey, and we are deeply grateful for the work they did. If you ever find yourself in a similar situation, I highly recommend contacting Rapid Digital Recovery. Their expertise, transparency, and dedication to their clients make them the go-to choice for anyone seeking to recover lost cryptocurrency or funds. They truly gave us back our financial future.  
    • This is my first time modding anything, so maybe just skill issue. I'm using Forge 54.0.12 and Temurin 21.0.5+11-LTS I wanted to create a custom keybind and to check whether it works I'd like to send a chat message. I tried using Minecraft.getInstance().player.sendSystemMessage(Component.literal("test")); but IntelliJ couldnt resolve sendSystemMessage(...). Since I saw people using it in earlier versions, I tried the same thing with 1.20.6(- 50.1.0), where it works fine, now I can't figure out if this is intentional and whether there are other options for sending chat messages. On that note, is there more documentation than https://docs.minecraftforge.net/en/1.21.x/? It seems very incomplete compared to something like the Oracle Java docs
    • Hi, i'm having this error and I wanna fix it. we try: -Reload drivers -Eliminate .minecraft -Eliminate Java -Restart launcher -Verify if minecraft is using gpu -Mods  in .minecraft is empty -Install the latest and recomended version of forge idk what i have to do, help me pls. the lastest log is: https://mclo.gs/WAMao8x  
    • Read the FAQ, Rule #2. (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/)  
  • Topics

×
×
  • Create New...

Important Information

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