提取换弹模式

This commit is contained in:
Light_Quanta 2025-05-11 23:17:50 +08:00
parent e0969c6c9b
commit 4286f907e7
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
47 changed files with 46 additions and 282 deletions

View file

@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.init.ModKeyMappings;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.init.ModTags;
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.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk;
@ -113,7 +114,7 @@ public class ClientGunImageTooltip implements ClientTooltipComponent {
* 获取武器射速的文本组件
*/
protected Component getRpmComponent() {
if (this.stack.getItem() instanceof GunItem gunItem && gunItem.isAutoWeapon(this.stack)) {
if (this.stack.getItem() instanceof GunItem && GunData.from(this.stack).getAvailableFireModes().contains(FireMode.AUTO)) {
return Component.translatable("des.superbwarfare.guns.rpm").withStyle(ChatFormatting.GRAY)
.append(Component.literal("").withStyle(ChatFormatting.RESET))
.append(Component.literal(FormatTool.format0D(data.rpm()))

View file

@ -197,33 +197,6 @@ public abstract class GunItem extends Item implements CustomRendererItem {
return false;
}
/**
* 是否使用弹匣换弹
*
* @param stack 武器物品
*/
public boolean isMagazineReload(ItemStack stack) {
return false;
}
/**
* 是否使用弹夹换弹
*
* @param stack 武器物品
*/
public boolean isClipReload(ItemStack stack) {
return false;
}
/**
* 是否是单发装填换弹
*
* @param stack 武器物品
*/
public boolean isIterativeReload(ItemStack stack) {
return false;
}
/**
* 开膛待击
*
@ -242,15 +215,6 @@ public abstract class GunItem extends Item implements CustomRendererItem {
return false;
}
/**
* 武器是否为全自动武器
*
* @param stack 武器物品
*/
public boolean isAutoWeapon(ItemStack stack) {
return false;
}
/**
* 武器是否能进行改装
*

View file

@ -39,6 +39,9 @@ public class DefaultGunData {
@SerializedName("AvailableFireModes")
public Set<FireMode> availableFireModes = Set.of(FireMode.SEMI);
@SerializedName("ReloadTypes")
public Set<ReloadType> reloadTypes = Set.of(ReloadType.MAGAZINE);
@SerializedName("BurstAmount")
public int burstAmount;
@SerializedName("BypassesArmor")

View file

@ -195,6 +195,10 @@ public class GunData {
return defaultGunData().headshot + item.getCustomHeadshot(stack);
}
public Set<ReloadType> reloadTypes() {
return defaultGunData().reloadTypes;
}
public int defaultNormalReloadTime() {
return defaultGunData().normalReloadTime;
}

View file

@ -0,0 +1,12 @@
package com.atsuishio.superbwarfare.item.gun.data;
import com.google.gson.annotations.SerializedName;
public enum ReloadType {
@SerializedName("Magazine")
MAGAZINE,
@SerializedName("Clip")
CLIP,
@SerializedName("Iterative")
ITERATIVE,
}

View file

@ -108,11 +108,6 @@ public class Glock17Item extends GunItem implements GeoItem {
return "GLOCK-17";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -110,11 +110,6 @@ public class Glock18Item extends GunItem implements GeoItem {
return "GLOCK-18";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -125,11 +120,6 @@ public class Glock18Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean canEjectShell(ItemStack stack) {
return true;

View file

@ -110,11 +110,6 @@ public class M1911Item extends GunItem implements GeoItem {
return "M-1911";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -107,11 +107,6 @@ public class Mp443Item extends GunItem implements GeoItem {
return "MP-443";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -294,11 +294,6 @@ public class Trachelium extends GunItem implements GeoItem {
return "TRACHELIUM";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -155,11 +155,6 @@ public class Ntw20Item extends GunItem implements GeoItem {
return "NTW-20";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -195,11 +195,6 @@ public class JavelinItem extends GunItem implements GeoItem {
return Optional.of(new LauncherImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public String getAmmoDisplayName(GunData data) {
return "Javelin Missile";

View file

@ -103,12 +103,6 @@ public class M79Item extends GunItem implements GeoItem {
public @NotNull Optional<TooltipComponent> getTooltipImage(@NotNull ItemStack pStack) {
return Optional.of(new LauncherImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public String getAmmoDisplayName(GunData data) {
return "40mm Grenade";

View file

@ -132,11 +132,6 @@ public class RpgItem extends GunItem implements GeoItem {
return Optional.of(new LauncherImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) {
Level level = player.level();

View file

@ -205,11 +205,6 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag
return new ItemAttributeModifiers(list, true);
}
@Override
public boolean isIterativeReload(ItemStack stack) {
return true;
}
@Override
public boolean hasMeleeAttack(ItemStack stack) {
return true;

View file

@ -92,11 +92,6 @@ public class DevotionItem extends GunItem implements GeoItem {
return "Devotion";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -107,11 +102,6 @@ public class DevotionItem extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean canEjectShell(ItemStack stack) {
return true;

View file

@ -128,21 +128,11 @@ public class M60Item extends GunItem implements GeoItem {
return "M60";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean canEjectShell(ItemStack stack) {
return true;

View file

@ -80,9 +80,4 @@ public class MinigunItem extends GunItem implements GeoItem {
return "M134 MINIGUN";
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
}

View file

@ -194,11 +194,6 @@ public class RpkItem extends GunItem implements GeoItem {
return GunData.from(stack).attachment.get(AttachmentType.SCOPE) == 2;
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -209,11 +204,6 @@ public class RpkItem extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -164,11 +164,6 @@ public class AK12Item extends GunItem implements GeoItem {
return "AK-12";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -179,11 +174,6 @@ public class AK12Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -172,11 +172,6 @@ public class AK47Item extends GunItem implements GeoItem {
return "AK-47";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -187,11 +182,6 @@ public class AK47Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -172,11 +172,6 @@ public class Hk416Item extends GunItem implements GeoItem {
return "HK-416";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -187,11 +182,6 @@ public class Hk416Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -87,9 +87,4 @@ public class InsidiousItem extends GunItem implements GeoItem {
public String getGunDisplayName() {
return "INSIDIOUS";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
}

View file

@ -178,11 +178,6 @@ public class M4Item extends GunItem implements GeoItem {
return "M4A1";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -193,11 +188,6 @@ public class M4Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -127,9 +127,4 @@ public class MarlinItem extends GunItem implements GeoItem {
public String getGunDisplayName() {
return "MARLIN-1894";
}
@Override
public boolean isIterativeReload(ItemStack stack) {
return true;
}
}

View file

@ -174,11 +174,6 @@ public class Mk14Item extends GunItem implements GeoItem {
return "MK-14";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -189,11 +184,6 @@ public class Mk14Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -187,11 +187,6 @@ public class Qbz95Item extends GunItem implements GeoItem {
return "QBZ-95-1";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -202,11 +197,6 @@ public class Qbz95Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -112,11 +112,6 @@ public class SksItem extends GunItem implements GeoItem {
return "SKS";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -122,11 +122,6 @@ public class Aa12Item extends GunItem implements GeoItem {
return Optional.of(new ShotgunImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -137,11 +132,6 @@ public class Aa12Item extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean canEjectShell(ItemStack stack) {
return true;

View file

@ -124,11 +124,6 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem {
return Optional.of(new ShotgunImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -137,9 +137,4 @@ public class M870Item extends GunItem implements GeoItem {
public @NotNull Optional<TooltipComponent> getTooltipImage(@NotNull ItemStack pStack) {
return Optional.of(new ShotgunImageComponent(pStack));
}
@Override
public boolean isIterativeReload(ItemStack stack) {
return true;
}
}

View file

@ -155,11 +155,6 @@ public class VectorItem extends GunItem implements GeoItem {
return "VECTOR";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;
@ -170,11 +165,6 @@ public class VectorItem extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isAutoWeapon(ItemStack stack) {
return true;
}
@Override
public boolean isCustomizable(ItemStack stack) {
return true;

View file

@ -86,9 +86,4 @@ public class HuntingRifleItem extends GunItem implements GeoItem {
public String getGunDisplayName() {
return "Hunting Rifle";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
}

View file

@ -136,14 +136,4 @@ public class K98Item extends GunItem implements GeoItem {
public String getGunDisplayName() {
return "KAR-98K";
}
@Override
public boolean isClipReload(ItemStack stack) {
return true;
}
@Override
public boolean isIterativeReload(ItemStack stack) {
return true;
}
}

View file

@ -111,11 +111,6 @@ public class M98bItem extends GunItem implements GeoItem {
return "M98-B";
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -134,9 +134,4 @@ public class MosinNagantItem extends GunItem implements GeoItem {
public String getGunDisplayName() {
return "MOSIN NAGANT";
}
@Override
public boolean isIterativeReload(ItemStack stack) {
return true;
}
}

View file

@ -174,11 +174,6 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem
return Optional.of(new SentinelImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -158,11 +158,6 @@ public class SvdItem extends GunItem implements GeoItem {
return true;
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public boolean isOpenBolt(ItemStack stack) {
return true;

View file

@ -154,11 +154,6 @@ public class BocekItem extends GunItem implements GeoItem {
public void onShoot(GunData data, Player player, double spread, boolean zoom) {
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public void onFireKeyRelease(GunData data, Player player, double power, boolean zoom) {
super.onFireKeyRelease(data, player, power, zoom);

View file

@ -155,11 +155,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
return Optional.of(new EnergyImageComponent(pStack));
}
@Override
public boolean isMagazineReload(ItemStack stack) {
return true;
}
@Override
public String getAmmoDisplayName(GunData data) {
return "Electrode Rod";

View file

@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.network.message.send;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.item.gun.data.ReloadType;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
@ -40,9 +41,10 @@ public record ReloadMessage(int msgType) implements CustomPacketPayload {
&& data.reload.time() == 0
&& data.bolt.actionTimer.get() == 0
) {
boolean canSingleReload = gunItem.isIterativeReload(stack);
boolean canReload = gunItem.isMagazineReload(stack) && !gunItem.isClipReload(stack);
boolean clipLoad = data.ammo.get() == 0 && gunItem.isClipReload(stack);
var reloadTypes = data.reloadTypes();
boolean canSingleReload = reloadTypes.contains(ReloadType.ITERATIVE);
boolean canReload = reloadTypes.contains(ReloadType.MAGAZINE) && !reloadTypes.contains(ReloadType.CLIP);
boolean clipLoad = data.ammo.get() == 0 && reloadTypes.contains(ReloadType.CLIP);
// 检查备弹
if (!data.hasBackupAmmo(player)) return;

View file

@ -15,7 +15,10 @@
"BypassesArmor": 0.2,
"SoundRadius": 14,
"RPM": 600,
"AvailableFireModes": ["Semi", "Auto"],
"AvailableFireModes": [
"Semi",
"Auto"
],
"AmmoType": "@RifleAmmo",
"AvailablePerks": [
"@Ammo",

View file

@ -9,6 +9,10 @@
"BoltActionTime": 22,
"Weight": 5,
"DefaultFireMode": "Auto",
"ReloadTypes": [
"Clip",
"Iterative"
],
"EmptyReloadTime": 59,
"PrepareTime": 29,
"IterativeTime": 11,

View file

@ -8,6 +8,9 @@
"Magazine": 8,
"ProjectileAmount": 12,
"Weight": 4,
"ReloadTypes": [
"Iterative"
],
"PrepareTime": 7,
"PrepareLoadTime": 36,
"IterativeTime": 16,

View file

@ -7,6 +7,9 @@
"Velocity": 38,
"Magazine": 8,
"Weight": 3,
"ReloadTypes": [
"Iterative"
],
"PrepareTime": 7,
"IterativeTime": 16,
"FinishTime": 19,

View file

@ -7,6 +7,9 @@
"Headshot": 3,
"Velocity": 42,
"Magazine": 5,
"ReloadTypes": [
"Iterative"
],
"BoltActionTime": 22,
"Weight": 5,
"PrepareTime": 29,

View file

@ -8,6 +8,9 @@
"Velocity": 3.75,
"Magazine": 8,
"Weight": 9,
"ReloadTypes": [
"Iterative"
],
"PrepareLoadTime": 31,
"IterativeTime": 20,
"FinishTime": 19,