Baritone AI pathfinder

Baritone AI pathfinder

72.7k Downloads

java.lang.IllegalAccessError: tried to access field net.minecraft.util.math.Vec3i.field_177962_a

PoTheMagicDragon opened this issue · 13 comments

commented

Some information

Operating system: MacOS (M1)
Java version: Java 8
Minecraft version: 1.12.2
Baritone version: 1.2.17 (I had this issue before updating to the unoptimized jar, & it's still an issue with the unoptimized version)
Other mods (if used): Lambda, Journeymap, rusherhack (if needed, I can reproduce with just Lambda)

Exception, error or logs

Please find your latest.log or debug.log in this folder and attach it to the issue

Crash log
---- Minecraft Crash Report ----

WARNING: coremods are present:
LambdaCoreMod (lambda-1059.jar)
RusherHack-Loader (rusherhack-loader.jar)
Contact their authors BEFORE contacting forge

// You're mean.

Time: 3/2/23 11:45 AM
Description: Unexpected error

java.lang.IllegalAccessError: tried to access field net.minecraft.util.math.Vec3i.field_177962_a from class com.lambda.flute.BaritoneSelection
  at com.lambda.flute.BaritoneSelection.min(BaritoneSelection.kt:21)
  at com.lambda.flute.BaritoneSelection.aabb(BaritoneSelection.kt:35)
  at baritone.eg.onRenderPass(Unknown Source)
  at baritone.br.a(Unknown Source)
  at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:890)
  at baritone.br.onRenderPass(Unknown Source)
  at net.minecraft.client.renderer.EntityRenderer.handler$zdm000$renderWorldPass(EntityRenderer.java)
  at net.minecraft.client.renderer.EntityRenderer.func_175068_a(EntityRenderer.java:1434)
  at net.minecraft.client.renderer.EntityRenderer.func_78471_a(EntityRenderer.java:1259)
  at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1062)
  at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1119)
  at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:398)
  at net.minecraft.client.main.Main.main(SourceFile:123)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
  at net.minecraft.launchwrapper.Launch.main(Launch.java:28)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Client thread
Stacktrace:
  at com.lambda.flute.BaritoneSelection.min(BaritoneSelection.kt:21)
  at com.lambda.flute.BaritoneSelection.aabb(BaritoneSelection.kt:35)
  at baritone.eg.onRenderPass(Unknown Source)
  at baritone.br.a(Unknown Source)
  at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:890)
  at baritone.br.onRenderPass(Unknown Source)
  at net.minecraft.client.renderer.EntityRenderer.handler$zdm000$renderWorldPass(EntityRenderer.java)
  at net.minecraft.client.renderer.EntityRenderer.func_175068_a(EntityRenderer.java:1434)
  at net.minecraft.client.renderer.EntityRenderer.func_78471_a(EntityRenderer.java:1259)

