Iris doesnt need worlds anymore

This commit is contained in:
Daniel Mills 2020-09-06 03:19:01 -04:00
parent 035f2a0236
commit 036dc289d5
41 changed files with 2640 additions and 413 deletions

19
pom.xml
View File

@ -161,12 +161,31 @@
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- NMS -->
<dependency>
<groupId>org.bukkit.craftbukkit</groupId>
<artifactId>cb-1.16.2</artifactId>
<version>1.16.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bukkit.craftbukkit</groupId>
<artifactId>cb-1.16.1</artifactId>
<version>1.16.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bukkit.craftbukkit</groupId>
<artifactId>cb-1.15.1</artifactId>
<version>1.15.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bukkit.craftbukkit</groupId>
<artifactId>cb-1.14.4</artifactId>
<version>1.14.4</version>
<scope>provided</scope>
</dependency>
<!-- Utilities -->
<dependency>
<groupId>org.bstats</groupId>

View File

@ -4,15 +4,14 @@ import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
import org.bukkit.event.HandlerList;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin;
@ -27,6 +26,9 @@ import com.volmit.iris.gen.post.PostPotholeFiller;
import com.volmit.iris.gen.post.PostSlabber;
import com.volmit.iris.gen.post.PostWallPatcher;
import com.volmit.iris.gen.post.PostWaterlogger;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.link.MultiverseCoreLink;
import com.volmit.iris.util.C;
import com.volmit.iris.util.Form;
@ -37,7 +39,6 @@ import com.volmit.iris.util.IrisPostBlockFilter;
import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.MortarPlugin;
import com.volmit.iris.util.NMSVersion;
import com.volmit.iris.util.Permission;
public class Iris extends MortarPlugin
@ -86,6 +87,16 @@ public class Iris extends MortarPlugin
return "UNKNOWN NMS VERSION";
}
public ProvisionBukkit createProvisionBukkit(IrisGenConfiguration config)
{
return new ProvisionBukkit(createIrisProvider(config));
}
public IrisChunkGenerator createIrisProvider(IrisGenConfiguration config)
{
return new IrisChunkGenerator(config);
}
private static boolean doesSupport3DBiomes()
{
int v = Integer.valueOf(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]);
@ -160,9 +171,9 @@ public class Iris extends MortarPlugin
for(World i : Bukkit.getWorlds())
{
if(i.getGenerator() instanceof IrisChunkGenerator)
if(i.getGenerator() instanceof ProvisionBukkit)
{
((IrisChunkGenerator) i.getGenerator()).close();
((IrisChunkGenerator) ((ProvisionBukkit) i.getGenerator()).getProvider()).close();
}
}
@ -208,7 +219,18 @@ public class Iris extends MortarPlugin
@Override
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
{
return new IrisChunkGenerator(IrisSettings.get().threads);
//@builder
return createProvisionBukkit(IrisGenConfiguration.builder()
.threads(IrisSettings.get().threads)
.target(TerrainTarget
.builder()
.environment(Environment.NORMAL)
.folder(new File(worldName))
.name(worldName)
.seed(worldName.hashCode())
.build()
).build());
//@done
}
public static void msg(String string)

View File

@ -9,6 +9,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.BoardManager;
@ -54,7 +55,7 @@ public class IrisBoardManager implements BoardProvider, Listener
@DontObfuscate
private boolean isIrisWorld(World w)
{
return (w.getGenerator() instanceof IrisChunkGenerator) && ((IrisChunkGenerator) w.getGenerator()).isDev();
return (w.getGenerator() instanceof ProvisionBukkit) && ((IrisChunkGenerator) ((ProvisionBukkit) w.getGenerator()).getProvider()).isDev();
}
public void updatePlayer(Player p)
@ -88,7 +89,7 @@ public class IrisBoardManager implements BoardProvider, Listener
return v;
}
IrisChunkGenerator g = (IrisChunkGenerator) player.getWorld().getGenerator();
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) player.getWorld().getGenerator()).getProvider();
if(cl.flip())
{

View File

@ -1,7 +1,6 @@
package com.volmit.iris;
import org.bukkit.World;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisRegion;
@ -9,18 +8,20 @@ import com.volmit.iris.util.KMap;
public interface IrisContext
{
static KMap<World, IrisContext> contexts = new KMap<>();
static KMap<TerrainTarget, IrisContext> contexts = new KMap<>();
public static void pushContext(IrisContext context)
{
contexts.put(context.getWorld(), context);
contexts.put(context.getTarget(), context);
}
public static IrisContext of(World world)
public static IrisContext of(TerrainTarget world)
{
return contexts.get(world);
}
public TerrainTarget getTarget();
public IrisBiome getBiome(int x, int z);
public IrisDimension getDimension();
@ -31,7 +32,5 @@ public interface IrisContext
public int getHeight(int x, int z);
public World getWorld();
public void onHotloaded();
}

View File

@ -27,7 +27,11 @@ import org.zeroturnaround.zip.commons.FileUtils;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.nms.NMSCreator;
import com.volmit.iris.gen.post.Post;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.DecorationPart;
import com.volmit.iris.object.Envelope;
import com.volmit.iris.object.InterpolationMethod;
@ -316,7 +320,11 @@ public class ProjectManager
Iris.globaldata.dump();
sender.sendMessage("Loading " + dimm + "...");
IrisChunkGenerator gx = new IrisChunkGenerator(dimm, IrisSettings.get().threads);
String wfp = "iris/" + UUID.randomUUID();
ProvisionBukkit gen = Iris.instance.createProvisionBukkit(IrisGenConfiguration.builder().threads(IrisSettings.get().threads).dimension(dimm).target(TerrainTarget.builder().environment(d.getEnvironment()).folder(new File(wfp)).name(wfp).seed(1337).build()).build());
//@done
IrisChunkGenerator gx = (IrisChunkGenerator) gen.getProvider();
currentProject = gx;
gx.setDev(true);
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
@ -365,13 +373,14 @@ public class ProjectManager
});
//@builder
World world = Bukkit.createWorld(new WorldCreator("iris/" + UUID.randomUUID())
World world = NMSCreator.createWorld(new WorldCreator(wfp)
.seed(1337)
.generator(gx)
.generator(gen)
.generateStructures(d.isVanillaStructures())
.type(WorldType.NORMAL)
.environment(d.getEnvironment()));
.environment(d.getEnvironment()), false);
//@done
gx.getTarget().setRealWorld(world);
Iris.linkMultiverseCore.removeFromConfig(world);
done.set(true);
@ -400,9 +409,9 @@ public class ProjectManager
if(isProjectOpen())
{
currentProject.close();
File folder = currentProject.getWorld().getWorldFolder();
Iris.linkMultiverseCore.removeFromConfig(currentProject.getWorld());
Bukkit.unloadWorld(currentProject.getWorld(), false);
File folder = currentProject.getTarget().getFolder();
Iris.linkMultiverseCore.removeFromConfig(currentProject.getTarget().getName());
Bukkit.unloadWorld(currentProject.getTarget().getName(), false);
currentProject = null;
Iris.globaldata.dump();
Iris.globaldata.preferFolder(null);

View File

@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@ -26,13 +27,13 @@ public class CommandIrisCTC extends MortarCommand
Player p = sender.player();
World world = p.getWorld();
if(!(world.getGenerator() instanceof IrisChunkGenerator))
if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
int m = Math.min(Math.max(Integer.valueOf(args[0]), 2), 256);
g.changeThreadCount(m);
sender.sendMessage("Thread count changed to " + m);

View File

@ -14,6 +14,10 @@ import com.volmit.iris.Iris;
import com.volmit.iris.IrisDataManager;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.nms.NMSCreator;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.IO;
@ -138,7 +142,20 @@ public class CommandIrisCreate extends MortarCommand
}
sender.sendMessage(worldName + " type installed. Generating Spawn Area...");
IrisChunkGenerator gen = new IrisChunkGenerator("", 16);
//@builder
ProvisionBukkit gen = Iris.instance.createProvisionBukkit(
IrisGenConfiguration.builder()
.threads(IrisSettings.get().threads)
.dimension(dim.getLoadKey())
.target(TerrainTarget
.builder()
.environment(dim.getEnvironment())
.folder(folder)
.name(worldName)
.seed(seed)
.build()
).build());
//@done
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
O<Boolean> done = new O<Boolean>();
@ -151,7 +168,7 @@ public class CommandIrisCreate extends MortarCommand
while(!done.get())
{
boolean derp = false;
double v = (double) gen.getGenerated() / (double) req;
double v = (double) ((IrisChunkGenerator) gen.getProvider()).getGenerated() / (double) req;
if(last > v || v > 1)
{
@ -169,7 +186,10 @@ public class CommandIrisCreate extends MortarCommand
}
});
World world = Bukkit.createWorld(new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment()));
WorldCreator wc = new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment());
World world = NMSCreator.createWorld(wc, false);
done.set(true);
sender.sendMessage(worldName + " Spawn Area generated.");

