RevealMapMarkersInViewInteraction class
Пакет: com.hypixel.hytale.server.core.modules.interaction.interaction.config.server
Файл: com/hypixel/hytale/server/core/modules/interaction/interaction/config/server/RevealMapMarkersInViewInteraction.java
extends: SimpleInteraction
Поля (18)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
float |
DEFAULT_FIELD_OF_VIEW |
|
private ComponentAccessor<EntityStore> |
componentAccessor |
|
private boolean |
conditionsHeld |
|
private final Vector3d |
markerCenter |
|
private float |
nextScanTime |
|
private final List<Ref<EntityStore>> |
particleTargets |
|
private WorldParticle[] |
particles |
|
private Player |
player |
|
RevealMapMarkersInViewInteraction.ScanState |
var10 |
|
|
var10 |
|
float |
var11 |
|
Instant |
var5 |
|
CommandBuffer |
var6 |
|
boolean |
var6 |
|
Ref |
var7 |
|
boolean |
var7 |
|
Player |
var8 |
|
DynamicMetaStore |
var9 |
Методы (16)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
private |
ScanStateprivate ScanState() |
|
public void |
acceptpublic void accept(int var1, int var2, int var3, @Nonnull String var4) |
|
public void |
beginpublic void begin(@Nonnull Player var1, @Nonnull Ref<EntityStore> var2, @Nonnull ComponentAccessor<EntityStore> var3, @Nullable WorldParticle[] var4) |
static |
boolean |
continuesRunningboolean continuesRunning(boolean var0, boolean var1, float var2, float var3) |
private |
void |
endvoid end(@Nonnull InteractionState var1, boolean var2, float var3, @Nonnull InteractionType var4, @Nonnull InteractionContext var5, @Nonnull CooldownHandler var6) |
|
public void |
endpublic void end() |
|
|
if if(var7 == null) |
|
|
if if(var8 == null) |
|
|
if if(var1 || var10 == null) |
|
|
if if(var2 < var10.nextScanTime) |
|
|
if if(this.runWhile == null) |
|
|
if if(this.runWhile == null) |
|
|
if if(var6) |
|
|
if if(this.particles != null) |
private |
void |
scanvoid scan(@Nonnull Player var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull ComponentAccessor<EntityStore> var3,
@Nonnull RevealMapMarkersInViewInteraction.ScanState var4) |
private |
boolean |
shouldContinueboolean shouldContinue(@Nonnull RevealMapMarkersInViewInteraction.ScanState var1, float var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.interaction.interaction.config.server;
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.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.function.consumer.TriIntObjectConsumer;
class="kw">import com.hypixel.hytale.protocol.InteractionState;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.WaitForDataFrom;
class="kw">import com.hypixel.hytale.server.core.asset.type.particle.config.WorldParticle;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.meta.DynamicMetaStore;
class="kw">import com.hypixel.hytale.server.core.meta.MetaKey;
class="kw">import com.hypixel.hytale.server.core.modules.entity.condition.Condition;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
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.SimpleInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.ParticleUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.markers.DiscoverableMapMarkers;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import java.time.Instant;
class="kw">import java.util.Arrays;
class="kw">import java.util.List;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">public class RevealMapMarkersInViewInteraction class="kw">extends SimpleInteraction {
class="kw">private class="kw">static class="kw">final float DEFAULT_FIELD_OF_VIEW = 30.0F;
class="kw">private class="kw">static class="kw">final float MIN_FIELD_OF_VIEW = 0.0F;
class="kw">private class="kw">static class="kw">final float MAX_FIELD_OF_VIEW = 360.0F;
class="kw">private class="kw">static class="kw">final double DEFAULT_MAX_DISTANCE = 128.0;
class="kw">private class="kw">static class="kw">final double MAX_DISTANCE_LIMIT = Double.MAX_VALUE;
class="kw">private class="kw">static class="kw">final float DEFAULT_SCAN_INTERVAL = 0.25F;
class="kw">private class="kw">static class="kw">final float DEFAULT_CONDITION_GRACE = 1.0F;
class="kw">private class="kw">static class="kw">final float MAX_SCAN_INTERVAL = 60.0F;
class="kw">private class="kw">static class="kw">final float MAX_CONDITION_GRACE = 60.0F;
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<RevealMapMarkersInViewInteraction> CODEC = BuilderCodec.builder(
RevealMapMarkersInViewInteraction.class, RevealMapMarkersInViewInteraction::new, SimpleInteraction.CODEC
)
.documentation("Reveals the discoverable world map markers that sit inside the view cone of the player.")
.<Float>appendInherited(
new KeyedCodec<>("FieldOfView", Codec.FLOAT),
(var0, var1) -> var0.fieldOfView = var1,
var0 -> var0.fieldOfView,
(var0, var1) -> var0.fieldOfView = var1.fieldOfView
)
.documentation(
"The full angle of the view cone in degrees. A marker is found when it sits within half this angle of the look direction. Keep it narrow for a tool the player has to aim."
)
.addValidator(Validators.greaterThan(0.0F))
.addValidator(Validators.max(360.0F))
.add()
.<Double>appendInherited(
new KeyedCodec<>("MaxDistance", Codec.DOUBLE),
(var0, var1) -> var0.maxDistance = var1,
var0 -> var0.maxDistance,
(var0, var1) -> var0.maxDistance = var1.maxDistance
)
.documentation(
"The maximum distance in blocks from the eye position of the player. This is not an occlusion test, so a marker behind terrain is still found. It must be a finite distance."
)
.addValidator(Validators.greaterThan(0.0))
.addValidator(Validators.max(Double.MAX_VALUE))
.add()
.<Float>appendInherited(
new KeyedCodec<>("ScanInterval", Codec.FLOAT),
(var0, var1) -> var0.scanInterval = var1,
var0 -> var0.scanInterval,
(var0, var1) -> var0.scanInterval = var1.scanInterval
)
.documentation(
"The time in seconds between scans. The first scan runs immediately. One scan tests every marker of the world, so a short interval costs more on a world with many markers. A value of 0 scans on every tick. The run ends on a scan, so this also bounds how long it takes to end."
)
.addValidator(Validators.greaterThanOrEqual(0.0F))
.addValidator(Validators.max(60.0F))
.add()
.<Condition[]>appendInherited(
new KeyedCodec<>("RunWhile", new ArrayCodec<>(Condition.CODEC, Condition[]::new)),
(var0, var1) -> var0.runWhile = var1 != null && var1.length != 0 ? var1 : null,
var0 -> var0.runWhile,
(var0, var1) -> var0.runWhile = var1.runWhile
)
.documentation(
"Conditions that must all hold for the scanning to class="kw">continue. The interaction finishes on the first scan where one of them fails. Leave this out, or give an empty list, to scan once."
)
.add()
.<Float>appendInherited(
new KeyedCodec<>("ConditionGrace", Codec.FLOAT),
(var0, var1) -> var0.conditionGrace = var1,
var0 -> var0.conditionGrace,
(var0, var1) -> var0.conditionGrace = var1.conditionGrace
)
.documentation(
"The time in seconds the `RunWhile` conditions have to start holding in. This does nothing without `RunWhile`. Raise it above the windup of the interaction this runs beside, or that windup ends the run before the conditions ever hold. A value of 0 ends the run on the first scan where they do not hold."
)
.addValidator(Validators.greaterThanOrEqual(0.0F))
.addValidator(Validators.max(60.0F))
.add()
.<WorldParticle[]>appendInherited(
new KeyedCodec<>("RevealParticles", WorldParticle.ARRAY_CODEC),
(var0, var1) -> var0.revealParticles = var1,
var0 -> var0.revealParticles,
(var0, var1) -> var0.revealParticles = var1.revealParticles
)
.documentation(
"Particle systems to spawn on the marker block when the player reveals it. Only the player who found the marker sees them, because discovery is per player."
)
.add()
.build();
@Nonnull
class="kw">private class="kw">static class="kw">final MetaKey<RevealMapMarkersInViewInteraction.ScanState> SCAN_STATE = Interaction.META_REGISTRY.registerMetaObject(var0 -> null);
class="kw">private float fieldOfView = 30.0F;
class="kw">private double maxDistance = 128.0;
class="kw">private float scanInterval = 0.25F;
class="kw">private float conditionGrace = 1.0F;
@Nullable
class="kw">private Condition[] runWhile;
@Nullable
class="kw">private WorldParticle[] revealParticles;
class="kw">public RevealMapMarkersInViewInteraction() {
}
@Nonnull
@Override
class="kw">public WaitForDataFrom getWaitForDataFrom() {
class="kw">return WaitForDataFrom.Server;
}
@Override
class="kw">protected void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
CommandBuffer var6 = var4.getCommandBuffer();
assert var6 != null;
Ref var7 = var4.getOwningEntity();
if (var7 == null) {
this.end(InteractionState.Failed, var1, var2, var3, var4, var5);
} else {
Player var8 = var6.getComponent(var7, Player.getComponentType());
if (var8 == null) {
this.end(InteractionState.Failed, var1, var2, var3, var4, var5);
} else {
DynamicMetaStore var9 = var4.getInstanceStore();
RevealMapMarkersInViewInteraction.ScanState var10 = var9.getIfPresentMetaObject(SCAN_STATE);
if (var1 || var10 == null) {
var10 = new RevealMapMarkersInViewInteraction.ScanState();
var9.putMetaObject(SCAN_STATE, var10);
}
if (var2 < var10.nextScanTime) {
var4.getState().state = InteractionState.NotFinished;
} else {
float var11 = var10.nextScanTime + this.scanInterval;
var10.nextScanTime = var11 > var2 ? var11 : var2 + this.scanInterval;
if (!this.shouldContinue(var10, var2, var7, var6)) {
this.end(InteractionState.Finished, var1, var2, var3, var4, var5);
} else {
this.scan(var8, var7, var6, var10);
if (this.runWhile == null) {
this.end(InteractionState.Finished, var1, var2, var3, var4, var5);
} else {
var4.getState().state = InteractionState.NotFinished;
}
}
}
}
}
}
@Override
class="kw">protected void simulateTick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
var4.getState().state = var4.getServerState().state;
super.tick0(var1, var2, var3, var4, var5);
}
class="kw">private boolean shouldContinue(
@Nonnull RevealMapMarkersInViewInteraction.ScanState var1, float var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4
) {
if (this.runWhile == null) {
class="kw">return true;
}
Instant var5 = var4.getResource(TimeResource.getResourceType()).getNow();
boolean var6 = Condition.allConditionsMet(var4, var3, var5, this.runWhile);
boolean var7 = continuesRunning(var6, var1.conditionsHeld, var2, this.conditionGrace);
if (var6) {
var1.conditionsHeld = true;
}
class="kw">return var7;
}
class="kw">static boolean continuesRunning(boolean var0, boolean var1, float var2, float var3) {
class="kw">return var0 ? true : !var1 && var2 < var3;
}
class="kw">private void scan(
@Nonnull Player var1,
@Nonnull Ref<EntityStore> var2,
@Nonnull ComponentAccessor<EntityStore> var3,
@Nonnull RevealMapMarkersInViewInteraction.ScanState var4
) {
var4.begin(var1, var2, var3, this.revealParticles);
try {
DiscoverableMapMarkers.forEachMarkerInView(var1, var3, this.fieldOfView, this.maxDistance, false, var4);
} class="kw">finally {
var4.end();
}
}
class="kw">private void end(
@Nonnull InteractionState var1, boolean var2, float var3, @Nonnull InteractionType var4, @Nonnull InteractionContext var5, @Nonnull CooldownHandler var6
) {
var5.getState().state = var1;
super.tick0(var2, var3, var4, var5, var6);
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "RevealMapMarkersInViewInteraction{fieldOfView="
+ this.fieldOfView
+ ", maxDistance="
+ this.maxDistance
+ ", scanInterval="
+ this.scanInterval
+ ", conditionGrace="
+ this.conditionGrace
+ ", runWhile="
+ Arrays.toString(this.runWhile)
+ ", revealParticles="
+ Arrays.toString(this.revealParticles)
+ "} "
+ super.toString();
}
class="kw">private class="kw">static class ScanState class="kw">implements TriIntObjectConsumer<String> {
class="kw">private float nextScanTime;
class="kw">private boolean conditionsHeld;
@Nullable
class="kw">private Player player;
@Nullable
class="kw">private ComponentAccessor<EntityStore> componentAccessor;
@Nullable
class="kw">private WorldParticle[] particles;
@Nonnull
class="kw">private class="kw">final List<Ref<EntityStore>> particleTargets = new ReferenceArrayList(1);
@Nonnull
class="kw">private class="kw">final Vector3d markerCenter = new Vector3d();
class="kw">private ScanState() {
}
class="kw">public void begin(@Nonnull Player var1, @Nonnull Ref<EntityStore> var2, @Nonnull ComponentAccessor<EntityStore> var3, @Nullable WorldParticle[] var4) {
this.player = var1;
this.componentAccessor = var3;
this.particles = var4;
this.particleTargets.clear();
this.particleTargets.add(var2);
}
class="kw">public void end() {
this.player = null;
this.componentAccessor = null;
this.particles = null;
this.particleTargets.clear();
}
class="kw">public void accept(int var1, int var2, int var3, @Nonnull String var4) {
assert this.player != null : "Scan state not initialized";
assert this.componentAccessor != null : "Scan state not initialized";
if (DiscoverableMapMarkers.reveal(this.player, var4)) {
if (this.particles != null) {
this.markerCenter.set(var1 + 0.5, var2 + 0.5, var3 + 0.5);
ParticleUtil.spawnParticleEffects(this.particles, this.markerCenter, null, this.particleTargets, this.componentAccessor);
}
}
}
}
}