重写FireMode

This commit is contained in:
Light_Quanta 2025-05-11 22:29:08 +08:00
parent 32f649b8d7
commit 027d3c680b
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
27 changed files with 158 additions and 96 deletions

View file

@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.init.*;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.FireMode;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.network.message.send.*; import com.atsuishio.superbwarfare.network.message.send.*;
import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.NBTTool;
@ -365,7 +366,7 @@ public class ClickHandler {
&& !data.bolt.needed.get()) && !data.bolt.needed.get())
&& drawTime < 0.01 && drawTime < 0.01
) { ) {
if (data.fireMode.get() == 1) { if (data.fireMode.get() == FireMode.BURST) {
if (ClientEventHandler.burstFireAmount == 0) { if (ClientEventHandler.burstFireAmount == 0) {
ClientEventHandler.burstFireAmount = data.burstAmount(); ClientEventHandler.burstFireAmount = data.burstAmount();
} }

View file

@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper;
import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.FireMode;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.item.gun.handgun.Glock18Item; import com.atsuishio.superbwarfare.item.gun.handgun.Glock18Item;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -49,11 +50,11 @@ public class Glock18ItemModel extends GeoModel<Glock18Item> {
if (!(stack.getItem() instanceof GunItem)) return; if (!(stack.getItem() instanceof GunItem)) return;
var data = GunData.from(stack); var data = GunData.from(stack);
int mode = data.fireMode.get(); var mode = data.fireMode.get();
if (mode == 0) { if (mode == FireMode.SEMI) {
switch_.setRotX(35 * Mth.DEG_TO_RAD); switch_.setRotX(35 * Mth.DEG_TO_RAD);
} }
if (mode == 2) { if (mode == FireMode.AUTO) {
switch_.setRotX(0); switch_.setRotX(0);
} }

View file

@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper;
import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.FireMode;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType; import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType;
import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item; import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item;
@ -134,9 +135,9 @@ public class Hk416ItemModel extends GeoModel<Hk416Item> {
l.setRotX(rotXBipod * Mth.DEG_TO_RAD); l.setRotX(rotXBipod * Mth.DEG_TO_RAD);
r.setRotX(rotXBipod * Mth.DEG_TO_RAD); r.setRotX(rotXBipod * Mth.DEG_TO_RAD);
int mode = GunData.from(stack).fireMode.get(); var mode = GunData.from(stack).fireMode.get();
kuaimanji.setRotX(mode == 2 ? 90 * Mth.DEG_TO_RAD : 0); kuaimanji.setRotX(mode == FireMode.AUTO ? 90 * Mth.DEG_TO_RAD : 0);
ClientEventHandler.gunRootMove(getAnimationProcessor()); ClientEventHandler.gunRootMove(getAnimationProcessor());

View file

@ -55,15 +55,11 @@ public class VectorItemModel extends GeoModel<VectorItem> {
if (!(stack.getItem() instanceof GunItem)) return; if (!(stack.getItem() instanceof GunItem)) return;
var data = GunData.from(stack); var data = GunData.from(stack);
int mode = data.fireMode.get();
if (mode == 0) { switch (data.fireMode.get()) {
kmj.setRotX(-120 * Mth.DEG_TO_RAD); case SEMI -> kmj.setRotX(-120 * Mth.DEG_TO_RAD);
} case BURST -> kmj.setRotX(-60 * Mth.DEG_TO_RAD);
if (mode == 1) { case AUTO -> kmj.setRotX(0);
kmj.setRotX(-60 * Mth.DEG_TO_RAD);
}
if (mode == 2) {
kmj.setRotX(0);
} }
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8); float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8);

View file

@ -200,9 +200,9 @@ public class AmmoBarOverlay implements LayeredDraw.Layer {
private static ResourceLocation getFireMode(GunData data) { private static ResourceLocation getFireMode(GunData data) {
return switch (data.fireMode.get()) { return switch (data.fireMode.get()) {
case 1 -> BURST; case SEMI -> SEMI;
case 2 -> AUTO; case BURST -> BURST;
default -> SEMI; case AUTO -> AUTO;
}; };
} }
} }

View file

@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity; import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity;
import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.init.*;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.FireMode;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType; import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType;
import com.atsuishio.superbwarfare.network.message.send.*; import com.atsuishio.superbwarfare.network.message.send.*;
@ -492,10 +493,9 @@ public class ClientEventHandler {
return; return;
} }
var data = GunData.from(stack); var data = GunData.from(stack);
final var tag = data.tag();
var perk = data.perk.get(Perk.Type.AMMO); var perk = data.perk.get(Perk.Type.AMMO);
int mode = data.fireMode.get(); var mode = data.fireMode.get();
// 精准度 // 精准度
float times = (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8); float times = (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8);
@ -581,7 +581,7 @@ public class ClientEventHandler {
&& !player.getCooldowns().isOnCooldown(stack.getItem()) && !player.getCooldowns().isOnCooldown(stack.getItem())
&& !GunData.from(stack).bolt.needed.get()) && !GunData.from(stack).bolt.needed.get())
)) { )) {
if (mode == 0) { if (mode == FireMode.SEMI) {
if (clientTimer.getProgress() == 0) { if (clientTimer.getProgress() == 0) {
clientTimer.start(); clientTimer.start();
shootClient(player); shootClient(player);
@ -611,7 +611,7 @@ public class ClientEventHandler {
} }
} else { } else {
if (mode != 0 && clientTimer.getProgress() >= cooldown) { if (mode != FireMode.SEMI && clientTimer.getProgress() >= cooldown) {
clientTimer.stop(); clientTimer.stop();
} }
fireSpread = 0; fireSpread = 0;
@ -619,7 +619,7 @@ public class ClientEventHandler {
gunPartMove(times); gunPartMove(times);
if (mode == 0 && clientTimer.getProgress() >= cooldown) { if (mode == FireMode.SEMI && clientTimer.getProgress() >= cooldown) {
clientTimer.stop(); clientTimer.stop();
} }
@ -659,12 +659,12 @@ public class ClientEventHandler {
if (!gunItem.canShoot(data)) return; if (!gunItem.canShoot(data)) return;
if (stack.is(ModTags.Items.NORMAL_GUN)) { if (stack.is(ModTags.Items.NORMAL_GUN)) {
int mode = data.fireMode.get(); var mode = data.fireMode.get();
if (mode != 2) { if (mode != FireMode.AUTO) {
holdFire = false; holdFire = false;
} }
if (mode == 1) { if (mode == FireMode.BURST) {
if (data.ammo.get() == 1) { if (data.ammo.get() == 1) {
burstFireAmount = 1; burstFireAmount = 1;
} }

View file

@ -458,18 +458,6 @@ public abstract class GunItem extends Item implements CustomRendererItem {
return ""; return "";
} }
public enum FireMode {
SEMI(1),
BURST(2),
AUTO(4);
public final int flag;
FireMode(int i) {
this.flag = i;
}
}
public final Map<Integer, Consumer<GunData>> reloadTimeBehaviors = new HashMap<>(); public final Map<Integer, Consumer<GunData>> reloadTimeBehaviors = new HashMap<>();
/** /**

View file

@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.item.gun.data;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import java.util.List; import java.util.List;
import java.util.Set;
public class DefaultGunData { public class DefaultGunData {
@ -32,8 +33,12 @@ public class DefaultGunData {
public int projectileAmount = 1; public int projectileAmount = 1;
@SerializedName("Weight") @SerializedName("Weight")
public double weight; public double weight;
@SerializedName("FireMode")
public int fireMode; @SerializedName("DefaultFireMode")
public FireMode defaultFireMode = FireMode.SEMI;
@SerializedName("AvailableFireModes")
public Set<FireMode> availableFireModes = Set.of(FireMode.SEMI);
@SerializedName("BurstAmount") @SerializedName("BurstAmount")
public int burstAmount; public int burstAmount;
@SerializedName("BypassesArmor") @SerializedName("BypassesArmor")
@ -87,7 +92,4 @@ public class DefaultGunData {
"!superbwarfare:longer_wire", "!superbwarfare:longer_wire",
"!superbwarfare:cupid_arrow" "!superbwarfare:cupid_arrow"
); );
@SerializedName("AvailableFireModes")
public int availableFireModes = 1;
} }

View file

@ -0,0 +1,34 @@
package com.atsuishio.superbwarfare.item.gun.data;
import com.atsuishio.superbwarfare.Mod;
import com.google.gson.annotations.SerializedName;
public enum FireMode {
@SerializedName("Semi")
SEMI("Semi"),
@SerializedName("Burst")
BURST("Burst"),
@SerializedName("Auto")
AUTO("Auto");
public final String name;
FireMode(String name) {
this.name = name;
}
public static FireMode fromValue(String value) {
for (var enumConstant : FireMode.values()) {
if (enumConstant.toString().equals(value)) {
return enumConstant;
}
}
Mod.LOGGER.warn("No FireMode with value {}", value);
return FireMode.SEMI;
}
@Override
public String toString() {
return this.name;
}
}

View file

@ -27,10 +27,7 @@ import net.neoforged.neoforge.registries.DeferredHolder;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
public class GunData { public class GunData {
@ -74,7 +71,7 @@ public class GunData {
perk = new Perks(this); perk = new Perks(this);
ammo = new IntValue(data, "Ammo"); ammo = new IntValue(data, "Ammo");
fireMode = new IntValue(data, "FireMode", defaultGunData().fireMode); fireMode = new StringEnumValue<>(data, "FireMode", defaultGunData().defaultFireMode, FireMode::fromValue);
level = new IntValue(data, "Level"); level = new IntValue(data, "Level");
exp = new DoubleValue(data, "Exp"); exp = new DoubleValue(data, "Exp");
upgradePoint = new DoubleValue(data, "UpgradePoint"); upgradePoint = new DoubleValue(data, "UpgradePoint");
@ -501,13 +498,13 @@ public class GunData {
return availablePerks().contains(perk); return availablePerks().contains(perk);
} }
public int getAvailableFireModes() { public Set<FireMode> getAvailableFireModes() {
return defaultGunData().availableFireModes; return defaultGunData().availableFireModes;
} }
// 可持久化属性开始 // 可持久化属性开始
public final IntValue ammo; public final IntValue ammo;
public final IntValue fireMode; public final StringEnumValue<FireMode> fireMode;
public final IntValue level; public final IntValue level;
public final DoubleValue exp; public final DoubleValue exp;
public final DoubleValue upgradePoint; public final DoubleValue upgradePoint;

View file

@ -0,0 +1,42 @@
package com.atsuishio.superbwarfare.item.gun.data.value;
import net.minecraft.nbt.CompoundTag;
import java.util.function.Function;
public class StringEnumValue<T> {
private final CompoundTag tag;
private final String name;
private final T defaultValue;
private final Function<String, T> toEnum;
public StringEnumValue(CompoundTag tag, String name, T defaultValue, Function<String, T> toEnum) {
this.tag = tag;
this.name = name;
this.defaultValue = defaultValue;
this.toEnum = toEnum;
}
public T get() {
String value;
if (tag.contains(name)) {
value = tag.getString(name);
} else {
value = defaultValue.toString();
}
return toEnum.apply(value);
}
public void set(T value) {
if (value == defaultValue) {
tag.remove(name);
} else {
tag.putString(name, value.toString());
}
}
public void reset() {
set(defaultValue);
}
}

View file

@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.FireMode;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.tools.SoundTool; import com.atsuishio.superbwarfare.tools.SoundTool;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
@ -35,50 +36,49 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload {
if (stack.getItem() instanceof GunItem) { if (stack.getItem() instanceof GunItem) {
var data = GunData.from(stack); var data = GunData.from(stack);
var tag = data.tag(); var tag = data.tag();
int fireMode = data.fireMode.get(); var fireMode = data.fireMode.get();
int mode = data.getAvailableFireModes(); var mode = data.getAvailableFireModes();
mode &= 0b111;
if (fireMode == 0) { if (fireMode == FireMode.SEMI) {
if ((mode & 2) != 0) { if (mode.contains(FireMode.BURST)) {
data.fireMode.set(1); data.fireMode.set(FireMode.BURST);
playChangeModeSound(player); playChangeModeSound(player);
data.save(); data.save();
return; return;
} }
if ((mode & 4) != 0) { if (mode.contains(FireMode.AUTO)) {
data.fireMode.set(2); data.fireMode.set(FireMode.AUTO);
playChangeModeSound(player); playChangeModeSound(player);
data.save(); data.save();
return; return;
} }
} }
if (fireMode == 1) { if (fireMode == FireMode.BURST) {
if ((mode & 4) != 0) { if (mode.contains(FireMode.AUTO)) {
data.fireMode.set(2); data.fireMode.set(FireMode.AUTO);
playChangeModeSound(player); playChangeModeSound(player);
data.save(); data.save();
return; return;
} }
if ((mode & 1) != 0) { if (mode.contains(FireMode.SEMI)) {
data.fireMode.set(0); data.fireMode.set(FireMode.SEMI);
playChangeModeSound(player); playChangeModeSound(player);
data.save(); data.save();
return; return;
} }
} }
if (fireMode == 2) { if (fireMode == FireMode.AUTO) {
if ((mode & 1) != 0) { if (mode.contains(FireMode.SEMI)) {
data.fireMode.set(0); data.fireMode.set(FireMode.SEMI);
playChangeModeSound(player); playChangeModeSound(player);
data.save(); data.save();
return; return;
} }
if ((mode & 2) != 0) { if (mode.contains(FireMode.BURST)) {
data.fireMode.set(1); data.fireMode.set(FireMode.BURST);
playChangeModeSound(player); playChangeModeSound(player);
data.save(); data.save();
return; return;

View file

@ -8,13 +8,13 @@
"Magazine": 25, "Magazine": 25,
"ProjectileAmount": 12, "ProjectileAmount": 12,
"Weight": 7, "Weight": 7,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 64, "NormalReloadTime": 64,
"EmptyReloadTime": 85, "EmptyReloadTime": 85,
"BypassesArmor": 0.05, "BypassesArmor": 0.05,
"SoundRadius": 18, "SoundRadius": 18,
"RPM": 360, "RPM": 360,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@ShotgunAmmo", "AmmoType": "@ShotgunAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -9,13 +9,13 @@
"Velocity": 44.5, "Velocity": 44.5,
"Magazine": 30, "Magazine": 30,
"Weight": 4, "Weight": 4,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 52, "NormalReloadTime": 52,
"EmptyReloadTime": 58, "EmptyReloadTime": 58,
"BypassesArmor": 0.23, "BypassesArmor": 0.23,
"SoundRadius": 12, "SoundRadius": 12,
"RPM": 700, "RPM": 700,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -9,13 +9,13 @@
"Velocity": 36, "Velocity": 36,
"Magazine": 30, "Magazine": 30,
"Weight": 5, "Weight": 5,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 52, "NormalReloadTime": 52,
"EmptyReloadTime": 65, "EmptyReloadTime": 65,
"BypassesArmor": 0.2, "BypassesArmor": 0.2,
"SoundRadius": 14, "SoundRadius": 14,
"RPM": 600, "RPM": 600,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -8,13 +8,13 @@
"Velocity": 40, "Velocity": 40,
"Magazine": 55, "Magazine": 55,
"Weight": 6, "Weight": 6,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 73, "NormalReloadTime": 73,
"EmptyReloadTime": 95, "EmptyReloadTime": 95,
"BypassesArmor": 0.25, "BypassesArmor": 0.25,
"SoundRadius": 13, "SoundRadius": 13,
"RPM": 400, "RPM": 400,
"AvailableFireModes": 4, "AvailableFireModes": ["Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -7,13 +7,13 @@
"Velocity": 17, "Velocity": 17,
"Magazine": 17, "Magazine": 17,
"Weight": 1, "Weight": 1,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 44, "NormalReloadTime": 44,
"EmptyReloadTime": 47, "EmptyReloadTime": 47,
"BypassesArmor": 0.15, "BypassesArmor": 0.15,
"SoundRadius": 8, "SoundRadius": 8,
"RPM": 1300, "RPM": 1300,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@HandgunAmmo", "AmmoType": "@HandgunAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -9,13 +9,13 @@
"Velocity": 44, "Velocity": 44,
"Magazine": 30, "Magazine": 30,
"Weight": 4, "Weight": 4,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 56, "NormalReloadTime": 56,
"EmptyReloadTime": 64, "EmptyReloadTime": 64,
"BypassesArmor": 0.25, "BypassesArmor": 0.25,
"SoundRadius": 14, "SoundRadius": 14,
"RPM": 900, "RPM": 900,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -7,13 +7,13 @@
"Velocity": 50, "Velocity": 50,
"Magazine": 48, "Magazine": 48,
"Weight": 6, "Weight": 6,
"FireMode": 1, "DefaultFireMode": "Auto",
"BurstAmount": 4, "BurstAmount": 4,
"EmptyReloadTime": 56, "EmptyReloadTime": 56,
"BypassesArmor": 0.4, "BypassesArmor": 0.4,
"SoundRadius": 12, "SoundRadius": 12,
"RPM": 900, "RPM": 900,
"AvailableFireModes": 2, "AvailableFireModes": ["Burst"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -8,7 +8,7 @@
"Magazine": 5, "Magazine": 5,
"BoltActionTime": 22, "BoltActionTime": 22,
"Weight": 5, "Weight": 5,
"FireMode": 0, "DefaultFireMode": "Auto",
"EmptyReloadTime": 59, "EmptyReloadTime": 59,
"PrepareTime": 29, "PrepareTime": 29,
"IterativeTime": 11, "IterativeTime": 11,

View file

@ -9,13 +9,13 @@
"Velocity": 44, "Velocity": 44,
"Magazine": 30, "Magazine": 30,
"Weight": 4, "Weight": 4,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 56, "NormalReloadTime": 56,
"EmptyReloadTime": 64, "EmptyReloadTime": 64,
"BypassesArmor": 0.25, "BypassesArmor": 0.25,
"SoundRadius": 14, "SoundRadius": 14,
"RPM": 850, "RPM": 850,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -7,13 +7,13 @@
"Velocity": 43, "Velocity": 43,
"Magazine": 100, "Magazine": 100,
"Weight": 8, "Weight": 8,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 114, "NormalReloadTime": 114,
"EmptyReloadTime": 133, "EmptyReloadTime": 133,
"BypassesArmor": 0.25, "BypassesArmor": 0.25,
"SoundRadius": 15, "SoundRadius": 15,
"RPM": 600, "RPM": 600,
"AvailableFireModes": 4, "AvailableFireModes": ["Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -9,7 +9,7 @@
"BypassesArmor": 0.3, "BypassesArmor": 0.3,
"SoundRadius": 14, "SoundRadius": 14,
"RPM": 1200, "RPM": 1200,
"FireMode": 2, "DefaultFireMode": "Auto",
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"ShootDelay": 20, "ShootDelay": 20,
"HeatPerShoot": 0.5, "HeatPerShoot": 0.5,

View file

@ -9,13 +9,13 @@
"Velocity": 42.5, "Velocity": 42.5,
"Magazine": 20, "Magazine": 20,
"Weight": 5, "Weight": 5,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 54, "NormalReloadTime": 54,
"EmptyReloadTime": 71, "EmptyReloadTime": 71,
"BypassesArmor": 0.4, "BypassesArmor": 0.4,
"SoundRadius": 16, "SoundRadius": 16,
"RPM": 700, "RPM": 700,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -9,13 +9,13 @@
"Velocity": 46, "Velocity": 46,
"Magazine": 30, "Magazine": 30,
"Weight": 4, "Weight": 4,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 60, "NormalReloadTime": 60,
"EmptyReloadTime": 74, "EmptyReloadTime": 74,
"BypassesArmor": 0.28, "BypassesArmor": 0.28,
"SoundRadius": 13, "SoundRadius": 13,
"RPM": 650, "RPM": 650,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -9,13 +9,13 @@
"Velocity": 38, "Velocity": 38,
"Magazine": 40, "Magazine": 40,
"Weight": 7, "Weight": 7,
"FireMode": 2, "DefaultFireMode": "Auto",
"NormalReloadTime": 52, "NormalReloadTime": 52,
"EmptyReloadTime": 65, "EmptyReloadTime": 65,
"BypassesArmor": 0.23, "BypassesArmor": 0.23,
"SoundRadius": 14, "SoundRadius": 14,
"RPM": 600, "RPM": 600,
"AvailableFireModes": 5, "AvailableFireModes": ["Semi", "Auto"],
"AmmoType": "@RifleAmmo", "AmmoType": "@RifleAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",

View file

@ -7,14 +7,14 @@
"Velocity": 16, "Velocity": 16,
"Magazine": 13, "Magazine": 13,
"Weight": 3, "Weight": 3,
"FireMode": 2, "DefaultFireMode": "Auto",
"BurstAmount": 3, "BurstAmount": 3,
"NormalReloadTime": 46, "NormalReloadTime": 46,
"EmptyReloadTime": 64, "EmptyReloadTime": 64,
"BypassesArmor": 0.15, "BypassesArmor": 0.15,
"SoundRadius": 11, "SoundRadius": 11,
"RPM": 1200, "RPM": 1200,
"AvailableFireModes": 7, "AvailableFireModes": ["Semi", "Burst", "Auto"],
"AmmoType": "@HandgunAmmo", "AmmoType": "@HandgunAmmo",
"AvailablePerks": [ "AvailablePerks": [
"@Ammo", "@Ammo",