Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c190fab
Add FriendWidgets and lss code
RappyTV Mar 14, 2025
fd5e182
Implement friend list activity
RappyTV Mar 14, 2025
2ef6a7f
Optimize imports
RappyTV Mar 14, 2025
f8c003a
Fix and improve FriendWidget sorting comparator
RappyTV Mar 15, 2025
1e3afb1
Generalize AdvancedFriendListActivity
RappyTV Mar 15, 2025
a211998
Add pinned icon, improve logic of pin button
RappyTV Mar 15, 2025
5dbf8d4
Add status indicator
RappyTV Mar 15, 2025
c947349
Move advanced friend list up, add translation key
RappyTV Mar 15, 2025
054764d
Change friend list behavior, add search filter
RappyTV Mar 16, 2025
6e798a9
Translate FriendWidget
RappyTV Mar 16, 2025
29c635b
Rename NameHelper, add group sorting functionality
RappyTV Mar 16, 2025
f07a61a
Allow custom sorting with dropdown menu
RappyTV Mar 16, 2025
3ba2706
Implement removal button functionality
RappyTV Mar 16, 2025
c1cda58
Merge pull request #25 from RappyLabyAddons/feat/advanced-friend-list
RappyTV Mar 16, 2025
10fa20b
chore: Remove unused warning suppression
RappyTV Nov 4, 2025
41729c8
fix: Friend message components color depends on base component
RappyTV Nov 4, 2025
547ec12
feat: Update tag rendering
RappyTV Nov 22, 2025
f940149
chore: Remove redundant code in FriendPinIconTag
RappyTV Nov 22, 2025
63b6b49
chore: Register newer versions
RappyTV Nov 22, 2025
f437c51
fix: Fix errors
RappyTV Nov 22, 2025
d57db2e
chore: Get friend via the player profile in FriendPinBadge
RappyTV Nov 24, 2025
dc72d4b
idk: some widget stuff
RappyTV Nov 25, 2025
81c22bb
fix: Make nametag work again
RappyTV Dec 8, 2025
721a021
fix: Make "Hide background" switch work again
RappyTV Dec 8, 2025
4470831
Merge pull request #29 from RappyLabyAddons/fix/tag-rendering-system
RappyTV Dec 8, 2025
a80635b
feat: Add option to toggle interaction buttons
RappyTV Dec 8, 2025
77e5944
chore: Bump and register version
RappyTV Dec 8, 2025
577da5e
chore: Use production release channel
RappyTV Dec 8, 2025
b54d339
fix: Don't use deprecated SemanticVersion constructor
RappyTV Dec 8, 2025
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
20 changes: 20 additions & 0 deletions api/src/main/java/com/rappytv/betterfriends/api/FriendHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.rappytv.betterfriends.api;

import java.util.UUID;
import net.labymod.api.labyconnect.protocol.model.friend.Friend;
import net.labymod.api.mojang.GameProfile;
import net.labymod.api.reference.annotation.Referenceable;
import org.jetbrains.annotations.Nullable;

@Referenceable
public interface FriendHelper {

@Nullable
default Friend getFriend(GameProfile profile) {
return this.getFriend(profile.getUniqueId());
}

@Nullable
Friend getFriend(UUID uuid);

}
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
val versions = providers.gradleProperty("net.labymod.minecraft-versions").get().split(";")

group = "org.example"
version = providers.environmentVariable("VERSION").getOrElse("1.0.0")
version = providers.environmentVariable("VERSION").getOrElse("1.0.1")

