diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index ddca3e369..69e5ac73c 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -33,6 +33,8 @@ import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.biome.IrisBiomeCustom; import com.volmit.iris.engine.object.compat.IrisCompat; import com.volmit.iris.engine.object.dimensional.IrisDimension; +import com.volmit.iris.util.io.JarScanner; +import com.volmit.iris.util.matter.Sliced; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; @@ -64,6 +66,8 @@ import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.Plugin; import java.io.*; +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.Date; @@ -100,6 +104,25 @@ public class Iris extends VolmitPlugin implements Listener { J.s(() -> Bukkit.getPluginManager().callEvent(e)); } + public static KList initialize(String s, Class slicedClass) { + JarScanner js = new JarScanner(instance.getJarFile(), s); + KList v = new KList<>(); + J.attempt(js::scan); + for(Class i : js.getClasses()) + { + if(slicedClass == null || i.isAnnotationPresent(slicedClass)) + { + try { + v.add(i.getDeclaredConstructor().newInstance()); + } catch (Throwable ignored) { + + } + } + } + + return v; + } + public void onEnable() { instance = this; diff --git a/src/main/java/com/volmit/iris/util/matter/IrisMatter.java b/src/main/java/com/volmit/iris/util/matter/IrisMatter.java new file mode 100644 index 000000000..92f68641a --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/IrisMatter.java @@ -0,0 +1,79 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.io.JarScanner; +import com.volmit.iris.util.matter.slices.BlockMatter; +import com.volmit.iris.util.matter.slices.BooleanMatter; +import lombok.Getter; +import org.bukkit.block.data.BlockData; + +import java.util.Map; + +public class IrisMatter implements Matter{ + private static final KMap, MatterSlice> slicers = buildSlicers(); + + @Getter + private final MatterHeader header; + + @Getter + private final int width; + + @Getter + private final int height; + + @Getter + private final int depth; + + @Getter + private KMap, MatterSlice> sliceMap; + + public IrisMatter(int width, int height, int depth) + { + this.width = width; + this.height = height; + this.depth = depth; + this.header = new MatterHeader(); + } + + @Override + public MatterSlice createSlice(Class type, Matter m) { + MatterSlice slice = slicers.get(type); + + if(slice == null) + { + return null; + } + + return (MatterSlice) slice; + } + + private static KMap, MatterSlice> buildSlicers() { + KMap, MatterSlice> c = new KMap<>(); + for(Object i : Iris.initialize("com.volmit.iris.util.matter.slices", Sliced.class)) + { + MatterSlice s = (MatterSlice) i; + c.put(s.getType(), s); + } + + return c; + } +} diff --git a/src/main/java/com/volmit/iris/util/matter/Matter.java b/src/main/java/com/volmit/iris/util/matter/Matter.java index afd1860dc..45c43cb58 100644 --- a/src/main/java/com/volmit/iris/util/matter/Matter.java +++ b/src/main/java/com/volmit/iris/util/matter/Matter.java @@ -157,6 +157,23 @@ public interface Matter { return (MatterSlice) getSliceMap().put(c, slice); } + default MatterSlice slice(Class c) + { + if(!hasSlice(c)) + { + MatterSlice s = createSlice(c, this); + + if(s == null) + { + return null; + } + + putSlice(c, (MatterSlice) s); + } + + return (MatterSlice) getSlice(c); + } + /** * Check if a slice exists for a given type * @param c the slice class type diff --git a/src/main/java/com/volmit/iris/util/matter/Sliced.java b/src/main/java/com/volmit/iris/util/matter/Sliced.java new file mode 100644 index 000000000..591a8d78c --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/Sliced.java @@ -0,0 +1,27 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Sliced { + +} diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java index 90cbac558..e906f66b8 100644 --- a/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java @@ -18,6 +18,7 @@ package com.volmit.iris.util.matter.slices; +import com.volmit.iris.util.matter.Sliced; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.tag.CompoundTag; @@ -27,8 +28,14 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +@Sliced public class BlockMatter extends RawMatter { + public BlockMatter() + { + this(1,1,1); + } + public BlockMatter(int width, int height, int depth) { super(width, height, depth, BlockData.class); } diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java index 217f8fd44..0e00a73e1 100644 --- a/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/slices/BooleanMatter.java @@ -18,12 +18,20 @@ package com.volmit.iris.util.matter.slices; +import com.volmit.iris.util.matter.Sliced; + import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +@Sliced public class BooleanMatter extends RawMatter { + public BooleanMatter() + { + this(1,1,1); + } + public BooleanMatter(int width, int height, int depth) { super(width, height, depth, Boolean.class); } diff --git a/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java index 681959cc1..827e306b2 100644 --- a/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/slices/CompoundMatter.java @@ -18,10 +18,17 @@ package com.volmit.iris.util.matter.slices; +import com.volmit.iris.util.matter.Sliced; import com.volmit.iris.util.nbt.tag.CompoundTag; +@Sliced public class CompoundMatter extends NBTMatter { + public CompoundMatter() + { + this(1,1,1); + } + public CompoundMatter(int width, int height, int depth) { super(width, height, depth, CompoundTag.class); } diff --git a/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java index caf9099db..b4be32d94 100644 --- a/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/slices/IntMatter.java @@ -19,13 +19,19 @@ package com.volmit.iris.util.matter.slices; import com.volmit.iris.util.data.Varint; +import com.volmit.iris.util.matter.Sliced; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +@Sliced public class IntMatter extends RawMatter { + public IntMatter() + { + this(1,1,1); + } public IntMatter(int width, int height, int depth) { super(width, height, depth, Integer.class); } diff --git a/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java index 994d93921..badb2467f 100644 --- a/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/slices/LongMatter.java @@ -19,13 +19,19 @@ package com.volmit.iris.util.matter.slices; import com.volmit.iris.util.data.Varint; +import com.volmit.iris.util.matter.Sliced; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +@Sliced public class LongMatter extends RawMatter { + public LongMatter() + { + this(1,1,1); + } public LongMatter(int width, int height, int depth) { super(width, height, depth, Long.class); } diff --git a/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java index ae952c31b..7736e751c 100644 --- a/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/slices/StringMatter.java @@ -19,13 +19,19 @@ package com.volmit.iris.util.matter.slices; import com.volmit.iris.util.matter.MatterSlice; +import com.volmit.iris.util.matter.Sliced; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +@Sliced public class StringMatter extends RawMatter { + public StringMatter() + { + this(1,1,1); + } public StringMatter(int width, int height, int depth) { super(width, height, depth, String.class); } diff --git a/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java b/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java index 2fb7db1f9..7642afd6d 100644 --- a/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java +++ b/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java @@ -152,6 +152,11 @@ public abstract class VolmitPlugin extends JavaPlugin implements Listener { }).start(); } + public File getJarFile() + { + return getFile(); + } + public void l(Object l) { Iris.info("[" + getName() + "]: " + l); }