TriggerVolumePrefabContributor class

Пакет: com.hypixel.hytale.builtin.triggervolumes.prefab

Файл: com/hypixel/hytale/builtin/triggervolumes/prefab/TriggerVolumePrefabContributor.java

implements: PrefabSaveContributor

Поля (44)

МодификаторыТипИмя
final HytaleLogger LOGGER
PrefabEditSession var1
Collection var10
boolean var10
var10
HashMap var11
double var11
HashSet var12
int var13
Vector3i var13
double var13
Vector3i var14
double var15
double var15
Vector3d var16
Holder var17
double var17
TriggerVolume var18
String var19
double var19
Map var2
String var20
GroupEntry var21
double var21
Vector3d var22
Holder var23
double var23
double var25
double var3
TriggerVolumesPlugin var5
Vector3d var5
double var5
Store var6
double var6
var6
TriggerVolumeManager var7
double var7
ComponentType var8
Vector3i var8
var8
ComponentType var9
Vector3i var9
var9
double var9

Методы (11)

МодификаторыВозвратСигнатура
private boolean aabbOverlapsboolean aabbOverlaps(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3i var3, @Nonnull Vector3i var4)
for for(PrefabEditingMetadata var12 : var4)
if if(var7 != null)
if if(var21 != null)
if if(var8 != null)
if if(var15 < var6)
if if(var10)
if if(var3 >= var9 && var3 <= var15 && var5 >= var11 && var5 <= var17 && var7 >= var13 && var7 <= var19)
if if(var1 == null)
private boolean isClosestPrefabboolean isClosestPrefab(@Nonnull VolumeEntry var1, @Nonnull Vector3i var2, @Nonnull Vector3i var3, @Nonnull Collection<PrefabEditingMetadata> var4)
static double pointToBoxSurfaceDistancedouble pointToBoxSurfaceDistance(@Nonnull Vector3d var0, @Nonnull Vector3i var1, @Nonnull Vector3i var2)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.prefab;

