ExplosionUtils class

Пакет: com.hypixel.hytale.server.core.entity

Файл: com/hypixel/hytale/server/core/entity/ExplosionUtils.java

Поля (50)

МодификаторыТипИмя
final boolean DEBUG_SHAPES
Direction var10
ItemTool var10
Vector3d var10
Direction var11
Set var11
Vector3d var11
int var12
double var12
int var13
int var14
float var14
Set var15
Knockback var15
ComponentType var16
KnockbackComponent var17
var17
Vector3d var18
Vector3d var18
int var19
double var19
double var20
Vector3d var22
Vector3i var23
Vector3d var24
float var25
float var26
Ref var27
boolean var28
Vector3d var29
float var3
SpatialResource var4
BoundingBox var4
List var5
World var5
TransformComponent var5
float var5
ThreadLocalRandom var6
Vector3d var6
float var6
Set var7
World var7
Box var7
float var7
Vector3d var8
int var8
var8
TransformComponent var8
List var9
Velocity var9

Методы (36)

МодификаторыВозвратСигнатура
static float calculateBlockDamageScalefloat calculateBlockDamageScale(float var0, float var1, float var2)
static void collectPotentialTargetsvoid collectPotentialTargets(@Nonnull Set<Ref<EntityStore>> var0, @Nonnull List<Ref<EntityStore>> var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4)
abstract collectPotentialTargets collectPotentialTargets(var3, var9, var29, var0, var4)
abstract collectPotentialTargets collectPotentialTargets(var3, var9, var24, var0, var4)
for for(ModelParticle var9 : var2.particles)
for for(Vector3i var17 : var11)
for for(Ref var7 : var1)
for for(Ref var7 : var4)
if if(var3.damageBlocks || var3.damageEntities)
if if(var3.damageEntities)
if if(var2.particles != null)
if if(var11 != null)
if if(var1.damageEntities && var1.entityDamageRadius > var1.blockDamageRadius)
if if(var1.damageEntities)
if if(var23 == null)
if if(var1.damageEntities)
if if(var1.damageEntities)
if if(var0 == 0 || var0 == 1)
if if(var4 == null)
if if(var5 == null)
if if(var0 >= var1)
if if(var14 > 0.0F)
if if(var15 != null)
if if(var17 == null)
if if(var19 > 1.0E-8)
static boolean isValidTargetBlockboolean isValidTargetBlock(int var0, boolean var1)
static void performExplosionvoid performExplosion(@Nonnull Damage.Source var0, @Nonnull Vector3d var1, @Nonnull Rotation3f var2, @Nonnull ExplosionConfig var3, @Nullable Ref<EntityStore> var4, @Nonnull ComponentAccessor<EntityStore> var5, @Nonnull ComponentAccessor<ChunkStore> var6)
static void performExplosionEffectsvoid performExplosionEffects(@Nonnull Vector3d var0, @Nonnull Rotation3f var1, @Nonnull ExplosionConfig var2, @Nonnull ComponentAccessor<EntityStore> var3)
abstract performExplosionEffects performExplosionEffects(var1, var2, var3, var5)
static boolean processPotentialEntityboolean processPotentialEntity(@Nonnull Ref<EntityStore> var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3)
static void processTargetBlocksvoid processTargetBlocks(@Nonnull Vector3d var0, @Nonnull ExplosionConfig var1, @Nullable Ref<EntityStore> var2, @Nonnull Set<Ref<EntityStore>> var3, @Nonnull ComponentAccessor<EntityStore> var4, @Nonnull ComponentAccessor<ChunkStore> var5)
abstract processTargetBlocks processTargetBlocks(var8, var3, var4, var7, var5, var6)
static void processTargetEntitiesvoid processTargetEntities(@Nonnull ExplosionConfig var0, @Nonnull Vector3d var1, @Nonnull Damage.Source var2, @Nullable Ref<EntityStore> var3, @Nonnull Set<Ref<EntityStore>> var4, @Nonnull ComponentAccessor<EntityStore> var5)
abstract processTargetEntities processTargetEntities(var3, var1, var0, var4, var7, var5)
static void processTargetEntityvoid processTargetEntity(@Nonnull ExplosionConfig var0, @Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Damage.Source var3, @Nonnull ComponentAccessor<EntityStore> var4)
abstract processTargetEntity processTargetEntity(var0, var7, var1, var2, var5)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.entity;

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.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.math.block.BlockSphereUtil;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.protocol.Direction;
class="kw">import com.hypixel.hytale.protocol.SoundCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemTool;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelParticle;
class="kw">import com.hypixel.hytale.server.core.entity.knockback.KnockbackComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
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.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.BlockHarvestUtils;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.selector.Selector;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.server.combat.Knockback;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.universe.world.ParticleUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.SoundUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
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.ObjectOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
class="kw">import java.util.List;
class="kw">import java.util.Set;
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">import org.joml.Vector3i;

