More filter support

This commit is contained in:
TomTom 2024-07-30 18:36:31 +02:00
parent ad9972258a
commit 05b3427050
3 changed files with 67 additions and 5 deletions

View File

@ -1,8 +1,23 @@
package com.artillexstudios.axminions.minions.actions.filters;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.Collections;
import java.util.List;
public abstract class Filter<T> {
private final ObjectArrayList<Transformer<?, ?>> transformers = new ObjectArrayList<>();
private final List<Transformer<?, ?>> unmodifiableTransformers = Collections.unmodifiableList(transformers);
public abstract boolean isAllowed(T object);
public abstract Class<?> inputClass();
public void addTransformer(Transformer<?, ?> transformer) {
this.transformers.add(transformer);
}
public List<Transformer<?, ?>> transformers() {
return this.unmodifiableTransformers;
}
}

View File

@ -0,0 +1,10 @@
package com.artillexstudios.axminions.minions.actions.filters;
public interface Transformer<T, Z> {
Z transform(T object);
Class<?> inputClass();
Class<?> outputClass();
}

View File

@ -1,11 +1,14 @@
package com.artillexstudios.axminions.minions.actions.filters.implementation;
import com.artillexstudios.axminions.minions.actions.filters.Filter;
import com.artillexstudios.axminions.minions.actions.filters.Transformer;
import com.artillexstudios.axminions.utils.LogUtils;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@ -13,9 +16,43 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class MaterialFilter extends Filter<Material> {
private final ObjectArrayList<Material> allowed = new ObjectArrayList<>(); // TODO: Check performance vs hashset
private final HashSet<Material> allowed = new HashSet<>();
public MaterialFilter(Map<Object, Object> configuration) {
this.addTransformer(new Transformer<Location, Material>() {
@Override
public Material transform(Location object) {
return object.getBlock().getType();
}
@Override
public Class<?> inputClass() {
return Location.class;
}
@Override
public Class<?> outputClass() {
return Material.class;
}
});
this.addTransformer(new Transformer<Block, Material>() {
@Override
public Material transform(Block object) {
return object.getType();
}
@Override
public Class<?> inputClass() {
return Block.class;
}
@Override
public Class<?> outputClass() {
return Material.class;
}
});
List<String> whitelist = (List<String>) configuration.get("whitelist");
if (whitelist != null) {
for (String s : whitelist) {
@ -37,7 +74,7 @@ public final class MaterialFilter extends Filter<Material> {
if (blacklist != null) {
for (String s : blacklist) {
if (s.equals("*")) {
this.allowed.removeAll(List.of(Material.values()));
List.of(Material.values()).forEach(this.allowed::remove);
} else {
List<Material> materials = match(s);
if (materials == null) {
@ -45,7 +82,7 @@ public final class MaterialFilter extends Filter<Material> {
continue;
}
this.allowed.removeAll(materials);
materials.forEach(this.allowed::remove);
}
}
}
@ -73,7 +110,7 @@ public final class MaterialFilter extends Filter<Material> {
@Override
public boolean isAllowed(Material object) {
return Collections.binarySearch(this.allowed, object) >= 0;
return this.allowed.contains(object);
}
@Override