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