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

[SOLVED] How can I do somehing with Keybindings?


Recommended Posts

Posted (edited)
43 minutes ago, Davidthemodder said:

I want to make the player to do somethingwhen I press V. How?

  1. create the keybinding
  2. Register the keybinding with ClientRegistry#registerKeyBinding in the FMLClientSetupEvent
  3. uses the ClientTickEvent to check whether your KeyBinding is pressed and send a custom packet to the server (using a SimpleChannel)
  4. execute the code / your action in the handle method of your custom message (packet)

okay the whole thing was very theoretical, here a practical example

KeyBinding
Registration
ClientTickEvent
Message (Packet)

Edited by Luis_ST
Link to post
Share on other sites
On 5/15/2021 at 3:51 PM, diesieben07 said:

Subscribe to ClientTickEvent, check if the phase is START. Check if your key binding has been pressed and if so, perform whatever action you want.

Thank you for your help.

On 5/15/2021 at 3:56 PM, Luis_ST said:
  1. create the keybinding
  2. Register the keybinding with ClientRegistry#registerKeyBinding in the FMLClientSetupEvent
  3. uses the ClientTickEvent to check whether your KeyBinding is pressed and send a custom packet to the server (using a SimpleChannel)
  4. execute the code / your action in the handle method of your custom message (packet)

okay the whole thing was very theoretical, here a practical example

KeyBinding
Registration
ClientTickEvent
Message (Packet)

And without you I would never have found out how to run the code.

Link to post
Share on other sites
On 5/15/2021 at 3:56 PM, Luis_ST said:
  1. create the keybinding
  2. Register the keybinding with ClientRegistry#registerKeyBinding in the FMLClientSetupEvent
  3. uses the ClientTickEvent to check whether your KeyBinding is pressed and send a custom packet to the server (using a SimpleChannel)
  4. execute the code / your action in the handle method of your custom message (packet)

okay the whole thing was very theoretical, here a practical example

KeyBinding
Registration
ClientTickEvent
Message (Packet)

I did everything like you did but it always crashes when I try it.

Link to post
Share on other sites

public static final KeyBinding KEY = new KeyBinding("Fly",GLFW.GLFW_KEY_V, "Ultimate Sheep Mod");

@SubscribeEvent public static void doClientSetup(FMLClientSetupEvent event){ ClientRegistry.registerKeyBinding(UltimateSheepMod.KEY); }

 

@SubscribeEvent public static void fly(TickEvent.ClientTickEvent event){ if(event.phase == TickEvent.Phase.START){ if(UltimateSheepMod.KEY.isKeyDown()){ ModPacketHandler.simpleChannel.sendToServer(new FlyActivateMessage()); } } }

 

public class ModPacketHandler { private static final String version = "1"; private static int id = 0; public static SimpleChannel simpleChannel; public static void init(){ simpleChannel = NetworkRegistry.newSimpleChannel(new ResourceLocation("usm:simple_channel"), () -> version, version::equals, version::equals); simpleChannel.registerMessage(id++, FlyActivateMessage.class, FlyActivateMessage::encode, FlyActivateMessage::decode, FlyActivateMessage::handle, Optional.of(NetworkDirection.PLAY_TO_SERVER)); } }

 

public class FlyActivateMessage { public static void encode(FlyActivateMessage message,PacketBuffer packetBuffer) { } public static FlyActivateMessage decode(PacketBuffer packetBuffer) { return new FlyActivateMessage(); } public static void handle(FlyActivateMessage message, Supplier<NetworkEvent.Context> networkContext) { ServerPlayerEntity player = networkContext.get().getSender(); networkContext.get().enqueueWork(() -> { }); networkContext.get().setPacketHandled(true); } }

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

I did everything like you did but it always crashes when I try it.

please post your code use the code feature or use github or something similar like that

Link to post
Share on other sites
56 minutes ago, Luis_ST said:

please post your code use the code feature or use github or something similar like that

public static final KeyBinding KEY = new KeyBinding("Fly",GLFW.GLFW_KEY_V, "Ultimate Sheep Mod"); 
@SubscribeEvent
    public static void doClientSetup(FMLClientSetupEvent event){
        ClientRegistry.registerKeyBinding(UltimateSheepMod.KEY);
    }
@SubscribeEvent
    public static void fly(TickEvent.ClientTickEvent event){
        if(event.phase == TickEvent.Phase.START){
            if(UltimateSheepMod.KEY.isKeyDown()){
                ModPacketHandler.simpleChannel.sendToServer(new FlyActivateMessage());
            }
        }
    }
public class ModPacketHandler {
    private static final String version = "1";
    private static int id = 0;
    public static SimpleChannel simpleChannel;
    public static void init(){
        simpleChannel = NetworkRegistry.newSimpleChannel(new ResourceLocation("usm:simple_channel"), () -> version, version::equals, version::equals);
        simpleChannel.registerMessage(id++, FlyActivateMessage.class, FlyActivateMessage::encode, FlyActivateMessage::decode,
                FlyActivateMessage::handle, Optional.of(NetworkDirection.PLAY_TO_SERVER));
    }
}

Like this?

Link to post
Share on other sites
54 minutes ago, Davidthemodder said:

Like this?

yes😀

52 minutes ago, Davidthemodder said:

There is no error but it crashes as soon as I press the key

looks okay, do you register the packet handler?

Link to post
Share on other sites
9 minutes ago, Davidthemodder said:

Here the Crash report.

please post this class "com.Cake.usm.events.ModClientEvent"
because a NullPointerException was thrown in this class

