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

Hod do i call from the tileentity screen a class in the tileentity tile?


TheTrueSCP
 Share

Recommended Posts

hi guys, i need help  with tileentitys. i have a button in my tileentity and i want if i press the butten, a function should be called up in the in the tileentityclass. 

More precisely said the brewBlackout() class


my Init in the Screen:

    @Override
    protected void init() {
        this.addButton(new ImageButton(this.guiLeft + 10, this.height + 30, 20, 18, 0, 0, 19, CONTINUE_BUTTON, (button) -> {

          
            ((ImageButton)button).setPosition(this.guiLeft + 20, this.height / 2 - 49);
        }));
    }

and my tileentity

package net.the_goldbeards.lootdebugs.tileentity;

import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.*;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler;
import net.the_goldbeards.lootdebugs.init.ModBlocks;
import net.the_goldbeards.lootdebugs.init.ModItems;
import net.the_goldbeards.lootdebugs.init.ModTileEntities;

import javax.annotation.Nonnull;

public class PubTile extends TileEntity implements ITickableTileEntity {


    private final ItemStackHandler itemHandler = createHandler();


    private final LazyOptional<IItemHandler> handler = LazyOptional.of(() -> itemHandler);

    public PubTile(TileEntityType<?> tileEntityTypeIn) {
        super(tileEntityTypeIn);
    }

    public PubTile() {
        this(ModTileEntities.PUB_TILE.get());
    }


    @Override
    public void read(BlockState state, CompoundNBT nbt) {
        itemHandler.deserializeNBT(nbt.getCompound("pub"));
        super.read(state, nbt);
    }

    @Override
    public CompoundNBT write(CompoundNBT compound) {
        compound.put("pub", itemHandler.serializeNBT());
        return super.write(compound);
    }


    private ItemStackHandler createHandler() {
        return new ItemStackHandler(6) {
            @Override
            protected void onContentsChanged(int slot) {
                brewBlackout();
                markDirty();
            }


            @Override
            public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
                switch (slot) {
                    case 0:
                        return stack.getItem() == Items.WATER_BUCKET || stack.getItem() == Items.BUCKET;//Water Insert
                    case 1:
                        return stack.getItem() == Items.REDSTONE;//Barley Bulb
                    case 2:
                        return stack.getItem() == Items.WARPED_DOOR;// Yeast Cone
                    case 3:
                        return stack.getItem() == Items.MAGENTA_BANNER;//Malz Stars
                    case 4:
                        return stack.getItem() == ModItems.BARLEY_BULB.get();//Starch Nut
                    case 5:
                        return stack.getItem() == ModItems.MUG.get() || stack.getItem() == ModItems.OILY_OAF.get() || stack.getItem() == ModItems.SKULL_CRUSHER.get() || stack.getItem() == ModItems.OILY_OAF.get();//Output -> Mug or Mug with Liquid

                    default:
                        return false;
                }
            }

            @Override
            protected int getStackLimit(int slot, @Nonnull ItemStack stack) {

                if (slot == 5) {
                    return 1;
                }

                if (slot == 0) {
                    return 5;
                } else {
                    return 64;
                }
            }

            @Nonnull
            @Override
            public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
                if (!isItemValid(slot, stack)) {
                    return stack;

                }


                return super.insertItem(slot, stack, simulate);

            }
        };
    }

    @Nonnull
    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap) {
        if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
            return handler.cast();

        }
        return super.getCapability(cap);
    }


    public void brewBlackout() {
        boolean isWaterInSlot = this.itemHandler.getStackInSlot(0).getCount() == 1 && this.itemHandler.getStackInSlot(0).getItem() == Items.WATER_BUCKET;
        boolean isMugInSlot = this.itemHandler.getStackInSlot(5).getCount() == 1 && this.itemHandler.getStackInSlot(5).getItem() == ModItems.MUG.get();
        boolean isIngredients = this.itemHandler.getStackInSlot(4).getCount() >= 3 && this.itemHandler.getStackInSlot(4).getItem() == ModItems.BARLEY_BULB.get();

        if (isMugInSlot && isIngredients && isWaterInSlot) {
            this.itemHandler.getStackInSlot(0).shrink(1);
            this.itemHandler.insertItem(0, new ItemStack(Items.BUCKET, 1), false);


            this.itemHandler.getStackInSlot(4).shrink(3);

            this.itemHandler.getStackInSlot(5).shrink(1);
            this.itemHandler.insertItem(5, new ItemStack(ModBlocks.OILY_OAF.get(), 1), false);


        }
    }
    
   /* private void craft()
    {
        Inventory inv = new Inventory(itemHandler.getSlots());
        for (int i = 0; i < itemHandler.getSlots(); i++) {
            inv.setInventorySlotContents(i, itemHandler.getStackInSlot(i));
        }

        Optional<PubRecipe> recipe = world.getRecipeManager()
                .getRecipe(ModRecipeTypes.PUB_RECIPE, inv, world);

        recipe.ifPresent(iRecipe -> {
            ItemStack output = iRecipe.getRecipeOutput();



            craftTheItem(output);
            markDirty();
        });
    }

    private void craftTheItem(ItemStack output)
    {
        itemHandler.extractItem(0, 1,false);
        itemHandler.insertItem(0, new ItemStack(Items.BUCKET,1),false);
    }

*/

    @Override
    public void tick() {
       // if(world.isRemote)
       // {return;}
       // craft();
    }

 

