BallisticMode enum

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

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

implements: Supplier<String>

Поля (1)

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

Методы (2)

МодификаторыВозвратСигнатура
abstract Random Random("Random long or short")
public String getpublic String get()

Исходный код

Показать/скрыть
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;
      }
   }
}