BlockCollisionProvider class

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

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

implements: BoxBlockIterator.BoxIterationConsumer

Поля (56)

МодификаторыТипИмя
final BoxBlockIntersectionEvaluator boxBlockIntersectionEvaluator
break
IBlockCollisionConsumer.Result var1
boolean var10
var10
var10
int var10
int var10
var10
Box[] var11
int var11
boolean var11
var11
int var12
BlockContactData var12
var12
var12
var12
BlockContactData var13
var13
var13
BlockContactData var15
Vector3i var16
Fluid var17
Box var18
IBlockCollisionConsumer.Result var18
Vector3i var2
Fluid var20
IBlockCollisionConsumer.Result var24
BlockBoundingBoxes var4
int var4
int var5
int var5
double var5
IBlockCollisionConsumer.Result var5
int var6
boolean var6
int var6
var6
int var6
int var7
boolean var7
BlockBoundingBoxes var7
boolean var7
boolean var8
var8
BlockContactData var8
Box[] var8
boolean var8
boolean var9
int var9
var9
var9
Vector3i var9
boolean var9
IBlockCollisionConsumer.Result var9

Методы (39)

МодификаторыВозвратСигнатура
protected boolean canCollideboolean canCollide()
protected boolean canCollideboolean canCollide(int var1)
public void castvoid cast(@Nonnull World var1, @Nonnull Box var2, @Nonnull Vector3d var3, @Nonnull Vector3d var4, @Nonnull IBlockCollisionConsumer var5, @Nonnull IBlockTracker var6, double var7)
protected void castIterativevoid castIterative(@Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, double var4)
protected void castShortDistancevoid castShortDistance(@Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3)
for for(Box var15 : var11)
for for(int var7 = 0; var7 < var6; var7++)
for for(int var14 = 0; var14 < var6; var14++)
for for(Box var23 : var8)
for for(Box var17 : var8)
protected void generateTriggerExitvoid generateTriggerExit()
if if(var9)
if if(var8)
if if(var9 != 0)
if if(var8)
if if(var6 || var7)
if if(var7)
if if(var6)
if if(var11)
if if(var12 != null)
if if(var13 != null)
if if(var11)
if if(var10 != 0)
if if(var11)
if if(var7 || var8)
if if(var8)
if if(var7)
if if(var4 == null)
if if(var4 == null)
if if(var1 != null && var1 != IBlockCollisionConsumer.Result.CONTINUE)
if if(this.movingBoxBoxCollisionEvaluator.collisionStart < this.relativeStopDistance)
protected boolean onSliceFinishedboolean onSliceFinished()
protected boolean processBlockDynamicboolean processBlockDynamic(int var1, int var2, int var3)
protected void processBlockDynamicFluidvoid processBlockDynamicFluid(int var1, int var2, int var3, @Nonnull Fluid var4, BlockContactData var5, boolean var6)
protected boolean processBlockStaticboolean processBlockStatic(int var1, int var2, int var3)
protected void processBlockStaticFluidvoid processBlockStaticFluid(int var1, int var2, int var3, @Nonnull Fluid var4, boolean var5)
public void setReportOverlapsvoid setReportOverlaps(boolean var1)
public void setRequestedCollisionMaterialsvoid setRequestedCollisionMaterials(int var1)
protected void updateStopDistancevoid updateStopDistance(@Nullable IBlockCollisionConsumer.Result var1)

Исходный код

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

