DragPlaceBlockInteraction class

Пакет: com.hypixel.hytale.server.core.modules.interaction.interaction.config.client

Файл: com/hypixel/hytale/server/core/modules/interaction/interaction/config/client/DragPlaceBlockInteraction.java

extends: SimpleInteraction

Поля (12)

МодификаторыТипИмя
final BuilderCodec<DragPlaceBlockInteraction> CODEC
Integer var10
int var11
InteractionContext var13
PlacementGestureTracker var14
com.hypixel.hytale.protocol.DragPlaceBlockInteraction var2
InteractionSyncData var6
InteractionSyncData var6
DynamicMetaStore var7
int var8
int var9
var9

Методы (10)

МодификаторыВозвратСигнатура
abstract return new PlacementGestureTrackerreturn new PlacementGestureTracker()
for for(int var12 = 0; var12 < var11; var12++)
if if(var1)
if if(this.validateForkPositions)
if if(var6.forkCounts != null)
if if(var10 != null)
if if(var9 <= this.maxBlocksPerGesture && var9 >= var8)
if if(var14 != null)
if if(var8 >= var9 && var6.state != InteractionState.NotFinished)
if if(!var1)

Исходный код

Показать/скрыть
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.validation.Validators;
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.meta.DynamicMetaStore;
class="kw">import com.hypixel.hytale.server.core.meta.MetaKey;
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.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInteraction;
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.StringTag;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class DragPlaceBlockInteraction class="kw">extends SimpleInteraction {
   class="kw">public class="kw">static class="kw">final BuilderCodec<DragPlaceBlockInteraction> CODEC = BuilderCodec.builder(
         DragPlaceBlockInteraction.class, DragPlaceBlockInteraction::new, SimpleInteraction.CODEC
      )
      .documentation(
         "Places a sequence of blocks while the click is held, forking the given interactions once per committed block. Each fork carries its own block position and is validated independently at the tick it runs."
      )
      .<String>appendInherited(
         new KeyedCodec<>("ForkInteractions", RootInteraction.CHILD_ASSET_CODEC),
         (var0, var1) -> var0.forkInteractions = var1,
         var0 -> var0.forkInteractions,
         (var0, var1) -> var0.forkInteractions = var1.forkInteractions
      )
      .documentation("The interactions to run for each committed block.")
      .addValidator(Validators.nonNull())
      .addValidatorLate(() -> RootInteraction.VALIDATOR_CACHE.getValidator().late())
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("MaxBlocksPerTick", Codec.INTEGER),
         (var0, var1) -> var0.maxBlocksPerTick = var1,
         var0 -> var0.maxBlocksPerTick,
         (var0, var1) -> var0.maxBlocksPerTick = var1.maxBlocksPerTick
      )
      .documentation("The maximum number of block forks started per tick. Demand beyond this queues and drains at this rate.")
      .addValidator(Validators.greaterThanOrEqual(1))
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("MaxBlocksPerGesture", Codec.INTEGER),
         (var0, var1) -> var0.maxBlocksPerGesture = var1,
         var0 -> var0.maxBlocksPerGesture,
         (var0, var1) -> var0.maxBlocksPerGesture = var1.maxBlocksPerGesture
      )
      .documentation("The maximum number of blocks a single gesture may commit. The chain fails when a client exceeds it.")
      .addValidator(Validators.greaterThanOrEqual(1))
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("ValidateForkPositions", Codec.BOOLEAN),
         (var0, var1) -> var0.validateForkPositions = var1,
         var0 -> var0.validateForkPositions,
         (var0, var1) -> var0.validateForkPositions = var1.validateForkPositions
      )
      .documentation("Validates that each committed block position is plausible for the gesture's geometry, rejecting the placement otherwise.")
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("MaxForkPositionViolations", Codec.INTEGER),
         (var0, var1) -> var0.maxForkPositionViolations = var1,
         var0 -> var0.maxForkPositionViolations,
         (var0, var1) -> var0.maxForkPositionViolations = var1.maxForkPositionViolations
      )
      .documentation("The number of rejected block positions a single gesture tolerates before the chain fails.")
      .addValidator(Validators.greaterThanOrEqual(0))
      .add()
      .build();
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final MetaKey<Integer> FORKED_COUNT = Interaction.META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">private class="kw">static class="kw">final MetaKey<PlacementGestureTracker> GESTURE_TRACKER = Interaction.META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">public class="kw">static class="kw">final MetaKey<PlacementGestureTracker> FORK_GESTURE_TRACKER = Interaction.CONTEXT_META_REGISTRY.registerMetaObject(var0 -> null);
   class="kw">private class="kw">static class="kw">final StringTag TAG_FORK = StringTag.of("Fork");
   class="kw">private class="kw">static class="kw">final StringTag TAG_NEXT = StringTag.of("Next");
   class="kw">private class="kw">static class="kw">final StringTag TAG_FAILED = StringTag.of("Failed");
   class="kw">protected String forkInteractions;
   class="kw">protected int maxBlocksPerTick = 4;
   class="kw">protected int maxBlocksPerGesture = 512;
   class="kw">protected boolean validateForkPositions = true;
   class="kw">protected int maxForkPositionViolations = 8;

   class="kw">public DragPlaceBlockInteraction() {
   }

   @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;
      DynamicMetaStore var7 = var4.getInstanceStore();
      if (var1) {
         var7.putMetaObject(FORKED_COUNT, 0);
         if (this.validateForkPositions) {
            var7.putMetaObject(GESTURE_TRACKER, this.createGestureTracker());
         }
      }

      int var8 = var7.getMetaObject(FORKED_COUNT);
      int var9 = 0;
      if (var6.forkCounts != null) {
         Integer var10 = var6.forkCounts.get(var3);
         if (var10 != null) {
            var9 = var10;
         }
      }

      if (var9 <= this.maxBlocksPerGesture && var9 >= var8) {
         PlacementGestureTracker var14 = var7.getIfPresentMetaObject(GESTURE_TRACKER);
         if (var14 != null && var14.getViolations() > this.maxForkPositionViolations) {
            LOGGER.at(Level.WARNING)
               .log(
                  "%s sent too many implausible gesture block positions (%d rejected, max: %d)",
                  EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
                  var14.getViolations(),
                  this.maxForkPositionViolations
               );
            var4.getState().state = InteractionState.Failed;
            super.tick0(var1, var2, var3, var4, var5);
         } else {
            int var11 = Math.min(var9 - var8, this.maxBlocksPerTick);

            for (int var12 = 0; var12 < var11; var12++) {
               InteractionContext var13 = var4.duplicate();
               if (var14 != null) {
                  var13.getMetaStore().putMetaObject(FORK_GESTURE_TRACKER, var14);
               }

               var4.fork(var3, var13, RootInteraction.getRootInteractionOrUnknown(this.forkInteractions), true);
               var8++;
            }

            var7.putMetaObject(FORKED_COUNT, var8);
            if (var8 >= var9 && var6.state != InteractionState.NotFinished) {
               var4.getState().state = var6.state;
               super.tick0(var1, var2, var3, var4, var5);
            } else {
               var4.getState().state = InteractionState.NotFinished;
            }
         }
      } else {
         LOGGER.at(Level.WARNING)
            .log(
               "%s sent an invalid gesture fork count %d (spawned: %d, max: %d)",
               EntityUtils.getEntityName(var4.getEntity(), var4.getCommandBuffer()),
               var9,
               var8,
               this.maxBlocksPerGesture
            );
         var4.getState().state = InteractionState.Failed;
         super.tick0(var1, var2, var3, var4, var5);
      }
   }

   @Nonnull
   class="kw">protected PlacementGestureTracker createGestureTracker() {
      class="kw">return new PlacementGestureTracker();
   }

   @Override
   class="kw">protected void simulateTick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
      super.simulateTick0(var1, var2, var3, var4, var5);
      if (!Interaction.failed(var4.getState().state)) {
         InteractionSyncData var6 = var4.getClientState();
         assert var6 != null;
         if (!var1) {
            var4.getState().state = var6.state;
         }
      }
   }

   @Override
   class="kw">public boolean walk(@Nonnull Collector var1, @Nonnull InteractionContext var2) {
      if (this.forkInteractions != null
         && InteractionManager.walkInteractions(var1, var2, TAG_FORK, RootInteraction.getRootInteractionOrUnknown(this.forkInteractions).getInteractionIds())) {
         class="kw">return true;
      } else {
         class="kw">return this.next != null && InteractionManager.walkInteraction(var1, var2, TAG_NEXT, this.next)
            ? true
            : this.failed != null && InteractionManager.walkInteraction(var1, var2, TAG_FAILED, this.failed);
      }
   }

   @Override
   class="kw">public boolean needsRemoteSync() {
      class="kw">return true;
   }

   @Nonnull
   @Override
   class="kw">protected com.hypixel.hytale.protocol.Interaction generatePacket() {
      class="kw">return new com.hypixel.hytale.protocol.DragPlaceBlockInteraction();
   }

   @Override
   class="kw">protected void configurePacket(com.hypixel.hytale.protocol.Interaction var1) {
      super.configurePacket(var1);
      com.hypixel.hytale.protocol.DragPlaceBlockInteraction var2 = (com.hypixel.hytale.protocol.DragPlaceBlockInteraction)var1;
      var2.forkInteractions = RootInteraction.getRootInteractionIdOrUnknown(this.forkInteractions);
      var2.maxBlocksPerTick = this.maxBlocksPerTick;
      var2.maxBlocksPerGesture = this.maxBlocksPerGesture;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "DragPlaceBlockInteraction{forkInteractions='"
         + this.forkInteractions
         + "', maxBlocksPerTick="
         + this.maxBlocksPerTick
         + ", maxBlocksPerGesture="
         + this.maxBlocksPerGesture
         + ", validateForkPositions="
         + this.validateForkPositions
         + ", maxForkPositionViolations="
         + this.maxForkPositionViolations
         + "} "
         + super.toString();
   }
}