Skip to content

Commit

Permalink
Fix Linear pattern index incrementing above array length (#2626)
Browse files Browse the repository at this point in the history
* Fix index incrementing above array length in async

* Add fork method
  • Loading branch information
Zeranny committed Mar 24, 2024
1 parent 5e234a7 commit c10f58a
Showing 1 changed file with 14 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.fastasyncworldedit.core.function.pattern;

import com.fastasyncworldedit.core.queue.Filter;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock;

import java.util.Arrays;

public class LinearBlockPattern extends AbstractPattern implements ResettablePattern {

private final Pattern[] patternsArray;
Expand All @@ -15,26 +18,28 @@ public class LinearBlockPattern extends AbstractPattern implements ResettablePat
/**
* Create a new {@link Pattern} instance
*
* @param patterns array of patterns to linearly choose from based on x/z coordinates
* @param patterns array of patterns to linearly choose from
*/
public LinearBlockPattern(Pattern[] patterns) {
this.patternsArray = patterns;
}

@Override
public BaseBlock applyBlock(BlockVector3 position) {
if (index == patternsArray.length) {
index = 0;
}
return patternsArray[index++].applyBlock(position);
index = (index + 1) % patternsArray.length;
return patternsArray[index].applyBlock(position);
}

@Override
public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException {
if (index == patternsArray.length) {
index = 0;
}
return patternsArray[index++].apply(extent, get, set);
index = (index + 1) % patternsArray.length;
return patternsArray[index].apply(extent, get, set);
}

@Override
public Filter fork() {
final Pattern[] forked = Arrays.stream(this.patternsArray).map(Pattern::fork).toArray(Pattern[]::new);
return new LinearBlockPattern(forked);
}

@Override
Expand Down

0 comments on commit c10f58a

Please sign in to comment.