Fixed 3rd person rendering

This commit is contained in:
Hanro50 2025-10-24 22:27:31 +02:00
parent 6f0c20077a
commit 08b2a41043
17 changed files with 113 additions and 166 deletions

View File

@ -39,22 +39,13 @@ import tschipp.carryon.common.scripting.Matchables.NBTCondition;
import javax.annotation.Nullable;
import java.util.Map;
public class ModelOverride
{
//public static Codec<ModelOverride> CODEC = Codec.STRING.comapFlatMap(ModelOverride::of, override -> override.raw);
private String raw;
public class ModelOverride {
private BlockResult parsedBlock;
private Type type;
private Either<ItemResult, BlockResult> parsedRHS;
private Either<ItemStack, BlockState> renderObject;
private ModelOverride(String raw, BlockResult parsedBlock, Type type, Either<ItemResult, BlockResult> parsedRHS)
{
this.raw = raw;
this.parsedBlock = parsedBlock;
this.type = type;
this.parsedRHS = parsedRHS;
parsedRHS.ifLeft(res -> {
ItemStack stack = new ItemStack(res.item());

View File

@ -35,10 +35,8 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.joml.Matrix4f;
import tschipp.carryon.Constants;
import tschipp.carryon.common.carry.CarryOnData;
import tschipp.carryon.common.carry.CarryOnData.CarryType;
@ -51,8 +49,7 @@ import java.util.*;
public class CarriedObjectRender
{
public static boolean drawFirstPerson(Player player, PoseStack matrix, int light, float partialTicks,SubmitNodeCollector nodeCollector)
public static boolean draw(Player player, PoseStack matrix, int light, float partialTicks,SubmitNodeCollector nodeCollector, boolean firstPerson)
{
if(Services.PLATFORM.isModLoaded("firstperson") || Services.PLATFORM.isModLoaded("firstpersonmod"))
return false;
@ -60,9 +57,9 @@ public class CarriedObjectRender
CarryOnData carry = CarryOnDataManager.getCarryData(player);
try {
if (carry.isCarrying(CarryType.BLOCK))
drawFirstPersonBlock(player, matrix, light, CarryRenderHelper.getRenderState(player), nodeCollector);
drawBlock(player, matrix, light, CarryRenderHelper.getRenderState(player), nodeCollector, firstPerson);
else if (carry.isCarrying(CarryType.ENTITY))
drawFirstPersonEntity(player, matrix, light, partialTicks,nodeCollector);
drawEntity(player, matrix, light, partialTicks,nodeCollector, firstPerson);
}
catch (Exception e)
{
@ -82,13 +79,18 @@ public class CarriedObjectRender
return carry.isCarrying();
}
private static void drawFirstPersonBlock(Player player, PoseStack matrix, int light, BlockState state,SubmitNodeCollector nodeCollector)
private static void drawBlock(Player player, PoseStack matrix, int light, BlockState state,SubmitNodeCollector nodeCollector, boolean firstPerson)
{
matrix.pushPose();
matrix.scale(2.5f, 2.5f, 2.5f);
matrix.translate(0, -0.5, -1);
//RenderSystem.enableBlend();
//RenderSystem.disableCull();
if (firstPerson){
matrix.scale(2.5f, 2.5f, 2.5f);
matrix.translate(0, -0.5, -1);
}else{
matrix.scale(0.6f, 0.6f, 0.6f);
matrix.translate(0, 0.5, -0.8);
matrix.mulPose(Axis.ZN.rotationDegrees(180));
}
CarryOnData carry = CarryOnDataManager.getCarryData(player);
ItemStackRenderState renderState = new ItemStackRenderState();
@ -105,20 +107,13 @@ public class CarriedObjectRender
if(carry.getActiveScript().isPresent())
CarryRenderHelper.performScriptTransformation(matrix, carry.getActiveScript().get());
//RenderSystem.setShaderTexture(0, GpuTexture);
ItemStack renderStack = CarryRenderHelper.getRenderItemStack(player);
Minecraft.getInstance().getItemModelResolver().updateForTopItem(renderState, renderStack, ItemDisplayContext.NONE, player.level(), null, 0);
//renderState.render(matrix, light, OverlayTexture.NO_OVERLAY);
renderState.submit(matrix, nodeCollector, light, OverlayTexture.NO_OVERLAY, 0);
//RenderSystem.enableCull();
//RenderSystem.disableBlend();
renderState.submit(matrix, nodeCollector, light, OverlayTexture.NO_OVERLAY, 0);
matrix.popPose();
}
private static void drawFirstPersonEntity(Player player, PoseStack matrix, int light, float partialTicks,SubmitNodeCollector nodeCollector) {
private static void drawEntity(Player player, PoseStack matrix, int light, float partialTicks,SubmitNodeCollector nodeCollector, boolean firstPerson) {
EntityRenderDispatcher manager = Minecraft.getInstance().getEntityRenderDispatcher();
@ -136,13 +131,17 @@ renderState.submit(matrix, nodeCollector, light, OverlayTexture.NO_OVERLAY, 0);
float height = entity.getBbHeight();
float width = entity.getBbWidth();
matrix.pushPose();
matrix.scale(0.8f, 0.8f, 0.8f);
matrix.mulPose(Axis.YP.rotationDegrees(180));
matrix.translate(0.0, -height - .2, width * 1.3 + 0.1);
// manager.setRenderShadow(false);
matrix.pushPose();
matrix.mulPose(Axis.YP.rotationDegrees(180));
if (firstPerson){
matrix.scale(0.8f, 0.8f, 0.8f);
matrix.translate(0.0, -height - .2, width * 1.3 + 0.1);
}else{
float multiplier = Math.min(9.9f, height * width) ;
matrix.scale((10 - multiplier) * 0.08f, (10 - multiplier) * 0.08f, (10 - multiplier) * 0.08f);
matrix.translate(0.0, height / 2 + -(height / 4) + 0.5f, width - 0.1 < 0.7 ? width - 0.1 + (0.7 - (width - 0.1)) : width - 0.1);
matrix.mulPose(Axis.ZN.rotationDegrees(180));
}
Optional<CarryOnScript> res = carry.getActiveScript();
if(res.isPresent())
@ -158,111 +157,13 @@ renderState.submit(matrix, nodeCollector, light, OverlayTexture.NO_OVERLAY, 0);
((LivingEntity) entity).hurtTime = 0;
try {
manager.submit(manager.extractEntity(entity, 0), new CameraRenderState(), 0, 0, 0, matrix, nodeCollector);
// manager.render(entity, 0, 0, 0, 0f, matrix, buffer, light);
//nodeCollector.submit
//manager.getRenderer(entity).submit(new EntityRenderState(), matrix, nodeCollector, null);
manager.submit(manager.extractEntity(entity, 0), new CameraRenderState(), 0, 0, 0, matrix, nodeCollector);
}
catch (Exception e)
{
}
// manager.setRenderShadow(true);
matrix.popPose();
}
// RenderSystem.disableAlphaTest();
}
/**
* Draws the third person view of entities and blocks
* @param partialticks
* @param mat
*/
public static void drawThirdPerson(float partialticks, Matrix4f mat) {
Minecraft mc = Minecraft.getInstance();
Level level = mc.level;
int perspective = CarryRenderHelper.getPerspective();
PoseStack matrix = new PoseStack();
matrix.mulPose(mat);
// RenderSystem.enableBlend();
// RenderSystem.disableCull();
// RenderSystem.disableDepthTest();
ItemStackRenderState renderState = new ItemStackRenderState();
var layer = renderState.newLayer();
layer.setRenderType(RenderType.glint());
for (Player player : level.players())
{
try {
CarryOnData carry = CarryOnDataManager.getCarryData(player);
if (perspective == 0 && player == mc.player && !(Services.PLATFORM.isModLoaded("firstperson") || Services.PLATFORM.isModLoaded("firstpersonmod") || Services.PLATFORM.isModLoaded("realcamera")))
continue;
if (carry.isCarrying(CarryType.BLOCK)) {
BlockState state = CarryRenderHelper.getRenderState(player);
CarryRenderHelper.applyBlockTransformations(player, partialticks, matrix, state.getBlock());
ItemStack renderItemStack = CarryRenderHelper.getRenderItemStack(player);
mc.getItemModelResolver().updateForTopItem(renderState, renderItemStack, ItemDisplayContext.NONE, level, null, 0);
Optional<CarryOnScript> res = carry.getActiveScript();
res.ifPresent(script -> CarryRenderHelper.performScriptTransformation(matrix, script));
//RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS);
//RenderSystem.enableCull();
PoseStack.Pose p = matrix.last();
PoseStack copy = new PoseStack();
copy.mulPose(p.pose());
matrix.popPose();
//RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
renderState.submit(copy, null, 0, OverlayTexture.NO_OVERLAY, 0);
// renderState.render(copy, buffer, light, OverlayTexture.NO_OVERLAY);
matrix.popPose();
} else if (carry.isCarrying(CarryType.ENTITY)) {
Entity entity = CarryRenderHelper.getRenderEntity(player);
if (entity != null) {
CarryRenderHelper.applyEntityTransformations(player, partialticks, matrix, entity);
// manager.setRenderShadow(false);
Optional<CarryOnScript> res = carry.getActiveScript();
res.ifPresent(script -> CarryRenderHelper.performScriptTransformation(matrix, script));
if (entity instanceof LivingEntity le)
le.hurtTime = 0;
//RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
// manager.render(entity, 0, 0, 0, 0f, matrix, buffer, light);
matrix.popPose();
// manager.setRenderShadow(true);
matrix.popPose();
}
}
}
catch (Exception e)
{
}
}
}
}

View File

@ -156,7 +156,7 @@ public class CarryRenderHelper
public static void applyBlockTransformations(Player player, float partialticks, PoseStack matrix, Block block)
{
int perspective = CarryRenderHelper.getPerspective();
//int perspective = CarryRenderHelper.getPerspective();
applyGeneralTransformations(player, partialticks, matrix);

View File

@ -0,0 +1,22 @@
package tschipp.carryon.client.render;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.renderer.SubmitNodeCollector;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.client.renderer.entity.state.AvatarRenderState;
public class CarryingItemRenderLayer<M extends PlayerModel> extends RenderLayer<AvatarRenderState, M> {
public CarryingItemRenderLayer(RenderLayerParent<AvatarRenderState, M> renderer) {
super(renderer);
}
@Override
public void submit(PoseStack poseStack, SubmitNodeCollector nodeCollector, int packedLight,
AvatarRenderState renderState, float yRot, float xRot) {
if (renderState instanceof ICarryOnRenderState carryOnRenderState){
CarriedObjectRender.draw(carryOnRenderState.getPlayer(), poseStack, packedLight, 0, nodeCollector,false);
}
}
}

View File

@ -1,5 +1,6 @@
package tschipp.carryon.client.render;
import net.minecraft.world.entity.player.Player;
import tschipp.carryon.common.carry.CarryOnData;
public interface ICarryOnRenderState {
@ -12,4 +13,8 @@ public interface ICarryOnRenderState {
void setRenderWidth(float val);
Player getPlayer();
void setPlayer(Player player);
}

View File

@ -4,13 +4,11 @@ import me.shedaniel.clothconfig2.api.ConfigBuilder;
import me.shedaniel.clothconfig2.api.ConfigCategory;
import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import tschipp.carryon.config.AnnotationData;
import tschipp.carryon.config.BuiltCategory;
import tschipp.carryon.config.BuiltConfig;
import tschipp.carryon.config.ConfigLoader;
import javax.annotation.Nullable;
import java.util.List;

View File

@ -0,0 +1,30 @@
package tschipp.carryon.mixin;
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.callback.CallbackInfo;
import net.minecraft.client.entity.ClientAvatarEntity;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.EntityRendererProvider.Context;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.player.AvatarRenderer;
import net.minecraft.client.renderer.entity.state.AvatarRenderState;
import net.minecraft.world.entity.Avatar;
import tschipp.carryon.client.render.CarryingItemRenderLayer;
@Mixin(AvatarRenderer.class)
public abstract class AvatarRendererMixin<AvatarlikeEntity extends Avatar & ClientAvatarEntity> extends LivingEntityRenderer<AvatarlikeEntity, AvatarRenderState, PlayerModel> {
public AvatarRendererMixin(Context context, PlayerModel model, float shadowRadius) {
super(context, model, shadowRadius);
}
@Inject(method = "<init>(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Z)V", at = @At("RETURN"))
public void init(EntityRendererProvider.Context context, boolean slim, CallbackInfo info) {
//Player
this.addLayer(new CarryingItemRenderLayer<PlayerModel>(this));
}
}

View File

@ -95,7 +95,7 @@ public abstract class EntityMixin
@Inject(method = "onPassengerTurned(Lnet/minecraft/world/entity/Entity;)V", at = @At("HEAD"))
private void onPassengerTurned(Entity toUpdate, CallbackInfo ci)
{
if((Object)this instanceof Player thisPlayer && toUpdate instanceof Player otherPlayer)
if((Object)this instanceof Player thisPlayer && toUpdate instanceof Player)
{
CarryOnData carry = CarryOnDataManager.getCarryData(thisPlayer);
if(carry.isCarrying(CarryType.PLAYER)) {

View File

@ -30,6 +30,8 @@ public class EntityRendererMixin {
ICarryOnRenderState carryOnRenderState = (ICarryOnRenderState) state;
carryOnRenderState.setCarryOnData(carry);
carryOnRenderState.setRenderWidth(CarryRenderHelper.getRenderWidth(player));
carryOnRenderState.setPlayer(player);
}
}
}

View File

@ -20,8 +20,6 @@
package tschipp.carryon.mixin;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
@ -30,13 +28,11 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.storage.ValueInput;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import tschipp.carryon.common.carry.CarryOnData;
import tschipp.carryon.common.carry.CarryOnDataManager;
import tschipp.carryon.common.carry.PlacementHandler;
import tschipp.carryon.common.carry.CarryOnData.CarryType;
import java.util.Optional;

View File

@ -1,6 +1,8 @@
package tschipp.carryon.mixin;
import net.minecraft.client.renderer.entity.state.HumanoidRenderState;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import tschipp.carryon.client.render.ICarryOnRenderState;
@ -15,6 +17,10 @@ public class PlayerRenderStateMixin implements ICarryOnRenderState {
@Unique
public float renderWidth = 0f;
@Unique
public Player player = null;
@Unique
@Override
public CarryOnData getCarryOnData() {
@ -38,4 +44,14 @@ public class PlayerRenderStateMixin implements ICarryOnRenderState {
public void setRenderWidth(float val) {
renderWidth = val;
}
@Override
public Player getPlayer() {
return player;
}
@Override
public void setPlayer(Player player) {
this.player = player;
}
}

View File

@ -12,7 +12,8 @@
"HumanoidModelMixin",
"MinecraftMixin",
"PlayerRenderStateMixin",
"EntityRendererMixin"
"EntityRendererMixin",
"AvatarRendererMixin"
],
"server": [
],

View File

@ -37,14 +37,15 @@ public class CarryOnFabricMod implements ModInitializer {
ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, "carry_on_data"),
builder -> builder
.initializer(() -> new CarryOnData(new CompoundTag()))
.persistent(CarryOnData.CODEC)
.syncWith(CarryOnData.STREAM_CODEC, (t, p) ->{
ServerPlayer player = (ServerPlayer) t;
// the isAlive check avoids us syncing attachment data about dead players. Which causes a disconnect
// player.tickCount > 0 avoids us syncing attachment data about players the instant they spawn.
// Which also causes a disconnect as the player entity may not be synced yet.
return p.connection != null && player.isAlive() && player.tickCount > 0;
})
);

View File

@ -38,7 +38,7 @@ public class ItemInHandRendererMixin
@Inject(at = @At(value = "HEAD"), method = "renderArmWithItem(Lnet/minecraft/client/player/AbstractClientPlayer;FFLnet/minecraft/world/InteractionHand;FLnet/minecraft/world/item/ItemStack;FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V", cancellable = true)
private void renderArmWithItem(AbstractClientPlayer player, float partialTick, float pitch, InteractionHand hand, float swingProgress, ItemStack item, float equippedProgress, PoseStack poseStack, SubmitNodeCollector nodeCollector, int packedLight, CallbackInfo ci)
{
if(CarriedObjectRender.drawFirstPerson(player, poseStack, packedLight, partialTick,nodeCollector))
if(CarriedObjectRender.draw(player, poseStack, packedLight, partialTick,nodeCollector,true))
ci.cancel();
}

View File

@ -2,7 +2,6 @@ package tschipp.carryon.carry;
import net.minecraftforge.common.capabilities.AutoRegisterCapability;
import tschipp.carryon.common.carry.CarryOnData;
import tschipp.carryon.common.carry.CarryOnDataManager;
@AutoRegisterCapability
public interface ICarryOnDataCapability {

View File

@ -50,18 +50,9 @@ public class ClientEvents {
float partialTicks = event.getPartialTick();
SubmitNodeCollector nodes =event.getNodeCollector();
//If true, cancels event
return CarriedObjectRender.drawFirstPerson(player, matrix, light, partialTicks,nodes) && CarryRenderHelper.getPerspective() == 0;
return CarriedObjectRender.draw(player, matrix, light, partialTicks,nodes,true) && CarryRenderHelper.getPerspective() == 0;
}
/*
@SubscribeEvent
public static void onRenderLevel(Render event)
{
if(event.getStage() == Stage.AFTER_PARTICLES)
CarriedObjectRender.drawThirdPerson(Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(true), event.getPoseStack());
}
*/
@SubscribeEvent
public static boolean onGuiInit(ScreenEvent.Init.Pre event)
{

View File

@ -49,18 +49,12 @@ public class ClientEvents {
PoseStack matrix = event.getPoseStack();
int light = event.getPackedLight();
float partialTicks = event.getPartialTick();
SubmitNodeCollector nodes =event.getSubmitNodeCollector();
SubmitNodeCollector nodes =event.getSubmitNodeCollector();
if(CarriedObjectRender.drawFirstPerson(player, matrix, light, partialTicks,nodes) && CarryRenderHelper.getPerspective() == 0)
if(CarriedObjectRender.draw(player, matrix, light, partialTicks,nodes,true) && CarryRenderHelper.getPerspective() == 0)
event.setCanceled(true);
}
@SubscribeEvent
public static void onRenderLevel(RenderLevelStageEvent.AfterEntities event)
{
CarriedObjectRender.drawThirdPerson(event.getLevelRenderer().getTicks(), event.getPoseStack().last().pose());
}
@SubscribeEvent
public static void onGuiInit(ScreenEvent.Init.Pre event)
{