Jump to content

[SOLVED] [1.12.2] Player gets stuck in modified collision boxes


Daeruin

Recommended Posts

I'm trying to do some fancy stuff to mimic the behavior of the mod Repose, where blocks whose collision box is normally a full cube will act as stairs when you're walking up a slope. This makes it so you don't have to jump so much.

 

My code kinda works, but the player gets stuck inside the block. It's almost like the collision boxes are getting modified only some of the time, then changing back to a full cube and trapping the player. Sometimes I can get out for a second but then I get pulled back into the block. I initially suspected some kind of syncing problem, but it behaves the same when I run it on the server only and when I run it on both sides. It does nothing when run on the client only. Do I need to send some kind of packet to the client? Any idea what's going on?

 

Spoiler

    @SubscribeEvent
    public void onCollision(GetCollisionBoxesEvent event)
    {
        if (event.getEntity() != null && event.getEntity() instanceof EntityPlayer)
        {
            List<AxisAlignedBB> collisionBoxesList = event.getCollisionBoxesList();
            Iterator<AxisAlignedBB> collisionBoxesIterator = collisionBoxesList.iterator();
            List<AxisAlignedBB> stairCollisionBoxes = new ArrayList<>();

            while (collisionBoxesIterator.hasNext())
            {
                World world = event.getWorld();

                AxisAlignedBB currentAABB = collisionBoxesIterator.next();
                // Get center of AxisAlignedBB; note that AxisAlignedBB#getCenter is on client side only so won't work here
                double centerX = currentAABB.minX + (currentAABB.maxX - currentAABB.minX) * 0.5D;
                double centerY = currentAABB.minY + (currentAABB.maxY - currentAABB.minY) * 0.5D;
                double centerZ = currentAABB.minZ + (currentAABB.maxZ - currentAABB.minZ) * 0.5D;
                Vec3d vec = new Vec3d(centerX, centerY, centerZ);
                BlockPos pos = new BlockPos(vec.x, vec.y, vec.z);

                IBlockState state = world.getBlockState(pos);
                Block block = state.getBlock();

                    // BLOCKS ACT AS STAIRS

                    // Required block patterns:
                    // A1 = first air block
                    // A2 = second air block
                    // A3 = third air block
                    // XX = solid block
                    // SS = the block in question, which could be turned into a stair
                    // ?? = could be anything

                    // A2 A1 ??    A2 A1 X1
                    // A3 SS X1    A3 SS ??
                    // X2          X2

                    if (block.isNormalCube(state, world, pos) // SS
                            && world.getBlockState(pos.up()).getCollisionBoundingBox(world, pos.up()) == null) // A1
                    {
                        ArrayList<EnumFacing> STAIR_DIRECTIONS = new ArrayList<>();
                        STAIR_DIRECTIONS.addAll(Arrays.asList(EnumFacing.HORIZONTALS));

                        for (EnumFacing direction : EnumFacing.HORIZONTALS)
                        {
                            if (                               world.getBlockState(pos.offset(direction)).getCollisionBoundingBox(world, pos.offset(direction)) == null // A3
                                    && world.getBlockState(pos.offset(direction).up()).getCollisionBoundingBox(world, pos.offset(direction).up()) == null // A2
                                    && world.isBlockNormalCube(pos.offset(direction).down(), false) // X2
                                    && (world.isBlockNormalCube(pos.offset(direction.getOpposite()), false) // X1 or ??
                                    || world.isBlockNormalCube(pos.offset(direction.getOpposite()).up(), false))) // X1 or ??
                            {
                                // Conditions met - remove this direction from list to show we need to remove a stair piece on that side of the block
                                STAIR_DIRECTIONS.remove(direction);
                            }
                        }

                        // If a direction has been removed, it means we need to remove a stair piece from the block
                        // Note that the conditions should make it so the most you can remove is two directions, and they would have to be diagonal to each other
                        if (!STAIR_DIRECTIONS.containsAll(Arrays.asList(EnumFacing.HORIZONTALS)))
                        {
                            collisionBoxesIterator.remove();
                            stairCollisionBoxes.add(AABB_SLAB_BOTTOM.offset(pos));

                            if (STAIR_DIRECTIONS.contains(EnumFacing.NORTH))
                            {
                                if (STAIR_DIRECTIONS.contains(EnumFacing.EAST))
                                {
                                    stairCollisionBoxes.add(NE_CORNER.offset(pos));
                                }
                                if (STAIR_DIRECTIONS.contains(EnumFacing.WEST))
                                {
                                    stairCollisionBoxes.add(NW_CORNER.offset(pos));
                                }
                            }
                            if (STAIR_DIRECTIONS.contains(EnumFacing.SOUTH))
                            {
                                if (STAIR_DIRECTIONS.contains(EnumFacing.EAST))
                                {
                                    stairCollisionBoxes.add(SE_CORNER.offset(pos));
                                }
                                if (STAIR_DIRECTIONS.contains(EnumFacing.WEST))
                                {
                                    stairCollisionBoxes.add(SW_CORNER.offset(pos));
                                }
                            }
                        }
                    }
            }
            collisionBoxesList.addAll(stairCollisionBoxes);
        }
    }

 

 

Edited by Daeruin
Marking solved.
Link to comment
Share on other sites

Can you explain why you think this would help?

 

