尝试实现rpg渲染分离

This commit is contained in:
17146 2025-05-31 02:06:05 +08:00 committed by Light_Quanta
parent 793bbc33dd
commit 3818c5dc4c
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
4 changed files with 25 additions and 8 deletions

View file

@ -4,8 +4,12 @@ import com.atsuishio.superbwarfare.client.molang.MolangVariable;
import com.atsuishio.superbwarfare.data.gun.GunData; import com.atsuishio.superbwarfare.data.gun.GunData;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoAnimatable;
import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.animation.AnimationState;
import software.bernie.geckolib.constant.DataTickets;
import software.bernie.geckolib.loading.math.MathParser; import software.bernie.geckolib.loading.math.MathParser;
import software.bernie.geckolib.loading.math.MolangQueries; import software.bernie.geckolib.loading.math.MolangQueries;
import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.GeoModel;
@ -38,10 +42,18 @@ public abstract class CustomGunModel<T extends GunItem & GeoAnimatable> extends
var data = GunData.from(stack); var data = GunData.from(stack);
// TODO 实现正确的空判断需要分离stack
set(MolangVariable.SBW_IS_EMPTY, () -> data.isEmpty.get() ? 1 : 0); set(MolangVariable.SBW_IS_EMPTY, () -> data.isEmpty.get() ? 1 : 0);
} }
private static void set(String key, DoubleSupplier value) { private static void set(String key, DoubleSupplier value) {
MathParser.setVariable(key, value); MathParser.setVariable(key, value);
} }
public boolean shouldCancelRender(ItemStack stack, AnimationState<T> animationState) {
if (!(stack.getItem() instanceof GunItem)) return true;
var item = animationState.getData(DataTickets.ITEMSTACK);
if (item == null || GeoItem.getId(item) != GeoItem.getId(stack)) return true;
return animationState.getData(DataTickets.ITEM_RENDER_PERSPECTIVE) != ItemDisplayContext.FIRST_PERSON_RIGHT_HAND;
}
} }

View file

@ -5,7 +5,6 @@ import com.atsuishio.superbwarfare.client.AnimationHelper;
import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay;
import com.atsuishio.superbwarfare.data.gun.GunData; import com.atsuishio.superbwarfare.data.gun.GunData;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -33,15 +32,15 @@ public class RpgItemModel extends CustomGunModel<RpgItem> {
} }
@Override @Override
public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState animationState) { public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState<RpgItem> animationState) {
GeoBone gun = getAnimationProcessor().getBone("bone");
GeoBone shen = getAnimationProcessor().getBone("rpg");
GeoBone hammer = getAnimationProcessor().getBone("hammer");
Player player = Minecraft.getInstance().player; Player player = Minecraft.getInstance().player;
if (player == null) return; if (player == null) return;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (!(stack.getItem() instanceof GunItem)) return; if (shouldCancelRender(stack, animationState)) return;
GeoBone gun = getAnimationProcessor().getBone("bone");
GeoBone shen = getAnimationProcessor().getBone("rpg");
GeoBone hammer = getAnimationProcessor().getBone("hammer");
var data = GunData.from(stack); var data = GunData.from(stack);
if (data.closeHammer.get()) { if (data.closeHammer.get()) {

View file

@ -11,6 +11,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.cache.object.GeoBone;
public class RpgItemRenderer extends CustomGunRenderer<RpgItem> { public class RpgItemRenderer extends CustomGunRenderer<RpgItem> {
@ -34,7 +35,7 @@ public class RpgItemRenderer extends CustomGunRenderer<RpgItem> {
var player = mc.player; var player = mc.player;
if (player == null) return; if (player == null) return;
ItemStack itemStack = player.getMainHandItem(); ItemStack itemStack = player.getMainHandItem();
if (itemStack.getItem() instanceof GunItem) { if (itemStack.getItem() instanceof GunItem && GeoItem.getId(itemStack) == this.getInstanceId(animatable)) {
AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0, 0.625, 0.7); AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0, 0.625, 0.7);
} }

View file

@ -24,6 +24,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -112,6 +113,10 @@ public abstract class GunItem extends Item implements CustomRendererItem, GeoIte
public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) {
if (!(entity instanceof LivingEntity living) || !(stack.getItem() instanceof GunItem gunItem)) return; if (!(entity instanceof LivingEntity living) || !(stack.getItem() instanceof GunItem gunItem)) return;
if (level instanceof ServerLevel serverLevel) {
GeoItem.getOrAssignId(stack, serverLevel);
}
var data = GunData.from(stack); var data = GunData.from(stack);
if (!data.initialized()) { if (!data.initialized()) {