Skip to content

Commit 6b87a7e

Browse files
committed
New DTN Data-Driven DogModel System!
Created a dedicated format to represent DTN Model in json. See DTNModelCodec for more info. Allows DTN to get dog models from jsons in the format above located at assets/<namespace>/doggytalents/dog_models. This allow adding models through resourcepacks, in which the model is provided at the path above with namespace being the pack's namespace. This pack will be compatible with all supported DTN version regardless of MC Version.
1 parent 144dc1b commit 6b87a7e

16 files changed

+1110
-197
lines changed

src/main/java/doggytalents/client/ClientSetup.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import doggytalents.client.entity.model.SyncedRenderFunctionWithHeadModel;
1919
import doggytalents.client.entity.model.TorchDogModel;
2020
import doggytalents.client.entity.model.animation.DTNAnimationLoader;
21+
import doggytalents.client.entity.model.animation.DTNModelLoader;
2122
import doggytalents.client.entity.model.animation.DogAnimationRegistry;
2223
import doggytalents.client.entity.model.dog.DogModel;
2324
import doggytalents.client.entity.model.dog.NullDogModel;
@@ -442,6 +443,7 @@ public static void registerOverlay(RegisterGuiLayersEvent e) {
442443
}
443444

444445
public static void addClientReloadListeners(final RegisterClientReloadListenersEvent event) {
446+
event.registerReloadListener(DTNModelLoader.INSTANCE);
445447
event.registerReloadListener(DogTextureManager.INSTANCE);
446448
event.registerReloadListener(DogRandomNameRegistry.getInstance());
447449
event.registerReloadListener(DTNAnimationLoader.INSTANCE);

src/main/java/doggytalents/client/DogTextureManager.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,20 @@ public RegsiterResult getSkinFromSkinJson(ResourceManager resMan, DogTextureMana
201201
} else {
202202
text_rl = Util.getResource("textures/entity/dog/custom/" + id + ".png");
203203
}
204+
204205
DogSkin skin;
205-
if (use_model == null || use_model.equals("default") || use_model.equals("")) {
206+
final boolean use_default_model =
207+
use_model == null || use_model.equals("default") || use_model.equals("");
208+
if (!use_default_model) {
209+
skin = new DogSkin(text_rl, true).setName(name);
210+
prep.dogSkinWithCustomModel.add(Pair.of(skin, use_model));
211+
} else {
206212
skin = new DogSkin(text_rl).setName(name);
207-
} else if (use_model.equals("variant")) {
208-
var dogModel = DogModelRegistry.getDogModelHolder(use_model);
209-
skin = (dogModel == null) ?
210-
new DogSkin(text_rl).setName(name)
211-
: new DogSkin(text_rl, dogModel).setName(name);
213+
}
214+
215+
final boolean is_legacy_variant_model =
216+
"variant".equals(use_model);
217+
if (is_legacy_variant_model){
212218
var tailOptional = skinObject.get("tail_id");
213219
if (tailOptional != null) {
214220
skin.setTail(tailOptional.getAsByte());
@@ -217,10 +223,6 @@ public RegsiterResult getSkinFromSkinJson(ResourceManager resMan, DogTextureMana
217223
if (earOptional != null) {
218224
skin.setEar(earOptional.getAsByte());
219225
}
220-
} else {
221-
var dogModel = DogModelRegistry.getDogModelHolder(use_model);
222-
if (dogModel == null) skin = new DogSkin(text_rl).setName(name);
223-
else skin = new DogSkin(text_rl, dogModel).setName(name);
224226
}
225227

226228
readSkinExtraInfo(skin, skinObject);
@@ -288,10 +290,28 @@ protected void apply(DogTextureManager.DogSkinLoadResult loadResult, ResourceMan
288290
var skin_list = new ArrayList<DogSkin>();
289291

290292
skin_list.add(DogSkin.CLASSICAL);
293+
294+
//Model resolution
295+
for (var entry : loadResult.dogSkinWithCustomModel) {
296+
var skin = entry.getLeft();
297+
var model_id = entry.getRight();
298+
var model = DogModelRegistry.getDogModelHolder(model_id);
299+
if (model != null) {
300+
skin.setCustomModel(model);
301+
} else {
302+
DogTextureManager.LOGGER.warn(
303+
"Skin [ {} ] refers to the missing model: [ {} ]",
304+
skin.getPath().getPath(), model_id
305+
);
306+
}
307+
}
291308

292309
for (var entry : loadResult.dogSkinsAndHash) {
293310
var skin = entry.getLeft();
294311
var hash = entry.getRight();
312+
if (skin.useCustomModel() && skin.getCustomModel() == null) {
313+
continue;
314+
}
295315
if (isDogSkinBlacklisted(skin)) {
296316
++skipping_cnt;
297317
continue;
@@ -348,10 +368,12 @@ public String getName() {
348368
protected static class DogSkinLoadResult {
349369

350370
public final List<Pair<DogSkin, String>> dogSkinsAndHash;
371+
public final List<Pair<DogSkin, String>> dogSkinWithCustomModel;
351372
private final Set<String> registeredHash;
352373

353374
public DogSkinLoadResult() {
354375
this.dogSkinsAndHash = new ArrayList<>();
376+
this.dogSkinWithCustomModel = new ArrayList<>();
355377
this.registeredHash = new HashSet<>();
356378
}
357379

0 commit comments

Comments
 (0)