mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Fixed
This commit is contained in:
parent
1b9c7d48e4
commit
445ce46357
@ -9,10 +9,13 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import mortar.api.nms.NMP;
|
import mortar.api.nms.NMP;
|
||||||
|
import mortar.util.text.C;
|
||||||
import ninja.bytecode.iris.controller.TimingsController;
|
import ninja.bytecode.iris.controller.TimingsController;
|
||||||
import ninja.bytecode.iris.generator.IrisGenerator;
|
import ninja.bytecode.iris.generator.IrisGenerator;
|
||||||
import ninja.bytecode.iris.pack.IrisBiome;
|
import ninja.bytecode.iris.pack.IrisBiome;
|
||||||
|
import ninja.bytecode.iris.util.BiomeLayer;
|
||||||
import ninja.bytecode.shuriken.format.F;
|
import ninja.bytecode.shuriken.format.F;
|
||||||
|
import ninja.bytecode.shuriken.logging.L;
|
||||||
|
|
||||||
public class CommandIris implements CommandExecutor
|
public class CommandIris implements CommandExecutor
|
||||||
{
|
{
|
||||||
@ -44,6 +47,46 @@ public class CommandIris implements CommandExecutor
|
|||||||
msg(sender, " \\Decor: " + ChatColor.BOLD + ChatColor.WHITE + F.duration(d, 2));
|
msg(sender, " \\Decor: " + ChatColor.BOLD + ChatColor.WHITE + F.duration(d, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(args[0].equalsIgnoreCase("info"))
|
||||||
|
{
|
||||||
|
if(sender instanceof Player)
|
||||||
|
{
|
||||||
|
Player p = (Player) sender;
|
||||||
|
World w = p.getWorld();
|
||||||
|
|
||||||
|
if(w.getGenerator() instanceof IrisGenerator)
|
||||||
|
{
|
||||||
|
IrisGenerator g = (IrisGenerator) w.getGenerator();
|
||||||
|
IrisBiome biome = g.getBiome((int) g.getOffsetX(p.getLocation().getX()), (int) g.getOffsetZ(p.getLocation().getZ()));
|
||||||
|
BiomeLayer l = new BiomeLayer(g, biome);
|
||||||
|
msg(p, "Biome: " + C.BOLD + C.WHITE + biome.getName() + C.RESET + C.GRAY + " (" + C.GOLD + l.getBiome().getRarityString() + C.GRAY + ")");
|
||||||
|
|
||||||
|
for(String i : biome.getSchematicGroups().k())
|
||||||
|
{
|
||||||
|
String f = "";
|
||||||
|
double percent = biome.getSchematicGroups().get(i);
|
||||||
|
|
||||||
|
if(percent > 1D)
|
||||||
|
{
|
||||||
|
f = (int) percent + " + " + F.pc(percent - (int) percent, percent - (int) percent >= 0.01 ? 0 : 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f = F.pc(percent, percent >= 0.01 ? 0 : 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg(p, "* " + C.DARK_GREEN + i + ": " + C.BOLD + C.WHITE + f + C.RESET + C.GRAY + " (" + F.f(g.getDimension().getObjectGroup(i).size()) + " variants)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg(sender, "Not in an Iris World");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(args[0].equalsIgnoreCase("rtp"))
|
if(args[0].equalsIgnoreCase("rtp"))
|
||||||
{
|
{
|
||||||
if(sender instanceof Player)
|
if(sender instanceof Player)
|
||||||
@ -118,6 +161,11 @@ public class CommandIris implements CommandExecutor
|
|||||||
p.teleport(w.getHighestBlockAt(x, z).getLocation());
|
p.teleport(w.getHighestBlockAt(x, z).getLocation());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg(sender, "Not in an Iris World");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package ninja.bytecode.iris;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
@ -56,9 +57,23 @@ public class Iris extends JavaPlugin implements Listener
|
|||||||
|
|
||||||
public void onDisable()
|
public void onDisable()
|
||||||
{
|
{
|
||||||
|
getController(PackController.class).dispose();
|
||||||
controllerSet.stopControllers();
|
controllerSet.stopControllers();
|
||||||
HandlerList.unregisterAll((Plugin) this);
|
HandlerList.unregisterAll((Plugin) this);
|
||||||
Bukkit.getScheduler().cancelTasks(this);
|
Bukkit.getScheduler().cancelTasks(this);
|
||||||
|
|
||||||
|
if(Iris.settings.performance.debugMode)
|
||||||
|
{
|
||||||
|
for(World i : Bukkit.getWorlds())
|
||||||
|
{
|
||||||
|
if(i.getGenerator() instanceof IrisGenerator)
|
||||||
|
{
|
||||||
|
((IrisGenerator) i.getGenerator()).dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.gc();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reload()
|
public void reload()
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package ninja.bytecode.iris.controller;
|
package ninja.bytecode.iris.controller;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@ -12,6 +14,7 @@ import ninja.bytecode.iris.util.IrisController;
|
|||||||
import ninja.bytecode.shuriken.collections.GList;
|
import ninja.bytecode.shuriken.collections.GList;
|
||||||
import ninja.bytecode.shuriken.collections.GSet;
|
import ninja.bytecode.shuriken.collections.GSet;
|
||||||
import ninja.bytecode.shuriken.execution.J;
|
import ninja.bytecode.shuriken.execution.J;
|
||||||
|
import ninja.bytecode.shuriken.io.IO;
|
||||||
|
|
||||||
public class DebugController implements IrisController
|
public class DebugController implements IrisController
|
||||||
{
|
{
|
||||||
@ -62,7 +65,8 @@ public class DebugController implements IrisController
|
|||||||
Bukkit.unloadWorld(i, false);
|
Bukkit.unloadWorld(i, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> {
|
Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () ->
|
||||||
|
{
|
||||||
for(World i : destroy.copy())
|
for(World i : destroy.copy())
|
||||||
{
|
{
|
||||||
Bukkit.unloadWorld(i, false);
|
Bukkit.unloadWorld(i, false);
|
||||||
@ -80,6 +84,24 @@ public class DebugController implements IrisController
|
|||||||
@Override
|
@Override
|
||||||
public void onStop()
|
public void onStop()
|
||||||
{
|
{
|
||||||
|
deleteOnExit(new File("iris-worlds"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteOnExit(File f)
|
||||||
|
{
|
||||||
|
if(f == null || !f.exists())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(f.isDirectory())
|
||||||
|
{
|
||||||
|
for(File i : f.listFiles())
|
||||||
|
{
|
||||||
|
deleteOnExit(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.deleteOnExit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,16 +105,12 @@ public class PackController implements IrisController
|
|||||||
}
|
}
|
||||||
|
|
||||||
L.v(ChatColor.LIGHT_PURPLE + "Processing Content");
|
L.v(ChatColor.LIGHT_PURPLE + "Processing Content");
|
||||||
TaskExecutor executor = new TaskExecutor(Runtime.getRuntime().availableProcessors() * 2, Thread.MIN_PRIORITY, "Schematic Processor");
|
|
||||||
TaskGroup gx = executor.startWork();
|
|
||||||
for(GenObjectGroup i : genObjectGroups.v())
|
for(GenObjectGroup i : genObjectGroups.v())
|
||||||
{
|
{
|
||||||
gx.queue(i::processVariants);
|
i.processVariants();
|
||||||
}
|
}
|
||||||
|
|
||||||
gx.execute();
|
|
||||||
executor.close();
|
|
||||||
|
|
||||||
for(String i : dimensions.k())
|
for(String i : dimensions.k())
|
||||||
{
|
{
|
||||||
IrisDimension id = dimensions.get(i);
|
IrisDimension id = dimensions.get(i);
|
||||||
@ -284,4 +280,12 @@ public class PackController implements IrisController
|
|||||||
|
|
||||||
return biomes.get(id);
|
return biomes.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void dispose()
|
||||||
|
{
|
||||||
|
compiledDimensions.clear();
|
||||||
|
dimensions.clear();
|
||||||
|
biomes.clear();
|
||||||
|
genObjectGroups.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,23 +12,13 @@ import ninja.bytecode.iris.generator.IrisGenerator;
|
|||||||
import ninja.bytecode.iris.pack.CompiledDimension;
|
import ninja.bytecode.iris.pack.CompiledDimension;
|
||||||
import ninja.bytecode.iris.util.IrisController;
|
import ninja.bytecode.iris.util.IrisController;
|
||||||
import ninja.bytecode.shuriken.execution.J;
|
import ninja.bytecode.shuriken.execution.J;
|
||||||
import ninja.bytecode.shuriken.io.IO;
|
|
||||||
|
|
||||||
public class WorldController implements IrisController
|
public class WorldController implements IrisController
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
public void onStart()
|
public void onStart()
|
||||||
{
|
{
|
||||||
J.attemptAsync(() ->
|
|
||||||
{
|
|
||||||
for(File i : new File(Iris.instance.getDataFolder().getParentFile().getParentFile(), "iris-worlds").listFiles())
|
|
||||||
{
|
|
||||||
if(new File(i, ".garbage").exists())
|
|
||||||
{
|
|
||||||
IO.delete(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isChunkGenerated(World w, int x, int z)
|
public boolean isChunkGenerated(World w, int x, int z)
|
||||||
|
@ -8,7 +8,7 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.generator.BlockPopulator;
|
import org.bukkit.generator.BlockPopulator;
|
||||||
|
|
||||||
import net.minecraft.server.v1_12_R1.CriterionTriggerBredAnimals.b;
|
import mortar.util.text.C;
|
||||||
import ninja.bytecode.iris.Iris;
|
import ninja.bytecode.iris.Iris;
|
||||||
import ninja.bytecode.iris.controller.PackController;
|
import ninja.bytecode.iris.controller.PackController;
|
||||||
import ninja.bytecode.iris.generator.genobject.GenObjectDecorator;
|
import ninja.bytecode.iris.generator.genobject.GenObjectDecorator;
|
||||||
@ -24,7 +24,6 @@ import ninja.bytecode.iris.pack.CompiledDimension;
|
|||||||
import ninja.bytecode.iris.pack.IrisBiome;
|
import ninja.bytecode.iris.pack.IrisBiome;
|
||||||
import ninja.bytecode.iris.pack.IrisRegion;
|
import ninja.bytecode.iris.pack.IrisRegion;
|
||||||
import ninja.bytecode.iris.util.AtomicChunkData;
|
import ninja.bytecode.iris.util.AtomicChunkData;
|
||||||
import ninja.bytecode.iris.util.BiomeLayer;
|
|
||||||
import ninja.bytecode.iris.util.ChunkPlan;
|
import ninja.bytecode.iris.util.ChunkPlan;
|
||||||
import ninja.bytecode.iris.util.IrisInterpolation;
|
import ninja.bytecode.iris.util.IrisInterpolation;
|
||||||
import ninja.bytecode.iris.util.MB;
|
import ninja.bytecode.iris.util.MB;
|
||||||
@ -56,6 +55,7 @@ public class IrisGenerator extends ParallelChunkGenerator
|
|||||||
});
|
});
|
||||||
//@done
|
//@done
|
||||||
|
|
||||||
|
private boolean disposed;
|
||||||
private double[][][] scatterCache;
|
private double[][][] scatterCache;
|
||||||
private CNG scatter;
|
private CNG scatter;
|
||||||
private MB ICE = new MB(Material.ICE);
|
private MB ICE = new MB(Material.ICE);
|
||||||
@ -81,6 +81,7 @@ public class IrisGenerator extends ParallelChunkGenerator
|
|||||||
public IrisGenerator(CompiledDimension dim)
|
public IrisGenerator(CompiledDimension dim)
|
||||||
{
|
{
|
||||||
this.dim = dim;
|
this.dim = dim;
|
||||||
|
disposed = false;
|
||||||
L.i("Preparing Dimension: " + dim.getName() + " With " + dim.getBiomes().size() + " Biomes...");
|
L.i("Preparing Dimension: " + dim.getName() + " With " + dim.getBiomes().size() + " Biomes...");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +103,11 @@ public class IrisGenerator extends ParallelChunkGenerator
|
|||||||
@Override
|
@Override
|
||||||
public void onInit(World world, Random random)
|
public void onInit(World world, Random random)
|
||||||
{
|
{
|
||||||
|
if(disposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.world = world;
|
this.world = world;
|
||||||
rTerrain = new RNG(world.getSeed());
|
rTerrain = new RNG(world.getSeed());
|
||||||
glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2));
|
glLNoise = new GenLayerLayeredNoise(this, world, random, rTerrain.nextParallelRNG(2));
|
||||||
@ -233,6 +239,12 @@ public class IrisGenerator extends ParallelChunkGenerator
|
|||||||
@Override
|
@Override
|
||||||
public Biome genColumn(int wxxf, int wzxf, int x, int z, ChunkPlan plan)
|
public Biome genColumn(int wxxf, int wzxf, int x, int z, ChunkPlan plan)
|
||||||
{
|
{
|
||||||
|
if(disposed)
|
||||||
|
{
|
||||||
|
setBlock(x, 0, z, Material.MAGENTA_GLAZED_TERRACOTTA);
|
||||||
|
return Biome.VOID;
|
||||||
|
}
|
||||||
|
|
||||||
double wx = getOffsetX(wxxf);
|
double wx = getOffsetX(wxxf);
|
||||||
double wz = getOffsetZ(wzxf);
|
double wz = getOffsetZ(wzxf);
|
||||||
int wxx = (int) wx;
|
int wxx = (int) wx;
|
||||||
@ -374,4 +386,26 @@ public class IrisGenerator extends ParallelChunkGenerator
|
|||||||
{
|
{
|
||||||
return dim;
|
return dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void dispose()
|
||||||
|
{
|
||||||
|
if(disposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
L.w(C.YELLOW + "Disposed Iris World " + C.RED + world.getName());
|
||||||
|
disposed = true;
|
||||||
|
dim = null;
|
||||||
|
glLNoise = null;
|
||||||
|
glCaves = null;
|
||||||
|
glCarving = null;
|
||||||
|
glCaverns = null;
|
||||||
|
glSnow = null;
|
||||||
|
glCliffs = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDisposed()
|
||||||
|
{
|
||||||
|
return disposed;
|
||||||
|
}
|
||||||
}
|
}
|
@ -22,6 +22,7 @@ import ninja.bytecode.iris.generator.placer.NMSPlacer;
|
|||||||
import ninja.bytecode.iris.util.Direction;
|
import ninja.bytecode.iris.util.Direction;
|
||||||
import ninja.bytecode.iris.util.IPlacer;
|
import ninja.bytecode.iris.util.IPlacer;
|
||||||
import ninja.bytecode.iris.util.MB;
|
import ninja.bytecode.iris.util.MB;
|
||||||
|
import ninja.bytecode.iris.util.SBlockVector;
|
||||||
import ninja.bytecode.iris.util.VectorMath;
|
import ninja.bytecode.iris.util.VectorMath;
|
||||||
import ninja.bytecode.shuriken.collections.GList;
|
import ninja.bytecode.shuriken.collections.GList;
|
||||||
import ninja.bytecode.shuriken.collections.GMap;
|
import ninja.bytecode.shuriken.collections.GMap;
|
||||||
@ -36,7 +37,7 @@ public class GenObject
|
|||||||
private int h;
|
private int h;
|
||||||
private int d;
|
private int d;
|
||||||
private String name = "?";
|
private String name = "?";
|
||||||
private final GMap<BlockVector, MB> s;
|
private final GMap<SBlockVector, MB> s;
|
||||||
private BlockVector mount;
|
private BlockVector mount;
|
||||||
private int mountHeight;
|
private int mountHeight;
|
||||||
private BlockVector shift;
|
private BlockVector shift;
|
||||||
@ -55,19 +56,19 @@ public class GenObject
|
|||||||
{
|
{
|
||||||
int ly = Integer.MAX_VALUE;
|
int ly = Integer.MAX_VALUE;
|
||||||
|
|
||||||
for(BlockVector i : s.k())
|
for(SBlockVector i : s.keySet())
|
||||||
{
|
{
|
||||||
if(i.getBlockY() < ly)
|
if(i.getY() < ly)
|
||||||
{
|
{
|
||||||
ly = i.getBlockY();
|
ly = (int) i.getY();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GList<BlockVector> fmount = new GList<>();
|
GList<SBlockVector> fmount = new GList<>();
|
||||||
|
|
||||||
for(BlockVector i : s.k())
|
for(SBlockVector i : s.keySet())
|
||||||
{
|
{
|
||||||
if(i.getBlockY() == ly)
|
if(i.getY() == ly)
|
||||||
{
|
{
|
||||||
fmount.add(i);
|
fmount.add(i);
|
||||||
}
|
}
|
||||||
@ -78,11 +79,11 @@ public class GenObject
|
|||||||
double avz[] = new double[fmount.size()];
|
double avz[] = new double[fmount.size()];
|
||||||
int c = 0;
|
int c = 0;
|
||||||
|
|
||||||
for(BlockVector i : fmount)
|
for(SBlockVector i : fmount)
|
||||||
{
|
{
|
||||||
avx[c] = i.getBlockX();
|
avx[c] = i.getX();
|
||||||
avy[c] = i.getBlockY();
|
avy[c] = i.getY();
|
||||||
avz[c] = i.getBlockZ();
|
avz[c] = i.getZ();
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +123,7 @@ public class GenObject
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GMap<BlockVector, MB> getSchematic()
|
public GMap<SBlockVector, MB> getSchematic()
|
||||||
{
|
{
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -157,7 +158,7 @@ public class GenObject
|
|||||||
|
|
||||||
for(int i = 0; i < l; i++)
|
for(int i = 0; i < l; i++)
|
||||||
{
|
{
|
||||||
s.put(new BlockVector(din.readInt(), din.readInt(), din.readInt()), new MB(Material.getMaterial((int) din.readInt()), din.readInt()));
|
s.put(new SBlockVector(din.readInt(), din.readInt(), din.readInt()), new MB(Material.getMaterial((int) din.readInt()), din.readInt()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,11 +170,11 @@ public class GenObject
|
|||||||
dos.writeInt(d);
|
dos.writeInt(d);
|
||||||
dos.writeInt(s.size());
|
dos.writeInt(s.size());
|
||||||
|
|
||||||
for(BlockVector i : s.keySet())
|
for(SBlockVector i : s.keySet())
|
||||||
{
|
{
|
||||||
dos.writeInt(i.getBlockX());
|
dos.writeInt((int) i.getX());
|
||||||
dos.writeInt(i.getBlockY());
|
dos.writeInt((int) i.getY());
|
||||||
dos.writeInt(i.getBlockZ());
|
dos.writeInt((int) i.getZ());
|
||||||
dos.writeInt(s.get(i).material.getId());
|
dos.writeInt(s.get(i).material.getId());
|
||||||
dos.writeInt(s.get(i).data);
|
dos.writeInt(s.get(i).data);
|
||||||
}
|
}
|
||||||
@ -189,17 +190,17 @@ public class GenObject
|
|||||||
|
|
||||||
public MB get(int x, int y, int z)
|
public MB get(int x, int y, int z)
|
||||||
{
|
{
|
||||||
return s.get(new BlockVector(x, y, z));
|
return s.get(new SBlockVector(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean has(int x, int y, int z)
|
public boolean has(int x, int y, int z)
|
||||||
{
|
{
|
||||||
return s.contains(new BlockVector(x, y, z));
|
return s.containsKey(new SBlockVector(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void put(int x, int y, int z, MB mb)
|
public void put(int x, int y, int z, MB mb)
|
||||||
{
|
{
|
||||||
s.put(new BlockVector(x, y, z), mb);
|
s.put(new SBlockVector(x, y, z), mb);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GenObject copy()
|
public GenObject copy()
|
||||||
@ -216,10 +217,10 @@ public class GenObject
|
|||||||
s.clear();
|
s.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fill(GMap<BlockVector, MB> b)
|
public void fill(GMap<SBlockVector, MB> b)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
s.put(b);
|
s.putAll(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int sh(int g)
|
public int sh(int g)
|
||||||
@ -259,7 +260,7 @@ public class GenObject
|
|||||||
start.add(shift);
|
start.add(shift);
|
||||||
GMap<Location, MB> undo = new GMap<>();
|
GMap<Location, MB> undo = new GMap<>();
|
||||||
|
|
||||||
for(BlockVector i : getSchematic().k())
|
for(SBlockVector i : s.keySet())
|
||||||
{
|
{
|
||||||
MB b = getSchematic().get(i);
|
MB b = getSchematic().get(i);
|
||||||
|
|
||||||
@ -268,10 +269,10 @@ public class GenObject
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Location f = start.clone().add(i);
|
Location f = start.clone().add(i.toBlockVector());
|
||||||
|
|
||||||
Material m = placer.get(f.clone().subtract(0, 1, 0)).material;
|
Material m = placer.get(f.clone().subtract(0, 1, 0)).material;
|
||||||
if(i.getBlockY() == mountHeight && (m.equals(Material.WATER) || m.equals(Material.STATIONARY_WATER) || m.equals(Material.LAVA) || m.equals(Material.STATIONARY_LAVA)))
|
if(i.getY() == mountHeight && (m.equals(Material.WATER) || m.equals(Material.STATIONARY_WATER) || m.equals(Material.LAVA) || m.equals(Material.STATIONARY_LAVA)))
|
||||||
{
|
{
|
||||||
for(Location j : undo.k())
|
for(Location j : undo.k())
|
||||||
{
|
{
|
||||||
@ -336,13 +337,14 @@ public class GenObject
|
|||||||
|
|
||||||
public void rotate(Direction from, Direction to)
|
public void rotate(Direction from, Direction to)
|
||||||
{
|
{
|
||||||
GMap<BlockVector, MB> g = s.copy();
|
GMap<SBlockVector, MB> g = new GMap<>();
|
||||||
|
g.putAll(s);
|
||||||
s.clear();
|
s.clear();
|
||||||
|
|
||||||
for(BlockVector i : g.k())
|
for(SBlockVector i : g.keySet())
|
||||||
{
|
{
|
||||||
MB mb = g.get(i);
|
MB mb = g.get(i);
|
||||||
s.put(VectorMath.rotate(from, to, i).toBlockVector(), mb);
|
s.put(new SBlockVector(VectorMath.rotate(from, to, i.toBlockVector()).toBlockVector()), mb);
|
||||||
}
|
}
|
||||||
|
|
||||||
name = name + "-rt" + to.name();
|
name = name + "-rt" + to.name();
|
||||||
@ -358,10 +360,12 @@ public class GenObject
|
|||||||
MB a = MB.of(g[1]);
|
MB a = MB.of(g[1]);
|
||||||
boolean specific = g[1].contains(":");
|
boolean specific = g[1].contains(":");
|
||||||
MB b = MB.of(g[2]);
|
MB b = MB.of(g[2]);
|
||||||
|
GMap<SBlockVector, MB> m = new GMap<>();
|
||||||
for(BlockVector i : s.k())
|
m.putAll(s);
|
||||||
|
s.clear();
|
||||||
|
for(SBlockVector i : m.keySet())
|
||||||
{
|
{
|
||||||
MB c = s.get(i);
|
MB c = m.get(i);
|
||||||
|
|
||||||
if((specific && c.equals(a)) || c.material.equals(a.material))
|
if((specific && c.equals(a)) || c.material.equals(a.material))
|
||||||
{
|
{
|
||||||
@ -394,36 +398,36 @@ public class GenObject
|
|||||||
int maxZ = 0;
|
int maxZ = 0;
|
||||||
boolean added = false;
|
boolean added = false;
|
||||||
|
|
||||||
for(BlockVector i : getSchematic().k())
|
for(SBlockVector i : getSchematic().keySet())
|
||||||
{
|
{
|
||||||
if(i.getBlockX() > maxX)
|
if(i.getX() > maxX)
|
||||||
{
|
{
|
||||||
maxX = i.getBlockX();
|
maxX = (int) i.getX();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i.getBlockY() > maxY)
|
if(i.getY() > maxY)
|
||||||
{
|
{
|
||||||
maxY = i.getBlockY();
|
maxY = (int) i.getY();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i.getBlockZ() > maxZ)
|
if(i.getZ() > maxZ)
|
||||||
{
|
{
|
||||||
maxZ = i.getBlockZ();
|
maxZ = (int) i.getZ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i.getBlockX() < minX)
|
if(i.getX() < minX)
|
||||||
{
|
{
|
||||||
minX = i.getBlockX();
|
minX = (int) i.getX();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i.getBlockY() < minY)
|
if(i.getY() < minY)
|
||||||
{
|
{
|
||||||
minY = i.getBlockY();
|
minY = (int) i.getY();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i.getBlockZ() < minZ)
|
if(i.getZ() < minZ)
|
||||||
{
|
{
|
||||||
minZ = i.getBlockZ();
|
minZ = (int) i.getZ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,18 +435,18 @@ public class GenObject
|
|||||||
{
|
{
|
||||||
for(int j = minZ; j <= maxZ; j++)
|
for(int j = minZ; j <= maxZ; j++)
|
||||||
{
|
{
|
||||||
BlockVector highest = null;
|
SBlockVector highest = null;
|
||||||
|
|
||||||
for(BlockVector k : getSchematic().k())
|
for(SBlockVector k : getSchematic().keySet())
|
||||||
{
|
{
|
||||||
if(k.getBlockX() == i && k.getBlockZ() == j)
|
if(k.getX() == i && k.getZ() == j)
|
||||||
{
|
{
|
||||||
if(highest == null)
|
if(highest == null)
|
||||||
{
|
{
|
||||||
highest = k;
|
highest = k;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(highest.getBlockY() < k.getBlockY())
|
else if(highest.getY() < k.getY())
|
||||||
{
|
{
|
||||||
highest = k;
|
highest = k;
|
||||||
}
|
}
|
||||||
@ -451,9 +455,9 @@ public class GenObject
|
|||||||
|
|
||||||
if(highest != null)
|
if(highest != null)
|
||||||
{
|
{
|
||||||
BlockVector mbv = highest.clone().add(new Vector(0, 1, 0)).toBlockVector();
|
BlockVector mbv = highest.toBlockVector().add(new Vector(0, 1, 0)).toBlockVector();
|
||||||
added = true;
|
added = true;
|
||||||
getSchematic().put(mbv, MB.of(Material.SNOW, RNG.r.nextInt((int) M.clip(factor, 0, 8))));
|
getSchematic().put(new SBlockVector(mbv), MB.of(Material.SNOW, RNG.r.nextInt((int) M.clip(factor, 0, 8))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,11 @@ public class GenObjectDecorator extends BlockPopulator
|
|||||||
@Override
|
@Override
|
||||||
public void populate(World world, Random rnotusingyou, Chunk source)
|
public void populate(World world, Random rnotusingyou, Chunk source)
|
||||||
{
|
{
|
||||||
|
if(g.isDisposed())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ex.execute(() -> {
|
ex.execute(() -> {
|
||||||
Random random = new Random(((source.getX() - 32) * (source.getZ() + 54)) + world.getSeed());
|
Random random = new Random(((source.getX() - 32) * (source.getZ() + 54)) + world.getSeed());
|
||||||
GSet<IrisBiome> hits = new GSet<>();
|
GSet<IrisBiome> hits = new GSet<>();
|
||||||
|
@ -195,42 +195,29 @@ public class GenObjectGroup
|
|||||||
|
|
||||||
public void processVariants()
|
public void processVariants()
|
||||||
{
|
{
|
||||||
TaskExecutor te = new TaskExecutor(Runtime.getRuntime().availableProcessors(), Thread.MAX_PRIORITY, "Variant Processor");
|
|
||||||
TaskGroup g = te.startWork();
|
|
||||||
GList<GenObject> inject = new GList<>();
|
GList<GenObject> inject = new GList<>();
|
||||||
for(GenObject i : getSchematics())
|
for(GenObject i : getSchematics())
|
||||||
{
|
{
|
||||||
for(Direction j : new Direction[] {Direction.S, Direction.E, Direction.W})
|
for(Direction j : new Direction[] {Direction.S, Direction.E, Direction.W})
|
||||||
{
|
{
|
||||||
g.queue(() ->
|
GenObject cp = i.copy();
|
||||||
{
|
GenObject f = cp;
|
||||||
GenObject cp = i.copy();
|
f.rotate(Direction.N, j);
|
||||||
GenObject f = cp;
|
inject.add(f);
|
||||||
f.rotate(Direction.N, j);
|
|
||||||
inject.add(f);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g.execute();
|
|
||||||
getSchematics().add(inject);
|
getSchematics().add(inject);
|
||||||
g = te.startWork();
|
|
||||||
for(GenObject i : getSchematics())
|
for(GenObject i : getSchematics())
|
||||||
{
|
{
|
||||||
g.queue(() ->
|
i.recalculateMountShift();
|
||||||
|
|
||||||
|
for(String j : flags)
|
||||||
{
|
{
|
||||||
i.recalculateMountShift();
|
i.computeFlag(j);
|
||||||
|
}
|
||||||
for(String j : flags)
|
|
||||||
{
|
|
||||||
i.computeFlag(j);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g.execute();
|
|
||||||
te.close();
|
|
||||||
|
|
||||||
L.i(ChatColor.LIGHT_PURPLE + "Processed " + ChatColor.WHITE + F.f(schematics.size()) + ChatColor.LIGHT_PURPLE + " Schematics in " + ChatColor.WHITE + name);
|
L.i(ChatColor.LIGHT_PURPLE + "Processed " + ChatColor.WHITE + F.f(schematics.size()) + ChatColor.LIGHT_PURPLE + " Schematics in " + ChatColor.WHITE + name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -175,4 +175,9 @@ public class GenLayerBiome extends GenLayer
|
|||||||
{
|
{
|
||||||
return regions.get(name);
|
return regions.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void compileInfo(BiomeLayer l)
|
||||||
|
{
|
||||||
|
l.compileChildren(0.082 * Iris.settings.gen.biomeScale * 0.189, 1, factory, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,21 +67,14 @@ public class IrisDimension
|
|||||||
private GList<IrisBiome> biomesFromArray(JSONArray a) throws JSONException, IOException
|
private GList<IrisBiome> biomesFromArray(JSONArray a) throws JSONException, IOException
|
||||||
{
|
{
|
||||||
GList<IrisBiome> b = new GList<>();
|
GList<IrisBiome> b = new GList<>();
|
||||||
TaskExecutor t = new TaskExecutor(Runtime.getRuntime().availableProcessors() * 2, Thread.MIN_PRIORITY, "Biome Loader");
|
|
||||||
TaskGroup g = t.startWork();
|
|
||||||
for(int i = 0; i < a.length(); i++)
|
for(int i = 0; i < a.length(); i++)
|
||||||
{
|
{
|
||||||
int ii = i;
|
int ii = i;
|
||||||
|
|
||||||
g.queue(() ->
|
IrisBiome bb = Iris.getController(PackController.class).loadBiome(a.getString(ii));
|
||||||
{
|
Iris.getController(PackController.class).registerBiome(a.getString(ii), bb);
|
||||||
IrisBiome bb = Iris.getController(PackController.class).loadBiome(a.getString(ii));
|
b.add(bb);
|
||||||
Iris.getController(PackController.class).registerBiome(a.getString(ii), bb);
|
|
||||||
b.add(bb);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
g.execute();
|
|
||||||
t.close();
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public class BiomeLayer
|
|||||||
this.children = new GList<>();
|
this.children = new GList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void compile(double scale, int octaves, Function<CNG, CNG> factory)
|
public void compileChildren(double scale, int octaves, Function<CNG, CNG> factory, boolean inf)
|
||||||
{
|
{
|
||||||
if(gen != null)
|
if(gen != null)
|
||||||
{
|
{
|
||||||
@ -61,7 +61,7 @@ public class BiomeLayer
|
|||||||
|
|
||||||
for(BiomeLayer i : getChildren())
|
for(BiomeLayer i : getChildren())
|
||||||
{
|
{
|
||||||
i.compile(scale, octaves, factory);
|
i.compileChildren(scale, octaves, factory, inf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,6 +160,11 @@ public class BiomeLayer
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static BiomeLayer compile(IrisGenerator g, double scale, int octaves, Function<CNG, CNG> factory)
|
public static BiomeLayer compile(IrisGenerator g, double scale, int octaves, Function<CNG, CNG> factory)
|
||||||
|
{
|
||||||
|
return compile(g, scale, octaves, factory, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BiomeLayer compile(IrisGenerator g, double scale, int octaves, Function<CNG, CNG> factory, boolean inf)
|
||||||
{
|
{
|
||||||
GMap<String, BiomeLayer> components = new GMap<>();
|
GMap<String, BiomeLayer> components = new GMap<>();
|
||||||
|
|
||||||
@ -204,7 +209,7 @@ public class BiomeLayer
|
|||||||
master.addLayer(components.get(i));
|
master.addLayer(components.get(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
master.compile(scale, octaves, factory);
|
master.compileChildren(scale, octaves, factory, inf);
|
||||||
|
|
||||||
return master;
|
return master;
|
||||||
}
|
}
|
||||||
|
170
src/main/java/ninja/bytecode/iris/util/SBlockVector.java
Normal file
170
src/main/java/ninja/bytecode/iris/util/SBlockVector.java
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
package ninja.bytecode.iris.util;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import org.bukkit.configuration.serialization.SerializableAs;
|
||||||
|
import org.bukkit.util.BlockVector;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A vector with a hash function that floors the X, Y, Z components, a la
|
||||||
|
* BlockVector in WorldEdit. BlockVectors can be used in hash sets and hash
|
||||||
|
* maps. Be aware that BlockVectors are mutable, but it is important that
|
||||||
|
* BlockVectors are never changed once put into a hash set or hash map.
|
||||||
|
*/
|
||||||
|
@SerializableAs("BlockVector")
|
||||||
|
public class SBlockVector
|
||||||
|
{
|
||||||
|
private short x;
|
||||||
|
private short y;
|
||||||
|
private short z;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the vector with all components as 0.
|
||||||
|
*/
|
||||||
|
public SBlockVector()
|
||||||
|
{
|
||||||
|
this.x = 0;
|
||||||
|
this.y = 0;
|
||||||
|
this.z = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the vector with another vector.
|
||||||
|
*
|
||||||
|
* @param vec
|
||||||
|
* The other vector.
|
||||||
|
*/
|
||||||
|
public SBlockVector(Vector vec)
|
||||||
|
{
|
||||||
|
this.x = (short) vec.getX();
|
||||||
|
this.y = (short) vec.getY();
|
||||||
|
this.z = (short) vec.getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the vector with provided integer components.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* X component
|
||||||
|
* @param y
|
||||||
|
* Y component
|
||||||
|
* @param z
|
||||||
|
* Z component
|
||||||
|
*/
|
||||||
|
public SBlockVector(int x, int y, int z)
|
||||||
|
{
|
||||||
|
this.x = (short) x;
|
||||||
|
this.y = (short) y;
|
||||||
|
this.z = (short) z;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the vector with provided double components.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* X component
|
||||||
|
* @param y
|
||||||
|
* Y component
|
||||||
|
* @param z
|
||||||
|
* Z component
|
||||||
|
*/
|
||||||
|
public SBlockVector(double x, double y, double z)
|
||||||
|
{
|
||||||
|
this.x = (short) x;
|
||||||
|
this.y = (short) y;
|
||||||
|
this.z = (short) z;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the vector with provided float components.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* X component
|
||||||
|
* @param y
|
||||||
|
* Y component
|
||||||
|
* @param z
|
||||||
|
* Z component
|
||||||
|
*/
|
||||||
|
public SBlockVector(float x, float y, float z)
|
||||||
|
{
|
||||||
|
this.x = (short) x;
|
||||||
|
this.y = (short) y;
|
||||||
|
this.z = (short) z;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a new block vector.
|
||||||
|
*
|
||||||
|
* @return vector
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public SBlockVector clone()
|
||||||
|
{
|
||||||
|
return new SBlockVector(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getX()
|
||||||
|
{
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setX(double x)
|
||||||
|
{
|
||||||
|
this.x = (short) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getY()
|
||||||
|
{
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setY(double y)
|
||||||
|
{
|
||||||
|
this.y = (short) y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getZ()
|
||||||
|
{
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setZ(double z)
|
||||||
|
{
|
||||||
|
this.z = (short) z;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + x;
|
||||||
|
result = prime * result + y;
|
||||||
|
result = prime * result + z;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if(this == obj)
|
||||||
|
return true;
|
||||||
|
if(obj == null)
|
||||||
|
return false;
|
||||||
|
if(getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
SBlockVector other = (SBlockVector) obj;
|
||||||
|
if(x != other.x)
|
||||||
|
return false;
|
||||||
|
if(y != other.y)
|
||||||
|
return false;
|
||||||
|
if(z != other.z)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockVector toBlockVector()
|
||||||
|
{
|
||||||
|
return new BlockVector(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user