Posted May 9, 201312 yr 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? http://imageshack.us/a/img707/2757/senitielsspacemarinemod.png[/img]
May 9, 201312 yr Author 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. http://imageshack.us/a/img707/2757/senitielsspacemarinemod.png[/img]
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.