From 5d03a4671d580a4f0010fccc2ebdcef08fbf5885 Mon Sep 17 00:00:00 2001 From: ItsNature Date: Wed, 11 Mar 2026 01:21:34 +0100 Subject: [PATCH 1/7] Deploy as 1.2.4-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4ba5b0b1..e77d1015 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=com.lunarclient -version=1.2.3 +version=1.2.4-SNAPSHOT description=The API for interacting with Lunar Client players. org.gradle.parallel=true From bbaa1da175997ab503853c2c8917745d37bff773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bu=C4=8Dari=C4=87?= Date: Fri, 13 Mar 2026 00:19:06 +0100 Subject: [PATCH 2/7] Feature - Crystal Optimizer (#257) * Add `ServerRuleModule#CRYSTAL_OPTIMIZER` option * Update version to 1.2.4 --- .../apollo/module/serverrule/ServerRuleModule.java | 13 ++++++++++++- docs/developers/lightweight/json/packet-util.mdx | 1 + .../developers/lightweight/protobuf/packet-util.mdx | 1 + docs/developers/modules/serverrule.mdx | 6 ++++++ .../apollo/example/json/util/JsonPacketUtil.java | 1 + .../example/proto/util/ProtobufPacketUtil.java | 1 + 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/lunarclient/apollo/module/serverrule/ServerRuleModule.java b/api/src/main/java/com/lunarclient/apollo/module/serverrule/ServerRuleModule.java index 79a6a2de..b7931ea7 100644 --- a/api/src/main/java/com/lunarclient/apollo/module/serverrule/ServerRuleModule.java +++ b/api/src/main/java/com/lunarclient/apollo/module/serverrule/ServerRuleModule.java @@ -165,6 +165,16 @@ public final class ServerRuleModule extends ApolloModule { .node("max-chat-length").type(TypeToken.get(Integer.class)) .defaultValue(256).min(1).max(256).notifyClient().build(); + /** + * Whether to enable crystal optimizer. + * + * @since 1.2.4 + */ + public static final SimpleOption CRYSTAL_OPTIMIZER = Option.builder() + .comment("Set to 'true' to enable the crystal optimizer, otherwise 'false'.") + .node("crystal-optimizer").type(TypeToken.get(Boolean.class)) + .defaultValue(false).notifyClient().build(); + ServerRuleModule() { this.registerOptions( ServerRuleModule.COMPETITIVE_GAME, @@ -178,7 +188,8 @@ public final class ServerRuleModule extends ApolloModule { ServerRuleModule.OVERRIDE_NAMETAG_RENDER_DISTANCE, ServerRuleModule.NAMETAG_RENDER_DISTANCE, ServerRuleModule.OVERRIDE_MAX_CHAT_LENGTH, - ServerRuleModule.MAX_CHAT_LENGTH + ServerRuleModule.MAX_CHAT_LENGTH, + ServerRuleModule.CRYSTAL_OPTIMIZER ); } diff --git a/docs/developers/lightweight/json/packet-util.mdx b/docs/developers/lightweight/json/packet-util.mdx index b7263a48..1a3a12e7 100644 --- a/docs/developers/lightweight/json/packet-util.mdx +++ b/docs/developers/lightweight/json/packet-util.mdx @@ -46,6 +46,7 @@ static { CONFIG_MODULE_PROPERTIES.put("server_rule", "nametag-render-distance", 64); CONFIG_MODULE_PROPERTIES.put("server_rule", "override-max-chat-length", false); CONFIG_MODULE_PROPERTIES.put("server_rule", "max-chat-length", 256); + CONFIG_MODULE_PROPERTIES.put("server_rule", "crystal-optimizer", false); CONFIG_MODULE_PROPERTIES.put("tnt_countdown", "tnt-ticks", 80); CONFIG_MODULE_PROPERTIES.put("title", "clear-title-on-server-switch", false); CONFIG_MODULE_PROPERTIES.put("waypoint", "server-handles-waypoints", false); diff --git a/docs/developers/lightweight/protobuf/packet-util.mdx b/docs/developers/lightweight/protobuf/packet-util.mdx index b74f9b56..19ad5452 100644 --- a/docs/developers/lightweight/protobuf/packet-util.mdx +++ b/docs/developers/lightweight/protobuf/packet-util.mdx @@ -50,6 +50,7 @@ static { CONFIG_MODULE_PROPERTIES.put("server_rule", "nametag-render-distance", Value.newBuilder().setNumberValue(64).build()); CONFIG_MODULE_PROPERTIES.put("server_rule", "override-max-chat-length", Value.newBuilder().setBoolValue(false).build()); CONFIG_MODULE_PROPERTIES.put("server_rule", "max-chat-length", Value.newBuilder().setNumberValue(256).build()); + CONFIG_MODULE_PROPERTIES.put("server_rule", "crystal-optimizer", Value.newBuilder().setBoolValue(false).build()); CONFIG_MODULE_PROPERTIES.put("tnt_countdown", "tnt-ticks", Value.newBuilder().setNumberValue(80).build()); CONFIG_MODULE_PROPERTIES.put("title", "clear-title-on-server-switch", Value.newBuilder().setBoolValue(false).build()); CONFIG_MODULE_PROPERTIES.put("waypoint", "server-handles-waypoints", Value.newBuilder().setBoolValue(false).build()); diff --git a/docs/developers/modules/serverrule.mdx b/docs/developers/modules/serverrule.mdx index fb4e8fd0..16133b80 100644 --- a/docs/developers/modules/serverrule.mdx +++ b/docs/developers/modules/serverrule.mdx @@ -219,3 +219,9 @@ public void setNametagRenderDistanceExample(int value) { - Default: `256` - Minimum: `1` - Maximum: `256` + +- __`CRYSTAL_OPTIMIZER`__ + - Whether to enable crystal optimizer. + - Values + - Type: `Boolean` + - Default: `false` diff --git a/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/util/JsonPacketUtil.java b/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/util/JsonPacketUtil.java index 57b94561..7b862ef5 100644 --- a/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/util/JsonPacketUtil.java +++ b/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/util/JsonPacketUtil.java @@ -64,6 +64,7 @@ public final class JsonPacketUtil { CONFIG_MODULE_PROPERTIES.put("server_rule", "nametag-render-distance", 64); CONFIG_MODULE_PROPERTIES.put("server_rule", "override-max-chat-length", false); CONFIG_MODULE_PROPERTIES.put("server_rule", "max-chat-length", 256); + CONFIG_MODULE_PROPERTIES.put("server_rule", "crystal-optimizer", false); CONFIG_MODULE_PROPERTIES.put("tnt_countdown", "tnt-ticks", 80); CONFIG_MODULE_PROPERTIES.put("title", "clear-title-on-server-switch", false); CONFIG_MODULE_PROPERTIES.put("waypoint", "server-handles-waypoints", false); diff --git a/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/util/ProtobufPacketUtil.java b/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/util/ProtobufPacketUtil.java index 423d6214..a9be9f64 100644 --- a/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/util/ProtobufPacketUtil.java +++ b/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/util/ProtobufPacketUtil.java @@ -71,6 +71,7 @@ public final class ProtobufPacketUtil { CONFIG_MODULE_PROPERTIES.put("server_rule", "nametag-render-distance", Value.newBuilder().setNumberValue(64).build()); CONFIG_MODULE_PROPERTIES.put("server_rule", "override-max-chat-length", Value.newBuilder().setBoolValue(false).build()); CONFIG_MODULE_PROPERTIES.put("server_rule", "max-chat-length", Value.newBuilder().setNumberValue(256).build()); + CONFIG_MODULE_PROPERTIES.put("server_rule", "crystal-optimizer", Value.newBuilder().setBoolValue(false).build()); CONFIG_MODULE_PROPERTIES.put("tnt_countdown", "tnt-ticks", Value.newBuilder().setNumberValue(80).build()); CONFIG_MODULE_PROPERTIES.put("title", "clear-title-on-server-switch", Value.newBuilder().setBoolValue(false).build()); CONFIG_MODULE_PROPERTIES.put("waypoint", "server-handles-waypoints", Value.newBuilder().setBoolValue(false).build()); From 0291d37ba03fcfb990af8c95686bbc9e61fbbe57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bu=C4=8Dari=C4=87?= Date: Fri, 13 Mar 2026 04:51:15 +0100 Subject: [PATCH 3/7] Use correct option for `ApolloPlayerAttackEvent` (#256) --- .../apollo/module/packetenrichment/PacketEnrichmentImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/lunarclient/apollo/module/packetenrichment/PacketEnrichmentImpl.java b/common/src/main/java/com/lunarclient/apollo/module/packetenrichment/PacketEnrichmentImpl.java index 1bfa2f92..3c4199a4 100644 --- a/common/src/main/java/com/lunarclient/apollo/module/packetenrichment/PacketEnrichmentImpl.java +++ b/common/src/main/java/com/lunarclient/apollo/module/packetenrichment/PacketEnrichmentImpl.java @@ -58,7 +58,7 @@ public PacketEnrichmentImpl() { private void onReceivePacket(ApolloReceivePacketEvent event) { Options options = this.getOptions(); - if (options.get(PacketEnrichmentModule.PLAYER_CHAT_OPEN_EVENT)) { + if (options.get(PacketEnrichmentModule.PLAYER_ATTACK_EVENT)) { event.unpack(PlayerAttackMessage.class).ifPresent(packet -> { ApolloPlayerAttackEvent playerAttackEvent = new ApolloPlayerAttackEvent( event.getPlayer(), From 09f8c1f4bf793bdbe4b59d1bb429c032c881281c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bu=C4=8Dari=C4=87?= Date: Tue, 17 Mar 2026 01:41:02 +0100 Subject: [PATCH 4/7] example(team): prevent duplicate entries for the same player & improve team cleanup (#259) --- docs/developers/modules/team.mdx | 62 +++++++++---------- .../example/api/module/TeamApiExample.java | 25 ++++---- .../example/json/module/TeamJsonExample.java | 25 ++++---- .../proto/module/TeamProtoExample.java | 24 ++++--- 4 files changed, 64 insertions(+), 72 deletions(-) diff --git a/docs/developers/modules/team.mdx b/docs/developers/modules/team.mdx index daa96353..48896594 100644 --- a/docs/developers/modules/team.mdx +++ b/docs/developers/modules/team.mdx @@ -45,9 +45,7 @@ private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); this.getByPlayerUuid(player.getUniqueId()).ifPresent(team -> { - if (team.getMembers().size() == 1) { - this.deleteTeam(team.getTeamId()); - } + team.removeMember(player); }); } @@ -89,20 +87,20 @@ private void runFoliaTeamUpdateTask() { public class Team { private final UUID teamId; - private final Set members; + private final Map members; public Team() { this.teamId = UUID.randomUUID(); - this.members = Sets.newHashSet(); + this.members = new HashMap<>(); } public void addMember(Player player) { - this.members.add(player); + this.members.put(player.getUniqueId(), player); TeamApiExample.this.teamsByPlayerUuid.put(player.getUniqueId(), this); } public void removeMember(Player player) { - this.members.remove(player); + this.members.remove(player.getUniqueId()); TeamApiExample.this.teamsByPlayerUuid.remove(player.getUniqueId()); Apollo.getPlayerManager().getPlayer(player.getUniqueId()) @@ -130,11 +128,12 @@ public class Team { // The refresh method used for updating members locations public void refresh() { - List teammates = this.members.stream().filter(Player::isOnline) + List teammates = this.members.values() + .stream().filter(Player::isOnline) .map(this::createTeamMember) .collect(Collectors.toList()); - this.members.forEach(member -> Apollo.getPlayerManager().getPlayer(member.getUniqueId()) + this.members.values().forEach(member -> Apollo.getPlayerManager().getPlayer(member.getUniqueId()) .ifPresent(apolloPlayer -> TeamApiExample.this.teamModule.updateTeamMembers(apolloPlayer, teammates))); } @@ -142,8 +141,8 @@ public class Team { return this.teamId; } - public Set getMembers() { - return this.members; + public Collection getMembers() { + return this.members.values(); } @Override @@ -256,9 +255,7 @@ private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); this.getByPlayerUuid(player.getUniqueId()).ifPresent(team -> { - if (team.getMembers().size() == 1) { - this.deleteTeam(team.getTeamId()); - } + team.removeMember(player); }); } @@ -300,20 +297,20 @@ private void runFoliaTeamUpdateTask() { public class Team { private final UUID teamId; - private final Set members; + private final Map members; public Team() { this.teamId = UUID.randomUUID(); - this.members = Sets.newHashSet(); + this.members = new HashMap<>(); } public void addMember(Player player) { - this.members.add(player); + this.members.put(player.getUniqueId(), player); TeamProtoExample.this.teamsByPlayerUuid.put(player.getUniqueId(), this); } public void removeMember(Player player) { - this.members.remove(player); + this.members.remove(player.getUniqueId()); TeamProtoExample.this.teamsByPlayerUuid.remove(player.getUniqueId()); ResetTeamMembersMessage message = ResetTeamMembersMessage.getDefaultInstance(); @@ -336,7 +333,7 @@ public class Team { // The refresh method used for updating members locations public void refresh() { - List teammates = this.members.stream().filter(Player::isOnline) + List teammates = this.members.values().stream().filter(Player::isOnline) .map(this::createTeamMember) .collect(Collectors.toList()); @@ -344,15 +341,15 @@ public class Team { .addAllMembers(teammates) .build(); - this.members.forEach(member -> ProtobufPacketUtil.sendPacket(member, message)); + this.members.values().forEach(member -> ProtobufPacketUtil.sendPacket(member, message)); } public UUID getTeamId() { return this.teamId; } - public Set getMembers() { - return this.members; + public Collection getMembers() { + return this.members.values(); } @Override @@ -399,9 +396,7 @@ private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); this.getByPlayerUuid(player.getUniqueId()).ifPresent(team -> { - if (team.getMembers().size() == 1) { - this.deleteTeam(team.getTeamId()); - } + team.removeMember(player); }); } @@ -443,20 +438,20 @@ private void runFoliaTeamUpdateTask() { public class Team { private final UUID teamId; - private final Set members; + private final Map members; public Team() { this.teamId = UUID.randomUUID(); - this.members = Sets.newHashSet(); + this.members = new HashMap<>(); } public void addMember(Player player) { - this.members.add(player); + this.members.put(player.getUniqueId(), player); TeamJsonExample.this.teamsByPlayerUuid.put(player.getUniqueId(), this); } public void removeMember(Player player) { - this.members.remove(player); + this.members.remove(player.getUniqueId()); TeamJsonExample.this.teamsByPlayerUuid.remove(player.getUniqueId()); JsonObject message = new JsonObject(); @@ -482,7 +477,8 @@ public class Team { // The refresh method used for updating members locations public void refresh() { - JsonArray teammates = this.members.stream().filter(Player::isOnline) + JsonArray teammates = this.members.values() + .stream().filter(Player::isOnline) .map(this::createTeamMember) .collect(JsonArray::new, JsonArray::add, JsonArray::addAll); @@ -490,15 +486,15 @@ public class Team { message.addProperty("@type", "type.googleapis.com/lunarclient.apollo.team.v1.UpdateTeamMembersMessage"); message.add("members", teammates); - this.members.forEach(member -> JsonPacketUtil.sendPacket(member, message)); + this.members.values().forEach(member -> JsonPacketUtil.sendPacket(member, message)); } public UUID getTeamId() { return this.teamId; } - public Set getMembers() { - return this.members; + public Collection getMembers() { + return this.members.values(); } @Override diff --git a/example/bukkit/api/src/main/java/com/lunarclient/apollo/example/api/module/TeamApiExample.java b/example/bukkit/api/src/main/java/com/lunarclient/apollo/example/api/module/TeamApiExample.java index c25a5fa9..6985a24a 100644 --- a/example/bukkit/api/src/main/java/com/lunarclient/apollo/example/api/module/TeamApiExample.java +++ b/example/bukkit/api/src/main/java/com/lunarclient/apollo/example/api/module/TeamApiExample.java @@ -24,7 +24,6 @@ package com.lunarclient.apollo.example.api.module; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.lunarclient.apollo.Apollo; import com.lunarclient.apollo.common.location.ApolloLocation; import com.lunarclient.apollo.example.ApolloExamplePlugin; @@ -33,10 +32,11 @@ import com.lunarclient.apollo.module.team.TeamMember; import com.lunarclient.apollo.module.team.TeamModule; import java.awt.Color; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -71,9 +71,7 @@ private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); this.getByPlayerUuid(player.getUniqueId()).ifPresent(team -> { - if (team.getMembers().size() == 1) { - this.deleteTeam(team.getTeamId()); - } + team.removeMember(player); }); } @@ -115,20 +113,20 @@ private void runFoliaTeamUpdateTask() { public class Team { private final UUID teamId; - private final Set members; + private final Map members; public Team() { this.teamId = UUID.randomUUID(); - this.members = Sets.newHashSet(); + this.members = new HashMap<>(); } public void addMember(Player player) { - this.members.add(player); + this.members.put(player.getUniqueId(), player); TeamApiExample.this.teamsByPlayerUuid.put(player.getUniqueId(), this); } public void removeMember(Player player) { - this.members.remove(player); + this.members.remove(player.getUniqueId()); TeamApiExample.this.teamsByPlayerUuid.remove(player.getUniqueId()); Apollo.getPlayerManager().getPlayer(player.getUniqueId()) @@ -156,11 +154,12 @@ private TeamMember createTeamMember(Player member) { // The refresh method used for updating members locations public void refresh() { - List teammates = this.members.stream().filter(Player::isOnline) + List teammates = this.members.values() + .stream().filter(Player::isOnline) .map(this::createTeamMember) .collect(Collectors.toList()); - this.members.forEach(member -> Apollo.getPlayerManager().getPlayer(member.getUniqueId()) + this.members.values().forEach(member -> Apollo.getPlayerManager().getPlayer(member.getUniqueId()) .ifPresent(apolloPlayer -> TeamApiExample.this.teamModule.updateTeamMembers(apolloPlayer, teammates))); } @@ -168,8 +167,8 @@ public UUID getTeamId() { return this.teamId; } - public Set getMembers() { - return this.members; + public Collection getMembers() { + return this.members.values(); } @Override diff --git a/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/module/TeamJsonExample.java b/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/module/TeamJsonExample.java index 4aa4afba..8683030d 100644 --- a/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/module/TeamJsonExample.java +++ b/example/bukkit/json/src/main/java/com/lunarclient/apollo/example/json/module/TeamJsonExample.java @@ -24,7 +24,6 @@ package com.lunarclient.apollo.example.json.module; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.lunarclient.apollo.example.ApolloExamplePlugin; @@ -34,9 +33,10 @@ import com.lunarclient.apollo.example.module.impl.TeamExample; import com.lunarclient.apollo.example.util.ServerUtil; import java.awt.Color; +import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; import net.kyori.adventure.text.Component; @@ -67,9 +67,7 @@ private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); this.getByPlayerUuid(player.getUniqueId()).ifPresent(team -> { - if (team.getMembers().size() == 1) { - this.deleteTeam(team.getTeamId()); - } + team.removeMember(player); }); } @@ -111,20 +109,20 @@ private void runFoliaTeamUpdateTask() { public class Team { private final UUID teamId; - private final Set members; + private final Map members; public Team() { this.teamId = UUID.randomUUID(); - this.members = Sets.newHashSet(); + this.members = new HashMap<>(); } public void addMember(Player player) { - this.members.add(player); + this.members.put(player.getUniqueId(), player); TeamJsonExample.this.teamsByPlayerUuid.put(player.getUniqueId(), this); } public void removeMember(Player player) { - this.members.remove(player); + this.members.remove(player.getUniqueId()); TeamJsonExample.this.teamsByPlayerUuid.remove(player.getUniqueId()); JsonObject message = new JsonObject(); @@ -150,7 +148,8 @@ private JsonObject createTeamMember(Player member) { // The refresh method used for updating members locations public void refresh() { - JsonArray teammates = this.members.stream().filter(Player::isOnline) + JsonArray teammates = this.members.values() + .stream().filter(Player::isOnline) .map(this::createTeamMember) .collect(JsonArray::new, JsonArray::add, JsonArray::addAll); @@ -158,15 +157,15 @@ public void refresh() { message.addProperty("@type", "type.googleapis.com/lunarclient.apollo.team.v1.UpdateTeamMembersMessage"); message.add("members", teammates); - this.members.forEach(member -> JsonPacketUtil.sendPacket(member, message)); + this.members.values().forEach(member -> JsonPacketUtil.sendPacket(member, message)); } public UUID getTeamId() { return this.teamId; } - public Set getMembers() { - return this.members; + public Collection getMembers() { + return this.members.values(); } @Override diff --git a/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/module/TeamProtoExample.java b/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/module/TeamProtoExample.java index 24f995b2..35726cea 100644 --- a/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/module/TeamProtoExample.java +++ b/example/bukkit/proto/src/main/java/com/lunarclient/apollo/example/proto/module/TeamProtoExample.java @@ -24,7 +24,6 @@ package com.lunarclient.apollo.example.proto.module; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.lunarclient.apollo.example.ApolloExamplePlugin; import com.lunarclient.apollo.example.module.impl.TeamExample; import com.lunarclient.apollo.example.proto.util.AdventureUtil; @@ -35,10 +34,11 @@ import com.lunarclient.apollo.team.v1.TeamMember; import com.lunarclient.apollo.team.v1.UpdateTeamMembersMessage; import java.awt.Color; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -70,9 +70,7 @@ private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); this.getByPlayerUuid(player.getUniqueId()).ifPresent(team -> { - if (team.getMembers().size() == 1) { - this.deleteTeam(team.getTeamId()); - } + team.removeMember(player); }); } @@ -114,20 +112,20 @@ private void runFoliaTeamUpdateTask() { public class Team { private final UUID teamId; - private final Set members; + private final Map members; public Team() { this.teamId = UUID.randomUUID(); - this.members = Sets.newHashSet(); + this.members = new HashMap<>(); } public void addMember(Player player) { - this.members.add(player); + this.members.put(player.getUniqueId(), player); TeamProtoExample.this.teamsByPlayerUuid.put(player.getUniqueId(), this); } public void removeMember(Player player) { - this.members.remove(player); + this.members.remove(player.getUniqueId()); TeamProtoExample.this.teamsByPlayerUuid.remove(player.getUniqueId()); ResetTeamMembersMessage message = ResetTeamMembersMessage.getDefaultInstance(); @@ -150,7 +148,7 @@ private TeamMember createTeamMember(Player member) { // The refresh method used for updating members locations public void refresh() { - List teammates = this.members.stream().filter(Player::isOnline) + List teammates = this.members.values().stream().filter(Player::isOnline) .map(this::createTeamMember) .collect(Collectors.toList()); @@ -158,15 +156,15 @@ public void refresh() { .addAllMembers(teammates) .build(); - this.members.forEach(member -> ProtobufPacketUtil.sendPacket(member, message)); + this.members.values().forEach(member -> ProtobufPacketUtil.sendPacket(member, message)); } public UUID getTeamId() { return this.teamId; } - public Set getMembers() { - return this.members; + public Collection getMembers() { + return this.members.values(); } @Override From 7024a710c64725e84400cff15bbcefe836dfff24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bu=C4=8Dari=C4=87?= Date: Tue, 17 Mar 2026 03:14:08 +0100 Subject: [PATCH 5/7] Improve analyitics error handling (#258) * Silence UnknownHostException * Don't send version request if `send-updater-message` is set to `false` --- .../apollo/api/ApolloHttpManager.java | 17 +++++++++++++---- .../apollo/version/ApolloVersionManager.java | 11 ++++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/lunarclient/apollo/api/ApolloHttpManager.java b/common/src/main/java/com/lunarclient/apollo/api/ApolloHttpManager.java index 99365450..532e03dd 100644 --- a/common/src/main/java/com/lunarclient/apollo/api/ApolloHttpManager.java +++ b/common/src/main/java/com/lunarclient/apollo/api/ApolloHttpManager.java @@ -37,6 +37,7 @@ import java.lang.reflect.Type; import java.net.HttpURLConnection; import java.net.URL; +import java.net.UnknownHostException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.concurrent.ExecutorService; @@ -134,13 +135,21 @@ public Future request(ApiRequest request) { responseType.getTypeName(), response ))); } - } catch (IOException e) { - ApolloHttpManager.handleError("Failed to parse request!", e, request); + } catch (IOException exception) { + if (exception instanceof UnknownHostException) { + return; + } + + ApolloHttpManager.handleError("Failed to parse request!", exception, request); } finally { connection.disconnect(); } - } catch (Throwable t) { - ApolloHttpManager.handleError("Failed to open connection!", t, request); + } catch (Throwable throwable) { + if (throwable instanceof UnknownHostException) { + return; + } + + ApolloHttpManager.handleError("Failed to open connection!", throwable, request); } }); diff --git a/common/src/main/java/com/lunarclient/apollo/version/ApolloVersionManager.java b/common/src/main/java/com/lunarclient/apollo/version/ApolloVersionManager.java index d13b6ce3..fce24d20 100644 --- a/common/src/main/java/com/lunarclient/apollo/version/ApolloVersionManager.java +++ b/common/src/main/java/com/lunarclient/apollo/version/ApolloVersionManager.java @@ -75,9 +75,14 @@ public ApolloVersionManager() { * @since 1.0.0 */ public void checkForUpdates() { + ApolloPlatform platform = Apollo.getPlatform(); + + if (!platform.getOptions().get(ApolloVersionManager.SEND_UPDATE_MESSAGE)) { + return; + } + ApolloManager.getHttpManager().request(VersionRequest.builder().build()) .onSuccess(response -> { - ApolloPlatform platform = Apollo.getPlatform(); String version = response.getVersion(); ApolloVersion currentVersion = new ApolloVersion(platform.getApolloVersion()); @@ -89,10 +94,6 @@ public void checkForUpdates() { this.updateAssets = response; - if (!platform.getOptions().get(ApolloVersionManager.SEND_UPDATE_MESSAGE)) { - return; - } - Logger logger = platform.getPlatformLogger(); logger.warning(String.format("A new version of Apollo is available! Latest release: %s", version)); From 4cd2afceed170122cd184c1f4a588fb025890795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bu=C4=8Dari=C4=87?= Date: Thu, 26 Mar 2026 17:49:30 +0100 Subject: [PATCH 6/7] Sync LunarClient Mods & Options (#262) * Sync LunarClient Mods & Options * Update version tags to 1.2.4 --------- Co-authored-by: LunarClient Bot --- .../apollo/mods/impl/ModOverlayMod.java | 2 +- .../apollo/mods/impl/ModSkyblock.java | 17 ++++++++++++++--- .../apollo/mods/impl/ModTierTagger.java | 12 ++++++------ docs/developers/mods/overlaymod.mdx | 2 +- docs/developers/mods/skyblock.mdx | 10 ++++++++-- docs/developers/mods/tiertagger.mdx | 12 ++++++------ 6 files changed, 36 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/com/lunarclient/apollo/mods/impl/ModOverlayMod.java b/api/src/main/java/com/lunarclient/apollo/mods/impl/ModOverlayMod.java index 67f2be6a..489dc85a 100644 --- a/api/src/main/java/com/lunarclient/apollo/mods/impl/ModOverlayMod.java +++ b/api/src/main/java/com/lunarclient/apollo/mods/impl/ModOverlayMod.java @@ -42,7 +42,7 @@ public final class ModOverlayMod { */ public static final SimpleOption ENABLED = SimpleOption.builder() .node("overlay-mod", "enabled").type(TypeToken.get(Boolean.class)) - .defaultValue(true) + .defaultValue(false) .notifyClient() .build(); diff --git a/api/src/main/java/com/lunarclient/apollo/mods/impl/ModSkyblock.java b/api/src/main/java/com/lunarclient/apollo/mods/impl/ModSkyblock.java index d34ed138..b4803629 100644 --- a/api/src/main/java/com/lunarclient/apollo/mods/impl/ModSkyblock.java +++ b/api/src/main/java/com/lunarclient/apollo/mods/impl/ModSkyblock.java @@ -443,6 +443,17 @@ public final class ModSkyblock { .notifyClient() .build(); + /** + * No documentation available. + * + * @since 1.1.6 + */ + public static final SimpleOption SKY_BLOCK_FINISHED_COMMISSIONS = SimpleOption.builder() + .node("skyblock", "sky-block-finished-commissions").type(TypeToken.get(Boolean.class)) + .defaultValue(false) + .notifyClient() + .build(); + /** * No documentation available. * @@ -457,10 +468,10 @@ public final class ModSkyblock { /** * No documentation available. * - * @since 1.1.6 + * @since 1.2.4 */ - public static final SimpleOption SKY_BLOCK_FINISHED_COMMISSIONS = SimpleOption.builder() - .node("skyblock", "sky-block-finished-commissions").type(TypeToken.get(Boolean.class)) + public static final SimpleOption SKY_BLOCK_METAL_DETECTOR_LINE = SimpleOption.builder() + .node("skyblock", "sky-block-metal-detector-line").type(TypeToken.get(Boolean.class)) .defaultValue(false) .notifyClient() .build(); diff --git a/api/src/main/java/com/lunarclient/apollo/mods/impl/ModTierTagger.java b/api/src/main/java/com/lunarclient/apollo/mods/impl/ModTierTagger.java index b749d8fd..5de30344 100644 --- a/api/src/main/java/com/lunarclient/apollo/mods/impl/ModTierTagger.java +++ b/api/src/main/java/com/lunarclient/apollo/mods/impl/ModTierTagger.java @@ -94,9 +94,9 @@ public final class ModTierTagger { * * @since 1.1.9 */ - public static final SimpleOption SHOW_RETIRED = SimpleOption.builder() - .node("tier-tagger", "show-retired").type(TypeToken.get(Boolean.class)) - .defaultValue(false) + public static final SimpleOption SHOW_REGION = SimpleOption.builder() + .node("tier-tagger", "show-region").type(TypeToken.get(Boolean.class)) + .defaultValue(true) .notifyClient() .build(); @@ -105,9 +105,9 @@ public final class ModTierTagger { * * @since 1.1.9 */ - public static final SimpleOption SHOW_REGION = SimpleOption.builder() - .node("tier-tagger", "show-region").type(TypeToken.get(Boolean.class)) - .defaultValue(true) + public static final SimpleOption SHOW_RETIRED = SimpleOption.builder() + .node("tier-tagger", "show-retired").type(TypeToken.get(Boolean.class)) + .defaultValue(false) .notifyClient() .build(); diff --git a/docs/developers/mods/overlaymod.mdx b/docs/developers/mods/overlaymod.mdx index 3ba30e83..725ff842 100644 --- a/docs/developers/mods/overlaymod.mdx +++ b/docs/developers/mods/overlaymod.mdx @@ -19,7 +19,7 @@ public void toggleOverlayExample(Player viewer, boolean value) { - Config Key: `enabled` - Values - Type: `Boolean` - - Default: `true` + - Default: `false` - __`MINIMAL_VIEW_BOBBING`__ - When View Bobbing is enabled, only bob your hand (requires View Bobbing to be enabled). diff --git a/docs/developers/mods/skyblock.mdx b/docs/developers/mods/skyblock.mdx index f54aa69d..3e20e3ec 100644 --- a/docs/developers/mods/skyblock.mdx +++ b/docs/developers/mods/skyblock.mdx @@ -244,14 +244,20 @@ public void toggleHypixelSkyblockExample(Player viewer, boolean value) { - Type: `Boolean` - Default: `false` +- __`SKY_BLOCK_FINISHED_COMMISSIONS`__ + - Config Key: `sky-block-finished-commissions` + - Values + - Type: `Boolean` + - Default: `false` + - __`SKY_BLOCK_METAL_DETECTOR`__ - Config Key: `sky-block-metal-detector` - Values - Type: `Boolean` - Default: `false` -- __`SKY_BLOCK_FINISHED_COMMISSIONS`__ - - Config Key: `sky-block-finished-commissions` +- __`SKY_BLOCK_METAL_DETECTOR_LINE`__ + - Config Key: `sky-block-metal-detector-line` - Values - Type: `Boolean` - Default: `false` diff --git a/docs/developers/mods/tiertagger.mdx b/docs/developers/mods/tiertagger.mdx index 2f1c889c..704c4f8d 100644 --- a/docs/developers/mods/tiertagger.mdx +++ b/docs/developers/mods/tiertagger.mdx @@ -45,18 +45,18 @@ public void toggleTierTaggerExample(Player viewer, boolean value) { - Type: `Boolean` - Default: `true` -- __`SHOW_RETIRED`__ - - Config Key: `show-retired` - - Values - - Type: `Boolean` - - Default: `false` - - __`SHOW_REGION`__ - Config Key: `show-region` - Values - Type: `Boolean` - Default: `true` +- __`SHOW_RETIRED`__ + - Config Key: `show-retired` + - Values + - Type: `Boolean` + - Default: `false` + - __`COLOR_HT1`__ - Config Key: `color-h-t1` - Values From 321cee5704d2cb9b57b710567d5addc1aadabdce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bu=C4=8Dari=C4=87?= Date: Thu, 26 Mar 2026 17:54:18 +0100 Subject: [PATCH 7/7] Bump to 1.2.4 (#263) --- docs/developers/minestom.mdx | 6 +++--- example/bukkit/api/src/main/resources/plugin.yml | 2 +- example/bukkit/json/src/main/resources/plugin.yml | 2 +- example/bukkit/proto/src/main/resources/plugin.yml | 2 +- gradle.properties | 2 +- platform/bukkit/src/platform-loader/resources/plugin.yml | 2 +- platform/bungee/src/platform-loader/resources/plugin.yml | 2 +- platform/folia/src/main/resources/plugin.yml | 2 +- .../java/com/lunarclient/apollo/ApolloMinestomPlatform.java | 2 +- .../java/com/lunarclient/apollo/ApolloVelocityPlatform.java | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/developers/minestom.mdx b/docs/developers/minestom.mdx index ee4f758f..cb483ae4 100644 --- a/docs/developers/minestom.mdx +++ b/docs/developers/minestom.mdx @@ -52,14 +52,14 @@ Next, add the `apollo-minestom` dependency to your project. ```kotlin filename="build.gradle.kts" dependencies { - implementation("com.lunarclient:apollo-minestom:1.2.3") + implementation("com.lunarclient:apollo-minestom:1.2.4") } ``` ```groovy filename="build.gradle" dependencies { - implementation 'com.lunarclient:apollo-minestom:1.2.3' + implementation 'com.lunarclient:apollo-minestom:1.2.4' } ``` @@ -69,7 +69,7 @@ Next, add the `apollo-minestom` dependency to your project. com.lunarclient apollo-minestom - 1.2.3 + 1.2.4 compile diff --git a/example/bukkit/api/src/main/resources/plugin.yml b/example/bukkit/api/src/main/resources/plugin.yml index 37ed6fc2..fbe960bb 100644 --- a/example/bukkit/api/src/main/resources/plugin.yml +++ b/example/bukkit/api/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Apollo-API-Example main: com.lunarclient.apollo.example.api.ApolloApiExamplePlatform -version: 1.2.3 +version: 1.2.4 author: Moonsworth softdepend: [ Apollo-Bukkit, Apollo-Folia ] api-version: 1.13 diff --git a/example/bukkit/json/src/main/resources/plugin.yml b/example/bukkit/json/src/main/resources/plugin.yml index 8cb22715..a74914ef 100644 --- a/example/bukkit/json/src/main/resources/plugin.yml +++ b/example/bukkit/json/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Apollo-Json-Example main: com.lunarclient.apollo.example.json.ApolloJsonExamplePlatform -version: 1.2.3 +version: 1.2.4 author: Moonsworth softdepend: [ Apollo-Bukkit ] api-version: 1.13 diff --git a/example/bukkit/proto/src/main/resources/plugin.yml b/example/bukkit/proto/src/main/resources/plugin.yml index 2be56f56..dbc9453b 100644 --- a/example/bukkit/proto/src/main/resources/plugin.yml +++ b/example/bukkit/proto/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Apollo-Proto-Example main: com.lunarclient.apollo.example.proto.ApolloProtoExamplePlatform -version: 1.2.3 +version: 1.2.4 author: Moonsworth softdepend: [ Apollo-Bukkit ] api-version: 1.13 diff --git a/gradle.properties b/gradle.properties index e77d1015..0507e51f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=com.lunarclient -version=1.2.4-SNAPSHOT +version=1.2.4 description=The API for interacting with Lunar Client players. org.gradle.parallel=true diff --git a/platform/bukkit/src/platform-loader/resources/plugin.yml b/platform/bukkit/src/platform-loader/resources/plugin.yml index 727cb7dd..456837bc 100644 --- a/platform/bukkit/src/platform-loader/resources/plugin.yml +++ b/platform/bukkit/src/platform-loader/resources/plugin.yml @@ -1,6 +1,6 @@ name: Apollo-Bukkit main: com.lunarclient.apollo.loader.BukkitPlatformLoader -version: 1.2.3 +version: 1.2.4 author: Moonsworth api-version: 1.13 soft-depend: [LunarClient-API] diff --git a/platform/bungee/src/platform-loader/resources/plugin.yml b/platform/bungee/src/platform-loader/resources/plugin.yml index 28b0780a..c9abad3c 100644 --- a/platform/bungee/src/platform-loader/resources/plugin.yml +++ b/platform/bungee/src/platform-loader/resources/plugin.yml @@ -1,4 +1,4 @@ name: Apollo-Bungee main: com.lunarclient.apollo.loader.BungeePlatformLoader -version: 1.2.3 +version: 1.2.4 author: Moonsworth diff --git a/platform/folia/src/main/resources/plugin.yml b/platform/folia/src/main/resources/plugin.yml index 09da14bb..a3eba4b5 100644 --- a/platform/folia/src/main/resources/plugin.yml +++ b/platform/folia/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Apollo-Folia main: com.lunarclient.apollo.ApolloFoliaPlatform -version: 1.2.3 +version: 1.2.4 author: Moonsworth api-version: 1.13 folia-supported: true diff --git a/platform/minestom/src/main/java/com/lunarclient/apollo/ApolloMinestomPlatform.java b/platform/minestom/src/main/java/com/lunarclient/apollo/ApolloMinestomPlatform.java index c0f66845..0a32651b 100644 --- a/platform/minestom/src/main/java/com/lunarclient/apollo/ApolloMinestomPlatform.java +++ b/platform/minestom/src/main/java/com/lunarclient/apollo/ApolloMinestomPlatform.java @@ -237,7 +237,7 @@ public Options getOptions() { @Override public String getApolloVersion() { - return "1.2.3"; + return "1.2.4"; } @Override diff --git a/platform/velocity/src/main/java/com/lunarclient/apollo/ApolloVelocityPlatform.java b/platform/velocity/src/main/java/com/lunarclient/apollo/ApolloVelocityPlatform.java index 0b63dc15..53f3d53c 100644 --- a/platform/velocity/src/main/java/com/lunarclient/apollo/ApolloVelocityPlatform.java +++ b/platform/velocity/src/main/java/com/lunarclient/apollo/ApolloVelocityPlatform.java @@ -105,7 +105,7 @@ @Plugin( id = "apollo", name = "Apollo-Velocity", - version = "1.2.3", + version = "1.2.4", url = "https://moonsworth.com", description = "Implementation of Apollo for Velocity", authors = {"Moonsworth"}