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

[SOLVED] 1.16.5 - setBlock() usage from my custom Item.use() override makes only temporary changes to the world

Recommended Posts

I was asked to make a separate thread for this instead of tacking on to another setBlock() question, so here goes.

I'm just testing out trying to modify the world with setBlock(), and it's just not behaving like I'd expect.  

The other question answered my own questions about the integer parameters for setBlock(), so I'm now passing in Constants.BlockFlags.DEFAULT.  This really is just like the behavior of the setBlockAndUpdate() method anyway.... which I was trying at one point.

The behavior I'm seeing is that the blocks appear in the world, but disappear when interacting with them and the previous blocks (if any) reappear.  All of these blocks are reverted and are not saved if I quit to title and restart the world.  I can climb on them and bump off of them, but that's about it.

This is launching from the Forge MDK runClient configuration.  (Edit: specifically, forge-1.16.5-36.1.4-mdk via IntelliJ IDEA)

Most people's questions about setBlock() seem quite straightforward and like it just works for them.

It's almost like a problem passing in immediate variables that get deleted when they go out of scope ... but the few examples I find are using defaultBlockState() and aren't calling new or anything... ?

I can use the ModBlocks.MYBLOCK blocks normally within the game otherwise... as in, place them as in game blocks from creative/survival mode, etc.. they only misbehave from the Item.use() override...

Other changes to the current chunk made after inserting these blocks from normal creative/survival game interactions are saved.


package com.mydomain.testmod;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.command.arguments.BlockStateArgument;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.common.util.Constants;

public class ItemTest extends Item {