View File

@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisMetrics;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.util.C;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.MortarCommand;
@ -28,7 +29,13 @@ public class CommandIrisMetrics extends MortarCommand
{
Player p = sender.player();
World world = p.getWorld();
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
IrisMetrics m = g.getMetrics();
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));

View File

@ -40,7 +40,7 @@ public class CommandIrisStudioClose extends MortarCommand
for(World i : Bukkit.getWorlds())
{
if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getWorld().getWorldFolder().getAbsolutePath()))
if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getTarget().getFolder().getAbsolutePath()))
{
continue;
}
@ -51,7 +51,7 @@ public class CommandIrisStudioClose extends MortarCommand
if(f == null)
{
for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
{
i.kickPlayer("Project Closing, No other world to put you in. Rejoin Please!");
}
@ -59,7 +59,7 @@ public class CommandIrisStudioClose extends MortarCommand
else
{
for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
{
i.teleport(f.getSpawnLocation());
}

View File

@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@ -42,13 +43,13 @@ public class CommandIrisStudioGoto extends MortarCommand
Player p = sender.player();
World world = p.getWorld();
if(!(world.getGenerator() instanceof IrisChunkGenerator))
if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
int tries = 10000;
boolean cave = false;
IrisBiome biome2 = null;

View File

@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@ -32,14 +33,13 @@ public class CommandIrisStudioHotload extends MortarCommand
{
Player p = sender.player();
World world = p.getWorld();
if(!(world.getGenerator() instanceof IrisChunkGenerator))
if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
g.onHotload();
sender.sendMessage("Hotloaded!");
return true;

View File

@ -1,14 +1,7 @@
package com.volmit.iris.command;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisMetrics;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.util.C;
import com.volmit.iris.util.Command;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@ -32,26 +25,7 @@ public class CommandIrisWhat extends MortarCommand
@Override
public boolean handle(MortarSender sender, String[] args)
{
if(sender.isPlayer())
{
Player p = (Player) sender;
World world = p.getWorld();
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
IrisMetrics m = g.getMetrics();
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));
sender.sendMessage(" Terrain : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTerrain().getAverage(), 2));
sender.sendMessage(" Parallax: " + C.BOLD + "" + C.WHITE + Form.duration(m.getParallax().getAverage(), 2));
sender.sendMessage(" Post : " + C.BOLD + "" + C.WHITE + Form.duration(m.getPost().getAverage(), 2));
return true;
}
else
{
sender.sendMessage("Players only.");
}
printHelp(sender);
return true;
}

View File

@ -1,13 +1,10 @@
package com.volmit.iris.gen;
import java.util.List;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -23,8 +20,6 @@ import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.event.world.WorldUnloadEvent;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisContext;
@ -32,6 +27,9 @@ import com.volmit.iris.IrisDataManager;
import com.volmit.iris.IrisMetrics;
import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.gen.atomics.AtomicMulticache;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainProvider;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
@ -53,7 +51,7 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public abstract class ContextualChunkGenerator extends ChunkGenerator implements Listener
public abstract class ContextualChunkGenerator implements TerrainProvider, Listener
{
private KList<BlockPosition> noLoot;
private BlockPosition allowLoot;
@ -69,16 +67,17 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
private ChronoLatch pushLatch;
private AtomicCache<IrisDimension> dimCache;
private IrisMetrics metrics;
private World world;
private int generated;
private int ticks;
private long hlast;
private boolean fastPregen = false;
private boolean pregenDone;
private volatile boolean hotloadable = false;
private final TerrainTarget target;
public ContextualChunkGenerator()
public ContextualChunkGenerator(TerrainTarget target)
{
this.target = target;
pushLatch = new ChronoLatch(3000);
tickLatch = new ChronoLatch(650);
perSecond = new ChronoLatch(1000);
@ -97,9 +96,9 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
noLoot = new KList<>(1285);
}
protected abstract void onGenerate(RNG masterRandom, int x, int z, ChunkData data, BiomeGrid grid);
protected abstract void onGenerate(RNG masterRandom, int x, int z, TerrainChunk chunk);
protected abstract void onInit(World world, RNG masterRandom);
protected abstract void onInit(RNG masterRandom);
protected abstract void onTick(int ticks);
@ -150,21 +149,20 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
return isDev() ? Iris.globaldata : data;
}
private void init(World world, RNG rng)
private void init(RNG rng)
{
if(initialized)
{
return;
}
this.world = world;
setData(new IrisDataManager(getWorld().getWorldFolder()));
setMasterRandom(new RNG(world.getSeed()));
setData(new IrisDataManager(getTarget().getFolder()));
setMasterRandom(new RNG(getTarget().getSeed()));
setMetrics(new IrisMetrics(128));
setInitialized(true);
setTask(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::tick, 0, 0));
Bukkit.getServer().getPluginManager().registerEvents(this, Iris.instance);
onInit(world, masterRandom);
onInit(masterRandom);
setHotloadable(true);
}
@ -185,7 +183,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
setGenerated(0);
}
checkHotload();
doCheckHotload();
if(getNoLoot().size() > 1024)
{
@ -217,7 +215,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockBreakEvent e)
{
if(!e.getBlock().getWorld().equals(getWorld()))
if(!getTarget().isWorld(e.getBlock().getWorld()))
{
return;
}
@ -238,7 +236,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockPlaceEvent e)
{
if(!e.getBlock().getWorld().equals(getWorld()))
if(!getTarget().isWorld(e.getBlock().getWorld()))
{
return;
}
@ -249,7 +247,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockDropItemEvent e)
{
if(!e.getBlock().getWorld().equals(getWorld()))
if(!getTarget().isWorld(e.getBlock().getWorld()))
{
return;
}
@ -269,13 +267,13 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerTeleportEvent e)
{
if(e.getFrom().getWorld().equals(world) && !e.getTo().getWorld().equals(world))
if(getTarget().isWorld(e.getFrom().getWorld()) && !getTarget().isWorld(e.getTo().getWorld()))
{
tick();
onPlayerLeft(e.getPlayer());
}
if(!e.getFrom().getWorld().equals(world) && e.getTo().getWorld().equals(world))
if(!getTarget().isWorld(e.getFrom().getWorld()) && getTarget().isWorld(e.getTo().getWorld()))
{
tick();
onPlayerJoin(e.getPlayer());
@ -285,7 +283,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerQuitEvent e)
{
if(e.getPlayer().getWorld().equals(world))
if(getTarget().isWorld(e.getPlayer().getWorld()))
{
tick();
onPlayerLeft(e.getPlayer());
@ -295,7 +293,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerJoinEvent e)
{
if(e.getPlayer().getWorld().equals(world))
if(getTarget().isWorld(e.getPlayer().getWorld()))
{
tick();
onPlayerJoin(e.getPlayer());
@ -305,7 +303,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(ChunkLoadEvent e)
{
if(e.getWorld().equals(world))
if(getTarget().isWorld(e.getWorld()))
{
tick();
onChunkLoaded(e.getChunk());
@ -315,7 +313,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(ChunkUnloadEvent e)
{
if(e.getWorld().equals(world))
if(getTarget().isWorld(e.getWorld()))
{
tick();
onChunkUnloaded(e.getChunk());
@ -325,7 +323,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(WorldUnloadEvent e)
{
if(world != null && e.getWorld().equals(world))
if(getTarget().isWorld(e.getWorld()))
{
close();
}
@ -345,16 +343,8 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
onClose();
}
@Override
public boolean canSpawn(World world, int x, int z)
protected void generateFailure(Random no, int x, int z, TerrainChunk chunk)
{
return super.canSpawn(world, x, z);
}
protected ChunkData generateChunkDataFailure(World world, Random no, int x, int z, BiomeGrid biomeGrid)
{
ChunkData c = Bukkit.createChunkData(world);
for(int i = 0; i < 16; i++)
{
for(int j = 0; j < 16; j++)
@ -363,46 +353,19 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
if(j == i || j + i == 16)
{
c.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA"));
chunk.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA"));
}
else
{
c.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA"));
chunk.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA"));
}
}
}
return c;
}
protected ChunkData generateChunkFastPregen(World world, Random no, int x, int z, BiomeGrid biomeGrid)
{
ChunkData c = Bukkit.createChunkData(world);
for(int i = 0; i < 16; i++)
{
for(int j = 0; j < 16; j++)
{
int h = 0;
if(j == i || j + i == 16)
{
c.setBlock(i, h, j, B.getBlockData("BLUE_TERRACOTTA"));
}
else
{
c.setBlock(i, h, j, B.getBlockData("WHITE_TERRACOTTA"));
}
}
}
return c;
}
@Override
public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid)
public void generate(Random no, int x, int z, TerrainChunk terrain)
{
setHotloadable(false);
if(!isDev())
@ -413,32 +376,21 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
if(failing)
{
return generateChunkDataFailure(world, no, x, z, biomeGrid);
generateFailure(no, x, z, terrain);
return;
}
try
{
RNG random = new RNG(world.getSeed());
init(world, random.nextParallelRNG(0));
ChunkData c = Bukkit.createChunkData(world);
if(!pregenDone && fastPregen)
{
c = generateChunkFastPregen(world, no, x, z, biomeGrid);
}
else
{
onGenerate(random, x, z, c, biomeGrid);
}
RNG random = new RNG(getTarget().getSeed());
init(random.nextParallelRNG(0));
onGenerate(random, x, z, terrain);
generated++;
long hits = CNG.hits;
CNG.hits = 0;
Iris.instance.hit(hits);
setHotloadable(true);
return c;
return;
}
catch(Throwable e)
@ -447,36 +399,23 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
setHotloadable(true);
return generateChunkDataFailure(world, no, x, z, biomeGrid);
generateFailure(no, x, z, terrain);
}
public void checkHotload()
{
if(M.ms() - getHlast() < 1000)
{
return;
}
if(getWorld() != null)
{
checkHotload(getWorld());
}
}
private void checkHotload(World world)
private void doCheckHotload()
{
if(!isHotloadable())
{
return;
}
if(M.ms() - getHlast() < 1000)
{
return;
}
if(getPushLatch().flip())
{
if(getWorld() == null)
{
setWorld(world);
}
Iris.hotloader.check((IrisContext) this);
if(this instanceof IrisContext)
@ -511,7 +450,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
Iris.error("ERROR! Failed to generate chunk! Iris has entered a failed state!");
Iris.error("---------------------------------------------------------------------------------------------------------");
for(Player i : world.getPlayers())
for(Player i : getTarget().getPlayers())
{
Iris.instance.imsg(i, C.DARK_RED + "Iris Generator has crashed!");
Iris.instance.imsg(i, C.RED + "- Check the console for the error.");
@ -523,18 +462,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
onFailure(e);
}
@Override
public List<BlockPopulator> getDefaultPopulators(World world)
{
return super.getDefaultPopulators(world);
}
@Override
public Location getFixedSpawnLocation(World world, Random random)
{
return super.getFixedSpawnLocation(world, random);
}
@Override
public boolean isParallelCapable()
{

View File

@ -3,11 +3,11 @@ package com.volmit.iris.gen;
import java.io.File;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.InferredType;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
@ -28,27 +28,14 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
protected static final BlockData BEDROCK = Material.BEDROCK.createBlockData();
protected static final BlockData WATER = Material.WATER.createBlockData();
public DimensionChunkGenerator(String dimensionName)
public DimensionChunkGenerator(TerrainTarget t, String dimensionName)
{
super();
super(t);
setDimensionName(dimensionName);
}
public void onPlayerLeft(Player p)
{
}
public void onTick(int m)
{
}
public void onInit(World world, RNG masterRandom)
{
if(getDimensionName().isEmpty())
{
File folder = new File(world.getWorldFolder(), "iris/dimensions");
File folder = new File(getTarget().getFolder(), "iris/dimensions");
if(!folder.exists())
{
@ -71,9 +58,32 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
fail(new RuntimeException("Missing dimension folder/file in " + folder.getAbsolutePath()));
}
try
{
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
}
catch(Throwable e)
{
}
}
public void onPlayerLeft(Player p)
{
}
public void onTick(int m)
{
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
}
public void onInit(RNG masterRandom)
{
}
public IrisDimension getDimension()
{
IrisDimension d = loadDimension(getDimensionName());

View File

@ -7,7 +7,6 @@ import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockDropItemEvent;
@ -18,6 +17,9 @@ import com.volmit.iris.Iris;
import com.volmit.iris.IrisContext;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.atomics.AtomicRegionData;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.gui.Renderer;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
@ -43,19 +45,24 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
private IrisRegion hr = null;
private boolean spawnable = false;
public IrisChunkGenerator(String dimensionName, int threads)
public IrisChunkGenerator(IrisGenConfiguration config)
{
super(dimensionName, threads);
super(config.getTarget(), config.getDimension(), config.getThreads());
}
public IrisChunkGenerator(String dimensionName)
public IrisChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
super(dimensionName, 16);
super(t, dimensionName, threads);
}
public IrisChunkGenerator(int tc)
public IrisChunkGenerator(TerrainTarget t, String dimensionName)
{
super("", tc);
super(t, dimensionName, 16);
}
public IrisChunkGenerator(TerrainTarget t, int tc)
{
super(t, "", tc);
}
public void hotload()
@ -73,26 +80,25 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
}
@Override
public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid)
public void generate(Random no, int x, int z, TerrainChunk terrain)
{
PrecisionStopwatch s = PrecisionStopwatch.start();
ChunkData c = super.generateChunkData(world, no, x, z, biomeGrid);
super.generate(no, x, z, terrain);
s.end();
getMetrics().getTotal().put(s.getMilliseconds());
return c;
}
@Override
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
super.onGenerate(random, x, z, data, grid);
super.onGenerate(random, x, z, terrain);
}
public void onInit(World world, RNG rng)
public void onInit(RNG rng)
{
try
{
super.onInit(world, rng);
super.onInit(rng);
}
catch(Throwable e)
@ -124,7 +130,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
{
spawnable = true;
super.onTick(ticks);
for(Player i : getWorld().getPlayers())
for(Player i : getTarget().getPlayers())
{
Location l = i.getLocation();
IrisRegion r = sampleRegion(l.getBlockX(), l.getBlockZ());
@ -160,7 +166,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
}
setSliverCache(null);
Iris.info("Closing Iris Dimension " + getWorld().getName());
Iris.info("Closing Iris Dimension " + getTarget().getName());
}
@Override
@ -231,35 +237,6 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
return bytes / 2;
}
@Override
public boolean shouldGenerateCaves()
{
return false;
}
@Override
public boolean shouldGenerateDecorations()
{
return false;
}
@Override
public boolean shouldGenerateMobs()
{
return true;
}
@Override
public boolean shouldGenerateStructures()
{
if(!isInitialized())
{
return false;
}
return getDimension().isVanillaStructures();
}
public Renderer createRenderer()
{
return (x, z) -> render(x, z);
@ -514,4 +491,36 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
return false;
}
@Override
public boolean canSpawn(int x, int z)
{
return true;
}
@Override
public boolean shouldGenerateCaves()
{
return getDimension().isVanillaCaves();
}
@Override
public boolean shouldGenerateVanillaStructures()
{
return getDimension().isVanillaStructures();
}
@Override
public boolean shouldGenerateMobs()
{
// TODO Auto-generated method stub
return false;
}
@Override
public boolean shouldGenerateDecorations()
{
// TODO Auto-generated method stub
return false;
}
}

View File

@ -3,7 +3,6 @@ package com.volmit.iris.gen;
import java.io.IOException;
import java.util.List;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator;
@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicWorldData;
import com.volmit.iris.gen.atomics.MasterLock;
import com.volmit.iris.gen.layer.GenLayerText;
import com.volmit.iris.gen.layer.GenLayerUpdate;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBiomeMutation;
import com.volmit.iris.object.IrisObjectPlacement;
@ -49,18 +50,18 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
private GenLayerText glText;
private int sliverBuffer;
public ParallaxChunkGenerator(String dimensionName, int threads)
public ParallaxChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
super(dimensionName, threads);
super(t, dimensionName, threads);
setSliverCache(new KMap<>());
setSliverBuffer(sliverBuffer);
setMasterLock(new MasterLock());
}
public void onInit(World world, RNG rng)
public void onInit(RNG rng)
{
super.onInit(world, rng);
setParallaxMap(new AtomicWorldData(world));
super.onInit(rng);
setParallaxMap(new AtomicWorldData(getTarget()));
setGlText(new GenLayerText(this, rng.nextParallelRNG(32485)));
setGlUpdate(null);
J.a(() -> getDimension().getParallaxSize(this));
@ -158,13 +159,13 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
}
@Override
public List<BlockPopulator> getDefaultPopulators(World world)
public List<BlockPopulator> getPopulators()
{
List<BlockPopulator> g = super.getDefaultPopulators(world);
List<BlockPopulator> g = new KList<>();
if(getGlUpdate() == null)
{
setGlUpdate(new GenLayerUpdate(this, world));
setGlUpdate(new GenLayerUpdate(this));
}
g.add(getGlUpdate());
@ -172,20 +173,20 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
}
@Override
protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
if(getSliverCache().size() > 20000)
{
getSliverCache().clear();
}
super.onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
super.onPostGenerate(random, x, z, terrain, height, biomeMap, map);
PrecisionStopwatch p = PrecisionStopwatch.start();
if(getDimension().isPlaceObjects())
{
onGenerateParallax(random, x, z);
getParallaxChunk(x, z).inject(data);
getParallaxChunk(x, z).inject(terrain);
getParallaxChunk(x, z).injectUpdates(map);
getParallaxChunk(x, z).setWorldGenerated(true);
}
@ -194,7 +195,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
getMasterLock().clear();
p.end();
getMetrics().getParallax().put(p.getMilliseconds());
super.onPostParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);
super.onPostParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map);
getParallaxMap().clean(getTicks());
getData().getObjectLoader().clean();
}

View File

@ -1,10 +1,10 @@
package com.volmit.iris.gen;
import org.bukkit.World;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.atomics.AtomicSliver;
import com.volmit.iris.gen.atomics.AtomicSliverMap;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.BiomeMap;
import com.volmit.iris.util.GroupedExecutor;
import com.volmit.iris.util.HeightMap;
@ -22,9 +22,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
private int threads;
private boolean cachingAllowed;
public ParallelChunkGenerator(String dimensionName, int threads)
public ParallelChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
super(dimensionName);
super(t, dimensionName);
setThreads(threads);
setCachingAllowed(false);
}
@ -33,7 +33,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
{
setThreads(tc);
GroupedExecutor e = getAccelerant();
setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getWorld().getName()));
setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getTarget().getName()));
;
Iris.executors.add(getAccelerant());
@ -54,16 +54,16 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
protected abstract int onSampleColumnHeight(int cx, int cz, int wx, int wz, int x, int z);
protected abstract void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
protected abstract void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
protected abstract void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
protected abstract void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
protected int sampleHeight(int x, int z)
{
return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15);
}
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
getCache().targetChunk(x, z);
PrecisionStopwatch p = PrecisionStopwatch.start();
@ -73,7 +73,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
BiomeMap biomeMap = new BiomeMap();
int ii, jj;
onPreGenerate(random, x, z, data, grid, height, biomeMap, map);
onPreGenerate(random, x, z, terrain, height, biomeMap, map);
for(ii = 0; ii < 16; ii++)
{
@ -101,10 +101,10 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
}
accelerant.waitFor(key);
map.write(data, grid, height);
map.write(terrain, terrain, height);
getMetrics().getTerrain().put(p.getMilliseconds());
p = PrecisionStopwatch.start();
onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
onPostGenerate(random, x, z, terrain, height, biomeMap, map);
}
protected void onClose()
@ -113,9 +113,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
Iris.executors.remove(accelerant);
}
public void onInit(World world, RNG rng)
public void onInit(RNG rng)
{
super.onInit(world, rng);
super.onInit(rng);
changeThreadCount(getThreads());
}

