Jump to content

(SOLVED) [1.16.4] Saving Block data doesn't work with TileEntity, but does when Container uses the TileEntity


Recommended Posts

Posted (edited)

Hello,

The title is a bit confusing, I know, but I'll explain more here.

I've been following MinecraftByExample's tutorial on a Furnace type block, since that is how my block kind of works. It has an object that holds the information about the block such as time, and what I have been using it for, experience points. Now I have this block that holds exp and has two inputs, an output, and four buttons. The buttons are working and doing what I want; when I click a button, the Container deals with the logic then sends the updated data to the TileEntity for it to be changed. I originally had everything the button does on the Container, but it wasn't saving the data when I closed the gui so I hope this is the way things are supposed to be.

Now that was all working, I got my recipe serializer working for the block, but before I worked on the recipe i/o, I wanted to work on the other input which is for my exp book, and it takes the exp from the book and transfers it to the actual block. I have worked through the logic for this specific area and it seems good, however it doesn't actually save the updated exp amount to the block.

I have stepped through with a debugger and I can see the exp being removed, and the block exp is increasing, but when I continue the program then the exp bar I have for the block hasn't increased and there isn't anything in the block afterall. Buttons work however.

 

TLDR: Input slot for custom item gets it's exp amount removed and passed over to the exp block, exp block doesn't save the amount. Buttons work however, even though both the buttons and BookInput slot basically go through the same hoops.

Code:

ExperienceBlockTile:

public class ExperienceBlockTile extends BaseTile implements INamedContainerProvider, ITickableTileEntity {

    public static final int INPUT_SLOTS = 1;
    public static final int INPUT_BOOK_SLOTS = 1;
    public static final int OUTPUT_SLOTS = 1;
    public static final int EXP_BAR_SLOT = 1;
    public static final int TOTAL_SLOTS = INPUT_SLOTS + OUTPUT_SLOTS;

    private ExperienceBlockContents inputContents;
    private ExperienceBlockContents inputBookContents;
    private ExperienceBlockContents outputContents;
    private ExperienceBlockContents expBarContents;

    private ItemStack currentlyInfusingItemLastTick = ItemStack.EMPTY;
    private ItemStack currentlyExtractionItemLastTick = ItemStack.EMPTY;

    public ExperienceBlock.Tier tier;
    public ExperienceBlockTile tile;

    private final ExperienceBlockStateData experienceBlockStateData;


    // Constructor that creates the experienceBlockTile and the input/output contents
    public ExperienceBlockTile(ExperienceBlock.Tier tier) {
        super(getTier(tier));

        inputContents = ExperienceBlockContents.createForTileEntity(INPUT_SLOTS,
                this::canPlayerAccessInventory,
                this::markDirty);

        inputBookContents = ExperienceBlockContents.createForTileEntity(INPUT_BOOK_SLOTS,
                this::canPlayerAccessInventory,
                this::markDirty);

        outputContents = ExperienceBlockContents.createForTileEntity(OUTPUT_SLOTS,
                this::canPlayerAccessInventory,
                this::markDirty);

        expBarContents = ExperienceBlockContents.createForTileEntity(EXP_BAR_SLOT,
                this::canPlayerAccessInventory,
                this::markDirty);

        this.tier = tier;
        this.tile = (ExperienceBlockTile) getTileEntity();

        this.experienceBlockStateData = new ExperienceBlockStateData();

    }

    @Override
    public ITextComponent getDisplayName() {
        return new TranslationTextComponent("experience_block_container");
    }

    @Nullable
    @Override
    public Container createMenu(int windowId, PlayerInventory playerIn, PlayerEntity playerEn) {
        return ExperienceBlockContainer.createContainerServerSide(windowId, playerIn, tile,
                inputContents, inputBookContents, outputContents, expBarContents, experienceBlockStateData);
    }

    // Basically just checks to see if the player is within range, true if they are

    public boolean canPlayerAccessInventory(PlayerEntity playerIn){
        if(this.world.getTileEntity(this.pos) != this){
            return false;
        }

        final double X_CENTRE_OFFSET = 0.5;
        final double Y_CENTRE_OFFSET = 0.5;
        final double Z_CENTRE_OFFSET = 0.5;
        final double MAXIMUM_DIST_SQ = 8.0 * 8.0;

        return playerIn.getDistanceSq(pos.getX() + X_CENTRE_OFFSET,
                pos.getY() + Y_CENTRE_OFFSET,
                pos.getZ() + Z_CENTRE_OFFSET) < MAXIMUM_DIST_SQ;
    }
    @Override
    public void tick() {

        // do nothing on client
        if(world.isRemote) return;


        ItemStack currentItemExpInfuse = getCurrentInfuseItemInput();
        ItemStack currentExtractionItemInput = getCurrentExpExtractItemInput();


        if(!currentExtractionItemInput.isEmpty()){
            extractExpItem();
        }

        currentlyExtractionItemLastTick = currentExtractionItemInput.copy();

        markDirty();
    }

    public static boolean doesItemHaveExpTag(ItemStack item){
        return item.getOrCreateTag().contains("exp");
    }

    private ItemStack getCurrentInfuseItemInput(){
        return infuseFirstSuitableInputItem(false);
    }

    private void infuseFirstSuitableInputItem(){
        infuseFirstSuitableInputItem(true);
    }

    private ItemStack infuseFirstSuitableInputItem(boolean performInfuse){

        Integer inputSlot = null;
        Integer outputSlot = null;

        return ItemStack.EMPTY;
    }

    private ItemStack getCurrentExpExtractItemInput(){
        return extractExpItem(false);
    }

    private void extractExpItem(){
        extractExpItem(true);
    }

    private ItemStack extractExpItem(boolean performExtract){

        ItemStack extractItem = inputBookContents.getStackInSlot(0);

        if(!performExtract){
            return extractItem;
        }

        int extractRate = getExtractRate();
        performExtraction(extractItem, extractRate);

        currentlyExtractionItemLastTick = extractItem;

        markDirty();
        return extractItem;

    }

    private void performExtraction(ItemStack extractItem, int extractRate){

        // Store the amount of exp currently in the book, and also the amount of exp that will be stored
        int expAmount = extractItem.getOrCreateTag().getInt("exp");
        int expBlockAmount = getExpBlockAmount();
        int expBlockMaxAmount = getMaxExpAmount();

        int extractedExp;

        // Base case for the lower, and upper end
        if(expAmount == 0 || expBlockAmount == expBlockMaxAmount){
            return;
        }

        // If the extract rate is higher than the amount of exp stored, then it'll go into the minus territory
        // If expAmount is less than the extractRate then the amount will be saved, otherwise just use the extractRate
        extractedExp = (expAmount < extractRate) ? expAmount : extractRate;


        // If the amount of exp being extracted goes over the cap in the exp block then bring it down
        if(expBlockAmount + extractedExp > expBlockMaxAmount){
            extractedExp = expBlockMaxAmount - expBlockAmount;
        }

        expAmount -= extractedExp;

        extractItem.getTag().putInt("exp", expAmount);
        addExpAmount(extractedExp);
    }

