diff --git a/Changelog.txt b/Changelog.txt index 9331ce9a9..9d5b479dc 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,10 +14,15 @@ Version 2.2.0 All config nodes will now use Capital letters at the start of each nodes name and after each hyphen (-) All config nodes now include a comment with the default value of the node to use as reference Expanded settings relating to purging users who have not leveled or users who had not logged in for many months - NOTE: Not every config key that was renamed will be listed here - Fixed a bug where players who started at level 1 would not be purged from the DB for being "powerless" + Fixed a potential bug where players could be awarded XP for cancelled tame events + + Exploit related config options will now be found in "exploit-prevention" + Exploit Prevention's "EndermanEndermiteFarms" renamed -> "Endermen-Endermite-Fix" + Added toggle for pistons marking natural blocks as unnatural after being moved to prevent afk stone farms + Added toggle for marking spawned mobs for giving modified XP + Added toggle for tamed mobs to give combat XP when struck Settings related to Player Leveling are now found in "player_leveling.conf" Player Leveling's "TruncateSkills" renamed -> "Reduce-Player-Skills-Above-Cap" diff --git a/src/main/java/com/gmail/nossr50/config/ConfigManager.java b/src/main/java/com/gmail/nossr50/config/ConfigManager.java index c3fcd69b8..7c8cdb000 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigManager.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigManager.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.config.collectionconfigs.RepairConfig; import com.gmail.nossr50.config.collectionconfigs.SalvageConfig; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.hocon.SerializedConfigLoader; +import com.gmail.nossr50.config.hocon.antiexploit.ConfigExploitPrevention; import com.gmail.nossr50.config.hocon.database.ConfigDatabase; import com.gmail.nossr50.config.hocon.playerleveling.ConfigLeveling; import com.gmail.nossr50.config.hocon.scoreboard.ConfigScoreboard; @@ -67,6 +68,7 @@ public final class ConfigManager { private SerializedConfigLoader configScoreboard; private SerializedConfigLoader configLeveling; private SerializedConfigLoader configWorldBlacklist; + private SerializedConfigLoader configExploitPrevention; private MainConfig mainConfig; private FishingTreasureConfig fishingTreasureConfig; private ExcavationTreasureConfig excavationTreasureConfig; @@ -102,6 +104,7 @@ public final class ConfigManager { configScoreboard = new SerializedConfigLoader<>(ConfigScoreboard.class, "scoreboard.conf", null); configLeveling = new SerializedConfigLoader<>(ConfigLeveling.class, "player_leveling.conf", null); configWorldBlacklist = new SerializedConfigLoader<>(ConfigWorldBlacklist.class, "world_blacklist.conf", null); + configExploitPrevention = new SerializedConfigLoader<>(ConfigExploitPrevention.class, "exploit_prevention.conf", null); mainConfig = new MainConfig(); @@ -327,4 +330,8 @@ public final class ConfigManager { public ConfigWorldBlacklist getConfigWorldBlacklist() { return configWorldBlacklist.getConfig(); } + + public ConfigExploitPrevention getConfigExploitPrevention() { + return configExploitPrevention.getConfig(); + } } diff --git a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java index 1416ec8e2..838f49ef9 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -222,12 +222,12 @@ public class ExperienceConfig extends ConfigValidated { * FORMULA SETTINGS */ - /* EXPLOIT TOGGLES */ public boolean isEndermanEndermiteFarmingPrevented() { return getBooleanValue(EXPLOIT_FIX, ENDERMAN_ENDERMITE_FARMS); } public boolean isFishingExploitingPrevented() { return config.getBoolean("ExploitFix.Fishing", true); } + /* Curve settings */ public FormulaType getFormulaType() { return FormulaType.getFormulaType(getStringValue(EXPERIENCE_FORMULA, CURVE)); diff --git a/src/main/java/com/gmail/nossr50/config/hocon/antiexploit/AntiExploit.java b/src/main/java/com/gmail/nossr50/config/hocon/antiexploit/AntiExploit.java deleted file mode 100644 index 9ea19c2a9..000000000 --- a/src/main/java/com/gmail/nossr50/config/hocon/antiexploit/AntiExploit.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gmail.nossr50.config.hocon.antiexploit; - -import ninja.leaping.configurate.objectmapping.Setting; -import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; - -@ConfigSerializable -public class AntiExploit { - private static final boolean ENDERMEN_ENDERMITE_DEFAULT = true; - private static final boolean PISTONS_MARK_BLOCKS_DEFAULT = true; - public static final boolean SPAWNED_MOBS_DEFAULT = true; - - /* - * CONFIG NODES - */ - - @Setting(value = "Endermen-Endermite-Fix", - comment = "Removes XP from Endermen that target endermite, this is a common exploit in The End because of how rapidly they can spawn." + - "\nIt is recommended that you leave this on as it allows players to easily gain massive amounts of combat XP" + - "\nDefault value: "+ENDERMEN_ENDERMITE_DEFAULT) - private boolean endermenEndermiteFix = ENDERMEN_ENDERMITE_DEFAULT; - - @Setting(value = "Pistons-Mark-Blocks-As-Unnatural", - comment = "Unnatural blocks give no XP." + - "This helps prevent complex automated stone farms that enable auto clickers to gain XP passively.") - private boolean pistonsMarkBlocksUnnatural = PISTONS_MARK_BLOCKS_DEFAULT; - - @Setting(value = "Spawned-Mobs-Give-No-XP", - comment = "Spawned mobs will not give players combat XP." + - "\nThis includes mobs spawned from a nether portal, mob spawner, or eggs." + - "\nThis will not include mobs spawned from commands, typically.") - private boolean spawnedMobsGiveNoXP = SPAWNED_MOBS_DEFAULT; -} diff --git a/src/main/java/com/gmail/nossr50/config/hocon/antiexploit/ConfigExploitPrevention.java b/src/main/java/com/gmail/nossr50/config/hocon/antiexploit/ConfigExploitPrevention.java new file mode 100644 index 000000000..55f80f754 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/hocon/antiexploit/ConfigExploitPrevention.java @@ -0,0 +1,57 @@ +package com.gmail.nossr50.config.hocon.antiexploit; + +import ninja.leaping.configurate.objectmapping.Setting; +import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; + +@ConfigSerializable +public class ConfigExploitPrevention { + private static final boolean ENDERMEN_ENDERMITE_DEFAULT = true; + private static final boolean PISTONS_MARK_BLOCKS_DEFAULT = true; + public static final boolean SPAWNED_MOBS_DEFAULT = true; + public static final boolean TAMED_MOB_DEFAULT = true; + + /* + * CONFIG NODES + */ + + @Setting(value = "Endermen-Endermite-Fix", + comment = "Removes XP from Endermen that target endermite, this is a common exploit in The End because of how rapidly they can spawn." + + "\nIt is recommended that you leave this on as it allows players to easily gain massive amounts of combat XP" + + "\nDefault value: "+ENDERMEN_ENDERMITE_DEFAULT) + private boolean endermenEndermiteFix = ENDERMEN_ENDERMITE_DEFAULT; + + @Setting(value = "Pistons-Mark-Blocks-As-Unnatural", + comment = "Unnatural blocks give no XP." + + "This helps prevent complex automated stone farms that enable auto clickers to gain XP passively." + + "\nDefault value: "+PISTONS_MARK_BLOCKS_DEFAULT) + private boolean pistonsMarkBlocksUnnatural = PISTONS_MARK_BLOCKS_DEFAULT; + + @Setting(value = "Spawned-Mobs-Have-Modified-XP-Values", + comment = "Spawned mobs will give different XP values than their naturally spawning counterparts" + + "\nBy default, spawned mob XP is reduced to zero, but you could change it in the experience config to whatever you want." + + "\nSpawned mobs include mobs spawned from a nether portal, mob spawner, or eggs." + + "\nThis will not include mobs spawned from commands, typically." + + "\nDefault value: "+SPAWNED_MOBS_DEFAULT) + private boolean markSpawnedMobs = SPAWNED_MOBS_DEFAULT; + + @Setting(value = "Prevent-Tamed-Mob-XP", comment = "Prevents tamed entities from giving any XP" + + "\nDefault value: "+TAMED_MOB_DEFAULT) + private boolean preventTamedMobXp = TAMED_MOB_DEFAULT; + + + public boolean getEndermenEndermiteFix() { + return endermenEndermiteFix; + } + + public boolean doPistonsMarkBlocksUnnatural() { + return pistonsMarkBlocksUnnatural; + } + + public boolean doSpawnedEntitiesGiveModifiedXP() { + return markSpawnedMobs; + } + + public boolean doTamedEntitiesGiveXP() { + return preventTamedMobXp; + } +} diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 80e827ae4..7d322f58a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -107,7 +107,9 @@ public class BlockListener implements Listener { for (Block b : event.getBlocks()) { if (BlockUtils.shouldBeWatched(b.getState())) { movedBlock = b.getRelative(direction); - mcMMO.getPlaceStore().setTrue(movedBlock); + + if(mcMMO.getConfigManager().getConfigExploitPrevention().doPistonsMarkBlocksUnnatural()) + mcMMO.getPlaceStore().setTrue(movedBlock); } } } diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index a02222e0b..695102542 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -3,7 +3,6 @@ package com.gmail.nossr50.listeners; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.MainConfig; import com.gmail.nossr50.config.WorldBlacklist; -import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.meta.OldName; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SubSkillType; @@ -71,7 +70,7 @@ public class EntityListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEntityTargetEntity(EntityTargetLivingEntityEvent event) { - if(!ExperienceConfig.getInstance().isEndermanEndermiteFarmingPrevented()) + if(!mcMMO.getConfigManager().getConfigExploitPrevention().getEndermenEndermiteFix()) return; //Prevent entities from giving XP if they target endermite @@ -645,12 +644,15 @@ public class EntityListener implements Listener { case NETHER_PORTAL: case SPAWNER: case SPAWNER_EGG: - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + if(mcMMO.getConfigManager().getConfigExploitPrevention().doSpawnedEntitiesGiveModifiedXP()) + { + entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - Entity passenger = entity.getPassenger(); + Entity passenger = entity.getPassenger(); - if (passenger != null) { - passenger.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + if (passenger != null) { + passenger.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + } } return; @@ -894,8 +896,15 @@ public class EntityListener implements Listener { return; } - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - UserManager.getPlayer(player).getTamingManager().awardTamingXP(entity); + + if(!event.isCancelled()) + { + if(mcMMO.getConfigManager().getConfigExploitPrevention().doTamedEntitiesGiveXP()) + entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + + UserManager.getPlayer(player).getTamingManager().awardTamingXP(entity); + } + } /**