Jump to content

[1.12.2] Is There a Chunk Event in Which is Called After Loading?


Recommended Posts

Posted
3 hours ago, diesieben07 said:

The chunk is loaded, it's just not inserted in the world yet, so accessing it via the world will just try to load it again (or something weird like that).

You can access the chunk itself though, which means you can use Chunk#getHeightValue. See World#getHeight(int, int) to see how it's used.

1

Huh, using it this way throws an array out of bounds exception.

java.lang.ArrayIndexOutOfBoundsException: -976
	at net.minecraft.world.chunk.Chunk.getHeightValue(Chunk.java:166) ~[Chunk.class:?]
	at com.github.unassignedxd.voidutils.main.util.ModUtil.getCentralBlockPos(ModUtil.java:36) ~[ModUtil.class:?]
	at com.github.unassignedxd.voidutils.main.events.CommonEvents.onChunkLoad(CommonEvents.java:51) ~[CommonEvents.class:?]
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_7_CommonEvents_onChunkLoad_Load.invoke(.dynamic) ~[?:?]
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
	at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182) ~[EventBus.class:?]
	at net.minecraft.world.chunk.Chunk.onLoad(Chunk.java:922) ~[Chunk.class:?]
	at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:109) ~[ChunkIOProvider.class:?]
	at net.minecraftforge.common.chunkio.ChunkIOExecutor.tick(ChunkIOExecutor.java:150) ~[ChunkIOExecutor.class:?]
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:803) ~[MinecraftServer.class:?]
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743) ~[MinecraftServer.class:?]
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) ~[IntegratedServer.class:?]
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
    public static BlockPos getCentralBlockPos(Chunk chunk) {
        int x = (chunk.x << 4) + 8;
        int y = chunk.getHeightValue(chunk.x, chunk.z);
        int z = (chunk.z << 4) + 8;
        return new BlockPos(x, y, z);
    }

 

Posted
2 hours ago, diesieben07 said:

The method operates on block coordinates within the chunk (i.e. x and z must be 0 through 15). Hence why I pointed you to the World method on how to compute those.

Okay, I used something like this:

        int y = chunk.getHeightValue(chunk.x & 15, chunk.z & 15);

However, it still returns a value of 0. (This is being called in ChunkEvent.Load)

Posted (edited)
13 hours ago, diesieben07 said:

You are now passing in chunk coordinates (or rather their mod 16). The method expects block coordinates.

Now I am supplying with block coords, yet I still get an ArrayIndexOutOfBounds Exception.

 

- Edit - I saw what you said about the blook coords, how they'd have to be 0-15.

However, even with this, it still puts the Y at zero.

                    int y = this.chunk.getHeightValue(8, 8);

 

Edited by unassigned
Posted
54 minutes ago, diesieben07 said:

You are doing this on the server, correct? Because I can't see how this won't work.

Yes. This is called directly from subscribing from the ChunkEvent.Load.

        if(this.hasNaturalNode && nodePos == null) {
            this.nodePos = new BlockPos(
                    (this.chunk.x << 4) + 8,
                    this.chunk.getHeightValue(8, 8),
                    (this.chunk.z << 4) + 8
            );

            if(chunk.getWorld().getBlockState(nodePos) != ModBlocks.VOID_NODE.getDefaultState()) {
                chunk.getWorld().setBlockState(nodePos, ModBlocks.VOID_NODE.getDefaultState());
                VoidUtils.logger.info("Spawned natural node at " + nodePos.getX() + " " + nodePos.getY() + " " + nodePos.getZ());
            }
        }

 

Posted (edited)
On 2/1/2019 at 5:29 PM, diesieben07 said:

Not sure what to say. Did you try poking around with the debugger a bit?

Yeah, and I have attached it to a tile with the same code, and it works. I seriously think that the chunk's heightmap isn't loaded once onChunkLoad is called, so thus it just returns zero. And I have no other solutions to this problem.

 

Edit -

 

You know how I said that I was only calling this on the server? Yeah, I was lying. I did a quick isRemote check and now it works. Thank you.

Edited by unassigned

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

    • I wanted to make a horror CurseForge modpack, but my game crashed when I try to play it! Does anyone know what to do? I've looked at other forums with the same problem, but I didn't understand what the replies were talking about. I also checked the log, did everything it said, but still, it didn't work. I am playing on 1.20.1 Forge. This is my first time using Forge. I've also made another Forge modpack test, but that didn't work, and I tried it with a NeoForge modpack test, too, but that didn't work either. Fabric works fine, though. Please help. # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb0c676280, pid=30812, tid=27596 # # JRE version: OpenJDK Runtime Environment Microsoft-8035246 (17.0.8+7) (build 17.0.8+7-LTS) # Java VM: OpenJDK 64-Bit Server VM Microsoft-8035246 (17.0.8+7-LTS, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) # Problematic frame: # C [atio6axx.dll+0x196280] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # If you would like to submit a bug report, please visit: # https://aka.ms/minecraftjavacrashes # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # Remember: 1. I am using CurseForge 2. I am on 1.20.1 3. I am on Forge 4. Tried the log methods   If you have any details I need to show, please tell me.
    • Server has been running fine until a restart today, at which point it crashes partway through load. I've tried swapping out the modpack to a fresh server and it boots fine, but if I bring in the world file it causes the crash so I'm guessing something is wrong in there but I have no idea how to read and understand these logs, so any advice on what to do next would be helpful, thanks! Here's the log: https://api.mclo.gs/1/raw/jYzFXVR
    • And without betterfortresses?
    • as I understand it, it helped, but a strange error happened again- https://pastes.io/minecraft-crash-6 The game crashed: feature placement Error: java.lang.IllegalArgumentException: Cannot set property DirectionProperty{name=facing, clazz=class net.minecraft.core.Direction, values=[north, south, west, east]} to down on Block{minecraft:dark_oak_button}, it is not an allowed value
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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