CollisionConfig class

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

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

Поля (19)

МодификаторыТипИмя
final int MATERIAL_EMPTY
int var10
var10
var10
Fluid var11
var11
var11
byte var12
var12
int var13
int var14
boolean var15
boolean var2
int var4
int var5
int var6
int var7
BlockType var8
FluidSection var9

Методы (28)

МодификаторыВозвратСигнатура
public boolean canCollideboolean canCollide(int var1, int var2, int var3)
public void clearvoid clear()
public Predicate<CollisionConfig> getBlockCollisionPredicatePredicate<CollisionConfig> getBlockCollisionPredicate()
public int getBoundingBoxOffsetXint getBoundingBoxOffsetX()
public int getBoundingBoxOffsetYint getBoundingBoxOffsetY()
public int getBoundingBoxOffsetZint getBoundingBoxOffsetZ()
public int getCollisionByMaterialint getCollisionByMaterial()
public int getDetailCountint getDetailCount()
if if(this.blockId == 0 && this.fluidId != 0 && this.fluid != null)
if if(var1)
if if(this.world != var1)
if if(this.chunkSection == null)
if if(var9 != null)
if if(var7 == this.blockId && this.rotation == var14 && this.fluidId == var10 && this.fluidLevel == var12)
if if(this.blockMaterial == BlockMaterial.Empty)
if if(this.boundingBoxes == null)
if if(this.extraBlockCollisionFilter == null)
public boolean isCheckDamageBlocksboolean isCheckDamageBlocks()
public boolean isCheckTriggerBlocksboolean isCheckTriggerBlocks()
public boolean isCollidingWithDamageBlocksboolean isCollidingWithDamageBlocks()
private boolean passesExtraBlockCollisionFilterboolean passesExtraBlockCollisionFilter()
public void setCheckDamageBlocksvoid setCheckDamageBlocks(boolean var1)
public void setCheckTriggerBlocksvoid setCheckTriggerBlocks(boolean var1)
public boolean setCollideWithDamageBlocksboolean setCollideWithDamageBlocks(boolean var1)
public void setCollisionByMaterialvoid setCollisionByMaterial(int var1)
public void setDefaultBlockCollisionPredicatevoid setDefaultBlockCollisionPredicate()
public void setDefaultCollisionBehaviourvoid setDefaultCollisionBehaviour()
public void setWorldvoid setWorld(World var1)

Исходный код

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