View File

@ -1,7 +1,7 @@
package com.volmit.iris.gen;
import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.post.PostFloatingNibDeleter;
@ -11,6 +11,8 @@ import com.volmit.iris.gen.post.PostPotholeFiller;
import com.volmit.iris.gen.post.PostSlabber;
import com.volmit.iris.gen.post.PostWallPatcher;
import com.volmit.iris.gen.post.PostWaterlogger;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.CaveResult;
import com.volmit.iris.util.IPostBlockAccess;
import com.volmit.iris.util.IrisLock;
@ -31,22 +33,22 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
private int minPhase;
private int maxPhase;
public PostBlockChunkGenerator(String dimensionName, int threads)
public PostBlockChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
super(dimensionName, threads);
super(t, dimensionName, threads);
setPostKey("post-" + dimensionName);
setPostLock(new IrisLock("PostChunkGenerator"));
}
public void onInit(World world, RNG rng)
public void onInit(RNG rng)
{
super.onInit(world, rng);
super.onInit(rng);
}
@Override
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
super.onGenerate(random, x, z, data, grid);
super.onGenerate(random, x, z, terrain);
if(!getDimension().isPostProcessing())
{
@ -76,7 +78,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
{
if(f.getPhase() == hh)
{
f.onPost(rxx, rzz, x, z, data);
f.onPost(rxx, rzz, x, z, terrain);
}
}
});

