HyCodeYourTale
classpublicPriority 3

InteractionEntry

com.hypixel.hytale.server.core.entity.InteractionEntry

25

Methods

25

Public Methods

12

Fields

1

Constructors

Constants

HytaleLoggerLOGGER= HytaleLogger.forEnclosingClass()

Constructors

public
InteractionEntry(int index, int counter, int rootInteraction)

Methods

Public Methods (25)

public
boolean consumeDesyncFlag()
public
boolean consumeSendInitial()
public
void flagDesync()
public
InteractionSyncData getClientState()
@Nullable
public
int getIndex()
public
DynamicMetaStore<Interaction> getMetaStore()
@Nonnull
public
int getNextForkId()
public
int getServerDataHashCode()
public
InteractionSyncData getServerState()
@Nonnull
public
InteractionSyncData getSimulationState()
@Nonnull
public
InteractionSyncData getState()
@Nonnull
public
float getTimeInSeconds(long tickTime)
public
long getTimestamp()
public
long getWaitingForClientFinished()
public
long getWaitingForServerFinished()
public
long getWaitingForSyncData()
public
boolean isUseSimulationState()
public
int nextForkId()
public
boolean setClientState(InteractionSyncData clientState)
public
void setTimestamp(long timestamp, float shift)
public
void setUseSimulationState(boolean useSimulationState)
public
void setWaitingForClientFinished(long waitingForClientFinished)
public
void setWaitingForServerFinished(long waitingForServerFinished)
public
void setWaitingForSyncData(long waitingForSyncData)
public
String toString()
@Nonnull@Override

Fields

Private/Package Fields (12)

privateInteractionSyncData clientState
privateboolean desynced
privateint index
privateDynamicMetaStore<Interaction> metaStore
privateboolean shouldSendInitial
privateInteractionSyncData simulationState
privatelong simulationTimestamp
privatelong timestamp
privateboolean useSimulationState
privatelong waitingForClientFinished
privatelong waitingForServerFinished
privatelong waitingForSyncData

Related Classes

Source Code

package com.hypixel.hytale.server.core.entity;

