HeadMotionAim class
Пакет: com.hypixel.hytale.server.npc.corecomponents.combat
Файл: com/hypixel/hytale/server/npc/corecomponents/combat/HeadMotionAim.java
extends: HeadMotionBase
implements: DebugSupport.DebugFlagsChangeListener
Поля (41)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
double |
MIN_RANGED_AIMING_DISTANCE |
|
Rotation3f |
var10 |
|
IPositionProvider |
var11 |
|
Ref |
var12 |
|
BallisticData |
var13 |
|
Box |
var14 |
|
|
var14 |
|
Velocity |
var15 |
|
BoundingBox |
var16 |
|
double |
var17 |
|
double |
var18 |
|
double |
var19 |
|
double |
var20 |
|
double |
var21 |
|
double |
var22 |
|
double |
var23 |
|
double |
var24 |
|
float |
var26 |
|
float |
var27 |
|
double |
var28 |
|
double |
var30 |
|
double |
var32 |
|
double |
var34 |
|
boolean |
var36 |
|
ThreadLocalRandom |
var37 |
|
double |
var38 |
|
double |
var39 |
|
double |
var40 |
|
double |
var41 |
|
float |
var42 |
|
|
var42 |
|
Vector3f |
var43 |
|
|
var43 |
|
float |
var44 |
|
|
var44 |
|
World |
var45 |
|
double |
var46 |
|
double |
var47 |
|
double |
var48 |
|
Transform |
var8 |
|
Vector3d |
var9 |
Методы (13)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
if if(var3 != null) |
|
|
if if(var12 != null) |
|
|
if if(var16 != null) |
|
|
if if(var13 != null) |
|
|
if if(this.deflection) |
|
|
if if(var21 > var19) |
|
|
if if(var13 != null) |
|
|
if if(!var36) |
|
|
if if(var36 && var13 != null) |
|
|
if if(var46 >= 1.0E-4) |
|
|
if if(var48 >= 1.0E-4) |
|
|
if if(this.debugAiming) |
abstract |
|
super super(var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.corecomponents.combat;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.server.core.entity.entities.ProjectileComponent;
class="kw">import com.hypixel.hytale.server.core.modules.debug.DebugUtils;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.BallisticData;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.TargetUtil;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.HeadMotionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderHeadMotionAim;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.movement.Steering;
class="kw">import com.hypixel.hytale.server.npc.role.RoleDebugFlags;
class="kw">import com.hypixel.hytale.server.npc.role.support.DebugSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.IPositionProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.util.AimingData;
class="kw">import com.hypixel.hytale.server.npc.util.NPCPhysicsMath;
class="kw">import java.util.EnumSet;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3f;
class="kw">public class HeadMotionAim class="kw">extends HeadMotionBase class="kw">implements DebugSupport.DebugFlagsChangeListener {
class="kw">public class="kw">static class="kw">final double MIN_RANGED_AIMING_DISTANCE = 4.0;
class="kw">protected class="kw">static class="kw">final ComponentType<EntityStore, TransformComponent> TRANSFORM_COMPONENT_TYPE = TransformComponent.getComponentType();
class="kw">protected class="kw">static class="kw">final ComponentType<EntityStore, BoundingBox> BOUNDING_BOX_COMPONENT_TYPE = BoundingBox.getComponentType();
class="kw">protected class="kw">final double spread;
class="kw">protected class="kw">final boolean deflection;
class="kw">protected class="kw">final double hitProbability;
class="kw">protected class="kw">final double relativeTurnSpeed;
class="kw">protected class="kw">final AimingData aimingData = new AimingData();
class="kw">protected Ref<EntityStore> lastTargetReference;
class="kw">protected boolean debugAiming;
class="kw">protected class="kw">final Vector3d startPosition = new Vector3d();
class="kw">protected class="kw">final Vector3d startOffset = new Vector3d();
class="kw">protected class="kw">final Vector3d targetPosition = new Vector3d();
class="kw">protected class="kw">final Vector3d targetOffset = new Vector3d();
class="kw">protected class="kw">final Vector3d relativeVelocity = new Vector3d();
class="kw">protected class="kw">final Vector3d spreadOffset = new Vector3d();
class="kw">public HeadMotionAim(@Nonnull BuilderHeadMotionAim var1, @Nonnull BuilderSupport var2) {
super(var1);
this.spread = var1.getSpread(var2);
this.hitProbability = var1.getHitProbability(var2);
this.deflection = var1.isDeflection(var2);
this.relativeTurnSpeed = var1.getRelativeTurnSpeed(var2);
}
@Override
class="kw">public void preComputeSteering(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, @Nonnull Store<EntityStore> var4) {
if (var3 != null) {
var3.passExtraInfo(this.aimingData);
}
}
@Override
class="kw">public void activate(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull ComponentAccessor<EntityStore> var3) {
this.aimingData.setHaveAttacked(true);
}
@Override
class="kw">public boolean computeSteering(
@Nonnull Ref<EntityStore> var1,
@Nonnull ExecutionSupport var2,
@Nullable InfoProvider var3,
double var4,
@Nonnull Steering var6,
@Nonnull ComponentAccessor<EntityStore> var7
) {
if (var3 != null && var3.hasPosition() && var3.getPositionProvider() != null) {
Transform var8 = TargetUtil.getLook(var1, var7);
Vector3d var9 = var8.getPosition();
Rotation3f var10 = var8.getRotation();
IPositionProvider var11 = var3.getPositionProvider();
var11.providePosition(this.targetPosition);
this.startPosition.set(var9);
this.relativeVelocity.zero();
Ref var12 = var11.getTarget();
BallisticData var13 = this.aimingData.getBallisticData();
Box var14 = Box.ZERO;
if (var12 != null) {
Velocity var15 = var7.getComponent(var12, Velocity.getComponentType());
assert var15 != null;
BoundingBox var16 = var7.getComponent(var12, BOUNDING_BOX_COMPONENT_TYPE);
if (var16 != null) {
var14 = var16.getBoundingBox();
}
if (var13 != null) {
if (this.deflection) {
this.relativeVelocity.set(var15.getVelocity());
}
} else {
double var17 = this.targetPosition.y();
double var19 = this.startPosition.y();
double var21 = var17 + var14.getMin().y;
double var23 = var17 + var14.getMax().y;
if (var21 > var19) {
this.targetPosition.y = var21;
} else if (var23 < var19) {
this.targetPosition.y = var23;
} else {
this.targetPosition.y = var19;
}
}
}
boolean var36 = this.startPosition.distanceSquared(this.targetPosition) <= 16.0;
if (var13 != null) {
this.aimingData.setDepthOffset(var13.getDepthShot(), var13.isPitchAdjustShot());
if (!var36) {
ProjectileComponent.computeStartOffset(
var13.isPitchAdjustShot(),
var13.getVerticalCenterShot(),
var13.getHorizontalCenterShot(),
var13.getDepthShot(),
var10.yaw(),
var10.pitch(),
this.startOffset
);
} else {
this.startOffset.zero();
}
if (var12 != null && !var12.equals(this.lastTargetReference)) {
this.lastTargetReference = var12;
this.aimingData.setHaveAttacked(true);
}
if (this.aimingData.isHaveAttacked()) {
ThreadLocalRandom var37 = ThreadLocalRandom.current();
this.spreadOffset.zero();
this.targetOffset.zero();
if (this.spread > 0.0 && var37.nextDouble() > this.hitProbability) {
double var40 = 2.0 * this.spread * this.startPosition.distance(this.targetPosition) / 10.0;
this.spreadOffset.set(var37.nextDouble() - 0.5, var37.nextDouble() - 0.5, var37.nextDouble() - 0.5).mul(var40);
} else {
double var39 = 0.1;
double var41 = 0.9;
this.targetOffset
.set(
NPCPhysicsMath.lerp(var14.getMin().x, var14.getMax().x, var37.nextDouble(0.1, 0.9)),
NPCPhysicsMath.lerp(var14.getMin().y, var14.getMax().y, var37.nextDouble(0.1, 0.9)),
NPCPhysicsMath.lerp(var14.getMin().z, var14.getMax().z, var37.nextDouble(0.1, 0.9))
);
}
this.aimingData.setHaveAttacked(false);
}
this.targetPosition.add(this.spreadOffset);
this.targetPosition.add(this.targetOffset);
this.startPosition.add(this.startOffset);
} else {
this.aimingData.setDepthOffset(0.0, false);
}
double var38 = this.targetPosition.x() - this.startPosition.x();
double var18 = this.targetPosition.y() - this.startPosition.y();
double var20 = this.targetPosition.z() - this.startPosition.z();
if (var36 && var13 != null) {
float var42 = var10.yaw();
float var44 = var10.pitch();
double var46 = var38 * var38 + var20 * var20;
if (var46 >= 1.0E-4) {
var42 = PhysicsMath.normalizeTurnAngle(PhysicsMath.headingFromDirection(var38, var20));
double var47 = 1.0 / Math.sqrt(var46);
double var28 = var13.getHorizontalCenterShot();
if (var13.getDepthShot() != 0.0 && !var13.isPitchAdjustShot()) {
var28 += var13.getDepthShot();
}
double var30 = var28 * var38 * var47;
double var32 = -var13.getVerticalCenterShot();
double var34 = var28 * var20 * var47;
this.startPosition.add(var30, var32, var34);
var38 -= var30;
var18 -= var32;
var20 -= var34;
}
double var48 = var46 + var18 * var18;
if (var48 >= 1.0E-4) {
var44 = PhysicsMath.pitchFromDirection(var38, var18, var20);
}
this.aimingData.setOrientation(var42, var44);
this.aimingData.setTarget(var12);
} else if (this.aimingData.computeSolution(var38, var18, var20, this.relativeVelocity.x(), this.relativeVelocity.y(), this.relativeVelocity.z())) {
this.aimingData.setTarget(var12);
} else {
double var22 = var38 * var38 + var20 * var20;
double var24 = var22 + var18 * var18;
float var26 = var22 >= 1.0E-4 ? PhysicsMath.normalizeTurnAngle(PhysicsMath.headingFromDirection(var38, var20)) : var10.yaw();
float var27 = var24 >= 1.0E-4 ? PhysicsMath.pitchFromDirection(var38, var18, var20) : var10.pitch();
this.aimingData.setOrientation(var26, var27);
this.aimingData.setTarget(null);
}
if (this.debugAiming) {
Vector3f var43 = DebugUtils.COLOR_WHITE;
if (this.aimingData.haveOrientation()) {
var43 = DebugUtils.COLOR_GREEN;
}
World var45 = var1.getStore().getExternalData().getWorld();
DebugUtils.addSphere(var45, this.targetPosition, var43, 0.5, 0.1F);
if (this.startPosition.distance(this.targetPosition) > 1.0E-4) {
DebugUtils.addArrow(var45, this.startPosition, new Vector3d(this.targetPosition).sub(this.startPosition).normalize(), var43, 0.1F, 1);
}
}
var6.clearTranslation();
var6.setYaw(this.aimingData.getYaw());
var6.setPitch(this.aimingData.getPitch());
var6.setRelativeTurnSpeed(this.relativeTurnSpeed);
class="kw">return true;
} else {
var6.clear();
class="kw">return true;
}
}
@Override
class="kw">public void registerWithSupport(ExecutionSupport var1) {
super.registerWithSupport(var1);
var1.getDebugSupport().registerDebugFlagsListener(this);
}
@Override
class="kw">public void onDebugFlagsChanged(EnumSet<RoleDebugFlags> var1) {
this.debugAiming = var1.contains(RoleDebugFlags.VisAiming);
}
}