mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Fix jigsaw edit command & parallax tweaks
This commit is contained in:
parent
ee6e9b059a
commit
72d7154a96
@ -41,6 +41,11 @@ public class CommandIrisJigsawEdit extends MortarCommand
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(args.length < 1)
|
||||||
|
{
|
||||||
|
sender.sendMessage(getArgsUsage());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
IrisJigsawPiece piece = IrisDataManager.loadAnyJigsawPiece(args[0]);
|
IrisJigsawPiece piece = IrisDataManager.loadAnyJigsawPiece(args[0]);
|
||||||
|
|
||||||
|
@ -386,7 +386,7 @@ public class IrisObject extends IrisRegistrant
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(config.getMode().equals(ObjectPlaceMode.FAST_MAX_HEIGHT) || config.getMode().equals(ObjectPlaceMode.FAST_STILT))
|
else if(config.getMode().equals(ObjectPlaceMode.FAST_MAX_HEIGHT) ||config.getMode().equals(ObjectPlaceMode.VACUUM) || config.getMode().equals(ObjectPlaceMode.FAST_STILT))
|
||||||
{
|
{
|
||||||
BlockVector offset = new BlockVector(config.getTranslate().getX(), config.getTranslate().getY(), config.getTranslate().getZ());
|
BlockVector offset = new BlockVector(config.getTranslate().getX(), config.getTranslate().getY(), config.getTranslate().getZ());
|
||||||
BlockVector rotatedDimensions = config.getRotation().rotate(new BlockVector(getW(), getH(), getD()), spinx, spiny, spinz).clone();
|
BlockVector rotatedDimensions = config.getRotation().rotate(new BlockVector(getW(), getH(), getD()), spinx, spiny, spinz).clone();
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.volmit.iris.object;
|
package com.volmit.iris.object;
|
||||||
|
|
||||||
|
import com.volmit.iris.generator.noise.CNG;
|
||||||
|
import com.volmit.iris.scaffold.cache.AtomicCache;
|
||||||
import com.volmit.iris.scaffold.data.DataProvider;
|
import com.volmit.iris.scaffold.data.DataProvider;
|
||||||
import com.volmit.iris.util.*;
|
import com.volmit.iris.util.*;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -8,13 +10,13 @@ import lombok.EqualsAndHashCode;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode()
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Desc("Represents an iris object placer. It places objects.")
|
@Desc("Represents an iris object placer. It places objects.")
|
||||||
@Data
|
@Data
|
||||||
public class IrisObjectPlacement extends IrisObjectPlacementOptions
|
public class IrisObjectPlacement
|
||||||
{
|
{
|
||||||
@RegistryListObject
|
@RegistryListObject
|
||||||
@Required
|
@Required
|
||||||
@ -23,6 +25,159 @@ public class IrisObjectPlacement extends IrisObjectPlacementOptions
|
|||||||
@Desc("List of objects to place")
|
@Desc("List of objects to place")
|
||||||
private KList<String> place = new KList<>();
|
private KList<String> place = new KList<>();
|
||||||
|
|
||||||
|
@Desc("Rotate this objects placement")
|
||||||
|
private IrisObjectRotation rotation = new IrisObjectRotation();
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("Limit the max height or min height of placement.")
|
||||||
|
private IrisObjectLimit clamp = new IrisObjectLimit();
|
||||||
|
|
||||||
|
@MinNumber(0)
|
||||||
|
@MaxNumber(1)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("The maximum layer level of a snow filter overtop of this placement. Set to 0 to disable. Max of 1.")
|
||||||
|
private double snow = 0;
|
||||||
|
|
||||||
|
@Required
|
||||||
|
@MinNumber(0)
|
||||||
|
@MaxNumber(1)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("The chance for this to place in a chunk. If you need multiple per chunk, set this to 1 and use density.")
|
||||||
|
private double chance = 1;
|
||||||
|
|
||||||
|
@MinNumber(1)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If the chance check passes, place this many in a single chunk")
|
||||||
|
private int density = 1;
|
||||||
|
|
||||||
|
@MaxNumber(64)
|
||||||
|
@MinNumber(0)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If the place mode is set to stilt, you can over-stilt it even further into the ground. Especially useful when using fast stilt due to inaccuracies.")
|
||||||
|
private int overStilt = 0;
|
||||||
|
|
||||||
|
@MaxNumber(64)
|
||||||
|
@MinNumber(0)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("When boar is enabled, expand max-y of the cuboid it removes")
|
||||||
|
private int boarExtendMaxY = 0;
|
||||||
|
|
||||||
|
@MaxNumber(64)
|
||||||
|
@MinNumber(0)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("When boar is enabled, lower min-y of the cuboid it removes")
|
||||||
|
private int boarExtendMinY = 0;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, objects will place on the terrain height, ignoring the water surface.")
|
||||||
|
private boolean underwater = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, objects will place in carvings (such as underground) or under an overhang.")
|
||||||
|
private CarvingMode carvingSupport = CarvingMode.SURFACE_ONLY;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, Iris will try to fill the insides of 'rooms' and 'pockets' where air should fit based off of raytrace checks. This prevents a village house placing in an area where a tree already exists, and instead replaces the parts of the tree where the interior of the structure is. \n\nThis operation does not affect warmed-up generation speed however it does slow down loading objects.")
|
||||||
|
private boolean smartBore = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, Blocks placed underwater that could be waterlogged are waterlogged.")
|
||||||
|
private boolean waterloggable = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, objects will place on the fluid height level Such as boats.")
|
||||||
|
private boolean onwater = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, this object will only place parts of itself where blocks already exist. Warning: Melding is very performance intensive!")
|
||||||
|
private boolean meld = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, this object will place from the ground up instead of height checks when not y locked to the surface. This is not compatable with X and Z axis rotations (it may look off)")
|
||||||
|
private boolean bottom = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If set to true, air will be placed before the schematic places.")
|
||||||
|
private boolean bore = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("Use a generator to warp the field of coordinates. Using simplex for example would make a square placement warp like a flag")
|
||||||
|
private IrisGeneratorStyle warp = new IrisGeneratorStyle(NoiseStyle.FLAT);
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("If the place mode is set to CENTER_HEIGHT_RIGID and you have an X/Z translation, Turning on translate center will also translate the center height check.")
|
||||||
|
private boolean translateCenter = false;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("The placement mode")
|
||||||
|
private ObjectPlaceMode mode = ObjectPlaceMode.CENTER_HEIGHT;
|
||||||
|
|
||||||
|
@ArrayType(min = 1, type = IrisObjectReplace.class)
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("Find and replace blocks")
|
||||||
|
private KList<IrisObjectReplace> edit = new KList<>();
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("Translate this object's placement")
|
||||||
|
private IrisObjectTranslate translate = new IrisObjectTranslate();
|
||||||
|
|
||||||
|
public IrisObjectPlacement toPlacement(String... place)
|
||||||
|
{
|
||||||
|
IrisObjectPlacement p = new IrisObjectPlacement();
|
||||||
|
p.setPlace(new KList<>(place));
|
||||||
|
p.setTranslateCenter(translateCenter);
|
||||||
|
p.setMode(mode);
|
||||||
|
p.setEdit(edit);
|
||||||
|
p.setTranslate(translate);
|
||||||
|
p.setWarp(warp);
|
||||||
|
p.setBore(bore);
|
||||||
|
p.setMeld(meld);
|
||||||
|
p.setWaterloggable(waterloggable);
|
||||||
|
p.setOnwater(onwater);
|
||||||
|
p.setSmartBore(smartBore);
|
||||||
|
p.setCarvingSupport(carvingSupport);
|
||||||
|
p.setUnderwater(underwater);
|
||||||
|
p.setBoarExtendMaxY(boarExtendMaxY);
|
||||||
|
p.setBoarExtendMinY(boarExtendMinY);
|
||||||
|
p.setOverStilt(overStilt);
|
||||||
|
p.setDensity(density);
|
||||||
|
p.setChance(chance);
|
||||||
|
p.setSnow(snow);
|
||||||
|
p.setClamp(clamp);
|
||||||
|
p.setRotation(rotation);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final transient AtomicCache<CNG> surfaceWarp = new AtomicCache<>();
|
||||||
|
|
||||||
|
public CNG getSurfaceWarp(RNG rng)
|
||||||
|
{
|
||||||
|
return surfaceWarp.aquire(() ->
|
||||||
|
{
|
||||||
|
return getWarp().create(rng);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public double warp(RNG rng, double x, double y, double z)
|
||||||
|
{
|
||||||
|
return getSurfaceWarp(rng).fitDouble(-(getWarp().getMultiplier() / 2D), (getWarp().getMultiplier() / 2D), x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTriesForChunk(RNG random)
|
||||||
|
{
|
||||||
|
if(chance <= 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(chance >= 1 || random.nextDouble() < chance)
|
||||||
|
{
|
||||||
|
return density;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public IrisObject getSchematic(DataProvider g, RNG random)
|
public IrisObject getSchematic(DataProvider g, RNG random)
|
||||||
{
|
{
|
||||||
if(place.isEmpty())
|
if(place.isEmpty())
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
package com.volmit.iris.object;
|
|
||||||
|
|
||||||
import com.volmit.iris.generator.noise.CNG;
|
|
||||||
import com.volmit.iris.scaffold.cache.AtomicCache;
|
|
||||||
import com.volmit.iris.util.*;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
@Accessors(chain = true)
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
@Desc("Represents an iris object placer. It places objects.")
|
|
||||||
@Data
|
|
||||||
public class IrisObjectPlacementOptions
|
|
||||||
{
|
|
||||||
@Desc("Rotate this objects placement")
|
|
||||||
private IrisObjectRotation rotation = new IrisObjectRotation();
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("Limit the max height or min height of placement.")
|
|
||||||
private IrisObjectLimit clamp = new IrisObjectLimit();
|
|
||||||
|
|
||||||
@MinNumber(0)
|
|
||||||
@MaxNumber(1)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("The maximum layer level of a snow filter overtop of this placement. Set to 0 to disable. Max of 1.")
|
|
||||||
private double snow = 0;
|
|
||||||
|
|
||||||
@Required
|
|
||||||
@MinNumber(0)
|
|
||||||
@MaxNumber(1)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("The chance for this to place in a chunk. If you need multiple per chunk, set this to 1 and use density.")
|
|
||||||
private double chance = 1;
|
|
||||||
|
|
||||||
@MinNumber(1)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If the chance check passes, place this many in a single chunk")
|
|
||||||
private int density = 1;
|
|
||||||
|
|
||||||
@MaxNumber(64)
|
|
||||||
@MinNumber(0)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If the place mode is set to stilt, you can over-stilt it even further into the ground. Especially useful when using fast stilt due to inaccuracies.")
|
|
||||||
private int overStilt = 0;
|
|
||||||
|
|
||||||
@MaxNumber(64)
|
|
||||||
@MinNumber(0)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("When boar is enabled, expand max-y of the cuboid it removes")
|
|
||||||
private int boarExtendMaxY = 0;
|
|
||||||
|
|
||||||
@MaxNumber(64)
|
|
||||||
@MinNumber(0)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("When boar is enabled, lower min-y of the cuboid it removes")
|
|
||||||
private int boarExtendMinY = 0;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, objects will place on the terrain height, ignoring the water surface.")
|
|
||||||
private boolean underwater = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, objects will place in carvings (such as underground) or under an overhang.")
|
|
||||||
private CarvingMode carvingSupport = CarvingMode.SURFACE_ONLY;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, Iris will try to fill the insides of 'rooms' and 'pockets' where air should fit based off of raytrace checks. This prevents a village house placing in an area where a tree already exists, and instead replaces the parts of the tree where the interior of the structure is. \n\nThis operation does not affect warmed-up generation speed however it does slow down loading objects.")
|
|
||||||
private boolean smartBore = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, Blocks placed underwater that could be waterlogged are waterlogged.")
|
|
||||||
private boolean waterloggable = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, objects will place on the fluid height level Such as boats.")
|
|
||||||
private boolean onwater = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, this object will only place parts of itself where blocks already exist. Warning: Melding is very performance intensive!")
|
|
||||||
private boolean meld = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, this object will place from the ground up instead of height checks when not y locked to the surface. This is not compatable with X and Z axis rotations (it may look off)")
|
|
||||||
private boolean bottom = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If set to true, air will be placed before the schematic places.")
|
|
||||||
private boolean bore = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("Use a generator to warp the field of coordinates. Using simplex for example would make a square placement warp like a flag")
|
|
||||||
private IrisGeneratorStyle warp = new IrisGeneratorStyle(NoiseStyle.FLAT);
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("If the place mode is set to CENTER_HEIGHT_RIGID and you have an X/Z translation, Turning on translate center will also translate the center height check.")
|
|
||||||
private boolean translateCenter = false;
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("The placement mode")
|
|
||||||
private ObjectPlaceMode mode = ObjectPlaceMode.CENTER_HEIGHT;
|
|
||||||
|
|
||||||
@ArrayType(min = 1, type = IrisObjectReplace.class)
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("Find and replace blocks")
|
|
||||||
private KList<IrisObjectReplace> edit = new KList<>();
|
|
||||||
|
|
||||||
@DontObfuscate
|
|
||||||
@Desc("Translate this object's placement")
|
|
||||||
private IrisObjectTranslate translate = new IrisObjectTranslate();
|
|
||||||
|
|
||||||
public IrisObjectPlacement toPlacement(String... place)
|
|
||||||
{
|
|
||||||
IrisObjectPlacement p = new IrisObjectPlacement();
|
|
||||||
p.setPlace(new KList<>(place));
|
|
||||||
p.setTranslateCenter(translateCenter);
|
|
||||||
p.setMode(mode);
|
|
||||||
p.setEdit(edit);
|
|
||||||
p.setTranslate(translate);
|
|
||||||
p.setWarp(warp);
|
|
||||||
p.setBore(bore);
|
|
||||||
p.setMeld(meld);
|
|
||||||
p.setWaterloggable(waterloggable);
|
|
||||||
p.setOnwater(onwater);
|
|
||||||
p.setSmartBore(smartBore);
|
|
||||||
p.setCarvingSupport(carvingSupport);
|
|
||||||
p.setUnderwater(underwater);
|
|
||||||
p.setBoarExtendMaxY(boarExtendMaxY);
|
|
||||||
p.setBoarExtendMinY(boarExtendMinY);
|
|
||||||
p.setOverStilt(overStilt);
|
|
||||||
p.setDensity(density);
|
|
||||||
p.setChance(chance);
|
|
||||||
p.setSnow(snow);
|
|
||||||
p.setClamp(clamp);
|
|
||||||
p.setRotation(rotation);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final transient AtomicCache<CNG> surfaceWarp = new AtomicCache<>();
|
|
||||||
|
|
||||||
public CNG getSurfaceWarp(RNG rng)
|
|
||||||
{
|
|
||||||
return surfaceWarp.aquire(() ->
|
|
||||||
{
|
|
||||||
return getWarp().create(rng);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public double warp(RNG rng, double x, double y, double z)
|
|
||||||
{
|
|
||||||
return getSurfaceWarp(rng).fitDouble(-(getWarp().getMultiplier() / 2D), (getWarp().getMultiplier() / 2D), x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTriesForChunk(RNG random)
|
|
||||||
{
|
|
||||||
if(chance <= 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(chance >= 1 || random.nextDouble() < chance)
|
|
||||||
{
|
|
||||||
return density;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -160,33 +160,26 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f)
|
default void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f) {
|
||||||
{
|
for (IrisFeaturePositional i : getEngine().getDimension().getSpecificFeatures()) {
|
||||||
for(IrisFeaturePositional i : getEngine().getDimension().getSpecificFeatures())
|
if (i.shouldFilter(x, z)) {
|
||||||
{
|
|
||||||
if(i.shouldFilter(x, z))
|
|
||||||
{
|
|
||||||
f.accept(i);
|
f.accept(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int s = (int) Math.ceil(getParallaxSize() / 2D);
|
int s = (int) Math.ceil(getParallaxSize() / 2D);
|
||||||
int i,j;
|
int i, j;
|
||||||
int cx = (int)x >> 4;
|
int cx = (int) x >> 4;
|
||||||
int cz = (int)z >> 4;
|
int cz = (int) z >> 4;
|
||||||
|
|
||||||
for(i = -s; i <= s; i++)
|
for (i = -s; i <= s; i++) {
|
||||||
{
|
|
||||||
int ii = i;
|
int ii = i;
|
||||||
for(j = -s; j <= s; j++)
|
for (j = -s; j <= s; j++) {
|
||||||
{
|
|
||||||
int jj = j;
|
int jj = j;
|
||||||
ParallaxChunkMeta m = getParallaxAccess().getMetaR(ii+cx, jj+cz);
|
ParallaxChunkMeta m = getParallaxAccess().getMetaR(ii + cx, jj + cz);
|
||||||
|
|
||||||
for(IrisFeaturePositional k : m.getZones())
|
for (IrisFeaturePositional k : m.getZones()) {
|
||||||
{
|
if (k.shouldFilter(x, z)) {
|
||||||
if(k.shouldFilter(x, z))
|
|
||||||
{
|
|
||||||
f.accept(k);
|
f.accept(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -194,10 +187,14 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
default void generateParallaxAreaFeatures(int x, int z) {
|
default void generateParallaxArea(int x, int z)
|
||||||
try {
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
|
||||||
int s = (int) Math.ceil(getParallaxSize() / 2D);
|
int s = (int) Math.ceil(getParallaxSize() / 2D);
|
||||||
int i, j;
|
int i,j;
|
||||||
|
|
||||||
for (i = -s; i <= s; i++) {
|
for (i = -s; i <= s; i++) {
|
||||||
for (j = -s; j <= s; j++) {
|
for (j = -s; j <= s; j++) {
|
||||||
@ -216,21 +213,6 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Throwable e) {
|
|
||||||
Iris.error("Failed to generate parallax in " + x + " " + z);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
default void generateParallaxArea(int x, int z)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
|
||||||
generateParallaxAreaFeatures(x, z);
|
|
||||||
int s = (int) Math.ceil(getParallaxSize() / 2D);
|
|
||||||
int i,j;
|
|
||||||
|
|
||||||
for (i = -s; i <= s; i++) {
|
for (i = -s; i <= s; i++) {
|
||||||
for (j = -s; j <= s; j++) {
|
for (j = -s; j <= s; j++) {
|
||||||
generateParallaxLayer(i +x, j +z);
|
generateParallaxLayer(i +x, j +z);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user