299 lines
16 KiB
Java
299 lines
16 KiB
Java
|
package net.minecraft.client.renderer.entity.player;
|
||
|
|
||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||
|
import com.mojang.math.Axis;
|
||
|
import javax.annotation.Nullable;
|
||
|
import net.minecraft.client.model.HumanoidArmorModel;
|
||
|
import net.minecraft.client.model.HumanoidModel;
|
||
|
import net.minecraft.client.model.PlayerModel;
|
||
|
import net.minecraft.client.model.geom.ModelLayers;
|
||
|
import net.minecraft.client.model.geom.ModelPart;
|
||
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||
|
import net.minecraft.client.renderer.RenderType;
|
||
|
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||
|
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
|
||
|
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||
|
import net.minecraft.client.renderer.entity.layers.ArrowLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.BeeStingerLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.CapeLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.CustomHeadLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.Deadmau5EarsLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.ParrotOnShoulderLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.PlayerItemInHandLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.SpinAttackEffectLayer;
|
||
|
import net.minecraft.client.renderer.entity.layers.WingsLayer;
|
||
|
import net.minecraft.client.renderer.entity.state.PlayerRenderState;
|
||
|
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||
|
import net.minecraft.nbt.CompoundTag;
|
||
|
import net.minecraft.network.chat.CommonComponents;
|
||
|
import net.minecraft.network.chat.Component;
|
||
|
import net.minecraft.network.chat.numbers.StyledFormat;
|
||
|
import net.minecraft.resources.ResourceLocation;
|
||
|
import net.minecraft.util.Mth;
|
||
|
import net.minecraft.world.InteractionHand;
|
||
|
import net.minecraft.world.entity.EntityType;
|
||
|
import net.minecraft.world.entity.HumanoidArm;
|
||
|
import net.minecraft.world.entity.animal.Parrot;
|
||
|
import net.minecraft.world.entity.player.Player;
|
||
|
import net.minecraft.world.entity.player.PlayerModelPart;
|
||
|
import net.minecraft.world.item.CrossbowItem;
|
||
|
import net.minecraft.world.item.ItemDisplayContext;
|
||
|
import net.minecraft.world.item.ItemStack;
|
||
|
import net.minecraft.world.item.ItemUseAnimation;
|
||
|
import net.minecraft.world.item.Items;
|
||
|
import net.minecraft.world.phys.Vec3;
|
||
|
import net.minecraft.world.scores.DisplaySlot;
|
||
|
import net.minecraft.world.scores.Objective;
|
||
|
import net.minecraft.world.scores.ReadOnlyScoreInfo;
|
||
|
import net.minecraft.world.scores.Scoreboard;
|
||
|
import net.minecraftforge.api.distmarker.Dist;
|
||
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||
|
|
||
|
@OnlyIn(Dist.CLIENT)
|
||
|
public class PlayerRenderer extends LivingEntityRenderer<AbstractClientPlayer, PlayerRenderState, PlayerModel> {
|
||
|
public PlayerRenderer(EntityRendererProvider.Context p_174557_, boolean p_174558_) {
|
||
|
super(p_174557_, new PlayerModel(p_174557_.bakeLayer(p_174558_ ? ModelLayers.PLAYER_SLIM : ModelLayers.PLAYER), p_174558_), 0.5F);
|
||
|
this.addLayer(
|
||
|
new HumanoidArmorLayer<>(
|
||
|
this,
|
||
|
new HumanoidArmorModel(p_174557_.bakeLayer(p_174558_ ? ModelLayers.PLAYER_SLIM_INNER_ARMOR : ModelLayers.PLAYER_INNER_ARMOR)),
|
||
|
new HumanoidArmorModel(p_174557_.bakeLayer(p_174558_ ? ModelLayers.PLAYER_SLIM_OUTER_ARMOR : ModelLayers.PLAYER_OUTER_ARMOR)),
|
||
|
p_174557_.getEquipmentRenderer()
|
||
|
)
|
||
|
);
|
||
|
this.addLayer(new PlayerItemInHandLayer<>(this));
|
||
|
this.addLayer(new ArrowLayer<>(this, p_174557_));
|
||
|
this.addLayer(new Deadmau5EarsLayer(this, p_174557_.getModelSet()));
|
||
|
this.addLayer(new CapeLayer(this, p_174557_.getModelSet(), p_174557_.getEquipmentAssets()));
|
||
|
this.addLayer(new CustomHeadLayer<>(this, p_174557_.getModelSet()));
|
||
|
this.addLayer(new WingsLayer<>(this, p_174557_.getModelSet(), p_174557_.getEquipmentRenderer()));
|
||
|
this.addLayer(new ParrotOnShoulderLayer(this, p_174557_.getModelSet()));
|
||
|
this.addLayer(new SpinAttackEffectLayer(this, p_174557_.getModelSet()));
|
||
|
this.addLayer(new BeeStingerLayer<>(this, p_174557_));
|
||
|
}
|
||
|
|
||
|
protected boolean shouldRenderLayers(PlayerRenderState p_362318_) {
|
||
|
return !p_362318_.isSpectator;
|
||
|
}
|
||
|
|
||
|
public Vec3 getRenderOffset(PlayerRenderState p_365223_) {
|
||
|
Vec3 vec3 = super.getRenderOffset(p_365223_);
|
||
|
return p_365223_.isCrouching ? vec3.add(0.0, p_365223_.scale * -2.0F / 16.0, 0.0) : vec3;
|
||
|
}
|
||
|
|
||
|
private static HumanoidModel.ArmPose getArmPose(AbstractClientPlayer p_375883_, HumanoidArm p_366116_) {
|
||
|
ItemStack itemstack = p_375883_.getItemInHand(InteractionHand.MAIN_HAND);
|
||
|
ItemStack itemstack1 = p_375883_.getItemInHand(InteractionHand.OFF_HAND);
|
||
|
HumanoidModel.ArmPose humanoidmodel$armpose = getArmPose(p_375883_, itemstack, InteractionHand.MAIN_HAND);
|
||
|
HumanoidModel.ArmPose humanoidmodel$armpose1 = getArmPose(p_375883_, itemstack1, InteractionHand.OFF_HAND);
|
||
|
if (humanoidmodel$armpose.isTwoHanded()) {
|
||
|
humanoidmodel$armpose1 = itemstack1.isEmpty() ? HumanoidModel.ArmPose.EMPTY : HumanoidModel.ArmPose.ITEM;
|
||
|
}
|
||
|
|
||
|
return p_375883_.getMainArm() == p_366116_ ? humanoidmodel$armpose : humanoidmodel$armpose1;
|
||
|
}
|
||
|
|
||
|
private static HumanoidModel.ArmPose getArmPose(Player p_376602_, ItemStack p_376446_, InteractionHand p_361073_) {
|
||
|
if (p_376446_.isEmpty()) {
|
||
|
return HumanoidModel.ArmPose.EMPTY;
|
||
|
} else if (!p_376602_.swinging && p_376446_.is(Items.CROSSBOW) && CrossbowItem.isCharged(p_376446_)) {
|
||
|
return HumanoidModel.ArmPose.CROSSBOW_HOLD;
|
||
|
} else {
|
||
|
if (p_376602_.getUsedItemHand() == p_361073_ && p_376602_.getUseItemRemainingTicks() > 0) {
|
||
|
ItemUseAnimation itemuseanimation = p_376446_.getUseAnimation();
|
||
|
if (itemuseanimation == ItemUseAnimation.BLOCK) {
|
||
|
return HumanoidModel.ArmPose.BLOCK;
|
||
|
}
|
||
|
|
||
|
if (itemuseanimation == ItemUseAnimation.BOW) {
|
||
|
return HumanoidModel.ArmPose.BOW_AND_ARROW;
|
||
|
}
|
||
|
|
||
|
if (itemuseanimation == ItemUseAnimation.SPEAR) {
|
||
|
return HumanoidModel.ArmPose.THROW_SPEAR;
|
||
|
}
|
||
|
|
||
|
if (itemuseanimation == ItemUseAnimation.CROSSBOW) {
|
||
|
return HumanoidModel.ArmPose.CROSSBOW_CHARGE;
|
||
|
}
|
||
|
|
||
|
if (itemuseanimation == ItemUseAnimation.SPYGLASS) {
|
||
|
return HumanoidModel.ArmPose.SPYGLASS;
|
||
|
}
|
||
|
|
||
|
if (itemuseanimation == ItemUseAnimation.TOOT_HORN) {
|
||
|
return HumanoidModel.ArmPose.TOOT_HORN;
|
||
|
}
|
||
|
|
||
|
if (itemuseanimation == ItemUseAnimation.BRUSH) {
|
||
|
return HumanoidModel.ArmPose.BRUSH;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return HumanoidModel.ArmPose.ITEM;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public ResourceLocation getTextureLocation(PlayerRenderState p_364988_) {
|
||
|
return p_364988_.skin.texture();
|
||
|
}
|
||
|
|
||
|
protected void scale(PlayerRenderState p_368476_, PoseStack p_117799_) {
|
||
|
float f = 0.9375F;
|
||
|
p_117799_.scale(0.9375F, 0.9375F, 0.9375F);
|
||
|
}
|
||
|
|
||
|
protected void renderNameTag(PlayerRenderState p_360888_, Component p_117809_, PoseStack p_117810_, MultiBufferSource p_117811_, int p_117812_) {
|
||
|
p_117810_.pushPose();
|
||
|
if (p_360888_.scoreText != null) {
|
||
|
super.renderNameTag(p_360888_, p_360888_.scoreText, p_117810_, p_117811_, p_117812_);
|
||
|
p_117810_.translate(0.0F, 9.0F * 1.15F * 0.025F, 0.0F);
|
||
|
}
|
||
|
|
||
|
super.renderNameTag(p_360888_, p_117809_, p_117810_, p_117811_, p_117812_);
|
||
|
p_117810_.popPose();
|
||
|
}
|
||
|
|
||
|
public PlayerRenderState createRenderState() {
|
||
|
return new PlayerRenderState();
|
||
|
}
|
||
|
|
||
|
public void extractRenderState(AbstractClientPlayer p_366577_, PlayerRenderState p_364437_, float p_365590_) {
|
||
|
super.extractRenderState(p_366577_, p_364437_, p_365590_);
|
||
|
HumanoidMobRenderer.extractHumanoidRenderState(p_366577_, p_364437_, p_365590_, this.itemModelResolver);
|
||
|
p_364437_.leftArmPose = getArmPose(p_366577_, HumanoidArm.LEFT);
|
||
|
p_364437_.rightArmPose = getArmPose(p_366577_, HumanoidArm.RIGHT);
|
||
|
p_364437_.skin = p_366577_.getSkin();
|
||
|
p_364437_.arrowCount = p_366577_.getArrowCount();
|
||
|
p_364437_.stingerCount = p_366577_.getStingerCount();
|
||
|
p_364437_.useItemRemainingTicks = p_366577_.getUseItemRemainingTicks();
|
||
|
p_364437_.swinging = p_366577_.swinging;
|
||
|
p_364437_.isSpectator = p_366577_.isSpectator();
|
||
|
p_364437_.showHat = p_366577_.isModelPartShown(PlayerModelPart.HAT);
|
||
|
p_364437_.showJacket = p_366577_.isModelPartShown(PlayerModelPart.JACKET);
|
||
|
p_364437_.showLeftPants = p_366577_.isModelPartShown(PlayerModelPart.LEFT_PANTS_LEG);
|
||
|
p_364437_.showRightPants = p_366577_.isModelPartShown(PlayerModelPart.RIGHT_PANTS_LEG);
|
||
|
p_364437_.showLeftSleeve = p_366577_.isModelPartShown(PlayerModelPart.LEFT_SLEEVE);
|
||
|
p_364437_.showRightSleeve = p_366577_.isModelPartShown(PlayerModelPart.RIGHT_SLEEVE);
|
||
|
p_364437_.showCape = p_366577_.isModelPartShown(PlayerModelPart.CAPE);
|
||
|
extractFlightData(p_366577_, p_364437_, p_365590_);
|
||
|
extractCapeState(p_366577_, p_364437_, p_365590_);
|
||
|
if (p_364437_.distanceToCameraSq < 100.0) {
|
||
|
Scoreboard scoreboard = p_366577_.getScoreboard();
|
||
|
Objective objective = scoreboard.getDisplayObjective(DisplaySlot.BELOW_NAME);
|
||
|
if (objective != null) {
|
||
|
ReadOnlyScoreInfo readonlyscoreinfo = scoreboard.getPlayerScoreInfo(p_366577_, objective);
|
||
|
Component component = ReadOnlyScoreInfo.safeFormatValue(readonlyscoreinfo, objective.numberFormatOrDefault(StyledFormat.NO_STYLE));
|
||
|
p_364437_.scoreText = Component.empty().append(component).append(CommonComponents.SPACE).append(objective.getDisplayName());
|
||
|
} else {
|
||
|
p_364437_.scoreText = null;
|
||
|
}
|
||
|
} else {
|
||
|
p_364437_.scoreText = null;
|
||
|
}
|
||
|
|
||
|
p_364437_.parrotOnLeftShoulder = getParrotOnShoulder(p_366577_, true);
|
||
|
p_364437_.parrotOnRightShoulder = getParrotOnShoulder(p_366577_, false);
|
||
|
p_364437_.id = p_366577_.getId();
|
||
|
p_364437_.name = p_366577_.getGameProfile().getName();
|
||
|
p_364437_.heldOnHead.clear();
|
||
|
if (p_364437_.isUsingItem) {
|
||
|
ItemStack itemstack = p_366577_.getItemInHand(p_364437_.useItemHand);
|
||
|
if (itemstack.is(Items.SPYGLASS)) {
|
||
|
this.itemModelResolver.updateForLiving(p_364437_.heldOnHead, itemstack, ItemDisplayContext.HEAD, p_366577_);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void extractFlightData(AbstractClientPlayer p_366513_, PlayerRenderState p_361371_, float p_365196_) {
|
||
|
p_361371_.fallFlyingTimeInTicks = p_366513_.getFallFlyingTicks() + p_365196_;
|
||
|
Vec3 vec3 = p_366513_.getViewVector(p_365196_);
|
||
|
Vec3 vec31 = p_366513_.getDeltaMovementLerped(p_365196_);
|
||
|
if (vec31.horizontalDistanceSqr() > 1.0E-5F && vec3.horizontalDistanceSqr() > 1.0E-5F) {
|
||
|
p_361371_.shouldApplyFlyingYRot = true;
|
||
|
double d0 = vec31.horizontal().normalize().dot(vec3.horizontal().normalize());
|
||
|
double d1 = vec31.x * vec3.z - vec31.z * vec3.x;
|
||
|
p_361371_.flyingYRot = (float)(Math.signum(d1) * Math.acos(Math.min(1.0, Math.abs(d0))));
|
||
|
} else {
|
||
|
p_361371_.shouldApplyFlyingYRot = false;
|
||
|
p_361371_.flyingYRot = 0.0F;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void extractCapeState(AbstractClientPlayer p_366404_, PlayerRenderState p_365208_, float p_366613_) {
|
||
|
double d0 = Mth.lerp(p_366613_, p_366404_.xCloakO, p_366404_.xCloak) - Mth.lerp(p_366613_, p_366404_.xo, p_366404_.getX());
|
||
|
double d1 = Mth.lerp(p_366613_, p_366404_.yCloakO, p_366404_.yCloak) - Mth.lerp(p_366613_, p_366404_.yo, p_366404_.getY());
|
||
|
double d2 = Mth.lerp(p_366613_, p_366404_.zCloakO, p_366404_.zCloak) - Mth.lerp(p_366613_, p_366404_.zo, p_366404_.getZ());
|
||
|
float f = Mth.rotLerp(p_366613_, p_366404_.yBodyRotO, p_366404_.yBodyRot);
|
||
|
double d3 = Mth.sin(f * (float) (Math.PI / 180.0));
|
||
|
double d4 = -Mth.cos(f * (float) (Math.PI / 180.0));
|
||
|
p_365208_.capeFlap = (float)d1 * 10.0F;
|
||
|
p_365208_.capeFlap = Mth.clamp(p_365208_.capeFlap, -6.0F, 32.0F);
|
||
|
p_365208_.capeLean = (float)(d0 * d3 + d2 * d4) * 100.0F;
|
||
|
p_365208_.capeLean = p_365208_.capeLean * (1.0F - p_365208_.fallFlyingScale());
|
||
|
p_365208_.capeLean = Mth.clamp(p_365208_.capeLean, 0.0F, 150.0F);
|
||
|
p_365208_.capeLean2 = (float)(d0 * d4 - d2 * d3) * 100.0F;
|
||
|
p_365208_.capeLean2 = Mth.clamp(p_365208_.capeLean2, -20.0F, 20.0F);
|
||
|
float f1 = Mth.lerp(p_366613_, p_366404_.oBob, p_366404_.bob);
|
||
|
float f2 = Mth.lerp(p_366613_, p_366404_.walkDistO, p_366404_.walkDist);
|
||
|
p_365208_.capeFlap = p_365208_.capeFlap + Mth.sin(f2 * 6.0F) * 32.0F * f1;
|
||
|
}
|
||
|
|
||
|
@Nullable
|
||
|
private static Parrot.Variant getParrotOnShoulder(AbstractClientPlayer p_362348_, boolean p_363425_) {
|
||
|
CompoundTag compoundtag = p_363425_ ? p_362348_.getShoulderEntityLeft() : p_362348_.getShoulderEntityRight();
|
||
|
if (compoundtag.isEmpty()) {
|
||
|
return null;
|
||
|
} else {
|
||
|
EntityType<?> entitytype = compoundtag.read("id", EntityType.CODEC).orElse(null);
|
||
|
return entitytype == EntityType.PARROT ? compoundtag.read("Variant", Parrot.Variant.LEGACY_CODEC).orElse(Parrot.Variant.RED_BLUE) : null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void renderRightHand(PoseStack p_117771_, MultiBufferSource p_117772_, int p_117773_, ResourceLocation p_364347_, boolean p_367689_) {
|
||
|
this.renderHand(p_117771_, p_117772_, p_117773_, p_364347_, this.model.rightArm, p_367689_);
|
||
|
}
|
||
|
|
||
|
public void renderLeftHand(PoseStack p_117814_, MultiBufferSource p_117815_, int p_117816_, ResourceLocation p_368419_, boolean p_362915_) {
|
||
|
this.renderHand(p_117814_, p_117815_, p_117816_, p_368419_, this.model.leftArm, p_362915_);
|
||
|
}
|
||
|
|
||
|
private void renderHand(PoseStack p_117776_, MultiBufferSource p_117777_, int p_117778_, ResourceLocation p_365409_, ModelPart p_117780_, boolean p_364227_) {
|
||
|
PlayerModel playermodel = this.getModel();
|
||
|
p_117780_.resetPose();
|
||
|
p_117780_.visible = true;
|
||
|
playermodel.leftSleeve.visible = p_364227_;
|
||
|
playermodel.rightSleeve.visible = p_364227_;
|
||
|
playermodel.leftArm.zRot = -0.1F;
|
||
|
playermodel.rightArm.zRot = 0.1F;
|
||
|
p_117780_.render(p_117776_, p_117777_.getBuffer(RenderType.entityTranslucent(p_365409_)), p_117778_, OverlayTexture.NO_OVERLAY);
|
||
|
}
|
||
|
|
||
|
protected void setupRotations(PlayerRenderState p_369667_, PoseStack p_117803_, float p_117804_, float p_117805_) {
|
||
|
float f = p_369667_.swimAmount;
|
||
|
float f1 = p_369667_.xRot;
|
||
|
if (p_369667_.isFallFlying) {
|
||
|
super.setupRotations(p_369667_, p_117803_, p_117804_, p_117805_);
|
||
|
float f2 = p_369667_.fallFlyingScale();
|
||
|
if (!p_369667_.isAutoSpinAttack) {
|
||
|
p_117803_.mulPose(Axis.XP.rotationDegrees(f2 * (-90.0F - f1)));
|
||
|
}
|
||
|
|
||
|
if (p_369667_.shouldApplyFlyingYRot) {
|
||
|
p_117803_.mulPose(Axis.YP.rotation(p_369667_.flyingYRot));
|
||
|
}
|
||
|
} else if (f > 0.0F) {
|
||
|
super.setupRotations(p_369667_, p_117803_, p_117804_, p_117805_);
|
||
|
float f4 = p_369667_.isInWater ? -90.0F - f1 : -90.0F;
|
||
|
float f3 = Mth.lerp(f, 0.0F, f4);
|
||
|
p_117803_.mulPose(Axis.XP.rotationDegrees(f3));
|
||
|
if (p_369667_.isVisuallySwimming) {
|
||
|
p_117803_.translate(0.0F, -1.0F, 0.3F);
|
||
|
}
|
||
|
} else {
|
||
|
super.setupRotations(p_369667_, p_117803_, p_117804_, p_117805_);
|
||
|
}
|
||
|
}
|
||
|
}
|