some cleanup, 3d modeling stuff and terrorist plane fixes

This commit is contained in:
2026-02-27 18:29:17 +01:00
parent c19c9931bb
commit ab2c60db79
25 changed files with 456 additions and 83 deletions

View File

@@ -7,6 +7,7 @@ import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
@@ -18,12 +19,15 @@ import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.render.entity.FlyingItemEntityRenderer;
import net.minecraft.client.render.entity.animation.Animation;
import net.minecraft.client.render.entity.model.EntityModelLayer;
import net.minecraft.client.render.item.BuiltinModelItemRenderer;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.sound.EntityTrackingSoundInstance;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.client.sound.SoundInstance;
import net.minecraft.client.sound.SoundManager;
import net.minecraft.client.util.InputUtil;
import net.minecraft.client.render.*;
import net.minecraft.client.util.ModelIdentifier;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
@@ -75,6 +79,13 @@ public class SzarClient implements ClientModInitializer {
int loopStart = startOffset + startLength;
@Override
public void onInitializeClient() {
ModelLoadingRegistry.INSTANCE.registerModelProvider((manager, out) -> {
ThirdpersonModelRegisterer.getAll().forEach((itemId, modelId) -> {
out.accept(new ModelIdentifier(modelId, "inventory"));
});
});
ThirdpersonModelRegisterer.register(new Identifier(MOD_ID, "weed_joint"), new Identifier(MOD_ID, "weed_joint_in_hand"));
ThirdpersonModelRegisterer.register(new Identifier(MOD_ID, "fasz"), new Identifier(MOD_ID, "fasz_in_hand"));
ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (client.player == null) return;

View File

@@ -0,0 +1,26 @@
package dev.tggamesyt.szar.client;
import net.minecraft.util.Identifier;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class ThirdpersonModelRegisterer {
// Maps base item ID -> custom in-hand model ID
private static final Map<Identifier, Identifier> CUSTOM_MODELS = new HashMap<>();
public static void register(Identifier itemId, Identifier inHandModelId) {
CUSTOM_MODELS.put(itemId, inHandModelId);
}
public static Identifier get(Item item) {
return CUSTOM_MODELS.get(Registries.ITEM.getId(item));
}
public static Map<Identifier, Identifier> getAll() {
return Collections.unmodifiableMap(CUSTOM_MODELS);
}
}

View File

@@ -0,0 +1,55 @@
package dev.tggamesyt.szar.client.mixin;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.item.ItemModels;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.BakedModelManager;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.ModelIdentifier;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
import net.minecraft.entity.LivingEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.Redirect;
import dev.tggamesyt.szar.client.ThirdpersonModelRegisterer;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ItemRenderer.class)
public abstract class ItemRendererMixin {
@ModifyVariable(
method = "renderItem(Lnet/minecraft/item/ItemStack;" +
"Lnet/minecraft/client/render/model/json/ModelTransformationMode;" +
"ZLnet/minecraft/client/util/math/MatrixStack;" +
"Lnet/minecraft/client/render/VertexConsumerProvider;" +
"IILnet/minecraft/client/render/model/BakedModel;)V",
at = @At("HEAD"),
argsOnly = true,
ordinal = 0
)
private BakedModel swapThirdPersonModel(
BakedModel originalModel,
ItemStack stack,
ModelTransformationMode renderMode
) {
if (renderMode != ModelTransformationMode.GUI && renderMode != ModelTransformationMode.GROUND) {
Identifier customId = ThirdpersonModelRegisterer.get(stack.getItem());
if (customId != null) {
ModelIdentifier modelId = new ModelIdentifier(customId, "inventory");
ItemRenderer self = (ItemRenderer)(Object)this;
return self.getModels().getModelManager().getModel(modelId);
}
}
return originalModel;
}
}

View File

@@ -4,13 +4,14 @@
"package": "dev.tggamesyt.szar.client.mixin",
"compatibilityLevel": "JAVA_17",
"client": [
"ItemRendererMixin",
"MouseMixin",
"RadiationHeartMixin",
"PlayerModelMixin",
"RadiatedItemRendererMixin",
"RadiationHeartMixin",
"SplashOverlayMixin",
"TGnameMixin",
"TGcapeMixin",
"PlayerModelMixin"
"TGnameMixin"
],
"injectors": {
"defaultRequire": 1