I was guessing that maybe EntityPlayerSP#pushOutOfBlocks was trying to push the player out of the block, but then the player was falling back in, and was therefore getting stuck. So I tried cancelling PlayerSPPushOutOfBlocksEvent in the same conditions under which I'm modifying the collision boxes. No effect.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
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

    • https://pastebin.com/CKfYxe6f thats the mod list its just some mods that i like and grouped together along with some newer mods that caught my eye. i load into minecraft fine, click singleplayer, this is a new modpack so i click create new world, everything seems fine and then i click create new world it starts preparing for world creation and then this error message pops up. Errors in currently selected datapacks prevented the world from loading. You can either try to load it with only the vanilla data pack ("safe mode"), or go back to the title screen and fix it manually. The game doesnt crash so I don't know if a crash report would help. when i click safe mode the screen freezes for a minute and then nothing happens and im still on that error screen. clicking back to title screen takes me back to the title screen. in the data packs screen there is a lot of red data packs. ive tried turning them all off but then when it tries to validate it says "Data pack validation failed!" also all the data packs just automatically downloaded with the mods i havnt added any extra ones. i can post a picture of the select data packs screen but it would take a lot of scrolling and multiple pictures so just let me know if i need to do that. a few examples of the text on the red dats packs are the following. - examplemod resources (this is what most of them say) - resources used for aquaculture (or whatever other mod name) - mobcatcher resources (again changes with mod name) -${mod_name} some also have mod descriptions or just the mod name or other variations of modname stuff or modname resources and when hovering over any of the red ones it says (made for an older version of minecraft) even when the mod says its for 1.18.2. lmk if you need any more info like logs or stuff and sorry for the long message just want to give lots of info.  
    • Problem was in specific method in Screen (version 1.20.4) protected <T extends GuiEventListener & Renderable & NarratableEntry> T addRenderableWidget(T arg) { this.renderables.add((Renderable)arg); return this.addWidget(arg); } I assume because of these multi-inheritance interfaces. After rewriting it in the fields, everything worked. Final working code: @Shadow @Final public List<Renderable> renderables; @Shadow @Final private List<GuiEventListener> children; @Shadow @Final private List<NarratableEntry> narratables; public void custom$addRenderableWidget(AbstractWidget widget) { renderables.add(widget); children.add(widget); narratables.add(widget); }  
    • hey, I'm trying to make a server with mods and it's not working. when I run it without mods, it works normally Log:[27maj2024 17:53:12.540] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, forgeserver, --fml.forgeVersion, 40.2.0, --fml.mcVersion, 1.18.2, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20220404.173914] [27maj2024 17:53:12.544] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 9.1.3+9.1.3+main.9b69c82a starting: java version 22.0.1 by Oracle Corporation [27maj2024 17:53:12.660] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/kamil/Desktop/server/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2314!/ Service=ModLauncher Env=SERVER [27maj2024 17:53:13.006] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\kamil\Desktop\server\libraries\net\minecraftforge\fmlcore\1.18.2-40.2.0\fmlcore-1.18.2-40.2.0.jar is missing mods.toml file [27maj2024 17:53:13.010] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\kamil\Desktop\server\libraries\net\minecraftforge\javafmllanguage\1.18.2-40.2.0\javafmllanguage-1.18.2-40.2.0.jar is missing mods.toml file [27maj2024 17:53:13.013] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\kamil\Desktop\server\libraries\net\minecraftforge\lowcodelanguage\1.18.2-40.2.0\lowcodelanguage-1.18.2-40.2.0.jar is missing mods.toml file [27maj2024 17:53:13.015] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\kamil\Desktop\server\libraries\net\minecraftforge\mclanguage\1.18.2-40.2.0\mclanguage-1.18.2-40.2.0.jar is missing mods.toml file [27maj2024 17:53:13.101] [main/INFO] [net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator/]: No dependencies to load found. Skipping! [27maj2024 17:53:15.035] [main/INFO] [mixin/]: Compatibility level set to JAVA_17 [27maj2024 17:53:15.075] [main/INFO] [cpw.mods.modlauncher.LaunchServiceHandler/MODLAUNCHER]: Launching target 'forgeserver' with arguments [] [27maj2024 17:53:15.139] [main/WARN] [mixin/]: Reference map 'bloodmagic.refmap.json' for bloodmagic.mixins.json could not be read. If this is a development environment you can ignore this message [27maj2024 17:53:15.415] [main/WARN] [mixin/]: Error loading class: net/minecraft/world/item/ItemStack (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.416] [main/WARN] [mixin/]: @Mixin target net.minecraft.world.item.ItemStack was not found placebo.mixins.json:ItemStackMixin [27maj2024 17:53:15.439] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.447] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.449] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.456] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.457] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.461] [main/WARN] [mixin/]: Error loading class: java/util/Map$Entry (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.461] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.463] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:15.463] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalArgumentException: Unsupported class file major version 66) [27maj2024 17:53:16.436] [main/WARN] [mixin/]: Error loading class: java/lang/Boolean (java.lang.IllegalArgumentException: Unsupported class file major version 66) Mods:https://ibb.co/xj5qHYK
    • How did you manage to get it working?
    • Hi Everyone! I was playing in modded singleplayer, and suddenly mobs stopped moving, I couldn't hit them, basically I could do things but nothing happened, like destroying blocks didn't drop it, things like that. When I tried to quit and save my world, it was just writing Saving World but nothing happened, and eventually I always had to restart my computer to stop minecraft. Can someone please help me find out what could cause the issue? Here is my debug log: https://pastebin.com/X9F0M9sq This is not the complete debug log, I was pasting the last couple of hundreds of rows because of the size. In case it's needed, I will repaste rows earlier. Thank you very much in advance!  
  • Topics

×
×
  • Create New...

Important Information

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