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

[1.12.2] [SOLVED] A* JUnit Tests + Performance improvements


Bektor
 Share

Recommended Posts

Hi there,

 

I've implemented myself the A* algorithm (mainly just for the purpose of learning) as seen below and looking for a way to test the code with JUnit and improvements.

I'm also looking for reviews on best-practice and performance!

 

Just to note, the implementation works in 2D space within the 3D world of Minecraft.

 

public class AStar {
    
    /**
     * A {@link HashSet} of {@link Node} which holds all nodes which have been examined.
     * Some may refer to this as the <code>interior</code>.
     */
    private HashSet<Node> closedSet = new HashSet<>();
    
    /**
     * A {@link PriorityQueue} of {@link Node} which holds all candidates for the algorithm to explore.
     * Some may refer to this as the <code>openList</code>.
     */
    private PriorityQueue<Node> frontier = new PriorityQueue<>(
            (firstNode, secondNode) -> {
                if(firstNode.priority > secondNode.priority) return 1;
                if(firstNode.priority < secondNode.priority) return -1;
                return 0;
            });
    
    /**
     * A {@link HashSet} of {@link BlockPos} which holds all blocks the algorithm can move through.
     */
    private HashSet<BlockPos> passableBlocks = new HashSet<>();
    
    /**
     * Initialises this class with a list containing the 'level' the algorithm
     * uses to find the way.
     * 
     * @param passableBlocks All blocks the algorithm can use.
     */
    public AStar(HashSet<BlockPos> passableBlocks) {
        this.passableBlocks.addAll(passableBlocks);
    }
    
    /**
     * A* implementation
     * 
     * @param start
     * @param end
     * @return null if no path was found or the path as a list
     */
    public List<Node> getShortestPath(BlockPos start, BlockPos end) {
        if(start == null || end == null || !passableBlocks.contains(start) || !passableBlocks.contains(end))
            return null;
        
        this.frontier.add(new Node(start, null, 0, this.computeHeuristic(start, end)));
        
        while(!this.frontier.isEmpty()) {
            Node current = this.frontier.poll();
            if(current.location.equals(end)) {
                List<Node> path = new ArrayList<>();
                while(current.parent != null) {
                    path.add(current);
                    current = current.parent;
                }
                this.frontier.clear();
                this.closedSet.clear();
                return path;
            }
            this.closedSet.add(current);
            
            this.getAdjacentNodes(current, end);
        }
        
        return null;
    }
    
    /**
     * The heuristic algorithm to calculate the cost from a
     * <code>start</code> {@link Node} to the <code>end</code> {@link Node}.
     * <br>The Manhatten distance is used for this calculation to create
     * an overestimated heuristics for better search algorithms.
     * 
     * @param start The coordinates of the starting {@link Node}.
     * @param end The coordinates of the ending {@link Node}.
     * @return The calculated cost to get from the <code>start</code> point to the <code>end</code> point.
     */
    private int computeHeuristic(BlockPos start, BlockPos end) {
        return Math.abs(start.getX() - end.getX()) + Math.abs(start.getY() - end.getY());
    }
    
    private void getAdjacentNodes(Node node, BlockPos end) {
        // Create the set containing all neighbouring blocks
        BlockPos[] neighbourBlocks = new BlockPos[] {
                node.location.offset(EnumFacing.WEST),  // x+1, y+0
                node.location.offset(EnumFacing.EAST),  // x-1, y+0
                node.location.offset(EnumFacing.NORTH), // x+0, y+1
                node.location.offset(EnumFacing.SOUTH)  // x+0, y-1
        };
        
        for(BlockPos neighbourBlock : neighbourBlocks) {
            Node neighbour = new Node(neighbourBlock, node);
            if(this.closedSet.contains(neighbour) || !this.passableBlocks.contains(neighbourBlock)) continue;
            if(!this.frontier.contains(neighbour)) this.frontier.add(neighbour);
            float distance = node.distance + this.computeHeuristic(neighbour.location, end);
            
            if(distance >= neighbour.distance)
                continue;
            neighbour.setDistance(distance);
        }
    }
    
    /**
     * Represents the location ("node") of a graph within the A* algorithm.
     */
    public class Node {
        
        /**
         * The location of this node in the world.
         */
        private BlockPos location = null;
        
        /**
         * The previous node or the node we came from.
         */
        private Node parent = null;
        
        /**
         *  also w or d or l or length
         */
        private float cost = 0.f;
        /** 
         * also g or d or 'cost so far'
         */
        private float distance = 0.f;
        /**
         *  also f
         */
        private float priority = 0.f;
        
