11package com .agentdid127 .resourcepack .forwards .impl .other ;
22
3+ import com .agentdid127 .resourcepack .forwards .ForwardsPackConverter ;
34import com .agentdid127 .resourcepack .library .Converter ;
45import com .agentdid127 .resourcepack .library .PackConverter ;
56import 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