Enable the v2 API through adapters

This commit is contained in:
filoghost 2021-05-16 20:48:31 +02:00
parent 1906cadf96
commit 40d18d1235
25 changed files with 1108 additions and 41 deletions

View File

@ -12,6 +12,8 @@ import org.jetbrains.annotations.ApiStatus.Internal;
@Internal
public abstract class HolographicDisplaysAPIProvider {
public static final String ERROR_IMPLEMENTATION_NOT_SET = "Holographic Displays did not load properly (no API implementation was set)";
private static HolographicDisplaysAPIProvider implementation;
@ -21,7 +23,7 @@ public abstract class HolographicDisplaysAPIProvider {
public static HolographicDisplaysAPIProvider getImplementation() {
if (implementation == null) {
throw new IllegalStateException("Holographic Displays did not load properly");
throw new IllegalStateException(ERROR_IMPLEMENTATION_NOT_SET);
}
return implementation;

View File

@ -6,7 +6,7 @@
package com.gmail.filoghost.holographicdisplays.api;
import com.gmail.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer;
import com.gmail.filoghost.holographicdisplays.api.internal.BackendAPI;
import com.gmail.filoghost.holographicdisplays.api.internal.HologramsAPIProvider;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.Plugin;
@ -23,37 +23,37 @@ public class HologramsAPI {
@Deprecated
public static Hologram createHologram(Plugin plugin, Location source) {
return BackendAPI.getImplementation().createHologram(plugin, source);
return HologramsAPIProvider.getImplementation().createHologram(plugin, source);
}
@Deprecated
public static Collection<Hologram> getHolograms(Plugin plugin) {
return BackendAPI.getImplementation().getHolograms(plugin);
return HologramsAPIProvider.getImplementation().getHolograms(plugin);
}
@Deprecated
public static boolean registerPlaceholder(Plugin plugin, String textPlaceholder, double refreshRate, PlaceholderReplacer replacer) {
return BackendAPI.getImplementation().registerPlaceholder(plugin, textPlaceholder, refreshRate, replacer);
return HologramsAPIProvider.getImplementation().registerPlaceholder(plugin, textPlaceholder, refreshRate, replacer);
}
@Deprecated
public static Collection<String> getRegisteredPlaceholders(Plugin plugin) {
return BackendAPI.getImplementation().getRegisteredPlaceholders(plugin);
return HologramsAPIProvider.getImplementation().getRegisteredPlaceholders(plugin);
}
@Deprecated
public static boolean unregisterPlaceholder(Plugin plugin, String textPlaceholder) {
return BackendAPI.getImplementation().unregisterPlaceholder(plugin, textPlaceholder);
return HologramsAPIProvider.getImplementation().unregisterPlaceholder(plugin, textPlaceholder);
}
@Deprecated
public static void unregisterPlaceholders(Plugin plugin) {
BackendAPI.getImplementation().unregisterPlaceholders(plugin);
HologramsAPIProvider.getImplementation().unregisterPlaceholders(plugin);
}
@Deprecated
public static boolean isHologramEntity(Entity bukkitEntity) {
return BackendAPI.getImplementation().isHologramEntity(bukkitEntity);
return HologramsAPIProvider.getImplementation().isHologramEntity(bukkitEntity);
}
}

View File

@ -5,11 +5,13 @@
*/
package com.gmail.filoghost.holographicdisplays.api.internal;
import com.gmail.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer;
import com.gmail.filoghost.holographicdisplays.api.Hologram;
import com.gmail.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer;
import me.filoghost.holographicdisplays.api.internal.HolographicDisplaysAPIProvider;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.ApiStatus.Internal;
import java.util.Collection;
@ -17,19 +19,20 @@ import java.util.Collection;
* @deprecated Please use the new API!
*/
@Deprecated
public abstract class BackendAPI {
@Internal
public abstract class HologramsAPIProvider {
private static BackendAPI implementation;
private static HologramsAPIProvider implementation;
@Deprecated
public static void setImplementation(BackendAPI implementation) {
BackendAPI.implementation = implementation;
public static void setImplementation(HologramsAPIProvider implementation) {
HologramsAPIProvider.implementation = implementation;
}
@Deprecated
public static BackendAPI getImplementation() {
public static HologramsAPIProvider getImplementation() {
if (implementation == null) {
throw new IllegalStateException("No API implementation set. Is Holographic Displays enabled?");
throw new IllegalStateException(HolographicDisplaysAPIProvider.ERROR_IMPLEMENTATION_NOT_SET);
}
return implementation;

View File

@ -32,7 +32,6 @@
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>holographicdisplays-legacy-api-v2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>

View File

@ -5,6 +5,7 @@
*/
package me.filoghost.holographicdisplays;
import com.gmail.filoghost.holographicdisplays.api.internal.HologramsAPIProvider;
import me.filoghost.fcommons.FCommonsPlugin;
import me.filoghost.fcommons.FeatureSupport;
import me.filoghost.fcommons.config.exception.ConfigException;
@ -19,6 +20,7 @@ import me.filoghost.holographicdisplays.disk.ConfigManager;
import me.filoghost.holographicdisplays.disk.Configuration;
import me.filoghost.holographicdisplays.disk.HologramDatabase;
import me.filoghost.holographicdisplays.disk.upgrade.LegacySymbolsUpgrader;
import me.filoghost.holographicdisplays.legacy.api.v2.V2HologramsAPIProvider;
import me.filoghost.holographicdisplays.listener.ChunkListener;
import me.filoghost.holographicdisplays.listener.InteractListener;
import me.filoghost.holographicdisplays.listener.SpawnListener;
@ -31,6 +33,7 @@ import me.filoghost.holographicdisplays.object.internal.InternalHologramManager;
import me.filoghost.holographicdisplays.placeholder.PlaceholderManager;
import me.filoghost.holographicdisplays.placeholder.internal.AnimationRegistry;
import me.filoghost.holographicdisplays.placeholder.internal.DefaultPlaceholders;
import me.filoghost.holographicdisplays.placeholder.registry.PlaceholderRegistry;
import me.filoghost.holographicdisplays.util.NMSVersion;
import org.bstats.bukkit.MetricsLite;
import org.bukkit.Bukkit;
@ -122,11 +125,15 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
UpdateNotificationListener updateNotificationListener = new UpdateNotificationListener();
registerListener(updateNotificationListener);
// Enable the API.
// Enable the APIs
HolographicDisplaysAPIProvider.setImplementation(new DefaultHolographicDisplaysAPIProvider(
apiHologramManager,
nmsManager,
placeholderManager.getPlaceholderRegistry()));
enableLegacyAPI(
apiHologramManager,
nmsManager,
placeholderManager.getPlaceholderRegistry());
// Register bStats metrics
int pluginID = 3123;
@ -139,7 +146,15 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
Bukkit.getScheduler().runTaskLater(this, errorCollector::logErrorCount, 10L);
}
}
@SuppressWarnings("deprecation")
private void enableLegacyAPI(APIHologramManager apiHologramManager, NMSManager nmsManager, PlaceholderRegistry placeholderRegistry) {
HologramsAPIProvider.setImplementation(new V2HologramsAPIProvider(
apiHologramManager,
nmsManager,
placeholderRegistry));
}
public void load(boolean deferHologramsCreation, ErrorCollector errorCollector) {
DefaultPlaceholders.resetAndRegister(placeholderManager.getPlaceholderRegistry(), animationRegistry, bungeeServerTracker);

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.PickupHandler;
import org.bukkit.entity.Player;
@SuppressWarnings("deprecation")
public class NewPickupHandlerAdapter implements me.filoghost.holographicdisplays.api.handler.PickupHandler {
private final PickupHandler v2PickupHandler;
public NewPickupHandlerAdapter(PickupHandler v2PickupHandler) {
this.v2PickupHandler = v2PickupHandler;
}
@Override
public void onPickup(Player player) {
v2PickupHandler.onPickup(player);
}
public PickupHandler getV2PickupHandler() {
return v2PickupHandler;
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof NewPickupHandlerAdapter)) {
return false;
}
NewPickupHandlerAdapter other = (NewPickupHandlerAdapter) obj;
return this.v2PickupHandler.equals(other.v2PickupHandler);
}
@Override
public final int hashCode() {
return v2PickupHandler.hashCode();
}
@Override
public final String toString() {
return v2PickupHandler.toString();
}
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler;
import org.bukkit.entity.Player;
@SuppressWarnings("deprecation")
public class NewTouchHandlerAdapter implements me.filoghost.holographicdisplays.api.handler.TouchHandler {
private final TouchHandler v2TouchHandler;
public NewTouchHandlerAdapter(TouchHandler v2TouchHandler) {
this.v2TouchHandler = v2TouchHandler;
}
@Override
public void onTouch(Player player) {
v2TouchHandler.onTouch(player);
}
public TouchHandler getV2TouchHandler() {
return v2TouchHandler;
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof NewTouchHandlerAdapter)) {
return false;
}
NewTouchHandlerAdapter other = (NewTouchHandlerAdapter) obj;
return this.v2TouchHandler.equals(other.v2TouchHandler);
}
@Override
public final int hashCode() {
return v2TouchHandler.hashCode();
}
@Override
public final String toString() {
return v2TouchHandler.toString();
}
}

View File

@ -0,0 +1,160 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.Hologram;
import com.gmail.filoghost.holographicdisplays.api.VisibilityManager;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.api.line.ItemLine;
import com.gmail.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.object.api.APIHologram;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.inventory.ItemStack;
@SuppressWarnings("deprecation")
public class V2HologramAdapter implements Hologram {
private final APIHologram newHologram;
public V2HologramAdapter(APIHologram newHologram) {
this.newHologram = newHologram;
}
@Override
public TextLine appendTextLine(String text) {
return newHologram.appendTextLine(text).getV2Adapter();
}
@Override
public ItemLine appendItemLine(ItemStack itemStack) {
return newHologram.appendItemLine(itemStack).getV2Adapter();
}
@Override
public TextLine insertTextLine(int index, String text) {
return newHologram.insertTextLine(index, text).getV2Adapter();
}
@Override
public ItemLine insertItemLine(int index, ItemStack itemStack) {
return newHologram.insertItemLine(index, itemStack).getV2Adapter();
}
@Override
public HologramLine getLine(int index) {
return newHologram.getLine(index).getV2Adapter();
}
@Override
public void removeLine(int index) {
newHologram.removeLine(index);
}
@Override
public void clearLines() {
newHologram.clearLines();
}
@Override
public int size() {
return newHologram.size();
}
@Override
public double getHeight() {
return newHologram.getHeight();
}
@Override
public void teleport(Location location) {
newHologram.teleport(location);
}
@Override
public void teleport(World world, double x, double y, double z) {
newHologram.teleport(world, x, y, z);
}
@Override
public Location getLocation() {
return newHologram.getLocation();
}
@Override
public double getX() {
return newHologram.getX();
}
@Override
public double getY() {
return newHologram.getY();
}
@Override
public double getZ() {
return newHologram.getZ();
}
@Override
public World getWorld() {
return newHologram.getWorld();
}
@Override
public VisibilityManager getVisibilityManager() {
return newHologram.getVisibilityManager().getV2Adapter();
}
@Override
public long getCreationTimestamp() {
return newHologram.getCreationTimestamp();
}
@Override
public boolean isAllowPlaceholders() {
return newHologram.isAllowPlaceholders();
}
@Override
public void setAllowPlaceholders(boolean allowPlaceholders) {
newHologram.setAllowPlaceholders(allowPlaceholders);
}
@Override
public void delete() {
newHologram.delete();
}
@Override
public boolean isDeleted() {
return newHologram.isDeleted();
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof V2HologramAdapter)) {
return false;
}
V2HologramAdapter other = (V2HologramAdapter) obj;
return this.newHologram.equals(other.newHologram);
}
@Override
public final int hashCode() {
return newHologram.hashCode();
}
@Override
public final String toString() {
return newHologram.toString();
}
}

View File

@ -0,0 +1,53 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.object.api.APIHologramLine;
@SuppressWarnings("deprecation")
public abstract class V2HologramLineAdapter implements HologramLine {
private final APIHologramLine newHologramLine;
public V2HologramLineAdapter(APIHologramLine newHologramLine) {
this.newHologramLine = newHologramLine;
}
@Override
public V2HologramAdapter getParent() {
return newHologramLine.getParent().getV2Adapter();
}
@Override
public void removeLine() {
newHologramLine.removeLine();
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof V2HologramLineAdapter)) {
return false;
}
V2HologramLineAdapter other = (V2HologramLineAdapter) obj;
return this.newHologramLine.equals(other.newHologramLine);
}
@Override
public final int hashCode() {
return newHologramLine.hashCode();
}
@Override
public final String toString() {
return newHologramLine.toString();
}
}

