diff --git a/build.gradle.kts b/build.gradle.kts index da5e473..9edea2f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,24 +9,23 @@ group = "org.example" version = providers.environmentVariable("VERSION").getOrElse("1.0.0") labyMod { - defaultPackageName = "org.example" //change this to your main package name (used by all modules) + defaultPackageName = "com.rappytv.betterfriends" minecraft { registerVersion(versions.toTypedArray()) { runs { getByName("client") { - // When the property is set to true, you can log in with a Minecraft account - // devLogin = true + devLogin = true } } } } addonInfo { - namespace = "example" - displayName = "ExampleAddon" - author = "Example Author" - description = "Example Description" + namespace = "betterfriends" + displayName = "BetterFriends" + author = "RappyTV, JarDateien" + description = "We'll figure that out later" minecraftVersion = "*" version = rootProject.version.toString() } diff --git a/core/src/main/java/com/rappytv/betterfriends/BetterFriendsAddon.java b/core/src/main/java/com/rappytv/betterfriends/BetterFriendsAddon.java new file mode 100644 index 0000000..d397ce2 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/BetterFriendsAddon.java @@ -0,0 +1,34 @@ +package com.rappytv.betterfriends; + +import com.rappytv.betterfriends.config.BetterFriendsConfig; +import com.rappytv.betterfriends.interactions.FriendNoteEditorBullet; +import com.rappytv.betterfriends.interactions.FriendTogglePinBullet; +import com.rappytv.betterfriends.nametags.FriendNoteNameTag; +import net.labymod.api.addon.LabyAddon; +import net.labymod.api.client.entity.player.tag.PositionType; +import net.labymod.api.models.addon.annotation.AddonMain; + +@AddonMain +public class BetterFriendsAddon extends LabyAddon { + + @Override + protected void enable() { + this.registerSettingCategory(); + + this.labyAPI().interactionMenuRegistry().register(new FriendNoteEditorBullet(this)); + this.labyAPI().interactionMenuRegistry().register(new FriendTogglePinBullet(this)); + + for (PositionType position : PositionType.values()) { + this.labyAPI().tagRegistry().register( + "betterfriends_friendnote", + position, + new FriendNoteNameTag(this, position) + ); + } + } + + @Override + protected Class configurationClass() { + return BetterFriendsConfig.class; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/config/BetterFriendsConfig.java b/core/src/main/java/com/rappytv/betterfriends/config/BetterFriendsConfig.java new file mode 100644 index 0000000..73e096e --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/config/BetterFriendsConfig.java @@ -0,0 +1,37 @@ +package com.rappytv.betterfriends.config; + +import com.rappytv.betterfriends.config.subconfig.FriendNoteTagConfig; +import net.labymod.api.addon.AddonConfig; +import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; +import net.labymod.api.configuration.loader.property.ConfigProperty; +import net.labymod.api.configuration.settings.annotation.SettingSection; + +public class BetterFriendsConfig extends AddonConfig { + + @SwitchSetting + private final ConfigProperty enabled = new ConfigProperty<>(true); + private final FriendNoteTagConfig friendNoteTagConfig = new FriendNoteTagConfig(); + + @SettingSection("interactions") + @SwitchSetting + private final ConfigProperty noteEditorBullet = new ConfigProperty<>(true); + @SwitchSetting + private final ConfigProperty togglePinBullet = new ConfigProperty<>(true); + + @Override + public ConfigProperty enabled() { + return this.enabled; + } + + public FriendNoteTagConfig friendNoteTagConfig() { + return this.friendNoteTagConfig; + } + + public ConfigProperty noteEditorBullet() { + return this.noteEditorBullet; + } + + public ConfigProperty togglePinBullet() { + return this.togglePinBullet; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/config/subconfig/FriendNoteTagConfig.java b/core/src/main/java/com/rappytv/betterfriends/config/subconfig/FriendNoteTagConfig.java new file mode 100644 index 0000000..64d0455 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/config/subconfig/FriendNoteTagConfig.java @@ -0,0 +1,46 @@ +package com.rappytv.betterfriends.config.subconfig; + +import net.labymod.api.client.entity.player.tag.PositionType; +import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; +import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; +import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget.TextFieldSetting; +import net.labymod.api.client.gui.screen.widget.widgets.input.dropdown.DropdownWidget.DropdownSetting; +import net.labymod.api.configuration.loader.Config; +import net.labymod.api.configuration.loader.annotation.ShowSettingInParent; +import net.labymod.api.configuration.loader.property.ConfigProperty; + +public class FriendNoteTagConfig extends Config { + + @ShowSettingInParent + @SwitchSetting + private final ConfigProperty enabled = new ConfigProperty<>(true); + @SliderSetting(min = 5, max = 10) + private final ConfigProperty size = new ConfigProperty<>(10); + @SwitchSetting + private final ConfigProperty hideBackground = new ConfigProperty<>(false); + @DropdownSetting + private final ConfigProperty position = new ConfigProperty<>( + PositionType.BELOW_NAME); + @TextFieldSetting + private final ConfigProperty defaultTag = new ConfigProperty<>(""); + + public ConfigProperty enabled() { + return this.enabled; + } + + public ConfigProperty size() { + return this.size; + } + + public ConfigProperty hideBackground() { + return this.hideBackground; + } + + public ConfigProperty position() { + return this.position; + } + + public ConfigProperty defaultTag() { + return this.defaultTag; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/interactions/FriendNoteEditorBullet.java b/core/src/main/java/com/rappytv/betterfriends/interactions/FriendNoteEditorBullet.java new file mode 100644 index 0000000..7543403 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/interactions/FriendNoteEditorBullet.java @@ -0,0 +1,53 @@ +package com.rappytv.betterfriends.interactions; + +import com.rappytv.betterfriends.BetterFriendsAddon; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.labyconnect.LabyConnectSession; +import net.labymod.api.labyconnect.protocol.model.friend.Friend; +import net.labymod.api.util.concurrent.task.Task; + +import java.util.concurrent.TimeUnit; + +public class FriendNoteEditorBullet implements BulletPoint { + + private final BetterFriendsAddon addon; + private Friend friend = null; + + public FriendNoteEditorBullet(BetterFriendsAddon addon) { + this.addon = addon; + } + + @Override + public Component getTitle() { + return Component.translatable("betterfriends.interactions.editNote.title"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + // TODO: Fix this + Task.builder(this.friend::openNoteEditor).delay(5, TimeUnit.SECONDS).build().execute(); + } + + @Override + public boolean isVisible(Player player) { + if (!this.addon.configuration().noteEditorBullet().get()) return false; + + LabyConnectSession session = Laby.references().labyConnect().getSession(); + if (session == null || !session.isAuthenticated()) return false; + + Friend friend = session.getFriend(player.getUniqueId()); + if (friend == null) return false; + + this.friend = friend; + return true; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/interactions/FriendTogglePinBullet.java b/core/src/main/java/com/rappytv/betterfriends/interactions/FriendTogglePinBullet.java new file mode 100644 index 0000000..7ee0465 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/interactions/FriendTogglePinBullet.java @@ -0,0 +1,53 @@ +package com.rappytv.betterfriends.interactions; + +import com.rappytv.betterfriends.BetterFriendsAddon; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.labyconnect.LabyConnectSession; +import net.labymod.api.labyconnect.protocol.model.friend.Friend; + +public class FriendTogglePinBullet implements BulletPoint { + + private final BetterFriendsAddon addon; + private Friend friend; + + public FriendTogglePinBullet(BetterFriendsAddon addon) { + this.addon = addon; + } + + @Override + public Component getTitle() { + return Component.translatable("betterfriends.interactions.togglePin." + (this.friend.isPinned() ? "un" : "") + "pin.title"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + if (this.friend.isPinned()) { + this.friend.unpin(); + } else { + this.friend.pin(); + } + } + + @Override + public boolean isVisible(Player player) { + if (!this.addon.configuration().togglePinBullet().get()) return false; + + LabyConnectSession session = Laby.references().labyConnect().getSession(); + if (session == null || !session.isAuthenticated()) return false; + + Friend friend = session.getFriend(player.getUniqueId()); + if (friend == null) return false; + + this.friend = friend; + return true; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/nametags/FriendNoteNameTag.java b/core/src/main/java/com/rappytv/betterfriends/nametags/FriendNoteNameTag.java new file mode 100644 index 0000000..ece6d32 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/nametags/FriendNoteNameTag.java @@ -0,0 +1,83 @@ +package com.rappytv.betterfriends.nametags; + +import com.rappytv.betterfriends.BetterFriendsAddon; +import com.rappytv.betterfriends.config.BetterFriendsConfig; +import java.awt.*; +import net.labymod.api.Laby; +import net.labymod.api.client.component.serializer.legacy.LegacyComponentSerializer; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.tag.PositionType; +import net.labymod.api.client.entity.player.tag.tags.NameTag; +import net.labymod.api.client.entity.player.tag.tags.NameTagBackground; +import net.labymod.api.client.render.font.RenderableComponent; +import net.labymod.api.labyconnect.LabyConnectSession; +import net.labymod.api.labyconnect.protocol.model.friend.Friend; +import org.jetbrains.annotations.Nullable; + +public class FriendNoteNameTag extends NameTag { + + private static final LegacyComponentSerializer serializer = LegacyComponentSerializer.legacyAmpersand(); + private static final int gray = new Color(0, 0, 0, 70).getRGB(); + private final BetterFriendsConfig config; + private final PositionType position; + + public FriendNoteNameTag(BetterFriendsAddon addon, PositionType position) { + this.config = addon.configuration(); + this.position = position; + } + + @Override + protected @Nullable RenderableComponent getRenderableComponent() { + if (this.entity == null || !(this.entity instanceof Player)) { + return null; + } + + LabyConnectSession session = Laby.references().labyConnect().getSession(); + if (session == null || !session.isAuthenticated()) { + return null; + } + + Friend friend = session.getFriend(this.entity.getUniqueId()); + if (friend == null) { + return null; + } + + String note = friend.getNote(); + if (note != null && !note.isBlank()) { + return RenderableComponent.of(serializer.deserialize(note)); + } else { + String defaultTag = this.config.friendNoteTagConfig().defaultTag().get(); + if (defaultTag.isBlank()) { + return null; + } + return RenderableComponent.of(serializer.deserialize(defaultTag)); + } + } + + @Override + public float getScale() { + return (float) this.config.friendNoteTagConfig().size().get() / 10; + } + + @Override + protected NameTagBackground getCustomBackground() { + boolean enabled = !this.config.friendNoteTagConfig().hideBackground().get(); + NameTagBackground background = super.getCustomBackground(); + + if (background == null) { + background = NameTagBackground.custom(enabled, gray); + } + + background.setEnabled(enabled); + return background; + } + + @Override + public boolean isVisible() { + return this.config.enabled().get() + && this.config.friendNoteTagConfig().enabled().get() + && this.config.friendNoteTagConfig().position().get() == this.position + && !this.entity.isCrouching() + && super.isVisible(); + } +} diff --git a/core/src/main/java/org/example/core/ExampleAddon.java b/core/src/main/java/org/example/core/ExampleAddon.java deleted file mode 100644 index 47a4563..0000000 --- a/core/src/main/java/org/example/core/ExampleAddon.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.example.core; - -import net.labymod.api.addon.LabyAddon; -import net.labymod.api.models.addon.annotation.AddonMain; -import org.example.core.commands.ExamplePingCommand; -import org.example.core.listener.ExampleGameTickListener; - -@AddonMain -public class ExampleAddon extends LabyAddon { - - @Override - protected void enable() { - this.registerSettingCategory(); - - this.registerListener(new ExampleGameTickListener(this)); - this.registerCommand(new ExamplePingCommand()); - - this.logger().info("Enabled the Addon"); - } - - @Override - protected Class configurationClass() { - return ExampleConfiguration.class; - } -} diff --git a/core/src/main/java/org/example/core/ExampleConfiguration.java b/core/src/main/java/org/example/core/ExampleConfiguration.java deleted file mode 100644 index 0faafb1..0000000 --- a/core/src/main/java/org/example/core/ExampleConfiguration.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.core; - -import net.labymod.api.addon.AddonConfig; -import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; -import net.labymod.api.configuration.loader.annotation.ConfigName; -import net.labymod.api.configuration.loader.property.ConfigProperty; - -@ConfigName("settings") -public class ExampleConfiguration extends AddonConfig { - - @SwitchSetting - private final ConfigProperty enabled = new ConfigProperty<>(true); - - @Override - public ConfigProperty enabled() { - return this.enabled; - } -} diff --git a/core/src/main/java/org/example/core/commands/ExamplePingCommand.java b/core/src/main/java/org/example/core/commands/ExamplePingCommand.java deleted file mode 100644 index 5952915..0000000 --- a/core/src/main/java/org/example/core/commands/ExamplePingCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.example.core.commands; - -import net.labymod.api.client.chat.command.Command; -import net.labymod.api.client.component.Component; -import net.labymod.api.client.component.format.NamedTextColor; - -public class ExamplePingCommand extends Command { - - public ExamplePingCommand() { - super("ping", "pong"); - - this.withSubCommand(new ExamplePingSubCommand()); - } - - @Override - public boolean execute(String prefix, String[] arguments) { - if (prefix.equalsIgnoreCase("ping")) { - this.displayMessage(Component.text("Ping!", NamedTextColor.AQUA)); - return false; - } - - this.displayMessage(Component.text("Pong!", NamedTextColor.GOLD)); - return true; - } -} diff --git a/core/src/main/java/org/example/core/commands/ExamplePingSubCommand.java b/core/src/main/java/org/example/core/commands/ExamplePingSubCommand.java deleted file mode 100644 index 8c6a981..0000000 --- a/core/src/main/java/org/example/core/commands/ExamplePingSubCommand.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.core.commands; - -import net.labymod.api.client.chat.command.SubCommand; -import net.labymod.api.client.component.Component; -import net.labymod.api.client.component.format.NamedTextColor; - -public class ExamplePingSubCommand extends SubCommand { - - protected ExamplePingSubCommand() { - super("pong"); - } - - @Override - public boolean execute(String prefix, String[] arguments) { - this.displayMessage(Component.text("Ping Pong!", NamedTextColor.GRAY)); - return true; - } -} diff --git a/core/src/main/java/org/example/core/listener/ExampleGameTickListener.java b/core/src/main/java/org/example/core/listener/ExampleGameTickListener.java deleted file mode 100644 index b631b85..0000000 --- a/core/src/main/java/org/example/core/listener/ExampleGameTickListener.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.example.core.listener; - -import net.labymod.api.event.Phase; -import net.labymod.api.event.Subscribe; -import net.labymod.api.event.client.lifecycle.GameTickEvent; -import org.example.core.ExampleAddon; - -public class ExampleGameTickListener { - - private final ExampleAddon addon; - - public ExampleGameTickListener(ExampleAddon addon) { - this.addon = addon; - } - - @Subscribe - public void onGameTick(GameTickEvent event) { - if (event.phase() != Phase.PRE) { - return; - } - - this.addon.logger().info(this.addon.configuration().enabled().get() ? "enabled" : "disabled"); - } -} diff --git a/core/src/main/resources/assets/betterfriends/i18n/en_us.json b/core/src/main/resources/assets/betterfriends/i18n/en_us.json new file mode 100644 index 0000000..9cbf4db --- /dev/null +++ b/core/src/main/resources/assets/betterfriends/i18n/en_us.json @@ -0,0 +1,57 @@ +{ + "betterfriends": { + "settings": { + "header": { + "interactions": { + "name": "Interaction Bullets" + } + }, + "enabled": { + "name": "Enabled" + }, + "friendNoteTagConfig": { + "name": "Friend note tags", + "size": { + "name": "Size" + }, + "hideBackground": { + "name": "Hide background" + }, + "position": { + "name": "Position", + "entries": { + "aboveName": "Above name", + "belowName": "Below name", + "rightToName": "Right to name", + "leftToName": "Left to name" + } + }, + "defaultTag": { + "name": "Fallback tag", + "description": "You can leave this empty to disable" + } + }, + "noteEditorBullet": { + "name": "Show friend note editor bullet" + }, + "togglePinBullet": { + "name": "Show toggle pin bullet" + } + }, + "interactions": { + "editNote": { + "title": "Edit friend note" + }, + "togglePin": { + "pin": { + "title": "Pin friend", + "success": "%s was pinned!" + }, + "unpin": { + "title": "Unpin friend", + "success": "%s was unpinned!" + } + } + } + } +} diff --git a/core/src/main/resources/assets/example/i18n/en_us.json b/core/src/main/resources/assets/example/i18n/en_us.json deleted file mode 100644 index 0850d97..0000000 --- a/core/src/main/resources/assets/example/i18n/en_us.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "example": { - "settings": { - "enabled": { - "name": "Enabled" - } - } - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 1c33391..470ff09 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "labymod4-addon-template" +rootProject.name = "betterfriends" pluginManagement { val labyGradlePluginVersion = "0.5.7"