DelayedEffectScheduler class

Пакет: com.hypixel.hytale.builtin.triggervolumes.system

Файл: com/hypixel/hytale/builtin/triggervolumes/system/DelayedEffectScheduler.java

Поля (17)

МодификаторыТипИмя
long var11
long var13
Ref var15
Vector3d var16
List var17
Vector3d var18
String var19
TransformComponent var2
long var2
InteractionType var20
DelayedEffectScheduler.ScheduledItem var4
Iterator var4
List var4
boolean var5
var5
DelayedEffectScheduler.ScheduledItem var5
TriggerContext var5

Методы (25)

МодификаторыВозвратСигнатура
public void cancelForEntityvoid cancelForEntity(@Nonnull UUID var1)
public void cancelForVolumevoid cancelForVolume(@Nonnull VolumeEntry var1)
public void cancelGatesvoid cancelGates(@Nonnull UUID var1, @Nonnull Object var2)
private void cancelIfvoid cancelIf(@Nonnull Predicate<DelayedEffectScheduler.ScheduledItem> var1)
public void cancelNonExitForEntityInVolumevoid cancelNonExitForEntityInVolume(@Nonnull UUID var1, @Nonnull VolumeEntry var2)
default int compareTodefault int compareTo(@Nonnull DelayedEffectScheduler.ScheduledItem var1)
abstract Ref<EntityStore> entityRefRef<EntityStore> entityRef()
abstract UUID entityUuidUUID entityUuid()
abstract TriggerEventType eventTypeTriggerEventType eventType()
public boolean executepublic boolean execute(@Nonnull Store<EntityStore> var1, long var2)
public boolean executepublic boolean execute(@Nonnull Store<EntityStore> var1, long var2)
abstract void executevoid execute(@Nonnull Ref<EntityStore> var1, @Nonnull UUID var2, @Nonnull TriggerEventType var3, @Nonnull VolumeEntry var4, @Nullable List<VolumeEntry> var5, @Nonnull Store<EntityStore> var6, long var7)
abstract boolean executeboolean execute(@Nonnull Store<EntityStore> var1, long var2)
abstract long executeAtNanoslong executeAtNanos()
if if(var4 != null)
if if(this.callback != null)
public boolean isEmptyboolean isEmpty()
public void onFinishedpublic void onFinished(boolean var1, long var2)
default void onFinisheddefault void onFinished(boolean var1, long var2)
abstract void onFinishedvoid onFinished(boolean var1, long var2)
public void schedulevoid schedule(@Nonnull TriggerEffect var1, @Nullable Ref<EntityStore> var2, @Nonnull UUID var3, @Nonnull TriggerEventType var4, @Nonnull VolumeEntry var5, long var6, float var8, @Nullable List<VolumeEntry> var9, @Nullable DelayedEffectScheduler.ScheduledEffectCallback var10, @Nonnull Store<EntityStore> var11, @Nullable TriggerVolumeManager.PendingTriggerEvent var12)
public void scheduleGatevoid scheduleGate(@Nonnull DelayedEffectScheduler.ScheduledGateAction var1, @Nonnull Ref<EntityStore> var2, @Nonnull UUID var3, @Nonnull TriggerEventType var4, @Nonnull VolumeEntry var5, long var6, float var8, @Nullable List<VolumeEntry> var9)
public void scheduleGatevoid scheduleGate(@Nonnull DelayedEffectScheduler.ScheduledGateAction var1, @Nonnull Ref<EntityStore> var2, @Nonnull UUID var3, @Nonnull TriggerEventType var4, @Nonnull VolumeEntry var5, long var6, float var8, @Nullable List<VolumeEntry> var9, @Nullable Object var10)
public void tickvoid tick(long var1, @Nonnull Store<EntityStore> var3)
abstract VolumeEntry volumeVolumeEntry volume()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.system;

class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.SignalTag;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerContext;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEffect;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEventType;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.TriggerVolumeManager;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.VolumeEntry;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.PriorityQueue;
class="kw">import java.util.UUID;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class DelayedEffectScheduler {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">final PriorityQueue<DelayedEffectScheduler.ScheduledItem> queue = new PriorityQueue<>();

   class="kw">public DelayedEffectScheduler() {
   }

