AttackType enum

Пакет: com.hypixel.hytale.server.npc.corecomponents.combat

Файл: com/hypixel/hytale/server/npc/corecomponents/combat/ActionAttack.java

implements: Supplier<String>

Поля (2)

МодификаторыТипИмя
private final String description
private final InteractionType interactionType

Методы (3)

МодификаторыВозвратСигнатура
abstract Ability3 Ability3(InteractionType.Ability3, "Ability 3")
public String getpublic String get()
public InteractionType getInteractionTypepublic InteractionType getInteractionType()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.corecomponents.combat;

class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.random.RandomExtra;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionChain;
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.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.InteractionModule;
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.data.SingleCollector;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.BallisticData;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.BallisticDataProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.ActionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderActionAttack;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.interactions.NPCInteractionSimulationHandler;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.support.CombatSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.parameterproviders.ParameterProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.parameterproviders.StringParameterProvider;
class="kw">import com.hypixel.hytale.server.npc.util.AimingData;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.function.Supplier;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class ActionAttack class="kw">extends ActionBase {
   @Nonnull
   class="kw">public class="kw">static class="kw">final ThreadLocal<SingleCollector<BallisticData>> THREAD_LOCAL_COLLECTOR = ThreadLocal.withInitial(
      () -> new SingleCollector<>(
         (var0, var1, var2) -> var2 class="kw">instanceof BallisticDataProvider var3
               && Interaction.getAssetMap().getKeysForTag(CombatSupport.AIMING_REFERENCE_TAG_INDEX).contains(var2.getId())
            ? var3.getBallisticData()
            : null
      )
   );
   class="kw">protected class="kw">final int id;
   @Nullable
   class="kw">protected String attack;
   class="kw">protected class="kw">final InteractionType interactionType;
   class="kw">protected class="kw">final float chargeFor;
   class="kw">protected class="kw">final double[] attackPauseRange;
   class="kw">protected class="kw">final double[] aimingTimeRange;
   class="kw">protected class="kw">final double meleeConeAngle;
   class="kw">protected class="kw">final ActionAttack.BallisticMode ballisticMode;
   class="kw">protected class="kw">final boolean checkLineOfSight;
   class="kw">protected class="kw">final boolean avoidFriendlyFire;
   class="kw">protected class="kw">final boolean damageFriendlies;
   class="kw">protected class="kw">final boolean skipAiming;
   class="kw">protected class="kw">final double chargeDistance;
   class="kw">protected class="kw">final int attackParameterSlot;
   @Nullable
   class="kw">protected class="kw">final Map<String, String> interactionVars;
   class="kw">protected boolean attackReady;
   @Nullable
   class="kw">protected String attackInteraction;
   class="kw">protected boolean ballisticShort;
   class="kw">protected StringParameterProvider cachedAttackProvider;
   class="kw">protected boolean initialised;
   class="kw">protected double aimingTimeRemaining;
   class="kw">protected Role ownerRole;

   class="kw">public ActionAttack(@Nonnull BuilderActionAttack var1, @Nonnull BuilderSupport var2) {
      super(var1);
      this.id = var2.getNextAttackIndex();
      this.attack = var1.getAttack(var2);
      this.interactionType = var1.getAttackType(var2).getInteractionType();
      this.chargeFor = var1.getChargeTime(var2);
      this.attackPauseRange = var1.getAttackPauseRange(var2);
      this.aimingTimeRange = var1.getAimingTimeRange(var2);
      this.meleeConeAngle = var1.getMeleeConeAngle();
      this.ballisticMode = var1.getBallisticMode();
      this.checkLineOfSight = var1.isCheckLineOfSight();
      this.avoidFriendlyFire = var1.isAvoidFriendlyFire();
      this.damageFriendlies = var1.isDamageFriendlies();
      this.skipAiming = var1.isSkipAiming();
      this.chargeDistance = var1.getChargeDistance(var2);
      this.attackParameterSlot = var1.getAttackParameterSlot(var2);
      this.interactionVars = var1.getInteractionVars();
   }

   @Override
   class="kw">public boolean canExecute(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, double var4, @Nonnull Store<EntityStore> var6
   ) {
      class="kw">return super.canExecute(var1, var2, var3, var4, var6) && !var2.getCombatSupport().isExecutingAttack();
   }

