Shape enum

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

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

Поля (1)

МодификаторыТипИмя
Sphere, Cylinder

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.deployables.component.DeployableComponent;
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.EnumCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
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.Store;
class="kw">import com.hypixel.hytale.server.core.asset.type.entityeffect.config.EntityEffect;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.effect.EffectControllerComponent;
class="kw">import com.hypixel.hytale.server.core.entity.group.EntityGroup;
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.time.TimeResource;
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 java.time.Duration;
class="kw">import java.time.Instant;
class="kw">import java.util.UUID;
class="kw">import java.util.function.Consumer;
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 DeployableAoeConfig class="kw">extends DeployableConfig {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<DeployableAoeConfig> CODEC = BuilderCodec.builder(
         DeployableAoeConfig.class, DeployableAoeConfig::new, DeployableConfig.BASE_CODEC
      )
      .append(new KeyedCodec<>("Shape", new EnumCodec<>(DeployableAoeConfig.Shape.class)), (var0, var1) -> var0.shape = var1, var0 -> var0.shape)
      .documentation("The shape of the detection area")
      .add()
      .<Float>append(new KeyedCodec<>("StartRadius", Codec.FLOAT), (var0, var1) -> var0.startRadius = var1, var0 -> var0.startRadius)
      .documentation("The initial detection radius")
      .add()
      .<Float>append(new KeyedCodec<>("EndRadius", Codec.FLOAT), (var0, var1) -> var0.endRadius = var1, var0 -> var0.endRadius)
      .documentation("If set, the detection radius will expand to this size over the RadiusChangeTime (RadiusChangeTime must be set)")
      .add()
      .<Float>append(new KeyedCodec<>("Height", Codec.FLOAT), (var0, var1) -> var0.height = var1, var0 -> var0.height)
      .documentation("The height of the Shape, if using a cylinder shape")
      .add()
      .<Float>append(new KeyedCodec<>("RadiusChangeTime", Codec.FLOAT), (var0, var1) -> var0.radiusChangeTime = var1, var0 -> var0.radiusChangeTime)
      .documentation("The time (starting at spawn) it takes to change from StartRadius to EndRadius")
      .add()
      .<Float>append(new KeyedCodec<>("DamageInterval", Codec.FLOAT), (var0, var1) -> var0.damageInterval = var1, var0 -> var0.damageInterval)
      .documentation("The interval between damage being applied to targets in seconds")
      .add()
      .<Float>append(new KeyedCodec<>("DamageAmount", Codec.FLOAT), (var0, var1) -> var0.damageAmount = var1, var0 -> var0.damageAmount)
      .documentation("The amount of damage to apply to targets per interval")
      .add()
      .<String>append(new KeyedCodec<>("DamageCause", DamageCause.CHILD_ASSET_CODEC), (var0, var1) -> var0.damageCause = var1, var0 -> var0.damageCause)
      .documentation("The amount of damage to apply to targets per interval")
      .add()
      .append(
         new KeyedCodec<>("ApplyEffects", new ArrayCodec<>(EntityEffect.CHILD_ASSET_CODEC, String[]::new)),
         (var0, var1) -> var0.effectsToApply = var1,
         var0 -> var0.effectsToApply
      )
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("AttackOwner", Codec.BOOLEAN),
         (var0, var1) -> var0.attackOwner = var1,
         var0 -> var0.attackOwner,
         (var0, var1) -> var0.attackOwner = var1.attackOwner
      )
      .documentation("Whether or not the owner is affected by the attack & effect of this deployable")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("AttackTeam", Codec.BOOLEAN),
         (var0, var1) -> var0.attackTeam = var1,
         var0 -> var0.attackTeam,
         (var0, var1) -> var0.attackTeam = var1.attackTeam
      )
      .documentation("Whether or not the team is affected by the attack & effect of this deployable")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("AttackEnemies", Codec.BOOLEAN),
         (var0, var1) -> var0.attackEnemies = var1,
         var0 -> var0.attackEnemies,
         (var0, var1) -> var0.attackEnemies = var1.attackEnemies
      )
      .documentation("Whether or not this deployable interacts with non-team entities")
      .add()
      .build();
   class="kw">protected float startRadius = 1.0F;
   class="kw">protected float endRadius = -1.0F;
   class="kw">protected float radiusChangeTime = -1.0F;
   class="kw">protected float damageInterval = 1.0F;
   class="kw">protected float damageAmount = 1.0F;
   class="kw">protected String damageCause = "Physical";
   class="kw">protected String[] effectsToApply;
   class="kw">protected boolean attackOwner;
   class="kw">protected boolean attackTeam;
   class="kw">protected boolean attackEnemies = true;
   class="kw">protected DeployableAoeConfig.Shape shape = DeployableAoeConfig.Shape.Sphere;
   class="kw">protected float height = 1.0F;
   @Nullable
   class="kw">protected DamageCause processedDamageCause;

   class="kw">protected DeployableAoeConfig() {
   }

   @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
   ) {
      TransformComponent var7 = var4.getComponent(var3, TransformComponent.getComponentType());
      if (var7 != null) {
         Vector3d var8 = var7.getPosition();
         World var9 = var5.getExternalData().getWorld();
         Ref var10 = var4.getReferenceTo(var3);
         float var11 = this.getRadius(var5, var1.getSpawnInstant());
         this.handleDebugGraphics(var9, var1.getDebugColor(), var8, var11 * 2.0F);
         class="kw">switch (var1.getFlag(DeployableComponent.DeployableFlag.STATE)) {
            case 0:
               var1.setFlag(DeployableComponent.DeployableFlag.STATE, 1);
               break;
            case 1:
               var1.setFlag(DeployableComponent.DeployableFlag.STATE, 2);
               playAnimation(var5, var10, this, "Grow");
               break;
            case 2:
               if (var11 >= this.endRadius) {
                  var1.setFlag(DeployableComponent.DeployableFlag.STATE, 3);
                  playAnimation(var5, var10, this, "Looping");
               }
         }

         Ref var12 = var4.getReferenceTo(var3);
         if (var1.incrementTimeSinceLastAttack(var2) > this.damageInterval) {
            var1.setTimeSinceLastAttack(0.0F);
            this.handleDetection(var5, var6, var12, var1, var8, var11, this.getDamageCause());
         }

         super.tick(var1, var2, var3, var4, var5, var6);
      }
   }

   class="kw">protected void handleDetection(
      @Nonnull class="kw">final Store<EntityStore> var1,
      @Nonnull class="kw">final CommandBuffer<EntityStore> var2,
      @Nonnull class="kw">final Ref<EntityStore> var3,
      @Nonnull class="kw">final DeployableComponent var4,
      @Nonnull Vector3d var5,
      float var6,
      @Nonnull class="kw">final DamageCause var7
   ) {
      var var8 = new Consumer<Ref<EntityStore>>() {
         class="kw">public void accept(@Nonnull Ref<EntityStore> var1x) {
            if (var1x != var3) {
               if (DeployableAoeConfig.this.canAttackEntity(var1x, var4, var1)) {
                  DeployableAoeConfig.this.attackTarget(var1x, var4.getOwner(), var7, var2);
                  DeployableAoeConfig.this.applyEffectToTarget(var1, var1x);
               }
            }
         }
      };
      class="kw">switch (this.shape) {
         case Sphere:
            for (Ref var14 : TargetUtil.getAllEntitiesInSphere(var5, var6, var1)) {
               var8.accept(var14);
            }
            break;
         case Cylinder:
            for (Ref var11 : TargetUtil.getAllEntitiesInCylinder(var5, var6, this.height, var1)) {
               var8.accept(var11);
            }
      }
   }

   class="kw">protected void handleDebugGraphics(World var1, Vector3f var2, Vector3d var3, float var4) {
      if (this.getDebugVisuals()) {
         ;
      }
   }

   class="kw">protected void attackTarget(
      @Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull DamageCause var3, @Nonnull CommandBuffer<EntityStore> var4
   ) {
      if (!(this.damageAmount <= 0.0F)) {
         Damage var5 = new Damage(new Damage.EntitySource(var2), var3, this.damageAmount);
         if (var1.equals(var2)) {
            var5.setSource(Damage.NULL_SOURCE);
         }

         DamageSystems.executeDamage(var1, var4, var5);
      }
   }

   class="kw">protected void applyEffectToTarget(@Nonnull Store<EntityStore> var1, @Nonnull Ref<EntityStore> var2) {
      if (this.effectsToApply != null) {
         EffectControllerComponent var3 = var1.getComponent(var2, EffectControllerComponent.getComponentType());
         if (var3 != null) {
            for (String var7 : this.effectsToApply) {
               if (var7 != null) {
                  EntityEffect var8 = EntityEffect.getAssetMap().getAsset(var7);
                  if (var8 != null) {
                     var3.addEffect(var2, var8, var1);
                  }
               }
            }
         }
      }
   }

   class="kw">protected boolean canAttackEntity(@Nonnull Ref<EntityStore> var1, @Nonnull DeployableComponent var2, @Nonnull Store<EntityStore> var3) {
      if (!this.attackOwner) {
         UUID var4 = var2.getOwnerUUID();
         if (var4 != null) {
            UUIDComponent var5 = var3.getComponent(var1, UUIDComponent.getComponentType());
            if (var5 != null && var4.equals(var5.getUuid())) {
               class="kw">return false;
            }
         }
      }

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

      class="kw">return this.attackEnemies;
   }

   class="kw">protected float getRadius(@Nonnull Store<EntityStore> var1, @Nonnull Instant var2) {
      if (!(this.radiusChangeTime <= 0.0F) && !(this.endRadius < 0.0F)) {
         float var3 = this.endRadius - this.startRadius;
         float var4 = var3 / this.radiusChangeTime;
         Instant var5 = var1.getResource(TimeResource.getResourceType()).getNow();
         float var6 = (float)Duration.between(var2, var5).toMillis() / 1000.0F;
         if (var6 > this.radiusChangeTime) {
            class="kw">return this.endRadius;
         }

         float var7 = var4 * var6;
         class="kw">return this.startRadius + var7;
      } else {
         class="kw">return this.startRadius;
      }
   }

   @Nullable
   class="kw">protected DamageCause getDamageCause() {
      if (this.processedDamageCause == null) {
         this.processedDamageCause = DamageCause.getAssetMap().getAsset(this.damageCause);
         if (this.processedDamageCause == null) {
            this.processedDamageCause = DamageCause.PHYSICAL;
         }
      }

      class="kw">return this.processedDamageCause;
   }

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

   class="kw">public enum Shape {
      Sphere,
      Cylinder;

      Shape() {
      }
   }
}