Attempts at loading a custom dimension
Including even patching the server
This commit is contained in:
parent
849cf7f755
commit
14867a4b6d
4 changed files with 225 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/target/
|
||||
/CustomDimensions.iml
|
||||
/.idea/
|
38
pom.xml
Normal file
38
pom.xml
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.github.TBMCPlugins</groupId>
|
||||
<artifactId>CustomDimensions</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>10</source>
|
||||
<target>10</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot</artifactId>
|
||||
<version>1.16.2-R0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,179 @@
|
|||
package buttondevteam.customdimensions;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import net.minecraft.server.v1_16_R2.*;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.SpigotTimings;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.world.WorldLoadEvent;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.objenesis.Objenesis;
|
||||
import org.objenesis.ObjenesisStd;
|
||||
import org.spigotmc.SpigotWorldConfig;
|
||||
import org.spigotmc.TickLimiter;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class CustomDimensions extends JavaPlugin implements Listener {
|
||||
/*@Command2.Subcommand
|
||||
public void def(CommandSender sender, String name) {
|
||||
*sender.sendMessage("Starting creation of " + name + "...");
|
||||
var world = load();
|
||||
if (world == null)
|
||||
sender.sendMessage("Failed to load world.");
|
||||
else
|
||||
sender.sendMessage("World loaded! " + world.getName());*
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
Bukkit.getPluginManager().registerEvents(this, this);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void worldLoad(WorldLoadEvent event) {
|
||||
System.out.println("World loaded: " + event.getWorld().getName());
|
||||
if (!event.getWorld().getName().equals(Bukkit.getWorlds().get(0).getName()))
|
||||
return;
|
||||
System.out.println("Main world");
|
||||
try {
|
||||
load();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void load() throws Exception {
|
||||
System.out.println("Loading...");
|
||||
var console = ((CraftServer) Bukkit.getServer()).getServer();
|
||||
var field = console.getClass().getSuperclass().getDeclaredField("saveData");
|
||||
field.setAccessible(true);
|
||||
var saveData = (SaveData) field.get(console);
|
||||
IWorldDataServer iworlddataserver = saveData.H();
|
||||
GeneratorSettings generatorsettings = saveData.getGeneratorSettings();
|
||||
RegistryMaterials<WorldDimension> registrymaterials = generatorsettings.d();
|
||||
var worldloadlistener = console.worldLoadListenerFactory.create(11);
|
||||
|
||||
var iterator = registrymaterials.d().iterator();
|
||||
|
||||
var mainWorld = Bukkit.getWorlds().get(0);
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
Map.Entry<ResourceKey<WorldDimension>, WorldDimension> entry = iterator.next();
|
||||
ResourceKey<WorldDimension> resourcekey = entry.getKey();
|
||||
|
||||
if (resourcekey != WorldDimension.OVERWORLD) {
|
||||
ResourceKey<World> resourcekey1 = ResourceKey.a(IRegistry.L, resourcekey.a());
|
||||
DimensionManager dimensionmanager1 = entry.getValue().b();
|
||||
ChunkGenerator chunkgenerator = entry.getValue().c();
|
||||
SecondaryWorldData secondaryworlddata = new SecondaryWorldData(saveData, iworlddataserver);
|
||||
WorldServer worldserver1 = new WorldServer(console, console.executorService, console.convertable,
|
||||
secondaryworlddata, resourcekey1, dimensionmanager1, worldloadlistener, chunkgenerator,
|
||||
false, //isDebugWorld
|
||||
BiomeManager.a(mainWorld.getSeed()), //Biome seed
|
||||
ImmutableList.of(), false, org.bukkit.World.Environment.NORMAL, null, secondaryworlddata.getName());
|
||||
|
||||
((CraftWorld) mainWorld).getHandle().getWorldBorder().a(new IWorldBorderListener.a(worldserver1.getWorldBorder()));
|
||||
console.worldServer.put(resourcekey1, worldserver1);
|
||||
}
|
||||
}
|
||||
System.out.println("Loading finished!");
|
||||
}
|
||||
|
||||
/*private WorldServer createWorldServer(WorldDataMutable worldData, String name) throws Exception {
|
||||
var obj = new ObjenesisStd();
|
||||
var ws = obj.newInstance(WorldServer.class);
|
||||
ws.spigotConfig = new SpigotWorldConfig(name);
|
||||
//ws.generator = gen;
|
||||
var field = ws.getClass().getDeclaredField("world");
|
||||
field.setAccessible(true);
|
||||
field.set(ws, new CraftWorld(ws, null, org.bukkit.World.Environment.NORMAL));
|
||||
ws.ticksPerAnimalSpawns = ws.getServer().getTicksPerAnimalSpawns();
|
||||
ws.ticksPerMonsterSpawns = ws.getServer().getTicksPerMonsterSpawns();
|
||||
...
|
||||
}*/
|
||||
|
||||
/*public World load(String name) {
|
||||
File folder = new File(Bukkit.getWorldContainer(), name);
|
||||
World world = Bukkit.getWorld(name);
|
||||
if (world != null) {
|
||||
return world;
|
||||
} else if (folder.exists() && !folder.isDirectory()) {
|
||||
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
|
||||
} else {
|
||||
ResourceKey<WorldDimension> actualDimension = ResourceKey.a(IRegistry.M, new MinecraftKey(name));
|
||||
|
||||
Convertable.ConversionSession worldSession;
|
||||
try {
|
||||
worldSession = Convertable.a(Bukkit.getWorldContainer().toPath()).c(name, actualDimension);
|
||||
} catch (IOException var21) {
|
||||
throw new RuntimeException(var21);
|
||||
}
|
||||
|
||||
var server = (CraftServer) Bukkit.getServer();
|
||||
var console = server.getServer();
|
||||
|
||||
MinecraftServer.convertWorld(worldSession);
|
||||
RegistryReadOps<NBTBase> registryreadops = RegistryReadOps.a(DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
|
||||
WorldDataServer worlddata = (WorldDataServer) worldSession.a(registryreadops, console.datapackconfiguration);
|
||||
if (worlddata == null) {
|
||||
System.out.println("No world data found in datapacks!");
|
||||
System.out.println("folder: "+worldSession.folder);
|
||||
System.out.println("level name: "+worldSession.getLevelName());
|
||||
Bukkit.getWorlds()
|
||||
//World folder: Minecraft only supports the three default types for the main world
|
||||
//Therefore we can't load a separate world with a custom dimension
|
||||
//How about just pretending we did
|
||||
return null;
|
||||
}
|
||||
|
||||
worlddata.checkName(name);
|
||||
worlddata.a(console.getServerModName(), console.getModded().isPresent());
|
||||
if (console.options.has("forceUpgrade")) {
|
||||
Main.convertWorld(worldSession, DataConverterRegistry.a(), console.options.has("eraseCache"),
|
||||
() -> true, worlddata.getGeneratorSettings().d().d().stream().map((entry) -> ResourceKey.a(IRegistry.K,
|
||||
entry.getKey().a())).collect(ImmutableSet.toImmutableSet()));
|
||||
}
|
||||
|
||||
long j = BiomeManager.a(Bukkit.getWorlds().get(0).getSeed());
|
||||
List<MobSpawner> list = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(worlddata));
|
||||
RegistryMaterials<WorldDimension> registrymaterials = worlddata.getGeneratorSettings().d();
|
||||
WorldDimension worlddimension = registrymaterials.a(actualDimension);
|
||||
DimensionManager dimensionmanager;
|
||||
ChunkGenerator chunkgenerator;
|
||||
if (worlddimension == null) {
|
||||
//dimensionmanager = console.f.a().d(DimensionManager.OVERWORLD);
|
||||
//chunkgenerator = GeneratorSettings.a(console.f.b(IRegistry.ay), console.f.b(IRegistry.ar), (new Random()).nextLong());
|
||||
System.out.println("World dimension is null!");
|
||||
return null;
|
||||
} else {
|
||||
dimensionmanager = worlddimension.b();
|
||||
chunkgenerator = worlddimension.c();
|
||||
}
|
||||
|
||||
var environment = World.Environment.NORMAL;
|
||||
|
||||
ResourceKey<net.minecraft.server.v1_16_R2.World> worldKey = ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
|
||||
WorldServer internal = new WorldServer(console, console.executorService, worldSession, worlddata, worldKey,
|
||||
dimensionmanager, console.worldLoadListenerFactory.create(11), chunkgenerator,
|
||||
worlddata.getGeneratorSettings().isDebugWorld(), j, environment == World.Environment.NORMAL ? list : ImmutableList.of(),
|
||||
true, environment, null);
|
||||
if (Bukkit.getWorld(name.toLowerCase(Locale.ENGLISH)) == null) {
|
||||
System.out.println("Newly created world not found!");
|
||||
return null;
|
||||
} else {
|
||||
console.initWorld(internal, worlddata, worlddata, worlddata.getGeneratorSettings());
|
||||
internal.setSpawnFlags(true, true);
|
||||
console.worldServer.put(internal.getDimensionKey(), internal);
|
||||
server.getPluginManager().callEvent(new WorldInitEvent(internal.getWorld()));
|
||||
console.loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
|
||||
server.getPluginManager().callEvent(new WorldLoadEvent(internal.getWorld()));
|
||||
return internal.getWorld();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
5
src/main/resources/plugin.yml
Normal file
5
src/main/resources/plugin.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
name: CustomDimensions
|
||||
main: buttondevteam.customdimensions.CustomDimensions
|
||||
version: '1.0'
|
||||
load: STARTUP
|
||||
api-version: '1.16'
|
Loading…
Reference in a new issue