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

[1.16.4] How i can make a own inventory


Klarks
 Share

Recommended Posts

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);


    }

  

}
Link to comment
Share on other sites

Why are you still doing that strange reflection stuff with the key bindings? You already have your KeyBinding stored in a field. Just use it!

Opening a container GUI is a server-side operation, as such you need to send a packet to the server to open the inventory.

 

However - do you really need a custom container? If you simply want a different layout you can leave the container alone and simply replace the ContainerScreen.

Link to comment
Share on other sites

18 hours ago, Klarks said:

 


@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;
            }
        }
    }
}

 

All this can be replaced with

@SubscribeEvent (priority = EventPriority.LOWEST)
public static void onClientTick(TickEvent.ClientTickEvent event) throws Exception {
    if(event.phase.equals(TickEvent.Phase.END)){
        if(TEST.isKeyDown()){
            System.out.println("R");
        }
    }
}

 

Link to comment
Share on other sites

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) );
            }
        }
    }
}
Link to comment
Share on other sites

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);
    }

}
Link to comment
Share on other sites

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 by Guru
Link to comment
Share on other sites

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)

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

You are now making an unnecessary network round-trip. If you just call displayGuiScreen to display a normal screen, you can do that directly from the key handler.

You only need to open container-based GUIs on the server, using NetworkHooks.openGui.

 

2 minutes ago, Klarks said:

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

Of course a server game never gets paused (because the server doesn't pause). Override Screen#isPauseScreen to control this behavior in single player.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • post a screenshot where the full path of the folder visible is or a screenshot where we can make sure it is the correct folder  
    • What do you mean by that?
    • I want to play minecraft modded with CurseForge but every time i start my mincraft its crash with the report:  This crash may be caused by an invalid java runtime configuration. Check any custom configuration settings. Exite Code:1 and i dont now what it mean i already reinstalled minecraft and curseforge i dont have mods loaded or installed when i start the game. i just start forge 1.18.2 but its crash. This is the Game output: 17:01:53.866 launcher main Preparing to launch minecraft client for forge-40.1.0 17:01:53.867 launcher main Prepared asset index 17:01:54.226 launcher main Have 3120 total files to check or download 17:01:54.235 launcher main Local file C:\Users\User\curseforge\minecraft\Install\versions\forge-40.1.0\forge-40.1.0.jar is incomplete 17:01:55.968 launcher main Minecraft client forge-40.1.0 requires 1521781 bytes to download. 17:01:55.968 launcher main Starting! 17:01:55.968 launcher main Downloading 1 files 17:01:56.177 launcher main Download from https://piston-data.mojang.com/v1/objects/2e9a3e3107cca00d6bc9c97bf7d149cae163ef21/client.jar had invalid checksum! Expected: 2e9a3e3107cca00d6bc9c97bf7d149cae163ef21 got: 04292004f7145d1d991b8808d2976f9dc8db5cba 17:01:56.741 launcher main Download from https://piston-data.mojang.com/v1/objects/2e9a3e3107cca00d6bc9c97bf7d149cae163ef21/client.jar passed checksum check. 17:01:56.741 launcher main Downloaded https://piston-data.mojang.com/v1/objects/2e9a3e3107cca00d6bc9c97bf7d149cae163ef21/client.jar to C:\Users\User\curseforge\minecraft\Install\versions\forge-40.1.0\forge-40.1.0.jar 17:01:56.741 launcher main Downloads successful 17:01:56.741 launcher main TIMER: Downloads took 0 seconds. 17:01:56.741 launcher main Downloading Java Runtime java-runtime-beta:17.0.1.12.1 17:01:57.506 launcher main Extracting 8 files! 17:01:58.159 launcher main Using default game log configuration client-1.12.xml (outputs XML) 17:02:00.387 cpw.mods.modlauncher.Launcher main ModLauncher running: args [--username, Pixelcaft, --version, forge-40.1.0, --gameDir, C:\Users\User\curseforge\minecraft\Instances\test (3), --assetsDir, C:\Users\User\curseforge\minecraft\Install\assets, --assetIndex, 1.18, --uuid, d5bb472870874443847c9b99c9bf273f, --accessToken, ❄❄❄❄❄❄❄❄, --clientId, NDdmNzk3ZjctMzZmMS00YWI0LTkyNzktNGYyMDQwYjUwYmRl, --xuid, 2535455300377521, --userType, msa, --versionType, release, --width, 1024, --height, 768, --launchTarget, forgeclient, --fml.forgeVersion, 40.1.0, --fml.mcVersion, 1.18.2, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20220404.173914] 17:02:00.393 cpw.mods.modlauncher.Launcher main ModLauncher 9.1.3+9.1.3+main.9b69c82a starting: java version 17.0.1 by Microsoft 17:02:00.537 mixin main SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/User/curseforge/minecraft/Install/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2314!/ Service=ModLauncher Env=CLIENT 17:02:00.603 net.minecraftforge.fml.loading.FMLConfig main Configuration file C:\Users\User\curseforge\minecraft\Instances\test (3)\config\fml.toml is not correct. Correcting 17:02:00.612 net.minecraftforge.fml.loading.FMLConfig main Incorrect key [defaultConfigPath] was corrected from null to defaultconfigs 17:02:01.245 launcher main Exception in thread "main" java.io.UncheckedIOException: java.io.IOException: Invalid paths argument, contained no existing paths: [C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-srg.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-extra.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraftforge\forge\1.18.2-40.1.0\forge-1.18.2-40.1.0-client.jar] at cpw.mods.securejarhandler@1.0.3/cpw.mods.jarhandling.impl.Jar.<init>(Jar.java:74) at cpw.mods.securejarhandler@1.0.3/cpw.mods.jarhandling.SecureJar.from(SecureJar.java:58) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.moddiscovery.ModJarMetadata.buildFile(ModJarMetadata.java:41) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator.scanMods(MinecraftLocator.java:33) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.moddiscovery.ModDiscoverer.discoverMods(ModDiscoverer.java:50) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.FMLLoader.beginModScan(FMLLoader.java:166) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.FMLServiceProvider.beginScanning(FMLServiceProvider.java:86) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServiceDecorator.runScan(TransformationServiceDecorator.java:112) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServicesHandler.lambda$runScanningTransformationServices$8(TransformationServicesHandler.java:100) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServicesHandler.runScanningTransformationServices(TransformationServicesHandler.java:102) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServicesHandler.initializeTransformationServices(TransformationServicesHandler.java:55) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.Launcher.run(Launcher.java:87) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.Launcher.main(Launcher.java:77) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) at cpw.mods.bootstraplauncher@1.0.0/cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:149) Caused by: java.io.IOException: Invalid paths argument, contained no existing paths: [C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-srg.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-extra.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraftforge\forge\1.18.2-40.1.0\forge-1.18.2-40.1.0-client.jar] ... 25 more 17:02:01.245 monitor Process Monitor Process crashed with exit code 1
    • why do you work with .schematic file? From what I know are .schematic files a community creation and not used by vanilla you can take a look how they are written
    • I did look at vanilla code, but I don't understand how it works. For example, what does the PoseStack do? How should I use the buffers? And how does it "attach" to the model?
  • Topics

×
×
  • Create New...

Important Information

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