    public boolean willItemStackFit(ExperienceBlockContents experienceBlockContents, int slotIndex, ItemStack itemStackOrigin){
        ItemStack itemStackDest = experienceBlockContents.getStackInSlot(slotIndex);

        if(itemStackDest.isEmpty() || itemStackOrigin.isEmpty()){
            return true;
        }

        if(!itemStackOrigin.isItemEqual(itemStackDest)){
            return false;
        }

        return false;
    }

    private final String INPUT_SLOT_NBT = "inputSlot";

    private final String INPUT_BOOK_SLOT_NBT = "inputBookSlot";
    private final String OUTPUT_SLOT_NBT = "outputSlot";
    private final String EXP_BAR_NBT = "expBar";
    @Override
    public CompoundNBT write(CompoundNBT compound) {
        super.write(compound);

        experienceBlockStateData.putIntoNBT(compound);

        compound.put(INPUT_SLOT_NBT, inputContents.serializeNBT());
        compound.put(INPUT_BOOK_SLOT_NBT, inputBookContents.serializeNBT());
        compound.put(OUTPUT_SLOT_NBT, outputContents.serializeNBT());
        compound.put(EXP_BAR_NBT, expBarContents.serializeNBT());

        return compound;
    }

    @Override
    public void read(BlockState state, CompoundNBT nbt) {
        super.read(state, nbt);

        experienceBlockStateData.readFromNBT(nbt);

        CompoundNBT invNBT = nbt.getCompound(INPUT_SLOT_NBT);
        inputContents.deserializeNBT(invNBT);

        invNBT = nbt.getCompound(INPUT_BOOK_SLOT_NBT);
        inputBookContents.deserializeNBT(invNBT);

        invNBT = nbt.getCompound(OUTPUT_SLOT_NBT);
        outputContents.deserializeNBT(invNBT);

        invNBT = nbt.getCompound(EXP_BAR_NBT);
        expBarContents.deserializeNBT(invNBT);

        if(inputContents.getSizeInventory() != INPUT_SLOTS
                || inputBookContents.getSizeInventory() != INPUT_BOOK_SLOTS
                || outputContents.getSizeInventory() != OUTPUT_SLOTS
                || expBarContents.getSizeInventory() != EXP_BAR_SLOT){
            throw new IllegalArgumentException("Corrupted NBT: Number of inventory slots did not match expected");
        }

    }

    @Nullable
    @Override
    public SUpdateTileEntityPacket getUpdatePacket() {

        CompoundNBT updateTagTileEntityState = getUpdateTag();
        final int METADATA = 42;
        return new SUpdateTileEntityPacket(this.pos, METADATA, updateTagTileEntityState);

    }

    @Override
    public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) {
        CompoundNBT updateTagTileEntityState = pkt.getNbtCompound();
        BlockState state = world.getBlockState(pos);
        handleUpdateTag(state, updateTagTileEntityState);
    }

    @Override
    public CompoundNBT getUpdateTag() {
        CompoundNBT nbt = new CompoundNBT();
        write(nbt);
        return nbt;
    }

    @Override
    public void handleUpdateTag(BlockState state, CompoundNBT tag) {
        read(state, tag);
    }

    public void dropContents(World world, BlockPos pos){
        InventoryHelper.dropInventoryItems(world, pos, inputContents);
        InventoryHelper.dropInventoryItems(world, pos, inputBookContents);
        InventoryHelper.dropInventoryItems(world, pos, outputContents);
    }

    public static boolean isItemValidForInputSlot(ItemStack item){
        return true;
    }

    public static boolean isItemValidForOutputSlot(ItemStack item){
        return true;
    }
                  
    public int getExpBlockAmount(){
        return experienceBlockStateData.expAmountInContainer;
    }

    // Methods for the Exp Manipulation for adding and removing exp from the player to the ExpBlock
    // Add Exp to the Block
    public void addExpAmount(int value){
        experienceBlockStateData.expAmountInContainer += value;
        markDirty();
    }

    // Take Exp from the Block
    public void takeExpAmount(int value){
        experienceBlockStateData.expAmountInContainer -= value;
        markDirty();
    }

    public static TileEntityType<ExperienceBlockTile> getTier(ExperienceBlock.Tier tier){
        switch (tier){
            case SMALL:
                return ModTiles.EXPERIENCE_BLOCK_TILES.get(ExperienceBlock.Tier.SMALL).get();
            case MEDIUM:
                return ModTiles.EXPERIENCE_BLOCK_TILES.get(ExperienceBlock.Tier.MEDIUM).get();
            case LARGE:
                return ModTiles.EXPERIENCE_BLOCK_TILES.get(ExperienceBlock.Tier.LARGE).get();
            case CREATIVE:
                return ModTiles.EXPERIENCE_BLOCK_TILES.get(ExperienceBlock.Tier.CREATIVE).get();
            default:
                throw new IllegalArgumentException("Unknown tier: " + tier);
        }
    }

    public int getMaxExpAmount(){
        return getMaxExpFromTier(tier);
    }

    public int getMaxExpFromTier(ExperienceBlock.Tier tier){
        switch(tier){
            case SMALL:
                return 1395;
            case MEDIUM:
                return 8670;
            case LARGE:
                return 30970;
            case CREATIVE:
                return Integer.MAX_VALUE;
            default:
                throw new IllegalArgumentException("Tier is not recognized: " + tier);
        }
    }

    private int getExtractRate(){
        switch (this.tier){
            case SMALL:
                return 10;
            case MEDIUM:
                return 15;
            case LARGE:
                return 20;
            case CREATIVE:
                return 100;
            default:
                throw new IllegalArgumentException("Unknown tier: " + tier);
        }
    }
}

ExperienceContainerBlock:

public class ExperienceBlockContainer extends BaseContainer {

    // Vanilla Inventory Basic slot counts -- 9 Slots for hotbar, 3x9 for inventory
    private static final int HOTBAR_SLOT_COUNT = 9;
    private static final int PLAYER_INVENTORY_ROW_COUNT = 3;
    private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9;
    private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT;
    private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT;
    // Vanilla Inventory Indexes
    private static final int VANILLA_FIRST_SLOT_INDEX = 0;
    private static final int HOTBAR_FIRST_SLOT_INDEX = VANILLA_FIRST_SLOT_INDEX;
    private static final int PLAYER_INVENTORY_FIRST_SLOT_INDEX = HOTBAR_FIRST_SLOT_INDEX + HOTBAR_SLOT_COUNT;

    // Experience Block Inventory slot counts
    public static final int INPUT_SLOTS = ExperienceBlockTile.INPUT_SLOTS;
    public static final int INPUT_BOOK_SLOTS = ExperienceBlockTile.INPUT_BOOK_SLOTS;
    public static final int OUTPUT_SLOTS = ExperienceBlockTile.OUTPUT_SLOTS;
    public static final int EXP_BAR_SLOT = ExperienceBlockTile.EXP_BAR_SLOT;
    // Experience Block Inventory Indexes
    private static final int INPUT_SLOT_INDEX = PLAYER_INVENTORY_FIRST_SLOT_INDEX + PLAYER_INVENTORY_SLOT_COUNT;
    private static final int INPUT_BOOK_SLOT_INDEX = INPUT_SLOT_INDEX + INPUT_BOOK_SLOTS;
    private static final int OUTPUT_SLOT_INDEX = INPUT_BOOK_SLOT_INDEX + OUTPUT_SLOTS;
    private static final int EXP_BAR_SLOT_INDEX = OUTPUT_SLOT_INDEX + EXP_BAR_SLOT;

