From 0d5a4d7685adcb5a215a29dc0a6585439c71588a Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Sun, 13 Apr 2025 16:03:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99=E6=9E=AA=E6=A2=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/gun/data/DefaultGunData.java | 67 +++++++++++++++++++ .../superbwarfare/item/gun/data/GunData.java | 63 ++++++++--------- .../message/receive/GunsDataMessage.java | 25 +++++-- .../superbwarfare/tools/GunsTool.java | 46 +++---------- 4 files changed, 122 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/data/DefaultGunData.java diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/DefaultGunData.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/DefaultGunData.java new file mode 100644 index 000000000..dd86b8217 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/DefaultGunData.java @@ -0,0 +1,67 @@ +package com.atsuishio.superbwarfare.item.gun.data; + +import com.google.gson.annotations.SerializedName; + +public class DefaultGunData { + + @SerializedName("RecoilX") + public double recoilX; + @SerializedName("RecoilY") + public double recoilY; + + @SerializedName("DefaultZoom") + public double defaultZoom = 1.25; + @SerializedName("MinZoom") + public double minZoom = defaultZoom; + @SerializedName("MaxZoom") + public double maxZoom = defaultZoom; + + @SerializedName("Spread") + public double spread; + @SerializedName("Damage") + public double damage; + @SerializedName("Headshot") + public double headshot = 1.5; + @SerializedName("Velocity") + public double velocity; + @SerializedName("Magazine") + public int magazine; + @SerializedName("ProjectileAmount") + public int projectileAmount = 1; + @SerializedName("Weight") + public double weight; + @SerializedName("FireMode") + public int fireMode; + @SerializedName("BurstAmount") + public int burstAmount; + @SerializedName("BypassArmor") + public double bypassArmor; + + @SerializedName("NormalReloadTime") + public int normalReloadTime; + @SerializedName("EmptyReloadTime") + public int emptyReloadTime; + @SerializedName("BoltActionTime") + public int boltActionTime; + @SerializedName("PrepareTime") + public int prepareTime; + @SerializedName("PrepareLoadTime") + public int prepareLoadTime; + @SerializedName("PrepareEmptyTime") + public int prepareEmptyTime; + @SerializedName("IterativeTime") + public int iterativeTime; + @SerializedName("FinishTime") + public int finishTime; + + @SerializedName("SoundRadius") + public double soundRadius; + @SerializedName("RPM") + public int rpm = 600; + + @SerializedName("ExplosionDamage") + public double explosionDamage; + @SerializedName("ExplosionRadius") + public double explosionRadius; + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java index 333ae22a5..17f688a9c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/data/GunData.java @@ -12,7 +12,6 @@ import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.CustomData; -import java.util.HashMap; import java.util.UUID; import java.util.WeakHashMap; @@ -51,7 +50,7 @@ public class GunData { perk = new Perks(this); ammo = new IntValue(data, "Ammo"); - fireMode = new IntValue(data, "FireMode", (int) getGunData("FireMode")); + fireMode = new IntValue(data, "FireMode", defaultGunData().fireMode); level = new IntValue(data, "Level"); exp = new DoubleValue(data, "Exp"); upgradePoint = new DoubleValue(data, "UpgradePoint"); @@ -124,19 +123,15 @@ public class GunData { return attachmentTag; } - double getGunData(String key) { - return getGunData(key, 0); + DefaultGunData defaultGunData() { + return GunsTool.gunsData.getOrDefault(id, new DefaultGunData()); } // 枪械本体属性开始 - private double getGunData(String key, double defaultValue) { - return GunsTool.gunsData.getOrDefault(id, new HashMap<>()).getOrDefault(key, defaultValue); - } - public double rawDamage() { - return getGunData("Damage"); + return defaultGunData().damage; } public double perkDamageRate() { @@ -152,83 +147,83 @@ public class GunData { } public double explosionDamage() { - return getGunData("ExplosionDamage"); + return defaultGunData().explosionDamage; } public double explosionRadius() { - return getGunData("ExplosionRadius"); + return defaultGunData().explosionRadius; } public double velocity() { - return getGunData("Velocity") + item.getCustomVelocity(stack); + return defaultGunData().velocity + item.getCustomVelocity(stack); } public double spread() { - return getGunData("Spread"); + return defaultGunData().spread; } public int magazine() { - return (int) (getGunData("Magazine") + item.getCustomMagazine(stack)); + return defaultGunData().magazine + item.getCustomMagazine(stack); } public int projectileAmount() { - return (int) getGunData("ProjectileAmount", 1); + return defaultGunData().projectileAmount; } public double headshot() { - return getGunData("Headshot", 1.5) + item.getCustomHeadshot(stack); + return defaultGunData().headshot + item.getCustomHeadshot(stack); } public int defaultNormalReloadTime() { - return (int) getGunData("NormalReloadTime"); + return defaultGunData().normalReloadTime; } public int defaultEmptyReloadTime() { - return (int) getGunData("EmptyReloadTime"); + return defaultGunData().emptyReloadTime; } public int defaultIterativeTime() { - return (int) getGunData("IterativeTime"); + return defaultGunData().iterativeTime; } public int defaultPrepareTime() { - return (int) getGunData("PrepareTime"); + return defaultGunData().prepareTime; } public int defaultPrepareLoadTime() { - return (int) getGunData("PrepareLoadTime"); + return defaultGunData().prepareLoadTime; } public int defaultPrepareEmptyTime() { - return (int) getGunData("PrepareEmptyTime"); + return defaultGunData().prepareEmptyTime; } public int defaultFinishTime() { - return (int) getGunData("FinishTime"); + return defaultGunData().finishTime; } public int defaultActionTime() { - return (int) getGunData("BoltActionTime") + item.getCustomBoltActionTime(stack()); + return defaultGunData().boltActionTime + item.getCustomBoltActionTime(stack()); } public double soundRadius() { - return getGunData("SoundRadius", 15) + item.getCustomSoundRadius(stack); + return defaultGunData().soundRadius + item.getCustomSoundRadius(stack); } public double bypassArmor() { - return getGunData("BypassesArmor") + item.getCustomBypassArmor(stack); + return defaultGunData().bypassArmor + item.getCustomBypassArmor(stack); } public double recoilX() { - return getGunData("RecoilX"); + return defaultGunData().recoilX; } public double recoilY() { - return getGunData("RecoilY"); + return defaultGunData().recoilY; } public double weight() { - return getGunData("Weight") + customWeight(); + return defaultGunData().weight + customWeight(); } public double customWeight() { @@ -237,17 +232,17 @@ public class GunData { public double defaultZoom() { - return getGunData("DefaultZoom", 1.25); + return defaultGunData().defaultZoom; } public double minZoom() { int scopeType = this.attachment.get(AttachmentType.SCOPE); - return scopeType == 3 ? getGunData("MinZoom", 1.25) : 1.25; + return scopeType == 3 ? defaultGunData().minZoom : 1.25; } public double maxZoom() { int scopeType = this.attachment.get(AttachmentType.SCOPE); - return scopeType == 3 ? getGunData("MaxZoom", 1) : 114514; + return scopeType == 3 ? defaultGunData().maxZoom : 114514; } public double zoom() { @@ -257,11 +252,11 @@ public class GunData { } public int rpm() { - return (int) (getGunData("RPM") + item.getCustomRPM(stack)); + return (defaultGunData().rpm + item.getCustomRPM(stack)); } public int burstAmount() { - return (int) getGunData("BurstAmount"); + return defaultGunData().burstAmount; } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/receive/GunsDataMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/receive/GunsDataMessage.java index d1524abd8..f2aaddda6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/receive/GunsDataMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/receive/GunsDataMessage.java @@ -1,7 +1,9 @@ package com.atsuishio.superbwarfare.network.message.receive; import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.item.gun.data.DefaultGunData; import com.atsuishio.superbwarfare.tools.GunsTool; +import com.google.gson.Gson; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; @@ -10,8 +12,9 @@ import net.neoforged.neoforge.network.handling.IPayloadContext; import org.jetbrains.annotations.NotNull; import java.util.HashMap; +import java.util.Map; -public record GunsDataMessage(HashMap> gunsData) implements CustomPacketPayload { +public record GunsDataMessage(Map gunsData) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Mod.loc("set_guns_data")); @@ -19,19 +22,27 @@ public record GunsDataMessage(HashMap> gunsData) ByteBufCodecs.map( HashMap::new, ByteBufCodecs.STRING_UTF8, - ByteBufCodecs.map( - HashMap::new, - ByteBufCodecs.STRING_UTF8, - ByteBufCodecs.DOUBLE - ) + ByteBufCodecs.STRING_UTF8 ), GunsDataMessage::gunsData, GunsDataMessage::new ); + private static final Gson GSON = new Gson(); + + public static GunsDataMessage create() { + var map = new HashMap(); + for (var entry : GunsTool.gunsData.entrySet()) { + map.put(entry.getKey(), GSON.toJson(entry.getValue())); + } + return new GunsDataMessage(map); + } public static void handler(final GunsDataMessage message, final IPayloadContext context) { - GunsTool.gunsData = message.gunsData; + GunsTool.gunsData.clear(); + for (var entry : message.gunsData.entrySet()) { + GunsTool.gunsData.put(entry.getKey(), GSON.fromJson(entry.getValue(), DefaultGunData.class)); + } } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java index 11b0fe171..96e44426a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/GunsTool.java @@ -3,10 +3,11 @@ package com.atsuishio.superbwarfare.tools; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.init.ModAttachments; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.data.DefaultGunData; import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.value.ReloadState; import com.atsuishio.superbwarfare.network.message.receive.GunsDataMessage; -import com.google.gson.stream.JsonReader; +import com.google.gson.Gson; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.packs.resources.ResourceManager; @@ -27,7 +28,7 @@ import java.util.UUID; @EventBusSubscriber(modid = Mod.MODID) public class GunsTool { - public static HashMap> gunsData = new HashMap<>(); + public static HashMap gunsData = new HashMap<>(); /** * 初始化数据,从data中读取数据json文件 @@ -37,18 +38,11 @@ public class GunsTool { var id = entry.getKey(); var attribute = entry.getValue(); try { - JsonReader reader = new JsonReader(new InputStreamReader(attribute.open())); - - reader.beginObject(); - var map = new HashMap(); - while (reader.hasNext()) { - map.put(reader.nextName(), reader.nextDouble()); - } + Gson gson = new Gson(); + var data = gson.fromJson(new InputStreamReader(attribute.open()), DefaultGunData.class); var path = id.getPath(); - gunsData.put(path.substring(5, path.length() - 5), map); - reader.endObject(); - reader.close(); + gunsData.put(path.substring(5, path.length() - 5), data); } catch (Exception e) { Mod.LOGGER.error(e.getMessage()); } @@ -58,7 +52,7 @@ public class GunsTool { @SubscribeEvent public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player) { - PacketDistributor.sendToPlayer(player, new GunsDataMessage(GunsTool.gunsData)); + PacketDistributor.sendToPlayer(player, GunsDataMessage.create()); } } @@ -71,7 +65,7 @@ public class GunsTool { public static void datapackSync(OnDatapackSyncEvent event) { initJsonData(event.getPlayerList().getServer().getResourceManager()); - event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, new GunsDataMessage(GunsTool.gunsData))); + event.getRelevantPlayers().forEach(player -> PacketDistributor.sendToPlayer(player, GunsDataMessage.create())); } public static void reload(Player player, ItemStack stack, GunData gunData, AmmoType type) { @@ -129,11 +123,6 @@ public class GunsTool { } - /* GunData */ - public static CompoundTag getGunData(final CompoundTag tag) { - return tag.getCompound("GunData"); - } - public static void setGunIntTag(final CompoundTag tag, String name, int num) { var data = tag.getCompound("GunData"); data.putInt(name, num); @@ -150,12 +139,6 @@ public class GunsTool { return data.getInt(name); } - public static void setGunDoubleTag(final CompoundTag tag, String name, double num) { - var data = tag.getCompound("GunData"); - data.putDouble(name, num); - tag.put("GunData", data); - } - public static double getGunDoubleTag(final CompoundTag tag, String name) { return getGunDoubleTag(tag, name, 0); } @@ -165,19 +148,6 @@ public class GunsTool { if (!data.contains(name)) return defaultValue; return data.getDouble(name); } - - public static void setGunBooleanTag(final CompoundTag tag, String name, boolean flag) { - var data = tag.getCompound("GunData"); - data.putBoolean(name, flag); - tag.put("GunData", data); - } - - public static boolean getGunBooleanTag(final CompoundTag tag, String name) { - var data = tag.getCompound("GunData"); - if (!data.contains(name)) return false; - return data.getBoolean(name); - } - @Nullable public static UUID getGunUUID(final CompoundTag tag) { if (!tag.contains("GunData")) return null;