EventDispatcher interface
Пакет: com.hypixel.hytale.builtin.triggervolumes.system
Файл: com/hypixel/hytale/builtin/triggervolumes/system/TriggerVolumeTickingSystem.java
Методы (1)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
void |
dispatchvoid dispatch(@Nonnull TriggerEventType var1, @Nonnull VolumeEntry var2, @Nonnull Ref<EntityStore> var3, @Nonnull UUID var4) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.system;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.EntityTargetType;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.component.IgnoreTriggerVolumes;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerCondition;
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.event.TriggerVolumeEvent;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.ConditionTiming;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.GroupEntry;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.RejectionDelayMode;
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.builtin.triggervolumes.shape.TriggerVolumeShape;
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.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.Order;
class="kw">import com.hypixel.hytale.component.dependency.OrderPriority;
class="kw">import com.hypixel.hytale.component.dependency.SystemDependency;
class="kw">import com.hypixel.hytale.component.spatial.SpatialData;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.component.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.event.IEventDispatcher;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.ProjectileComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.system.PlayerSpatialSystem;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.component.Projectile;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.TickSuppressionRegistry;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkFlag;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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 it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import java.time.Instant;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collections;
class="kw">import java.util.HashMap;
class="kw">import java.util.HashSet;
class="kw">import java.util.IdentityHashMap;
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.Map.Entry;
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 TriggerVolumeTickingSystem class="kw">extends TickingSystem<EntityStore> {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final double DEFAULT_ENTITY_HEIGHT = 1.8;
class="kw">private class="kw">static class="kw">final int MAX_PENDING_EVENTS_PER_TICK = 64;
class="kw">private class="kw">static class="kw">final int[] SINGLE_DEFAULT_ENTRY = new int[]{0};
@Nonnull
class="kw">private class="kw">static class="kw">final ThreadLocal<Set<UUID>> THREAD_LOCAL_PREVIOUS = ThreadLocal.withInitial(HashSet::new);
@Nonnull
class="kw">private class="kw">static class="kw">final ThreadLocal<Map<UUID, Ref<EntityStore>>> THREAD_LOCAL_PREVIOUS_REFS = ThreadLocal.withInitial(HashMap::new);
@Nonnull
class="kw">private class="kw">static class="kw">final ThreadLocal<Vector3d> THREAD_LOCAL_TEST_POINT = ThreadLocal.withInitial(Vector3d::new);
@Nonnull
class="kw">private class="kw">static class="kw">final ThreadLocal<List<VolumeEntry>> THREAD_LOCAL_CANDIDATES = ThreadLocal.withInitial(ArrayList::new);
@Nonnull
class="kw">private class="kw">static class="kw">final ThreadLocal<List<Ref<EntityStore>>> THREAD_LOCAL_ENTITY_REFS = ThreadLocal.withInitial(ArrayList::new);
@Nonnull
class="kw">private class="kw">static class="kw">final ThreadLocal<List<VolumeEntry>> THREAD_LOCAL_ACTIVE_SNAPSHOT = ThreadLocal.withInitial(ArrayList::new);
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, TriggerVolumeManager> managerResourceType;
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> playerSpatialResourceType;
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> entitySpatialResourceType;
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, TimeResource> timeResourceType;
@Nonnull
class="kw">private class="kw">final ResourceType<EntityStore, TickSuppressionRegistry> tickSuppressionResourceType;
@Nonnull
class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies;
@Nonnull
class="kw">private class="kw">final TriggerVolumeTickingSystem.EventDispatcher eventDispatcher;
class="kw">public TriggerVolumeTickingSystem(
@Nonnull ResourceType<EntityStore, TriggerVolumeManager> var1,
@Nonnull ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var2,
@Nonnull ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var3,
@Nonnull ResourceType<EntityStore, TimeResource> var4,
@Nonnull ResourceType<EntityStore, TickSuppressionRegistry> var5
) {
this(var1, var2, var3, var4, var5, TriggerVolumeTickingSystem::dispatchToServerEventBus);
}
TriggerVolumeTickingSystem(
@Nonnull ResourceType<EntityStore, TriggerVolumeManager> var1,
@Nonnull ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var2,
@Nonnull ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var3,
@Nonnull ResourceType<EntityStore, TimeResource> var4,
@Nonnull ResourceType<EntityStore, TickSuppressionRegistry> var5,
@Nonnull TriggerVolumeTickingSystem.EventDispatcher var6
) {
this.managerResourceType = var1;
this.playerSpatialResourceType = var2;
this.entitySpatialResourceType = var3;
this.timeResourceType = var4;
this.tickSuppressionResourceType = var5;
this.eventDispatcher = var6;
this.dependencies = Set.of(new SystemDependency<>(Order.AFTER, PlayerSpatialSystem.class, OrderPriority.CLOSEST));
}
@Nonnull
@Override
class="kw">public Set<Dependency<EntityStore>> getDependencies() {
class="kw">return this.dependencies;
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
TriggerVolumeManager var4 = var3.getResource(this.managerResourceType);
if (var4 != null) {
VolumeSpatialIndex var5 = var4.getSpatialIndex();
var5.applyPendingChanges();
Set var6 = var4.getActiveVolumes();
if (!var5.isEmpty() || !var6.isEmpty()) {
this.runVolumeLifecycle(var1, var3, var4, var5, var6);
}
DelayedEffectScheduler var7 = var4.getDelayedEffectScheduler();
if (!var7.isEmpty()) {
var7.tick(System.nanoTime(), var3);
}
this.processPendingEvents(var4, var3);
var4.flushClientRuleVolumesIfDirty();
TickSuppressionRegistry var8 = var3.getResource(this.tickSuppressionResourceType);
if (var8 != null) {
var4.flushTickSuppressionIfDirty(var8);
}
TimeResource var9 = var3.getResource(this.timeResourceType);
processVolumesToRemove(var4, var9);
}
}
class="kw">private void runVolumeLifecycle(
float var1, @Nonnull Store<EntityStore> var2, @Nonnull TriggerVolumeManager var3, @Nonnull VolumeSpatialIndex var4, @Nonnull Set<VolumeEntry> var5
) {
Set var6 = Collections.newSetFromMap(new IdentityHashMap<>());
List var7 = THREAD_LOCAL_CANDIDATES.get();
World var8 = var3.getWorld();
this.collectCandidatesFromEntityPositions(var2, var4, var6, var7, var3.hasEntityTargetVolumes());
var6.removeIf(var1x -> !isVolumeChunkLoaded(var1x, var8));
List var9 = THREAD_LOCAL_ACTIVE_SNAPSHOT.get();
var9.clear();
var9.addAll(var5);
for (VolumeEntry var11 : var9) {
boolean var12 = !var11.isEnabled() || !isVolumeChunkLoaded(var11, var8);
if (var12) {
var6.remove(var11);
if (!var11.getTrackedEntities().isEmpty()) {
this.processTrackedEntityExits(var11, var2, var3);
}
var3.updateTrackingState(var11);
} else if (!var11.getTrackedEntities().isEmpty()) {
var6.add(var11);
}
}
for (VolumeEntry var15 : var6) {
try {
this.tickVolume(var15, var1, var2, var3);
} catch (Exception var13) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var13)).log("Error ticking trigger volume '%s'", var15.getId());
}
var3.updateTrackingState(var15);
}
}
class="kw">private class="kw">static boolean isVolumeChunkLoaded(@Nonnull VolumeEntry var0, @Nullable World var1) {
class="kw">return var0.isKeepLoaded() || var1 == null || isChunkLoaded(var1, var0.getPosition());
}
class="kw">private void processPendingEvents(@Nonnull TriggerVolumeManager var1, @Nonnull Store<EntityStore> var2) {
for (int var3 = 0; var3 < 64; var3++) {
TriggerVolumeManager.PendingTriggerEvent var4 = var1.pollPendingEvent();
if (var4 == null) {
class="kw">return;
}
this.processPendingEvent(var4, var1, var2, System.nanoTime());
}
if (var1.hasPendingEvents()) {
LOGGER.at(Level.WARNING).log("Deferred trigger volume events to a later tick after %d events", 64);
}
}
class="kw">private void processPendingEvent(
@Nonnull TriggerVolumeManager.PendingTriggerEvent var1, @Nonnull TriggerVolumeManager var2, @Nonnull Store<EntityStore> var3, long var4
) {
if (var1.actorRef() == null || var1.actorRef().isValid()) {
if (var1.actorRef() == null || !isTriggerExempt(var1.actorRef(), var3)) {
if (var1.volumeId() != null) {
VolumeEntry var10 = var2.getVolume(var1.volumeId());
if (var10 != null && var10.isEnabled()) {
this.firePendingEvent(var10, var1, var2, var3, var4);
}
} else if (var1.blockPosition() != null) {
VolumeSpatialIndex var6 = var2.getSpatialIndex();
var6.applyPendingChanges();
List var7 = THREAD_LOCAL_CANDIDATES.get();
var7.clear();
var6.collectCandidates(var1.blockPosition(), var7);
for (VolumeEntry var9 : var7) {
if (var9.isEnabled() && var9.getShape().contains(var9.getPosition(), var1.blockPosition())) {
this.firePendingEvent(var9, var1, var2, var3, var4);
}
}
}
}
}
}
class="kw">private class="kw">static boolean isTriggerExempt(@Nonnull Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1) {
class="kw">return var1.getComponent(var0, IgnoreTriggerVolumes.getComponentType()) != null;
}
class="kw">private void firePendingEvent(
@Nonnull VolumeEntry var1,
@Nonnull TriggerVolumeManager.PendingTriggerEvent var2,
@Nonnull TriggerVolumeManager var3,
@Nonnull Store<EntityStore> var4,
long var5
) {
this.firePendingVolumeEvent(var1, var2, var4, var5);
this.firePendingGroupEvent(var1, var2, var3, var4, var5);
}
class="kw">private void firePendingVolumeEvent(
@Nonnull VolumeEntry var1, @Nonnull TriggerVolumeManager.PendingTriggerEvent var2, @Nonnull Store<EntityStore> var3, long var4
) {
if (!var1.isOnCooldown(var2.actorUuid(), var4)) {
for (int var9 : collectEntries(var1.getConditions(), var1.getEffects(), var1.getRejectionEffects())) {
if (hasMatchingEventEffect(var2.eventType(), var1.getEffects(), var9)
|| hasMatchingEventEffect(var2.eventType(), var1.getRejectionEffects(), var9)
|| hasMatchingEventCondition(var2.eventType(), var1.getConditions(), var9)) {
this.fireGatedEffects(
var2.eventType(),
var2.actorRef(),
var1,
var3,
var4,
var2.actorUuid(),
var9,
null,
var1.getConditions(),
var1.getEffects(),
var1.getRejectionEffects(),
var1.getConditionTiming() == ConditionTiming.BEFORE_VOLUME_DELAY ? var1.getActivationDelay() : 0.0F,
rejectionDelay(var1.getRejectionDelayMode(), var1.getActivationDelay()),
VolumeEntry.EffectBucket.VOLUME,
VolumeEntry.EffectBucket.VOLUME_REJECTION,
"volume '" + var1.getId() + "'",
var2
);
}
}
}
}
class="kw">private void firePendingGroupEvent(
@Nonnull VolumeEntry var1,
@Nonnull TriggerVolumeManager.PendingTriggerEvent var2,
@Nonnull TriggerVolumeManager var3,
@Nonnull Store<EntityStore> var4,
long var5
) {
if (var1.getGroupId() != null) {
GroupEntry var7 = var3.getGroup(var1.getGroupId());
if (var7 != null && var7.isEnabled()) {
if (!var1.isOnCooldown(var2.actorUuid(), var5)) {
List var8 = getGroupSpatialVolumes(var1, var3, var7);
for (int var12 : collectEntries(var7.getConditions(), var7.getEffects(), var7.getRejectionEffects())) {
if (hasMatchingEventEffect(var2.eventType(), var7.getEffects(), var12)
|| hasMatchingEventEffect(var2.eventType(), var7.getRejectionEffects(), var12)
|| hasMatchingEventCondition(var2.eventType(), var7.getConditions(), var12)) {
this.fireGatedEffects(
var2.eventType(),
var2.actorRef(),
var1,
var4,
var5,
var2.actorUuid(),
var12,
var8,
var7.getConditions(),
var7.getEffects(),
var7.getRejectionEffects(),
var7.getConditionTiming() == ConditionTiming.BEFORE_VOLUME_DELAY ? var1.getActivationDelay() : 0.0F,
rejectionDelay(var7.getRejectionDelayMode(), var1.getActivationDelay()),
VolumeEntry.EffectBucket.GROUP,
VolumeEntry.EffectBucket.GROUP_REJECTION,
"group '" + var7.getId() + "' via volume '" + var1.getId() + "'",
var2
);
}
}
}
}
}
}
class="kw">private class="kw">static void processVolumesToRemove(@Nonnull TriggerVolumeManager var0, @Nonnull TimeResource var1) {
Instant var2 = var1.getNow();
for (VolumeEntry var4 : var0.getVolumes()) {
if (var4.isPendingDestroy() || var4.isExpired(var2)) {
String var5 = var4.getId();
var0.getDelayedEffectScheduler().cancelForVolume(var4);
var0.unregister(var5);
var0.notifyViewersRemove(var5);
}
}
}
class="kw">private void collectCandidatesFromEntityPositions(
@Nonnull Store<EntityStore> var1, @Nonnull VolumeSpatialIndex var2, @Nonnull Set<VolumeEntry> var3, @Nonnull List<VolumeEntry> var4, boolean var5
) {
SpatialResource var6 = var1.getResource(this.playerSpatialResourceType);
if (var6 != null) {
SpatialData var7 = var6.getSpatialData();
for (int var8 = 0; var8 < var7.size(); var8++) {
var4.clear();
var2.collectCandidates(var7.getVector(var8), var4);
var3.addAll(var4);
}
}
if (var5) {
SpatialResource var10 = var1.getResource(this.entitySpatialResourceType);
if (var10 != null) {
SpatialData var11 = var10.getSpatialData();
for (int var9 = 0; var9 < var11.size(); var9++) {
var4.clear();
var2.collectCandidates(var11.getVector(var9), var4);
var3.addAll(var4);
}
}
}
}
class="kw">private void tickVolume(@Nonnull VolumeEntry var1, float var2, @Nonnull Store<EntityStore> var3, @Nonnull TriggerVolumeManager var4) {
TriggerVolumeShape var5 = var1.getShape();
Vector3d var6 = var1.getPosition();
Set var7 = THREAD_LOCAL_PREVIOUS.get();
Map var8 = THREAD_LOCAL_PREVIOUS_REFS.get();
var7.clear();
var8.clear();
var7.addAll(var1.getTrackedEntities().keySet());
var8.putAll(var1.getTrackedEntities());
var1.getTrackedEntities().clear();
List var9 = SpatialResource.getThreadLocalReferenceList();
if (var1.getTargetTypes().contains(EntityTargetType.PLAYER)) {
SpatialResource var10 = var3.getResource(this.playerSpatialResourceType);
if (var10 != null) {
var10.getSpatialStructure().collect(var6, var5.getMaxDistanceFromOrigin(), var9);
}
}
if (usesEntitySpatial(var1.getTargetTypes())) {
SpatialResource var25 = var3.getResource(this.entitySpatialResourceType);
if (var25 != null) {
var25.getSpatialStructure().collect(var6, var5.getMaxDistanceFromOrigin(), var9);
}
}
List var26 = THREAD_LOCAL_ENTITY_REFS.get();
var26.clear();
var26.addAll(var9);
long var11 = System.nanoTime();
int[] var13 = collectEntries(var1.getConditions(), var1.getEffects(), var1.getRejectionEffects());
int[] var14 = SINGLE_DEFAULT_ENTRY;
if (var1.getGroupId() != null) {
GroupEntry var15 = var4.getGroup(var1.getGroupId());
if (var15 != null) {
var14 = collectEntries(var15.getConditions(), var15.getEffects(), var15.getRejectionEffects());
}
}
for (int var27 = 0; var27 < var26.size(); var27++) {
Ref var16 = var26.get(var27);
if (var16.isValid() && matchesTargetTypes(var1.getTargetTypes(), var16, var3) && !isTriggerExempt(var16, var3)) {
TransformComponent var17 = var3.getComponent(var16, TransformComponent.getComponentType());
if (var17 != null && containsEntity(var5, var6, var17, var3.getComponent(var16, BoundingBox.getComponentType()))) {
UUIDComponent var18 = var3.getComponent(var16, UUIDComponent.getComponentType());
if (var18 != null) {
UUID var19 = var18.getUuid();
var1.getTrackedEntities().put(var19, var16);
boolean var20 = var7.remove(var19);
if (!var20) {
if (var1.isOnCooldown(var19, var11)) {
class="kw">continue;
}
this.clearIntervalTimers(var1, var19);
for (int var24 : var13) {
if (!isTickActivationGate(var1.getConditions(), var1.getEffects(), var1.getRejectionEffects(), var24)) {
this.activateVolumeEntry(var16, var1, var3, var11, var19, var24);
}
}
for (int var39 : var14) {
if (!hasGroupTickActivationGate(var1, var4, var39)) {
this.activateGroupEntry(var16, var1, var4, var3, var11, var19, var39);
}
}
}
for (int var40 : var13) {
if (var1.isVolumeActivated(var40, var19)) {
this.fireEffects(TriggerEventType.TICK, var16, var1, var3, var11, var19, var40);
} else if (isTickActivationGate(var1.getConditions(), var1.getEffects(), var1.getRejectionEffects(), var40)) {
this.processVolumeTickActivationGate(var16, var1, var3, var11, var19, var40);
}
}
if (var1.getGroupId() != null) {
for (int var41 : var14) {
if (var1.isGroupActivated(var1.getGroupId(), var41, var19)) {
this.fireGroupEffects(TriggerEventType.TICK, var16, var1, var4, var3, var11, var19, var41);
} else {
this.processGroupTickActivationGate(var16, var1, var4, var3, var11, var19, var41);
}
}
}
}
}
}
}
for (UUID var29 : var7) {
this.fireVolumeExit(var1, var8.get(var29), var29, var4, var3, var11, false);
}
}
void fireVolumeExit(
@Nonnull VolumeEntry var1,
@Nullable Ref<EntityStore> var2,
@Nonnull UUID var3,
@Nonnull TriggerVolumeManager var4,
@Nonnull Store<EntityStore> var5,
long var6,
boolean var8
) {
if (var2 != null && var2.isValid() && !isTriggerExempt(var2, var5)) {
this.dispatchEvent(TriggerEventType.EXIT, var1, var2, var3);
for (int var12 : collectEntries(var1.getConditions(), var1.getEffects(), var1.getRejectionEffects())) {
this.fireEffects(TriggerEventType.EXIT, var2, var1, var5, var6, var3, var12);
}
if (var1.getGroupId() != null) {
GroupEntry var14 = var4.getGroup(var1.getGroupId());
if (var14 != null) {
for (int var13 : collectEntries(var14.getConditions(), var14.getEffects(), var14.getRejectionEffects())) {
this.fireGroupEffects(TriggerEventType.EXIT, var2, var1, var4, var5, var6, var3, var13);
}
}
}
}
notifyVolumeEntityExit(var1, var3);
this.fireGroupOnEntityExit(var1, var4, var3);
if (!var8 && var1.isCancelDelayedEffectsOnExit()) {
var4.getDelayedEffectScheduler().cancelNonExitForEntityInVolume(var3, var1);
}
var1.clearEntityRuntimeState(var3);
}
class="kw">private boolean activateVolumeEntry(
@Nonnull Ref<EntityStore> var1, @Nonnull VolumeEntry var2, @Nonnull Store<EntityStore> var3, long var4, @Nonnull UUID var6, int var7
) {
TriggerVolumeTickingSystem.ActivationResult var8 = this.fireEffects(TriggerEventType.ENTER, var1, var2, var3, var4, var6, var7);
if (var8 != TriggerVolumeTickingSystem.ActivationResult.ACCEPTED) {
class="kw">return false;
}
this.completeVolumeActivation(var1, var2, var4, var6, var7);
class="kw">return true;
}
class="kw">private void completeVolumeActivation(@Nonnull Ref<EntityStore> var1, @Nonnull VolumeEntry var2, long var3, @Nonnull UUID var5, int var6) {
if (var2.getTrackedEntities().containsKey(var5)) {
var2.markVolumeActivated(var6, var5);
var2.recordActivation(var5, var3);
this.dispatchEvent(TriggerEventType.ENTER, var2, var1, var5);
}
}
class="kw">private void processVolumeTickActivationGate(
@Nonnull Ref<EntityStore> var1, @Nonnull VolumeEntry var2, @Nonnull Store<EntityStore> var3, long var4, @Nonnull UUID var6, int var7
) {
if (var2.isOnCooldown(var6, var4)) {
var2.markVolumeActivated(var7, var6);
} else {
TriggerContext var8 = new TriggerContext(var1, var3, TriggerEventType.TICK, var2);
if (this.conditionsPass(var2.getConditions(), TriggerEventType.TICK, var7, var8, "volume '" + var2.getId() + "'")) {
this.activateVolumeEntry(var1, var2, var3, var4, var6, var7);
} else if (var2.markVolumeTickRejectionFired(var7, var6)) {
this.fireEffectList(
TriggerEventType.TICK,
var1,
var2,
var3,
var4,
var6,
null,
var2.getRejectionEffects(),
var7,
0.0F,
VolumeEntry.EffectBucket.VOLUME_REJECTION,
"volume '" + var2.getId() + "'",
null
);
}
}
}
class="kw">private boolean activateGroupEntry(
@Nonnull Ref<EntityStore> var1,
@Nonnull VolumeEntry var2,
@Nonnull TriggerVolumeManager var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
int var8
) {
String var9 = var2.getGroupId();
if (var9 == null) {
class="kw">return false;
}
TriggerVolumeTickingSystem.ActivationResult var10 = this.fireGroupEffects(TriggerEventType.ENTER, var1, var2, var3, var4, var5, var7, var8);
if (var10 != TriggerVolumeTickingSystem.ActivationResult.ACCEPTED) {
class="kw">return false;
}
this.completeGroupActivation(var2, var9, var7, var8);
class="kw">return true;
}
class="kw">private void completeGroupActivation(@Nonnull VolumeEntry var1, @Nonnull String var2, @Nonnull UUID var3, int var4) {
if (var1.getTrackedEntities().containsKey(var3)) {
var1.markGroupActivated(var2, var4, var3);
}
}
class="kw">private void processGroupTickActivationGate(
@Nonnull Ref<EntityStore> var1,
@Nonnull VolumeEntry var2,
@Nonnull TriggerVolumeManager var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
int var8
) {
String var9 = var2.getGroupId();
if (var9 != null) {
GroupEntry var10 = var3.getGroup(var9);
if (var10 != null && var10.isEnabled() && isTickActivationGate(var10.getConditions(), var10.getEffects(), var10.getRejectionEffects(), var8)) {
if (var2.isOnCooldown(var7, var5)) {
var2.markGroupActivated(var9, var8, var7);
} else {
List var11 = getGroupSpatialVolumes(var2, var3, var10);
if (!var11.isEmpty()) {
TriggerContext var12 = new TriggerContext(var1, var4, TriggerEventType.TICK, var2, var11);
String var13 = "group '" + var10.getId() + "' via volume '" + var2.getId() + "'";
if (this.conditionsPass(var10.getConditions(), TriggerEventType.TICK, var8, var12, var13)) {
this.activateGroupEntry(var1, var2, var3, var4, var5, var7, var8);
} else if (var2.markGroupTickRejectionFired(var9, var8, var7)) {
this.fireEffectList(
TriggerEventType.TICK,
var1,
var2,
var4,
var5,
var7,
var11,
var10.getRejectionEffects(),
var8,
0.0F,
VolumeEntry.EffectBucket.GROUP_REJECTION,
var13,
null
);
}
}
}
}
}
}
@Nonnull
class="kw">private class="kw">static List<VolumeEntry> getGroupSpatialVolumes(@Nonnull VolumeEntry var0, @Nonnull TriggerVolumeManager var1, @Nonnull GroupEntry var2) {
ArrayList var3 = new ArrayList<>();
for (String var5 : var2.getMemberVolumeIds()) {
VolumeEntry var6 = var1.getVolume(var5);
if (var6 != null) {
var3.add(var6);
}
}
if (var3.isEmpty()) {
var3.add(var0);
}
class="kw">return var3;
}
class="kw">private TriggerVolumeTickingSystem.ActivationResult fireEffects(
@Nonnull TriggerEventType var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
int var8
) {
if (!hasMatchingEventEffect(var1, var3.getEffects(), var8) && !hasMatchingEventEffect(var1, var3.getRejectionEffects(), var8)) {
if (!hasMatchingEventCondition(var1, var3.getConditions(), var8)) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.ACCEPTED;
}
if (var3.getConditionTiming() == ConditionTiming.AFTER_VOLUME_DELAY && var3.getActivationDelay() > 0.0F) {
class="kw">return this.scheduleDelayedVolumeGate(var1, var2, var3, var4, var5, var7, var8);
}
TriggerContext var9 = new TriggerContext(var2, var4, var1, var3);
class="kw">return this.conditionsPass(var3.getConditions(), var1, var8, var9, "volume '" + var3.getId() + "'")
? TriggerVolumeTickingSystem.ActivationResult.ACCEPTED
: TriggerVolumeTickingSystem.ActivationResult.REJECTED;
} else {
class="kw">return var3.getConditionTiming() == ConditionTiming.AFTER_VOLUME_DELAY && var3.getActivationDelay() > 0.0F
? this.scheduleDelayedVolumeGate(var1, var2, var3, var4, var5, var7, var8)
: this.fireGatedEffects(
var1,
var2,
var3,
var4,
var5,
var7,
var8,
null,
var3.getConditions(),
var3.getEffects(),
var3.getRejectionEffects(),
var3.getConditionTiming() == ConditionTiming.BEFORE_VOLUME_DELAY ? var3.getActivationDelay() : 0.0F,
rejectionDelay(var3.getRejectionDelayMode(), var3.getActivationDelay()),
VolumeEntry.EffectBucket.VOLUME,
VolumeEntry.EffectBucket.VOLUME_REJECTION,
"volume '" + var3.getId() + "'"
);
}
}
@Nonnull
class="kw">private TriggerVolumeTickingSystem.ActivationResult scheduleDelayedVolumeGate(
@Nonnull TriggerEventType var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
int var8
) {
if (var1 == TriggerEventType.ENTER && !var3.markVolumeActivationPending(var8, var7)) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.PENDING;
}
this.getScheduler(var4)
.scheduleGate(
(var2x, var3x, var4x, var5x, var6, var7x, var8x) -> this.fireDelayedVolumeEffects(var2x, var3x, var4x, var5x, var6, var7x, var8x, var8),
var2,
var7,
var1,
var3,
var5,
var3.getActivationDelay(),
null
);
class="kw">return TriggerVolumeTickingSystem.ActivationResult.PENDING;
}
class="kw">private void fireDelayedVolumeEffects(
@Nonnull Ref<EntityStore> var1,
@Nonnull UUID var2,
@Nonnull TriggerEventType var3,
@Nonnull VolumeEntry var4,
@Nullable List<VolumeEntry> var5,
@Nonnull Store<EntityStore> var6,
long var7,
int var9
) {
try {
TriggerVolumeTickingSystem.ActivationResult var10 = this.fireGatedEffects(
var3,
var1,
var4,
var6,
var7,
var2,
var9,
null,
var4.getConditions(),
var4.getEffects(),
var4.getRejectionEffects(),
0.0F,
rejectionDelay(var4.getRejectionDelayMode(), var4.getActivationDelay()),
VolumeEntry.EffectBucket.VOLUME,
VolumeEntry.EffectBucket.VOLUME_REJECTION,
"volume '" + var4.getId() + "'"
);
if (var3 == TriggerEventType.ENTER && var10 == TriggerVolumeTickingSystem.ActivationResult.ACCEPTED) {
this.completeVolumeActivation(var1, var4, var7, var2, var9);
}
} class="kw">finally {
if (var3 == TriggerEventType.ENTER) {
var4.clearVolumeActivationPending(var9, var2);
}
}
}
class="kw">private TriggerVolumeTickingSystem.ActivationResult fireGatedEffects(
@Nonnull TriggerEventType var1,
@Nullable Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
int var8,
@Nullable List<VolumeEntry> var9,
@Nonnull List<TriggerCondition> var10,
@Nonnull List<TriggerEffect> var11,
@Nonnull List<TriggerEffect> var12,
float var13,
float var14,
@Nonnull VolumeEntry.EffectBucket var15,
@Nonnull VolumeEntry.EffectBucket var16,
@Nonnull String var17
) {
class="kw">return this.fireGatedEffects(var1, var2, var3, var4, var5, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, null);
}
class="kw">private TriggerVolumeTickingSystem.ActivationResult fireGatedEffects(
@Nonnull TriggerEventType var1,
@Nullable Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
int var8,
@Nullable List<VolumeEntry> var9,
@Nonnull List<TriggerCondition> var10,
@Nonnull List<TriggerEffect> var11,
@Nonnull List<TriggerEffect> var12,
float var13,
float var14,
@Nonnull VolumeEntry.EffectBucket var15,
@Nonnull VolumeEntry.EffectBucket var16,
@Nonnull String var17,
@Nullable TriggerVolumeManager.PendingTriggerEvent var18
) {
TriggerContext var19 = var9 != null ? createContext(var2, var4, var1, var3, var9, var18) : createContext(var2, var4, var1, var3, List.of(var3), var18);
boolean var20 = this.conditionsPass(var10, var1, var8, var19, var17);
List var21 = var20 ? var11 : var12;
VolumeEntry.EffectBucket var22 = var20 ? var15 : var16;
float var23 = var20 ? var13 : var14;
this.fireEffectList(var1, var2, var3, var4, var5, var7, var9, var21, var8, var23, var22, var17, var18);
class="kw">return var20 ? TriggerVolumeTickingSystem.ActivationResult.ACCEPTED : TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
@Nonnull
class="kw">private class="kw">static TriggerContext createContext(
@Nullable Ref<EntityStore> var0,
@Nonnull Store<EntityStore> var1,
@Nonnull TriggerEventType var2,
@Nonnull VolumeEntry var3,
@Nonnull List<VolumeEntry> var4,
@Nullable TriggerVolumeManager.PendingTriggerEvent var5
) {
class="kw">return var5 == null
? new TriggerContext(var0, var1, var2, var3, var4)
: new TriggerContext(var0, var1, var2, var3, var4, null, var5.signalTags(), var5.blockPosition(), var5.blockId(), var5.interactionType());
}
class="kw">private boolean conditionsPass(
@Nonnull List<TriggerCondition> var1, @Nonnull TriggerEventType var2, int var3, @Nonnull TriggerContext var4, @Nonnull String var5
) {
ArrayList var6 = new ArrayList<>();
for (TriggerCondition var8 : var1) {
if (var8.getEntry() == var3 && var8.getEventType() == var2) {
try {
if (!var8.test(var4)) {
class="kw">return false;
}
var6.add(var8);
} catch (Throwable var11) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var11)).log("Error evaluating condition %s on %s", var8.getClass().getSimpleName(), var5);
class="kw">return false;
}
}
}
for (TriggerCondition var13 : var6) {
try {
var13.applyOnAccept(var4);
} catch (Throwable var10) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var10))
.log("Error applying accepted condition %s on %s", var13.getClass().getSimpleName(), var5);
class="kw">return false;
}
}
class="kw">return true;
}
class="kw">static boolean hasTickActivationGate(@Nonnull List<TriggerCondition> var0, int var1) {
for (TriggerCondition var3 : var0) {
if (var3.getEntry() == var1 && var3.getEventType() == TriggerEventType.TICK) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">static boolean isTickActivationGate(@Nonnull List<TriggerCondition> var0, @Nonnull List<TriggerEffect> var1, @Nonnull List<TriggerEffect> var2, int var3) {
class="kw">return hasTickActivationGate(var0, var3)
&& !hasMatchingEventEffect(TriggerEventType.ENTER, var1, var3)
&& !hasMatchingEventEffect(TriggerEventType.ENTER, var2, var3)
&& !hasMatchingEventCondition(TriggerEventType.ENTER, var0, var3);
}
class="kw">static boolean hasMatchingEventEffect(@Nonnull TriggerEventType var0, @Nonnull List<TriggerEffect> var1, int var2) {
for (TriggerEffect var4 : var1) {
if (var4.getEntry() == var2 && var4.getEventType() == var0) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">static boolean hasMatchingEventCondition(@Nonnull TriggerEventType var0, @Nonnull List<TriggerCondition> var1, int var2) {
for (TriggerCondition var4 : var1) {
if (var4.getEntry() == var2 && var4.getEventType() == var0) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">private class="kw">static boolean hasGroupTickActivationGate(@Nonnull VolumeEntry var0, @Nonnull TriggerVolumeManager var1, int var2) {
String var3 = var0.getGroupId();
if (var3 == null) {
class="kw">return false;
}
GroupEntry var4 = var1.getGroup(var3);
class="kw">return var4 != null && var4.isEnabled() && isTickActivationGate(var4.getConditions(), var4.getEffects(), var4.getRejectionEffects(), var2);
}
@Nonnull
class="kw">private class="kw">static int[] collectEntries(@Nonnull List<TriggerCondition> var0, @Nonnull List<TriggerEffect> var1, @Nonnull List<TriggerEffect> var2) {
IntOpenHashSet var3 = new IntOpenHashSet();
for (TriggerCondition var5 : var0) {
var3.add(var5.getEntry());
}
for (TriggerEffect var9 : var1) {
var3.add(var9.getEntry());
}
for (TriggerEffect var10 : var2) {
var3.add(var10.getEntry());
}
if (var3.isEmpty()) {
class="kw">return SINGLE_DEFAULT_ENTRY;
}
int[] var8 = var3.toIntArray();
Arrays.sort(var8);
class="kw">return var8;
}
class="kw">private void fireEffectList(
@Nonnull TriggerEventType var1,
@Nullable Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull Store<EntityStore> var4,
long var5,
@Nonnull UUID var7,
@Nullable List<VolumeEntry> var8,
@Nonnull List<TriggerEffect> var9,
int var10,
float var11,
@Nonnull VolumeEntry.EffectBucket var12,
@Nonnull String var13,
@Nullable TriggerVolumeManager.PendingTriggerEvent var14
) {
for (int var15 = 0; var15 < var9.size(); var15++) {
TriggerEffect var16 = var9.get(var15);
if (var16.getEntry() == var10 && var16.getEventType() == var1) {
VolumeEntry.EffectEntityKey var17 = null;
boolean var18 = false;
if (var1 == TriggerEventType.TICK && var16.getInterval() > 0.0F) {
var17 = new VolumeEntry.EffectEntityKey(var12, var15, var7);
long var19 = var3.getLastFireTimes().getOrDefault(var17, Long.MIN_VALUE);
var18 = var19 != Long.MIN_VALUE;
if (var18) {
double var21 = (var5 - var19) / 1.0E9;
if (var21 < var16.getInterval()) {
class="kw">continue;
}
}
}
float var24 = var11 + effectDelay(var1, var16, var18);
if (var24 > 0.0F) {
DelayedEffectScheduler var20 = this.getScheduler(var4);
if (var17 != null) {
VolumeEntry.EffectEntityKey var26 = var17;
if (var3.markDelayedEffectPending(var26)) {
var20.schedule(var16, var2, var7, var1, var3, var5, var24, var8, (var2x, var3x) -> {
var3.clearDelayedEffectPending(var26);
if (var2x) {
var3.getLastFireTimes().put(var26, var3x);
}
}, var4, var14);
}
} else {
var20.schedule(var16, var2, var7, var1, var3, var5, var24, var8, null, var4, var14);
}
} else {
try {
Ref var25 = var3.getProjectileSource().resolveActorRef(var2, var4);
TriggerContext var27 = createContext(var25, var4, var1, var3, var8 != null ? var8 : List.of(var3), var14);
var16.execute(var27);
if (var17 != null) {
var3.getLastFireTimes().put(var17, var5);
}
} catch (Throwable var23) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var23)).log("Error executing effect %s on %s", var16.getClass().getSimpleName(), var13);
}
}
}
}
}
class="kw">static float effectDelay(@Nonnull TriggerEventType var0, @Nonnull TriggerEffect var1, boolean var2) {
class="kw">return var0 == TriggerEventType.TICK && var2 ? 0.0F : var1.getDelay();
}
class="kw">private TriggerVolumeTickingSystem.ActivationResult fireGroupEffects(
@Nonnull TriggerEventType var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull TriggerVolumeManager var4,
@Nonnull Store<EntityStore> var5,
long var6,
@Nonnull UUID var8,
int var9
) {
if (var3.getGroupId() == null) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
GroupEntry var10 = var4.getGroup(var3.getGroupId());
if (var10 == null || !var10.isEnabled()) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
if (var10.getConditions().isEmpty() && var10.getEffects().isEmpty() && var10.getRejectionEffects().isEmpty()) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.ACCEPTED;
}
if (hasMatchingEventEffect(var1, var10.getEffects(), var9) || hasMatchingEventEffect(var1, var10.getRejectionEffects(), var9)) {
List var13 = getGroupSpatialVolumes(var3, var4, var10);
if (var13.isEmpty()) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
if (!var10.getTargetTypes().isEmpty()) {
EntityTargetType var12 = resolveTargetType(var2, var5);
if (var12 == null) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
if (!var10.getTargetTypes().contains(var12)) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
}
class="kw">return var10.getConditionTiming() == ConditionTiming.AFTER_VOLUME_DELAY && var3.getActivationDelay() > 0.0F
? this.scheduleDelayedGroupGate(var1, var2, var3, var10, var5, var6, var8, var9, var13)
: this.fireGroupEffectLists(
var1,
var2,
var3,
var10,
var5,
var6,
var8,
var9,
var13,
var10.getConditionTiming() == ConditionTiming.BEFORE_VOLUME_DELAY ? var3.getActivationDelay() : 0.0F,
rejectionDelay(var10.getRejectionDelayMode(), var3.getActivationDelay())
);
} else {
if (!hasMatchingEventCondition(var1, var10.getConditions(), var9)) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.ACCEPTED;
}
if (var10.getConditionTiming() == ConditionTiming.AFTER_VOLUME_DELAY && var3.getActivationDelay() > 0.0F) {
class="kw">return this.scheduleDelayedGroupGate(var1, var2, var3, var10, var5, var6, var8, var9, getGroupSpatialVolumes(var3, var4, var10));
}
TriggerContext var11 = new TriggerContext(var2, var5, var1, var3, getGroupSpatialVolumes(var3, var4, var10));
class="kw">return this.conditionsPass(var10.getConditions(), var1, var9, var11, "group '" + var10.getId() + "' via volume '" + var3.getId() + "'")
? TriggerVolumeTickingSystem.ActivationResult.ACCEPTED
: TriggerVolumeTickingSystem.ActivationResult.REJECTED;
}
}
@Nonnull
class="kw">private TriggerVolumeTickingSystem.ActivationResult scheduleDelayedGroupGate(
@Nonnull TriggerEventType var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull GroupEntry var4,
@Nonnull Store<EntityStore> var5,
long var6,
@Nonnull UUID var8,
int var9,
@Nonnull List<VolumeEntry> var10
) {
if (var1 == TriggerEventType.ENTER && !var3.markGroupActivationPending(var4.getId(), var9, var8)) {
class="kw">return TriggerVolumeTickingSystem.ActivationResult.PENDING;
}
this.getScheduler(var5)
.scheduleGate(
(var3x, var4x, var5x, var6x, var7, var8x, var9x) -> this.fireDelayedGroupEffects(var5x, var3x, var6x, var4, var8x, var9x, var4x, var9, var7),
var2,
var8,
var1,
var3,
var6,
var3.getActivationDelay(),
var10
);
class="kw">return TriggerVolumeTickingSystem.ActivationResult.PENDING;
}
class="kw">private void fireDelayedGroupEffects(
@Nonnull TriggerEventType var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull GroupEntry var4,
@Nonnull Store<EntityStore> var5,
long var6,
@Nonnull UUID var8,
int var9,
@Nullable List<VolumeEntry> var10
) {
try {
if (!var4.isEnabled()) {
class="kw">return;
}
TriggerVolumeTickingSystem.ActivationResult var11 = this.fireGroupEffectLists(
var1, var2, var3, var4, var5, var6, var8, var9, var10, 0.0F, rejectionDelay(var4.getRejectionDelayMode(), var3.getActivationDelay())
);
if (var1 == TriggerEventType.ENTER && var11 == TriggerVolumeTickingSystem.ActivationResult.ACCEPTED) {
this.completeGroupActivation(var3, var4.getId(), var8, var9);
}
} class="kw">finally {
if (var1 == TriggerEventType.ENTER) {
var3.clearGroupActivationPending(var4.getId(), var9, var8);
}
}
}
class="kw">private TriggerVolumeTickingSystem.ActivationResult fireGroupEffectLists(
@Nonnull TriggerEventType var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull VolumeEntry var3,
@Nonnull GroupEntry var4,
@Nonnull Store<EntityStore> var5,
long var6,
@Nonnull UUID var8,
int var9,
@Nullable List<VolumeEntry> var10,
float var11,
float var12
) {
List var13 = var10 != null ? var10 : List.of(var3);
class="kw">return this.fireGatedEffects(
var1,
var2,
var3,
var5,
var6,
var8,
var9,
var13,
var4.getConditions(),
var4.getEffects(),
var4.getRejectionEffects(),
var11,
var12,
VolumeEntry.EffectBucket.GROUP,
VolumeEntry.EffectBucket.GROUP_REJECTION,
"group '" + var4.getId() + "' via volume '" + var3.getId() + "'"
);
}
class="kw">private class="kw">static float rejectionDelay(@Nonnull RejectionDelayMode var0, float var1) {
class="kw">return var0 == RejectionDelayMode.USE_VOLUME_DELAY ? var1 : 0.0F;
}
@Nonnull
class="kw">private DelayedEffectScheduler getScheduler(@Nonnull Store<EntityStore> var1) {
TriggerVolumeManager var2 = var1.getResource(this.managerResourceType);
if (var2 == null) {
throw new IllegalStateException("TriggerVolumeManager missing on store");
} else {
class="kw">return var2.getDelayedEffectScheduler();
}
}
class="kw">private class="kw">static boolean usesEntitySpatial(@Nonnull Set<EntityTargetType> var0) {
class="kw">return var0.contains(EntityTargetType.NPC) || var0.contains(EntityTargetType.ITEM_DROP) || var0.contains(EntityTargetType.PROJECTILE);
}
class="kw">private class="kw">static boolean matchesTargetTypes(@Nonnull Set<EntityTargetType> var0, @Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
EntityTargetType var3 = resolveTargetType(var1, var2);
class="kw">return var3 != null && var0.contains(var3);
}
@Nullable
class="kw">private class="kw">static EntityTargetType resolveTargetType(@Nonnull Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1) {
if (var1.getComponent(var0, PlayerRef.getComponentType()) != null) {
class="kw">return EntityTargetType.PLAYER;
} else if (var1.getComponent(var0, ItemComponent.getComponentType()) != null) {
class="kw">return EntityTargetType.ITEM_DROP;
} else {
class="kw">return var1.getComponent(var0, Projectile.getComponentType()) == null && var1.getComponent(var0, ProjectileComponent.getComponentType()) == null
? EntityTargetType.NPC
: EntityTargetType.PROJECTILE;
}
}
class="kw">private void fireGroupOnEntityExit(@Nonnull VolumeEntry var1, @Nonnull TriggerVolumeManager var2, @Nonnull UUID var3) {
if (var1.getGroupId() != null) {
GroupEntry var4 = var2.getGroup(var1.getGroupId());
if (var4 != null) {
for (TriggerCondition var6 : var4.getConditions()) {
var6.onEntityExit(var3);
}
for (TriggerEffect var9 : var4.getEffects()) {
var9.onEntityExit(var3);
}
for (TriggerEffect var10 : var4.getRejectionEffects()) {
var10.onEntityExit(var3);
}
}
}
}
class="kw">private class="kw">static void notifyVolumeEntityExit(@Nonnull VolumeEntry var0, @Nonnull UUID var1) {
for (TriggerCondition var3 : var0.getConditions()) {
var3.onEntityExit(var1);
}
for (TriggerEffect var6 : var0.getEffects()) {
var6.onEntityExit(var1);
}
for (TriggerEffect var7 : var0.getRejectionEffects()) {
var7.onEntityExit(var1);
}
}
class="kw">private void dispatchEvent(@Nonnull TriggerEventType var1, @Nonnull VolumeEntry var2, @Nonnull Ref<EntityStore> var3, @Nonnull UUID var4) {
this.eventDispatcher.dispatch(var1, var2, var3, var4);
}
class="kw">private class="kw">static void dispatchToServerEventBus(@Nonnull TriggerEventType var0, @Nonnull VolumeEntry var1, @Nonnull Ref<EntityStore> var2, @Nonnull UUID var3) {
HytaleServer var4 = HytaleServer.get();
if (var4 != null) {
IEventDispatcher var5 = var4.getEventBus().dispatchFor(TriggerVolumeEvent.class, var1.getWorldName());
if (var5.hasListener()) {
var5.dispatch(new TriggerVolumeEvent(var1.getWorldName(), var0, var1, var2, var3));
}
}
}
class="kw">private void clearIntervalTimers(@Nonnull VolumeEntry var1, @Nonnull UUID var2) {
var1.getLastFireTimes().object2LongEntrySet().removeIf(var1x -> ((VolumeEntry.EffectEntityKey)var1x.getKey()).entityId().equals(var2));
}
class="kw">private void processTrackedEntityExits(@Nonnull VolumeEntry var1, @Nonnull Store<EntityStore> var2, @Nonnull TriggerVolumeManager var3) {
long var4 = System.nanoTime();
for (Entry var7 : var1.getTrackedEntities().entrySet()) {
UUID var8 = var7.getKey();
Ref var9 = var7.getValue();
if (var9 != null && var9.isValid()) {
this.dispatchEvent(TriggerEventType.EXIT, var1, var9, var8);
for (int var13 : collectEntries(var1.getConditions(), var1.getEffects(), var1.getRejectionEffects())) {
this.fireEffects(TriggerEventType.EXIT, var9, var1, var2, var4, var8, var13);
}
if (var1.getGroupId() != null) {
GroupEntry var15 = var3.getGroup(var1.getGroupId());
if (var15 != null) {
for (int var14 : collectEntries(var15.getConditions(), var15.getEffects(), var15.getRejectionEffects())) {
this.fireGroupEffects(TriggerEventType.EXIT, var9, var1, var3, var2, var4, var8, var14);
}
}
}
}
notifyVolumeEntityExit(var1, var8);
this.fireGroupOnEntityExit(var1, var3, var8);
var1.clearEntityRuntimeState(var8);
}
var1.getTrackedEntities().clear();
}
class="kw">private class="kw">static boolean isChunkLoaded(@Nonnull World var0, @Nonnull Vector3d var1) {
long var2 = ChunkUtil.indexChunkFromBlock(var1.x(), var1.z());
ChunkStore var4 = var0.getChunkStore();
Ref var5 = var4.getChunkReference(var2);
if (var5 != null && var5.isValid()) {
WorldChunk var6 = var4.getStore().getComponent(var5, WorldChunk.getComponentType());
class="kw">return var6 != null && var6.is(ChunkFlag.TICKING);
} else {
class="kw">return false;
}
}
class="kw">private class="kw">static boolean containsEntity(@Nonnull TriggerVolumeShape var0, @Nonnull Vector3d var1, @Nonnull TransformComponent var2, @Nullable BoundingBox var3) {
Vector3d var4 = var2.getPosition();
if (var0.contains(var1, var4)) {
class="kw">return true;
}
double var5 = var3 != null ? var3.getBoundingBox().height() : 1.8;
if (var5 <= 0.0) {
class="kw">return false;
}
Vector3d var7 = THREAD_LOCAL_TEST_POINT.get();
var7.set(var4.x(), var4.y() + var5 * 0.5, var4.z());
if (var0.contains(var1, var7)) {
class="kw">return true;
}
var7.set(var4.x(), var4.y() + var5, var4.z());
class="kw">return var0.contains(var1, var7);
}
class="kw">private enum ActivationResult {
ACCEPTED,
REJECTED,
PENDING;
ActivationResult() {
}
}
@FunctionalInterface
class="kw">interface EventDispatcher {
void dispatch(@Nonnull TriggerEventType var1, @Nonnull VolumeEntry var2, @Nonnull Ref<EntityStore> var3, @Nonnull UUID var4);
}
}