Jump to content

Keyboard input


EducationalPurposes

Recommended Posts

Hi,

 

As the title says I need to know if a player presses a key or not. Luckily, we got lwjgl, so that is not really a problem for me.

But I dont know how to follow a player's keystrokes. For example, currently I have setup a system, that adds the players to a list who do a certain thing, but I am really unsure how to follow that specific player's key stuff.

 

I know you must follow the keystrokes client side, but I dont know how I can get on someone's client side or anything.

 

So a recap:how can I get into a player's client?

 

Im not expecting the practical work-out, but I do really like to see some theory what steps I should follow. Not in great detail or anything, but just something that you guys point me in the right direction.

 

Thanks, EducationalPurposes

 

I am fairly new to Java and modding, so my answers are not always 100% correct. Sorry for that!

Link to comment
Share on other sites

That is a really good tutorial about keybinding, thanks for that. But what Im looking for is for every key on your keyboard, and then keybinding isnt a real good idea.

 

Thanks for the effort though!

I am fairly new to Java and modding, so my answers are not always 100% correct. Sorry for that!

Link to comment
Share on other sites

Hi

 

If I understand you right, you know how to read keypresses from Keyboard, but you're not sure how to get them from each client to the server?

 

You need to use a custom packet for that - each time the client presses your key of interest, you need to read that on the client (eg in a tick handler), send a packet to the server, then have the server process the packet.

 

http://www.minecraftforge.net/wiki/Packet_Handling

 

-TGG

 

PS this link might also be useful

http://greyminecraftcoder.blogspot.com.au/2013/10/user-input.html

Link to comment
Share on other sites

Hi

 

If I understand you right, you know how to read keypresses from Keyboard, but you're not sure how to get them from each client to the server?

 

You need to use a custom packet for that - each time the client presses your key of interest, you need to read that on the client (eg in a tick handler), send a packet to the server, then have the server process the packet.

 

http://www.minecraftforge.net/wiki/Packet_Handling

 

-TGG

 

PS this link might also be useful

http://greyminecraftcoder.blogspot.com.au/2013/10/user-input.html

 

That helped quite a bit, thank you for that. But I dont get how you can the actual key input of the client.

I have my tick handler implement ITickHandler, but Im very unsure how to do custom stuff to the actual client.

 

If I understand that, I think I get a big part of minecraft modding, since I never use  those sided Proxies and stuff.

I am fairly new to Java and modding, so my answers are not always 100% correct. Sorry for that!

Link to comment
Share on other sites

Hi

 

The code would look something like

 

boolean myKeyOfInterestIsDown = false;

[code]MyClientTickHandlerMethod() {
  boolean newKeyDown = Keyboard.isKeyDown(MY_KEY_OF_INTEREST);
  if (newKeyDown) {
    if (!myKeyOfInterestIsDown) {
       //send a custom packet to the server to say "I have just received a keypress for MY_KEY_OF_INTEREST" - i.e. when the key goes from up to down
    }
  }
  myKeyOfInterestIsDown = newKeyDown;
}

[/code]

 

look at the start of KeyBoard for the suitable keycodes

eg

public static final int KEY_Q              = 0x10;

 

-->Keyboard.isKeyDown(KEY_Q);

 

There are two main ways I've found helpful when interacting with the vanilla code.

The first is to use one of the many Forge registries or hooks, to add custom blocks, items, or get called when particular things happen.  This is very common.  Unfortunately the documentation is a bit patchy so it's not always easy to know what's available.  A typical strategy I use is to identify an item or block or whatever that does something similar to what I need.  Then I'll look at the vanilla code and trace it through until I figure out how it works, and usually I will stumble over a forge hook or event along the way.

 

The second strategy which is harder and less robust is to override an existing vanilla class and replace any references to it from other vanilla code.  For example, you can overwrite GameSettings.keyBindForward with your own class derived from KeyBinding.  This is usually not necessary and is often not possible.

 

A third strategy which I haven't had to use yet is to edit the base classes to overwrite the vanilla.  ("base mod")  This will probably break everytime Minecraft is updated.

 