   @Override
   class="kw">public boolean execute(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, double var4, @Nonnull Store<EntityStore> var6
   ) {
      super.execute(var1, var2, var3, var4, var6);
      this.ownerRole = var2.getRole();
      CombatSupport var7 = var2.getCombatSupport();
      InteractionManager var8 = var6.getComponent(var1, InteractionModule.get().getInteractionManagerComponent());
      assert var8 != null;
      NPCEntity var9 = var6.getComponent(var1, NPCEntity.getComponentType());
      assert var9 != null;
      if (!this.initialised) {
         ParameterProvider var10 = this.attackParameterSlot >= 0 && var3 != null ? var3.getParameterProvider(this.attackParameterSlot) : null;
         if (var10 class="kw">instanceof StringParameterProvider) {
            this.cachedAttackProvider = (StringParameterProvider)var10;
         }

         this.initialised = true;
      }

      if (this.cachedAttackProvider != null) {
         this.attackInteraction = this.cachedAttackProvider.getStringParameter();
      }

      AimingData var18 = var3 != null ? var3.getPassedExtraInfo(AimingData.class) : null;
      AimingData var11 = var18 != null && var18.isClaimedBy(this.id) ? var18 : null;
      if (!this.attackReady) {
         this.attackReady = true;
         this.aimingTimeRemaining = this.newAimingTime();
         String var12 = var7.getNextAttackOverride();
         if (var12 != null) {
            if (!RootInteraction.getAssetMap().getKeysForTag(CombatSupport.ATTACK_TAG_INDEX).contains(var12)) {
               this.attackReady = false;
               ((HytaleLogger.Api)NPCPlugin.get().getLogger().at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
                  .log("NPC: %s using interaction %s that is not tagged as an 'Attack' usable by NPCs", var9.getRoleName(), var12);
               class="kw">return true;
            }

            this.attackInteraction = var12;
         } else if (this.attack != null && !this.attack.isEmpty()) {
            this.attackInteraction = this.attack;
         } else {
            ItemStack var13 = InventoryComponent.getItemInHand(var6, var1);
            InteractionContext var14 = InteractionContext.forInteraction(var8, var1, this.interactionType, var6);
            String var15 = var14.getRootInteractionId(this.interactionType);
            if (var15 == null) {
               this.attackReady = false;
               ((HytaleLogger.Api)NPCPlugin.get().getLogger().at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
                  .log(
                     "NPC: %s using nonexistent interaction of type %s using weapon %s in Attack action",
                     var9.getRoleName(),
                     this.interactionType,
                     var13 == null ? "empty" : var13.getItemId()
                  );
               class="kw">return true;
            }

            Set var16 = RootInteraction.getAssetMap().getKeysForTag(CombatSupport.ATTACK_TAG_INDEX);
            if (!var16.contains(var15)) {
               this.attackReady = false;
               ((HytaleLogger.Api)NPCPlugin.get().getLogger().at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
                  .log(
                     "NPC: %s with weapon %s, using interaction of type %s that is not tagged as an 'Attack' usable by NPCs",
                     var9.getRoleName(),
                     var13 == null ? "empty" : var13.getItemId(),
                     this.interactionType
                  );
               class="kw">return true;
            }

            this.attackInteraction = var15;
         }

         if (!this.skipAiming && var11 != null) {
            SingleCollector var21 = THREAD_LOCAL_COLLECTOR.get();
            var8.walkChain(var1, var21, InteractionType.Primary, RootInteraction.getAssetMap().getAsset(this.attackInteraction), var6);
            BallisticData var23 = var21.getResult();
            if (var23 != null) {
               var11.requireBallistic(var23);

               this.ballisticShort = class="kw">switch (this.ballisticMode) {
                  case Short -> true;
                  case Long -> false;
                  case Alternate -> !this.ballisticShort;
                  case Random -> RandomExtra.randomBoolean();
               };
               var11.setUseFlatTrajectory(this.ballisticShort);
            } else {
               if (this.chargeDistance > 0.0) {
                  var11.setChargeDistance(this.chargeDistance);
                  var11.setDesiredHitAngle(this.meleeConeAngle);
               }

               var11.requireCloseCombat();
            }

            class="kw">return false;
         }
      }

      TransformComponent var19 = var6.getComponent(var1, TransformComponent.getComponentType());
      assert var19 != null;
      HeadRotation var20 = var6.getComponent(var1, HeadRotation.getComponentType());
      assert var20 != null;
      Rotation3f var22 = var11 != null && var11.getChargeDistance() > 0.0 ? var19.getRotation() : var20.getRotation();
      if (this.hasTimeForAiming(var4) && var11 != null && !var11.isOnTarget(var22.yaw(), var22.pitch(), this.meleeConeAngle)) {
         var11.clearSolution();
         class="kw">return false;
      }

      Ref var24 = var11 != null ? var11.getTarget() : null;
      if (!this.checkLineOfSight || var24 != null && var2.getPositionCache().hasLineOfSight(var1, var24, var6)) {
         if (this.avoidFriendlyFire && var24 != null && var2.getPositionCache().isFriendlyBlockingLineOfSight(var1, var24, var6)) {
            var11.clearSolution();
            class="kw">return true;
         }

         ((NPCInteractionSimulationHandler)var8.getInteractionSimulationHandler()).requestChargeTime(this.chargeFor);
         InteractionContext var25 = InteractionContext.forInteraction(var8, var1, this.interactionType, var6);
         var25.setInteractionVarsGetter(this::getInteractionVars);
         InteractionChain var17 = var8.initChain(this.interactionType, var25, RootInteraction.getRootInteractionOrUnknown(this.attackInteraction), false);
         var8.queueExecuteChain(var17);
         var7.setExecutingAttack(var17, this.damageFriendlies, this.newAttackPause());
         if (var11 != null) {
            var11.setHaveAttacked(true);
         }

         this.attackReady = false;
         class="kw">return true;
      } else {
         if (var11 != null) {
            var11.clearSolution();
         }

         class="kw">return true;
      }
   }

   @Override
   class="kw">public void activate(ExecutionSupport var1, @Nullable InfoProvider var2) {
      super.activate(var1, var2);
      if (var2 != null) {
         AimingData var3 = var2.getPassedExtraInfo(AimingData.class);
         if (var3 != null) {
            var3.tryClaim(this.id);
         }
      }
   }

   @Override
   class="kw">public void deactivate(ExecutionSupport var1, @Nullable InfoProvider var2) {
      super.deactivate(var1, var2);
      if (var2 != null) {
         AimingData var3 = var2.getPassedExtraInfo(AimingData.class);
         if (var3 != null) {
            var3.release();
         }
      }
   }

   class="kw">protected boolean hasTimeForAiming(double var1) {
      if (this.aimingTimeRemaining > 0.0) {
         this.aimingTimeRemaining -= var1;
         class="kw">return true;
      } else {
         class="kw">return false;
      }
   }

   class="kw">protected double newAimingTime() {
      class="kw">return this.aimingTimeRange[1] > 0.0 ? RandomExtra.randomRange(this.aimingTimeRange) : 0.0;
   }

   class="kw">protected double newAttackPause() {
      class="kw">return RandomExtra.randomRange(this.attackPauseRange[0], this.attackPauseRange[1]);
   }

   @Nullable
   class="kw">private Map<String, String> getInteractionVars(InteractionContext var1) {
      class="kw">return this.interactionVars == null ? this.ownerRole.getInteractionVars() : this.interactionVars;
   }

   class="kw">public enum AttackType class="kw">implements Supplier<String> {
      Primary(InteractionType.Primary, "Primary attack"),
      Secondary(InteractionType.Secondary, "Secondary attack"),
      Ability1(InteractionType.Ability1, "Ability 1"),
      Ability2(InteractionType.Ability2, "Ability 2"),
      Ability3(InteractionType.Ability3, "Ability 3");

      class="kw">private class="kw">final String description;
      class="kw">private class="kw">final InteractionType interactionType;

      AttackType(InteractionType nullxx, String nullxxx) {
         this.interactionType = nullxx;
         this.description = nullxxx;
      }

      class="kw">public String get() {
         class="kw">return this.description;
      }

      class="kw">public InteractionType getInteractionType() {
         class="kw">return this.interactionType;
      }
   }

   class="kw">public enum BallisticMode class="kw">implements Supplier<String> {
      Short("Shorter flight curve"),
      Long("Longer flight curve"),
      Alternate("Alternate between long and short"),
      Random("Random long or short");

      class="kw">private class="kw">final String description;

      BallisticMode(String nullxx) {
         this.description = nullxx;
      }

      class="kw">public String get() {
         class="kw">return this.description;
      }
   }
}