-- Affected level --
Details:
  Level name: MpServer
  All players: 1 total; [EntityPlayerSP['PoTheMagicDragon'/21, l='MpServer', x=-7.50, y=85.00, z=-18.57]]
  Chunk stats: MultiplayerChunkCache: 812, 812
  Level seed: 0
  Level generator: ID 00 - default, ver 1. Features enabled: false
  Level generator options: 
  Level spawn location: World: (13,106,544828), Chunk: (at 13,6,12 in 0,34051; contains blocks 0,0,544816 to 15,255,544831), Region: (0,1064; contains chunks 0,34048 to 31,34079, blocks 0,0,544768 to 511,255,545279)
  Level time: 811372 game time, 594771 day time
  Level dimension: 0
  Level storage version: 0x00000 - Unknown?
  Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
  Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
  Forced entities: 23 total; [EntityPlayerSP['PoTheMagicDragon'/21, l='MpServer', x=-7.50, y=85.00, z=-18.57], EntityChicken['Chicken'/135, l='MpServer', x=-15.44, y=68.00, z=-45.73], EntitySheep['Sheep'/138, l='MpServer', x=68.64, y=71.00, z=-28.77], EntityWolf['Wolf'/139, l='MpServer', x=2.44, y=66.00, z=-43.52], EntitySheep['Sheep'/107, l='MpServer', x=63.79, y=69.00, z=47.49], EntityWolf['Wolf'/108, l='MpServer', x=-41.59, y=69.00, z=-70.39], EntityChicken['Chicken'/111, l='MpServer', x=-28.12, y=68.00, z=15.40], EntityItem['item.item.egg'/112, l='MpServer', x=-27.73, y=68.00, z=15.64], EntityItem['item.item.egg'/176, l='MpServer', x=33.68, y=74.00, z=6.90], EntityChicken['Chicken'/113, l='MpServer', x=1.40, y=72.00, z=46.12], EntityChicken['Chicken'/114, l='MpServer', x=-9.19, y=67.00, z=55.43], EntityChicken['Chicken'/116, l='MpServer', x=-3.90, y=68.00, z=59.23], EntitySheep['Sheep'/149, l='MpServer', x=70.25, y=67.00, z=39.18], EntitySheep['Sheep'/119, l='MpServer', x=67.81, y=77.00, z=-52.50], EntitySheep['Sheep'/151, l='MpServer', x=61.83, y=68.00, z=35.18], EntityChicken['Chicken'/120, l='MpServer', x=-9.58, y=68.00, z=35.50], EntityChicken['Chicken'/122, l='MpServer', x=34.50, y=74.00, z=6.14], EntitySheep['Sheep'/90, l='MpServer', x=23.24, y=68.00, z=-98.52], EntityWolf['Wolf'/123, l='MpServer', x=23.50, y=75.00, z=-0.91], EntityItem['item.item.egg'/124, l='MpServer', x=-15.75, y=65.00, z=38.72], EntityChicken['Chicken'/93, l='MpServer', x=-58.19, y=65.00, z=-18.48], EntityItem['item.item.egg'/94, l='MpServer', x=-57.64, y=65.00, z=-18.04], EntityWolf['Wolf'/95, l='MpServer', x=-26.73, y=69.00, z=-48.73]]
  Retry entities: 0 total; []
  Server brand: fml,forge
  Server type: Integrated singleplayer server
Stacktrace:
  at net.minecraft.client.multiplayer.WorldClient.func_72914_a(WorldClient.java:420)
  at net.minecraft.client.Minecraft.func_71396_d(Minecraft.java:2741)
  at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:427)
  at net.minecraft.client.main.Main.main(SourceFile:123)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
  at net.minecraft.launchwrapper.Launch.main(Launch.java:28)

-- System Details --
Details:
  Minecraft Version: 1.12.2
  Operating System: Mac OS X (x86_64) version 10.16
  Java Version: 1.8.0_74, Oracle Corporation
  Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
  Memory: 1328401656 bytes (1266 MB) / 1894252544 bytes (1806 MB) up to 3817865216 bytes (3641 MB)
  JVM Flags: 2 total; -Xmx4096m -Xms256m
  IntCache: cache: 0, tcache: 0, allocated: 12, tallocated: 94
  FML: MCP 9.42 Powered by Forge 14.23.5.2860 7 mods loaded, 7 mods active
  States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored

  | State  | ID         | Version      | Source                        | Signature                                |
  |:------ |:---------- |:------------ |:----------------------------- |:---------------------------------------- |
  | LCHIJA | minecraft  | 1.12.2       | minecraft.jar                 | None                                     |
  | LCHIJA | mcp        | 9.42         | minecraft.jar                 | None                                     |
  | LCHIJA | FML        | 8.0.99.99    | forge-1.12.2-14.23.5.2860.jar | e3c3d50c7c986df74c645c0ac54639741c90a557 |
  | LCHIJA | forge      | 14.23.5.2860 | forge-1.12.2-14.23.5.2860.jar | e3c3d50c7c986df74c645c0ac54639741c90a557 |
  | LCHIJA | journeymap | 1.12.2-5.7.1 | journeymap-1.12.2-5.7.1.jar   | None                                     |
  | LCHIJA | lambda     | 3.3.0        | lambda-1059.jar               | None                                     |
  | LCHIJA | rusherhack | 1.3          | rusherhack-loader.jar         | None                                     |

  Loaded coremods (and transformers): 
