尝试实现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.item.gun.GunItem;
|
||||
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.GeoItem;
|
||||
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.MolangQueries;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
@ -38,10 +42,18 @@ public abstract class CustomGunModel<T extends GunItem & GeoAnimatable> extends
|
|||
|
||||
var data = GunData.from(stack);
|
||||
|
||||
// TODO 实现正确的空判断,需要分离stack
|
||||
set(MolangVariable.SBW_IS_EMPTY, () -> data.isEmpty.get() ? 1 : 0);
|
||||
}
|
||||
|
||||
private static void set(String key, DoubleSupplier 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.data.gun.GunData;
|
||||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
||||
import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
@ -33,15 +32,15 @@ public class RpgItemModel extends CustomGunModel<RpgItem> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState animationState) {
|
||||
GeoBone gun = getAnimationProcessor().getBone("bone");
|
||||
GeoBone shen = getAnimationProcessor().getBone("rpg");
|
||||
GeoBone hammer = getAnimationProcessor().getBone("hammer");
|
||||
|
||||
public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState<RpgItem> animationState) {
|
||||
Player player = Minecraft.getInstance().player;
|
||||
if (player == null) return;
|
||||
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);
|
||||
if (data.closeHammer.get()) {
|
||||
|
|
|
@ -11,6 +11,7 @@ import net.minecraft.client.Minecraft;
|
|||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import software.bernie.geckolib.animatable.GeoItem;
|
||||
import software.bernie.geckolib.cache.object.GeoBone;
|
||||
|
||||
public class RpgItemRenderer extends CustomGunRenderer<RpgItem> {
|
||||
|
@ -34,7 +35,7 @@ public class RpgItemRenderer extends CustomGunRenderer<RpgItem> {
|
|||
var player = mc.player;
|
||||
if (player == null) return;
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import net.minecraft.core.BlockPos;
|
|||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
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) {
|
||||
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);
|
||||
|
||||
if (!data.initialized()) {
|
||||
|
|
Loading…
Add table
Reference in a new issue