import com.hypixel.hytale.logger.HytaleLogger;
import com.hypixel.hytale.protocol.InteractionState;
import com.hypixel.hytale.protocol.InteractionSyncData;
import com.hypixel.hytale.server.core.meta.DynamicMetaStore;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.Operation;
import java.util.logging.Level;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class InteractionEntry {
   private static final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   private final int index;
   @Nonnull
   private final DynamicMetaStore<Interaction> metaStore;
   private long timestamp;
   private long simulationTimestamp;
   private final InteractionSyncData serverState = new InteractionSyncData();
   private InteractionSyncData simulationState;
   @Nullable
   private InteractionSyncData clientState;
   private long waitingForSyncData;
   private long waitingForServerFinished;
   private long waitingForClientFinished;
   private boolean useSimulationState;
   private boolean desynced;
   private boolean shouldSendInitial = true;

   public InteractionEntry(int index, int counter, int rootInteraction) {
      this.index = index;
      this.metaStore = new DynamicMetaStore<>(null, Interaction.META_REGISTRY);
      this.serverState.operationCounter = counter;
      this.serverState.rootInteraction = rootInteraction;
      this.serverState.state = InteractionState.NotFinished;
   }

   public int getIndex() {
      return this.index;
   }

   public int nextForkId() {
      return this.serverState.totalForks++;
   }

   public int getNextForkId() {
      return this.serverState.totalForks;
   }

   @Nonnull
   public InteractionSyncData getState() {
      return this.useSimulationState ? this.getSimulationState() : this.getServerState();
   }

   public void setUseSimulationState(boolean useSimulationState) {
      this.useSimulationState = useSimulationState;
   }

   public float getTimeInSeconds(long tickTime) {
      long timestamp = this.getTimestamp();
      if (timestamp == 0L) {
         return 0.0F;
      } else {
         long diff = tickTime - timestamp;
         return (float)diff / 1.0E9F;
      }
   }

   public void setTimestamp(long timestamp, float shift) {
      timestamp -= (long)(shift * 1.0E9F);
      if (this.useSimulationState) {
         this.simulationTimestamp = timestamp;
      } else {
         this.timestamp = timestamp;
      }
   }

   public long getTimestamp() {
      return this.useSimulationState ? this.simulationTimestamp : this.timestamp;
   }

   public boolean isUseSimulationState() {
      return this.useSimulationState;
   }

   @Nullable
   public InteractionSyncData getClientState() {
      return this.clientState;
   }

   @Nonnull
   public DynamicMetaStore<Interaction> getMetaStore() {
      return this.metaStore;
   }

   public int getServerDataHashCode() {
      InteractionSyncData serverData = this.getState();
      float progress = serverData.progress;
      serverData.progress = (float)((int)progress);
      int hashCode = serverData.hashCode();
      serverData.progress = progress;
      return hashCode;
   }

   @Nonnull
   public InteractionSyncData getServerState() {
      return this.serverState;
   }

   @Nonnull
   public InteractionSyncData getSimulationState() {
      if (this.simulationState == null) {
         this.simulationState = new InteractionSyncData();
         this.simulationState.operationCounter = this.serverState.operationCounter;
         this.simulationState.rootInteraction = this.serverState.rootInteraction;
         this.simulationState.state = InteractionState.NotFinished;
      }

      return this.simulationState;
   }

   public boolean setClientState(@Nullable InteractionSyncData clientState) {
      if (clientState != null
         && (clientState.operationCounter != this.serverState.operationCounter || clientState.rootInteraction != this.serverState.rootInteraction)) {
         HytaleLogger.Api ctx = LOGGER.at(Level.WARNING);
         if (ctx.isEnabled()) {
            RootInteraction root = RootInteraction.getAssetMap().getAsset(this.serverState.rootInteraction);
            Operation op = root.getOperation(this.serverState.operationCounter);
            String info;
            if (op.getInnerOperation() instanceof Interaction interaction) {
               info = interaction.getId() + " (" + interaction.getClass().getSimpleName() + ")";
            } else {
               info = op + " (" + op.getClass().getSimpleName() + ")";
            }

            ctx.log(
               "%d: Client/Server desync %d != %d, %d != %d (for %s)",
               this.index,
               this.serverState.operationCounter,
               clientState.operationCounter,
               this.serverState.rootInteraction,
               clientState.rootInteraction,
               info
            );
         }

         return false;
      } else {
         this.clientState = clientState;
         return true;
      }
   }

   public long getWaitingForSyncData() {
      return this.waitingForSyncData;
   }

   public void setWaitingForSyncData(long waitingForSyncData) {
      this.waitingForSyncData = waitingForSyncData;
   }

   public long getWaitingForServerFinished() {
      return this.waitingForServerFinished;
   }

   public void setWaitingForServerFinished(long waitingForServerFinished) {
      this.waitingForServerFinished = waitingForServerFinished;
   }

   public long getWaitingForClientFinished() {
      return this.waitingForClientFinished;
   }

   public void setWaitingForClientFinished(long waitingForClientFinished) {
      this.waitingForClientFinished = waitingForClientFinished;
   }

   public boolean consumeDesyncFlag() {
      boolean flag = this.desynced;
      this.desynced = false;
      return flag;
   }

   public void flagDesync() {
      this.desynced = true;
   }

   public boolean consumeSendInitial() {
      boolean flag = this.shouldSendInitial;
      this.shouldSendInitial = false;
      return flag;
   }

   @Nonnull
   @Override
   public String toString() {
      return "InteractionEntry{index="
         + this.index
         + ", metaStore="
         + this.metaStore
         + ", timestamp="
         + this.timestamp
         + ", getTimeInSeconds()="
         + this.getTimeInSeconds(System.nanoTime())
         + ", simulationTimestamp="
         + this.simulationTimestamp
         + ", serverState="
         + this.serverState
         + ", simulationState="
         + this.simulationState
         + ", clientState="
         + this.clientState
         + ", waitingForSyncData="
         + this.waitingForSyncData
         + ", waitingForServerFinished="
         + this.waitingForServerFinished
         + ", waitingForClientFinished="
         + this.waitingForClientFinished
         + ", useSimulationState="
         + this.useSimulationState
         + ", desynced="
         + this.desynced
         + "}";
   }
}