View File

@ -0,0 +1,116 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.Hologram;
import com.gmail.filoghost.holographicdisplays.api.internal.HologramsAPIProvider;
import com.gmail.filoghost.holographicdisplays.api.placeholder.PlaceholderReplacer;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.core.nms.NMSManager;
import me.filoghost.holographicdisplays.object.api.APIHologram;
import me.filoghost.holographicdisplays.object.api.APIHologramManager;
import me.filoghost.holographicdisplays.placeholder.registry.PlaceholderRegistry;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@SuppressWarnings("deprecation")
public class V2HologramsAPIProvider extends HologramsAPIProvider {
private final APIHologramManager apiHologramManager;
private final NMSManager nmsManager;
private final PlaceholderRegistry placeholderRegistry;
public V2HologramsAPIProvider(APIHologramManager apiHologramManager, NMSManager nmsManager, PlaceholderRegistry placeholderRegistry) {
this.apiHologramManager = apiHologramManager;
this.nmsManager = nmsManager;
this.placeholderRegistry = placeholderRegistry;
}
@Override
public Hologram createHologram(Plugin plugin, Location source) {
Preconditions.notNull(plugin, "plugin");
Preconditions.notNull(source, "source");
Preconditions.notNull(source.getWorld(), "source's world");
Preconditions.checkState(Bukkit.isPrimaryThread(), "async hologram creation");
return apiHologramManager.createHologram(source, plugin).getV2Adapter();
}
@Override
public Collection<Hologram> getHolograms(Plugin plugin) {
Preconditions.notNull(plugin, "plugin");
List<Hologram> ownedHolograms = new ArrayList<>();
for (APIHologram hologram : apiHologramManager.getHolograms()) {
if (hologram.getOwnerPlugin().equals(plugin)) {
ownedHolograms.add(hologram.getV2Adapter());
}
}
return Collections.unmodifiableList(ownedHolograms);
}
@Override
public boolean registerPlaceholder(Plugin plugin, String textPlaceholder, double refreshRate, PlaceholderReplacer replacer) {
Preconditions.notNull(plugin, "plugin");
Preconditions.notNull(textPlaceholder, "textPlaceholder");
Preconditions.checkArgument(refreshRate >= 0, "refreshRate should be positive");
Preconditions.notNull(replacer, "replacer");
int refreshIntervalTicks = Math.min((int) (refreshRate * 20.0), 1);
boolean alreadyRegistered = placeholderRegistry.isRegisteredIdentifier(plugin, textPlaceholder);
if (!alreadyRegistered) {
placeholderRegistry.registerReplacer(plugin, textPlaceholder, refreshIntervalTicks, argument -> replacer.update());
return true;
} else {
return false;
}
}
@Override
public Collection<String> getRegisteredPlaceholders(Plugin plugin) {
Preconditions.notNull(plugin, "plugin");
return placeholderRegistry.getRegisteredIdentifiers(plugin);
}
@Override
public boolean unregisterPlaceholder(Plugin plugin, String textPlaceholder) {
Preconditions.notNull(plugin, "plugin");
Preconditions.notNull(textPlaceholder, "textPlaceholder");
boolean registered = placeholderRegistry.isRegisteredIdentifier(plugin, textPlaceholder);
if (registered) {
placeholderRegistry.unregister(plugin, textPlaceholder);
return true;
} else {
return false;
}
}
@Override
public void unregisterPlaceholders(Plugin plugin) {
Preconditions.notNull(plugin, "plugin");
placeholderRegistry.unregisterAll(plugin);
}
@Override
public boolean isHologramEntity(Entity bukkitEntity) {
Preconditions.notNull(bukkitEntity, "bukkitEntity");
return nmsManager.isNMSEntityBase(bukkitEntity);
}
}

