From 24ba209f8fb5ff3466ac16b209990ff5a99f4320 Mon Sep 17 00:00:00 2001 From: William Date: Fri, 14 Jun 2024 12:34:05 +0100 Subject: [PATCH] feat: support 1.21 Fixes attribute modifier syncing, adjust apache dep --- .../william278/husksync/data/BukkitData.java | 11 +-- common/build.gradle | 1 - .../net/william278/husksync/data/Data.java | 72 +++++++++++++------ fabric/build.gradle | 1 + test/spin_network.py | 8 +-- 5 files changed, 61 insertions(+), 32 deletions(-) diff --git a/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java b/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java index ce61087b..2663a830 100644 --- a/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java +++ b/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java @@ -26,6 +26,7 @@ import de.tr7zw.changeme.nbtapi.NBTCompound; import de.tr7zw.changeme.nbtapi.NBTPersistentDataContainer; import lombok.*; import net.william278.desertwell.util.ThrowingConsumer; +import net.william278.desertwell.util.Version; import net.william278.husksync.BukkitHuskSync; import net.william278.husksync.HuskSync; import net.william278.husksync.adapter.Adaptable; @@ -572,7 +573,7 @@ public abstract class BukkitData implements Data { // We don't sync unmodified or disabled attributes return; } - attributes.add(adapt(instance)); + attributes.add(adapt(instance, plugin.getMinecraftVersion())); }); return new BukkitData.Attributes(attributes); } @@ -591,18 +592,18 @@ public abstract class BukkitData implements Data { } @NotNull - private static Attribute adapt(@NotNull AttributeInstance instance) { + private static Attribute adapt(@NotNull AttributeInstance instance, @NotNull Version version) { return new Attribute( instance.getAttribute().getKey().toString(), instance.getBaseValue(), - instance.getModifiers().stream().map(BukkitData.Attributes::adapt).collect(Collectors.toSet()) + instance.getModifiers().stream().map(m -> adapt(m, version)).collect(Collectors.toSet()) ); } @NotNull - private static Modifier adapt(@NotNull AttributeModifier modifier) { + private static Modifier adapt(@NotNull AttributeModifier modifier, @NotNull Version version) { return new Modifier( - modifier.getUniqueId(), + version.compareTo(Version.fromString("1.21")) >= 0 ? null : modifier.getUniqueId(), modifier.getName(), modifier.getAmount(), modifier.getOperation().ordinal(), diff --git a/common/build.gradle b/common/build.gradle index 6b567862..a81fc971 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -5,7 +5,6 @@ plugins { dependencies { api 'commons-io:commons-io:2.16.1' api 'org.apache.commons:commons-text:1.12.0' - api 'org.apache.commons:commons-pool2:2.12.0' api 'net.william278:minedown:1.8.2' api 'org.json:json:20240303' api 'com.google.code.gson:gson:2.11.0' diff --git a/common/src/main/java/net/william278/husksync/data/Data.java b/common/src/main/java/net/william278/husksync/data/Data.java index 7cba6059..a47725d6 100644 --- a/common/src/main/java/net/william278/husksync/data/Data.java +++ b/common/src/main/java/net/william278/husksync/data/Data.java @@ -21,6 +21,11 @@ package net.william278.husksync.data; import com.google.common.collect.Sets; import com.google.gson.annotations.SerializedName; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; import net.kyori.adventure.key.Key; import net.william278.husksync.HuskSync; import net.william278.husksync.user.OnlineUser; @@ -156,8 +161,8 @@ public interface Data { @NotNull default List getCompletedExcludingRecipes() { return getCompleted().stream() - .filter(advancement -> !advancement.getKey().startsWith("minecraft:recipe")) - .collect(Collectors.toList()); + .filter(advancement -> !advancement.getKey().startsWith("minecraft:recipe")) + .collect(Collectors.toList()); } void setCompleted(@NotNull List completed); @@ -186,13 +191,13 @@ public interface Data { @NotNull private static Map adaptDateMap(@NotNull Map dateMap) { return dateMap.entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getTime())); + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getTime())); } @NotNull private static Map adaptLongMap(@NotNull Map dateMap) { return dateMap.entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> new Date(e.getValue()))); + .collect(Collectors.toMap(Map.Entry::getKey, e -> new Date(e.getValue()))); } @NotNull @@ -245,9 +250,9 @@ public interface Data { void setWorld(@NotNull World world); record World( - @SerializedName("name") @NotNull String name, - @SerializedName("uuid") @NotNull UUID uuid, - @SerializedName("environment") @NotNull String environment + @SerializedName("name") @NotNull String name, + @SerializedName("uuid") @NotNull UUID uuid, + @SerializedName("environment") @NotNull String environment ) { } } @@ -319,9 +324,9 @@ public interface Data { List getAttributes(); record Attribute( - @NotNull String name, - double baseValue, - @NotNull Set modifiers + @NotNull String name, + double baseValue, + @NotNull Set modifiers ) { public double getValue() { @@ -334,17 +339,34 @@ public interface Data { } - record Modifier( - @NotNull UUID uuid, - @NotNull String name, - double amount, - @SerializedName("operation") int operationType, - @SerializedName("equipment_slot") int equipmentSlot - ) { + @Getter + @Accessors(fluent = true) + @AllArgsConstructor + @NoArgsConstructor + final class Modifier { + @Getter(AccessLevel.NONE) + @Nullable + @SerializedName("uuid") + private UUID uuid; + @SerializedName("name") + private String name; + @SerializedName("amount") + private double amount; + @SerializedName("operation") + private int operationType; + @SerializedName("equipment_slot") + private int equipmentSlot; + + public Modifier(@NotNull String name, double amount, int operationType, int equipmentSlot) { + this.name = name; + this.amount = amount; + this.operationType = operationType; + this.equipmentSlot = equipmentSlot; + } @Override public boolean equals(Object obj) { - return obj instanceof Modifier modifier && modifier.uuid.equals(uuid); + return obj instanceof Modifier modifier && modifier.uuid().equals(uuid()); } public double modify(double value) { @@ -355,12 +377,18 @@ public interface Data { default -> value; }; } + + @NotNull + public UUID uuid() { + return uuid != null ? uuid : UUID.nameUUIDFromBytes(name.getBytes()); + } + } default Optional getAttribute(@NotNull Key key) { return getAttributes().stream() - .filter(attribute -> attribute.name().equals(key.asString())) - .findFirst(); + .filter(attribute -> attribute.name().equals(key.asString())) + .findFirst(); } default void removeAttribute(@NotNull Key key) { @@ -369,8 +397,8 @@ public interface Data { default double getMaxHealth() { return getAttribute(MAX_HEALTH_KEY) - .map(Attribute::getValue) - .orElse(20.0); + .map(Attribute::getValue) + .orElse(20.0); } default void setMaxHealth(double maxHealth) { diff --git a/fabric/build.gradle b/fabric/build.gradle index 2d54e123..02c14559 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -21,6 +21,7 @@ dependencies { modCompileOnly "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" // Runtime dependencies on Bukkit; "include" them on Fabric. (todo: minify JAR?) + implementation include('org.apache.commons:commons-pool2:2.12.0') implementation include("redis.clients:jedis:$jedis_version") implementation include("com.mysql:mysql-connector-j:$mysql_driver_version") implementation include("org.mariadb.jdbc:mariadb-java-client:$mariadb_driver_version") diff --git a/test/spin_network.py b/test/spin_network.py index 7884455e..b019c2d6 100644 --- a/test/spin_network.py +++ b/test/spin_network.py @@ -12,15 +12,15 @@ from tqdm import tqdm # Parameters for starting a network of Minecraft servers class Parameters: root_dir = './servers/' - proxy_version = "1.20" - minecraft_version = '1.20.6' + proxy_version = "1.21" + minecraft_version = '1.21' eula_agreement = 'true' backend_names = ['alpha', 'beta'] backend_ports = [25567, 25568] backend_type = 'paper' backend_ram = 2048 - backend_plugins = ['../target/HuskSync-Paper-*.jar', './ProtocolLib/ProtocolLib.jar'] + backend_plugins = ['../target/HuskSync-Paper-*.jar'] backend_plugin_folders = ['./HuskSync'] operator_names = ['William278'] operator_uuids = ['5dfb0558-e306-44f4-bb9a-f9218d4eb787'] @@ -33,7 +33,7 @@ class Parameters: proxy_plugins = [] proxy_plugin_folders = [] - just_update_plugins = False + just_update_plugins = True def main(update=False):