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