TeleportAckTracker class
Пакет: com.hypixel.hytale.server.core.modules.entity.teleport
Файл: com/hypixel/hytale/server/core/modules/entity/teleport/TeleportAckTracker.java
Поля (10)
| Модификаторы | Тип | Имя |
|---|---|---|
|
OK,
INVALID_ID, |
INVALID_POSITION |
final |
double |
MAX_OFFSET_SQUARED |
|
|
return |
|
int |
var2 |
|
Iterator |
var2 |
|
TeleportAckTracker.Entry |
var3 |
|
Vector3d |
var4 |
|
Vector3d |
var5 |
|
double |
var6 |
|
double |
var8 |
Методы (10)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
private |
record |
Entryrecord Entry(int teleportId, @Nonnull Vector3d expectedPosition) |
public |
record |
Resultrecord Result(@Nonnull TeleportAckTracker.Status status,
int expectedTeleportId,
@Nullable Vector3d expectedPosition,
@Nullable Vector3d ackedPosition,
int remainingQueueDepth) |
|
|
Status Status() |
|
public String |
expectedWireIdpublic String expectedWireId() |
static |
double |
halfFloatUlpdouble halfFloatUlp(double var0) |
synchronized |
boolean |
isEmptyboolean isEmpty() |
synchronized |
int |
queueTeleportint queueTeleport(@Nonnull Vector3dc var1) |
synchronized |
void |
rollbackvoid rollback(int var1) |
static |
double |
squareddouble squared(double var0) |
|
public String |
toStringpublic String toString() |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.entity.teleport;
class="kw">import com.hypixel.hytale.protocol.Position;
class="kw">import java.util.ArrayDeque;
class="kw">import java.util.Deque;
class="kw">import java.util.Iterator;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">public class TeleportAckTracker {
class="kw">public class="kw">static class="kw">final double MAX_OFFSET_SQUARED = 0.001;
@Nonnull
class="kw">private class="kw">final Deque<TeleportAckTracker.Entry> pendingTeleports = new ArrayDeque<>();
class="kw">private int nextTeleportId;
class="kw">public TeleportAckTracker() {
}
class="kw">public class="kw">synchronized int queueTeleport(@Nonnull Vector3dc var1) {
int var2 = this.nextTeleportId++;
this.pendingTeleports.addLast(new TeleportAckTracker.Entry(var2, new Vector3d(var1)));
class="kw">return var2;
}
class="kw">public class="kw">synchronized void rollback(int var1) {
Iterator var2 = this.pendingTeleports.descendingIterator();
while (var2.hasNext()) {
if (var2.next().teleportId == var1) {
var2.remove();
class="kw">return;
}
}
}
@Nonnull
class="kw">public class="kw">synchronized TeleportAckTracker.Result validate(int var1, @Nonnull Position var2) {
TeleportAckTracker.Entry var3 = this.pendingTeleports.peekFirst();
if (var3 != null && (var1 & 0xFF) == (var3.teleportId & 0xFF)) {
this.pendingTeleports.removeFirst();
Vector3d var4 = new Vector3d(var2.x, var2.y, var2.z);
Vector3d var5 = var3.expectedPosition;
double var6 = Math.sqrt(squared(halfFloatUlp(var5.x)) + squared(halfFloatUlp(var5.y)) + squared(halfFloatUlp(var5.z)));
double var8 = Math.sqrt(0.001) + var6;
class="kw">return var5.distanceSquared(var4) > var8 * var8
? new TeleportAckTracker.Result(
TeleportAckTracker.Status.INVALID_POSITION, var3.teleportId, var3.expectedPosition, var4, this.pendingTeleports.size()
)
: new TeleportAckTracker.Result(TeleportAckTracker.Status.OK, var3.teleportId, var3.expectedPosition, var4, this.pendingTeleports.size());
} else {
class="kw">return new TeleportAckTracker.Result(
TeleportAckTracker.Status.INVALID_ID,
var3 != null ? var3.teleportId : -1,
var3 != null ? new Vector3d(var3.expectedPosition) : null,
null,
this.pendingTeleports.size()
);
}
}
class="kw">public class="kw">synchronized boolean isEmpty() {
class="kw">return this.pendingTeleports.isEmpty();
}
class="kw">private class="kw">static double halfFloatUlp(double var0) {
class="kw">return Math.scalb(1.0, Math.getExponent(var0) - 24);
}
class="kw">private class="kw">static double squared(double var0) {
class="kw">return var0 * var0;
}
@Override
class="kw">public class="kw">synchronized String toString() {
class="kw">return "TeleportAckTracker{nextTeleportId=" + this.nextTeleportId + ", pending=" + this.pendingTeleports + "}";
}
class="kw">private record Entry(int teleportId, @Nonnull Vector3d expectedPosition) {
class="kw">private Entry {
}
@Override
class="kw">public String toString() {
class="kw">return String.format(
"Entry{teleportId=%d, expectedPosition=(%.1f, %.1f, %.1f)}",
this.teleportId,
this.expectedPosition.x,
this.expectedPosition.y,
this.expectedPosition.z
);
}
}
class="kw">public record Result(
@Nonnull TeleportAckTracker.Status status,
int expectedTeleportId,
@Nullable Vector3d expectedPosition,
@Nullable Vector3d ackedPosition,
int remainingQueueDepth
) {
class="kw">public Result {
}
@Nonnull
class="kw">public String expectedWireId() {
class="kw">return this.expectedTeleportId >= 0 ? String.valueOf(this.expectedTeleportId & 0xFF) : "none";
}
}
class="kw">public enum Status {
OK,
INVALID_ID,
INVALID_POSITION;
Status() {
}
}
}