Skip to content

Commit f5d1ea0

Browse files
committed
add custommodeldata migration
1 parent 6d8154d commit f5d1ea0

File tree

1 file changed

+157
-0
lines changed
  • conversions/Forwards/src/main/java/com/agentdid127/resourcepack/forwards/impl/other

1 file changed

+157
-0
lines changed

conversions/Forwards/src/main/java/com/agentdid127/resourcepack/forwards/impl/other/ModelConverter.java

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.agentdid127.resourcepack.forwards.impl.other;
22

3+
import com.agentdid127.resourcepack.forwards.ForwardsPackConverter;
34
import com.agentdid127.resourcepack.library.Converter;
45
import com.agentdid127.resourcepack.library.PackConverter;
56
import com.agentdid127.resourcepack.library.pack.Pack;
@@ -24,11 +25,14 @@ public class ModelConverter extends Converter {
2425
private final int to;
2526
protected String light = "none";
2627

28+
private Pack pack;
29+
2730
public ModelConverter(PackConverter packConverter, String light, int from, int to) {
2831
super(packConverter);
2932
this.light = light;
3033
this.from = from;
3134
this.to = to;
35+
pack = null;
3236
}
3337

3438
@Override
@@ -44,6 +48,7 @@ public boolean shouldConvert(Gson gson, int from, int to) {
4448
*/
4549
@Override
4650
public void convert(Pack pack) throws IOException {
51+
this.pack = pack;
4752
Path models = pack.getWorkingPath().resolve("assets/minecraft/models".replace("/", File.separator));
4853
if (models.toFile().exists()) {
4954
Logger.addTab();
@@ -280,6 +285,28 @@ protected void remapModelJson(Path rootPath, Path model) throws IOException {
280285
}
281286
}
282287

288+
289+
// New Override System for 1.21.4+
290+
if (to >= Util.getVersionProtocol(packConverter.getGson(), "1.21.4")
291+
&& from < Util.getVersionProtocol(packConverter.getGson(), "1.21.4")) {
292+
293+
// Check for new overrides
294+
if (jsonObject.has("overrides")) {
295+
JsonArray overridesArray = jsonObject.get("overrides").getAsJsonArray();
296+
297+
// Convert damages, and model data
298+
if (isDamageModel(overridesArray)) {
299+
createDamageModel(overridesArray, model);
300+
} else if (isCustomModelData(overridesArray)) {
301+
createCustomModelData(overridesArray, model);
302+
}
303+
304+
// remove old damages
305+
jsonObject.remove("overrides");
306+
}
307+
}
308+
309+
283310
if (!JsonUtil.readJson(packConverter.getGson(), model).equals(jsonObject)) {
284311
Logger.debug("Updating Model: " + model.getFileName());
285312
JsonUtil.writeJson(packConverter.getGson(), model, jsonObject);
@@ -291,6 +318,136 @@ protected void remapModelJson(Path rootPath, Path model) throws IOException {
291318
}
292319
}
293320

321+
/**
322+
* Creates a Damage-based item in the new directory for 1.21.4+
323+
*
324+
* @param overrides overrides system from old model
325+
* @param original original model file
326+
* @throws IOException if we can't save the new file.
327+
*/
328+
private void createDamageModel(JsonArray overrides, Path original) throws IOException {
329+
if (pack == null) return;
330+
Path itemsPath = pack.getWorkingPath().resolve("assets/minecraft/items");
331+
if (!itemsPath.toFile().exists()) {
332+
itemsPath.toFile().mkdirs();
333+
}
334+
335+
JsonObject out = new JsonObject();
336+
JsonObject model = new JsonObject();
337+
model.addProperty("type", "range_dispatch");
338+
model.addProperty("property", "damage");
339+
340+
JsonObject fallback = new JsonObject();
341+
fallback.addProperty("type", "model");
342+
343+
fallback.addProperty("model", original.toFile().getAbsolutePath().replace(pack.getWorkingPath().resolve("assets/minecraft/models").toFile().getAbsolutePath() + "/", "").replace(".json", ""));
344+
model.add("fallback", fallback);
345+
346+
347+
// iterate through old override entries, and migrate to new file.
348+
JsonArray entries = new JsonArray();
349+
for (JsonElement override : overrides) {
350+
JsonObject entry = new JsonObject();
351+
if (override.isJsonObject()) {
352+
double damage = override.getAsJsonObject().get("predicate").getAsJsonObject().get("damage").getAsDouble();
353+
String entryModel = override.getAsJsonObject().get("model").getAsString();
354+
355+
entry.addProperty("threshold", damage);
356+
JsonObject modelEntry = new JsonObject();
357+
modelEntry.addProperty("model", entryModel);
358+
modelEntry.addProperty("type", "model");
359+
entry.add("model", modelEntry);
360+
entries.add(entry);
361+
}
362+
}
363+
364+
model.add("entries", entries);
365+
out.add("model", model);
366+
367+
JsonUtil.writeJson(packConverter.getGson(), itemsPath.resolve(original.toFile().getName()), out);
368+
}
369+
370+
371+
/**
372+
* Creates a Custom Model Data based item in the 1.21.4+ format.
373+
*
374+
* @param overrides old overrides
375+
* @param original original model file path
376+
* @throws IOException if we can't save the new file.
377+
*/
378+
private void createCustomModelData(JsonArray overrides, Path original) throws IOException {
379+
if (pack == null) return;
380+
Path itemsPath = pack.getWorkingPath().resolve("assets/minecraft/items");
381+
if (!itemsPath.toFile().exists()) {
382+
itemsPath.toFile().mkdirs();
383+
}
384+
385+
JsonObject out = new JsonObject();
386+
JsonObject model = new JsonObject();
387+
model.addProperty("type", "range_dispatch");
388+
model.addProperty("property", "custom_model_data");
389+
390+
JsonObject fallback = new JsonObject();
391+
fallback.addProperty("type", "model");
392+
fallback.addProperty("model", original.toFile().getAbsolutePath().replace(pack.getWorkingPath().resolve("assets/minecraft/models").toFile().getAbsolutePath() + "/", "").replace(".json", ""));
393+
model.add("fallback", fallback);
394+
395+
JsonArray entries = new JsonArray();
396+
for (JsonElement override : overrides) {
397+
JsonObject entry = new JsonObject();
398+
if (override.isJsonObject()) {
399+
long customModelData = override.getAsJsonObject().get("predicate").getAsJsonObject().get("custom_model_data").getAsLong();
400+
String entryModel = override.getAsJsonObject().get("model").getAsString();
401+
402+
entry.addProperty("threshold", customModelData);
403+
JsonObject modelEntry = new JsonObject();
404+
modelEntry.addProperty("model", entryModel);
405+
modelEntry.addProperty("type", "model");
406+
entry.add("model", modelEntry);
407+
entries.add(entry);
408+
}
409+
}
410+
model.add("entries", entries);
411+
out.add("model", model);
412+
413+
JsonUtil.writeJson(packConverter.getGson(), itemsPath.resolve(original.toFile().getName()), out);
414+
}
415+
416+
/**
417+
* Checks if overrides is damage-based
418+
*
419+
* @param overrides old overrides model
420+
* @return {@code true} if it is a damage-based model
421+
*/
422+
private boolean isDamageModel(JsonArray overrides) {
423+
for (JsonElement override : overrides) {
424+
if (override instanceof JsonObject && override.getAsJsonObject().has("predicate")) {
425+
JsonObject predicate = override.getAsJsonObject().get("predicate").getAsJsonObject();
426+
if (predicate.has("damage") && !predicate.has("custom_model_data")) {
427+
return true;
428+
}
429+
}
430+
}
431+
return false;
432+
}
433+
434+
/**
435+
* Checks if overrides is CustomModelData-based
436+
*
437+
* @param overrides old overrides model
438+
* @return {@code true} if it is a CustomModelData-based model
439+
*/
440+
private boolean isCustomModelData(JsonArray overrides) {
441+
for (JsonElement override : overrides) {
442+
if (override instanceof JsonObject && override.getAsJsonObject().has("predicate")) {
443+
JsonObject predicate = override.getAsJsonObject().get("predicate").getAsJsonObject();
444+
if (!predicate.has("damage") && predicate.has("custom_model_data")) {
445+
return true;
446+
}
447+
}
448+
}
449+
return false;
450+
}
294451
/**
295452
* Gets parent object and sets a new one
296453
*

0 commit comments

Comments
 (0)