class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSession;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditingMetadata;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.PrefabSaveContributor;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.TriggerVolumesPlugin;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.component.TriggerVolume;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.component.TriggerVolumeGroup;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.GroupEntry;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.TriggerVolumeManager;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.VolumeEntry;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.Collection;
class="kw">import java.util.HashMap;
class="kw">import java.util.HashSet;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.logging.Level;
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 TriggerVolumePrefabContributor class="kw">implements PrefabSaveContributor {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">final Vector3d tempMin = new Vector3d();
   class="kw">private class="kw">final Vector3d tempMax = new Vector3d();

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

   @Override
   class="kw">public void contribute(@Nonnull BlockSelection var1, @Nonnull World var2, @Nonnull Vector3i var3, @Nonnull Vector3i var4) {
      TriggerVolumesPlugin var5 = TriggerVolumesPlugin.get();
      Store var6 = var2.getEntityStore().getStore();
      TriggerVolumeManager var7 = var6.getResource(var5.getManagerResourceType());
      if (var7 != null) {
         ComponentType var8 = var5.getTriggerVolumeComponentType();
         ComponentType var9 = var5.getTriggerVolumeGroupComponentType();
         Collection var10 = getAllPrefabMetadata(var6);
         HashMap var11 = new HashMap<>();
         HashSet var12 = new HashSet<>();
         int var13 = 0;

         for (VolumeEntry var15 : var7.getVolumes()) {
            var15.getShape().getWorldAABB(var15.getPosition(), this.tempMin, this.tempMax);
            if (this.aabbOverlaps(this.tempMin, this.tempMax, var3, var4)
               && (var10 == null || var10.size() <= 1 || this.isClosestPrefab(var15, var3, var4, var10))) {
               Vector3d var16 = new Vector3d(var15.getPosition());
               var16.sub(var1.getX(), var1.getY(), var1.getZ());
               Holder var17 = EntityStore.REGISTRY.newHolder();
               var17.addComponent(TransformComponent.getComponentType(), new TransformComponent(var16, Rotation3f.IDENTITY));
               TriggerVolume var18 = TriggerVolume.fromVolumeEntry(var15);
               var18.setPrefabIndex(var13++);
               if (var15.getGroupId() != null) {
                  String var19 = var15.getGroupId();
                  String var20 = var11.computeIfAbsent(var19, var0 -> UUID.randomUUID().toString());
                  var18.setGroupLinkId(var20);
                  if (var12.add(var19)) {
                     GroupEntry var21 = var7.getGroup(var19);
                     if (var21 != null) {
                        Vector3d var22 = new Vector3d(var21.getOrigin());
                        var22.sub(var1.getX(), var1.getY(), var1.getZ());
                        Holder var23 = EntityStore.REGISTRY.newHolder();
                        var23.addComponent(TransformComponent.getComponentType(), new TransformComponent(var22, Rotation3f.IDENTITY));
                        var23.addComponent(var9, TriggerVolumeGroup.fromGroupEntry(var20, var21));
                        var1.addEntityHolderRaw(var23);
                     }
                  }
               }

               var17.addComponent(var8, var18);
               var1.addEntityHolderRaw(var17);
            }
         }
      }
   }

   class="kw">private boolean aabbOverlaps(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3i var3, @Nonnull Vector3i var4) {
      class="kw">return var2.x > var3.x && var1.x < var4.x + 1 && var2.y > var3.y && var1.y < var4.y + 1 && var2.z > var3.z && var1.z < var4.z + 1;
   }

   class="kw">private boolean isClosestPrefab(@Nonnull VolumeEntry var1, @Nonnull Vector3i var2, @Nonnull Vector3i var3, @Nonnull Collection<PrefabEditingMetadata> var4) {
      Vector3d var5 = var1.getPosition();
      var1.getShape().getWorldAABB(var5, this.tempMin, this.tempMax);
      double var6 = Double.MAX_VALUE;
      Vector3i var8 = null;
      Vector3i var9 = null;
      boolean var10 = false;

      for (PrefabEditingMetadata var12 : var4) {
         Vector3i var13 = var12.getMinPoint();
         Vector3i var14 = var12.getMaxPoint();
         if (this.aabbOverlaps(this.tempMin, this.tempMax, var13, var14)) {
            if (var8 != null) {
               var10 = true;
            }

            double var15 = pointToBoxSurfaceDistance(var5, var13, var14);
            if (var15 < var6) {
               var6 = var15;
               var8 = var13;
               var9 = var14;
            }
         }
      }

      if (var10) {
         LOGGER.at(Level.WARNING).log("Trigger volume '%s' overlaps multiple prefab bounds; assigning to closest", var1.getId());
      }

      class="kw">return var8 != null && var8.equals(var2) && var9 != null && var9.equals(var3);
   }

   class="kw">private class="kw">static double pointToBoxSurfaceDistance(@Nonnull Vector3d var0, @Nonnull Vector3i var1, @Nonnull Vector3i var2) {
      double var3 = var0.x();
      double var5 = var0.y();
      double var7 = var0.z();
      double var9 = var1.x;
      double var11 = var1.y;
      double var13 = var1.z;
      double var15 = var2.x + 1;
      double var17 = var2.y + 1;
      double var19 = var2.z + 1;
      if (var3 >= var9 && var3 <= var15 && var5 >= var11 && var5 <= var17 && var7 >= var13 && var7 <= var19) {
         class="kw">return Math.min(Math.min(var3 - var9, var15 - var3), Math.min(Math.min(var5 - var11, var17 - var5), Math.min(var7 - var13, var19 - var7)));
      }

      double var21 = Math.max(var9 - var3, Math.max(0.0, var3 - var15));
      double var23 = Math.max(var11 - var5, Math.max(0.0, var5 - var17));
      double var25 = Math.max(var13 - var7, Math.max(0.0, var7 - var19));
      class="kw">return Math.sqrt(var21 * var21 + var23 * var23 + var25 * var25);
   }

   @Nullable
   class="kw">private class="kw">static Collection<PrefabEditingMetadata> getAllPrefabMetadata(@Nonnull Store<EntityStore> var0) {
      PrefabEditSession var1 = var0.getResource(PrefabEditSession.getResourceType());
      if (var1 == null) {
         class="kw">return null;
      }

      Map var2 = var1.getLoadedPrefabMetadata();
      class="kw">return var2.isEmpty() ? null : var2.values();
   }
}