清理tag,翻新AK12换弹动画,修复雷达在瓦尔基里结构上不起作用的问题

This commit is contained in:
Atsuihsio 2024-12-31 15:24:07 +08:00
parent a24c966b57
commit aa9f9caed3
61 changed files with 1251 additions and 997 deletions

View file

@ -317,7 +317,7 @@ public class ClickHandler {
player.playSound(ModSounds.TRIGGER_CLICK.get(), 1, 1);
}
if (!gunItem.useBackpackAmmo(stack) && gunItem.getAmmoCount(stack) <= 0 && stack.getOrCreateTag().getInt("ReloadTime") == 0) {
if (!gunItem.useBackpackAmmo(stack) && GunsTool.getGunIntTag(stack, "Ammo", 0) <= 0 && stack.getOrCreateTag().getInt("ReloadTime") == 0) {
if (ReloadConfig.LEFT_CLICK_RELOAD.get()) {
ModUtils.PACKET_HANDLER.sendToServer(new ReloadMessage(0));
}

View file

@ -3,10 +3,12 @@ package com.atsuishio.superbwarfare.client.screens;
import com.atsuishio.superbwarfare.block.entity.FuMO25BlockEntity;
import com.atsuishio.superbwarfare.menu.FuMO25Menu;
import com.atsuishio.superbwarfare.tools.SeekTool;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
@ -27,14 +29,18 @@ public class FuMO25ScreenHelper {
public static void onClientTick(TickEvent.ClientTickEvent event) {
if (event.side != LogicalSide.CLIENT) return;
if (event.phase != TickEvent.Phase.END) return;
Player player = Minecraft.getInstance().player;
Minecraft mc = Minecraft.getInstance();
LocalPlayer player = mc.player;
Camera camera = mc.gameRenderer.getMainCamera();
Vec3 cameraPos = camera.getPosition();
if (player == null) return;
var menu = player.containerMenu;
if (!(menu instanceof FuMO25Menu fuMO25Menu)) return;
if (pos == null) return;
if (pos.distToCenterSqr(player.getOnPos().getX(), player.getOnPos().getY(), player.getOnPos().getZ()) > TOLERANCE_DISTANCE * TOLERANCE_DISTANCE) {
pos = player.getOnPos();
if (pos.distToCenterSqr(cameraPos) > TOLERANCE_DISTANCE * TOLERANCE_DISTANCE) {
pos = BlockPos.containing(cameraPos);
}
if (fuMO25Menu.getEnergy() <= 0) {

View file

@ -70,10 +70,10 @@ public abstract class GunItem extends Item {
handleGunPerks(stack);
handleGunAttachment(stack);
if ((gunItem.bulletInBarrel(stack) && gunItem.getAmmoCount(stack) > GunsTool.getGunIntTag(stack, "Magazine", 0) + stack.getOrCreateTag().getInt("customMag") + 1)
|| (!gunItem.bulletInBarrel(stack) && gunItem.getAmmoCount(stack) > GunsTool.getGunIntTag(stack, "Magazine", 0) + stack.getOrCreateTag().getInt("customMag"))
if ((gunItem.bulletInBarrel(stack) && GunsTool.getGunIntTag(stack, "Ammo", 0) > GunsTool.getGunIntTag(stack, "Magazine", 0) + stack.getOrCreateTag().getInt("customMag") + 1)
|| (!gunItem.bulletInBarrel(stack) && GunsTool.getGunIntTag(stack, "Ammo", 0) > GunsTool.getGunIntTag(stack, "Magazine", 0) + stack.getOrCreateTag().getInt("customMag"))
) {
int count = gunItem.getAmmoCount(stack) - GunsTool.getGunIntTag(stack, "Magazine", 0) + stack.getOrCreateTag().getInt("customMag") - (gunItem.bulletInBarrel(stack) ? 1 : 0);
int count = GunsTool.getGunIntTag(stack, "Ammo", 0) - GunsTool.getGunIntTag(stack, "Magazine", 0) + stack.getOrCreateTag().getInt("customMag") - (gunItem.bulletInBarrel(stack) ? 1 : 0);
entity.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> {
if (stack.is(ModTags.Items.USE_SHOTGUN_AMMO)) {
@ -247,10 +247,6 @@ public abstract class GunItem extends Item {
return false;
}
public int getAmmoCount(ItemStack stack) {
return GunsTool.getGunIntTag(stack, "Ammo", 0);
}
public boolean isOpenBolt(ItemStack stack) {
return false;
}
@ -294,4 +290,16 @@ public abstract class GunItem extends Item {
public boolean ejectShell(ItemStack stack) {
return false;
}
public boolean semi(ItemStack stack) {
return false;
}
public boolean burst(ItemStack stack) {
return false;
}
public boolean auto(ItemStack stack) {
return false;
}
}

View file

@ -167,4 +167,19 @@ public class Glock17Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean burst(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -175,4 +175,14 @@ public class Glock18Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -158,4 +158,9 @@ public class M1911Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -343,4 +343,9 @@ public class Trachelium extends GunItem implements GeoItem, AnimatedItem {
public boolean canCustomStock(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -159,4 +159,9 @@ public class DevotionItem extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -183,4 +183,9 @@ public class M60Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -160,4 +160,14 @@ public class RpkItem extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -205,6 +205,11 @@ public class AK12Item extends GunItem implements GeoItem, AnimatedItem {
return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk);
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -254,4 +259,14 @@ public class AK12Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -268,4 +268,14 @@ public class AK47Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -270,4 +270,14 @@ public class Hk416Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -269,4 +269,14 @@ public class M4Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -175,4 +175,9 @@ public class MarlinItem extends GunItem implements GeoItem, AnimatedItem {
public boolean isIterativeReload(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -268,4 +268,14 @@ public class Mk14Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -266,4 +266,14 @@ public class Qbz95Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -168,4 +168,9 @@ public class SksItem extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -192,4 +192,14 @@ public class Aa12Item extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -153,4 +153,9 @@ public class AbekiriItem extends GunItem implements GeoItem, AnimatedItem {
public boolean isOpenBolt(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -182,4 +182,9 @@ public class M870Item extends GunItem implements GeoItem, AnimatedItem {
public boolean isIterativeReload(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -244,4 +244,19 @@ public class VectorItem extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
@Override
public boolean burst(ItemStack stack) {
return true;
}
@Override
public boolean auto(ItemStack stack) {
return true;
}
}

View file

@ -134,4 +134,9 @@ public class HuntingRifleItem extends GunItem implements GeoItem, AnimatedItem {
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -182,4 +182,9 @@ public class K98Item extends GunItem implements GeoItem, AnimatedItem {
public boolean isIterativeReload(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -165,4 +165,9 @@ public class M98bItem extends GunItem implements GeoItem, AnimatedItem {
public boolean bulletInBarrel(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -177,4 +177,9 @@ public class MosinNagantItem extends GunItem implements GeoItem, AnimatedItem {
public boolean isIterativeReload(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -166,4 +166,9 @@ public class Ntw20Item extends GunItem implements GeoItem, AnimatedItem {
public boolean bulletInBarrel(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -248,4 +248,9 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
public boolean bulletInBarrel(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -153,4 +153,9 @@ public class SvdItem extends GunItem implements GeoItem, AnimatedItem {
public boolean ejectShell(ItemStack stack) {
return true;
}
@Override
public boolean semi(ItemStack stack) {
return true;
}
}

View file

@ -2,7 +2,7 @@ package com.atsuishio.superbwarfare.network.message;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.tools.GunsTool;
import net.minecraft.ChatFormatting;
import net.minecraft.core.Holder;
@ -54,20 +54,19 @@ public class FireModeMessage {
public static void changeFireMode(Player player) {
ItemStack stack = player.getMainHandItem();
if (!stack.is(ModTags.Items.GUN)) return;
if (stack.getItem() instanceof GunItem gunItem) {
CompoundTag data = stack.getOrCreateTag().getCompound("GunData");
int fireMode = data.getInt("FireMode");
CompoundTag tag = stack.getOrCreateTag();
if (fireMode == 0) {
if (GunsTool.getGunBooleanTag(stack, "Burst", false)) {
if (gunItem.burst(stack)) {
GunsTool.setGunIntTag(stack, "FireMode", 1);
playChangeModeSound(player);
return;
}
if (GunsTool.getGunBooleanTag(stack, "Auto", false)) {
if (gunItem.auto(stack)) {
GunsTool.setGunIntTag(stack, "FireMode", 2);
playChangeModeSound(player);
return;
@ -75,12 +74,12 @@ public class FireModeMessage {
}
if (fireMode == 1) {
if (GunsTool.getGunBooleanTag(stack, "Auto", false)) {
if (gunItem.auto(stack)) {
GunsTool.setGunIntTag(stack, "FireMode", 2);
playChangeModeSound(player);
return;
}
if (GunsTool.getGunBooleanTag(stack, "Semi", false)) {
if (gunItem.semi(stack)) {
GunsTool.setGunIntTag(stack, "FireMode", 0);
playChangeModeSound(player);
return;
@ -88,12 +87,12 @@ public class FireModeMessage {
}
if (fireMode == 2) {
if (GunsTool.getGunBooleanTag(stack, "Semi", false)) {
if (gunItem.semi(stack)) {
GunsTool.setGunIntTag(stack, "FireMode", 0);
playChangeModeSound(player);
return;
}
if (GunsTool.getGunBooleanTag(stack, "Burst", false)) {
if (gunItem.burst(stack)) {
GunsTool.setGunIntTag(stack, "FireMode", 1);
playChangeModeSound(player);
return;
@ -140,7 +139,7 @@ public class FireModeMessage {
GunsTool.setGunBooleanTag(stack, "NeedBoltAction", true);
}
}
}
}
private static void playChangeModeSound(Player player) {

View file

@ -65,7 +65,7 @@ public class ReloadMessage {
boolean canSingleReload = gunItem.isIterativeReload(stack);
boolean canReload = gunItem.isMagazineReload(stack) && !gunItem.isClipReload(stack);
boolean clipLoad = gunItem.getAmmoCount(stack) == 0 && gunItem.isClipReload(stack);
boolean clipLoad = GunsTool.getGunIntTag(stack, "Ammo", 0) == 0 && gunItem.isClipReload(stack);
// 检查备弹
int count = 0;
@ -96,12 +96,26 @@ public class ReloadMessage {
}
if (canReload || clipLoad) {
int magazine = GunsTool.getGunIntTag(stack, "Magazine", 0);
if (gunItem.isOpenBolt(stack)) {
if (gunItem.bulletInBarrel(stack)) {
if (GunsTool.getGunIntTag(stack, "Ammo", 0) < magazine + tag.getInt("customMag") + 1) {
tag.putBoolean("start_reload", true);
}
} else {
if (GunsTool.getGunIntTag(stack, "Ammo", 0) < magazine + tag.getInt("customMag")) {
tag.putBoolean("start_reload", true);
}
}
} else if (GunsTool.getGunIntTag(stack, "Ammo", 0) < magazine + tag.getInt("customMag")) {
tag.putBoolean("start_reload", true);
}
return;
}
if (canSingleReload) {
if (gunItem.getAmmoCount(stack) < GunsTool.getGunIntTag(stack, "Magazine", 0) + tag.getInt("customMag")) {
if (GunsTool.getGunIntTag(stack, "Ammo", 0) < GunsTool.getGunIntTag(stack, "Magazine", 0) + tag.getInt("customMag")) {
tag.putBoolean("start_single_reload", true);
}
}

View file

@ -106,7 +106,7 @@ public class GunsTool {
if (!(stack.getItem() instanceof GunItem gunItem)) return;
int mag = GunsTool.getGunIntTag(stack, "Magazine", 0) + tag.getInt("customMag");
int ammo = gunItem.getAmmoCount(stack);
int ammo = GunsTool.getGunIntTag(stack, "Ammo", 0);
int ammoToAdd = mag - ammo + (extraOne ? 1 : 0);
// 空仓换弹的栓动武器应该在换弹后取消待上膛标记

View file

@ -9,8 +9,6 @@
"ProjectileAmount": 12,
"Weight": 7,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 64,
"EmptyReloadTime": 85,
"BypassesArmor": 0.05,

View file

@ -8,8 +8,6 @@
"Magazine": 2,
"ProjectileAmount": 12,
"Weight": 1,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 66,
"EmptyReloadTime": 83,
"BypassesArmor": 0.01,

View file

@ -10,8 +10,6 @@
"Magazine": 30,
"Weight": 4,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 52,
"EmptyReloadTime": 58,
"BypassesArmor": 0.23,

View file

@ -10,8 +10,6 @@
"Magazine": 30,
"Weight": 5,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 52,
"EmptyReloadTime": 65,
"BypassesArmor": 0.2,

View file

@ -9,7 +9,6 @@
"Magazine": 55,
"Weight": 6,
"FireMode": 2,
"Auto": 1,
"NormalReloadTime": 73,
"EmptyReloadTime": 95,
"BypassesArmor": 0.25,

View file

@ -7,8 +7,6 @@
"Velocity": 17,
"Magazine": 17,
"Weight": 1,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 30,
"EmptyReloadTime": 35,
"BypassesArmor": 0.15,

View file

@ -8,8 +8,6 @@
"Magazine": 17,
"Weight": 1,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 30,
"EmptyReloadTime": 35,
"BypassesArmor": 0.15,

View file

@ -10,8 +10,6 @@
"Magazine": 30,
"Weight": 4,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 56,
"EmptyReloadTime": 64,
"BypassesArmor": 0.25,

View file

@ -7,8 +7,6 @@
"Velocity": 38,
"Magazine": 1,
"Weight": 5,
"FireMode": 0,
"Semi": 1,
"EmptyReloadTime": 64,
"BypassesArmor": 0.7,
"SoundRadius": 20

View file

@ -9,7 +9,6 @@
"BoltActionTime": 22,
"Weight": 5,
"FireMode": 0,
"Semi": 1,
"EmptyReloadTime": 59,
"PrepareTime": 29,
"IterativeTime": 11,

View file

@ -7,8 +7,6 @@
"Velocity": 15,
"Magazine": 7,
"Weight": 2,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 30,
"EmptyReloadTime": 35,
"BypassesArmor": 0.2,

View file

@ -10,8 +10,6 @@
"Magazine": 30,
"Weight": 4,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 56,
"EmptyReloadTime": 64,
"BypassesArmor": 0.25,

View file

@ -8,7 +8,6 @@
"Magazine": 100,
"Weight": 8,
"FireMode": 2,
"Auto": 1,
"NormalReloadTime": 114,
"EmptyReloadTime": 133,
"BypassesArmor": 0.25,

View file

@ -8,8 +8,6 @@
"Magazine": 8,
"ProjectileAmount": 12,
"Weight": 4,
"FireMode": 0,
"Semi": 1,
"PrepareTime": 7,
"PrepareLoadTime": 36,
"IterativeTime": 16,

View file

@ -11,8 +11,6 @@
"Magazine": 5,
"BoltActionTime": 18,
"Weight": 7,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 60,
"EmptyReloadTime": 78,
"BypassesArmor": 0.6,

View file

@ -7,8 +7,6 @@
"Velocity": 38,
"Magazine": 8,
"Weight": 3,
"FireMode": 0,
"Semi": 1,
"PrepareTime": 7,
"IterativeTime": 16,
"FinishTime": 19,

View file

@ -6,7 +6,6 @@
"Headshot": 2,
"Velocity": 46,
"Weight": 10,
"FireMode": 2,
"BypassesArmor": 0.3,
"SoundRadius": 14,
"RPM": 1200

View file

@ -9,9 +9,7 @@
"Velocity": 42.5,
"Magazine": 20,
"Weight": 5,
"FireMode": 0,
"Semi": 1,
"Auto": 1,
"FireMode": 2,
"NormalReloadTime": 54,
"EmptyReloadTime": 71,
"BypassesArmor": 0.4,

View file

@ -9,8 +9,6 @@
"Magazine": 5,
"BoltActionTime": 22,
"Weight": 5,
"FireMode": 0,
"Semi": 1,
"PrepareTime": 29,
"PrepareEmptyTime": 16,
"IterativeTime": 11,

View file

@ -9,8 +9,6 @@
"Magazine": 3,
"BoltActionTime": 37,
"Weight": 10,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 63,
"EmptyReloadTime": 92,
"BypassesArmor": 1,

View file

@ -10,8 +10,6 @@
"Magazine": 30,
"Weight": 4,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 60,
"EmptyReloadTime": 74,
"BypassesArmor": 0.28,

View file

@ -8,8 +8,6 @@
"Magazine": 75,
"Weight": 6,
"FireMode": 2,
"Semi": 1,
"Auto": 1,
"NormalReloadTime": 73,
"EmptyReloadTime": 95,
"BypassesArmor": 0.23,

View file

@ -9,8 +9,6 @@
"Velocity": 70,
"BoltActionTime": 22,
"Weight": 7,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 59,
"EmptyReloadTime": 89,
"BypassesArmor": 0.8,

View file

@ -7,8 +7,6 @@
"Velocity": 36,
"Magazine": 20,
"Weight": 4,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 54,
"EmptyReloadTime": 75,
"BypassesArmor": 0.23,

View file

@ -8,8 +8,6 @@
"Velocity": 42,
"Magazine": 10,
"Weight": 5,
"FireMode": 0,
"Semi": 1,
"NormalReloadTime": 56,
"EmptyReloadTime": 70,
"BypassesArmor": 0.45,

View file

@ -7,8 +7,6 @@
"Velocity": 24,
"Magazine": 6,
"Weight": 2,
"FireMode": 0,
"Semi": 1,
"EmptyReloadTime": 65,
"BypassesArmor": 0.3,
"SoundRadius": 10,

View file

@ -8,9 +8,6 @@
"Magazine": 13,
"Weight": 3,
"FireMode": 2,
"Semi": 1,
"Burst": 1,
"Auto": 1,
"BurstSize": 3,
"NormalReloadTime": 46,
"EmptyReloadTime": 64,