重制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;
import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem;
import com.mojang.blaze3d.vertex.PoseStack;
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.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture;
@ -13,7 +13,7 @@ import software.bernie.geckolib.renderer.GeoRenderer;
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
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) {
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.model.GeoModel;
import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne;
public class SvdItemModel extends GeoModel<SvdItem> {
public static float fireRotY = 0f;
public static float fireRotZ = 0f;
public static float rotXBipod = 0f;
@Override
public ResourceLocation getAnimationResource(SvdItem animatable) {
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) {
CoreGeoBone gun = getAnimationProcessor().getBone("bone");
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;
if (player == null) return;
ItemStack stack = player.getMainHandItem();
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);
double zt = ClientEventHandler.zoomTime;
double zp = ClientEventHandler.zoomPos;
@ -71,43 +67,85 @@ public class SvdItemModel extends GeoModel<SvdItem> {
double fp = ClientEventHandler.firePos;
double fr = ClientEventHandler.fireRot;
gun.setPosX(2.02f * (float) zp);
gun.setPosY(0.85f * (float) zp - (float) (0.6f * zpz));
gun.setPosZ(13.2f * (float) zp + (float) (0.5f * zpz));
int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE);
int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK);
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.setScaleZ(1f - (0.8f * (float) zp));
gun.setScaleZ(1f - (scaleZ * (float) zp));
scope.setScaleZ(1f - (0.95f * (float) zp));
bt1.setScaleY(1f - (0.5f * (float) zp));
bt2.setScaleX(1f - (0.5f * (float) zp));
stack.getOrCreateTag().putBoolean("HoloHidden", gun.getPosX() <= 1.9);
stack.getOrCreateTag().putBoolean("HoloHidden", gun.getPosX() <= 1.4);
CoreGeoBone shen = getAnimationProcessor().getBone("shen");
if (ClientEventHandler.zoom) {
flare.setPosY(-2.5f);
CoreGeoBone shen;
if (zt < 0.5) {
shen = getAnimationProcessor().getBone("fireRootNormal");
} 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));
shen.setPosY((float) (0.4f * fp + 0.44f * fr));
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.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz));
shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon));
fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.6f * ClientEventHandler.recoilHorizon * fpz);
fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.8f + 1 * fpz) * ClientEventHandler.recoilHorizon);
shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread)));
shen.setPosY((float) (0.15f * fp + 0.18f * fr));
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.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt)));
shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt)));
shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt)));
shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt)));
shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * 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.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.85 * zt)));
shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt)));
CrossHairOverlay.gunRot = shen.getRotZ();
holo.setPosY(0.05f + 1.1f * (float) fp);
holo.setRotZ(-0.04f * (float) fp);
holo.setScaleX(0.75f);
holo.setScaleY(0.75f);
bolt.setPosZ(5f * (float) fp);
if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) {
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");
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.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 main = getAnimationProcessor().getBone("0");
float numR = (float) (1 - 0.94 * zt);
float numP = (float) (1 - 0.88 * zt);
float numR = (float) (1 - 0.96 * zt);
float numP = (float) (1 - 0.9 * zt);
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());

View file

@ -1,11 +1,13 @@
package com.atsuishio.superbwarfare.client.renderer.item;
import com.atsuishio.superbwarfare.client.AnimationHelper;
import com.atsuishio.superbwarfare.client.ItemModelHelper;
import com.atsuishio.superbwarfare.client.layer.SvdLayer;
import com.atsuishio.superbwarfare.client.model.item.SvdItemModel;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModTags;
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.VertexConsumer;
import net.minecraft.client.Minecraft;
@ -85,26 +87,35 @@ public class SvdItemRenderer extends GeoItemRenderer<SvdItem> {
ItemStack itemStack = player.getMainHandItem();
if (!itemStack.is(ModTags.Items.GUN)) return;
if (name.equals("holo")) {
bone.setHidden(itemStack.getOrCreateTag().getBoolean("HoloHidden") || !ClientEventHandler.zoom);
if (name.equals("mount")) {
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);
}
if (name.equals("handguard")) {
bone.setHidden(!itemStack.getOrCreateTag().getBoolean("HoloHidden") && ClientEventHandler.zoom);
}
if (name.equals("holo")) {
bone.setHidden(itemStack.getOrCreateTag().getBoolean("HoloHidden") || !ClientEventHandler.zoom);
renderingArms = false;
}
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);
} else {
if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 && ClientEventHandler.zoom && !itemStack.getOrCreateTag().getBoolean("HoloHidden")) {
bone.setPosY(-2f);
}
bone.setHidden(false);
bone.setScaleX((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) {
AbstractClientPlayer localPlayer = mc.player;
@ -132,12 +145,12 @@ public class SvdItemRenderer extends GeoItemRenderer<SvdItem> {
VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc));
if (name.equals("Lefthand")) {
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.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
} else {
stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f);
AnimationHelper.renderPartOverBone(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.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1);
}
this.currentBuffer.getBuffer(this.renderType);

View file

@ -771,7 +771,7 @@ public class ClientEventHandler {
Player player = Minecraft.getInstance().player;
if (player == null) return;
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())
return;
@ -781,7 +781,7 @@ public class ClientEventHandler {
if (player.isCrouching() && player.getBbHeight() >= 1 && !isProne(player)) {
pose = 0.85f;
} 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 {
pose = 1;
}
@ -924,14 +924,14 @@ public class ClientEventHandler {
private static void handleWeaponSway(LivingEntity entity) {
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);
double pose;
if (player.isShiftKeyDown() && player.getBbHeight() >= 1 && isProne(player)) {
pose = 0.85;
} 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 {
pose = 1;
}
@ -1175,7 +1175,7 @@ public class ClientEventHandler {
if (player.isShiftKeyDown() && player.getBbHeight() >= 1 && !isProne(player)) {
pose = 0.7f;
} 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;
} else {
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 (data.getInt("ReloadTime") == 14) {
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_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_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_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) {
return false;
}
public boolean hasBipod(ItemStack stack) {
return false;
}
public boolean ejectShell(ItemStack stack) {
return false;

View file

@ -9,6 +9,7 @@ import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.AnimatedItem;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.network.ModVariables;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkHelper;
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.player.LocalPlayer;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.level.Level;
import net.minecraftforge.client.extensions.common.IClientItemExtensions;
import software.bernie.geckolib.animatable.GeoItem;
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"));
}
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
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);
var editController = new AnimationController<>(this, "editController", 1, this::editPredicate);
data.add(editController);
}
@Override
@ -120,6 +139,34 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
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
public ResourceLocation getGunIcon() {
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);
}
@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
public boolean isMagazineReload(ItemStack stack) {
return true;
@ -155,6 +222,11 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
return true;
}
@Override
public boolean hasBipod(ItemStack stack) {
return true;
}
@Override
public int getFireMode() {
return FireMode.SEMI.flag;

File diff suppressed because it is too large Load diff

View file

@ -8,9 +8,9 @@
"display": {
"firstperson_righthand": {
"translation": [
-6.75,
3.5,
3.5
-7.25,
4.25,
4
]
},
"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": {
"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,
"RecoilX": 0.004,
"RecoilY": 0.009,
@ -8,8 +7,8 @@
"Velocity": 42,
"Magazine": 10,
"Weight": 5,
"NormalReloadTime": 56,
"EmptyReloadTime": 70,
"NormalReloadTime": 59,
"EmptyReloadTime": 78,
"BypassesArmor": 0.45,
"SoundRadius": 17,
"RPM": 300