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;
}
}
}