package mod.sin.armoury; import com.wurmonline.server.items.Materials; import mod.sin.lib.Prop; import org.gotti.wurmunlimited.modloader.interfaces.*; import java.util.HashMap; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; public class ArmouryModMain implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListener, ServerStartedListener { public static Logger logger = Logger.getLogger(ArmouryModMain.class.getName()); // Configuration options public static boolean enableNonPlayerCrits = true; // - Shield configuration -- // public static boolean enableShieldDamageEnchants = true; public static boolean enableShieldSpeedEnchants = true; // -- Weapon configuration -- // public static float minimumSwingTime = 3.0f; public static boolean raresReduceSwingTime = true; public static float rareSwingSpeedReduction = 0.2f; public static boolean fixSavedSwingTimer = true; public static boolean betterDualWield = true; // HIGHLY EXPERIMENTAL public static boolean enableWeaponMaterialChanges = true; public static boolean enableItemMaterialChanges = true; // Weapon variable changes public static HashMap weaponDamage = new HashMap<>(); public static HashMap weaponSpeed = new HashMap<>(); public static HashMap weaponCritChance = new HashMap<>(); public static HashMap weaponReach = new HashMap<>(); public static HashMap weaponWeightGroup = new HashMap<>(); public static HashMap weaponParryPercent = new HashMap<>(); public static HashMap weaponSkillPenalty = new HashMap<>(); public static byte parseMaterialType(String str){ byte mat = Materials.convertMaterialStringIntoByte(str); if(mat > 0){ return mat; } return Byte.parseByte(str); } @Override public void configure(Properties properties) { logger.info("Beginning configuration..."); Prop.properties = properties; // Initialization sequences MaterialTweaks.initializeMaterialMaps(); WeaponTweaks.initializeWeaponMaps(); // Base configuration options enableNonPlayerCrits = Prop.getBooleanProperty("enableNonPlayerCrits", enableNonPlayerCrits); /*if(enableArmourModifications){ ArmourTweaks.configure(); }*/ //adamantineMaterialMod = Float.parseFloat(properties.getProperty("adamantineMaterialMod", Float.toString(adamantineMaterialMod))); //glimmersteelMaterialMod = Float.parseFloat(properties.getProperty("glimmersteelMaterialMod", Float.toString(glimmersteelMaterialMod))); //seryllMaterialMod = Float.parseFloat(properties.getProperty("seryllMaterialMod", Float.toString(seryllMaterialMod))); // Shield configuration enableShieldDamageEnchants = Boolean.parseBoolean(properties.getProperty("enableShieldDamageEnchants", Boolean.toString(enableShieldDamageEnchants))); // Weapon configuration minimumSwingTime = Float.parseFloat(properties.getProperty("minimumSwingTime", Float.toString(minimumSwingTime))); raresReduceSwingTime = Boolean.parseBoolean(properties.getProperty("raresReduceSwingTime", Boolean.toString(raresReduceSwingTime))); rareSwingSpeedReduction = Float.parseFloat(properties.getProperty("rareSwingSpeedReduction", Float.toString(rareSwingSpeedReduction))); fixSavedSwingTimer = Boolean.parseBoolean(properties.getProperty("fixSavedSwingTimer", Boolean.toString(fixSavedSwingTimer))); betterDualWield = Boolean.parseBoolean(properties.getProperty("betterDualWield", Boolean.toString(betterDualWield))); enableWeaponMaterialChanges = Prop.getBooleanProperty("enableWeaponMaterialChanges", enableWeaponMaterialChanges); enableItemMaterialChanges = Prop.getBooleanProperty("enableItemMaterialChanges", enableItemMaterialChanges); for (String name : properties.stringPropertyNames()) { try { String value = properties.getProperty(name); switch (name) { case "debug": case "classname": case "classpath": case "sharedClassLoader": case "depend.import": case "depend.suggests": break; //ignore default: if (name.startsWith("materialWeaponDamage")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); double mult = Double.parseDouble(split[1]); WeaponTweaks.addMaterialWeaponDamage(material, mult); } else if (name.startsWith("materialWeaponSpeed")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float mult = Float.parseFloat(split[1]); WeaponTweaks.addMaterialWeaponSpeed(material, mult); } else if (name.startsWith("materialWeaponParry")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float mult = Float.parseFloat(split[1]); WeaponTweaks.addMaterialWeaponParry(material, mult); } else if (name.startsWith("materialWeaponArmourDamage")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); double mult = Double.parseDouble(split[1]); WeaponTweaks.addMaterialWeaponArmourDamage(material, mult); } else if (name.startsWith("materialDamageModifier")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float mult = Float.parseFloat(split[1]); MaterialTweaks.addMaterialDamageModifier(material, mult); } else if (name.startsWith("materialDecayModifier")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float mult = Float.parseFloat(split[1]); MaterialTweaks.addMaterialDecayModifier(material, mult); } else if (name.startsWith("materialCreationBonus")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float bonus = Float.parseFloat(split[1]); MaterialTweaks.addMaterialCreationBonus(material, bonus); } else if (name.startsWith("materialImproveBonus")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float bonus = Float.parseFloat(split[1]); MaterialTweaks.addMaterialImproveBonus(material, bonus); } else if (name.startsWith("materialShatterResistance")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float resistance = Float.parseFloat(split[1]); MaterialTweaks.addMaterialShatterResistance(material, resistance); } else if (name.startsWith("materialLockpickBonus")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float bonus = Float.parseFloat(split[1]); MaterialTweaks.addMaterialLockpickBonus(material, bonus); } else if (name.startsWith("materialAnchorBonus")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float bonus = Float.parseFloat(split[1]); MaterialTweaks.addMaterialAnchorBonus(material, bonus); } else if (name.startsWith("materialPendulumEffect")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float bonus = Float.parseFloat(split[1]); MaterialTweaks.addMaterialPendulumEffect(material, bonus); } else if (name.startsWith("materialRepairSpeed")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float mult = Float.parseFloat(split[1]); MaterialTweaks.addMaterialRepairSpeed(material, mult); } else if (name.startsWith("materialBashModifier")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); double mult = Double.parseDouble(split[1]); MaterialTweaks.addMaterialBashModifier(material, mult); } else if (name.startsWith("materialSpellEffectModifier")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); float mult = Float.parseFloat(split[1]); MaterialTweaks.addMaterialSpellEffectModifier(material, mult); } else if (name.startsWith("materialSpecificSpellEffectModifier")) { String[] split = value.split(";"); byte material = parseMaterialType(split[0]); String[] split2 = split[1].split(","); MaterialTweaks.addMaterialSpecificSpellEffectModifier(material, split2); } else if (name.startsWith("materialDifficultyModifier")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); double mult = Double.parseDouble(split[1]); MaterialTweaks.addMaterialDifficultyModifier(material, mult); } else if (name.startsWith("materialActionSpeedModifier")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); double mult = Double.parseDouble(split[1]); MaterialTweaks.addMaterialActionSpeedModifier(material, mult); } else if (name.startsWith("weaponDamage")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); float newVal = Float.parseFloat(split[1]); weaponDamage.put(weaponId, newVal); } else if (name.startsWith("weaponSpeed")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); float newVal = Float.parseFloat(split[1]); weaponSpeed.put(weaponId, newVal); } else if (name.startsWith("weaponCritChance")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); float newVal = Float.parseFloat(split[1]); weaponCritChance.put(weaponId, newVal); } else if (name.startsWith("weaponReach")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); int newVal = Integer.parseInt(split[1]); weaponReach.put(weaponId, newVal); } else if (name.startsWith("weaponWeightGroup")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); int newVal = Integer.parseInt(split[1]); weaponWeightGroup.put(weaponId, newVal); } else if (name.startsWith("weaponParryPercent")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); float newVal = Float.parseFloat(split[1]); weaponParryPercent.put(weaponId, newVal); } else if (name.startsWith("weaponSkillPenalty")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); double newVal = Double.parseDouble(split[1]); weaponSkillPenalty.put(weaponId, newVal); } else { logger.warning("Unknown config property: " + name); } } } catch (Exception e) { logger.severe("Error processing property " + name); e.printStackTrace(); } } // Print values of main.java.armoury.mod configuration logger.info(" -- Mod Configuration -- "); logger.log(Level.INFO, "enableNonPlayerCrits: " + enableNonPlayerCrits); logger.info(" -- Material Configuration -- "); logger.info("> Weapon Material Damage Settings <"); for(byte material : WeaponTweaks.materialWeaponDamage.keySet()){ logger.info(String.format("Damage modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), WeaponTweaks.materialWeaponDamage.get(material)*100f)); } logger.info("> Weapon Material Speed Settings <"); for(byte material : WeaponTweaks.materialWeaponSpeed.keySet()){ logger.info(String.format("Speed modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), WeaponTweaks.materialWeaponSpeed.get(material)*100f)); } logger.info("> Weapon Material Parry Settings <"); for(byte material : WeaponTweaks.materialWeaponParry.keySet()){ logger.info(String.format("Parry modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), WeaponTweaks.materialWeaponParry.get(material)*100f)); } logger.info("> Weapon Material Armour Damage Settings <"); for(byte material : WeaponTweaks.materialWeaponArmourDamage.keySet()){ logger.info(String.format("Armour Damage modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), WeaponTweaks.materialWeaponArmourDamage.get(material)*100f)); } logger.info("> Item Material Damage Modifier Settings <"); for(byte material : MaterialTweaks.materialDamageModifier.keySet()){ logger.info(String.format("Damage modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialDamageModifier.get(material)*100f)); } logger.info("> Item Material Decay Modifier Settings <"); for(byte material : MaterialTweaks.materialDecayModifier.keySet()){ logger.info(String.format("Decay modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialDecayModifier.get(material)*100f)); } logger.info("> Item Material Creation Bonus Settings <"); for(byte material : MaterialTweaks.materialCreationBonus.keySet()){ logger.info(String.format("Creation bonus for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialCreationBonus.get(material)*100f)); } logger.info("> Item Material Improve Bonus Settings <"); for(byte material : MaterialTweaks.materialImproveBonus.keySet()){ logger.info(String.format("Improve bonus for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialImproveBonus.get(material)*100f)); } logger.info("> Item Material Shatter Resistance Settings <"); for(byte material : MaterialTweaks.materialShatterResistance.keySet()){ logger.info(String.format("Shatter resistance for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialShatterResistance.get(material)*100f)); } logger.info("> Item Material Lockpick Bonus Settings <"); for(byte material : MaterialTweaks.materialLockpickBonus.keySet()){ logger.info(String.format("Lockpick bonus for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialLockpickBonus.get(material)*100f)); } logger.info("> Item Material Anchor Bonus Settings <"); for(byte material : MaterialTweaks.materialAnchorBonus.keySet()){ logger.info(String.format("Anchor bonus for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialAnchorBonus.get(material)*100f)); } logger.info("> Item Material Pendulum Effect Settings <"); for(byte material : MaterialTweaks.materialPendulumEffect.keySet()){ logger.info(String.format("Pendulum effect for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialPendulumEffect.get(material)*100f)); } logger.info("> Item Material Repair Speed Settings <"); for(byte material : MaterialTweaks.materialRepairSpeed.keySet()){ logger.info(String.format("Repair speed for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialRepairSpeed.get(material)*100f)); } logger.info("> Item Material Bash Modifier Settings <"); for(byte material : MaterialTweaks.materialBashModifier.keySet()){ logger.info(String.format("Bash modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialBashModifier.get(material)*100f)); } logger.info("> Item Material Spell Effect Modifier Settings <"); for(byte material : MaterialTweaks.materialSpellEffectModifier.keySet()){ logger.info(String.format("Spell effect modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialSpellEffectModifier.get(material)*100f)); } logger.info("> Item Material Specific Spell Effect Modifier Settings <"); for(byte material : MaterialTweaks.materialSpecificSpellEffectModifier.keySet()){ //String name = materialNameReference.containsKey(material) ? materialNameReference.get(material) : String.valueOf(material); HashMap enchantMap = MaterialTweaks.materialSpecificSpellEffectModifier.get(material); for(byte enchant : enchantMap.keySet()){ logger.info(String.format("Spell Effect Power for material %s with enchant %s: %.2f%%", MaterialTweaks.getMaterialName(material), enchant, enchantMap.get(enchant)*100f)); } } logger.info("> Item Material Difficulty Modifier Settings <"); for(byte material : MaterialTweaks.materialDifficultyModifier.keySet()){ logger.info(String.format("Difficulty modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialDifficultyModifier.get(material)*100f)); } logger.info("> Item Material Action Speed Modifier Settings <"); for(byte material : MaterialTweaks.materialActionSpeedModifier.keySet()){ logger.info(String.format("Action Speed modifier for material %s: %.2f%%", MaterialTweaks.getMaterialName(material), MaterialTweaks.materialActionSpeedModifier.get(material)*100f)); } logger.info(" -- Shield Configuration -- "); logger.log(Level.INFO, "enableShieldDamageEnchants: " + enableShieldDamageEnchants); logger.info(" -- Weapon Configuration -- "); logger.log(Level.INFO, "minimumSwingTime: " + minimumSwingTime); logger.log(Level.INFO, "raresReduceSwingTime: " + raresReduceSwingTime); logger.log(Level.INFO, "rareSwingSpeedReduction: " + rareSwingSpeedReduction); logger.log(Level.INFO, "fixSavedSwingTimer: " + fixSavedSwingTimer); logger.log(Level.INFO, "betterDualWield: " + betterDualWield); logger.info(" -- Configuration complete -- "); } @Override public void preInit(){ CombatTweaks.preInit(); ShieldTweaks.preInit(); WeaponTweaks.preInit(); MaterialTweaks.preInit(); } @Override public void onItemTemplatesCreated(){ logger.info("Beginning onItemTemplatesCreated..."); } @Override public void onServerStarted(){ WeaponTweaks.onServerStarted(); } }