Jump to content

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


Senitiel
 Share

Recommended Posts

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?

Link to comment
Share on other sites

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.

Link to comment
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.
Note: Your post will require moderator approval before it will be visible.

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.

 Share



×
×
  • Create New...

Important Information

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