Q1: Remove F9 debug toggle from GltfAnimationApplier + delete dead
GltfRenderLayer + remove keybind registration
Q2: Move HumanChairHelper from state/ to util/ — pure utility with
no state dependency. 7 import updates.
Q3: Wire NECK collar equip flow in DataDrivenBondageItem:
- Target must be tied up (V1 rule preserved)
- Distance + line-of-sight validation
- Owner added to NBT before equip via CollarHelper.addOwner()
- V2EquipmentHelper handles conflict resolution
- ModSounds.COLLAR_PUT played on success
- OwnershipComponent.onEquipped registers in CollarRegistry
124 lines
4.9 KiB
Java
124 lines
4.9 KiB
Java
package com.tiedup.remake.client.gltf;
|
|
|
|
import com.tiedup.remake.client.animation.context.ContextAnimationFactory;
|
|
import com.tiedup.remake.client.animation.context.ContextGlbRegistry;
|
|
import com.tiedup.remake.v2.bondage.client.V2BondageRenderLayer;
|
|
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemReloadListener;
|
|
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
|
import net.minecraft.server.packs.resources.ResourceManager;
|
|
import net.minecraft.server.packs.resources.SimplePreparableReloadListener;
|
|
import net.minecraft.util.profiling.ProfilerFiller;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.client.event.EntityRenderersEvent;
|
|
import net.minecraftforge.client.event.RegisterClientReloadListenersEvent;
|
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|
import net.minecraftforge.fml.common.Mod;
|
|
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
/**
|
|
* Forge event registration for the glTF pipeline.
|
|
* Registers render layers and animation factory.
|
|
*/
|
|
public final class GltfClientSetup {
|
|
|
|
private static final Logger LOGGER = LogManager.getLogger("GltfPipeline");
|
|
|
|
private GltfClientSetup() {}
|
|
|
|
/**
|
|
* MOD bus event subscribers (FMLClientSetupEvent, AddLayers).
|
|
*/
|
|
@Mod.EventBusSubscriber(
|
|
modid = "tiedup",
|
|
bus = Mod.EventBusSubscriber.Bus.MOD,
|
|
value = Dist.CLIENT
|
|
)
|
|
public static class ModBusEvents {
|
|
|
|
@SubscribeEvent
|
|
public static void onClientSetup(FMLClientSetupEvent event) {
|
|
event.enqueueWork(() -> {
|
|
GltfCache.init();
|
|
GltfAnimationApplier.init();
|
|
LOGGER.info("[GltfPipeline] Client setup complete");
|
|
});
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@SubscribeEvent
|
|
public static void onAddLayers(EntityRenderersEvent.AddLayers event) {
|
|
var defaultRenderer = event.getSkin("default");
|
|
if (defaultRenderer instanceof PlayerRenderer playerRenderer) {
|
|
playerRenderer.addLayer(
|
|
new V2BondageRenderLayer<>(playerRenderer)
|
|
);
|
|
LOGGER.info(
|
|
"[GltfPipeline] Render layers added to 'default' player renderer"
|
|
);
|
|
}
|
|
|
|
// Add V2 layer to slim player renderer (Alex)
|
|
var slimRenderer = event.getSkin("slim");
|
|
if (slimRenderer instanceof PlayerRenderer playerRenderer) {
|
|
playerRenderer.addLayer(
|
|
new V2BondageRenderLayer<>(playerRenderer)
|
|
);
|
|
LOGGER.info(
|
|
"[GltfPipeline] Render layers added to 'slim' player renderer"
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register resource reload listener to clear GLB caches on resource pack reload.
|
|
* This ensures re-exported GLB models are picked up without restarting the game.
|
|
*/
|
|
@SubscribeEvent
|
|
public static void onRegisterReloadListeners(
|
|
RegisterClientReloadListenersEvent event
|
|
) {
|
|
event.registerReloadListener(
|
|
new SimplePreparableReloadListener<Void>() {
|
|
@Override
|
|
protected Void prepare(
|
|
ResourceManager resourceManager,
|
|
ProfilerFiller profiler
|
|
) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected void apply(
|
|
Void nothing,
|
|
ResourceManager resourceManager,
|
|
ProfilerFiller profiler
|
|
) {
|
|
GltfCache.clearCache();
|
|
GltfAnimationApplier.invalidateCache();
|
|
GltfMeshRenderer.clearRenderTypeCache();
|
|
// Reload context GLB animations from resource packs FIRST,
|
|
// then clear the factory cache so it rebuilds against the
|
|
// new GLB registry (prevents stale JSON fallback caching).
|
|
ContextGlbRegistry.reload(resourceManager);
|
|
ContextAnimationFactory.clearCache();
|
|
com.tiedup.remake.v2.furniture.client.FurnitureGltfCache.clear();
|
|
LOGGER.info(
|
|
"[GltfPipeline] Caches cleared on resource reload"
|
|
);
|
|
}
|
|
}
|
|
);
|
|
LOGGER.info("[GltfPipeline] Resource reload listener registered");
|
|
|
|
// Data-driven bondage item definitions (tiedup_items/*.json)
|
|
event.registerReloadListener(new DataDrivenItemReloadListener());
|
|
LOGGER.info(
|
|
"[GltfPipeline] Data-driven item reload listener registered"
|
|
);
|
|
}
|
|
}
|
|
|
|
}
|