ItemPrePhysicsSystem class

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

Файл: com/hypixel/hytale/server/core/modules/entity/item/ItemPrePhysicsSystem.java

extends: EntityTickingSystem<EntityStore>

Поля (27)

МодификаторыТипИмя
final NearestBlockUtil.IterationElement[] SEARCH_ELEMENTS
break
Box var10
boolean var10
var10
World var11
double var11
ChunkStore var12
BlockSection var13
var13
var13
Ref var14
Vector3i var15
int var4
int var5
double var5
var5
Velocity var6
int var6
TransformComponent var7
BlockType var7
double var7
PhysicsValues var8
int var8
BoundingBox var9
BlockBoundingBoxes.RotatedVariantBoxes var9
double var9

Методы (6)

МодификаторыВозвратСигнатура
static void applyGravityvoid applyGravity(float var0, @Nullable Box var1, @Nonnull PhysicsValues var2, @Nonnull Vector3d var3, @Nonnull Velocity var4)
if if(var0 != null)
if if(var10)
if if(var15 != null)
if if(var1 != null)
static void moveOutOfBlockvoid moveOutOfBlock(@Nullable BlockSection var0, @Nonnull Vector3d var1, @Nonnull Velocity var2, @Nonnull Box var3)

Исходный код

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

class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
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.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
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.util.NearestBlockUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionMath;
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.PhysicsValues;
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.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
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 javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class ItemPrePhysicsSystem class="kw">extends EntityTickingSystem<EntityStore> {
   class="kw">public class="kw">static class="kw">final NearestBlockUtil.IterationElement[] SEARCH_ELEMENTS = new NearestBlockUtil.IterationElement[]{
      new NearestBlockUtil.IterationElement(-1, 0, 0, var0 -> 0.0, var0 -> var0, var0 -> var0),
      new NearestBlockUtil.IterationElement(1, 0, 0, var0 -> 1.0, var0 -> var0, var0 -> var0),
      new NearestBlockUtil.IterationElement(0, 0, -1, var0 -> var0, var0 -> var0, var0 -> 0.0),
      new NearestBlockUtil.IterationElement(0, 0, 1, var0 -> var0, var0 -> var0, var0 -> 1.0)
   };
   class="kw">public class="kw">static class="kw">final double VERTICAL_CLIMB_SCALE = 7.0;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, BoundingBox> boundingBoxComponentType;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, Velocity> velocityComponentType;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, PhysicsValues> physicsValuesComponentType;
   @Nonnull
   class="kw">private class="kw">final Query<EntityStore> query;

   class="kw">public ItemPrePhysicsSystem(
      @Nonnull ComponentType<EntityStore, ItemComponent> var1,
      @Nonnull ComponentType<EntityStore, BoundingBox> var2,
      @Nonnull ComponentType<EntityStore, Velocity> var3,
      @Nonnull ComponentType<EntityStore, TransformComponent> var4,
      @Nonnull ComponentType<EntityStore, PhysicsValues> var5
   ) {
      this.physicsValuesComponentType = var5;
      this.boundingBoxComponentType = var2;
      this.transformComponentType = var4;
      this.velocityComponentType = var3;
      this.query = Query.and(var1, TransformComponent.getComponentType(), var2, var3, var5);
   }

   @Nonnull
   @Override
   class="kw">public Query<EntityStore> getQuery() {
      class="kw">return this.query;
   }

   @Override
   class="kw">public boolean isParallel(int var1, int var2) {
      class="kw">return EntityTickingSystem.maybeUseParallel(var1, var2);
   }

   @Override
   class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5) {
      Velocity var6 = var3.getComponent(var2, this.velocityComponentType);
      assert var6 != null;
      TransformComponent var7 = var3.getComponent(var2, this.transformComponentType);
      assert var7 != null;
      PhysicsValues var8 = var3.getComponent(var2, this.physicsValuesComponentType);
      assert var8 != null;
      BoundingBox var9 = var3.getComponent(var2, this.boundingBoxComponentType);
      assert var9 != null;
      Box var10 = var9.getBoundingBox();
      World var11 = var5.getExternalData().getWorld();
      ChunkStore var12 = var11.getChunkStore();
      Ref var14 = var7.getSectionRef();
      BlockSection var13;
      if (var14 != null && var14.isValid()) {
         var13 = var12.getStore().getComponent(var14, BlockSection.getComponentType());
      } else {
         var13 = null;
      }

      moveOutOfBlock(var13, var7.getPosition(), var6, var10);
      applyGravity(var1, var10, var8, var7.getPosition(), var6);
   }

   class="kw">public class="kw">static void moveOutOfBlock(@Nullable BlockSection var0, @Nonnull Vector3d var1, @Nonnull Velocity var2, @Nonnull Box var3) {
      if (var0 != null) {
         int var4 = MathUtil.floor(var1.x);
         int var5 = MathUtil.floor(var1.y);
         int var6 = MathUtil.floor(var1.z);
         BlockType var7 = BlockType.getAssetMap().getAsset(var0.get(var4, var5, var6));
         assert var7 != null;
         if (var7.getMaterial() == BlockMaterial.Solid) {
            int var8 = var0.getRotationIndex(var4, var5, var6);
            BlockBoundingBoxes.RotatedVariantBoxes var9 = BlockBoundingBoxes.getAssetMap().getAsset(var7.getHitboxTypeIndex()).get(var8);
            boolean var10 = false;

            for (Box var14 : var9.getDetailBoxes()) {
               if (CollisionMath.isOverlapping(CollisionMath.intersectAABBs(var4, var5, var6, var14, var1.x, var1.y, var1.z, var3))) {
                  var10 = true;
                  break;
               }
            }

            if (var10) {
               Vector3i var15 = NearestBlockUtil.findNearestBlock(SEARCH_ELEMENTS, var1, (var0x, var1x) -> {
                  BlockType var2 = BlockType.getAssetMap().getAsset(var1x.get(var0x.x, var0x.y, var0x.z));
                  class="kw">return var2.getMaterial() != BlockMaterial.Solid;
               }, var0);
               if (var15 != null) {
                  var1.set(var15.x + 0.5, var15.y, var15.z + 0.5);
               } else {
                  var2.setY(7.0 * var9.getBoundingBox().height());
               }
            }
         }
      }
   }

   class="kw">public class="kw">static void applyGravity(float var0, @Nullable Box var1, @Nonnull PhysicsValues var2, @Nonnull Vector3d var3, @Nonnull Velocity var4) {
      double var5 = 1.0;
      if (var1 != null) {
         var5 = Math.abs(var1.width() * var1.depth());
      }

      double var7 = PhysicsMath.getRelativeDensity(var3, var1);
      double var9 = PhysicsMath.getTerminalVelocity(var2.getMass(), var7, var5, var2.getDragCoefficient());
      if (!var2.isInvertedGravity()) {
         var9 *= -1.0;
      }

      double var11 = PhysicsMath.getAcceleration(var4.getY(), var9) * var0;
      if (var4.getY() < var9 && var11 > 0.0) {
         var4.setY(Math.min(var4.getY() + var11, var9));
      } else if (var4.getY() > var9 && var11 < 0.0) {
         var4.setY(Math.max(var4.getY() + var11, var9));
      }
   }
}