class="kw">import com.hypixel.hytale.math.iterator.BoxBlockIterator;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
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.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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 BlockCollisionProvider class="kw">implements BoxBlockIterator.BoxIterationConsumer {
   class="kw">protected class="kw">final BoxBlockIntersectionEvaluator boxBlockIntersectionEvaluator = new BoxBlockIntersectionEvaluator();
   class="kw">protected class="kw">final MovingBoxBoxCollisionEvaluator movingBoxBoxCollisionEvaluator = new MovingBoxBoxCollisionEvaluator();
   class="kw">protected class="kw">final BlockDataProvider blockData = new BlockDataProvider();
   class="kw">protected class="kw">final Box fluidBox = new Box(Box.UNIT);
   class="kw">protected class="kw">final CollisionTracker damageTracker = new CollisionTracker();
   class="kw">protected class="kw">final CollisionTracker triggerTracker = new CollisionTracker();
   class="kw">protected class="kw">final BlockTracker collisionTracker = new BlockTracker();
   class="kw">protected int requestedCollisionMaterials = 4;
   class="kw">protected boolean reportOverlaps;
   @Nullable
   class="kw">protected IBlockCollisionConsumer collisionConsumer;
   @Nullable
   class="kw">protected IBlockTracker activeTriggers;
   @Nullable
   class="kw">protected Vector3d motion;
   class="kw">protected double relativeStopDistance;
   class="kw">protected IBlockCollisionConsumer.Result collisionState;

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

   class="kw">public void setRequestedCollisionMaterials(int var1) {
      this.requestedCollisionMaterials = var1;
   }

   class="kw">public void setReportOverlaps(boolean var1) {
      this.reportOverlaps = var1;
      this.movingBoxBoxCollisionEvaluator.setComputeOverlaps(var1);
   }

   @Override
   class="kw">public boolean next() {
      class="kw">return this.onSliceFinished();
   }

   @Override
   class="kw">public boolean accept(long var1, long var3, long var5) {
      class="kw">return this.processBlockDynamic((int)var1, (int)var3, (int)var5);
   }

   class="kw">public void cast(
      @Nonnull World var1,
      @Nonnull Box var2,
      @Nonnull Vector3d var3,
      @Nonnull Vector3d var4,
      @Nonnull IBlockCollisionConsumer var5,
      @Nonnull IBlockTracker var6,
      double var7
   ) {
      if (!CollisionModule.get().isDisabled()) {
         this.collisionConsumer = var5;
         this.activeTriggers = var6;
         this.motion = var4;
         this.blockData.initialize(var1);
         boolean var9 = !CollisionModule.isBelowMovementThreshold(var4);
         if (var9) {
            this.castIterative(var2, var3, var4, var7);
         } else {
            this.castShortDistance(var2, var3, var4);
         }

         var5.onCollisionFinished();
         this.blockData.cleanup();
         this.triggerTracker.reset();
         this.damageTracker.reset();
         this.collisionConsumer = null;
         this.activeTriggers = null;
         this.motion = null;
      }
   }

   class="kw">protected void castShortDistance(@Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3) {
      this.boxBlockIntersectionEvaluator.setBox(var1, var2).offsetPosition(var3);
      var1.forEachBlock(
         var2.x + var3.x, var2.y + var3.y, var2.z + var3.z, 1.0E-5, this, (var0, var1x, var2x, var3x) -> var3x.processBlockStatic(var0, var1x, var2x)
      );
      this.generateTriggerExit();
   }

   class="kw">protected boolean processBlockStatic(int var1, int var2, int var3) {
      this.blockData.read(var1, var2, var3);
      BlockBoundingBoxes var4 = this.blockData.getBlockBoundingBoxes();
      int var5 = this.blockData.originX(var1);
      int var6 = this.blockData.originY(var2);
      int var7 = this.blockData.originZ(var3);
      boolean var8 = this.blockData.isTrigger() && !this.triggerTracker.isTracked(var5, var6, var7);
      int var9 = this.blockData.getBlockDamage();
      boolean var10 = this.canCollide();
      Box[] var11 = var4.get(this.blockData.rotation).getDetailBoxes();
      this.boxBlockIntersectionEvaluator.setDamageAndSubmerged(var9, false);
      if (this.blockData.getBlockType().getMaterial() != BlockMaterial.Empty
         || this.blockData.getBlockType().getMaterial() == BlockMaterial.Empty && this.blockData.getFluidId() == 0) {
         if (var9 != 0 && var4.protrudesUnitBox()) {
            if (this.damageTracker.isTracked(var5, var6, var7)) {
               var9 = 0;
            } else {
               this.damageTracker.trackNew(var5, var6, var7);
            }
         }

         if (var10 && var4.protrudesUnitBox()) {
            if (this.collisionTracker.isTracked(var5, var6, var7)) {
               var10 = false;
            } else {
               this.collisionTracker.trackNew(var5, var6, var7);
            }
         }

         for (int var16 = 0; (var10 || var8 || var9 > 0) && var16 < var11.length; var16++) {
            Box var18 = var11[var16];
            if (!CollisionMath.isDisjoint(this.boxBlockIntersectionEvaluator.intersectBoxComputeTouch(var18, var5, var6, var7))) {
               if (var10 || this.boxBlockIntersectionEvaluator.isOverlapping() && this.reportOverlaps) {
                  this.collisionConsumer.onCollision(var5, var6, var7, this.motion, this.boxBlockIntersectionEvaluator, this.blockData, var18);
                  var10 = false;
               }

               if (var8) {
                  if (!this.activeTriggers.isTracked(var5, var6, var7)) {
                     this.activeTriggers.trackNew(var5, var6, var7);
                  }

                  this.triggerTracker.trackNew(var5, var6, var7);
                  var8 = false;
               }

               if (var9 != 0) {
                  this.collisionConsumer.onCollisionDamage(var5, var6, var7, this.motion, this.boxBlockIntersectionEvaluator, this.blockData);
                  var9 = 0;
               }
            }
         }

         Fluid var17 = this.blockData.getFluid();
         if (var17 != null && this.blockData.getFluidId() != 0) {
            this.processBlockStaticFluid(var1, var2, var3, var17, true);
         }

         class="kw">return true;
      } else {
         if (var8) {
            this.boxBlockIntersectionEvaluator.setDamageAndSubmerged(var9, false);

            for (Box var15 : var11) {
               if (!CollisionMath.isDisjoint(this.boxBlockIntersectionEvaluator.intersectBoxComputeTouch(var15, var5, var6, var7))) {
                  this.triggerTracker.trackNew(var5, var6, var7);
                  break;
               }
            }
         }

         this.processBlockStaticFluid(var1, var2, var3, this.blockData.getFluid(), false);
         class="kw">return true;
      }
   }

   class="kw">protected void processBlockStaticFluid(int var1, int var2, int var3, @Nonnull Fluid var4, boolean var5) {
      boolean var6 = var4.getDamageToEntities() != 0;
      boolean var7 = this.canCollide(2);
      if (var6 || var7) {
         this.fluidBox.max.y = this.blockData.getFillHeight();
         if (!CollisionMath.isDisjoint(this.boxBlockIntersectionEvaluator.intersectBoxComputeTouch(this.fluidBox, var1, var2, var3))) {
            this.boxBlockIntersectionEvaluator.setDamageAndSubmerged(var4.getDamageToEntities(), var5);
            if (var7) {
               this.collisionConsumer.onCollision(var1, var2, var3, this.motion, this.boxBlockIntersectionEvaluator, this.blockData, this.fluidBox);
            }

            if (var6) {
               this.collisionConsumer.onCollisionDamage(var1, var2, var3, this.motion, this.boxBlockIntersectionEvaluator, this.blockData);
            }
         }
      }
   }

   class="kw">protected boolean canCollide() {
      class="kw">return this.canCollide(this.blockData.getCollisionMaterials());
   }

   class="kw">protected boolean canCollide(int var1) {
      class="kw">return (var1 & this.requestedCollisionMaterials) != 0;
   }

   class="kw">protected void castIterative(@Nonnull Box var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, double var4) {
      this.relativeStopDistance = MathUtil.clamp(var4, 0.0, 1.0);
      this.collisionState = IBlockCollisionConsumer.Result.CONTINUE;
      this.movingBoxBoxCollisionEvaluator.setCollider(var1).setMove(var2, var3);
      var1.forEachBlock(var2, 1.0E-5, this, (var0, var1x, var2x, var3x) -> var3x.processBlockDynamic(var0, var1x, var2x));
      BoxBlockIterator.iterate(var1, var2, var3, var3.length(), this);
      int var6 = this.damageTracker.getCount();

      for (int var7 = 0; var7 < var6; var7++) {
         BlockContactData var8 = this.damageTracker.getContactData(var7);
         if (var8.getCollisionStart() <= this.relativeStopDistance) {
            Vector3i var9 = this.damageTracker.getPosition(var7);
            this.collisionConsumer.onCollisionDamage(var9.x, var9.y, var9.z, this.motion, var8, this.damageTracker.getBlockData(var7));
         }
      }

      this.generateTriggerExit();
      var6 = this.triggerTracker.getCount();

      for (int var14 = 0; var14 < var6; var14++) {
         BlockContactData var15 = this.triggerTracker.getContactData(var14);
         if (var15.getCollisionStart() <= this.relativeStopDistance) {
            Vector3i var16 = this.triggerTracker.getPosition(var14);
            int var10 = var16.x;
            int var11 = var16.y;
            int var12 = var16.z;
            if (!this.activeTriggers.isTracked(var10, var11, var12)) {
               this.activeTriggers.trackNew(var10, var11, var12);
            }
         }
      }
   }

   class="kw">protected boolean onSliceFinished() {
      IBlockCollisionConsumer.Result var1 = this.collisionConsumer.onCollisionSliceFinished();
      if (var1 != null && this.collisionState.ordinal() < var1.ordinal()) {
         this.collisionState = var1;
      }

      class="kw">return this.collisionState == IBlockCollisionConsumer.Result.CONTINUE;
   }

   class="kw">protected boolean processBlockDynamic(int var1, int var2, int var3) {
      this.blockData.read(var1, var2, var3);
      int var4 = this.blockData.originX(var1);
      int var5 = this.blockData.originY(var2);
      int var6 = this.blockData.originZ(var3);
      BlockBoundingBoxes var7 = this.blockData.getBlockBoundingBoxes();
      Box[] var8 = var7.get(this.blockData.rotation).getDetailBoxes();
      boolean var9 = this.canCollide();
      int var10 = this.blockData.getBlockDamage();
      boolean var11 = this.blockData.isTrigger();
      this.movingBoxBoxCollisionEvaluator.setDamageAndSubmerged(var10, false);
      BlockContactData var12 = null;
      BlockContactData var13 = null;
      if (var11) {
         var12 = this.triggerTracker.getContactData(var4, var5, var6);
         if (var12 != null) {
            var11 = false;
         }
      }

      if (var10 != 0 && var7.protrudesUnitBox()) {
         var13 = this.damageTracker.getContactData(var4, var5, var6);
         if (var13 != null) {
            var10 = 0;
         }
      }

      if (this.blockData.getBlockType().getMaterial() != BlockMaterial.Empty
         || this.blockData.getBlockType().getMaterial() == BlockMaterial.Empty && this.blockData.getFluidId() == 0) {
         for (Box var23 : var8) {
            if (this.movingBoxBoxCollisionEvaluator.isBoundingBoxColliding(var23, var4, var5, var6)) {
               if (this.movingBoxBoxCollisionEvaluator.getCollisionStart() > this.relativeStopDistance) {
                  if (this.movingBoxBoxCollisionEvaluator.isOverlapping() && this.reportOverlaps) {
                     IBlockCollisionConsumer.Result var18 = this.collisionConsumer
                        .onCollision(var4, var5, var6, this.motion, this.movingBoxBoxCollisionEvaluator, this.blockData, var23);
                     this.updateStopDistance(var18);
                  }
               } else {
                  if (var9 || this.movingBoxBoxCollisionEvaluator.isOverlapping() && this.reportOverlaps) {
                     IBlockCollisionConsumer.Result var24 = this.collisionConsumer
                        .onCollision(var4, var5, var6, this.motion, this.movingBoxBoxCollisionEvaluator, this.blockData, var23);
                     this.updateStopDistance(var24);
                  }

                  if (var11) {
                     var12 = this.processTriggerDynamic(var4, var5, var6, var12);
                  }

                  if (var10 != 0) {
                     var13 = this.processDamageDynamic(var4, var5, var6, var13);
                  }
               }
            }
         }

         Fluid var20 = this.blockData.getFluid();
         if (var20 != null && this.blockData.getFluidId() != 0) {
            this.processBlockDynamicFluid(var1, var2, var3, var20, var13, true);
         }

         class="kw">return this.collisionState != IBlockCollisionConsumer.Result.STOP_NOW;
      } else {
         if (var11) {
            for (Box var17 : var8) {
               if (this.movingBoxBoxCollisionEvaluator.isBoundingBoxColliding(var17, var4, var5, var6)
                  && this.movingBoxBoxCollisionEvaluator.getCollisionStart() <= this.relativeStopDistance) {
                  var12 = this.processTriggerDynamic(var4, var5, var6, var12);
               }
            }
         }

         this.processBlockDynamicFluid(var1, var2, var3, this.blockData.getFluid(), var13, false);
         class="kw">return this.collisionState != IBlockCollisionConsumer.Result.STOP_NOW;
      }
   }

   class="kw">protected void processBlockDynamicFluid(int var1, int var2, int var3, @Nonnull Fluid var4, BlockContactData var5, boolean var6) {
      boolean var7 = var4.getDamageToEntities() != 0;
      boolean var8 = this.canCollide(2);
      if (var7 || var8) {
         this.fluidBox.max.y = this.blockData.getFillHeight();
         if (this.movingBoxBoxCollisionEvaluator.isBoundingBoxColliding(this.fluidBox, var1, var2, var3)
            && this.movingBoxBoxCollisionEvaluator.getCollisionStart() <= this.relativeStopDistance) {
            this.movingBoxBoxCollisionEvaluator.setDamageAndSubmerged(var4.getDamageToEntities(), var6);
            if (var8) {
               IBlockCollisionConsumer.Result var9 = this.collisionConsumer
                  .onCollision(var1, var2, var3, this.motion, this.movingBoxBoxCollisionEvaluator, this.blockData, this.fluidBox);
               this.updateStopDistance(var9);
            }

            if (var7) {
               this.processDamageDynamic(var1, var2, var3, var5);
            }
         }
      }
   }

   @Nonnull
   class="kw">protected BlockContactData processTriggerDynamic(int var1, int var2, int var3, @Nullable BlockContactData var4) {
      if (var4 == null) {
         class="kw">return this.triggerTracker.trackNew(var1, var2, var3, this.movingBoxBoxCollisionEvaluator, this.blockData);
      }

      double var5 = Math.max(var4.collisionEnd, this.movingBoxBoxCollisionEvaluator.getCollisionEnd());
      if (this.movingBoxBoxCollisionEvaluator.getCollisionStart() < var4.collisionStart) {
         var4.assign(this.movingBoxBoxCollisionEvaluator);
      }

      var4.collisionEnd = var5;
      class="kw">return var4;
   }

   @Nonnull
   class="kw">protected BlockContactData processDamageDynamic(int var1, int var2, int var3, @Nullable BlockContactData var4) {
      IBlockCollisionConsumer.Result var5 = this.collisionConsumer
         .probeCollisionDamage(var1, var2, var3, this.motion, this.movingBoxBoxCollisionEvaluator, this.blockData);
      this.updateStopDistance(var5);
      if (var4 == null) {
         class="kw">return this.damageTracker.trackNew(var1, var2, var3, this.movingBoxBoxCollisionEvaluator, this.blockData);
      }

      if (this.movingBoxBoxCollisionEvaluator.getCollisionStart() < var4.collisionStart) {
         var4.assign(this.movingBoxBoxCollisionEvaluator);
      }

      class="kw">return var4;
   }

   class="kw">protected void updateStopDistance(@Nullable IBlockCollisionConsumer.Result var1) {
      if (var1 != null && var1 != IBlockCollisionConsumer.Result.CONTINUE) {
         if (this.movingBoxBoxCollisionEvaluator.collisionStart < this.relativeStopDistance) {
            this.relativeStopDistance = this.movingBoxBoxCollisionEvaluator.collisionStart;
         }

         if (var1.ordinal() > this.collisionState.ordinal()) {
            this.collisionState = var1;
         }
      }
   }

   class="kw">protected void generateTriggerExit() {
      for (int var1 = this.activeTriggers.getCount() - 1; var1 >= 0; var1--) {
         Vector3i var2 = this.activeTriggers.getPosition(var1);
         if (!this.triggerTracker.isTracked(var2.x, var2.y, var2.z)) {
            this.activeTriggers.untrack(var2.x, var2.y, var2.z);
         }
      }
   }
}