尝试实现rpg渲染分离
This commit is contained in:
parent
793bbc33dd
commit
3818c5dc4c
4 changed files with 25 additions and 8 deletions
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue