More information on recursive and other parallax object placement issues

This commit is contained in:
CocoTheOwner 2021-03-08 15:14:13 +01:00
parent d166cc2a4a
commit a8146a2e81

View File

@ -436,7 +436,14 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
if(rng.chance(i.getChance() + rng.d(-0.005, 0.005)) && rng.chance(getComplex().getObjectChanceStream().get(x<<4, z<<4))) if(rng.chance(i.getChance() + rng.d(-0.005, 0.005)) && rng.chance(getComplex().getObjectChanceStream().get(x<<4, z<<4)))
{ {
place(rng, x<<4, z<<4, i); try {
place(rng, x << 4, z << 4, i);
} catch(Throwable e) {
Iris.error("Failed to place objects in the following biome: " + biome.getName());
Iris.error("Object(s) " + i.getPlace().toString(", ") + " (" + e.getClass().getSimpleName() + ").");
Iris.error("Are these objects missing?");
e.printStackTrace();
}
} }
} }
} }
@ -516,49 +523,40 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
default void place(RNG rng, int x, int forceY, int z, IrisObjectPlacement objectPlacement) default void place(RNG rng, int x, int forceY, int z, IrisObjectPlacement objectPlacement)
{ {
try for(int i = 0; i < objectPlacement.getDensity(); i++)
{ {
for(int i = 0; i < objectPlacement.getDensity(); i++) IrisObject v = objectPlacement.getObject(getComplex(), rng);
int xx = rng.i(x, x+16);
int zz = rng.i(z, z+16);
int id = rng.i(0, Integer.MAX_VALUE);
int maxf = 10000;
AtomicBoolean pl = new AtomicBoolean(false);
AtomicInteger max = new AtomicInteger(-1);
AtomicInteger min = new AtomicInteger(maxf);
int h = v.place(xx, forceY, zz, this, objectPlacement, rng, (b) -> {
int xf = b.getX();
int yf = b.getY();
int zf = b.getZ();
getParallaxAccess().setObject(xf, yf, zf, v.getLoadKey() + "@" + id);
ParallaxChunkMeta meta = getParallaxAccess().getMetaRW(xf>>4, zf>>4);
meta.setObjects(true);
meta.setMinObject(Math.min(Math.max(meta.getMinObject(), 0), yf));
meta.setMaxObject(Math.max(Math.max(meta.getMaxObject(), 0), yf));
}, null, getData());
if(objectPlacement.isVacuum())
{ {
IrisObject v = objectPlacement.getObject(getComplex(), rng); double a = Math.max(v.getW(), v.getD());
int xx = rng.i(x, x+16); IrisFeature f = new IrisFeature();
int zz = rng.i(z, z+16); f.setConvergeToHeight(h-(v.getH() >> 1));
int id = rng.i(0, Integer.MAX_VALUE); f.setBlockRadius(a);
int maxf = 10000; f.setInterpolationRadius(a/4);
AtomicBoolean pl = new AtomicBoolean(false); f.setInterpolator(InterpolationMethod.BILINEAR_STARCAST_9);
AtomicInteger max = new AtomicInteger(-1); f.setStrength(1D);
AtomicInteger min = new AtomicInteger(maxf); getParallaxAccess().getMetaRW(xx>>4, zz>>4).getFeatures().add(new IrisFeaturePositional(xx, zz, f));
int h = v.place(xx, forceY, zz, this, objectPlacement, rng, (b) -> {
int xf = b.getX();
int yf = b.getY();
int zf = b.getZ();
getParallaxAccess().setObject(xf, yf, zf, v.getLoadKey() + "@" + id);
ParallaxChunkMeta meta = getParallaxAccess().getMetaRW(xf>>4, zf>>4);
meta.setObjects(true);
meta.setMinObject(Math.min(Math.max(meta.getMinObject(), 0), yf));
meta.setMaxObject(Math.max(Math.max(meta.getMaxObject(), 0), yf));
}, null, getData());
if(objectPlacement.isVacuum())
{
double a = Math.max(v.getW(), v.getD());
IrisFeature f = new IrisFeature();
f.setConvergeToHeight(h-(v.getH() >> 1));
f.setBlockRadius(a);
f.setInterpolationRadius(a/4);
f.setInterpolator(InterpolationMethod.BILINEAR_STARCAST_9);
f.setStrength(1D);
getParallaxAccess().getMetaRW(xx>>4, zz>>4).getFeatures().add(new IrisFeaturePositional(xx, zz, f));
}
} }
} }
catch(Throwable e)
{
Iris.error("Failed to place one of the following object(s) " + objectPlacement.getPlace().toString(", ") + " (" + e.getClass().getSimpleName() + "). Are these objects missing?");
e.printStackTrace();
}
} }
default void updateParallaxChunkObjectData(int minY, int maxY, int x, int z, IrisObject v) default void updateParallaxChunkObjectData(int minY, int maxY, int x, int z, IrisObject v)