        /**
         * Default constructor.
         */
        public Node() {
            this.location = null;
            this.parent = null;
            this.cost = 0.f;
            this.distance = 0.f;
            this.priority = 0.f;
        }
        
        /**
         * Creates a {@link Node} at the given location.
         * 
         * @param pos The location of the {@link Node} in the world.
         */
        public Node(BlockPos pos) {
            this.location = pos;
        }
        
        /**
         * Creates a copy of the given {@link Node}.
         * 
         * @param node The {@link Node} to copy.
         */
        public Node(Node node) {
            this.location = node.location;
            this.parent = node.parent;
            this.cost = node.cost;
            this.distance = node.distance;
            this.priority = node.priority;
        }
        
        /**
         * Creates a new {@link Node}.
         * 
         * @param pos The location of the {@link Node} in the world.
         * @param parent The previous {@link Node}.
         */
        public Node(BlockPos pos, Node parent) {
            this(pos, parent, 0.f, 0.f);
        }
        
        /**
         * Creates a new {@link Node}.
         * 
         * @param pos The location of the {@link Node} in the world.
         * @param parent The previous {@link Node}.
         * @param cost The cost to "move" through this {@link Node}.
         * @param distance The cost of all {@link Node}s from the start point to this {@link Node}.
         */
        public Node(BlockPos pos, Node parent, float cost, float distance) {
            this.location = pos;
            this.parent = parent;
            this.setCost(cost);
            this.setDistance(distance);
            this.setPriority();
        }
        
        private void setCost(float cost) {
            this.cost = cost;
        }
        
        private void setDistance(float distance) {
            this.distance = distance;
        }
        
        private void setPriority() {
            this.priority = this.distance + this.cost;
        }
        
        // TODO: research on hashCode & implement this & equals
    }
}

 

Note: I know that the memory usage could be improved by just using one list, but I'm not sure about the impact in performance this change would mean nor how I could implement this with my PriorityQueue.

 

Thx in advance.

Bektor

Edited by Bektor

Developer of Primeval Forest.

Link to comment
Share on other sites

Well here are some general best practices about performance optimization, which may not all apply to your case but worth thinking about:

1) Profile before spending a lot of time with optimizations. Don't spend time optimizing stuff that doesn't have significant impact in overall performance. I often see people make some clever, usually less "readable" and more bug-prone, optimization where it isn't needed. You want readability and simplicity (for avoiding bugs) in your code when you can, so only compromise that where performance requires it.

 

2) When nesting conditions or loops, when having conditions that && together always test the least likely (or the thing most likely to cause you to exit) thing first. For example, testing if world is remote and then testing if player is holding sword is backwards because it would be much better to exit quickly the 99.9% time the player is not holding the sword. Basically always look for ways to exit loops and methods as early as possible.

 

3) When testing conditions that || together always test the most likely (or the thing most likely to cause you to continue). In the previous example, if you wanted to continue if the world was remote or the player was holding the sword you should test for world is remote first.

 

4) In inner loops it is usually where it is worth coding super optimized. For example, in your code where you have the offsets for each of the enum facing, there may be a benefit for just directly adding 1 instead. Modern compilers are super optimized though so you should experiment. But I generally feel that you want to "flatten" the inner loop so call as few methods and conversions as possible.

Edited by jabelar

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

You want a performance improvement on A*?

Jump Point Search. The [2] reference is a great resource as well.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

22 hours ago, jabelar said:

Well here are some general best practices about performance optimization, which may not all apply to your case but worth thinking about:

1) Profile before spending a lot of time with optimizations. Don't spend time optimizing stuff that doesn't have significant impact in overall performance. I often see people make some clever, usually less "readable" and more bug-prone, optimization where it isn't needed. You want readability and simplicity (for avoiding bugs) in your code when you can, so only compromise that where performance requires it.

 

2) When nesting conditions or loops, when having conditions that && together always test the least likely (or the thing most likely to cause you to exit) thing first. For example, testing if world is remote and then testing if player is holding sword is backwards because it would be much better to exit quickly the 99.9% time the player is not holding the sword. Basically always look for ways to exit loops and methods as early as possible.

 

3) When testing conditions that || together always test the most likely (or the thing most likely to cause you to continue). In the previous example, if you wanted to continue if the world was remote or the player was holding the sword you should test for world is remote first.

 