    public ItemTest(Properties prop) {

    public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
        if (world.isClientSide)
            if (hand == Hand.MAIN_HAND)
                BlockPos pos = new BlockPos(player.position());// RayTraceUtil.getTargetBlockPos(player, world, 25);
                Block targetBlock = ModBlocks.MYBLOCK.get();

                if(pos != null) {
                    for (int y = 0; y < 10; y++) {
                        for (int i = -5; i <= 5; i++) {
                            if ((i != 0) || (y > 1)) {
                                world.setBlock(pos.offset(5, y, i), targetBlock.defaultBlockState(), Constants.BlockFlags.DEFAULT);

                            world.setBlock(pos.offset(i, y, 5), targetBlock.defaultBlockState(), Constants.BlockFlags.DEFAULT);
                            world.setBlock(pos.offset(-5, y, i), targetBlock.defaultBlockState(), Constants.BlockFlags.DEFAULT);
                            world.setBlock(pos.offset(i, y, -5), targetBlock.defaultBlockState(), Constants.BlockFlags.DEFAULT);

                    return ActionResult.pass(player.getItemInHand(hand));

        return super.use(world, player, hand);

The item is registered like so:

public class ModItems {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TestMod.MODID);

    public static final RegistryObject<Item> ITEMTEST = ITEMS.register("itemtest", () -> new ItemTest(new Item.Properties().tab(ItemGroup.TAB_MISC)));

    public static void init() {

... and the block:

public class ModBlocks {
	public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, TestMod.MODID);
    public static final RegistryObject<Block> MYBLOCK = register("myblock", () -> new Block(AbstractBlock.Properties.of(Material.STONE).requiresCorrectToolForDrops().sound(SoundType.STONE)));

    static void init() {

    private static <T extends Block> RegistryObject<T> registerNoItem(String name, Supplier<T> block) {
    	return BLOCKS.register(name, block);

    private static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) {
    	RegistryObject<T>  ret = registerNoItem(name, block);
    	ModItems.ITEMS.register(name, () -> new BlockItem(ret.get(), new Item.Properties().tab(ItemGroup.TAB_BUILDING_BLOCKS)));
    	return ret;


Usually, I'd have made my own thread from the start... but the other thread basically was answering my main question already (setBlock integer parameter usage), so...  :)

Edited by wintermaker
is this how you mark solved?
Link to post
Share on other sites
3 minutes ago, ChampionAsh5357 said:

You messed up your check. You're only supposed to execute when not on the client.

Ok... I knew that was a potential issue when running on a server... but I thought in single player mode there was only the client anyway.  (I'm pretty new)

So... apparently this is running twice, from both the client and a local server instance that's just not listening for external connections?  Obviously so... as something happened in both conditions.

I mean, it makes sense.  I'm not sure why I didn't try that.  Thanks!

Link to post
Share on other sites
  • wintermaker changed the title to [SOLVED] 1.16.5 - setBlock() usage from my custom Item.use() override makes only temporary changes to the world
2 hours ago, wintermaker said:

Ok... I knew that was a potential issue when running on a server... but I thought in single player mode there was only the client anyway.

This was the case prior to Minecraft 1.3, single player was a completely separate system. In 1.3 this was ditched in favor of running an integrated server to simplify the code and provide more stability as well as things like "Open to LAN".

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

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.

  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • The durability of my custom Item goes down only for a second then goes back to where it was before I clicked. I'd really appreciate if someone can point me in the right direction to get this working. @Override public ActionResult<ItemStack> use(World world, PlayerEntity playerEntity, Hand hand) { ItemStack stack = playerEntity.getItemInHand(hand); if (!world.isClientSide) { ItemStack newStack = new ItemStack(stack.getItem()); newStack.setDamageValue(stack.getDamageValue() + 1); return ActionResult.success(newStack); } else return super.use(world, playerEntity, hand); }
    • biome.getRegistryName().equals(Biomes.SWAMP.location())  
    • Java 16 is not yet supported.
    • It is about the Java version. You cannot use Java 16. 
    • C:\Users\rauno\OneDrive\Töölaud\Uus kaust>java -Xmx2048M -Xms2048M -jar forgeserver.jar nogui 2021-06-21 10:09:17,374 main WARN Advanced terminal features are not available in this environment [10:09:17] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--gameDir, ., --launchTarget, fmlserver, --fml.forgeVersion, 36.1.0, --fml.mcpVersion, 20210115.111550, --fml.mcVersion, 1.16.5, --fml.forgeGroup, net.minecraftforge, nogui] [10:09:17] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 8.0.9+86+master.3cf110c starting: java version 16.0.1 by Oracle Corporation Exception in thread "main" java.lang.IllegalAccessError: class cpw.mods.modlauncher.SecureJarHandler (in unnamed module @0x29f69090) cannot access class sun.security.util.ManifestEntryVerifier (in module java.base) because module java.base does not export sun.security.util to unnamed module @0x29f69090         at cpw.mods.modlauncher.SecureJarHandler.lambda$static$1(SecureJarHandler.java:41)         at cpw.mods.modlauncher.api.LamdbaExceptionUtils.uncheck(LamdbaExceptionUtils.java:95)         at cpw.mods.modlauncher.SecureJarHandler.<clinit>(SecureJarHandler.java:41)         at cpw.mods.modlauncher.Launcher.lambda$new$6(Launcher.java:55)         at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)         at cpw.mods.modlauncher.api.TypesafeMap.computeIfAbsent(TypesafeMap.java:52)         at cpw.mods.modlauncher.api.TypesafeMap.computeIfAbsent(TypesafeMap.java:47)         at cpw.mods.modlauncher.Environment.computePropertyIfAbsent(Environment.java:62)         at cpw.mods.modlauncher.Launcher.<init>(Launcher.java:55)         at cpw.mods.modlauncher.Launcher.main(Launcher.java:66)         at net.minecraftforge.server.ServerMain$Runner.runLauncher(ServerMain.java:63)         at net.minecraftforge.server.ServerMain$Runner.access$100(ServerMain.java:60)         at net.minecraftforge.server.ServerMain.main(ServerMain.java:57) C:\Users\rauno\OneDrive\Töölaud\Uus kaust>PAUSE is it saying for me when i am first opening it 
  • Topics

  • Who's Online (See full list)

  • Create New...

Important Information

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