From 930469a006429ce0c152bfb1924f4481288ffd90 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 11 Sep 2021 12:00:04 -0400 Subject: [PATCH 1/6] Matter placer --- .../engine/object/IrisMatterPlacement.java | 38 ++++++++++++ .../com/volmit/iris/util/mantle/Mantle.java | 11 ++++ .../volmit/iris/util/matter/MatterPlacer.java | 60 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java create mode 100644 src/main/java/com/volmit/iris/util/matter/MatterPlacer.java diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java b/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java new file mode 100644 index 000000000..4bf4fcf66 --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java @@ -0,0 +1,38 @@ +/* + * 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.engine.object; + +import com.volmit.iris.engine.object.annotations.Desc; +import com.volmit.iris.engine.object.annotations.Snippet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Snippet("matter-placer") +@EqualsAndHashCode() +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Desc("Represents an iris object placer. It places objects.") +@Data +public class IrisMatterPlacement { + +} diff --git a/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 2ee288565..1cb977f76 100644 --- a/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -31,8 +31,10 @@ import com.volmit.iris.util.documentation.RegionCoordinates; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer4; +import com.volmit.iris.util.math.AxisAlignedBB; import com.volmit.iris.util.math.M; import com.volmit.iris.util.matter.Matter; +import com.volmit.iris.util.matter.MatterSlice; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; @@ -504,4 +506,13 @@ public class Mantle { public int getLoadedRegionCount() { return loadedRegions.size(); } + + public void set(int x, int y, int z, MatterSlice slice) { + if(slice.isEmpty()) + { + return; + } + + slice.iterateSync((xx,yy,zz,t) -> set(x+xx,y+yy,z+zz,t)); + } } diff --git a/src/main/java/com/volmit/iris/util/matter/MatterPlacer.java b/src/main/java/com/volmit/iris/util/matter/MatterPlacer.java new file mode 100644 index 000000000..ea436ac4d --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/MatterPlacer.java @@ -0,0 +1,60 @@ +/* + * 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.util.mantle.Mantle; + +public interface MatterPlacer { + int getHeight(int x, int z, boolean ignoreFluid); + + Mantle getMantle(); + + default void set(int x, int y, int z, T t) + { + getMantle().set(x,y,z,t); + } + + default T get(int x, int y, int z, Class t) + { + return getMantle().get(x, y, z, t); + } + + default void set(int x, int y, int z, Matter matter) + { + for(MatterSlice i : matter.getSliceMap().values()) + { + set(x, y, z, i); + } + } + + default void set(int x, int y, int z, MatterSlice slice) + { + getMantle().set(x, y, z, slice); + } + + default int getHeight(int x, int z) + { + return getHeight(x, z, true); + } + + default int getHeightOrFluid(int x, int z) + { + return getHeight(x, z, false); + } +} From 2d7bc59db457c39e5543823eeacb5bd7c6dae3e3 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 11 Sep 2021 12:04:48 -0400 Subject: [PATCH 2/6] Matter loader --- .../core/loader/MatterResourceLoader.java | 229 ++++++++++++++++++ .../volmit/iris/util/matter/IrisMatter.java | 20 +- 2 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/volmit/iris/core/loader/MatterResourceLoader.java diff --git a/src/main/java/com/volmit/iris/core/loader/MatterResourceLoader.java b/src/main/java/com/volmit/iris/core/loader/MatterResourceLoader.java new file mode 100644 index 000000000..a87db59d9 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/loader/MatterResourceLoader.java @@ -0,0 +1,229 @@ +/* + * 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.core.loader; + +import com.volmit.iris.Iris; +import com.volmit.iris.engine.object.IrisObject; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.math.M; +import com.volmit.iris.util.matter.IrisMatter; +import com.volmit.iris.util.matter.Matter; +import com.volmit.iris.util.scheduling.ChronoLatch; +import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; + +import java.io.File; +import java.util.concurrent.atomic.AtomicInteger; + +public class MatterResourceLoader extends ResourceLoader { + private final ChronoLatch useFlip = new ChronoLatch(2222); + private final KMap useCache = new KMap<>(); + private final ChronoLatch cl; + private final AtomicInteger unload; + + public MatterResourceLoader(File root, IrisData idm, String folderName, String resourceTypeName) { + super(root, idm, folderName, resourceTypeName, IrisMatter.class); + cl = new ChronoLatch(30000); + unload = new AtomicInteger(0); + } + + public boolean supportsSchemas() { + return false; + } + + public int getSize() { + return loadCache.size(); + } + + public int getTotalStorage() { + return getSize(); + } + + public void clean() { + if (useFlip.flip()) { + unloadLast(30000); + } + } + + public void unloadLast(long age) { + String v = getOldest(); + + if (v == null) { + return; + } + + if (M.ms() - useCache.get(v) > age) { + unload(v); + } + } + + private String getOldest() { + long min = M.ms(); + String v = null; + + for (String i : useCache.k()) { + long t = useCache.get(i); + if (t < min) { + min = t; + v = i; + } + } + + return v; + } + + private void unload(String v) { + lock.lock(); + useCache.remove(v); + loadCache.remove(v); + lock.unlock(); + unload.getAndIncrement(); + + if (unload.get() == 1) { + cl.flip(); + } + + if (cl.flip()) { + J.a(() -> { + Iris.verbose("Unloaded " + C.WHITE + unload.get() + " " + resourceTypeName + (unload.get() == 1 ? "" : "s") + C.GRAY + " to optimize memory usage." + " (" + Form.f(getLoadCache().size()) + " " + resourceTypeName + (loadCache.size() == 1 ? "" : "s") + " Loaded)"); + unload.set(0); + }); + } + } + + public IrisMatter loadFile(File j, String key, String name) { + lock.lock(); + try { + PrecisionStopwatch p = PrecisionStopwatch.start(); + IrisMatter t = (IrisMatter) Matter.read(j); + loadCache.put(key, t); + t.setLoadKey(name); + t.setLoader(manager); + t.setLoadFile(j); + logLoad(j, t); + lock.unlock(); + tlt.addAndGet(p.getMilliseconds()); + return t; + } catch (Throwable e) { + Iris.reportError(e); + lock.unlock(); + Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage()); + return null; + } + } + + public String[] getPossibleKeys() { + if (possibleKeys != null) { + return possibleKeys; + } + + Iris.debug("Building " + resourceTypeName + " Possibility Lists"); + KSet m = new KSet<>(); + + for (File i : getFolders()) { + for (File j : i.listFiles()) { + if (j.isFile() && j.getName().endsWith(".matter")) { + m.add(j.getName().replaceAll("\\Q.matter\\E", "")); + } else if (j.isDirectory()) { + for (File k : j.listFiles()) { + if (k.isFile() && k.getName().endsWith(".matter")) { + m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.matter\\E", "")); + } else if (k.isDirectory()) { + for (File l : k.listFiles()) { + if (l.isFile() && l.getName().endsWith(".matter")) { + m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.matter\\E", "")); + } + } + } + } + } + } + } + + KList v = new KList<>(m); + possibleKeys = v.toArray(new String[0]); + return possibleKeys; + } + + public File findFile(String name) { + lock.lock(); + for (File i : getFolders(name)) { + for (File j : i.listFiles()) { + if (j.isFile() && j.getName().endsWith(".matter") && j.getName().split("\\Q.\\E")[0].equals(name)) { + lock.unlock(); + return j; + } + } + + File file = new File(i, name + ".matter"); + + if (file.exists()) { + lock.unlock(); + return file; + } + } + + Iris.warn("Couldn't find " + resourceTypeName + ": " + name); + + lock.unlock(); + return null; + } + + public IrisMatter load(String name) { + return load(name, true); + } + + public IrisMatter load(String name, boolean warn) { + String key = name + "-" + objectClass.getCanonicalName(); + + if (loadCache.containsKey(key)) { + IrisMatter t = loadCache.get(key); + useCache.put(key, M.ms()); + return t; + } + + lock.lock(); + for (File i : getFolders(name)) { + for (File j : i.listFiles()) { + if (j.isFile() && j.getName().endsWith(".matter") && j.getName().split("\\Q.\\E")[0].equals(name)) { + useCache.put(key, M.ms()); + lock.unlock(); + return loadFile(j, key, name); + } + } + + File file = new File(i, name + ".matter"); + + if (file.exists()) { + useCache.put(key, M.ms()); + lock.unlock(); + return loadFile(file, key, name); + } + } + + Iris.warn("Couldn't find " + resourceTypeName + ": " + name); + + lock.unlock(); + return null; + } +} diff --git a/src/main/java/com/volmit/iris/util/matter/IrisMatter.java b/src/main/java/com/volmit/iris/util/matter/IrisMatter.java index d52052418..f8ccd8692 100644 --- a/src/main/java/com/volmit/iris/util/matter/IrisMatter.java +++ b/src/main/java/com/volmit/iris/util/matter/IrisMatter.java @@ -19,10 +19,13 @@ package com.volmit.iris.util.matter; import com.volmit.iris.Iris; +import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.plugin.VolmitSender; import lombok.Getter; -public class IrisMatter implements Matter { +public class IrisMatter extends IrisRegistrant implements Matter { protected static final KMap, MatterSlice> slicers = buildSlicers(); @Getter @@ -74,4 +77,19 @@ public class IrisMatter implements Matter { return null; } + + @Override + public String getFolderName() { + return "matter"; + } + + @Override + public String getTypeName() { + return "matter"; + } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } } From 7e65416f10a9dd48d417df1969e60a6a8b1180f3 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 11 Sep 2021 12:06:23 -0400 Subject: [PATCH 3/6] Register matter loaders --- src/main/java/com/volmit/iris/core/loader/IrisData.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/volmit/iris/core/loader/IrisData.java b/src/main/java/com/volmit/iris/core/loader/IrisData.java index 7cfd0e4e1..1b1eac6cf 100644 --- a/src/main/java/com/volmit/iris/core/loader/IrisData.java +++ b/src/main/java/com/volmit/iris/core/loader/IrisData.java @@ -54,6 +54,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.format.C; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.IrisMatter; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import lombok.Data; @@ -84,6 +85,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { private ResourceLoader expressionLoader; private ResourceLoader objectLoader; private ResourceLoader scriptLoader; + private ResourceLoader matterLoader; private ResourceLoader caveLoader; private ResourceLoader ravineLoader; private KMap> possibleSnippets; @@ -167,6 +169,10 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { return loadAny(key, (dm) -> dm.getScriptLoader().load(key, false)); } + public static IrisMatter loadAnyMatter(String key) { + return loadAny(key, (dm) -> dm.getMatterLoader().load(key, false)); + } + public static IrisRavine loadAnyRavine(String key) { return loadAny(key, (dm) -> dm.getRavineLoader().load(key, false)); } @@ -280,6 +286,8 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { ResourceLoader r = null; if (registrant.equals(IrisObject.class)) { r = (ResourceLoader) new ObjectResourceLoader(dataFolder, this, rr.getFolderName(), rr.getTypeName()); + } else if (registrant.equals(IrisMatter.class)) { + r = (ResourceLoader) new MatterResourceLoader(dataFolder, this, rr.getFolderName(), rr.getTypeName()); } else if (registrant.equals(IrisScript.class)) { r = (ResourceLoader) new ScriptResourceLoader(dataFolder, this, rr.getFolderName(), rr.getTypeName()); } else { @@ -325,6 +333,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { this.blockLoader = registerLoader(IrisBlockData.class); this.expressionLoader = registerLoader(IrisExpression.class); this.objectLoader = registerLoader(IrisObject.class); + this.matterLoader = registerLoader(IrisMatter.class); this.scriptLoader = registerLoader(IrisScript.class); gson = builder.create(); } From 5a5704ee0bf8db9f37245a33ebc664f78baa534c Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 11 Sep 2021 12:18:25 -0400 Subject: [PATCH 4/6] Read matter from IOB --- .../volmit/iris/engine/object/IrisObject.java | 18 +++++++++++ .../com/volmit/iris/util/matter/Matter.java | 30 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java index f449acd8a..5ef9175c5 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -392,6 +392,24 @@ public class IrisObject extends IrisRegistrant { out.close(); } + public void shrinkwrap() { + BlockVector min = new BlockVector(); + BlockVector max = new BlockVector(); + + for (BlockVector i : getBlocks().keySet()) { + min.setX(Math.min(min.getX(), i.getX())); + min.setY(Math.min(min.getY(), i.getY())); + min.setZ(Math.min(min.getZ(), i.getZ())); + max.setX(Math.max(max.getX(), i.getX())); + max.setY(Math.max(max.getY(), i.getY())); + max.setZ(Math.max(max.getZ(), i.getZ())); + } + + w = max.getBlockX() - min.getBlockX(); + h = max.getBlockY() - min.getBlockY(); + d = max.getBlockZ() - min.getBlockZ(); + } + public void clean() { KMap d = new KMap<>(); 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 1ca0988b3..98393adbf 100644 --- a/src/main/java/com/volmit/iris/util/matter/Matter.java +++ b/src/main/java/com/volmit/iris/util/matter/Matter.java @@ -18,14 +18,17 @@ package com.volmit.iris.util.matter; +import com.volmit.iris.engine.object.IrisObject; import com.volmit.iris.engine.object.IrisPosition; import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.Varint; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.math.BlockPosition; import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; +import org.bukkit.util.BlockVector; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -36,6 +39,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Function; @@ -57,6 +61,26 @@ import java.util.function.Function; public interface Matter { int VERSION = 1; + static Matter from(IrisObject object) + { + object.clean(); + object.shrinkwrap(); + BlockVector min = new BlockVector(); + Matter m = new IrisMatter(object.getW(), object.getH(), object.getD()); + + for (BlockVector i : object.getBlocks().keySet()) { + min.setX(Math.min(min.getX(), i.getX())); + min.setY(Math.min(min.getY(), i.getY())); + min.setZ(Math.min(min.getZ(), i.getZ())); + } + + for (BlockVector i : object.getBlocks().keySet()) { + m.slice(BlockData.class).set(i.getBlockX() - min.getBlockX(), i.getBlockY() - min.getBlockY(), i.getBlockZ() - min.getBlockZ(), object.getBlocks().get(i)); + } + + return m; + } + static Matter read(File f) throws IOException, ClassNotFoundException { FileInputStream in = new FileInputStream(f); Matter m = read(in); @@ -164,7 +188,7 @@ public interface Matter { * @return the center X */ default int getCenterX() { - return Math.round(getWidth() / 2); + return (int) Math.round(getWidth() / 2D); } /** @@ -173,7 +197,7 @@ public interface Matter { * @return the center Y */ default int getCenterY() { - return Math.round(getHeight() / 2); + return (int) Math.round(getHeight() / 2D); } /** @@ -182,7 +206,7 @@ public interface Matter { * @return the center Z */ default int getCenterZ() { - return Math.round(getDepth() / 2); + return (int) Math.round(getDepth() / 2D); } /** From acf4fa106f49bcddce6b00cbae5b2415c63b195f Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 11 Sep 2021 13:05:23 -0400 Subject: [PATCH 5/6] Filtering for matter --- .../java/com/volmit/iris/util/hunk/Hunk.java | 13 ++++++++++ .../volmit/iris/util/matter/MatterFilter.java | 24 +++++++++++++++++++ .../volmit/iris/util/matter/MatterSlice.java | 5 ++++ 3 files changed, 42 insertions(+) create mode 100644 src/main/java/com/volmit/iris/util/matter/MatterFilter.java diff --git a/src/main/java/com/volmit/iris/util/hunk/Hunk.java b/src/main/java/com/volmit/iris/util/hunk/Hunk.java index 7efdc417f..1a71c5924 100644 --- a/src/main/java/com/volmit/iris/util/hunk/Hunk.java +++ b/src/main/java/com/volmit/iris/util/hunk/Hunk.java @@ -28,6 +28,7 @@ import com.volmit.iris.util.function.Consumer5; import com.volmit.iris.util.function.Consumer6; import com.volmit.iris.util.function.Consumer8; import com.volmit.iris.util.function.Function3; +import com.volmit.iris.util.function.Function4; import com.volmit.iris.util.function.NoiseProvider; import com.volmit.iris.util.function.NoiseProvider3; import com.volmit.iris.util.function.Supplier3R; @@ -749,6 +750,18 @@ public interface Hunk { return this; } + default Hunk updateSync(Function4 c) { + for (int i = 0; i < getWidth(); i++) { + for (int j = 0; j < getHeight(); j++) { + for (int k = 0; k < getDepth(); k++) { + set(i,j,k,c.apply(i, j, k, get(i, j, k))); + } + } + } + + return this; + } + default Hunk iterateSyncIO(Consumer4IO c) throws IOException { for (int i = 0; i < getWidth(); i++) { for (int j = 0; j < getHeight(); j++) { diff --git a/src/main/java/com/volmit/iris/util/matter/MatterFilter.java b/src/main/java/com/volmit/iris/util/matter/MatterFilter.java new file mode 100644 index 000000000..566856a2e --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/MatterFilter.java @@ -0,0 +1,24 @@ +/* + * 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; + +@FunctionalInterface +public interface MatterFilter { + T update(int x, int y, int z, T t); +} diff --git a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java b/src/main/java/com/volmit/iris/util/matter/MatterSlice.java index f5906f498..873689106 100644 --- a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java +++ b/src/main/java/com/volmit/iris/util/matter/MatterSlice.java @@ -34,6 +34,11 @@ import java.io.IOException; public interface MatterSlice extends Hunk { Class getType(); + default void applyFilter(MatterFilter filter) + { + updateSync(filter::update); + } + void writeNode(T b, DataOutputStream dos) throws IOException; T readNode(DataInputStream din) throws IOException; From ef22a58631b8196f369543a48a4973dff7c079c8 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 11 Sep 2021 13:16:57 -0400 Subject: [PATCH 6/6] Matter inject --- src/main/java/com/volmit/iris/util/matter/Matter.java | 8 ++++++++ .../java/com/volmit/iris/util/matter/MatterSlice.java | 10 ++++++++++ 2 files changed, 18 insertions(+) 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 98393adbf..2d716ffa4 100644 --- a/src/main/java/com/volmit/iris/util/matter/Matter.java +++ b/src/main/java/com/volmit/iris/util/matter/Matter.java @@ -23,6 +23,7 @@ import com.volmit.iris.engine.object.IrisPosition; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.Varint; +import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.math.BlockPosition; import org.bukkit.World; @@ -88,6 +89,13 @@ public interface Matter { return m; } + default Matter copy() + { + Matter m = new IrisMatter(getWidth(), getHeight(), getDepth()); + getSliceMap().forEach((k,v) -> m.slice(k).forceInject(v)); + return m; + } + static Matter read(InputStream in) throws IOException, ClassNotFoundException { return read(in, (b) -> new IrisMatter(b.getX(), b.getY(), b.getZ())); } diff --git a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java b/src/main/java/com/volmit/iris/util/matter/MatterSlice.java index 873689106..f3cdf8d52 100644 --- a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java +++ b/src/main/java/com/volmit/iris/util/matter/MatterSlice.java @@ -39,6 +39,16 @@ public interface MatterSlice extends Hunk { updateSync(filter::update); } + default void inject(MatterSlice slice) + { + iterateSync(slice::set); + } + + default void forceInject(MatterSlice slice) + { + inject((MatterSlice) slice); + } + void writeNode(T b, DataOutputStream dos) throws IOException; T readNode(DataInputStream din) throws IOException;