    // Gui Pos of the player inventory grid
    public static final int PLAYER_INVENTORY_XPOS = 8;
    public static final int PLAYER_INVENTORY_YPOS = 84;

    private World world;

    private ExperienceBlockContents inputContents;
    private ExperienceBlockContents inputBookContents;
    private ExperienceBlockContents outputContents;
    private ExperienceBlockContents expBarContents;

    private ExperienceBlockStateData experienceBlockStateData;

    private ExperienceBlockTile experienceBlockTile;

    public ExperienceBlock.Tier tier;

    public ExperienceBlockContainer(int windowId, PlayerInventory playerIn){
        super(ModContainers.EXPERIENCE_BLOCK_CONTAINER.get(), windowId);
    }

    public static ExperienceBlockContainer createContainerServerSide(int windowId, PlayerInventory playerInventory, ExperienceBlockTile tile,
                                                                     ExperienceBlockContents inputZoneContents,
                                                                     ExperienceBlockContents inputBookZoneContents,
                                                                     ExperienceBlockContents outputZoneContents,
                                                                     ExperienceBlockContents expBarZoneContents,
                                                                     ExperienceBlockStateData experienceBlockStateData) {

        return new ExperienceBlockContainer(windowId, playerInventory, tile, inputZoneContents, inputBookZoneContents, outputZoneContents, expBarZoneContents, experienceBlockStateData);
    }

    public static ExperienceBlockContainer createContainerClientSide(int windowId, PlayerInventory playerInventory, ExperienceBlockTile tile) {

        ExperienceBlockContents inputZoneContents = ExperienceBlockContents.createForClientSideContainer(INPUT_SLOTS);
        ExperienceBlockContents inputBookZoneContents = ExperienceBlockContents.createForClientSideContainer(INPUT_BOOK_SLOTS);
        ExperienceBlockContents outputZoneContents = ExperienceBlockContents.createForClientSideContainer(OUTPUT_SLOTS);
        ExperienceBlockContents expBarZoneContents = ExperienceBlockContents.createForClientSideContainer(EXP_BAR_SLOT);
        ExperienceBlockStateData experienceBlockStateData = new ExperienceBlockStateData();


        return new ExperienceBlockContainer(windowId, playerInventory, tile, inputZoneContents, inputBookZoneContents, outputZoneContents, expBarZoneContents, experienceBlockStateData);
    }


    public ExperienceBlockContainer(int windowId, PlayerInventory playerIn, @Nullable ExperienceBlockTile tile, ExperienceBlockContents inputZoneContents,
                                    ExperienceBlockContents inputBookZoneContents, ExperienceBlockContents outputZoneContents,
                                    ExperienceBlockContents expBarZoneContents, ExperienceBlockStateData experienceBlockStateData) {

        super(ModContainers.EXPERIENCE_BLOCK_CONTAINER.get(), windowId);

        if (ModContainers.EXPERIENCE_BLOCK_CONTAINER.get() == null) {
            throw new IllegalStateException("Must Initialise ContainerType ExperienceBlockContainer before constructing a ExperienceBlockContainer!");
        }

        this.inputContents = inputZoneContents;
        this.inputBookContents = inputBookZoneContents;
        this.outputContents = outputZoneContents;
        this.expBarContents = expBarZoneContents;

        this.experienceBlockStateData = experienceBlockStateData;

        this.tier = tile.tier;

        this.world = playerIn.player.world;
        this.experienceBlockTile = tile;

        trackIntArray(experienceBlockStateData);


        // The amount of pixels from the first pixel of one slot to the next slot
        final int SLOT_SPACING_X = 18;
        final int SLOT_SPACING_Y = 18;

        // Gui Pos of the player hotbar
        final int HOTBAR_XPOS = 8;
        final int HOTBAR_YPOS = 142;

        // Adding the player's hotbar to the gui - (x,y) loc of each item
        for (int x = 0; x < HOTBAR_SLOT_COUNT; x++) {
            addSlot(new Slot(playerIn, x, HOTBAR_XPOS + SLOT_SPACING_X * x, HOTBAR_YPOS));
        }

        // Adding the rest of the player's inventory
        for (int y = 0; y < PLAYER_INVENTORY_ROW_COUNT; y++) {
            for (int x = 0; x < PLAYER_INVENTORY_COLUMN_COUNT; x++) {
                int slotNumber = HOTBAR_SLOT_COUNT + y * PLAYER_INVENTORY_COLUMN_COUNT + x;

                // Gets the location of the slot using the positions and slot spacing
                int xpos = PLAYER_INVENTORY_XPOS + x * SLOT_SPACING_X;
                int ypos = PLAYER_INVENTORY_YPOS + y * SLOT_SPACING_Y;

                addSlot(new Slot(playerIn, slotNumber, xpos, ypos));

            }
        }


        // Input Slot
        final int INPUT_SLOT_XPOS = 44;
        final int INPUT_SLOT_YPOS = 15;

        // This looks stupid just for one slot but it gives the chance to upgrade in the future if I really want to
        for (int i = 0; i < INPUT_SLOTS; i++) {
            addSlot(new SlotInput(inputZoneContents, i, INPUT_SLOT_XPOS + SLOT_SPACING_X * i, INPUT_SLOT_YPOS));
        }

        // Input Slot
        final int INPUT_BOOK_SLOT_XPOS = 77;
        final int INPUT_BOOK_SLOT_YPOS = 32;

        // This looks stupid just for one slot but it gives the chance to upgrade in the future if I really want to
        for (int i = 0; i < INPUT_SLOTS; i++) {
            addSlot(new SlotInputBook(inputBookZoneContents, i, INPUT_BOOK_SLOT_XPOS + SLOT_SPACING_X * i, INPUT_BOOK_SLOT_YPOS));
        }


        // Output Slot
        final int OUTPUT_SLOT_XPOS = 44;
        final int OUTPUT_SLOT_YPOS = 50;

        for (int i = 0; i < OUTPUT_SLOTS; i++) {
            addSlot(new SlotOutput(outputZoneContents, i, OUTPUT_SLOT_XPOS + SLOT_SPACING_X * i, OUTPUT_SLOT_YPOS));
        }

        // Exp Slot
//        final int EXP_SLOT_SPACING_X = 21;
//        final int EXP_SLOT_SPACING_Y = 72;
//
//        final int EXP_SLOT_XPOS = 8;
//        final int EXP_SLOT_YPOS = 7;
    }