   class="kw">public void schedule(
      @Nonnull TriggerEffect var1,
      @Nullable Ref<EntityStore> var2,
      @Nonnull UUID var3,
      @Nonnull TriggerEventType var4,
      @Nonnull VolumeEntry var5,
      long var6,
      float var8,
      @Nullable List<VolumeEntry> var9,
      @Nullable DelayedEffectScheduler.ScheduledEffectCallback var10,
      @Nonnull Store<EntityStore> var11,
      @Nullable TriggerVolumeManager.PendingTriggerEvent var12
   ) {
      long var13 = var6 + (long)(var8 * 1.0E9F);
      Ref var15 = var5.getProjectileSource().resolveActorRef(var2, var11);
      Vector3d var16 = captureActorPosition(var15, var11);
      List var17 = var12 != null ? var12.signalTags() : List.of();
      Vector3d var18 = var12 != null ? var12.blockPosition() : null;
      String var19 = var12 != null ? var12.blockId() : null;
      InteractionType var20 = var12 != null ? var12.interactionType() : null;
      this.queue.add(new DelayedEffectScheduler.ScheduledEffect(var13, var1, var2, var15, var16, var3, var4, var5, var9, var17, var18, var19, var20, var10));
   }

   @Nullable
   class="kw">private class="kw">static Vector3d captureActorPosition(@Nullable Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1) {
      if (var0 != null && var0.isValid()) {
         TransformComponent var2 = var1.getComponent(var0, TransformComponent.getComponentType());
         class="kw">return var2 != null ? new Vector3d(var2.getPosition()) : null;
      } else {
         class="kw">return null;
      }
   }

   class="kw">public void scheduleGate(
      @Nonnull DelayedEffectScheduler.ScheduledGateAction var1,
      @Nonnull Ref<EntityStore> var2,
      @Nonnull UUID var3,
      @Nonnull TriggerEventType var4,
      @Nonnull VolumeEntry var5,
      long var6,
      float var8,
      @Nullable List<VolumeEntry> var9
   ) {
      this.scheduleGate(var1, var2, var3, var4, var5, var6, var8, var9, null);
   }

   class="kw">public void scheduleGate(
      @Nonnull DelayedEffectScheduler.ScheduledGateAction var1,
      @Nonnull Ref<EntityStore> var2,
      @Nonnull UUID var3,
      @Nonnull TriggerEventType var4,
      @Nonnull VolumeEntry var5,
      long var6,
      float var8,
      @Nullable List<VolumeEntry> var9,
      @Nullable Object var10
   ) {
      long var11 = var6 + (long)(var8 * 1.0E9F);
      this.queue.add(new DelayedEffectScheduler.ScheduledGate(var11, var1, var2, var3, var4, var5, var9, var10));
   }

