RotatedVariantBoxes class
Пакет: com.hypixel.hytale.server.core.asset.type.blockhitbox
Файл: com/hypixel/hytale/server/core/asset/type/blockhitbox/BlockBoundingBoxes.java
Поля (5)
| Модификаторы | Тип | Имя |
|---|---|---|
|
return this.detailBoxes.length > |
1 |
|
protected Box |
boundingBox |
|
protected Box[] |
detailBoxes |
|
|
var1 |
|
Box |
var2 |
Методы (8)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public boolean |
containsPositionpublic boolean containsPosition(double var1, double var3, double var5) |
|
|
for for(int var3 = 0; var3 < var1.length; var3++) |
|
|
for for(Box var10 : this.detailBoxes) |
|
public Box |
getBoundingBoxpublic Box getBoundingBox() |
|
public Box[] |
getDetailBoxespublic Box[] getDetailBoxes() |
|
public boolean |
hasDetailBoxespublic boolean hasDetailBoxes() |
|
|
if if(var1 == null || var1.length == 0) |
|
|
if if(var1.length == 1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.asset.type.blockhitbox;
class="kw">import com.hypixel.hytale.assetstore.AssetExtraInfo;
class="kw">import com.hypixel.hytale.assetstore.AssetKeyValidator;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetBuilderCodec;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.validation.ValidatorCache;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.protocol.Hitbox;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.io.NetworkSerializable;
class="kw">import com.hypixel.hytale.server.core.io.NetworkSerializers;
class="kw">import java.util.Arrays;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class BlockBoundingBoxes class="kw">implements JsonAssetWithMap<String, IndexedLookupTableAssetMap<String, BlockBoundingBoxes>>, NetworkSerializable<Hitbox[]> {
class="kw">private class="kw">static class="kw">final int ROTATIONS = Rotation.VALUES.length * Rotation.VALUES.length * Rotation.VALUES.length;
class="kw">public class="kw">static class="kw">final int DEFAULT_ID = 0;
class="kw">public class="kw">static class="kw">final String DEFAULT = "Full";
class="kw">public class="kw">static class="kw">final BlockBoundingBoxes UNIT_BOX = new BlockBoundingBoxes("Full", 0.0, 1.0);
class="kw">public class="kw">static class="kw">final double UNIT_BOX_MAXIMUM_EXTENT;
class="kw">public class="kw">static class="kw">final AssetBuilderCodec<String, BlockBoundingBoxes> CODEC = AssetBuilderCodec.builder(
BlockBoundingBoxes.class,
BlockBoundingBoxes::new,
Codec.STRING,
(var0, var1) -> var0.id = var1,
var0 -> var0.id,
(var0, var1) -> var0.data = var1,
var0 -> var0.data
)
.appendInherited(
new KeyedCodec<>("Boxes", new ArrayCodec<>(Box.CODEC, Box[]::new), true),
(var0, var1) -> var0.baseDetailBoxes = var1,
var0 -> var0.baseDetailBoxes,
(var0, var1) -> var0.baseDetailBoxes = var1.baseDetailBoxes
)
.addValidator(Validators.nonEmptyArray())
.add()
.afterDecode(BlockBoundingBoxes::processConfig)
.build();
class="kw">public class="kw">static class="kw">final ValidatorCache<String> VALIDATOR_CACHE = new ValidatorCache<>(new AssetKeyValidator<>(BlockBoundingBoxes::getAssetStore));
class="kw">public class="kw">static class="kw">final Hitbox[] EMPTY_HITBOXES = new Hitbox[0];
class="kw">private class="kw">static AssetStore<String, BlockBoundingBoxes, IndexedLookupTableAssetMap<String, BlockBoundingBoxes>> ASSET_STORE;
class="kw">protected AssetExtraInfo.Data data;
class="kw">protected String id;
class="kw">protected Box[] baseDetailBoxes;
@Nonnull
class="kw">private class="kw">final class="kw">transient BlockBoundingBoxes.RotatedVariantBoxes[] variants = new BlockBoundingBoxes.RotatedVariantBoxes[ROTATIONS];
class="kw">protected class="kw">transient boolean protrudesUnitBox;
class="kw">public class="kw">static AssetStore<String, BlockBoundingBoxes, IndexedLookupTableAssetMap<String, BlockBoundingBoxes>> getAssetStore() {
if (ASSET_STORE == null) {
ASSET_STORE = AssetRegistry.getAssetStore(BlockBoundingBoxes.class);
}
class="kw">return ASSET_STORE;
}
class="kw">public class="kw">static IndexedLookupTableAssetMap<String, BlockBoundingBoxes> getAssetMap() {
class="kw">return (IndexedLookupTableAssetMap<String, BlockBoundingBoxes>)getAssetStore().getAssetMap();
}
class="kw">public BlockBoundingBoxes() {
}
class="kw">public BlockBoundingBoxes(String var1, double var2, double var4) {
this.id = var1;
this.baseDetailBoxes = new Box[]{new Box().setMinMax(var2, var4)};
this.processConfig();
}
class="kw">public String getId() {
class="kw">return this.id;
}
class="kw">public boolean protrudesUnitBox() {
class="kw">return this.protrudesUnitBox;
}
class="kw">protected void processConfig() {
if (this.baseDetailBoxes != null) {
this.protrudesUnitBox = false;
for (RotationTuple var4 : RotationTuple.VALUES) {
Rotation var5 = var4.yaw();
Rotation var6 = var4.pitch();
Rotation var7 = var4.roll();
BlockBoundingBoxes.RotatedVariantBoxes var8 = getRotated(this, var5, var6, var7);
this.variants[RotationTuple.index(var5, var6, var7)] = var8;
this.protrudesUnitBox = this.protrudesUnitBox
| (
var8.boundingBox.min.x < 0.0
|| var8.boundingBox.max.x > 1.0
|| var8.boundingBox.min.y < 0.0
|| var8.boundingBox.max.y > 1.0
|| var8.boundingBox.min.z < 0.0
|| var8.boundingBox.max.z > 1.0
);
}
}
}
class="kw">public BlockBoundingBoxes.RotatedVariantBoxes get(@Nonnull Rotation var1, @Nonnull Rotation var2, @Nonnull Rotation var3) {
class="kw">return this.variants[RotationTuple.index(var1, var2, var3)];
}
class="kw">public BlockBoundingBoxes.RotatedVariantBoxes get(int var1) {
class="kw">return this.variants[var1];
}
class="kw">public Hitbox[] toPacket() {
if (this.baseDetailBoxes == null) {
class="kw">return EMPTY_HITBOXES;
}
Hitbox[] var1 = new Hitbox[this.baseDetailBoxes.length];
for (int var2 = 0; var2 < this.baseDetailBoxes.length; var2++) {
var1[var2] = NetworkSerializers.BOX.toPacket(this.baseDetailBoxes[var2]);
}
class="kw">return var1;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "BlockBoundingBoxes{data="
+ this.data
+ ", id='"
+ this.id
+ "', baseDetailBoxes="
+ Arrays.toString(this.baseDetailBoxes)
+ ", variants="
+ Arrays.toString(this.variants)
+ ", protrudesUnitBox="
+ this.protrudesUnitBox
+ "}";
}
@Nonnull
class="kw">public class="kw">static BlockBoundingBoxes getUnitBoxFor(String var0) {
class="kw">return new BlockBoundingBoxes(var0, 0.0, 1.0);
}
@Nonnull
class="kw">private class="kw">static BlockBoundingBoxes.RotatedVariantBoxes getRotated(
@Nonnull BlockBoundingBoxes var0, @Nonnull Rotation var1, @Nonnull Rotation var2, @Nonnull Rotation var3
) {
Box[] var4 = var0.baseDetailBoxes;
Box[] var5 = new Box[var4.length];
for (int var6 = 0; var6 < var4.length; var6++) {
var5[var6] = rotate(new Box(var4[var6]), var1, var2, var3);
}
class="kw">return new BlockBoundingBoxes.RotatedVariantBoxes(var5);
}
@Nonnull
class="kw">protected class="kw">static Box rotate(@Nonnull Box var0, @Nonnull Rotation var1, @Nonnull Rotation var2, @Nonnull Rotation var3) {
class="kw">switch (var3) {
case None:
class="kw">default:
break;
case Ninety:
rotate270Z(var0);
break;
case OneEighty:
rotate180Z(var0);
break;
case TwoSeventy:
rotate90Z(var0);
}
class="kw">switch (var2) {
case None:
class="kw">default:
break;
case Ninety:
rotate90X(var0);
break;
case OneEighty:
rotate180X(var0);
break;
case TwoSeventy:
rotate270X(var0);
}
class="kw">switch (var1) {
case None:
class="kw">default:
break;
case Ninety:
rotate90Y(var0);
break;
case OneEighty:
rotate180Y(var0);
break;
case TwoSeventy:
rotate270Y(var0);
}
var0.normalize();
class="kw">return var0;
}
class="kw">private class="kw">static void rotate90X(@Nonnull Box var0) {
double var1 = var0.min.z;
var0.min.z = var0.min.y;
var0.min.y = 1.0 - var1;
var1 = var0.max.z;
var0.max.z = var0.max.y;
var0.max.y = 1.0 - var1;
}
class="kw">private class="kw">static void rotate180X(@Nonnull Box var0) {
var0.min.z = 1.0 - var0.min.z;
var0.min.y = 1.0 - var0.min.y;
var0.max.z = 1.0 - var0.max.z;
var0.max.y = 1.0 - var0.max.y;
}
class="kw">private class="kw">static void rotate270X(@Nonnull Box var0) {
double var1 = var0.min.z;
var0.min.z = 1.0 - var0.min.y;
var0.min.y = var1;
var1 = var0.max.z;
var0.max.z = 1.0 - var0.max.y;
var0.max.y = var1;
}
class="kw">private class="kw">static void rotate90Y(@Nonnull Box var0) {
double var1 = var0.min.x;
var0.min.x = var0.min.z;
var0.min.z = 1.0 - var1;
var1 = var0.max.x;
var0.max.x = var0.max.z;
var0.max.z = 1.0 - var1;
}
class="kw">private class="kw">static void rotate180Y(@Nonnull Box var0) {
var0.min.x = 1.0 - var0.min.x;
var0.min.z = 1.0 - var0.min.z;
var0.max.x = 1.0 - var0.max.x;
var0.max.z = 1.0 - var0.max.z;
}
class="kw">private class="kw">static void rotate270Y(@Nonnull Box var0) {
double var1 = var0.min.x;
var0.min.x = 1.0 - var0.min.z;
var0.min.z = var1;
var1 = var0.max.x;
var0.max.x = 1.0 - var0.max.z;
var0.max.z = var1;
}
class="kw">private class="kw">static void rotate90Z(@Nonnull Box var0) {
double var1 = var0.min.x;
var0.min.x = var0.min.y;
var0.min.y = 1.0 - var1;
var1 = var0.max.x;
var0.max.x = var0.max.y;
var0.max.y = 1.0 - var1;
}
class="kw">private class="kw">static void rotate180Z(@Nonnull Box var0) {
var0.min.x = 1.0 - var0.min.x;
var0.min.y = 1.0 - var0.min.y;
var0.max.x = 1.0 - var0.max.x;
var0.max.y = 1.0 - var0.max.y;
}
class="kw">private class="kw">static void rotate270Z(@Nonnull Box var0) {
double var1 = var0.min.x;
var0.min.x = 1.0 - var0.min.y;
var0.min.y = var1;
var1 = var0.max.x;
var0.max.x = 1.0 - var0.max.y;
var0.max.y = var1;
}
class="kw">static {
UNIT_BOX_MAXIMUM_EXTENT = UNIT_BOX.variants[0].getBoundingBox().getMaximumExtent();
}
class="kw">public class="kw">static class RotatedVariantBoxes {
class="kw">protected Box boundingBox;
class="kw">protected Box[] detailBoxes;
class="kw">public RotatedVariantBoxes(@Nullable Box[] var1) {
if (var1 == null || var1.length == 0) {
var1 = new Box[]{new Box().setMinMax(0.0, 1.0)};
}
if (var1.length == 1) {
this.boundingBox = var1[0];
} else {
Box var2 = this.boundingBox = new Box();
for (int var3 = 0; var3 < var1.length; var3++) {
var2.union(var1[var3]);
}
}
this.detailBoxes = var1;
}
@Nonnull
class="kw">public Box getBoundingBox() {
class="kw">return this.boundingBox;
}
@Nonnull
class="kw">public Box[] getDetailBoxes() {
class="kw">return this.detailBoxes;
}
class="kw">public boolean hasDetailBoxes() {
class="kw">return this.detailBoxes.length > 1;
}
class="kw">public boolean containsPosition(double var1, double var3, double var5) {
if (this.hasDetailBoxes()) {
for (Box var10 : this.detailBoxes) {
if (var10.containsPosition(var1, var3, var5)) {
class="kw">return true;
}
}
class="kw">return false;
} else {
class="kw">return this.boundingBox.containsPosition(var1, var3, var5);
}
}
}
}