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

    • New users at Temu receive a $100 Off discount on orders over $100 Off Use the code [acw883306] during checkout to get Temu Discount of $100 For New Users. Yes, Temu offers $100 Off coupon code {[acw883306}] for first-time users. You can get a $100 bonus plus $100 Off any purchase at Temu with the $100 Coupon Bundle if you sign up with the referral code [acw883306] and make a first purchase of $100 or more. Yes, Temu offers a $100 Off Coupon Code “acw883306” for first-time users. You can get a $100 discount with Temu coupon code ((acw883306)). This exclusive offer is for existing customers and can be used for a $100 reduction on your total purchase. Enter coupon code acw883306 at checkout to avail of the discount. You can use the code ((acw883306)) to get a $100 Off Temu coupon as a new customer. Apply this Temu coupon code $100 Off (acw883306) to get a $100 discount on your shopping with Temu . If you're a first-time user looking for a Temu coupon code for $100 first-time user (acw883306) then using this code will give you a flat $100 Off and a $100 discount on your Temu shopping. Temu 's existing customer 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. acw883306: New users can get up to 80% extra off. acw883306: Get a massive $100 Off your first order! acw883306: Get 20% off on your first order; no minimum spending required. acw883306: Take an extra 15% off your first order on top of existing discounts. acw883306: Temu UK Enjoy a $100 discount on your entire first purchase. We regularly test and verify these Temu first-time customer coupon codes to ensure they work perfectly for you. So, grab your favorite coupon code and start shopping today. Temu Coupon Code $100 Off For First-Time Users If you wish to join Temu , you should use this exclusive Temu coupon code (acw883306) to get $100 Off your purchase. The $100 Off code for Temu is (acw883306). Remember to enter this code during the checkout process to enjoy the $100 discount on your purchase. Verified Temu Coupon Codes For June and July 2025 Temu coupon code $100 Off - (acw883306) $100 Off Temu Coupon code - acw883306 30% Off Temu coupon code - (acw883306) Flat 40 Off Temu exclusive code - (acw883306) Temu 90% Discount Code: (acw883306) Temu Coupon Codes For Existing Users: $100 Discount Code To get the most out of your shopping experience, download the Temu app and apply our Temu coupon codes for existing users at checkout. Check out these five fantastic Temu coupons for existing users: acw883306: Slash $100 Off your order as a token of our appreciation! acw883306: Enjoy a $100 discount on your next purchase. acw883306: Get an extra 25% off on top of existing discounts. acw883306: Loyal Temu shoppers from UAE can take $100 Off their entire order. Verified user can get a $100 Off Temu Coupon code using the code ((“acw883306”)). 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 ((“acw883306”)). 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 ["^"acw883306 "^"] 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 ((“acw883306”)) 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 $100 Off promo code ((“acw883306”)) 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 “acw883306” 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 ((“acw883306”)) and make a first purchase of $100 or more. Free Temu codes $100 Off — ((“acw883306”)) Temu Coupon $100 Off — ((“acw883306”)) Temu Coupon 100% off — ((“acw883306”)) Temu Memorial Day Sale $100 Off — ((“acw883306”)) Temu Coupon code today — ((“acw883306”)) Temu free gift code — ["^"acw883306"^"](Without inviting friends or family member) Temu Coupon code for USA - $100 Off— ((“acw883306”)) Temu Coupon code USA - $100 Off— ((“acw883306”)) Temu Coupon code USA - $100 Off — ((“acw883306”)) Temu Coupon code Japan - $100 Off — ((“acw883306”)) Temu Coupon code Mexico - $100 Off — ((“acw883306”)) Temu Coupon code Chile - $100 Off — ((“acw883306”)) Temu Coupon code USA - $100 Off — ((“acw883306”)) Temu Coupon code Colombia - $100 Off — ((“acw883306”)) Temu Coupon code Malaysia - $100 Off — ((“acw883306”)) Temu Coupon code Philippines - $100 Off — ((“acw883306”)) Temu Coupon code South Korea - $100 Off — ((“acw883306”)) Redeem Free Temu Coupon Code ["^"acw883306"^"] for first-time users Get a $100 discount on your Temu order with the promo code "acw883306". You can get a discount by clicking on the item to purchase and entering this Temu Coupon code $100 Off ((“acw883306”)). Temu New User Coupon ((“acw883306)): 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 ((“acw883306”)): $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 ((“acw883306”)): Get A Flat $100 Discount On Order Value  
    • New users at Temu receive a $100 Off discount on orders over $100 Off Use the code [acw883306] during checkout to get Temu Discount of $100 For New Users. Yes, Temu offers $100 Off coupon code {[acw883306}] for first-time users. You can get a $100 bonus plus $100 Off any purchase at Temu with the $100 Coupon Bundle if you sign up with the referral code [acw883306] and make a first purchase of $100 or more. Yes, Temu offers a $100 Off Coupon Code “acw883306” for first-time users. You can get a $100 discount with Temu coupon code ((acw883306)). This exclusive offer is for existing customers and can be used for a $100 reduction on your total purchase. Enter coupon code acw883306 at checkout to avail of the discount. You can use the code ((acw883306)) to get a $100 Off Temu coupon as a new customer. Apply this Temu coupon code $100 Off (acw883306) to get a $100 discount on your shopping with Temu . If you're a first-time user looking for a Temu coupon code for $100 first-time user (acw883306) then using this code will give you a flat $100 Off and a $100 discount on your Temu shopping. Temu 's existing customer 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. acw883306: New users can get up to 80% extra off. acw883306: Get a massive $100 Off your first order! acw883306: Get 20% off on your first order; no minimum spending required. acw883306: Take an extra 15% off your first order on top of existing discounts. acw883306: Temu UK Enjoy a $100 discount on your entire first purchase. We regularly test and verify these Temu first-time customer coupon codes to ensure they work perfectly for you. So, grab your favorite coupon code and start shopping today. Temu Coupon Code $100 Off For First-Time Users If you wish to join Temu , you should use this exclusive Temu coupon code (acw883306) to get $100 Off your purchase. The $100 Off code for Temu is (acw883306). Remember to enter this code during the checkout process to enjoy the $100 discount on your purchase. Verified Temu Coupon Codes For June and July 2025 Temu coupon code $100 Off - (acw883306) $100 Off Temu Coupon code - acw883306 30% Off Temu coupon code - (acw883306) Flat 40 Off Temu exclusive code - (acw883306) Temu 90% Discount Code: (acw883306) Temu Coupon Codes For Existing Users: $100 Discount Code To get the most out of your shopping experience, download the Temu app and apply our Temu coupon codes for existing users at checkout. Check out these five fantastic Temu coupons for existing users: acw883306: Slash $100 Off your order as a token of our appreciation! acw883306: Enjoy a $100 discount on your next purchase. acw883306: Get an extra 25% off on top of existing discounts. acw883306: Loyal Temu shoppers from UAE can take $100 Off their entire order. Verified user can get a $100 Off Temu Coupon code using the code ((“acw883306”)). 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 ((“acw883306”)). 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 ["^"acw883306 "^"] 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 ((“acw883306”)) 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 $100 Off promo code ((“acw883306”)) 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 “acw883306” 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 ((“acw883306”)) and make a first purchase of $100 or more. Free Temu codes $100 Off — ((“acw883306”)) Temu Coupon $100 Off — ((“acw883306”)) Temu Coupon 100% off — ((“acw883306”)) Temu Memorial Day Sale $100 Off — ((“acw883306”)) Temu Coupon code today — ((“acw883306”)) Temu free gift code — ["^"acw883306"^"](Without inviting friends or family member) Temu Coupon code for USA - $100 Off— ((“acw883306”)) Temu Coupon code USA - $100 Off— ((“acw883306”)) Temu Coupon code USA - $100 Off — ((“acw883306”)) Temu Coupon code Japan - $100 Off — ((“acw883306”)) Temu Coupon code Mexico - $100 Off — ((“acw883306”)) Temu Coupon code Chile - $100 Off — ((“acw883306”)) Temu Coupon code USA - $100 Off — ((“acw883306”)) Temu Coupon code Colombia - $100 Off — ((“acw883306”)) Temu Coupon code Malaysia - $100 Off — ((“acw883306”)) Temu Coupon code Philippines - $100 Off — ((“acw883306”)) Temu Coupon code South Korea - $100 Off — ((“acw883306”)) Redeem Free Temu Coupon Code ["^"acw883306"^"] for first-time users Get a $100 discount on your Temu order with the promo code "acw883306". You can get a discount by clicking on the item to purchase and entering this Temu Coupon code $100 Off ((“acw883306”)). Temu New User Coupon ((“acw883306)): 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 ((“acw883306”)): $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 ((“acw883306”)): Get A Flat $100 Discount On Order Value  
    • Introduction Looking to save big on your next  Temu purchase? With the  Temu coupon code  "acu639380" $200 off, you can enjoy significant discounts and make your shopping experience even more delightful. The "acu639380"  Temu coupon code offers maximum benefits for users across the USA, Canada, and European nations. Don’t miss out on this fantastic opportunity to save on top-quality products. Whether you are searching for the  Temu coupon $200 off or the  Temu $100 off coupon code, we’ve got you covered. Read on to explore all the ways you can make the most of this exclusive deal. What Is The Coupon Code "acu639380" For  Temu $200 Off? The  Temu coupon $200 off provides exceptional benefits for both new and existing users on the  Temu app and website. Use our $200 off  Temu coupon to unlock fantastic discounts on your purchases. acu639380: Get a flat $200 discount instantly. acu639380: Enjoy a $200 coupon pack for multiple uses. acu639380: New customers can avail of a $200 flat discount. acu639380: Existing users receive an extra $200 promo code. acu639380: This code is valid for users in the USA and Canada.  Temu Coupon Code $200 Off For New Users In 2025 New to  Temu ? You’re in for a treat! The  Temu coupon $200 off is perfect for first-time users, helping you save more on your initial purchases. acu639380: Get a flat $200 discount for new users. acu639380: Unlock a $200 coupon bundle exclusively for new customers. acu639380: Use up to a $200 coupon bundle for multiple transactions. acu639380: Free shipping is available to 68 countries worldwide. acu639380: Enjoy an extra 30% off on any purchase for first-time users. How To Redeem The  Temu Coupon $200 Off For New Customers? Redeeming the  Temu $200 coupon is simple and hassle-free. Follow these steps to use the  Temu $200 off coupon code for new users: Visit the  Temu website or download the app. Sign up for a new account. Browse your favorite items and add them to your cart. Enter the acu639380 code at checkout. Complete your purchase and enjoy your savings.  Temu Coupon $200 Off For Existing Customers Existing customers can also enjoy substantial savings using our coupon code. The  Temu $200 coupon codes for existing users unlock numerous perks and free shipping benefits. acu639380: Receive a $200 discount as an extra bonus. acu639380: Get a $200 coupon bundle for multiple purchases. acu639380: Free gifts and express shipping in the USA and Canada. acu639380: Avail of an additional 30% discount on existing offers. acu639380: Free shipping to 68 countries. How To Use The  Temu Coupon Code $200 Off For Existing Customers? Using the  Temu coupon code $200 off as an existing customer is easy. Here’s how you can do it: Log in to your  Temu account. Add your preferred items to the cart. Apply the  Temu coupon $200 off code (acu639380) at checkout. Verify the discount and complete your payment. Latest  Temu Coupon $200 Off First Order Take advantage of the  Temu coupon code $200 off first order to maximize your savings on your initial purchase. Here’s what you can expect: acu639380: Get a flat $200 discount on your first order. acu639380: Unlock a $200  Temu coupon code for the first order. acu639380: Enjoy up to $200 in coupons for multiple uses. acu639380: Free shipping to 68 countries. acu639380: Receive an extra 30% discount on any first-order purchase. How To Find The  Temu Coupon Code $200 Off? Finding the  Temu coupon $200 off is easier than ever. You can also check out the  Temu coupon $200 off Reddit to see what other users are saying. Sign up for the  Temu newsletter to get verified and tested coupons. Follow  Temu on social media for the latest deals. Visit trusted coupon sites to access the latest working  Temu codes. Is  Temu $200 Off Coupon Legit? Yes, the  Temu $200 Off Coupon Legit and reliable. Our coupon code "acu639380" is thoroughly tested and verified to ensure a seamless shopping experience. This code is valid worldwide, has no expiration date, and is completely safe to use. Enjoy peace of mind while availing of significant discounts on your orders. How Does  Temu $200 Off Coupon Work? The  Temu coupon code "acu639380" $200 off first-time user works by providing instant discounts on eligible purchases. Use the  Temu coupon codes $100 off during checkout to activate your savings. Simply apply the code when prompted during the checkout process. The system will automatically deduct the applicable discount, letting you enjoy remarkable savings on quality products. How To Earn  Temu $200 Coupons As A New Customer? Earning the  Temu coupon code "acu639380" $200 off is straightforward for new users. Additionally, the $100 off  Temu coupon code can be accessed through promotional campaigns. Simply create an account on  Temu and take advantage of their welcoming offers. Joining their loyalty programs and participating in referrals can also unlock more coupons for you. What Are The Advantages Of Using The  Temu Coupon $200 Off? Here are the perks of using the  Temu coupon code $100 off and the  Temu coupon code $200 off: $200 discount on the first order. $200 coupon bundle for multiple uses. 70% discount on popular items. Extra 30% off for existing customers. Up to 90% off on selected items. Free gift for new users. Free delivery to 68 countries.  Temu $200 Discount Code And Free Gift For New And Existing Customers The  Temu $200 off coupon code offers unparalleled benefits for all users. Use "acu639380" to enjoy these perks: acu639380: $200 discount on the first order. acu639380: Extra 30% off on any item. acu639380: Free gift for new users. acu639380: Up to 70% off on select items. acu639380: Free shipping to 68 countries. Pros And Cons Of Using The  Temu Coupon Code $200 Off This Month Pros: Flat $200 discount. No minimum purchase requirement. Free shipping worldwide. Applicable for new and existing users. Additional 30% off on top of discounts. Cons: Limited to specific regions. June not combine with some other promotions. Terms And Conditions Of Using The  Temu Coupon $200 Off In 2025 Understanding the  Temu coupon code $200 off free shipping terms is crucial: The latest  Temu coupon code $200 off has no expiration date. Valid for both new and existing users. Applicable in 68 countries worldwide. No minimum purchase requirement. "acu639380" can be used anytime for unlimited savings. Final Note: Use The Latest  Temu Coupon Code $200 Off Don’t wait to use the  Temu coupon code $200 off to maximize your savings on premium products. This exclusive offer is available for a limited time, so act now to take advantage of the incredible discounts! Start your journey of affordable shopping with our exclusive code. The  Temu coupon $200 off ensures a seamless and delightful shopping experience for every user. Act now to enjoy these incredible benefits. FAQs Of  Temu $200 Off Coupon How do I use the  Temu $200 off coupon? Enter the code "acu639380" during checkout to unlock your discount. Can existing users use the $200  Temu coupon? Yes, existing users can enjoy extra discounts and free shipping with "acu639380." Is the  Temu $200 coupon valid worldwide? Absolutely! The code is valid in 68 countries, including the USA, Canada, and Europe. Does the $200 coupon have an expiration date? No, our "acu639380" coupon has no expiration date and can be used anytime. What benefits do first-time users get? First-time users receive a $200 discount, free shipping, and an additional 30% off  
    • Betafort Recovery expertise, unwavering ethical standards, and consistent track record have established him as a leading figure in the field. His swift and precise approach to retrieving lost digital funds, coupled with a steadfast commitment to client satisfaction, distinguishes him in the cybersecurity industry. He assisted me in reclaiming my lost digital currencies.  
    • 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.
  • Topics

×
×
  • Create New...

Important Information

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