Refactoring

This commit is contained in:
filoghost 2021-08-19 10:37:18 +02:00
parent 9fc8fceea7
commit 163b881837
8 changed files with 94 additions and 47 deletions

View File

@ -48,10 +48,11 @@ public abstract class BaseClickableLine extends BaseHologramLine {
private boolean isInClickRange(Player player) { private boolean isInClickRange(Player player) {
Location playerLocation = player.getLocation(); Location playerLocation = player.getLocation();
BaseLinePosition position = this.getPosition();
double xDiff = playerLocation.getX() - this.getX(); double xDiff = playerLocation.getX() - position.getX();
double yDiff = playerLocation.getY() + 1.3 - this.getY(); // Use shoulder height double yDiff = playerLocation.getY() + 1.3 - position.getY(); // Use shoulder height
double zDiff = playerLocation.getZ() - this.getZ(); double zDiff = playerLocation.getZ() - position.getZ();
double distanceSquared = (xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff); double distanceSquared = (xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff);
return distanceSquared < 5 * 5; return distanceSquared < 5 * 5;

View File

@ -12,6 +12,7 @@ import org.bukkit.GameMode;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public abstract class BaseHologramLine extends BaseHologramComponent implements EditableHologramLine { public abstract class BaseHologramLine extends BaseHologramComponent implements EditableHologramLine {
@ -19,7 +20,7 @@ public abstract class BaseHologramLine extends BaseHologramComponent implements
private final BaseHologram hologram; private final BaseHologram hologram;
private final LineTracker<?> tracker; private final LineTracker<?> tracker;
private double x, y, z; private BaseLinePosition position;
protected BaseHologramLine(BaseHologram hologram) { protected BaseHologramLine(BaseHologram hologram) {
Preconditions.notNull(hologram, "parent hologram"); Preconditions.notNull(hologram, "parent hologram");
@ -39,28 +40,21 @@ public abstract class BaseHologramLine extends BaseHologramComponent implements
@Override @Override
public final void setPosition(double x, double y, double z) { public final void setPosition(double x, double y, double z) {
this.x = x; position = new BaseLinePosition(x, y, z);
this.y = y;
this.z = z;
setChanged(); setChanged();
} }
public @NotNull BaseLinePosition getPosition() {
if (position == null) {
throw new IllegalStateException("position not set");
}
return position;
}
public @Nullable World getWorldIfLoaded() { public @Nullable World getWorldIfLoaded() {
return hologram.getPositionWorldIfLoaded(); return hologram.getPositionWorldIfLoaded();
} }
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
public boolean isInLoadedChunk() { public boolean isInLoadedChunk() {
return hologram.isInLoadedChunk(); return hologram.isInLoadedChunk();
} }

View File

@ -0,0 +1,54 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.hologram.base;
public final class BaseLinePosition {
private final double x, y, z;
public BaseLinePosition(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
BaseLinePosition other = (BaseLinePosition) obj;
return Double.doubleToLongBits(this.x) == Double.doubleToLongBits(other.x)
&& Double.doubleToLongBits(this.y) == Double.doubleToLongBits(other.y)
&& Double.doubleToLongBits(this.z) == Double.doubleToLongBits(other.z);
}
@Override
public int hashCode() {
int result = 1;
result = 31 * result + Double.hashCode(x);
result = 31 * result + Double.hashCode(y);
result = 31 * result + Double.hashCode(z);
return result;
}
}

View File

@ -61,7 +61,7 @@ public abstract class ClickableLineTracker<T extends BaseClickableLine> extends
@Override @Override
protected void addSpawnPackets(NMSPacketList packetList) { protected void addSpawnPackets(NMSPacketList packetList) {
if (spawnClickableEntity) { if (spawnClickableEntity) {
clickableEntity.addSpawnPackets(packetList, positionX, getClickablePositionY(), positionZ); clickableEntity.addSpawnPackets(packetList, position.getX(), getClickablePositionY(), position.getZ());
} }
} }
@ -80,7 +80,7 @@ public abstract class ClickableLineTracker<T extends BaseClickableLine> extends
if (spawnClickableEntityChanged) { if (spawnClickableEntityChanged) {
if (spawnClickableEntity) { if (spawnClickableEntity) {
clickableEntity.addSpawnPackets(packetList, positionX, getClickablePositionY(), positionZ); clickableEntity.addSpawnPackets(packetList, position.getX(), getClickablePositionY(), position.getZ());
} else { } else {
clickableEntity.addDestroyPackets(packetList); clickableEntity.addDestroyPackets(packetList);
} }
@ -91,12 +91,12 @@ public abstract class ClickableLineTracker<T extends BaseClickableLine> extends
@Override @Override
protected void addPositionChangePackets(NMSPacketList packetList) { protected void addPositionChangePackets(NMSPacketList packetList) {
if (spawnClickableEntity) { if (spawnClickableEntity) {
clickableEntity.addTeleportPackets(packetList, positionX, getClickablePositionY(), positionZ); clickableEntity.addTeleportPackets(packetList, position.getX(), getClickablePositionY(), position.getZ());
} }
} }
private double getClickablePositionY() { private double getClickablePositionY() {
return positionY + ((line.getHeight() - ClickableNMSPacketEntity.SLIME_HEIGHT) / 2); return position.getY() + ((line.getHeight() - ClickableNMSPacketEntity.SLIME_HEIGHT) / 2);
} }
} }

View File

@ -5,6 +5,7 @@
*/ */
package me.filoghost.holographicdisplays.plugin.hologram.tracking; package me.filoghost.holographicdisplays.plugin.hologram.tracking;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseLinePosition;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -24,7 +25,7 @@ public class CollisionHelper {
private static final double REQUIRED_DISTANCE_Z = REQUIRED_DISTANCE_X; private static final double REQUIRED_DISTANCE_Z = REQUIRED_DISTANCE_X;
private static final double REQUIRED_DISTANCE_Y = PLAYER_HEIGHT_RADIUS + PLAYER_GROW_HEIGHT + ITEM_HEIGHT_RADIUS; private static final double REQUIRED_DISTANCE_Y = PLAYER_HEIGHT_RADIUS + PLAYER_GROW_HEIGHT + ITEM_HEIGHT_RADIUS;
public static boolean isInPickupRange(Player player, double itemX, double itemY, double itemZ) { public static boolean isInPickupRange(Player player, BaseLinePosition itemPosition) {
/* /*
* Normally, the server determines if a player is picking up a dropped item * Normally, the server determines if a player is picking up a dropped item
* by checking if the bounding boxes of the player and the item intersect. * by checking if the bounding boxes of the player and the item intersect.
@ -61,10 +62,10 @@ public class CollisionHelper {
// The Y position is on lowest point of the bounding box, not in the center // The Y position is on lowest point of the bounding box, not in the center
double playerCenterY = playerLocation.getY() + PLAYER_HEIGHT_RADIUS; double playerCenterY = playerLocation.getY() + PLAYER_HEIGHT_RADIUS;
double itemCenterY = itemY + ITEM_HEIGHT_RADIUS; double itemCenterY = itemPosition.getY() + ITEM_HEIGHT_RADIUS;
double xDiff = Math.abs(playerLocation.getX() - itemX); double xDiff = Math.abs(playerLocation.getX() - itemPosition.getX());
double zDiff = Math.abs(playerLocation.getZ() - itemZ); double zDiff = Math.abs(playerLocation.getZ() - itemPosition.getZ());
double yDiff = Math.abs(playerCenterY - itemCenterY); double yDiff = Math.abs(playerCenterY - itemCenterY);
return xDiff <= REQUIRED_DISTANCE_X return xDiff <= REQUIRED_DISTANCE_X

View File

@ -39,7 +39,7 @@ public class ItemLineTracker extends ClickableLineTracker<BaseItemLine> {
if (spawnItemEntity && hasTrackedPlayers()) { if (spawnItemEntity && hasTrackedPlayers()) {
for (Player trackedPlayer : getTrackedPlayers()) { for (Player trackedPlayer : getTrackedPlayers()) {
if (CollisionHelper.isInPickupRange(trackedPlayer, positionX, positionY, positionZ)) { if (CollisionHelper.isInPickupRange(trackedPlayer, position)) {
line.onPickup(trackedPlayer); line.onPickup(trackedPlayer);
} }
} }
@ -83,7 +83,7 @@ public class ItemLineTracker extends ClickableLineTracker<BaseItemLine> {
super.addSpawnPackets(packetList); super.addSpawnPackets(packetList);
if (spawnItemEntity) { if (spawnItemEntity) {
itemEntity.addSpawnPackets(packetList, positionX, positionY, positionZ, itemStack); itemEntity.addSpawnPackets(packetList, position.getX(), position.getY(), position.getZ(), itemStack);
} }
} }
@ -104,7 +104,7 @@ public class ItemLineTracker extends ClickableLineTracker<BaseItemLine> {
if (spawnItemEntityChanged) { if (spawnItemEntityChanged) {
if (spawnItemEntity) { if (spawnItemEntity) {
itemEntity.addSpawnPackets(packetList, positionX, positionY, positionZ, itemStack); itemEntity.addSpawnPackets(packetList, position.getX(), position.getY(), position.getZ(), itemStack);
} else { } else {
itemEntity.addDestroyPackets(packetList); itemEntity.addDestroyPackets(packetList);
} }
@ -120,7 +120,7 @@ public class ItemLineTracker extends ClickableLineTracker<BaseItemLine> {
super.addPositionChangePackets(packetList); super.addPositionChangePackets(packetList);
if (spawnItemEntity) { if (spawnItemEntity) {
itemEntity.addTeleportPackets(packetList, positionX, positionY, positionZ); itemEntity.addTeleportPackets(packetList, position.getX(), position.getY(), position.getZ());
} }
} }

View File

@ -7,17 +7,18 @@ package me.filoghost.holographicdisplays.plugin.hologram.tracking;
import me.filoghost.holographicdisplays.common.nms.NMSPacketList; import me.filoghost.holographicdisplays.common.nms.NMSPacketList;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseHologramLine; import me.filoghost.holographicdisplays.plugin.hologram.base.BaseHologramLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseLinePosition;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.MustBeInvokedByOverriders;
import java.util.Objects;
abstract class PositionBasedLineTracker<T extends BaseHologramLine> extends LineTracker<T> { abstract class PositionBasedLineTracker<T extends BaseHologramLine> extends LineTracker<T> {
private static final int ENTITY_VIEW_RANGE = 64; private static final int ENTITY_VIEW_RANGE = 64;
protected double positionX; protected BaseLinePosition position;
protected double positionY;
protected double positionZ;
private boolean positionChanged; private boolean positionChanged;
PositionBasedLineTracker(T line) { PositionBasedLineTracker(T line) {
@ -27,13 +28,9 @@ abstract class PositionBasedLineTracker<T extends BaseHologramLine> extends Line
@MustBeInvokedByOverriders @MustBeInvokedByOverriders
@Override @Override
protected void detectChanges() { protected void detectChanges() {
double positionX = line.getX(); BaseLinePosition position = line.getPosition();
double positionY = line.getY(); if (!Objects.equals(this.position, position)) {
double positionZ = line.getZ(); this.position = position;
if (this.positionX != positionX || this.positionY != positionY || this.positionZ != positionZ) {
this.positionX = positionX;
this.positionY = positionY;
this.positionZ = positionZ;
this.positionChanged = true; this.positionChanged = true;
} }
} }
@ -51,8 +48,8 @@ abstract class PositionBasedLineTracker<T extends BaseHologramLine> extends Line
return false; return false;
} }
double diffX = Math.abs(playerLocation.getX() - positionX); double diffX = Math.abs(playerLocation.getX() - position.getX());
double diffZ = Math.abs(playerLocation.getZ() - positionZ); double diffZ = Math.abs(playerLocation.getZ() - position.getZ());
return diffX <= (double) ENTITY_VIEW_RANGE return diffX <= (double) ENTITY_VIEW_RANGE
&& diffZ <= (double) ENTITY_VIEW_RANGE && diffZ <= (double) ENTITY_VIEW_RANGE

View File

@ -77,11 +77,11 @@ public class TextLineTracker extends ClickableLineTracker<BaseTextLine> {
super.addSpawnPackets(packetList); super.addSpawnPackets(packetList);
if (!allowPlaceholders) { if (!allowPlaceholders) {
textEntity.addSpawnPackets(packetList, positionX, positionY, positionZ, displayText.getWithoutReplacements()); textEntity.addSpawnPackets(packetList, position.getX(), position.getY(), position.getZ(), displayText.getWithoutReplacements());
} else if (displayText.containsIndividualPlaceholders()) { } else if (displayText.containsIndividualPlaceholders()) {
textEntity.addSpawnPackets(packetList, positionX, positionY, positionZ, displayText::getWithIndividualReplacements); textEntity.addSpawnPackets(packetList, position.getX(), position.getY(), position.getZ(), displayText::getWithIndividualReplacements);
} else { } else {
textEntity.addSpawnPackets(packetList, positionX, positionY, positionZ, displayText.getWithGlobalReplacements()); textEntity.addSpawnPackets(packetList, position.getX(), position.getY(), position.getZ(), displayText.getWithGlobalReplacements());
} }
} }
@ -111,7 +111,7 @@ public class TextLineTracker extends ClickableLineTracker<BaseTextLine> {
@Override @Override
protected void addPositionChangePackets(NMSPacketList packetList) { protected void addPositionChangePackets(NMSPacketList packetList) {
super.addPositionChangePackets(packetList); super.addPositionChangePackets(packetList);
textEntity.addTeleportPackets(packetList, positionX, positionY, positionZ); textEntity.addTeleportPackets(packetList, position.getX(), position.getY(), position.getZ());
} }
} }