View File

@ -1,7 +1,6 @@
package com.volmit.iris.gen;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.Bisected.Half;
@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicSliverMap;
import com.volmit.iris.gen.layer.GenLayerBiome;
import com.volmit.iris.gen.layer.GenLayerCarve;
import com.volmit.iris.gen.layer.GenLayerCave;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.DecorationPart;
import com.volmit.iris.object.InferredType;
@ -53,17 +54,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
private CNG masterFracture;
private ChronoLatch cwarn = new ChronoLatch(1000);
public TerrainChunkGenerator(String dimensionName, int threads)
public TerrainChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
super(dimensionName, threads);
super(t, dimensionName, threads);
setGenerators(new KMap<>());
setRegionLock(new IrisLock("BiomeChunkGenerator"));
}
@Override
public void onInit(World world, RNG rng)
public void onInit(RNG rng)
{
super.onInit(world, rng);
super.onInit(rng);
loadGenerators();
buildGenLayers(getMasterRandom());
}
@ -113,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
@Override
protected void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
protected void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
}
@ -336,23 +337,23 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
@Override
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
super.onGenerate(random, x, z, data, grid);
super.onGenerate(random, x, z, terrain);
RNG ro = random.nextParallelRNG((x * x * x) - z);
IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);
for(IrisDepositGenerator k : getDimension().getDeposits())
{
k.generate(data, ro, this, x, z);
k.generate(terrain, ro, this, x, z);
}
for(IrisDepositGenerator k : region.getDeposits())
{
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
{
k.generate(data, ro, this, x, z);
k.generate(terrain, ro, this, x, z);
}
}
@ -360,7 +361,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
{
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
{
k.generate(data, ro, this, x, z);
k.generate(terrain, ro, this, x, z);
}
}
}
@ -546,17 +547,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
@Override
protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
onPreParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);
onPreParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map);
}
protected void onPreParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
protected void onPreParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
}
protected void onPostParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
protected void onPostParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
}
@ -815,7 +816,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
return 0;
});
return M.lerp(lo, hi, gen.getHeight(rx, rz, getWorld().getSeed() + 239945));
return M.lerp(lo, hi, gen.getHeight(rx, rz, getTarget().getSeed() + 239945));
}
protected void loadGenerators()

View File

