Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ build/
!**/src/main/**/build/
!**/src/test/**/build/

# Compiled class files
*.class

### IntelliJ IDEA ###
.idea/
.idea/modules.xml
Expand Down
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ allprojects {

dependencies {
implementation("de.exlll:configlib-yaml:4.6.3")
compileOnly("net.kyori:adventure-api:4.25.0")
compileOnly("net.kyori:adventure-text-minimessage:4.25.0")
compileOnly("net.kyori:adventure-api:5.2.0")
compileOnly("net.kyori:adventure-text-minimessage:5.2.0")
compileOnly("me.clip:placeholderapi:2.11.6")
compileOnly("io.github.miniplaceholders:miniplaceholders-api:3.0.1")

Expand Down
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pluginName=FancyTags
version=unspecified
version=0.1.0-SNAPSHOT
org.gradle.java.home=C:/Program Files/Eclipse Adoptium/jdk-21.0.11.10-hotspot
5 changes: 5 additions & 0 deletions paper/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@ repositories {
name = "papermc-repo"
url = "https://repo.papermc.io/repository/maven-public/"
}
maven {
name = "arim-mvn-lgpl3"
url = "https://mvn-repo.arim.space/lesser-gpl3/"
}
}

dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT")
implementation("space.arim.morepaperlib:morepaperlib:0.4.3")
implementation("org.bstats:bstats-bukkit:3.0.2")
implementation(project(":common"))
implementation(project(":plugin"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@

package dev.vatten.baserad;

import org.bukkit.scheduler.BukkitTask;

public class BukkitScheduledTask extends ScheduledTask<BukkitTask> {
public BukkitScheduledTask(BukkitTask task) {
public class BukkitScheduledTask extends ScheduledTask<space.arim.morepaperlib.scheduling.ScheduledTask> {
public BukkitScheduledTask(space.arim.morepaperlib.scheduling.ScheduledTask task) {
super(task);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public boolean persist() {
@Override
public @Nullable String onPlaceholderRequest(Player player, @NotNull String params) {
if(plugin.getTagStore().getTagNames().contains(params)) {
return plugin.getMiniMessage().serialize(plugin.getTagStore().getTag(params).asComponent());
return plugin.getTagStore().getTag(params).asMiniMessage();
}
return null;
}
Expand Down
49 changes: 37 additions & 12 deletions paper/src/main/java/dev/vatten/baserad/PaperVattenPlatform.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,45 +29,46 @@
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import org.jspecify.annotations.Nullable;
import space.arim.morepaperlib.MorePaperLib;

import java.util.Collection;

public class PaperVattenPlatform extends JavaPlugin implements VattenPlatform<Player, BukkitTask>, Listener {
public class PaperVattenPlatform extends JavaPlugin implements VattenPlatform<Player, space.arim.morepaperlib.scheduling.ScheduledTask>, Listener {
private VattenPlugin plugin;
private MorePaperLib morePaperLib;
private boolean papiRegistered;
private boolean miniPlaceholdersRegistered;

@Override
public void onEnable() {
this.morePaperLib = new MorePaperLib(this);
this.plugin = new Plugin(
this,
VattenPlugin.Type.SERVER,
this.getDataFolder().toPath()
);

if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
new PaperFancyTagsExpansion((Plugin) this.plugin).register();
}

if (Bukkit.getPluginManager().isPluginEnabled("MiniPlaceholders")) {
((Plugin) this.plugin).registerMiniPlaceholders();
}

getServer().getPluginManager().registerEvents(this, this);

registerExpansions();

int pluginId = 27900;
Metrics metrics = new Metrics(this, pluginId);
}

@Override
public BukkitScheduledTask scheduleTask(Runnable runnable, int delay) {
return new BukkitScheduledTask(getServer().getScheduler().runTaskLater(this, runnable, delay/50));
long initialDelayTicks = Math.max(1L, delay / 50L);
return new BukkitScheduledTask(morePaperLib.scheduling().globalRegionalScheduler().runDelayed(runnable, initialDelayTicks));
}

@Override
public BukkitScheduledTask scheduleRepeatingTask(Runnable runnable, int delay, int period) {
return new BukkitScheduledTask(getServer().getScheduler().runTaskTimer(this, runnable, delay/50, period/50));
long initialDelayTicks = Math.max(1L, delay / 50L);
return new BukkitScheduledTask(morePaperLib.scheduling().globalRegionalScheduler().runAtFixedRate(runnable, initialDelayTicks, period / 50L));
}

@Override
Expand Down Expand Up @@ -97,6 +98,26 @@ public VattenPlayer wrapPlayer(Player player) {
return new VattenPlayer(player.getUniqueId(), player.getName(), player);
}

private void registerExpansions() {
if (!papiRegistered && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
new PaperFancyTagsExpansion((Plugin) this.plugin).register();
papiRegistered = true;
}

if (!miniPlaceholdersRegistered && Bukkit.getPluginManager().isPluginEnabled("MiniPlaceholders")) {
((Plugin) this.plugin).registerMiniPlaceholders();
miniPlaceholdersRegistered = true;
}
}

@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
String name = event.getPlugin().getName();
if ("PlaceholderAPI".equals(name) || "MiniPlaceholders".equals(name)) {
registerExpansions();
}
}

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
plugin.getEventHandler().dispatchEvent(new dev.vatten.baserad.events.PlayerJoinEvent(wrapPlayer(event.getPlayer())));
Expand All @@ -111,4 +132,8 @@ public void onPlayerLeave(PlayerQuitEvent event) {
public void onPlayerLoadedIn(PlayerClientLoadedWorldEvent event) {
plugin.getEventHandler().dispatchEvent(new PlayerLoadInEvent(wrapPlayer(event.getPlayer())));
}

public VattenPlugin getPlugin() {
return this.plugin;
}
}
2 changes: 2 additions & 0 deletions paper/src/main/resources/paper-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ name: "${pluginName}"
version: "${version}"
main: "dev.vatten.baserad.PaperVattenPlatform"
api-version: '1.21.11'
folia-supported: true
load: STARTUP

dependencies:
server:
Expand Down
13 changes: 11 additions & 2 deletions plugin/src/main/java/dev/vatten/baserad/Plugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import java.util.function.Consumer;

public class Plugin extends VattenPlugin {
private MiniMessage MINIMESSAGE = null;
private MiniMessage MINIMESSAGE;
private ConfigInstance<PluginConfig> PLUGIN_CONFIG;
private ConfigInstance<TagsConfig> TAGS_CONFIG;
@Getter
Expand Down Expand Up @@ -75,7 +75,7 @@ protected void onEnable() {

getEventHandler().registerEventHandler(PlayerLoadInEvent.class, this::onPlayerLoadIn);

MINIMESSAGE = MiniMessage.builder().tags(TagResolver.builder().resolver(StandardTags.defaults()).resolver(TagResolver.resolver("fancytags", (ArgumentQueue queue, Context ctx) -> Tag.selfClosingInserting(getTagStore().getTag(queue.pop().value()).asComponent()))).resolver(TagResolver.resolver("fancytags_internal", (ArgumentQueue queue, Context ctx) -> Tag.selfClosingInserting(getInternalTagStore().getTag(queue.pop().value()).asComponent()))).build()).build();
getMiniMessage();
}

@Override
Expand Down Expand Up @@ -128,6 +128,15 @@ TagsConfig getTagsConfig() {
}

public MiniMessage getMiniMessage() {
if(MINIMESSAGE == null) {
MINIMESSAGE = MiniMessage.builder()
.tags(TagResolver.builder()
.resolver(StandardTags.defaults())
.resolver(TagResolver.resolver("fancytags", (ArgumentQueue queue, Context ctx) -> Tag.selfClosingInserting(getTagStore().getTag(queue.pop().value()).asComponent())))
.resolver(TagResolver.resolver("fancytags_internal", (ArgumentQueue queue, Context ctx) -> Tag.selfClosingInserting(getInternalTagStore().getTag(queue.pop().value()).asComponent())))
.build()
).build();
}
return MINIMESSAGE;
}

Expand Down
50 changes: 47 additions & 3 deletions plugin/src/main/java/dev/vatten/baserad/Tag.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,70 @@
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage;

import dev.vatten.baserad.symbols.PlayerSymbol;
import java.util.ArrayList;
import java.util.List;

@Configuration
@NoArgsConstructor
public class Tag implements Renderable {
private List<Symbol> symbols;
private String fallback;
private transient Component component;
private transient String miniMessage;

public Tag(List<Symbol> symbols) {
this.symbols = symbols;
}

public String getFallback() {
return fallback;
}

public void setFallback(String fallback) {
this.fallback = fallback;
}

Component serialize(MiniMessage miniMessage) {
return serialize(miniMessage, "");
}

Component serialize(MiniMessage miniMessage, String key) {
TextComponent.Builder componentBuilder = Component.text();
for(Symbol symbol : symbols) {
componentBuilder.append(symbol.serialize());
StringBuilder minimessageBuilder = new StringBuilder();

List<PlayerSymbol> headSymbols = new ArrayList<>();
for (Symbol symbol : symbols) {
if (symbol instanceof PlayerSymbol playerSymbol) {
headSymbols.add(playerSymbol);
}
}

int numHeads = headSymbols.size();
String fallbackStr = (this.fallback != null && !this.fallback.isEmpty()) ? this.fallback : key;

int headIndex = 0;
for (Symbol symbol : symbols) {
if (symbol instanceof PlayerSymbol playerSymbol) {
Component fallbackComponent;
if (fallbackStr.length() == numHeads) {
fallbackComponent = Component.text(String.valueOf(fallbackStr.charAt(headIndex)));
} else {
if (headIndex == 0) {
fallbackComponent = Component.text(fallbackStr);
} else {
fallbackComponent = Component.text("");
}
}
componentBuilder.append(playerSymbol.serialize(fallbackComponent));
headIndex++;
} else {
componentBuilder.append(symbol.serialize());
}
minimessageBuilder.append(symbol.serializeMiniMessage());
}
this.component = componentBuilder.build();
this.miniMessage = miniMessage.serialize(this.component);
this.miniMessage = minimessageBuilder.toString();
return this.component;
}

Expand Down
7 changes: 6 additions & 1 deletion plugin/src/main/java/dev/vatten/baserad/TagStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,16 @@ int getTagAtlasLength() {
return tagAtlasLength;
}

public void saveAndRefresh() {
refresh();
plugin.saveTags();
}

private void refresh() {
List<String> names = new ArrayList<>();
Component atlas = Component.empty();
for(Map.Entry<String, Tag> entry : tags.entrySet()) {
Component serialized = entry.getValue().serialize(plugin.getMiniMessage());
Component serialized = entry.getValue().serialize(plugin.getMiniMessage(), entry.getKey());
names.add(entry.getKey());
atlas = atlas.append(serialized);
tagAtlasLength += entry.getValue().getLength();
Expand Down
47 changes: 45 additions & 2 deletions plugin/src/main/java/dev/vatten/baserad/commands/TagsCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,44 @@ public TagsCommand(Plugin plugin, Path importDirectory) {
public void execute(VattenPlayer player, String[] args) {
TagStore tagStore = plugin.getTagStore();
if(args.length >= 1) {
if(args[0].equalsIgnoreCase("fallback")) {
if(args.length == 1) {
player.sendMessage(TextFormatter.WARN.format("Usage: /tags fallback <tag> [value]"));
return;
}
if(!tagStore.getTagNames().contains(args[1])) {
player.sendMessage(TextFormatter.WARN.format("No tag corresponding to the name '" + args[1] + "' was found."));
return;
}
Tag tag = tagStore.getTag(args[1]);
if(args.length == 2) {
String currentFallback = tag.getFallback();
if(currentFallback == null || currentFallback.isEmpty()) {
player.sendMessage(plugin.getPluginTextFormatter().format(TextFormatter.INFO.format("Tag '" + args[1] + "' fallback is not set (defaulting to: '" + args[1] + "').")));
} else {
player.sendMessage(plugin.getPluginTextFormatter().format(TextFormatter.INFO.format("Tag '" + args[1] + "' fallback is set to: '" + currentFallback + "'.")));
}
return;
}

StringBuilder builder = new StringBuilder();
for(int i = 2; i < args.length; i++) {
if(i > 2) builder.append(" ");
builder.append(args[i]);
}
String fallbackValue = builder.toString();

if(fallbackValue.equalsIgnoreCase("clear") || fallbackValue.equalsIgnoreCase("reset") || fallbackValue.equalsIgnoreCase("none")) {
tag.setFallback(null);
tagStore.saveAndRefresh();
player.sendMessage(plugin.getPluginTextFormatter().format(TextFormatter.SUCCESS.format("Tag '" + args[1] + "' fallback has been cleared.")));
} else {
tag.setFallback(fallbackValue);
tagStore.saveAndRefresh();
player.sendMessage(plugin.getPluginTextFormatter().format(TextFormatter.SUCCESS.format("Tag '" + args[1] + "' fallback has been set to: '" + fallbackValue + "'.")));
}
return;
}
if(args[0].equalsIgnoreCase("reload")) {
plugin.getApi().reload();
player.sendMessage(plugin.getPluginTextFormatter().format(TextFormatter.SUCCESS.format("Tags plugin has been reloaded!")));
Expand Down Expand Up @@ -145,14 +183,19 @@ public void execute(VattenPlayer player, String[] args) {
public List<String> onTabComplete(VattenPlayer player, String[] args) {
List<String> completions = new ArrayList<>();
if(args.length <= 1) {
completions.addAll(List.of("reload", "list", "view", "rename", "delete"));
completions.addAll(List.of("reload", "list", "view", "rename", "delete", "fallback"));
completions.add(generateCommand.getName());
}
if(args.length == 2) {
if(List.of("view", "rename", "delete").contains(args[0].toLowerCase())) {
if(List.of("view", "rename", "delete", "fallback").contains(args[0].toLowerCase())) {
completions.addAll(plugin.getTagStore().getTagNames());
}
}
if(args.length == 3) {
if(args[0].equalsIgnoreCase("fallback")) {
completions.addAll(List.of("clear", "reset", "none"));
}
}
if(args.length > 1) {
List<String> check = new ArrayList<>();
check.add(generateCommand.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,9 @@ public AtlasSymbol(String atlas, String sprite) {
public Component serialize() {
return Component.object(ObjectContents.sprite(Key.key(this.atlas), Key.key(this.sprite)));
}

@Override
public String serializeMiniMessage() {
return "<sprite:" + this.atlas + ":" + this.sprite + ">";
}
}
Loading