重制SVD,添加SVD的配件适配

This commit is contained in:
Atsuihsio 2025-02-21 19:15:26 +08:00
parent c8d747811a
commit e6bdee12ff
20 changed files with 8818 additions and 9813 deletions

View file

@ -1,9 +1,9 @@
package com.atsuishio.superbwarfare.client.layer; package com.atsuishio.superbwarfare.client.layer;
import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem;
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.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -13,7 +13,7 @@ import software.bernie.geckolib.renderer.GeoRenderer;
import software.bernie.geckolib.renderer.layer.GeoRenderLayer; import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
public class SvdLayer extends GeoRenderLayer<SvdItem> { public class SvdLayer extends GeoRenderLayer<SvdItem> {
private static final ResourceLocation LAYER = new ResourceLocation(ModUtils.MODID, "textures/item/svd_e.png"); private static final ResourceLocation LAYER = new ResourceLocation(ModUtils.MODID, "textures/item/ak12_e.png");
public SvdLayer(GeoRenderer<SvdItem> entityRenderer) { public SvdLayer(GeoRenderer<SvdItem> entityRenderer) {
super(entityRenderer); super(entityRenderer);

View file

@ -16,8 +16,14 @@ import software.bernie.geckolib.core.animatable.model.CoreGeoBone;
import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.AnimationState;
import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.GeoModel;
import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne;
public class SvdItemModel extends GeoModel<SvdItem> { public class SvdItemModel extends GeoModel<SvdItem> {
public static float fireRotY = 0f;
public static float fireRotZ = 0f;
public static float rotXBipod = 0f;
@Override @Override
public ResourceLocation getAnimationResource(SvdItem animatable) { public ResourceLocation getAnimationResource(SvdItem animatable) {
return ModUtils.loc("animations/svd.animation.json"); return ModUtils.loc("animations/svd.animation.json");
@ -37,22 +43,12 @@ public class SvdItemModel extends GeoModel<SvdItem> {
public void setCustomAnimations(SvdItem animatable, long instanceId, AnimationState animationState) { public void setCustomAnimations(SvdItem animatable, long instanceId, AnimationState animationState) {
CoreGeoBone gun = getAnimationProcessor().getBone("bone"); CoreGeoBone gun = getAnimationProcessor().getBone("bone");
CoreGeoBone bolt = getAnimationProcessor().getBone("bolt"); CoreGeoBone bolt = getAnimationProcessor().getBone("bolt");
CoreGeoBone scope = getAnimationProcessor().getBone("pso1");
CoreGeoBone bt1 = getAnimationProcessor().getBone("bullton1");
CoreGeoBone bt2 = getAnimationProcessor().getBone("bullton2");
CoreGeoBone glass = getAnimationProcessor().getBone("glass");
CoreGeoBone holo = getAnimationProcessor().getBone("holo");
CoreGeoBone flare = getAnimationProcessor().getBone("flare");
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.is(ModTags.Items.GUN)) return; if (!stack.is(ModTags.Items.GUN)) return;
if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) {
bolt.setPosZ(3.25f);
}
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8); float times = 0.6f * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8);
double zt = ClientEventHandler.zoomTime; double zt = ClientEventHandler.zoomTime;
double zp = ClientEventHandler.zoomPos; double zp = ClientEventHandler.zoomPos;
@ -71,43 +67,85 @@ public class SvdItemModel extends GeoModel<SvdItem> {
double fp = ClientEventHandler.firePos; double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot; double fr = ClientEventHandler.fireRot;
gun.setPosX(2.02f * (float) zp); int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
gun.setPosY(0.85f * (float) zp - (float) (0.6f * zpz)); int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK);
gun.setPosZ(13.2f * (float) zp + (float) (0.5f * zpz)); int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL);
int gripType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP);
float posX = switch (type) {
case 0, 1 -> 1.701f;
case 2 -> 1.531f;
default -> 0f;
};
float posY = switch (type) {
case 0 -> 1.02f;
case 1 -> 0.04f;
case 2 -> 0.12f;
default -> 0f;
};
float scaleZ = switch (type) {
case 0 -> 0.4f;
case 1 -> 0.45f;
case 2 -> 0.85f;
default -> 0f;
};
float posZ = switch (type) {
case 0 -> 7f;
case 1 -> 7.5f;
case 2 -> 12.85f;
default -> 0f;
};
gun.setPosX(posX * (float) zp);
gun.setPosY(posY * (float) zp - (float) (0.2f * zpz));
gun.setPosZ(posZ * (float) zp + (float) (0.3f * zpz));
gun.setRotZ((float) (0.05f * zpz)); gun.setRotZ((float) (0.05f * zpz));
gun.setScaleZ(1f - (0.8f * (float) zp)); gun.setScaleZ(1f - (scaleZ * (float) zp));
scope.setScaleZ(1f - (0.95f * (float) zp)); stack.getOrCreateTag().putBoolean("HoloHidden", gun.getPosX() <= 1.4);
bt1.setScaleY(1f - (0.5f * (float) zp));
bt2.setScaleX(1f - (0.5f * (float) zp));
stack.getOrCreateTag().putBoolean("HoloHidden", gun.getPosX() <= 1.9);
CoreGeoBone shen = getAnimationProcessor().getBone("shen"); CoreGeoBone shen;
if (zt < 0.5) {
if (ClientEventHandler.zoom) { shen = getAnimationProcessor().getBone("fireRootNormal");
flare.setPosY(-2.5f); } else {
shen = switch (type) {
case 0 -> getAnimationProcessor().getBone("fireRoot0");
case 1 -> getAnimationProcessor().getBone("fireRoot1");
case 2 -> getAnimationProcessor().getBone("fireRoot2");
default -> getAnimationProcessor().getBone("fireRootNormal");
};
} }
shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.6f * ClientEventHandler.recoilHorizon * fpz);
shen.setPosY((float) (0.4f * fp + 0.44f * fr)); fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.8f + 1 * fpz) * ClientEventHandler.recoilHorizon);
shen.setPosZ((float) (1.325 * fp + 0.34f * fr + 2.35 * fpz));
shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread)));
shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); shen.setPosY((float) (0.15f * fp + 0.18f * fr));
shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); shen.setPosZ((float) (2.935 * fp + 0.23f * fr + 1.325 * fpz));
shen.setRotX((float) ((0.015f * fp + 0.12f * fr + 0.015f * fpz)));
shen.setRotY(fireRotY);
shen.setRotZ(fireRotZ);
shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt)));
shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt) * (barrelType == 1 ? 0.8 : 1.0) * (stockType == 2 ? 0.9 : 1.0) * (gripType == 1 ? 0.9 : 1.0) * (isProne(player) && gripType == 3 ? 0.9 : 1.0)));
shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt) * (barrelType == 1 ? 0.4 : 1.0) * (stockType == 2 ? 0.6 : 1.0) * (gripType == 1 ? 0.7 : 1.0) * (isProne(player) && gripType == 3 ? 0.1 : 1.0)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); shen.setRotY((float) (shen.getRotY() * (1 - 0.85 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
CrossHairOverlay.gunRot = shen.getRotZ(); CrossHairOverlay.gunRot = shen.getRotZ();
holo.setPosY(0.05f + 1.1f * (float) fp); bolt.setPosZ(5f * (float) fp);
holo.setRotZ(-0.04f * (float) fp);
holo.setScaleX(0.75f); if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) {
holo.setScaleY(0.75f); bolt.setPosZ(4f);
}
CoreGeoBone l = getAnimationProcessor().getBone("l");
CoreGeoBone r = getAnimationProcessor().getBone("r");
rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0);
l.setRotX(rotXBipod * Mth.DEG_TO_RAD);
r.setRotX(rotXBipod * Mth.DEG_TO_RAD);
CoreGeoBone root = getAnimationProcessor().getBone("root"); CoreGeoBone root = getAnimationProcessor().getBone("root");
root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph));
@ -116,14 +154,11 @@ public class SvdItemModel extends GeoModel<SvdItem> {
root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY));
root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ));
glass.setPosX(0.25f * -movePosX);
glass.setPosY(0.2f * (float) fp + 0.5f * (float) vY + (float) swayY + movePosY);
CoreGeoBone camera = getAnimationProcessor().getBone("camera"); CoreGeoBone camera = getAnimationProcessor().getBone("camera");
CoreGeoBone main = getAnimationProcessor().getBone("0"); CoreGeoBone main = getAnimationProcessor().getBone("0");
float numR = (float) (1 - 0.94 * zt); float numR = (float) (1 - 0.96 * zt);
float numP = (float) (1 - 0.88 * zt); float numP = (float) (1 - 0.9 * zt);
AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP);
ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ());