@ -7,10 +7,9 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import org.bukkit.World;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.ByteArrayTag;
import com.volmit.iris.util.CompoundTag;
import com.volmit.iris.util.CustomOutputStream;
@ -21,10 +20,10 @@ import com.volmit.iris.util.Tag;
public class AtomicRegionData
{
private final World world;
private final TerrainTarget world;
private Tag[] tag;
public AtomicRegionData(World world)
public AtomicRegionData(TerrainTarget world)
{
this.world = world;
tag = new Tag[1024];
@ -148,7 +147,7 @@ public class AtomicRegionData
return data;
}
public World getWorld()
public TerrainTarget getWorld()
{
return world;
}

View File

@ -5,9 +5,8 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.bukkit.World;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KMap;
@ -15,7 +14,7 @@ import com.volmit.iris.util.M;
public class AtomicWorldData
{
private World world;
private TerrainTarget world;
private KMap<ChunkPosition, AtomicSliverMap> loadedChunks;
private KMap<ChunkPosition, AtomicRegionData> loadedSections;
private KMap<ChunkPosition, Long> lastRegion;
@ -24,7 +23,7 @@ public class AtomicWorldData
private KList<ChunkPosition> unloadChunks;
private long last = M.ms();
public AtomicWorldData(World world)
public AtomicWorldData(TerrainTarget world)
{
this.world = world;
loadedSections = new KMap<>();
@ -254,7 +253,7 @@ public class AtomicWorldData
public File getSubregionFolder()
{
return new File(world.getWorldFolder(), "region-parallax");
return new File(world.getFolder(), "parallax");
}
public KMap<ChunkPosition, AtomicSliverMap> getLoadedChunks()

View File

@ -32,10 +32,10 @@ public class GenLayerUpdate extends BlockPopulator
private ParallaxChunkGenerator gen;
private RNG rng;
public GenLayerUpdate(ParallaxChunkGenerator gen, World w)
public GenLayerUpdate(ParallaxChunkGenerator gen)
{
this.gen = gen;
this.rng = new RNG(w.getSeed() + 4996788).nextParallelRNG(-98618289);
this.rng = new RNG(gen.getTarget().getSeed() + 4996788).nextParallelRNG(-98618289);
}
@Override

View File

@ -0,0 +1,48 @@
package com.volmit.iris.gen.nms;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import com.volmit.iris.Iris;
public class NMSCreator
{
public static World createWorld(WorldCreator creator)
{
return createWorld(creator, true);
}
public static World createWorld(WorldCreator creator, boolean loadSpawn)
{
try
{
String code = Iris.nmsTag();
if(code.equals("v1_16_R2"))
{
return NMSCreator162.createWorld(creator, loadSpawn);
}
else if(code.equals("v1_16_R1"))
{
return NMSCreator161.createWorld(creator, loadSpawn);
}
else if(code.equals("v1_15_R1"))
{
return NMSCreator151.createWorld(creator, loadSpawn);
}
else if(code.equals("v1_14_R1"))
{
return NMSCreator141.createWorld(creator, loadSpawn);
}
}
catch(Throwable e)
{
e.printStackTrace();
Iris.warn("Failed to load NMS Spawn for MC:" + Iris.nmsTag() + ". Using Bukkit...");
}
return Bukkit.createWorld(creator);
}
}

View File

@ -0,0 +1,134 @@
package com.volmit.iris.gen.nms;
import java.io.File;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.craftbukkit.v1_14_R1.CraftServer;
import org.bukkit.event.Event;
import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.generator.ChunkGenerator;
import com.google.common.base.Preconditions;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.volmit.iris.util.V;
import net.minecraft.server.v1_14_R1.DedicatedServer;
import net.minecraft.server.v1_14_R1.DimensionManager;
import net.minecraft.server.v1_14_R1.EnumDifficulty;
import net.minecraft.server.v1_14_R1.EnumGamemode;
import net.minecraft.server.v1_14_R1.GameProfilerFiller;
import net.minecraft.server.v1_14_R1.MinecraftServer;
import net.minecraft.server.v1_14_R1.WorldData;
import net.minecraft.server.v1_14_R1.WorldNBTStorage;
import net.minecraft.server.v1_14_R1.WorldProvider;
import net.minecraft.server.v1_14_R1.WorldServer;
import net.minecraft.server.v1_14_R1.WorldSettings;
public class NMSCreator141
{
@SuppressWarnings({"resource", "deprecation"})
public static World createWorld(WorldCreator creator, boolean loadSpawn)
{
CraftServer server = ((CraftServer) Bukkit.getServer());
Map<String, World> worlds = new V(server).get("worlds");
DedicatedServer console = new V(server).get("console");
WorldSettings worldSettings;
Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP");
Validate.notNull((Object) creator, (String) "Creator may not be null");
String name = creator.name();
ChunkGenerator generator = creator.generator();
File folder = new File(server.getWorldContainer(), name);
World world = server.getWorld(name);
net.minecraft.server.v1_14_R1.WorldType type = net.minecraft.server.v1_14_R1.WorldType.getType((String) creator.type().getName());
boolean generateStructures = creator.generateStructures();
if(world != null)
{
return world;
}
if(folder.exists() && !folder.isDirectory())
{
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
}
if(generator == null)
{
generator = server.getGenerator(name);
}
console.convertWorld(name);
int dimension = 10 + console.worldServer.size();
boolean used = false;
block0: do
{
for(WorldServer ss : console.getWorlds())
{
@SuppressWarnings("unused")
boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
if(!used)
continue;
++dimension;
continue block0;
}
}
while(used);
boolean hardcore = false;
WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager);
WorldData worlddata = sdm.getWorldData();
if(worlddata == null)
{
worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
if(parsedSettings.isJsonObject())
{
worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject());
}
worlddata = new WorldData(worldSettings, name);
}
else
{
worlddata.setName(name);
worldSettings = new WorldSettings(worlddata);
}
DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId());
DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension));
//@builder
WorldServer internal = new WorldServer(
(MinecraftServer)console,
console.executorService,
sdm,
worlddata,
internalDimension,
(GameProfilerFiller)console.getMethodProfiler(),
server.getServer().worldLoadListenerFactory.create(11),
creator.environment(),
generator);
//@done
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
{
return null;
}
console.initWorld(internal, worlddata, worldSettings);
internal.worldData.setDifficulty(EnumDifficulty.EASY);
internal.setSpawnFlags(true, true);
console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
if(loadSpawn)
{
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
}
else
{
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
}
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
return internal.getWorld();
}
}

View File

@ -0,0 +1,134 @@
package com.volmit.iris.gen.nms;
import java.io.File;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.craftbukkit.v1_15_R1.CraftServer;
import org.bukkit.event.Event;
import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.generator.ChunkGenerator;
import com.google.common.base.Preconditions;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.volmit.iris.util.V;
import net.minecraft.server.v1_15_R1.DedicatedServer;
import net.minecraft.server.v1_15_R1.DimensionManager;
import net.minecraft.server.v1_15_R1.EnumDifficulty;
import net.minecraft.server.v1_15_R1.EnumGamemode;
import net.minecraft.server.v1_15_R1.GameProfilerFiller;
import net.minecraft.server.v1_15_R1.MinecraftServer;
import net.minecraft.server.v1_15_R1.WorldData;
import net.minecraft.server.v1_15_R1.WorldNBTStorage;
import net.minecraft.server.v1_15_R1.WorldProvider;
import net.minecraft.server.v1_15_R1.WorldServer;
import net.minecraft.server.v1_15_R1.WorldSettings;
public class NMSCreator151
{
@SuppressWarnings({"resource", "deprecation"})
public static World createWorld(WorldCreator creator, boolean loadSpawn)
{
CraftServer server = ((CraftServer) Bukkit.getServer());
Map<String, World> worlds = new V(server).get("worlds");
DedicatedServer console = new V(server).get("console");
WorldSettings worldSettings;
Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP");
Validate.notNull((Object) creator, (String) "Creator may not be null");
String name = creator.name();
ChunkGenerator generator = creator.generator();
File folder = new File(server.getWorldContainer(), name);
World world = server.getWorld(name);
net.minecraft.server.v1_15_R1.WorldType type = net.minecraft.server.v1_15_R1.WorldType.getType((String) creator.type().getName());
boolean generateStructures = creator.generateStructures();
if(world != null)
{
return world;
}
if(folder.exists() && !folder.isDirectory())
{
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
}
if(generator == null)
{
generator = server.getGenerator(name);
}
console.convertWorld(name);
int dimension = 10 + console.worldServer.size();
boolean used = false;
block0: do
{
for(WorldServer ss : console.getWorlds())
{
@SuppressWarnings("unused")
boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
if(!used)
continue;
++dimension;
continue block0;
}
}
while(used);
boolean hardcore = false;
WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager);
WorldData worlddata = sdm.getWorldData();
if(worlddata == null)
{
worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
if(parsedSettings.isJsonObject())
{
worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject());
}
worlddata = new WorldData(worldSettings, name);
}
else
{
worlddata.setName(name);
worldSettings = new WorldSettings(worlddata);
}
DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId());
DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension.getGenLayerZoomer(), actualDimension));
//@builder
WorldServer internal = new WorldServer(
(MinecraftServer)console,
console.executorService,
sdm,
worlddata,
internalDimension,
(GameProfilerFiller)console.getMethodProfiler(),
server.getServer().worldLoadListenerFactory.create(11),
creator.environment(),
generator);
//@done
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
{
return null;
}
console.initWorld(internal, worlddata, worldSettings);
internal.worldData.setDifficulty(EnumDifficulty.EASY);
internal.setSpawnFlags(true, true);
console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
if(loadSpawn)
{
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
}
else
{
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
}
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
return internal.getWorld();
}
}

