Skip to content

Commit 4373eaa

Browse files
theEvilReaperrenovate[bot]TheMeinerLP
authored
Prepare release of version v1.9.0 (#22)
* Add test for the new provider * Fix tests * Move TestMapProvider class * Update dependency gradle to v8.14.1 * Update dependency gradle to v8.14.2 (#16) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Add builder pattern to create a BaseMap reference (#17) * Move provider part into a dedicated package * Update import * Add builder pattern for the BaseMap class * Add static method to access the new builder * Add modern variant of the FileHandler (#15) * Deprecate FileHandler and GsonFileHandler; introduce ModernFileHandler and ModernGsonFileHandler * Update ModernFileHandler and ModernGsonFileHandler to remove unused parameters and increment version to 1.9.0; add unit tests for ModernFileHandler * Update version to 1.9.0 in build.gradle.kts * Cleanup empty lines --------- Co-authored-by: theEvilReaper <steffenwx@gmail.com> * Update readme content * Update dependency gradle to v8.14.3 (#18) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Remove refresh method (#21) * Deprecate static methods (#20) * Add 1.21.5 support (#19) * Switch to a 1.21.5 snapshot * Deprecate a constant value * Rework inventory click handling to work with the latest version of Minestom * Remove logger usage * Improve switch expression usage * Remove instance field * Use existing event node and remove own definition * Improve exception handling * Fix ItemStackGsonTypeAdapter * Update exception test case * Update component import and usage * Remove title variable in the update method and cleanup code * Remove unused import * Cleanup imports * Update minestom to the latest 1.21.5 release * Update RegistryKey usage * Update minestom version * Disable test which runs to long * Update bom and migrate Minestom usage * Fix documentation * Update since content in the Deprecated annotation --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Phillipp Glanz <6745190+TheMeinerLP@users.noreply.github.com>
1 parent 28a9e70 commit 4373eaa

35 files changed

Lines changed: 663 additions & 144 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Add the following dependency to your `build.gradle.kts` file:
3434

3535
```kotlin
3636
dependencies {
37-
implementation("net.theevilreaper.aves:aves:<version>")
37+
implementation("net.theevilreaper:aves:<version>")
3838
}
3939
```
4040

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77
}
88

99
group = "net.theevilreaper"
10-
version = "1.8.0"
10+
version = "1.9.0"
1111
description = "Aves"
1212

1313
java {

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

settings.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ dependencyResolutionManagement {
2626
}
2727
versionCatalogs {
2828
create("libs") {
29-
version("bom", "1.2.3")
29+
version("bom", "1.3.0")
3030
version("publishdata", "1.4.0")
31-
3231
library("mycelium.bom", "net.onelitefeather", "mycelium-bom").versionRef("bom")
33-
library("minestom","net.minestom", "minestom-snapshots").withoutVersion()
32+
library("minestom","net.minestom", "minestom").withoutVersion()
3433
library("adventure", "net.kyori", "adventure-text-minimessage").withoutVersion()
3534
library("cyano", "net.onelitefeather", "cyano").withoutVersion()
3635
library("junit-jupiter", "org.junit.jupiter", "junit-jupiter").withoutVersion()

src/main/java/net/theevilreaper/aves/file/FileHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
* @author theEvilReaper
1515
* @version 1.0.0
1616
* @since 1.0.0
17+
* * @deprecated This interface is deprecated since version 1.9.0 and will be removed in a future release. Use {@link ModernFileHandler} instead.
1718
**/
19+
@Deprecated(since = "1.9.0", forRemoval = true)
1820
public interface FileHandler {
1921

2022
Logger LOGGER = LoggerFactory.getLogger(FileHandler.class);

src/main/java/net/theevilreaper/aves/file/GsonFileHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
* @author theEvilReaper
1616
* @version 1.0.0
1717
* @since 1.1.0
18+
* @deprecated This class is deprecated since version 1.9.0 and will be removed in a future release. Use {@link ModernGsonFileHandler} instead.
1819
**/
20+
@Deprecated(since = "1.9.0", forRemoval = true)
1921
public final class GsonFileHandler implements FileHandler {
2022

2123
private final Gson gson;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package net.theevilreaper.aves.file;
2+
3+
import com.google.gson.reflect.TypeToken;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import java.nio.charset.Charset;
9+
import java.nio.charset.StandardCharsets;
10+
import java.nio.file.Path;
11+
import java.util.Optional;
12+
13+
/**
14+
* The class represents the base logic to load or save json files.
15+
* @author theEvilReaper
16+
* @version 1.0.0
17+
* @since 1.9.0
18+
**/
19+
public interface ModernFileHandler {
20+
21+
Logger LOGGER = LoggerFactory.getLogger(ModernFileHandler.class);
22+
23+
Charset UTF_8 = StandardCharsets.UTF_8;
24+
25+
/**
26+
* Saves a given object into a file.
27+
* @param path The path where the file is located
28+
* @param object The object to save
29+
* @param typeToken the type token to serialize the object
30+
* @param <T> A generic type for the object value
31+
*/
32+
<T> void save(@NotNull Path path, @NotNull T object, @NotNull TypeToken<T> typeToken);
33+
34+
/**
35+
* Load a given file and parse to the give class.
36+
* @param path is the where the file is located
37+
* @param typeToken the type token to deserialize the object
38+
* @param <T> is generic type for the object value
39+
* @return a {@link Optional} with the object instance
40+
*/
41+
<T> Optional<T> load(@NotNull Path path, @NotNull TypeToken<T> typeToken);
42+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package net.theevilreaper.aves.file;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.reflect.TypeToken;
5+
import net.minestom.server.utils.validate.Check;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.io.IOException;
9+
import java.nio.file.Files;
10+
import java.nio.file.Path;
11+
import java.util.Optional;
12+
13+
/**
14+
* The class represents the implementation of the {@link ModernFileHandler} for the {@link com.google.gson.Gson} library.
15+
* @author TheMeinerLP
16+
* @version 1.0.0
17+
* @since 1.9.0
18+
*/
19+
public class ModernGsonFileHandler implements ModernFileHandler {
20+
21+
private final Gson gson;
22+
23+
/**
24+
* Creates a new instance from the file handler.
25+
*/
26+
public ModernGsonFileHandler() {
27+
this.gson = new Gson();
28+
}
29+
30+
/**
31+
* Creates a new instance from the file handler.
32+
* @param gson the gson instance to deserialize or serialize data
33+
*/
34+
public ModernGsonFileHandler(@NotNull Gson gson) {
35+
this.gson = gson;
36+
}
37+
38+
/**
39+
* Saves a given object into a file.
40+
* @param path The path where the file is located
41+
* @param object The object to save
42+
* @param <T> A generic type for the object value
43+
*/
44+
@Override
45+
public <T> void save(@NotNull Path path, @NotNull T object, @NotNull TypeToken<T> typeToken) {
46+
Check.argCondition(Files.isDirectory(path), "Unable to save a directory. Please check the used path");
47+
try (var outputStream = Files.newBufferedWriter(path, UTF_8)) {
48+
if (!Files.exists(path)) {
49+
var file = Files.createFile(path).getFileName();
50+
LOGGER.info("Created new file: {}", file);
51+
}
52+
gson.toJson(object, typeToken.getRawType(), outputStream);
53+
} catch (IOException exception) {
54+
LOGGER.warn("Unable to save file", exception);
55+
}
56+
}
57+
58+
/**
59+
* Load a given file and parse to the give class.
60+
* @param path is the where the file is located
61+
* @param typeToken the type token to deserialize the object
62+
* @param <T> is generic type for the object value
63+
* @return a {@link Optional} with the object instance
64+
*/
65+
@Override
66+
public <T> Optional<T> load(@NotNull Path path, @NotNull TypeToken<T> typeToken) {
67+
Check.argCondition(Files.isDirectory(path), "Unable to load a directory. Please check the used path");
68+
if (!Files.exists(path)) {
69+
return Optional.empty();
70+
}
71+
72+
try (var reader = Files.newBufferedReader(path, UTF_8)) {
73+
return Optional.ofNullable(gson.fromJson(reader, typeToken));
74+
} catch (IOException exception) {
75+
LOGGER.warn("Unable to load file", exception);
76+
}
77+
return Optional.empty();
78+
}
79+
}

src/main/java/net/theevilreaper/aves/file/gson/ItemStackGsonTypeAdapter.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
import com.google.gson.JsonSerializationContext;
1010
import com.google.gson.JsonSerializer;
1111
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
12-
import net.minestom.server.item.ItemComponent;
12+
import net.minestom.server.component.DataComponents;
1313
import net.minestom.server.item.ItemStack;
1414
import net.minestom.server.item.Material;
1515
import net.minestom.server.item.component.CustomModelData;
16+
import net.minestom.server.item.component.TooltipDisplay;
1617
import org.jetbrains.annotations.NotNull;
1718

1819
import java.lang.reflect.Type;
@@ -38,16 +39,17 @@ public JsonElement serialize(@NotNull ItemStack itemStack, Type type, JsonSerial
3839
serializeCustomName(itemStack, metaObject);
3940
serializeLore(itemStack, metaObject);
4041

41-
if (itemStack.has(ItemComponent.HIDE_TOOLTIP)) {
42-
metaObject.addProperty("hideTooltip", "true");
43-
}
4442

45-
if (itemStack.has(ItemComponent.HIDE_ADDITIONAL_TOOLTIP)) {
46-
metaObject.addProperty("hideAdditionalTooltip", "true");
43+
if (itemStack.has(DataComponents.TOOLTIP_DISPLAY)) {
44+
TooltipDisplay tooltipDisplay = itemStack.get(DataComponents.TOOLTIP_DISPLAY);
45+
if (tooltipDisplay.hideTooltip()) {
46+
metaObject.addProperty("hideTooltip", true);
47+
}
4748
}
4849

49-
if (itemStack.has(ItemComponent.CUSTOM_MODEL_DATA)) {
50-
CustomModelData modelData = itemStack.get(ItemComponent.CUSTOM_MODEL_DATA);
50+
51+
if (itemStack.has(DataComponents.CUSTOM_MODEL_DATA)) {
52+
CustomModelData modelData = itemStack.get(DataComponents.CUSTOM_MODEL_DATA);
5153
JsonElement customData = context.serialize(modelData);
5254
metaObject.add(CUSTOM_MODEL_DATA, customData);
5355
}
@@ -86,17 +88,13 @@ public ItemStack deserialize(@NotNull JsonElement jsonElement, Type type, JsonDe
8688
itemBuilder = deserializeLore(itemBuilder, metaObject);
8789

8890
if (metaObject.has("hideTooltip")) {
89-
itemBuilder.set(ItemComponent.HIDE_TOOLTIP);
90-
}
91-
92-
if (metaObject.has("hideAdditionalTooltip")) {
93-
itemBuilder.set(ItemComponent.HIDE_ADDITIONAL_TOOLTIP);
91+
itemBuilder.set(DataComponents.TOOLTIP_DISPLAY, new TooltipDisplay(true, null));
9492
}
9593

9694
if (metaObject.has(CUSTOM_MODEL_DATA)) {
9795
JsonElement customModelElement = metaObject.get(CUSTOM_MODEL_DATA);
9896
CustomModelData customModelData = context.deserialize(customModelElement, CustomModelData.class);
99-
itemBuilder.set(ItemComponent.CUSTOM_MODEL_DATA, customModelData);
97+
itemBuilder.set(DataComponents.CUSTOM_MODEL_DATA, customModelData);
10098
}
10199

102100
itemBuilder = deserializeEnchantments(itemBuilder, metaObject);

src/main/java/net/theevilreaper/aves/file/gson/ItemStackSerializerHelper.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
import net.kyori.adventure.text.Component;
88
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
99
import net.minestom.server.MinecraftServer;
10-
import net.minestom.server.item.ItemComponent;
10+
import net.minestom.server.component.DataComponents;
1111
import net.minestom.server.item.ItemStack;
1212
import net.minestom.server.item.component.EnchantmentList;
1313
import net.minestom.server.item.enchant.Enchantment;
1414
import net.minestom.server.registry.DynamicRegistry;
15+
import net.minestom.server.registry.RegistryKey;
1516
import org.jetbrains.annotations.NotNull;
1617

1718
import java.util.ArrayList;
@@ -42,8 +43,8 @@ sealed interface ItemStackSerializerHelper permits ItemStackGsonTypeAdapter {
4243
* @param object the object to serialize the data
4344
*/
4445
default void serializeCustomName(@NotNull ItemStack stack, @NotNull JsonObject object) {
45-
if (!stack.has(ItemComponent.CUSTOM_NAME)) return;
46-
final Component itemName = stack.get(ItemComponent.CUSTOM_NAME, Component.empty());
46+
if (!stack.has(DataComponents.CUSTOM_NAME)) return;
47+
final Component itemName = stack.get(DataComponents.CUSTOM_NAME, Component.empty());
4748
final String displayName = plainText().serialize(itemName);
4849
object.addProperty(DISPLAY_NAME, displayName);
4950
}
@@ -55,8 +56,8 @@ default void serializeCustomName(@NotNull ItemStack stack, @NotNull JsonObject o
5556
* @param jsonObject the object to deserialize the data
5657
*/
5758
default void serializeLore(@NotNull ItemStack stack, @NotNull JsonObject jsonObject) {
58-
if (!stack.has(ItemComponent.LORE)) return;
59-
final List<Component> loreLines = stack.get(ItemComponent.LORE);
59+
if (!stack.has(DataComponents.LORE)) return;
60+
final List<Component> loreLines = stack.get(DataComponents.LORE);
6061

6162
if (loreLines != null && !loreLines.isEmpty()) {
6263
JsonArray loreArray = new JsonArray();
@@ -92,12 +93,12 @@ default void serializeLore(@NotNull ItemStack stack, @NotNull JsonObject jsonObj
9293
* @param object the object to serialize the data
9394
*/
9495
default void serializeEnchantments(@NotNull ItemStack stack, @NotNull JsonObject object) {
95-
if (!stack.has(ItemComponent.ENCHANTMENTS)) return;
96+
if (!stack.has(DataComponents.ENCHANTMENTS)) return;
9697
JsonArray enchantsArray = new JsonArray();
97-
final EnchantmentList enchantmentList = stack.get(ItemComponent.ENCHANTMENTS);
98+
final EnchantmentList enchantmentList = stack.get(DataComponents.ENCHANTMENTS);
9899
if (enchantmentList != null && !enchantmentList.enchantments().isEmpty()) {
99-
Set<Map.Entry<DynamicRegistry.Key<Enchantment>, Integer>> entries = enchantmentList.enchantments().entrySet();
100-
for (Map.Entry<DynamicRegistry.Key<Enchantment>, Integer> entry : entries) {
100+
Set<Map.Entry<RegistryKey<Enchantment>, Integer>> entries = enchantmentList.enchantments().entrySet();
101+
for (Map.Entry<RegistryKey<Enchantment>, Integer> entry : entries) {
101102
JsonObject enchantmentObject = new JsonObject();
102103
enchantmentObject.addProperty("enchantment", entry.getKey().name());
103104
enchantmentObject.addProperty("level", entry.getValue());
@@ -117,18 +118,18 @@ default void serializeEnchantments(@NotNull ItemStack stack, @NotNull JsonObject
117118
default @NotNull ItemStack.Builder deserializeEnchantments(@NotNull ItemStack.Builder builder, @NotNull JsonObject object) {
118119
if (!object.has(ENCHANTMENTS)) return builder;
119120
JsonArray enchantsArray = object.getAsJsonArray(ENCHANTMENTS);
120-
Map<DynamicRegistry.Key<Enchantment>, Integer> enchantments = new HashMap<>();
121+
Map<RegistryKey<Enchantment>, Integer> enchantments = new HashMap<>();
121122
for (JsonElement enchantElement : enchantsArray) {
122123
final JsonObject enchantObject = (JsonObject) enchantElement;
123124
String nameSpace = enchantObject.get("enchantment").getAsString();
124125
var level = enchantObject.get("level").getAsInt();
125126
DynamicRegistry<Enchantment> enchantmentRegistry = MinecraftServer.getEnchantmentRegistry();
126127
Enchantment rawEnchantment = enchantmentRegistry.get(Key.key(nameSpace));
127128
if (rawEnchantment == null) continue;
128-
DynamicRegistry.Key<Enchantment> enchantment = enchantmentRegistry.getKey(rawEnchantment);
129+
RegistryKey<Enchantment> enchantment = enchantmentRegistry.getKey(rawEnchantment);
129130
enchantments.putIfAbsent(enchantment, level);
130131
}
131132
EnchantmentList enchantmentList = new EnchantmentList(enchantments);
132-
return builder.set(ItemComponent.ENCHANTMENTS, enchantmentList);
133+
return builder.set(DataComponents.ENCHANTMENTS, enchantmentList);
133134
}
134135
}

0 commit comments

Comments
 (0)