Skip to content

Commit 4faad34

Browse files
XxFran10xXclaude
andcommitted
Address review: drop a stale scheme tag and malformed recorded inputs
- applyTo removes ac_craft_model_scheme when the recipe or inputs no longer resolve, so ArmourShop never trusts an old metal. - readFrom drops recorded inputs with a null entry, kind or id, which every refresh consumer (outdated check, stat calculator, majority tier, scheme resolver) reads; the resolver also skips them when called directly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 7fe627c commit 4faad34

4 files changed

Lines changed: 38 additions & 1 deletion

File tree

‎src/main/java/net/tfminecraft/advancedcrafting/objects/data/CraftProvenance.java‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ public void applyTo(ItemStack item) {
107107
if (scheme != null) {
108108
meta.getPersistentDataContainer().set(PDCKeys.craftModelScheme(), PersistentDataType.STRING,
109109
scheme.getId());
110+
} else {
111+
// A recipe or ingredient that no longer resolves must not leave an old metal for ArmourShop to trust.
112+
meta.getPersistentDataContainer().remove(PDCKeys.craftModelScheme());
110113
}
111114
item.setItemMeta(meta);
112115
}
@@ -129,7 +132,12 @@ public static CraftProvenance readFrom(ItemStack item) {
129132
if (inputsJson != null) {
130133
List<CraftInput> parsed = GSON.fromJson(inputsJson, new TypeToken<List<CraftInput>>() {}.getType());
131134
if (parsed != null) {
132-
inputs = parsed;
135+
// Every refresh consumer reads these inputs; a hand-edited or truncated record must not break them.
136+
for (CraftInput input : parsed) {
137+
if (input != null && input.getKind() != null && input.getId() != null) {
138+
inputs.add(input);
139+
}
140+
}
133141
}
134142
}
135143
Integer templateRevision = meta.getPersistentDataContainer().get(PDCKeys.craftStatTemplateRevision(),

‎src/main/java/net/tfminecraft/advancedcrafting/utils/ModelSchemeResolver.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public static ModelScheme resolve(CraftingRecipe recipe, List<CraftInput> inputs
2828
}
2929
HashMap<String, Integer> materials = new HashMap<>();
3030
for (CraftInput input : inputs) {
31+
if (input == null || input.getKind() == null || input.getId() == null) {
32+
continue;
33+
}
3134
materials.put(input.getKind().toLowerCase() + "." + input.getId().toLowerCase(), input.getAmount());
3235
}
3336
ModelScheme main = schemeOf(MajorityTierResolver.resolveMajorityKey(recipe, materials), null, null);

‎src/test/java/net/tfminecraft/advancedcrafting/ItemMetadataCoverageTest.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,25 @@ void craftProvenanceRoundTripsAndDetectsIngredientAndTemplateRevisions() throws
223223
meta.getPersistentDataContainer().set(PDCKeys.craftInputs(), PersistentDataType.STRING, "null");
224224
minimal.setItemMeta(meta);
225225
assertTrue(CraftProvenance.readFrom(minimal).getInputs().isEmpty());
226+
// Malformed records (null entries, kinds or ids) are dropped instead of breaking every refresh.
227+
meta = minimal.getItemMeta();
228+
meta.getPersistentDataContainer()
229+
.set(
230+
PDCKeys.craftInputs(),
231+
PersistentDataType.STRING,
232+
"[null,{\"id\":\"iron\",\"n\":1},{\"k\":\"ingredient\",\"n\":1},"
233+
+ "{\"k\":\"ingredient\",\"id\":\"iron\",\"n\":2,\"r\":1}]");
234+
minimal.setItemMeta(meta);
235+
var kept = CraftProvenance.readFrom(minimal).getInputs();
236+
assertEquals(1, kept.size());
237+
assertEquals("iron", kept.get(0).getId());
238+
// A record whose recipe no longer resolves loses its old scheme tag.
239+
meta = minimal.getItemMeta();
240+
meta.getPersistentDataContainer().set(PDCKeys.craftModelScheme(), PersistentDataType.STRING, "old");
241+
minimal.setItemMeta(meta);
242+
CraftProvenance.readFrom(minimal).applyTo(minimal);
243+
assertNull(
244+
minimal.getItemMeta().getPersistentDataContainer().get(PDCKeys.craftModelScheme(), PersistentDataType.STRING));
226245
assertNotNull(new CraftProvenance().getInputs());
227246
}
228247

‎src/test/java/net/tfminecraft/advancedcrafting/ModelSchemeResolverTest.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ void recordedCraftsResolveTheSchemeTheirLookCameFromAndAlloysUseTheirBase() thro
6767
in("ingredient", "", 1),
6868
in("misc", "x", 1)));
6969
assertNull(scheme(noModel, in("ingredient", "gone", 1)));
70+
// Malformed inputs are skipped.
71+
assertEquals(
72+
"iron",
73+
ModelSchemeResolver.resolve(
74+
noModel,
75+
Arrays.asList(null, in(null, "iron", 1), in("ingredient", null, 1), in("ingredient", "iron", 3)))
76+
.getId());
7077
assertNull(scheme(noModel, in("alloy", "gone", 1)));
7178
}
7279
}

0 commit comments

Comments
 (0)