DeployableTurretConfig class

Пакет: com.hypixel.hytale.builtin.deployables.config

Файл: com/hypixel/hytale/builtin/deployables/config/DeployableTurretConfig.java

extends: DeployableConfig

Поля (83)

МодификаторыТипИмя
break
break
break
return
HeadRotation var10
Vector3f var10
AtomicReference var10
float var10
Vector3d var11
Vector3d var11
Vector3d var11
boolean var12
var12
var12
Vector3d var12
Ref var13
var13
Vector3d var13
TransformComponent var14
double var14
return var17 < var14
Vector3d var14
Vector3d var15
Vector3d var16
Vector3i var16
double var17
boolean var18
TransformComponent var19
StandardPhysicsProvider var19
BlockType var2
Vector3d var20
Vector3d var21
Vector3d var22
var22
TransformComponent var23
Ref var24
var24
Vector3dc var25
Vector3d var26
Vector3d var27
Rotation3fc var28
var28
DespawnComponent var3
BlockMaterial var3
Rotation3fc var31
var31
TransformComponent var32
int var33
Vector3d var34
float var35
boolean var36
var36
var36
Vector3d var37
Vector3d var38
Instant var4
WorldTimeResource var4
DeployableComponent var4
Instant var5
UUID var5
Vector3f var5
List var5
KnockbackComponent var5
World var6
UUIDComponent var6
Vector3d var6
List var6
TransformComponent var6
TransformComponent var6
Ref var7
DeployableProjectileShooterComponent var7
Ref var7
double var7
Vector3d var7
Damage var7
Vector3d var8
EntityGroup var8
DeployableProjectileComponent var8
TransformComponent var8
Vector3d var9
World var9
Ref var9
Vector3d var9

Методы (41)

