Data class
Пакет: com.hypixel.hytale.server.core.modules.interaction.interaction.config.client
Файл: com/hypixel/hytale/server/core/modules/interaction/interaction/config/client/ChainingInteraction.java
implements: Component<EntityStore>
Поля (5)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private long |
lastAttack |
|
private final Object2IntMap<String> |
map |
|
private final Object2IntMap<String> |
namedMap |
|
long |
var1 |
|
ChainingInteraction.Data |
var1 |
Методы (5)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public Component<EntityStore> |
clonepublic Component<EntityStore> clone() |
|
public static ComponentType<EntityStore, ChainingInteraction.Data> |
getComponentTypepublic static ComponentType<EntityStore, ChainingInteraction.Data> getComponentType() |
|
public Object2IntMap<String> |
getNamedMappublic Object2IntMap<String> getNamedMap() |
|
public float |
getTimeSinceLastAttackInSecondspublic float getTimeSinceLastAttackInSeconds() |
|
|
if if(this.lastAttack == 0L) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.interaction.interaction.config.client;
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.codecs.map.MapCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.InteractionState;
class="kw">import com.hypixel.hytale.protocol.InteractionSyncData;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.WaitForDataFrom;
class="kw">import com.hypixel.hytale.server.core.entity.EntityUtils;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionManager;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.InteractionModule;
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.data.Collector;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.data.CollectorTag;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.Label;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.OperationsBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import java.util.Arrays;
class="kw">import java.util.HashMap;
class="kw">import java.util.Map;
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">public class ChainingInteraction class="kw">extends Interaction {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<ChainingInteraction> CODEC = BuilderCodec.builder(
ChainingInteraction.class, ChainingInteraction::new, Interaction.ABSTRACT_CODEC
)
.documentation("Runs one of the entries in `Next` based on how many times this interaction was run before the `ChainingAllowance` timer was reset.")
.<Double>appendInherited(
new KeyedCodec<>("ChainingAllowance", Codec.DOUBLE),
(var0, var1) -> var0.chainingAllowance = var1.floatValue(),
var0 -> (double)var0.chainingAllowance,
(var0, var1) -> var0.chainingAllowance = var1.chainingAllowance
)
.documentation(
"Time in seconds that the user has to run this interaction again in order to hit the next chain entry.\nResets the timer each time the interaction is reached."
)
.add()
.<String[]>appendInherited(
new KeyedCodec<>("Next", new ArrayCodec<>(Interaction.CHILD_ASSET_CODEC, String[]::new)),
(var0, var1) -> var0.next = var1,
var0 -> var0.next,
(var0, var1) -> var0.next = var1.next
)
.addValidator(Validators.nonNull())
.addValidator(Validators.nonNullArrayElements())
.addValidatorLate(() -> Interaction.VALIDATOR_CACHE.getArrayValidator().late())
.add()
.appendInherited(
new KeyedCodec<>("ChainId", Codec.STRING), (var0, var1) -> var0.chainId = var1, var0 -> var0.chainId, (var0, var1) -> var0.chainId = var1.chainId
)
.add()
.<Map>appendInherited(
new KeyedCodec<>("Flags", new MapCodec<>(CHILD_ASSET_CODEC, HashMap::new)),
(var0, var1) -> var0.flags = var1,
var0 -> var0.flags,
(var0, var1) -> var0.flags = var1.flags
)
.addValidatorLate(() -> Interaction.VALIDATOR_CACHE.getMapValueValidator().late())
.add()
.afterDecode(var0 -> {
if (var0.flags != null) {
String[] var1 = var0.sortedFlagKeys = var0.flags.keySet().toArray(String[]::new);
Arrays.sort(var1);
var0.flagIndex = new Object2IntOpenHashMap();
for (int var2 = 0; var2 < var1.length; var2++) {
var0.flagIndex.put(var1[var2], var2);
}
}
})
.build();
class="kw">protected String chainId;
class="kw">protected float chainingAllowance;
class="kw">protected String[] next;
@Nullable
class="kw">protected Map<String, String> flags;
@Nullable
class="kw">protected Object2IntMap<String> flagIndex;
class="kw">private String[] sortedFlagKeys;
class="kw">private class="kw">static class="kw">final float MAX_GRACE_SECONDS = 0.5F;
class="kw">private class="kw">static class="kw">final float GRACE_RATIO = 0.25F;
class="kw">public ChainingInteraction() {
}
@Nonnull
@Override
class="kw">public WaitForDataFrom getWaitForDataFrom() {
class="kw">return WaitForDataFrom.Client;
}
@Override
class="kw">protected void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
InteractionSyncData var6 = var4.getClientState();
assert var6 != null;
InteractionSyncData var7 = var4.getState();
if (var6.flagIndex != -1) {
if (this.sortedFlagKeys != null && var6.flagIndex >= 0 && var6.flagIndex < this.sortedFlagKeys.length) {
var7.state = InteractionState.Finished;
var4.jump(var4.getLabel(this.next.length + var6.flagIndex));
} else {
LOGGER.at(Level.WARNING)
.log(
"%s sent out-of-bounds flagIndex %d (max %d)",
EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
var6.flagIndex,
this.sortedFlagKeys != null ? this.sortedFlagKeys.length : 0
);
var7.state = InteractionState.Failed;
}
} else if (var6.chainingIndex == -1) {
var7.state = InteractionState.NotFinished;
} else if (var6.chainingIndex >= 0 && var6.chainingIndex < this.next.length) {
CommandBuffer var8 = var4.getCommandBuffer();
if (var8 != null) {
Ref var9 = var4.getEntity();
if (var8.getComponent(var9, Player.getComponentType()) != null) {
ChainingInteraction.Data var10 = var8.ensureAndGetComponent(var9, ChainingInteraction.Data.getComponentType());
if (var10 != null) {
String var11 = this.chainId == null ? this.id : this.chainId;
Object2IntMap var12 = this.chainId == null ? var10.map : var10.namedMap;
if (!this.isAcceptedChainIndex(var6.chainingIndex, var12, var11, var10)) {
LOGGER.at(Level.WARNING)
.log(
"%s sent unexpected chainingIndex %d for chain '%s'",
EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
var6.chainingIndex,
var11
);
}
var12.put(var11, var6.chainingIndex);
var10.lastAttack = System.nanoTime();
}
}
}
var7.state = InteractionState.Finished;
var4.jump(var4.getLabel(var6.chainingIndex));
} else {
LOGGER.at(Level.WARNING)
.log(
"%s sent out-of-bounds chainingIndex %d (max %d)",
EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
var6.chainingIndex,
this.next.length
);
var7.state = InteractionState.Failed;
}
}
class="kw">private boolean isAcceptedChainIndex(int var1, @Nonnull Object2IntMap<String> var2, @Nonnull String var3, @Nonnull ChainingInteraction.Data var4) {
int var5 = var2.getInt(var3);
float var6 = var4.getTimeSinceLastAttackInSeconds();
if (var6 == 0.0F) {
class="kw">return var1 == 0;
}
int var7 = var5 + 1;
if (var7 >= this.next.length) {
var7 = 0;
}
float var8 = Math.min(0.5F, this.chainingAllowance * 0.25F);
boolean var9 = this.chainingAllowance > 0.0F && var6 > this.chainingAllowance;
boolean var10 = this.chainingAllowance > 0.0F && var6 > this.chainingAllowance - var8 && var6 <= this.chainingAllowance + var8;
int var11 = var9 ? 0 : var7;
class="kw">return !var10 ? var1 == var11 : var1 == 0 || var1 == var7;
}
@Override
class="kw">protected void simulateTick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
if (var1) {
CommandBuffer var6 = var4.getCommandBuffer();
assert var6 != null;
Ref var7 = var4.getEntity();
ChainingInteraction.Data var8 = var6.getComponent(var7, ChainingInteraction.Data.getComponentType());
if (var8 != null) {
InteractionSyncData var9 = var4.getState();
String var10 = this.chainId == null ? this.id : this.chainId;
Object2IntMap var11 = this.chainId == null ? var8.map : var8.namedMap;
int var12 = var11.getInt(var10);
if (++var12 >= this.next.length) {
var12 = 0;
}
if (this.chainingAllowance > 0.0F && var8.getTimeSinceLastAttackInSeconds() > this.chainingAllowance) {
var12 = 0;
}
var11.put(var10, var12);
var9.chainingIndex = var12;
var9.state = InteractionState.Finished;
var4.jump(var4.getLabel(var12));
var8.lastAttack = System.nanoTime();
}
}
}
@Override
class="kw">public void compile(@Nonnull OperationsBuilder var1) {
int var2 = this.next.length + (this.sortedFlagKeys != null ? this.sortedFlagKeys.length : 0);
Label[] var3 = new Label[var2];
for (int var4 = 0; var4 < var3.length; var4++) {
var3[var4] = var1.createUnresolvedLabel();
}
var1.addOperation(this, var3);
Label var8 = var1.createUnresolvedLabel();
for (int var5 = 0; var5 < this.next.length; var5++) {
var1.resolveLabel(var3[var5]);
Interaction var6 = Interaction.getInteractionOrUnknown(this.next[var5]);
var6.compile(var1);
var1.jump(var8);
}
if (this.flags != null) {
for (int var9 = 0; var9 < this.sortedFlagKeys.length; var9++) {
String var10 = this.sortedFlagKeys[var9];
var1.resolveLabel(var3[this.next.length + var9]);
Interaction var7 = Interaction.getInteractionOrUnknown(this.flags.get(var10));
var7.compile(var1);
var1.jump(var8);
}
}
var1.resolveLabel(var8);
}
@Override
class="kw">public boolean walk(@Nonnull Collector var1, @Nonnull InteractionContext var2) {
for (int var3 = 0; var3 < this.next.length; var3++) {
if (InteractionManager.walkInteraction(var1, var2, ChainingInteraction.ChainingTag.of(var3), this.next[var3])) {
class="kw">return true;
}
}
class="kw">return false;
}
@Nonnull
@Override
class="kw">protected com.hypixel.hytale.protocol.Interaction generatePacket() {
class="kw">return new com.hypixel.hytale.protocol.ChainingInteraction();
}
@Override
class="kw">protected void configurePacket(com.hypixel.hytale.protocol.Interaction var1) {
super.configurePacket(var1);
com.hypixel.hytale.protocol.ChainingInteraction var2 = (com.hypixel.hytale.protocol.ChainingInteraction)var1;
var2.chainingAllowance = this.chainingAllowance;
int[] var3 = var2.chainingNext = new int[this.next.length];
for (int var4 = 0; var4 < this.next.length; var4++) {
var3[var4] = Interaction.getInteractionIdOrUnknown(this.next[var4]);
}
if (this.flags != null) {
var2.flags = new Object2IntOpenHashMap();
for (Entry var5 : this.flags.entrySet()) {
var2.flags.put(var5.getKey(), Interaction.getInteractionIdOrUnknown(var5.getValue()));
}
}
var2.chainId = this.chainId;
}
@Override
class="kw">public boolean needsRemoteSync() {
class="kw">return true;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "ChainingInteraction{chainingAllowance=" + this.chainingAllowance + ", next=" + Arrays.toString(this.next) + "} " + super.toString();
}
class="kw">public class="kw">static class="kw">final class ChainingTag class="kw">implements CollectorTag {
class="kw">private class="kw">final int index;
class="kw">private ChainingTag(int var1) {
this.index = var1;
}
class="kw">public int getIndex() {
class="kw">return this.index;
}
@Override
class="kw">public boolean equals(@Nullable Object var1) {
if (this == var1) {
class="kw">return true;
} else if (var1 != null && this.getClass() == var1.getClass()) {
ChainingInteraction.ChainingTag var2 = (ChainingInteraction.ChainingTag)var1;
class="kw">return this.index == var2.index;
} else {
class="kw">return false;
}
}
@Override
class="kw">public int hashCode() {
class="kw">return this.index;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "ChainingTag{index=" + this.index + "}";
}
@Nonnull
class="kw">public class="kw">static ChainingInteraction.ChainingTag of(int var0) {
class="kw">return new ChainingInteraction.ChainingTag(var0);
}
}
class="kw">public class="kw">static class Data class="kw">implements Component<EntityStore> {
class="kw">private class="kw">final Object2IntMap<String> map = new Object2IntOpenHashMap();
class="kw">private class="kw">final Object2IntMap<String> namedMap = new Object2IntOpenHashMap();
class="kw">private long lastAttack;
class="kw">public Data() {
}
class="kw">public class="kw">static ComponentType<EntityStore, ChainingInteraction.Data> getComponentType() {
class="kw">return InteractionModule.get().getChainingDataComponent();
}
class="kw">public float getTimeSinceLastAttackInSeconds() {
if (this.lastAttack == 0L) {
class="kw">return 0.0F;
}
long var1 = System.nanoTime() - this.lastAttack;
class="kw">return (float)var1 / 1.0E9F;
}
@Nonnull
class="kw">public Object2IntMap<String> getNamedMap() {
class="kw">return this.namedMap;
}
@Nonnull
@Override
class="kw">public Component<EntityStore> clone() {
ChainingInteraction.Data var1 = new ChainingInteraction.Data();
var1.map.putAll(this.map);
var1.namedMap.putAll(this.namedMap);
var1.lastAttack = this.lastAttack;
class="kw">return var1;
}
}
}