class="kw">public class ExplosionUtils {
   class="kw">private class="kw">static class="kw">final boolean DEBUG_SHAPES = false;
   class="kw">private class="kw">static class="kw">final Vector3f DEBUG_POTENTIAL_TARGET_COLOR = new Vector3f(1.0F, 1.0F, 0.0F);
   class="kw">private class="kw">static class="kw">final int DEBUG_POTENTIAL_TARGET_TIME = 5;
   class="kw">private class="kw">static class="kw">final float DEBUG_BLOCK_HIT_SCALE = 1.1F;
   class="kw">private class="kw">static class="kw">final float DEBUG_BLOCK_HIT_TIME = 2.0F;
   class="kw">private class="kw">static class="kw">final float DEBUG_BLOCK_HIT_ALPHA = 0.25F;
   class="kw">private class="kw">static class="kw">final Vector3f DEBUG_BLOCK_RADIUS_COLOR = new Vector3f(1.0F, 0.5F, 0.5F);
   class="kw">private class="kw">static class="kw">final Vector3f DEBUG_ENTITY_RADIUS_COLOR = new Vector3f(0.5F, 1.0F, 0.5F);
   class="kw">private class="kw">static class="kw">final int DEBUG_BLOCK_RADIUS_TIME = 5;
   class="kw">private class="kw">static class="kw">final int DEBUG_ENTITY_RADIUS_TIME = 5;

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

   class="kw">public class="kw">static void performExplosion(
      @Nonnull Damage.Source var0,
      @Nonnull Vector3d var1,
      @Nonnull Rotation3f var2,
      @Nonnull ExplosionConfig var3,
      @Nullable Ref<EntityStore> var4,
      @Nonnull ComponentAccessor<EntityStore> var5,
      @Nonnull ComponentAccessor<ChunkStore> var6
   ) {
      if (var3.damageBlocks || var3.damageEntities) {
         Set var7 = new ReferenceOpenHashSet();
         Vector3d var8 = new Vector3d(Math.floor(var1.x) + 0.5, Math.floor(var1.y) + 0.5, Math.floor(var1.z) + 0.5);
         processTargetBlocks(var8, var3, var4, var7, var5, var6);
         if (var3.damageEntities) {
            processTargetEntities(var3, var1, var0, var4, var7, var5);
         }

         performExplosionEffects(var1, var2, var3, var5);
      }
   }

