146 lines
7.3 KiB
Java
146 lines
7.3 KiB
Java
package com.atsuishio.superbwarfare.client;
|
|
|
|
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
|
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.model.PlayerModel;
|
|
import net.minecraft.client.model.geom.ModelPart;
|
|
import net.minecraft.client.player.AbstractClientPlayer;
|
|
import net.minecraft.client.player.LocalPlayer;
|
|
import net.minecraft.client.renderer.MultiBufferSource;
|
|
import net.minecraft.client.renderer.RenderType;
|
|
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
|
import net.minecraft.client.renderer.texture.OverlayTexture;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.world.item.ItemDisplayContext;
|
|
import net.minecraft.world.item.ItemStack;
|
|
import software.bernie.geckolib.animation.AnimationProcessor;
|
|
import software.bernie.geckolib.cache.object.GeoBone;
|
|
import software.bernie.geckolib.util.RenderUtil;
|
|
|
|
public class AnimationHelper {
|
|
|
|
public static void renderPartOverBone(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) {
|
|
setupModelFromBone(model, bone);
|
|
model.render(stack, buffer, packedLightIn, packedOverlayIn);
|
|
}
|
|
|
|
public static void setupModelFromBone(ModelPart model, GeoBone bone) {
|
|
model.setPos(bone.getPivotX(), bone.getPivotY(), bone.getPivotZ());
|
|
model.xRot = 0.0f;
|
|
model.yRot = 0.0f;
|
|
model.zRot = 0.0f;
|
|
}
|
|
|
|
public static void renderPartOverBoneR(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) {
|
|
setupModelFromBone(model, bone);
|
|
model.render(stack, buffer, packedLightIn, packedOverlayIn);
|
|
}
|
|
|
|
public static void setupModelFromBoneR(ModelPart model, GeoBone bone) {
|
|
model.setPos(bone.getPivotX(), bone.getPivotY(), bone.getPivotZ());
|
|
model.xRot = 0.0f;
|
|
model.yRot = 0.0f;
|
|
model.zRot = 0.0f;
|
|
}
|
|
|
|
public static void renderPartOverBone2(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) {
|
|
setupModelFromBone2(model, bone);
|
|
model.render(stack, buffer, packedLightIn, packedOverlayIn);
|
|
}
|
|
|
|
public static void setupModelFromBone2(ModelPart model, GeoBone bone) {
|
|
model.setPos(bone.getPivotX(), bone.getPivotY() + 7, bone.getPivotZ());
|
|
model.xRot = 0.0f;
|
|
model.yRot = 180 * Mth.DEG_TO_RAD;
|
|
model.zRot = 180 * Mth.DEG_TO_RAD;
|
|
}
|
|
|
|
public static void renderPartOverBone2R(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) {
|
|
setupModelFromBone2R(model, bone);
|
|
model.render(stack, buffer, packedLightIn, packedOverlayIn);
|
|
}
|
|
|
|
public static void setupModelFromBone2R(ModelPart model, GeoBone bone) {
|
|
model.setPos(bone.getPivotX(), bone.getPivotY() + 7, bone.getPivotZ());
|
|
model.xRot = 180 * Mth.DEG_TO_RAD;
|
|
model.yRot = 180 * Mth.DEG_TO_RAD;
|
|
model.zRot = 0;
|
|
}
|
|
|
|
public static void handleShellsAnimation(AnimationProcessor<?> animationProcessor, float x, float y) {
|
|
GeoBone shell1 = animationProcessor.getBone("shell1");
|
|
GeoBone shell2 = animationProcessor.getBone("shell2");
|
|
GeoBone shell3 = animationProcessor.getBone("shell3");
|
|
GeoBone shell4 = animationProcessor.getBone("shell4");
|
|
GeoBone shell5 = animationProcessor.getBone("shell5");
|
|
|
|
ClientEventHandler.handleShells(x, y, shell1, shell2, shell3, shell4, shell5);
|
|
}
|
|
|
|
public static void handleReloadShakeAnimation(ItemStack stack, GeoBone main, GeoBone camera, float roll, float pitch) {
|
|
var data = GunData.from(stack);
|
|
if (data.reload.time() > 0) {
|
|
main.setRotX(roll * main.getRotX());
|
|
main.setRotY(roll * main.getRotY());
|
|
main.setRotZ(roll * main.getRotZ());
|
|
main.setPosX(pitch * main.getPosX());
|
|
main.setPosY(pitch * main.getPosY());
|
|
main.setPosZ(pitch * main.getPosZ());
|
|
camera.setRotX(roll * camera.getRotX());
|
|
camera.setRotY(roll * camera.getRotY());
|
|
camera.setRotZ(roll * camera.getRotZ());
|
|
}
|
|
}
|
|
|
|
public static void renderArms(
|
|
Minecraft mc,
|
|
LocalPlayer player,
|
|
ItemDisplayContext transformType,
|
|
PoseStack stack,
|
|
String name,
|
|
GeoBone bone,
|
|
float SCALE_RECIPROCAL,
|
|
MultiBufferSource currentBuffer,
|
|
RenderType renderType,
|
|
int packedLightIn,
|
|
boolean useOldLeftHandRender,
|
|
boolean useOldRightHandRender
|
|
) {
|
|
if (transformType.firstPerson()) {
|
|
PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(player);
|
|
PlayerModel<AbstractClientPlayer> model = playerRenderer.getModel();
|
|
stack.pushPose();
|
|
RenderUtil.translateMatrixToBone(stack, bone);
|
|
RenderUtil.translateToPivotPoint(stack, bone);
|
|
RenderUtil.rotateMatrixAroundBone(stack, bone);
|
|
RenderUtil.scaleMatrixForBone(stack, bone);
|
|
RenderUtil.translateAwayFromPivotPoint(stack, bone);
|
|
ResourceLocation loc = player.getSkin().texture();
|
|
if (name.equals("Lefthand")) {
|
|
stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f);
|
|
if (useOldLeftHandRender) {
|
|
AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, currentBuffer.getBuffer(RenderType.entitySolid(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, currentBuffer.getBuffer(RenderType.entityTranslucent(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
} else {
|
|
AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, currentBuffer.getBuffer(RenderType.entitySolid(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, currentBuffer.getBuffer(RenderType.entityTranslucent(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
}
|
|
} else {
|
|
stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f);
|
|
if (useOldRightHandRender) {
|
|
AnimationHelper.renderPartOverBoneR(model.leftArm, bone, stack, currentBuffer.getBuffer(RenderType.entitySolid(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
AnimationHelper.renderPartOverBoneR(model.leftSleeve, bone, stack, currentBuffer.getBuffer(RenderType.entityTranslucent(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
} else {
|
|
AnimationHelper.renderPartOverBone2R(model.leftArm, bone, stack, currentBuffer.getBuffer(RenderType.entitySolid(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
AnimationHelper.renderPartOverBone2R(model.leftSleeve, bone, stack, currentBuffer.getBuffer(RenderType.entityTranslucent(loc)), packedLightIn, OverlayTexture.NO_OVERLAY);
|
|
}
|
|
}
|
|
currentBuffer.getBuffer(renderType);
|
|
stack.popPose();
|
|
}
|
|
}
|
|
}
|