diff --git a/.github/scripts/install-local-dependencies.sh b/.github/scripts/install-local-dependencies.sh
new file mode 100644
index 0000000..11879b6
--- /dev/null
+++ b/.github/scripts/install-local-dependencies.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+set -euo pipefail
+# Run from the repository root after downloading the pinned JARs.
+# Hash-qualified versions prevent different private JARs sharing a Maven cache key.
+sha256sum --check .github/dependencies.sha256
+
+mvn -B --no-transfer-progress org.apache.maven.plugins:maven-install-plugin:3.1.4:install-file \
+ -Dfile="libs/gson-2.10.1.jar" -DgroupId="local" -DartifactId="gson" \
+ -Dversion="2.10.1-tfmc-4241c14a7727" -Dpackaging=jar -DgeneratePom=true "$@"
+mvn -B --no-transfer-progress org.apache.maven.plugins:maven-install-plugin:3.1.4:install-file \
+ -Dfile="libs/json-simple-1.1.jar" -DgroupId="local" -DartifactId="json-simple" \
+ -Dversion="1.1-tfmc-2d9484f4c649" -Dpackaging=jar -DgeneratePom=true "$@"
+mvn -B --no-transfer-progress org.apache.maven.plugins:maven-install-plugin:3.1.4:install-file \
+ -Dfile="libs/MMOItems-6.10.jar" -DgroupId="local" -DartifactId="MMOItems" \
+ -Dversion="6.10-tfmc-c84700df5942" -Dpackaging=jar -DgeneratePom=true "$@"
+mvn -B --no-transfer-progress org.apache.maven.plugins:maven-install-plugin:3.1.4:install-file \
+ -Dfile="libs/MythicLib-1.7.jar" -DgroupId="local" -DartifactId="MythicLib" \
+ -Dversion="1.7-tfmc-660ff2a6ec86" -Dpackaging=jar -DgeneratePom=true "$@"
+mvn -B --no-transfer-progress org.apache.maven.plugins:maven-install-plugin:3.1.4:install-file \
+ -Dfile="libs/ItemsAdder_3.5.0-r2.jar" -DgroupId="local" -DartifactId="LoneLibs" \
+ -Dversion="3.5.0-tfmc-0116d714822b" -Dpackaging=jar -DgeneratePom=true "$@"
diff --git a/.github/scripts/prepare-release.sh b/.github/scripts/prepare-release.sh
index d98ebe0..8074816 100755
--- a/.github/scripts/prepare-release.sh
+++ b/.github/scripts/prepare-release.sh
@@ -8,4 +8,4 @@ curl --fail --location --silent --show-error --retry 3 -H "Authorization: Bearer
curl --fail --location --silent --show-error --retry 3 -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/vnd.github.raw+json" "https://api.github.com/repos/TF-Minecraft/ServerAssets/contents/jars/c84700df5942/MMOItems-6.10.jar?ref=$ref" > "libs/MMOItems-6.10.jar"
curl --fail --location --silent --show-error --retry 3 -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/vnd.github.raw+json" "https://api.github.com/repos/TF-Minecraft/ServerAssets/contents/jars/660ff2a6ec86/MythicLib-1.7.jar?ref=$ref" > "libs/MythicLib-1.7.jar"
curl --fail --location --silent --show-error --retry 3 -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/vnd.github.raw+json" "https://api.github.com/repos/TF-Minecraft/ServerAssets/contents/jars/0116d714822b/ItemsAdder_3.5.0-r2.jar?ref=$ref" > "libs/ItemsAdder_3.5.0-r2.jar"
-sha256sum --check .github/dependencies.sha256
+bash .github/scripts/install-local-dependencies.sh "$@"
diff --git a/pom.xml b/pom.xml
index e2183db..86cffae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,30 +19,26 @@
local
gson
- 2.10.1
- system
- ${project.basedir}/libs/gson-2.10.1.jar
+ 2.10.1-tfmc-4241c14a7727
+ provided
local
json-simple
- 1.1
- system
- ${project.basedir}/libs/json-simple-1.1.jar
+ 1.1-tfmc-2d9484f4c649
+ provided
local
MMOItems
- 6.10
- system
- ${project.basedir}/libs/MMOItems-6.10.jar
+ 6.10-tfmc-c84700df5942
+ provided
local
MythicLib
- 1.7
- system
- ${project.basedir}/libs/MythicLib-1.7.jar
+ 1.7-tfmc-660ff2a6ec86
+ provided
org.spigotmc
@@ -65,9 +61,8 @@
local
LoneLibs
- 3.5.0
- system
- ${project.basedir}/libs/ItemsAdder_3.5.0-r2.jar
+ 3.5.0-tfmc-0116d714822b
+ provided
commons-lang
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/lifecycle/PlayerAlloyForgeTracker.java b/src/main/java/net/tfminecraft/advancedcrafting/lifecycle/PlayerAlloyForgeTracker.java
index a76aa8d..71b370e 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/lifecycle/PlayerAlloyForgeTracker.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/lifecycle/PlayerAlloyForgeTracker.java
@@ -6,6 +6,7 @@
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashSet;
+import java.util.ArrayList;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;
@@ -82,13 +83,9 @@ private void saveForgedIds(UUID playerUuid, Set forged) {
CACHE.put(playerUuid, forged);
File file = playerFile(playerUuid);
- JSONArray array = new JSONArray();
- for (String id : forged) {
- array.add(id);
- }
try (PrintWriter writer = new PrintWriter(new FileWriter(file, false))) {
- writer.print(array.toJSONString());
+ writer.print(JSONArray.toJSONString(new ArrayList<>(forged)));
writer.flush();
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/managers/AlloyManager.java b/src/main/java/net/tfminecraft/advancedcrafting/managers/AlloyManager.java
index f906f93..a4eeb5b 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/managers/AlloyManager.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/managers/AlloyManager.java
@@ -20,7 +20,6 @@
import dev.lone.itemsadder.api.CustomStack;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.BlockAPI;
import net.tfminecraft.tlibs.objects.api.subapi.StringFormatter;
import net.tfminecraft.advancedcrafting.AdvancedCrafting;
@@ -71,7 +70,7 @@ public void removeStation(AlloyStation station) {
public boolean isAlloyStation(Block b) {
String path = Cache.alloyStation;
- BlockAPI api = (BlockAPI) TLibs.getApiInstance(APIType.BLOCK_API);
+ BlockAPI api = TLibs.getBlockAPI();
return api.getChecker().checkBlock(b, path);
}
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/managers/CraftingManager.java b/src/main/java/net/tfminecraft/advancedcrafting/managers/CraftingManager.java
index 5de1e82..72f4514 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/managers/CraftingManager.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/managers/CraftingManager.java
@@ -31,7 +31,6 @@
import dev.lone.itemsadder.api.Events.FurnitureBreakEvent;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.BlockAPI;
import net.tfminecraft.tlibs.objects.api.ItemAPI;
import net.tfminecraft.advancedcrafting.AdvancedCrafting;
@@ -67,7 +66,7 @@ private boolean isCraftingStation(Block b) {
if (b == null || Cache.craftingStation == null) {
return false;
}
- BlockAPI blockApi = (BlockAPI) TLibs.getApiInstance(APIType.BLOCK_API);
+ BlockAPI blockApi = TLibs.getBlockAPI();
return blockApi.getChecker().checkBlock(b, Cache.craftingStation);
}
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/managers/IngredientManager.java b/src/main/java/net/tfminecraft/advancedcrafting/managers/IngredientManager.java
index 30a8a1f..7d0f370 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/managers/IngredientManager.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/managers/IngredientManager.java
@@ -13,7 +13,6 @@
import dev.lone.itemsadder.api.CustomStack;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.BlockAPI;
import net.tfminecraft.advancedcrafting.cache.Cache;
import net.tfminecraft.advancedcrafting.objects.alloys.Alloy;
@@ -35,7 +34,7 @@ public Ingredient get(String path) {
public boolean isIngredientStation(Block b) {
String path = Cache.ingredientStation;
- BlockAPI api = (BlockAPI) TLibs.getApiInstance(APIType.BLOCK_API);
+ BlockAPI api = TLibs.getBlockAPI();
return api.getChecker().checkBlock(b, path);
}
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/managers/InventoryManager.java b/src/main/java/net/tfminecraft/advancedcrafting/managers/InventoryManager.java
index 83915b8..17e7e86 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/managers/InventoryManager.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/managers/InventoryManager.java
@@ -1,5 +1,7 @@
package net.tfminecraft.advancedcrafting.managers;
+import net.tfminecraft.advancedcrafting.util.LegacyModelData;
+
import java.util.ArrayList;
import java.util.List;
@@ -12,7 +14,6 @@
import org.bukkit.persistence.PersistentDataType;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.ItemAPI;
import net.tfminecraft.tlibs.objects.api.subapi.StringFormatter;
import net.tfminecraft.advancedcrafting.AdvancedCrafting;
@@ -129,14 +130,14 @@ private ItemStack getCategoryItem(RecipeCategory c) {
i.setItemMeta(m);
return i;
}
- ItemAPI api = (ItemAPI) TLibs.getApiInstance(APIType.ITEM_API);
+ ItemAPI api = TLibs.getItemAPI();
ItemStack template = api.getCreator().getItemFromPath("m."+c.getRecipes().get(0).getTemplate());
if(template != null) {
i.setType(template.getType());
}
ItemMeta m = i.getItemMeta();
- if(template != null && template.getItemMeta().hasCustomModelData()) {
- m.setCustomModelData(template.getItemMeta().getCustomModelData());
+ if(template != null && LegacyModelData.has(template.getItemMeta())) {
+ LegacyModelData.set(m, LegacyModelData.get(template.getItemMeta()));
}
m.setDisplayName(c.getName());
List lore = new ArrayList<>();
@@ -150,7 +151,7 @@ private ItemStack getCategoryItem(RecipeCategory c) {
private ItemStack getRecipeItem(CraftingRecipe r) {
ItemStack fallback = new ItemStack(Material.BARRIER, 1);
- ItemAPI api = (ItemAPI) TLibs.getApiInstance(APIType.ITEM_API);
+ ItemAPI api = TLibs.getItemAPI();
String path = r.resolveMenuIconPath();
ItemStack base = api.getCreator().getItemFromPath(path);
if (base == null || (path.toLowerCase().startsWith("ia.") && base.getType() == Material.DIRT)) {
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/Alloy.java b/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/Alloy.java
index 874cc93..b1680d8 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/Alloy.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/objects/alloys/Alloy.java
@@ -1,5 +1,7 @@
package net.tfminecraft.advancedcrafting.objects.alloys;
+import net.tfminecraft.advancedcrafting.util.LegacyModelData;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -13,7 +15,6 @@
import io.lumine.mythic.lib.api.item.NBTItem;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.ItemAPI;
import net.tfminecraft.tlibs.objects.api.subapi.StringFormatter;
import net.Indyuce.mmoitems.ItemStats;
@@ -58,13 +59,13 @@ public Alloy(String id, String name, AlloyData data) {
@SuppressWarnings("deprecation")
public ItemStack build() {
- ItemAPI api = (ItemAPI) TLibs.getApiInstance(APIType.ITEM_API);
+ ItemAPI api = TLibs.getItemAPI();
ItemStack template = api.getCreator().getItemFromPath(data.getColourScheme().getItem());
MMOItem mmo = new LiveMMOItem(NBTItem.get(template));
StringData itemName = (StringData) mmo.getData(ItemStats.NAME);
itemName.setString(name);
mmo.replaceData(ItemStats.NAME, itemName);
- StatHistory hist = StatHistory.from(mmo, ItemStats.NAME);
+ StatHistory hist = mmo.computeStatHistory(ItemStats.NAME);
if (hist != null) {
NameData og = (NameData) hist.getOriginalData();
og.setString(name);
@@ -79,7 +80,7 @@ public ItemStack build() {
ItemMeta m = i.getItemMeta();
m.addEnchant(Enchantment.UNBREAKING, 1, true);
m.addItemFlags(ItemFlag.HIDE_ENCHANTS);
- m.setCustomModelData(data.getModel());
+ LegacyModelData.set(m, data.getModel());
m.getPersistentDataContainer().set(PDCKeys.alloyId(), PersistentDataType.STRING, id);
AcItemTags.write(m, revision, loreBlock);
i.setItemMeta(m);
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/objects/crafting/CraftingStation.java b/src/main/java/net/tfminecraft/advancedcrafting/objects/crafting/CraftingStation.java
index 8481fc0..236a99c 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/objects/crafting/CraftingStation.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/objects/crafting/CraftingStation.java
@@ -1,5 +1,7 @@
package net.tfminecraft.advancedcrafting.objects.crafting;
+import net.tfminecraft.advancedcrafting.util.LegacyModelData;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -17,7 +19,6 @@
import io.lumine.mythic.lib.api.item.NBTItem;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.ItemAPI;
import net.tfminecraft.tlibs.objects.utils.IntCounter;
import net.Indyuce.mmoitems.ItemStats;
@@ -386,7 +387,7 @@ private StationFeedback createItem(Player p, Double forcedQualityPercent) {
if (forcedQualityPercent == null && !checkHits(p)) {
return StationFeedback.LACKING_HITS;
}
- ItemAPI api = (ItemAPI) TLibs.getApiInstance(APIType.ITEM_API);
+ ItemAPI api = TLibs.getItemAPI();
result = api.getCreator().getItemFromPath("m."+recipe.getTemplate());
MMOItem mmo = new LiveMMOItem(NBTItem.get(result));
MMOStatApplicator.applyExternalLayer(mmo, stats, CraftStatCalculator.collectManagedStatIds(recipe), true);
@@ -439,7 +440,7 @@ private StationFeedback createItem(Player p, Double forcedQualityPercent) {
mmo.replaceData(ItemStats.NAME, itemName);
- StatHistory hist = StatHistory.from(mmo, ItemStats.NAME);
+ StatHistory hist = mmo.computeStatHistory(ItemStats.NAME);
if (hist != null) {
NameData og = (NameData) hist.getOriginalData();
og.setString(result);
@@ -507,10 +508,10 @@ private ItemStack applyModel(ItemStack i, ModelScheme scheme) {
if(type.equalsIgnoreCase("v")) {
i.setType(Material.valueOf(path.split("\\.")[1].toUpperCase()));
ItemMeta m = i.getItemMeta();
- m.setCustomModelData(Integer.parseInt(path.split("\\.")[2]));
+ LegacyModelData.set(m, Integer.parseInt(path.split("\\.")[2]));
i.setItemMeta(m);
} else if(type.equalsIgnoreCase("ia")) {
- ItemAPI api = (ItemAPI) TLibs.getApiInstance(APIType.ITEM_API);
+ ItemAPI api = TLibs.getItemAPI();
i = api.getArmorMerger().merge(i, Optional.empty(), path);
}
return i;
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/objects/ingredients/Ingredient.java b/src/main/java/net/tfminecraft/advancedcrafting/objects/ingredients/Ingredient.java
index 31bbcdc..77ee6dc 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/objects/ingredients/Ingredient.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/objects/ingredients/Ingredient.java
@@ -10,7 +10,6 @@
import org.bukkit.persistence.PersistentDataType;
import net.tfminecraft.tlibs.TLibs;
-import net.tfminecraft.tlibs.enums.APIType;
import net.tfminecraft.tlibs.objects.api.ItemAPI;
import net.tfminecraft.tlibs.objects.api.subapi.StringFormatter;
import net.tfminecraft.advancedcrafting.objects.data.IngredientData;
@@ -80,7 +79,7 @@ public void buildTo(ItemStack i) {
}
public ItemStack build() {
- ItemAPI api = (ItemAPI) TLibs.getApiInstance(APIType.ITEM_API);
+ ItemAPI api = TLibs.getItemAPI();
ItemStack i = api.getCreator().getItemFromPath(path);
buildTo(i);
return i;
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/util/LegacyModelData.java b/src/main/java/net/tfminecraft/advancedcrafting/util/LegacyModelData.java
new file mode 100644
index 0000000..23b730b
--- /dev/null
+++ b/src/main/java/net/tfminecraft/advancedcrafting/util/LegacyModelData.java
@@ -0,0 +1,36 @@
+package net.tfminecraft.advancedcrafting.util;
+
+import java.util.List;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.components.CustomModelDataComponent;
+
+/** Preserves the integer model IDs used by existing configuration and resource packs. */
+public final class LegacyModelData {
+ private LegacyModelData() {}
+
+ public static boolean has(ItemMeta meta) {
+ return !meta.getCustomModelDataComponent().getFloats().isEmpty();
+ }
+
+ public static int get(ItemMeta meta) {
+ List floats = meta.getCustomModelDataComponent().getFloats();
+ if (floats.isEmpty()) {
+ throw new IllegalStateException("We don't have CustomModelData! Check hasCustomModelData first!");
+ }
+ return floats.get(0).intValue();
+ }
+
+ public static void set(ItemMeta meta, Integer value) {
+ if (value == null) {
+ meta.setCustomModelDataComponent(null);
+ return;
+ }
+ CustomModelDataComponent component = meta.getCustomModelDataComponent();
+ // The former integer setter replaced the entire component, not just its first float.
+ component.setFloats(List.of(value.floatValue()));
+ component.setFlags(List.of());
+ component.setStrings(List.of());
+ component.setColors(List.of());
+ meta.setCustomModelDataComponent(component);
+ }
+}
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/utils/MMOStatApplicator.java b/src/main/java/net/tfminecraft/advancedcrafting/utils/MMOStatApplicator.java
index 62f5de1..43a3521 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/utils/MMOStatApplicator.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/utils/MMOStatApplicator.java
@@ -92,7 +92,7 @@ private static void clearExternalLayer(MMOItem mmo, Set managedStatIds)
if (itemStat == null) {
continue;
}
- StatHistory hist = StatHistory.from(mmo, itemStat);
+ StatHistory hist = mmo.computeStatHistory(itemStat);
if (hist != null) {
hist.clearExternalData();
mmo.setStatHistory(itemStat, hist);
@@ -110,7 +110,7 @@ private static void zeroOriginalLayer(MMOItem mmo, Set managedStatIds) {
if (itemStat == null) {
continue;
}
- StatHistory hist = StatHistory.from(mmo, itemStat);
+ StatHistory hist = mmo.computeStatHistory(itemStat);
if (hist != null) {
Object og = hist.getOriginalData();
if (og instanceof DoubleData doubleOg) {
@@ -124,7 +124,7 @@ private static void zeroOriginalLayer(MMOItem mmo, Set managedStatIds) {
@SuppressWarnings("deprecation")
private static void registerExternal(MMOItem mmo, ItemStat, ?> itemStat, DoubleData data) {
- StatHistory hist = StatHistory.from(mmo, itemStat);
+ StatHistory hist = mmo.computeStatHistory(itemStat);
if (hist != null) {
hist.registerExternalData(data);
mmo.setStatHistory(itemStat, hist);
diff --git a/src/main/java/net/tfminecraft/advancedcrafting/utils/StatRefreshDebug.java b/src/main/java/net/tfminecraft/advancedcrafting/utils/StatRefreshDebug.java
index 29ea676..c8dc647 100644
--- a/src/main/java/net/tfminecraft/advancedcrafting/utils/StatRefreshDebug.java
+++ b/src/main/java/net/tfminecraft/advancedcrafting/utils/StatRefreshDebug.java
@@ -91,7 +91,7 @@ private static void logStatLine(String phase, LiveMMOItem mmo, String statId, Do
double total = current != null ? current.getValue() : 0;
double og = 0;
double external = 0;
- StatHistory hist = StatHistory.from(mmo, itemStat);
+ StatHistory hist = mmo.computeStatHistory(itemStat);
if (hist != null) {
Object ogData = hist.getOriginalData();
if (ogData instanceof DoubleData doubleOg) {