From d42138bb9df3185b5da8e35b11ce2cb544c9e55b Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sun, 13 Jul 2025 23:57:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B9=B8=E8=BF=90=E9=9B=86?= =?UTF-8?q?=E8=A3=85=E7=AE=B1=E7=9A=84=E6=8A=BD=E5=8F=96=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/LuckyContainerBlockEntity.java | 16 +++++++++++-- .../data/container/ContainerDataManager.java | 19 +++++++++++---- .../superbwarfare/containers/aircraft.json | 12 +++++++--- .../containers/controllable_turrets.json | 24 ++++++++++++++----- .../containers/land_vehicles.json | 24 ++++++++++++++----- .../containers/mobile_vehicles.json | 2 +- 6 files changed, 75 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java index 22862d01e..11c9659e7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/LuckyContainerBlockEntity.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.block.LuckyContainerBlock; import com.atsuishio.superbwarfare.data.container.ContainerDataManager; import com.atsuishio.superbwarfare.init.ModBlockEntities; import com.atsuishio.superbwarfare.tools.ParticleTool; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.core.particles.ParticleTypes; @@ -80,8 +81,19 @@ public class LuckyContainerBlockEntity extends BlockEntity implements GeoBlockEn ContainerDataManager dataManager = ContainerDataManager.INSTANCE; var list = dataManager.getEntityTypes(this.location); if (list.isPresent()) { - int rand = this.level.random.nextInt(list.get().size()); - return EntityType.byString(list.get().get(rand)).orElse(null); + var pool = list.get(); + int sum = pool.stream().mapToInt(Pair::second).sum(); + if (sum <= 0) return null; + + int rand = this.level.random.nextInt(sum); + + int cumulativeWeight = 0; + for (var entry : pool) { + cumulativeWeight += entry.second(); + if (rand < cumulativeWeight) { + return EntityType.byString(entry.first()).orElse(null); + } + } } } return null; diff --git a/src/main/java/com/atsuishio/superbwarfare/data/container/ContainerDataManager.java b/src/main/java/com/atsuishio/superbwarfare/data/container/ContainerDataManager.java index b48bb76b0..c3512e1eb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/data/container/ContainerDataManager.java +++ b/src/main/java/com/atsuishio/superbwarfare/data/container/ContainerDataManager.java @@ -4,6 +4,7 @@ import com.atsuishio.superbwarfare.Mod; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; @@ -22,7 +23,7 @@ public class ContainerDataManager extends SimpleJsonResourceReloadListener { private static final Gson GSON = new Gson(); private static final String DIRECTORY = "containers"; - private final Map> containerData = new HashMap<>(); + private final Map>> containerData = new HashMap<>(); public ContainerDataManager() { super(GSON, DIRECTORY); @@ -41,8 +42,18 @@ public class ContainerDataManager extends SimpleJsonResourceReloadListener { pObject.forEach((id, json) -> { try { JsonObject obj = json.getAsJsonObject(); - List list = new ArrayList<>(); - obj.getAsJsonArray("EntityTypes").forEach(e -> list.add(e.getAsString())); + List> list = new ArrayList<>(); + var array = obj.getAsJsonArray("List"); + for (var arr : array) { + if (arr.isJsonObject()) { + JsonObject obj2 = arr.getAsJsonObject(); + String type = obj2.get("Type").getAsString(); + int weight = obj2.get("Weight").getAsInt(); + list.add(Pair.of(type, weight)); + } else { + list.add(Pair.of(arr.getAsString(), 1)); + } + } containerData.put(id, list); } catch (Exception e) { Mod.LOGGER.error("Failed to load container data for {}", id); @@ -50,7 +61,7 @@ public class ContainerDataManager extends SimpleJsonResourceReloadListener { }); } - public Optional> getEntityTypes(ResourceLocation id) { + public Optional>> getEntityTypes(ResourceLocation id) { return Optional.ofNullable(containerData.get(id)); } } diff --git a/src/main/resources/data/superbwarfare/containers/aircraft.json b/src/main/resources/data/superbwarfare/containers/aircraft.json index dad9de76c..36a6452b3 100644 --- a/src/main/resources/data/superbwarfare/containers/aircraft.json +++ b/src/main/resources/data/superbwarfare/containers/aircraft.json @@ -1,7 +1,13 @@ { - "EntityTypes": [ - "superbwarfare:ah_6", - "superbwarfare:tom_6", + "List": [ + { + "Type": "superbwarfare:tom_6", + "Weight": 3 + }, + { + "Type": "superbwarfare:ah_6", + "Weight": 2 + }, "superbwarfare:a_10a" ] } \ No newline at end of file diff --git a/src/main/resources/data/superbwarfare/containers/controllable_turrets.json b/src/main/resources/data/superbwarfare/containers/controllable_turrets.json index 09443416e..df9906c02 100644 --- a/src/main/resources/data/superbwarfare/containers/controllable_turrets.json +++ b/src/main/resources/data/superbwarfare/containers/controllable_turrets.json @@ -1,9 +1,21 @@ { - "EntityTypes": [ - "superbwarfare:mk_42", - "superbwarfare:hpj_11", - "superbwarfare:mle_1934", - "superbwarfare:annihilator", - "superbwarfare:type_63" + "List": [ + { + "Type": "superbwarfare:type_63", + "Weight": 5 + }, + { + "Type": "superbwarfare:mk_42", + "Weight": 4 + }, + { + "Type": "superbwarfare:mle_1934", + "Weight": 3 + }, + { + "Type": "superbwarfare:hpj_11", + "Weight": 2 + }, + "superbwarfare:annihilator" ] } \ No newline at end of file diff --git a/src/main/resources/data/superbwarfare/containers/land_vehicles.json b/src/main/resources/data/superbwarfare/containers/land_vehicles.json index 5f969ff6d..35482b5f6 100644 --- a/src/main/resources/data/superbwarfare/containers/land_vehicles.json +++ b/src/main/resources/data/superbwarfare/containers/land_vehicles.json @@ -1,9 +1,21 @@ { - "EntityTypes": [ - "superbwarfare:wheel_chair", - "superbwarfare:lav_150", - "superbwarfare:bmp_2", - "superbwarfare:yx_100", - "superbwarfare:prism_tank" + "List": [ + { + "Type": "superbwarfare:lav_150", + "Weight": 5 + }, + { + "Type": "superbwarfare:bmp_2", + "Weight": 4 + }, + { + "Type": "superbwarfare:wheel_chair", + "Weight": 3 + }, + { + "Type": "superbwarfare:prism_tank", + "Weight": 2 + }, + "superbwarfare:yx_100" ] } \ No newline at end of file diff --git a/src/main/resources/data/superbwarfare/containers/mobile_vehicles.json b/src/main/resources/data/superbwarfare/containers/mobile_vehicles.json index 672504d10..9562ecaad 100644 --- a/src/main/resources/data/superbwarfare/containers/mobile_vehicles.json +++ b/src/main/resources/data/superbwarfare/containers/mobile_vehicles.json @@ -1,5 +1,5 @@ { - "EntityTypes": [ + "List": [ "superbwarfare:speedboat", "superbwarfare:wheel_chair", "superbwarfare:ah_6",