View File

@ -0,0 +1,208 @@
package com.volmit.iris.gen.nms;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Random;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
import org.bukkit.event.Event;
import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.Lifecycle;
import com.volmit.iris.util.V;
import net.minecraft.server.v1_16_R1.BiomeManager;
import net.minecraft.server.v1_16_R1.Convertable;
import net.minecraft.server.v1_16_R1.DedicatedServer;
import net.minecraft.server.v1_16_R1.DimensionManager;
import net.minecraft.server.v1_16_R1.DynamicOpsNBT;
import net.minecraft.server.v1_16_R1.EnumDifficulty;
import net.minecraft.server.v1_16_R1.EnumGamemode;
import net.minecraft.server.v1_16_R1.GameRules;
import net.minecraft.server.v1_16_R1.GeneratorSettings;
import net.minecraft.server.v1_16_R1.IRegistry;
import net.minecraft.server.v1_16_R1.IWorldDataServer;
import net.minecraft.server.v1_16_R1.MinecraftKey;
import net.minecraft.server.v1_16_R1.MinecraftServer;
import net.minecraft.server.v1_16_R1.MobSpawner;
import net.minecraft.server.v1_16_R1.MobSpawnerCat;
import net.minecraft.server.v1_16_R1.MobSpawnerPatrol;
import net.minecraft.server.v1_16_R1.MobSpawnerPhantom;
import net.minecraft.server.v1_16_R1.MobSpawnerTrader;
import net.minecraft.server.v1_16_R1.NBTBase;
import net.minecraft.server.v1_16_R1.RegistryMaterials;
import net.minecraft.server.v1_16_R1.RegistryReadOps;
import net.minecraft.server.v1_16_R1.ResourceKey;
import net.minecraft.server.v1_16_R1.SaveData;
import net.minecraft.server.v1_16_R1.VillageSiege;
import net.minecraft.server.v1_16_R1.WorldDataServer;
import net.minecraft.server.v1_16_R1.WorldDimension;
import net.minecraft.server.v1_16_R1.WorldServer;
import net.minecraft.server.v1_16_R1.WorldSettings;
public class NMSCreator161
{
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
public static World createWorld(WorldCreator creator, boolean loadSpawn)
{
CraftServer server = ((CraftServer) Bukkit.getServer());
Map<String, World> worlds = new V(server).get("worlds");
DedicatedServer console = new V(server).get("console");
Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP");
Validate.notNull((Object) creator, "Creator may not be null");
final String name = creator.name();
org.bukkit.generator.ChunkGenerator generator = creator.generator();
final File folder = new File(server.getWorldContainer(), name);
final World world = server.getWorld(name);
if(world != null)
{
return world;
}
if(folder.exists() && !folder.isDirectory())
{
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
}
if(generator == null)
{
generator = server.getGenerator(name);
}
ResourceKey<WorldDimension> actualDimension = null;
switch(creator.environment())
{
case NORMAL:
{
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.OVERWORLD;
break;
}
case NETHER:
{
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_NETHER;
break;
}
case THE_END:
{
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_END;
break;
}
default:
{
throw new IllegalArgumentException("Illegal dimension");
}
}
Convertable.ConversionSession worldSession;
try
{
worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension);
}
catch(IOException ex)
{
throw new RuntimeException(ex);
}
MinecraftServer.convertWorld(worldSession);
final boolean hardcore = creator.hardcore();
final RegistryReadOps<NBTBase> registryreadops = (RegistryReadOps<NBTBase>) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
if(worlddata == null)
{
final Properties properties = new Properties();
properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
properties.put("level-seed", Objects.toString(creator.seed()));
properties.put("generate-structures", Objects.toString(creator.generateStructures()));
properties.put("level-type", Objects.toString(creator.type().getName()));
GeneratorSettings generatorsettings = GeneratorSettings.a((Properties) properties);
@SuppressWarnings("deprecation")
final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
}
worlddata.checkName(name);
worlddata.a(console.getServerModName(), console.getModded().isPresent());
final long j = BiomeManager.a(creator.seed());
final List<MobSpawner> list = (List<MobSpawner>) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata));
RegistryMaterials registrymaterials = worlddata.getGeneratorSettings().e();
final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension);
DimensionManager dimensionmanager;
net.minecraft.server.v1_16_R1.ChunkGenerator chunkgenerator;
if(worlddimension == null)
{
dimensionmanager = DimensionManager.a();
chunkgenerator = GeneratorSettings.a((long) new Random().nextLong());
}
else
{
dimensionmanager = worlddimension.b();
chunkgenerator = worlddimension.c();
}
ResourceKey typeKey = (ResourceKey) console.f.a().c(dimensionmanager).orElseThrow(() -> new IllegalStateException("Unregistered dimension type: " + (Object) dimensionmanager));
ResourceKey worldKey = ResourceKey.a((ResourceKey) IRegistry.ae, (MinecraftKey) new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
//@builder
WorldServer internal = new WorldServer(
(MinecraftServer)console,
console.executorService,
worldSession,
(IWorldDataServer)worlddata,
worldKey,
typeKey,
dimensionmanager,
server.getServer().worldLoadListenerFactory.create(11),
chunkgenerator,
worlddata.getGeneratorSettings().isDebugWorld(),
j,
(List)(creator.environment() == World.Environment.NORMAL ? list : ImmutableList.of()),
true,
creator.environment(),
generator);
//@done
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
{
try
{
internal.close();
}
catch(IOException e)
{
e.printStackTrace();
}
return null;
}
console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings());
internal.setSpawnFlags(true, true);
console.worldServer.put(internal.getDimensionKey(), internal);
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
if(loadSpawn)
{
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
}
else
{
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
}
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
return (World) internal.getWorld();
}
}

View File

