diff --git a/paper/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/paper/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index f4a579a0..d3999871 100644 --- a/paper/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/paper/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -211,6 +211,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { double decayMultiplier = config.getDouble("decay_multiplier", globalDecayMultiplier); double multiplerOnDeletedGroup = config.getDouble("deleted_group_multipler", 4); int legacyId = config.getInt("legacy_id", -1); + boolean scalesWithBlockHardness = config.getBoolean("scales_with_block_hardness", true); List allowedWorlds = ConfigHelper.getStringList(config, "allowed_worlds"); if (name == null) { logger.warning("No name specified for reinforcement type at " + config.getCurrentPath()); @@ -232,7 +233,8 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { + gracePeriod + ", id: " + id + ", allowedWorlds: " + StringUtils.join(allowedWorlds, ", ")); return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, acidPriority, maturationScale, gracePeriod, creationEffect, damageEffect, destructionEffect, reinforceables, nonReinforceables, id, name, - globalBlackList, decayTimer, decayMultiplier, multiplerOnDeletedGroup, legacyId, allowedWorlds); + globalBlackList, decayTimer, decayMultiplier, multiplerOnDeletedGroup, legacyId, allowedWorlds, + scalesWithBlockHardness); } private void parseReinforcementTypes(ConfigurationSection config) { diff --git a/paper/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/paper/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index d9697e05..f8a54768 100644 --- a/paper/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/paper/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -78,6 +78,10 @@ public static float getDamageApplied(Reinforcement reinforcement) { float damageAmount = 1.0F; if (!reinforcement.isMature()) { double timeExisted = System.currentTimeMillis() - reinforcement.getCreationTime(); + double adjustedMaturationTime = + reinforcement.getType().scalesWithBlockHardness() ? + Math.sqrt(reinforcement.getLocation().getBlock().getType().getHardness()) * reinforcement.getType().getMaturationTime() : + reinforcement.getType().getMaturationTime(); double progress = timeExisted / reinforcement.getType().getMaturationTime(); damageAmount /= progress; damageAmount *= reinforcement.getType().getMaturationScale(); diff --git a/paper/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/paper/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index bc7024a2..10aff901 100644 --- a/paper/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/paper/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -145,7 +145,11 @@ public boolean isInsecure() { * reinforcements creation */ public boolean isMature() { - return System.currentTimeMillis() - creationTime > type.getMaturationTime(); + double adjustedMaturationTime = + type.scalesWithBlockHardness() ? + Math.sqrt(location.getBlock().getType().getHardness()) * type.getMaturationTime() : + type.getMaturationTime(); + return System.currentTimeMillis() - creationTime > adjustedMaturationTime; } public void setGroup(Group group) { diff --git a/paper/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/paper/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 53c50910..00beaaff 100644 --- a/paper/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/paper/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -29,12 +29,14 @@ public class ReinforcementType { private double deletedGroupMulitplier; private int legacyId; private Set allowedWorlds; + private boolean typeScalesWithBlockHardness; public ReinforcementType(float health, double returnChance, ItemStack item, long maturationTime, long acidTime, int acidPriority, double scale, long gracePeriod, ReinforcementEffect creationEffect, ReinforcementEffect damageEffect, ReinforcementEffect destructionEffect, Collection allowsReinforceables, Collection disallowedReinforceables, short id, String name, Collection globalBlackList, - long decayTimer, double decayMultiplier, double deletedGroupMulitplier, int legacyId, Collection allowedWorlds) { + long decayTimer, double decayMultiplier, double deletedGroupMulitplier, int legacyId, Collection allowedWorlds, + boolean scalesWithBlockHardness) { this.health = health; this.name = name; this.returnChance = returnChance; @@ -48,6 +50,7 @@ public ReinforcementType(float health, double returnChance, ItemStack item, long this.destructionEffect = destructionEffect; this.gracePeriod = gracePeriod; this.deletedGroupMulitplier = deletedGroupMulitplier; + this.typeScalesWithBlockHardness = scalesWithBlockHardness; if (!allowsReinforceables.isEmpty()) { this.allowedReinforceables = new TreeSet<>(allowsReinforceables); } else { @@ -104,6 +107,13 @@ public long getAcidTime() { return acidTime; } + /** + * @return whether maturation time for this type scales with block hardness + */ + public boolean scalesWithBlockHardness() { + return typeScalesWithBlockHardness; + } + /** * @return the time in milli seconds to "forgive" reinforcements and apply 100% * return rate. Set to 0 to disable.