class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
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.asset.type.blocktype.config.Rotation;
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 com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.FluidSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import java.util.function.Predicate;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class CollisionConfig {
   class="kw">public class="kw">static class="kw">final int MATERIAL_EMPTY = 1;
   class="kw">public class="kw">static class="kw">final int MATERIAL_FLUID = 2;
   class="kw">public class="kw">static class="kw">final int MATERIAL_SOLID = 4;
   class="kw">public class="kw">static class="kw">final int MATERIAL_SUBMERGED = 8;
   class="kw">public class="kw">static class="kw">final int MATERIAL_DAMAGE = 16;
   class="kw">public class="kw">static class="kw">final int MATERIAL_SET_NONE = 0;
   class="kw">public class="kw">static class="kw">final int MATERIAL_SET_ANY = 15;
   class="kw">public class="kw">static class="kw">final int MATERIAL_INVALID = -1;
   class="kw">public int blockId;
   @Nullable
   class="kw">public BlockType blockType;
   @Nullable
   class="kw">public BlockMaterial blockMaterial;
   class="kw">public int rotation;
   class="kw">public int blockX;
   class="kw">public int blockY;
   class="kw">public int blockZ;
   class="kw">private int boundingBoxOffsetX;
   class="kw">private int boundingBoxOffsetY;
   class="kw">private int boundingBoxOffsetZ;
   class="kw">private BlockBoundingBoxes.RotatedVariantBoxes boundingBoxes;
   @Nullable
   class="kw">private BlockSection chunkSection;
   class="kw">private int chunkX;
   class="kw">private int chunkY;
   class="kw">private int chunkZ;
   @Nullable
   class="kw">private Ref<ChunkStore> chunkSectionRef;
   @Nullable
   class="kw">public Fluid fluid;
   class="kw">public int fluidId;
   class="kw">public byte fluidLevel;
   @Nonnull
   class="kw">private Box blockBox = new Box();
   class="kw">private World world;
   class="kw">private int blockMaterialCollisionMask;
   class="kw">public int blockMaterialMask;
   class="kw">public boolean blockCanCollide;
   class="kw">public boolean blockCanTrigger;
   class="kw">public boolean blockCanTriggerPartial;
   class="kw">public boolean checkTriggerBlocks = true;
   class="kw">public boolean checkDamageBlocks = true;
   class="kw">public boolean blockFilteredOut;
   class="kw">public Predicate<CollisionConfig> canCollide;
   @Nullable
   class="kw">public Predicate<CollisionConfig> extraBlockCollisionFilter;
   class="kw">public boolean dumpInvalidBlocks;
   class="kw">public boolean dumpNonOverlappingBlocks;
   @Nullable
   class="kw">public Object extraData1;
   @Nullable
   class="kw">public Object extraData2;

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

   class="kw">public int getDetailCount() {
      class="kw">return this.boundingBoxes.getDetailBoxes().length;
   }

   @Nonnull
   class="kw">public Box getBoundingBox() {
      this.blockBox.assign(this.boundingBoxes.getBoundingBox());
      if (this.blockId == 0 && this.fluidId != 0 && this.fluid != null) {
         this.blockBox.max.y -= 0.03125;
         this.blockBox.max.y = this.blockBox.max.y * ((double)this.fluidLevel / this.fluid.getMaxFluidLevel());
      }

      class="kw">return this.blockBox;
   }

   @Nonnull
   class="kw">public Box getBoundingBox(int var1) {
      this.blockBox.assign(this.boundingBoxes.getDetailBoxes()[var1]);
      class="kw">return this.blockBox;
   }

   class="kw">public int getBoundingBoxOffsetX() {
      class="kw">return this.boundingBoxOffsetX;
   }

   class="kw">public int getBoundingBoxOffsetY() {
      class="kw">return this.boundingBoxOffsetY;
   }

   class="kw">public int getBoundingBoxOffsetZ() {
      class="kw">return this.boundingBoxOffsetZ;
   }

   class="kw">public void setCollisionByMaterial(int var1) {
      this.blockMaterialCollisionMask = this.blockMaterialCollisionMask & -16 | var1 & 15;
   }

   class="kw">public int getCollisionByMaterial() {
      class="kw">return this.blockMaterialCollisionMask & 15;
   }

   class="kw">public boolean isCollidingWithDamageBlocks() {
      class="kw">return (this.blockMaterialCollisionMask & 16) != 0;
   }

   class="kw">public boolean setCollideWithDamageBlocks(boolean var1) {
      boolean var2 = this.isCollidingWithDamageBlocks();
      if (var1) {
         this.blockMaterialCollisionMask |= 16;
      } else {
         this.blockMaterialCollisionMask &= -17;
      }

      class="kw">return var2;
   }

   class="kw">public Predicate<CollisionConfig> getBlockCollisionPredicate() {
      class="kw">return this.canCollide;
   }

   class="kw">public void setDefaultCollisionBehaviour() {
      this.setCollisionByMaterial(4);
      this.setCollideWithDamageBlocks(true);
      this.setDefaultBlockCollisionPredicate();
      this.extraBlockCollisionFilter = null;
   }

   class="kw">public void setDefaultBlockCollisionPredicate() {
      this.canCollide = var0 -> (var0.blockMaterialMask & var0.blockMaterialCollisionMask) != 0;
   }

   class="kw">public boolean isCheckTriggerBlocks() {
      class="kw">return this.checkTriggerBlocks;
   }

   class="kw">public void setCheckTriggerBlocks(boolean var1) {
      this.checkTriggerBlocks = var1;
   }

   class="kw">public boolean isCheckDamageBlocks() {
      class="kw">return this.checkDamageBlocks;
   }

   class="kw">public void setCheckDamageBlocks(boolean var1) {
      this.checkDamageBlocks = var1;
   }

   class="kw">public void setWorld(World var1) {
      if (this.world != var1) {
         this.chunkSectionRef = null;
         this.chunkSection = null;
      }

      this.world = var1;
      this.blockId = Integer.MIN_VALUE;
      this.blockX = Integer.MIN_VALUE;
      this.blockY = Integer.MIN_VALUE;
      this.blockZ = Integer.MIN_VALUE;
   }

   class="kw">public boolean canCollide(int var1, int var2, int var3) {
      this.blockX = var1;
      this.blockY = var2;
      this.blockZ = var3;
      this.blockFilteredOut = false;
      int var4 = ChunkUtil.chunkCoordinate(var1);
      int var5 = ChunkUtil.chunkCoordinate(var2);
      int var6 = ChunkUtil.chunkCoordinate(var3);
      if (this.chunkSection == null
         || this.chunkSectionRef == null
         || !this.chunkSectionRef.isValid()
         || this.chunkX != var4
         || this.chunkY != var5
         || this.chunkZ != var6) {
         this.chunkSectionRef = this.world.getChunkStore().getChunkSectionReference(var4, var5, var6);
         this.chunkSection = this.chunkSectionRef != null && this.chunkSectionRef.isValid()
            ? this.chunkSectionRef.getStore().getComponent(this.chunkSectionRef, BlockSection.getComponentType())
            : null;
         this.chunkX = var4;
         this.chunkY = var5;
         this.chunkZ = var6;
      }

      this.blockCanTrigger = false;
      if (this.chunkSection == null) {
         this.blockType = null;
         this.blockMaterial = null;
         this.fluid = null;
         this.fluidId = Integer.MIN_VALUE;
         this.boundingBoxes = BlockBoundingBoxes.UNIT_BOX.get(Rotation.None, Rotation.None, Rotation.None);
         this.blockMaterialMask = 0;
         this.blockCanCollide = true;
         this.blockId = Integer.MIN_VALUE;
         class="kw">return true;
      }

      int var7 = this.chunkSection.get(var1, var2, var3);
      BlockType var8 = BlockType.getAssetMap().getAsset(var7);
      FluidSection var9 = this.chunkSectionRef.getStore().getComponent(this.chunkSectionRef, FluidSection.getComponentType());
      byte var12 = 0;
      int var10;
      Fluid var11;
      if (var9 != null) {
         var10 = var9.getFluidId(this.blockX, this.blockY, this.blockZ);
         var11 = Fluid.getAssetMap().getAsset(var10);
         var12 = var9.getFluidLevel(this.blockX, this.blockY, this.blockZ);
      } else {
         var10 = Integer.MIN_VALUE;
         var11 = null;
      }

      int var13 = this.chunkSection.getFiller(var1, var2, var3);
      if (!var8.isUnknown() && var13 != 0) {
         this.boundingBoxOffsetX = -FillerBlockUtil.unpackX(var13);
         this.boundingBoxOffsetY = -FillerBlockUtil.unpackY(var13);
         this.boundingBoxOffsetZ = -FillerBlockUtil.unpackZ(var13);
      } else {
         this.boundingBoxOffsetX = 0;
         this.boundingBoxOffsetY = 0;
         this.boundingBoxOffsetZ = 0;
      }

      int var14 = this.chunkSection.getRotationIndex(var1, var2, var3);
      if (var7 == this.blockId && this.rotation == var14 && this.fluidId == var10 && this.fluidLevel == var12) {
         this.blockCanTrigger = this.blockCanTriggerPartial || this.checkTriggerBlocks && (var8.isTrigger() || var11.isTrigger());
         class="kw">return this.blockCanCollide || this.blockCanTrigger;
      }

      this.blockId = var7;
      this.blockType = var8;
      this.rotation = var14;
      this.fluidId = var10;
      this.fluid = var11;
      this.fluidLevel = var12;
      boolean var15 = this.checkDamageBlocks && (this.blockType.getDamageToEntities() > 0 || this.fluid.getDamageToEntities() > 0);
      this.blockCanTrigger = var15 || this.checkTriggerBlocks && (this.blockType.isTrigger() || var11.isTrigger());
      this.blockMaterialMask = var15 ? 16 : 0;
      if ((this.blockId == 0 || this.blockType == BlockType.EMPTY) && this.fluidId == 0) {
         this.blockMaterial = BlockMaterial.Empty;
         this.boundingBoxes = BlockBoundingBoxes.UNIT_BOX.get(Rotation.None, Rotation.None, Rotation.None);
         this.blockMaterialMask |= 1;
         this.blockCanCollide = (this.blockMaterialMask & this.blockMaterialCollisionMask) != 0 && this.passesExtraBlockCollisionFilter();
         class="kw">return this.blockCanCollide || this.blockCanTrigger;
      }

      this.blockMaterial = this.blockType.getMaterial();
      this.boundingBoxes = BlockBoundingBoxes.getAssetMap().getAsset(var8.getHitboxTypeIndex()).get(this.rotation);
      if (this.blockMaterial == BlockMaterial.Empty) {
         this.blockMaterialMask = this.blockMaterialMask | (this.fluidId != 0 ? 2 : 1);
         this.blockCanCollide = (this.blockMaterialMask & this.blockMaterialCollisionMask) != 0 && this.passesExtraBlockCollisionFilter();
         class="kw">return this.blockCanCollide || this.blockCanTrigger;
      }

      if (this.boundingBoxes == null) {
         this.boundingBoxes = BlockBoundingBoxes.UNIT_BOX.get(Rotation.None, Rotation.None, Rotation.None);
      }

      this.blockMaterialMask = this.blockMaterialMask | (this.fluidId == 0 ? 4 : 14);
      this.blockCanCollide = this.canCollide.test(this) && this.passesExtraBlockCollisionFilter();
      class="kw">return this.blockCanCollide || this.blockCanTrigger;
   }

   class="kw">private boolean passesExtraBlockCollisionFilter() {
      if (this.extraBlockCollisionFilter == null) {
         class="kw">return true;
      }

      if (this.extraBlockCollisionFilter.test(this)) {
         class="kw">return true;
      }

      this.blockFilteredOut = true;
      class="kw">return false;
   }

   class="kw">public void clear() {
      this.chunkSectionRef = null;
      this.chunkSection = null;
      this.setWorld(null);
      this.dumpInvalidBlocks = false;
      this.dumpNonOverlappingBlocks = false;
      this.extraData1 = null;
      this.extraData2 = null;
      this.extraBlockCollisionFilter = null;
      this.blockFilteredOut = false;
   }
}