View File

@ -0,0 +1,79 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.PickupHandler;
import com.gmail.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.object.api.APIItemLine;
import org.bukkit.inventory.ItemStack;
@SuppressWarnings("deprecation")
public class V2ItemLineAdapter extends V2TouchableLineAdapter implements ItemLine {
private final APIItemLine newItemLine;
private PickupHandler v2PickupHandler;
public V2ItemLineAdapter(APIItemLine newItemLine) {
super(newItemLine);
this.newItemLine = newItemLine;
}
public void onNewPickupHandlerChange(me.filoghost.holographicdisplays.api.handler.PickupHandler previous,
me.filoghost.holographicdisplays.api.handler.PickupHandler current) {
if (previous != current) {
v2PickupHandler = null; // Clear the field to force a new lazy initialization
}
}
@Override
public void setPickupHandler(PickupHandler v2PickupHandler) {
if (v2PickupHandler == null) {
newItemLine.setPickupHandler(null);
} else if (v2PickupHandler instanceof V2PickupHandlerAdapter) {
// Adapter created from the getPickupHandler() method, simply unwrap it
newItemLine.setPickupHandler(((V2PickupHandlerAdapter) v2PickupHandler).getNewPickupHandler());
} else {
me.filoghost.holographicdisplays.api.handler.PickupHandler newPickupHandler = newItemLine.getPickupHandler();
// Adapt the old v2 handler to the new API, creating a new instance only if the wrapped handler changed
if (!(newPickupHandler instanceof NewPickupHandlerAdapter)
|| ((NewPickupHandlerAdapter) newPickupHandler).getV2PickupHandler() != v2PickupHandler) {
newItemLine.setPickupHandler(new NewPickupHandlerAdapter(v2PickupHandler));
}
}
this.v2PickupHandler = v2PickupHandler;
}
@Override
public PickupHandler getPickupHandler() {
// Lazy initialization
if (v2PickupHandler == null) {
me.filoghost.holographicdisplays.api.handler.PickupHandler newPickupHandler = newItemLine.getPickupHandler();
if (newPickupHandler == null) {
// Keep it null
} else if (newPickupHandler instanceof NewPickupHandlerAdapter) {
// Adapter created from the setPickupHandler() method, simply unwrap it
v2PickupHandler = ((NewPickupHandlerAdapter) newPickupHandler).getV2PickupHandler();
} else {
// Adapt the new handler to the old v2 API
v2PickupHandler = new V2PickupHandlerAdapter(newPickupHandler);
}
}
return v2PickupHandler;
}
@Override
public ItemStack getItemStack() {
return newItemLine.getItemStack();
}
@Override
public void setItemStack(ItemStack itemStack) {
newItemLine.setItemStack(itemStack);
}
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import me.filoghost.holographicdisplays.api.handler.PickupHandler;
import org.bukkit.entity.Player;
@SuppressWarnings("deprecation")
class V2PickupHandlerAdapter implements com.gmail.filoghost.holographicdisplays.api.handler.PickupHandler {
private final PickupHandler newPickupHandler;
V2PickupHandlerAdapter(PickupHandler newPickupHandler) {
this.newPickupHandler = newPickupHandler;
}
@Override
public void onPickup(Player player) {
newPickupHandler.onPickup(player);
}
public PickupHandler getNewPickupHandler() {
return newPickupHandler;
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof V2PickupHandlerAdapter)) {
return false;
}
V2PickupHandlerAdapter other = (V2PickupHandlerAdapter) obj;
return this.newPickupHandler.equals(other.newPickupHandler);
}
@Override
public final int hashCode() {
return newPickupHandler.hashCode();
}
@Override
public final String toString() {
return newPickupHandler.toString();
}
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.object.api.APITextLine;
@SuppressWarnings("deprecation")
public class V2TextLineAdapter extends V2TouchableLineAdapter implements TextLine {
private final APITextLine newTextLine;
public V2TextLineAdapter(APITextLine newTextLine) {
super(newTextLine);
this.newTextLine = newTextLine;
}
@Override
public String getText() {
return newTextLine.getText();
}
@Override
public void setText(String text) {
newTextLine.setText(text);
}
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import org.bukkit.entity.Player;
@SuppressWarnings("deprecation")
class V2TouchHandlerAdapter implements com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler {
private final TouchHandler newTouchHandler;
V2TouchHandlerAdapter(TouchHandler newTouchHandler) {
this.newTouchHandler = newTouchHandler;
}
@Override
public void onTouch(Player player) {
newTouchHandler.onTouch(player);
}
public TouchHandler getNewTouchHandler() {
return newTouchHandler;
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof V2TouchHandlerAdapter)) {
return false;
}
V2TouchHandlerAdapter other = (V2TouchHandlerAdapter) obj;
return this.newTouchHandler.equals(other.newTouchHandler);
}
@Override
public final int hashCode() {
return newTouchHandler.hashCode();
}
@Override
public final String toString() {
return newTouchHandler.toString();
}
}