   class="kw">public void tick(long var1, @Nonnull Store<EntityStore> var3) {
      while (!this.queue.isEmpty() && this.queue.peek().executeAtNanos() <= var1) {
         DelayedEffectScheduler.ScheduledItem var4 = this.queue.poll();
         if (var4 != null) {
            boolean var5 = false;

            try {
               if (!var4.volume().isPendingDestroy()) {
                  var5 = var4.execute(var3, var1);
               }
            } catch (Throwable var10) {
               ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var10))
                  .log("Error executing scheduled trigger item on volume '%s'", var4.volume().getId());
            } class="kw">finally {
               var4.onFinished(var5, var1);
            }
         }
      }
   }

   class="kw">public void cancelForEntity(@Nonnull UUID var1) {
      this.cancelIf(var1x -> var1x.entityUuid().equals(var1));
   }

   class="kw">public void cancelNonExitForEntityInVolume(@Nonnull UUID var1, @Nonnull VolumeEntry var2) {
      this.cancelIf(var2x -> var2x.entityUuid().equals(var1) && var2x.volume() == var2 && var2x.eventType() != TriggerEventType.EXIT);
   }

   class="kw">public void cancelForVolume(@Nonnull VolumeEntry var1) {
      this.cancelIf(var1x -> var1x.volume() == var1);
   }

   class="kw">public void cancelGates(@Nonnull UUID var1, @Nonnull Object var2) {
      this.cancelIf(var2x -> var2x class="kw">instanceof DelayedEffectScheduler.ScheduledGate var3 && var3.entityUuid().equals(var1) && var2.equals(var3.gateKey()));
   }

   class="kw">public boolean isEmpty() {
      class="kw">return this.queue.isEmpty();
   }

   class="kw">private void cancelIf(@Nonnull Predicate<DelayedEffectScheduler.ScheduledItem> var1) {
      long var2 = System.nanoTime();
      Iterator var4 = this.queue.iterator();

      while (var4.hasNext()) {
         DelayedEffectScheduler.ScheduledItem var5 = var4.next();
         if (var1.test(var5)) {
            var4.remove();
            var5.onFinished(false, var2);
         }
      }
   }

   class="kw">private record ScheduledEffect(
      long executeAtNanos,
      @Nonnull TriggerEffect effect,
      @Nullable Ref<EntityStore> entityRef,
      @Nullable Ref<EntityStore> actorRef,
      @Nullable Vector3d actorPosition,
      @Nonnull UUID entityUuid,
      @Nonnull TriggerEventType eventType,
      @Nonnull VolumeEntry volume,
      @Nullable List<VolumeEntry> spatialVolumes,
      @Nonnull List<SignalTag> signalTags,
      @Nullable Vector3d blockPosition,
      @Nullable String blockId,
      @Nullable InteractionType interactionType,
      @Nullable DelayedEffectScheduler.ScheduledEffectCallback callback
   ) class="kw">implements DelayedEffectScheduler.ScheduledItem {
      class="kw">private ScheduledEffect {
      }

      @Override
      class="kw">public boolean execute(@Nonnull Store<EntityStore> var1, long var2) {
         try {
            List var4 = this.spatialVolumes != null ? this.spatialVolumes : List.of(this.volume);
            TriggerContext var5 = new TriggerContext(
               this.actorRef,
               var1,
               this.eventType,
               this.volume,
               var4,
               this.actorPosition,
               this.signalTags,
               this.blockPosition,
               this.blockId,
               this.interactionType
            );
            this.effect.execute(var5);
            class="kw">return true;
         } catch (Throwable var6) {
            ((HytaleLogger.Api)DelayedEffectScheduler.LOGGER.at(Level.WARNING).withCause(var6))
               .log("Error executing delayed effect %s on volume '%s'", this.effect.getClass().getSimpleName(), this.volume.getId());
            class="kw">return false;
         }
      }

      @Override
      class="kw">public void onFinished(boolean var1, long var2) {
         if (this.callback != null) {
            try {
               this.callback.onFinished(var1, var2);
            } catch (Exception var5) {
               ((HytaleLogger.Api)DelayedEffectScheduler.LOGGER.at(Level.WARNING).withCause(var5))
                  .log("Error finishing delayed effect %s on volume '%s'", this.effect.getClass().getSimpleName(), this.volume.getId());
            }
         }
      }
   }

   class="kw">public class="kw">interface ScheduledEffectCallback {
      void onFinished(boolean var1, long var2);
   }

   class="kw">private record ScheduledGate(
      long executeAtNanos,
      @Nonnull DelayedEffectScheduler.ScheduledGateAction action,
      @Nonnull Ref<EntityStore> entityRef,
      @Nonnull UUID entityUuid,
      @Nonnull TriggerEventType eventType,
      @Nonnull VolumeEntry volume,
      @Nullable List<VolumeEntry> spatialVolumes,
      @Nullable Object gateKey
   ) class="kw">implements DelayedEffectScheduler.ScheduledItem {
      class="kw">private ScheduledGate {
      }

      @Override
      class="kw">public boolean execute(@Nonnull Store<EntityStore> var1, long var2) {
         this.action.execute(this.entityRef, this.entityUuid, this.eventType, this.volume, this.spatialVolumes, var1, var2);
         class="kw">return true;
      }
   }

   class="kw">public class="kw">interface ScheduledGateAction {
      void execute(
         @Nonnull Ref<EntityStore> var1,
         @Nonnull UUID var2,
         @Nonnull TriggerEventType var3,
         @Nonnull VolumeEntry var4,
         @Nullable List<VolumeEntry> var5,
         @Nonnull Store<EntityStore> var6,
         long var7
      );
   }

   class="kw">private class="kw">interface ScheduledItem class="kw">extends Comparable<DelayedEffectScheduler.ScheduledItem> {
      long executeAtNanos();

      @Nullable
      Ref<EntityStore> entityRef();

      @Nonnull
      UUID entityUuid();

      @Nonnull
      VolumeEntry volume();

      @Nonnull
      TriggerEventType eventType();

      boolean execute(@Nonnull Store<EntityStore> var1, long var2);

      class="kw">default void onFinished(boolean var1, long var2) {
      }

      class="kw">default int compareTo(@Nonnull DelayedEffectScheduler.ScheduledItem var1) {
         class="kw">return Long.compare(this.executeAtNanos(), var1.executeAtNanos());
      }
   }
}