LambdaCoreMod (lambda-1059.jar)

RusherHack-Loader (rusherhack-loader.jar)

  GL info: ' Vendor: 'Apple' Version: '2.1 Metal - 83' Renderer: 'Apple M1 Pro'
  Launched Version: forge-14.23.5.2860
  LWJGL: 2.9.2
  OpenGL: Apple M1 Pro GL version 2.1 Metal - 83, Apple
  GL Caps: Using GL 1.3 multitexturing.
Using GL 1.3 texture combiners.
Using framebuffer objects because ARB_framebuffer_object is supported and separate blending is supported.
Shaders are available because OpenGL 2.1 is supported.
VBOs are available because OpenGL 1.5 is supported.

  Using VBOs: Yes
  Is Modded: Definitely; Client brand changed to 'fml,forge'
  Type: Client (map_client.txt)
  Resource Packs: Dramatic Skys Demo 1.5.3.2.zip (incompatible), Default-Dark-Mode-1.12-v1.4.0.zip, SCC_flowing_water.zip
  Current Language: English (US)
  Profiler Position: N/A (disabled)
  CPU: 10x Apple M1 Pro

How to reproduce

The Short version

Making a call to Selection(BetterBlockPos pos1, BetterBlockPos pos2) makes things go boom.

I'm guessing you could make this happen by creating a vanilla mod & making a call to the function, but I don't know enough about vanilla mods to test that out.

(the longer version is below the details)

Some more details

This seems like it's related to this issue

  • The error message is identical & the stack trace is identical (up until the obfuscated code part)
  • At one point, I was also having issues with #click crashing my game, but that no longer seems to be an issue.
  • The click functionality also calls Selection(pos1, pos2) (well, it calls BaritoneAPI.getProvider().getPrimaryBaritone().getSelectionManager().addSelection( which calls it, but same thing)
identical portion of stack trace
java.lang.IllegalAccessError: tried to access field net.minecraft.util.math.Vec3i.field_177962_a from class ...Some Class name...
... Obfuscated baritone code....
at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:890)
at baritone.hi.a(Unknown Source)
at net.minecraft.client.renderer.EntityRenderer.handler$renderWorldPass$zzf000(EntityRenderer.java)
at net.minecraft.client.renderer.EntityRenderer.func_175068_a(EntityRenderer.java:1434)
at net.minecraft.client.renderer.EntityRenderer.func_78471_a(EntityRenderer.java:1259)
at net.minecraft.client.renderer.EntityRenderer.func_181560_a(EntityRenderer.java:1062)
at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1119)
at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:398)
at net.minecraft.client.main.Main.main(SourceFile:123)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)

The long version

I'm developing a plugin for lambda & as a part of that I am making multiple selections. I tried to do this awhile ago & failed assuming it was an issue with obfuscated jars, but after updating lambda to use the unoptimized jar, and still having the issue I started digging deeper.

Anytime I make a call to create a selection using Selection(pos1, pos2) the process crashes. (Not the game, just the current lambda process)

To figure out what was happening I made a copy of that class, used intellij to convert it to kotlin, renamed it & ran it again with the copy to make sure I was still having the issue (I was) & then I then started picking it apart (commenting out code, restructuring things, etc). I eventually narrowed down the crash to the following:
Kotlin:
private val min = BetterBlockPos(kotlin.math.min(pos1.x, pos2.x), kotlin.math.min(pos1.y, pos2.y), kotlin.math.min(pos1.z, pos2.z))
Java:
this.min = new BetterBlockPos(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y), Math.min(pos1.z, pos2.z));
Then I moved that statement from the initializer to the getter function & I was finally able to get the error included above.

Here's the final Kotlin class to go with the error log above:

BaritoneSelection.kt
package com.lambda.flute