View File

@ -0,0 +1,68 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler;
import com.gmail.filoghost.holographicdisplays.api.line.TouchableLine;
import me.filoghost.holographicdisplays.object.api.APITouchableLine;
@SuppressWarnings("deprecation")
abstract class V2TouchableLineAdapter extends V2HologramLineAdapter implements TouchableLine {
private final APITouchableLine newTouchableLine;
private TouchHandler v2TouchHandler;
V2TouchableLineAdapter(APITouchableLine newTouchableLine) {
super(newTouchableLine);
this.newTouchableLine = newTouchableLine;
}
public void onNewTouchHandlerChange(me.filoghost.holographicdisplays.api.handler.TouchHandler previous,
me.filoghost.holographicdisplays.api.handler.TouchHandler current) {
if (previous != current) {
v2TouchHandler = null; // Clear the field to force a new lazy initialization
}
}
@Override
public void setTouchHandler(TouchHandler v2TouchHandler) {
if (v2TouchHandler == null) {
newTouchableLine.setTouchHandler(null);
} else if (v2TouchHandler instanceof V2TouchHandlerAdapter) {
// Adapter created from the getTouchHandler() method, simply unwrap it
newTouchableLine.setTouchHandler(((V2TouchHandlerAdapter) v2TouchHandler).getNewTouchHandler());
} else {
me.filoghost.holographicdisplays.api.handler.TouchHandler newTouchHandler = newTouchableLine.getTouchHandler();
// Adapt the old v2 handler to the new API, creating a new instance only if the wrapped handler changed
if (!(newTouchHandler instanceof NewTouchHandlerAdapter)
|| ((NewTouchHandlerAdapter) newTouchHandler).getV2TouchHandler() != v2TouchHandler) {
newTouchableLine.setTouchHandler(new NewTouchHandlerAdapter(v2TouchHandler));
}
}
this.v2TouchHandler = v2TouchHandler;
}
@Override
public TouchHandler getTouchHandler() {
// Lazy initialization
if (v2TouchHandler == null) {
me.filoghost.holographicdisplays.api.handler.TouchHandler newTouchHandler = newTouchableLine.getTouchHandler();
if (newTouchHandler == null) {
// Keep it null
} else if (newTouchHandler instanceof NewTouchHandlerAdapter) {
// Adapter created from the setTouchHandler() method, simply unwrap it
v2TouchHandler = ((NewTouchHandlerAdapter) newTouchHandler).getV2TouchHandler();
} else {
// Adapt the new handler to the old v2 API
v2TouchHandler = new V2TouchHandlerAdapter(newTouchHandler);
}
}
return v2TouchHandler;
}
}

