WorldGenPlugin class
Пакет: com.hypixel.hytale.builtin.worldgen
Файл: com/hypixel/hytale/builtin/worldgen/WorldGenPlugin.java
extends: JavaPlugin
Поля (22)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
String |
VERSIONS_DIR_NAME |
|
|
instance |
|
AssetModule |
var1 |
|
Path |
var1 |
|
String |
var1 |
|
PluginManifest |
var10 |
|
List |
var2 |
|
Path |
var2 |
|
Path |
var2 |
|
char[] |
var2 |
|
String |
var2 |
|
Object2ObjectOpenHashMap |
var3 |
|
Path |
var3 |
|
RawJsonReader |
var3 |
|
Iterator |
var4 |
|
ExtraInfo |
var4 |
|
ObjectArrayList |
var5 |
|
Path |
var5 |
|
PluginManifest |
var5 |
|
Semver |
var6 |
|
String |
var8 |
|
Path |
var9 |
Методы (15)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException(var13) |
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException(var9) |
|
public int |
compareTopublic int compareTo(WorldGenPlugin.Version var1) |
|
|
for for(WorldGenPlugin.Version var5 : var2) |
|
|
for for(Path var7 : var4) |
|
|
for for(WorldGenPlugin.Version var3 : var1) |
static |
WorldGenPlugin |
getWorldGenPlugin get() |
|
public String |
getPackNamepublic String getPackName() |
static |
Path |
getVersionsPathPath getVersionsPath() |
|
|
if if(var8 != null) |
|
|
if if(var10 != null) |
static |
List<WorldGenPlugin.Version> |
loadVersionPacksList<WorldGenPlugin.Version> loadVersionPacks(@Nonnull AssetModule var0) |
abstract |
|
super super(var1) |
static |
void |
validateVersionvoid validateVersion(@Nonnull WorldGenPlugin.Version var0, @Nonnull List<WorldGenPlugin.Version> var1) |
abstract |
|
validateVersion validateVersion(var5, var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.worldgen;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.condition.location.EventLocation;
class="kw">import com.hypixel.hytale.builtin.worldgen.integrations.BiomeLocationV1;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.EventHandler;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.WorldGenModifier;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.Content;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.FileContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.cave.CaveTypeContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.cave.CaveTypeGenerator;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.cave.ore.OreCluster;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.cover.BiomeCoverContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.cover.CaveCoverContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.fluid.BiomeFluidContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.layer.BiomeDynamicLayerContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.layer.BiomeStaticLayerContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.prefab.BiomePrefabContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.prefab.CavePrefabContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.content.tint.BiomeTintContent;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.event.ModifyEvents;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.op.AddOp;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.op.LogOp;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.op.Op;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.op.RemoveOp;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.lookup.Priority;
class="kw">import com.hypixel.hytale.codec.util.RawJsonReader;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.semver.Semver;
class="kw">import com.hypixel.hytale.procedurallib.file.FileIO;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.provider.IWorldGenProvider;
class="kw">import com.hypixel.hytale.server.worldgen.BiomeDataSystem;
class="kw">import com.hypixel.hytale.server.worldgen.HytaleWorldGenProvider;
class="kw">import com.hypixel.hytale.server.worldgen.util.LogUtil;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectLists;
class="kw">import java.io.BufferedReader;
class="kw">import java.io.IOException;
class="kw">import java.nio.charset.StandardCharsets;
class="kw">import java.nio.file.DirectoryStream;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Collections;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class WorldGenPlugin class="kw">extends JavaPlugin {
class="kw">private class="kw">static class="kw">final String VERSIONS_DIR_NAME = "$Versions";
class="kw">private class="kw">static class="kw">final String MANIFEST_FILENAME = "manifest.json";
class="kw">private class="kw">static WorldGenPlugin instance;
class="kw">public class="kw">static WorldGenPlugin get() {
class="kw">return instance;
}
class="kw">public WorldGenPlugin(@Nonnull JavaPluginInit var1) {
super(var1);
}
@Override
class="kw">protected void setup() {
instance = this;
this.getEntityStoreRegistry().registerSystem(new BiomeDataSystem());
IWorldGenProvider.CODEC.register(Priority.DEFAULT.before(1), "Hytale", HytaleWorldGenProvider.class, HytaleWorldGenProvider.CODEC);
this.getEventRegistry().register(ModifyEvents.BiomeCovers.class, Content.Type.BIOME_COVER, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.BiomeEnvironments.class, Content.Type.BIOME_ENVIRONMENT, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.BiomeFluids.class, Content.Type.BIOME_FLUID, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.BiomeDynamicLayers.class, Content.Type.BIOME_DYNAMIC_LAYER, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.BiomeStaticLayers.class, Content.Type.BIOME_STATIC_LAYER, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.BiomePrefabs.class, Content.Type.BIOME_PREFAB, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.BiomeTints.class, Content.Type.BIOME_TINT, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.CaveTypes.class, Content.Type.CAVE_TYPE, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.CaveCovers.class, Content.Type.CAVE_COVER, EventHandler::handle);
this.getEventRegistry().register(ModifyEvents.CavePrefabs.class, Content.Type.CAVE_PREFAB, EventHandler::handle);
this.getCodecRegistry(CaveTypeGenerator.TYPE_CODEC).register("OreCluster", OreCluster.class, OreCluster.CODEC);
this.getCodecRegistry(Content.TYPE_CODEC)
.register("File", FileContent.class, FileContent.CODEC)
.register("BiomeCover", BiomeCoverContent.class, BiomeCoverContent.CODEC)
.register("BiomeFluid", BiomeFluidContent.class, BiomeFluidContent.CODEC)
.register("BiomeDynamicLayer", BiomeDynamicLayerContent.class, BiomeDynamicLayerContent.CODEC)
.register("BiomeStaticLayer", BiomeStaticLayerContent.class, BiomeStaticLayerContent.CODEC)
.register("BiomePrefab", BiomePrefabContent.class, BiomePrefabContent.CODEC)
.register("BiomeTint", BiomeTintContent.class, BiomeTintContent.CODEC)
.register("CaveCover", CaveCoverContent.class, CaveCoverContent.CODEC)
.register("CavePrefab", CavePrefabContent.class, CavePrefabContent.CODEC)
.register("CaveType", CaveTypeContent.class, CaveTypeContent.CODEC);
this.getCodecRegistry(Op.TYPE_CODEC)
.register("Add", AddOp.class, AddOp.CODEC)
.register("Remove", RemoveOp.class, RemoveOp.CODEC)
.register("Log", LogOp.class, LogOp.CODEC);
this.getAssetRegistry()
.register(
((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
WorldGenModifier.class, WorldGenModifier.ASSET_MAP
)
.setCodec(WorldGenModifier.ASSET_CODEC))
.setPath("WorldGen/Modifier"))
.setIdProvider(WorldGenModifier.class))
.setKeyFunction(WorldGenModifier::getId))
.setReplaceOnRemove(WorldGenModifier::new))
.build()
);
this.getCodecRegistry(EventLocation.Config.TYPE_CODEC).register("BiomeLocationV1", BiomeLocationV1.Config.class, BiomeLocationV1.Config.CODEC);
AssetModule var1 = AssetModule.get();
if (var1.getAssetPacks().isEmpty()) {
this.getLogger().at(Level.SEVERE).log("No asset packs loaded");
} else {
FileIO.setDefaultRoot(var1.getBaseAssetPack().getRoot());
List var2 = loadVersionPacks(var1);
Object2ObjectOpenHashMap var3 = new Object2ObjectOpenHashMap();
for (WorldGenPlugin.Version var5 : var2) {
validateVersion(var5, var2);
if (!var1.registerPack(var5.getPackName(), var5.path, var5.manifest, AssetPack.PackSource.CLASSPATH)) {
this.getLogger().at(Level.SEVERE).log("Failed to register world gen asset pack: %s", var5.getPackName());
} else {
Semver var6 = (Semver)var3.get(var5.name);
if (var6 == null || var5.manifest.getVersion().compareTo(var6) > 0) {
var3.put(var5.name, var5.manifest.getVersion());
}
}
}
HytaleWorldGenProvider.CODEC.setVersions(var3);
}
}
class="kw">private class="kw">static List<WorldGenPlugin.Version> loadVersionPacks(@Nonnull AssetModule var0) {
Path var1 = getVersionsPath();
if (!Files.exists(var1)) {
class="kw">return ObjectLists.emptyList();
}
Path var2 = var0.getBaseAssetPack().getRoot();
Path var3 = var2.relativize(Universe.getWorldGenPath());
try (DirectoryStream var4 = Files.newDirectoryStream(var1)) {
ObjectArrayList var5 = new ObjectArrayList();
for (Path var7 : var4) {
if (Files.isDirectory(var7)) {
String var8 = getWorldConfigName(var7, var3);
if (var8 != null) {
Path var9 = var7.resolve("manifest.json");
if (Files.exists(var9)) {
PluginManifest var10 = loadManifest(var9);
if (var10 != null) {
var5.add(new WorldGenPlugin.Version(var8, var7, var10));
}
}
}
}
}
Collections.sort(var5);
class="kw">return var5;
} catch (IOException var13) {
throw new RuntimeException(var13);
}
}
class="kw">private class="kw">static void validateVersion(@Nonnull WorldGenPlugin.Version var0, @Nonnull List<WorldGenPlugin.Version> var1) {
if (var0.manifest.getVersion().compareTo(HytaleWorldGenProvider.MIN_VERSION) <= 0) {
throw new IllegalArgumentException(
String.format(
"Invalid $Version AssetPack: %s. Pack version number: %s must be greater than: %s",
var0.path(),
var0.manifest.getVersion(),
HytaleWorldGenProvider.MIN_VERSION
)
);
}
for (WorldGenPlugin.Version var3 : var1) {
if (var3 != var0 && var0.name().equals(var3.name()) && var0.manifest.getVersion().equals(var3.manifest.getVersion())) {
throw new IllegalArgumentException(
String.format(
"$Version AssetPack: %s conflicts with pack: %s. Pack version numbers must be different. Found: %s in both",
var0.path(),
var3.path(),
var0.manifest.getVersion()
)
);
}
}
}
@Nullable
class="kw">private class="kw">static String getWorldConfigName(@Nonnull Path var0, @Nonnull Path var1) {
Path var2 = var0.resolve(var1);
if (Files.exists(var2) && Files.isDirectory(var2)) {
try (DirectoryStream var3 = Files.newDirectoryStream(var2)) {
Iterator var4 = var3.iterator();
if (!var4.hasNext()) {
LogUtil.getLogger().at(Level.WARNING).log("WorldGen version pack: %s is empty", var0);
class="kw">return null;
} else {
Path var5 = var4.next();
if (var4.hasNext()) {
LogUtil.getLogger().at(Level.WARNING).log("WorldGen version pack: %s contains multiple world configs", var0);
class="kw">return null;
} else if (!Files.isDirectory(var5)) {
LogUtil.getLogger().at(Level.WARNING).log("WorldGen version pack: %s does not contain a world config directory", var0);
class="kw">return null;
} else {
class="kw">return var5.getFileName().toString();
}
}
} catch (IOException var9) {
throw new RuntimeException(var9);
}
} else {
LogUtil.getLogger().at(Level.WARNING).log("WorldGen version pack: %s does not contain dir: %s", var0, var1);
class="kw">return null;
}
}
@Nullable
class="kw">private class="kw">static PluginManifest loadManifest(@Nonnull Path var0) class="kw">throws IOException {
if (!Files.exists(var0)) {
class="kw">return null;
}
try (BufferedReader var1 = Files.newBufferedReader(var0, StandardCharsets.UTF_8)) {
char[] var2 = RawJsonReader.READ_BUFFER.get();
RawJsonReader var3 = new RawJsonReader(var1, var2);
ExtraInfo var4 = ExtraInfo.THREAD_LOCAL.get();
PluginManifest var5 = PluginManifest.CODEC.decodeJson(var3, var4);
var4.getValidationResults().logOrThrowValidatorExceptions(LogUtil.getLogger());
class="kw">return var5;
}
}
class="kw">public class="kw">static Path getVersionsPath() {
class="kw">return Universe.getWorldGenPath().resolve("$Versions");
}
class="kw">public record Version(@Nonnull String name, @Nonnull Path path, @Nonnull PluginManifest manifest) class="kw">implements Comparable<WorldGenPlugin.Version> {
class="kw">public Version {
}
class="kw">public int compareTo(WorldGenPlugin.Version var1) {
class="kw">return this.manifest.getVersion().compareTo(var1.manifest.getVersion());
}
@Nonnull
class="kw">public String getPackName() {
String var1 = Objects.requireNonNullElse(this.manifest.getGroup(), "Unknown");
String var2 = Objects.requireNonNullElse(this.manifest.getName(), "Unknown");
class="kw">return var1 + ":" + var2;
}
}
}