    public double fractionOfExpAmount(){
        int expAmount = experienceBlockTile.getExpBlockAmount();
        if(expAmount == 0) return 0;
        double fraction = (double) expAmount / experienceBlockTile.getMaxExpFromTier(tier);;
        return MathHelper.clamp(fraction, 0.0, 1.0);
    }

    @Override
    public boolean canInteractWith(PlayerEntity playerIn) {
        return inputContents.isUsableByPlayer(playerIn) && outputContents.isUsableByPlayer(playerIn);
    }

    @Override
    public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) {
        Slot sourceSlot = inventorySlots.get(index);

        if(sourceSlot == null || !sourceSlot.getHasStack()) return ItemStack.EMPTY;

        ItemStack sourceItemStack = sourceSlot.getStack();
        ItemStack sourceStackBeforeMerge = sourceItemStack.copy();
        boolean successfulTransfer = false;

        SlotZone sourceZone = SlotZone.getZoneFromIndex(index);

        switch (sourceZone){
            case OUTPUT_ZONE:
            case INPUT_ZONE:
            case INPUT_BOOK_ZONE:
                successfulTransfer = mergeInto(SlotZone.PLAYER_MAIN_INVENTORY, sourceItemStack, false);
                if(!successfulTransfer){
                    successfulTransfer = mergeInto(SlotZone.PLAYER_HOTBAR, sourceItemStack, false);
                }
                break;
            case PLAYER_HOTBAR:
            case PLAYER_MAIN_INVENTORY:
                if(ExperienceBlockTile.doesItemHaveExpTag(sourceItemStack)){
                    successfulTransfer = mergeInto(SlotZone.INPUT_BOOK_ZONE, sourceItemStack, false);
                }
                if(!successfulTransfer){
                    if(sourceZone == SlotZone.PLAYER_HOTBAR){
                        successfulTransfer = mergeInto(SlotZone.PLAYER_MAIN_INVENTORY, sourceItemStack, false);
                    } else {
                        successfulTransfer = mergeInto(SlotZone.PLAYER_HOTBAR, sourceItemStack, false);
                    }
                }
                break;
            default:
                throw new IllegalArgumentException("Unexpected sourceZone: " + sourceZone);
        }

        if(!successfulTransfer) return ItemStack.EMPTY;

        if(sourceItemStack.isEmpty()){
            sourceSlot.putStack(ItemStack.EMPTY);
        } else {
            sourceSlot.onSlotChanged();
        }

        if(sourceItemStack.getCount() == sourceStackBeforeMerge.getCount()){
            return ItemStack.EMPTY;
        }

        sourceSlot.onTake(playerIn, sourceItemStack);
        return sourceStackBeforeMerge;
    }

    private boolean mergeInto(SlotZone dest, ItemStack sourceItemStack, boolean fillFromEnd){
        return mergeItemStack(sourceItemStack, dest.firstIndex, dest.lastIndexPlus1, fillFromEnd);
    }

    private enum SlotZone{
        INPUT_ZONE(INPUT_SLOT_INDEX, INPUT_SLOTS),
        INPUT_BOOK_ZONE(INPUT_BOOK_SLOT_INDEX, INPUT_BOOK_SLOTS),
        OUTPUT_ZONE(OUTPUT_SLOT_INDEX, OUTPUT_SLOTS),
        EXP_ZONE(EXP_BAR_SLOT_INDEX, EXP_BAR_SLOT),
        PLAYER_MAIN_INVENTORY(PLAYER_INVENTORY_FIRST_SLOT_INDEX, PLAYER_INVENTORY_SLOT_COUNT),
        PLAYER_HOTBAR(HOTBAR_FIRST_SLOT_INDEX, HOTBAR_SLOT_COUNT);

        public final int firstIndex;
        public final int slotCount;
        public final int lastIndexPlus1;


        SlotZone(int firstIndex, int numberOfSlots){
            this.firstIndex = firstIndex;
            this.slotCount = numberOfSlots;
            this.lastIndexPlus1 = firstIndex + numberOfSlots;
        }

        public static SlotZone getZoneFromIndex(int slotIndex){
            for(SlotZone slotZone : SlotZone.values()){
                if(slotIndex >= slotZone.firstIndex && slotIndex < slotZone.lastIndexPlus1) return slotZone;
            }
            throw new IndexOutOfBoundsException("Unexpected slotIndex");
        }
    }

    //region Buttons for ExperienceBlockScreen

    // Plus Buttons ADD experience to the blockM
    // ADDING a single level to the block at a time
    public void singlePlusOnButtonPress(PlayerEntity playerIn){

        int expLevel = playerIn.experienceLevel;
        int expTotal = playerIn.experienceTotal;

        int expBlockAmount = experienceBlockTile.getExpBlockAmount();
        int expMaxAmount = experienceBlockTile.getMaxExpFromTier(tier);

        // Check if we have reached our cap
        if(expBlockAmount == expMaxAmount){
            return;
        }

        // The amount of exp to take away from the player
        int expToTake;

        // Check if the player is level 0, if they are then check if they have 6 or less exp to take the dregs,
        // else just take the exp normally
        if(expLevel == 0){
            if(expTotal < 7){
                expToTake = expTotal;
            }
            else{
                return;
            }
        } else{
            expToTake = ExperienceHelper.takeExpToPrevLevel(expLevel);
        }

        // Check if the amount coming in can fit well under the cap, if not
        // then lower the amount and continue
        if(expToTake + expBlockAmount > expMaxAmount){
            expToTake = expMaxAmount - expBlockAmount;
        }

        playerIn.giveExperiencePoints(-expToTake);
        experienceBlockTile.addExpAmount(expToTake);
    }

    // ADDING all of the levels to the block
    public void doublePlusOnButtonPress(PlayerEntity playerIn){

        int expLevel = playerIn.experienceLevel;
        int expTotal = playerIn.experienceTotal;

        int expBlockAmount = experienceBlockTile.getExpBlockAmount();
        int maxExp = experienceBlockTile.getMaxExpFromTier(tier);

        // Check if we have reached our cap
        if(expBlockAmount == maxExp){
            return;
        }

        // Check if player is level 0 and has less than 7 exp
        int expToTake;
        if(expLevel == 0){
            if(expTotal < 7){
                expToTake = expTotal;
            } else{
                return;
            }
        } else{
            expToTake = expTotal;
        }

        // Clean up the dregs in the player exp bar
        if(expToTake + expBlockAmount > maxExp){
            expToTake = maxExp - expBlockAmount;
        }

        playerIn.giveExperiencePoints(-expToTake);
        experienceBlockTile.addExpAmount(expToTake);
    }

    // Minus Buttons TAKE AWAY experience from the block
    // TAKE AWAY a single level from the block
    public void singleMinusOnButtonPress(PlayerEntity playerIn){

        int expLevel = playerIn.experienceLevel;
        int expTotal = playerIn.experienceTotal;

        int expBlockAmount = experienceBlockTile.getExpBlockAmount();
        int maxExp = experienceBlockTile.getMaxExpFromTier(tier);

        if(expBlockAmount == 0){
            return;
        }

        int expToTake;
        int amountNeededToNextLevel = ExperienceHelper.recieveExpToNextLevel(expLevel);

        // Clean up the dregs stored in the block
        if(amountNeededToNextLevel > expBlockAmount){
            expToTake = expBlockAmount;
        } else {
            expToTake = amountNeededToNextLevel;
        }

        playerIn.giveExperiencePoints(expToTake);
        experienceBlockTile.takeExpAmount(expToTake);
    }

    // TAKING AWAY all of the levels in the block
    public void doubleMinusOnButtonPress(PlayerEntity playerIn){

        int expLevel = playerIn.experienceLevel;
        int expTotal = playerIn.experienceTotal;

        int expBlockAmount = experienceBlockTile.getExpBlockAmount();
        int maxExp = experienceBlockTile.getMaxExpFromTier(tier);

        if(expBlockAmount == 0){
            return;
        }

        int expToTake = expBlockAmount;

        // Clean up the dregs stored in the block
        if(expToTake > expBlockAmount) {
            expToTake = expBlockAmount;
        }

        playerIn.giveExperiencePoints(expToTake);
        experienceBlockTile.takeExpAmount(expToTake);
    }
    //endregion


    public class SlotInput extends Slot {

        public SlotInput(IInventory inventoryIn, int index, int xPosition, int yPosition) {
            super(inventoryIn, index, xPosition, yPosition);
        }

        @Override
        public boolean isItemValid(ItemStack stack) {
            return ExperienceBlockTile.isItemValidForInputSlot(stack);
        }
    }

    public class SlotInputBook extends Slot {

        public SlotInputBook(IInventory inventoryIn, int index, int xPosition, int yPosition) {
            super(inventoryIn, index, xPosition, yPosition);
        }

        @Override
        public boolean isItemValid(ItemStack stack) {
            return ExperienceBlockTile.isItemValidForInputSlot(stack);
        }
    }

    public class SlotOutput extends Slot {

        public SlotOutput(IInventory inventoryIn, int index, int xPosition, int yPosition) {
            super(inventoryIn, index, xPosition, yPosition);
        }

        @Override
        public boolean isItemValid(ItemStack stack) {
            return ExperienceBlockTile.isItemValidForOutputSlot(stack);
        }
    }

    public class SlotExp extends Slot {

        public SlotExp(IInventory inventoryIn, int index, int xPosition, int yPosition) {
            super(inventoryIn, index, xPosition, yPosition);
        }
    }
}

