diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index db2d5270..3b3cea4d 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic; import java.io.File; import java.util.Map; +import WayofTime.bloodmagic.meteor.MeteorConfigHandler; import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -32,7 +33,6 @@ import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.registry.ModCompatibility; import WayofTime.bloodmagic.registry.ModEntities; import WayofTime.bloodmagic.registry.ModItems; -import WayofTime.bloodmagic.registry.ModMeteors; import WayofTime.bloodmagic.registry.ModPotions; import WayofTime.bloodmagic.registry.ModRecipes; import WayofTime.bloodmagic.registry.ModRituals; @@ -127,7 +127,7 @@ public class BloodMagic ModRecipes.init(); ModRituals.initRituals(); ModRituals.initImperfectRituals(); - ModMeteors.init(); + MeteorConfigHandler.init(new File(configDir, "meteors")); ModArmourTrackers.init(); ModCompatibility.loadCompat(ICompatibility.InitializationPhase.INIT); NetworkRegistry.INSTANCE.registerGuiHandler(BloodMagic.instance, new GuiHandler()); diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index ef635d9b..d3962c26 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -1,12 +1,13 @@ package WayofTime.bloodmagic; -import java.io.File; +import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import WayofTime.bloodmagic.meteor.MeteorConfigHandler; import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.util.ResourceLocation; @@ -20,7 +21,6 @@ import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.registry.ModMeteors; import WayofTime.bloodmagic.util.Utils; @Handler @@ -322,19 +322,6 @@ public class ConfigHandler category = "Meteors"; config.addCustomCategoryComment(category, "Meteor settings"); - String[] defaultMeteors = ModMeteors.getDefaultMeteors(); - boolean resyncMeteorOnVersionChange = config.getBoolean("resyncOnVersionChange", category, true, ""); - Property meteorsProp = config.get(category, "MeteorList", defaultMeteors); - meteorsProp.setComment("These are meteors. Huzzah!"); - if (resyncMeteorOnVersionChange && configVersionChanged) - { - meteorsProp.set(defaultMeteors); - ModMeteors.meteors = defaultMeteors; - } else - { - ModMeteors.meteors = meteorsProp.getStringList(); - } - config.save(); } @@ -385,7 +372,9 @@ public class ConfigHandler @SubscribeEvent public void onConfigChanged(ConfigChangedEvent event) { - if (event.getModID().equals(Constants.Mod.MODID)) - ConfigHandler.syncConfig(); + if (event.getModID().equals(Constants.Mod.MODID)) { + syncConfig(); + MeteorConfigHandler.handleMeteors(false); + } } } diff --git a/src/main/java/WayofTime/bloodmagic/gson/Adapters.java b/src/main/java/WayofTime/bloodmagic/gson/Adapters.java deleted file mode 100644 index bf250a83..00000000 --- a/src/main/java/WayofTime/bloodmagic/gson/Adapters.java +++ /dev/null @@ -1,6 +0,0 @@ -package WayofTime.bloodmagic.gson; - -public class Adapters -{ - public static EnumFacingTypeAdapter adapter = new EnumFacingTypeAdapter(); -} diff --git a/src/main/java/WayofTime/bloodmagic/gson/EnumFacingTypeAdapter.java b/src/main/java/WayofTime/bloodmagic/gson/EnumFacingTypeAdapter.java deleted file mode 100644 index 1201f458..00000000 --- a/src/main/java/WayofTime/bloodmagic/gson/EnumFacingTypeAdapter.java +++ /dev/null @@ -1,30 +0,0 @@ -package WayofTime.bloodmagic.gson; - -import java.lang.reflect.Type; - -import net.minecraft.util.EnumFacing; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -public class EnumFacingTypeAdapter implements JsonDeserializer, JsonSerializer -{ - @Override - public EnumFacing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException - { - String str = json.getAsString(); - - return EnumFacing.byName(str); - } - - @Override - public JsonElement serialize(EnumFacing src, Type typeOfSrc, JsonSerializationContext context) - { - // Not necessary, since this is only used for deserialization. - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java b/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java new file mode 100644 index 00000000..089ea4f1 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java @@ -0,0 +1,22 @@ +package WayofTime.bloodmagic.gson; + +import com.google.gson.*; + +import java.lang.reflect.Type; + +public abstract class SerializerBase implements JsonDeserializer, JsonSerializer +{ + @Override + public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException + { + return context.deserialize(json, getType()); + } + + @Override + public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) + { + return context.serialize(src); + } + + public abstract Class getType(); +} diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java new file mode 100644 index 00000000..6187895d --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java @@ -0,0 +1,83 @@ +package WayofTime.bloodmagic.gson; + +import com.google.gson.*; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.ForgeRegistries; + +import java.lang.reflect.Type; + +public class Serializers +{ + // Serializers + public static final SerializerBase FACING_SERIALIZER = new SerializerBase() + { + @Override + public Class getType() + { + return EnumFacing.class; + } + + @Override + public EnumFacing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException + { + return EnumFacing.byName(json.getAsString()); + } + }; + public static final SerializerBase RESOURCELOCATION_SERIALIZER = new SerializerBase() + { + @Override + public Class getType() + { + return ResourceLocation.class; + } + + @Override + public ResourceLocation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException + { + String domain = json.getAsJsonObject().get("domain").getAsString(); + String path = json.getAsJsonObject().get("path").getAsString(); + return new ResourceLocation(domain, path); + } + + @Override + public JsonElement serialize(ResourceLocation src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject object = new JsonObject(); + object.addProperty("domain", src.getResourceDomain()); + object.addProperty("path", src.getResourcePath()); + return object; + } + }; + public static final SerializerBase ITEMMETA_SERIALIZER = new SerializerBase() { + @Override + public Class getType() { + return ItemStack.class; + } + + @Override + public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + ResourceLocation registryName = context.deserialize(json.getAsJsonObject().get("registryName").getAsJsonObject(), ResourceLocation.class); + int meta = json.getAsJsonObject().get("meta").getAsInt(); + return new ItemStack(ForgeRegistries.ITEMS.getValue(registryName), 1, meta); + } + + @Override + public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject jsonObject = new JsonObject(); + jsonObject.add("registryName", context.serialize(src.getItem().getRegistryName())); + jsonObject.addProperty("meta", src.getItemDamage()); + return jsonObject; + } + }; + + public static final Gson GSON = new GsonBuilder() + .serializeNulls() + .setPrettyPrinting() + .disableHtmlEscaping() + .registerTypeAdapter(FACING_SERIALIZER.getType(), FACING_SERIALIZER) + .registerTypeAdapter(RESOURCELOCATION_SERIALIZER.getType(), RESOURCELOCATION_SERIALIZER) + .registerTypeAdapter(ITEMMETA_SERIALIZER.getType(), ITEMMETA_SERIALIZER) + .create(); +} diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java similarity index 55% rename from src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java rename to src/main/java/WayofTime/bloodmagic/meteor/Meteor.java index ff4b31a3..b4aa271b 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorHolder.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -1,61 +1,50 @@ package WayofTime.bloodmagic.meteor; -import java.util.ArrayList; import java.util.List; import java.util.Random; -import lombok.AllArgsConstructor; -import net.minecraft.block.Block; +import lombok.Getter; +import lombok.Setter; import net.minecraft.block.state.IBlockState; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.util.Utils; -@AllArgsConstructor -public class MeteorHolder +@Getter +public class Meteor { - public static Random rand = new Random(); - public ResourceLocation resourceKey; - public int metaKey = 0; - public List components = new ArrayList(); + private static final Random RAND = new Random(); - public float explosionStrength = 1; - public int radius = 1; + private final ItemStack catalystStack; + private final List components; + private final float explosionStrength; + private final int radius; + private final int maxWeight; - public int maxWeight = 1000; + @Setter + public int version; - public ItemStack getKeyStack(int meta) + public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius, int maxWeight) { - Item item = Utils.getItem(resourceKey); - if (item != null) - { - return new ItemStack(item, 1, meta); - } else - { - Block block = Utils.getBlock(resourceKey); - if (block != null) - { - return new ItemStack(block, 1, meta); - } - } - - return null; + this.catalystStack = catalystStack; + this.components = components; + this.explosionStrength = explosionStrength; + this.radius = radius; + this.maxWeight = maxWeight; } public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock) { world.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), explosionStrength, true, true); - for (int i = -radius; i <= radius; i++) + for (int i = -getRadius(); i <= getRadius(); i++) { - for (int j = -radius; j <= radius; j++) + for (int j = -getRadius(); j <= getRadius(); j++) { - for (int k = -radius; k <= radius; k++) + for (int k = -getRadius(); k <= getRadius(); k++) { - if (i * i + j * j + k * k > (radius + 0.5) * (radius + 0.5)) + if (i * i + j * j + k * k > (getRadius() + 0.5) * (getRadius() + 0.5)) { continue; } @@ -75,9 +64,9 @@ public class MeteorHolder public IBlockState getRandomOreFromComponents(IBlockState fillerBlock) { - int goal = rand.nextInt(maxWeight); + int goal = RAND.nextInt(getMaxWeight()); - for (MeteorComponent component : components) + for (MeteorComponent component : getComponents()) { goal -= component.getWeight(); if (goal < 0) diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java new file mode 100644 index 00000000..ca318832 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java @@ -0,0 +1,115 @@ +package WayofTime.bloodmagic.meteor; + +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.gson.Serializers; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.filefilter.FileFilterUtils; +import org.apache.commons.lang3.tuple.Pair; + +import java.io.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MeteorConfigHandler +{ + private static final Map DEFAULT_METEORS = new HashMap(); + + private static File meteorDir; + + public static void init(File meteorDirectory) + { + meteorDir = meteorDirectory; + handleMeteors(true); + } + + public static void handleMeteors(boolean checkNewVersion) + { + // Clear the meteors so that reloading in-game can be done + MeteorRegistry.meteorMap.clear(); + List> defaultMeteors = getDefaultMeteors(); + + try + { + // Create defaults if the folder doesn't exist + if (!meteorDir.exists() && meteorDir.mkdir()) + { + for (Pair meteor : defaultMeteors) + { + String json = Serializers.GSON.toJson(meteor.getRight()); + FileWriter writer = new FileWriter(new File(meteorDir, meteor.getLeft() + ".json")); + writer.write(json); + writer.close(); + } + } + + // Collect all meteors from the files + File[] meteorFiles = meteorDir.listFiles((FileFilter) FileFilterUtils.suffixFileFilter(".json")); + if (meteorFiles == null) + return; + + List> meteors = new ArrayList>(); + + // Filter names so we can compare to defaults + for (File meteorFile : meteorFiles) + { + Meteor meteor = Serializers.GSON.fromJson(new FileReader(meteorFile), Meteor.class); + meteors.add(Pair.of(FilenameUtils.removeExtension(meteorFile.getName()), meteor)); + } + + if (checkNewVersion && ConfigHandler.getConfig().getBoolean("resyncOnVersionChange", "Meteors", true, "Should the default meteors be regenerated if the mod has updated them")) + { + // Check defaults for new version + for (Pair meteor : meteors) + { + Meteor defaultMeteor = DEFAULT_METEORS.get(meteor.getLeft()); + if (defaultMeteor != null && defaultMeteor.version > meteor.getRight().version) + { + String json = Serializers.GSON.toJson(defaultMeteor); + File meteorFile = new File(meteorDir, meteor.getLeft() + ".json"); + new PrintWriter(meteorFile).close(); // Clear the file + FileWriter fileWriter = new FileWriter(meteorFile); + fileWriter.write(json); // Write the new contents + fileWriter.close(); + + meteors.set(meteors.indexOf(meteor), Pair.of(meteor.getLeft(), defaultMeteor)); + } + } + } + + // Finally, register all of our meteors + for (Pair meteor : meteors) + MeteorRegistry.registerMeteor(meteor.getRight().getCatalystStack(), meteor.getRight()); + } catch (Exception e) + { + e.printStackTrace(); + } + + ConfigHandler.getConfig().save(); + } + + private static List> getDefaultMeteors() + { + List> holders = new ArrayList>(); + + // Iron + List ironMeteorList = new ArrayList(); + ironMeteorList.add(new MeteorComponent(400, "oreIron")); + ironMeteorList.add(new MeteorComponent(200, "oreCopper")); + ironMeteorList.add(new MeteorComponent(140, "oreTin")); + ironMeteorList.add(new MeteorComponent(70, "oreSilver")); + ironMeteorList.add(new MeteorComponent(80, "oreLead")); + ironMeteorList.add(new MeteorComponent(30, "oreGold")); + ironMeteorList.add(new MeteorComponent(60, "oreLapis")); + ironMeteorList.add(new MeteorComponent(100, "oreRedstone")); + Meteor ironMeteor = new Meteor(new ItemStack(Blocks.IRON_BLOCK), ironMeteorList, 15, 5, 1000); + ironMeteor.setVersion(2); + holders.add(Pair.of("IronMeteor", ironMeteor)); + DEFAULT_METEORS.put("IronMeteor", ironMeteor); + + return holders; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index f39e3be5..5b580caa 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -6,17 +6,15 @@ import java.util.Map; import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.ItemStackWrapper; -import WayofTime.bloodmagic.util.Utils; public class MeteorRegistry { - public static Map meteorMap = new HashMap(); + public static Map meteorMap = new HashMap(); - public static void registerMeteor(ItemStack stack, MeteorHolder holder) + public static void registerMeteor(ItemStack stack, Meteor holder) { ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); if (wrapper != null) @@ -27,10 +25,7 @@ public class MeteorRegistry public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius, int maxWeight) { - ResourceLocation resource = Utils.getResourceForItem(stack); - - MeteorHolder holder = new MeteorHolder(resource, stack.getItemDamage(), componentList, explosionStrength, radius, maxWeight); - + Meteor holder = new Meteor(stack, componentList, explosionStrength, radius, maxWeight); registerMeteor(stack, holder); } @@ -40,7 +35,7 @@ public class MeteorRegistry return wrapper != null && meteorMap.containsKey(wrapper); } - public static MeteorHolder getMeteorForItem(ItemStack stack) + public static Meteor getMeteorForItem(ItemStack stack) { ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack); return wrapper != null ? meteorMap.get(wrapper) : null; @@ -48,7 +43,7 @@ public class MeteorRegistry public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock) { - MeteorHolder holder = getMeteorForItem(stack); + Meteor holder = getMeteorForItem(stack); if (holder != null) { holder.generateMeteor(world, pos, fillerBlock); diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModMeteors.java b/src/main/java/WayofTime/bloodmagic/registry/ModMeteors.java deleted file mode 100644 index 894337f5..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModMeteors.java +++ /dev/null @@ -1,89 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import WayofTime.bloodmagic.meteor.MeteorComponent; -import WayofTime.bloodmagic.meteor.MeteorHolder; -import WayofTime.bloodmagic.meteor.MeteorRegistry; -import WayofTime.bloodmagic.util.Utils; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class ModMeteors -{ - public static String[] meteors = new String[] {}; - - public static void init() - { - Gson gson = new GsonBuilder().create(); - - List properStrings = new ArrayList(); - String currentString = ""; - int leftParenths = 0; - int rightParenths = 0; - - for (String str : meteors) - { - currentString += str; - for (char c : str.toCharArray()) - { - if (c == '{') - { - leftParenths++; - } else if (c == '}') - { - rightParenths++; - } - } - - if (leftParenths == rightParenths) - { - properStrings.add(currentString); - currentString = ""; - leftParenths = 0; - rightParenths = 0; - } - } - - for (String properString : properStrings) - { - MeteorHolder holder = gson.fromJson(properString, MeteorHolder.class); - if (holder != null) - { - MeteorRegistry.registerMeteor(holder.getKeyStack(holder.metaKey), holder); - } - } - } - - public static String[] getDefaultMeteors() - { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - - List holders = new ArrayList(); - - List ironMeteorList = new ArrayList(); - ironMeteorList.add(new MeteorComponent(400, "oreIron")); - ironMeteorList.add(new MeteorComponent(200, "oreCopper")); - ironMeteorList.add(new MeteorComponent(140, "oreTin")); - ironMeteorList.add(new MeteorComponent(70, "oreSilver")); - ironMeteorList.add(new MeteorComponent(80, "oreLead")); - ironMeteorList.add(new MeteorComponent(30, "oreGold")); - ironMeteorList.add(new MeteorComponent(60, "oreLapis")); - ironMeteorList.add(new MeteorComponent(100, "oreRedstone")); - MeteorHolder ironMeteorHolder = new MeteorHolder(Utils.getResourceForItem(new ItemStack(Blocks.IRON_BLOCK)), 0, ironMeteorList, 15, 5, 1000); - - holders.add(ironMeteorHolder); - - String[] meteors = new String[holders.size()]; - for (int i = 0; i < holders.size(); i++) - { - meteors[i] = gson.toJson(holders.get(i), MeteorHolder.class); - } - - return meteors; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java index 35c40c15..199a4763 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java @@ -18,7 +18,7 @@ import net.minecraft.util.ResourceLocation; import org.apache.commons.io.IOUtils; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.gson.Adapters; +import WayofTime.bloodmagic.gson.Serializers; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -35,8 +35,7 @@ public class DungeonRoomLoader public static void saveSingleDungeon(DungeonRoom room) { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - String json = gson.toJson(room); + String json = Serializers.GSON.toJson(room); Writer writer; try @@ -55,17 +54,15 @@ public class DungeonRoomLoader public static void loadDungeons() { - Gson gson = new GsonBuilder().setPrettyPrinting().registerTypeAdapter(EnumFacing.class, Adapters.adapter).create(); - try { URL schematicURL = DungeonRoomLoader.class.getResource(resLocToResourcePath(new ResourceLocation("bloodmagic:Schematics"))); - List schematics = gson.fromJson(Resources.toString(schematicURL, Charsets.UTF_8), new TypeToken>(){}.getType()); + List schematics = Serializers.GSON.fromJson(Resources.toString(schematicURL, Charsets.UTF_8), new TypeToken>(){}.getType()); for (String schematicKey : schematics) { ResourceLocation schematic = new ResourceLocation(schematicKey); URL dungeonURL = DungeonRoomLoader.class.getResource(resLocToResourcePath(schematic)); - DungeonRoom dungeonRoom = gson.fromJson(Resources.toString(dungeonURL, Charsets.UTF_8), DungeonRoom.class); + DungeonRoom dungeonRoom = Serializers.GSON.fromJson(Resources.toString(dungeonURL, Charsets.UTF_8), DungeonRoom.class); DungeonRoomRegistry.registerDungeonRoom(dungeonRoom, Math.max(1, dungeonRoom.dungeonWeight)); } } catch (Exception e)