МодификаторыВозвратСигнатура
private void applyKnockbackvoid applyKnockback(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, float var3, @Nonnull Store<EntityStore> var4)
for for(int var12 = 0; var12 < 10; var12++)
for for(Ref var8 : var5)
for for(Ref var10 : var6)
for for(int var13 = 0; var13 < 10; var13++)
if if(this.projectileHitWorldSoundEventId != null)
if if(this.projectileHitLocalSoundEventId != null)
if if(this.projectileSpawnOffsets != null)
if if(var9 != null)
if if(var7 == null)
if if(!var12)
if if(var24 != null)
if if(var12)
if if(var33 < this.burstCount && var35 >= this.shotInterval)
if if(var36 && var12)
if if(this.projectileSpawnOffsets != null)
if if(var3 == var1)
if if(var4 != null)
if if(!this.canShootOwner)
if if(var5 != null)
if if(this.respectTeams)
if if(!this.doLineOfSightTest)
if if(var0 == 0)
if if(var2 == null)
if if(var16 == null)
if if(var6 == null)
if if(var8 == null)
if if(this.projectileKnockback != null)
private boolean isValidTargetboolean isValidTarget(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3)
abstract playAnimation playAnimation(var3, var1, this, "Deploy")
abstract playAnimation playAnimation(var3, var1, this, "Loop")
abstract playAnimation playAnimation(var4, var1, this, "Shoot")
protected void processConfigvoid processConfig()
private void projectileHitvoid projectileHit(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull DeployableProjectileShooterComponent var4, @Nonnull Store<EntityStore> var5, @Nonnull CommandBuffer<EntityStore> var6)
private boolean testLineOfSightboolean testLineOfSight(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull CommandBuffer<EntityStore> var4)
private void tickAttackStatevoid tickAttackState(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, float var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)
private void tickAwaitDeployStatevoid tickAwaitDeployState(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3)
private void tickInitStatevoid tickInitState(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
private void tickStartDeployStatevoid tickStartDeployState(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3)
private void updateProjectilevoid updateProjectile(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull DeployableProjectileShooterComponent var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)
private void updateProjectilesvoid updateProjectiles(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3, @Nonnull DeployableProjectileShooterComponent var4)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.deployables.config;

class="kw">import com.hypixel.hytale.builtin.deployables.DeployablesUtils;
class="kw">import com.hypixel.hytale.builtin.deployables.component.DeployableComponent;
class="kw">import com.hypixel.hytale.builtin.deployables.component.DeployableProjectileComponent;
class="kw">import com.hypixel.hytale.builtin.deployables.component.DeployableProjectileShooterComponent;
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.codecs.map.MapCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Rotation3fc;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.Opacity;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.soundevent.config.SoundEvent;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.group.EntityGroup;
class="kw">import com.hypixel.hytale.server.core.entity.knockback.KnockbackComponent;
class="kw">import com.hypixel.hytale.server.core.modules.debug.DebugUtils;
class="kw">import com.hypixel.hytale.server.core.modules.entity.DespawnComponent;
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.entity.damage.Damage;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageCause;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageSystems;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.server.combat.Knockback;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.ProjectileConfig;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.StandardPhysicsProvider;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
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 it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import java.time.Instant;
class="kw">import java.time.temporal.ChronoUnit;
class="kw">import java.util.Collections;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.atomic.AtomicReference;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">import org.joml.Vector3f;
class="kw">import org.joml.Vector3i;

class="kw">public class DeployableTurretConfig class="kw">extends DeployableConfig {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<DeployableTurretConfig> CODEC = BuilderCodec.builder(
         DeployableTurretConfig.class, DeployableTurretConfig::new, DeployableConfig.BASE_CODEC
      )
      .appendInherited(
         new KeyedCodec<>("TrackableRadius", Codec.FLOAT),
         (var0, var1) -> var0.trackableRadius = var1,
         var0 -> var0.trackableRadius,
         (var0, var1) -> var0.trackableRadius = var1.trackableRadius
      )
      .documentation("The radius in which a targeted entity can be tracked")
      .add()
      .<Float>appendInherited(
         new KeyedCodec<>("DetectionRadius", Codec.FLOAT),
         (var0, var1) -> var0.detectionRadius = var1,
         var0 -> var0.detectionRadius,
         (var0, var1) -> var0.detectionRadius = var1.detectionRadius
      )
      .documentation("The radius in which an entity can be targeted")
      .add()
      .<Float>appendInherited(
         new KeyedCodec<>("RotationSpeed", Codec.FLOAT),
         (var0, var1) -> var0.rotationSpeed = var1,
         var0 -> var0.rotationSpeed,
         (var0, var1) -> var0.rotationSpeed = var1.rotationSpeed
      )
      .documentation("The speed at which the turret can rotate to hit it's target")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("PreferOwnerTarget", Codec.BOOLEAN),
         (var0, var1) -> var0.preferOwnerTarget = var1,
         var0 -> var0.preferOwnerTarget,
         (var0, var1) -> var0.preferOwnerTarget = var1.preferOwnerTarget
      )
      .documentation("If true, will prefer targeting entities that the owner is attacking")
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("Ammo", Codec.INTEGER), (var0, var1) -> var0.ammo = var1, var0 -> var0.ammo, (var0, var1) -> var0.ammo = var1.ammo
      )
      .documentation("The total ammo the turret has, each projectile will consume one")
      .add()
      .<Float>appendInherited(
         new KeyedCodec<>("DeployDelay", Codec.FLOAT),
         (var0, var1) -> var0.deployDelay = var1,
         var0 -> var0.deployDelay,
         (var0, var1) -> var0.deployDelay = var1.deployDelay
      )
      .documentation("The delay in seconds until the deployable is ready to begin targeting logic")
      .add()
      .<ProjectileConfig>appendInherited(
         new KeyedCodec<>("ProjectileConfig", ProjectileConfig.CODEC),
         (var0, var1) -> var0.projectileConfig = var1,
         var0 -> var0.projectileConfig,
         (var0, var1) -> var0.projectileConfig = var1.projectileConfig
      )
      .addValidator(Validators.nonNull())
      .add()
      .appendInherited(
         new KeyedCodec<>("ShotInterval", Codec.FLOAT),
         (var0, var1) -> var0.shotInterval = var1,
         var0 -> var0.shotInterval,
         (var0, var1) -> var0.shotInterval = var1.shotInterval
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("BurstCount", Codec.INTEGER),
         (var0, var1) -> var0.burstCount = var1,
         var0 -> var0.burstCount,
         (var0, var1) -> var0.burstCount = var1.burstCount
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("BurstCooldown", Codec.FLOAT),
         (var0, var1) -> var0.burstCooldown = var1,
         var0 -> var0.burstCooldown,
         (var0, var1) -> var0.burstCooldown = var1.burstCooldown
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("ProjectileDamage", Codec.FLOAT),
         (var0, var1) -> var0.projectileDamage = var1,
         var0 -> var0.projectileDamage,
         (var0, var1) -> var0.projectileDamage = var1.projectileDamage
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("CanShootOwner", Codec.BOOLEAN),
         (var0, var1) -> var0.canShootOwner = var1,
         var0 -> var0.canShootOwner,
         (var0, var1) -> var0.canShootOwner = var1.canShootOwner
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("Knockback", Knockback.CODEC),
         (var0, var1) -> var0.projectileKnockback = var1,
         var0 -> var0.projectileKnockback,
         (var0, var1) -> var0.projectileKnockback = var1.projectileKnockback
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("TargetOffset", Vector3dUtil.CODEC),
         (var0, var1) -> var0.targetOffset = var1,
         var0 -> var0.targetOffset,
         (var0, var1) -> var0.targetOffset = var1.targetOffset
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("DoLineOfSightTest", Codec.BOOLEAN),
         (var0, var1) -> var0.doLineOfSightTest = var1,
         var0 -> var0.doLineOfSightTest,
         (var0, var1) -> var0.doLineOfSightTest = var1.doLineOfSightTest
      )
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("ProjectileHitWorldSoundEventId", Codec.STRING),
         (var0, var1) -> var0.projectileHitWorldSoundEventId = var1,
         var0 -> var0.projectileHitWorldSoundEventId,
         (var0, var1) -> var0.projectileHitWorldSoundEventId = var1.projectileHitWorldSoundEventId
      )
      .documentation("The positioned sound event played to surrounding players when the projectile hits a player")
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("ProjectileHitLocalSoundEventId", Codec.STRING),
         (var0, var1) -> var0.projectileHitLocalSoundEventId = var1,
         var0 -> var0.projectileHitLocalSoundEventId,
         (var0, var1) -> var0.projectileHitLocalSoundEventId = var1.projectileHitLocalSoundEventId
      )
      .documentation("The positioned sound event played to a player hit by the projectile")
      .add()
      .appendInherited(
         new KeyedCodec<>("RespectTeams", Codec.BOOLEAN),
         (var0, var1) -> var0.respectTeams = var1,
         var0 -> var0.respectTeams,
         (var0, var1) -> var0.respectTeams = var1.respectTeams
      )
      .add()
      .appendInherited(
         new KeyedCodec<>("ProjectileSpawnOffsets", new MapCodec<>(Vector3dUtil.CODEC, Object2ObjectOpenHashMap::new, true)),
         (var0, var1) -> var0.projectileSpawnOffsets = var1,
         var0 -> var0.projectileSpawnOffsets,
         (var0, var1) -> var0.projectileSpawnOffsets = var1.projectileSpawnOffsets
      )
      .add()
      .afterDecode(DeployableTurretConfig::processConfig)
      .build();
   class="kw">protected float trackableRadius;
   class="kw">protected float detectionRadius;
   class="kw">protected float rotationSpeed;
   class="kw">protected float projectileDamage;
   class="kw">protected boolean preferOwnerTarget;
   class="kw">protected int ammo;
   class="kw">protected ProjectileConfig projectileConfig;
   class="kw">protected float deployDelay;
   class="kw">protected float shotInterval;
   class="kw">protected int burstCount;
   class="kw">protected float burstCooldown;
   class="kw">protected boolean canShootOwner;
   class="kw">protected Knockback projectileKnockback;
   class="kw">protected Vector3d targetOffset = new Vector3d(0.0, 0.0, 0.0);
   class="kw">protected boolean doLineOfSightTest = true;
   class="kw">protected String projectileHitWorldSoundEventId;
   class="kw">protected String projectileHitLocalSoundEventId;
   class="kw">protected int projectileHitLocalSoundEventIndex = 0;
   class="kw">protected int projectileHitWorldSoundEventIndex = 0;
   class="kw">protected boolean respectTeams = true;
   class="kw">protected Map<String, Vector3d> projectileSpawnOffsets = new Object2ObjectOpenHashMap();

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

   class="kw">protected void processConfig() {
      if (this.projectileHitWorldSoundEventId != null) {
         this.projectileHitWorldSoundEventIndex = SoundEvent.getAssetMap().getIndex(this.projectileHitWorldSoundEventId);
      }

      if (this.projectileHitLocalSoundEventId != null) {
         this.projectileHitLocalSoundEventIndex = SoundEvent.getAssetMap().getIndex(this.projectileHitLocalSoundEventId);
      }
   }

   @Override
   class="kw">public void tick(
      @Nonnull DeployableComponent var1,
      float var2,
      int var3,
      @Nonnull ArchetypeChunk<EntityStore> var4,
      @Nonnull Store<EntityStore> var5,
      @Nonnull CommandBuffer<EntityStore> var6
   ) {
      Ref var7 = var4.getReferenceTo(var3);
      class="kw">switch (var1.getFlag(DeployableComponent.DeployableFlag.STATE)) {
         case 0:
            this.tickInitState(var7, var1, var5, var6);
            break;
         case 1:
            this.tickStartDeployState(var7, var1, var5);
            break;
         case 2:
            this.tickAwaitDeployState(var7, var1, var5);
            break;
         case 3:
            this.tickAttackState(var7, var1, var2, var5, var6);
      }
   }

   class="kw">private void tickInitState(
      @Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
   ) {
      var2.setFlag(DeployableComponent.DeployableFlag.STATE, 1);
      var4.addComponent(var1, DeployableProjectileShooterComponent.getComponentType());
      playAnimation(var3, var1, this, "Deploy");
   }

   class="kw">private void tickStartDeployState(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3) {
      var2.setFlag(DeployableComponent.DeployableFlag.STATE, 2);
      playAnimation(var3, var1, this, "Deploy");
   }

   class="kw">private void tickAwaitDeployState(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3) {
      Instant var4 = var3.getResource(TimeResource.getResourceType()).getNow();
      Instant var5 = var2.getSpawnInstant().plus((long)this.deployDelay, ChronoUnit.SECONDS);
      if (var4.isAfter(var5)) {
         var2.setFlag(DeployableComponent.DeployableFlag.STATE, 3);
         playAnimation(var3, var1, this, "Loop");
      }
   }

   class="kw">private void tickAttackState(
      @Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, float var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
   ) {
      var2.setTimeSinceLastAttack(var2.getTimeSinceLastAttack() + var3);
      World var6 = var5.getExternalData().getWorld();
      DeployableProjectileShooterComponent var7 = var4.getComponent(var1, DeployableProjectileShooterComponent.getComponentType());
      Vector3d var8 = new Vector3d(Vector3dUtil.ZERO);
      if (this.projectileSpawnOffsets != null) {
         Vector3d var9 = this.projectileSpawnOffsets.get(var2.getSpawnFace());
         if (var9 != null) {
            var8.add(var9);
         }
      }

      if (var7 == null) {
         var6.execute(() -> {
            if (var1.isValid()) {
               DespawnComponent var3 = var4.ensureAndGetComponent(var1, DespawnComponent.getComponentType());
               WorldTimeResource var4 = var5.getResource(WorldTimeResource.getResourceType());
               var3.setDespawn(var4.getGameTime());
            }
         });
      } else {
         TransformComponent var23 = var4.getComponent(var1, TransformComponent.getComponentType());
         assert var23 != null;
         HeadRotation var10 = var4.getComponent(var1, HeadRotation.getComponentType());
         assert var10 != null;
         Vector3d var11 = new Vector3d(var8).add(var23.getPosition());
         this.updateProjectiles(var1, var4, var5, var7);
         boolean var12 = false;
         Ref var13 = var7.getActiveTarget();
         if (var13 != null && var13.isValid()) {
            TransformComponent var14 = var4.getComponent(var13, TransformComponent.getComponentType());
            assert var14 != null;
            Vector3d var15 = this.calculatedTargetPosition(var14.getPosition());
            Vector3d var16 = Vector3dUtil.directionTo(var11, var15);
            if (var15.distance(var11) <= this.trackableRadius && this.testLineOfSight(var11, var15, var16, var5)) {
               var12 = true;
            }
         }

         if (!var12) {
            var7.setActiveTarget(null);
            Ref var24 = null;
            Vector3d var27 = new Vector3d(Vector3dUtil.MAX);

            for (Ref var18 : TargetUtil.getAllEntitiesInSphere(var11, this.detectionRadius, var5)) {
               if (var18 != null && var18.isValid()) {
                  TransformComponent var19 = var4.getComponent(var18, TransformComponent.getComponentType());
                  assert var19 != null;
                  Vector3d var20 = this.calculatedTargetPosition(var19.getPosition());
                  Vector3d var21 = Vector3dUtil.directionTo(var11, var20);
                  if (this.testLineOfSight(var11, var20, var21, var5) && this.isValidTarget(var1, var4, var18) && var11.distance(var20) < var11.distance(var27)
                     )
                   {
                     var27.set(var20);
                     var24 = var18;
                  }
               }
            }

            if (var24 != null) {
               var7.setActiveTarget(var24);
               var13 = var24;
               var12 = true;
            }
         }

         Vector3dc var25 = Vector3dUtil.ZERO;
         Rotation3fc var28 = Rotation3f.IDENTITY;
         Rotation3fc var31 = Rotation3f.IDENTITY;
         if (var12) {
            TransformComponent var32 = var4.getComponent(var13, TransformComponent.getComponentType());
            assert var32 != null;
            Vector3d var26 = this.calculatedTargetPosition(new Vector3d(var32.getPosition()));
            Vector3d var34 = var11.sub(var26, new Vector3d());
            var28 = Rotation3f.lookAt(var34.negate());
            var31 = Rotation3f.lerpAngle(var10.getRotation(), var28, this.rotationSpeed * var3);
         }

         var10.setRotation(var31);
         int var33 = var2.getFlag(DeployableComponent.DeployableFlag.BURST_SHOTS);
         float var35 = var2.getTimeSinceLastAttack();
         boolean var36 = false;
         if (var33 < this.burstCount && var35 >= this.shotInterval) {
            var2.setFlag(DeployableComponent.DeployableFlag.BURST_SHOTS, var33 + 1);
            var36 = true;
         } else if (var33 >= this.burstCount && var35 >= this.burstCooldown) {
            var2.setFlag(DeployableComponent.DeployableFlag.BURST_SHOTS, 1);
            var36 = true;
         }

         if (var36 && var12) {
            Vector3d var37 = Vector3dUtil.setYawPitch(var31.yaw(), var31.pitch(), new Vector3d());
            Vector3d var38 = var23.getPosition();
            Vector3d var22 = new Vector3d(Vector3dUtil.ZERO);
            if (this.projectileSpawnOffsets != null) {
               var22 = new Vector3d((Vector3dc)this.projectileSpawnOffsets.getOrDefault(var2.getSpawnFace(), new Vector3d()));
            }

            var22.add(new Vector3d(var37).normalize());
            var22.add(var38);
            var7.spawnProjectile(var1, var5, this.projectileConfig, var22, new Vector3d(var37));
            playAnimation(var4, var1, this, "Shoot");
            var2.setTimeSinceLastAttack(0.0F);
         }
      }
   }

   @Nonnull
   class="kw">private Vector3d calculatedTargetPosition(@Nonnull Vector3d var1) {
      class="kw">return new Vector3d(var1).add(this.targetOffset);
   }

   class="kw">private boolean isValidTarget(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3) {
      if (var3 == var1) {
         class="kw">return false;
      }

      DeployableComponent var4 = var2.getComponent(var1, DeployableComponent.getComponentType());
      if (var4 != null) {
         if (!this.canShootOwner) {
            UUID var5 = var4.getOwnerUUID();
            if (var5 != null) {
               UUIDComponent var6 = var2.getComponent(var3, UUIDComponent.getComponentType());
               if (var6 != null && var5.equals(var6.getUuid())) {
                  class="kw">return false;
               }
            }
         }

         if (this.respectTeams) {
            Ref var7 = var4.getOwner();
            if (var7 != null && var7.isValid()) {
               EntityGroup var8 = var2.getComponent(var7, EntityGroup.getComponentType());
               class="kw">return var8 == null || !var8.isMember(var3);
            }
         }
      }

      class="kw">return true;
   }

   class="kw">private boolean testLineOfSight(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull CommandBuffer<EntityStore> var4) {
      if (!this.doLineOfSightTest) {
         class="kw">return true;
      }

      Vector3f var5 = this.projectileConfig.getSpawnOffset();
      Vector3d var6 = new Vector3d(var1).add(var5.x, var5.y + this.generatedModel.getEyeHeight(), var5.z);
      double var7 = var6.distance(var2);
      World var9 = var4.getExternalData().getWorld();
      Vector3f var10 = new Vector3f(1.0F, 1.0F, 1.0F);
      if (this.getDebugVisuals()) {
         Vector3d var11 = var3.mul(var7);

         for (int var12 = 0; var12 < 10; var12++) {
            Vector3d var13 = new Vector3d(var6);
            var13.fma(var12 / 10.0F, var11);
            DebugUtils.addSphere(var9, var13, var10, 0.1F, 0.5F);
         }
      }

      Vector3i var16 = TargetUtil.getTargetBlock(var9, (var0, var1x) -> {
         if (var0 == 0) {
            class="kw">return false;
         }

         BlockType var2 = BlockType.getAssetMap().getAsset(var0);
         if (var2 == null) {
            class="kw">return false;
         }

         BlockMaterial var3 = var2.getMaterial();
         class="kw">return var3 != null && var3 != BlockMaterial.Empty ? var2.getOpacity() != Opacity.Transparent : false;
      }, var1.x, var1.y, var1.z, var3.x, var3.y, var3.z, var7);
      if (var16 == null) {
         class="kw">return true;
      }

      double var17 = var1.distanceSquared(var2);
      double var14 = var1.distanceSquared(var16.x + 0.5, var16.y + 0.5, var16.z + 0.5);
      class="kw">return var17 < var14;
   }

   class="kw">private void updateProjectiles(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Store<EntityStore> var2,
      @Nonnull CommandBuffer<EntityStore> var3,
      @Nonnull DeployableProjectileShooterComponent var4
   ) {
      List var5 = var4.getProjectiles();
      List var6 = var4.getProjectilesForRemoval();
      var5.removeAll(Collections.singleton(null));

      for (Ref var8 : var5) {
         this.updateProjectile(var1, var8, var4, var2, var3);
      }

      for (Ref var10 : var6) {
         if (var10.isValid()) {
            var3.removeEntity(var10, RemoveReason.REMOVE);
         }

         var5.remove(var10);
      }

      var6.clear();
   }

   class="kw">private void updateProjectile(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Ref<EntityStore> var2,
      @Nonnull DeployableProjectileShooterComponent var3,
      @Nonnull Store<EntityStore> var4,
      @Nonnull CommandBuffer<EntityStore> var5
   ) {
      if (!var2.isValid()) {
         var3.getProjectilesForRemoval().add(var2);
      } else {
         TransformComponent var6 = var4.getComponent(var2, TransformComponent.getComponentType());
         if (var6 == null) {
            var3.getProjectilesForRemoval().add(var2);
         } else {
            Vector3d var7 = var6.getPosition();
            DeployableProjectileComponent var8 = var4.getComponent(var2, DeployableProjectileComponent.getComponentType());
            if (var8 == null) {
               var3.getProjectilesForRemoval().add(var2);
            } else {
               Ref var9 = var8.takeHitEntityRef();
               if (var9 != null && var9.isValid() && this.isValidTarget(var1, var4, var9)) {
                  this.projectileHit(var1, var9, var2, var3, var4, var5);
               } else {
                  AtomicReference var10 = new AtomicReference<>(Boolean.FALSE);
                  Vector3d var11 = var8.getPreviousTickPosition();
                  Vector3d var12 = new Vector3d((var7.x - var11.x) * 0.1F, (var7.y - var11.y) * 0.1F, (var7.z - var11.z) * 0.1F);

                  for (int var13 = 0; var13 < 10; var13++) {
                     if (!var10.get()) {
                        Vector3d var14 = new Vector3d(var8.getPreviousTickPosition());
                        var14.x = var14.x + var12.x * var13;
                        var14.y = var14.y + var12.y * var13;
                        var14.z = var14.z + var12.z * var13;
                        if (this.getDebugVisuals()) {
                           DebugUtils.addSphere(var4.getExternalData().getWorld(), var14, new Vector3f(1.0F, 1.0F, 1.0F), 0.1F, 5.0F);
                        }

                        for (Ref var17 : TargetUtil.getAllEntitiesInSphere(var14, 0.1, var4)) {
                           if (var10.get()) {
                              class="kw">return;
                           }

                           boolean var18 = var17 == var2;
                           if (!var18 && this.isValidTarget(var1, var4, var17)) {
                              this.projectileHit(var1, var17, var2, var3, var4, var5);
                              var10.set(Boolean.TRUE);
                           }
                        }
                     }
                  }

                  var8.setPreviousTickPosition(var7);
                  if (!var10.get()) {
                     StandardPhysicsProvider var19 = var4.getComponent(var2, StandardPhysicsProvider.getComponentType());
                     if (var19 != null && var19.getState() != StandardPhysicsProvider.STATE.ACTIVE) {
                        var3.getProjectilesForRemoval().add(var2);
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private void projectileHit(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Ref<EntityStore> var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull DeployableProjectileShooterComponent var4,
      @Nonnull Store<EntityStore> var5,
      @Nonnull CommandBuffer<EntityStore> var6
   ) {
      Damage var7 = new Damage(new Damage.EntitySource(var1), DamageCause.PHYSICAL, this.projectileDamage);
      DamageSystems.executeDamage(var2, var6, var7);
      TransformComponent var8 = var5.getComponent(var3, TransformComponent.getComponentType());
      assert var8 != null;
      Vector3d var9 = new Vector3d(var8.getPosition());
      if (this.projectileKnockback != null) {
         float var10 = var8.getRotation().yaw();
         var5.getExternalData().getWorld().execute(() -> {
            if (var2.isValid()) {
               this.applyKnockback(var2, var9, var10, var5);
            }
         });
      }

      DeployablesUtils.playSoundEventsAtEntity(var2, var6, this.projectileHitLocalSoundEventIndex, this.projectileHitWorldSoundEventIndex, var9);
      var4.getProjectilesForRemoval().add(var3);
   }

   class="kw">private void applyKnockback(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, float var3, @Nonnull Store<EntityStore> var4) {
      KnockbackComponent var5 = var4.ensureAndGetComponent(var1, KnockbackComponent.getComponentType());
      TransformComponent var6 = var4.getComponent(var1, TransformComponent.getComponentType());
      assert var6 != null;
      var5.setVelocity(this.projectileKnockback.calculateVector(var2, var3, var6.getPosition()));
      var5.setVelocityType(this.projectileKnockback.getVelocityType());
      var5.setVelocityConfig(this.projectileKnockback.getVelocityConfig());
      var5.setDuration(this.projectileKnockback.getDuration());
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "DeployableTurretConfig{}" + super.toString();
   }
}