CollisionModule class

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

Файл: com/hypixel/hytale/server/core/modules/collision/CollisionModule.java

extends: JavaPlugin

Поля (68)

МодификаторыТипИмя
instance
return
Ref var10
BoxBlockIntersectionEvaluator var10
int var10
boolean var10
Box var10
Archetype var11
int var11
var11
Vector3d var11
boolean var12
boolean var12
var12
Object var12
TransformComponent var13
String var13
CollisionFilter var13
BoundingBox var14
String var14
int var14
Vector3d var15
Box var16
boolean var17
BlockBoundingBoxes.RotatedVariantBoxes var2
double var3
var3
CollisionModuleConfig var4
CollisionConfig var4
CollisionConfig var4
CollisionConfig var4
BlockCollisionData var4
double var5
var5
Vector3d var5
BoxBlockIntersectionEvaluator var5
Vector3d var5
CollisionConfig var5
int var5
BoxBlockIntersectionEvaluator var5
World var6
CollisionConfig var6
Vector2d var6
int var6
Predicate var6
int var6
int var6
double var7
var7
var7
var7
boolean var7
Box var7
int var7
int var7
int var7
List var8
int var8
boolean var8
int var8
CollisionModuleConfig var8
int var8
int var9
boolean var9
int var9
boolean var9
int var9
var9

Методы (57)

