Offset enum
Пакет: com.hypixel.hytale.server.npc.corecomponents.world
Файл: com/hypixel/hytale/server/npc/corecomponents/world/SensorCanPlace.java
implements: Supplier<String>
Поля (1)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final Vector3dc |
offset |
Методы (3)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
|
FootPosition FootPosition(Vector3dUtil.DOWN) |
|
public Vector3d |
applypublic Vector3d apply(@Nonnull Vector3d var1) |
|
public String |
getpublic String get() |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.corecomponents.world;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
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.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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 com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.SensorBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorCanPlace;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.CachedPositionProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.util.BlockPlacementHelper;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">public class SensorCanPlace class="kw">extends SensorBase {
class="kw">protected class="kw">static class="kw">final ComponentType<EntityStore, BoundingBox> BOUNDING_BOX_COMPONENT_TYPE = BoundingBox.getComponentType();
class="kw">protected class="kw">final SensorCanPlace.Direction direction;
class="kw">protected class="kw">final SensorCanPlace.Offset offset;
class="kw">protected class="kw">final double retryDelay;
class="kw">protected class="kw">final boolean allowEmptyMaterials;
class="kw">protected class="kw">final Vector3d transform = new Vector3d();
class="kw">protected class="kw">final CachedPositionProvider positionProvider = new CachedPositionProvider();
class="kw">protected class="kw">final Vector3d cachedPosition = new Vector3d();
class="kw">protected boolean cachedResult;
class="kw">protected double delay;
class="kw">public SensorCanPlace(@Nonnull BuilderSensorCanPlace var1, @Nonnull BuilderSupport var2) {
super(var1);
this.direction = var1.getDirection(var2);
this.offset = var1.getOffset(var2);
this.retryDelay = var1.getRetryDelay(var2);
this.allowEmptyMaterials = var1.isAllowEmptyMaterials(var2);
}
@Override
class="kw">public boolean matches(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, double var3, @Nonnull Store<EntityStore> var5) {
if (super.matches(var1, var2, var3, var5) && var2.getWorldSupport().getBlockToPlace() != null) {
BlockType var6 = BlockType.getAssetMap().getAsset(var2.getWorldSupport().getBlockToPlace());
if (var6 == null) {
this.positionProvider.clear();
class="kw">return false;
}
TransformComponent var7 = var5.getComponent(var1, TransformComponent.getComponentType());
assert var7 != null;
World var8 = var5.getExternalData().getWorld();
float var9 = var7.getRotation().yaw();
float var10 = (float) (Math.PI / 4);
var9 = Math.round(var9 / var10) * var10;
this.direction.apply(this.transform, var9);
BoundingBox var11 = var5.getComponent(var1, BOUNDING_BOX_COMPONENT_TYPE);
if (var11 != null) {
Box var12 = var11.getBoundingBox();
Box var13 = BlockBoundingBoxes.getAssetMap().getAsset(var6.getHitboxTypeIndex()).get(0).getBoundingBox();
boolean var14 = this.transform.x < 0.0;
boolean var15 = this.transform.z < 0.0;
boolean var16 = this.transform.x - 1.0E-5 > 0.0;
boolean var17 = this.transform.z - 1.0E-5 > 0.0;
double var18 = var14 ? var12.min.x : var12.max.x;
double var20 = var15 ? var12.min.z : var12.max.z;
double var22 = var14 ? var13.max.x : var13.min.x;
double var24 = var15 ? var13.max.z : var13.min.z;
double var26 = var14 ? -this.transform.x : this.transform.x;
double var28 = var15 ? -this.transform.z : this.transform.z;
double var30 = Math.sqrt(var18 * var18 * var26 + var20 * var20 * var28) + Math.sqrt(var22 * var22 * var26 + var24 * var24 * var28);
this.transform.normalize(var30);
this.transform.add(var16 ? 1.0 : 0.0, 0.0, var17 ? 1.0 : 0.0);
}
this.offset.apply(this.transform);
Vector3d var33 = var7.getPosition();
this.transform.add(var33.x(), var33.y(), var33.z()).floor();
int var34 = (int)this.transform.x();
int var35 = (int)this.transform.y();
int var36 = (int)this.transform.z();
if (!this.cachedPosition.equals(this.transform)) {
this.delay = 0.0;
}
boolean var37 = BlockPlacementHelper.canPlaceUnitBlock(var8, var6, this.allowEmptyMaterials, var34, var35, var36);
if (var37 != this.cachedResult) {
this.delay = 0.0;
}
if (!((this.delay -= var3) > 0.0)) {
this.cachedResult = var37 && BlockPlacementHelper.canPlaceBlock(var8, var6, 0, this.allowEmptyMaterials, var34, var35, var36);
this.cachedPosition.set(this.transform);
this.delay = this.retryDelay;
if (!this.cachedResult) {
this.positionProvider.clear();
class="kw">return false;
} else {
this.positionProvider.setIsFromCache(false);
this.positionProvider.setTarget(this.transform);
class="kw">return true;
}
} else if (this.cachedResult) {
this.positionProvider.setIsFromCache(true);
this.positionProvider.setTarget(this.transform);
class="kw">return true;
} else {
this.positionProvider.clear();
class="kw">return false;
}
} else {
this.positionProvider.clear();
class="kw">return false;
}
}
@Override
class="kw">public void clearOnce() {
super.clearOnce();
this.delay = 0.0;
}
@Override
class="kw">public InfoProvider getSensorInfo() {
class="kw">return this.positionProvider;
}
class="kw">public enum Direction class="kw">implements Supplier<String> {
Forward(Vector3dUtil.FORWARD),
Backward(Vector3dUtil.BACKWARD),
Left(Vector3dUtil.LEFT),
Right(Vector3dUtil.RIGHT);
class="kw">private class="kw">final Vector3dc direction;
Direction(Vector3dc nullxx) {
this.direction = nullxx;
}
@Nonnull
class="kw">public Vector3d apply(@Nonnull Vector3d var1, float var2) {
class="kw">return var1.set(this.direction).rotateY(var2);
}
@Nonnull
class="kw">public String get() {
class="kw">return this.name();
}
}
class="kw">public enum Offset class="kw">implements Supplier<String> {
HeadPosition(Vector3dUtil.UP),
BodyPosition(Vector3dUtil.ZERO),
FootPosition(Vector3dUtil.DOWN);
class="kw">private class="kw">final Vector3dc offset;
Offset(Vector3dc nullxx) {
this.offset = nullxx;
}
@Nonnull
class="kw">public Vector3d apply(@Nonnull Vector3d var1) {
class="kw">return var1.add(this.offset);
}
@Nonnull
class="kw">public String get() {
class="kw">return this.name();
}
}
}