Auto stash before revert of "Merge pull request #561 from CocoTheOwner/DecreeCommands"

This commit is contained in:
cyberpwn
2021-08-28 16:26:45 -04:00
parent a451189d83
commit 2db34f4d49
9 changed files with 246 additions and 25 deletions

View File

@@ -18,29 +18,30 @@
package com.volmit.iris.engine.modifier;
import com.volmit.iris.engine.IrisEngine;
import com.volmit.iris.engine.actuator.IrisDecorantActuator;
import com.volmit.iris.engine.data.cache.Cache;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.framework.EngineAssignedModifier;
import com.volmit.iris.engine.object.basic.IrisPosition;
import com.volmit.iris.engine.object.biome.IrisBiome;
import com.volmit.iris.engine.object.deposits.IrisDepositGenerator;
import com.volmit.iris.engine.object.objects.IrisObject;
import com.volmit.iris.engine.object.regional.IrisRegion;
import com.volmit.iris.engine.object.decoration.IrisDecorationPart;
import com.volmit.iris.engine.object.decoration.IrisDecorator;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.data.B;
import com.volmit.iris.util.data.HeightMap;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.hunk.Hunk;
import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.mantle.MantleChunk;
import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.matter.MatterCavern;
import com.volmit.iris.util.matter.slices.CavernMatter;
import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import lombok.Data;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.BlockVector;
import java.util.Set;
import java.util.Objects;
import java.util.function.Supplier;
public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
private final RNG rng;
@@ -56,24 +57,132 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
PrecisionStopwatch p = PrecisionStopwatch.start();
Mantle mantle = getEngine().getMantle().getMantle();
MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z);
KMap<Long, KList<Integer>> positions = new KMap<>();
mc.iterate(MatterCavern.class, (xx, yy, zz, c) -> {
int rx = xx & 15;
int rz = zz & 15;
BlockData current = output.get(rx, yy, rz);
if(current.getMaterial().isAir())
if(yy > 256 || yy < 0)
{
return;
}
int rx = xx & 15;
int rz = zz & 15;
BlockData current = output.get(rx, yy, rz);
if(B.isFluid(current))
{
return;
}
positions.compute(Cache.key(rx, rz), (k,v) -> Objects.requireNonNullElseGet(v, (Supplier<KList<Integer>>) KList::new).qadd(yy));
if(current.getMaterial().isAir())
{
return;
}
output.set(rx, yy, rz, AIR);
});
positions.forEach((k, v) -> {
if(v.isEmpty())
{
return;
}
int rx = Cache.keyX(k);
int rz = Cache.keyZ(k);
v.sort(Integer::compare);
CaveZone zone = new CaveZone();
zone.setFloor(v.get(0));
int buf = v.get(0) - 1;
for(Integer i : v) {
if (i < 0 || i > 255) {
continue;
}
if (i == buf + 1)
{
buf = i;
zone.ceiling = buf;
}
else if(zone.isValid())
{
processZone(output, mc, zone, rx, rz, rx + (x << 4), rz + (z << 4));
zone = new CaveZone();
zone.setFloor(i);
buf = i;
}
}
});
getEngine().getMetrics().getDeposit().put(p.getMilliseconds());
}
private void processZone(Hunk<BlockData> output, MantleChunk mc, CaveZone zone, int rx, int rz, int xx, int zz) {
boolean decFloor = B.isSolid(output.get(rx, zone.floor - 1, rz));
boolean decCeiling = B.isSolid(output.get(rx, zone.ceiling + 1, rz));
int center = (zone.floor + zone.ceiling) / 2;
int thickness = zone.airThickness();
MatterCavern cavernData = (MatterCavern) mc.getOrCreate(center >> 4).slice(MatterCavern.class)
.get(rx, center & 15, rz);
IrisBiome biome = cavernData.getCustomBiome().isEmpty() ? getEngine().getCaveBiome(xx, zz)
: getEngine().getData().getBiomeLoader().load(cavernData.getCustomBiome());
if(biome == null)
{
return;
}
IrisDecorantActuator actuator = (IrisDecorantActuator) ((IrisEngine)getEngine()).getDecorantActuator();
for(IrisDecorator i : biome.getDecorators()) {
if (i.getPartOf().equals(IrisDecorationPart.NONE)) {
actuator.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.getCeiling());
} else if (i.getPartOf().equals(IrisDecorationPart.CEILING)) {
actuator.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling() + 1, zone.getFloor());
}
}
KList<BlockData> blocks = biome.generateLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex());
for(int i = 0; i < zone.floor-1; i++)
{
if(!blocks.hasIndex(i))
{
break;
}
output.set(rx, zone.floor - i, rz, blocks.get(i));
}
// blocks = biome.generateCeilingLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex()).reverse();
//
// for(int i = 0; i < zone.ceiling-1; i++)
// {
// if(!blocks.hasIndex(i))
// {
// break;
// }
//
// output.set(rx, zone.ceiling + i, rz, blocks.get(i));
// }
}
@Data
public static class CaveZone
{
private int ceiling = -1;
private int floor = -1;
public int airThickness()
{
return (ceiling - floor) - 1;
}
public boolean isValid()
{
return floor < ceiling && ceiling - floor >= 1 && floor >= 0 && ceiling <= 255 && airThickness() > 0;
}
}
}