Klarks Posted January 9, 2021 Share Posted January 9, 2021 I found the ivent that calls by key pressing @SubscribeEvent (priority = EventPriority.LOWEST) public static void onClientTick(TickEvent.ClientTickEvent event) throws Exception { if(KEYBIND_ARRAY == null){ KEYBIND_ARRAY = KeyBinding.class.getDeclaredField("KEYBIND_ARRAY"); KEYBIND_ARRAY.setAccessible(true); } if(event.phase.equals(TickEvent.Phase.END)){ Map<String, KeyBinding> binds = (Map<String, KeyBinding>) KEYBIND_ARRAY.get(null); for (String bind : binds.keySet()) { if(binds.get(bind).isKeyDown() && (binds.get(bind) == TEST)){ System.out.println("R"); break; } } } } But i dont understend how i need to code the Container for this and open the gui by press. My Screen class public class NewInvScreen extends ContainerScreen<NewInvContainer> { private ResourceLocation GUI = new ResourceLocation(Main.MODID,"textures/gui/new_inv.png"); public NewInvScreen( PlayerInventory inv, ITextComponent titleIn) { super(null, inv, new TranslationTextComponent("containers.hen.inv")); } @Override public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { this.renderBackground(matrixStack); //this.playerInventoryTitleX = 10; // this.playerInventoryTitleY = 42; super.render(matrixStack, mouseX, mouseY, partialTicks); this.renderHoveredTooltip(matrixStack, mouseX, mouseY); } @Override protected void drawGuiContainerBackgroundLayer(MatrixStack matrixStack, float partialTicks, int x, int y) { RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); this.minecraft.getTextureManager().bindTexture(GUI); int i = (this.width - this.xSize) / 2; int j = (this.height - this.ySize) / 2; this.blit(matrixStack, i, j, 0, 0, this.xSize, this.ySize); } @Override protected void drawGuiContainerForegroundLayer(MatrixStack matrixStack, int x, int y) { this.font.func_243248_b(matrixStack, this.title, (float)10, (float)this.titleY, 4210752); this.font.func_243248_b(matrixStack, this.playerInventory.getDisplayName(), (float)10, (float)42, 4210752); } } Container Class public class NewInvContainer extends Container { private IItemHandler playerInventory; protected NewInvContainer( int id, PlayerInventory playerInventory) { super(NEWINV_CONTAINER.get(), id); this.playerInventory = new InvWrapper(playerInventory); playerInventory.player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).ifPresent(h -> { addSlot(new SlotItemHandler(h,0,79,18)); }); layoutPlayerInventory(7,54); } private int addSlotRange(IItemHandler handler, int index, int x, int y, int amount, int dx) { for(int i = 0; i < amount;i++) { addSlot(new SlotItemHandler(handler,index,x,y)); x+=dx; index++; } return index; } private int addSlotBox(IItemHandler handler,int index,int x,int y,int horAmount,int dx,int verAmount,int dy) { for (int j = 0;j<verAmount;j++) { index = addSlotRange(handler,index,x,y,horAmount,dx); y+=dy; } return index; } private void layoutPlayerInventory(int leftCol, int topRow) { addSlotBox(playerInventory,9,leftCol,topRow,9,18,3,18); topRow += 58; addSlotRange(playerInventory,0,leftCol,topRow,9,18); } @Override public boolean canInteractWith(PlayerEntity playerIn) { return true; } } Screen Manger Registry @Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ClientEventBusSubscriber { public static final KeyBinding TEST = new KeyBinding("key.structure.desc", GLFW.GLFW_KEY_R, "key.magicbeans.category"); private static Field KEYBIND_ARRAY = null; @SubscribeEvent public static void clientSetup(FMLClientSetupEvent event) { ScreenManager.registerFactory(RegObj.NEWINV_CONTAINER.get(),NewInvScreen::new); ClientRegistry.registerKeyBinding(TEST); } } Registry public class RegObj { public static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, Main.MODID); public static final RegistryObject<ContainerType<NewInvContainer>> NEWINV_CONTAINER = CONTAINERS.register("newinv", () -> IForgeContainerType.create((windowId, inv,data) -> { World world = inv.player.getEntityWorld(); return new NewInvContainer(windowId,inv); })); //Minecraft.getInstance().player } Main @Mod(Main.MODID) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class Main { public static final String MODID = "mymod"; public Main() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); RegObj.CONTAINERS.register(bus); } } Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 10, 2021 Author Share Posted January 10, 2021 I want to also change a container as well for this gui texture. But how can i use my KeyBinding ? Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 10, 2021 Author Share Posted January 10, 2021 Should i use it like this? @SubscribeEvent (priority = EventPriority.LOWEST) public static void onClientTick(TickEvent.ClientTickEvent event) throws Exception { if(event.phase.equals(TickEvent.Phase.END)){ World world = Minecraft.getInstance().world; PlayerEntity player = Minecraft.getInstance().player; if(TEST.isKeyDown()){ if(!world.isRemote) { NetworkHooks.openGui((ServerPlayerEntity) player,(INamedContainerProvider) ); } } } } Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 10, 2021 Author Share Posted January 10, 2021 How can i fiend any tips in vanila code or somewhere else to understend how to do it Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 10, 2021 Author Share Posted January 10, 2021 Thanks, ill try to do it Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 10, 2021 Author Share Posted January 10, 2021 i made what i needed but only as a command. But i cant understand how i can open it on key press. What i should send to the server for it to open @Override public int run(CommandContext<CommandSource> context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().asPlayer(); Networking.sendToClient(new PacketOpenGui(), player); return 0; } My Networking class public class Networking { public static SimpleChannel INSTANCE; private static int ID; public static int nextID() {return ID++;} public static void RegMes() { INSTANCE = NetworkRegistry.newSimpleChannel(new ResourceLocation(Main.MODID,"netw"),() -> "1",s -> true,s -> true); INSTANCE.messageBuilder(PacketOpenGui.class, nextID()) .encoder((packetOpenGui, packetBuffer) -> {}) .decoder(buf -> new PacketOpenGui()) .consumer(PacketOpenGui::handle) .add(); INSTANCE.messageBuilder(PacketSpawn.class, nextID()) .encoder(PacketSpawn::toBytes) .decoder(PacketSpawn::new) .consumer(PacketSpawn::handle) .add(); } public static void sendToClient(Object packet, ServerPlayerEntity player) { INSTANCE.sendTo(packet, player.connection.netManager, NetworkDirection.PLAY_TO_CLIENT); } public static void sendToServer(Object packet) { INSTANCE.sendToServer(packet); } } Quote Link to comment Share on other sites More sharing options...
poopoodice Posted January 10, 2021 Share Posted January 10, 2021 20 minutes ago, Klarks said: public static void sendToServer(Object packet) { INSTANCE.sendToServer(packet); } You already got it didn't you 🙃 Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 10, 2021 Author Share Posted January 10, 2021 Yes I have the method but I dont know how to use it properly and what i should sent to the server. Quote Link to comment Share on other sites More sharing options...
Guru Posted January 10, 2021 Share Posted January 10, 2021 (edited) I have questioned similar things for years as to how to know when a player is pressing the q key. A tossed thing is an object. A thrown thing could be anything such as a rock that way or a flying projectile. if this.objectIsTossed if this.objectIsThrown Both are pretty good though, for sure. But, yeah. Edited January 10, 2021 by Guru Quote Link to comment Share on other sites More sharing options...
poopoodice Posted January 10, 2021 Share Posted January 10, 2021 33 minutes ago, Klarks said: Yes I have the method but I dont know how to use it properly and what i should sent to the server. Your packet, and then you can call NetworkHooks#openGui in PacketSpawn::handle when you have received the packet 1 hour ago, Klarks said: INSTANCE.messageBuilder(PacketSpawn.class, nextID()) .encoder(PacketSpawn::toBytes) .decoder(PacketSpawn::new) .consumer(PacketSpawn::handle) Quote Link to comment Share on other sites More sharing options...
Guru Posted January 10, 2021 Share Posted January 10, 2021 6 minutes ago, poopoodice said: Your packet, and then you can call NetworkHooks#openGui in PacketSpawn::handle when you have received the packet Then what do you do with the stick that way? Had to, moving along... Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 11, 2021 Author Share Posted January 11, 2021 its working but did i do this right? Send the packet to the server if key r is pressed. @Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) public class ForgeHelperMod { public static final KeyBinding TEST = new KeyBinding("key.structure.desc", GLFW.GLFW_KEY_R, "key.magicbeans.category"); private static Field KEYBIND_ARRAY = null; @SubscribeEvent public static void serverLoad(RegisterCommandsEvent event) { ModCommands.register(event.getDispatcher()); } @SubscribeEvent (priority = EventPriority.LOWEST) public static void onClientTick(TickEvent.ClientTickEvent event) throws Exception { if(event.phase.equals(TickEvent.Phase.END)){ World world = Minecraft.getInstance().world; PlayerEntity player = Minecraft.getInstance().player; if(TEST.isKeyDown()){ System.out.println("R"); Networking.sendToServer(new IfKeyPresed()); } } } } Packet itself. It sends the packet to the client for gui open. public class IfKeyPresed { public void handle (Supplier<NetworkEvent.Context> ctx) { ServerPlayerEntity player = ctx.get().getSender(); ctx.get().enqueueWork(() -> { Networking.sendToClient(new PacketOpenGui(), player); }); ctx.get().setPacketHandled(true); } } Gui open packet public class PacketOpenGui { public void handle (Supplier<NetworkEvent.Context> ctx) { ctx.get().enqueueWork(NewInvScreen::open); ctx.get().setPacketHandled(true); } } And open method from Screen public static void open() { Minecraft.getInstance().displayGuiScreen(new NewInvScreen()); } Is it correct? And also in single player when i press r to open the gui, it opens but for some reason it pause the game but on server it didn't Quote Link to comment Share on other sites More sharing options...
Klarks Posted January 11, 2021 Author Share Posted January 11, 2021 So if i would use container-based GUIs my open method should be like public static void open(Supplier<NetworkEvent.Context> ctx, INamedContainerProvider containerProvider) { NetworkHooks.openGui(ctx.get().getSender(),containerProvider); } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.