4) In inner loops it is usually where it is worth coding super optimized. For example, in your code where you have the offsets for each of the enum facing, there may be a benefit for just directly adding 1 instead. Modern compilers are super optimized though so you should experiment. But I generally feel that you want to "flatten" the inner loop so call as few methods and conversions as possible.

 

20 hours ago, Draco18s said:

You want a performance improvement on A*?

Jump Point Search. The [2] reference is a great resource as well.

Thx for the answers. Those things should definitly help. ;)

 

Thought I'm also looking into how it is possible to

  • test an A* algorithm in general using JUnit.
  • test this specific A* algorithm using JUnit to avoid the need of starting Minecraft.

Developer of Primeval Forest.

Link to comment
Share on other sites

2 hours ago, Bektor said:

 

Thought I'm also looking into how it is possible to

  • test an A* algorithm in general using JUnit.
  • test this specific A* algorithm using JUnit to avoid the need of starting Minecraft.

You need to supply a fake world.

And that won't be easy.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

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.

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

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Here's my log without mods in the mod folder    
    • it keeps stating that the jar file "custom.jar" cannot be found, when it is clearly in the server directory. ----- [25.10 11:37:48] [Multicraft] Received start command [25.10 11:37:48] [Multicraft] Loading server properties [25.10 11:37:48] [Multicraft] Starting server! [25.10 11:37:48] [Multicraft] Loaded config for "Special: custom.jar" [25.10 11:37:48] [Multicraft] JAR file not found, copying from global JAR directory [25.10 11:37:48] [Multicraft] Failed to copy jarfile from global JAR directory [25.10 11:37:48] [Multicraft] JAR file not found. Go to "Settings"-"Update Minecraft" to download the JAR file. [25.10 11:37:48] [Multicraft] Updating eula.txt file [25.10 11:37:48] [Server] ErrorUnable to access jarfile /custom.jar [25.10 11:37:48] [Multicraft] Server shut down (starting)  [25.10 11:37:48] [Multicraft] Restarting crashed server in 2.0 seconds [25.10 11:37:48] [Multicraft] Looks like a crash, check the server console. Return value: 1
    • [25Oct2021 17:15:12.586] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, MarioBros__, --version, 1.16.5-forge-36.2.8, --gameDir, C:\Users\Jonny\AppData\Roaming\.minecraft, --assetsDir, C:\Users\Jonny\AppData\Roaming\.minecraft\assets, --assetIndex, 1.16, --uuid, 3fdef5666031477981d4e1e6076684ff, --accessToken, ????????, --userType, msa, --versionType, release, --launchTarget, fmlclient, --fml.forgeVersion, 36.2.8, --fml.mcVersion, 1.16.5, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20210115.111550] [25Oct2021 17:15:12.590] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 8.0.9+86+master.3cf110c starting: java version 1.8.0_51 by Oracle Corporation [25Oct2021 17:15:12.603] [main/WARN] [cpw.mods.modlauncher.SecureJarHandler/]: LEGACY JDK DETECTED, SECURED JAR HANDLING DISABLED [25Oct2021 17:15:12.858] [main/INFO] [net.minecraftforge.fml.loading.FixSSL/CORE]: Added Lets Encrypt root certificates as additional trust [25Oct2021 17:15:12.897] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.4 Source=file:/C:/Users/Jonny/AppData/Roaming/.minecraft/libraries/org/spongepowered/mixin/0.8.4/mixin-0.8.4.jar Service=ModLauncher Env=CLIENT [25Oct2021 17:15:14.403] [main/INFO] [STDERR/]: [org.antlr.v4.runtime.ConsoleErrorListener:syntaxError:38]: line 1:0 token recognition error at: '~' [25Oct2021 17:15:14.988] [main/INFO] [mixin/]: Successfully loaded Mixin Connector [com.qouteall.hiding_in_the_bushes.MyMixinConnector] [25Oct2021 17:15:14.996] [main/INFO] [Portal/]: Invoking Mixin Connector [25Oct2021 17:15:15.002] [main/ERROR] [mixin/]: Mixin config imm_ptl_mixins.json does not specify "minVersion" property [25Oct2021 17:15:15.003] [main/ERROR] [mixin/]: Mixin config imm_ptl_mixins_forge.json does not specify "minVersion" property [25Oct2021 17:15:15.005] [main/ERROR] [mixin/]: Mixin config imm_ptl_peripheral_mixins.json does not specify "minVersion" property [25Oct2021 17:15:15.008] [main/INFO] [cpw.mods.modlauncher.LaunchServiceHandler/MODLAUNCHER]: Launching target 'fmlclient' with arguments [--version, 1.16.5-forge-36.2.8, --gameDir, C:\Users\Jonny\AppData\Roaming\.minecraft, --assetsDir, C:\Users\Jonny\AppData\Roaming\.minecraft\assets, --uuid, 3fdef5666031477981d4e1e6076684ff, --username, MarioBros__, --assetIndex, 1.16, --accessToken, ????????, --userType, msa, --versionType, release] [25Oct2021 17:15:15.022] [main/WARN] [mixin/]: Reference map 'createdeco.refmap.json' for createdeco.mixins.json could not be read. If this is a development environment you can ignore this message [25Oct2021 17:15:15.025] [main/WARN] [mixin/]: Reference map 'hackforge.refmap.json' for creategears.mixins.json could not be read. If this is a development environment you can ignore this message [25Oct2021 17:15:16.809] [pool-3-thread-1/FATAL] [mixin/]: Mixin apply failed imm_ptl_peripheral_mixins.json:common.altius_world.MixinChunkStatus -> net.minecraft.world.chunk.ChunkStatus: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException 'static' modifier of handler method does not match target in net/minecraft/world/chunk/ChunkStatus::redirectBuildSurface [PREINJECT Applicator Phase -> imm_ptl_peripheral_mixins.json:common.altius_world.MixinChunkStatus -> Prepare Injections -> -> handler$zia000$redirectBuildSurface(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/world/gen/ChunkGenerator;Ljava/util/List;Lnet/minecraft/world/chunk/IChunk;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Prepare] org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: 'static' modifier of handler method does not match target in net/minecraft/world/chunk/ChunkStatus::redirectBuildSurface [PREINJECT Applicator Phase -> imm_ptl_peripheral_mixins.json:common.altius_world.MixinChunkStatus -> Prepare Injections -> -> handler$zia000$redirectBuildSurface(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/world/gen/ChunkGenerator;Ljava/util/List;Lnet/minecraft/world/chunk/IChunk;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Prepare] at org.spongepowered.asm.mixin.injection.code.Injector.checkTargetModifiers(Injector.java:347) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.injection.callback.CallbackInjector.sanityCheck(CallbackInjector.java:387) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.injection.code.Injector.find(Injector.java:237) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.prepare(InjectionInfo.java:421) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1319) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:1042) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:393) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:325) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:383) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:365) ~[mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:363) [mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:250) [mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.service.modlauncher.MixinTransformationHandler.processClass(MixinTransformationHandler.java:131) [mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at org.spongepowered.asm.launch.MixinLaunchPluginLegacy.processClass(MixinLaunchPluginLegacy.java:131) [mixin-0.8.4.jar:0.8.4+Jenkins-b308.git-2accda5000f7602229606b39437565542cc6fba4] at cpw.mods.modlauncher.serviceapi.ILaunchPluginService.processClassWithFlags(ILaunchPluginService.java:154) [modlauncher-8.0.9.jar:8.0.9+86+master.3cf110c] at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:85) [modlauncher-8.0.9.jar:?] at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) [modlauncher-8.0.9.jar:?] at cpw.mods.modlauncher.TransformingClassLoader$DelegatedClassLoader.findClass(TransformingClassLoader.java:265) [modlauncher-8.0.9.jar:?] at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:136) [modlauncher-8.0.9.jar:?] at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:98) [modlauncher-8.0.9.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [?:1.8.0_51] at net.minecraftforge.registries.GameData.init(GameData.java:177) [?:?] at net.minecraftforge.registries.GameData.<clinit>(GameData.java:132) [?:?] at net.minecraft.util.registry.Registry.forge(Registry.java:347) [?:?] at net.minecraft.util.registry.Registry.forge(Registry.java:331) [?:?] at net.minecraft.util.registry.Registry.<clinit>(Registry.java:140) [?:?] at net.minecraft.util.registry.Bootstrap.func_151354_b(Bootstrap.java:38) [?:?] at net.minecraft.client.main.Main.lambda$main$0(Main.java:123) [?:?] at net.minecraft.client.main.Main$$Lambda$596/2047799833.run(Unknown Source) [?:?] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_51] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_51] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_51] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_51] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_51] [25Oct2021 17:15:16.825] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1052]: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1052]: at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:39) [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1052]: at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1052]: at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1052]: at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1052]: at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: Caused by: java.lang.reflect.InvocationTargetException [25Oct2021 17:15:16.826] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at java.lang.reflect.Method.invoke(Method.java:497) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at net.minecraftforge.fml.loading.FMLClientLaunchProvider.lambda$launchService$0(FMLClientLaunchProvider.java:51) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at net.minecraftforge.fml.loading.FMLClientLaunchProvider$$Lambda$493/2086945474.call(Unknown Source) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [25Oct2021 17:15:16.827] [main/INFO] [STDERR/]: [java.lang.ThreadGroup:uncaughtException:1061]: ... 4 more [25Oct2021 17:15:16.828] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:643]: Caused by: java.lang.RuntimeException: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered [25Oct2021 17:15:16.828] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:643]: at net.minecraftforge.fml.loading.BackgroundWaiter.runAndTick(BackgroundWaiter.java:43) [25Oct2021 17:15:16.828] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:643]: at net.minecraft.client.main.Main.main(Main.java:123) [25Oct2021 17:15:16.828] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:643]: ... 11 more [25Oct2021 17:15:16.828] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered [25Oct2021 17:15:16.828] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:392) [25Oct2021 17:15:16.829] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:250) [25Oct2021 17:15:16.829] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at org.spongepowered.asm.service.modlauncher.MixinTransformationHandler.processClass(MixinTransformationHandler.java:131) [25Oct2021 17:15:16.829] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at org.spongepowered.asm.launch.MixinLaunchPluginLegacy.processClass(MixinLaunchPluginLegacy.java:131) [25Oct2021 17:15:16.829] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at cpw.mods.modlauncher.serviceapi.ILaunchPluginService.processClassWithFlags(ILaunchPluginService.java:154) [25Oct2021 17:15:16.829] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:85) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at cpw.mods.modlauncher.TransformingClassLoader$DelegatedClassLoader.findClass(TransformingClassLoader.java:265) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:136) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:98) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraftforge.registries.GameData.init(GameData.java:177) [25Oct2021 17:15:16.830] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraftforge.registries.GameData.<clinit>(GameData.java:132) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraft.util.registry.Registry.forge(Registry.java:347) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraft.util.registry.Registry.forge(Registry.java:331) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraft.util.registry.Registry.<clinit>(Registry.java:140) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraft.util.registry.Bootstrap.func_151354_b(Bootstrap.java:38) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraft.client.main.Main.lambda$main$0(Main.java:123) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at net.minecraft.client.main.Main$$Lambda$596/2047799833.run(Unknown Source) [25Oct2021 17:15:16.831] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [25Oct2021 17:15:16.832] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at java.util.concurrent.FutureTask.run(FutureTask.java:266) [25Oct2021 17:15:16.832] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [25Oct2021 17:15:16.832] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [25Oct2021 17:15:16.832] [main/INFO] [STDERR/]: [java.lang.Throwable:printStackTrace:667]: at java.lang.Thread.run(Thread.java:745) [25Oct2021 17:15:16.832] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [imm_ptl_peripheral_mixins.json:common.altius_world.MixinChunkStatus] from phase [DEFAULT] in config [imm_ptl_peripheral_mixins.json] FAILED during APPLY [25Oct2021 17:15:16.834] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinError(MixinProcessor.java:636) [25Oct2021 17:15:16.834] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinApplyError(MixinProcessor.java:588) [25Oct2021 17:15:16.834] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:379) [25Oct2021 17:15:16.834] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: ... 23 more [25Oct2021 17:15:16.835] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: 'static' modifier of handler method does not match target in net/minecraft/world/chunk/ChunkStatus::redirectBuildSurface [PREINJECT Applicator Phase -> imm_ptl_peripheral_mixins.json:common.altius_world.MixinChunkStatus -> Prepare Injections -> -> handler$zia000$redirectBuildSurface(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/world/gen/ChunkGenerator;Ljava/util/List;Lnet/minecraft/world/chunk/IChunk;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Prepare] [25Oct2021 17:15:16.835] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.injection.code.Injector.checkTargetModifiers(Injector.java:347) [25Oct2021 17:15:16.835] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.injection.callback.CallbackInjector.sanityCheck(CallbackInjector.java:387) [25Oct2021 17:15:16.835] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.injection.code.Injector.find(Injector.java:237) [25Oct2021 17:15:16.835] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.prepare(InjectionInfo.java:421) [25Oct2021 17:15:16.835] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1319) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:1042) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:393) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:325) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:383) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:365) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:363) [25Oct2021 17:15:16.836] [main/INFO] [STDERR/]: [java.lang.Throwable:printEnclosedStackTrace:709]: ... 23 more  
    • Yes, post the debug log with empty mods folder. And please use the spoiler option of the editor or something like pastebin.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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