View File

@ -0,0 +1,79 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.VisibilityManager;
import me.filoghost.holographicdisplays.object.api.DefaultVisibilityManager;
import org.bukkit.entity.Player;
@SuppressWarnings("deprecation")
public class V2VisibilityManagerAdapter implements VisibilityManager {
private final DefaultVisibilityManager newVisibilityManager;
public V2VisibilityManagerAdapter(DefaultVisibilityManager newVisibilityManager) {
this.newVisibilityManager = newVisibilityManager;
}
@Override
public boolean isVisibleByDefault() {
return newVisibilityManager.isVisibleByDefault();
}
@Override
public void setVisibleByDefault(boolean visibleByDefault) {
newVisibilityManager.setVisibleByDefault(visibleByDefault);
}
@Override
public void showTo(Player player) {
newVisibilityManager.showTo(player);
}
@Override
public void hideTo(Player player) {
newVisibilityManager.hideTo(player);
}
@Override
public boolean isVisibleTo(Player player) {
return newVisibilityManager.isVisibleTo(player);
}
@Override
public void resetVisibility(Player player) {
newVisibilityManager.resetVisibility(player);
}
@Override
public void resetVisibilityAll() {
newVisibilityManager.resetVisibilityAll();
}
@Override
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof V2VisibilityManagerAdapter)) {
return false;
}
V2VisibilityManagerAdapter other = (V2VisibilityManagerAdapter) obj;
return this.newVisibilityManager.equals(other.newVisibilityManager);
}
@Override
public final int hashCode() {
return newVisibilityManager.hashCode();
}
@Override
public final String toString() {
return newVisibilityManager.toString();
}
}

