SensorSearchRay class
Пакет: com.hypixel.hytale.server.npc.corecomponents.world
Файл: com/hypixel/hytale/server/npc/corecomponents/world/SensorSearchRay.java
extends: SensorBase
Поля (15)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
id |
|
Vector3d |
var10 |
|
ChunkStore |
var11 |
|
long |
var12 |
|
Vector3d |
var13 |
|
Ref |
var14 |
|
BlockChunk |
var15 |
|
BlockSection |
var16 |
|
RayBlockHitTest |
var17 |
|
boolean |
var18 |
|
double |
var3 |
|
TransformComponent |
var6 |
|
HeadRotation |
var7 |
|
Vector3d |
var8 |
|
Rotation3f |
var9 |
Методы (3)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
if if(var15 != null) |
|
|
if if(var18) |
abstract |
|
super super(var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.corecomponents.world;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
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.BuilderSensorSearchRay;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.PositionProvider;
class="kw">import com.hypixel.hytale.server.npc.util.RayBlockHitTest;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">public class SensorSearchRay class="kw">extends SensorBase {
class="kw">protected class="kw">final int id;
class="kw">protected class="kw">final float angle;
class="kw">protected class="kw">final double range;
class="kw">protected class="kw">final int blockSet;
class="kw">protected class="kw">final float minRetestAngle;
class="kw">protected class="kw">final double minRetestMoveSquared;
class="kw">protected class="kw">final double throttleTime;
class="kw">protected class="kw">final PositionProvider positionProvider = new PositionProvider();
class="kw">protected class="kw">final Vector3d lastCheckedPosition = new Vector3d(Vector3dUtil.MIN);
class="kw">protected float lastCheckedYaw = Float.MAX_VALUE;
class="kw">protected short lastBlockRevision;
class="kw">protected double throttleTimeRemaining;
class="kw">public SensorSearchRay(@Nonnull BuilderSensorSearchRay var1, @Nonnull BuilderSupport var2) {
super(var1);
this.id = var1.getId(var2);
this.angle = -var1.getAngle(var2);
this.range = var1.getRange(var2);
this.blockSet = var1.getBlockSet(var2);
this.minRetestAngle = var1.getMinRetestAngle(var2);
double var3 = var1.getMinRetestMove(var2);
this.minRetestMoveSquared = var3 * var3;
this.throttleTime = var1.getThrottleTime(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)) {
this.positionProvider.clear();
class="kw">return false;
}
TransformComponent var6 = var5.getComponent(var1, TransformComponent.getComponentType());
assert var6 != null;
HeadRotation var7 = var5.getComponent(var1, HeadRotation.getComponentType());
assert var7 != null;
Vector3d var8 = var6.getPosition();
Rotation3f var9 = var7.getRotation();
Vector3d var10 = var2.getWorldSupport().getCachedSearchRayPosition(this.id);
if (!var10.equals(Vector3dUtil.MIN)) {
ChunkStore var11 = var5.getExternalData().getWorld().getChunkStore();
long var12 = ChunkUtil.indexChunkFromBlock(var10.x, var10.z);
Ref var14 = var11.getChunkReference(var12);
BlockChunk var15 = var14 != null && var14.isValid() ? var11.getStore().getComponent(var14, BlockChunk.getComponentType()) : null;
if (var15 != null) {
BlockSection var16 = var15.getSectionAtBlockY(MathUtil.floor(var10.y));
if (var16.getLocalChangeCounter() == this.lastBlockRevision) {
this.positionProvider.setTarget(var10);
class="kw">return true;
}
var10.set(Vector3dUtil.MIN);
this.positionProvider.clear();
}
} else if ((this.throttleTimeRemaining -= var3) > 0.0
&& Math.abs(var9.yaw() - this.lastCheckedYaw) <= this.minRetestAngle
&& var8.distanceSquared(this.lastCheckedPosition) <= this.minRetestMoveSquared) {
this.positionProvider.clear();
class="kw">return false;
}
RayBlockHitTest var17 = RayBlockHitTest.THREAD_LOCAL.get();
if (!var17.init(var1, this.blockSet, this.angle, var5)) {
var10.set(Vector3dUtil.MIN);
this.positionProvider.clear();
var17.clear();
class="kw">return false;
}
this.lastCheckedPosition.set(var8);
this.lastCheckedYaw = var9.yaw();
this.throttleTimeRemaining = this.throttleTime;
boolean var18 = var17.run(this.range);
if (var18) {
this.lastBlockRevision = var17.getLastBlockRevision();
Vector3d var13 = var17.getHitPosition();
var10.set(var13.x + 0.5, var13.y + 0.5, var13.z + 0.5);
this.positionProvider.setTarget(var10);
} else {
var10.set(Vector3dUtil.MIN);
this.positionProvider.clear();
}
var17.clear();
class="kw">return var18;
}
@Override
class="kw">public InfoProvider getSensorInfo() {
class="kw">return this.positionProvider;
}
}