TriggerNpcMarkersEffect class
Пакет: com.hypixel.hytale.builtin.triggervolumes.effect.builtin
Файл: com/hypixel/hytale/builtin/triggervolumes/effect/builtin/TriggerNpcMarkersEffect.java
extends: TriggerEffect
Поля (13)
| Модификаторы | Тип | Имя |
|---|---|---|
|
Vector3d |
var12 |
|
TriggerVolumeShape |
var13 |
|
int |
var14 |
|
Ref |
var16 |
|
SpawnMarkerEntity |
var17 |
|
TransformComponent |
var18 |
|
Store |
var2 |
|
SpatialResource |
var3 |
|
List |
var4 |
|
ReferenceArrayList |
var5 |
|
ReferenceOpenHashSet |
var6 |
|
double |
var7 |
|
int |
var9 |
Методы (5)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(VolumeEntry var11 : var4) |
abstract |
|
for for(int var15 = 0; var15 < var5.size() |
|
|
if if(var3 != null) |
|
|
if if(var9 == 0) |
static |
boolean |
matchesAreaboolean matchesArea(@Nonnull TriggerVolumeShape var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, double var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.effect.builtin;
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.manager.VolumeEntry;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.shape.TriggerVolumeShape;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.EnumCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
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 com.hypixel.hytale.server.spawning.SpawningPlugin;
class="kw">import com.hypixel.hytale.server.spawning.spawnmarkers.SpawnMarkerEntity;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
class="kw">import java.util.List;
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 TriggerNpcMarkersEffect class="kw">extends TriggerEffect {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<TriggerNpcMarkersEffect> CODEC = BuilderCodec.builder(
TriggerNpcMarkersEffect.class, TriggerNpcMarkersEffect::new, BASE_CODEC
)
.append(new KeyedCodec<>("MarkerType", Codec.STRING, false), (var0, var1) -> var0.markerType = var1, var0 -> var0.markerType)
.add()
.append(new KeyedCodec<>("Range", Codec.DOUBLE, false), (var0, var1) -> var0.range = var1, var0 -> var0.range > 0.0 ? var0.range : null)
.add()
.append(new KeyedCodec<>("MatchTag", Codec.STRING, false), (var0, var1) -> var0.matchTag = var1, var0 -> var0.matchTag)
.add()
.append(new KeyedCodec<>("Radius", Codec.DOUBLE, false), (var0, var1) -> var0.radius = var1, var0 -> var0.radius > 0.0 ? var0.radius : null)
.add()
.append(new KeyedCodec<>("Center", new EnumCodec<>(TaggedVolumeEffectUtil.Center.class), false), (var0, var1) -> var0.center = var1, var0 -> var0.center)
.add()
.build();
@Nullable
class="kw">private String markerType;
class="kw">private double range;
@Nullable
class="kw">private String matchTag;
class="kw">private double radius;
@Nonnull
class="kw">private TaggedVolumeEffectUtil.Center center = TaggedVolumeEffectUtil.Center.VOLUME;
class="kw">public TriggerNpcMarkersEffect() {
}
@Override
class="kw">public void execute(@Nonnull TriggerContext var1) {
Store var2 = var1.getStore();
SpatialResource var3 = var2.getResource(SpawningPlugin.get().getSpawnMarkerSpatialResource());
if (var3 != null) {
List var4 = this.resolveAreaVolumes(var1);
if (var4.isEmpty()) {
LOGGER.at(Level.FINE).log("TriggerNpcMarkers: no area volumes matched for volume '%s' (MatchTag: %s)", var1.getVolume().getId(), this.matchTag);
} else {
ReferenceArrayList var5 = new ReferenceArrayList();
ReferenceOpenHashSet var6 = new ReferenceOpenHashSet();
double var7 = this.range > 0.0 ? this.range * this.range : 0.0;
int var9 = 0;
for (VolumeEntry var11 : var4) {
Vector3d var12 = var11.getPosition();
TriggerVolumeShape var13 = var11.getShape();
int var14 = (int)Math.ceil(Math.max(var13.getBoundingRadius(), this.range)) + 1;
var5.clear();
var3.getSpatialStructure().collect(var12, var14, var5);
for (int var15 = 0; var15 < var5.size(); var15++) {
Ref var16 = (Ref<EntityStore>)var5.get(var15);
if (var16.isValid() && var6.add(var16)) {
SpawnMarkerEntity var17 = var2.getComponent(var16, SpawnMarkerEntity.getComponentType());
if (var17 != null && var17.isManualTrigger() && (this.markerType == null || this.markerType.equals(var17.getSpawnMarkerId()))) {
TransformComponent var18 = var2.getComponent(var16, TransformComponent.getComponentType());
if (var18 != null && matchesArea(var13, var12, var18.getPosition(), var7) && var17.trigger(var16, null, var2)) {
var9++;
}
}
}
}
}
if (var9 == 0) {
LOGGER.at(Level.FINE)
.log(
"TriggerNpcMarkers: no manual spawn markers matched in volume '%s'%s",
var1.getVolume().getId(),
this.markerType != null ? " (MarkerType filter: " + this.markerType + ")" : ""
);
}
}
}
}
@Nonnull
class="kw">private List<VolumeEntry> resolveAreaVolumes(@Nonnull TriggerContext var1) {
class="kw">return this.matchTag != null && !this.matchTag.isBlank()
? TaggedVolumeEffectUtil.collectTargets(var1, this.matchTag, this.radius, this.center)
: var1.getSpatialVolumes();
}
class="kw">private class="kw">static boolean matchesArea(@Nonnull TriggerVolumeShape var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, double var3) {
class="kw">return var0.contains(var1, var2) ? true : var3 > 0.0 && var1.distanceSquared(var2) <= var3;
}
}