@ -0,0 +1,209 @@
package com.volmit.iris.gen.nms;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Random;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
import org.bukkit.event.Event;
import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.Lifecycle;
import com.volmit.iris.util.V;
import net.minecraft.server.v1_16_R2.BiomeBase;
import net.minecraft.server.v1_16_R2.BiomeManager;
import net.minecraft.server.v1_16_R2.Convertable;
import net.minecraft.server.v1_16_R2.DataConverterRegistry;
import net.minecraft.server.v1_16_R2.DedicatedServer;
import net.minecraft.server.v1_16_R2.DimensionManager;
import net.minecraft.server.v1_16_R2.DynamicOpsNBT;
import net.minecraft.server.v1_16_R2.EnumDifficulty;
import net.minecraft.server.v1_16_R2.EnumGamemode;
import net.minecraft.server.v1_16_R2.GameRules;
import net.minecraft.server.v1_16_R2.GeneratorSettingBase;
import net.minecraft.server.v1_16_R2.GeneratorSettings;
import net.minecraft.server.v1_16_R2.IRegistry;
import net.minecraft.server.v1_16_R2.IWorldDataServer;
import net.minecraft.server.v1_16_R2.MinecraftKey;
import net.minecraft.server.v1_16_R2.MinecraftServer;
import net.minecraft.server.v1_16_R2.MobSpawner;
import net.minecraft.server.v1_16_R2.MobSpawnerCat;
import net.minecraft.server.v1_16_R2.MobSpawnerPatrol;
import net.minecraft.server.v1_16_R2.MobSpawnerPhantom;
import net.minecraft.server.v1_16_R2.MobSpawnerTrader;
import net.minecraft.server.v1_16_R2.NBTBase;
import net.minecraft.server.v1_16_R2.RegistryMaterials;
import net.minecraft.server.v1_16_R2.RegistryReadOps;
import net.minecraft.server.v1_16_R2.ResourceKey;
import net.minecraft.server.v1_16_R2.SaveData;
import net.minecraft.server.v1_16_R2.VillageSiege;
import net.minecraft.server.v1_16_R2.WorldDataServer;
import net.minecraft.server.v1_16_R2.WorldDimension;
import net.minecraft.server.v1_16_R2.WorldServer;
import net.minecraft.server.v1_16_R2.WorldSettings;
public class NMSCreator162
{
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
public static World createWorld(WorldCreator creator, boolean loadSpawn)
{
CraftServer server = ((CraftServer) Bukkit.getServer());
Map<String, World> worlds = new V(server).get("worlds");
DedicatedServer console = new V(server).get("console");
Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP");
Validate.notNull((Object) creator, "Creator may not be null");
final String name = creator.name();
org.bukkit.generator.ChunkGenerator generator = creator.generator();
final File folder = new File(server.getWorldContainer(), name);
final World world = server.getWorld(name);
if(world != null)
{
return world;
}
if(folder.exists() && !folder.isDirectory())
{
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
}
if(generator == null)
{
generator = server.getGenerator(name);
}
ResourceKey<WorldDimension> actualDimension = null;
switch(creator.environment())
{
case NORMAL:
{
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.OVERWORLD;
break;
}
case NETHER:
{
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_NETHER;
break;
}
case THE_END:
{
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_END;
break;
}
default:
{
throw new IllegalArgumentException("Illegal dimension");
}
}
Convertable.ConversionSession worldSession;
try
{
worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension);
}
catch(IOException ex)
{
throw new RuntimeException(ex);
}
MinecraftServer.convertWorld(worldSession);
final boolean hardcore = creator.hardcore();
final RegistryReadOps<NBTBase> registryreadops = (RegistryReadOps<NBTBase>) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
if(worlddata == null)
{
final Properties properties = new Properties();
properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
properties.put("level-seed", Objects.toString(creator.seed()));
properties.put("generate-structures", Objects.toString(creator.generateStructures()));
properties.put("level-type", Objects.toString(creator.type().getName()));
final GeneratorSettings generatorsettings = GeneratorSettings.a(console.aX(), properties);
@SuppressWarnings("deprecation")
final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
}
worlddata.checkName(name);
worlddata.a(console.getServerModName(), console.getModded().isPresent());
if(console.options.has("forceUpgrade"))
{
net.minecraft.server.v1_16_R2.Main.convertWorld(worldSession, DataConverterRegistry.a(), console.options.has("eraseCache"), () -> true, (ImmutableSet) worlddata.getGeneratorSettings().d().d().stream().map(entry -> ResourceKey.a(IRegistry.K, entry.getKey().a())).collect(ImmutableSet.toImmutableSet()));
}
final long j = BiomeManager.a(creator.seed());
final List<MobSpawner> list = (List<MobSpawner>) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata));
final RegistryMaterials<WorldDimension> registrymaterials = (RegistryMaterials<WorldDimension>) worlddata.getGeneratorSettings().d();
final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension);
DimensionManager dimensionmanager;
net.minecraft.server.v1_16_R2.ChunkGenerator chunkgenerator;
if(worlddimension == null)
{
dimensionmanager = (DimensionManager) console.f.a().d(DimensionManager.OVERWORLD);
chunkgenerator = (net.minecraft.server.v1_16_R2.ChunkGenerator) GeneratorSettings.a((IRegistry<BiomeBase>) console.f.b(IRegistry.ay), (IRegistry<GeneratorSettingBase>) console.f.b(IRegistry.ar), new Random().nextLong());
}
else
{
dimensionmanager = worlddimension.b();
chunkgenerator = worlddimension.c();
}
final ResourceKey<net.minecraft.server.v1_16_R2.World> worldKey = (ResourceKey<net.minecraft.server.v1_16_R2.World>) ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
//@builder
final WorldServer internal = new WorldServer((MinecraftServer) console,
console.executorService, worldSession,
(IWorldDataServer) worlddata,
(ResourceKey) worldKey,
dimensionmanager,
server.getServer().worldLoadListenerFactory.create(11),
chunkgenerator,
worlddata.getGeneratorSettings().isDebugWorld(),
j,
(List) ((creator.environment() == World.Environment.NORMAL) ? list : ImmutableList.of()),
true,
creator.environment(),
generator);
//@done
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
{
try
{
internal.close();
}
catch(IOException e)
{
e.printStackTrace();
}
return null;
}
console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings());
internal.setSpawnFlags(true, true);
console.worldServer.put(internal.getDimensionKey(), internal);
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
if(loadSpawn)
{
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
}
else
{
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
}
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
return (World) internal.getWorld();
}
}

View File

@ -0,0 +1,93 @@
package com.volmit.iris.gen.provisions;
import java.util.List;
import java.util.Random;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import com.volmit.iris.gen.scaffold.HeightedFakeWorld;
import com.volmit.iris.gen.scaffold.Provisioned;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainProvider;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class ProvisionBukkit extends ChunkGenerator implements Provisioned
{
private HeightedFakeWorld fakeworld = null;
private boolean worldSet = false;
private final TerrainProvider provider;
public ProvisionBukkit(TerrainProvider provider)
{
this.provider = provider;
}
@Override
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
{
if(!worldSet)
{
worldSet = true;
provider.getTarget().setRealWorld(world);
}
TerrainChunk terrain = TerrainChunk.create(world, biome);
getProvider().generate(random, x, z, terrain);
return terrain.getRaw();
}
@Override
public boolean canSpawn(World world, int x, int z)
{
return provider.canSpawn(x, z);
}
@Override
public List<BlockPopulator> getDefaultPopulators(World world)
{
return provider.getPopulators();
}
@Override
public Location getFixedSpawnLocation(World world, Random random)
{
return super.getFixedSpawnLocation(world, random);
}
@Override
public boolean isParallelCapable()
{
return provider.isParallelCapable();
}
@Override
public boolean shouldGenerateCaves()
{
return provider.shouldGenerateCaves();
}
@Override
public boolean shouldGenerateDecorations()
{
return super.shouldGenerateDecorations();
}
@Override
public boolean shouldGenerateMobs()
{
return provider.shouldGenerateMobs();
}
@Override
public boolean shouldGenerateStructures()
{
return provider.shouldGenerateVanillaStructures();
}
}

View File