Link to post
Share on other sites
Just now, Luis_ST said:

please post this class "com.Cake.usm.events.ModClientEvent"
because a NullPointerException was thrown in this class

@Mod.EventBusSubscriber(modid = UltimateSheepMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT)
public class ModClientEvent {
    @SubscribeEvent
    public static void lightning(AttackEntityEvent event){
        if(event.getEntityLiving().getHeldItemMainhand().getItem() == ModItems.LIGHTNING_HAMMER.get()){
            LightningBoltEntity lightning = new LightningBoltEntity(EntityType.LIGHTNING_BOLT,event.getEntity().world);
            lightning.setPosition(event.getTarget().getPosX(), event.getTarget().getPosY(), event.getTarget().getPosZ());
            event.getPlayer().world.addEntity(lightning);
        }
    }
    @SubscribeEvent
    public static void onCrafting(GuiOpenEvent event){
        if (event.isCancelable()){
            if (event.getGui() instanceof CraftingScreen){
                if (event.getResult().equals(Items.APPLE)){
                    event.setCanceled(true);
                }
            }
        }
    }
    @SubscribeEvent
    public static void fly(TickEvent.ClientTickEvent event){
        if(event.phase == TickEvent.Phase.START){
            if(UltimateSheepMod.KEY.isKeyDown()){
                ModPacketHandler.simpleChannel.sendToServer(new FlyActivateMessage());
            }
        }
    }
    @SubscribeEvent
    public static void doClientSetup(FMLClientSetupEvent event){
        ClientRegistry.registerKeyBinding(UltimateSheepMod.KEY);
    }
    @SubscribeEvent
    public static void doCommonSetup(FMLCommonSetupEvent event){
        ModPacketHandler.init();
    }

 

Link to post
Share on other sites
Posted (edited)

you only register your packet handler on the client side, move the FMLCommonSetup event to a class without Dist#CLIENT

Edited by Luis_ST
Link to post
Share on other sites
3 minutes ago, Davidthemodder said:

You mean like ModServerEvent?

the packet handler must be registered on both sides (server and client), there must be no dist in the EventBusSubscriber

Link to post
Share on other sites
Posted (edited)
1 minute ago, Luis_ST said:

the packet handler must be registered on both sides (server and client), there must be no dist in the EventBusSubscriber

Can I just do it twice?

EDIT: Like on Server and on the Client in the two classes?

Edited by Davidthemodder
Link to post
Share on other sites
1 minute ago, Davidthemodder said:

Can I just do it twice?

EDIT: Like on Server and on the Client in the two classes?

no, do this in one class, if you have a class for server event and one for client events then create one for both (ModCommonEvent)

Link to post
Share on other sites
  • Davidthemodder changed the title to [SOLVED] How can I do somehing with Keybindings?

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.



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Old versions of forge are no longer supported, you will need to update to receive support. There banner at the top of most pages on these forums tell which versions are supported.
    • You only need to make 1 post when you have an issue; multiple posts don't help.
    • Please post your latest log from attempting to launch the game, it should tell us what's going on.
    • i currently try to find out how the world gen works, at the moment im working on a structure but i have some problems with the generation. i use this  as an example, i created everything for the generation, but the structure is not generating this is my structure this is the structure registry this is my world load event and this my biome loading event thanks for replies
    • I'm currently trying to make a new cauldron-type block, and I'm having difficulty implementing blockstates. Here's the relevant part of the alchemical cauldron's code:   public class AlchemicalCauldronBlock extends Block { public static final IntegerProperty LEVEL = IntegerProperty.create("level", 1, 3); private static final VoxelShape INSIDE = box(2.0D, 4.0D, 2.0D, 14.0D, 16.0D, 14.0D); protected static final VoxelShape SHAPE = VoxelShapes.join(VoxelShapes.block(), VoxelShapes.or(box(0.0D, 0.0D, 4.0D, 16.0D, 3.0D, 12.0D), box(4.0D, 0.0D, 0.0D, 12.0D, 3.0D, 16.0D), box(2.0D, 0.0D, 2.0D, 14.0D, 3.0D, 14.0D), INSIDE), IBooleanFunction.ONLY_FIRST); public AlchemicalCauldronBlock() { super(Properties.of(Material.METAL).sound(SoundType.METAL).harvestLevel(3).strength(2F,2F)); // this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, 0)); // this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0))); } ... When I try to run this with either of the two attempts at registerDefaultState uncommented, I get this error: https://pastebin.com/vPf3UryC. For convenience, I believe this part is most relevant: How can I avoid this? My registry classes look like this, if it helps: public class registry { public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AlchemyPlus.MODID); public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AlchemyPlus.MODID); public static void register() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(modEventBus); ITEMS.register(modEventBus); registerItems.register(); registerBlocks.register(); } } public class registerBlocks { public static final RegistryObject<Block> ALCHEMICAL_CAULDRON = register("alchemical_cauldron", AlchemicalCauldronBlock::new); static void register() {} private static <T extends Block> RegistryObject<T> registerNoItem(String name, Supplier<T> block) { return registry.BLOCKS.register(name, block); } private static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) { RegistryObject<T> ret = registerNoItem(name, block); registry.ITEMS.register(name, () -> new BlockItem(ret.get(), new Item.Properties().tab(ItemGroup.TAB_BREWING))); return ret; } } Full GitHub repository available here.   (Other minor problem(?):  I copied the methods getShape and getInteractionShape from net.minecraft.block.CauldronBlock and I'm getting these weird warnings. What's up with that? Do I need to worry about it?)  
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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