cabaletta / baritone

google maps for block game
GNU Lesser General Public License v3.0
7.28k stars 1.46k forks source link

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

Open PoTheMagicDragon opened 1 year ago

PoTheMagicDragon commented 1 year ago

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

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 ```kotlin 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

PoTheMagicDragon commented 1 year ago

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

ZacSharp commented 1 year ago

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.

PoTheMagicDragon commented 1 year ago

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.

PoTheMagicDragon commented 1 year ago

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?

ZacSharp commented 1 year ago

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).

PoTheMagicDragon commented 1 year ago

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

ZacSharp commented 1 year ago

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 https://github.com/MinecraftForge/MinecraftForge/issues/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.

Shaquum commented 1 year ago

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

Shaquum commented 1 year ago

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.

ZacSharp commented 1 year ago

Stop spamming.

Natedogwoooof commented 1 year ago

i am having same problom

L1ghtn1ng-cmd commented 1 year ago

also having this problem

Tom28281 commented 2 months ago

same problem still