mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-13 08:14:23 +01:00
Update mson and switch to using entity renderer conditions rather than re-registering when configs change
This commit is contained in:
parent
f72fdaaebe
commit
088175a862
6 changed files with 70 additions and 115 deletions
|
@ -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
|
||||||
|
|
|
@ -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) {
|
if (configChanged.getAndSet(false) && client.currentScreen instanceof PonySettingsScreen screen) {
|
||||||
screen.init(client, screen.width, screen.height);
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 final String name;
|
|
||||||
|
|
||||||
private boolean lastState;
|
|
||||||
|
|
||||||
private MobRenderers(String name, BiConsumer<MobRenderers, PonyRenderDispatcher> changer) {
|
|
||||||
this.name = name;
|
|
||||||
this.changer = changer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final MobRenderers VILLAGER = register("villagers", (state, registry) -> {
|
||||||
|
registry.registerEntityRenderer(EntityType.VILLAGER, state, VillagerPonyRenderer::new);
|
||||||
|
registry.registerEntityRenderer(EntityType.WITCH, state, WitchRenderer::new);
|
||||||
|
registry.registerEntityRenderer(EntityType.ZOMBIE_VILLAGER, state, ZomponyVillagerRenderer::new);
|
||||||
|
registry.registerEntityRenderer(EntityType.WANDERING_TRADER, state, TraderRenderer::new);
|
||||||
|
});
|
||||||
|
public static final MobRenderers ILLAGER = register("illagers", (state, registry) -> {
|
||||||
|
registry.registerEntityRenderer(EntityType.VEX, state, VexRenderer::new);
|
||||||
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue