Update mson and switch to using entity renderer conditions rather than re-registering when configs change

This commit is contained in:
Sollace 2024-11-22 15:18:59 +00:00
parent f72fdaaebe
commit 088175a862
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
6 changed files with 70 additions and 115 deletions

View file

@ -22,4 +22,4 @@ org.gradle.daemon=false
modmenu_version=12.0.0-beta.1 modmenu_version=12.0.0-beta.1
kirin_version=1.20.1+1.21.3 kirin_version=1.20.1+1.21.3
hd_skins_version=6.14.0+1.21.3 hd_skins_version=6.14.0+1.21.3
mson_version=1.11.0+1.21.3 mson_version=1.11.1-beta.2+1.21.3

View file

@ -14,6 +14,7 @@ import com.minelittlepony.common.event.SkinFilterCallback;
import com.minelittlepony.common.util.GamePaths; import com.minelittlepony.common.util.GamePaths;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.concurrent.atomic.AtomicBoolean;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
@ -47,7 +48,8 @@ public class MineLittlePony implements ClientModInitializer {
private final KeyBinding keyBinding = new KeyBinding("key.minelittlepony.settings", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_F9, "key.categories.misc"); private final KeyBinding keyBinding = new KeyBinding("key.minelittlepony.settings", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_F9, "key.categories.misc");
private final PonyRenderDispatcher renderDispatcher = new PonyRenderDispatcher(); private final PonyRenderDispatcher renderDispatcher = new PonyRenderDispatcher();
private boolean initialized; private final AtomicBoolean initialized = new AtomicBoolean();
private final AtomicBoolean configChanged = new AtomicBoolean();
private boolean hasHdSkins; private boolean hasHdSkins;
private boolean hasModMenu; private boolean hasModMenu;
@ -92,7 +94,7 @@ public class MineLittlePony implements ClientModInitializer {
new ClientSkinsProxy(); new ClientSkinsProxy();
config.load(); config.load();
config.onChangedExternally(c -> initialized = false); config.onChangedExternally(c -> configChanged.set(true));
ClientChannel.bootstrap(); ClientChannel.bootstrap();
ModelType.bootstrap(); ModelType.bootstrap();
@ -101,13 +103,12 @@ public class MineLittlePony implements ClientModInitializer {
} }
private void onTick(MinecraftClient client) { private void onTick(MinecraftClient client) {
if (!initialized) { if (!initialized.getAndSet(true)) {
initialized = true;
renderDispatcher.initialise(client.getEntityRenderDispatcher(), false); renderDispatcher.initialise(client.getEntityRenderDispatcher(), false);
if (client.currentScreen instanceof PonySettingsScreen screen) {
screen.init(client, screen.width, screen.height);
} }
if (configChanged.getAndSet(false) && client.currentScreen instanceof PonySettingsScreen screen) {
screen.init(client, screen.width, screen.height);
} }
boolean inGame = client.world != null && client.player != null && client.currentScreen == null; boolean inGame = client.world != null && client.player != null && client.currentScreen == null;
@ -163,7 +164,7 @@ public class MineLittlePony implements ClientModInitializer {
private static final class ClientPonyConfig extends PonyConfig { private static final class ClientPonyConfig extends PonyConfig {
public ClientPonyConfig(Path path) { public ClientPonyConfig(Path path) {
super(path); super(path);
MobRenderers.REGISTRY.values().forEach(r -> value("entities", r.name, true)); MobRenderers.REGISTRY.values().forEach(r -> value("entities", r.name(), true));
disablePonifiedArmour.onChanged(t -> ArmourTextureResolver.INSTANCE.invalidate()); disablePonifiedArmour.onChanged(t -> ArmourTextureResolver.INSTANCE.invalidate());
} }

View file

@ -157,9 +157,9 @@ public class PonySettingsScreen extends GameGui {
content.addButton(new Label(RIGHT, row)).getStyle().setText(MOB_PREFIX + "title"); content.addButton(new Label(RIGHT, row)).getStyle().setText(MOB_PREFIX + "title");
for (MobRenderers i : MobRenderers.REGISTRY.values()) { for (MobRenderers i : MobRenderers.REGISTRY.values()) {
content.addButton(new Toggle(RIGHT, row += 20, i.get())) content.addButton(new Toggle(RIGHT, row += 20, i.option()))
.onChange(i::set) .onChange(i.option())
.getStyle().setText(MOB_PREFIX + i.name); .getStyle().setText(MOB_PREFIX + i.name());
} }
row += 15; row += 15;

View file

@ -1,106 +1,82 @@
package com.minelittlepony.client.render; package com.minelittlepony.client.render;
import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.config.PonyConfig;
import com.minelittlepony.client.MineLittlePony;
import com.minelittlepony.client.render.entity.*; import com.minelittlepony.client.render.entity.*;
import com.minelittlepony.client.render.entity.npc.*; import com.minelittlepony.client.render.entity.npc.*;
import com.minelittlepony.common.util.settings.Setting; import com.minelittlepony.common.util.settings.Setting;
import com.minelittlepony.mson.api.EntityRendererRegistry;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Predicate;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
/** /**
* Central location where new entity renderers are registered and applied. * Central location where new entity renderers are registered and applied.
*/ */
public class MobRenderers { public record MobRenderers (String name, BiConsumer<MobRenderers, EntityRendererRegistry> changer) implements Predicate<Entity> {
public static final Map<String, MobRenderers> REGISTRY = new HashMap<>(); public static final Map<String, MobRenderers> REGISTRY = new HashMap<>();
public static final MobRenderers VILLAGER = register("villagers", (state, pony) -> { public static MobRenderers register(String name, BiConsumer<MobRenderers, EntityRendererRegistry> changer) {
pony.switchRenderer(state, EntityType.VILLAGER, VillagerPonyRenderer::new); return REGISTRY.computeIfAbsent(name, n -> new MobRenderers(name, changer));
pony.switchRenderer(state, EntityType.WITCH, WitchRenderer::new);
pony.switchRenderer(state, EntityType.ZOMBIE_VILLAGER, ZomponyVillagerRenderer::new);
pony.switchRenderer(state, EntityType.WANDERING_TRADER, TraderRenderer::new);
});
public static final MobRenderers ILLAGER = register("illagers", (state, pony) -> {
pony.switchRenderer(state, EntityType.VEX, VexRenderer::new);
pony.switchRenderer(state, EntityType.EVOKER, IllagerPonyRenderer::evoker);
pony.switchRenderer(state, EntityType.VINDICATOR, IllagerPonyRenderer::vindicator);
pony.switchRenderer(state, EntityType.ILLUSIONER, IllusionistPonyRenderer::new);
pony.switchRenderer(state, EntityType.PILLAGER, IllagerPonyRenderer::pillager);
});
public static final MobRenderers ZOMBIE = register("zombies", (state, pony) -> {
pony.switchRenderer(state, EntityType.ZOMBIE, ZomponyRenderer::zombie);
pony.switchRenderer(state, EntityType.HUSK, ZomponyRenderer::husk);
pony.switchRenderer(state, EntityType.GIANT, ZomponyRenderer::giant);
pony.switchRenderer(state, EntityType.DROWNED, ZomponyRenderer::drowned);
});
public static final MobRenderers PIGLIN = register("pigzombies", (state, pony) -> {
pony.switchRenderer(state, EntityType.PIGLIN, PonyPiglinRenderer::piglin);
pony.switchRenderer(state, EntityType.PIGLIN_BRUTE, PonyPiglinRenderer::brute);
pony.switchRenderer(state, EntityType.ZOMBIFIED_PIGLIN, PonyPiglinRenderer::zombified);
if (!PonyConfig.getInstance().noFun.get()) {
pony.switchRenderer(state, EntityType.PIG, PonyPigRenderer::new);
} }
});
public static final MobRenderers SKELETON = register("skeletons", (state, pony) -> {
pony.switchRenderer(state, EntityType.SKELETON, SkeleponyRenderer::skeleton);
pony.switchRenderer(state, EntityType.STRAY, SkeleponyRenderer::stray);
pony.switchRenderer(state, EntityType.WITHER_SKELETON, SkeleponyRenderer::wither);
});
public static final MobRenderers GUARDIAN = register("guardians", (state, pony) -> {
pony.switchRenderer(state, EntityType.GUARDIAN, SeaponyRenderer::guardian);
pony.switchRenderer(state, EntityType.ELDER_GUARDIAN, SeaponyRenderer::elder);
});
public static final MobRenderers ENDERMAN = register("endermen", (state, pony) -> {
pony.switchRenderer(state, EntityType.ENDERMAN, EnderStallionRenderer::new);
});
public static final MobRenderers INANIMATE = register("inanimates", (state, pony) -> {
pony.switchRenderer(state, EntityType.ARMOR_STAND, PonyStandRenderer::new);
});
public static final MobRenderers STRIDER = register("striders", (state, pony) -> {
pony.switchRenderer(state, EntityType.STRIDER, StriderRenderer::new);
});
public static final MobRenderers ALLAY = register("allays", (state, pony) -> {
pony.switchRenderer(state, EntityType.ALLAY, AllayRenderer::new);
});
private final BiConsumer<MobRenderers, PonyRenderDispatcher> changer; public static final MobRenderers VILLAGER = register("villagers", (state, registry) -> {
registry.registerEntityRenderer(EntityType.VILLAGER, state, VillagerPonyRenderer::new);
public final String name; registry.registerEntityRenderer(EntityType.WITCH, state, WitchRenderer::new);
registry.registerEntityRenderer(EntityType.ZOMBIE_VILLAGER, state, ZomponyVillagerRenderer::new);
private boolean lastState; registry.registerEntityRenderer(EntityType.WANDERING_TRADER, state, TraderRenderer::new);
});
private MobRenderers(String name, BiConsumer<MobRenderers, PonyRenderDispatcher> changer) { public static final MobRenderers ILLAGER = register("illagers", (state, registry) -> {
this.name = name; registry.registerEntityRenderer(EntityType.VEX, state, VexRenderer::new);
this.changer = changer; registry.registerEntityRenderer(EntityType.EVOKER, state, IllagerPonyRenderer::evoker);
} registry.registerEntityRenderer(EntityType.VINDICATOR, state, IllagerPonyRenderer::vindicator);
registry.registerEntityRenderer(EntityType.ILLUSIONER, state, IllusionistPonyRenderer::new);
registry.registerEntityRenderer(EntityType.PILLAGER, state, IllagerPonyRenderer::pillager);
});
public static final MobRenderers ZOMBIE = register("zombies", (state, registry) -> {
registry.registerEntityRenderer(EntityType.ZOMBIE, state, ZomponyRenderer::zombie);
registry.registerEntityRenderer(EntityType.HUSK, state, ZomponyRenderer::husk);
registry.registerEntityRenderer(EntityType.GIANT, state, ZomponyRenderer::giant);
registry.registerEntityRenderer(EntityType.DROWNED, state, ZomponyRenderer::drowned);
});
public static final MobRenderers PIGLIN = register("pigzombies", (state, registry) -> {
registry.registerEntityRenderer(EntityType.PIGLIN, state, PonyPiglinRenderer::piglin);
registry.registerEntityRenderer(EntityType.PIGLIN_BRUTE, state, PonyPiglinRenderer::brute);
registry.registerEntityRenderer(EntityType.ZOMBIFIED_PIGLIN, state, PonyPiglinRenderer::zombified);
registry.registerEntityRenderer(EntityType.PIG, entity -> state.option().get() && !PonyConfig.getInstance().noFun.get(), PonyPigRenderer::new);
});
public static final MobRenderers SKELETON = register("skeletons", (state, registry) -> {
registry.registerEntityRenderer(EntityType.SKELETON, state, SkeleponyRenderer::skeleton);
registry.registerEntityRenderer(EntityType.STRAY, state, SkeleponyRenderer::stray);
registry.registerEntityRenderer(EntityType.WITHER_SKELETON, state, SkeleponyRenderer::wither);
});
public static final MobRenderers GUARDIAN = register("guardians", (state, registry) -> {
registry.registerEntityRenderer(EntityType.GUARDIAN, state, SeaponyRenderer::guardian);
registry.registerEntityRenderer(EntityType.ELDER_GUARDIAN, state, SeaponyRenderer::elder);
});
public static final MobRenderers ENDERMAN = register("endermen", (state, registry) -> {
registry.registerEntityRenderer(EntityType.ENDERMAN, state, EnderStallionRenderer::new);
});
public static final MobRenderers INANIMATE = register("inanimates", (state, registry) -> {
registry.registerEntityRenderer(EntityType.ARMOR_STAND, state, PonyStandRenderer::new);
});
public static final MobRenderers STRIDER = register("striders", (state, registry) -> {
registry.registerEntityRenderer(EntityType.STRIDER, state, StriderRenderer::new);
});
public static final MobRenderers ALLAY = register("allays", (state, registry) -> {
registry.registerEntityRenderer(EntityType.ALLAY, state, AllayRenderer::new);
});
public Setting<Boolean> option() { public Setting<Boolean> option() {
return PonyConfig.getInstance().getCategory("entities").<Boolean>get(name); return PonyConfig.getInstance().getCategory("entities").<Boolean>get(name);
} }
public boolean set(boolean value) { @Override
value = option().set(value); public boolean test(Entity entity) {
apply(MineLittlePony.getInstance().getRenderDispatcher(), false);
return value;
}
public boolean get() {
return option().get(); return option().get();
} }
public static MobRenderers register(String name, BiConsumer<MobRenderers, PonyRenderDispatcher> changer) {
return REGISTRY.computeIfAbsent(name, n -> new MobRenderers(name, changer));
}
void apply(PonyRenderDispatcher dispatcher, boolean force) {
boolean state = get();
if (state != lastState || force) {
lastState = state;
changer.accept(this, dispatcher);
}
}
} }

View file

@ -1,11 +1,8 @@
package com.minelittlepony.client.render; package com.minelittlepony.client.render;
import java.util.function.Function;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.minelittlepony.api.model.PreviewModel; import com.minelittlepony.api.model.PreviewModel;
import com.minelittlepony.api.pony.*; import com.minelittlepony.api.pony.*;
import com.minelittlepony.client.mixin.MixinEntityRenderers;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.client.render.entity.*; import com.minelittlepony.client.render.entity.*;
import com.minelittlepony.client.render.entity.state.PonyRenderState; import com.minelittlepony.client.render.entity.state.PonyRenderState;
@ -16,10 +13,7 @@ import com.minelittlepony.mson.api.Mson;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.entity.*; import net.minecraft.client.render.entity.*;
import net.minecraft.client.render.entity.state.EntityRenderState;
import net.minecraft.client.util.SkinTextures; import net.minecraft.client.util.SkinTextures;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
/** /**
@ -58,23 +52,7 @@ public class PonyRenderDispatcher {
); );
} }
}); });
MobRenderers.REGISTRY.values().forEach(i -> i.apply(this, force)); MobRenderers.REGISTRY.values().forEach(i -> i.changer().accept(i, Mson.getInstance().getEntityRendererRegistry()));
}
/**
*
* Replaces an entity renderer depending on whether we want ponies or not.
*
* @param state True if we want ponies (the original will be stored)
* @param type The type to replace
* @param factory The replacement value
* @param <T> The entity type
*/
<T extends Entity, S extends EntityRenderState, V extends T> void switchRenderer(MobRenderers state, EntityType<V> type, Function<EntityRendererFactory.Context, EntityRenderer<T, S>> factory) {
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, ctx -> state.get()
? factory.apply(ctx)
: MixinEntityRenderers.getRendererFactories().get(type).create(ctx)
);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View file

@ -34,7 +34,7 @@ public class MobSkull implements ISkull {
@Override @Override
public boolean canRender(PonyConfig config) { public boolean canRender(PonyConfig config) {
return config.ponyskulls.get() && type.get(); return config.ponyskulls.get() && type.option().get();
} }
@Override @Override