Edited by TheTrueSCP
Link to comment
Share on other sites

Buttons are client side only, you must send a packet to the server saying "this button was pressed."

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

I just copied and adapted the examples on the forum page. Despite the documentation, I don't understand exactly how to tell the server that I have pressed the button and how the server can then call the function

 

Edited by TheTrueSCP
Link to comment
Share on other sites

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

    private static final String PROTICOL_VERSION = "1";
    public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(
            new ResourceLocation("corruption","main")
            ,() -> PROTICOL_VERSION
            , PROTICOL_VERSION::equals
            , PROTICOL_VERSION::equals);

 

Link to comment
Share on other sites

In this Class: 

package net.the_goldbeards.lootdebugs.Server;


import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.network.NetworkRegistry;
import net.the_goldbeards.lootdebugs.LootDebugsMain;

public  class SimpleChannel
{
    private static final String PROTICOL_VERSION = "1";
    public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(
            new ResourceLocation("corruption","main")
            ,() -> PROTICOL_VERSION
            , PROTICOL_VERSION::equals
            , PROTICOL_VERSION::equals);


}

 

Edited by TheTrueSCP
Link to comment
Share on other sites

ok, i have writed the Button Method but i have no idea what to write in the .sendToServer Method 

 @Override
    protected void init() {
        super.init();
        this.addButton(new ImageButton(this.guiLeft + 20, this.height / 2 - 49, 20, 18, 0, 0, 19, CONTINUE_BUTTON, (button) -> {

            PacketHandler.CHANNEL.sendToServer(new PubTile());
            ((ImageButton)button).setPosition(this.guiLeft + 20, this.height / 2 - 49);
        }));
        this.titleX = (this.xSize - this.font.getStringPropertyWidth(this.title)) / 2;
    }

 

Link to comment
Share on other sites

your message class should have two fields: player uuid and button name (and two methods: encode and decode). make an instance of this message class and send it.

edit: also include block position in the message.

Edited by MFMods
added a few bits
Link to comment
Share on other sites

13 minutes ago, MFMods said:

our message class should have two fields: player uuid and button name (and two methods: encode and decode). make an instance of this message class and send it.

edit: also include block position in the message.

No, no and no.

The server knows the sending player, so the UUID is unnecessary. If you really needed to send a player (or any entity) across, you'd send the entity ID, not the UUID.

The button name is irrelevant, if anything you'd send an Enum that specifies the button (if multiple buttons needs to be sent).

