PluginBase class

Пакет: com.hypixel.hytale.server.core.plugin

Файл: com/hypixel/hytale/server/core/plugin/PluginBase.java

implements: CommandOwner

Поля (10)

МодификаторыТипИмя
CompletableFuture[] var1
PluginManifest var2
IRegistry var2
IRegistry var2
IRegistry var2
String var3
Config var3
boolean var4
PluginIdentifier var4
String var5

Методы (17)

МодификаторыВозвратСигнатура
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Must be called before setup")
void cleanupvoid cleanup(boolean var1)
abstract for for(int var2 = 0; var2 < this.configs.size()
Throwable getFailureCauseThrowable getFailureCause()
if if(this.state != PluginState.NONE)
if if(this.state != PluginState.NONE && this.state != PluginState.DISABLED)
if if(this.state != PluginState.SETUP)
if if(this.failureCause == null)
public boolean isDisabledboolean isDisabled()
public boolean isEnabledboolean isEnabled()
void setFailureCausevoid setFailureCause(Throwable var1)
protected void setupvoid setup()
final void setup0void setup0()
protected void shutdownvoid shutdown()
final void shutdown0void shutdown0(boolean var1)
protected void startvoid start()
final void start0void start0()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.plugin;

class="kw">import com.hypixel.hytale.assetstore.JsonAsset;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetCodecMapCodec;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.EnumCodec;
class="kw">import com.hypixel.hytale.codec.lookup.MapKeyMapCodec;
class="kw">import com.hypixel.hytale.codec.lookup.StringCodecMapCodec;
class="kw">import com.hypixel.hytale.common.plugin.PluginIdentifier;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
class="kw">import com.hypixel.hytale.event.EventRegistry;
class="kw">import com.hypixel.hytale.function.consumer.BooleanConsumer;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.metrics.MetricProvider;
class="kw">import com.hypixel.hytale.metrics.MetricsRegistry;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandOwner;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandRegistry;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityRegistry;
class="kw">import com.hypixel.hytale.server.core.plugin.registry.AssetRegistry;
class="kw">import com.hypixel.hytale.server.core.plugin.registry.CodecMapRegistry;
class="kw">import com.hypixel.hytale.server.core.plugin.registry.IRegistry;
class="kw">import com.hypixel.hytale.server.core.plugin.registry.MapKeyMapRegistry;
class="kw">import com.hypixel.hytale.server.core.registry.ClientFeatureRegistry;
class="kw">import com.hypixel.hytale.server.core.schema.SchemaGenerator;
class="kw">import com.hypixel.hytale.server.core.task.TaskRegistry;
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.util.Config;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.CopyOnWriteArrayList;
class="kw">import java.util.function.Function;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">abstract class PluginBase class="kw">implements CommandOwner {
   @Nonnull
   class="kw">public class="kw">static class="kw">final MetricsRegistry<PluginBase> METRICS_REGISTRY = new MetricsRegistry<>(MetricProvider.maybe(Function.identity()))
      .register("Identifier", var0 -> var0.identifier.toString(), Codec.STRING)
      .register("Type", PluginBase::getType, new EnumCodec<>(PluginType.class))
      .register("Manifest", var0 -> var0.manifest, PluginManifest.CODEC)
      .register("State", var0 -> var0.state, new EnumCodec<>(PluginState.class))
      .register("Builtin", var0 -> var0 class="kw">instanceof JavaPlugin var1 && var1.getClassLoader().isInServerClassPath(), Codec.BOOLEAN);
   @Nonnull
   class="kw">private class="kw">final HytaleLogger logger;
   @Nonnull
   class="kw">private class="kw">final PluginIdentifier identifier;
   @Nonnull
   class="kw">private class="kw">final PluginManifest manifest;
   @Nonnull
   class="kw">private class="kw">final Path dataDirectory;
   @Nonnull
   class="kw">private class="kw">final List<Config<?>> configs = new CopyOnWriteArrayList<>();
   @Nonnull
   class="kw">private PluginState state = PluginState.NONE;
   class="kw">private class="kw">final String notEnabledString = "The plugin " + this.getIdentifier() + " is not enabled!";
   @Nonnull
   class="kw">private class="kw">final CopyOnWriteArrayList<BooleanConsumer> shutdownTasks = new CopyOnWriteArrayList<>();
   class="kw">private class="kw">final ClientFeatureRegistry clientFeatureRegistry = new ClientFeatureRegistry(
      this.shutdownTasks, () -> this.state != PluginState.NONE && this.state != PluginState.DISABLED, this.notEnabledString, this
   );
   class="kw">private class="kw">final CommandRegistry commandRegistry = new CommandRegistry(
      this.shutdownTasks, () -> this.state != PluginState.NONE && this.state != PluginState.DISABLED, this.notEnabledString, this
   );
   class="kw">private class="kw">final EventRegistry eventRegistry = new EventRegistry(
      this.shutdownTasks, () -> this.state != PluginState.NONE && this.state != PluginState.DISABLED, this.notEnabledString, HytaleServer.get().getEventBus()
   );
   class="kw">private class="kw">final EntityRegistry entityRegistry = new EntityRegistry(
      this.shutdownTasks, () -> this.state != PluginState.NONE && this.state != PluginState.DISABLED, this.notEnabledString
   );
   class="kw">private class="kw">final TaskRegistry taskRegistry = new TaskRegistry(
      this.shutdownTasks, () -> this.state != PluginState.NONE && this.state != PluginState.DISABLED, this.notEnabledString
   );
   class="kw">private class="kw">final ComponentRegistryProxy<EntityStore> entityStoreRegistry = new ComponentRegistryProxy<>(this.shutdownTasks, EntityStore.REGISTRY);
   class="kw">private class="kw">final ComponentRegistryProxy<ChunkStore> chunkStoreRegistry = new ComponentRegistryProxy<>(this.shutdownTasks, ChunkStore.REGISTRY);
   class="kw">private class="kw">final AssetRegistry assetRegistry = new AssetRegistry(this.shutdownTasks);
   class="kw">private class="kw">final Map<Codec<?>, IRegistry> codecMapRegistries = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">private class="kw">final String basePermission;
   class="kw">private Throwable failureCause;

   class="kw">public PluginBase(@Nonnull PluginInit var1) {
      PluginManifest var2 = var1.getPluginManifest();
      String var3 = var2.getName();
      boolean var4 = this.getType() == PluginType.PLUGIN;
      this.logger = HytaleLogger.get(var3 + (var4 ? "|P" : "|A"));
      this.dataDirectory = var1.getDataDirectory();
      this.identifier = new PluginIdentifier(var2);
      this.manifest = var2;
      if (!var1.isInServerClassPath()) {
         this.logger.setPropagatesSentryToParent(false);
      }

      this.basePermission = createBasePermission(var2);
   }

   @Nonnull
   class="kw">static String createBasePermission(@Nonnull PluginManifest var0) {
      class="kw">return (var0.getGroup() + "." + var0.getName()).toLowerCase(Locale.ROOT).replace(' ', '_');
   }

   @Nonnull
   class="kw">protected class="kw">final <T> Config<T> withConfig(@Nonnull BuilderCodec<T> var1) {
      class="kw">return this.withConfig("config", var1);
   }

   @Nonnull
   class="kw">protected class="kw">final <T> Config<T> withConfig(@Nonnull String var1, @Nonnull BuilderCodec<T> var2) {
      if (this.state != PluginState.NONE) {
         throw new IllegalStateException("Must be called before setup");
      }

      Config var3 = new Config<>(this.dataDirectory, var1, var2);
      this.configs.add(var3);
      PluginIdentifier var4 = this.getIdentifier();
      String var5 = "Plugin." + var4.getGroup() + "." + var4.getName() + "." + var1;
      SchemaGenerator.registerConfig(var5, var2, "Config/Plugin/" + var4.getGroup() + "/" + var4.getName(), null);
      class="kw">return var3;
   }

   @Nullable
   class="kw">public CompletableFuture<Void> preLoad() {
      if (this.configs.isEmpty()) {
         class="kw">return null;
      }

      CompletableFuture[] var1 = new CompletableFuture[this.configs.size()];

      for (int var2 = 0; var2 < this.configs.size(); var2++) {
         var1[var2] = this.configs.get(var2).load();
      }

      class="kw">return CompletableFuture.allOf(var1);
   }

   @Nonnull
   @Override
   class="kw">public String getName() {
      class="kw">return this.identifier.toString();
   }

   @Nonnull
   class="kw">public HytaleLogger getLogger() {
      class="kw">return this.logger;
   }

   @Nonnull
   class="kw">public PluginIdentifier getIdentifier() {
      class="kw">return this.identifier;
   }

   @Nonnull
   class="kw">public PluginManifest getManifest() {
      class="kw">return this.manifest;
   }

   @Nonnull
   class="kw">public Path getDataDirectory() {
      class="kw">return this.dataDirectory;
   }

   @Nonnull
   class="kw">public PluginState getState() {
      class="kw">return this.state;
   }

   @Nonnull
   class="kw">public ClientFeatureRegistry getClientFeatureRegistry() {
      class="kw">return this.clientFeatureRegistry;
   }

   @Nonnull
   class="kw">public CommandRegistry getCommandRegistry() {
      class="kw">return this.commandRegistry;
   }

   @Nonnull
   class="kw">public EventRegistry getEventRegistry() {
      class="kw">return this.eventRegistry;
   }

   @Nonnull
   class="kw">public EntityRegistry getEntityRegistry() {
      class="kw">return this.entityRegistry;
   }

   @Nonnull
   class="kw">public TaskRegistry getTaskRegistry() {
      class="kw">return this.taskRegistry;
   }

   @Nonnull
   class="kw">public ComponentRegistryProxy<EntityStore> getEntityStoreRegistry() {
      class="kw">return this.entityStoreRegistry;
   }

   @Nonnull
   class="kw">public ComponentRegistryProxy<ChunkStore> getChunkStoreRegistry() {
      class="kw">return this.chunkStoreRegistry;
   }

   @Nonnull
   class="kw">public AssetRegistry getAssetRegistry() {
      class="kw">return this.assetRegistry;
   }

   @Nonnull
   class="kw">public <T, C class="kw">extends Codec<? class="kw">extends T>> CodecMapRegistry<T, C> getCodecRegistry(@Nonnull StringCodecMapCodec<T, C> var1) {
      IRegistry var2 = this.codecMapRegistries.computeIfAbsent(var1, var2x -> new CodecMapRegistry<>(this.shutdownTasks, var1));
      class="kw">return (CodecMapRegistry<T, C>)var2;
   }

   @Nonnull
   class="kw">public <K, T class="kw">extends JsonAsset<K>> CodecMapRegistry.Assets<T, ?> getCodecRegistry(@Nonnull AssetCodecMapCodec<K, T> var1) {
      IRegistry var2 = this.codecMapRegistries.computeIfAbsent(var1, var2x -> new CodecMapRegistry.Assets<>(this.shutdownTasks, var1));
      class="kw">return (CodecMapRegistry.Assets<T, ?>)var2;
   }

   @Nonnull
   class="kw">public <V> MapKeyMapRegistry<V> getCodecRegistry(@Nonnull MapKeyMapCodec<V> var1) {
      IRegistry var2 = this.codecMapRegistries.computeIfAbsent(var1, var2x -> new MapKeyMapRegistry<>(this.shutdownTasks, var1));
      class="kw">return (MapKeyMapRegistry<V>)var2;
   }

   @Nonnull
   class="kw">public class="kw">final String getBasePermission() {
      class="kw">return this.basePermission;
   }

   class="kw">public boolean isDisabled() {
      class="kw">return this.state == PluginState.NONE || this.state == PluginState.DISABLED || this.state == PluginState.SHUTDOWN || this.state == PluginState.FAILED;
   }

   class="kw">public boolean isEnabled() {
      class="kw">return !this.isDisabled();
   }

   class="kw">protected class="kw">final void setup0() {
      if (this.state != PluginState.NONE && this.state != PluginState.DISABLED) {
         throw new IllegalArgumentException(String.valueOf(this.state));
      }

      this.state = PluginState.SETUP;

      try {
         this.setup();
      } catch (Throwable var2) {
         ((HytaleLogger.Api)this.logger.at(Level.SEVERE).withCause(var2)).log("Failed to setup plugin %s", this.identifier);
         this.state = PluginState.FAILED;
         this.failureCause = var2;
      }
   }

   class="kw">protected void setup() {
   }

   class="kw">protected class="kw">final void start0() {
      if (this.state != PluginState.SETUP) {
         throw new IllegalArgumentException(String.valueOf(this.state));
      }

      this.state = PluginState.START;

      try {
         this.start();
         this.state = PluginState.ENABLED;
      } catch (Throwable var2) {
         ((HytaleLogger.Api)this.logger.at(Level.SEVERE).withCause(var2)).log("Failed to start %s", this.identifier);
         this.state = PluginState.FAILED;
         this.failureCause = var2;
      }
   }

   class="kw">protected void start() {
   }

   class="kw">protected class="kw">final void shutdown0(boolean var1) {
      this.state = PluginState.SHUTDOWN;

      try {
         this.shutdown();
         this.state = this.failureCause == null ? PluginState.DISABLED : PluginState.FAILED;
      } catch (Throwable var3) {
         ((HytaleLogger.Api)this.logger.at(Level.SEVERE).withCause(var3)).log("Failed to shutdown %s", this.identifier);
         this.state = PluginState.FAILED;
         if (this.failureCause == null) {
            this.failureCause = var3;
         }
      }

      this.cleanup(var1);
   }

   class="kw">protected void shutdown() {
   }

   void cleanup(boolean var1) {
      this.commandRegistry.shutdown();
      this.eventRegistry.shutdown();
      this.clientFeatureRegistry.shutdown();
      this.taskRegistry.shutdown();
      this.entityStoreRegistry.shutdown();
      this.chunkStoreRegistry.shutdown();
      this.codecMapRegistries.forEach((var0, var1x) -> var1x.shutdown());
      this.assetRegistry.shutdown();

      for (int var2 = this.shutdownTasks.size() - 1; var2 >= 0; var2--) {
         this.shutdownTasks.get(var2).accept(var1);
      }
   }

   Throwable getFailureCause() {
      class="kw">return this.failureCause;
   }

   void setFailureCause(Throwable var1) {
      this.failureCause = var1;
   }

   @Nonnull
   class="kw">public class="kw">abstract PluginType getType();
}