From fb7ef5d2589457d125ff31130ffa4813f7510279 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Mon, 19 May 2025 22:26:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8Molang=E6=B8=B2=E6=9F=93RPG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/item/CustomGunModel.java | 29 +++++++++++++++---- .../client/model/item/RpgItemModel.java | 3 +- .../client/molang/MolangVariable.java | 2 ++ .../client/renderer/gun/RpgItemRenderer.java | 5 ---- .../animations/rpg.animation.json | 16 +++++++--- 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java index ba9b7a10b..0bd732211 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.client.model.item; 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 software.bernie.geckolib.animatable.GeoAnimatable; @@ -9,20 +10,38 @@ import software.bernie.geckolib.loading.math.MathParser; import software.bernie.geckolib.loading.math.MolangQueries; import software.bernie.geckolib.model.GeoModel; +import java.util.function.DoubleSupplier; + public abstract class CustomGunModel extends GeoModel { @Override public void applyMolangQueries(AnimationState animationState, double animTime) { Minecraft mc = Minecraft.getInstance(); - MathParser.setVariable(MolangQueries.LIFE_TIME, () -> animTime / 20d); + set(MolangQueries.LIFE_TIME, () -> animTime / 20d); if (mc.level != null) { - MathParser.setVariable(MolangQueries.ACTOR_COUNT, mc.level::getEntityCount); - MathParser.setVariable(MolangQueries.TIME_OF_DAY, () -> mc.level.getDayTime() / 24000f); - MathParser.setVariable(MolangQueries.MOON_PHASE, mc.level::getMoonPhase); + set(MolangQueries.ACTOR_COUNT, mc.level::getEntityCount); + set(MolangQueries.TIME_OF_DAY, () -> mc.level.getDayTime() / 24000f); + set(MolangQueries.MOON_PHASE, mc.level::getMoonPhase); } - MathParser.setVariable(MolangVariable.SBW_SYSTEM_TIME, System::currentTimeMillis); + set(MolangVariable.SBW_SYSTEM_TIME, System::currentTimeMillis); + + // GunData + + var player = mc.player; + if (player == null) return; + + var stack = player.getMainHandItem(); + if (!(stack.getItem() instanceof GunItem)) return; + + var data = GunData.from(stack); + + set(MolangVariable.SBW_IS_EMPTY, () -> data.isEmpty.get() ? 1 : 0); + } + + private static void set(String key, DoubleSupplier value) { + MathParser.setVariable(key, value); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java index 52315ceed..32727c24f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java @@ -14,9 +14,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.animation.AnimationState; import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.model.GeoModel; -public class RpgItemModel extends GeoModel { +public class RpgItemModel extends CustomGunModel { @Override public ResourceLocation getAnimationResource(RpgItem animatable) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/molang/MolangVariable.java b/src/main/java/com/atsuishio/superbwarfare/client/molang/MolangVariable.java index d0126bc07..a7b75b748 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/molang/MolangVariable.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/molang/MolangVariable.java @@ -8,9 +8,11 @@ import java.util.function.DoubleSupplier; public class MolangVariable { public static final String SBW_SYSTEM_TIME = "query.sbw_system_time"; + public static final String SBW_IS_EMPTY = "query.sbw_is_empty"; public static void register() { register(SBW_SYSTEM_TIME, () -> 0); + register(SBW_IS_EMPTY, () -> 0); } private static void register(String name, DoubleSupplier supplier) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java index cd094e687..14441b81c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java @@ -3,7 +3,6 @@ package com.atsuishio.superbwarfare.client.renderer.gun; import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.model.item.RpgItemModel; import com.atsuishio.superbwarfare.client.renderer.CustomGunRenderer; -import com.atsuishio.superbwarfare.data.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; import com.mojang.blaze3d.vertex.PoseStack; @@ -37,10 +36,6 @@ public class RpgItemRenderer extends CustomGunRenderer { ItemStack itemStack = player.getMainHandItem(); if (!(itemStack.getItem() instanceof GunItem)) return; - if (name.equals("Rockets")) { - bone.setHidden(GunData.from(itemStack).isEmpty.get()); - } - AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0, 0.625, 0.7); if (renderingArms) { diff --git a/src/main/resources/assets/superbwarfare/animations/rpg.animation.json b/src/main/resources/assets/superbwarfare/animations/rpg.animation.json index ceb4419a8..6bda0ec25 100644 --- a/src/main/resources/assets/superbwarfare/animations/rpg.animation.json +++ b/src/main/resources/assets/superbwarfare/animations/rpg.animation.json @@ -7,7 +7,8 @@ "bones": { "Rockets": { "rotation": [0, 0, 0], - "position": [0, 0, 0] + "position": [0, 0, 0], + "scale": "query.sbw_is_empty ? 0 : 1" } } }, @@ -33,7 +34,8 @@ }, "Rockets": { "rotation": [0, 0, 0], - "position": [0, 0, 0] + "position": [0, 0, 0], + "scale": "query.sbw_is_empty ? 0 : 1" }, "camera": { "rotation": { @@ -68,7 +70,8 @@ }, "Rockets": { "rotation": [0, 0, 0], - "position": [0, 0, 0] + "position": [0, 0, 0], + "scale": "query.sbw_is_empty ? 0 : 1" }, "Lefthand": { "rotation": [-26.58235, 45.45121, -16.52546], @@ -86,7 +89,12 @@ } }, "animation.rpg.fire": { - "animation_length": 0.1 + "animation_length": 0.1, + "bones": { + "Rockets": { + "scale": "query.sbw_is_empty ? 0 : 1" + } + } }, "animation.rpg.reload": { "loop": "hold_on_last_frame",