diff --git a/src/client/java/com/padbro/greeterbro/client/config/GreeterBroConfig.java b/src/client/java/com/padbro/greeterbro/client/config/GreeterBroConfig.java index df202ee..39628d2 100644 --- a/src/client/java/com/padbro/greeterbro/client/config/GreeterBroConfig.java +++ b/src/client/java/com/padbro/greeterbro/client/config/GreeterBroConfig.java @@ -26,6 +26,10 @@ public class GreeterBroConfig extends PartitioningSerializer.GlobalData { @ConfigEntry.Gui.TransitiveObject public NameChangeConfig nameChangeConfig = new NameChangeConfig(); + @ConfigEntry.Category("specialGreetings") + @ConfigEntry.Gui.TransitiveObject + public SpecialGreetingsConfig specialGreetings = new SpecialGreetingsConfig(); + @ConfigEntry.Category("blacklist") @ConfigEntry.Gui.TransitiveObject public BlacklistConfig blacklistConfig = new BlacklistConfig(); diff --git a/src/client/java/com/padbro/greeterbro/client/config/SpecialGreetingsConfig.java b/src/client/java/com/padbro/greeterbro/client/config/SpecialGreetingsConfig.java new file mode 100644 index 0000000..6512123 --- /dev/null +++ b/src/client/java/com/padbro/greeterbro/client/config/SpecialGreetingsConfig.java @@ -0,0 +1,58 @@ +package com.padbro.greeterbro.client.config; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import me.shedaniel.autoconfig.ConfigData; +import me.shedaniel.autoconfig.annotation.Config; +import me.shedaniel.autoconfig.annotation.ConfigEntry; + +@Config(name = "specialGreetings") +public class SpecialGreetingsConfig implements ConfigData { + @ConfigEntry.Gui.Tooltip public List specialGreetings = List.of(); + + public static class SpecialGreeting { + @ConfigEntry.Gui.Tooltip String player; + + @ConfigEntry.Gui.Tooltip + @ConfigEntry.BoundedDiscrete(max = 100) + public int greetingChance; + + @ConfigEntry.Gui.Tooltip public List greetings; + + @ConfigEntry.Gui.Tooltip public List returningGreetings; + + SpecialGreeting() { + this.player = ""; + this.greetingChance = 100; + this.greetings = List.of("Good to see you", "I was waiting for you"); + this.returningGreetings = List.of("You are back :D", "Where have you been?"); + } + } + + public Optional getForPlayer(String player) { + return this.specialGreetings.stream() + .filter(specialGreeting -> player.equals(specialGreeting.player)) + .findFirst(); + } + + @Override + public void validatePostLoad() { + this.specialGreetings = + this.specialGreetings.stream() + .filter( + specialGreeting -> { + if (Objects.equals(specialGreeting.player, "")) { + return false; + } + specialGreeting.greetings = + specialGreeting.greetings.stream().filter(s -> !s.trim().isEmpty()).toList(); + specialGreeting.returningGreetings = + specialGreeting.returningGreetings.stream() + .filter(s -> !s.trim().isEmpty()) + .toList(); + return true; + }) + .toList(); + } +} diff --git a/src/client/java/com/padbro/greeterbro/client/mixin/ChatMixin.java b/src/client/java/com/padbro/greeterbro/client/mixin/ChatMixin.java index 6014d24..be6a44d 100644 --- a/src/client/java/com/padbro/greeterbro/client/mixin/ChatMixin.java +++ b/src/client/java/com/padbro/greeterbro/client/mixin/ChatMixin.java @@ -6,8 +6,10 @@ import com.padbro.greeterbro.client.TickManager; import com.padbro.greeterbro.client.TickManager.ScheduledTask; import com.padbro.greeterbro.client.config.GreeterBroConfig; +import com.padbro.greeterbro.client.config.SpecialGreetingsConfig.SpecialGreeting; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Random; import java.util.regex.Pattern; import net.minecraft.client.MinecraftClient; @@ -64,20 +66,31 @@ public void onMessage(Text message, boolean overlay, CallbackInfo ci) { if (config.blacklistConfig.players.contains(player)) { return; } + if (!config.generalConfig.enableOwnJoin && player.equals(currentPlayerName)) { return; } + Optional specialGreeting = config.specialGreetings.getForPlayer(player); + if (specialGreeting.isPresent()) { + greetingList = specialGreeting.get().greetings; + chance = specialGreeting.get().greetingChance; + } + JoinCache joinCache = GreeterBroClient.getJoinCache(); if (config.returningPlayerConfig.enable) { if (joinCache.hasRecentlyJoined(player)) { return; } - if (joinCache.hasJoined(player) - && !player.equals(MinecraftClient.getInstance().player.getName().getString())) { - greetingList = config.returningPlayerConfig.greetings; - chance = config.returningPlayerConfig.greetingChance; + if (joinCache.hasJoined(player) && !player.equals(currentPlayerName)) { + if (specialGreeting.isPresent()) { + greetingList = specialGreeting.get().returningGreetings; + chance = specialGreeting.get().greetingChance; + } else { + greetingList = config.returningPlayerConfig.greetings; + chance = config.returningPlayerConfig.greetingChance; + } } } diff --git a/src/client/java/com/padbro/greeterbro/client/mixin/OnGameJoinMixin.java b/src/client/java/com/padbro/greeterbro/client/mixin/OnGameJoinMixin.java index 7fa7164..0fd91b0 100644 --- a/src/client/java/com/padbro/greeterbro/client/mixin/OnGameJoinMixin.java +++ b/src/client/java/com/padbro/greeterbro/client/mixin/OnGameJoinMixin.java @@ -47,11 +47,15 @@ public void onReady(GameJoinS2CPacket packet, CallbackInfo ci) { new TickManager.ScheduledTask( config.generalConfig.delayRange.getRandomDelay(), () -> { + ClientPlayerEntity currentPlayer = MinecraftClient.getInstance().player; + if (currentPlayer == null) { + return; + } Random rand = new Random(); String greetingTemplate = greetingList.get(rand.nextInt(greetingList.size())); String greeting = greetingTemplate.replaceAll("\\s*%player%", ""); if (!greeting.isEmpty()) { - player.networkHandler.sendChatMessage(greeting); + currentPlayer.networkHandler.sendChatMessage(greeting); } }, player.getName().getString())); diff --git a/src/client/java/com/padbro/greeterbro/client/mixin/OnPlayerListMixin.java b/src/client/java/com/padbro/greeterbro/client/mixin/OnPlayerListMixin.java index ed4d42e..56f55dd 100644 --- a/src/client/java/com/padbro/greeterbro/client/mixin/OnPlayerListMixin.java +++ b/src/client/java/com/padbro/greeterbro/client/mixin/OnPlayerListMixin.java @@ -15,16 +15,22 @@ public class OnPlayerListMixin { @Inject(method = "onPlayerList", at = @At("TAIL")) private void onPlayerList(PlayerListS2CPacket packet, CallbackInfo ci) { + if (!GreeterBroClient.isJoining) { + return; + } + GreeterBroConfig config = GreeterBroClient.getConfig(); - if (GreeterBroClient.isJoining && config.returningPlayerConfig.cacheOnJoin) { - List players = packet.getPlayerAdditionEntries(); - JoinCache joinCache = GreeterBroClient.getJoinCache(); - for (PlayerListS2CPacket.Entry entry : players) { - if (entry.profile() != null) { - joinCache.add(entry.profile().name()); - } + if (!config.returningPlayerConfig.cacheOnJoin) { + return; + } + + List players = packet.getPlayerAdditionEntries(); + JoinCache joinCache = GreeterBroClient.getJoinCache(); + for (PlayerListS2CPacket.Entry entry : players) { + if (entry.profile() != null) { + joinCache.add(entry.profile().name()); } - GreeterBroClient.isJoining = false; } + GreeterBroClient.isJoining = false; } } diff --git a/src/client/resources/assets/greeterbro/lang/en_us.json b/src/client/resources/assets/greeterbro/lang/en_us.json index b440d6d..616b139 100644 --- a/src/client/resources/assets/greeterbro/lang/en_us.json +++ b/src/client/resources/assets/greeterbro/lang/en_us.json @@ -60,6 +60,20 @@ "text.autoconfig.GreeterBro.option.returningPlayerConfig.cacheClearType.never": "Never", "text.autoconfig.GreeterBro.option.returningPlayerConfig.greetings": "Greetings", "text.autoconfig.GreeterBro.option.returningPlayerConfig.greetings.@Tooltip": "List of greetings to choose from.", + + "text.autoconfig.GreeterBro.category.specialGreetings": "Special Greetings", + "text.autoconfig.GreeterBro.option.specialGreetings.specialGreetings": "List of special greetings", + "text.autoconfig.GreeterBro.option.specialGreetings.specialGreetings.@Tooltip": "The list of all special greetings for specific players.", + "text.autoconfig.GreeterBro.option.SpecialGreeting": "Special greeting", + "text.autoconfig.GreeterBro.option.SpecialGreeting.player": "Player name", + "text.autoconfig.GreeterBro.option.SpecialGreeting.player.@Tooltip": "The player this special greeting applies to.", + "text.autoconfig.GreeterBro.option.SpecialGreeting.greetingChance": "Chance to greet a player", + "text.autoconfig.GreeterBro.option.SpecialGreeting.greetingChance.@Tooltip": "100 = greet always", + "text.autoconfig.GreeterBro.option.SpecialGreeting.greetings": "Greetings", + "text.autoconfig.GreeterBro.option.SpecialGreeting.greetings.@Tooltip": "List of greetings to choose from.", + "text.autoconfig.GreeterBro.option.SpecialGreeting.returningGreetings": "Returning greetings", + "text.autoconfig.GreeterBro.option.SpecialGreeting.returningGreetings.@Tooltip": "List of greetings to use when the player returns.\nRequires the \"Returning player\" config to be enabled.", + "text.autoconfig.GreeterBro.category.blacklist": "Blacklist", "text.autoconfig.GreeterBro.option.blacklistConfig.players": "Players", "text.autoconfig.GreeterBro.title": "GreeterBro",