feat: Adds support for CMI and Sainttx's Holograms plugin in new hooks

This commit is contained in:
Christian Koop 2024-02-02 23:12:08 +01:00
parent c9a93d3a08
commit 66a2abda32
No known key found for this signature in database
GPG Key ID: 89A8181384E010A3
4 changed files with 255 additions and 0 deletions

View File

@ -15,6 +15,9 @@ import java.util.stream.Collectors;
/** /**
* This hook registry makes use of priorities to automatically activate the highest priority hook that is available if no hook has been activated programmatically. * This hook registry makes use of priorities to automatically activate the highest priority hook that is available if no hook has been activated programmatically.
*/ */
// TODO: Allow multiple hooks to be active at the same time (useful for using multiple specific Eco/Protection/... hooks/plugins)
// TODO: Allow specifying a hook-name-string as "prefered" to be auto-active (maybe String[] or comma-separated String?)
// (null means use priority, otherwise try to activate the hook with the given name first)
public abstract class BaseHookRegistry<T extends Hook> extends HookRegistry<T> { public abstract class BaseHookRegistry<T extends Hook> extends HookRegistry<T> {
private final Plugin plugin; private final Plugin plugin;

View File

@ -2,7 +2,9 @@ package com.craftaro.core.hooks.hologram;
import com.craftaro.core.hooks.BaseHookRegistry; import com.craftaro.core.hooks.BaseHookRegistry;
import com.craftaro.core.hooks.HookPriority; import com.craftaro.core.hooks.HookPriority;
import com.craftaro.core.hooks.hologram.adapter.CmiHologramHook;
import com.craftaro.core.hooks.hologram.adapter.DecentHologramsHook; import com.craftaro.core.hooks.hologram.adapter.DecentHologramsHook;
import com.craftaro.core.hooks.hologram.adapter.SainttxHologramsHook;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public class HologramHookRegistry extends BaseHookRegistry<HologramHook> { public class HologramHookRegistry extends BaseHookRegistry<HologramHook> {
@ -13,5 +15,7 @@ public class HologramHookRegistry extends BaseHookRegistry<HologramHook> {
@Override @Override
public void registerDefaultHooks() { public void registerDefaultHooks() {
register(new DecentHologramsHook(), HookPriority.HIGH); register(new DecentHologramsHook(), HookPriority.HIGH);
register(new SainttxHologramsHook(), HookPriority.NORMAL);
register(new CmiHologramHook(), HookPriority.LOW);
} }
} }

View File

@ -0,0 +1,113 @@
package com.craftaro.core.hooks.hologram.adapter;
import com.Zrips.CMI.CMI;
import com.Zrips.CMI.Modules.Holograms.CMIHologram;
import com.Zrips.CMI.Modules.Holograms.HologramManager;
import com.craftaro.core.hooks.hologram.HologramHook;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class CmiHologramHook extends HologramHook {
private static final String CMI_PLUGIN_NAME = "CMI";
private final ArrayList<String> ourHologramIds = new ArrayList<>(0);
private String hologramNamePrefix;
private HologramManager cmiHologramManager;
@Override
public String getName() {
return CMI_PLUGIN_NAME;
}
@Override
public @NotNull String[] getPluginDependencies() {
return new String[] {CMI_PLUGIN_NAME};
}
@Override
public void activate(Plugin plugin) {
this.hologramNamePrefix = plugin.getClass().getName() + "-";
this.cmiHologramManager = JavaPlugin.getPlugin(CMI.class).getHologramManager();
}
@Override
public void deactivate() {
removeAll();
this.hologramNamePrefix = null;
this.cmiHologramManager = null;
}
@Override
public boolean exists(@NotNull String id) {
return this.cmiHologramManager.getByName(getHologramName(id)) != null;
}
@Override
public void create(@NotNull String id, @NotNull Location location, @NotNull List<String> lines) {
if (exists(id)) {
throw new IllegalStateException("Cannot create hologram that already exists: " + getHologramName(id));
}
CMIHologram hologram = new CMIHologram(getHologramName(id), getNormalizedLocation(location));
hologram.setLines(lines);
this.cmiHologramManager.addHologram(hologram);
hologram.update();
this.ourHologramIds.add(id);
}
@Override
public void update(@NotNull String id, @NotNull List<String> lines) {
CMIHologram hologram = this.cmiHologramManager.getByName(getHologramName(id));
if (hologram == null) {
throw new IllegalStateException("Cannot update hologram that does not exist: " + getHologramName(id));
}
hologram.setLines(lines);
hologram.update();
}
@Override
public void updateBulk(@NotNull Map<String, List<String>> hologramData) {
for (Map.Entry<String, List<String>> entry : hologramData.entrySet()) {
update(entry.getKey(), entry.getValue());
}
}
@Override
public void remove(@Nullable String id) {
CMIHologram hologram = this.cmiHologramManager.getByName(getHologramName(id));
if (hologram != null) {
this.cmiHologramManager.removeHolo(hologram);
}
this.ourHologramIds.remove(id);
}
@Override
public void removeAll() {
for (String id : this.ourHologramIds) {
CMIHologram hologram = this.cmiHologramManager.getByName(getHologramName(id));
if (hologram != null) {
this.cmiHologramManager.removeHolo(hologram);
}
}
this.ourHologramIds.clear();
this.ourHologramIds.trimToSize();
}
private String getHologramName(String id) {
if (this.hologramNamePrefix == null) {
throw new IllegalStateException("Hook has not been activated yet");
}
return this.hologramNamePrefix + id;
}
}

View File

@ -0,0 +1,135 @@
package com.craftaro.core.hooks.hologram.adapter;
import com.craftaro.core.hooks.hologram.HologramHook;
import com.sainttx.holograms.api.Hologram;
import com.sainttx.holograms.api.HologramManager;
import com.sainttx.holograms.api.HologramPlugin;
import com.sainttx.holograms.api.line.HologramLine;
import com.sainttx.holograms.api.line.TextLine;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class SainttxHologramsHook extends HologramHook {
private final ArrayList<String> ourHologramIds = new ArrayList<>(0);
private String hologramNamePrefix;
private HologramManager sainttxHologramManager;
@Override
public String getName() {
return "SainttxHolograms";
}
@Override
public @NotNull String[] getPluginDependencies() {
return new String[] {"Holograms"};
}
@Override
public void activate(Plugin plugin) {
this.hologramNamePrefix = plugin.getClass().getName() + "-";
this.sainttxHologramManager = JavaPlugin.getPlugin(HologramPlugin.class).getHologramManager();
}
@Override
public void deactivate() {
removeAll();
this.hologramNamePrefix = null;
this.sainttxHologramManager = null;
}
@Override
public boolean exists(@NotNull String id) {
return this.sainttxHologramManager.getHologram(getHologramName(id)) != null;
}
@Override
public void create(@NotNull String id, @NotNull Location location, @NotNull List<String> lines) {
if (exists(id)) {
throw new IllegalStateException("Cannot create hologram that already exists: " + getHologramName(id));
}
Hologram hologram = new Hologram(getHologramName(id), getNormalizedLocation(location), false);
for (String line : lines) {
hologram.addLine(createByReflection(hologram, line));
}
this.sainttxHologramManager.addActiveHologram(hologram);
this.ourHologramIds.add(id);
}
@Override
public void update(@NotNull String id, @NotNull List<String> lines) {
Hologram hologram = this.sainttxHologramManager.getHologram(getHologramName(id));
if (hologram == null) {
throw new IllegalStateException("Cannot update hologram that does not exist: " + getHologramName(id));
}
for (HologramLine hologramLine : hologram.getLines().toArray(new HologramLine[0])) {
hologram.removeLine(hologramLine);
}
for (String line : lines) {
hologram.addLine(new TextLine(hologram, line));
}
}
@Override
public void updateBulk(@NotNull Map<String, List<String>> hologramData) {
for (Map.Entry<String, List<String>> entry : hologramData.entrySet()) {
update(entry.getKey(), entry.getValue());
}
}
@Override
public void remove(@Nullable String id) {
removeSainttxHologramIfExists(getHologramName(id));
this.ourHologramIds.remove(id);
}
@Override
public void removeAll() {
for (String id : this.ourHologramIds) {
removeSainttxHologramIfExists(getHologramName(id));
}
this.ourHologramIds.clear();
this.ourHologramIds.trimToSize();
}
@Override
protected double getYOffset() {
return 0.5;
}
private String getHologramName(String id) {
if (this.hologramNamePrefix == null) {
throw new IllegalStateException("Hook has not been activated yet");
}
return this.hologramNamePrefix + id;
}
private void removeSainttxHologramIfExists(String name) {
Hologram hologram = this.sainttxHologramManager.getHologram(name);
if (hologram != null) {
this.sainttxHologramManager.deleteHologram(hologram);
}
}
// FIXME: This is a workaround for the compile/JVM which causes calls to the constructor to
// loading the HologramLine when loading this class, which causes a NoClassDefFoundError
// when the HologramLine class is not available at runtime.
// Des ist basically ein Design-Problem des Hook-Interface, welches Hook-Infos/-Meta und Hook-Implementierung
// in einer Klasse vereint. Best-Case wäre dass die Hook-Implementierung nie geladen wird, bis sie tatsäclich gebraucht wird.
private static HologramLine createByReflection(Hologram hologram, String line) {
try {
return TextLine.class.getConstructor(Hologram.class, String.class).newInstance(hologram, line);
} catch (ReflectiveOperationException ex) {
throw new RuntimeException(ex);
}
}
}