   class="kw">private class="kw">static void performExplosionEffects(
      @Nonnull Vector3d var0, @Nonnull Rotation3f var1, @Nonnull ExplosionConfig var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      SpatialResource var4 = var3.getResource(EntityModule.get().getPlayerSpatialResourceType());
      List var5 = SpatialResource.getThreadLocalReferenceList();
      var4.getSpatialStructure().collect(var0, 75.0, var5);
      if (var2.particles != null) {
         for (ModelParticle var9 : var2.particles) {
            Direction var10 = new Direction(var1.yaw(), var1.pitch(), var1.roll());
            Direction var11 = var9.getRotationOffset();
            if (var11 != null) {
               var10.yaw = var10.yaw + (float)Math.toRadians(var11.yaw);
               var10.pitch = var10.pitch + (float)Math.toRadians(var11.pitch);
               var10.roll = var10.roll + (float)Math.toRadians(var11.roll);
            }

            ParticleUtil.spawnParticleEffect(
               var9.getSystemId(), var0.x, var0.y, var0.z, var10.yaw, var10.pitch, var10.roll, var9.getScale(), var9.getColor(), null, var5, var3
            );
         }
      }

      SoundUtil.playSoundEvent3d(var2.soundEventIndex, SoundCategory.SFX, var0.x, var0.y, var0.z, var3);
   }