View file

@ -1,11 +1,13 @@
package com.atsuishio.superbwarfare.client.renderer.item; package com.atsuishio.superbwarfare.client.renderer.item;
import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.AnimationHelper;
import com.atsuishio.superbwarfare.client.ItemModelHelper;
import com.atsuishio.superbwarfare.client.layer.SvdLayer; import com.atsuishio.superbwarfare.client.layer.SvdLayer;
import com.atsuishio.superbwarfare.client.model.item.SvdItemModel; import com.atsuishio.superbwarfare.client.model.item.SvdItemModel;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem; import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem;
import com.atsuishio.superbwarfare.tools.GunsTool;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -85,26 +87,35 @@ public class SvdItemRenderer extends GeoItemRenderer<SvdItem> {
ItemStack itemStack = player.getMainHandItem(); ItemStack itemStack = player.getMainHandItem();
if (!itemStack.is(ModTags.Items.GUN)) return; if (!itemStack.is(ModTags.Items.GUN)) return;
if (name.equals("holo")) { if (name.equals("mount")) {
bone.setHidden(itemStack.getOrCreateTag().getBoolean("HoloHidden") || !ClientEventHandler.zoom); bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 0 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2);
} }
if (name.equals("glass")) { if (name.equals("Cross1")) {
bone.setHidden(itemStack.getOrCreateTag().getBoolean("HoloHidden")
|| !ClientEventHandler.zoom
|| GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1);
}
if (name.equals("Cross2")) {
bone.setHidden(itemStack.getOrCreateTag().getBoolean("HoloHidden")
|| !ClientEventHandler.zoom
|| GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2);
}
if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2
&& (name.equals("Hidden") || name.equals("gun") || name.equals("bolt") || name.equals("Lefthand") || name.equals("Barrel")) && ClientEventHandler.zoom && !itemStack.getOrCreateTag().getBoolean("HoloHidden")) {
bone.setHidden(true); bone.setHidden(true);
} renderingArms = false;
if (name.equals("handguard")) {
bone.setHidden(!itemStack.getOrCreateTag().getBoolean("HoloHidden") && ClientEventHandler.zoom);
}
if (name.equals("holo")) {
bone.setHidden(itemStack.getOrCreateTag().getBoolean("HoloHidden") || !ClientEventHandler.zoom);
} }
if (name.equals("flare")) { if (name.equals("flare")) {
if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) {
bone.setHidden(true); bone.setHidden(true);
} else { } else {
if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 && ClientEventHandler.zoom && !itemStack.getOrCreateTag().getBoolean("HoloHidden")) {
bone.setPosY(-2f);
}
bone.setHidden(false); bone.setHidden(false);
bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5)));
bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5)));
@ -112,6 +123,8 @@ public class SvdItemRenderer extends GeoItemRenderer<SvdItem> {
} }
} }
ItemModelHelper.handleGunAttachments(bone, itemStack, name);
if (this.transformType.firstPerson() && renderingArms) { if (this.transformType.firstPerson() && renderingArms) {
AbstractClientPlayer localPlayer = mc.player; AbstractClientPlayer localPlayer = mc.player;
@ -132,12 +145,12 @@ public class SvdItemRenderer extends GeoItemRenderer<SvdItem> {
VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc));
if (name.equals("Lefthand")) { if (name.equals("Lefthand")) {
stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f);
AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
} else { } else {
stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f);
AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
} }
this.currentBuffer.getBuffer(this.renderType); this.currentBuffer.getBuffer(this.renderType);