And my github repo, under the correct branch: https://github.com/RhysGrabany/Experienced/tree/ticking_entity_exp_book

 

Thank you in advance! Hopefully I didn't do/say anything too dumb.

Edited by IntentScarab
Issue solved
Posted
  On 3/30/2021 at 12:26 PM, IntentScarab said:

when I click a button, the Container deals with the logic then sends the updated data to the TileEntity for it to be changed. I originally had everything the button does on the Container, but it wasn't saving the data when I closed the gui so I hope this is the way things are supposed to be.

Expand  

Shocker, the server controls game state. Doing things on the client means the server sends an update and overwrites the client's changed values making it look like "it didn't save."

Of course it didn't save, you didn't tell the server fuckall.

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.

Posted

Gui Screens are never on the server. As emphasized by the fact that the Screen class is in the client namespace.

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.

Posted

Is the TileEntity on the Server or Client side? Cause that's what I'm using here. I am making changes to an object that holds the data I need, kinda like how MBE does it. But I'm doing this through the tick method of the Tile. I look at the debugger and it says that the object has the amount of exp from the book, book has none, then when I try to get the exp out of the block using the buttons then it tells me I haven't got any exp in the block. Am I missing something here?

Posted
  On 3/30/2021 at 4:51 PM, diesieben07 said:

A tile entity will exist on both server and client.

Expand  

Ahh okay, so it's server side usually but when the gui is opened it's client side, I'm guessing? I'm sorry, but I still don't understand how changing the data on the TE by the TE doesn't result in any change with the data. I'm reading through the code from MBE and there isn't something super obvious that I'm missing...

The only big change is that I pass my tile to the container, and they don't markDirty after modifying their furnaceStateData; they only do it on items being moved from one slot to the other from what I can see.

This is the MBE topic I'm using as reference btw.

 

Posted

That worked!! One simple line and it worked. The update to the block state is in MBE, but I didn't think it pertained to me cause it was dealing with the faces of the block with fuel burning. Omg thank you so much.

Here, since I have you could I have some help on the same sort of problem? The item I have uses the durability bar to show how full it is, when it is getting the exp taken out of it the bar doesn't update. How would I update the durability bar of the item to go down as the amount decreases? Right now I have to right click on it and it tells me it is empty.

Posted

For future reference, this is the code I added to make it work:

BlockState state = world.getBlockState(this.pos);
world.notifyBlockUpdate(this.pos, state, state, 2);

