Refactoring

This commit is contained in:
filoghost 2021-08-25 08:54:56 +02:00
parent 2ddb972128
commit 3008f28fb2
21 changed files with 270 additions and 160 deletions

View File

@ -0,0 +1,32 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.PickupHandler;
import com.gmail.filoghost.holographicdisplays.api.line.CollectableLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.Collectable;
import org.bukkit.entity.Player;
public interface V2CollectableLine extends CollectableLine, V2HologramLine, Collectable {
@Override
default boolean hasPickupCallback() {
return getPickupHandler() != null;
}
@Override
default void invokePickupCallback(Player player) {
try {
PickupHandler pickupListener = getPickupHandler();
if (pickupListener != null) {
pickupListener.onPickup(player);
}
} catch (Throwable t) {
logPickupCallbackException(getCreatorPlugin(), player, t);
}
}
}

View File

@ -7,6 +7,7 @@ package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.EditableHologramLine;
import org.bukkit.plugin.Plugin;
@SuppressWarnings("deprecation")
public interface V2HologramLine extends HologramLine, EditableHologramLine {
@ -18,4 +19,8 @@ public interface V2HologramLine extends HologramLine, EditableHologramLine {
getParent().lines().remove(this);
}
default Plugin getCreatorPlugin() {
return getParent().getCreatorPlugin();
}
}

View File