@ -1,66 +0,0 @@
package com.volmit.iris.gen.bindings;
import java.util.List;
import java.util.Random;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
public abstract class BukkitTerrainProvider extends ChunkGenerator implements TerrainProvider
{
private final TerrainTarget target;
public BukkitTerrainProvider(TerrainTarget target)
{
this.target = target;
}
@Override
public abstract void generate(Random random, int x, int z, TerrainChunk chunk);
@Override
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
{
TerrainChunk terrain = TerrainChunk.create(world);
generate(random, x, z, terrain);
return terrain;
}
@Override
public abstract boolean canSpawn(World world, int x, int z);
@Override
public boolean canSpawnDefault(World world, int x, int z)
{
return super.canSpawn(world, x, z);
}
@Override
public abstract List<BlockPopulator> getDefaultPopulators(World world);
@Override
public abstract Location getFixedSpawnLocation(World world, Random random);
@Override
public abstract boolean isParallelCapable();
@Override
public abstract boolean shouldGenerateCaves();
@Override
public abstract boolean shouldGenerateDecorations();
@Override
public abstract boolean shouldGenerateMobs();
@Override
public abstract boolean shouldGenerateStructures();
@Override
public TerrainTarget getTarget()
{
return target;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
package com.volmit.iris.gen.bindings;
package com.volmit.iris.gen.scaffold;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;

View File

@ -0,0 +1,24 @@
package com.volmit.iris.gen.scaffold;
import com.volmit.iris.gen.IrisChunkGenerator;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class IrisGenConfiguration
{
private TerrainTarget target;
@Builder.Default
private int threads = 16;
@Builder.Default
private String dimension = "";
public IrisChunkGenerator buildGenerator()
{
return new IrisChunkGenerator(this);
}
}

View File

@ -1,10 +1,10 @@
package com.volmit.iris.gen.bindings;
import java.lang.reflect.Constructor;
package com.volmit.iris.gen.scaffold;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import org.bukkit.material.MaterialData;
@ -16,39 +16,26 @@ public class IrisTerrainChunk implements TerrainChunk
private final Biome[] biome2D;
private final IrisBiomeStorage biome3D;
private final ChunkData rawChunkData;
private final Constructor<?> construct = buildConstruct();
private final BiomeGrid storage;
public IrisTerrainChunk(int maxHeight)
{
rawChunkData = createChunkData(maxHeight);
biome2D = Iris.biome3d ? null : new Biome[256];
biome3D = Iris.biome3d ? new IrisBiomeStorage() : null;
this(null, maxHeight);
}
private Constructor<?> buildConstruct()
public IrisTerrainChunk(BiomeGrid storage, int maxHeight)
{
try
{
Class<?> chunkDatazz = Class.forName("org.bukkit.craftbukkit." + Iris.nmsTag() + ".generator.CraftChunkData");
Constructor<?> construct = chunkDatazz.getConstructor(int.class);
construct.setAccessible(true);
return construct;
}
catch(Throwable e)
{
Iris.error("Failed create construct for ChunkData(int)");
e.printStackTrace();
}
return null;
this.storage = storage;
rawChunkData = createChunkData(maxHeight);
biome2D = storage != null ? null : Iris.biome3d ? null : new Biome[256];
biome3D = storage != null ? null : Iris.biome3d ? new IrisBiomeStorage() : null;
}
private ChunkData createChunkData(int maxHeight)
{
try
{
return (ChunkData) construct.newInstance(maxHeight);
return Bukkit.createChunkData(new HeightedFakeWorld(maxHeight));
}
catch(Throwable e)
@ -62,6 +49,11 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public Biome getBiome(int x, int z)
{
if(storage != null)
{
return storage.getBiome(x, z);
}
if(biome2D != null)
{
return biome2D[(z << 4) | x];
@ -73,6 +65,11 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public Biome getBiome(int x, int y, int z)
{
if(storage != null)
{
return storage.getBiome(x, y, z);
}
if(biome2D != null)
{
return biome2D[(z << 4) | x];
@ -84,6 +81,12 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public void setBiome(int x, int z, Biome bio)
{
if(storage != null)
{
storage.setBiome(x, z, bio);
return;
}
if(biome2D != null)
{
biome2D[(z << 4) | x] = bio;
@ -96,6 +99,12 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public void setBiome(int x, int y, int z, Biome bio)
{
if(storage != null)
{
storage.setBiome(x, y, z, bio);
return;
}
if(biome2D != null)
{
biome2D[(z << 4) | x] = bio;
@ -177,4 +186,10 @@ public class IrisTerrainChunk implements TerrainChunk
{
return rawChunkData.getData(x, y, z);
}
@Override
public ChunkData getRaw()
{
return rawChunkData;
}
}

View File

@ -0,0 +1,23 @@
package com.volmit.iris.gen.scaffold;
import org.bukkit.World;
import com.volmit.iris.gen.IrisChunkGenerator;
public class IrisWorlds
{
public boolean isIrisWorld(World world)
{
return world.getGenerator() instanceof Provisioned;
}
public IrisChunkGenerator getProvider(World world)
{
if(isIrisWorld(world))
{
return (IrisChunkGenerator) ((Provisioned) world.getGenerator()).getProvider();
}
return null;
}
}

View File

@ -0,0 +1,6 @@
package com.volmit.iris.gen.scaffold;
public interface Provisioned
{
public TerrainProvider getProvider();
}

View File

@ -1,4 +1,4 @@
package com.volmit.iris.gen.bindings;
package com.volmit.iris.gen.scaffold;
import org.bukkit.World;
import org.bukkit.block.Biome;
@ -18,6 +18,16 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
return new IrisTerrainChunk(maxHeight);
}
public static TerrainChunk create(World world, BiomeGrid grid)
{
return create(world.getMaxHeight(), grid);
}
public static TerrainChunk create(int maxHeight, BiomeGrid grid)
{
return new IrisTerrainChunk(grid, maxHeight);
}
/**
* Get biome at x, z within chunk being generated
*
@ -114,4 +124,6 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
* outside the chunk's bounds
*/
public BlockData getBlockData(int x, int y, int z);
public ChunkData getRaw();
}

View File

@ -1,10 +1,8 @@
package com.volmit.iris.gen.bindings;
package com.volmit.iris.gen.scaffold;
import java.util.List;
import java.util.Random;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
public interface TerrainProvider
@ -13,21 +11,17 @@ public interface TerrainProvider
public void generate(Random random, int x, int z, TerrainChunk chunk);
public boolean canSpawn(World world, int x, int z);
public boolean canSpawn(int x, int z);
public boolean canSpawnDefault(World world, int x, int z);
public List<BlockPopulator> getDefaultPopulators(World world);
public Location getFixedSpawnLocation(World world, Random random);
public List<BlockPopulator> getPopulators();
public boolean isParallelCapable();
public boolean shouldGenerateMobs();
public boolean shouldGenerateCaves();
public boolean shouldGenerateDecorations();
public boolean shouldGenerateMobs();
public boolean shouldGenerateStructures();
public boolean shouldGenerateVanillaStructures();
}

View File

@ -1,9 +1,13 @@
package com.volmit.iris.gen.bindings;
package com.volmit.iris.gen.scaffold;
import java.io.File;
import java.util.List;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.entity.Player;
import com.volmit.iris.util.KList;
import lombok.Builder;
import lombok.Data;
@ -16,6 +20,20 @@ public class TerrainTarget
private Environment environment;
private String name;
private File folder;
private static final KList<Player> emptyPlayers = new KList<>();
private World realWorld;
public void setRealWorld(World realWorld)
{
if(this.realWorld == null || realWorld != this.realWorld)
{
this.realWorld = realWorld;
this.seed = realWorld.getSeed();
this.folder = realWorld.getWorldFolder();
this.environment = realWorld.getEnvironment();
this.name = realWorld.getName();
}
}
public static TerrainTarget from(World world)
{
@ -25,7 +43,61 @@ public class TerrainTarget
.seed(world.getSeed())
.folder(world.getWorldFolder())
.name(world.getName())
.realWorld(world)
.build();
//@done
}
public List<Player> getPlayers()
{
return realWorld != null ? realWorld.getPlayers() : emptyPlayers;
}
public boolean isWorld(World world)
{
return world.getName().equals(getName()) && world.getSeed() == getSeed() && getEnvironment().equals(world.getEnvironment()) && world.getWorldFolder().equals(getFolder());
}
@Override
public boolean equals(Object obj)
{
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
TerrainTarget other = (TerrainTarget) obj;
if(environment != other.environment)
return false;
if(folder == null)
{
if(other.folder != null)
return false;
}
else if(!folder.equals(other.folder))
return false;
if(name == null)
{
if(other.name != null)
return false;
}
else if(!name.equals(other.name))
return false;
if(seed != other.seed)
return false;
return true;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((environment == null) ? 0 : environment.hashCode());
result = prime * result + ((folder == null) ? 0 : folder.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + (int) (seed ^ (seed >>> 32));
return result;
}
}

View File

@ -82,6 +82,17 @@ public class MultiverseCoreLink
saveConfig();
}
public void removeFromConfig(String world)
{
if(!supported())
{
return;
}
getList().remove(world);
saveConfig();
}
public void saveConfig()
{
try

View File

@ -138,6 +138,10 @@ public class IrisDimension extends IrisRegistrant
@Desc("Carve terrain or not")
private boolean carving = true;
@DontObfuscate
@Desc("Generate vanilla caves")
private boolean vanillaCaves = false;
@DontObfuscate
@Desc("Generate vanilla structures")
private boolean vanillaStructures = false;

View File

@ -76,9 +76,9 @@ public class IrisEntitySpawn
return null;
}
if(rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)).i(1, getRarity()) == 1)
if(rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)).i(1, getRarity()) == 1)
{
return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)));
return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)));
}
return null;