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