@ -8,16 +8,17 @@ package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.PickupHandler;
import com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler;
import com.gmail.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import me.filoghost.holographicdisplays.api.hologram.line.PickupListener;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseItemHologramLine;
import org.bukkit.inventory.ItemStack;
@SuppressWarnings("deprecation")
public class V2ItemLine extends BaseItemHologramLine implements ItemLine, V2HologramLine {
public class V2ItemLine extends BaseItemHologramLine implements ItemLine, V2CollectableLine, V2TouchableLine {
private final V2Hologram parent;
private TouchHandler touchHandler;
private PickupHandler pickupHandler;
public V2ItemLine(V2Hologram parent, ItemStack itemStack) {
super(parent, itemStack);
this.parent = parent;
@ -30,40 +31,22 @@ public class V2ItemLine extends BaseItemHologramLine implements ItemLine, V2Holo
@Override
public void setTouchHandler(TouchHandler touchHandler) {
if (touchHandler != null) {
super.setClickListener(new V3ClickListenerAdapter(touchHandler));
} else {
super.setClickListener(null);
}
this.touchHandler = touchHandler;
}
@Override
public TouchHandler getTouchHandler() {
ClickListener clickListener = super.getClickListener();
if (clickListener instanceof V3ClickListenerAdapter) {
return ((V3ClickListenerAdapter) clickListener).getV2TouchHandler();
} else {
return null;
}
return touchHandler;
}
@Override
public void setPickupHandler(PickupHandler pickupHandler) {
if (pickupHandler != null) {
super.setPickupListener(new V3PickupListenerAdapter(pickupHandler));
} else {
super.setPickupListener(null);
}
this.pickupHandler = pickupHandler;
}
@Override
public PickupHandler getPickupHandler() {
PickupListener pickupListener = super.getPickupListener();
if (pickupListener instanceof V3PickupListenerAdapter) {
return ((V3PickupListenerAdapter) pickupListener).getV2PickupHandler();
} else {
return null;
}
return pickupHandler;
}
}

View File

@ -7,14 +7,15 @@ package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler;
import com.gmail.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseTextHologramLine;
@SuppressWarnings("deprecation")
public class V2TextLine extends BaseTextHologramLine implements TextLine, V2HologramLine {
public class V2TextLine extends BaseTextHologramLine implements TextLine, V2TouchableLine {
private final V2Hologram parent;
private TouchHandler touchHandler;
public V2TextLine(V2Hologram parent, String text) {
super(parent, text);
this.parent = parent;
@ -32,17 +33,12 @@ public class V2TextLine extends BaseTextHologramLine implements TextLine, V2Holo
@Override
public void setTouchHandler(TouchHandler touchHandler) {
super.setClickListener(new V3ClickListenerAdapter(touchHandler));
this.touchHandler = touchHandler;
}
@Override
public TouchHandler getTouchHandler() {
ClickListener clickListener = super.getClickListener();
if (clickListener instanceof V3ClickListenerAdapter) {
return ((V3ClickListenerAdapter) clickListener).getV2TouchHandler();
} else {
return null;
}
return touchHandler;
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler;
import com.gmail.filoghost.holographicdisplays.api.line.TouchableLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.Clickable;
import org.bukkit.entity.Player;
public interface V2TouchableLine extends TouchableLine, V2HologramLine, Clickable {
@Override
default boolean hasClickCallback() {
return getTouchHandler() != null;
}
@Override
default void invokeClickCallback(Player player) {
try {
TouchHandler touchHandler = getTouchHandler();
if (touchHandler != null) {
touchHandler.onTouch(player);
}
} catch (Throwable t) {
logClickCallbackException(getCreatorPlugin(), player, t);
}
}
}

View File

@ -1,31 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("deprecation")
public class V3ClickListenerAdapter implements ClickListener {
private final TouchHandler v2TouchHandler;
public V3ClickListenerAdapter(TouchHandler v2TouchHandler) {
this.v2TouchHandler = v2TouchHandler;
}
@Override
public void onClick(@NotNull Player player) {
v2TouchHandler.onTouch(player);
}
public TouchHandler getV2TouchHandler() {
return v2TouchHandler;
}
}

View File

@ -1,31 +0,0 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.PickupHandler;
import me.filoghost.holographicdisplays.api.hologram.line.PickupListener;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("deprecation")
public class V3PickupListenerAdapter implements PickupListener {
private final PickupHandler v2PickupHandler;
public V3PickupListenerAdapter(PickupHandler v2PickupHandler) {
this.v2PickupHandler = v2PickupHandler;
}
@Override
public void onPickup(@NotNull Player player) {
v2PickupHandler.onPickup(player);
}
public PickupHandler getV2PickupHandler() {
return v2PickupHandler;
}
}

View File

@ -5,8 +5,28 @@
*/
package me.filoghost.holographicdisplays.plugin.hologram.api;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import me.filoghost.holographicdisplays.api.hologram.line.ClickableHologramLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.Clickable;
import org.bukkit.entity.Player;
public interface APIClickableHologramLine extends ClickableHologramLine, APIHologramLine {
public interface APIClickableHologramLine extends ClickableHologramLine, APIHologramLine, Clickable {
@Override
default boolean hasClickCallback() {
return getClickListener() != null;
}
@Override
default void invokeClickCallback(Player player) {
try {
ClickListener clickListener = getClickListener();
if (clickListener != null) {
clickListener.onClick(player);
}
} catch (Throwable t) {
logClickCallbackException(getCreatorPlugin(), player, t);
}
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.hologram.api;
import me.filoghost.holographicdisplays.api.hologram.line.CollectableHologramLine;
import me.filoghost.holographicdisplays.api.hologram.line.PickupListener;
import me.filoghost.holographicdisplays.plugin.hologram.base.Collectable;
import org.bukkit.entity.Player;
public interface APICollectableHologramLine extends CollectableHologramLine, APIHologramLine, Collectable {
@Override
default boolean hasPickupCallback() {
return getPickupListener() != null;
}
@Override
default void invokePickupCallback(Player player) {
try {
PickupListener pickupListener = getPickupListener();
if (pickupListener != null) {
pickupListener.onPickup(player);
}
} catch (Throwable t) {
logPickupCallbackException(getCreatorPlugin(), player, t);
}
}
}

View File

@ -7,9 +7,12 @@ package me.filoghost.holographicdisplays.plugin.hologram.api;
import me.filoghost.holographicdisplays.api.hologram.line.HologramLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.EditableHologramLine;
import org.bukkit.plugin.Plugin;
public interface APIHologramLine extends HologramLine, EditableHologramLine {
void setChanged();
Plugin getCreatorPlugin();
}

View File

@ -5,14 +5,42 @@
*/
package me.filoghost.holographicdisplays.plugin.hologram.api;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import me.filoghost.holographicdisplays.api.hologram.line.ItemHologramLine;
import me.filoghost.holographicdisplays.api.hologram.line.PickupListener;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseItemHologramLine;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
public class APIItemHologramLine extends BaseItemHologramLine implements ItemHologramLine, APIClickableHologramLine {
public class APIItemHologramLine extends BaseItemHologramLine implements ItemHologramLine, APIClickableHologramLine, APICollectableHologramLine {
private PickupListener pickupListener;
private ClickListener clickListener;
public APIItemHologramLine(APIHologram parent, ItemStack itemStack) {
super(parent, itemStack);
}
public @Nullable PickupListener getPickupListener() {
return pickupListener;
}
public void setPickupListener(@Nullable PickupListener pickupListener) {
checkNotDeleted();
this.pickupListener = pickupListener;
}
@Override
public void setClickListener(@Nullable ClickListener clickListener) {
checkNotDeleted();
this.clickListener = clickListener;
}
@Override
public @Nullable ClickListener getClickListener() {
return clickListener;
}
}

View File

@ -5,13 +5,17 @@
*/
package me.filoghost.holographicdisplays.plugin.hologram.api;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import me.filoghost.holographicdisplays.api.hologram.line.TextHologramLine;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseTextHologramLine;
import org.jetbrains.annotations.Nullable;
public class APITextHologramLine extends BaseTextHologramLine implements TextHologramLine, APIClickableHologramLine {
private final APIHologram parent;
private ClickListener clickListener;
public APITextHologramLine(APIHologram parent, String text) {
super(parent, text);
this.parent = parent;
@ -22,4 +26,16 @@ public class APITextHologramLine extends BaseTextHologramLine implements TextHol
return parent.isAllowPlaceholders();
}
@Override
public void setClickListener(@Nullable ClickListener clickListener) {
checkNotDeleted();
this.clickListener = clickListener;
}
@Override
public @Nullable ClickListener getClickListener() {
return clickListener;
}
}

View File

@ -5,32 +5,19 @@
*/
package me.filoghost.holographicdisplays.plugin.hologram.base;
import me.filoghost.fcommons.logging.Log;
import me.filoghost.holographicdisplays.api.hologram.line.ClickListener;
import me.filoghost.holographicdisplays.common.Position;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.MustBeInvokedByOverriders;
import org.jetbrains.annotations.Nullable;
public abstract class BaseClickableHologramLine extends BaseHologramLine {
private ClickListener clickListener;
public abstract class BaseClickableHologramLine extends BaseHologramLine implements Clickable {
protected BaseClickableHologramLine(BaseHologram hologram) {
super(hologram);
}
public void onClick(Player player) {
if (clickListener == null || !canInteract(player) || !isInClickRange(player)) {
return;
}
try {
clickListener.onClick(player);
} catch (Throwable t) {
Log.warning("The plugin " + getCreatorPlugin().getName() + " generated an exception"
+ " when the player " + player.getName() + " clicked a hologram.", t);
if (hasClickCallback() && canInteract(player) && isInClickRange(player)) {
invokeClickCallback(player);
}
}
@ -46,16 +33,4 @@ public abstract class BaseClickableHologramLine extends BaseHologramLine {
return distanceSquared < 5 * 5;
}
public @Nullable ClickListener getClickListener() {
return clickListener;
}
@MustBeInvokedByOverriders
public void setClickListener(@Nullable ClickListener clickListener) {
checkNotDeleted();
this.clickListener = clickListener;
setChanged();
}
}

View File

@ -6,20 +6,16 @@
package me.filoghost.holographicdisplays.plugin.hologram.base;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.fcommons.logging.Log;
import me.filoghost.holographicdisplays.api.hologram.line.PickupListener;
import me.filoghost.holographicdisplays.common.nms.entity.ItemNMSPacketEntity;
import me.filoghost.holographicdisplays.plugin.hologram.tracking.ItemLineTracker;
import me.filoghost.holographicdisplays.plugin.hologram.tracking.LineTrackerManager;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.MustBeInvokedByOverriders;
import org.jetbrains.annotations.Nullable;
public abstract class BaseItemHologramLine extends BaseClickableHologramLine {
public abstract class BaseItemHologramLine extends BaseClickableHologramLine implements Collectable {
private ItemStack itemStack;
private PickupListener pickupListener;
public BaseItemHologramLine(BaseHologram hologram, ItemStack itemStack) {
super(hologram);
@ -32,27 +28,9 @@ public abstract class BaseItemHologramLine extends BaseClickableHologramLine {
}
public void onPickup(Player player) {
if (pickupListener == null || !canInteract(player)) {
return;
if (hasPickupCallback() && canInteract(player)) {
invokePickupCallback(player);
}
try {
pickupListener.onPickup(player);
} catch (Throwable t) {
Log.warning("The plugin " + getCreatorPlugin().getName() + " generated an exception"
+ " when the player " + player.getName() + " picked up an item from a hologram.", t);
}
}
public @Nullable PickupListener getPickupListener() {
return pickupListener;
}
@MustBeInvokedByOverriders
public void setPickupListener(@Nullable PickupListener pickupListener) {
checkNotDeleted();
this.pickupListener = pickupListener;
}
public @Nullable ItemStack getItemStack() {

View File

@ -0,0 +1,23 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.hologram.base;
import me.filoghost.fcommons.logging.Log;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public interface Clickable {
boolean hasClickCallback();
void invokeClickCallback(Player player);
default void logClickCallbackException(Plugin plugin, Player player, Throwable t) {
Log.warning("The plugin " + plugin.getName() + " generated an exception"
+ " when the player " + player.getName() + " clicked a hologram.", t);
}
}

View File

@ -0,0 +1,23 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.plugin.hologram.base;
import me.filoghost.fcommons.logging.Log;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public interface Collectable {
boolean hasPickupCallback();
void invokePickupCallback(Player player);
default void logPickupCallbackException(Plugin plugin, Player player, Throwable t) {
Log.warning("The plugin " + plugin.getName() + " generated an exception"
+ " when the player " + player.getName() + " picked up an item from a hologram.", t);
}
}

View File

@ -6,6 +6,7 @@
package me.filoghost.holographicdisplays.plugin.hologram.internal;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseItemHologramLine;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class InternalItemHologramLine extends BaseItemHologramLine implements InternalHologramLine {
@ -22,4 +23,20 @@ public class InternalItemHologramLine extends BaseItemHologramLine implements In
return serializedConfigValue;
}
@Override
public boolean hasClickCallback() {
return false;
}
@Override
public void invokeClickCallback(Player player) {}
@Override
public boolean hasPickupCallback() {
return false;
}
@Override
public void invokePickupCallback(Player player) {}
}

View File

@ -6,6 +6,7 @@
package me.filoghost.holographicdisplays.plugin.hologram.internal;
import me.filoghost.holographicdisplays.plugin.hologram.base.BaseTextHologramLine;
import org.bukkit.entity.Player;
public class InternalTextHologramLine extends BaseTextHologramLine implements InternalHologramLine {
@ -26,4 +27,12 @@ public class InternalTextHologramLine extends BaseTextHologramLine implements In
return serializedConfigValue;
}
@Override
public boolean hasClickCallback() {
return false;
}
@Override
public void invokeClickCallback(Player player) {}
}

View File

@ -41,7 +41,7 @@ public abstract class ClickableLineTracker<T extends BaseClickableHologramLine>
protected void detectChanges() {
super.detectChanges();
boolean spawnClickableEntity = line.getClickListener() != null;
boolean spawnClickableEntity = line.hasClickCallback();
if (this.spawnClickableEntity != spawnClickableEntity) {
this.spawnClickableEntity = spawnClickableEntity;
this.spawnClickableEntityChanged = true;

View File

@ -37,7 +37,7 @@ public class ItemLineTracker extends ClickableLineTracker<BaseItemHologramLine>
protected void update(Collection<? extends Player> onlinePlayers) {
super.update(onlinePlayers);
if (spawnItemEntity && hasTrackedPlayers()) {
if (spawnItemEntity && hasTrackedPlayers() && line.hasPickupCallback()) {
for (Player trackedPlayer : getTrackedPlayers()) {
if (CollisionHelper.isInPickupRange(trackedPlayer, position)) {
line.onPickup(trackedPlayer);

View File

@ -21,7 +21,7 @@ public class LineClickListener implements PacketListener {
// It is necessary to queue async click events to process them from the main thread.
// Use a set to avoid duplicate click events to the same line.
private final Set<ClickEvent> queuedClickEvents;
private final Set<QueuedClickEvent> queuedClickEvents;
public LineClickListener() {
linesByEntityID = new ConcurrentHashMap<>();
@ -32,7 +32,7 @@ public class LineClickListener implements PacketListener {
public boolean onAsyncEntityInteract(Player player, int entityID) {
BaseClickableHologramLine line = linesByEntityID.get(entityID);
if (line != null) {
queuedClickEvents.add(new ClickEvent(player, line));
queuedClickEvents.add(new QueuedClickEvent(player, line));
return true;
} else {
return false;
@ -41,8 +41,8 @@ public class LineClickListener implements PacketListener {
// This method is called from the main thread
public void processQueuedClickEvents() {
for (ClickEvent clickEvent : queuedClickEvents) {
clickEvent.line.onClick(clickEvent.player);
for (QueuedClickEvent queuedClickEvent : queuedClickEvents) {
queuedClickEvent.line.onClick(queuedClickEvent.player);
}
queuedClickEvents.clear();
}
@ -58,12 +58,12 @@ public class LineClickListener implements PacketListener {
}
private static class ClickEvent {
private static class QueuedClickEvent {
private final Player player;
private final BaseClickableHologramLine line;
ClickEvent(Player player, BaseClickableHologramLine line) {
QueuedClickEvent(Player player, BaseClickableHologramLine line) {
this.player = player;
this.line = line;
}
@ -77,7 +77,7 @@ public class LineClickListener implements PacketListener {
return false;
}
ClickEvent other = (ClickEvent) obj;
QueuedClickEvent other = (QueuedClickEvent) obj;
return this.player.equals(other.player) && this.line.equals(other.line);
}