View File

@ -7,12 +7,9 @@ package me.filoghost.holographicdisplays.object.api;
import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.Hologram;
import me.filoghost.holographicdisplays.api.VisibilityManager;
import me.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.core.nms.NMSManager;
import me.filoghost.holographicdisplays.disk.Configuration;
import me.filoghost.holographicdisplays.legacy.api.v2.V2HologramAdapter;
import me.filoghost.holographicdisplays.object.base.BaseHologram;
import me.filoghost.holographicdisplays.placeholder.PlaceholderManager;
import org.bukkit.Location;
@ -23,11 +20,12 @@ import org.bukkit.plugin.Plugin;
import java.util.List;
public class APIHologram extends BaseHologram<APIHologramLine> implements Hologram {
private final Plugin plugin;
private final APIHologramManager apiHologramManager;
private final VisibilityManager visibilityManager;
private final DefaultVisibilityManager visibilityManager;
private final long creationTimestamp;
private final V2HologramAdapter v2Adapter;
private boolean allowPlaceholders;
@ -38,6 +36,7 @@ public class APIHologram extends BaseHologram<APIHologramLine> implements Hologr
this.apiHologramManager = apiHologramManager;
this.visibilityManager = new DefaultVisibilityManager(this);
this.creationTimestamp = System.currentTimeMillis();
this.v2Adapter = new V2HologramAdapter(this);
}
@Override
@ -46,14 +45,14 @@ public class APIHologram extends BaseHologram<APIHologramLine> implements Hologr
}
@Override
public TextLine appendTextLine(String text) {
public APITextLine appendTextLine(String text) {
APITextLine line = createTextLine(text);
addLine(line);
return line;
}
@Override
public ItemLine appendItemLine(ItemStack itemStack) {
public APIItemLine appendItemLine(ItemStack itemStack) {
Preconditions.notNull(itemStack, "itemStack");
APIItemLine line = createItemLine(itemStack);
@ -62,14 +61,14 @@ public class APIHologram extends BaseHologram<APIHologramLine> implements Hologr
}
@Override
public TextLine insertTextLine(int index, String text) {
public APITextLine insertTextLine(int index, String text) {
APITextLine line = createTextLine(text);
addLine(line);
return line;
}
@Override
public ItemLine insertItemLine(int index, ItemStack itemStack) {
public APIItemLine insertItemLine(int index, ItemStack itemStack) {
Preconditions.notNull(itemStack, "itemStack");
APIItemLine line = createItemLine(itemStack);
@ -86,7 +85,7 @@ public class APIHologram extends BaseHologram<APIHologramLine> implements Hologr
}
@Override
public HologramLine getLine(int index) {
public APIHologramLine getLine(int index) {
return getLines().get(index);
}
@ -138,7 +137,7 @@ public class APIHologram extends BaseHologram<APIHologramLine> implements Hologr
}
@Override
public VisibilityManager getVisibilityManager() {
public DefaultVisibilityManager getVisibilityManager() {
return visibilityManager;
}
@ -152,4 +151,8 @@ public class APIHologram extends BaseHologram<APIHologramLine> implements Hologr
return plugin.getName() + "@" + Integer.toHexString(hashCode());
}
public V2HologramAdapter getV2Adapter() {
return v2Adapter;
}
}

View File

@ -7,6 +7,7 @@ package me.filoghost.holographicdisplays.object.api;
import me.filoghost.holographicdisplays.api.line.HologramLine;
import me.filoghost.holographicdisplays.core.hologram.StandardHologramLine;
import me.filoghost.holographicdisplays.legacy.api.v2.V2HologramLineAdapter;
public interface APIHologramLine extends HologramLine, StandardHologramLine {
@ -18,4 +19,6 @@ public interface APIHologramLine extends HologramLine, StandardHologramLine {
getParent().removeLine(this);
}
V2HologramLineAdapter getV2Adapter();
}

View File

@ -27,7 +27,7 @@ public class APIHologramManager extends BaseHologramManager<APIHologram> {
this.placeholderManager = placeholderManager;
}
public Hologram createHologram(Location source, Plugin plugin) {
public APIHologram createHologram(Location source, Plugin plugin) {
APIHologram hologram = new APIHologram(source, plugin, nmsManager, this, placeholderManager);
super.addHologram(hologram);
return hologram;

View File

@ -1,16 +1,21 @@
package me.filoghost.holographicdisplays.object.api;
import me.filoghost.holographicdisplays.api.handler.PickupHandler;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.api.line.ItemLine;
import me.filoghost.holographicdisplays.legacy.api.v2.V2ItemLineAdapter;
import me.filoghost.holographicdisplays.object.base.BaseItemLine;
import org.bukkit.inventory.ItemStack;
public class APIItemLine extends BaseItemLine implements ItemLine, APIHologramLine {
public class APIItemLine extends BaseItemLine implements ItemLine, APITouchableLine {
private final APIHologram parent;
private final V2ItemLineAdapter v2Adapter;
public APIItemLine(APIHologram parent, ItemStack itemStack) {
super(parent, itemStack);
this.parent = parent;
this.v2Adapter = new V2ItemLineAdapter(this);
}
@Override
@ -18,4 +23,21 @@ public class APIItemLine extends BaseItemLine implements ItemLine, APIHologramLi
return parent;
}
@Override
public void setTouchHandler(TouchHandler touchHandler) {
v2Adapter.onNewTouchHandlerChange(getTouchHandler(), touchHandler);
super.setTouchHandler(touchHandler);
}
@Override
public void setPickupHandler(PickupHandler pickupHandler) {
v2Adapter.onNewPickupHandlerChange(getPickupHandler(), pickupHandler);
super.setPickupHandler(pickupHandler);
}
@Override
public V2ItemLineAdapter getV2Adapter() {
return v2Adapter;
}
}

View File

@ -1,15 +1,19 @@
package me.filoghost.holographicdisplays.object.api;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.legacy.api.v2.V2TextLineAdapter;
import me.filoghost.holographicdisplays.object.base.BaseTextLine;
public class APITextLine extends BaseTextLine implements TextLine, APIHologramLine {
public class APITextLine extends BaseTextLine implements TextLine, APITouchableLine {
private final APIHologram parent;
private final V2TextLineAdapter v2Adapter;
public APITextLine(APIHologram parent, String text) {
super(parent, text);
this.parent = parent;
this.v2Adapter = new V2TextLineAdapter(this);
}
@Override
@ -17,14 +21,20 @@ public class APITextLine extends BaseTextLine implements TextLine, APIHologramLi
return parent;
}
@Override
public void setText(String text) {
super.setText(text);
}
@Override
public boolean isAllowPlaceholders() {
return parent.isAllowPlaceholders();
}
@Override
public void setTouchHandler(TouchHandler touchHandler) {
v2Adapter.onNewTouchHandlerChange(getTouchHandler(), touchHandler);
super.setTouchHandler(touchHandler);
}
@Override
public V2TextLineAdapter getV2Adapter() {
return v2Adapter;
}
}

View File

@ -0,0 +1,12 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.object.api;
import me.filoghost.holographicdisplays.api.line.TouchableLine;
public interface APITouchableLine extends TouchableLine, APIHologramLine {
}

View File

@ -9,6 +9,7 @@ import me.filoghost.fcommons.Preconditions;
import me.filoghost.holographicdisplays.api.VisibilityManager;
import me.filoghost.holographicdisplays.bridge.protocollib.ProtocolLibHook;
import me.filoghost.holographicdisplays.core.hologram.StandardHologram;
import me.filoghost.holographicdisplays.legacy.api.v2.V2VisibilityManagerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -21,12 +22,14 @@ import java.util.concurrent.ConcurrentHashMap;
public class DefaultVisibilityManager implements VisibilityManager {
private final StandardHologram hologram;
private final V2VisibilityManagerAdapter v2Adapter;
private Map<UUID, Boolean> playersVisibilityMap;
private boolean visibleByDefault;
public DefaultVisibilityManager(StandardHologram hologram) {
Preconditions.notNull(hologram, "hologram");
this.hologram = hologram;
this.v2Adapter = new V2VisibilityManagerAdapter(this);
this.visibleByDefault = true;
}
@ -164,5 +167,9 @@ public class DefaultVisibilityManager implements VisibilityManager {
public String toString() {
return "VisibilityManager [playersMap=" + playersVisibilityMap + ", visibleByDefault=" + visibleByDefault + "]";
}
public V2VisibilityManagerAdapter getV2Adapter() {
return v2Adapter;
}
}

View File

@ -33,7 +33,7 @@ public abstract class BaseTextLine extends BaseTouchableLine implements Standard
return text;
}
protected void setText(String text) {
public void setText(String text) {
this.text = text;
if (textEntity != null) {

View File

@ -0,0 +1,197 @@
/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.legacy.api.v2;
import com.gmail.filoghost.holographicdisplays.api.line.TextLine;
import me.filoghost.holographicdisplays.api.handler.TouchHandler;
import me.filoghost.holographicdisplays.object.api.APIHologram;
import me.filoghost.holographicdisplays.object.api.APITextLine;
import org.bukkit.entity.Player;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
@SuppressWarnings("deprecation")
class V2TouchableLineAdapterTest {
APIHologram hologram = mock(APIHologram.class);
@Test
void setNullV2TouchHandler() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleNewTouchHandler newTouchHandler = new ExampleNewTouchHandler();
newLine.setTouchHandler(newTouchHandler);
v2Line.setTouchHandler(null);
assertThat(v2Line.getTouchHandler()).isNull();
assertThat(newLine.getTouchHandler()).isNull();
}
@Test
void setNullNewTouchHandler() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleV2TouchHandler v2TouchHandler = new ExampleV2TouchHandler();
v2Line.setTouchHandler(v2TouchHandler);
newLine.setTouchHandler(null);
assertThat(v2Line.getTouchHandler()).isNull();
assertThat(newLine.getTouchHandler()).isNull();
}
@Test
void setV2GetV2TouchHandler() {
TextLine v2Line = new APITextLine(hologram, "").getV2Adapter();
ExampleV2TouchHandler v2TouchHandler = new ExampleV2TouchHandler();
v2Line.setTouchHandler(v2TouchHandler);
assertThat(v2Line.getTouchHandler()).isSameAs(v2TouchHandler);
}
@Test
void setNewGetV2TouchHandler() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleNewTouchHandler newTouchHandler = new ExampleNewTouchHandler();
newLine.setTouchHandler(newTouchHandler);
assertThat(v2Line.getTouchHandler()).isNotNull();
}
@Test
void setV2GetNewTouchHandler() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleV2TouchHandler v2TouchHandler = new ExampleV2TouchHandler();
v2Line.setTouchHandler(v2TouchHandler);
assertThat(newLine.getTouchHandler()).isNotNull();
}
@Test
void repeatedGetV2TouchHandlerShouldReturnSameInstance() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
newLine.setTouchHandler(new ExampleNewTouchHandler());
assertThat(v2Line.getTouchHandler()).isSameAs(v2Line.getTouchHandler());
v2Line.setTouchHandler(new ExampleV2TouchHandler());
assertThat(v2Line.getTouchHandler()).isSameAs(v2Line.getTouchHandler());
}
@Test
void repeatedSetV2TouchHandlerShouldNotChangeNewTouchHandlerInstance() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleV2TouchHandler v2TouchHandler = new ExampleV2TouchHandler();
v2Line.setTouchHandler(v2TouchHandler);
TouchHandler newTouchHandlerA = newLine.getTouchHandler();
v2Line.setTouchHandler(v2TouchHandler);
TouchHandler newTouchHandlerB = newLine.getTouchHandler();
assertThat(newTouchHandlerA).isSameAs(newTouchHandlerB);
}
@Test
void repeatedSetNewTouchHandlerShouldNotChangeV2TouchHandlerInstance() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleNewTouchHandler v2TouchHandler = new ExampleNewTouchHandler();
newLine.setTouchHandler(v2TouchHandler);
com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler v2TouchHandlerA = v2Line.getTouchHandler();
newLine.setTouchHandler(v2TouchHandler);
com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler v2TouchHandlerB = v2Line.getTouchHandler();
assertThat(v2TouchHandlerA).isSameAs(v2TouchHandlerB);
}
@Test
void v2TouchHandlerChangesWhenNewTouchHandlerChanges() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
newLine.setTouchHandler(new ExampleNewTouchHandler());
com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler v2TouchHandlerA = v2Line.getTouchHandler();
newLine.setTouchHandler(new ExampleNewTouchHandler());
com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler v2TouchHandlerB = v2Line.getTouchHandler();
assertThat(v2TouchHandlerA).isNotSameAs(v2TouchHandlerB);
}
@Test
void newTouchHandlerChangesWhenV2TouchHandlerChanges() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
v2Line.setTouchHandler(new ExampleV2TouchHandler());
TouchHandler newTouchHandlerA = newLine.getTouchHandler();
v2Line.setTouchHandler(new ExampleV2TouchHandler());
TouchHandler newTouchHandlerB = newLine.getTouchHandler();
assertThat(newTouchHandlerA).isNotSameAs(newTouchHandlerB);
}
@Test
void preserveTouchHandlerInstancesWhenUsingNewAPI() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleV2TouchHandler v2TouchHandler = new ExampleV2TouchHandler();
v2Line.setTouchHandler(v2TouchHandler);
TouchHandler newTouchHandler = newLine.getTouchHandler();
v2Line.setTouchHandler(null); // This also clears the adapter
newLine.setTouchHandler(newTouchHandler); // Return to the initial value
// Instances should be the same
assertThat(v2Line.getTouchHandler()).isSameAs(v2TouchHandler);
assertThat(newLine.getTouchHandler()).isSameAs(newTouchHandler);
}
@Test
void preserveTouchHandlerInstancesWhenUsingV2API() {
APITextLine newLine = new APITextLine(hologram, "");
TextLine v2Line = newLine.getV2Adapter();
ExampleNewTouchHandler newTouchHandler = new ExampleNewTouchHandler();
newLine.setTouchHandler(newTouchHandler);
com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler v2TouchHandler = v2Line.getTouchHandler();
v2Line.setTouchHandler(null); // This also clears the adapter
v2Line.setTouchHandler(v2TouchHandler); // Return to the initial value
// Instances should be the same
assertThat(v2Line.getTouchHandler()).isSameAs(v2TouchHandler);
assertThat(newLine.getTouchHandler()).isSameAs(newTouchHandler);
}
private static class ExampleNewTouchHandler implements TouchHandler {
@Override
public void onTouch(Player player) {}
}
private static class ExampleV2TouchHandler implements com.gmail.filoghost.holographicdisplays.api.handler.TouchHandler {
@Override
public void onTouch(Player player) {}
}
}