diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/fancyholograms/ConfigCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/fancyholograms/ConfigCMD.java index 572f592a..7f0460d1 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/fancyholograms/ConfigCMD.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/fancyholograms/ConfigCMD.java @@ -22,7 +22,7 @@ public final class ConfigCMD { private ConfigCMD() { } - @Command("fancyholograms config show") + @Command("fancyholograms-new config show") @Description("Shows the current configuration") @CommandPermission("fancyholograms.commands.fancyholograms.config.show") public void show( diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/TraitCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/TraitCMD.java new file mode 100644 index 00000000..0a61250c --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/TraitCMD.java @@ -0,0 +1,73 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.hologram; + +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.api.trait.HologramTraitRegistry; +import com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions.AttachedTraitsSuggestion; +import com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions.DetachedTraitsSuggestion; +import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin; +import de.oliver.fancylib.translations.Translator; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.SuggestWith; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +public final class TraitCMD { + + public static final TraitCMD INSTANCE = new TraitCMD(); + + private final FancyHologramsPlugin plugin = FancyHologramsPlugin.get(); + private final Translator translator = FancyHologramsPlugin.get().getTranslator(); + + private TraitCMD() { + } + + @Command("hologram-new edit trait attach ") + @Description("Attaches a trait to a hologram") + @CommandPermission("fancyholograms.commands.hologram.trait.attach") + public void attach( + final @NotNull BukkitCommandActor actor, + final @NotNull Hologram hologram, + final @NotNull @SuggestWith(AttachedTraitsSuggestion.class) HologramTraitRegistry.TraitInfo trait + ) { + if (hologram.getData().getTraitTrait().isTraitAttached(trait.clazz())) { + translator.translate("commands.hologram.edit.trait.attach.already_attached") + .replace("hologram", hologram.getData().getName()) + .replace("name", trait.name()) + .send(actor.sender()); + return; + } + + hologram.getData().addTrait(trait.clazz()); + + translator.translate("commands.hologram.edit.trait.attach.success") + .replace("hologram", hologram.getData().getName()) + .replace("name", trait.name()) + .send(actor.sender()); + } + + @Command("hologram-new edit trait detach ") + @Description("Detaches a trait to a hologram") + @CommandPermission("fancyholograms.commands.hologram.trait.detach") + public void detach( + final @NotNull BukkitCommandActor actor, + final @NotNull Hologram hologram, + final @SuggestWith(DetachedTraitsSuggestion.class) @NotNull HologramTraitRegistry.TraitInfo trait + ) { + if (!hologram.getData().getTraitTrait().isTraitAttached(trait.clazz())) { + translator.translate("commands.hologram.edit.trait.detach.not_attached") + .replace("hologram", hologram.getData().getName()) + .replace("name", trait.name()) + .send(actor.sender()); + return; + } + + hologram.getData().getTraitTrait().removeTrait(trait.clazz()); + + translator.translate("commands.hologram.edit.trait.detach.success") + .replace("hologram", hologram.getData().getName()) + .replace("name", trait.name()) + .send(actor.sender()); + } +} diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/AttachedTraitsSuggestion.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/AttachedTraitsSuggestion.java new file mode 100644 index 00000000..1bf79732 --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/AttachedTraitsSuggestion.java @@ -0,0 +1,29 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions; + +import com.fancyinnovations.fancyholograms.api.FancyHolograms; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.api.trait.HologramTraitRegistry; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Collection; +import java.util.List; + +public class AttachedTraitsSuggestion implements SuggestionProvider { + + @Override + public @NotNull Collection getSuggestions(@NotNull ExecutionContext context) { + Hologram hologram = context.getResolvedArgumentOrNull(Hologram.class); + if (hologram == null) { + return List.of(); + } + + return FancyHolograms.get().getTraitRegistry().getTraits().stream() + .filter(trait -> !trait.isDefault()) + .filter(trait -> !hologram.getData().getTraitTrait().isTraitAttached(trait.clazz())) + .map(HologramTraitRegistry.TraitInfo::name) + .toList(); + } +} diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/DetachedTraitsSuggestion.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/DetachedTraitsSuggestion.java new file mode 100644 index 00000000..c3e9b97d --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/DetachedTraitsSuggestion.java @@ -0,0 +1,27 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions; + +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.api.trait.HologramTrait; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Collection; +import java.util.List; + +public class DetachedTraitsSuggestion implements SuggestionProvider { + + @Override + public @NotNull Collection getSuggestions(@NotNull ExecutionContext context) { + Hologram hologram = context.getResolvedArgumentOrNull(Hologram.class); + if (hologram == null) { + return List.of(); + } + + return hologram.getData().getTraitTrait().getTraits() + .stream() + .map(HologramTrait::getName) + .toList(); + } +} diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java index e677f6a5..8c7a2df4 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java @@ -6,11 +6,14 @@ import com.fancyinnovations.fancyholograms.api.HologramController; import com.fancyinnovations.fancyholograms.api.HologramRegistry; import com.fancyinnovations.fancyholograms.api.data.HologramData; import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.api.trait.HologramTraitRegistry; import com.fancyinnovations.fancyholograms.commands.FancyHologramsCMD; import com.fancyinnovations.fancyholograms.commands.FancyHologramsTestCMD; import com.fancyinnovations.fancyholograms.commands.HologramCMD; import com.fancyinnovations.fancyholograms.commands.lampCommands.fancyholograms.ConfigCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.hologram.TraitCMD; import com.fancyinnovations.fancyholograms.commands.lampCommands.types.HologramCommandType; +import com.fancyinnovations.fancyholograms.commands.lampCommands.types.TraitCommandType; import com.fancyinnovations.fancyholograms.config.FHConfiguration; import com.fancyinnovations.fancyholograms.controller.HologramControllerImpl; import com.fancyinnovations.fancyholograms.converter.FHConversionRegistry; @@ -198,10 +201,9 @@ public final class FancyHologramsPlugin extends JavaPlugin implements FancyHolog public void onEnable() { new FancyLib(INSTANCE); + registerCommands(); if (configuration.useLampCommands()) { registerLampCommands(); - } else { - registerCommands(); } registerListeners(); @@ -278,12 +280,20 @@ public final class FancyHologramsPlugin extends JavaPlugin implements FancyHolog lampBuilder.parameterTypes(builder -> { builder.addParameterType(Hologram.class, HologramCommandType.INSTANCE); + builder.addParameterType(HologramTraitRegistry.TraitInfo.class, TraitCommandType.INSTANCE); }); - lampBuilder.exceptionHandler(HologramCommandType.INSTANCE); + + lampBuilder + .exceptionHandler(HologramCommandType.INSTANCE) + .exceptionHandler(TraitCommandType.INSTANCE); Lamp lamp = lampBuilder.build(); + // fancyholograms commands lamp.register(ConfigCMD.INSTANCE); + + // hologram commands + lamp.register(TraitCMD.INSTANCE); } private void registerListeners() { diff --git a/plugins/fancyholograms/src/main/resources/languages/default.yml b/plugins/fancyholograms/src/main/resources/languages/default.yml index e6f56d25..708cd455 100644 --- a/plugins/fancyholograms/src/main/resources/languages/default.yml +++ b/plugins/fancyholograms/src/main/resources/languages/default.yml @@ -15,3 +15,9 @@ messages: edit: trait: not_found: "Could not find trait {warningColor}{name}." + attach: + already_attached: "Hologram {warningColor}{hologram} already has trait {warningColor}{name} attached." + success: "Successfully attached trait {warningColor}{name} to hologram {warningColor}{hologram}." + detach: + not_attached: "Hologram {warningColor}{hologram} does not have trait {warningColor}{name} attached." + success: "Successfully detached trait {warningColor}{name} from hologram {warningColor}{hologram}."