A fourth strategy you will hear occasionally is reflection / ASM.  I would avoid this like the plague because it is fragile and very hard to debug.  I had my fill of self-modifying code back in my days of programming assembly and am not keen to go back!!

 

-TGG

 

 

 

 

 

Link to comment
Share on other sites

I'd recommend using KeyHandler, for compatibility, ease of use, and auto registration of keys into the controls menu, for player convenience.

 

@TheGreyGhost:

Your second, third and fourth strategies would basically break compatibility the same way. They do roughly the same thing.

But reflection is different from ASM.

Reflection is a powerful type of code to make mods compatible between each other without dependency. A practical example is the Forge annotations, those are loaded with reflection. Manipulating classes at runtime, that is the goal of reflection.

ASM is an extremely powerful tool (to break everything without knowing :P) relying on bytecode (read: manipulating lines of code, at an "internal" level). If you master it, you can change as much things as Forge without shipping Minecraft code.

A practical example is the Forge event system, which use @ForgeSubscribe in a mod class to hook with reflection, then apply changes with ASM.

Link to comment
Share on other sites

Hi

 

I'd recommend using KeyHandler, for compatibility, ease of use, and auto registration of keys into the controls menu, for player convenience.

Wish I'd heard of that before.  Do you have a link with more information on it, and where/how it's called from the vanilla code?

 

@TheGreyGhost:

Your second, third and fourth strategies would basically break compatibility the same way. They do roughly the same thing.

Well, the difference to my mind is that the second strategy (overriding a single method) is less likely to be broken if the vanilla classes are updated, compared with overwriting the entire class with a modified copy, or god forbid relying on the bytecode being the same.  But I agree it's not as robust as using the forge methods.

 

But reflection is different from ASM.

Reflection is a powerful type of code to make mods compatible between each other without dependency. A practical example is the Forge annotations, those are loaded with reflection. Manipulating classes at runtime, that is the goal of reflection.

ASM is an extremely powerful tool (to break everything without knowing ) relying on bytecode (read: manipulating lines of code, at an "internal" level). If you master it, you can change as much things as Forge without shipping Minecraft code.

A practical example is the Forge event system, which use @ForgeSubscribe in a mod class to hook with reflection, then apply changes with ASM.

I agree with you that both ASM and reflection are very powerful tools in the hands of the Java uebercoder, unfortunately those ranks don't include me :-)  I also doubt that the extra flexibility is really necessary unless you're doing forge-like magic, i.e. you need to link in other classes at runtime and you don't know in advance what they are.  (I understand the ethical objections against shipping even small parts of the Minecraft code, to be honest I really doubt that the Mojang folks would care that much given how long Forge was doing it).

 

At the end of the day I prefer to use chainsaws for cutting trees rather than trimming my nails, and I struggle enough with getting my code to work as it is without trying to get my mind around the extra runtime complexity :-).  Maybe once I've got a couple years Java experience I'll think differently...

 

-TGG

 

 

 

Link to comment
Share on other sites

Well the KeyHandler is a ready-to-use class implementing a client tick handler.

Its use is basically explained in ThePocketSoul linked tutorial, now that i look at it.

 

@TheGreyGhost