The block position is also known on the server, sending it again only allows for cheats (if you don't validate it on the server, at which point you might as well just not send it at all).

Link to comment
Share on other sites

ok, i'm not surprised i was wrong about the player, i've only ever sent in opposite direction. getSender is there and i should have checked instead of posting blindly...

but how would he know the block location without including it in the message?

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

    • @EventBusSubscriber(modid=ElderNorseGods.MOD_ID, bus=EventBusSubscriber.Bus.FORGE) public abstract class ENGCapabilities { @SubscribeEvent public static void registerCapabilities(final FMLCommonSetupEvent event) { CapabilityManager.INSTANCE.register(IManaHandler.class, new ManaStorage(), ManaHandler::new); } @SubscribeEvent public static void attachCapabilities(final AttachCapabilitiesEvent<Entity> event) { if(!(event.getObject() instanceof PlayerEntity)) return; ManaProvider provider=new ManaProvider(); event.addCapability(ManaCapability.LOCATION, provider); event.addListener(provider::invalidate); } }
    • I tried downloading forge client just right now, and when I downloaded it, there was a error message from the java app. 
    • The issue Updating from 1.16.5 to 1.17.1, a problem with the availability of the Kotlin stdlib at runtime emerged. Up until now, the following build script setup worked without issue (same thing, just different versions specified): Getting the Kotlin Gradle plugin and applying it buildscript { repositories { maven { url = 'https://maven.minecraftforge.net' } mavenCentral() } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // Kotlin version: 1.6.0 } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'kotlin' // Some other things java.toolchain.languageVersion = JavaLanguageVersion.of(16) // This is new Including the Standard Library as a dependency (actually unnecessary) dependencies { minecraft "net.minecraftforge:forge:1.17.1-37.0.126" // Used to call for a Forge version for 1.16.5 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" // This being jdk8 is not an issue // JEI would be here too } Packaging the Standard Library into the jar jar { dependsOn(classes) duplicatesStrategy(DuplicatesStrategy.INCLUDE) // Manifest here configurations { kotlinstdlib } dependencies { kotlinstdlib "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } from { configurations.kotlinstdlib.collect() { it.isDirectory() ? it : zipTree(it) } } } Setting the Kotlin JVM target version to 16 (used to be 1.8) def kotlinCompilerArgs = ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"] compileKotlin { kotlinOptions { jvmTarget = "16" freeCompilerArgs += kotlinCompilerArgs } } compileTestKotlin { kotlinOptions { jvmTarget = "16" freeCompilerArgs += kotlinCompilerArgs } } This still compiles the project correctly, running it however throws the following exception as soon as the mod annotated class gets loaded (when a Logger instance is requested to be more specific, probably does a null check under the hood - because Kotlin): java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics This class is part of the kotlin-stdlib-1.6.0.jar file. (Not kotlin-stdlib-jdk8-1.6.0.jar) It shows up under "External Libraries", but appears to be missing at runtime for the workspace. Running 'build' outputs a jar that gets loaded correctly though, so the problem only appears when running in IDE using 'runClient'. JEI does seem to get loaded though, only the Kotlin Standard Library does not. Versions Gradle - 7.2 ForgeGradle - 5.1.X Java for building: 11 (1.8 when testing on a different computer) Java for compiling and running: 16 Kotlin: 1.6.0 Minecraft: 1.17.1 Forge: 37.0.126 (Currently latest) IDE is IntelliJ What I already tried Using kotlin-stdlib instead of kotlin-stdlib-jdk8 Setting the Java version to 16 for the 1.16.5 version of the project (worked, but not the goal) Using a different PC (different caches, same output) Running the 'clean' task Using 'api, 'compileOnly' and 'runtimeOnly' in the dependencies block instead of 'implementation'. Applying the Kotlin plugin using the plugins block Creating a raw Kotlin project with JVM 16 target (not Forge; worked) Creating a raw Forge mod project using the Forge MDK, adding the Kotlin plugin to it, and converting the ExampleMod class to Kotlin (failed with same output) Removing the implementation line for the Standard Library in both the 1.16.5 version and the 1.17.1 (the 1.17.1 version failed, the 1.16.5 version ran successfully, which means that this line does not have any effect) This abomination compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version") runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version") runtimeOnly fg.deobf("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version") Combinations of the things mentioned above. My guess As this problem only appears with a difference in the build script of the mappings and Forge version, the only thing I guess would be left is Forge having an issue itself. I do not know how Forge loads mods and libraries in the development environment, I have checked what System.getenv("CLASSPATH") outputs using a breakpoint, and it returned null. It is remapping and including JEI correctly though, so it confuses me why the Kotlin Standard Library would not be present. This makes me a bit unsure whether it is Forge's fault, but again, the only real change I did for the build script was changing the mappings and Forge version (and adding the Java 16 line, but I have already checked doing that for 1.16.5). It is also not an incompatibility between Java versions because building a mod jar and running Minecraft Forge 1.17.1 with it normally (outside of IDE) works. Are there any workarounds/fixes for this? Of course, any help much appreciated!
    • can you run a 1.16 example mod on that setup? for 1.17 (which you are trying to start), you will need a parallel setup with java 16.
    • As always I'd return to conclude my inquiries, if successful. To solve my issue, I just had to create a custom screen, extend any "furnace" type screen to access the recipe book functions(AbstractFurnaceScreen actually turned out to be quite a hassle, so I moved on using FurnaceScreen). To implement the recipe book button into my "ContainerScreenCampfire", I just mimicked and adjusted the client code found in AbstractFurnaceScreen, and then I had to do the following code, to close the screen, and press the right mouse button to simulate returning to the original campfire screen, instead of the furnace screen: What's left to do is importing all the client particle, and server side burn time logic functions etc., from my original campfire. But this should be pretty straight forward.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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