labyMod {
defaultPackageName = "com.rappytv.betterfriends"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.rappytv.betterfriends;

import com.rappytv.betterfriends.api.generated.ReferenceStorage;
import com.rappytv.betterfriends.command.BetterFriendsCommand;
import com.rappytv.betterfriends.config.BetterFriendsConfig;
import com.rappytv.betterfriends.interactions.FriendNoteEditorBullet;
Expand All @@ -19,6 +20,7 @@
import com.rappytv.betterfriends.ui.hud.UnreadChatCountWidget;
import com.rappytv.betterfriends.ui.tags.FriendNoteNameTag;
import com.rappytv.betterfriends.ui.tags.FriendPinIconTag;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.Laby;
import net.labymod.api.addon.LabyAddon;
import net.labymod.api.client.component.Component;
Expand All @@ -30,17 +32,29 @@
import net.labymod.api.client.entity.player.tag.PositionType;
import net.labymod.api.client.gui.hud.binding.category.HudWidgetCategory;
import net.labymod.api.models.addon.annotation.AddonMain;
import net.labymod.api.revision.SimpleRevision;
import net.labymod.api.util.version.SemanticVersion;

@AddonMain
public class BetterFriendsAddon extends LabyAddon<BetterFriendsConfig> {

private final LegacyComponentSerializer serializer = LegacyComponentSerializer.legacyAmpersand();
private static final LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.legacyAmpersand();
private static BetterFriendsAddon instance;

@Override
protected void preConfigurationLoad() {
Laby.references().revisionRegistry().register(new SimpleRevision(
"betterfriends",
new SemanticVersion(1, 0, 1),
"2025-12-10"
));
}

@Override
protected void enable() {
instance = this;
this.registerSettingCategory();
GroupHelper.registerGroupIds();

this.registerCommand(new BetterFriendsCommand());

Expand Down Expand Up @@ -75,7 +89,7 @@ protected void enable() {
"VoiceTag",
"betterfriends_pin_icon",
PositionType.RIGHT_TO_NAME,
new FriendPinIconTag(this)
new FriendPinIconTag()
);
Laby.references().badgeRegistry().registerBefore(
"VoiceBadge",
Expand All @@ -90,6 +104,10 @@ protected Class<? extends BetterFriendsConfig> configurationClass() {
return BetterFriendsConfig.class;
}

public static ReferenceStorage references() {
return instance.referenceStorageAccessor();
}

public static TextComponent getPrefix() {
return Component.empty()
.append(Component.text(
Expand All @@ -102,6 +120,6 @@ public static TextComponent getPrefix() {
}

public LegacyComponentSerializer getSerializer() {
return this.serializer;
return SERIALIZER;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.List;
import java.util.UUID;
import com.rappytv.betterfriends.listeners.LabyChatReceiveListener;
import com.rappytv.betterfriends.utils.NameHelper;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.Laby;
import net.labymod.api.client.chat.command.Command;
import net.labymod.api.client.chat.command.SubCommand;
Expand Down Expand Up @@ -99,7 +99,7 @@ public boolean execute(String prefix, String[] arguments) {
.append(Component.translatable(
this.getTranslationKey("success.accept"),
NamedTextColor.GRAY,
NameHelper.getColoredName(request.getName(), request.gameUser())
GroupHelper.getColoredName(request.getName(), request.gameUser())
))
);
return true;
Expand Down Expand Up @@ -160,7 +160,7 @@ public boolean execute(String prefix, String[] arguments) {
.append(Component.translatable(
this.getTranslationKey("success.decline"),
NamedTextColor.GRAY,
NameHelper.getColoredName(request.getName(), request.gameUser())
GroupHelper.getColoredName(request.getName(), request.gameUser())
))
);
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,23 @@

import com.rappytv.betterfriends.config.subconfig.FriendNoteTagConfig;
import com.rappytv.betterfriends.config.subconfig.PinIconConfig;
import com.rappytv.betterfriends.ui.activities.config.FriendlistActivity;
import com.rappytv.betterfriends.ui.widgets.FriendlistFriendWidget;
import net.labymod.api.addon.AddonConfig;
import net.labymod.api.client.gui.screen.activity.Activity;
import net.labymod.api.client.gui.screen.widget.widgets.activity.settings.ActivitySettingWidget.ActivitySetting;
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.color.ColorPickerWidget.ColorPickerSetting;
import net.labymod.api.client.gui.screen.widget.widgets.input.dropdown.DropdownWidget.DropdownSetting;
import net.labymod.api.configuration.loader.annotation.IntroducedIn;
import net.labymod.api.configuration.loader.annotation.SpriteSlot;
import net.labymod.api.configuration.loader.annotation.SpriteTexture;
import net.labymod.api.configuration.loader.property.ConfigProperty;
import net.labymod.api.configuration.settings.annotation.SettingRequires;
import net.labymod.api.configuration.settings.annotation.SettingSection;
import net.labymod.api.util.Color;
import net.labymod.api.util.MethodOrder;

@SpriteTexture("settings.png")
public class BetterFriendsConfig extends AddonConfig {
Expand All @@ -21,13 +27,23 @@ public class BetterFriendsConfig extends AddonConfig {
@SpriteSlot
@SwitchSetting
private final ConfigProperty<Boolean> enabled = new ConfigProperty<>(true);

@SpriteSlot(x = 1)
@ColorPickerSetting
private final ConfigProperty<Color> prefixColor = new ConfigProperty<>(Color.ofRGB(255, 102, 0));

@MethodOrder(after = "prefixColor")
@ActivitySetting
public Activity advancedFriendlist() {
return new FriendlistActivity<>(FriendlistFriendWidget::new);
}

@SpriteSlot(size = 8, x = 4)
private final PinIconConfig pinIconConfig = new PinIconConfig();

@SpriteSlot(x = 3)
private final FriendNoteTagConfig friendNoteTagConfig = new FriendNoteTagConfig();

@SpriteSlot(x = 4)
@TextFieldSetting
private final ConfigProperty<String> friendPrefix = new ConfigProperty<>("&aⒻ");
Expand All @@ -36,31 +52,43 @@ public class BetterFriendsConfig extends AddonConfig {
@SpriteSlot(x = 5)
@SwitchSetting
private final ConfigProperty<Boolean> friendRequestNotifications = new ConfigProperty<>(true);

@SettingRequires("friendRequestNotifications")
@SpriteSlot(x = 6)
@DropdownSetting
private final ConfigProperty<FriendRequestReaction> automaticFriendRequestReaction = new ConfigProperty<>(
FriendRequestReaction.NONE);

@SpriteSlot(x = 7)
@SwitchSetting
private final ConfigProperty<Boolean> friendServerSwitchNotifications = new ConfigProperty<>(true);

@SpriteSlot(y = 1)
@SwitchSetting
private final ConfigProperty<Boolean> friendStatusUpdateNotifications = new ConfigProperty<>(true);

@SpriteSlot(x = 1, y = 1)
@SwitchSetting
private final ConfigProperty<Boolean> friendRemovalNotifications = new ConfigProperty<>(true);

@SpriteSlot(x = 2, y = 1)
@SwitchSetting
private final ConfigProperty<Boolean> friendRequestRemovalNotifications = new ConfigProperty<>(true);

@SpriteSlot(x = 3, y = 1)
@SwitchSetting
private final ConfigProperty<Boolean> labyChatMessageNotifications = new ConfigProperty<>(true);

@SettingRequires("labyChatMessageNotifications")
@SpriteSlot(x = 4, y = 1)
@SwitchSetting
private final ConfigProperty<Boolean> ownLabyChatMessages = new ConfigProperty<>(true);

@SettingRequires("labyChatMessageNotifications")
@IntroducedIn(namespace = "betterfriends", value = "1.0.1")
@SwitchSetting
private final ConfigProperty<Boolean> showInteractionButtons = new ConfigProperty<>(true);

@SettingSection(value = "interactions", center = true)
// @SpriteSlot(x = 5, y = 1)
// @SwitchSetting
Expand All @@ -78,50 +106,65 @@ public class BetterFriendsConfig extends AddonConfig {
public ConfigProperty<Boolean> enabled() {
return this.enabled;
}

public ConfigProperty<Color> prefixColor() {
return this.prefixColor;
}

public PinIconConfig pinIconConfig() {
return this.pinIconConfig;
}
public FriendNoteTagConfig friendNoteTagConfig() {
return this.friendNoteTagConfig;
}

public ConfigProperty<String> friendPrefix() {
return this.friendPrefix;
}

public ConfigProperty<Boolean> friendRequestNotifications() {
return this.friendRequestNotifications;
}

public ConfigProperty<FriendRequestReaction> automaticFriendRequestReaction() {
return this.automaticFriendRequestReaction;
}

public ConfigProperty<Boolean> friendServerSwitchNotifications() {
return this.friendServerSwitchNotifications;
}

public ConfigProperty<Boolean> friendStatusUpdateNotifications() {
return this.friendStatusUpdateNotifications;
}

public ConfigProperty<Boolean> friendRemovalNotifications() {
return this.friendRemovalNotifications;
}

public ConfigProperty<Boolean> friendRequestRemovalNotifications() {
return this.friendRequestRemovalNotifications;
}

public ConfigProperty<Boolean> labyChatMessageNotifications() {
return this.labyChatMessageNotifications;
}

public ConfigProperty<Boolean> ownLabyChatMessages() {
return this.ownLabyChatMessages;
}

public ConfigProperty<Boolean> showInteractionButtons() {
return this.showInteractionButtons;
}

// public ConfigProperty<Boolean> noteEditorBullet() {
// return this.noteEditorBullet;
// }
public ConfigProperty<Boolean> togglePinBullet() {
return this.togglePinBullet;
}

public ConfigProperty<Boolean> restartWhenMuted() {
return this.restartWhenMuted;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ public void onChatReceive(ChatReceiveEvent receiveEvent) {
}

receiveEvent.setMessage(
this.addon.getSerializer()
.deserialize(this.addon.configuration().friendPrefix().get())
Component.empty()
.append(this.addon.getSerializer().deserialize(
this.addon.configuration().friendPrefix().get()
))
.append(Component.space())
.append(message)
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.rappytv.betterfriends.listeners;

import com.rappytv.betterfriends.BetterFriendsAddon;
import com.rappytv.betterfriends.utils.NameHelper;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.client.component.Component;
import net.labymod.api.client.gui.icon.Icon;
import net.labymod.api.event.Subscribe;
Expand All @@ -25,7 +25,7 @@ public void onFriendRemove(LabyConnectFriendRemoveEvent event) {
.title(Component.translatable("betterfriends.notifications.friendRemoval.title"))
.text(Component.translatable(
"betterfriends.notifications.friendRemoval.description",
NameHelper.getColoredName(event.friend())
GroupHelper.getColoredName(event.friend())
))
.icon(Icon.head(event.friend().getUniqueId(), true))
.duration(15000)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.rappytv.betterfriends.listeners;

import com.rappytv.betterfriends.BetterFriendsAddon;
import com.rappytv.betterfriends.utils.NameHelper;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.Laby;
import net.labymod.api.client.component.Component;
import net.labymod.api.client.component.event.ClickEvent;
Expand All @@ -25,7 +25,7 @@ public void onFriendRequestReceive(LabyConnectIncomingFriendRequestAddEvent even
return;
}
IncomingFriendRequest request = event.request();
Component sender = NameHelper.getColoredName(request.getName(), request.gameUser())
Component sender = GroupHelper.getColoredName(request.getName(), request.gameUser())
.hoverEvent(HoverEvent.showText(Component.translatable(
"betterfriends.general.labynet",
NamedTextColor.DARK_PURPLE
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.rappytv.betterfriends.listeners;

import com.rappytv.betterfriends.BetterFriendsAddon;
import com.rappytv.betterfriends.utils.NameHelper;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.client.component.Component;
import net.labymod.api.client.gui.icon.Icon;
import net.labymod.api.event.Subscribe;
Expand Down Expand Up @@ -34,7 +34,7 @@ public void onFriendRequestRemove(LabyConnectOutgoingFriendRequestRemoveEvent ev
.title(Component.translatable("betterfriends.notifications.friendRequestRemoval.title"))
.text(Component.translatable(
"betterfriends.notifications.friendRequestRemoval.description",
NameHelper.getColoredName(event.request().getName(), event.request().gameUser())
GroupHelper.getColoredName(event.request().getName(), event.request().gameUser())
))
.icon(Icon.head(event.request().getUniqueId(), true))
.duration(15000)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.rappytv.betterfriends.listeners;

import com.rappytv.betterfriends.BetterFriendsAddon;
import com.rappytv.betterfriends.utils.NameHelper;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.client.component.Component;
import net.labymod.api.client.component.event.ClickEvent;
import net.labymod.api.client.component.event.HoverEvent;
Expand Down Expand Up @@ -68,7 +68,7 @@ public void onServerUpdate(LabyConnectFriendServerEvent event) {
this.addon.displayMessage(
Component.empty()
.append(BetterFriendsAddon.getPrefix())
.append(NameHelper.getColoredName(friend))
.append(GroupHelper.getColoredName(friend))
.append(Component.space())
.append(text)
.color(NamedTextColor.GRAY)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.rappytv.betterfriends.listeners;

import com.rappytv.betterfriends.BetterFriendsAddon;
import com.rappytv.betterfriends.utils.NameHelper;
import com.rappytv.betterfriends.utils.GroupHelper;
import net.labymod.api.client.component.Component;
import net.labymod.api.client.component.format.NamedTextColor;
import net.labymod.api.event.Subscribe;
Expand Down Expand Up @@ -39,7 +39,7 @@ public void onStatusUpdate(LabyConnectFriendStatusEvent event) {
.append(BetterFriendsAddon.getPrefix())
.append(Component.translatable(
"betterfriends.notifications.statusUpdate.message",
NameHelper.getColoredName(event.friend()),
GroupHelper.getColoredName(event.friend()),
stateComponent
))
.color(NamedTextColor.GRAY)
Expand Down
Loading