You should consider trying reflection first, it is just "normal" code really. If you know java rules of coding, you are good to go ;)

 

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hello, I installed minecraft 1.16.2, then i downloaded forge 1.16.2-33.0.20 and it just won t open...no error message...
    • [29may2023 23:10:06.337] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, Fabu10th, --version, 1.19.3-forge-44.1.23, --gameDir, C:\Users\fabuo\AppData\Roaming\.minecraft, --assetsDir, C:\Users\fabuo\AppData\Roaming\.minecraft\assets, --assetIndex, 2, --uuid, 1f7b7b2f9e814cf4b23dfa2f0ccb79a1, --accessToken, ????????, --clientId, N2EyZmZhMTUtYjA0OC00N2RkLTg2NTgtZDM2YTUwNTZlODFj, --xuid, 2535425619212215, --userType, msa, --versionType, release, --launchTarget, forgeclient, --fml.forgeVersion, 44.1.23, --fml.mcVersion, 1.19.3, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20221207.122022] [29may2023 23:10:06.341] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 10.0.8+10.0.8+main.0ef7e830 starting: java version 17.0.3 by Microsoft; OS Windows 10 arch amd64 version 10.0 [29may2023 23:10:07.130] [main/INFO] [optifine.OptiFineTransformationService/]: OptiFineTransformationService.onLoad [29may2023 23:10:07.131] [main/INFO] [optifine.OptiFineTransformationService/]: OptiFine ZIP file URL: union:/C:/Users/fabuo/AppData/Roaming/.minecraft/mods/OptiFine_1.19.3_HD_U_I3.jar%23265!/ [29may2023 23:10:07.138] [main/INFO] [optifine.OptiFineTransformationService/]: OptiFine ZIP file: C:\Users\fabuo\AppData\Roaming\.minecraft\mods\OptiFine_1.19.3_HD_U_I3.jar [29may2023 23:10:07.140] [main/INFO] [optifine.OptiFineTransformer/]: Target.PRE_CLASS is available [29may2023 23:10:07.185] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/fabuo/AppData/Roaming/.minecraft/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2398!/ Service=ModLauncher Env=CLIENT [29may2023 23:10:07.190] [main/INFO] [optifine.OptiFineTransformationService/]: OptiFineTransformationService.initialize [29may2023 23:10:07.783] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\fabuo\AppData\Roaming\.minecraft\libraries\net\minecraftforge\fmlcore\1.19.3-44.1.23\fmlcore-1.19.3-44.1.23.jar is missing mods.toml file [29may2023 23:10:07.787] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\fabuo\AppData\Roaming\.minecraft\libraries\net\minecraftforge\javafmllanguage\1.19.3-44.1.23\javafmllanguage-1.19.3-44.1.23.jar is missing mods.toml file [29may2023 23:10:07.791] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\fabuo\AppData\Roaming\.minecraft\libraries\net\minecraftforge\lowcodelanguage\1.19.3-44.1.23\lowcodelanguage-1.19.3-44.1.23.jar is missing mods.toml file [29may2023 23:10:07.794] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\fabuo\AppData\Roaming\.minecraft\libraries\net\minecraftforge\mclanguage\1.19.3-44.1.23\mclanguage-1.19.3-44.1.23.jar is missing mods.toml file [29may2023 23:10:07.935] [main/INFO] [net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator/]: Found 8 dependencies adding them to mods collection [29may2023 23:10:08.445] [main/INFO] [optifine.OptiFineTransformationService/]: OptiFineTransformationService.transformers [29may2023 23:10:08.451] [main/INFO] [optifine.OptiFineTransformer/]: Targets: 395 [29may2023 23:10:09.288] [main/INFO] [optifine.OptiFineTransformationService/]: additionalClassesLocator: [optifine., net.optifine.] [29may2023 23:10:10.427] [main/INFO] [mixin/]: Compatibility level set to JAVA_17 [29may2023 23:10:10.610] [main/INFO] [mixin/]: Successfully loaded Mixin Connector [ca.spottedleaf.starlight.mixin.MixinConnector] [29may2023 23:10:10.610] [main/INFO] [cpw.mods.modlauncher.LaunchServiceHandler/MODLAUNCHER]: Launching target 'forgeclient' with arguments [--version, 1.19.3-forge-44.1.23, --gameDir, C:\Users\fabuo\AppData\Roaming\.minecraft, --assetsDir, C:\Users\fabuo\AppData\Roaming\.minecraft\assets, --uuid, 1f7b7b2f9e814cf4b23dfa2f0ccb79a1, --username, Fabu10th, --assetIndex, 2, --accessToken, ????????, --clientId, N2EyZmZhMTUtYjA0OC00N2RkLTg2NTgtZDM2YTUwNTZlODFj, --xuid, 2535425619212215, --userType, msa, --versionType, release] [29may2023 23:10:10.650] [main/INFO] [Rubidium/]: Loaded configuration file for Rubidium: 30 options available, 0 override(s) found [29may2023 23:10:10.684] [main/WARN] [mixin/]: Reference map 'yungsextras.refmap.json' for yungsextras.mixins.json could not be read. If this is a development environment you can ignore this message [29may2023 23:10:10.686] [main/WARN] [mixin/]: Reference map 'yungsextras.refmap.json' for yungsextras_forge.mixins.json could not be read. If this is a development environment you can ignore this message [29may2023 23:10:10.703] [main/WARN] [mixin/]: Reference map 'xlpackets.refmap.json' for xlpackets.mixins.json could not be read. If this is a development environment you can ignore this message [29may2023 23:10:10.718] [main/WARN] [mixin/]: Reference map 'configured.refmap.json' for configured.mixins.json could not be read. If this is a development environment you can ignore this message [29may2023 23:10:10.728] [main/WARN] [mixin/]: Reference map 'simplyswords-common-refmap.json' for simplyswords-common.mixins.json could not be read. If this is a development environment you can ignore this message [29may2023 23:10:10.729] [main/WARN] [mixin/]: Reference map 'simplyswords-forge-refmap.json' for simplyswords.mixins.json could not be read. If this is a development environment you can ignore this message [29may2023 23:10:10.767] [main/WARN] [mixin/]: Reference map 'apexcore.refmap.json' for apexcore.mixins.json could not be read. If this is a development environment you can ignore this message
    • I'm looking for someone who for the most part would be taking over my mods main development. With work I just can't give it the time it deserves but I think it will be a good mod to fill the void of BuildCraft while still having its own unique twist. It is currently still only on 1.16.5 only because I just haven't had the time to try and get an update plus there were features I was working on that I had wanted to hammer out first. Not to mention I'm just not very good at Java or Programming in general. I can get things done and they mostly work but I am just not skilled enough to keep my brain child alive and honestly optimized. My only real requirement is that if I choose to come back I want to be able to jump back in and do so. I have a basic outline of how I want things to work in general for the things not added yet that were planned features and I also have some started but not yet finished ideas in. I'm currently working on getting a repo up on github that has my most current code so that way its easier for everyone involved to contribute. I'm sure the best first step would be to update to the newest version of forge first before doing this to give the next person a good head start but I'm sure alot of my stuff needs rewritten anyways so I figured I'd do this now as it sits.  Any other questions or details can be worked out through messages but if you are interested please drop a reply. Here is the link to the curseforge page which you can use to get to the github repo: https://www.curseforge.com/minecraft/mc-mods/mechanicraft
    • Hi, I am new to minecraft modding and have been following this guide on youtube (https://www.youtube.com/watch?v=aYH_81TXJxg&t=15s) and the textures for the modded items are not showing up. The game launches successfully and no errors are given. When I copied from the original GitHub it works perfectly but mine doesn't even though as far as I am aware they are exactly the same. Can someone please tell me what I am doing wrong? My code GitHub: https://github.com/BitFireStream/TutorialMod The guides GitHub: https://github.com/Tutorials-By-Kaupenjoe/Forge-Tutorial-1.19.3/tree/2-items
    • Hello. I have encountered an issue whist attempting to play on Forge 1.19.4 on the latest stable release beta as of 05/29/23. Everytime I attempt to load Minecraft Forge with mods installed, I recieve the following crash report:    The game crashed whilst rendering overlay Error: java.lang.IllegalStateException: Failed to create model for minecraft:hanging_sign   I have tried: Deleting all post-install custom installations Reinstalling Minecraft (deleting all files within Roaming/.minecraft folder and reinstalling) Updating Java Runtime Environment Uninstalling Java via Control Panel and downloading and installing newest recommended version (Java 8 Update 371)   Below I have included both the crash log I recieved, as well as the debug.log. I hope someone can help! crash-client.txt debug.log
  • Topics

×
×
  • Create New...

Important Information

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