   class="kw">private class="kw">static void processTargetBlocks(
      @Nonnull Vector3d var0,
      @Nonnull ExplosionConfig var1,
      @Nullable Ref<EntityStore> var2,
      @Nonnull Set<Ref<EntityStore>> var3,
      @Nonnull ComponentAccessor<EntityStore> var4,
      @Nonnull ComponentAccessor<ChunkStore> var5
   ) {
      ThreadLocalRandom var6 = ThreadLocalRandom.current();
      World var7 = var4.getExternalData().getWorld();
      int var8 = var1.blockDamageRadius;
      if (var1.damageEntities && var1.entityDamageRadius > var1.blockDamageRadius) {
         var8 = (int)var1.entityDamageRadius;
      }

      List var9 = new ReferenceArrayList();
      if (var1.damageEntities) {
         Selector.selectNearbyEntities(var4, var0, var1.entityDamageRadius, var9::add, var1x -> var2 == null || !var1x.equals(var2));
      }

      if (var1.damageBlocks || !var9.isEmpty()) {
         ItemTool var10 = var1.itemTool;
         Set var11 = new ObjectOpenHashSet();
         int var12 = MathUtil.floor(var0.x);
         int var13 = MathUtil.floor(var0.y);
         int var14 = MathUtil.floor(var0.z);
         BlockSphereUtil.forEachBlock(var12, var13, var14, var8, null, (var1x, var2x, var3x, var4x) -> {
            var11.add(new Vector3i(var1x, var2x, var3x));
            class="kw">return true;
         });
         Set var15 = new ObjectOpenHashSet();

         for (Vector3i var17 : var11) {
            Vector3d var18 = Vector3iUtil.toVector3d(var17).add(0.5, 0.5, 0.5);
            int var19 = 1028;
            if (var6.nextFloat() > var1.blockDropChance) {
               var19 |= 2048;
            }

            double var20 = var0.distance(var18);
            if (!(var20 <= 0.0) && !Double.isNaN(var20)) {
               Vector3d var22 = new Vector3d(var18).sub(var0);
               Vector3i var23 = TargetUtil.getTargetBlock(
                  var7, (var1x, var2x) -> isValidTargetBlock(var1x, var1.damageBlocks), var0.x, var0.y, var0.z, var22.x, var22.y, var22.z, var20
               );
               if (var23 == null) {
                  if (var1.damageEntities) {
                     Vector3d var29 = new Vector3d(var0).add(var22);
                     collectPotentialTargets(var3, var9, var29, var0, var4);
                  }
               } else if (!var15.contains(var23)) {
                  Vector3d var24 = Vector3iUtil.toVector3d(var23).add(0.5, 0.5, 0.5);
                  if (var1.damageEntities) {
                     collectPotentialTargets(var3, var9, var24, var0, var4);
                  }

                  float var25 = (float)var0.distance(var24);
                  float var26 = calculateBlockDamageScale(var25, var8, var1.blockDamageFalloff);
                  Ref var27 = var5.getExternalData().getChunkSectionReferenceAtBlock(var23.x, var23.y, var23.z);
                  if (var27 != null && var27.isValid()) {
                     boolean var28 = var20 <= var1.blockDamageRadius;
                     if (!var1.damageBlocks || var28 && !BlockHarvestUtils.performBlockDamage(var23, null, var10, var26, var19, true, var27, var4, var5)) {
                        var15.add(var23);
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private class="kw">static boolean isValidTargetBlock(int var0, boolean var1) {
      if (var0 == 0 || var0 == 1) {
         class="kw">return false;
      } else {
         class="kw">return !var1 ? BlockType.blocksLineOfSight(var0) : true;
      }
   }

   class="kw">private class="kw">static void collectPotentialTargets(
      @Nonnull Set<Ref<EntityStore>> var0,
      @Nonnull List<Ref<EntityStore>> var1,
      @Nonnull Vector3d var2,
      @Nonnull Vector3d var3,
      @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      World var5 = var4.getExternalData().getWorld();

      for (Ref var7 : var1) {
         if (processPotentialEntity(var7, var2, var3, var4) && var0.add(var7)) {
         }
      }
   }

   class="kw">private class="kw">static boolean processPotentialEntity(
      @Nonnull Ref<EntityStore> var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      BoundingBox var4 = var3.getComponent(var0, BoundingBox.getComponentType());
      if (var4 == null) {
         class="kw">return false;
      }

      TransformComponent var5 = var3.getComponent(var0, TransformComponent.getComponentType());
      if (var5 == null) {
         class="kw">return false;
      }

      Vector3d var6 = var5.getPosition();
      Box var7 = var4.getBoundingBox().clone().offset(var6);
      class="kw">return var7.intersectsLine(var1, var2);
   }

   class="kw">private class="kw">static float calculateBlockDamageScale(float var0, float var1, float var2) {
      if (var0 >= var1) {
         class="kw">return 0.0F;
      }

      float var3 = var0 / var1;
      class="kw">return 1.0F - (float)Math.pow(var3, var2);
   }

   class="kw">private class="kw">static void processTargetEntities(
      @Nonnull ExplosionConfig var0,
      @Nonnull Vector3d var1,
      @Nonnull Damage.Source var2,
      @Nullable Ref<EntityStore> var3,
      @Nonnull Set<Ref<EntityStore>> var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      for (Ref var7 : var4) {
         processTargetEntity(var0, var7, var1, var2, var5);
      }
   }

   class="kw">private class="kw">static void processTargetEntity(
      @Nonnull ExplosionConfig var0,
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Vector3d var2,
      @Nonnull Damage.Source var3,
      @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      float var5 = var0.entityDamageRadius;
      float var6 = var0.entityDamage;
      float var7 = var0.entityDamageFalloff;
      TransformComponent var8 = var4.getComponent(var1, TransformComponent.getComponentType());
      assert var8 != null;
      Velocity var9 = var4.getComponent(var1, Velocity.getComponentType());
      assert var9 != null;
      Vector3d var10 = var8.getPosition();
      Vector3d var11 = new Vector3d(var10).sub(var2);
      double var12 = var11.length();
      float var14 = (float)(var6 * Math.pow(1.0 - var12 / var5, var7));
      if (var14 > 0.0F) {
         DamageSystems.executeDamage(var1, var4, new Damage(var3, DamageCause.ENVIRONMENT, var14));
      }

      Knockback var15 = var0.knockback;
      if (var15 != null) {
         ComponentType var16 = KnockbackComponent.getComponentType();
         KnockbackComponent var17 = var4.getComponent(var1, var16);
         if (var17 == null) {
            var17 = new KnockbackComponent();
            var4.putComponent(var1, var16, var17);
         }

         Vector3d var18 = new Vector3d(var11);
         double var19 = var18.lengthSquared();
         if (var19 > 1.0E-8) {
            var18.div(Math.sqrt(var19));
         } else {
            var18.set(0.0, 1.0, 0.0);
         }

         var17.setVelocity(var15.calculateVector(var2, (float)var18.y, var10));
         var17.setVelocityType(var15.getVelocityType());
         var17.setVelocityConfig(var15.getVelocityConfig());
         var17.setDuration(var15.getDuration());
      }
   }
}