import baritone.api.selection.ISelection
import baritone.api.utils.BetterBlockPos
import net.minecraft.util.EnumFacing
import net.minecraft.util.math.AxisAlignedBB
import net.minecraft.util.math.Vec3i


class BaritoneSelection(private val pos1: BetterBlockPos, private val pos2: BetterBlockPos) : ISelection {

    override fun pos1(): BetterBlockPos {
        return pos1
    }

    override fun pos2(): BetterBlockPos {
        return pos2
    }

    override fun min(): BetterBlockPos { //crash happened on the next line
        return BetterBlockPos(kotlin.math.min(pos1.x, pos2.x), kotlin.math.min(pos1.y, pos2.y), kotlin.math.min(pos1.z, pos2.z)) 
    }

    override fun max(): BetterBlockPos {
        return BetterBlockPos(kotlin.math.max(pos1.x, pos2.x), kotlin.math.max(pos1.y, pos2.y), kotlin.math.max(pos1.z, pos2.z))
    }

    override fun size(): Vec3i {
        val min = min()
        val max = max()
        return Vec3i(max.x - min.x + 1, max.y - min.y + 1, max.z - min.z + 1)
    }

    override fun aabb(): AxisAlignedBB {
        val min = min()
        val max = max()
        return AxisAlignedBB(min, max.add(1, 1, 1))
    }

    override fun hashCode(): Int {
        return pos1.hashCode() xor pos2.hashCode()
    }

    override fun toString(): String {
        return String.format("Selection{pos1=%s,pos2=%s}", pos1, pos2)
    }

    private fun isPos2(facing: EnumFacing): Boolean {
        val negative = facing.axisDirection.offset < 0
        return when (facing.axis) {
            EnumFacing.Axis.X -> (pos2.x > pos1.x) xor negative
            EnumFacing.Axis.Y -> (pos2.y > pos1.y) xor negative
            EnumFacing.Axis.Z -> (pos2.z > pos1.z) xor negative
            else -> throw IllegalStateException("Bad EnumFacing.Axis")
        }
    }

    override fun expand(direction: EnumFacing, blocks: Int): ISelection {
        return if (isPos2(direction)) BaritoneSelection(pos1, pos2.offset(direction, blocks)) else BaritoneSelection(pos1.offset(direction, blocks), pos2)
    }

    override fun contract(direction: EnumFacing, blocks: Int): ISelection {
        return if (isPos2(direction)) BaritoneSelection(pos1.offset(direction, blocks), pos2) else BaritoneSelection(pos1, pos2.offset(direction, blocks))
    }

    override fun shift(direction: EnumFacing, blocks: Int): ISelection {
        return BaritoneSelection(pos1.offset(direction, blocks), pos2.offset(direction, blocks))
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as BaritoneSelection

        if (pos1 != other.pos1) return false
        if (pos2 != other.pos2) return false
        if (min() != other.min()) return false
        if (max() != other.max()) return false
        if (size() != other.size()) return false
        if (aabb() != other.aabb()) return false

        return true
    }
}

Modified settings

None

Final checklist

  • I know how to properly use check boxes
  • I have included the version of Minecraft I'm running, baritone's version and forge mods (if used).
  • I have included logs, exceptions and / or steps to reproduce the issue.
  • I have not used any OwO's or UwU's in this issue.
commented

Oops, I added my crash log instead of my latest log. Here's the latest log:
latest.log

commented

That gives me enough of an idea to start trying things. Thanks for the info & I'll get back to you if I make any progress.

commented

This is neither your mistake nor ours. It's Forge / SpecialSource messing up and turning valid java code (public final BetterBlockPos.x shadows private final BlockPos.x and code accesses the public one) into guaranteed crashes (code accesses the private field).

As a workaround it should be possible to use the getter functions instead of directly accessing the fields.

I'll have a closer look at this in the next couple days to make sure whether it is what I think it is, though I don't think I'll be able to fix it.

commented

Using getters for the x, y, & z values in the kotlin class worked. I'll try making those changes to Selection.java, rebuilding baritone with those changes, adding those changes to Lambda & testing my code with the original Selection class tomorrow. Assuming everything succeeds, I'll open up a pr with those changes to start/ continue the discussion.

