InstancesPlugin class
Пакет: com.hypixel.hytale.builtin.instances
Файл: com/hypixel/hytale/builtin/instances/InstancesPlugin.java
extends: JavaPlugin
Поля (153)
| Модификаторы | Тип | Имя |
|---|---|---|
|
|
break |
|
|
break |
static |
InstancesPlugin |
instance |
|
|
instance |
|
Holder |
var0 |
|
EventRegistry |
var1 |
|
ObjectSchema |
var1 |
|
Store |
var1 |
|
List |
var1 |
|
Path |
var1 |
|
final List |
var1 |
|
Holder |
var1 |
|
Holder |
var1 |
|
Player |
var1 |
|
InstanceEntityConfig |
var1 |
|
String |
var10 |
|
|
var10 |
|
|
var10 |
|
UUIDComponent |
var10 |
|
TransformComponent |
var10 |
|
Teleport |
var10 |
|
World |
var10 |
|
float |
var10 |
|
WorldConfig |
var10 |
|
World |
var11 |
|
UUID |
var11 |
|
HeadRotation |
var11 |
|
CompletableFuture |
var11 |
|
UUIDComponent |
var11 |
|
Rotation3f |
var11 |
|
IChunkStorageProvider |
var11 |
|
String |
var12 |
|
HeadRotation |
var12 |
|
Transform |
var12 |
|
Universe |
var12 |
|
CompletableFuture |
var12 |
|
String |
var12 |
|
InstanceEntityConfig |
var13 |
|
Teleport |
var13 |
|
World |
var13 |
|
|
var13 |
|
|
var13 |
|
|
var13 |
|
ISpawnProvider |
var13 |
|
HeadRotation |
var13 |
|
World |
var13 |
|
UUIDComponent |
var14 |
|
Transform |
var14 |
|
|
var14 |
|
EnumSet |
var14 |
|
TransformComponent |
var15 |
|
HeadRotation |
var16 |
|
ComponentRegistryProxy |
var2 |
|
Map |
var2 |
|
World |
var2 |
|
WorldConfig |
var2 |
|
Universe |
var2 |
|
Player |
var2 |
|
InstanceWorldConfig |
var2 |
|
World |
var2 |
|
WorldReturnPoint |
var2 |
|
Path |
var2 |
|
Schema.HytaleMetadata |
var3 |
|
Path |
var3 |
|
ISpawnProvider |
var3 |
|
InstanceEntityConfig |
var3 |
|
InstanceWorldConfig |
var3 |
|
InstanceWorldConfig |
var3 |
|
Path |
var3 |
|
Path |
var3 |
|
PlayerConfigData |
var3 |
|
InstanceEntityConfig |
var3 |
|
WorldConfig |
var3 |
|
|
var3 |
|
World |
var3 |
|
StringBuilder |
var3 |
|
Path |
var4 |
|
World |
var4 |
|
WorldReturnPoint |
var4 |
|
|
var4 |
|
|
var4 |
|
boolean |
var4 |
|
String |
var4 |
|
Path |
var4 |
|
String |
var4 |
|
final Path |
var4 |
|
InstanceEntityConfig |
var4 |
|
WorldReturnPoint |
var4 |
|
|
var4 |
|
|
var4 |
|
InstanceWorldConfig |
var4 |
|
Store |
var4 |
|
DiscoverInstanceEvent.Display |
var4 |
|
String |
var4x |
|
Universe |
var5 |
|
CompletableFuture |
var5 |
|
Universe |
var5 |
|
World |
var5 |
|
WorldConfig |
var5 |
|
WorldConfig |
var5 |
|
String |
var5 |
|
Path |
var5 |
|
String |
var5 |
|
UUID |
var5 |
|
InstanceDiscoveryConfig |
var5 |
|
PlayerRef |
var5 |
|
World |
var6 |
|
Path |
var6 |
|
long |
var6 |
|
TransformComponent |
var6 |
|
World |
var6 |
|
InstanceEntityConfig |
var6 |
|
InstanceWorldConfig |
var6 |
|
Universe |
var6 |
|
Path |
var6 |
|
World |
var6 |
|
|
var6 |
|
WorldReturnPoint |
var6 |
|
PlayerConfigData |
var6 |
|
String |
var6 |
|
Path |
var7 |
|
Transform |
var7 |
|
UUID |
var7 |
|
WorldReturnPoint |
var7 |
|
World |
var7 |
|
|
var7 |
|
|
var7 |
|
WorldReturnPoint |
var7 |
|
InstanceEntityConfig |
var7 |
|
UUID |
var7 |
|
Message |
var7 |
|
StringBuilder |
var7 |
|
UUID |
var8 |
|
InstanceEntityConfig |
var8 |
|
|
var8 |
|
WorldConfig |
var8 |
|
UUIDComponent |
var8 |
|
Transform |
var8 |
|
|
var8 |
|
|
var8 |
|
Transform |
var8 |
|
Set |
var8 |
|
String |
var8 |
|
Path |
var8 |
|
InstanceWorldConfig |
var9 |
|
PlayerRef |
var9 |
|
ISpawnProvider |
var9 |
|
ISpawnProvider |
var9 |
|
WorldReturnPoint |
var9 |
|
TransformComponent |
var9 |
|
Ref |
var9 |
|
int |
var9 |
|
Universe |
var9 |
Методы (67)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Player is not in an instance") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Missing return world") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid instance name") |
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Spawn provider cannot be null when teleporting player to instance!") |
static |
boolean |
doesInstanceAssetExistboolean doesInstanceAssetExist(@Nonnull String var0) |
static |
CompletableFuture<Void> |
exitInstanceCompletableFuture<Void> exitInstance(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) |
static |
InstancesPlugin |
getInstancesPlugin get() |
|
|
if if(var2 != null) |
|
|
if if(var6 != null) |
|
|
if if(var10 == null) |
|
|
if if(var10 == null) |
|
|
if if(var11 != null) |
|
|
if if(var8 == null) |
|
|
if if(var3 != null) |
|
|
if if(var12 != null) |
|
|
if if(var4 != null) |
|
|
if if(var5x != null) |
|
|
if if(var4x == null) |
|
|
if if(var6 != null) |
|
|
if if(var3 != null) |
|
|
if if(var9 == null) |
|
|
if if(var10 != null && var11 != null) |
|
|
if if(var4 == null) |
|
|
if if(var4 == null) |
|
|
if if(var13 == null) |
|
|
if if(var7 == null) |
|
|
if if(var13 == null) |
|
|
if if(var13 == null || var14 == null) |
|
|
if if(var15 != null && var16 != null) |
|
|
if if(var2 != null) |
|
|
if if(var10 != null) |
|
|
if if(var7 == null || var8 == null) |
|
|
if if(var7 == null || var8 == null) |
|
|
if if(var0 != null) |
|
|
if if(var3 != null) |
|
|
if if(var4 == null) |
|
|
if if(var6 == null) |
|
|
if if(var6 != null) |
|
|
if if(var2 == null) |
|
|
if if(var4 != null) |
|
|
if if(var2 != null) |
|
|
if if(var4 != null) |
|
|
if if(var5 != null) |
|
|
if if(var5 != null) |
|
|
if if(var8 != null) |
|
|
if if(var9 != Integer.MIN_VALUE) |
|
|
if if(var1 != null) |
|
|
if if(var2 != null) |
|
|
if if(var3 != null) |
static |
void |
onPlayerAddToWorldvoid onPlayerAddToWorld(@Nonnull AddPlayerToWorldEvent var0) |
static |
void |
onPlayerConnectvoid onPlayerConnect(@Nonnull PlayerConnectEvent var0) |
static |
void |
onPlayerDrainFromWorldvoid onPlayerDrainFromWorld(@Nonnull DrainPlayerFromWorldEvent var0) |
static |
void |
onPlayerReadyvoid onPlayerReady(@Nonnull PlayerReadyEvent var0) |
|
public FileVisitResult |
preVisitDirectorypublic FileVisitResult preVisitDirectory(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2) |
abstract |
return |
returnToRespawnedInstancereturn returnToRespawnedInstance(var0, var1, var3, var4) |
static |
void |
safeRemoveInstancevoid safeRemoveInstance(@Nonnull String var0) |
static |
void |
safeRemoveInstancevoid safeRemoveInstance(@Nonnull UUID var0) |
static |
void |
safeRemoveInstancevoid safeRemoveInstance(@Nullable World var0) |
static |
void |
showInstanceDiscoveryvoid showInstanceDiscovery(@Nonnull Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1, @Nonnull UUID var2, @Nonnull InstanceDiscoveryConfig var3) |
abstract |
|
showInstanceDiscovery showInstanceDiscovery(var9, var4, var7, var5) |
abstract |
|
super super(var1) |
static |
void |
teleportPlayerToInstancevoid teleportPlayerToInstance(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nonnull World var2, @Nullable Transform var3) |
static |
void |
teleportPlayerToLoadingInstancevoid teleportPlayerToLoadingInstance(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nonnull CompletableFuture<World> var2, @Nullable Transform var3) |
static |
void |
teleportPlayerToLoadingInstancevoid teleportPlayerToLoadingInstance(@Nonnull Ref<EntityStore> var0,
@Nonnull ComponentAccessor<EntityStore> var1,
@Nonnull CompletableFuture<World> var2,
@Nullable Transform var3,
@Nullable Transform var4) |
abstract |
|
teleportPlayerToLoadingInstance teleportPlayerToLoadingInstance(var0, var1, var2, var3, null) |
private |
void |
validateInstanceAssetsvoid validateInstanceAssets(@Nonnull LoadAssetEvent var1) |
|
|
while while(var13 == null && var3 != null) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.instances;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.builtin.blockphysics.WorldValidationUtil;
class="kw">import com.hypixel.hytale.builtin.instances.blocks.ConfigurableInstanceBlock;
class="kw">import com.hypixel.hytale.builtin.instances.blocks.InstanceBlock;
class="kw">import com.hypixel.hytale.builtin.instances.command.InstancesCommand;
class="kw">import com.hypixel.hytale.builtin.instances.config.ExitInstance;
class="kw">import com.hypixel.hytale.builtin.instances.config.InstanceDiscoveryConfig;
class="kw">import com.hypixel.hytale.builtin.instances.config.InstanceEntityConfig;
class="kw">import com.hypixel.hytale.builtin.instances.config.InstanceWorldConfig;
class="kw">import com.hypixel.hytale.builtin.instances.config.WorldReturnPoint;
class="kw">import com.hypixel.hytale.builtin.instances.event.DiscoverInstanceEvent;
class="kw">import com.hypixel.hytale.builtin.instances.hud.InstanceRemovalHudSystem;
class="kw">import com.hypixel.hytale.builtin.instances.interactions.ExitInstanceInteraction;
class="kw">import com.hypixel.hytale.builtin.instances.interactions.TeleportConfigInstanceInteraction;
class="kw">import com.hypixel.hytale.builtin.instances.interactions.TeleportInstanceInteraction;
class="kw">import com.hypixel.hytale.builtin.instances.page.ConfigureInstanceBlockPage;
class="kw">import com.hypixel.hytale.builtin.instances.removal.IdleTimeoutCondition;
class="kw">import com.hypixel.hytale.builtin.instances.removal.InstanceDataResource;
class="kw">import com.hypixel.hytale.builtin.instances.removal.RemovalCondition;
class="kw">import com.hypixel.hytale.builtin.instances.removal.RemovalSystem;
class="kw">import com.hypixel.hytale.builtin.instances.removal.TimeoutCondition;
class="kw">import com.hypixel.hytale.builtin.instances.removal.WorldEmptyCondition;
class="kw">import com.hypixel.hytale.builtin.teleport.components.TeleportHistory;
class="kw">import com.hypixel.hytale.codec.schema.config.ObjectSchema;
class="kw">import com.hypixel.hytale.codec.schema.config.Schema;
class="kw">import com.hypixel.hytale.codec.schema.config.StringSchema;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.event.EventRegistry;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.SoundCategory;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.LoadAssetEvent;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.respawn.RespawnController;
class="kw">import com.hypixel.hytale.server.core.asset.type.soundevent.config.SoundEvent;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.data.PlayerConfigData;
class="kw">import com.hypixel.hytale.server.core.event.events.player.AddPlayerToWorldEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.player.DrainPlayerFromWorldEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.player.PlayerReadyEvent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.server.OpenCustomUIInteraction;
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.schema.SchemaGenerator;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.SoundUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.ValidationOption;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.spawn.ISpawnProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.provider.EmptyChunkStorageProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.provider.IChunkStorageProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.provider.MigrationChunkStorageProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.resources.EmptyResourceStorageProvider;
class="kw">import com.hypixel.hytale.server.core.util.EventTitleUtil;
class="kw">import com.hypixel.hytale.server.core.util.io.FileUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.FileVisitResult;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.SimpleFileVisitor;
class="kw">import java.nio.file.attribute.BasicFileAttributes;
class="kw">import java.util.EnumSet;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.logging.Level;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">public class InstancesPlugin class="kw">extends JavaPlugin {
class="kw">private class="kw">static InstancesPlugin instance;
@Nonnull
class="kw">public class="kw">static class="kw">final String INSTANCE_PREFIX = "instance-";
@Nonnull
class="kw">public class="kw">static class="kw">final String CONFIG_FILENAME = "instance.bson";
class="kw">private ResourceType<ChunkStore, InstanceDataResource> instanceDataResourceType;
class="kw">private ComponentType<EntityStore, InstanceEntityConfig> instanceEntityConfigComponentType;
class="kw">private class="kw">final Map<String, CompletableFuture<World>> pendingSpawns = new ConcurrentHashMap<>();
class="kw">private ComponentType<ChunkStore, InstanceBlock> instanceBlockComponentType;
class="kw">private ComponentType<ChunkStore, ConfigurableInstanceBlock> configurableInstanceBlockComponentType;
class="kw">public class="kw">static InstancesPlugin get() {
class="kw">return instance;
}
class="kw">public InstancesPlugin(@Nonnull JavaPluginInit var1) {
super(var1);
instance = this;
}
@Override
class="kw">protected void setup() {
EventRegistry var1 = this.getEventRegistry();
ComponentRegistryProxy var2 = this.getChunkStoreRegistry();
this.getCommandRegistry().registerCommand(new InstancesCommand());
var1.register((short)64, LoadAssetEvent.class, this::validateInstanceAssets);
SchemaGenerator.registerAssetSchema("InstanceConfig.json", var0 -> {
ObjectSchema var1 = WorldConfig.CODEC.toSchema(var0);
Map var2 = var1.getProperties();
var2.put("UUID", Schema.anyOf(new StringSchema(), new ObjectSchema()));
var1.setTitle("Instance Configuration");
var1.setId("InstanceConfig.json");
Schema.HytaleMetadata var3 = var1.getHytale();
var3.setPath("Instances");
var3.setExtension("instance.bson");
var3.setUiEditorIgnore(Boolean.TRUE);
class="kw">return var1;
}, List.of("Instances/**/instance.bson"), ".bson");
var1.registerGlobal(AddPlayerToWorldEvent.class, InstancesPlugin::onPlayerAddToWorld);
var1.registerGlobal(DrainPlayerFromWorldEvent.class, InstancesPlugin::onPlayerDrainFromWorld);
var1.register(PlayerConnectEvent.class, InstancesPlugin::onPlayerConnect);
var1.registerGlobal(PlayerReadyEvent.class, InstancesPlugin::onPlayerReady);
this.instanceBlockComponentType = var2.registerComponent(InstanceBlock.class, "Instance", InstanceBlock.CODEC);
var2.registerSystem(new InstanceBlock.OnRemove());
this.configurableInstanceBlockComponentType = var2.registerComponent(ConfigurableInstanceBlock.class, "InstanceConfig", ConfigurableInstanceBlock.CODEC);
var2.registerSystem(new ConfigurableInstanceBlock.OnRemove());
this.instanceDataResourceType = var2.registerResource(InstanceDataResource.class, "InstanceData", InstanceDataResource.CODEC);
var2.registerSystem(new RemovalSystem());
this.instanceEntityConfigComponentType = this.getEntityStoreRegistry()
.registerComponent(InstanceEntityConfig.class, "Instance", InstanceEntityConfig.CODEC);
this.getEntityStoreRegistry().registerSystem(new InstanceRemovalHudSystem());
this.getCodecRegistry(RemovalCondition.CODEC)
.register("WorldEmpty", WorldEmptyCondition.class, WorldEmptyCondition.CODEC)
.register("IdleTimeout", IdleTimeoutCondition.class, IdleTimeoutCondition.CODEC)
.register("Timeout", TimeoutCondition.class, TimeoutCondition.CODEC);
this.getCodecRegistry(Interaction.CODEC)
.register("TeleportInstance", TeleportInstanceInteraction.class, TeleportInstanceInteraction.CODEC)
.register("TeleportConfigInstance", TeleportConfigInstanceInteraction.class, TeleportConfigInstanceInteraction.CODEC)
.register("ExitInstance", ExitInstanceInteraction.class, ExitInstanceInteraction.CODEC);
this.getCodecRegistry(RespawnController.CODEC).register("ExitInstance", ExitInstance.class, ExitInstance.CODEC);
OpenCustomUIInteraction.registerBlockEntityCustomPage(
this, ConfigureInstanceBlockPage.class, "ConfigInstanceBlock", ConfigureInstanceBlockPage::new, () -> {
Holder var0 = ChunkStore.REGISTRY.newHolder();
var0.ensureComponent(ConfigurableInstanceBlock.getComponentType());
class="kw">return var0;
}
);
this.getCodecRegistry(WorldConfig.PLUGIN_CODEC).register(InstanceWorldConfig.class, "Instance", InstanceWorldConfig.CODEC);
}
@Nonnull
class="kw">public CompletableFuture<World> spawnInstance(@Nonnull String var1, @Nonnull World var2, @Nonnull Transform var3) {
class="kw">return this.spawnInstance(var1, null, var2, var3);
}
@Nonnull
class="kw">public CompletableFuture<World> spawnInstance(@Nonnull String var1, @Nullable String var2, @Nonnull World var3, @Nonnull Transform var4) {
Universe var5 = Universe.get();
if (var2 != null) {
World var6 = var5.getWorld(var2);
if (var6 != null) {
class="kw">return CompletableFuture.completedFuture(var6);
}
}
Path var7 = getInstanceAssetPath(var1);
class="kw">return WorldConfig.load(var7.resolve("instance.bson")).thenComposeAsync(var7x -> {
UUID var8 = UUID.randomUUID();
var7x.setUuid(var8);
if (var7x.getDisplayName() == null) {
var7x.setDisplayName(WorldConfig.formatDisplayName(var1));
}
InstanceWorldConfig var9 = InstanceWorldConfig.ensureAndGet(var7x);
var9.setInstanceName(var1);
var9.setReturnPoint(makeWorldReturnPoint(var3, var4, var9.shouldPreventReconnection()));
var7x.markChanged();
String var10 = var2;
if (var10 == null) {
var10 = var9.getInstanceKey();
}
if (var10 == null) {
var10 = "instance-" + safeName(var1) + "-" + var8;
}
World var11 = var5.getWorld(var10);
if (var11 != null) {
class="kw">return CompletableFuture.completedFuture(var11);
}
if (var9.shouldRespawnWhenTargeted() && var9.getInstanceKey() == null) {
this.getLogger().at(Level.WARNING).log("Instance '%s' sets RespawnWhenTargeted without an InstanceKey, returns cannot find its copy", var1);
}
String var12 = var10;
class="kw">return this.pendingSpawns.computeIfAbsent(var12, var4x -> {
CompletableFuture var5 = this.copyAndLoadInstance(var1, var7, var4x, var7x);
var5.whenComplete((var2x, var3x) -> this.pendingSpawns.remove(var4x));
class="kw">return var5;
});
});
}
@Nonnull
class="kw">private CompletableFuture<World> copyAndLoadInstance(@Nonnull String var1, @Nonnull Path var2, @Nonnull String var3, @Nonnull WorldConfig var4) {
Universe var5 = Universe.get();
Path var6 = var5.validateWorldPath(var3);
class="kw">return CompletableFuture.supplyAsync(
SneakyThrow.sneakySupplier(
() -> {
long var6 = System.nanoTime();
this.getLogger().at(Level.INFO).log("Copying instance files for %s to world %s", var1, var3);
try (Stream var8 = Files.walk(var2, FileUtil.DEFAULT_WALK_TREE_OPTIONS_ARRAY)) {
var8.forEach(SneakyThrow.sneakyConsumer(var2x -> {
Path var3 = var2.relativize(var2x);
Path var4 = var6.resolve(var3.toString());
if (Files.isDirectory(var2x)) {
Files.createDirectories(var4);
} else {
if (Files.isRegularFile(var2x)) {
Files.copy(var2x, var4);
}
}
}));
}
this.getLogger()
.at(Level.INFO)
.log("Completed instance files for %s to world %s in %s", var1, var3, FormatUtil.nanosToString(System.nanoTime() - var6));
class="kw">return var4;
}
)
)
.thenCompose(var3x -> var5.makeWorld(var3, var6, var3x));
}
class="kw">public class="kw">static void teleportPlayerToLoadingInstance(
@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nonnull CompletableFuture<World> var2, @Nullable Transform var3
) {
teleportPlayerToLoadingInstance(var0, var1, var2, var3, null);
}
class="kw">public class="kw">static void teleportPlayerToLoadingInstance(
@Nonnull Ref<EntityStore> var0,
@Nonnull ComponentAccessor<EntityStore> var1,
@Nonnull CompletableFuture<World> var2,
@Nullable Transform var3,
@Nullable Transform var4
) {
World var5 = var1.getExternalData().getWorld();
TransformComponent var6 = var1.getComponent(var0, TransformComponent.getComponentType());
assert var6 != null;
Transform var7 = new Transform(var6.getTransform());
InstanceEntityConfig var8 = var1.getComponent(var0, InstanceEntityConfig.getComponentType());
if (var8 == null) {
var8 = var1.addComponent(var0, InstanceEntityConfig.getComponentType());
}
if (var3 != null) {
var8.setReturnPointOverride(makeWorldReturnPoint(var5, var3, false));
} else {
var8.setReturnPointOverride(null);
}
PlayerRef var9 = var1.getComponent(var0, PlayerRef.getComponentType());
assert var9 != null;
UUIDComponent var10 = var1.getComponent(var0, UUIDComponent.getComponentType());
assert var10 != null;
UUID var11 = var10.getUuid();
HeadRotation var12 = var1.getComponent(var0, HeadRotation.getComponentType());
if (var12 != null) {
var1.ensureAndGetComponent(var0, TeleportHistory.getComponentType())
.append(var5, new Vector3d(var7.getPosition()), var12.getRotation().clone(), "Instance");
}
InstanceEntityConfig var13 = var8;
Universe.transferPlayerAsync(var9, var5, var2, var2x -> {
if (var4 != null) {
class="kw">return var4;
}
ISpawnProvider var3 = var2x.getWorldConfig().getSpawnProvider();
class="kw">return var3 != null ? var3.getSpawnPoint(var2x, var11) : null;
}).whenComplete((var4x, var5x) -> {
if (var5x != null) {
((HytaleLogger.Api)get().getLogger().at(Level.SEVERE).withCause(var5x)).log("Failed to send %s to instance world", var9.getUsername());
var13.setReturnPointOverride(null);
}
if (var4x == null) {
if (var5.isAlive()) {
var5.addPlayer(var9, var7, Boolean.TRUE, Boolean.FALSE);
} else {
World var6 = Universe.get().getDefaultWorld();
if (var6 != null) {
var6.addPlayer(var9, null, Boolean.TRUE, Boolean.FALSE);
} else {
get().getLogger().at(Level.SEVERE).log("No fallback world for %s, disconnecting", var9.getUsername());
var9.getPacketHandler().disconnect(Message.translation("server.general.disconnect.teleportNoWorld"));
}
}
}
});
}
class="kw">public class="kw">static void teleportPlayerToInstance(
@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nonnull World var2, @Nullable Transform var3
) {
World var4 = var1.getExternalData().getWorld();
WorldConfig var5 = var4.getWorldConfig();
if (var3 != null) {
InstanceEntityConfig var6 = var1.ensureAndGetComponent(var0, InstanceEntityConfig.getComponentType());
var6.setReturnPointOverride(makeWorldReturnPoint(var4, var3, false));
}
UUIDComponent var14 = var1.getComponent(var0, UUIDComponent.getComponentType());
assert var14 != null;
UUID var7 = var14.getUuid();
WorldConfig var8 = var2.getWorldConfig();
ISpawnProvider var9 = var8.getSpawnProvider();
if (var9 == null) {
throw new IllegalStateException("Spawn provider cannot be null when teleporting player to instance!");
}
TransformComponent var10 = var1.getComponent(var0, TransformComponent.getComponentType());
HeadRotation var11 = var1.getComponent(var0, HeadRotation.getComponentType());
if (var10 != null && var11 != null) {
var1.ensureAndGetComponent(var0, TeleportHistory.getComponentType())
.append(var4, new Vector3d(var10.getPosition()), var11.getRotation().clone(), "Instance '" + var2.getName() + "'");
}
Transform var12 = var9.getSpawnPoint(var2, var7);
Teleport var13 = Teleport.createForPlayer(var2, var12);
var1.addComponent(var0, Teleport.getComponentType(), var13);
}
class="kw">public class="kw">static CompletableFuture<Void> exitInstance(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
World var2 = var1.getExternalData().getWorld();
InstanceEntityConfig var3 = var1.getComponent(var0, InstanceEntityConfig.getComponentType());
WorldReturnPoint var4 = var3 != null ? var3.getReturnPoint() : null;
if (var4 == null) {
WorldConfig var5 = var2.getWorldConfig();
InstanceWorldConfig var6 = InstanceWorldConfig.get(var5);
var4 = var6 != null ? var6.getReturnPoint() : null;
if (var4 == null) {
throw new IllegalArgumentException("Player is not in an instance");
}
}
Universe var12 = Universe.get();
World var13 = var12.getWorld(var4.getWorld());
if (var13 == null && var4.getInstanceName() != null && var4.getInstanceKey() != null) {
var13 = var12.getWorld(var4.getInstanceKey());
if (var13 == null) {
class="kw">return returnToRespawnedInstance(var0, var1, var3, var4);
}
}
while (var13 == null && var3 != null) {
WorldReturnPoint var7 = var3.popReturnPoint();
if (var7 == null) {
break;
}
var4 = var7;
var13 = var12.getWorld(var4.getWorld());
}
Transform var14 = var4.getReturnPoint();
if (var13 == null) {
var13 = var12.getDefaultWorld();
UUIDComponent var8 = var1.getComponent(var0, UUIDComponent.getComponentType());
ISpawnProvider var9 = var13 != null ? var13.getWorldConfig().getSpawnProvider() : null;
var14 = var9 != null && var8 != null ? var9.getSpawnPoint(var13, var8.getUuid()) : null;
if (var13 == null || var14 == null) {
throw new IllegalArgumentException("Missing class="kw">return world");
}
get().getLogger().at(Level.WARNING).log("Return world for instance '%s' is gone, sending the player to the class="kw">default world spawn", var2.getName());
}
TransformComponent var15 = var1.getComponent(var0, TransformComponent.getComponentType());
HeadRotation var16 = var1.getComponent(var0, HeadRotation.getComponentType());
if (var15 != null && var16 != null) {
var1.ensureAndGetComponent(var0, TeleportHistory.getComponentType())
.append(var2, new Vector3d(var15.getPosition()), var16.getRotation().clone(), "Instance '" + var2.getName() + "'");
}
Teleport var10 = Teleport.createForPlayer(var13, var14);
CompletableFuture var11 = new CompletableFuture<>();
var10.setOnComplete(var11);
var1.addComponent(var0, Teleport.getComponentType(), var10);
class="kw">return var11;
}
@Nonnull
class="kw">private class="kw">static WorldReturnPoint makeWorldReturnPoint(@Nonnull World var0, @Nonnull Transform var1, boolean var2) {
InstanceWorldConfig var3 = InstanceWorldConfig.get(var0.getWorldConfig());
boolean var4 = var3 != null && var3.shouldRespawnWhenTargeted() && var3.getInstanceKey() != null;
class="kw">return new WorldReturnPoint(var0.getWorldConfig().getUuid(), var1, var2, var4 ? var3.getInstanceName() : null, var4 ? var3.getInstanceKey() : null);
}
@Nonnull
class="kw">private class="kw">static CompletableFuture<Void> returnToRespawnedInstance(
@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable InstanceEntityConfig var2, @Nonnull WorldReturnPoint var3
) {
String var4 = var3.getInstanceName();
String var5 = var3.getInstanceKey();
assert var4 != null && var5 != null;
Universe var6 = Universe.get();
World var7 = null;
Transform var8 = null;
WorldReturnPoint var9;
if (var2 != null) {
while ((var9 = var2.popReturnPoint()) != null) {
World var10 = var6.getWorld(var9.getWorld());
if (var10 != null) {
var7 = var10;
var8 = var9.getReturnPoint();
break;
}
}
}
if (var7 == null || var8 == null) {
var7 = var6.getDefaultWorld();
UUIDComponent var11 = var1.getComponent(var0, UUIDComponent.getComponentType());
ISpawnProvider var13 = var7 != null ? var7.getWorldConfig().getSpawnProvider() : null;
var8 = var13 != null && var11 != null ? var13.getSpawnPoint(var7, var11.getUuid()) : null;
if (var7 == null || var8 == null) {
throw new IllegalArgumentException("Missing class="kw">return world");
}
}
CompletableFuture var12 = get().spawnInstance(var4, var5, var7, var8);
teleportPlayerToLoadingInstance(var0, var1, var12, null, var3.getReturnPoint());
class="kw">return var12.thenAccept(var0x -> {});
}
class="kw">public class="kw">static void safeRemoveInstance(@Nonnull String var0) {
safeRemoveInstance(Universe.get().getWorld(var0));
}
class="kw">public class="kw">static void safeRemoveInstance(@Nonnull UUID var0) {
safeRemoveInstance(Universe.get().getWorld(var0));
}
class="kw">public class="kw">static void safeRemoveInstance(@Nullable World var0) {
if (var0 != null) {
Store var1 = var0.getChunkStore().getStore();
var1.getResource(InstanceDataResource.getResourceType()).setHadPlayer(true);
WorldConfig var2 = var0.getWorldConfig();
InstanceWorldConfig var3 = InstanceWorldConfig.get(var2);
if (var3 != null) {
var3.setRemovalConditions(WorldEmptyCondition.REMOVE_WHEN_EMPTY);
}
var2.markChanged();
}
}
@Nonnull
class="kw">public class="kw">static Path getInstanceAssetPath(@Nonnull String var0) {
List var1 = AssetModule.get().getAssetPacks();
for (int var2 = var1.size() - 1; var2 >= 0; var2--) {
Path var3 = var1.get(var2).getRoot().resolve("Server").resolve("Instances");
Path var4 = PathUtil.resolvePathWithinDir(var3, var0);
if (var4 == null) {
throw new IllegalArgumentException("Invalid instance name");
}
if (Files.exists(var4)) {
class="kw">return var4;
}
}
Path var5 = AssetModule.get().getBaseAssetPack().getRoot().resolve("Server").resolve("Instances");
Path var6 = PathUtil.resolvePathWithinDir(var5, var0);
if (var6 == null) {
throw new IllegalArgumentException("Invalid instance name");
} else {
class="kw">return var6;
}
}
class="kw">public class="kw">static boolean doesInstanceAssetExist(@Nonnull String var0) {
class="kw">return Files.exists(getInstanceAssetPath(var0).resolve("instance.bson"));
}
@Nonnull
class="kw">public class="kw">static CompletableFuture<World> loadInstanceAssetForEdit(@Nonnull String var0) {
Path var1 = getInstanceAssetPath(var0);
Universe var2 = Universe.get();
class="kw">return WorldConfig.load(var1.resolve("instance.bson")).thenCompose(var3 -> {
var3.setUuid(UUID.randomUUID());
var3.setSavingPlayers(false);
var3.setIsAllNPCFrozen(true);
var3.setTicking(false);
var3.setGameMode(GameMode.Creative);
var3.setDeleteOnRemove(false);
InstanceWorldConfig.ensureAndGet(var3).setRemovalConditions(RemovalCondition.EMPTY);
var3.markChanged();
String var4 = "instance-edit-" + safeName(var0);
class="kw">return var2.makeWorld(var4, var1, var3);
});
}
@Nonnull
class="kw">public List<String> getInstanceAssets() {
class="kw">final List var1 = new ObjectArrayList();
for (AssetPack var3 : AssetModule.get().getAssetPacks()) {
class="kw">final Path var4 = var3.getRoot().resolve("Server").resolve("Instances");
if (Files.isDirectory(var4)) {
try {
Files.walkFileTree(var4, FileUtil.DEFAULT_WALK_TREE_OPTIONS_SET, Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
@Nonnull
class="kw">public FileVisitResult preVisitDirectory(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2) {
if (Files.exists(var1x.resolve("instance.bson"))) {
Path var3 = var4.relativize(var1x);
String var4x = var3.toString();
var1.add(var4x);
class="kw">return FileVisitResult.SKIP_SUBTREE;
} else {
class="kw">return FileVisitResult.CONTINUE;
}
}
});
} catch (IOException var6) {
throw SneakyThrow.sneakyThrow(var6);
}
}
}
class="kw">return var1;
}
class="kw">private class="kw">static void onPlayerConnect(@Nonnull PlayerConnectEvent var0) {
Holder var1 = var0.getHolder();
Player var2 = var1.getComponent(Player.getComponentType());
assert var2 != null;
PlayerConfigData var3 = var2.getPlayerConfigData();
InstanceEntityConfig var4 = InstanceEntityConfig.ensureAndGet(var1);
String var5 = var3.getWorld();
World var6 = Universe.get().getWorld(var5);
WorldReturnPoint var7 = var4.getReturnPoint();
if (var7 != null && (var6 == null || var7.isReturnOnReconnect())) {
var6 = Universe.get().getWorld(var7.getWorld());
if (var6 != null) {
Transform var8 = var7.getReturnPoint();
TransformComponent var9 = var1.ensureAndGetComponent(TransformComponent.getComponentType());
var9.setPosition(var8.getPosition());
float var10 = var8.getRotation().yaw();
if (Float.isFinite(var10)) {
Rotation3f var11 = new Rotation3f(var9.getRotation());
var11.setYaw(var10);
var9.setRotation(var11);
}
HeadRotation var13 = var1.ensureAndGetComponent(HeadRotation.getComponentType());
var13.teleportRotation(var8.getRotation());
}
} else if (var6 != null) {
var4.setReturnPointOverride(var4.getReturnPoint());
}
}
class="kw">private class="kw">static void onPlayerAddToWorld(@Nonnull AddPlayerToWorldEvent var0) {
Holder var1 = var0.getHolder();
InstanceWorldConfig var2 = InstanceWorldConfig.get(var0.getWorld().getWorldConfig());
if (var2 == null) {
InstanceEntityConfig var7 = var1.getComponent(InstanceEntityConfig.getComponentType());
if (var7 != null && var7.getReturnPoint() != null) {
var7.setReturnPoint(null);
var7.clearReturnStack();
}
} else {
InstanceEntityConfig var3 = InstanceEntityConfig.ensureAndGet(var1);
WorldReturnPoint var4;
if (var3.getReturnPointOverride() == null) {
var4 = var2.getReturnPoint();
} else {
var4 = var3.getReturnPointOverride();
var4.setReturnOnReconnect(var2.shouldPreventReconnection());
var3.setReturnPointOverride(null);
}
if (var4 != null) {
UUID var5 = var0.getWorld().getWorldConfig().getUuid();
var3.dropReturnsInto(var5);
WorldReturnPoint var6 = var3.getReturnPoint();
if (var6 != null && !var6.getWorld().equals(var4.getWorld()) && !var6.getWorld().equals(var5)) {
var3.pushReturnPoint(var6);
}
}
var3.setReturnPoint(var4);
}
}
class="kw">private class="kw">static void onPlayerReady(@Nonnull PlayerReadyEvent var0) {
Player var1 = var0.getPlayer();
World var2 = var1.getWorld();
if (var2 != null) {
WorldConfig var3 = var2.getWorldConfig();
InstanceWorldConfig var4 = InstanceWorldConfig.get(var3);
if (var4 != null) {
InstanceDiscoveryConfig var5 = var4.getDiscovery();
if (var5 != null) {
PlayerConfigData var6 = var1.getPlayerConfigData();
UUID var7 = var3.getUuid();
if (var5.alwaysDisplay() || !var6.getDiscoveredInstances().contains(var7)) {
Set var8 = new HashSet<>(var6.getDiscoveredInstances());
var8.add(var7);
var6.setDiscoveredInstances(var8);
Ref var9 = var0.getPlayerRef();
if (var9.isValid()) {
var2.execute(() -> {
Store var4 = var2.getEntityStore().getStore();
showInstanceDiscovery(var9, var4, var7, var5);
});
}
}
}
}
}
}
class="kw">private class="kw">static void showInstanceDiscovery(
@Nonnull Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1, @Nonnull UUID var2, @Nonnull InstanceDiscoveryConfig var3
) {
DiscoverInstanceEvent.Display var4 = new DiscoverInstanceEvent.Display(var2, var3.clone());
var1.invoke(var0, var4);
var3 = var4.getDiscoveryConfig();
if (!var4.isCancelled() && var4.shouldDisplay()) {
PlayerRef var5 = var1.getComponent(var0, PlayerRef.getComponentType());
if (var5 != null) {
String var6 = var3.getSubtitleKey();
Message var7 = var6 != null ? Message.translation(var6) : Message.empty();
EventTitleUtil.showEventTitleToPlayer(
var5,
Message.translation(var3.getTitleKey()),
var7,
var3.isMajor(),
var3.getIcon(),
var3.getDuration(),
var3.getFadeInDuration(),
var3.getFadeOutDuration()
);
String var8 = var3.getDiscoverySoundEventId();
if (var8 != null) {
int var9 = SoundEvent.getAssetMap().getIndex(var8);
if (var9 != Integer.MIN_VALUE) {
SoundUtil.playSoundEvent2d(var0, var9, SoundCategory.UI, var1);
}
}
}
}
}
class="kw">private class="kw">static void onPlayerDrainFromWorld(@Nonnull DrainPlayerFromWorldEvent var0) {
InstanceEntityConfig var1 = InstanceEntityConfig.removeAndGet(var0.getHolder());
if (var1 != null) {
WorldReturnPoint var2 = var1.getReturnPoint();
if (var2 != null) {
World var3 = Universe.get().getWorld(var2.getWorld());
if (var3 != null) {
var0.setWorld(var3);
var0.setTransform(var2.getReturnPoint());
}
}
}
}
class="kw">private void validateInstanceAssets(@Nonnull LoadAssetEvent var1) {
Path var2 = AssetModule.get().getBaseAssetPack().getRoot().resolve("Server").resolve("Instances");
if (Options.getOptionSet().has(Options.VALIDATE_ASSETS) && Files.isDirectory(var2) && !var1.isShouldShutdown()) {
StringBuilder var3 = new StringBuilder();
for (String var6 : this.getInstanceAssets()) {
StringBuilder var7 = new StringBuilder();
Path var8 = getInstanceAssetPath(var6);
Universe var9 = Universe.get();
WorldConfig var10 = WorldConfig.load(var8.resolve("instance.bson")).join();
IChunkStorageProvider var11 = var10.getChunkStorageProvider();
var10.setChunkStorageProvider(new MigrationChunkStorageProvider(new IChunkStorageProvider[]{var11}, EmptyChunkStorageProvider.INSTANCE));
var10.setResourceStorageProvider(EmptyResourceStorageProvider.INSTANCE);
var10.setUuid(UUID.randomUUID());
var10.setSavingPlayers(false);
var10.setIsAllNPCFrozen(true);
var10.setSavingConfig(false);
var10.setTicking(false);
var10.setGameMode(GameMode.Creative);
var10.setDeleteOnRemove(false);
var10.setCompassUpdating(false);
InstanceWorldConfig.ensureAndGet(var10).setRemovalConditions(RemovalCondition.EMPTY);
var10.markChanged();
String var12 = "instance-validate-" + safeName(var6);
try {
World var13 = var9.makeWorld(var12, var8, var10, false).join();
EnumSet var14 = EnumSet.of(ValidationOption.BLOCK_STATES, ValidationOption.BLOCKS);
var13.validate(var7, WorldValidationUtil.blockValidator(var7, var14), var14);
} catch (Exception var18) {
var7.append("\t").append(var18.getMessage());
((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var18)).log("Failed to validate: %s", var6);
} class="kw">finally {
if (!var7.isEmpty()) {
var3.append("Instance: ").append(var6).append('\n').append(var7).append('\n');
}
}
if (var9.getWorld(var12) != null) {
var9.removeWorld(var12);
}
}
if (!var3.isEmpty()) {
this.getLogger().at(Level.SEVERE).log("Failed to validate instances:\n%s", var3);
var1.failed(true, "failed to validate instances");
}
HytaleLogger.getLogger()
.at(Level.INFO)
.log("Loading Instance assets phase completed! Boot time %s", FormatUtil.nanosToString(System.nanoTime() - var1.getBootStart()));
}
}
@Nonnull
class="kw">public class="kw">static String safeName(@Nonnull String var0) {
class="kw">return var0.replace('/', '-');
}
@Nonnull
class="kw">public ResourceType<ChunkStore, InstanceDataResource> getInstanceDataResourceType() {
class="kw">return this.instanceDataResourceType;
}
@Nonnull
class="kw">public ComponentType<EntityStore, InstanceEntityConfig> getInstanceEntityConfigComponentType() {
class="kw">return this.instanceEntityConfigComponentType;
}
@Nonnull
class="kw">public ComponentType<ChunkStore, InstanceBlock> getInstanceBlockComponentType() {
class="kw">return this.instanceBlockComponentType;
}
@Nonnull
class="kw">public ComponentType<ChunkStore, ConfigurableInstanceBlock> getConfigurableInstanceBlockComponentType() {
class="kw">return this.configurableInstanceBlockComponentType;
}
}