View file

@ -771,7 +771,7 @@ public class ClientEventHandler {
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.is(ModTags.Items.GUN)) return; if (!(stack.getItem() instanceof GunItem gunItem)) return;
if (player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.isDriver(player) && iArmedVehicle.hidePassenger()) if (player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.isDriver(player) && iArmedVehicle.hidePassenger())
return; return;
@ -781,7 +781,7 @@ public class ClientEventHandler {
if (player.isCrouching() && player.getBbHeight() >= 1 && !isProne(player)) { if (player.isCrouching() && player.getBbHeight() >= 1 && !isProne(player)) {
pose = 0.85f; pose = 0.85f;
} else if (isProne(player)) { } else if (isProne(player)) {
pose = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 3 ? 0 : 0.25f; pose = (GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 3 || gunItem.hasBipod(stack)) ? 0 : 0.25f;
} else { } else {
pose = 1; pose = 1;
} }
@ -924,14 +924,14 @@ public class ClientEventHandler {
private static void handleWeaponSway(LivingEntity entity) { private static void handleWeaponSway(LivingEntity entity) {
ItemStack stack = entity.getMainHandItem(); ItemStack stack = entity.getMainHandItem();
if (stack.is(ModTags.Items.GUN) && entity instanceof Player player) { if (stack.getItem() instanceof GunItem gunItem && entity instanceof Player player) {
float times = 2 * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8); float times = 2 * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8);
double pose; double pose;
if (player.isShiftKeyDown() && player.getBbHeight() >= 1 && isProne(player)) { if (player.isShiftKeyDown() && player.getBbHeight() >= 1 && isProne(player)) {
pose = 0.85; pose = 0.85;
} else if (isProne(player)) { } else if (isProne(player)) {
pose = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 3 ? 0 : 0.25f; pose = (GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 3 || gunItem.hasBipod(stack)) ? 0 : 0.25f;
} else { } else {
pose = 1; pose = 1;
} }
@ -1175,7 +1175,7 @@ public class ClientEventHandler {
if (player.isShiftKeyDown() && player.getBbHeight() >= 1 && !isProne(player)) { if (player.isShiftKeyDown() && player.getBbHeight() >= 1 && !isProne(player)) {
pose = 0.7f; pose = 0.7f;
} else if (isProne(player)) { } else if (isProne(player)) {
if (GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 3) { if (GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 3 || gunItem.hasBipod(stack)) {
pose = 0.1f; pose = 0.1f;
} else { } else {
pose = 0.5f; pose = 0.5f;

View file

@ -364,6 +364,12 @@ public class GunEventHandler {
} }
} }
if (stack.getItem() == ModItems.SVD.get()) {
if (data.getInt("ReloadTime") == 18) {
data.putBoolean("HoldOpen", false);
}
}
if (stack.getItem() == ModItems.SKS.get()) { if (stack.getItem() == ModItems.SKS.get()) {
if (data.getInt("ReloadTime") == 14) { if (data.getInt("ReloadTime") == 14) {
data.putBoolean("HoldOpen", false); data.putBoolean("HoldOpen", false);

View file

@ -223,6 +223,9 @@ public class ModSounds {
public static final RegistryObject<SoundEvent> SVD_FIRE_3P = REGISTRY.register("svd_fire_3p", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_fire_3p"))); public static final RegistryObject<SoundEvent> SVD_FIRE_3P = REGISTRY.register("svd_fire_3p", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_fire_3p")));
public static final RegistryObject<SoundEvent> SVD_FAR = REGISTRY.register("svd_far", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_far"))); public static final RegistryObject<SoundEvent> SVD_FAR = REGISTRY.register("svd_far", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_far")));
public static final RegistryObject<SoundEvent> SVD_VERYFAR = REGISTRY.register("svd_veryfar", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_veryfar"))); public static final RegistryObject<SoundEvent> SVD_VERYFAR = REGISTRY.register("svd_veryfar", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_veryfar")));
public static final RegistryObject<SoundEvent> SVD_FIRE_1P_S = REGISTRY.register("svd_fire_1p_s", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_fire_1p_s")));
public static final RegistryObject<SoundEvent> SVD_FIRE_3P_S = REGISTRY.register("svd_fire_3p_s", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_fire_3p_s")));
public static final RegistryObject<SoundEvent> SVD_FAR_S = REGISTRY.register("svd_far_s", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_far_s")));
public static final RegistryObject<SoundEvent> SVD_RELOAD_NORMAL = REGISTRY.register("svd_reload_normal", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_reload_normal"))); public static final RegistryObject<SoundEvent> SVD_RELOAD_NORMAL = REGISTRY.register("svd_reload_normal", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_reload_normal")));
public static final RegistryObject<SoundEvent> SVD_RELOAD_EMPTY = REGISTRY.register("svd_reload_empty", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_reload_empty"))); public static final RegistryObject<SoundEvent> SVD_RELOAD_EMPTY = REGISTRY.register("svd_reload_empty", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("svd_reload_empty")));

View file

@ -291,6 +291,9 @@ public abstract class GunItem extends Item {
public boolean canCustomStock(ItemStack stack) { public boolean canCustomStock(ItemStack stack) {
return false; return false;
} }
public boolean hasBipod(ItemStack stack) {
return false;
}
public boolean ejectShell(ItemStack stack) { public boolean ejectShell(ItemStack stack) {
return false; return false;

View file

@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.init.ModTags; import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.AnimatedItem; import com.atsuishio.superbwarfare.item.AnimatedItem;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.network.ModVariables;
import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkHelper; import com.atsuishio.superbwarfare.perk.PerkHelper;
import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.GunsTool;
@ -16,15 +17,18 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity; import net.minecraft.world.item.Rarity;
import net.minecraft.world.level.Level;
import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.client.extensions.common.IClientItemExtensions;
import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
@ -94,10 +98,25 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.idle")); return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.idle"));
} }
private PlayState editPredicate(AnimationState<SvdItem> event) {
LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return PlayState.STOP;
ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP;
if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).edit) {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.svd.edit"));
}
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.idle"));
}
@Override @Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) { public void registerControllers(AnimatableManager.ControllerRegistrar data) {
var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate);
data.add(idleController); data.add(idleController);
var editController = new AnimationController<>(this, "editController", 1, this::editPredicate);
data.add(editController);
} }
@Override @Override
@ -120,6 +139,34 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
public void setAnimationProcedure(String procedure) { public void setAnimationProcedure(String procedure) {
} }
@Override
public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) {
super.inventoryTick(stack, world, entity, slot, selected);
int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE);
if (scopeType == 3) {
CompoundTag tag = stack.getOrCreateTag().getCompound("Attachments");
tag.putInt("Scope", 0);
}
int customMag = switch (magType) {
case 1 -> 10;
case 2 -> 20;
default -> 0;
};
double customZoom = switch (scopeType) {
case 0, 1 -> 0;
case 2 -> 3.75;
default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0);
};
GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom);
GunsTool.setGunIntTag(stack, "CustomMagazine", customMag);
}
@Override @Override
public ResourceLocation getGunIcon() { public ResourceLocation getGunIcon() {
return ModUtils.loc("textures/gun_icon/svd_icon.png"); return ModUtils.loc("textures/gun_icon/svd_icon.png");
@ -135,6 +182,26 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk);
} }
@Override
public boolean canCustom(ItemStack stack) {
return true;
}
@Override
public boolean canCustomBarrel(ItemStack stack) {
return true;
}
@Override
public boolean canCustomScope(ItemStack stack) {
return true;
}
@Override
public boolean canCustomMagazine(ItemStack stack) {
return true;
}
@Override @Override
public boolean isMagazineReload(ItemStack stack) { public boolean isMagazineReload(ItemStack stack) {
return true; return true;
@ -155,6 +222,11 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
return true; return true;
} }
@Override
public boolean hasBipod(ItemStack stack) {
return true;
}
@Override @Override
public int getFireMode() { public int getFireMode() {
return FireMode.SEMI.flag; return FireMode.SEMI.flag;

File diff suppressed because it is too large Load diff

View file

@ -8,9 +8,9 @@
"display": { "display": {
"firstperson_righthand": { "firstperson_righthand": {
"translation": [ "translation": [
-6.75, -7.25,
3.5, 4.25,
3.5 4
] ]
}, },
"firstperson_lefthand": { "firstperson_lefthand": {

View file

@ -1119,6 +1119,30 @@
} }
] ]
}, },
"svd_fire_1p_s": {
"sounds": [
{
"name": "superbwarfare:svd/svd_fire_1p_s",
"stream": false
}
]
},
"svd_fire_3p_s": {
"sounds": [
{
"name": "superbwarfare:svd/svd_fire_3p_s",
"stream": false
}
]
},
"svd_far_s": {
"sounds": [
{
"name": "superbwarfare:svd/svd_far_s",
"stream": false
}
]
},
"svd_reload_normal": { "svd_reload_normal": {
"sounds": [ "sounds": [
{ {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -1,5 +1,4 @@
{ {
"CustomZoom": 2.75,
"Spread": 5.5, "Spread": 5.5,
"RecoilX": 0.004, "RecoilX": 0.004,
"RecoilY": 0.009, "RecoilY": 0.009,
@ -8,8 +7,8 @@
"Velocity": 42, "Velocity": 42,
"Magazine": 10, "Magazine": 10,
"Weight": 5, "Weight": 5,
"NormalReloadTime": 56, "NormalReloadTime": 59,
"EmptyReloadTime": 70, "EmptyReloadTime": 78,
"BypassesArmor": 0.45, "BypassesArmor": 0.45,
"SoundRadius": 17, "SoundRadius": 17,
"RPM": 300 "RPM": 300