diff --git a/build.gradle b/build.gradle index b635bc6..303cd86 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,18 @@ apply plugin: 'java' group "mod.sin" -version "3.0" +version "4.0" repositories { mavenCentral() - maven { url "http://gotti.no-ip.org/maven/repository" } + mavenLocal() + maven { url "https://dl.bdew.net/agorepo/" } maven { url 'https://jitpack.io' } } dependencies { - compile 'org.gotti.wurmunlimited:server-modlauncher:0.39-beta1' - compile 'com.github.Sindusk:sindusklibrary:v1.7' + compile 'org.gotti.wurmunlimited:server-modlauncher:0.40' + compile 'com.github.Sindusk:sindusklibrary:v2.1' } jar { diff --git a/mods/Armoury.properties b/mods/Armoury.properties index eee43e9..6565fe4 100644 --- a/mods/Armoury.properties +++ b/mods/Armoury.properties @@ -4,14 +4,70 @@ depend.import=SinduskLibrary depend.suggests=ServerTweaks sharedClassLoader=true -# -- Mod configuration section -- # -#enableNonPlayerCrits: Allows critical strikes against non-player characters. In vanilla Wurm, creatures can only deal critical strikes against players. -# Note: this will allow creatures to crit creatures as well, so tamed/charmed/dominated creatures can also be critically hit by aggressive mobs. -enableNonPlayerCrits=true +# -- Armour configuration section -- # +#enableArmourReductionModifications: Enable to enable the whole armour configuration section and material configuration section. +# Disabling this will eliminate almost everything that Armoury does to armour. +enableArmourModifications=true -# > Custom Item ID Overrides < # -#These are used to override the damage reduction calculation per item ID. -# If you want to add challenge helms, masks, and similar here, you are welcome to do so and have their DR work. +#Armour types: +# Leather = 1 ; Studded = 2 ; Chain = 3 ; Plate = 4 ; *Ring = 5 +# Cloth = 6 ; *Scale = 7 ; *Splint = 8 ; Drake = 9 ; Dragonscale = 10 +# Note: Types marked with * do not have an in-game armour associated with them. +# These values can be useful for the creation of custom armours, though. + +#armourDamageReduction: Adjust the base DR of certain armour types +# Syntax: armourDamageReduction-##:material,reduction +# Example: armourDamageReduction-1:cloth,0.40 +# The example sets cloth (6) armour to have 40% damage reduction at 100QL. +# Quality scales the damage reduction +#Default configuration: +armourDamageReduction-6:cloth,0.40 +armourDamageReduction-1:leather,0.60 +armourDamageReduction-2:studded,0.625 +armourDamageReduction-3:chain,0.625 +armourDamageReduction-4:plate,0.65 +armourDamageReduction-9:drake,0.65 +armourDamageReduction-10:dragonscale,0.70 + +# Unused armour types +armourDamageReduction-5:5,0.55 +armourDamageReduction-7:7,0.50 +armourDamageReduction-8:8,0.60 + +# > Armour Effectiveness < # +#armourEffectiveness: Adjust the effectiveness of an armour type against a wound type. +# Wound Types: +# Crush = 0 ; Slash = 1 ; Pierce = 2 ; Bite = 3 ; Burn = 4 ; Poison = 5 +# Infection = 6 ; Water = 7 ; Cold = 8 ; Internal = 9 ; Acid = 10 +# Syntax: armourEffectiveness-##:armourtype;woundtype,effectiveness +# Example: armourEffectiveness-1:9;8,1.05 +# The example sets drake (9) armour to have 105% effectiveness (+5% more DR) against cold (8) +# Alternative to wound types, you can also use the keys "physical" "elemental" and "other" +# Physical: Crush (0), Slash (1), Pierce (2), Bite (3) +# Elemental: Burn (4), Cold (8), Acid (10) +# Other: Poison (5), Infection (6), Water (7), Internal (9) +armourEffectiveness-1:cloth;bite,0.90 + +#> Armour Glance Rates < # +#armourGlanceRate: Adjust the glance rate of an armour type against a wound type. +# Syntax identical to effectiveness settings. +armourGlanceRate-1:leather;bite,0.30 + +# -- Item Material Configuration -- # +#enableItemMaterialChanges: Enables or disables the whole item material configuration section. +enableItemMaterialChanges=true + +#> Damage Reduction +# Additive damage reduction if the armour is created from this material. This is very specifically what it says after the item. +# Example: "chain jacket, iron" would use the iron modifier (11). Even if the armour type is different, the material is still used. +# Example 2: "dragonscale jacket, glimmersteel" would use the dragonscale base armour value and add the glimmersteel property below. +#materialDamageReduction: Additional percentage of damage reduction from material. +# For example, adamantine by default gives 0.05, meaning 5% damage reduction on top the 70% that plate gives. +# Adamantine plate would give 75% damage reduction at 100QL with this setting. +# Note that if no value is set, the default wurm values will be used. +# If you want to remove the DR penalty for lead armour, you'll have to use materialDamageReduction-##:12,0.00 +# Ensure that each property has it's own unique identifier number and none of them clash. +materialDamageReduction-1:adamantine,0.05 #materialGlanceRate: Adjust the glance rate of an armour against a certain wound type if created from a specified material. # This is a multiplier on the base glance rate. @@ -41,10 +97,6 @@ materialWeaponParry-1:glimmersteel,0.95 # Lower values cause less damage, higher values cause more damage. 1.10 = 10% more damage to the armour. 0.90 = 10% less damage to the armour. materialWeaponArmourDamage-1:adamantine,1.05 -# -- Item Material Configuration -- # -#enableItemMaterialChanges: Enables or disables the whole item material configuration section. -enableItemMaterialChanges=true - #materialDamageModifier: Adjust how much damage the item takes when receiving non-decay damage (when used). # This is a multiplier on how much damage the item takes. # Lower values reduce damage taken, higher values increase damage taken. 1.10 = 10% more damage taken. 0.90 = 10% less damage taken. diff --git a/src/main/java/mod/sin/armoury/ArmourTemplateTweaks.java b/src/main/java/mod/sin/armoury/ArmourTemplateTweaks.java new file mode 100644 index 0000000..fd84bb9 --- /dev/null +++ b/src/main/java/mod/sin/armoury/ArmourTemplateTweaks.java @@ -0,0 +1,125 @@ +package mod.sin.armoury; + +import com.wurmonline.server.combat.ArmourTemplate; +import com.wurmonline.server.items.ItemTemplate; +import com.wurmonline.server.items.ItemTemplateFactory; +import mod.sin.lib.ArmourAssist; +import mod.sin.lib.WoundAssist; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.logging.Logger; + +public class ArmourTemplateTweaks { + public static Logger logger = Logger.getLogger(ArmourTemplateTweaks.class.getName()); + + // Maps for variable changes to armour + public static HashMap armourDamageReduction = new HashMap<>(); + public static HashMap> armourEffectiveness = new HashMap<>(); + public static HashMap> armourGlanceRates = new HashMap<>(); + public static HashMap armourMovement = new HashMap<>(); + + protected static ArrayList getWoundTypes(String[] split){ + ArrayList woundTypes = new ArrayList<>(); + int i = 0; + while(i < split.length-1){ + if(split[i].equalsIgnoreCase("all")){ + byte x = 0; + while(x <= 10){ + woundTypes.add(x); + x++; + } + }else if(split[i].equalsIgnoreCase("physical")){ + woundTypes.add((byte) 0); // Crush + woundTypes.add((byte) 1); // Slash + woundTypes.add((byte) 2); // Pierce + woundTypes.add((byte) 3); // Bite + }else if(split[i].equalsIgnoreCase("elemental")){ + woundTypes.add((byte) 4); // Burn + woundTypes.add((byte) 8); // Cold + woundTypes.add((byte) 10); // Acid + }else if(split[i].equalsIgnoreCase("other")){ + woundTypes.add((byte) 5); // Poison + woundTypes.add((byte) 6); // Infection + woundTypes.add((byte) 7); // Water + woundTypes.add((byte) 9); // Internal + }else{ + woundTypes.add(WoundAssist.getWoundType(split[i])); + } + i++; + } + return woundTypes; + } + + public static void addArmourDamageReduction(byte armourType, float reduction){ + armourDamageReduction.put(armourType, reduction); + } + + public static void addArmourEffectiveness(byte armourType, String[] split){ + float reduction = Float.parseFloat(split[split.length-1]); + ArrayList woundTypes = getWoundTypes(split); + for(byte woundType : woundTypes) { + HashMap map; + if (armourEffectiveness.containsKey(armourType)) { + map = armourEffectiveness.get(armourType); + } else { + map = new HashMap<>(); + } + map.put(woundType, reduction); + armourEffectiveness.put(armourType, map); + } + } + + public static void addArmourGlanceRate(byte armourType, String[] split){ + float glance = Float.parseFloat(split[split.length-1]); + ArrayList woundTypes = getWoundTypes(split); + for(byte woundType : woundTypes) { + HashMap map; + if (armourGlanceRates.containsKey(armourType)) { + map = armourGlanceRates.get(armourType); + } else { + map = new HashMap<>(); + } + map.put(woundType, glance); + armourGlanceRates.put(armourType, map); + } + } + + public static void addArmourMovement(String itemTemplateName, float movementPenalty){ + armourMovement.put(itemTemplateName, movementPenalty); + } + + public static void onServerStarted(){ + if (ArmouryModMain.enableArmourModifications){ + for (byte atype : armourDamageReduction.keySet()){ + ArmourTemplate.ArmourType armourType = ArmourAssist.getArmourType(atype); + armourType.setBaseDR(armourDamageReduction.get(atype)); + } + for (byte atype : armourEffectiveness.keySet()){ + ArmourTemplate.ArmourType armourType = ArmourAssist.getArmourType(atype); + HashMap woundMap = armourEffectiveness.get(atype); + for (byte woundType : woundMap.keySet()){ + armourType.setEffectiveness(woundType, woundMap.get(woundType)); + } + } + for (byte atype : armourGlanceRates.keySet()){ + ArmourTemplate.ArmourType armourType = ArmourAssist.getArmourType(atype); + HashMap woundMap = armourGlanceRates.get(atype); + for (byte woundType : woundMap.keySet()){ + armourType.setGlanceRate(woundType, woundMap.get(woundType)); + } + } + for (String armourName : armourMovement.keySet()){ + // Get the ItemTemplate instance for the armour name + ItemTemplate template = ItemTemplateFactory.getInstance().getTemplate(armourName); + if (template == null){ + logger.warning(String.format("Could not find a valid template for armour %s to adjust movement penalty. Skipping...", armourName)); + continue; + } + // Obtain the ArmourTemplate instance based on the ItemTemplate + ArmourTemplate armourTemplate = ArmourTemplate.getArmourTemplate(template.getTemplateId()); + armourTemplate.setMoveModifier(armourMovement.get(armourName)); // Set the new movement speed. + } + } + } +} diff --git a/src/main/java/mod/sin/armoury/ArmouryModMain.java b/src/main/java/mod/sin/armoury/ArmouryModMain.java index 37b36be..6645b21 100644 --- a/src/main/java/mod/sin/armoury/ArmouryModMain.java +++ b/src/main/java/mod/sin/armoury/ArmouryModMain.java @@ -1,7 +1,9 @@ package mod.sin.armoury; import com.wurmonline.server.items.Materials; +import mod.sin.lib.ArmourAssist; import mod.sin.lib.Prop; +import mod.sin.lib.WoundAssist; import org.gotti.wurmunlimited.modloader.interfaces.*; import java.util.HashMap; @@ -13,19 +15,19 @@ 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; + // - Armour Configuration - // + public static boolean enableArmourModifications = true; - // - Shield configuration -- // + // - Shield Configuration -- // public static boolean enableShieldDamageEnchants = true; public static boolean enableShieldSpeedEnchants = true; - // -- Weapon configuration -- // + // -- 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 betterDualWield = false; // HIGHLY EXPERIMENTAL public static boolean enableWeaponMaterialChanges = true; public static boolean enableItemMaterialChanges = true; // Weapon variable changes @@ -37,6 +39,9 @@ implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListene public static HashMap weaponParryPercent = new HashMap<>(); public static HashMap weaponSkillPenalty = new HashMap<>(); + public static byte parseArmourType(String str){ + return (byte) ArmourAssist.getArmourByte(str); + } public static byte parseMaterialType(String str){ byte mat = Materials.convertMaterialStringIntoByte(str); if(mat > 0){ @@ -51,25 +56,20 @@ implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListene Prop.properties = properties; // Initialization sequences - MaterialTweaks.initializeMaterialMaps(); - WeaponTweaks.initializeWeaponMaps(); + MaterialsTweaks.initializeMaterialMaps(); + WeaponsTweaks.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 + // Armour Configuration + enableArmourModifications = Prop.getBooleanProperty("enableArmourModifications", enableArmourModifications); + // Shield Configuration enableShieldDamageEnchants = Boolean.parseBoolean(properties.getProperty("enableShieldDamageEnchants", Boolean.toString(enableShieldDamageEnchants))); - // Weapon configuration + // 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()) { @@ -83,97 +83,132 @@ implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListene case "depend.import": case "depend.suggests": break; //ignore + case "minimumSwingTime": + case "rareSwingSpeedReduction": + case "fixedSavedSwingTimer": + case "betterDualWield": + break; // ignore properties that are already configured default: - if (name.startsWith("materialWeaponDamage")) { + if (name.startsWith("armourDamageReduction")) { + String[] split = value.split(","); + byte armourType = parseArmourType(split[0]); + float reduction = Float.parseFloat(split[1]); + ArmourTemplateTweaks.addArmourDamageReduction(armourType, reduction); + } else if (name.startsWith("armourEffectiveness")) { + String[] split = value.split(";"); + byte armourType = parseArmourType(split[0]); + String[] split2 = split[1].split(","); + ArmourTemplateTweaks.addArmourEffectiveness(armourType, split2); + } else if (name.startsWith("armourGlanceRate")) { + String[] split = value.split(";"); + byte armourType = parseArmourType(split[0]); + String[] split2 = split[1].split(","); + ArmourTemplateTweaks.addArmourGlanceRate(armourType, split2); + } else if (name.startsWith("armourMovement")) { + String[] split = value.split(","); + String itemTemplate = split[0]; + float movementPenalty = Float.parseFloat(split[1]); + ArmourTemplateTweaks.addArmourMovement(itemTemplate, movementPenalty); + } else if (name.startsWith("materialDamageReduction")) { + String[] split = value.split(","); + byte material = parseMaterialType(split[0]); + float reduction = Float.parseFloat(split[1]); + MaterialsTweaks.addMaterialDamageReduction(material, reduction); + } else if (name.startsWith("materialMovementModifier")) { + String[] split = value.split(","); + byte material = parseMaterialType(split[0]); + float modifier = Float.parseFloat(split[1]); + MaterialsTweaks.addMaterialMovementModifier(material, modifier); + } else if (name.startsWith("materialWeaponDamage")) { String[] split = value.split(","); byte material = parseMaterialType(split[0]); double mult = Double.parseDouble(split[1]); - WeaponTweaks.addMaterialWeaponDamage(material, mult); + WeaponsTweaks.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); + WeaponsTweaks.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); + WeaponsTweaks.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); + WeaponsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.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); + MaterialsTweaks.addMaterialActionSpeedModifier(material, mult); } else if (name.startsWith("weaponDamage")) { String[] split = value.split(","); int weaponId = Integer.parseInt(split[0]); @@ -218,85 +253,117 @@ implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListene e.printStackTrace(); } } - // Print values of main.java.armoury.mod configuration - logger.info(" -- Mod Configuration -- "); - logger.log(Level.INFO, "enableNonPlayerCrits: " + enableNonPlayerCrits); + // Print configuration values + logger.info(" -- Armour Configuration -- "); + logger.info("enableArmourModifications: " + enableArmourModifications); + logger.info("> Armour Damage Reduction Settings <"); + for(byte armourType : ArmourTemplateTweaks.armourDamageReduction.keySet()){ + logger.info(String.format("Damage reduction for armour %s: %.2f%%", ArmourAssist.getArmourName(armourType), ArmourTemplateTweaks.armourDamageReduction.get(armourType)*100f)); + } + logger.info("> Armour Effectiveness Settings <"); + for(byte armourType : ArmourTemplateTweaks.armourEffectiveness.keySet()){ + HashMap woundMap = ArmourTemplateTweaks.armourEffectiveness.get(armourType); + for(byte woundType : woundMap.keySet()){ + String wound = WoundAssist.getWoundName(woundType); + logger.info(String.format("Effectiveness for armour %s against %s: %.2f%%", ArmourAssist.getArmourName(armourType), wound, woundMap.get(woundType)*100f)); + } + } + logger.info("> Armour Glance Rate Settings <"); + for(byte armourType : ArmourTemplateTweaks.armourGlanceRates.keySet()){ + HashMap woundMap = ArmourTemplateTweaks.armourGlanceRates.get(armourType); + for(byte woundType : woundMap.keySet()){ + String wound = WoundAssist.getWoundName(woundType); + logger.info(String.format("Glance rate for armour %s against %s: %.2f%%", ArmourAssist.getArmourName(armourType), wound, woundMap.get(woundType)*100f)); + } + } + logger.info("> Armour Movement Rate Changes <"); + for(String armourName : ArmourTemplateTweaks.armourMovement.keySet()){ + logger.info(String.format("Movement penalty for armour %s changed to %.2f%%", armourName, ArmourTemplateTweaks.armourMovement.get(armourName)*100f)); + } logger.info(" -- Material Configuration -- "); + logger.info("> Armour Material Damage Reduction Settings <"); + for(byte material : MaterialsTweaks.materialDamageReduction.keySet()){ + logger.info(String.format("Base DR modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.materialDamageReduction.get(material)*100f)); + } + logger.info("> Armour Material Movement Modifier Settings <"); + for(byte material : MaterialsTweaks.materialMovementModifier.keySet()){ + logger.info(String.format("Movement Speed modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.materialMovementModifier.get(material)*100f)); + } 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)); + for(byte material : WeaponsTweaks.materialWeaponDamage.keySet()){ + logger.info(String.format("Damage modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), WeaponsTweaks.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)); + for(byte material : WeaponsTweaks.materialWeaponSpeed.keySet()){ + logger.info(String.format("Speed modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), WeaponsTweaks.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)); + for(byte material : WeaponsTweaks.materialWeaponParry.keySet()){ + logger.info(String.format("Parry modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), WeaponsTweaks.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)); + for(byte material : WeaponsTweaks.materialWeaponArmourDamage.keySet()){ + logger.info(String.format("Armour Damage modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), WeaponsTweaks.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)); + for(byte material : MaterialsTweaks.materialDamageModifier.keySet()){ + logger.info(String.format("Damage modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialDecayModifier.keySet()){ + logger.info(String.format("Decay modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialCreationBonus.keySet()){ + logger.info(String.format("Creation bonus for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialImproveBonus.keySet()){ + logger.info(String.format("Improve bonus for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialShatterResistance.keySet()){ + logger.info(String.format("Shatter resistance for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialLockpickBonus.keySet()){ + logger.info(String.format("Lockpick bonus for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialAnchorBonus.keySet()){ + logger.info(String.format("Anchor bonus for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialPendulumEffect.keySet()){ + logger.info(String.format("Pendulum effect for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialRepairSpeed.keySet()){ + logger.info(String.format("Repair speed for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialBashModifier.keySet()){ + logger.info(String.format("Bash modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialSpellEffectModifier.keySet()){ + logger.info(String.format("Spell effect modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.materialSpellEffectModifier.get(material)*100f)); } logger.info("> Item Material Specific Spell Effect Modifier Settings <"); - for(byte material : MaterialTweaks.materialSpecificSpellEffectModifier.keySet()){ + for(byte material : MaterialsTweaks.materialSpecificSpellEffectModifier.keySet()){ //String name = materialNameReference.containsKey(material) ? materialNameReference.get(material) : String.valueOf(material); - HashMap enchantMap = MaterialTweaks.materialSpecificSpellEffectModifier.get(material); + HashMap enchantMap = MaterialsTweaks.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(String.format("Spell Effect Power for material %s with enchant %s: %.2f%%", MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialDifficultyModifier.keySet()){ + logger.info(String.format("Difficulty modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.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)); + for(byte material : MaterialsTweaks.materialActionSpeedModifier.keySet()){ + logger.info(String.format("Action Speed modifier for material %s: %.2f%%", MaterialsTweaks.getMaterialName(material), MaterialsTweaks.materialActionSpeedModifier.get(material)*100f)); } logger.info(" -- Shield Configuration -- "); logger.log(Level.INFO, "enableShieldDamageEnchants: " + enableShieldDamageEnchants); @@ -311,10 +378,10 @@ implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListene @Override public void preInit(){ - CombatTweaks.preInit(); - ShieldTweaks.preInit(); - WeaponTweaks.preInit(); - MaterialTweaks.preInit(); + CombatsTweaks.preInit(); + ShieldsTweaks.preInit(); + WeaponsTweaks.preInit(); + MaterialsTweaks.preInit(); } @Override @@ -324,6 +391,7 @@ implements WurmServerMod, Configurable, PreInitable, ItemTemplatesCreatedListene @Override public void onServerStarted(){ - WeaponTweaks.onServerStarted(); + WeaponsTweaks.onServerStarted(); + ArmourTemplateTweaks.onServerStarted(); } } diff --git a/src/main/java/mod/sin/armoury/CombatTweaks.java b/src/main/java/mod/sin/armoury/CombatsTweaks.java similarity index 91% rename from src/main/java/mod/sin/armoury/CombatTweaks.java rename to src/main/java/mod/sin/armoury/CombatsTweaks.java index 425992b..a90d529 100644 --- a/src/main/java/mod/sin/armoury/CombatTweaks.java +++ b/src/main/java/mod/sin/armoury/CombatsTweaks.java @@ -10,7 +10,7 @@ import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; -public class CombatTweaks { +public class CombatsTweaks { public static Item handleDualWieldAttack(CombatHandler handler, Creature opponent, float delta){ try { Creature performer = ReflectionUtil.getPrivateField(handler, ReflectionUtil.getField(handler.getClass(), "creature")); @@ -33,9 +33,10 @@ public class CombatTweaks { public static void preInit(){ try { ClassPool classPool = HookManager.getInstance().getClassPool(); - Class thisClass = CombatTweaks.class; + Class thisClass = CombatsTweaks.class; // - Allow critical hits on creatures as well as players - + /* [3.1] Disabled - No longer working properly. ArmouryModMain.enableNonPlayerCrits = false; // Disabled for now as it's not working. if(ArmouryModMain.enableNonPlayerCrits){ CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); @@ -47,14 +48,7 @@ public class CombatTweaks { String desc = Descriptor.ofMethod(CtPrimitiveType.booleanType, attackParams1); Util.setReason("Enable player critical strikes on creatures."); Util.instrumentDescribed(thisClass, ctCombatHandler, "attack", desc, "isPlayer", "$_ = true"); - /*ctCombatHandler.getMethod("attack", Descriptor.ofMethod(CtPrimitiveType.booleanType, attackParams1)).instrument(new ExprEditor(){ - public void edit(MethodCall m) throws CannotCompileException { - if (m.getMethodName().equals("isPlayer")) { - m.replace("$_ = true;"); - return; - } - } - });*/ + CtClass[] attackParams2 = { classPool.get("com.wurmonline.server.creatures.Creature"), classPool.get("com.wurmonline.server.creatures.AttackAction") @@ -62,15 +56,7 @@ public class CombatTweaks { desc = Descriptor.ofMethod(CtPrimitiveType.booleanType, attackParams2); Util.setReason("Enable player critical strikes on creatures."); Util.instrumentDescribed(thisClass, ctCombatHandler, "attack", desc, "isPlayer", "$_ = true"); - /*ctCombatHandler.getMethod("attack", Descriptor.ofMethod(CtPrimitiveType.booleanType, attackParams2)).instrument(new ExprEditor(){ - public void edit(MethodCall m) throws CannotCompileException { - if (m.getMethodName().equals("isPlayer")) { - m.replace("$_ = true;"); - return; - } - } - });*/ - } + }*/ // - Change the minimum swing timer - // if(ArmouryModMain.minimumSwingTime != 3.0f){ @@ -143,7 +129,7 @@ public class CombatTweaks { }; String desc = Descriptor.ofMethod(CtClass.booleanType, params1); String replace = "if(this.creature.isPlayer()){" - + " com.wurmonline.server.items.Item weapon = "+CombatTweaks.class.getName()+".handleDualWieldAttack(this, opponent, delta);" + + " com.wurmonline.server.items.Item weapon = "+CombatsTweaks.class.getName()+".handleDualWieldAttack(this, opponent, delta);" + " if(weapon != null){" + " lDead = attack(opponent, weapon, true);" + " }" @@ -155,7 +141,7 @@ public class CombatTweaks { public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("getSecondaryWeapons")) { m.replace("if(this.creature.isPlayer()){" - + " com.wurmonline.server.items.Item weapon = CombatTweaks.handleDualWieldAttack(this, opponent, delta);" + + " com.wurmonline.server.items.Item weapon = CombatsTweaks.handleDualWieldAttack(this, opponent, delta);" + " if(weapon != null){" + " lDead = attack(opponent, weapon, true);" + " }" diff --git a/src/main/java/mod/sin/armoury/MaterialTweaks.java b/src/main/java/mod/sin/armoury/MaterialsTweaks.java similarity index 78% rename from src/main/java/mod/sin/armoury/MaterialTweaks.java rename to src/main/java/mod/sin/armoury/MaterialsTweaks.java index 64abb80..940e399 100644 --- a/src/main/java/mod/sin/armoury/MaterialTweaks.java +++ b/src/main/java/mod/sin/armoury/MaterialsTweaks.java @@ -16,9 +16,12 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.logging.Logger; -public class MaterialTweaks { - public static Logger logger = Logger.getLogger(MaterialTweaks.class.getName()); +public class MaterialsTweaks { + public static Logger logger = Logger.getLogger(MaterialsTweaks.class.getName()); + // Material Modifier Maps + public static HashMap materialDamageReduction = new HashMap<>(); + public static HashMap materialMovementModifier = new HashMap<>(); public static HashMap materialDamageModifier = new HashMap<>(); public static HashMap materialDecayModifier = new HashMap<>(); public static HashMap materialCreationBonus = new HashMap<>(); @@ -34,10 +37,26 @@ public class MaterialTweaks { public static HashMap materialDifficultyModifier = new HashMap<>(); public static HashMap materialActionSpeedModifier = new HashMap<>(); + public static float newGetMaterialDamageReduction(byte material){ + if(materialDamageReduction.containsKey(material)){ + //logger.info(String.format("Modifying damage by %.2f%% due to material type %s.", materialDamageModifier.get(material)*100d, MaterialsTweaks.getMaterialName(material))); + return materialDamageReduction.get(material); + } + return 0.0f; + } + + public static float newGetMaterialMovementModifier(byte armourMaterial){ + if(materialMovementModifier.containsKey(armourMaterial)){ + //logger.info(String.format("Adjusting movement speed to %.2f%% because of material %s", materialMovementModifier.get(armourMaterial)*100f, armourMaterial)); + return materialMovementModifier.get(armourMaterial); + } + return 1.0f; + } + public static float newGetMaterialDamageModifier(Item item){ byte material = item.getMaterial(); if(materialDamageModifier.containsKey(material)){ - //logger.info(String.format("Modifying damage by %.2f%% due to material type %s.", materialDamageModifier.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying damage by %.2f%% due to material type %s.", materialDamageModifier.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialDamageModifier.get(material); } return 1.0f; @@ -46,7 +65,7 @@ public class MaterialTweaks { public static float newGetMaterialDecayModifier(Item item){ byte material = item.getMaterial(); if(materialDecayModifier.containsKey(material)){ - //logger.info(String.format("Modifying decay by %.2f%% due to material type %s.", materialDecayModifier.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying decay by %.2f%% due to material type %s.", materialDecayModifier.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialDecayModifier.get(material); } return 1.0f; @@ -54,7 +73,7 @@ public class MaterialTweaks { public static float newGetMaterialCreationBonus(byte material){ if(materialCreationBonus.containsKey(material)){ - //logger.info(String.format("Modifying creation bonus by %.2f%% due to material type %s.", materialCreationBonus.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying creation bonus by %.2f%% due to material type %s.", materialCreationBonus.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialCreationBonus.get(material); } return 0.0f; @@ -63,7 +82,7 @@ public class MaterialTweaks { public static float newGetMaterialImpBonus(Item item){ byte material = item.getMaterial(); if(materialImproveBonus.containsKey(material)){ - //logger.info(String.format("Modifying improve bonus by %.2f%% due to material type %s.", materialImproveBonus.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying improve bonus by %.2f%% due to material type %s.", materialImproveBonus.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialImproveBonus.get(material); } return 1.0f; @@ -71,7 +90,7 @@ public class MaterialTweaks { public static float newGetMaterialShatterMod(byte material){ if(materialShatterResistance.containsKey(material)){ - //logger.info(String.format("Modifying shatter resistance by %.2f%% due to material type %s.", materialShatterResistance.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying shatter resistance by %.2f%% due to material type %s.", materialShatterResistance.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialShatterResistance.get(material); } return 0.0f; @@ -79,7 +98,7 @@ public class MaterialTweaks { public static float newGetMaterialLockpickBonus(byte material){ if(materialLockpickBonus.containsKey(material)){ - //logger.info(String.format("Modifying lockpick bonus by %.2f%% due to material type %s.", materialLockpickBonus.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying lockpick bonus by %.2f%% due to material type %s.", materialLockpickBonus.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialLockpickBonus.get(material); } return 0.0f; @@ -87,7 +106,7 @@ public class MaterialTweaks { public static float newGetMaterialAnchorBonus(byte material){ if(materialAnchorBonus.containsKey(material)){ - //logger.info(String.format("Modifying anchor bonus by %.2f%% due to material type %s.", materialAnchorBonus.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying anchor bonus by %.2f%% due to material type %s.", materialAnchorBonus.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialAnchorBonus.get(material); } return 1.0f; @@ -95,7 +114,7 @@ public class MaterialTweaks { public static float newGetMaterialPendulumModifier(byte material){ if(materialPendulumEffect.containsKey(material)){ - //logger.info(String.format("Modifying pendulum effect by %.2f%% due to material type %s.", materialPendulumEffect.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying pendulum effect by %.2f%% due to material type %s.", materialPendulumEffect.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialPendulumEffect.get(material); } return 1.0f; @@ -104,7 +123,7 @@ public class MaterialTweaks { public static float newGetMaterialRepairTimeMod(Item item){ byte material = item.getMaterial(); if(materialRepairSpeed.containsKey(material)){ - //logger.info(String.format("Modifying repair speed by %.2f%% due to material type %s.", materialRepairSpeed.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying repair speed by %.2f%% due to material type %s.", materialRepairSpeed.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialRepairSpeed.get(material); } return 1.0f; @@ -112,7 +131,7 @@ public class MaterialTweaks { public static double newGetMaterialBashModifier(byte material){ if(materialBashModifier.containsKey(material)){ - //logger.info(String.format("Modifying bash by %.2f%% due to material type %s.", materialBashModifier.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying bash by %.2f%% due to material type %s.", materialBashModifier.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialBashModifier.get(material); } return 1.0f; @@ -127,11 +146,11 @@ public class MaterialTweaks { byte material = item.getMaterial(); if(materialSpellEffectModifier.containsKey(material)) { newPower *= materialSpellEffectModifier.get(material); - //logger.info(String.format("Modifying spell power by %.2f%% due to material type %s. [%s]", materialSpellEffectModifier.get(material) * 100d, MaterialTweaks.getMaterialName(material), newPower)); + //logger.info(String.format("Modifying spell power by %.2f%% due to material type %s. [%s]", materialSpellEffectModifier.get(material) * 100d, MaterialsTweaks.getMaterialName(material), newPower)); } if(materialSpecificSpellEffectModifier.containsKey(material) && materialSpecificSpellEffectModifier.get(material).containsKey(aEnchantment)) { newPower *= materialSpecificSpellEffectModifier.get(material).get(aEnchantment); - //logger.info(String.format("Modifying spell power of enchant %s by %.2f%% due to material type %s. [%s]", aEnchantment, materialSpecificSpellEffectModifier.get(material).get(aEnchantment) * 100d, MaterialTweaks.getMaterialName(material), newPower)); + //logger.info(String.format("Modifying spell power of enchant %s by %.2f%% due to material type %s. [%s]", aEnchantment, materialSpecificSpellEffectModifier.get(material).get(aEnchantment) * 100d, MaterialsTweaks.getMaterialName(material), newPower)); } return newPower; } @@ -144,7 +163,7 @@ public class MaterialTweaks { byte material = item.getMaterial(); if(materialDifficultyModifier.containsKey(material)){ diff *= materialDifficultyModifier.get(material); - //logger.info(String.format("Modifying difficulty by %.2f%% due to material type %s. [%s]", materialDifficultyModifier.get(material) * 100d, MaterialTweaks.getMaterialName(material), diff)); + //logger.info(String.format("Modifying difficulty by %.2f%% due to material type %s. [%s]", materialDifficultyModifier.get(material) * 100d, MaterialsTweaks.getMaterialName(material), diff)); } } return diff; @@ -154,13 +173,21 @@ public class MaterialTweaks { if(item != null){ byte material = item.getMaterial(); if(materialActionSpeedModifier.containsKey(material)){ - //logger.info(String.format("Modifying action speed by %.2f%% due to material type %s.", materialActionSpeedModifier.get(material) * 100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying action speed by %.2f%% due to material type %s.", materialActionSpeedModifier.get(material) * 100d, MaterialsTweaks.getMaterialName(material))); return materialActionSpeedModifier.get(material); } } return 1.0f; } + public static void addMaterialDamageReduction(byte material, float reduction){ + materialDamageReduction.put(material, reduction); + } + + public static void addMaterialMovementModifier(byte material, float speed){ + materialMovementModifier.put(material, speed); + } + public static void addMaterialDamageModifier(byte material, float mult){ materialDamageModifier.put(material, mult); } @@ -263,6 +290,32 @@ public class MaterialTweaks { } protected static void initializeMaterialMaps(){ + // Material damage reduction modifiers + materialDamageReduction.put(Materials.MATERIAL_GOLD, -0.01f); + materialDamageReduction.put(Materials.MATERIAL_SILVER, -0.0075f); + materialDamageReduction.put(Materials.MATERIAL_STEEL, 0.025f); + materialDamageReduction.put(Materials.MATERIAL_COPPER, -0.01f); + materialDamageReduction.put(Materials.MATERIAL_IRON, 0.0f); + materialDamageReduction.put(Materials.MATERIAL_LEAD, -0.025f); + materialDamageReduction.put(Materials.MATERIAL_ZINC, -0.02f); + materialDamageReduction.put(Materials.MATERIAL_BRASS, 0.01f); + materialDamageReduction.put(Materials.MATERIAL_BRONZE, 0.01f); + materialDamageReduction.put(Materials.MATERIAL_TIN, -0.0175f); + materialDamageReduction.put(Materials.MATERIAL_ADAMANTINE, 0.05f); + materialDamageReduction.put(Materials.MATERIAL_GLIMMERSTEEL, 0.05f); + materialDamageReduction.put(Materials.MATERIAL_SERYLL, 0.05f); + + // Material movement modifiers + materialMovementModifier.put(Materials.MATERIAL_ADAMANTINE, 0.95f); + materialMovementModifier.put(Materials.MATERIAL_COPPER, 0.99f); + materialMovementModifier.put(Materials.MATERIAL_GLIMMERSTEEL, 0.90f); + materialMovementModifier.put(Materials.MATERIAL_GOLD, 1.05f); + materialMovementModifier.put(Materials.MATERIAL_LEAD, 1.025f); + materialMovementModifier.put(Materials.MATERIAL_SERYLL, 0.90f); + materialMovementModifier.put(Materials.MATERIAL_SILVER, 1.02f); + materialMovementModifier.put(Materials.MATERIAL_TIN, 0.98f); + materialMovementModifier.put(Materials.MATERIAL_ZINC, 0.975f); + // Material damage taken modifiers materialDamageModifier.put(Materials.MATERIAL_ADAMANTINE, 0.40f); materialDamageModifier.put(Materials.MATERIAL_BRASS, 0.95f); @@ -382,94 +435,107 @@ public class MaterialTweaks { public static void preInit(){ try { ClassPool classPool = HookManager.getInstance().getClassPool(); - final Class thisClass = MaterialTweaks.class; + final Class thisClass = MaterialsTweaks.class; String replace; if(ArmouryModMain.enableItemMaterialChanges){ + Util.setReason("Enable material damage reduction modifications."); + CtClass ctArmourTemplate = classPool.get("com.wurmonline.server.combat.ArmourTemplate"); + replace = "{" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialDamageReduction($1);" + + "}"; + Util.setBodyDeclared(thisClass, ctArmourTemplate, "getArmourMatBonus", replace); + + Util.setReason("Enable material movement modifications."); + replace = "{" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialMovementModifier($1);" + + "}"; + Util.setBodyDeclared(thisClass, ctArmourTemplate, "getMaterialMovementModifier", replace); + Util.setReason("Enable material damage taken modifications."); CtClass ctItem = classPool.get("com.wurmonline.server.items.Item"); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialDamageModifier($0);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialDamageModifier($0);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialDamageModifier", replace); Util.setReason("Enable material decay modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialDecayModifier($0);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialDecayModifier($0);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialDecayModifier", replace); Util.setReason("Enable material creation bonus modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialCreationBonus($1);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialCreationBonus($1);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialCreationBonus", replace); Util.setReason("Enable material improvement bonus modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialImpBonus($0);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialImpBonus($0);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialImpBonus", replace); Util.setReason("Enable material shatter resistance modifications."); CtClass ctSpell = classPool.get("com.wurmonline.server.spells.Spell"); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialShatterMod($1);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialShatterMod($1);" + "}"; Util.setBodyDeclared(thisClass, ctSpell, "getMaterialShatterMod", replace); Util.setReason("Enable material lockpick bonus modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialLockpickBonus($1);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialLockpickBonus($1);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialLockpickBonus", replace); Util.setReason("Enable material anchor bonus modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialAnchorBonus($1);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialAnchorBonus($1);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialAnchorBonus", replace); Util.setReason("Enable material pendulum effect modifications."); CtClass ctLocates = classPool.get("com.wurmonline.server.behaviours.Locates"); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialPendulumModifier($1);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialPendulumModifier($1);" + "}"; Util.setBodyDeclared(thisClass, ctLocates, "getMaterialPendulumModifier", replace); Util.setReason("Enable material repair speed modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialRepairTimeMod($0);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialRepairTimeMod($0);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getMaterialRepairTimeMod", replace); Util.setReason("Enable material bash modifications."); CtClass ctWeapon = classPool.get("com.wurmonline.server.combat.Weapon"); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetMaterialBashModifier($1);" + + " return "+MaterialsTweaks.class.getName()+".newGetMaterialBashModifier($1);" + "}"; Util.setBodyDeclared(thisClass, ctWeapon, "getMaterialBashModifier", replace); Util.setReason("Enable material spell power modifications."); replace = "{" - + " return "+MaterialTweaks.class.getName()+".newGetBonusForSpellEffect($0, $1);" + + " return "+MaterialsTweaks.class.getName()+".newGetBonusForSpellEffect($0, $1);" + "}"; Util.setBodyDeclared(thisClass, ctItem, "getBonusForSpellEffect", replace); Util.setReason("Enable material skill difficulty modifications."); CtClass ctSkill = classPool.get("com.wurmonline.server.skills.Skill"); - replace = "$1 = "+MaterialTweaks.class.getName()+".getNewDifficulty(this, $1, $2);"; + replace = "$1 = "+MaterialsTweaks.class.getName()+".getNewDifficulty(this, $1, $2);"; Util.insertBeforeDeclared(thisClass, ctSkill, "checkAdvance", replace); Util.setReason("Enable material action speed modifications."); CtClass ctActions = classPool.get("com.wurmonline.server.behaviours.Actions"); - replace = "$_ = $proceed($$)*"+MaterialTweaks.class.getName()+".getMaterialSpeedModifier(source);"; + replace = "$_ = $proceed($$)*"+MaterialsTweaks.class.getName()+".getMaterialSpeedModifier(source);"; Util.instrumentDeclared(thisClass, ctActions, "getStandardActionTime", "getStaminaModiferFor", replace); Util.instrumentDeclared(thisClass, ctActions, "getQuickActionTime", "getStaminaModiferFor", replace); Util.instrumentDeclared(thisClass, ctActions, "getVariableActionTime", "getStaminaModiferFor", replace); Util.instrumentDeclared(thisClass, ctActions, "getSlowActionTime", "getStaminaModiferFor", replace); Util.instrumentDeclared(thisClass, ctActions, "getPickActionTime", "getStaminaModiferFor", replace); - replace = "$_ = $proceed($$)*"+MaterialTweaks.class.getName()+".getMaterialSpeedModifier(realSource);"; + replace = "$_ = $proceed($$)*"+MaterialsTweaks.class.getName()+".getMaterialSpeedModifier(realSource);"; Util.instrumentDeclared(thisClass, ctActions, "getItemCreationTime", "getStaminaModiferFor", replace); } } catch (NotFoundException e) { diff --git a/src/main/java/mod/sin/armoury/ShieldTweaks.java b/src/main/java/mod/sin/armoury/ShieldsTweaks.java similarity index 87% rename from src/main/java/mod/sin/armoury/ShieldTweaks.java rename to src/main/java/mod/sin/armoury/ShieldsTweaks.java index 681b34a..4b86587 100644 --- a/src/main/java/mod/sin/armoury/ShieldTweaks.java +++ b/src/main/java/mod/sin/armoury/ShieldsTweaks.java @@ -16,8 +16,8 @@ import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; -public class ShieldTweaks { - public static Logger logger = Logger.getLogger(ShieldTweaks.class.getName()); +public class ShieldsTweaks { + public static Logger logger = Logger.getLogger(ShieldsTweaks.class.getName()); public static boolean checkShieldSpeed(Item shield){ if ((shield != null)) { @@ -59,17 +59,17 @@ public class ShieldTweaks { public static void preInit(){ try { ClassPool classPool = HookManager.getInstance().getClassPool(); - Class thisClass = ShieldTweaks.class; + Class thisClass = ShieldsTweaks.class; if(ArmouryModMain.enableShieldDamageEnchants){ CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); - String replace = ShieldTweaks.class.getName()+".doSharedPain(this.creature, defender, defShield);" + String replace = ShieldsTweaks.class.getName()+".doSharedPain(this.creature, defender, defShield);" + "$_ = $proceed($$);"; Util.setReason("Enable shield damage enchants."); Util.instrumentDeclared(thisClass, ctCombatHandler, "checkShield", "setDamage", replace); /*ctCombatHandler.getDeclaredMethod("checkShield").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { if (m.getMethodName().equals("setDamage")) { - m.replace(ShieldTweaks.class.getName()+".doSharedPain(this.creature, defender, defShield);" + m.replace(ShieldsTweaks.class.getName()+".doSharedPain(this.creature, defender, defShield);" + "$_ = $proceed($$);"); return; } @@ -78,13 +78,13 @@ public class ShieldTweaks { } if(ArmouryModMain.enableShieldSpeedEnchants){ CtClass ctCombatHandler = classPool.get("com.wurmonline.server.creatures.CombatHandler"); - String insert = "if("+ShieldTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" + String insert = "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" + " defender.getCombatHandler().usedShieldThisRound--;" + "}"; Util.setReason("Enable shield speed enchants."); Util.insertBeforeDeclared(thisClass, ctCombatHandler, "checkShield", insert); /*ctCombatHandler.getDeclaredMethod("checkShield").insertBefore("" - + "if("+ShieldTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" + + "if("+ShieldsTweaks.class.getName()+".checkShieldSpeed(defender.getShield())){" + " defender.getCombatHandler().usedShieldThisRound--;" + "}");*/ } diff --git a/src/main/java/mod/sin/armoury/WeaponTweaks.java b/src/main/java/mod/sin/armoury/WeaponsTweaks.java similarity index 94% rename from src/main/java/mod/sin/armoury/WeaponTweaks.java rename to src/main/java/mod/sin/armoury/WeaponsTweaks.java index 4bb8a18..dbb0645 100644 --- a/src/main/java/mod/sin/armoury/WeaponTweaks.java +++ b/src/main/java/mod/sin/armoury/WeaponsTweaks.java @@ -16,8 +16,8 @@ import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; -public class WeaponTweaks { - public static Logger logger = Logger.getLogger(WeaponTweaks.class.getName()); +public class WeaponsTweaks { + public static Logger logger = Logger.getLogger(WeaponsTweaks.class.getName()); public static Map weapons; // Mirror of the Weapon class map @@ -28,7 +28,7 @@ public class WeaponTweaks { public static double newGetMaterialDamageBonus(byte material){ if(materialWeaponDamage.containsKey(material)){ - //logger.info(String.format("Modifying damage by %.2f%% due to material type %s.", materialWeaponDamage.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying damage by %.2f%% due to material type %s.", materialWeaponDamage.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialWeaponDamage.get(material); } return 1.0d; @@ -46,7 +46,7 @@ public class WeaponTweaks { byte material = weapon.getMaterial(); if(materialWeaponSpeed.containsKey(material)){ speed *= materialWeaponSpeed.get(material); - //logger.info(String.format("Found material %s, modifying speed by %.2f%%. New speed: %s", MaterialTweaks.getMaterialName(material), materialWeaponSpeed.get(material)*100f, speed)); + //logger.info(String.format("Found material %s, modifying speed by %.2f%%. New speed: %s", MaterialsTweaks.getMaterialName(material), materialWeaponSpeed.get(material)*100f, speed)); } return speed; } catch (IllegalAccessException | NoSuchFieldException e) { @@ -61,7 +61,7 @@ public class WeaponTweaks { public static float newGetMaterialParryBonus(byte material){ if(materialWeaponParry.containsKey(material)){ - //logger.info(String.format("Modifying parry by %.2f%% due to material type %s.", materialWeaponParry.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying parry by %.2f%% due to material type %s.", materialWeaponParry.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialWeaponParry.get(material); } return 1.0f; @@ -69,7 +69,7 @@ public class WeaponTweaks { public static double newGetMaterialArmourDamageBonus(byte material){ if(materialWeaponArmourDamage.containsKey(material)){ - //logger.info(String.format("Modifying armour damage by %.2f%% due to material type %s.", materialWeaponArmourDamage.get(material)*100d, MaterialTweaks.getMaterialName(material))); + //logger.info(String.format("Modifying armour damage by %.2f%% due to material type %s.", materialWeaponArmourDamage.get(material)*100d, MaterialsTweaks.getMaterialName(material))); return materialWeaponArmourDamage.get(material); } return 1.0d; @@ -365,32 +365,32 @@ public class WeaponTweaks { public static void preInit(){ try { ClassPool classPool = HookManager.getInstance().getClassPool(); - final Class thisClass = WeaponTweaks.class; + final Class thisClass = WeaponsTweaks.class; String replace; if(ArmouryModMain.enableWeaponMaterialChanges){ Util.setReason("Enable weapon material damage modifications."); CtClass ctWeapon = classPool.get("com.wurmonline.server.combat.Weapon"); replace = "{" - + " return "+WeaponTweaks.class.getName()+".newGetMaterialDamageBonus($1);" + + " return "+WeaponsTweaks.class.getName()+".newGetMaterialDamageBonus($1);" + "}"; Util.setBodyDeclared(thisClass, ctWeapon, "getMaterialDamageBonus", replace); Util.setReason("Enable weapon material speed modifications."); replace = "{" - + " return "+WeaponTweaks.class.getName()+".newGetBaseSpeedForWeapon($1);" + + " return "+WeaponsTweaks.class.getName()+".newGetBaseSpeedForWeapon($1);" + "}"; Util.setBodyDeclared(thisClass, ctWeapon, "getBaseSpeedForWeapon", replace); Util.setReason("Enable weapon material parry modifications."); replace = "{" - + " return "+WeaponTweaks.class.getName()+".newGetMaterialParryBonus($1);" + + " return "+WeaponsTweaks.class.getName()+".newGetMaterialParryBonus($1);" + "}"; Util.setBodyDeclared(thisClass, ctWeapon, "getMaterialParryBonus", replace); Util.setReason("Enable weapon material armour damage modifications."); replace = "{" - + " return "+WeaponTweaks.class.getName()+".newGetMaterialArmourDamageBonus($1);" + + " return "+WeaponsTweaks.class.getName()+".newGetMaterialArmourDamageBonus($1);" + "}"; Util.setBodyDeclared(thisClass, ctWeapon, "getMaterialArmourDamageBonus", replace); } @@ -401,7 +401,7 @@ public class WeaponTweaks { public static void onServerStarted(){ try { - logger.info("Beginning WeaponTweaks initialization..."); + logger.info("Beginning WeaponsTweaks initialization..."); weapons = ReflectionUtil.getPrivateField(Weapon.class, ReflectionUtil.getField(Weapon.class, "weapons")); //printWeapons(); // For debugging/information purposes