Should I close this issue? or leave it open until the root issue is solved?

commented

Assuming everything succeeds, I'll open up a pr with those changes

Not sure what kind of changes you mean here. BetterBlockPos already has getX, getY and getZ inherited from BlockPos (which is also why they should be immune to this bug: they are allowed to read the private field).

commented

Ah, I was trying to add getters to BetterBlockPos & I ended up running into a lot of unrelated errors & so I finally gave up.

commented

Sorry for taking almost a complete week when I said "couple days" (I had 2 or max. 3 days in mind) though here's what I now think happens:

  1. When Baritone is compiled, SpecialSource incorrectly but consistently remaps BetterBlockPos.x/y/z to whatever BlockPos.x/y/z is called in the target mappings (notch and srg in the cases I tested). For Baritone alone this is not a problem, other mods using it might break (e.g. my mod can't use BetterBlockPos.x because it's actually called BetterBlockPos.field_177962_a in my dev env).
  2. At runtime FMLRemappingAdapter/FMLDeobfuscatingRemapper inconsistently remap BetterBlockPos.whateveritisnow either to the name of BlockPos.x in the current environment (srg and mcp in my tests) or not at all, depending on whether BetterBlockPos is loaded or not. This can break anything in seemingly random patterns.

For the first I have no idea what is causing it (because I have exactly zero knowledge how SpecialSource works) and also no longer think this is the same as a SpecialSource issue I mentioned earlier, because here the declaration itself is mistakenly remapped as well.

For the second point I'm quite sure this is a regression of MinecraftForge/MinecraftForge#3043, since the fix for that one relies on gathering field data when the declaring class is loaded and we get an IllegalAccessError (along with mismatched post-transformer bytecode) whenever the offending class is loaded before BetterBlockPos according to the remapper debug output. Putting a little baritone.api.utils.BetterBlockPos.class early in your mod initialization should "fix" this. Just make sure to not load it too early (i.e. before Minecraft itself is loaded) or you might end up in classloader and transformer hell.

commented

Sorry for taking almost a complete week when I said "couple days" (I had 2 or max. 3 days in mind) though here's what I now think happens:

  1. When Baritone is compiled, SpecialSource incorrectly but consistently remaps BetterBlockPos.x/y/z to whatever BlockPos.x/y/z is called in the target mappings (notch and srg in the cases I tested). For Baritone alone this is not a problem, other mods using it might break (e.g. my mod can't use BetterBlockPos.x because it's actually called BetterBlockPos.field_177962_a in my dev env).
  2. At runtime FMLRemappingAdapter/FMLDeobfuscatingRemapper inconsistently remap BetterBlockPos.whateveritisnow either to the name of BlockPos.x in the current environment (srg and mcp in my tests) or not at all, depending on whether BetterBlockPos is loaded or not. This can break anything in seemingly random patterns.

For the first I have no idea what is causing it (because I have exactly zero knowledge how SpecialSource works) and also no longer think this is the same as a SpecialSource issue I mentioned earlier, because here the declaration itself is mistakenly remapped as well.

For the second point I'm quite sure this is a regression of MinecraftForge/MinecraftForge#3043, since the fix for that one relies on gathering field data when the declaring class is loaded and we get an IllegalAccessError (along with mismatched post-transformer bytecode) whenever the offending class is loaded before BetterBlockPos according to the remapper debug output. Putting a little baritone.api.utils.BetterBlockPos.class early in your mod initialization should "fix" this. Just make sure to not load it too early (i.e. before Minecraft itself is loaded) or you might end up in classloader and transformer hell.

make up asap was always my provoking alerts on ownself

commented

regardıng the IllegalAccessError, precessor and processor were both locked hard on the clıng of encounterıng dash clog, what we trıed to solve ın a complımentary basıs, hold clash hınge onto the two reflexıve key brake. whıle on any all, counts as ıllegalaccess.

commented

Stop spamming.

commented

also having this problem

commented

i am having same problom

commented

same problem still