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