МодификаторыВозвратСигнатура
static void addImmediateCollisionvoid addImmediateCollision(@Nonnull Vector3d var0, @Nonnull CollisionResult var1, @Nonnull CollisionConfig var2, int var3)
abstract addImmediateCollision addImmediateCollision(var5, var3x, var4, 0)
abstract addImmediateCollision addImmediateCollision(var1, var0, var5, var4)
static void findBlockCollisionsIterativevoid findBlockCollisionsIterative(@Nonnull World var0, @Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, boolean var4, @Nonnull CollisionResult var5)
abstract findBlockCollisionsIterative findBlockCollisionsIterative(var6, var0, var1, var2, var3, var4)
static void findBlockCollisionsShortDistancevoid findBlockCollisionsShortDistance(@Nonnull World var0, @Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull CollisionResult var4)
abstract findBlockCollisionsShortDistance findBlockCollisionsShortDistance(var6, var0, var1, var2, var4)
static void findCharacterCollisionsvoid findCharacterCollisions(@Nonnull Box var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull CollisionResult var3, @Nonnull ComponentAccessor<EntityStore> var4)
abstract findCharacterCollisions findCharacterCollisions(var0, var1, var2, var4, var5)
static boolean findCollisionsboolean findCollisions(@Nonnull Box var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull CollisionResult var3, @Nonnull ComponentAccessor<EntityStore> var4)
static boolean findCollisionsboolean findCollisions(@Nonnull Box var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, boolean var3, @Nonnull CollisionResult var4, @Nonnull ComponentAccessor<EntityStore> var5)
abstract return findCollisionsreturn findCollisions(var0, var1, var2, true, var3, var4)
public void findIntersectionsvoid findIntersections(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3d var3, @Nonnull CollisionResult var4, boolean var5, boolean var6)
for for(int var17 = 0; var17 < var9; var17++)
for for(int var11 = 0; var11 < var10; var11++)
for for(int var15 = 0; var15 < var14; var15++)
abstract for for(int var9 = 0; var9 < var8.size()
static CollisionModule getCollisionModule get()
public ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> getTangibleEntitySpatialResourceTypeResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> getTangibleEntitySpatialResourceType()
private void handleLoadedHitboxvoid handleLoadedHitbox(@Nonnull BlockBoundingBoxes var1)
if if(var3 > var5)
if if(var5 > 1.0)
if if(var5 > this.extentMax)
if if(var7 < 0.0)
if if(var7 < this.minimumThickness)
if if(var7)
if if(var13 != null)
if if(var14 != null)
if if(var4.blockId == Integer.MIN_VALUE)
if if(var9 <= 1)
if if(!var3)
if if(var5.blockCanTrigger)
if if(var3 && var5.blockCanCollide)
if if(var10 <= 1)
if if(var8 && var4.blockCanTrigger)
if if(var9)
if if(var8 && var4.blockCanTrigger)
if if(var9)
if if(var6)
if if(var4.blockId == Integer.MIN_VALUE)
if if(var14 <= 1)
if if(var4.dumpInvalidBlocks)
if if(var4.dumpNonOverlappingBlocks)
if if(var4.dumpInvalidBlocks)
if if(var4.dumpNonOverlappingBlocks)
if if(var9)
if if(var10)
static boolean isBelowMovementThresholdboolean isBelowMovementThreshold(@Nonnull Vector3d var0)
static void logOverlapvoid logOverlap(int var0, @Nonnull Vector3d var1, @Nonnull Box var2, @Nonnull CollisionConfig var3, @Nonnull Box var4, int var5, int var6, int var7, int var8, int var9, boolean var10)
private void onLoadedAssetsEventvoid onLoadedAssetsEvent(@Nonnull LoadedAssetsEvent<String, BlockBoundingBoxes, IndexedLookupTableAssetMap<String, BlockBoundingBoxes>> var1)
static void processCollisionvoid processCollision(@Nonnull CollisionResult var0, @Nonnull Vector3d var1, @Nonnull BoxBlockIntersectionEvaluator var2, boolean var3, int var4)
abstract processCollision processCollision(var3x, var5, var10, var12, 0)
abstract processCollision processCollision(var3x, var5, var10, var12, var17)
abstract super super(var1)
public int validatePositionint validatePosition(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3dc var3, @Nonnull CollisionResult var4)
public <T> int validatePosition<T> int validatePosition(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3dc var3, int var4, @Nullable T var5, @Nonnull CollisionFilter<BoxBlockIntersectionEvaluator, T> var6, @Nonnull CollisionResult var7)
private <T> int validatePosition<T> int validatePosition(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3dc var3, @Nullable T var4, @Nullable CollisionFilter<BoxBlockIntersectionEvaluator, T> var5, boolean var6, @Nonnull CollisionResult var7)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.spatial.KDTree;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.entity.entities.ProjectileComponent;
class="kw">import com.hypixel.hytale.server.core.modules.collision.commands.HitboxCommand;
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.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.component.Projectile;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
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.Config;
class="kw">import java.util.List;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2d;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;

class="kw">public class CollisionModule class="kw">extends JavaPlugin {
   @Nonnull
   class="kw">public class="kw">static class="kw">final PluginManifest MANIFEST = PluginManifest.corePlugin(CollisionModule.class).build();
   class="kw">public class="kw">static class="kw">final int VALIDATE_INVALID = -1;
   class="kw">public class="kw">static class="kw">final int VALIDATE_OK = 0;
   class="kw">public class="kw">static class="kw">final int VALIDATE_ON_GROUND = 1;
   class="kw">public class="kw">static class="kw">final int VALIDATE_TOUCH_CEIL = 2;
   class="kw">private class="kw">static CollisionModule instance;
   class="kw">private ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> tangibleEntitySpatialResourceType;
   class="kw">private double extentMax;
   class="kw">private double minimumThickness;
   @Nonnull
   class="kw">private class="kw">final Config<CollisionModuleConfig> config = this.withConfig("CollisionModule", CollisionModuleConfig.CODEC);

   class="kw">public class="kw">static CollisionModule get() {
      class="kw">return instance;
   }

   class="kw">public CollisionModule(@Nonnull JavaPluginInit var1) {
      super(var1);
      instance = this;
   }

   @Nonnull
   class="kw">public CollisionModuleConfig getConfig() {
      class="kw">return this.config.get();
   }

   @Override
   class="kw">protected void setup() {
      this.getCommandRegistry().registerCommand(new HitboxCommand());
      this.getEventRegistry().register(LoadedAssetsEvent.class, BlockBoundingBoxes.class, this::onLoadedAssetsEvent);
      this.tangibleEntitySpatialResourceType = this.getEntityStoreRegistry().registerSpatialResource(() -> new KDTree<>(Ref::isValid));
   }

   class="kw">public ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> getTangibleEntitySpatialResourceType() {
      class="kw">return this.tangibleEntitySpatialResourceType;
   }

   class="kw">private void onLoadedAssetsEvent(@Nonnull LoadedAssetsEvent<String, BlockBoundingBoxes, IndexedLookupTableAssetMap<String, BlockBoundingBoxes>> var1) {
      if (var1.isInitial()) {
         this.extentMax = 0.0;
         this.minimumThickness = Double.MAX_VALUE;
      }

      for (BlockBoundingBoxes var3 : var1.getLoadedAssets().values()) {
         this.handleLoadedHitbox(var3);
      }

      CollisionModuleConfig var4 = this.config.get();
      if (var4.hasMinimumThickness()) {
         this.minimumThickness = var4.getMinimumThickness();
      }

      this.getLogger().at(Level.INFO).log("Block extents for CollisionSystem is Max=%g, Min=%g", this.extentMax, this.minimumThickness);
   }

   class="kw">private void handleLoadedHitbox(@Nonnull BlockBoundingBoxes var1) {
      BlockBoundingBoxes.RotatedVariantBoxes var2 = var1.get(Rotation.None, Rotation.None, Rotation.None);
      double var3 = var2.getBoundingBox().getMaximumExtent();
      double var5 = 0.0;
      if (var3 > var5) {
         var5 = var3;
      }

      if (var5 > 1.0) {
         this.getLogger()
            .at(Level.FINE)
            .log("Block Hitbox %s protrudes more than 1 unit (%s units) out of standard block and degrades performance", var1.getId(), var5);
      }

      if (var5 > this.extentMax) {
         this.extentMax = var5;
      }

      double var7;
      if (var2.hasDetailBoxes()) {
         var7 = Double.MAX_VALUE;

         for (Box var12 : var2.getDetailBoxes()) {
            var7 = Math.min(var7, var12.getThickness());
         }
      } else {
         var7 = var2.getBoundingBox().getThickness();
      }

      if (var7 < 0.0) {
         this.getLogger().at(Level.SEVERE).log("Hitbox for %s has a negative size!", var1.getId());
      } else {
         if (var7 < this.minimumThickness) {
            this.minimumThickness = var7;
         }
      }
   }

   class="kw">public class="kw">static boolean findCollisions(
      @Nonnull Box var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull CollisionResult var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      class="kw">return findCollisions(var0, var1, var2, true, var3, var4);
   }

   class="kw">public class="kw">static boolean findCollisions(
      @Nonnull Box var0,
      @Nonnull Vector3d var1,
      @Nonnull Vector3d var2,
      boolean var3,
      @Nonnull CollisionResult var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      World var6 = var5.getExternalData().getWorld();
      var4.reset();
      boolean var7 = !isBelowMovementThreshold(var2);
      if (var7) {
         findBlockCollisionsIterative(var6, var0, var1, var2, var3, var4);
      } else {
         findBlockCollisionsShortDistance(var6, var0, var1, var2, var4);
      }

      if (var4.isCheckingForCharacterCollisions()) {
         findCharacterCollisions(var0, var1, var2, var4, var5);
      }

      var4.process();
      class="kw">return var7;
   }

   class="kw">public class="kw">static void findBlockCollisionsIterative(
      @Nonnull World var0, @Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, boolean var4, @Nonnull CollisionResult var5
   ) {
      if (var5.shouldLog()) {
         var5.getLogger()
            .at(Level.INFO)
            .log(
               "eid=%d >>>>>> Start findBlockCollisionIterative collider=[%s] pos=%s dir=%s",
               var5.getDebugEntityId(),
               var1,
               Vector3dUtil.formatShortString(var2),
               Vector3dUtil.formatShortString(var3)
            );
      }

      CollisionConfig var6 = var5.getConfig();
      var6.setWorld(var0);
      var5.getMovingBoxBoxCollision().setCollider(var1).setMove(var2, var3);
      if (var5.shouldLog()) {
         var5.getLogger().at(Level.INFO).log("eid=%d >>>>>> Start collider=[%s] + offset[%s]", var5.getDebugEntityId(), var1, var3);
      }

      var5.acquireCollisionModule();
      var1.forEachBlock(var2, 1.0E-5, var5, (var0x, var1x, var2x, var3x) -> var3x.accept(var0x, var1x, var2x));
      if (var5.shouldLog()) {
         var5.getLogger()
            .at(Level.INFO)
            .log("eid=%d >>>> line collider=[%s] dir=%s len=%s", var5.getDebugEntityId(), var1, Vector3dUtil.formatShortString(var3), var3.length());
      }

      var5.iterateBlocks(var1, var2, var3, var3.length(), var4, 1.0E-5);
      var6.clear();
   }

   class="kw">public class="kw">static void findCharacterCollisions(
      @Nonnull Box var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull CollisionResult var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (!isBelowMovementThreshold(var2)) {
         Vector3d var5 = new Vector3d();
         Vector2d var6 = new Vector2d();
         Box var7 = new Box();
         List var8 = var3.getCollisionEntities();

         for (int var9 = 0; var9 < var8.size(); var9++) {
            Ref var10 = var8.get(var9);
            if (var10.isValid()) {
               Archetype var11 = var4.getArchetype(var10);
               boolean var12 = var11.contains(Projectile.getComponentType()) || var11.contains(ProjectileComponent.getComponentType());
               if (!var12 && !var11.contains(DeathComponent.getComponentType())) {
                  TransformComponent var13 = var4.getComponent(var10, TransformComponent.getComponentType());
                  if (var13 != null) {
                     BoundingBox var14 = var4.getComponent(var10, BoundingBox.getComponentType());
                     if (var14 != null) {
                        Vector3d var15 = var13.getPosition();
                        Box var16 = var14.getBoundingBox();
                        if (CollisionMath.intersectSweptAABBs(var1, var2, var0, var15, var16, var6, var7) && var6.x <= 1.0) {
                           boolean var17 = var4.getComponent(var10, PlayerRef.getComponentType()) != null;
                           var5.set(var1).fma(var6.x, var2);
                           var3.allocCharacterCollision().assign(var5, var15, var6.x, var10, var17);
                        }
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static void findBlockCollisionsShortDistance(
      @Nonnull World var0, @Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull CollisionResult var4
   ) {
      var4.reset();
      var4.getConfig().setWorld(var0);
      var4.getConfig().extraData1 = var2;
      BoxBlockIntersectionEvaluator var5 = var4.getBoxBlockIntersection();
      var5.setBox(var1, var2).offsetPosition(var3);
      var1.forEachBlock(
         var2.x + var3.x,
         var2.y + var3.y,
         var2.z + var3.z,
         1.0E-5,
         var4,
         (var0x, var1x, var2x, var3x) -> {
            CollisionConfig var4 = var3x.getConfig();
            if (!var4.canCollide(var0x, var1x, var2x)) {
               if (var3x.shouldLog()) {
                  String var14 = var4.blockType != null ? var4.blockType.getId().toString() : "null";
                  var3x.getLogger()
                     .at(Level.INFO)
                     .log("eid=%d -- Short: Ignoring block at %s/%s/%s blockType=%s", var3x.getDebugEntityId(), var0x, var1x, var2x, var14);
               }

               class="kw">return true;
            } else {
               Vector3d var5 = (Vector3d)var4.extraData1;
               if (var4.blockId == Integer.MIN_VALUE) {
                  addImmediateCollision(var5, var3x, var4, 0);
                  if (var3x.shouldLog()) {
                     var3x.getLogger()
                        .at(Level.INFO)
                        .log("eid=%d -- Short: Stopping with invalid block at %s/%s/%s blockType=<invalid>", var3x.getDebugEntityId(), var0x, var1x, var2x);
                  }

                  class="kw">return true;
               } else {
                  int var6 = var0x + var4.getBoundingBoxOffsetX();
                  int var7 = var1x + var4.getBoundingBoxOffsetY();
                  int var8 = var2x + var4.getBoundingBoxOffsetZ();
                  int var9 = var4.getDetailCount();
                  BoxBlockIntersectionEvaluator var10 = var3x.getBoxBlockIntersection();
                  int var11 = var10.intersectBoxComputeTouch(var4.getBoundingBox(), var6, var7, var8);
                  boolean var12 = !CollisionMath.isDisjoint(var11);
                  if (var3x.shouldLog()) {
                     String var13 = var4.blockType != null ? var4.blockType.getId().toString() : "null";
                     var3x.getLogger()
                        .at(Level.INFO)
                        .log(
                           "eid=%d ?? Block Test at %s/%s/%s numDet=%d haveColl=%s overlap=%s blockType=%s",
                           var3x.getDebugEntityId(),
                           var0x,
                           var1x,
                           var2x,
                           var9,
                           var12,
                           var3x.getBoxBlockIntersection().isOverlapping(),
                           var13
                        );
                  }

                  if (var9 <= 1) {
                     processCollision(var3x, var5, var10, var12, 0);
                  } else {
                     for (int var17 = 0; var17 < var9; var17++) {
                        var11 = var10.intersectBoxComputeTouch(var4.getBoundingBox(var17), var6, var7, var8);
                        var12 = !CollisionMath.isDisjoint(var11);
                        processCollision(var3x, var5, var10, var12, var17);
                     }
                  }

                  class="kw">return true;
               }
            }
         }
      );
      var4.getConfig().clear();
   }

   class="kw">protected class="kw">static void processCollision(
      @Nonnull CollisionResult var0, @Nonnull Vector3d var1, @Nonnull BoxBlockIntersectionEvaluator var2, boolean var3, int var4
   ) {
      CollisionConfig var5 = var0.getConfig();
      Predicate var6 = var5.getBlockCollisionPredicate();
      if (var0.shouldLog()) {
         var0.getLogger()
            .at(Level.INFO)
            .log(
               "eid=%d ?? Short: Further testing block haveCol=%s hitBoxIndex=%s onGround=%s touching=%s canCollide=%s canTrigger=%s",
               var0.getDebugEntityId(),
               var3,
               var4,
               var2.isOnGround(),
               var2.isTouching(),
               var5.blockCanCollide,
               var5.blockCanTrigger
            );
      }

      if (var2.isOnGround() && var5.blockCanCollide) {
         var3 = var5.blockType == null || !var6.test(var5);
         if (!var3) {
            var0.addSlide(var2, var4);
            if (var5.blockCanTrigger) {
               var0.addTrigger(var2, var4);
            }

            if (var0.shouldLog()) {
               var0.getLogger()
                  .at(Level.INFO)
                  .log(
                     "eid=%d ++ Short: Sliding block start=%s end=%s normal=%s",
                     var0.getDebugEntityId(),
                     var2.getCollisionStart(),
                     var2.getCollisionEnd(),
                     Vector3dUtil.formatShortString(var2.getCollisionNormal())
                  );
            }

            class="kw">return;
         }

         if (var0.shouldLog()) {
            var0.getLogger()
               .at(Level.INFO)
               .log(
                  "eid=%d ?? Short: Sliding block is unwalkable start=%s end=%s normal=%s",
                  var0.getDebugEntityId(),
                  var2.getCollisionStart(),
                  var2.getCollisionEnd(),
                  Vector3dUtil.formatShortString(var2.getCollisionNormal())
               );
         }
      }

      if (var3 && var5.blockCanCollide) {
         addImmediateCollision(var1, var0, var5, var4);
         if (var0.shouldLog()) {
            var0.getLogger()
               .at(Level.INFO)
               .log(
                  "eid=%d ++ Short: Collision with block start=%s end=%s normal=%s",
                  var0.getDebugEntityId(),
                  var2.getCollisionStart(),
                  var2.getCollisionEnd(),
                  Vector3dUtil.formatShortString(var2.getCollisionNormal())
               );
         }
      }

      if (var5.blockCanTrigger && (var3 || var2.isTouching())) {
         if (var0.shouldLog()) {
            var0.getLogger()
               .at(Level.INFO)
               .log(
                  "eid=%d ++ Short: Trigger block start=%s end=%s normal=%s",
                  var0.getDebugEntityId(),
                  var2.getCollisionStart(),
                  var2.getCollisionEnd(),
                  Vector3dUtil.formatShortString(var2.getCollisionNormal())
               );
         }

         var0.addTrigger(var2, var4);
      }
   }

   class="kw">public void findIntersections(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3d var3, @Nonnull CollisionResult var4, boolean var5, boolean var6) {
      if (!this.isDisabled()) {
         var4.reset();
         var4.getConfig().setWorld(var1);
         var4.getConfig().extraData1 = var5;
         var4.getConfig().extraData2 = var6;
         var4.getBoxBlockIntersection().setBox(var2, var3).expandBox(0.01);
         var4.getBoxBlockIntersection().box.forEachBlock(var3, 1.0E-5, var4, (var0, var1x, var2x, var3x) -> {
            CollisionConfig var4 = var3x.getConfig();
            if (!var4.canCollide(var0, var1x, var2x)) {
               class="kw">return true;
            }

            int var5 = var0 + var4.getBoundingBoxOffsetX();
            int var6 = var1x + var4.getBoundingBoxOffsetY();
            int var7 = var2x + var4.getBoundingBoxOffsetZ();
            if (!var3x.getBoxBlockIntersection().isBoxIntersecting(var4.getBoundingBox(), var5, var6, var7)) {
               class="kw">return true;
            }

            boolean var8 = (Boolean)var4.extraData1;
            boolean var9 = (Boolean)var4.extraData2;
            int var10 = var4.getDetailCount();
            if (var10 <= 1) {
               if (var8 && var4.blockCanTrigger) {
                  var3x.addTrigger(var3x.getBoxBlockIntersection(), 0);
               }

               if (var9) {
                  var3x.addCollision(var3x.getBoxBlockIntersection(), 0);
               }
            } else {
               for (int var11 = 0; var11 < var10; var11++) {
                  if (var3x.getBoxBlockIntersection().isBoxIntersecting(var4.getBoundingBox(var11), var5, var6, var7)) {
                     if (var8 && var4.blockCanTrigger) {
                        var3x.addTrigger(var3x.getBoxBlockIntersection(), var11);
                     }

                     if (var9) {
                        var3x.addCollision(var3x.getBoxBlockIntersection(), var11);
                     }
                  }
               }
            }

            class="kw">return true;
         });
         var4.getConfig().clear();
      }
   }

   class="kw">public int validatePosition(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3dc var3, @Nonnull CollisionResult var4) {
      class="kw">return this.isDisabled() ? 0 : this.validatePosition(var1, var2, var3, null, (var0, var1x, var2x, var3x) -> true, false, var4);
   }

   class="kw">public <T> int validatePosition(
      @Nonnull World var1,
      @Nonnull Box var2,
      @Nonnull Vector3dc var3,
      int var4,
      @Nullable T var5,
      @Nonnull CollisionFilter<BoxBlockIntersectionEvaluator, T> var6,
      @Nonnull CollisionResult var7
   ) {
      if (this.isDisabled()) {
         class="kw">return 0;
      }

      int var8 = var7.getCollisionByMaterial();
      var7.setCollisionByMaterial(var4);
      int var9 = this.validatePosition(var1, var2, var3, var5, var6, (var4 & 16) == 0, var7);
      var7.setCollisionByMaterial(var8);
      class="kw">return var9;
   }

   class="kw">private <T> int validatePosition(
      @Nonnull World var1,
      @Nonnull Box var2,
      @Nonnull Vector3dc var3,
      @Nullable T var4,
      @Nullable CollisionFilter<BoxBlockIntersectionEvaluator, T> var5,
      boolean var6,
      @Nonnull CollisionResult var7
   ) {
      CollisionModuleConfig var8 = this.config.get();
      var7.getConfig().setWorld(var1);
      var7.getConfig().dumpInvalidBlocks = var8.isDumpInvalidBlocks();
      var7.getConfig().dumpNonOverlappingBlocks = var8.isDumpNonOverlappingBlocks();
      var7.getConfig().extraData1 = var4;
      var7.getConfig().extraData2 = var5;
      var7.getBoxBlockIntersection().setBox(var2, var3);
      boolean var9 = var7.isCheckingTriggerBlocks();
      boolean var10 = var7.isCheckingDamageBlocks();
      var7.disableTriggerBlocks();
      if (var6) {
         var7.disableDamageBlocks();
      }

      var7.validate = 0;
      var2.forEachBlock(var3, 1.0E-5, var7, (var0, var1x, var2x, var3x) -> {
         CollisionConfig var4 = var3x.getConfig();
         if (!var4.canCollide(var0, var1x, var2x)) {
            class="kw">return true;
         }

         BoxBlockIntersectionEvaluator var5 = var3x.getBoxBlockIntersection();
         int var6 = var0 + var4.getBoundingBoxOffsetX();
         int var7 = var1x + var4.getBoundingBoxOffsetY();
         int var8 = var2x + var4.getBoundingBoxOffsetZ();
         int var9 = var5.intersectBoxComputeOnGround(var4.getBoundingBox(), var6, var7, var8);
         if (var4.blockId == Integer.MIN_VALUE) {
            if (CollisionMath.isOverlapping(var9)) {
               var3x.validate = -1;
               class="kw">return false;
            } else {
               class="kw">return true;
            }
         } else {
            if (CollisionMath.isDisjoint(var9)) {
               class="kw">return true;
            }

            Box var10 = var5.box;
            Vector3d var11 = var5.collisionPoint;
            Object var12 = var4.extraData1;
            CollisionFilter var13 = (CollisionFilter<BoxBlockIntersectionEvaluator, Object>)var4.extraData2;
            int var14 = var4.getDetailCount();
            if (var14 <= 1) {
               if (!var13.test(var12, var9, var5, var4)) {
                  class="kw">return true;
               }

               if (CollisionMath.isOverlapping(var9)) {
                  if (var4.dumpInvalidBlocks) {
                     logOverlap(var3x.getDebugEntityId(), var11, var10, var4, var4.getBoundingBox(), var0, var1x, var2x, 0, var9, true);
                  }

                  var3x.validate = -1;
                  class="kw">return false;
               }

               if (var4.dumpNonOverlappingBlocks) {
                  logOverlap(var3x.getDebugEntityId(), var11, var10, var4, var4.getBoundingBox(), var0, var1x, var2x, 0, var9, false);
               }

               if (var5.isOnGround()) {
                  var3x.validate |= 1;
               }

               if (var5.touchesCeil()) {
                  var3x.validate |= 2;
               }
            } else {
               for (int var15 = 0; var15 < var14; var15++) {
                  var9 = var5.intersectBoxComputeOnGround(var4.getBoundingBox(var15), var6, var7, var8);
                  if (!CollisionMath.isDisjoint(var9) && var13.test(var12, var9, var5, var4)) {
                     if (CollisionMath.isOverlapping(var9)) {
                        if (var4.dumpInvalidBlocks) {
                           logOverlap(var3x.getDebugEntityId(), var11, var10, var4, var4.getBoundingBox(var15), var0, var1x, var2x, var15, var9, true);
                        }

                        var3x.validate = -1;
                        class="kw">return false;
                     }

                     if (var4.dumpNonOverlappingBlocks) {
                        logOverlap(var3x.getDebugEntityId(), var11, var10, var4, var4.getBoundingBox(var15), var0, var1x, var2x, var15, var9, false);
                     }

                     if (var5.isOnGround()) {
                        var3x.validate |= 1;
                     }

                     if (var5.touchesCeil()) {
                        var3x.validate |= 2;
                     }
                  }
               }
            }

            class="kw">return true;
         }
      });
      if (var9) {
         var7.enableTriggerBlocks();
      }

      if (var10) {
         var7.enableDamageBlocks();
      }

      var7.getConfig().clear();
      class="kw">return var7.validate;
   }

   class="kw">private class="kw">static void addImmediateCollision(@Nonnull Vector3d var0, @Nonnull CollisionResult var1, @Nonnull CollisionConfig var2, int var3) {
      BlockCollisionData var4 = var1.newCollision();
      var4.setStart(var0, 0.0);
      var4.setEnd(1.0, var1.getBoxBlockIntersection().getCollisionNormal());
      var4.setBlockData(var2);
      var4.setDetailBoxIndex(var3);
      var4.setTouchingOverlapping(false, true);
   }

   class="kw">public class="kw">static boolean isBelowMovementThreshold(@Nonnull Vector3d var0) {
      class="kw">return var0.lengthSquared() < 1.0000000000000002E-10;
   }

   class="kw">private class="kw">static void logOverlap(
      int var0,
      @Nonnull Vector3d var1,
      @Nonnull Box var2,
      @Nonnull CollisionConfig var3,
      @Nonnull Box var4,
      int var5,
      int var6,
      int var7,
      int var8,
      int var9,
      boolean var10
   ) {
      get()
         .getLogger()
         .at(Level.WARNING)
         .log(
            "eid=%d %sOverlapping blocks - code=%s%s%s index=%s pos=%s loc=%s/%s/%s id=%s mat=%s name=%s box=%s|%s hitbox=%s|%s",
            var0,
            var10 ? "" : "Non-",
            (var9 & 8) != 0 ? "X" : "",
            (var9 & 16) != 0 ? "Y" : "",
            (var9 & 32) != 0 ? "Z" : "",
            var8,
            Vector3dUtil.formatShortString(var1),
            var5 + var3.getBoundingBoxOffsetX(),
            var6 + var3.getBoundingBoxOffsetY(),
            var7 + var3.getBoundingBoxOffsetZ(),
            new Object[]{
               var3.blockId,
               var3.blockMaterial != null ? var3.blockMaterial.name() : "none",
               var3.blockType != null ? var3.blockType.getId() : "none",
               Vector3dUtil.formatShortString(var2.getMin()),
               Vector3dUtil.formatShortString(var2.getMax()),
               Vector3dUtil.formatShortString(var4.min),
               Vector3dUtil.formatShortString(var4.max)
            }
         );
   }
}