MapMarkerTracker class
Пакет: com.hypixel.hytale.server.core.universe.world.worldmap.markers
Файл: com/hypixel/hytale/server/core/universe/world/worldmap/markers/MapMarkerTracker.java
Поля (12)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
HytaleLogger |
LOGGER |
|
MapMarker[] |
var13 |
|
String[] |
var15 |
|
MapMarker |
var2 |
|
double |
var3 |
|
Position |
var5 |
|
WorldMapManager |
var6 |
|
Position |
var6 |
|
Map |
var7 |
|
double |
var7 |
|
Map |
var8 |
|
MarkersCollectorImpl |
var9 |
Методы (13)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
void |
copyFromvoid copyFrom(@Nonnull MapMarkerTracker var1) |
private |
boolean |
doesMarkerNeedNetworkUpdateboolean doesMarkerNeedNetworkUpdate(@Nullable MapMarker var1, MapMarker var2) |
|
|
for for(String var14 : this.tempToRemove) |
public |
Player |
getPlayerPlayer getPlayer() |
public |
Predicate<PlayerRef> |
getPlayerMapFilterPredicate<PlayerRef> getPlayerMapFilter() |
public |
Map<String, MapMarker> |
getSentMarkersMap<String, MapMarker> getSentMarkers() |
|
|
if if(var1.transform != null && var1.transform.position != null) |
|
|
if if(var1 == null) |
private |
boolean |
isSendingSmallMovementsboolean isSendingSmallMovements() |
private |
void |
resetSmallMovementTimervoid resetSmallMovementTimer() |
public |
void |
sendMapMarkervoid sendMapMarker(MapMarker var1) |
public |
void |
setPlayerMapFiltervoid setPlayerMapFilter(Predicate<PlayerRef> var1) |
public |
void |
updatePointsOfInterestvoid updatePointsOfInterest(float var1, @Nonnull World var2, int var3, int var4, int var5) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.worldmap.markers;
class="kw">import com.google.common.flogger.StackSize;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.Position;
class="kw">import com.hypixel.hytale.protocol.packets.worldmap.MapMarker;
class="kw">import com.hypixel.hytale.protocol.packets.worldmap.UpdateWorldMap;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldMapTracker;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.WorldMapManager;
class="kw">import java.util.HashSet;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.function.Predicate;
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">public class MapMarkerTracker {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">final WorldMapTracker worldMapTracker;
class="kw">private class="kw">final Player player;
class="kw">private class="kw">final Map<String, MapMarker> sentToClientById = new ConcurrentHashMap<>();
class="kw">public class="kw">static class="kw">final float SMALL_MOVEMENTS_UPDATE_INTERVAL = 10.0F;
class="kw">private float smallMovementsTimer;
class="kw">private Predicate<PlayerRef> playerMapFilter;
@Nonnull
class="kw">private class="kw">final Set<String> tempToRemove = new HashSet<>();
@Nonnull
class="kw">private class="kw">final Set<MapMarker> tempToAdd = new HashSet<>();
@Nonnull
class="kw">private class="kw">final Set<String> tempTestedMarkers = new HashSet<>();
class="kw">public MapMarkerTracker(WorldMapTracker var1) {
this.worldMapTracker = var1;
this.player = var1.getPlayer();
}
class="kw">public Player getPlayer() {
class="kw">return this.player;
}
class="kw">public Map<String, MapMarker> getSentMarkers() {
class="kw">return this.sentToClientById;
}
class="kw">public Predicate<PlayerRef> getPlayerMapFilter() {
class="kw">return this.playerMapFilter;
}
class="kw">public void setPlayerMapFilter(Predicate<PlayerRef> var1) {
this.playerMapFilter = var1;
}
class="kw">private boolean isSendingSmallMovements() {
class="kw">return this.smallMovementsTimer <= 0.0F;
}
class="kw">private void resetSmallMovementTimer() {
this.smallMovementsTimer = 10.0F;
}
class="kw">public void updatePointsOfInterest(float var1, @Nonnull World var2, int var3, int var4, int var5) {
if (this.worldMapTracker.getTransformComponent() != null) {
this.smallMovementsTimer -= var1;
WorldMapManager var6 = var2.getWorldMapManager();
Map var7 = var6.getMarkerProviders();
this.tempToAdd.clear();
this.tempTestedMarkers.clear();
Map var8 = var6.getMarkerOverridesView();
MarkersCollectorImpl var9 = new MarkersCollectorImpl(this, var3, var4, var5, var8);
for (WorldMapManager.MarkerProvider var11 : var7.values()) {
var11.update(var2, this.player, var9);
}
if (this.isSendingSmallMovements()) {
this.resetSmallMovementTimer();
}
this.tempToRemove.clear();
this.tempToRemove.addAll(this.sentToClientById.keySet());
if (!this.tempTestedMarkers.isEmpty()) {
this.tempToRemove.removeAll(this.tempTestedMarkers);
}
for (String var14 : this.tempToRemove) {
this.sentToClientById.remove(var14);
}
if (!this.tempToAdd.isEmpty() || !this.tempToRemove.isEmpty()) {
MapMarker[] var13 = !this.tempToAdd.isEmpty() ? this.tempToAdd.toArray(MapMarker[]::new) : null;
String[] var15 = !this.tempToRemove.isEmpty() ? this.tempToRemove.toArray(String[]::new) : null;
this.player.getPlayerConnection().writeNoCache(new UpdateWorldMap(null, var13, var15));
}
}
}
class="kw">public void sendMapMarker(MapMarker var1) {
if (var1.transform != null && var1.transform.position != null) {
this.tempTestedMarkers.add(var1.id);
MapMarker var2 = this.sentToClientById.get(var1.id);
if (this.doesMarkerNeedNetworkUpdate(var2, var1)) {
this.sentToClientById.put(var1.id, var1);
this.tempToAdd.add(var1);
}
} else {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withStackTrace(StackSize.SMALL))
.log("Refusing to send map marker '%s' with no Transform.position", var1.id);
}
}
class="kw">private boolean doesMarkerNeedNetworkUpdate(@Nullable MapMarker var1, MapMarker var2) {
if (var1 == null) {
class="kw">return true;
} else if (!Objects.equals(var1.name, var2.name)) {
class="kw">return true;
} else if (!Objects.equals(var1.markerImage, var2.markerImage)) {
class="kw">return true;
} else {
double var3 = Math.abs(var1.transform.orientation.yaw - var2.transform.orientation.yaw);
if (!(var3 > 0.05) && (!this.isSendingSmallMovements() || !(var3 > 0.001))) {
Position var5 = var1.transform.position;
Position var6 = var2.transform.position;
double var7 = Vector3d.distanceSquared(var5.x, var5.y, var5.z, var6.x, var6.y, var6.z);
class="kw">return var7 > 25.0 || this.isSendingSmallMovements() && var7 > 0.01;
} else {
class="kw">return true;
}
}
}
class="kw">public void copyFrom(@Nonnull MapMarkerTracker var1) {
for (Entry var3 : var1.sentToClientById.entrySet()) {
this.sentToClientById.put(var3.getKey(), new MapMarker(var3.getValue()));
}
}
}