I added this to the end of my tick() method and it works.

  • IntentScarab changed the title to (SOLVED) [1.16.4] Saving Block data doesn't work with TileEntity, but does when Container uses the TileEntity

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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Looking to score big savings on your favorite products? The acr639380 Temu coupon code is your ticket to maximum benefits — whether you’re in the USA, Canada, or Europe. This powerful discount code is perfect for both new and existing customers, unlocking exclusive discounts, special offers, free gifts, and unique bundles. So, whether you’re searching for a Temu 40% off coupon for new customers or a Temu coupon code for existing users in 2025, this guide has got you covered. Let’s dive into how you can make the most out of this amazing discount.  What Is the Temu 40% Off Coupon Code? The Temu 40% off coupon code is an exclusive promotional offer designed to help shoppers save big across a wide variety of products. Best of all — it works for both first-time users and returning shoppers.  Key Benefits of Using Code acr639380: 40% off your first order for new customers.   $100 coupon bundle for new users, redeemable across multiple purchases.   40% discount for existing customers on select items.   Additional $100 off promo code for loyal customers in the USA and Canada.   Free shipping to over 68 countries, including the USA, Canada, and Europe.   Extra 30% off on any item, stacking with ongoing promotions.   Free gifts with express shipping for loyal customers.   This makes it one of the most versatile and rewarding discount codes available on Temu right now.  Temu Coupon Code 40% Off for New Users If you’re new to Temu, you’re in luck! The acr639380 code brings new users unmatched benefits: Flat 40% off your first purchase — making it the ideal chance to grab your wishlist items.   $100 coupon bundle available immediately after signup.   Up to $100 in bonus coupon packs for future purchases.   Free shipping to over 68 countries.   An additional 30% discount on select products for first-time customers.   New shoppers should definitely take advantage of this code to experience Temu’s massive catalog without overspending.  How to Redeem the Temu 40% Off Coupon Code (For New Customers) Redeeming the code is easy — just follow these steps: Visit the Temu website or open the app.   Sign up for a new account.   Browse and add items to your shopping cart.   At checkout, enter the code acr639380 in the promo code box.   Click ‘Apply’ — your total will instantly reduce by 40%.   Complete your order and enjoy your savings!    Temu Coupon Code 40% Off for Existing Customers Good news — it’s not just new users who get to save. Existing Temu shoppers can also use the acr639380 code to access great discounts: 40% off select items.   $100 coupon bundle for multiple purchases.   Free express shipping and gifts for loyal customers in the USA and Canada.   An additional 30% discount on top of other ongoing deals.   Free shipping to 68+ countries.   It’s an excellent way to continue enjoying deals even after your first order.  How to Use the Temu 40% Off Coupon Code (For Existing Users) If you already have a Temu account: Log into your Temu account.   Add your favorite products to your cart.   Proceed to checkout and enter acr639380 in the “Apply Coupon” section.   Click ‘Apply’ and watch your total drop by 40%.   Complete your purchase and enjoy those savings.    Where to Find the Latest Temu 40% Off Coupon Codes Want to stay ahead with fresh discounts? Here’s where to find verified, up-to-date Temu coupons: Sign up for Temu’s newsletter to receive promo codes directly to your inbox.   Follow Temu’s official social media pages for exclusive discount announcements.   Check reputable coupon websites that regularly update new Temu promo codes.   Visit Temu’s in-app promotions section for seasonal offers and flash sales.    How Temu 40% Off Coupons Work The Temu 40% off coupons apply directly at checkout, reducing your order total by 40%. These codes often don’t have expiration dates and can be combined with other promotions in select cases. Simply enter the code before finalizing payment to enjoy instant savings.  How to Earn 40% Off Coupons as a New Customer New customers can unlock this special offer easily: Sign up for the Temu app or website.   Receive a welcome package of promo codes and discounts via email.   Apply the acr639380 code during your first purchase for instant 40% off.    Advantages of Using Temu 40% Off Coupons Why use this code? Here’s what makes it worth it: Massive 40% discount on your first order.   $100 coupon bundle for new shoppers.   70% off popular products on top of existing deals.   Additional 30% off for existing customers.   Free international shipping to 68 countries.   No expiration date for ongoing savings.    Temu Free Gifts and Special Deals (2025) More than just discounts — using acr639380 gives you access to these exclusive perks: Free gift for new customers with your first order.   40% off first and existing customer purchases.   Extra 30% off storewide.   Up to 70% off select trending products.   Free express shipping to the USA, Canada, and Europe.    Pros and Cons of Using Temu 40% Off Coupon Code Pros Cons 40% off for both new and existing customers Some items may not be eligible for discounts $100 coupon bundle for new customers Limited regional availability for certain coupons Additional 30% discounts on selected products May only apply to specific product categories Free shipping to 68+ countries Occasional limited stock on high-demand items No expiration date on most promo codes Not all promotions can be stacked together  Temu 40% Off Coupon Terms & Conditions (2025) Valid for both new and existing users.   Available in USA, Canada, Europe, and 68 other countries.   No minimum purchase required.   Multiple uses permitted as per promo eligibility.   Most codes, including acr639380, have no set expiration date.   Cannot be combined with select limited-time sitewide promotions.    Final Thoughts The Temu coupon code 40% off (acr639380) is one of the best ways to save big on your favorite products in 2025. Whether you’re a new shopper looking for your first big discount or a loyal customer hunting for the next great deal, this code delivers value every time. Don’t miss out — apply the acr639380 code at checkout and start saving today!  FAQs About Temu 40% Off Coupon Code Q: Is the Temu 40% off coupon for first-time users only? No — it’s available for both new and existing customers. Q: How do I redeem the Temu coupon code 40% off? Enter acr639380 in the promo code box at checkout and click ‘Apply’. Q: Can I use this code for multiple purchases? Yes — depending on promo rules and item eligibility. Q: Does the Temu 40% off coupon have an expiration date? No — most Temu codes, including this one, don’t expire. Q: Can I share the Temu coupon code with my friends? Absolutely! Share the acr639380 code and let them enjoy the savings too.
    • Thank you so much! I didnt see it in the log😭😭  
    • Verified user can get a $100 off Temu   Coupon code using the code ((“aci789589”)). This Temu   $100 Off code is specifically for new and existing customers both and can be redeemed to receive a $100 discount on your purchase. Our exclusive Temu   Coupon code offers a flat $100 off your purchase, plus an additional 100% discount on top of that. You can slash prices by up to $100 as a new Temu   customer using code ((“aci789589”)). Existing users can enjoy $100 off their next haul with this code. But that’s not all! With our Temu   Coupon codes for 2025, you can get up to 90% discount on select items and clearance sales. Whether you’re a new customer or an existing shopper, our Temu   codes provide extra discounts tailored just for you. Save up to 100% with these current Temu   Coupons ["^"aci789589 "^"] for April 2025. The latest Temu   coupon codes at here. New users at Temu   receive a $100 discount on orders over $100 Use the code ((“aci789589”)) during checkout to get Temu   Coupon $100 Off For New Users. You can save $100 Off your first order with the coupon code available for a limited time only. Temu   90% Off promo code ((“aci789589”)) will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Yes, Temu   offers $100 Off coupon code “aci789589” for first time users. You can get a $100 bonus plus $100 Off any purchase at Temu   with the $100 Coupon Bundle at Temu   if you sign up with the referral code ((“aci789589”)) and make a first purchase of $100 or more. Free Temu   codes $100 off — ((“aci789589”)) Temu   Coupon $100 off — ((“aci789589”)) Temu   Coupon 100% off — ((“aci789589”)) Temu   Memorial Day Sale $100 off — ((“aci789589”)) Temu   Coupon code today — ((“aci789589”)) Temu   free gift code — ["^"aci789589"^"](Without inviting friends or family member) Temu   Coupon code for  USA      - $100 Off— ((“aci789589”)) Temu   Coupon code  USA     - $100 Off— ((“aci789589”)) Temu   Coupon code USA  - $100 Off — ((“aci789589”)) Temu   Coupon code Japan - $100 Off — ((“aci789589”)) Temu   Coupon code Mexico - $100 Off — ((“aci789589”)) Temu   Coupon code Chile - $100 Off — ((“aci789589”)) Temu   Coupon code USA - $100 Off — ((“aci789589”)) Temu   Coupon code Colombia - $100 Off — ((“aci789589”)) Temu   Coupon code Malaysia - $100 Off — ((“aci789589”)) Temu   Coupon code Philippines - $100 Off — ((“aci789589”)) Temu   Coupon code South Korea - $100 Off — ((“aci789589”)) Redeem Free Temu   Coupon Code ["^"aci789589"^"] for first-time users Get a $100 discount on your Temu   order with the promo code "aci789589". You can get a discount by clicking on the item to purchase and entering this Temu   Coupon code $100 off ((“aci789589”)). Temu   New User Coupon ((“aci789589)): Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout. Temu   Coupon Codes For Existing Users ((“aci789589”)): $100 Price Slash Have you been shopping on Temu   for a while? Our Temu   Coupon for existing customers is here to reward you for your continued support, offering incredible discounts on your favorite products. Temu   Coupon For $100 Off ((“aci789589”)): Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   Coupon for $100 off! Our amazing Temu   $100 off coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Temu   Coupon Code For $100 Off ((“aci789589”)): For Both New And Existing Customers Our incredible Temu   Coupon code for $100 off is here to help you save big on your purchases. Whether you’re a new user or an existing customer, our $100 off code for Temu   will give you an additional discount! Temu   Coupon Bundle ((“aci789589”)): Flat $100 Off + Up To $100 Discount Get ready for an unbelievable deal with our Temu   Coupon bundle for 2025! Our Temu   Coupon bundles will give you a flat $100 discount and an additional $100 off on top of it. Free Temu   Coupons ((“aci789589”)): Unlock Unlimited Savings! Get ready to unlock a world of savings with our free Temu   Coupons! We’ve got you covered with a wide range of Temu   Coupon code options that will help you maximize your shopping experience. 100% Off Temu   Coupons, Promo Codes + 25% Cash Back ((“aci789589”)) Redeem Temu   Coupon Code ((“aci789589”)) Temu   Coupon $100 OFF ((“aci789589”)) Temu   Coupon $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu   Coupon $100 OFF FIRST ORDER ((“aci789589”)) Temu   Coupon $100 OFF REDDIT ((“aci789589”)) Temu   Coupon $100 OFF FOR EXISTING CUSTOMERS REDDIT ((“aci789589”)) Temu   $100 OFF CODE ((“aci789589”)) Temu   70 OFF COUPON 2025 ((“aci789589”)) DOMINOS 70 RS OFF COUPON CODE ((“aci789589”)) WHAT IS A COUPON RATE ((“aci789589”)) Temu   $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu   $100 OFF FIRST ORDER ((“aci789589”)) Temu   $100 OFF FREE SHIPPING ((“aci789589”)) You can get an exclusive $100 off discount on your Temu   purchase with the code [aci789589] Or [aci789589].This code is specially designed for new customers and offers a significant price cut on your shopping. Make your first purchase on Temu   more rewarding by using this code to get $100 off instantly. Temu   Coupon Code For $100 Off [aci789589] Or [aci789589]: Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   coupon for $100 off! Our coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Exclusive Temu   Discount Code [aci789589] Or [aci789589]: Flat $200 OFF for New and Existing Customers Using our Temu   promo code you can get A$ 200 off your order and 100% off using our Temu   promo code [aci789589] Or [aci789589]. As a new Temu   customer, you can save up to $100 using this promo code. For returning users, our Temu   promo code offers a $100 price slash on your next shopping spree. This is our way of saying thank you for shopping with us! Best Temu   Deals and Coupons [aci789589] Or [aci789589]: During 2025, Temu   coupon codes offer discounts of up to 90% on select items, making it possible for both new and existing users to get incredible deals. From $100 off deals to 100% discounts, our Temu   promo codes make shopping more affordable than ever. Temu   Coupon Code For $100% Off [aci789589] Or [aci789589]: For Both New And Existing Customers Free Temu   $100 Off Code — [aci789589] Or [aci789589] Temu   Coupon 100% Off — [aci789589] Or [aci789589] Temu   Memorial Day Sale - $100 Off — [aci789589] Or [aci789589] Temu   Free Gift Code — [aci789589] Or [aci789589] Temu   $500 Off Code — [aci789589 ] Or [aci789589] Best Temu   $200 Off Code — [aci789589 ] Or [aci789589] Temu   Coupon Code first order — [aci789589] Or [aci789589] Temu   Coupon Code for New user — [aci789589] Or [aci789589] Temu   Coupon Code A$100 off — [aci789589] Or [aci789589] Temu   Coupon Code $50 off — [aci789589] Or [aci789589] Temu   Coupon Code $100 off — [aci789589] Or [aci789589] Temu   Promo Code 2025 — [aci789589] Or [aci789589] Temu   Coupon Code $200 off — [aci789589] Or [aci789589] Temu   Coupon Code $90 off — [aci789589] Or [aci789589] Temu   Sign up Bonus Code — [aci789589] Or [aci789589] Temu   Coupon Code A$120 off — [aci789589] Or [aci789589] Our exclusive Temu   coupon code allows you to take a flat $200 off your purchase with an added 100% discount on top. As a new Temu   shopper, you can save up to $100 using code [aci789589] Or [aci789589]. Returning customers can also enjoy a $100 discount on their next purchases with this code. Temu   Coupon Code for Your Country Sign-up Bonus Temu   $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code  USA     [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code USA  [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Japan [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Mexico [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Chile [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code USA [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Colombia [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Malaysia [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Philippines [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code South Korea [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Pakistan [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Finland [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Saudi Arabia [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Qatar [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code France [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Germany [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code  USA   [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Israel [aci789589] Or [aci789589] - 100% off Get a $100 discount on your Temu   order with the promo code [aci789589] Or [aci789589]. You can get a discount by clicking on the item to purchase and entering this Temu   coupon code $100 off [aci789589] Or [aci789589]. Temu   Coupon Code [aci789589] Or [aci789589]: Get Up To 90% OFF In NOV 2025 Are you looking for the best Temu   coupon codes to get amazing discounts? Our Temu   coupons are perfect for getting those extra savings you crave. We regularly test our coupon codes for Temu   to ensure they work flawlessly, giving you a guaranteed discount every time. Temu   New User Coupon [aci789589] Or [aci789589]: Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout.
    • Verified user can get a $100 off Temu   Coupon code using the code ((“aci789589”)). This Temu   $100 Off code is specifically for new and existing customers both and can be redeemed to receive a $100 discount on your purchase. Our exclusive Temu   Coupon code offers a flat $100 off your purchase, plus an additional 100% discount on top of that. You can slash prices by up to $100 as a new Temu   customer using code ((“aci789589”)). Existing users can enjoy $100 off their next haul with this code. But that’s not all! With our Temu   Coupon codes for 2025, you can get up to 90% discount on select items and clearance sales. Whether you’re a new customer or an existing shopper, our Temu   codes provide extra discounts tailored just for you. Save up to 100% with these current Temu   Coupons ["^"aci789589 "^"] for April 2025. The latest Temu   coupon codes at here. New users at Temu   receive a $100 discount on orders over $100 Use the code ((“aci789589”)) during checkout to get Temu   Coupon $100 Off For New Users. You can save $100 Off your first order with the coupon code available for a limited time only. Temu   90% Off promo code ((“aci789589”)) will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Yes, Temu   offers $100 Off coupon code “aci789589” for first time users. You can get a $100 bonus plus $100 Off any purchase at Temu   with the $100 Coupon Bundle at Temu   if you sign up with the referral code ((“aci789589”)) and make a first purchase of $100 or more. Free Temu   codes $100 off — ((“aci789589”)) Temu   Coupon $100 off — ((“aci789589”)) Temu   Coupon 100% off — ((“aci789589”)) Temu   Memorial Day Sale $100 off — ((“aci789589”)) Temu   Coupon code today — ((“aci789589”)) Temu   free gift code — ["^"aci789589"^"](Without inviting friends or family member) Temu   Coupon code for  USA      - $100 Off— ((“aci789589”)) Temu   Coupon code  USA     - $100 Off— ((“aci789589”)) Temu   Coupon code USA  - $100 Off — ((“aci789589”)) Temu   Coupon code Japan - $100 Off — ((“aci789589”)) Temu   Coupon code Mexico - $100 Off — ((“aci789589”)) Temu   Coupon code Chile - $100 Off — ((“aci789589”)) Temu   Coupon code USA - $100 Off — ((“aci789589”)) Temu   Coupon code Colombia - $100 Off — ((“aci789589”)) Temu   Coupon code Malaysia - $100 Off — ((“aci789589”)) Temu   Coupon code Philippines - $100 Off — ((“aci789589”)) Temu   Coupon code South Korea - $100 Off — ((“aci789589”)) Redeem Free Temu   Coupon Code ["^"aci789589"^"] for first-time users Get a $100 discount on your Temu   order with the promo code "aci789589". You can get a discount by clicking on the item to purchase and entering this Temu   Coupon code $100 off ((“aci789589”)). Temu   New User Coupon ((“aci789589)): Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout. Temu   Coupon Codes For Existing Users ((“aci789589”)): $100 Price Slash Have you been shopping on Temu   for a while? Our Temu   Coupon for existing customers is here to reward you for your continued support, offering incredible discounts on your favorite products. Temu   Coupon For $100 Off ((“aci789589”)): Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   Coupon for $100 off! Our amazing Temu   $100 off coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Temu   Coupon Code For $100 Off ((“aci789589”)): For Both New And Existing Customers Our incredible Temu   Coupon code for $100 off is here to help you save big on your purchases. Whether you’re a new user or an existing customer, our $100 off code for Temu   will give you an additional discount! Temu   Coupon Bundle ((“aci789589”)): Flat $100 Off + Up To $100 Discount Get ready for an unbelievable deal with our Temu   Coupon bundle for 2025! Our Temu   Coupon bundles will give you a flat $100 discount and an additional $100 off on top of it. Free Temu   Coupons ((“aci789589”)): Unlock Unlimited Savings! Get ready to unlock a world of savings with our free Temu   Coupons! We’ve got you covered with a wide range of Temu   Coupon code options that will help you maximize your shopping experience. 100% Off Temu   Coupons, Promo Codes + 25% Cash Back ((“aci789589”)) Redeem Temu   Coupon Code ((“aci789589”)) Temu   Coupon $100 OFF ((“aci789589”)) Temu   Coupon $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu   Coupon $100 OFF FIRST ORDER ((“aci789589”)) Temu   Coupon $100 OFF REDDIT ((“aci789589”)) Temu   Coupon $100 OFF FOR EXISTING CUSTOMERS REDDIT ((“aci789589”)) Temu   $100 OFF CODE ((“aci789589”)) Temu   70 OFF COUPON 2025 ((“aci789589”)) DOMINOS 70 RS OFF COUPON CODE ((“aci789589”)) WHAT IS A COUPON RATE ((“aci789589”)) Temu   $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu   $100 OFF FIRST ORDER ((“aci789589”)) Temu   $100 OFF FREE SHIPPING ((“aci789589”)) You can get an exclusive $100 off discount on your Temu   purchase with the code [aci789589] Or [aci789589].This code is specially designed for new customers and offers a significant price cut on your shopping. Make your first purchase on Temu   more rewarding by using this code to get $100 off instantly. Temu   Coupon Code For $100 Off [aci789589] Or [aci789589]: Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   coupon for $100 off! Our coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Exclusive Temu   Discount Code [aci789589] Or [aci789589]: Flat $200 OFF for New and Existing Customers Using our Temu   promo code you can get A$ 200 off your order and 100% off using our Temu   promo code [aci789589] Or [aci789589]. As a new Temu   customer, you can save up to $100 using this promo code. For returning users, our Temu   promo code offers a $100 price slash on your next shopping spree. This is our way of saying thank you for shopping with us! Best Temu   Deals and Coupons [aci789589] Or [aci789589]: During 2025, Temu   coupon codes offer discounts of up to 90% on select items, making it possible for both new and existing users to get incredible deals. From $100 off deals to 100% discounts, our Temu   promo codes make shopping more affordable than ever. Temu   Coupon Code For $100% Off [aci789589] Or [aci789589]: For Both New And Existing Customers Free Temu   $100 Off Code — [aci789589] Or [aci789589] Temu   Coupon 100% Off — [aci789589] Or [aci789589] Temu   Memorial Day Sale - $100 Off — [aci789589] Or [aci789589] Temu   Free Gift Code — [aci789589] Or [aci789589] Temu   $500 Off Code — [aci789589 ] Or [aci789589] Best Temu   $200 Off Code — [aci789589 ] Or [aci789589] Temu   Coupon Code first order — [aci789589] Or [aci789589] Temu   Coupon Code for New user — [aci789589] Or [aci789589] Temu   Coupon Code A$100 off — [aci789589] Or [aci789589] Temu   Coupon Code $50 off — [aci789589] Or [aci789589] Temu   Coupon Code $100 off — [aci789589] Or [aci789589] Temu   Promo Code 2025 — [aci789589] Or [aci789589] Temu   Coupon Code $200 off — [aci789589] Or [aci789589] Temu   Coupon Code $90 off — [aci789589] Or [aci789589] Temu   Sign up Bonus Code — [aci789589] Or [aci789589] Temu   Coupon Code A$120 off — [aci789589] Or [aci789589] Our exclusive Temu   coupon code allows you to take a flat $200 off your purchase with an added 100% discount on top. As a new Temu   shopper, you can save up to $100 using code [aci789589] Or [aci789589]. Returning customers can also enjoy a $100 discount on their next purchases with this code. Temu   Coupon Code for Your Country Sign-up Bonus Temu   $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code  USA     [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code USA  [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Japan [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Mexico [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Chile [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code USA [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Colombia [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Malaysia [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Philippines [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code South Korea [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Pakistan [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Finland [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Saudi Arabia [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Qatar [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code France [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Germany [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code  USA   [aci789589] Or [aci789589] - 100% off Temu   $100 Off Code Israel [aci789589] Or [aci789589] - 100% off Get a $100 discount on your Temu   order with the promo code [aci789589] Or [aci789589]. You can get a discount by clicking on the item to purchase and entering this Temu   coupon code $100 off [aci789589] Or [aci789589]. Temu   Coupon Code [aci789589] Or [aci789589]: Get Up To 90% OFF In NOV 2025 Are you looking for the best Temu   coupon codes to get amazing discounts? Our Temu   coupons are perfect for getting those extra savings you crave. We regularly test our coupon codes for Temu   to ensure they work flawlessly, giving you a guaranteed discount every time. Temu   New User Coupon [aci789589] Or [aci789589]: Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout.
    • So im completely new to modding in general, i have some experience in Behavior packs in minecraft bedrock and i would like to modify entities stats and attributes like in a behavior pack (health, damage, speed, xp drop...). The problem is that i cant find any information online on how to do that, and I have no clue on what to do and where to start. I am currently modding in 1.20.4 with IntelliJ if that helps. My final objective is to buff mobs health and damage (double it for exemple), but since there is no entity file anywhere i don't know how to change it... 😢
  • Topics

×
×
  • Create New...

Important Information

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