重写FireMode
This commit is contained in:
parent
32f649b8d7
commit
027d3c680b
27 changed files with 158 additions and 96 deletions
|
@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity;
|
|||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
import com.atsuishio.superbwarfare.init.*;
|
||||
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.network.message.send.*;
|
||||
import com.atsuishio.superbwarfare.tools.NBTTool;
|
||||
|
@ -365,7 +366,7 @@ public class ClickHandler {
|
|||
&& !data.bolt.needed.get())
|
||||
&& drawTime < 0.01
|
||||
) {
|
||||
if (data.fireMode.get() == 1) {
|
||||
if (data.fireMode.get() == FireMode.BURST) {
|
||||
if (ClientEventHandler.burstFireAmount == 0) {
|
||||
ClientEventHandler.burstFireAmount = data.burstAmount();
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper;
|
|||
import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay;
|
||||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
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.handgun.Glock18Item;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -49,11 +50,11 @@ public class Glock18ItemModel extends GeoModel<Glock18Item> {
|
|||
if (!(stack.getItem() instanceof GunItem)) return;
|
||||
|
||||
var data = GunData.from(stack);
|
||||
int mode = data.fireMode.get();
|
||||
if (mode == 0) {
|
||||
var mode = data.fireMode.get();
|
||||
if (mode == FireMode.SEMI) {
|
||||
switch_.setRotX(35 * Mth.DEG_TO_RAD);
|
||||
}
|
||||
if (mode == 2) {
|
||||
if (mode == FireMode.AUTO) {
|
||||
switch_.setRotX(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.AnimationHelper;
|
|||
import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay;
|
||||
import com.atsuishio.superbwarfare.event.ClientEventHandler;
|
||||
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.value.AttachmentType;
|
||||
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);
|
||||
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());
|
||||
|
||||
|
|
|
@ -55,15 +55,11 @@ public class VectorItemModel extends GeoModel<VectorItem> {
|
|||
if (!(stack.getItem() instanceof GunItem)) return;
|
||||
|
||||
var data = GunData.from(stack);
|
||||
int mode = data.fireMode.get();
|
||||
if (mode == 0) {
|
||||
kmj.setRotX(-120 * Mth.DEG_TO_RAD);
|
||||
}
|
||||
if (mode == 1) {
|
||||
kmj.setRotX(-60 * Mth.DEG_TO_RAD);
|
||||
}
|
||||
if (mode == 2) {
|
||||
kmj.setRotX(0);
|
||||
|
||||
switch (data.fireMode.get()) {
|
||||
case SEMI -> kmj.setRotX(-120 * Mth.DEG_TO_RAD);
|
||||
case BURST -> kmj.setRotX(-60 * Mth.DEG_TO_RAD);
|
||||
case AUTO -> kmj.setRotX(0);
|
||||
}
|
||||
|
||||
float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8);
|
||||
|
|
|
@ -200,9 +200,9 @@ public class AmmoBarOverlay implements LayeredDraw.Layer {
|
|||
|
||||
private static ResourceLocation getFireMode(GunData data) {
|
||||
return switch (data.fireMode.get()) {
|
||||
case 1 -> BURST;
|
||||
case 2 -> AUTO;
|
||||
default -> SEMI;
|
||||
case SEMI -> SEMI;
|
||||
case BURST -> BURST;
|
||||
case AUTO -> AUTO;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
|
|||
import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity;
|
||||
import com.atsuishio.superbwarfare.init.*;
|
||||
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.value.AttachmentType;
|
||||
import com.atsuishio.superbwarfare.network.message.send.*;
|
||||
|
@ -492,10 +493,9 @@ public class ClientEventHandler {
|
|||
return;
|
||||
}
|
||||
var data = GunData.from(stack);
|
||||
final var tag = data.tag();
|
||||
|
||||
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);
|
||||
|
@ -581,7 +581,7 @@ public class ClientEventHandler {
|
|||
&& !player.getCooldowns().isOnCooldown(stack.getItem())
|
||||
&& !GunData.from(stack).bolt.needed.get())
|
||||
)) {
|
||||
if (mode == 0) {
|
||||
if (mode == FireMode.SEMI) {
|
||||
if (clientTimer.getProgress() == 0) {
|
||||
clientTimer.start();
|
||||
shootClient(player);
|
||||
|
@ -611,7 +611,7 @@ public class ClientEventHandler {
|
|||
}
|
||||
|
||||
} else {
|
||||
if (mode != 0 && clientTimer.getProgress() >= cooldown) {
|
||||
if (mode != FireMode.SEMI && clientTimer.getProgress() >= cooldown) {
|
||||
clientTimer.stop();
|
||||
}
|
||||
fireSpread = 0;
|
||||
|
@ -619,7 +619,7 @@ public class ClientEventHandler {
|
|||
|
||||
gunPartMove(times);
|
||||
|
||||
if (mode == 0 && clientTimer.getProgress() >= cooldown) {
|
||||
if (mode == FireMode.SEMI && clientTimer.getProgress() >= cooldown) {
|
||||
clientTimer.stop();
|
||||
}
|
||||
|
||||
|
@ -659,12 +659,12 @@ public class ClientEventHandler {
|
|||
if (!gunItem.canShoot(data)) return;
|
||||
|
||||
if (stack.is(ModTags.Items.NORMAL_GUN)) {
|
||||
int mode = data.fireMode.get();
|
||||
if (mode != 2) {
|
||||
var mode = data.fireMode.get();
|
||||
if (mode != FireMode.AUTO) {
|
||||
holdFire = false;
|
||||
}
|
||||
|
||||
if (mode == 1) {
|
||||
if (mode == FireMode.BURST) {
|
||||
if (data.ammo.get() == 1) {
|
||||
burstFireAmount = 1;
|
||||
}
|
||||
|
|
|
@ -458,18 +458,6 @@ public abstract class GunItem extends Item implements CustomRendererItem {
|
|||
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<>();
|
||||
|
||||
/**
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.item.gun.data;
|
|||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class DefaultGunData {
|
||||
|
||||
|
@ -32,8 +33,12 @@ public class DefaultGunData {
|
|||
public int projectileAmount = 1;
|
||||
@SerializedName("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")
|
||||
public int burstAmount;
|
||||
@SerializedName("BypassesArmor")
|
||||
|
@ -87,7 +92,4 @@ public class DefaultGunData {
|
|||
"!superbwarfare:longer_wire",
|
||||
"!superbwarfare:cupid_arrow"
|
||||
);
|
||||
|
||||
@SerializedName("AvailableFireModes")
|
||||
public int availableFireModes = 1;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -27,10 +27,7 @@ import net.neoforged.neoforge.registries.DeferredHolder;
|
|||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
public class GunData {
|
||||
|
||||
|
@ -74,7 +71,7 @@ public class GunData {
|
|||
perk = new Perks(this);
|
||||
|
||||
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");
|
||||
exp = new DoubleValue(data, "Exp");
|
||||
upgradePoint = new DoubleValue(data, "UpgradePoint");
|
||||
|
@ -501,13 +498,13 @@ public class GunData {
|
|||
return availablePerks().contains(perk);
|
||||
}
|
||||
|
||||
public int getAvailableFireModes() {
|
||||
public Set<FireMode> getAvailableFireModes() {
|
||||
return defaultGunData().availableFireModes;
|
||||
}
|
||||
|
||||
// 可持久化属性开始
|
||||
public final IntValue ammo;
|
||||
public final IntValue fireMode;
|
||||
public final StringEnumValue<FireMode> fireMode;
|
||||
public final IntValue level;
|
||||
public final DoubleValue exp;
|
||||
public final DoubleValue upgradePoint;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.Mod;
|
|||
import com.atsuishio.superbwarfare.init.ModItems;
|
||||
import com.atsuishio.superbwarfare.init.ModSounds;
|
||||
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.tools.SoundTool;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
@ -35,50 +36,49 @@ public record FireModeMessage(int msgType) implements CustomPacketPayload {
|
|||
if (stack.getItem() instanceof GunItem) {
|
||||
var data = GunData.from(stack);
|
||||
var tag = data.tag();
|
||||
int fireMode = data.fireMode.get();
|
||||
var fireMode = data.fireMode.get();
|
||||
|
||||
int mode = data.getAvailableFireModes();
|
||||
mode &= 0b111;
|
||||
var mode = data.getAvailableFireModes();
|
||||
|
||||
if (fireMode == 0) {
|
||||
if ((mode & 2) != 0) {
|
||||
data.fireMode.set(1);
|
||||
if (fireMode == FireMode.SEMI) {
|
||||
if (mode.contains(FireMode.BURST)) {
|
||||
data.fireMode.set(FireMode.BURST);
|
||||
playChangeModeSound(player);
|
||||
data.save();
|
||||
return;
|
||||
}
|
||||
if ((mode & 4) != 0) {
|
||||
data.fireMode.set(2);
|
||||
if (mode.contains(FireMode.AUTO)) {
|
||||
data.fireMode.set(FireMode.AUTO);
|
||||
playChangeModeSound(player);
|
||||
data.save();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (fireMode == 1) {
|
||||
if ((mode & 4) != 0) {
|
||||
data.fireMode.set(2);
|
||||
if (fireMode == FireMode.BURST) {
|
||||
if (mode.contains(FireMode.AUTO)) {
|
||||
data.fireMode.set(FireMode.AUTO);
|
||||
playChangeModeSound(player);
|
||||
data.save();
|
||||
return;
|
||||
}
|
||||
if ((mode & 1) != 0) {
|
||||
data.fireMode.set(0);
|
||||
if (mode.contains(FireMode.SEMI)) {
|
||||
data.fireMode.set(FireMode.SEMI);
|
||||
playChangeModeSound(player);
|
||||
data.save();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (fireMode == 2) {
|
||||
if ((mode & 1) != 0) {
|
||||
data.fireMode.set(0);
|
||||
if (fireMode == FireMode.AUTO) {
|
||||
if (mode.contains(FireMode.SEMI)) {
|
||||
data.fireMode.set(FireMode.SEMI);
|
||||
playChangeModeSound(player);
|
||||
data.save();
|
||||
return;
|
||||
}
|
||||
if ((mode & 2) != 0) {
|
||||
data.fireMode.set(1);
|
||||
if (mode.contains(FireMode.BURST)) {
|
||||
data.fireMode.set(FireMode.BURST);
|
||||
playChangeModeSound(player);
|
||||
data.save();
|
||||
return;
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
"Magazine": 25,
|
||||
"ProjectileAmount": 12,
|
||||
"Weight": 7,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 64,
|
||||
"EmptyReloadTime": 85,
|
||||
"BypassesArmor": 0.05,
|
||||
"SoundRadius": 18,
|
||||
"RPM": 360,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@ShotgunAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 44.5,
|
||||
"Magazine": 30,
|
||||
"Weight": 4,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 52,
|
||||
"EmptyReloadTime": 58,
|
||||
"BypassesArmor": 0.23,
|
||||
"SoundRadius": 12,
|
||||
"RPM": 700,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 36,
|
||||
"Magazine": 30,
|
||||
"Weight": 5,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 52,
|
||||
"EmptyReloadTime": 65,
|
||||
"BypassesArmor": 0.2,
|
||||
"SoundRadius": 14,
|
||||
"RPM": 600,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
"Velocity": 40,
|
||||
"Magazine": 55,
|
||||
"Weight": 6,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 73,
|
||||
"EmptyReloadTime": 95,
|
||||
"BypassesArmor": 0.25,
|
||||
"SoundRadius": 13,
|
||||
"RPM": 400,
|
||||
"AvailableFireModes": 4,
|
||||
"AvailableFireModes": ["Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
"Velocity": 17,
|
||||
"Magazine": 17,
|
||||
"Weight": 1,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 44,
|
||||
"EmptyReloadTime": 47,
|
||||
"BypassesArmor": 0.15,
|
||||
"SoundRadius": 8,
|
||||
"RPM": 1300,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@HandgunAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 44,
|
||||
"Magazine": 30,
|
||||
"Weight": 4,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 56,
|
||||
"EmptyReloadTime": 64,
|
||||
"BypassesArmor": 0.25,
|
||||
"SoundRadius": 14,
|
||||
"RPM": 900,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
"Velocity": 50,
|
||||
"Magazine": 48,
|
||||
"Weight": 6,
|
||||
"FireMode": 1,
|
||||
"DefaultFireMode": "Auto",
|
||||
"BurstAmount": 4,
|
||||
"EmptyReloadTime": 56,
|
||||
"BypassesArmor": 0.4,
|
||||
"SoundRadius": 12,
|
||||
"RPM": 900,
|
||||
"AvailableFireModes": 2,
|
||||
"AvailableFireModes": ["Burst"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"Magazine": 5,
|
||||
"BoltActionTime": 22,
|
||||
"Weight": 5,
|
||||
"FireMode": 0,
|
||||
"DefaultFireMode": "Auto",
|
||||
"EmptyReloadTime": 59,
|
||||
"PrepareTime": 29,
|
||||
"IterativeTime": 11,
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 44,
|
||||
"Magazine": 30,
|
||||
"Weight": 4,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 56,
|
||||
"EmptyReloadTime": 64,
|
||||
"BypassesArmor": 0.25,
|
||||
"SoundRadius": 14,
|
||||
"RPM": 850,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
"Velocity": 43,
|
||||
"Magazine": 100,
|
||||
"Weight": 8,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 114,
|
||||
"EmptyReloadTime": 133,
|
||||
"BypassesArmor": 0.25,
|
||||
"SoundRadius": 15,
|
||||
"RPM": 600,
|
||||
"AvailableFireModes": 4,
|
||||
"AvailableFireModes": ["Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"BypassesArmor": 0.3,
|
||||
"SoundRadius": 14,
|
||||
"RPM": 1200,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"ShootDelay": 20,
|
||||
"HeatPerShoot": 0.5,
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 42.5,
|
||||
"Magazine": 20,
|
||||
"Weight": 5,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 54,
|
||||
"EmptyReloadTime": 71,
|
||||
"BypassesArmor": 0.4,
|
||||
"SoundRadius": 16,
|
||||
"RPM": 700,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 46,
|
||||
"Magazine": 30,
|
||||
"Weight": 4,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 60,
|
||||
"EmptyReloadTime": 74,
|
||||
"BypassesArmor": 0.28,
|
||||
"SoundRadius": 13,
|
||||
"RPM": 650,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
"Velocity": 38,
|
||||
"Magazine": 40,
|
||||
"Weight": 7,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"NormalReloadTime": 52,
|
||||
"EmptyReloadTime": 65,
|
||||
"BypassesArmor": 0.23,
|
||||
"SoundRadius": 14,
|
||||
"RPM": 600,
|
||||
"AvailableFireModes": 5,
|
||||
"AvailableFireModes": ["Semi", "Auto"],
|
||||
"AmmoType": "@RifleAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
|
@ -7,14 +7,14 @@
|
|||
"Velocity": 16,
|
||||
"Magazine": 13,
|
||||
"Weight": 3,
|
||||
"FireMode": 2,
|
||||
"DefaultFireMode": "Auto",
|
||||
"BurstAmount": 3,
|
||||
"NormalReloadTime": 46,
|
||||
"EmptyReloadTime": 64,
|
||||
"BypassesArmor": 0.15,
|
||||
"SoundRadius": 11,
|
||||
"RPM": 1200,
|
||||
"AvailableFireModes": 7,
|
||||
"AvailableFireModes": ["Semi", "Burst", "Auto"],
|
||||
"AmmoType": "@HandgunAmmo",
|
||||
"AvailablePerks": [
|
||||
"@Ammo",
|
||||
|
|
Loading…
Add table
Reference in a new issue