diff --git a/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java b/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java index db1eede0f..740933cac 100644 --- a/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java +++ b/src/main/java/com/volmit/iris/engine/object/cave/IrisCave.java @@ -22,6 +22,9 @@ import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.core.project.loader.IrisRegistrant; import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.noise.IrisWorm; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.data.B; +import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.Worm; import com.volmit.iris.util.noise.Worm3; @@ -31,6 +34,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import org.bukkit.block.data.BlockData; +import org.bukkit.util.Vector; @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) @@ -51,14 +56,4 @@ public class IrisCave extends IrisRegistrant { public String getTypeName() { return "Cave"; } - - public void generateCave(RNG rng, IrisData data, int x, int y, int z) - { - WormIterator3 w = worm.iterate3D(rng, data, x, y, z); - - while(w.hasNext()) - { - Worm3 wx = w.next(); - } - } } diff --git a/src/main/java/com/volmit/iris/engine/object/cave/IrisCavePlacer.java b/src/main/java/com/volmit/iris/engine/object/cave/IrisCavePlacer.java new file mode 100644 index 000000000..a3142e307 --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/cave/IrisCavePlacer.java @@ -0,0 +1,99 @@ +/* + * 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.cave; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.engine.data.cache.AtomicCache; +import com.volmit.iris.engine.object.annotations.Desc; +import com.volmit.iris.engine.object.annotations.MinNumber; +import com.volmit.iris.engine.object.annotations.RegistryListResource; +import com.volmit.iris.engine.object.annotations.Required; +import com.volmit.iris.engine.object.common.IRare; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.data.B; +import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.noise.Worm3; +import com.volmit.iris.util.noise.WormIterator3; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.bukkit.block.data.BlockData; +import org.bukkit.util.Vector; + +import java.util.concurrent.atomic.AtomicBoolean; + +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Desc("Translate objects") +@Data +public class IrisCavePlacer implements IRare { + private static final BlockData CAVE_AIR = B.get("CAVE_AIR"); + + @Required + @Desc("Typically a 1 in RARITY on a per chunk basis") + @MinNumber(1) + private int rarity = 15; + + @MinNumber(1) + @Required + @RegistryListResource(IrisCave.class) + private String cave; + + private transient final AtomicCache caveCache = new AtomicCache<>(); + private transient final AtomicBoolean fail = new AtomicBoolean(false); + + public IrisCave getRealCave(IrisData data) + { + return caveCache.aquire(() -> data.getCaveLoader().load(getCave())); + } + + public void generateCave(Mantle mantle, RNG rng, IrisData data, int x, int y, int z) + { + if(fail.get()) + { + return; + } + + IrisCave cave = getRealCave(data); + + if(cave == null) + { + Iris.warn("Unable to locate cave for generation!"); + fail.set(true); + return; + } + + WormIterator3 w = cave.getWorm().iterate3D(rng, data, x, y, z); + KList points = new KList<>(); + + while(w.hasNext()) + { + Worm3 wx = w.next(); + points.add(new Vector(wx.getX().getPosition(), wx.getY().getPosition(), wx.getZ().getPosition())); + } + + mantle.setSpline(points, cave.getWorm().getGirth().get(rng, x, z, data), true, CAVE_AIR); + + // TODO decorate somehow + } +}