From e5323c9ca386f7915ce52548a634d6edaa0da5d7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 13:00:26 -0800 Subject: [PATCH 001/252] Re-mavenize gimme back mah pom --- pom.xml | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..ea58ac3b --- /dev/null +++ b/pom.xml @@ -0,0 +1,268 @@ + + + + 4.0.0 + + + com.extrahardmode + ExtraHardMode + 3.6.5 + ExtraHardMode + New game rules and mechanics for Minecraft. + http://dev.bukkit.org/server-mods/fun-hard-mode + + + + UTF-8 + com.extrahardmode.ExtraHardMode + + ${project.build.outputDirectory} + 1.8.8 + R0.1-SNAPSHOT + ${basedir}/src/test/ + ${basedir}/src/main/java/ + + + + + package + ${testDir} + ${srcDir} + + + + + plugin.yml + + ${basedir}/src/main/assets/ + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + 1.6 + 1.6 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 1.5 + + + package + + shade + + + + + org.mcstats.bukkit:metrics + + + + + org.mcstats + com.extrahardmode.metrics + + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + ${outputdir} + + + + + + + + + + github-releases + http://di3mex.github.io/repo_bukkit/releases/ + + + github-snapshots + http://di3mex.github.io/repo_bukkit/snapshots/ + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + + + + org.bukkit + bukkit + ${mc-version}-${bukkit-ver} + compile + + + + org.bukkit + craftbukkit + ${mc-version}-${bukkit-ver} + provided + + + + org.mcstats.bukkit + metrics + R7 + + + + + + junit + junit + 4.11 + test + + + + org.mockito + mockito-all + 1.9.5 + test + + + + org.powermock + powermock-api-mockito + 1.5 + test + + + org.powermock + powermock-core + 1.5 + test + + + org.powermock + powermock-module-junit4 + 1.5 + test + + + + + + com.sk89q + worldguard + 5.8.1-SNAPSHOT + + + + + + me.botsko + prism + 2.0 + + + + net.coreprotect.CoreProtect + CoreProtect + 2.0.8 + + + + de.diddiz + logblock + 1.8 + + + + uk.co.oliwali + HawkEye + 1.6.0 + + + + com.google.guava + guava + 14.0.1 + + + + + + + + + bigscary + https://github.com/ryanhamshire + + + + Diemex + di.em.ex@gmx.de + https://github.com/Di3mex + GMT + + + + Mitsugaru + mitsugaru@gmail.com + https://github.com/Mitsugaru + -7 + + + bluekelp + bukkit-dev@bluekelp.com + https://github.com/bluekelp + -7 + + contributor + + + + + From b1c027c3f2adba49c60380f0c938f94b0aa9ad22 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 18:37:06 -0800 Subject: [PATCH 002/252] memetastic messages wat did u expect --- .../config/messages/MessageNode.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/messages/MessageNode.java b/src/main/java/com/extrahardmode/config/messages/MessageNode.java index 60a7191d..2a889486 100644 --- a/src/main/java/com/extrahardmode/config/messages/MessageNode.java +++ b/src/main/java/com/extrahardmode/config/messages/MessageNode.java @@ -135,7 +135,7 @@ public enum MessageNode implements ConfigNode ("NoSwimmingInArmor.Mode", MsgCategory.NOTIFICATION), NO_SWIMMING_IN_ARMOR ("NoSwimmingInArmor.Msg", MsgCategory.NOTIFICATION, "no_swimming_in_armor_warning", - "You're carrying too much weight to swim!"), + "Ur inventory iz2heavy4u 2 swim!"), END_DRAGON_KILLED_MODE ("DragonDefeated.Mode", MsgCategory.BROADCAST), END_DRAGON_KILLED @@ -211,7 +211,7 @@ public enum MessageNode implements ConfigNode ("Ghast.Mode", MsgCategory.TUTORIAL), GHAST_TARGET ("Ghast.Msg", MsgCategory.TUTORIAL, "ghast_warning", - "&cThese fearsome Ghasts wear invisible arrow deflective armor! Ghasts drop a lot more loot as well."), + "&cThese fearsome Ghasts hav adapt3d 2 ur puny arrows! Ghasts drop a lot more loot as well."), PIGZOMBIE_TARGET_MODE ("PigZombieAlwaysAngry.Mode", MsgCategory.TUTORIAL), PIGZOMBIE_TARGET @@ -228,7 +228,7 @@ public enum MessageNode implements ConfigNode ("ZombieRespawn.Mode", MsgCategory.TUTORIAL), ZOMBIE_RESPAWN ("ZombieRespawn.Msg", MsgCategory.TUTORIAL, "zombie_respawn", - "&cZombies might resurrect if not on fire!"), + "&cZombies might resurrect if not on fire or if u don't break da zombie skull they drop."), ZOMBIE_SLOW_PLAYERS_MODE ("ZombieSlowPlayer.Mode", MsgCategory.TUTORIAL), ZOMBIE_SLOW_PLAYERS @@ -238,12 +238,12 @@ public enum MessageNode implements ConfigNode ("SkeletonDeflectArrows.Mode", MsgCategory.TUTORIAL), SKELETON_DEFLECT ("SkeletonDeflectArrows.Msg", MsgCategory.TUTORIAL, "skeleton_deflect_arrow", - "&cArrows just pass through Skeletons, you gotta go close combat!"), + "&cDem skellys r hard 2 n0sc0p3 wit ur arrows bcuz they g0t n0 sk1n!"), ENDERMAN_GENERAL_MODE ("EndermanGeneral.Mode", MsgCategory.TUTORIAL), ENDERMAN_GENERAL ("EndermanGeneral.Msg", MsgCategory.TUTORIAL, "enderman_teleport", - "&cEnderman can teleport you too!"), + "&cEnderman can teleport u 2!!11!"), CREEPER_DROP_TNT_MODE ("CreeperDropTnt.Mode", MsgCategory.TUTORIAL), CREEPER_DROP_TNT @@ -253,17 +253,17 @@ public enum MessageNode implements ConfigNode ("ExtinguishFire.Mode", MsgCategory.TUTORIAL), EXTINGUISH_FIRE ("ExtinguishFire.Msg", MsgCategory.TUTORIAL, "extinguish_fire", - "&cPutting out fire with your hand will catch you on fire."), + "&cU r on fire bcuz u put it out with ur hand u dummy."), LOST_ITEMS_MODE ("ListLostItemsOnDeath.Mode", MsgCategory.NOTIFICATION), LOST_ITEMS ("ListLostItemsOnDeath.Msg", MsgCategory.NOTIFICATION, "lost_items_broadcast", - "&eYou managed to lose " + Variables.ITEMS.getVarName()), + "&eU managed to lose " + Variables.ITEMS.getVarName()), LOST_ITEMS_PLAYER_MODE ("InformPlayerOnLostItems.Mode", MsgCategory.TUTORIAL), LOST_ITEMS_PLAYER ("InformPlayerOnLostItems.Msg", MsgCategory.TUTORIAL, "lost_items", - "On death there is a a chance you might lose some of your items!"), + "On death there iz a chance u might lose some of ur nub items!"), //Farming BUCKET_FILL_MODE @@ -292,7 +292,7 @@ public enum MessageNode implements ConfigNode ("NetherWarning.Mode", MsgCategory.TUTORIAL), NETHER_WARNING ("NetherWarning.Msg", MsgCategory.TUTORIAL, "nether_warn", - "&cThis is a dangerous place. Make sure you come prepared with arrows and good gear."); + "&cThis is a dangerous place. Make sure u r prepared with arrows and gud gear."); /** * Path in the Config From 74c9b4fe4ffb24cac7ab70f4a5df4396c64d8b0f Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 18:39:48 -0800 Subject: [PATCH 003/252] Possible fix for charged creepers not exploding on damage --- .../java/com/extrahardmode/features/monsters/BumBumBens.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java index 77c9d29d..f756cbd0 100644 --- a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java +++ b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java @@ -158,7 +158,7 @@ public void onEntityDamage(EntityDamageEvent event) // FEATURE: charged creepers explode on hit if (chargedExplodeOnHit) { - if (entityType == EntityType.CREEPER && !entity.isDead()) + if ((entityType == EntityType.CREEPER) && !entity.isDead()) { Creeper creeper = (Creeper) entity; if (creeper.isPowered()) From 5c4d5d6b61f360ad3f88d3f61986b3546d3a8ff8 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 18:42:42 -0800 Subject: [PATCH 004/252] Make output jar only use project name --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index ea58ac3b..448b820f 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,7 @@ + ${project.name} package ${testDir} ${srcDir} From 1aef913257a708b8e6e445d4dd8b846323ea822b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 18:51:40 -0800 Subject: [PATCH 005/252] Revert "Make output jar only use project name" This reverts commit 5c4d5d6b61f360ad3f88d3f61986b3546d3a8ff8. --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 448b820f..ea58ac3b 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,6 @@ - ${project.name} package ${testDir} ${srcDir} From 5df9c5277010b51c85f5ba1df469fcc62d15d9ab Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 19:02:50 -0800 Subject: [PATCH 006/252] Attempting to fix this following build issue: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:2.4:jar (default-jar) on project ExtraHardMode: Error assembling JAR: A zip file cannot include itself --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index ea58ac3b..2ad04968 100644 --- a/pom.xml +++ b/pom.xml @@ -100,14 +100,14 @@ - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - ${outputdir} - - + + + + + + + + From ea9a9ca509149c01dded9efcacc8c5f6a62ebee6 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 19:04:00 -0800 Subject: [PATCH 007/252] Revert "Revert "Make output jar only use project name"" This reverts commit 1aef913257a708b8e6e445d4dd8b846323ea822b. --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 2ad04968..b5585ddf 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,7 @@ + ${project.name} package ${testDir} ${srcDir} From ad8b4641d0757d66c40a182c4c663e080c327911 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 20:15:00 -0800 Subject: [PATCH 008/252] fix pom and plugin.yml filtering >_> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b5585ddf..92565add 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ plugin.yml - ${basedir}/src/main/assets/ + ${basedir}/src/main/resources/ true From d6216bf6ddea8f5658daa643cc3b339377f5b7b7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 20:38:21 -0800 Subject: [PATCH 009/252] attempt to fix #1 Very possible that this is cancelling the explosion tasks??? Doubt it though :/ --- .../java/com/extrahardmode/features/monsters/BumBumBens.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java index f756cbd0..b3db5733 100644 --- a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java +++ b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java @@ -240,7 +240,7 @@ public void onExplosion(EntityExplodeEvent event) // Charged creeper explosion is handled in onEntityDamage if (customCreeper && entity instanceof Creeper) { - event.setCancelled(true); + //event.setCancelled(true); EntityHelper.flagIgnore(plugin, entity);//Ignore this creeper in further calls to this method if (((Creeper) entity).isPowered()) new CreateExplosionTask(plugin, entity.getLocation(), ExplosionType.CREEPER_CHARGED, entity).run(); From 18a09dbc4517df16868c1bc8314e1e3fd043b207 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 11 Feb 2016 20:42:56 -0800 Subject: [PATCH 010/252] Revert "attempt to fix #1" This reverts commit d6216bf6ddea8f5658daa643cc3b339377f5b7b7. --- .../java/com/extrahardmode/features/monsters/BumBumBens.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java index b3db5733..f756cbd0 100644 --- a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java +++ b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java @@ -240,7 +240,7 @@ public void onExplosion(EntityExplodeEvent event) // Charged creeper explosion is handled in onEntityDamage if (customCreeper && entity instanceof Creeper) { - //event.setCancelled(true); + event.setCancelled(true); EntityHelper.flagIgnore(plugin, entity);//Ignore this creeper in further calls to this method if (((Creeper) entity).isPowered()) new CreateExplosionTask(plugin, entity.getLocation(), ExplosionType.CREEPER_CHARGED, entity).run(); From e2f9d5d5580b6bc57160790d1326f8b277ba288b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 13 Feb 2016 00:26:30 -0800 Subject: [PATCH 011/252] add worldguard repo (sk89q) --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 92565add..a5b428ea 100644 --- a/pom.xml +++ b/pom.xml @@ -128,6 +128,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + sk89q-repo + http://maven.sk89q.com/repo/ + - - org.apache.maven.plugins - maven-shade-plugin - 1.5 - - - package - - shade - - - - - org.mcstats.bukkit:metrics - - - - - org.mcstats - com.extrahardmode.metrics - - - - - - - - @@ -115,14 +86,14 @@ - + spigot-repo @@ -154,12 +125,6 @@ ${mc-version}-${bukkit-ver} provided - - - org.mcstats.bukkit - metrics - R7 - diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 61628683..3d4b31cf 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -30,7 +30,6 @@ import com.extrahardmode.config.messages.MessageConfig; import com.extrahardmode.features.*; import com.extrahardmode.features.monsters.*; -import com.extrahardmode.metrics.ConfigPlotter; import com.extrahardmode.module.*; import com.extrahardmode.module.temporaryblock.TemporaryBlockHandler; import com.extrahardmode.service.IModule; @@ -160,9 +159,6 @@ public void onEnable() active = true; if (active) this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new ArmorWeightTask(this), 20L * 5, 20L * 3); - - //Metrics Plotter, this gets included by maven - new ConfigPlotter(this, getModuleForClass(RootConfig.class)); } diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java deleted file mode 100644 index 9488243a..00000000 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.extrahardmode.metrics; - - -import com.extrahardmode.config.RootConfig; -import com.extrahardmode.config.RootNode; -import com.extrahardmode.service.config.ConfigNode; -import org.bukkit.plugin.Plugin; -import org.mcstats.Metrics; - -/** - * Output all the choosen modules to mcstats in nice plots - * - * @author Diemex - */ -public class ConfigPlotter -{ - private final Plugin plugin; - - private final RootConfig CFG; - - - public ConfigPlotter(Plugin plugin, RootConfig CFG) - { - this.plugin = plugin; - this.CFG = CFG; - createPlot(); - } - - - private void createPlot() - { - - // Enabled metrics - Metrics metrics; - try - { - metrics = new Metrics(plugin); - - final int percent = CFG.getEnabledWorlds().length > 0 ? (plugin.getServer().getWorlds().size() * 100 / CFG.getEnabledWorlds().length) : 0; - Metrics.Graph graph = metrics.createGraph("Enabled for % of worlds"); - graph.addPlotter( - new Metrics.Plotter("0-25%") - { - @Override - public int getValue() - { - return percent < 26 ? 1 : 0; - } - - }); - graph.addPlotter(new Metrics.Plotter("26-50%") - { - @Override - public int getValue() - { - return percent > 25 && percent <= 50 ? 1 : 0; - } - }); - graph.addPlotter(new Metrics.Plotter("51-75%") - { - @Override - public int getValue() - { - return percent > 50 && percent <= 75 ? 1 : 0; - } - }); - graph.addPlotter(new Metrics.Plotter("76-100%") - { - @Override - public int getValue() - { - return percent > 75 ? 1 : 0; - } - }); - - - for (final RootNode node : RootNode.values()) - { - switch (node) - { - case ALWAYS_ANGRY_PIG_ZOMBIES: - case ANIMAL_EXP_NERF: - case BETTER_TNT: - case BETTER_TREE_CHOPPING: - case BLAZES_EXPLODE_ON_DEATH: - case CANT_CRAFT_MELONSEEDS: - case CHARGED_CREEPERS_EXPLODE_ON_HIT: - case DONT_MOVE_WATER_SOURCE_BLOCKS: - case ENDER_DRAGON_ADDITIONAL_ATTACKS: - case ENHANCED_ENVIRONMENTAL_DAMAGE: - case EXTINGUISHING_FIRE_IGNITES_PLAYERS: - case FORTRESS_PIGS_DROP_WART: - //case GHASTS_DEFLECT_ARROWS: - case IMPROVED_ENDERMAN_TELEPORTATION: - case INHIBIT_MONSTER_GRINDERS: - case LIMITED_BLOCK_PLACEMENT: - case LIMITED_TORCH_PLACEMENT: - case MAGMA_CUBES_BECOME_BLAZES_ON_DAMAGE: - //case MORE_MONSTERS_MULTIPLIER: - //case NETHER_PIGS_DROP_WART: - case NO_BONEMEAL_ON_MUSHROOMS: - case NO_FARMING_NETHER_WART: - case NO_SWIMMING_IN_ARMOR: - case RAIN_BREAKS_TORCHES: - //case SILVERFISH_CANT_ENTER_BLOCKS: - case SNOW_BREAKS_CROPS: - case SUPER_HARD_STONE: - case SUPER_HARD_STONE_PHYSICS: - case SPIDERS_DROP_WEB_ON_DEATH: - case WEAK_FOOD_CROPS: - case WITCHES_ADDITIONAL_ATTACKS: - case ZOMBIES_DEBILITATE_PLAYERS: - { - Metrics.Graph graph1 = metrics.createGraph(getLastPart(node)); - final int metricsVal = getMetricsValue(node); - graph1.addPlotter( - new Metrics.Plotter("Completely disabled") - { - @Override - public int getValue() - { - return metricsVal == 0 ? 1 : 0; - } - - }); - graph1.addPlotter( - new Metrics.Plotter("Enabled in all worlds") - { - @Override - public int getValue() - { - return metricsVal == 1 ? 1 : 0; - } - - }); - graph1.addPlotter( - new Metrics.Plotter("Enabled in some") - { - @Override - public int getValue() - { - return metricsVal == 2 ? 1 : 0; - } - - }); - break; - } - } - } - - metrics.start(); - } catch (Exception e) - { - e.printStackTrace(); - } - } - - - public static String getLastPart(ConfigNode node) - { - String path = node.getPath(); - String[] split = path.split("\\."); //Durr it's a regex... - return split.length > 0 ? split[split.length - 1] : ""; - } - - - /** - * Get a value to be used by metrics - *
-     * Boolean values:
-     * 0 = completely disabled
-     * 1 = enabled in all worlds
-     * 2 = Enabled in some worlds
-     *
-     * Integers:
-     * -----------
-     * Percentages:
-     * 0 = 0%
-     * 1 = 1-20%
-     * 2 = 21-40%
-     * 3 = 41-60%
-     * 4 = 61-80%
-     * 5 = 81-100%
-     * Health:
-     * 0 = 0
-     * 1 = 1-5
-     * 2 = 6-10
-     * 3 = 11-15
-     * 4 = 16-19
-     * 5 = 20
-     * Y-Value:
-     * 0 = 0
-     * 1 = 1-50
-     * 2 = 51-100
-     * 3 = 101-150
-     * 4 = 151-200
-     * 5 = 201-255
-     * 
- * - * @param node to get the value for - */ - public int getMetricsValue(ConfigNode node) - { - switch (node.getVarType()) - { - case BOOLEAN: - { - //Add up how often it's enabled - int value = 0; - for (String world : CFG.getEnabledWorlds()) - value += CFG.getBoolean(node, world) ? 1 : 0; - return value == 0 ? 0 : value == CFG.getEnabledWorlds().length ? 1 : 2; - } - default: - throw new UnsupportedOperationException(node.getPath() + " " + node.getVarType().name() + " not supported yet!"); - } - } -} diff --git a/src/main/java/com/extrahardmode/metrics/README.md b/src/main/java/com/extrahardmode/metrics/README.md deleted file mode 100644 index bf83a553..00000000 --- a/src/main/java/com/extrahardmode/metrics/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## Metrics ----------- - -We shade the metrics classes into this directory. -We log what modules are enabled and in how many worlds. \ No newline at end of file diff --git a/src/test/com/extrahardmode/metrics/TestConfigPlotter.java b/src/test/com/extrahardmode/metrics/TestConfigPlotter.java deleted file mode 100644 index 2c680923..00000000 --- a/src/test/com/extrahardmode/metrics/TestConfigPlotter.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.extrahardmode.metrics; - - -import com.extrahardmode.service.MockConfigNode; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * @author Diemex - */ -public class TestConfigPlotter -{ - @Test - public void testLastPart() - { - assertEquals("test04", ConfigPlotter.getLastPart(MockConfigNode.BOOL_TRUE)); - assertEquals("test 01", ConfigPlotter.getLastPart(MockConfigNode.BOOL_FALSE)); - } -} From e7e0462e3f6284df586a5bfa32afd3ba8283da84 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 13 Feb 2016 00:42:46 -0800 Subject: [PATCH 013/252] pls fix ur maven repo --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 63bf7825..0c9c6f6f 100644 --- a/pom.xml +++ b/pom.xml @@ -86,14 +86,14 @@ - +
spigot-repo From a7db9935d9e1e1101abbff67a8b896824537f1c7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 15 Feb 2016 13:37:08 -0800 Subject: [PATCH 014/252] Revert "memetastic messages" This reverts commit b1c027c3f2adba49c60380f0c938f94b0aa9ad22. --- .../config/messages/MessageNode.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/messages/MessageNode.java b/src/main/java/com/extrahardmode/config/messages/MessageNode.java index 2a889486..60a7191d 100644 --- a/src/main/java/com/extrahardmode/config/messages/MessageNode.java +++ b/src/main/java/com/extrahardmode/config/messages/MessageNode.java @@ -135,7 +135,7 @@ public enum MessageNode implements ConfigNode ("NoSwimmingInArmor.Mode", MsgCategory.NOTIFICATION), NO_SWIMMING_IN_ARMOR ("NoSwimmingInArmor.Msg", MsgCategory.NOTIFICATION, "no_swimming_in_armor_warning", - "Ur inventory iz2heavy4u 2 swim!"), + "You're carrying too much weight to swim!"), END_DRAGON_KILLED_MODE ("DragonDefeated.Mode", MsgCategory.BROADCAST), END_DRAGON_KILLED @@ -211,7 +211,7 @@ public enum MessageNode implements ConfigNode ("Ghast.Mode", MsgCategory.TUTORIAL), GHAST_TARGET ("Ghast.Msg", MsgCategory.TUTORIAL, "ghast_warning", - "&cThese fearsome Ghasts hav adapt3d 2 ur puny arrows! Ghasts drop a lot more loot as well."), + "&cThese fearsome Ghasts wear invisible arrow deflective armor! Ghasts drop a lot more loot as well."), PIGZOMBIE_TARGET_MODE ("PigZombieAlwaysAngry.Mode", MsgCategory.TUTORIAL), PIGZOMBIE_TARGET @@ -228,7 +228,7 @@ public enum MessageNode implements ConfigNode ("ZombieRespawn.Mode", MsgCategory.TUTORIAL), ZOMBIE_RESPAWN ("ZombieRespawn.Msg", MsgCategory.TUTORIAL, "zombie_respawn", - "&cZombies might resurrect if not on fire or if u don't break da zombie skull they drop."), + "&cZombies might resurrect if not on fire!"), ZOMBIE_SLOW_PLAYERS_MODE ("ZombieSlowPlayer.Mode", MsgCategory.TUTORIAL), ZOMBIE_SLOW_PLAYERS @@ -238,12 +238,12 @@ public enum MessageNode implements ConfigNode ("SkeletonDeflectArrows.Mode", MsgCategory.TUTORIAL), SKELETON_DEFLECT ("SkeletonDeflectArrows.Msg", MsgCategory.TUTORIAL, "skeleton_deflect_arrow", - "&cDem skellys r hard 2 n0sc0p3 wit ur arrows bcuz they g0t n0 sk1n!"), + "&cArrows just pass through Skeletons, you gotta go close combat!"), ENDERMAN_GENERAL_MODE ("EndermanGeneral.Mode", MsgCategory.TUTORIAL), ENDERMAN_GENERAL ("EndermanGeneral.Msg", MsgCategory.TUTORIAL, "enderman_teleport", - "&cEnderman can teleport u 2!!11!"), + "&cEnderman can teleport you too!"), CREEPER_DROP_TNT_MODE ("CreeperDropTnt.Mode", MsgCategory.TUTORIAL), CREEPER_DROP_TNT @@ -253,17 +253,17 @@ public enum MessageNode implements ConfigNode ("ExtinguishFire.Mode", MsgCategory.TUTORIAL), EXTINGUISH_FIRE ("ExtinguishFire.Msg", MsgCategory.TUTORIAL, "extinguish_fire", - "&cU r on fire bcuz u put it out with ur hand u dummy."), + "&cPutting out fire with your hand will catch you on fire."), LOST_ITEMS_MODE ("ListLostItemsOnDeath.Mode", MsgCategory.NOTIFICATION), LOST_ITEMS ("ListLostItemsOnDeath.Msg", MsgCategory.NOTIFICATION, "lost_items_broadcast", - "&eU managed to lose " + Variables.ITEMS.getVarName()), + "&eYou managed to lose " + Variables.ITEMS.getVarName()), LOST_ITEMS_PLAYER_MODE ("InformPlayerOnLostItems.Mode", MsgCategory.TUTORIAL), LOST_ITEMS_PLAYER ("InformPlayerOnLostItems.Msg", MsgCategory.TUTORIAL, "lost_items", - "On death there iz a chance u might lose some of ur nub items!"), + "On death there is a a chance you might lose some of your items!"), //Farming BUCKET_FILL_MODE @@ -292,7 +292,7 @@ public enum MessageNode implements ConfigNode ("NetherWarning.Mode", MsgCategory.TUTORIAL), NETHER_WARNING ("NetherWarning.Msg", MsgCategory.TUTORIAL, "nether_warn", - "&cThis is a dangerous place. Make sure u r prepared with arrows and gud gear."); + "&cThis is a dangerous place. Make sure you come prepared with arrows and good gear."); /** * Path in the Config From 072ef175b6dacf4cdfa3fb787f6b022730c899b0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 15 Feb 2016 23:19:23 -0800 Subject: [PATCH 015/252] pom: force updates Idk let's see if this works. http://stackoverflow.com/a/6049174 --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 0c9c6f6f..2febf0f1 100644 --- a/pom.xml +++ b/pom.xml @@ -89,10 +89,14 @@ github-releases http://di3mex.github.io/repo_bukkit/releases/ + truealways + truealways github-snapshots http://di3mex.github.io/repo_bukkit/snapshots/ + truealways + truealways From 409caca38a5324ba203572771e563a935152b210 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 2 Mar 2016 20:06:18 -0800 Subject: [PATCH 016/252] Revert "pom: force updates" This reverts commit 072ef175b6dacf4cdfa3fb787f6b022730c899b0. --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index 2febf0f1..0c9c6f6f 100644 --- a/pom.xml +++ b/pom.xml @@ -89,14 +89,10 @@ github-releases http://di3mex.github.io/repo_bukkit/releases/ - truealways - truealways github-snapshots http://di3mex.github.io/repo_bukkit/snapshots/ - truealways - truealways From 8e0c44386bd3673e0e912a4821865cc9a6b12039 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 5 Mar 2016 04:33:53 -0800 Subject: [PATCH 017/252] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 23953119..f259eee8 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,6 @@ ExtraHardMode Official repository for [ExtraHardMode Bukkit Plugin](http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/). -## Dev Builds - -Development builds are hosted in this repo under the [releases section](https://github.com/Di3mex/ExtraHardMode/releases) - ## Build instructions We use maven to handle our dependencies. @@ -15,4 +11,4 @@ We use maven to handle our dependencies. * Check out this repo and: `mvn clean package` All the required dependencies can be found in maven central. All other dependencies are in this [maven repo](http://di3mex.github.io/repo_bukkit/). -You can manually download the dependencies from there and add them to your classpath. \ No newline at end of file +You can manually download the dependencies from there and add them to your classpath. From 8d6c65fc6a134f44b9a938f0d0c9e5fb0b1f0d51 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 5 Mar 2016 04:40:55 -0800 Subject: [PATCH 018/252] Revert "Metrics iz kill" This reverts commit 12808a5dadc4728ef108bbcd09690f1ba10cdef3. --- pom.xml | 35 +++ .../java/com/extrahardmode/ExtraHardMode.java | 4 + .../extrahardmode/metrics/ConfigPlotter.java | 218 ++++++++++++++++++ .../java/com/extrahardmode/metrics/README.md | 5 + .../metrics/TestConfigPlotter.java | 20 ++ 5 files changed, 282 insertions(+) create mode 100644 src/main/java/com/extrahardmode/metrics/ConfigPlotter.java create mode 100644 src/main/java/com/extrahardmode/metrics/README.md create mode 100644 src/test/com/extrahardmode/metrics/TestConfigPlotter.java diff --git a/pom.xml b/pom.xml index 0c9c6f6f..a5b428ea 100644 --- a/pom.xml +++ b/pom.xml @@ -71,6 +71,35 @@ + + + org.apache.maven.plugins + maven-shade-plugin + 1.5 + + + package + + shade + + + + + org.mcstats.bukkit:metrics + + + + + org.mcstats + com.extrahardmode.metrics + + + + + + + + @@ -125,6 +154,12 @@ ${mc-version}-${bukkit-ver} provided + + + org.mcstats.bukkit + metrics + R7 + diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 3d4b31cf..61628683 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -30,6 +30,7 @@ import com.extrahardmode.config.messages.MessageConfig; import com.extrahardmode.features.*; import com.extrahardmode.features.monsters.*; +import com.extrahardmode.metrics.ConfigPlotter; import com.extrahardmode.module.*; import com.extrahardmode.module.temporaryblock.TemporaryBlockHandler; import com.extrahardmode.service.IModule; @@ -159,6 +160,9 @@ public void onEnable() active = true; if (active) this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new ArmorWeightTask(this), 20L * 5, 20L * 3); + + //Metrics Plotter, this gets included by maven + new ConfigPlotter(this, getModuleForClass(RootConfig.class)); } diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java new file mode 100644 index 00000000..9488243a --- /dev/null +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -0,0 +1,218 @@ +package com.extrahardmode.metrics; + + +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.service.config.ConfigNode; +import org.bukkit.plugin.Plugin; +import org.mcstats.Metrics; + +/** + * Output all the choosen modules to mcstats in nice plots + * + * @author Diemex + */ +public class ConfigPlotter +{ + private final Plugin plugin; + + private final RootConfig CFG; + + + public ConfigPlotter(Plugin plugin, RootConfig CFG) + { + this.plugin = plugin; + this.CFG = CFG; + createPlot(); + } + + + private void createPlot() + { + + // Enabled metrics + Metrics metrics; + try + { + metrics = new Metrics(plugin); + + final int percent = CFG.getEnabledWorlds().length > 0 ? (plugin.getServer().getWorlds().size() * 100 / CFG.getEnabledWorlds().length) : 0; + Metrics.Graph graph = metrics.createGraph("Enabled for % of worlds"); + graph.addPlotter( + new Metrics.Plotter("0-25%") + { + @Override + public int getValue() + { + return percent < 26 ? 1 : 0; + } + + }); + graph.addPlotter(new Metrics.Plotter("26-50%") + { + @Override + public int getValue() + { + return percent > 25 && percent <= 50 ? 1 : 0; + } + }); + graph.addPlotter(new Metrics.Plotter("51-75%") + { + @Override + public int getValue() + { + return percent > 50 && percent <= 75 ? 1 : 0; + } + }); + graph.addPlotter(new Metrics.Plotter("76-100%") + { + @Override + public int getValue() + { + return percent > 75 ? 1 : 0; + } + }); + + + for (final RootNode node : RootNode.values()) + { + switch (node) + { + case ALWAYS_ANGRY_PIG_ZOMBIES: + case ANIMAL_EXP_NERF: + case BETTER_TNT: + case BETTER_TREE_CHOPPING: + case BLAZES_EXPLODE_ON_DEATH: + case CANT_CRAFT_MELONSEEDS: + case CHARGED_CREEPERS_EXPLODE_ON_HIT: + case DONT_MOVE_WATER_SOURCE_BLOCKS: + case ENDER_DRAGON_ADDITIONAL_ATTACKS: + case ENHANCED_ENVIRONMENTAL_DAMAGE: + case EXTINGUISHING_FIRE_IGNITES_PLAYERS: + case FORTRESS_PIGS_DROP_WART: + //case GHASTS_DEFLECT_ARROWS: + case IMPROVED_ENDERMAN_TELEPORTATION: + case INHIBIT_MONSTER_GRINDERS: + case LIMITED_BLOCK_PLACEMENT: + case LIMITED_TORCH_PLACEMENT: + case MAGMA_CUBES_BECOME_BLAZES_ON_DAMAGE: + //case MORE_MONSTERS_MULTIPLIER: + //case NETHER_PIGS_DROP_WART: + case NO_BONEMEAL_ON_MUSHROOMS: + case NO_FARMING_NETHER_WART: + case NO_SWIMMING_IN_ARMOR: + case RAIN_BREAKS_TORCHES: + //case SILVERFISH_CANT_ENTER_BLOCKS: + case SNOW_BREAKS_CROPS: + case SUPER_HARD_STONE: + case SUPER_HARD_STONE_PHYSICS: + case SPIDERS_DROP_WEB_ON_DEATH: + case WEAK_FOOD_CROPS: + case WITCHES_ADDITIONAL_ATTACKS: + case ZOMBIES_DEBILITATE_PLAYERS: + { + Metrics.Graph graph1 = metrics.createGraph(getLastPart(node)); + final int metricsVal = getMetricsValue(node); + graph1.addPlotter( + new Metrics.Plotter("Completely disabled") + { + @Override + public int getValue() + { + return metricsVal == 0 ? 1 : 0; + } + + }); + graph1.addPlotter( + new Metrics.Plotter("Enabled in all worlds") + { + @Override + public int getValue() + { + return metricsVal == 1 ? 1 : 0; + } + + }); + graph1.addPlotter( + new Metrics.Plotter("Enabled in some") + { + @Override + public int getValue() + { + return metricsVal == 2 ? 1 : 0; + } + + }); + break; + } + } + } + + metrics.start(); + } catch (Exception e) + { + e.printStackTrace(); + } + } + + + public static String getLastPart(ConfigNode node) + { + String path = node.getPath(); + String[] split = path.split("\\."); //Durr it's a regex... + return split.length > 0 ? split[split.length - 1] : ""; + } + + + /** + * Get a value to be used by metrics + *
+     * Boolean values:
+     * 0 = completely disabled
+     * 1 = enabled in all worlds
+     * 2 = Enabled in some worlds
+     *
+     * Integers:
+     * -----------
+     * Percentages:
+     * 0 = 0%
+     * 1 = 1-20%
+     * 2 = 21-40%
+     * 3 = 41-60%
+     * 4 = 61-80%
+     * 5 = 81-100%
+     * Health:
+     * 0 = 0
+     * 1 = 1-5
+     * 2 = 6-10
+     * 3 = 11-15
+     * 4 = 16-19
+     * 5 = 20
+     * Y-Value:
+     * 0 = 0
+     * 1 = 1-50
+     * 2 = 51-100
+     * 3 = 101-150
+     * 4 = 151-200
+     * 5 = 201-255
+     * 
+ * + * @param node to get the value for + */ + public int getMetricsValue(ConfigNode node) + { + switch (node.getVarType()) + { + case BOOLEAN: + { + //Add up how often it's enabled + int value = 0; + for (String world : CFG.getEnabledWorlds()) + value += CFG.getBoolean(node, world) ? 1 : 0; + return value == 0 ? 0 : value == CFG.getEnabledWorlds().length ? 1 : 2; + } + default: + throw new UnsupportedOperationException(node.getPath() + " " + node.getVarType().name() + " not supported yet!"); + } + } +} diff --git a/src/main/java/com/extrahardmode/metrics/README.md b/src/main/java/com/extrahardmode/metrics/README.md new file mode 100644 index 00000000..bf83a553 --- /dev/null +++ b/src/main/java/com/extrahardmode/metrics/README.md @@ -0,0 +1,5 @@ +## Metrics +---------- + +We shade the metrics classes into this directory. +We log what modules are enabled and in how many worlds. \ No newline at end of file diff --git a/src/test/com/extrahardmode/metrics/TestConfigPlotter.java b/src/test/com/extrahardmode/metrics/TestConfigPlotter.java new file mode 100644 index 00000000..2c680923 --- /dev/null +++ b/src/test/com/extrahardmode/metrics/TestConfigPlotter.java @@ -0,0 +1,20 @@ +package com.extrahardmode.metrics; + + +import com.extrahardmode.service.MockConfigNode; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author Diemex + */ +public class TestConfigPlotter +{ + @Test + public void testLastPart() + { + assertEquals("test04", ConfigPlotter.getLastPart(MockConfigNode.BOOL_TRUE)); + assertEquals("test 01", ConfigPlotter.getLastPart(MockConfigNode.BOOL_FALSE)); + } +} From 61599047adb81d56fdbc19690fe1963cdb5d0d49 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 5 Mar 2016 04:51:28 -0800 Subject: [PATCH 019/252] Fix prism dependency No need for #3 --- pom.xml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index a5b428ea..02dfc54c 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,10 @@ github-snapshots http://di3mex.github.io/repo_bukkit/snapshots/
+ + prism-repo + http://dhmc.us:8081/nexus/content/repositories/releases/ + spigot-repo @@ -148,12 +152,12 @@ compile - - org.bukkit - craftbukkit - ${mc-version}-${bukkit-ver} - provided - + + + + + + org.mcstats.bukkit @@ -209,7 +213,7 @@ me.botsko prism - 2.0 + 2.0.6 From 8a39b954dcf2b01a112f681a0166bb671ed910ff Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 5 Mar 2016 05:06:38 -0800 Subject: [PATCH 020/252] Update sounds for 1.9 API Issue #4 was never actually an issue --- pom.xml | 2 +- src/main/java/com/extrahardmode/features/Torches.java | 4 ++-- .../java/com/extrahardmode/features/monsters/Endermen.java | 4 ++-- .../service/config/customtypes/PotionEffectHolder.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 02dfc54c..94b7ff16 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.8.8 + 1.9 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index 09e7165d..766f4e83 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -102,7 +102,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) || attachmentMaterial == Material.SAND || attachmentMaterial == Material.GRAVEL) { if (soundFizzEnabled) - messenger.send(player, MessageNode.LIMITED_TORCH_PLACEMENTS, PermissionNode.SILENT_LIMITED_TORCH_PLACEMENT, Sound.FIZZ, 20); + messenger.send(player, MessageNode.LIMITED_TORCH_PLACEMENTS, PermissionNode.SILENT_LIMITED_TORCH_PLACEMENT, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); placeEvent.setCancelled(true); } } @@ -115,7 +115,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) && (block.getType() == Material.TORCH || block.getType() == Material.JACK_O_LANTERN || (block.getType() == Material.FIRE && block .getRelative(BlockFace.DOWN).getType() == Material.NETHERRACK))) { - messenger.send(player, MessageNode.NO_TORCHES_HERE, PermissionNode.SILENT_NO_TORCHES_HERE, Sound.FIZZ, 20); + messenger.send(player, MessageNode.NO_TORCHES_HERE, PermissionNode.SILENT_NO_TORCHES_HERE, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); placeEvent.setCancelled(true); return; } diff --git a/src/main/java/com/extrahardmode/features/monsters/Endermen.java b/src/main/java/com/extrahardmode/features/monsters/Endermen.java index c1e1b099..faf23210 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Endermen.java +++ b/src/main/java/com/extrahardmode/features/monsters/Endermen.java @@ -102,7 +102,7 @@ public void onEntityTeleport(EntityTeleportEvent event) int distanceSquared = (int) player.getLocation().distanceSquared(enderman.getLocation()); // play sound at old location - world.playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 1.0F, 1.0F); + world.playSound(player.getLocation(), Sound.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F); Block destinationBlock; // if the player is far away @@ -142,7 +142,7 @@ public void onEntityTeleport(EntityTeleportEvent event) player.teleport(teleportEvent.getTeleportTo(), PlayerTeleportEvent.TeleportCause.ENDER_PEARL); // play sound at new location - world.playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 1.0F, 1.0F); + world.playSound(player.getLocation(), Sound.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F); event.setCancelled(true); } } diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/PotionEffectHolder.java b/src/main/java/com/extrahardmode/service/config/customtypes/PotionEffectHolder.java index 0518a9b8..16fed192 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/PotionEffectHolder.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/PotionEffectHolder.java @@ -48,7 +48,7 @@ public static PotionEffectType parseEffect(String input) if (effect == null) //Strip values that are most likely invalid effect = PotionEffectType.getByName(RegexHelper.stripEnum(input)); if (effect == null && containsNumbers) - effect = PotionEffectType.getById(RegexHelper.parseNumber(input)); + effect = PotionEffectType.getById(RegexHelper.parseNumber(input)); //TODO: Fix deprecation return effect; } From dc0dac897ccbeed63590611c7cd31e7cf9d16bdb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 5 Mar 2016 05:09:28 -0800 Subject: [PATCH 021/252] Update version to 3.7 --- pom.xml | 2 +- src/main/resources/plugin.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 94b7ff16..54787157 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.6.5 + 3.7 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6c5be4d1..41c8eee9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,11 +1,11 @@ name: ExtraHardMode main: com.extrahardmode.ExtraHardMode -version: 3.6.6 +version: ${project.version} description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ #project lead author: Diemex -authors: [Mitsugaru, bigscary] +authors: [Mitsugaru, Big_Scary, RoboMWM] #ensure that we are loaded after multiworld plugins softdepend: [Multiverse-Core, My Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye] commands: From 67cf9c7c553d785e1be4917bf6701a10cc079213 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 5 Mar 2016 18:46:07 -0800 Subject: [PATCH 022/252] Create .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..dff5f3a5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java From 0372ea1ee7883f4be19ad0d2bbf36f71bed84a18 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 7 Mar 2016 12:10:11 -0800 Subject: [PATCH 023/252] 3.7.1: Fixes #19 --- pom.xml | 66 +- .../extrahardmode/metrics/ConfigPlotter.java | 1 - .../com/extrahardmode/metrics/Metrics.java | 764 ++++++++++++++++++ .../java/com/extrahardmode/metrics/README.md | 1 - 4 files changed, 797 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/extrahardmode/metrics/Metrics.java diff --git a/pom.xml b/pom.xml index 54787157..7a26bacf 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.7 + 3.7.1 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode @@ -72,33 +72,33 @@ - - org.apache.maven.plugins - maven-shade-plugin - 1.5 - - - package - - shade - - - - - org.mcstats.bukkit:metrics - - - - - org.mcstats - com.extrahardmode.metrics - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -159,11 +159,11 @@ - - org.mcstats.bukkit - metrics - R7 - + + + + + diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java index 9488243a..c445be85 100644 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -5,7 +5,6 @@ import com.extrahardmode.config.RootNode; import com.extrahardmode.service.config.ConfigNode; import org.bukkit.plugin.Plugin; -import org.mcstats.Metrics; /** * Output all the choosen modules to mcstats in nice plots diff --git a/src/main/java/com/extrahardmode/metrics/Metrics.java b/src/main/java/com/extrahardmode/metrics/Metrics.java new file mode 100644 index 00000000..dd4ff5f6 --- /dev/null +++ b/src/main/java/com/extrahardmode/metrics/Metrics.java @@ -0,0 +1,764 @@ +package com.extrahardmode.metrics; +/* + * Copyright 2011-2013 Tyler Blair. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and contributors and should not be interpreted as representing official policies, + * either expressed or implied, of anybody else. + */ + + import org.bukkit.Bukkit; + import org.bukkit.Server; + import org.bukkit.configuration.InvalidConfigurationException; + import org.bukkit.configuration.file.YamlConfiguration; + import org.bukkit.entity.Player; + import org.bukkit.plugin.Plugin; + import org.bukkit.plugin.PluginDescriptionFile; + import org.bukkit.scheduler.BukkitTask; + + import java.io.BufferedReader; + import java.io.ByteArrayOutputStream; + import java.io.File; + import java.io.IOException; + import java.io.InputStreamReader; + import java.io.OutputStream; + import java.io.UnsupportedEncodingException; + import java.lang.reflect.Method; + import java.net.Proxy; + import java.net.URL; + import java.net.URLConnection; + import java.net.URLEncoder; + import java.util.Collection; + import java.util.Collections; + import java.util.HashSet; + import java.util.Iterator; + import java.util.LinkedHashSet; + import java.util.Set; + import java.util.UUID; + import java.util.logging.Level; + import java.util.zip.GZIPOutputStream; + +public class Metrics { + + /** + * The current revision number + */ + private final static int REVISION = 7; + + /** + * The base url of the metrics domain + */ + private static final String BASE_URL = "http://report.mcstats.org"; + + /** + * The url used to report a server's status + */ + private static final String REPORT_URL = "/plugin/%s"; + + /** + * Interval of time to ping (in minutes) + */ + private static final int PING_INTERVAL = 15; + + /** + * The plugin this metrics submits for + */ + private final Plugin plugin; + + /** + * All of the custom graphs to submit to metrics + */ + private final Set graphs = Collections.synchronizedSet(new HashSet()); + + /** + * The plugin configuration file + */ + private final YamlConfiguration configuration; + + /** + * The plugin configuration file + */ + private final File configurationFile; + + /** + * Unique server id + */ + private final String guid; + + /** + * Debug mode + */ + private final boolean debug; + + /** + * Lock for synchronization + */ + private final Object optOutLock = new Object(); + + /** + * The scheduled task + */ + private volatile BukkitTask task = null; + + public Metrics(final Plugin plugin) throws IOException { + if (plugin == null) { + throw new IllegalArgumentException("Plugin cannot be null"); + } + + this.plugin = plugin; + + // load the config + configurationFile = getConfigFile(); + configuration = YamlConfiguration.loadConfiguration(configurationFile); + + // add some defaults + configuration.addDefault("opt-out", false); + configuration.addDefault("guid", UUID.randomUUID().toString()); + configuration.addDefault("debug", false); + + // Do we need to create the file? + if (configuration.get("guid", null) == null) { + configuration.options().header("http://mcstats.org").copyDefaults(true); + configuration.save(configurationFile); + } + + // Load the guid then + guid = configuration.getString("guid"); + debug = configuration.getBoolean("debug", false); + } + + /** + * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics + * website. Plotters can be added to the graph object returned. + * + * @param name The name of the graph + * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given + */ + public Graph createGraph(final String name) { + if (name == null) { + throw new IllegalArgumentException("Graph name cannot be null"); + } + + // Construct the graph object + final Graph graph = new Graph(name); + + // Now we can add our graph + graphs.add(graph); + + // and return back + return graph; + } + + /** + * Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend + * + * @param graph The name of the graph + */ + public void addGraph(final Graph graph) { + if (graph == null) { + throw new IllegalArgumentException("Graph cannot be null"); + } + + graphs.add(graph); + } + + /** + * Start measuring statistics. This will immediately create an async repeating task as the plugin and send the + * initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200 + * ticks. + * + * @return True if statistics measuring is running, otherwise false. + */ + public boolean start() { + synchronized (optOutLock) { + // Did we opt out? + if (isOptOut()) { + return false; + } + + // Is metrics already running? + if (task != null) { + return true; + } + + // Begin hitting the server with glorious data + task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() { + + private boolean firstPost = true; + + public void run() { + try { + // This has to be synchronized or it can collide with the disable method. + synchronized (optOutLock) { + // Disable Task, if it is running and the server owner decided to opt-out + if (isOptOut() && task != null) { + task.cancel(); + task = null; + // Tell all plotters to stop gathering information. + for (Graph graph : graphs) { + graph.onOptOut(); + } + } + } + + // We use the inverse of firstPost because if it is the first time we are posting, + // it is not a interval ping, so it evaluates to FALSE + // Each time thereafter it will evaluate to TRUE, i.e PING! + postPlugin(!firstPost); + + // After the first post we set firstPost to false + // Each post thereafter will be a ping + firstPost = false; + } catch (IOException e) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage()); + } + } + } + }, 0, PING_INTERVAL * 1200); + + return true; + } + } + + /** + * Has the server owner denied plugin metrics? + * + * @return true if metrics should be opted out of it + */ + public boolean isOptOut() { + synchronized (optOutLock) { + try { + // Reload the metrics file + configuration.load(getConfigFile()); + } catch (IOException ex) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } + return true; + } catch (InvalidConfigurationException ex) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } + return true; + } + return configuration.getBoolean("opt-out", false); + } + } + + /** + * Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task. + * + * @throws java.io.IOException + */ + public void enable() throws IOException { + // This has to be synchronized or it can collide with the check in the task. + synchronized (optOutLock) { + // Check if the server owner has already set opt-out, if not, set it. + if (isOptOut()) { + configuration.set("opt-out", false); + configuration.save(configurationFile); + } + + // Enable Task, if it is not running + if (task == null) { + start(); + } + } + } + + /** + * Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task. + * + * @throws java.io.IOException + */ + public void disable() throws IOException { + // This has to be synchronized or it can collide with the check in the task. + synchronized (optOutLock) { + // Check if the server owner has already set opt-out, if not, set it. + if (!isOptOut()) { + configuration.set("opt-out", true); + configuration.save(configurationFile); + } + + // Disable Task, if it is running + if (task != null) { + task.cancel(); + task = null; + } + } + } + + /** + * Gets the File object of the config file that should be used to store data such as the GUID and opt-out status + * + * @return the File object for the config file + */ + public File getConfigFile() { + // I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use + // is to abuse the plugin object we already have + // plugin.getDataFolder() => base/plugins/PluginA/ + // pluginsFolder => base/plugins/ + // The base is not necessarily relative to the startup directory. + File pluginsFolder = plugin.getDataFolder().getParentFile(); + + // return => base/plugins/PluginMetrics/config.yml + return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml"); + } + + /** + * Generic method that posts a plugin to the metrics website + */ + private void postPlugin(final boolean isPing) throws IOException { + // Server software specific section + PluginDescriptionFile description = plugin.getDescription(); + String pluginName = description.getName(); + boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled + String pluginVersion = description.getVersion(); + String serverVersion = Bukkit.getVersion(); + int playersOnline = Bukkit.getOnlinePlayers().size(); + + // END server software specific section -- all code below does not use any code outside of this class / Java + + // Construct the post data + StringBuilder json = new StringBuilder(1024); + json.append('{'); + + // The plugin's description file containg all of the plugin data such as name, version, author, etc + appendJSONPair(json, "guid", guid); + appendJSONPair(json, "plugin_version", pluginVersion); + appendJSONPair(json, "server_version", serverVersion); + appendJSONPair(json, "players_online", Integer.toString(playersOnline)); + + // New data as of R6 + String osname = System.getProperty("os.name"); + String osarch = System.getProperty("os.arch"); + String osversion = System.getProperty("os.version"); + String java_version = System.getProperty("java.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + // normalize os arch .. amd64 -> x86_64 + if (osarch.equals("amd64")) { + osarch = "x86_64"; + } + + appendJSONPair(json, "osname", osname); + appendJSONPair(json, "osarch", osarch); + appendJSONPair(json, "osversion", osversion); + appendJSONPair(json, "cores", Integer.toString(coreCount)); + appendJSONPair(json, "auth_mode", onlineMode ? "1" : "0"); + appendJSONPair(json, "java_version", java_version); + + // If we're pinging, append it + if (isPing) { + appendJSONPair(json, "ping", "1"); + } + + if (graphs.size() > 0) { + synchronized (graphs) { + json.append(','); + json.append('"'); + json.append("graphs"); + json.append('"'); + json.append(':'); + json.append('{'); + + boolean firstGraph = true; + + final Iterator iter = graphs.iterator(); + + while (iter.hasNext()) { + Graph graph = iter.next(); + + StringBuilder graphJson = new StringBuilder(); + graphJson.append('{'); + + for (Plotter plotter : graph.getPlotters()) { + appendJSONPair(graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue())); + } + + graphJson.append('}'); + + if (!firstGraph) { + json.append(','); + } + + json.append(escapeJSON(graph.getName())); + json.append(':'); + json.append(graphJson); + + firstGraph = false; + } + + json.append('}'); + } + } + + // close json + json.append('}'); + + // Create the url + URL url = new URL(BASE_URL + String.format(REPORT_URL, urlEncode(pluginName))); + + // Connect to the website + URLConnection connection; + + // Mineshafter creates a socks proxy, so we can safely bypass it + // It does not reroute POST requests so we need to go around it + if (isMineshafterPresent()) { + connection = url.openConnection(Proxy.NO_PROXY); + } else { + connection = url.openConnection(); + } + + + byte[] uncompressed = json.toString().getBytes(); + byte[] compressed = gzip(json.toString()); + + // Headers + connection.addRequestProperty("User-Agent", "MCStats/" + REVISION); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Content-Encoding", "gzip"); + connection.addRequestProperty("Content-Length", Integer.toString(compressed.length)); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + + connection.setDoOutput(true); + + if (debug) { + System.out.println("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + " compressed=" + compressed.length); + } + + // Write the data + OutputStream os = connection.getOutputStream(); + os.write(compressed); + os.flush(); + + // Now read the response + final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String response = reader.readLine(); + + // close resources + os.close(); + reader.close(); + + if (response == null || response.startsWith("ERR") || response.startsWith("7")) { + if (response == null) { + response = "null"; + } else if (response.startsWith("7")) { + response = response.substring(response.startsWith("7,") ? 2 : 1); + } + + throw new IOException(response); + } else { + // Is this the first update this hour? + if (response.equals("1") || response.contains("This is your first update this hour")) { + synchronized (graphs) { + final Iterator iter = graphs.iterator(); + + while (iter.hasNext()) { + final Graph graph = iter.next(); + + for (Plotter plotter : graph.getPlotters()) { + plotter.reset(); + } + } + } + } + } + } + + /** + * GZip compress a string of bytes + * + * @param input + * @return + */ + public static byte[] gzip(String input) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gzos = null; + + try { + gzos = new GZIPOutputStream(baos); + gzos.write(input.getBytes("UTF-8")); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (gzos != null) try { + gzos.close(); + } catch (IOException ignore) { + } + } + + return baos.toByteArray(); + } + + /** + * Check if mineshafter is present. If it is, we need to bypass it to send POST requests + * + * @return true if mineshafter is installed on the server + */ + private boolean isMineshafterPresent() { + try { + Class.forName("mineshafter.MineServer"); + return true; + } catch (Exception e) { + return false; + } + } + + /** + * Appends a json encoded key/value pair to the given string builder. + * + * @param json + * @param key + * @param value + * @throws UnsupportedEncodingException + */ + private static void appendJSONPair(StringBuilder json, String key, String value) throws UnsupportedEncodingException { + boolean isValueNumeric = false; + + try { + if (value.equals("0") || !value.endsWith("0")) { + Double.parseDouble(value); + isValueNumeric = true; + } + } catch (NumberFormatException e) { + isValueNumeric = false; + } + + if (json.charAt(json.length() - 1) != '{') { + json.append(','); + } + + json.append(escapeJSON(key)); + json.append(':'); + + if (isValueNumeric) { + json.append(value); + } else { + json.append(escapeJSON(value)); + } + } + + /** + * Escape a string to create a valid JSON string + * + * @param text + * @return + */ + private static String escapeJSON(String text) { + StringBuilder builder = new StringBuilder(); + + builder.append('"'); + for (int index = 0; index < text.length(); index++) { + char chr = text.charAt(index); + + switch (chr) { + case '"': + case '\\': + builder.append('\\'); + builder.append(chr); + break; + case '\b': + builder.append("\\b"); + break; + case '\t': + builder.append("\\t"); + break; + case '\n': + builder.append("\\n"); + break; + case '\r': + builder.append("\\r"); + break; + default: + if (chr < ' ') { + String t = "000" + Integer.toHexString(chr); + builder.append("\\u" + t.substring(t.length() - 4)); + } else { + builder.append(chr); + } + break; + } + } + builder.append('"'); + + return builder.toString(); + } + + /** + * Encode text as UTF-8 + * + * @param text the text to encode + * @return the encoded text, as UTF-8 + */ + private static String urlEncode(final String text) throws UnsupportedEncodingException { + return URLEncoder.encode(text, "UTF-8"); + } + + /** + * Represents a custom graph on the website + */ + public static class Graph { + + /** + * The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is + * rejected + */ + private final String name; + + /** + * The set of plotters that are contained within this graph + */ + private final Set plotters = new LinkedHashSet(); + + private Graph(final String name) { + this.name = name; + } + + /** + * Gets the graph's name + * + * @return the Graph's name + */ + public String getName() { + return name; + } + + /** + * Add a plotter to the graph, which will be used to plot entries + * + * @param plotter the plotter to add to the graph + */ + public void addPlotter(final Plotter plotter) { + plotters.add(plotter); + } + + /** + * Remove a plotter from the graph + * + * @param plotter the plotter to remove from the graph + */ + public void removePlotter(final Plotter plotter) { + plotters.remove(plotter); + } + + /** + * Gets an unmodifiable set of the plotter objects in the graph + * + * @return an unmodifiable {@link java.util.Set} of the plotter objects + */ + public Set getPlotters() { + return Collections.unmodifiableSet(plotters); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public boolean equals(final Object object) { + if (!(object instanceof Graph)) { + return false; + } + + final Graph graph = (Graph) object; + return graph.name.equals(name); + } + + /** + * Called when the server owner decides to opt-out of BukkitMetrics while the server is running. + */ + protected void onOptOut() { + } + } + + /** + * Interface used to collect custom data for a plugin + */ + public static abstract class Plotter { + + /** + * The plot's name + */ + private final String name; + + /** + * Construct a plotter with the default plot name + */ + public Plotter() { + this("Default"); + } + + /** + * Construct a plotter with a specific plot name + * + * @param name the name of the plotter to use, which will show up on the website + */ + public Plotter(final String name) { + this.name = name; + } + + /** + * Get the current value for the plotted point. Since this function defers to an external function it may or may + * not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called + * from any thread so care should be taken when accessing resources that need to be synchronized. + * + * @return the current value for the point to be plotted. + */ + public abstract int getValue(); + + /** + * Get the column name for the plotted point + * + * @return the plotted point's column name + */ + public String getColumnName() { + return name; + } + + /** + * Called after the website graphs have been updated + */ + public void reset() { + } + + @Override + public int hashCode() { + return getColumnName().hashCode(); + } + + @Override + public boolean equals(final Object object) { + if (!(object instanceof Plotter)) { + return false; + } + + final Plotter plotter = (Plotter) object; + return plotter.name.equals(name) && plotter.getValue() == getValue(); + } + } +} + diff --git a/src/main/java/com/extrahardmode/metrics/README.md b/src/main/java/com/extrahardmode/metrics/README.md index bf83a553..c3a01ebd 100644 --- a/src/main/java/com/extrahardmode/metrics/README.md +++ b/src/main/java/com/extrahardmode/metrics/README.md @@ -1,5 +1,4 @@ ## Metrics ---------- -We shade the metrics classes into this directory. We log what modules are enabled and in how many worlds. \ No newline at end of file From 608db454bbd817f0d527c176dada35223d6aaf29 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 11 Mar 2016 09:25:39 -0800 Subject: [PATCH 024/252] 3.7.2: bug fixes for #21 + #26 Fix getArmorPoints NPE by checking for null (assumption is it used to return air, hence no nullcheck) Ignore custom biomes which cause a spigot error to be thrown when using getBiome --- .../java/com/extrahardmode/features/Tutorial.java | 15 ++++++++++----- .../com/extrahardmode/module/EntityHelper.java | 2 ++ .../com/extrahardmode/module/PlayerModule.java | 6 ++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Tutorial.java b/src/main/java/com/extrahardmode/features/Tutorial.java index 32b72baa..609bace1 100644 --- a/src/main/java/com/extrahardmode/features/Tutorial.java +++ b/src/main/java/com/extrahardmode/features/Tutorial.java @@ -263,15 +263,20 @@ public void onBlockPlace(BlockPlaceEvent event) //Warn players before they build big farms in the desert if (block.getType() == Material.DIRT) { - switch (block.getBiome()) + try { - case DESERT: - case DESERT_HILLS: + switch (block.getBiome()) { - messenger.send(player, MessageNode.ANTIFARMING_DESSERT_WARNING); - break; + case DESERT: + case DESERT_HILLS: + { + messenger.send(player, MessageNode.ANTIFARMING_DESSERT_WARNING); + break; + } } } + catch (IllegalArgumentException e) {} //ignore custom biomes + } } } diff --git a/src/main/java/com/extrahardmode/module/EntityHelper.java b/src/main/java/com/extrahardmode/module/EntityHelper.java index 91bd0503..d5be3f74 100644 --- a/src/main/java/com/extrahardmode/module/EntityHelper.java +++ b/src/main/java/com/extrahardmode/module/EntityHelper.java @@ -307,6 +307,8 @@ public static boolean arePlayersNearby(Location loc, double distance) List otherEntities = loc.getWorld().getPlayers(); for (Player player : otherEntities) { + //if (player.getLocation().getWorld() != loc.getWorld()) //Perhaps in the rare case of an async player teleport? This shouldn't ever be true but there was a bug report on it :S + //continue; double playerDist = player.getLocation().distanceSquared(loc); if (playerDist < squared) return true; diff --git a/src/main/java/com/extrahardmode/module/PlayerModule.java b/src/main/java/com/extrahardmode/module/PlayerModule.java index 02617d1a..e8dc12ff 100644 --- a/src/main/java/com/extrahardmode/module/PlayerModule.java +++ b/src/main/java/com/extrahardmode/module/PlayerModule.java @@ -33,6 +33,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.scheduler.BukkitScheduler; /** * Player centric actions @@ -163,6 +164,11 @@ public static float getArmorPoints(final Player player) int i = 0; for (ItemStack armor : player.getInventory().getArmorContents()) { + if (armor == null) //itemstacks now return null in 1.9 instead of air (CB change) + { + i++; + continue; + } switch (i) { //HEAD From e7c1d35590e122b8808bbec9d294a99ac384cb75 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 11 Mar 2016 09:55:51 -0800 Subject: [PATCH 025/252] bump version to 3.7.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7a26bacf..fa19d5e9 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.7.1 + 3.7.2 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From f8abea7e740f4a55942e9f8ae8f45966070e66ae Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 6 Apr 2016 08:37:58 -0700 Subject: [PATCH 026/252] force travis to use maven --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index dff5f3a5..9764f709 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,2 @@ language: java +script: mvn test \ No newline at end of file From 283c5d01bd6f19b43875e9d2ff1bdfbb662b9e10 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 6 Apr 2016 08:58:27 -0700 Subject: [PATCH 027/252] tell travis to listen to us --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9764f709..5f566097 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,2 +1 @@ -language: java -script: mvn test \ No newline at end of file +script: mvn test From 7e130fcf5346c3faf35c937f987f83afcff4bf65 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 9 Apr 2016 22:54:42 -0700 Subject: [PATCH 028/252] Fix Zombie heads replacing non-solid blocks. Closes #12 --- .../java/com/extrahardmode/features/monsters/Zombies.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index 537e63df..cdf45c4d 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -36,6 +36,7 @@ import com.extrahardmode.service.OurRandom; import com.extrahardmode.service.config.customtypes.PotionEffectHolder; import com.extrahardmode.task.RespawnZombieTask; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.SkullType; import org.bukkit.World; @@ -128,6 +129,13 @@ public void onEntityDeath(EntityDeathEvent event) if (placeSkulls && (type != Material.WATER && type != Material.STATIONARY_WATER)) { Block block = entity.getLocation().getBlock(); + //Don't replace blocks that aren't air, but aren't solid either + if (!block.getType().isSolid()) + { + Location location = block.getLocation(); + location.setY(location.getY() + 1); + block = location.getBlock(); + } block.setType(Material.SKULL); Skull skull = (Skull) block.getState(); skull.setSkullType(SkullType.ZOMBIE); From 4028bcbea8016c9892adb90950a74903775f8f13 Mon Sep 17 00:00:00 2001 From: Vanmc Date: Sat, 16 Apr 2016 04:12:32 +0800 Subject: [PATCH 029/252] Add Animal Overcrowding Control feature Closes #9 --- pom.xml | 8 +- .../java/com/extrahardmode/ExtraHardMode.java | 1 + .../com/extrahardmode/config/RootNode.java | 10 +- .../config/messages/MessageNode.java | 7 +- .../features/AnimalCrowdControl.java | 185 ++++++++++++++++++ .../extrahardmode/metrics/ConfigPlotter.java | 1 + 6 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/extrahardmode/features/AnimalCrowdControl.java diff --git a/pom.xml b/pom.xml index fa19d5e9..24de16ad 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.9 + 1.9.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ @@ -144,10 +144,10 @@ - + - org.bukkit - bukkit + org.spigotmc + spigot-api ${mc-version}-${bukkit-ver} compile diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 61628683..a3b64f92 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -96,6 +96,7 @@ public void onEnable() //Basic Modules registerModule(AntiFarming.class, new AntiFarming(this)); + registerModule(AnimalCrowdControl.class, new AnimalCrowdControl(this)); registerModule(AntiGrinder.class, new AntiGrinder(this)); registerModule(DebugMode.class, new DebugMode(this)); registerModule(Explosions.class, new Explosions(this)); diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 5cf6c4ed..cc60b522 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -775,7 +775,15 @@ public enum RootNode implements ConfigNode * Disable drops from Iron Golems, especially iron? */ IRON_GOLEM_NERF("Farming.Iron Golem Nerf", VarType.BOOLEAN, true), - + /** + * Prevent animal overcrowding on a small area + */ + ANIMAL_OVERCROWD_CONTROL("Farming.Animal Overcrowding Control.Enable", VarType.BOOLEAN, true), + /** + * Threshold/Number of animals before start damaging animals + */ + ANIMAL_OVERCROWD_THRESHOLD("Farming.Animal Overcrowding Control.threshold", VarType.INTEGER, SubType.NATURAL_NUMBER, 10, + "Maximum amount of animals allowed in a small area before they start dying"), /** * ############################# * # ADDITIONAL FALLING BLOCKS # diff --git a/src/main/java/com/extrahardmode/config/messages/MessageNode.java b/src/main/java/com/extrahardmode/config/messages/MessageNode.java index 60a7191d..ac3dfa0e 100644 --- a/src/main/java/com/extrahardmode/config/messages/MessageNode.java +++ b/src/main/java/com/extrahardmode/config/messages/MessageNode.java @@ -286,7 +286,12 @@ public enum MessageNode implements ConfigNode ANTIFARMING_DESSERT_WARNING ("AntifarmingDesert.Msg", MsgCategory.TUTORIAL, "antifarm_desert", "&cDeserts are really dry and nothing grows here!"), - + ANIMAL_OVERCROWD_CONTROL_MODE + ("AnimalOverCrowd.Mode", MsgCategory.NOTIFICATION), + ANIMAL_OVERCROWD_CONTROL + ("AnimalOverCrowd.Msg", MsgCategory.NOTIFICATION, "animal_overcrowd", + "&cAnimals need space! Consider putting them in a bigger area"), + //General Advice NETHER_WARNING_MODE ("NetherWarning.Mode", MsgCategory.TUTORIAL), diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java new file mode 100644 index 00000000..b4cdd792 --- /dev/null +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -0,0 +1,185 @@ +package com.extrahardmode.features; + +import com.extrahardmode.ExtraHardMode; +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.config.messages.MessageNode; +import com.extrahardmode.module.MsgModule; +import com.extrahardmode.service.ListenerModule; +import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.World; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +/** + * + * @author Vanmc + */ +public class AnimalCrowdControl extends ListenerModule { + + private RootConfig CFG; + + private MsgModule messenger; + + public AnimalCrowdControl(ExtraHardMode plugin) { + super(plugin); + } + + @Override + public void starting() { + super.starting(); + CFG = plugin.getModuleForClass(RootConfig.class); + messenger = plugin.getModuleForClass(MsgModule.class); + } + + private boolean isEntityAnimal(Entity a) { + return a instanceof Animals + && a.getType() != EntityType.HORSE + && a.getType() != EntityType.WOLF + && a.getType() != EntityType.OCELOT; + } + + private int getCurrentDensity(Entity e) { + + List cattle = e.getNearbyEntities(3, 3, 3); + int density = 0; + + //this will be used to check if animal is far from other animals + for (Entity a : cattle) { + if (isEntityAnimal(a)) { + density++; + } + } + + return density; + } + + /** + * When farm gets overcrowded + * + * Check if overcrowded if so slowly kill farm animals + */ + @EventHandler + public void onAnimalOverCrowd(CreatureSpawnEvent event) { + final Entity e = event.getEntity(); + final World world = e.getWorld(); + + final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); + final int threshold = CFG.getInt(RootNode.ANIMAL_OVERCROWD_THRESHOLD, world.getName()); + + //First check if config allow this feature + if (!animalOverCrowdControl) return; + //Get nearby entities from newly spawn animals + + //Just to check if animal is part of a Pet Plugin assuming spawned pet have nametags already given + if(e.getCustomName()!= null) return; + + List cattle = e.getNearbyEntities(3, 3, 3); + int density = 0; + + /** + * Loop and check if entity is an animal while looping count how many + * animals have spawned by incrementing density + */ + for (Entity a : cattle) { + if (!isEntityAnimal(a)) continue; + density++; + + + //Check if the amount of animals is bigger than the threshold given + if (density < threshold) continue; + final LivingEntity animal = (LivingEntity) a; + if(animal.hasMetadata("hasRunnable")) continue; + /** + * This creates a runnable assign to each animals will close once if + * animal is far enough from other animals or animal is dead + */ + animal.setMetadata("hasRunnable", new FixedMetadataValue(this.plugin, true)); + new BukkitRunnable() { + + int dizzenes = 0; + int maxDizzenes = 10; //basically max seconds before getting damaged + + @Override + public void run() { + + + if (animal.isDead() || getCurrentDensity(e) <= threshold) { + animal.removeMetadata("hasRunnable", plugin); + animal.removeMetadata("isClaustrophobic", plugin); + this.cancel(); + } else if (dizzenes >= maxDizzenes) { + /** + * Hack to force animal to move away exploits the + * default AI of animals the set Velocity make sure that + * no knockback is given + */ + animal.damage(0.5, animal); + animal.setVelocity(new Vector()); + dizzenes = 0; + } + + if(!(animal.hasMetadata("isClaustrophobic"))) { + animal.setMetadata("isClaustrophobic", new FixedMetadataValue(plugin, true)); + } + + if(dizzenes < maxDizzenes) { + world.spigot().playEffect(animal.getLocation(), Effect.VILLAGER_THUNDERCLOUD); + } + dizzenes++; + } + }.runTaskTimer(this.plugin, 20, 20); + } + } + + /** + * OnPlayerInteract for Animal Overcrowding Control + * + * display a message about Animal Overcrowding Control + */ + @EventHandler + public void onPlayerInteract(PlayerInteractEntityEvent event) { + Player player = event.getPlayer(); + LivingEntity animal = (LivingEntity) event.getRightClicked(); + World world = player.getWorld(); + + final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); + + if (animalOverCrowdControl && isEntityAnimal(animal) + && animal.hasMetadata("isClaustrophobic")) { + messenger.send(player, MessageNode.ANIMAL_OVERCROWD_CONTROL); + } + } + + /** + * On Animal Death for Animal Overcrowding Control + * + * remove drops and exp from death cause not by player + */ + @EventHandler + public void onAnimalDeath(EntityDeathEvent event) { + LivingEntity animal = event.getEntity(); + World world = animal.getWorld(); + + final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); + + if (animalOverCrowdControl && animal.hasMetadata("isClaustrophobic") + && isEntityAnimal(animal)) { + + event.getDrops().clear(); + } + } + +} diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java index c445be85..f7f5c4ac 100644 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -79,6 +79,7 @@ public int getValue() { case ALWAYS_ANGRY_PIG_ZOMBIES: case ANIMAL_EXP_NERF: + case ANIMAL_OVERCROWD_CONTROL: case BETTER_TNT: case BETTER_TREE_CHOPPING: case BLAZES_EXPLODE_ON_DEATH: From edb144ea5b844ab1caeaaf9a4060ab7dcd8f1abb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 15 Apr 2016 13:13:34 -0700 Subject: [PATCH 030/252] Bump version to 3.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24de16ad..e38d354e 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.7.2 + 3.8 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 931814089a280d5285eee62d29c6b24ed97df46a Mon Sep 17 00:00:00 2001 From: Vanmc Date: Mon, 25 Apr 2016 03:46:22 +0800 Subject: [PATCH 031/252] Fix on zombie head bug (#36) * Quick fix on zombie head bug where it spawns 2 blocks up to the ground because of https://github.com/MLG-Fortress/ExtraHardMode/commit/7e130fcf5346c3faf35c937f987f83afcff4bf65 * Just replaced block.getType().isSolid() with block.getType() != Material.AIR isSolid does not include slabs and probably some other things also changed tempBlock entity.getLocation() to skull.getLocation() to fix the issue of skulls not despawning after a zombie is revived --- .../java/com/extrahardmode/features/monsters/Zombies.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index cdf45c4d..bfededb8 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -130,10 +130,10 @@ public void onEntityDeath(EntityDeathEvent event) { Block block = entity.getLocation().getBlock(); //Don't replace blocks that aren't air, but aren't solid either - if (!block.getType().isSolid()) + if (block.getType() != Material.AIR) { Location location = block.getLocation(); - location.setY(location.getY() + 1); + location.setY(location.getY()+1); block = location.getBlock(); } block.setType(Material.SKULL); @@ -143,7 +143,7 @@ public void onEntityDeath(EntityDeathEvent event) BlockFace[] faces = BlockModule.getHorizontalAdjacentFaces(); skull.setRotation(faces[OurRandom.nextInt(faces.length)]); skull.update(); - tempBlock = temporaryBlockHandler.addTemporaryBlock(entity.getLocation(), "respawn_skull"); + tempBlock = temporaryBlockHandler.addTemporaryBlock(skull.getLocation(), "respawn_skull"); } RespawnZombieTask task = new RespawnZombieTask(plugin, entity.getLocation(), player, tempBlock); int respawnSeconds = plugin.getRandom().nextInt(6) + 3; // 3-8 seconds From df6e5d46309a2f0b2bc9634beabd29111b9651b0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 24 Apr 2016 12:51:34 -0700 Subject: [PATCH 032/252] Bump version to 3.8.1 and switch to paper repo Idk what md_5 is doing with the spigot repo --- pom.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e38d354e..a7ae2c48 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8 + 3.8.1 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode @@ -132,6 +132,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + destroystokyo-repo + https://repo.destroystokyo.com/content/groups/public/ + sk89q-repo http://maven.sk89q.com/repo/ @@ -146,8 +150,8 @@ - org.spigotmc - spigot-api + com.destroystokyo.paper + paper-api ${mc-version}-${bukkit-ver} compile From 5b39bdccaa9de9e4d51db180ec6baab8a5754923 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 26 Apr 2016 13:04:15 -0700 Subject: [PATCH 033/252] Fix #38 & some minor tweaks * We don't care if event is canceled * We don't care if entity is not an animal * No need to check for instanceof animal if we can just cast an entity to Animal in the first place. --- .../features/AnimalCrowdControl.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index b4cdd792..95de584d 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -7,13 +7,11 @@ import com.extrahardmode.module.MsgModule; import com.extrahardmode.service.ListenerModule; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.World; import org.bukkit.entity.Animals; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -45,8 +43,7 @@ public void starting() { } private boolean isEntityAnimal(Entity a) { - return a instanceof Animals - && a.getType() != EntityType.HORSE + return a.getType() != EntityType.HORSE && a.getType() != EntityType.WOLF && a.getType() != EntityType.OCELOT; } @@ -71,9 +68,13 @@ private int getCurrentDensity(Entity e) { * * Check if overcrowded if so slowly kill farm animals */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onAnimalOverCrowd(CreatureSpawnEvent event) { final Entity e = event.getEntity(); + + //If entity is not an animal, we don't care + if (!(e instanceof Animals)) return; + final World world = e.getWorld(); final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); @@ -81,10 +82,11 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { //First check if config allow this feature if (!animalOverCrowdControl) return; - //Get nearby entities from newly spawn animals + + //Get nearby entities from newly spawned animals //Just to check if animal is part of a Pet Plugin assuming spawned pet have nametags already given - if(e.getCustomName()!= null) return; + if(e.getCustomName() != null) return; List cattle = e.getNearbyEntities(3, 3, 3); int density = 0; @@ -100,7 +102,7 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { //Check if the amount of animals is bigger than the threshold given if (density < threshold) continue; - final LivingEntity animal = (LivingEntity) a; + final Animals animal = (Animals) a; if(animal.hasMetadata("hasRunnable")) continue; /** * This creates a runnable assign to each animals will close once if @@ -149,10 +151,13 @@ public void run() { * * display a message about Animal Overcrowding Control */ - @EventHandler - public void onPlayerInteract(PlayerInteractEntityEvent event) { + @EventHandler(ignoreCancelled = true) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + //If the entity is not an animal, we don't care + if (!(event.getRightClicked() instanceof Animals)) return; + Player player = event.getPlayer(); - LivingEntity animal = (LivingEntity) event.getRightClicked(); + Animals animal = (Animals)event.getRightClicked(); World world = player.getWorld(); final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); @@ -168,9 +173,12 @@ public void onPlayerInteract(PlayerInteractEntityEvent event) { * * remove drops and exp from death cause not by player */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onAnimalDeath(EntityDeathEvent event) { - LivingEntity animal = event.getEntity(); + //If the entity is not an animal, we don't care + if (!(event.getEntity() instanceof Animals)) return; + + Animals animal = (Animals)event.getEntity(); World world = animal.getWorld(); final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); From 3590d5dc2a1d88c536b1e1e36f8575afe3e9d8f8 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 26 Apr 2016 13:06:16 -0700 Subject: [PATCH 034/252] Version bump to 3.8.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a7ae2c48..0d2e5e09 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.1 + 3.8.2 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 28687ec952b56e1c19616fb7eb0f13c84d3866bb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 26 Apr 2016 18:47:46 -0700 Subject: [PATCH 035/252] Update travis to use Java 8 (#37) --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5f566097..d8220495 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,3 @@ script: mvn test +jdk: + - oraclejdk8 From 469d75020a41a35fc5151c136ffa603a9727bfce Mon Sep 17 00:00:00 2001 From: Vanmc Date: Thu, 28 Apr 2016 13:43:30 +0800 Subject: [PATCH 036/252] Fix color encoding on scoreboard notifier + casing on config node If you have a duplicate "Threshold" config node, the one with the capital "T" is the correct one. --- pom.xml | 12 +++-- .../com/extrahardmode/config/RootNode.java | 2 +- .../config/messages/MessageNode.java | 50 +++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index 0d2e5e09..4ab7173c 100644 --- a/pom.xml +++ b/pom.xml @@ -130,16 +130,18 @@ spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + http://hub.spigotmc.org/nexus/content/repositories/snapshots/ + destroystokyo-repo https://repo.destroystokyo.com/content/groups/public/ + - sk89q-repo - http://maven.sk89q.com/repo/ - + sk89q-repo + http://maven.sk89q.com/repo/ + diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index cc60b522..7dfb3902 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -782,7 +782,7 @@ public enum RootNode implements ConfigNode /** * Threshold/Number of animals before start damaging animals */ - ANIMAL_OVERCROWD_THRESHOLD("Farming.Animal Overcrowding Control.threshold", VarType.INTEGER, SubType.NATURAL_NUMBER, 10, + ANIMAL_OVERCROWD_THRESHOLD("Farming.Animal Overcrowding Control.Threshold", VarType.INTEGER, SubType.NATURAL_NUMBER, 10, "Maximum amount of animals allowed in a small area before they start dying"), /** * ############################# diff --git a/src/main/java/com/extrahardmode/config/messages/MessageNode.java b/src/main/java/com/extrahardmode/config/messages/MessageNode.java index ac3dfa0e..dd881c03 100644 --- a/src/main/java/com/extrahardmode/config/messages/MessageNode.java +++ b/src/main/java/com/extrahardmode/config/messages/MessageNode.java @@ -24,8 +24,6 @@ import com.extrahardmode.service.config.ConfigNode; -import org.bukkit.ChatColor; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -42,7 +40,7 @@ public enum MessageNode implements ConfigNode /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ - SB_MSG_TITLE("Display Messages In Scoreboard.Scoreboard Title", VarType.STRING, SubType.PLAYER_NAME, ChatColor.RED + "ExtraHardMode"), + SB_MSG_TITLE("Display Messages In Scoreboard.Scoreboard Title", VarType.STRING, SubType.PLAYER_NAME, "ExtraHardMode"), /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ @@ -58,7 +56,7 @@ public enum MessageNode implements ConfigNode /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ - SB_MSG_NOTIFICATION_TEXT_CLR("Display Messages In Scoreboard.Notification.Textcolor", VarType.COLOR, "NONE"), + SB_MSG_NOTIFICATION_TEXT_CLR("Display Messages In Scoreboard.Notification.Textcolor", VarType.COLOR, "YELLOW"), /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? @@ -71,7 +69,7 @@ public enum MessageNode implements ConfigNode /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ - SB_MSG_TUTORIAL_TEXT_CLR("Display Messages In Scoreboard.Tutorial.Textcolor", VarType.COLOR, "NONE"), + SB_MSG_TUTORIAL_TEXT_CLR("Display Messages In Scoreboard.Tutorial.Textcolor", VarType.COLOR, "RED"), /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? @@ -84,7 +82,7 @@ public enum MessageNode implements ConfigNode /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ - SB_MSG_BROADCAST_TEXT_CLR("Display Messages In Scoreboard.Broadcast.Textcolor", VarType.COLOR, "NONE"), + SB_MSG_BROADCAST_TEXT_CLR("Display Messages In Scoreboard.Broadcast.Textcolor", VarType.COLOR, "GREEN"), //Mode-Nodes have to be have the exact same name + _MODE @@ -191,74 +189,74 @@ public enum MessageNode implements ConfigNode ("ChargedCreeper.Mode", MsgCategory.TUTORIAL), CHARGED_CREEPER_TARGET ("ChargedCreeper.Msg", MsgCategory.TUTORIAL, "charged_creeper", - "&cCharged Creepers explode instantly when hit. Run!"), + "Charged Creepers explode instantly when hit. Run!"), BLAZE_TARGET_NORMAL_MODE ("BlazeOverworld.Mode", MsgCategory.TUTORIAL), BLAZE_TARGET_NORMAL ("BlazeOverworld.Msg", MsgCategory.TUTORIAL, "blaze_overworld", - "&cBlazes spawn near lava and their fiery breath causes a big explosion on death!"), + "Blazes spawn near lava and their fiery breath causes a big explosion on death!"), BLAZE_TARGET_NETHER_MODE ("BlazeNether.Mode", MsgCategory.TUTORIAL), BLAZE_TARGET_NETHER ("BlazeNether.Msg", MsgCategory.TUTORIAL, "blaze_nether", - "&cBlazes spawn everywhere in the Nether and may split on death!"), + "Blazes spawn everywhere in the Nether and may split on death!"), MAGMACUBE_TARGET_MODE ("Magmacube.Mode", MsgCategory.TUTORIAL), MAGMACUBE_TARGET ("Magmacube.Msg", MsgCategory.TUTORIAL, "magmacube", - "&cThese small buggers actually are just disguised blazes!"), + "These small buggers actually are just disguised blazes!"), GHAST_TARGET_MODE ("Ghast.Mode", MsgCategory.TUTORIAL), GHAST_TARGET ("Ghast.Msg", MsgCategory.TUTORIAL, "ghast_warning", - "&cThese fearsome Ghasts wear invisible arrow deflective armor! Ghasts drop a lot more loot as well."), + "These fearsome Ghasts wear invisible arrow deflective armor! Ghasts drop a lot more loot as well."), PIGZOMBIE_TARGET_MODE ("PigZombieAlwaysAngry.Mode", MsgCategory.TUTORIAL), PIGZOMBIE_TARGET ("PigZombieAlwaysAngry.Msg", MsgCategory.TUTORIAL, "pigzombie", - "&cRUN! Pig Zombies are always angry and hungry!"), + "RUN! Pig Zombies are always angry and hungry!"), PIGZOMBIE_TARGET_WART_MODE ("PigZombieDropNetherwart.Mode", MsgCategory.TUTORIAL), PIGZOMBIE_TARGET_WART ("PigZombieDropNetherwart.Msg", MsgCategory.TUTORIAL, "pigzombie_wart", - "&cYou can get netherwart from slaying Pig Zombies"), + "You can get netherwart from slaying Pig Zombies"), //Various Own Events ZOMBIE_RESPAWN_MODE ("ZombieRespawn.Mode", MsgCategory.TUTORIAL), ZOMBIE_RESPAWN ("ZombieRespawn.Msg", MsgCategory.TUTORIAL, "zombie_respawn", - "&cZombies might resurrect if not on fire!"), + "Zombies might resurrect if not on fire!"), ZOMBIE_SLOW_PLAYERS_MODE ("ZombieSlowPlayer.Mode", MsgCategory.TUTORIAL), ZOMBIE_SLOW_PLAYERS ("ZombieSlowPlayer.Msg", MsgCategory.TUTORIAL, "zombie_slow", - "&cZombies slow you down when hit!"), + "Zombies slow you down when hit!"), SKELETON_DEFLECT_MODE ("SkeletonDeflectArrows.Mode", MsgCategory.TUTORIAL), SKELETON_DEFLECT ("SkeletonDeflectArrows.Msg", MsgCategory.TUTORIAL, "skeleton_deflect_arrow", - "&cArrows just pass through Skeletons, you gotta go close combat!"), + "Arrows just pass through Skeletons, you gotta go close combat!"), ENDERMAN_GENERAL_MODE ("EndermanGeneral.Mode", MsgCategory.TUTORIAL), ENDERMAN_GENERAL ("EndermanGeneral.Msg", MsgCategory.TUTORIAL, "enderman_teleport", - "&cEnderman can teleport you too!"), + "Enderman can teleport you too!"), CREEPER_DROP_TNT_MODE ("CreeperDropTnt.Mode", MsgCategory.TUTORIAL), CREEPER_DROP_TNT ("CreeperDropTnt.Msg", MsgCategory.TUTORIAL, "creeper_drop_tnt", - "&cCreepers may drop activated tnt on death!"), + "Creepers may drop activated tnt on death!"), EXTINGUISH_FIRE_MODE ("ExtinguishFire.Mode", MsgCategory.TUTORIAL), EXTINGUISH_FIRE ("ExtinguishFire.Msg", MsgCategory.TUTORIAL, "extinguish_fire", - "&cPutting out fire with your hand will catch you on fire."), + "Putting out fire with your hand will catch you on fire."), LOST_ITEMS_MODE ("ListLostItemsOnDeath.Mode", MsgCategory.NOTIFICATION), LOST_ITEMS ("ListLostItemsOnDeath.Msg", MsgCategory.NOTIFICATION, "lost_items_broadcast", - "&eYou managed to lose " + Variables.ITEMS.getVarName()), + "You managed to lose " + Variables.ITEMS.getVarName()), LOST_ITEMS_PLAYER_MODE ("InformPlayerOnLostItems.Mode", MsgCategory.TUTORIAL), LOST_ITEMS_PLAYER @@ -270,34 +268,34 @@ public enum MessageNode implements ConfigNode ("BucketFill.Mode", MsgCategory.TUTORIAL), BUCKET_FILL ("BucketFill.Msg", MsgCategory.TUTORIAL, "bucket_fill", - "&cYou can pick up water, but once you place it, it evaporates. Get some ice if you want to farm!"), + "You can pick up water, but once you place it, it evaporates. Get some ice if you want to farm!"), ANTIFARMING_UNWATERD_MODE ("AntifarmingUnwatered.Mode", MsgCategory.TUTORIAL), ANTIFARMING_UNWATERD ("AntifarmingUnwatered.Msg", MsgCategory.TUTORIAL, "antifarm_unwatered", - "&cYour crops need sufficient water, otherwise they\'ll dry out!"), + "Your crops need sufficient water, otherwise they\'ll dry out!"), ANTIFARMING_NO_LIGHT_MODE ("AntifarmingNotEnoughLight.Mode", MsgCategory.TUTORIAL), ANTIFARMING_NO_LIGHT ("AntifarmingNotEnoughLight.Msg", MsgCategory.TUTORIAL, "antifarm_natural_light", - "&cYour crops require natural light to grow!"), + "Your crops require natural light to grow!"), ANTIFARMING_DESSERT_WARNING_MODE ("AntifarmingDesert.Mode", MsgCategory.TUTORIAL), ANTIFARMING_DESSERT_WARNING ("AntifarmingDesert.Msg", MsgCategory.TUTORIAL, "antifarm_desert", - "&cDeserts are really dry and nothing grows here!"), + "Deserts are really dry and nothing grows here!"), ANIMAL_OVERCROWD_CONTROL_MODE ("AnimalOverCrowd.Mode", MsgCategory.NOTIFICATION), ANIMAL_OVERCROWD_CONTROL ("AnimalOverCrowd.Msg", MsgCategory.NOTIFICATION, "animal_overcrowd", - "&cAnimals need space! Consider putting them in a bigger area"), + "Animals need space! Consider putting them in a bigger area"), //General Advice NETHER_WARNING_MODE ("NetherWarning.Mode", MsgCategory.TUTORIAL), NETHER_WARNING ("NetherWarning.Msg", MsgCategory.TUTORIAL, "nether_warn", - "&cThis is a dangerous place. Make sure you come prepared with arrows and good gear."); + "This is a dangerous place. Make sure you come prepared with arrows and good gear."); /** * Path in the Config From e6f50cdbcc374c7bd28152a1fc256a71d2d611ef Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 27 Apr 2016 23:48:29 -0700 Subject: [PATCH 037/252] Bump version to 3.8.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4ab7173c..6e3d51c7 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.2 + 3.8.3 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 150c57d66182ddbce8a2c394af53fa1acc23111b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Apr 2016 10:26:16 -0700 Subject: [PATCH 038/252] Fix notifications not appearing in chat when scoreboard is disabled Part of #42 --- src/main/java/com/extrahardmode/module/MsgModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/module/MsgModule.java b/src/main/java/com/extrahardmode/module/MsgModule.java index 3cd6c82c..4cc6d5a2 100644 --- a/src/main/java/com/extrahardmode/module/MsgModule.java +++ b/src/main/java/com/extrahardmode/module/MsgModule.java @@ -119,7 +119,7 @@ private void send(Player player, MessageNode node, String message) { timeouts.put(player.getName(), node, now); String msgText = messages.getString(node); - if (manager != null) + if (manager != null && popupsAreEnabled(MsgCategory.TUTORIAL)) sendPopup(player, MsgCategory.TUTORIAL, msgText); else player.sendMessage(ChatColor.DARK_RED + plugin.getTag() + ChatColor.WHITE + " " + msgText); From 73bc167b3aef58c0841662d202f918b7a35e6a4d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Apr 2016 10:57:28 -0700 Subject: [PATCH 039/252] Add color code by default to title Although there is a color that can be used for the title, it is not used and is set as null in MsgConfig.sendPopup. While I could've made it use the value, there is no config option to set the color of the title message. And honestly, I see no need to do that for a single message. --- .../java/com/extrahardmode/config/messages/MessageNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/config/messages/MessageNode.java b/src/main/java/com/extrahardmode/config/messages/MessageNode.java index dd881c03..49e45ba3 100644 --- a/src/main/java/com/extrahardmode/config/messages/MessageNode.java +++ b/src/main/java/com/extrahardmode/config/messages/MessageNode.java @@ -40,7 +40,7 @@ public enum MessageNode implements ConfigNode /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ - SB_MSG_TITLE("Display Messages In Scoreboard.Scoreboard Title", VarType.STRING, SubType.PLAYER_NAME, "ExtraHardMode"), + SB_MSG_TITLE("Display Messages In Scoreboard.Scoreboard Title", VarType.STRING, SubType.PLAYER_NAME, "&cExtraHardMode"), /** * Display messages from extrahardmode in the scoreboard instead of spamming the chat? */ From c33403effe6eb8eb53f4f5af14687dbedfd30279 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Apr 2016 11:20:19 -0700 Subject: [PATCH 040/252] add instanceof check Since I removed it from the isEntityAnimal method, since everywhere else we use it we assume entity is already an instanceof Animals. Blah. --- .../com/extrahardmode/features/AnimalCrowdControl.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index 95de584d..d3dea573 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -82,12 +82,11 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { //First check if config allow this feature if (!animalOverCrowdControl) return; - - //Get nearby entities from newly spawned animals //Just to check if animal is part of a Pet Plugin assuming spawned pet have nametags already given if(e.getCustomName() != null) return; - + + //Get nearby entities from newly spawned animals List cattle = e.getNearbyEntities(3, 3, 3); int density = 0; @@ -96,7 +95,7 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { * animals have spawned by incrementing density */ for (Entity a : cattle) { - if (!isEntityAnimal(a)) continue; + if (!isEntityAnimal(a) && !(a instanceof Animals)) continue; density++; From d5341a1fb9e86ca659a2e0c8313e207dbfcbf18d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Apr 2016 11:34:09 -0700 Subject: [PATCH 041/252] Prepare for next version (3.8.4) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e3d51c7..a3263653 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.3 + 3.8.4 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 71482dae5f391d1ee59e5ec27ea5d63c74de845c Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 4 May 2016 09:49:50 -0700 Subject: [PATCH 042/252] slight refactor Hopefully will also resolve https://www.spigotmc.org/threads/extra-hard-mode.129354/page-2#post-1539223 --- .../features/AnimalCrowdControl.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index d3dea573..d5e97988 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -43,7 +43,8 @@ public void starting() { } private boolean isEntityAnimal(Entity a) { - return a.getType() != EntityType.HORSE + return (a instanceof Animals) + && a.getType() != EntityType.HORSE && a.getType() != EntityType.WOLF && a.getType() != EntityType.OCELOT; } @@ -73,7 +74,7 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { final Entity e = event.getEntity(); //If entity is not an animal, we don't care - if (!(e instanceof Animals)) return; + if (!isEntityAnimal(e)) return; final World world = e.getWorld(); @@ -95,7 +96,7 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { * animals have spawned by incrementing density */ for (Entity a : cattle) { - if (!isEntityAnimal(a) && !(a instanceof Animals)) continue; + if (!isEntityAnimal(a)) continue; density++; @@ -110,8 +111,8 @@ public void onAnimalOverCrowd(CreatureSpawnEvent event) { animal.setMetadata("hasRunnable", new FixedMetadataValue(this.plugin, true)); new BukkitRunnable() { - int dizzenes = 0; - int maxDizzenes = 10; //basically max seconds before getting damaged + int dizziness = 0; + int maxDizziness = 7; //basically max seconds before getting damaged @Override public void run() { @@ -121,25 +122,20 @@ public void run() { animal.removeMetadata("hasRunnable", plugin); animal.removeMetadata("isClaustrophobic", plugin); this.cancel(); - } else if (dizzenes >= maxDizzenes) { - /** - * Hack to force animal to move away exploits the - * default AI of animals the set Velocity make sure that - * no knockback is given - */ + } else if (dizziness >= maxDizziness) { animal.damage(0.5, animal); - animal.setVelocity(new Vector()); - dizzenes = 0; + animal.setVelocity(new Vector()); //Triggers animal's "run away" AI + dizziness = 0; } if(!(animal.hasMetadata("isClaustrophobic"))) { animal.setMetadata("isClaustrophobic", new FixedMetadataValue(plugin, true)); } - if(dizzenes < maxDizzenes) { + if(dizziness < maxDizziness) { world.spigot().playEffect(animal.getLocation(), Effect.VILLAGER_THUNDERCLOUD); } - dizzenes++; + dizziness++; } }.runTaskTimer(this.plugin, 20, 20); } @@ -153,7 +149,7 @@ public void run() { @EventHandler(ignoreCancelled = true) public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { //If the entity is not an animal, we don't care - if (!(event.getRightClicked() instanceof Animals)) return; + if (!isEntityAnimal(event.getRightClicked())) return; Player player = event.getPlayer(); Animals animal = (Animals)event.getRightClicked(); @@ -161,8 +157,7 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { final boolean animalOverCrowdControl = CFG.getBoolean(RootNode.ANIMAL_OVERCROWD_CONTROL, world.getName()); - if (animalOverCrowdControl && isEntityAnimal(animal) - && animal.hasMetadata("isClaustrophobic")) { + if (animalOverCrowdControl && animal.hasMetadata("isClaustrophobic")) { messenger.send(player, MessageNode.ANIMAL_OVERCROWD_CONTROL); } } @@ -175,7 +170,7 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { @EventHandler(ignoreCancelled = true) public void onAnimalDeath(EntityDeathEvent event) { //If the entity is not an animal, we don't care - if (!(event.getEntity() instanceof Animals)) return; + if (!isEntityAnimal(event.getEntity())) return; Animals animal = (Animals)event.getEntity(); World world = animal.getWorld(); From bd4014ec642c177165e4ec3936669d2463d9ad25 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 30 May 2016 00:35:28 -0700 Subject: [PATCH 043/252] Don't use monitor, especially when we're altering damage --- src/main/java/com/extrahardmode/features/Players.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 612751bf..e5b67306 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -187,7 +187,7 @@ public void onEntityDeath(PlayerDeathEvent event) /** * Environmental effects when player is damaged */ - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)//so we know if the event got cancelled + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)//so we know if the event got cancelled public void onEntityDamage(EntityDamageEvent event) { Entity entity = event.getEntity(); From 39043456c8186174747198b029fb0da9303dda24 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 30 May 2016 02:07:42 -0700 Subject: [PATCH 044/252] Don't set player speed if we have no need to do so Provides (some) other-plugin compatibility-niceness whatnot --- .../com/extrahardmode/task/ArmorWeightTask.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/task/ArmorWeightTask.java b/src/main/java/com/extrahardmode/task/ArmorWeightTask.java index 6854cb8d..d12c2ff8 100644 --- a/src/main/java/com/extrahardmode/task/ArmorWeightTask.java +++ b/src/main/java/com/extrahardmode/task/ArmorWeightTask.java @@ -30,6 +30,8 @@ public ArmorWeightTask(ExtraHardMode plugin) mMessenger = plugin.getModuleForClass(MsgModule.class); } + float previousSpeed = 0f; + @Override public void run() @@ -44,9 +46,16 @@ public void run() if (armorPoints != 0) { float value = basespeed * (1 - armorPoints / 0.8F * (slowdownPercent / 100F)); - player.setWalkSpeed(value); - } else + if (value != previousSpeed) + { + player.setWalkSpeed(value); + previousSpeed = value; + } + } else if (basespeed != previousSpeed) + { player.setWalkSpeed(basespeed); + previousSpeed = basespeed; + } } } } From e4b2418c2e5a7dd790834b66216fb5502c1d8ed3 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 30 May 2016 11:11:27 -0700 Subject: [PATCH 045/252] refactor ArmorWeightTask to be per-player --- .../java/com/extrahardmode/ExtraHardMode.java | 3 +- .../com/extrahardmode/features/Players.java | 32 +++++++++++++++++++ .../extrahardmode/task/ArmorWeightTask.java | 9 +++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index a3b64f92..cffc5459 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -155,13 +155,14 @@ public void onEnable() this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new WeightCheckTask(this), 20L * 5, 20L * 5); //Armor task + /* active = false; for (World world : getServer().getWorlds()) if (getModuleForClass(RootConfig.class).getBoolean(RootNode.ARMOR_SLOWDOWN_ENABLE, world.getName())) active = true; if (active) this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new ArmorWeightTask(this), 20L * 5, 20L * 3); - + */ //Metrics Plotter, this gets included by maven new ConfigPlotter(this, getModuleForClass(RootConfig.class)); } diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index e5b67306..87eacd50 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -35,6 +35,7 @@ import com.extrahardmode.service.config.customtypes.BlockType; import com.extrahardmode.service.config.customtypes.BlockTypeList; import com.extrahardmode.service.config.customtypes.PotionEffectHolder; +import com.extrahardmode.task.ArmorWeightTask; import com.extrahardmode.task.SetPlayerHealthAndFoodTask; import org.bukkit.Material; import org.bukkit.World; @@ -49,12 +50,15 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -69,6 +73,10 @@ public class Players extends ListenerModule private PlayerModule playerModule; + private boolean isArmorWeightEnabled = false; + + private Map armorCheckingPlayers = new HashMap(); + /** * Constructor @@ -85,6 +93,25 @@ public void starting() super.starting(); CFG = plugin.getModuleForClass(RootConfig.class); playerModule = plugin.getModuleForClass(PlayerModule.class); + for (World world : plugin.getServer().getWorlds()) + if (CFG.getBoolean(RootNode.ARMOR_SLOWDOWN_ENABLE, world.getName())) + { + isArmorWeightEnabled = true; + break; + } + } + + /** + * Armor weight task + * Using a runnable per-player instead of one runnable to iterate through all players + * allows us to be somewhat more compatible with other plugins that change player speed, + * by not constantly setting the player's walkspeed when not necessary. + */ + @EventHandler + void onPlayerJoin(PlayerJoinEvent event) + { + if (isArmorWeightEnabled) + armorCheckingPlayers.put(event.getPlayer(), plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new ArmorWeightTask(plugin, event.getPlayer()), 20L * 5, 20L * 3)); } @@ -350,5 +377,10 @@ void onPlayerInteract(PlayerInteractEvent event) public void onPlayerDisconnect(PlayerQuitEvent event) { event.getPlayer().setWalkSpeed(0.2F); + if (isArmorWeightEnabled) + { + int cancelId = armorCheckingPlayers.get(event.getPlayer()); + plugin.getServer().getScheduler().cancelTask(cancelId); + } } } diff --git a/src/main/java/com/extrahardmode/task/ArmorWeightTask.java b/src/main/java/com/extrahardmode/task/ArmorWeightTask.java index d12c2ff8..de532b23 100644 --- a/src/main/java/com/extrahardmode/task/ArmorWeightTask.java +++ b/src/main/java/com/extrahardmode/task/ArmorWeightTask.java @@ -20,14 +20,16 @@ public class ArmorWeightTask implements Runnable private final ExtraHardMode mPlugin; private final RootConfig CFG; private final MsgModule mMessenger; + private final Player player; private static Set mPlayerList = new HashSet(); - public ArmorWeightTask(ExtraHardMode plugin) + public ArmorWeightTask(ExtraHardMode plugin, Player player) { mPlugin = plugin; CFG = plugin.getModuleForClass(RootConfig.class); mMessenger = plugin.getModuleForClass(MsgModule.class); + this.player = player; } float previousSpeed = 0f; @@ -36,10 +38,8 @@ public ArmorWeightTask(ExtraHardMode plugin) @Override public void run() { - for (Player player : mPlugin.getServer().getOnlinePlayers()) - { if (!CFG.getBoolean(RootNode.ARMOR_SLOWDOWN_ENABLE, player.getWorld().getName())) - continue; + return; final float basespeed = (float) CFG.getDouble(RootNode.ARMOR_SLOWDOWN_BASESPEED, player.getWorld().getName()); final int slowdownPercent = CFG.getInt(RootNode.ARMOR_SLOWDOWN_PERCENT, player.getWorld().getName()); final float armorPoints = PlayerModule.getArmorPoints(player); @@ -56,6 +56,5 @@ public void run() player.setWalkSpeed(basespeed); previousSpeed = basespeed; } - } } } From 0883ccc6455c52eff7a94964ac3e05f6ec733e13 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 11 Jun 2016 11:49:49 -0700 Subject: [PATCH 046/252] Fix #47 Don't send a message if messages.yml node is empty/null --- src/main/java/com/extrahardmode/module/MsgModule.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/extrahardmode/module/MsgModule.java b/src/main/java/com/extrahardmode/module/MsgModule.java index 4cc6d5a2..6f55239a 100644 --- a/src/main/java/com/extrahardmode/module/MsgModule.java +++ b/src/main/java/com/extrahardmode/module/MsgModule.java @@ -157,6 +157,9 @@ public void broadcast(MessageNode node, FindAndReplace... replace) */ public void send(Player player, MessageNode node) { + //Don't send a message if node is empty/null + if (messages.getString(node).isEmpty() || messages.getString(node) == null) + return; send(player, node, messages.getString(node)); } From 0592adbe6c814b35075bd01fb23d740506513833 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 13 Jun 2016 22:06:14 -0700 Subject: [PATCH 047/252] bump version to 3.8.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a3263653..e6727f53 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.4 + 3.8.5 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 8889f867f41b9dc090b412fc9d7c6ebc55ac9a2d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 25 Aug 2016 19:41:27 -0700 Subject: [PATCH 048/252] "Fix" #49 --- src/main/java/com/extrahardmode/module/BlockModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index d448edc1..2dd6842a 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -110,7 +110,7 @@ public UUID applyPhysics(Block block, boolean damageEntities) if ((block.getType() == Material.GRASS || block.getType() == Material.MYCEL) && CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_TURN_TO_DIRT, block.getWorld().getName())) block.setType(Material.DIRT); - FallingBlock fallingBlock = block.getWorld().spawnFallingBlock(block.getLocation(), block.getTypeId(), block.getData()); + FallingBlock fallingBlock = block.getWorld().spawnFallingBlock(block.getLocation().add(0.5D, 0.0D, 0.5D), block.getTypeId(), block.getData()); fallingBlock.setDropItem(CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_DROP_ITEM, block.getWorld().getName())); // remove original block CompatHandler.logFallingBlockFall(block); From a22fbe43f81058fafe20cb5c0a0df70c688ff452 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 26 Aug 2016 20:56:44 -0700 Subject: [PATCH 049/252] Fix #18 --- pom.xml | 2 +- src/main/java/com/extrahardmode/task/MoreMonstersTask.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e6727f53..0b218d61 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.9.2 + 1.10.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/task/MoreMonstersTask.java b/src/main/java/com/extrahardmode/task/MoreMonstersTask.java index aeee38bd..464d1414 100644 --- a/src/main/java/com/extrahardmode/task/MoreMonstersTask.java +++ b/src/main/java/com/extrahardmode/task/MoreMonstersTask.java @@ -153,7 +153,10 @@ private Location verifyLocation(Location location) final int maxY = CFG.getInt(RootNode.MONSTER_SPAWNS_IN_LIGHT_MAX_Y, world.getName()); // Only spawn monsters in normal world. End is crowded with endermen and nether is too extreme anyway, add config later - int lightLvl = location.getBlock().getLightFromSky(); + int lightLvl = 15; + double yLoc = location.getY(); + if (yLoc > 255 || yLoc < 0) + lightLvl = location.getBlock().getLightFromSky(); boolean worldOk = world.getEnvironment() == World.Environment.NORMAL; boolean depthOk = location.getY() < maxY; From 31ffeaacc0a795804be96c7c9b96815334591771 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 26 Aug 2016 21:09:00 -0700 Subject: [PATCH 050/252] Fix #52 (add beetroot to weak crops feature) I might've missed something here as I haven't paid much attention to this feature myself --- src/main/java/com/extrahardmode/module/BlockModule.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 2dd6842a..0bc7bdc8 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -207,7 +207,7 @@ public boolean plantDies(Block block, MaterialData newDataValue) if (newDataValue.getData() >= 7) { Material material = block.getType(); - if (material == Material.CROPS || material == Material.CARROT || material == Material.POTATO) + if (material == Material.CROPS || material == Material.CARROT || material == Material.POTATO || material == Material.BEETROOT) { int deathProbability = lossRate; @@ -346,7 +346,8 @@ public boolean isPlant(Material material) || material.equals(Material.POTATO) || material.equals(Material.CARROT) || material.equals(Material.MELON_STEM) - || material.equals(Material.PUMPKIN_STEM); + || material.equals(Material.PUMPKIN_STEM) + || material.equals(Material.BEETROOT); } From 06954dedde314436aad411f8feebc59b66b2fd01 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 26 Aug 2016 21:24:41 -0700 Subject: [PATCH 051/252] Fix #16 via removing MORE_FALLING_BLOCKS_BREAK_TORCHES feature I'm not sure how this makes the game harder anyways, seems like it just makes the game more tedious at best... --- src/main/java/com/extrahardmode/module/BlockModule.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 0bc7bdc8..dc434726 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -116,8 +116,10 @@ public UUID applyPhysics(Block block, boolean damageEntities) CompatHandler.logFallingBlockFall(block); block.setType(Material.AIR); + /* final boolean breakTorches = CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_BREAK_TORCHES, block.getWorld().getName()); //TODO expand on this, it's only rudimentary, doesnt break torches if there are multiple fallingblocks (only breaks the first) + if (breakTorches) { Block current = block; @@ -137,6 +139,7 @@ public UUID applyPhysics(Block block, boolean damageEntities) below = current.getRelative(BlockFace.DOWN); } } + */ if (damageEntities) //mark so we know the block is from us EntityHelper.markForProcessing(plugin, fallingBlock); From 7c2d87c934a34bbff98350dbe348289df22c75a4 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 26 Aug 2016 22:18:43 -0700 Subject: [PATCH 052/252] "Fix" #53 No idea how reliable this is, but it seems it'll do the job for the most part. --- src/main/java/com/extrahardmode/features/Explosions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index b4f76c80..ff294ebc 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -114,7 +114,7 @@ public void regularExplosions(EntityExplodeEvent event) // TNT if (sourceEntity instanceof TNTPrimed) { - if (customTntExplosion) + if (customTntExplosion && event.getYield() == 0.25) { if (!multipleExplosions) { From 2b700103d4483a23b17fd382d6a8ee33bc3a93be Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 26 Aug 2016 22:36:59 -0700 Subject: [PATCH 053/252] version 3.8.6 --- pom.xml | 2 +- src/main/java/com/extrahardmode/features/Explosions.java | 2 +- src/main/java/com/extrahardmode/module/BlockModule.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 0b218d61..14c3833d 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.5 + 3.8.6 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index ff294ebc..92dcdf20 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -114,7 +114,7 @@ public void regularExplosions(EntityExplodeEvent event) // TNT if (sourceEntity instanceof TNTPrimed) { - if (customTntExplosion && event.getYield() == 0.25) + if (customTntExplosion && event.getYield() == 0.25) //getYield value of 0.25 somewhat insures this is a vanilla TNT explosion. { if (!multipleExplosions) { diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index dc434726..67eb48f2 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -119,7 +119,6 @@ public UUID applyPhysics(Block block, boolean damageEntities) /* final boolean breakTorches = CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_BREAK_TORCHES, block.getWorld().getName()); //TODO expand on this, it's only rudimentary, doesnt break torches if there are multiple fallingblocks (only breaks the first) - if (breakTorches) { Block current = block; From efa716cd2e2bbe0732cbd1fb883abb2a388586c9 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 27 Aug 2016 09:20:02 -0700 Subject: [PATCH 054/252] update paper repo --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 14c3833d..090bd050 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ destroystokyo-repo - https://repo.destroystokyo.com/content/groups/public/ + https://repo.destroystokyo.com/repository/maven-public/ From 99ac2daa14729d3cdac48b6d581f5d4ea83f7ef2 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Sep 2016 01:15:39 -0700 Subject: [PATCH 055/252] Fix #55 --- pom.xml | 8 ++++++++ .../com/extrahardmode/features/Players.java | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 090bd050..c86215ff 100644 --- a/pom.xml +++ b/pom.xml @@ -127,6 +127,14 @@ prism-repo http://dhmc.us:8081/nexus/content/repositories/releases/ + + md_5-releases + http://repo.md-5.net/content/repositories/releases/ + + + md_5-snapshots + http://repo.md-5.net/content/repositories/snapshots/ + spigot-repo diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 87eacd50..4ecf9867 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -49,10 +49,7 @@ import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -114,6 +111,18 @@ void onPlayerJoin(PlayerJoinEvent event) armorCheckingPlayers.put(event.getPlayer(), plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new ArmorWeightTask(plugin, event.getPlayer()), 20L * 5, 20L * 3)); } + /** + * Fix #55 (not resetting player speed when entering a EHM-disabled world) + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + void onPlayerChangeWorld(PlayerChangedWorldEvent event) + { + Player player = event.getPlayer(); + if (CFG.getBoolean(RootNode.ARMOR_SLOWDOWN_ENABLE, event.getFrom().getName())) + if (!CFG.getBoolean(RootNode.ARMOR_SLOWDOWN_ENABLE, player.getWorld().getName())) + player.setWalkSpeed(0.2f); + } + /** * FEATURE: respawning players start without full health or food From db5e5e96145645cddb6b0f5ac7d0016dcf7d26fc Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Sep 2016 01:37:41 -0700 Subject: [PATCH 056/252] Fix #53 (without quotation marks) --- src/main/java/com/extrahardmode/features/Explosions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index 92dcdf20..e13dc452 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -103,6 +103,7 @@ public void regularExplosions(EntityExplodeEvent event) final World world = event.getLocation().getWorld(); final Location location = sourceEntity.getLocation(); + final boolean flyOtherPlugins = CFG.getBoolean(RootNode.EXPLOSIONS_FYLING_BLOCKS_ENABLE_OTHER, world.getName()); final boolean customGhastExplosion = CFG.getBoolean(RootNode.EXPLOSIONS_GHASTS_ENABLE, world.getName()); final boolean customTntExplosion = CFG.getBoolean(RootNode.EXPLOSIONS_TNT_ENABLE, world.getName()); final boolean multipleExplosions = CFG.getBoolean(RootNode.BETTER_TNT, world.getName()); @@ -114,7 +115,6 @@ public void regularExplosions(EntityExplodeEvent event) // TNT if (sourceEntity instanceof TNTPrimed) { - if (customTntExplosion && event.getYield() == 0.25) //getYield value of 0.25 somewhat insures this is a vanilla TNT explosion. { if (!multipleExplosions) { From d586bd38d31d16846cb58eb88b4cd54925704ef3 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Sep 2016 01:37:51 -0700 Subject: [PATCH 057/252] github y u do dis --- src/main/java/com/extrahardmode/features/Explosions.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index e13dc452..338111c5 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -115,6 +115,7 @@ public void regularExplosions(EntityExplodeEvent event) // TNT if (sourceEntity instanceof TNTPrimed) { + if (customTntExplosion && event.blockList().size() != 0 && (flyOtherPlugins || event.getYield() == 0.25)) //getYield value of 0.25 somewhat ensures this is a vanilla TNT explosion. { if (!multipleExplosions) { From 83f43c1ae7ee2a2a4eb8698274b847b3f39e66ff Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 11 Sep 2016 14:20:32 -0700 Subject: [PATCH 058/252] Attempt to be more compatible with plugins that r dumb by making our event handler look at the blocklist later................. --- src/main/java/com/extrahardmode/features/Explosions.java | 2 +- src/main/resources/plugin.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index 338111c5..cdb7d7ef 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -93,7 +93,7 @@ public void starting() // | / _| (_ | |_| | |__ / _ \| / | |__ | |\__ \ | | | _|| .` | _|| / // |_|_\___\___|\___/|____/_/ \_\_|_\ |____|___|___/ |_| |___|_|\_|___|_|_\ // - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + @EventHandler(ignoreCancelled = true) public void regularExplosions(EntityExplodeEvent event) { if (event instanceof FakeEntityExplodeEvent || !(event.getEntity() instanceof Ghast || event.getEntity() instanceof TNTPrimed)) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 41c8eee9..c7a3b272 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,7 +7,7 @@ dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ author: Diemex authors: [Mitsugaru, Big_Scary, RoboMWM] #ensure that we are loaded after multiworld plugins -softdepend: [Multiverse-Core, My Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye] +softdepend: [Multiverse-Core, My Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] commands: ehm: description: Root command for ExtraHardMode From dc96803c90ed3abf16bb7b2de321f0292de1a80f Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 3 Oct 2016 10:41:56 -0700 Subject: [PATCH 059/252] Add "reload" support for the armor weight task Fixes #54 --- src/main/java/com/extrahardmode/features/Players.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 4ecf9867..0ab9d3e4 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -96,6 +96,12 @@ public void starting() isArmorWeightEnabled = true; break; } + //In case the plugin is reloaded... + if (isArmorWeightEnabled && plugin.getServer().getOnlinePlayers().size() > 0) + { + for (Player player : plugin.getServer().getOnlinePlayers()) + armorCheckingPlayers.put(player, plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new ArmorWeightTask(plugin, player), 20L * 5, 20L * 3)); + } } /** From 8ffc1b650bb6960def012aef81f8ede24ff8f32f Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 11 Nov 2016 00:39:36 -0800 Subject: [PATCH 060/252] change some handler priorities Idk I made these changes a while ago but didn't commit them I guess --- src/main/java/com/extrahardmode/features/Players.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 0ab9d3e4..47e9284a 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -120,7 +120,7 @@ void onPlayerJoin(PlayerJoinEvent event) /** * Fix #55 (not resetting player speed when entering a EHM-disabled world) */ - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.LOW) void onPlayerChangeWorld(PlayerChangedWorldEvent event) { Player player = event.getPlayer(); @@ -163,7 +163,7 @@ public void onPlayerRespawn(PlayerRespawnEvent respawnEvent) /** * When a Player dies he looses a percentage of his inventory */ - @EventHandler(ignoreCancelled = true) + @EventHandler public void onEntityDeath(PlayerDeathEvent event) { Player player = event.getEntity(); From 91e2ceaa03724d2d6da9335c83c36411027458a8 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 22 Nov 2016 21:21:22 -0800 Subject: [PATCH 061/252] v3.8.7: Call EntityChangeBlockEvent when we make blocks fall - Also compile against 1.11 API Unless you're aware of a better event to call, EntityChangeBlockEvent seems like the only event that makes sense to call, since World#spawnFallingBlock doesn't call any event... --- pom.xml | 4 ++-- src/main/java/com/extrahardmode/module/BlockModule.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c86215ff..b7f4a388 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.6 + 3.8.7 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.10.2 + 1.11 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 67eb48f2..dfb181c0 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -35,7 +35,9 @@ import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.EntityType; import org.bukkit.entity.FallingBlock; +import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.material.MaterialData; import org.bukkit.metadata.FixedMetadataValue; @@ -145,6 +147,9 @@ public UUID applyPhysics(Block block, boolean damageEntities) EntityHelper.markAsOurs(plugin, fallingBlock); + //TODO: Figure out how to make cancelable (ultra low priority) + plugin.getServer().getPluginManager().callEvent(new EntityChangeBlockEvent(null, block, Material.AIR, (byte)0)); + return fallingBlock.getUniqueId(); } From f5a5ee00b818144da3dda9f4e0dbd1f9578f9870 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 22 Nov 2016 21:28:45 -0800 Subject: [PATCH 062/252] FallingBlock is indeed an entity --- src/main/java/com/extrahardmode/module/BlockModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index dfb181c0..a75e0cd3 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -148,7 +148,7 @@ public UUID applyPhysics(Block block, boolean damageEntities) EntityHelper.markAsOurs(plugin, fallingBlock); //TODO: Figure out how to make cancelable (ultra low priority) - plugin.getServer().getPluginManager().callEvent(new EntityChangeBlockEvent(null, block, Material.AIR, (byte)0)); + plugin.getServer().getPluginManager().callEvent(new EntityChangeBlockEvent(fallingBlock, block, Material.AIR, (byte)0)); return fallingBlock.getUniqueId(); } From 8b0af28e247c6011545d433b0ba6c94880a6ceeb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 23 Nov 2016 14:24:25 -0800 Subject: [PATCH 063/252] No need to close if the statement is already closed --- src/main/java/com/extrahardmode/module/MsgPersistModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/module/MsgPersistModule.java b/src/main/java/com/extrahardmode/module/MsgPersistModule.java index fa8c34dc..1f6015cf 100644 --- a/src/main/java/com/extrahardmode/module/MsgPersistModule.java +++ b/src/main/java/com/extrahardmode/module/MsgPersistModule.java @@ -228,7 +228,7 @@ private void initializeTables() try { if (conn != null) conn.close(); - if (statement != null) statement.close(); + if (statement != null && !statement.isClosed()) statement.close(); } catch (SQLException e) { e.printStackTrace(); From 3e7e948d121e42528daa04a5d814918c1a3558cc Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 23 Nov 2016 14:24:53 -0800 Subject: [PATCH 064/252] v3.8.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b7f4a388..5c9c7659 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.7 + 3.8.8 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From f3fde9088712b5fd3320afee5da872d6f5b7137f Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 23 Nov 2016 14:28:20 -0800 Subject: [PATCH 065/252] Very likely that w/e new sqlite driver is automatically closing statements when connection is closed --- .../java/com/extrahardmode/module/MsgPersistModule.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/MsgPersistModule.java b/src/main/java/com/extrahardmode/module/MsgPersistModule.java index 1f6015cf..31d6504d 100644 --- a/src/main/java/com/extrahardmode/module/MsgPersistModule.java +++ b/src/main/java/com/extrahardmode/module/MsgPersistModule.java @@ -148,7 +148,7 @@ private int getPlayerId(String playerName) try { if (conn != null) conn.close(); - if (aStatement != null) aStatement.close(); + if (aStatement != null && !aStatement.isClosed()) aStatement.close(); if (resultSet != null) resultSet.close(); } catch (SQLException e) { @@ -281,7 +281,7 @@ private void set(MessageNode node, int playerId, int value) try { if (conn != null) conn.close(); - if (statement != null) statement.close(); + if (statement != null && !statement.isClosed()) statement.close(); } catch (SQLException e) { e.printStackTrace(); @@ -343,7 +343,7 @@ private int getCountFor(MessageNode node, int playerId) try { if (conn != null) conn.close(); - if (statement != null) statement.close(); + if (statement != null && !statement.isClosed()) statement.close(); if (result != null) result.close(); } catch (SQLException e) { From 35881bcfcd7d1ab22b139d42deada810c4d2f139 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 23 Nov 2016 14:30:34 -0800 Subject: [PATCH 066/252] Just add checks here too "Defensive coding" --- src/main/java/com/extrahardmode/module/MsgPersistModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/MsgPersistModule.java b/src/main/java/com/extrahardmode/module/MsgPersistModule.java index 31d6504d..50168274 100644 --- a/src/main/java/com/extrahardmode/module/MsgPersistModule.java +++ b/src/main/java/com/extrahardmode/module/MsgPersistModule.java @@ -149,7 +149,7 @@ private int getPlayerId(String playerName) { if (conn != null) conn.close(); if (aStatement != null && !aStatement.isClosed()) aStatement.close(); - if (resultSet != null) resultSet.close(); + if (resultSet != null && !resultSet.isClosed()) resultSet.close(); } catch (SQLException e) { e.printStackTrace(); @@ -344,7 +344,7 @@ private int getCountFor(MessageNode node, int playerId) { if (conn != null) conn.close(); if (statement != null && !statement.isClosed()) statement.close(); - if (result != null) result.close(); + if (result != null && !result.isClosed()) result.close(); } catch (SQLException e) { e.printStackTrace(); From 49437a8fd954231a514bd0e86f58980a4cc0d51e Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 23 Nov 2016 15:05:47 -0800 Subject: [PATCH 067/252] revert back to spigot api dependency for now Apparently tests were failing on my machine I use to build Java 7 compatible plugins... and since I recently cleaned my maven repo, I'm guessing it's failing because Paper is now Java 8-only. Anyways, yea, please update if you're still on Java 7 so I don't have to waste time and so you'll be secure... --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5c9c7659..7a1ee61b 100644 --- a/pom.xml +++ b/pom.xml @@ -160,8 +160,8 @@ - com.destroystokyo.paper - paper-api + org.spigotmc + spigot-api ${mc-version}-${bukkit-ver} provided From b48af4fc61146794df14f9b05a0bcf0ec7a76be2 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 24 Nov 2016 09:22:20 -0800 Subject: [PATCH 068/252] v3.8.9 Last try before I just comment the line out --- pom.xml | 2 +- .../com/extrahardmode/module/MsgPersistModule.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 7a1ee61b..ec256a63 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.8 + 3.8.9 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode diff --git a/src/main/java/com/extrahardmode/module/MsgPersistModule.java b/src/main/java/com/extrahardmode/module/MsgPersistModule.java index 50168274..6b12ff8d 100644 --- a/src/main/java/com/extrahardmode/module/MsgPersistModule.java +++ b/src/main/java/com/extrahardmode/module/MsgPersistModule.java @@ -147,9 +147,9 @@ private int getPlayerId(String playerName) { try { - if (conn != null) conn.close(); if (aStatement != null && !aStatement.isClosed()) aStatement.close(); if (resultSet != null && !resultSet.isClosed()) resultSet.close(); + if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); @@ -227,8 +227,8 @@ private void initializeTables() { try { - if (conn != null) conn.close(); if (statement != null && !statement.isClosed()) statement.close(); + if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); @@ -280,8 +280,8 @@ private void set(MessageNode node, int playerId, int value) { try { - if (conn != null) conn.close(); if (statement != null && !statement.isClosed()) statement.close(); + if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); @@ -342,9 +342,9 @@ private int getCountFor(MessageNode node, int playerId) { try { - if (conn != null) conn.close(); - if (statement != null && !statement.isClosed()) statement.close(); if (result != null && !result.isClosed()) result.close(); + if (statement != null && !statement.isClosed()) statement.close(); + if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); From 6c4d79bedbc92b3a43d0588c5b0c5a209fca82b9 Mon Sep 17 00:00:00 2001 From: Erik1988 Date: Tue, 10 Jan 2017 07:44:27 +0100 Subject: [PATCH 069/252] Tweaks to EnderDragon minion spawns (#64) * Fixed msg mode: DISABLED not working. Closes #50, #63 * updated pom to match WG's latest version. * Improved enderdragon attacks. "It replaces some of the blaze spawns with skeletons and zombies." https://github.com/MLG-Fortress/ExtraHardMode/pull/64#issuecomment-271144840 * Made the preceding enderdragon changes optional. --- pom.xml | 6 +- .../com/extrahardmode/config/RootNode.java | 5 + .../features/monsters/Glydia.java | 199 +++++++++++++----- .../com/extrahardmode/module/MsgModule.java | 2 + 4 files changed, 157 insertions(+), 55 deletions(-) diff --git a/pom.xml b/pom.xml index ec256a63..a87de007 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.8.9 + 3.9.0 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.11 + 1.11.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ @@ -219,7 +219,7 @@ com.sk89q worldguard - 5.8.1-SNAPSHOT + 6.1.1-SNAPSHOT diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 7dfb3902..339a57d9 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -715,6 +715,11 @@ public enum RootNode implements ConfigNode */ ENDER_DRAGON_ADDITIONAL_ATTACKS("EnderDragon.Harder Battle", VarType.BOOLEAN, true, "Dragon summons minions including blazes and zombies. Can also aggro nearby endermen!"), + /** + * whether the dragon spits fireballs and summons minions + */ + ALTERNATIVE_FIREBALL("EnderDragon.Harder Battle", VarType.BOOLEAN, true, + "More diverse mobs are spawned from fireball (blaze,zombie and skeletons)"), /** * whether server wide messages will broadcast player victories and defeats */ diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index f6514b48..cbc733bd 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -428,59 +428,154 @@ public void onExplosion(EntityExplodeEvent event) Entity spawnedMonster = null; if (fireball.getShooter() != null && EntityHelper.shooterType(fireball) == EntityType.ENDER_DRAGON) { - int random = plugin.getRandom().nextInt(100); - if (random < 40) - { - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.BLAZE); - - for (int x1 = -2; x1 <= 2; x1++) - { - for (int z1 = -2; z1 <= 2; z1++) - { - for (int y1 = 2; y1 >= -2; y1--) - { - Block block = fireball.getLocation().add(x1, y1, z1).getBlock(); - Material underType = block.getRelative(BlockFace.DOWN).getType(); - if (block.getType() == Material.AIR && underType != Material.AIR && underType != Material.FIRE) - { - block.setType(Material.FIRE); - } - } - } - } + final boolean alternativeFireball = CFG.getBoolean(RootNode.ALTERNATIVE_FIREBALL, world.getName()); + if(alternativeFireball){ + + int random = plugin.getRandom().nextInt(150); + if (random < 100) + { + if (random < 10) + { + + + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.BLAZE); + + + for (int x1 = -2; x1 <= 2; x1++) + { + + for (int z1 = -2; z1 <= 2; z1++) + { + + for (int y1 = 2; y1 >= -2; y1--) + { + + Block block = fireball.getLocation().add(x1, y1, z1).getBlock(); + Material underType = block.getRelative(BlockFace.DOWN).getType(); + + if (block.getType() == Material.AIR && underType != Material.AIR && underType != Material.FIRE) + { + + block.setType(Material.FIRE); + } + } + } + } + + + + + + + Location location = fireball.getLocation().add(0, 1, 0); + for (int i = 0; i < 10; i++) + { + + FallingBlock fire = world.spawnFallingBlock(location, Material.FIRE, (byte) 0); + Vector velocity = Vector.getRandom(); + if (velocity.getY() < 0) + { + + velocity.setY(velocity.getY() * -1); + } + + if (plugin.getRandom().nextBoolean()) + { + + velocity.setZ(velocity.getZ() * -1); + } + + if (plugin.getRandom().nextBoolean()) + { + + velocity.setX(velocity.getX() * -1); + } + + fire.setVelocity(velocity); + } + + } else if (random < 50) + { + + for (int i = 0; i < 2; i++) + { + + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE); + EntityHelper.markLootLess(plugin, (LivingEntity) spawnedMonster); + Zombie zombie = (Zombie) spawnedMonster; + } + } else if (random < 80) + { + for (int i = 0; i < 2; i++) + { + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.SKELETON); + } + } + else + { + + + + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ENDERMAN); + } + } + } else { + int random = plugin.getRandom().nextInt(100); + if (random < 40) + { + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.BLAZE); + + for (int x1 = -2; x1 <= 2; x1++) + { + for (int z1 = -2; z1 <= 2; z1++) + { + for (int y1 = 2; y1 >= -2; y1--) + { + Block block = fireball.getLocation().add(x1, y1, z1).getBlock(); + Material underType = block.getRelative(BlockFace.DOWN).getType(); + if (block.getType() == Material.AIR && underType != Material.AIR && underType != Material.FIRE) + { + block.setType(Material.FIRE); + } + } + } + } + + Location location = fireball.getLocation().add(0, 1, 0); + for (int i = 0; i < 10; i++) + { + FallingBlock fire = world.spawnFallingBlock(location, Material.FIRE, (byte) 0); + Vector velocity = Vector.getRandom(); + if (velocity.getY() < 0) + { + velocity.setY(velocity.getY() * -1); + } + if (plugin.getRandom().nextBoolean()) + { + velocity.setZ(velocity.getZ() * -1); + } + if (plugin.getRandom().nextBoolean()) + { + velocity.setX(velocity.getX() * -1); + } + fire.setVelocity(velocity); + } + } else if (random < 70) + { + for (int i = 0; i < 2; i++) + { + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE); + EntityHelper.markLootLess(plugin, (LivingEntity) spawnedMonster); + Zombie zombie = (Zombie) spawnedMonster; + zombie.setVillager(true); + } + } else + { + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ENDERMAN); + } + + } - Location location = fireball.getLocation().add(0, 1, 0); - for (int i = 0; i < 10; i++) - { - FallingBlock fire = world.spawnFallingBlock(location, Material.FIRE, (byte) 0); - Vector velocity = Vector.getRandom(); - if (velocity.getY() < 0) - { - velocity.setY(velocity.getY() * -1); - } - if (plugin.getRandom().nextBoolean()) - { - velocity.setZ(velocity.getZ() * -1); - } - if (plugin.getRandom().nextBoolean()) - { - velocity.setX(velocity.getX() * -1); - } - fire.setVelocity(velocity); - } - } else if (random < 70) - { - for (int i = 0; i < 2; i++) - { - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE); - EntityHelper.markLootLess(plugin, (LivingEntity) spawnedMonster); - Zombie zombie = (Zombie) spawnedMonster; - zombie.setVillager(true); - } - } else - { - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ENDERMAN); - } } if (spawnedMonster != null) diff --git a/src/main/java/com/extrahardmode/module/MsgModule.java b/src/main/java/com/extrahardmode/module/MsgModule.java index 6f55239a..4e31f8b5 100644 --- a/src/main/java/com/extrahardmode/module/MsgModule.java +++ b/src/main/java/com/extrahardmode/module/MsgModule.java @@ -131,6 +131,8 @@ private void send(Player player, MessageNode node, String message) case BROADCAST: plugin.getServer().broadcastMessage(message); break; + case DISABLED: + break; default: throw new UnsupportedOperationException(messages.getCat(node) + " not implemented"); } From 66337838f826b20d76ff03964a493e7a4e897674 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 9 Jan 2017 22:51:17 -0800 Subject: [PATCH 070/252] Clean up PR #64 --- .../com/extrahardmode/config/RootNode.java | 4 ++-- .../features/monsters/Glydia.java | 24 +++++-------------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 339a57d9..e9043937 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -716,10 +716,10 @@ public enum RootNode implements ConfigNode ENDER_DRAGON_ADDITIONAL_ATTACKS("EnderDragon.Harder Battle", VarType.BOOLEAN, true, "Dragon summons minions including blazes and zombies. Can also aggro nearby endermen!"), /** - * whether the dragon spits fireballs and summons minions + * whether the dragon uses Erik1988's wonderfully-named new spawning method */ ALTERNATIVE_FIREBALL("EnderDragon.Harder Battle", VarType.BOOLEAN, true, - "More diverse mobs are spawned from fireball (blaze,zombie and skeletons)"), + "More diverse mobs are spawned from fireballs (blazes, zombies, and skeletons)"), /** * whether server wide messages will broadcast player victories and defeats */ diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index cbc733bd..6ebe2e54 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -429,43 +429,31 @@ public void onExplosion(EntityExplodeEvent event) if (fireball.getShooter() != null && EntityHelper.shooterType(fireball) == EntityType.ENDER_DRAGON) { final boolean alternativeFireball = CFG.getBoolean(RootNode.ALTERNATIVE_FIREBALL, world.getName()); - if(alternativeFireball){ + + //Start of "ALTERNATIVE_FIREBALL" spawning method + if(alternativeFireball) { int random = plugin.getRandom().nextInt(150); if (random < 100) { if (random < 10) { - - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.BLAZE); - - for (int x1 = -2; x1 <= 2; x1++) { - for (int z1 = -2; z1 <= 2; z1++) { - for (int y1 = 2; y1 >= -2; y1--) { - Block block = fireball.getLocation().add(x1, y1, z1).getBlock(); Material underType = block.getRelative(BlockFace.DOWN).getType(); - if (block.getType() == Material.AIR && underType != Material.AIR && underType != Material.FIRE) { - block.setType(Material.FIRE); } } } } - - - - - Location location = fireball.getLocation().add(0, 1, 0); for (int i = 0; i < 10; i++) @@ -519,7 +507,9 @@ public void onExplosion(EntityExplodeEvent event) spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ENDERMAN); } } - } else { + } + //End of "ALTERNATIVE_FIREBALL" spawning method. Whew. + else { int random = plugin.getRandom().nextInt(100); if (random < 40) { @@ -573,9 +563,7 @@ public void onExplosion(EntityExplodeEvent event) { spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ENDERMAN); } - } - } if (spawnedMonster != null) From bd9f7d6c624a0254642d38e1548e9eaed7e9cf3d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 4 Feb 2017 17:50:36 -0800 Subject: [PATCH 071/252] increase priority of explode handler --- src/main/java/com/extrahardmode/features/Explosions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index cdb7d7ef..70f51866 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -93,7 +93,7 @@ public void starting() // | / _| (_ | |_| | |__ / _ \| / | |__ | |\__ \ | | | _|| .` | _|| / // |_|_\___\___|\___/|____/_/ \_\_|_\ |____|___|___/ |_| |___|_|\_|___|_|_\ // - @EventHandler(ignoreCancelled = true) + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) //High priority to allow plugins to clear the blocklist if they so choose public void regularExplosions(EntityExplodeEvent event) { if (event instanceof FakeEntityExplodeEvent || !(event.getEntity() instanceof Ghast || event.getEntity() instanceof TNTPrimed)) @@ -115,7 +115,7 @@ public void regularExplosions(EntityExplodeEvent event) // TNT if (sourceEntity instanceof TNTPrimed) { - if (customTntExplosion && event.blockList().size() != 0 && (flyOtherPlugins || event.getYield() == 0.25)) //getYield value of 0.25 somewhat ensures this is a vanilla TNT explosion. + if (customTntExplosion && event.blockList().size() > 0 && (flyOtherPlugins || event.getYield() == 0.25)) //getYield value of 0.25 somewhat ensures this is a vanilla TNT explosion. { if (!multipleExplosions) { From 2739264dc438c565462dcdc88e52d4b224522647 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 4 Feb 2017 17:58:49 -0800 Subject: [PATCH 072/252] Use ZombieVillager for zombie villagers Change that came about with 1.11 I think? --- .../com/extrahardmode/features/monsters/Glydia.java | 12 +----------- .../com/extrahardmode/features/monsters/Witches.java | 9 ++++----- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 6ebe2e54..87ab037d 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -458,24 +458,20 @@ public void onExplosion(EntityExplodeEvent event) Location location = fireball.getLocation().add(0, 1, 0); for (int i = 0; i < 10; i++) { - FallingBlock fire = world.spawnFallingBlock(location, Material.FIRE, (byte) 0); Vector velocity = Vector.getRandom(); if (velocity.getY() < 0) { - velocity.setY(velocity.getY() * -1); } if (plugin.getRandom().nextBoolean()) { - velocity.setZ(velocity.getZ() * -1); } if (plugin.getRandom().nextBoolean()) { - velocity.setX(velocity.getX() * -1); } @@ -487,7 +483,6 @@ public void onExplosion(EntityExplodeEvent event) for (int i = 0; i < 2; i++) { - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE); EntityHelper.markLootLess(plugin, (LivingEntity) spawnedMonster); Zombie zombie = (Zombie) spawnedMonster; @@ -501,9 +496,6 @@ public void onExplosion(EntityExplodeEvent event) } else { - - - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ENDERMAN); } } @@ -554,10 +546,8 @@ public void onExplosion(EntityExplodeEvent event) { for (int i = 0; i < 2; i++) { - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE); + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE_VILLAGER); EntityHelper.markLootLess(plugin, (LivingEntity) spawnedMonster); - Zombie zombie = (Zombie) spawnedMonster; - zombie.setVillager(true); } } else { diff --git a/src/main/java/com/extrahardmode/features/monsters/Witches.java b/src/main/java/com/extrahardmode/features/monsters/Witches.java index e85cf40b..f2c0d248 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Witches.java +++ b/src/main/java/com/extrahardmode/features/monsters/Witches.java @@ -128,10 +128,10 @@ public void onPotionSplash(PotionSplashEvent event) boolean zombieNearby = false; for (Entity entity : location.getChunk().getEntities()) { - if (entity.getType() == EntityType.ZOMBIE) + if (entity.getType() == EntityType.ZOMBIE_VILLAGER) { - Zombie zombie = (Zombie) entity; - if (zombie.isVillager() && zombie.isBaby()) + ZombieVillager zombie = (ZombieVillager) entity; + if (zombie.isBaby()) { zombieNearby = true; break; @@ -141,8 +141,7 @@ public void onPotionSplash(PotionSplashEvent event) if (!zombieNearby) { - Zombie zombie = (Zombie) EntityHelper.spawn(location, EntityType.ZOMBIE); - zombie.setVillager(true); + ZombieVillager zombie = (ZombieVillager) EntityHelper.spawn(location, EntityType.ZOMBIE_VILLAGER); zombie.setBaby(true); if (zombie.getTarget() != null) { From 24f8fa9f969243dcd15e96e5ac8e974851b3d3bc Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 4 Feb 2017 18:08:19 -0800 Subject: [PATCH 073/252] v3.9.1 Fix Prism repo --- pom.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index a87de007..63bce85b 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.9.0 + 3.9.1 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode @@ -123,10 +123,10 @@ github-snapshots http://di3mex.github.io/repo_bukkit/snapshots/ - - prism-repo - http://dhmc.us:8081/nexus/content/repositories/releases/ - + + + + md_5-releases http://repo.md-5.net/content/repositories/releases/ @@ -227,7 +227,8 @@ me.botsko prism - 2.0.6 + 2.0 + From f331402f33af89e79bf07cb678c5bdaaed7d5ab7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 4 Feb 2017 18:25:33 -0800 Subject: [PATCH 074/252] Remove prism compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Ok that won't work either" The prism team gave up on bukkit anyways, so I guess we'll just give up on them ¯\_(ツ)_/¯ --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 63bce85b..87178352 100644 --- a/pom.xml +++ b/pom.xml @@ -224,12 +224,12 @@ - - me.botsko - prism - 2.0 - - + + + + + + net.coreprotect.CoreProtect From 64fd6d5000a0b740764b8cb6235f332995ecc2b5 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 4 Feb 2017 18:43:28 -0800 Subject: [PATCH 075/252] v3.10 revise PR #64 - Uses a new config node - Clarified documentation --- pom.xml | 2 +- src/main/java/com/extrahardmode/config/RootNode.java | 6 +++--- .../java/com/extrahardmode/features/monsters/Glydia.java | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 87178352..ce1f8aee 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.9.1 + 3.10 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index e9043937..b984c429 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -716,10 +716,10 @@ public enum RootNode implements ConfigNode ENDER_DRAGON_ADDITIONAL_ATTACKS("EnderDragon.Harder Battle", VarType.BOOLEAN, true, "Dragon summons minions including blazes and zombies. Can also aggro nearby endermen!"), /** - * whether the dragon uses Erik1988's wonderfully-named new spawning method + * whether the dragon summons Erik1988's variety of mobs */ - ALTERNATIVE_FIREBALL("EnderDragon.Harder Battle", VarType.BOOLEAN, true, - "More diverse mobs are spawned from fireballs (blazes, zombies, and skeletons)"), + ALTERNATIVE_FIREBALL("EnderDragon.Alternative Minions", VarType.BOOLEAN, false, + "More diverse mobs are summoned (blazes, zombies, and skeletons). Harder Battle must be set to true, or this option has no effect."), /** * whether server wide messages will broadcast player victories and defeats */ diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 87ab037d..189fe095 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -500,7 +500,8 @@ public void onExplosion(EntityExplodeEvent event) } } } - //End of "ALTERNATIVE_FIREBALL" spawning method. Whew. + //End of "ALTERNATIVE_FIREBALL" spawning method. + //Begin of the normal spawning method. else { int random = plugin.getRandom().nextInt(100); if (random < 40) From a7af80f1ff541994f862c385ee0e69b1cc539ee5 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 4 Feb 2017 18:53:02 -0800 Subject: [PATCH 076/252] missed one as it was removed in PR #64 --- src/main/java/com/extrahardmode/features/monsters/Glydia.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 189fe095..43698140 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -483,9 +483,8 @@ public void onExplosion(EntityExplodeEvent event) for (int i = 0; i < 2; i++) { - spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE); + spawnedMonster = entity.getWorld().spawnEntity(entity.getLocation(), EntityType.ZOMBIE_VILLAGER); EntityHelper.markLootLess(plugin, (LivingEntity) spawnedMonster); - Zombie zombie = (Zombie) spawnedMonster; } } else if (random < 80) { From 37b04f3f6eb7586b3800c208bc2f2ce4796d9aca Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 8 Mar 2017 22:10:31 -0800 Subject: [PATCH 077/252] fix #74 --- .../java/com/extrahardmode/features/monsters/PigMen.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/PigMen.java b/src/main/java/com/extrahardmode/features/monsters/PigMen.java index 2c9aef1c..04822a6f 100644 --- a/src/main/java/com/extrahardmode/features/monsters/PigMen.java +++ b/src/main/java/com/extrahardmode/features/monsters/PigMen.java @@ -152,9 +152,12 @@ public void onChunkLoad(ChunkLoadEvent event) @EventHandler public void onPlayerDamaged(EntityDamageByEntityEvent event) { + int damagePercentage = CFG.getInt(RootNode.PIG_ZOMBIE_DMG_PERCENT, event.getEntity().getWorld().getName()) / 100; + if (damagePercentage <= 0) + return; if (event.getEntity() instanceof Player && event.getDamager() instanceof PigZombie) { - event.setDamage(event.getDamage() * CFG.getInt(RootNode.PIG_ZOMBIE_DMG_PERCENT, event.getEntity().getWorld().getName()) / 100); + event.setDamage(event.getDamage() * damagePercentage); } } From 1779edfa1ba75ab89ade8134e3a4702ecaf7b475 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 08:29:20 -0800 Subject: [PATCH 078/252] Fix #60 --- .../features/monsters/Zombies.java | 9 +++-- .../TemporaryBlockBreakEvent.java | 28 +++++++++----- .../temporaryblock/TemporaryBlockHandler.java | 38 +++++++++++++++++-- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index bfededb8..0ae9137e 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -223,16 +223,17 @@ public void onZombieReinforcements(CreatureSpawnEvent event) @EventHandler public void onSkullBroken(TemporaryBlockBreakEvent event) { - final int dropPercentage = CFG.getInt(RootNode.ZOMBIE_REANIMATE_SKULLS_DROP_PERCENTAGE, event.getBlock().getLoc().getWorld().getName()); - TemporaryBlock temporaryBlock = event.getBlock(); + final int dropPercentage = CFG.getInt(RootNode.ZOMBIE_REANIMATE_SKULLS_DROP_PERCENTAGE, event.getTemporaryBlock().getLoc().getWorld().getName()); + TemporaryBlock temporaryBlock = event.getTemporaryBlock(); Object[] data = temporaryBlock.getData(); if (data.length == 1 && data[0] instanceof String && data[0].equals("respawn_skull")) { //Clear item drops: this is the only way if (dropPercentage == 0 || !OurRandom.percentChance(dropPercentage)) { - event.getBlockBreakEvent().setCancelled(true); - event.getBlockBreakEvent().getBlock().setType(Material.AIR); +// event.getBlockBreakEvent().setCancelled(true); +// event.getBlockBreakEvent().getBlock().setType(Material.AIR); + event.getBlock().getDrops().clear(); //nope, there's another way } } } diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java index 12040284..d48060d8 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java @@ -1,35 +1,43 @@ package com.extrahardmode.module.temporaryblock; +import org.bukkit.block.Block; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockEvent; +import org.bukkit.event.block.BlockFromToEvent; public class TemporaryBlockBreakEvent extends Event { - private final BlockBreakEvent event; - private final TemporaryBlock block; + //private final BlockEvent event; + private final TemporaryBlock temporaryBlock; + private final Block block; - public TemporaryBlockBreakEvent(TemporaryBlock block, BlockBreakEvent event) + public TemporaryBlockBreakEvent(TemporaryBlock temporaryBlock, Block block) { this.block = block; - this.event = event; + this.temporaryBlock = temporaryBlock; } - public TemporaryBlock getBlock() + public TemporaryBlock getTemporaryBlock() { - return block; + return temporaryBlock; } - public BlockBreakEvent getBlockBreakEvent() +// public BlockBreakEvent getBlockBreakEvent() +// { +// return event; +// } + + + public Block getBlock() { - return event; + return block; } - private static final HandlerList HANDLERS = new HandlerList(); diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index e7b47148..f4114217 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -7,6 +7,10 @@ import org.bukkit.block.Block; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockEvent; +import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.entity.EntityExplodeEvent; import java.util.HashMap; import java.util.Map; @@ -29,19 +33,47 @@ public TemporaryBlockHandler(ExtraHardMode plugin) * onTempBlockBreakEvent * onZombieRespawnTask -> check if broken */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { - Block block = event.getBlock(); + fireTemporaryBlockBreakEvent(event.getBlock()); + } + + //Also account for water + @EventHandler(ignoreCancelled = true) + public void onWaterBreakBlock(BlockFromToEvent event) + { + fireTemporaryBlockBreakEvent(event.getToBlock()); + } + + //And explosions + @EventHandler(ignoreCancelled = true) + public void onEntityExplosionBreak(EntityExplodeEvent event) + { + for (Block block : event.blockList()) + fireTemporaryBlockBreakEvent(block); + } + + //And other weird plugin explosions + @EventHandler(ignoreCancelled = true) + public void onBlockExplosionBreak(BlockExplodeEvent event) + { + for (Block block : event.blockList()) + fireTemporaryBlockBreakEvent(block); + } + + private void fireTemporaryBlockBreakEvent(Block block) + { if (temporaryBlockList.containsKey(LiteLocation.fromLocation(block.getLocation()))) { TemporaryBlock temporaryBlock = temporaryBlockList.remove(LiteLocation.fromLocation(block.getLocation())); temporaryBlock.isBroken = true; - plugin.getServer().getPluginManager().callEvent(new TemporaryBlockBreakEvent(temporaryBlock, event)); + plugin.getServer().getPluginManager().callEvent(new TemporaryBlockBreakEvent(temporaryBlock, block)); } } + public TemporaryBlock addTemporaryBlock(Location loc, Object... data) { TemporaryBlock temporaryBlock = new TemporaryBlock(loc, data); From 5f0c10c71b5e2de437a6301a4887d5379cfdc035 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 08:34:56 -0800 Subject: [PATCH 079/252] reinstate the MORE_FALLING_BLOCKS_BREAK_TORCHES feature See #16 --- src/main/java/com/extrahardmode/module/BlockModule.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index a75e0cd3..369eb83b 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -118,7 +118,6 @@ public UUID applyPhysics(Block block, boolean damageEntities) CompatHandler.logFallingBlockFall(block); block.setType(Material.AIR); - /* final boolean breakTorches = CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_BREAK_TORCHES, block.getWorld().getName()); //TODO expand on this, it's only rudimentary, doesnt break torches if there are multiple fallingblocks (only breaks the first) if (breakTorches) @@ -140,7 +139,6 @@ public UUID applyPhysics(Block block, boolean damageEntities) below = current.getRelative(BlockFace.DOWN); } } - */ if (damageEntities) //mark so we know the block is from us EntityHelper.markForProcessing(plugin, fallingBlock); From 20a841b1eef329c18ef3662ca207377837a5af57 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 08:38:16 -0800 Subject: [PATCH 080/252] fix #52 (Supposed to use BEETROOT_BLOCK) --- src/main/java/com/extrahardmode/module/BlockModule.java | 4 ++-- .../java/com/extrahardmode/task/RemoveExposedTorchesTask.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 369eb83b..bc0a8a39 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -212,7 +212,7 @@ public boolean plantDies(Block block, MaterialData newDataValue) if (newDataValue.getData() >= 7) { Material material = block.getType(); - if (material == Material.CROPS || material == Material.CARROT || material == Material.POTATO || material == Material.BEETROOT) + if (material == Material.CROPS || material == Material.CARROT || material == Material.POTATO || material == Material.BEETROOT_BLOCK) { int deathProbability = lossRate; @@ -352,7 +352,7 @@ public boolean isPlant(Material material) || material.equals(Material.CARROT) || material.equals(Material.MELON_STEM) || material.equals(Material.PUMPKIN_STEM) - || material.equals(Material.BEETROOT); + || material.equals(Material.BEETROOT_BLOCK); } diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index 6f419498..9a044745 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -131,6 +131,7 @@ public void run() case RED_ROSE: case YELLOW_FLOWER: case LONG_GRASS: + case BEETROOT_BLOCK: { if (snowBreaksCrops && temperature <= 0.15) //cold biomes in which snow falls { From 667c94f5afa84a32a51b8526c9305f4865812271 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 09:56:55 -0800 Subject: [PATCH 081/252] fix #69 --- src/main/java/com/extrahardmode/features/Explosions.java | 8 +++++--- src/main/java/com/extrahardmode/module/BlockModule.java | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index 70f51866..70e9e1bb 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -93,7 +93,7 @@ public void starting() // | / _| (_ | |_| | |__ / _ \| / | |__ | |\__ \ | | | _|| .` | _|| / // |_|_\___\___|\___/|____/_/ \_\_|_\ |____|___|___/ |_| |___|_|\_|___|_|_\ // - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) //High priority to allow plugins to clear the blocklist if they so choose + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) //RoboMWM - High priority to allow plugins to clear the blocklist if they so choose public void regularExplosions(EntityExplodeEvent event) { if (event instanceof FakeEntityExplodeEvent || !(event.getEntity() instanceof Ghast || event.getEntity() instanceof TNTPrimed)) @@ -284,11 +284,13 @@ public void handleLandedBlocksFromPhysics(EntityChangeBlockEvent event) else { Material type = BlockModule.getDroppedMaterial(fallBaby.getMaterial()); - if (type.isBlock()) + if (type == null) + return; //Otherwise we're removing precious block data e.g. chaning wood slab types. See #69 + else if (type.isBlock()) block.setType(type); else //if block doesnt drop something that can be placed again... thin glass, redstone ore block.setType(Material.AIR); - event.setCancelled(true); + event.setCancelled(true); //TODO: is there a reason for this? if event is being called, I'd presume it's changing the block in the first place... } } } diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index bc0a8a39..29d09b37 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -483,7 +483,7 @@ public static Material getDroppedMaterial(Material mat) case MOB_SPAWNER: return Material.AIR; } - return mat; + return null; } From 927ce90761d23b42b81c2f35417871b4e06028f0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 10:36:10 -0800 Subject: [PATCH 082/252] revise fix to #69 Initial fix disregarded types not in BlockModule#getDroppedMaterial (e.g. thin glass shouldn't be dropped, etc.) --- src/main/java/com/extrahardmode/features/Explosions.java | 6 +++--- src/main/java/com/extrahardmode/module/BlockModule.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index 70e9e1bb..607fb50a 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -284,13 +284,13 @@ public void handleLandedBlocksFromPhysics(EntityChangeBlockEvent event) else { Material type = BlockModule.getDroppedMaterial(fallBaby.getMaterial()); - if (type == null) - return; //Otherwise we're removing precious block data e.g. chaning wood slab types. See #69 + if (type.isBlock() && type == fallBaby.getMaterial()) //preserve blockdata. See issue #69 //Alternatively could block#setType in second condition + return; else if (type.isBlock()) block.setType(type); else //if block doesnt drop something that can be placed again... thin glass, redstone ore block.setType(Material.AIR); - event.setCancelled(true); //TODO: is there a reason for this? if event is being called, I'd presume it's changing the block in the first place... + event.setCancelled(true); } } } diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 29d09b37..bc0a8a39 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -483,7 +483,7 @@ public static Material getDroppedMaterial(Material mat) case MOB_SPAWNER: return Material.AIR; } - return null; + return mat; } From def625fbf63d90354f744214a8a7cefde4ed2d6c Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 10:50:40 -0800 Subject: [PATCH 083/252] Remove "compatibility" (plugins can listen to BlockExplodeEvent to log custom explosions) Addresses #39 --- src/main/java/com/extrahardmode/features/Explosions.java | 6 +++++- .../java/com/extrahardmode/task/CreateExplosionTask.java | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index 607fb50a..24ecaea1 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -186,6 +186,8 @@ public void onLateExplosion(EntityExplodeEvent event) } + //RoboMWM - remove "compatibility" (see com.extrahardmode.module.ExplosionCompatStorage for more details) + /* /** * Provide compatibility for block protection and logging plugins. *
@@ -199,12 +201,13 @@ public void onLateExplosion(EntityExplodeEvent event)
      *     5. this code will break blocks manually as a workaround,
      *     because the actual explosion that would break the blocks has to be cancelled
      * 
- */ + * // ___ ___ __ __ ___ _ _____ ___ ___ ___ _ ___ _______ __ // / __/ _ \| \/ | _ \/_\_ _|_ _| _ )_ _| | |_ _|_ _\ \ / / // | (_| (_) | |\/| | _/ _ \| | | || _ \| || |__ | | | | \ V / // \___\___/|_| |_|_|/_/ \_\_| |___|___/___|____|___| |_| |_| // + @EventHandler(priority = EventPriority.LOWEST) public void provideCompatibility(EntityExplodeEvent event) { @@ -253,6 +256,7 @@ public void provideCompatibility(EntityExplodeEvent event) } } } + */ // _ _ _ _ ___ ___ _ _ ___ ___ _ ___ ___ _ _____ diff --git a/src/main/java/com/extrahardmode/task/CreateExplosionTask.java b/src/main/java/com/extrahardmode/task/CreateExplosionTask.java index 6b279819..d33869e6 100644 --- a/src/main/java/com/extrahardmode/task/CreateExplosionTask.java +++ b/src/main/java/com/extrahardmode/task/CreateExplosionTask.java @@ -175,8 +175,13 @@ void createExplosion(Location loc, ExplosionType type) //{ //if (CompatHandler.isExplosionProtected(loc)) // damageWorld = false; + + //RoboMWM - we no longer provide "compatibility" for block logging plugins - they can listen to BlockExplodeEvent + //Said "compatibility" also seemed to break some plugins like Creeperheal???? + /* if (explosionCause != null) //ignore pure "visual" explosions plugin.getModuleForClass(ExplosionCompatStorage.class).queueExplosion(location, explosionCause); + */ //entity should be ignored so our code doesn't think that it's a regular creeper etc. From 4d772e360fd9fbe66632a7b82054ecec762a7df5 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 9 Mar 2017 22:19:01 -0800 Subject: [PATCH 084/252] version 3.11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ce1f8aee..3193142e 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.10 + 3.11 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From cae0b93b9fde9f69153e1b1d02b47b7904e84e2c Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 11 Mar 2017 08:59:48 -0800 Subject: [PATCH 085/252] check cancel status, revise fix to #60 - Ignore spawning mobs if initial spawn was canceled - getDrops returns a new list of drops said block would drop when broken. CB does not use this list when creating said drops on break, so... clearing this list pretty much does nothing. Given the nature of "breaking" the block without dropping anything must be performed differently due to each event "breaking" said skull, we'll defer this task to the TemporaryBlockHandler instead of trying to do it in a TemporaryBlockEvent listener (and is probably the "right" way to do it anyways). --- .../features/monsters/Blazes.java | 2 +- .../features/monsters/BumBumBens.java | 2 +- .../features/monsters/Endermen.java | 2 +- .../features/monsters/Glydia.java | 2 +- .../features/monsters/MonsterRules.java | 4 +- .../features/monsters/PigMen.java | 2 +- .../features/monsters/Skeletors.java | 6 +-- .../features/monsters/Spiders.java | 2 +- .../features/monsters/Witches.java | 2 +- .../features/monsters/Zombies.java | 4 +- .../TemporaryBlockBreakEvent.java | 28 ++++++------ .../temporaryblock/TemporaryBlockHandler.java | 43 +++++++++++++++---- 12 files changed, 64 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Blazes.java b/src/main/java/com/extrahardmode/features/monsters/Blazes.java index 82968833..1a7ba592 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Blazes.java +++ b/src/main/java/com/extrahardmode/features/monsters/Blazes.java @@ -75,7 +75,7 @@ public void starting() *

* handles all the extra spawns for Blazes in the OverWorld and Nether */ - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { Location location = event.getLocation(); diff --git a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java index f756cbd0..8eaed436 100644 --- a/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java +++ b/src/main/java/com/extrahardmode/features/monsters/BumBumBens.java @@ -74,7 +74,7 @@ public void starting() *

* naturally spawning Charged Creepers */ - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { LivingEntity entity = event.getEntity(); diff --git a/src/main/java/com/extrahardmode/features/monsters/Endermen.java b/src/main/java/com/extrahardmode/features/monsters/Endermen.java index faf23210..672e9b5b 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Endermen.java +++ b/src/main/java/com/extrahardmode/features/monsters/Endermen.java @@ -70,7 +70,7 @@ public void starting() * * @param event - Event that occurred. */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onEntityTeleport(EntityTeleportEvent event) { Entity entity = event.getEntity(); diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 43698140..3bfd69d6 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -396,7 +396,7 @@ public void onItemSpawn(ItemSpawnEvent event) * * @param event - Event that occurred. */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onEntityTarget(EntityTargetEvent event) { // FEATURE: monsters don't target the ender dragon diff --git a/src/main/java/com/extrahardmode/features/monsters/MonsterRules.java b/src/main/java/com/extrahardmode/features/monsters/MonsterRules.java index cd93029d..81f2bd09 100644 --- a/src/main/java/com/extrahardmode/features/monsters/MonsterRules.java +++ b/src/main/java/com/extrahardmode/features/monsters/MonsterRules.java @@ -66,7 +66,7 @@ public void starting() *

* more Monsters in caves */ - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { Location location = event.getLocation(); @@ -114,7 +114,7 @@ public void onEntitySpawn(CreatureSpawnEvent event) * * @param event - Event that occurred. */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onEntityTarget(EntityTargetEvent event) { Entity entity = event.getEntity(); diff --git a/src/main/java/com/extrahardmode/features/monsters/PigMen.java b/src/main/java/com/extrahardmode/features/monsters/PigMen.java index 04822a6f..49cb2c08 100644 --- a/src/main/java/com/extrahardmode/features/monsters/PigMen.java +++ b/src/main/java/com/extrahardmode/features/monsters/PigMen.java @@ -100,7 +100,7 @@ else if (pigWartDropEveryWherePercent > 0 && plugin.random(pigWartDropEveryWhere *

* Makes Pigmen always angry */ - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { Location location = event.getLocation(); diff --git a/src/main/java/com/extrahardmode/features/monsters/Skeletors.java b/src/main/java/com/extrahardmode/features/monsters/Skeletors.java index e56e0cb3..50a07a2a 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Skeletors.java +++ b/src/main/java/com/extrahardmode/features/monsters/Skeletors.java @@ -125,7 +125,7 @@ else if (bullet.hasMetadata(key_fireArrow)) } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onSkeliDamagedByArrow(EntityDamageByEntityEvent event) { Entity entity = event.getEntity(); @@ -169,7 +169,7 @@ public void onSkeliDamagedByArrow(EntityDamageByEntityEvent event) * * @param event - Event that occurred. */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onShootProjectile(ProjectileLaunchEvent event) { Location location = event.getEntity().getLocation(); @@ -241,7 +241,7 @@ && getTotalMinionsSummonedBySkeli(skeleton, plugin) < totalLimit) } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onSilverfishSpawn(CreatureSpawnEvent event) { final boolean tempFix = CFG.getBoolean(RootNode.SILVERFISH_TEMP_POTION_EFFECT_FIX, event.getLocation().getWorld().getName()); diff --git a/src/main/java/com/extrahardmode/features/monsters/Spiders.java b/src/main/java/com/extrahardmode/features/monsters/Spiders.java index ff86373b..386e3a73 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Spiders.java +++ b/src/main/java/com/extrahardmode/features/monsters/Spiders.java @@ -73,7 +73,7 @@ public void starting() *

* More spiders in caves */ - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { LivingEntity entity = event.getEntity(); diff --git a/src/main/java/com/extrahardmode/features/monsters/Witches.java b/src/main/java/com/extrahardmode/features/monsters/Witches.java index f2c0d248..2ef01077 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Witches.java +++ b/src/main/java/com/extrahardmode/features/monsters/Witches.java @@ -71,7 +71,7 @@ public void starting() * * @param event which occurred */ - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { LivingEntity entity = event.getEntity(); diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index 0ae9137e..e7d34f3f 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -210,7 +210,7 @@ public void onEntityDamage(EntityDamageEvent event) /** Flag Zombies that have been called in as reinforcements to not respawn */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onZombieReinforcements(CreatureSpawnEvent event) { if (hasReinforcements && event.getEntity() instanceof Zombie && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.REINFORCEMENTS) @@ -233,7 +233,7 @@ public void onSkullBroken(TemporaryBlockBreakEvent event) { // event.getBlockBreakEvent().setCancelled(true); // event.getBlockBreakEvent().getBlock().setType(Material.AIR); - event.getBlock().getDrops().clear(); //nope, there's another way + event.setCancelled(true); //Let the handler take care of it } } } diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java index d48060d8..c8d567c5 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockBreakEvent.java @@ -1,22 +1,30 @@ package com.extrahardmode.module.temporaryblock; -import org.bukkit.block.Block; +import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import org.bukkit.event.block.BlockEvent; -import org.bukkit.event.block.BlockFromToEvent; -public class TemporaryBlockBreakEvent extends Event +public class TemporaryBlockBreakEvent extends Event implements Cancellable { //private final BlockEvent event; private final TemporaryBlock temporaryBlock; - private final Block block; + private boolean cancel = false; + @Override + public void setCancelled(boolean cancel) + { + this.cancel = cancel; + } + + @Override + public boolean isCancelled() + { + return this.cancel; + } - public TemporaryBlockBreakEvent(TemporaryBlock temporaryBlock, Block block) + public TemporaryBlockBreakEvent(TemporaryBlock temporaryBlock) { - this.block = block; this.temporaryBlock = temporaryBlock; } @@ -32,12 +40,6 @@ public TemporaryBlock getTemporaryBlock() // return event; // } - - public Block getBlock() - { - return block; - } - private static final HandlerList HANDLERS = new HandlerList(); diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index f4114217..7c81e482 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -4,6 +4,7 @@ import com.extrahardmode.ExtraHardMode; import com.extrahardmode.service.ListenerModule; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockBreakEvent; @@ -12,6 +13,7 @@ import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.entity.EntityExplodeEvent; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -36,40 +38,65 @@ public TemporaryBlockHandler(ExtraHardMode plugin) @EventHandler(ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { - fireTemporaryBlockBreakEvent(event.getBlock()); + if (fireTemporaryBlockBreakEvent(event.getBlock())) + { + event.setCancelled(true); + event.getBlock().setType(Material.AIR); + } } //Also account for water @EventHandler(ignoreCancelled = true) public void onWaterBreakBlock(BlockFromToEvent event) { - fireTemporaryBlockBreakEvent(event.getToBlock()); + if (fireTemporaryBlockBreakEvent(event.getToBlock())) + { + event.setCancelled(true); //TODO: only way to prevent skull from dropping as item? + event.getToBlock().setType(Material.AIR); + } } //And explosions @EventHandler(ignoreCancelled = true) public void onEntityExplosionBreak(EntityExplodeEvent event) { - for (Block block : event.blockList()) - fireTemporaryBlockBreakEvent(block); + ArrayList blocks = new ArrayList(event.blockList()); + for (Block block : blocks) + { + if (fireTemporaryBlockBreakEvent(block)) + { + event.blockList().remove(block); + block.setType(Material.AIR); + } + } } //And other weird plugin explosions @EventHandler(ignoreCancelled = true) public void onBlockExplosionBreak(BlockExplodeEvent event) { - for (Block block : event.blockList()) - fireTemporaryBlockBreakEvent(block); + ArrayList blocks = new ArrayList(event.blockList()); + for (Block block : blocks) + { + if (fireTemporaryBlockBreakEvent(block)) + { + event.blockList().remove(block); + block.setType(Material.AIR); + } + } } - private void fireTemporaryBlockBreakEvent(Block block) + private boolean fireTemporaryBlockBreakEvent(Block block) { if (temporaryBlockList.containsKey(LiteLocation.fromLocation(block.getLocation()))) { TemporaryBlock temporaryBlock = temporaryBlockList.remove(LiteLocation.fromLocation(block.getLocation())); temporaryBlock.isBroken = true; - plugin.getServer().getPluginManager().callEvent(new TemporaryBlockBreakEvent(temporaryBlock, block)); + TemporaryBlockBreakEvent event = new TemporaryBlockBreakEvent(temporaryBlock); + plugin.getServer().getPluginManager().callEvent(event); + return event.isCancelled(); } + return false; } From 4736b7c51090d2df2060eb050d83a03933cd125e Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 11 Mar 2017 10:04:08 -0800 Subject: [PATCH 086/252] New feature in antifarming - Squids only spawn in ocean biomes Defaults to true --- .../com/extrahardmode/config/RootNode.java | 4 +++ .../extrahardmode/features/AntiFarming.java | 34 ++++++++++++++++--- .../extrahardmode/metrics/ConfigPlotter.java | 1 + .../temporaryblock/TemporaryBlockHandler.java | 2 +- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index b984c429..05e3468b 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -768,6 +768,10 @@ public enum RootNode implements ConfigNode * whether sheep will always regrow white wool */ SHEEP_REGROW_WHITE_WOOL("Farming.Sheep Grow Only White Wool", VarType.BOOLEAN, true), + /** + * whether squid will only be able to spawn in ocean biomes + */ + SQUID_ONLY_SPAWN_IN_OCEAN("Farming.Squid Only Spawn In Ocean", VarType.BOOLEAN, true), /** * whether players may move water source blocks */ diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index a7f86707..e28cf64b 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -44,6 +44,7 @@ import org.bukkit.event.block.*; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.SheepRegrowWoolEvent; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; @@ -89,7 +90,7 @@ public void starting() * * @param event - Event that occurred. */ - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) void onPlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); @@ -266,7 +267,7 @@ void onBlockDispense(BlockDispenseEvent event) * * @param event - Event that occurred. */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onSheepRegrowWool(SheepRegrowWoolEvent event) { World world = event.getEntity().getWorld(); @@ -283,7 +284,7 @@ public void onSheepRegrowWool(SheepRegrowWoolEvent event) } - @EventHandler(priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onEntitySpawn(CreatureSpawnEvent event) { LivingEntity entity = event.getEntity(); @@ -293,7 +294,7 @@ public void onEntitySpawn(CreatureSpawnEvent event) final boolean sheepRegrowWhiteEnabled = CFG.getBoolean(RootNode.SHEEP_REGROW_WHITE_WOOL, world.getName()); //Breed Sheep spawn white - if (sheepRegrowWhiteEnabled && entity instanceof Sheep) + if (sheepRegrowWhiteEnabled && entity.getType() == EntityType.SHEEP) { Sheep sheep = (Sheep) entity; if (reason.equals(CreatureSpawnEvent.SpawnReason.BREEDING)) @@ -305,6 +306,29 @@ public void onEntitySpawn(CreatureSpawnEvent event) } + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onSquidSpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason(); + World world = event.getLocation().getWorld(); + + final boolean restrictedSquidSpawns = CFG.getBoolean(RootNode.SQUID_ONLY_SPAWN_IN_OCEAN, world.getName()); + + if (restrictedSquidSpawns && entity.getType() == EntityType.SQUID && reason.equals(CreatureSpawnEvent.SpawnReason.NATURAL)) + { + switch (entity.getLocation().getBlock().getBiome()) + { + case DEEP_OCEAN: + case OCEAN: + return; + default: + event.setCancelled(true); + } + } + } + + @EventHandler public void onEntityDeath(EntityDeathEvent event) { @@ -404,7 +428,7 @@ public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) *

* prevent players from quickly picking up buckets again (around lava etc.) */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onPlayerFillBucket(PlayerBucketFillEvent event) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java index f7f5c4ac..b949363b 100644 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -107,6 +107,7 @@ public int getValue() case SUPER_HARD_STONE: case SUPER_HARD_STONE_PHYSICS: case SPIDERS_DROP_WEB_ON_DEATH: + case SQUID_ONLY_SPAWN_IN_OCEAN: case WEAK_FOOD_CROPS: case WITCHES_ADDITIONAL_ATTACKS: case ZOMBIES_DEBILITATE_PLAYERS: diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index 7c81e482..f72f9711 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -71,7 +71,7 @@ public void onEntityExplosionBreak(EntityExplodeEvent event) } } - //And other weird plugin explosions + //And also other plugin-caused explosions (and beds in the nether) @EventHandler(ignoreCancelled = true) public void onBlockExplosionBreak(BlockExplodeEvent event) { From 37aada7da9a4beb60e47b21c3f28eff0b05f0858 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 12 Mar 2017 00:34:47 -0800 Subject: [PATCH 087/252] re-order checks in Torches module block#getType is likely the expensive call here(?) --- src/main/java/com/extrahardmode/features/Torches.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index 766f4e83..1f06e3a4 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -93,7 +93,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.TORCHES); // FEATURE: players can't attach torches to common "soft" blocks - if (block.getType().equals(Material.TORCH) && limitedTorchPlacement && !playerBypasses) + if (limitedTorchPlacement && !playerBypasses && block.getType().equals(Material.TORCH)) { Torch torch = new Torch(Material.TORCH, block.getData()); Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); From d842ceccc0129af05849a828dbbf35a3656d48dd Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 12 Mar 2017 01:02:36 -0800 Subject: [PATCH 088/252] re-order torch check, part 2 y level check will usually only do one block#getType call, whereas attaching torches will call getType twice. Minor revision anyways, since the two usually won't coincide anyways. Also caching the block's type to prevent an extra call to it in the second feature. --- .../com/extrahardmode/features/Torches.java | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index 1f06e3a4..db6e8622 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -85,6 +85,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) { Player player = placeEvent.getPlayer(); Block block = placeEvent.getBlock(); + Material blockType = null; //cached only if either feature is enabled. Helps minimize extra calls to this semi-expensive(?) method World world = block.getWorld(); final boolean limitedTorchPlacement = CFG.getBoolean(RootNode.LIMITED_TORCH_PLACEMENT, world.getName()); @@ -92,32 +93,47 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final int torchMinY = CFG.getInt(RootNode.STANDARD_TORCH_MIN_Y, world.getName()); final boolean playerBypasses = playerModule.playerBypasses(player, Feature.TORCHES); - // FEATURE: players can't attach torches to common "soft" blocks - if (limitedTorchPlacement && !playerBypasses && block.getType().equals(Material.TORCH)) + // FEATURE: no standard torches, jack o lanterns, or fire on top of netherrack near diamond level + if (torchMinY > 0 && !playerBypasses) { - Torch torch = new Torch(Material.TORCH, block.getData()); - Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); - - if (attachmentMaterial == Material.DIRT || attachmentMaterial == Material.GRASS || attachmentMaterial == Material.LONG_GRASS - || attachmentMaterial == Material.SAND || attachmentMaterial == Material.GRAVEL) + if (world.getEnvironment() == World.Environment.NORMAL && block.getY() < torchMinY) { - if (soundFizzEnabled) - messenger.send(player, MessageNode.LIMITED_TORCH_PLACEMENTS, PermissionNode.SILENT_LIMITED_TORCH_PLACEMENT, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); - placeEvent.setCancelled(true); + blockType = block.getType(); + switch (blockType) + { + case FIRE: + if (block.getRelative(BlockFace.DOWN).getType() != Material.NETHERRACK) + break; + case TORCH: + case JACK_O_LANTERN: + messenger.send(player, MessageNode.NO_TORCHES_HERE, PermissionNode.SILENT_NO_TORCHES_HERE, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); + placeEvent.setCancelled(true); + return; + } } } - // FEATURE: no standard torches, jack o lanterns, or fire on top of netherrack near diamond level - if (torchMinY > 0 && !playerBypasses) + // FEATURE: players can't attach torches to common "soft" blocks + if (limitedTorchPlacement && !playerBypasses) { - if (world.getEnvironment() == World.Environment.NORMAL - && block.getY() < torchMinY - && (block.getType() == Material.TORCH || block.getType() == Material.JACK_O_LANTERN || (block.getType() == Material.FIRE && block - .getRelative(BlockFace.DOWN).getType() == Material.NETHERRACK))) + if (blockType == null) + blockType = block.getType(); + + if (blockType == Material.TORCH) { - messenger.send(player, MessageNode.NO_TORCHES_HERE, PermissionNode.SILENT_NO_TORCHES_HERE, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); - placeEvent.setCancelled(true); - return; + Torch torch = new Torch(Material.TORCH, block.getData()); + Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); + switch (attachmentMaterial) + { + case DIRT: + case GRASS: + case LONG_GRASS: + case SAND: + case GRAVEL: + if (soundFizzEnabled) + messenger.send(player, MessageNode.LIMITED_TORCH_PLACEMENTS, PermissionNode.SILENT_LIMITED_TORCH_PLACEMENT, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); + placeEvent.setCancelled(true); + } } } } From 80f9b90d9b9bd2e4fb0fee0cdbea63ba05759484 Mon Sep 17 00:00:00 2001 From: Erik1988 Date: Sun, 9 Apr 2017 21:06:26 +0200 Subject: [PATCH 089/252] Add new natural mob spawns (#75) * Guardians and Wither are exempt from water antigrinding rule. * The debug and tutorial module can be disabled. * Added new natural mob spawns - vex (caves), guardians(ocean and deep ocean), Vindicator (roofed forest) and Cave spider (Swampland) --- .../java/com/extrahardmode/ExtraHardMode.java | 30 ++++++-- .../com/extrahardmode/config/RootNode.java | 54 +++++++++++++ .../extrahardmode/features/AntiGrinder.java | 9 ++- .../features/monsters/CaveSpider.java | 75 +++++++++++++++++++ .../features/monsters/Guardians.java | 73 ++++++++++++++++++ .../features/monsters/KillerBunny.java | 75 +++++++++++++++++++ .../extrahardmode/features/monsters/Vex.java | 72 ++++++++++++++++++ .../features/monsters/Vindicator.java | 73 ++++++++++++++++++ 8 files changed, 453 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/extrahardmode/features/monsters/CaveSpider.java create mode 100644 src/main/java/com/extrahardmode/features/monsters/Guardians.java create mode 100644 src/main/java/com/extrahardmode/features/monsters/KillerBunny.java create mode 100644 src/main/java/com/extrahardmode/features/monsters/Vex.java create mode 100644 src/main/java/com/extrahardmode/features/monsters/Vindicator.java diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index cffc5459..3605bf1e 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -80,9 +80,17 @@ public void onEnable() registerModule(RootConfig.class, new RootConfig(this)); registerModule(MessageConfig.class, new MessageConfig(this)); - File rootFolder = new File(getDataFolder().getPath() + File.separator + "persistence" + File.separator); - rootFolder.mkdirs(); - registerModule(MsgPersistModule.class, new MsgPersistModule(this, rootFolder + File.separator + "messages_count.db")); + //TODO: add these in a global config? + if (!isNodeEnabled(RootNode.DISABLE_TUTORIAL)) + { + File rootFolder = new File(getDataFolder().getPath() + File.separator + "persistence" + File.separator); + rootFolder.mkdirs(); + registerModule(MsgPersistModule.class, new MsgPersistModule(this, rootFolder + File.separator + "messages_count.db")); + registerModule(Tutorial.class, new Tutorial(this)); + } + + if (!isNodeEnabled(RootNode.DISABLE_DEBUG)) + registerModule(DebugMode.class, new DebugMode(this)); registerModule(MsgModule.class, new MsgModule(this)); @@ -98,7 +106,6 @@ public void onEnable() registerModule(AntiFarming.class, new AntiFarming(this)); registerModule(AnimalCrowdControl.class, new AnimalCrowdControl(this)); registerModule(AntiGrinder.class, new AntiGrinder(this)); - registerModule(DebugMode.class, new DebugMode(this)); registerModule(Explosions.class, new Explosions(this)); registerModule(HardenedStone.class, new HardenedStone(this)); registerModule(LimitedBuilding.class, new LimitedBuilding(this)); @@ -137,8 +144,6 @@ public void onEnable() registerModule(CompatHandler.class, new CompatHandler(this)); registerModule(ExplosionCompatStorage.class, new ExplosionCompatStorage(this)); - //TODO make modules - registerModule(Tutorial.class, new Tutorial(this)); OurRandom.reload(); @@ -283,4 +288,17 @@ public Map, IModule> getModules() { return modules; } + + /** + * Determines if a config node is enabled in any world + * @param node + * @return True if enabled in a world, false if disabled everywhere + */ + public boolean isNodeEnabled(RootNode node) + { + for (World world : getServer().getWorlds()) + if (getModuleForClass(RootConfig.class).getBoolean(node, world.getName())) + return true; + return false; + } } diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 05e3468b..2c2e31db 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -52,6 +52,14 @@ public enum RootNode implements ConfigNode * Print Node Comments? */ PRINT_COMMENTS("Print Comments", VarType.BOOLEAN, true, "If comments like this should be printed"), + /** + * Globally disables certain modules. + * + */ + DISABLE_TUTORIAL("Disable.Tutorial", VarType.BOOLEAN, false, + "Disables the tutorial and persistence module"), + DISABLE_DEBUG("Disable.Debug", VarType.BOOLEAN, true, + "Disables the debug module"), /** * list of worlds where extra hard mode rules apply */ @@ -693,6 +701,52 @@ public enum RootNode implements ConfigNode */ BONUS_WITCH_SPAWN_PERCENT("Witches.Bonus Spawn Percent", VarType.INTEGER, SubType.PERCENTAGE, 5), + /** + * ########### + * # KillerBunny # + * ########### + */ + /** + * percentage of rabbits which spawn as killerbunnies + */ + BONUS_KILLERBUNNY_SPAWN_PERCENT("KillerBunny.Bonus Spawn Percent", VarType.INTEGER, SubType.PERCENTAGE, 1), + + /** + * ########### + * # Vindicator # + * ########### + */ + /** + * percentage of skeletons which spawn as vindicators in roofed forests. + */ + BONUS_VINDICATOR_SPAWN_PERCENT("Vindicator.Bonus Spawn Percent", VarType.INTEGER, SubType.PERCENTAGE, 20), + /** + * ########### + * # Cave Spider # + * ########### + */ + /** + * percentage of spiders which spawn as cave spiders in swamplands. + */ + BONUS_CAVESPIDER_SPAWN_PERCENT("CaveSpider.Bonus Spawn Percent", VarType.INTEGER, SubType.PERCENTAGE, 5), + /** + * ########### + * # Guardians # + * ########### + */ + /** + * percentage of squids which spawn as Guardians in ocean and deep ocean. + */ + BONUS_GUARDIANS_SPAWN_PERCENT("Guardians.Bonus Spawn Percent", VarType.INTEGER, SubType.PERCENTAGE, 20), + /** + * ########### + * # VEX # + * ########### + */ + /** + * percentage of bats which spawn as Vex. + */ + BONUS_VEX_SPAWN_PERCENT("Vex.Bonus Spawn Percent", VarType.INTEGER, SubType.PERCENTAGE, 5), /** * ################ * # ENDER DRAGON # diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index 96458aa4..df615ab1 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -162,16 +162,21 @@ public boolean onEntityDeath(EntityDeathEvent event) final boolean inhibitMonsterGrindersEnabled = CFG.getBoolean(RootNode.INHIBIT_MONSTER_GRINDERS, world.getName()); // FEATURE: monsters which take environmental damage or spawn from spawners don't drop loot and exp (monster grinder inhibitor) - if (inhibitMonsterGrindersEnabled && entity instanceof Monster && entity.getType() != EntityType.SQUID) + if (inhibitMonsterGrindersEnabled && entity instanceof Monster) { if (EntityHelper.isLootLess(entity)) { clearDrops(event); return false; - } else + } + else { //Evaluate if this kill was a too easy kill switch (entity.getType()) { + case WITHER: + case GUARDIAN: + case ELDER_GUARDIAN: + return true; case SKELETON: case ENDERMAN: { diff --git a/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java b/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java new file mode 100644 index 00000000..903916b0 --- /dev/null +++ b/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java @@ -0,0 +1,75 @@ + +package com.extrahardmode.features.monsters; + + +import com.extrahardmode.ExtraHardMode; + +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.module.EntityHelper; +import com.extrahardmode.service.ListenerModule; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +/** + * Cave Spider + */ +public class CaveSpider extends ListenerModule +{ + private RootConfig CFG; + + + public CaveSpider(ExtraHardMode plugin) + { + super(plugin); + } + + + @Override + public void starting() + { + super.starting(); + CFG = plugin.getModuleForClass(RootConfig.class); + } + + + /** + * When an Entity spawns: Spawn a Cave Spider sometimes instead of a spider in Swamps + * + * @param event which occurred + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + if (EntityHelper.isMarkedAsOurs(entity)) + return; + Location location = event.getLocation(); + World world = location.getWorld(); + EntityType entityType = entity.getType(); + + final int cavespiderSpawnPercent = CFG.getInt(RootNode.BONUS_CAVESPIDER_SPAWN_PERCENT, world.getName()); + + // FEATURE: CAVE SPIDERs spawns naturally in swamps. + if (entityType == EntityType.SPIDER && world.getEnvironment() == World.Environment.NORMAL + && entity.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.GRASS + && entity.getLocation().getBlock().getBiome() == Biome.SWAMPLAND + || entity.getLocation().getBlock().getBiome() == Biome.MUTATED_SWAMPLAND + && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) + { + if (plugin.random(cavespiderSpawnPercent)) + { + event.setCancelled(true); + EntityHelper.spawn(location, EntityType.CAVE_SPIDER); + } + } + } + +} diff --git a/src/main/java/com/extrahardmode/features/monsters/Guardians.java b/src/main/java/com/extrahardmode/features/monsters/Guardians.java new file mode 100644 index 00000000..a189b20e --- /dev/null +++ b/src/main/java/com/extrahardmode/features/monsters/Guardians.java @@ -0,0 +1,73 @@ + +package com.extrahardmode.features.monsters; + + +import com.extrahardmode.ExtraHardMode; + +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.module.EntityHelper; +import com.extrahardmode.service.ListenerModule; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +/** + * Guardians + */ +public class Guardians extends ListenerModule +{ + private RootConfig CFG; + + + public Guardians(ExtraHardMode plugin) + { + super(plugin); + } + + + @Override + public void starting() + { + super.starting(); + CFG = plugin.getModuleForClass(RootConfig.class); + } + + /** + * When an Entity spawns: Spawn a Guardians sometimes instead of a Squid + * + * @param event which occurred + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + if (EntityHelper.isMarkedAsOurs(entity)) + return; + Location location = event.getLocation(); + World world = location.getWorld(); + EntityType entityType = entity.getType(); + + final int guardiansSpawnPercent = CFG.getInt(RootNode.BONUS_GUARDIANS_SPAWN_PERCENT, world.getName()); + + // FEATURE: Guardians spawns naturally + if (entityType == EntityType.SQUID && world.getEnvironment() == World.Environment.NORMAL + && entity.getLocation().getBlock().getBiome() == Biome.DEEP_OCEAN + || entity.getLocation().getBlock().getBiome() == Biome.OCEAN + && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) + { + if (plugin.random(guardiansSpawnPercent)) + { + event.setCancelled(true); + EntityHelper.spawn(location, EntityType.GUARDIAN); + } + } + } + +} diff --git a/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java b/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java new file mode 100644 index 00000000..95642c1a --- /dev/null +++ b/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java @@ -0,0 +1,75 @@ + +package com.extrahardmode.features.monsters; + + +import com.extrahardmode.ExtraHardMode; + +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.module.EntityHelper; +import com.extrahardmode.service.ListenerModule; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +/** + * KillerBunny + */ +public class KillerBunny extends ListenerModule +{ + private RootConfig CFG; + + + public KillerBunny(ExtraHardMode plugin) + { + super(plugin); + } + + + @Override + public void starting() + { + super.starting(); + CFG = plugin.getModuleForClass(RootConfig.class); + } + + + /** + * When an Entity spawns: Spawn a killerbunny sometimes instead of a rabbit + * + * @param event which occurred + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + if (EntityHelper.isMarkedAsOurs(entity)) + return; + Location location = event.getLocation(); + World world = location.getWorld(); + EntityType entityType = entity.getType(); + + final int killerBunnySpawnPercent = CFG.getInt(RootNode.BONUS_KILLERBUNNY_SPAWN_PERCENT, world.getName()); + + // FEATURE: killer bunnies spawns naturally + if (entityType == EntityType.RABBIT && world.getEnvironment() == World.Environment.NORMAL + && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) + { + if (plugin.random(killerBunnySpawnPercent)) + { + event.setCancelled(true); + Rabbit rabbit = (Rabbit) EntityHelper.spawn(location, EntityType.RABBIT); + rabbit.setRabbitType(Rabbit.Type.THE_KILLER_BUNNY); + rabbit.setAdult(); + rabbit.setAgeLock(true); + rabbit.setBreed(false); + } + } + } + +} diff --git a/src/main/java/com/extrahardmode/features/monsters/Vex.java b/src/main/java/com/extrahardmode/features/monsters/Vex.java new file mode 100644 index 00000000..77514164 --- /dev/null +++ b/src/main/java/com/extrahardmode/features/monsters/Vex.java @@ -0,0 +1,72 @@ + +package com.extrahardmode.features.monsters; + + +import com.extrahardmode.ExtraHardMode; + +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.module.EntityHelper; +import com.extrahardmode.service.ListenerModule; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +/** + * Vex + */ +public class Vex extends ListenerModule +{ + private RootConfig CFG; + + + public Vex(ExtraHardMode plugin) + { + super(plugin); + } + + + @Override + public void starting() + { + super.starting(); + CFG = plugin.getModuleForClass(RootConfig.class); + } + + + /** + * When an Entity spawns: Spawn a Vex sometimes instead of a bat + * + * @param event which occurred + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + if (EntityHelper.isMarkedAsOurs(entity)) + return; + Location location = event.getLocation(); + World world = location.getWorld(); + EntityType entityType = entity.getType(); + + final int vexSpawnPercent = CFG.getInt(RootNode.BONUS_VEX_SPAWN_PERCENT, world.getName()); + + // FEATURE: vex spawns naturally + if (entityType == EntityType.BAT && world.getEnvironment() == World.Environment.NORMAL + && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) + { + if (plugin.random(vexSpawnPercent)) + { + event.setCancelled(true); + EntityHelper.spawn(location, EntityType.VEX); + } + } + } + +} diff --git a/src/main/java/com/extrahardmode/features/monsters/Vindicator.java b/src/main/java/com/extrahardmode/features/monsters/Vindicator.java new file mode 100644 index 00000000..a267957d --- /dev/null +++ b/src/main/java/com/extrahardmode/features/monsters/Vindicator.java @@ -0,0 +1,73 @@ + +package com.extrahardmode.features.monsters; + + +import com.extrahardmode.ExtraHardMode; + +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.module.EntityHelper; +import com.extrahardmode.service.ListenerModule; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +/** + * Vindicator + */ +public class Vindicator extends ListenerModule +{ + private RootConfig CFG; + + + public Vindicator(ExtraHardMode plugin) + { + super(plugin); + } + + + @Override + public void starting() + { + super.starting(); + CFG = plugin.getModuleForClass(RootConfig.class); + } + + /** + * When an Entity spawns: Spawn a Vindicator sometimes instead of a Skeleton + * + * @param event which occurred + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + if (EntityHelper.isMarkedAsOurs(entity)) + return; + Location location = event.getLocation(); + World world = location.getWorld(); + EntityType entityType = entity.getType(); + + final int vindicatorSpawnPercent = CFG.getInt(RootNode.BONUS_VINDICATOR_SPAWN_PERCENT, world.getName()); + + // FEATURE: Vindicator spawns naturally + if (entityType == EntityType.SKELETON && world.getEnvironment() == World.Environment.NORMAL + && entity.getLocation().getBlock().getBiome() == Biome.ROOFED_FOREST + || entity.getLocation().getBlock().getBiome() == Biome.MUTATED_ROOFED_FOREST + && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) + { + if (plugin.random(vindicatorSpawnPercent)) + { + event.setCancelled(true); + EntityHelper.spawn(location, EntityType.VINDICATOR); + } + } + } + +} From aadb331c864d4497c81515cf3464c7805dc7484f Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 9 Apr 2017 14:32:01 -0700 Subject: [PATCH 090/252] clarify And also fix an error... --- src/main/java/com/extrahardmode/ExtraHardMode.java | 9 ++++----- src/main/java/com/extrahardmode/config/RootNode.java | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 3605bf1e..63f4df49 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -79,9 +79,10 @@ public void onEnable() // Register modules registerModule(RootConfig.class, new RootConfig(this)); registerModule(MessageConfig.class, new MessageConfig(this)); + registerModule(MsgModule.class, new MsgModule(this)); - //TODO: add these in a global config? - if (!isNodeEnabled(RootNode.DISABLE_TUTORIAL)) + //TODO: add these in a (separate?), global config + if (isNodeEnabled(RootNode.ENABLE_TUTORIAL)) { File rootFolder = new File(getDataFolder().getPath() + File.separator + "persistence" + File.separator); rootFolder.mkdirs(); @@ -89,11 +90,9 @@ public void onEnable() registerModule(Tutorial.class, new Tutorial(this)); } - if (!isNodeEnabled(RootNode.DISABLE_DEBUG)) + if (isNodeEnabled(RootNode.ENABLE_DEBUG)) registerModule(DebugMode.class, new DebugMode(this)); - registerModule(MsgModule.class, new MsgModule(this)); - registerModule(DataStoreModule.class, new DataStoreModule(this)); registerModule(BlockModule.class, new BlockModule(this)); registerModule(UtilityModule.class, new UtilityModule(this)); diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 2c2e31db..af444f44 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -56,10 +56,10 @@ public enum RootNode implements ConfigNode * Globally disables certain modules. * */ - DISABLE_TUTORIAL("Disable.Tutorial", VarType.BOOLEAN, false, - "Disables the tutorial and persistence module"), - DISABLE_DEBUG("Disable.Debug", VarType.BOOLEAN, true, - "Disables the debug module"), + ENABLE_TUTORIAL("Enable.Tutorial", VarType.BOOLEAN, true, + "Enables the tutorial and persistence module"), + ENABLE_DEBUG("Enable.Debug", VarType.BOOLEAN, true, + "Enables the debug module"), /** * list of worlds where extra hard mode rules apply */ From 82ba2b69d63fe23b6060db906f3ac59de4565de8 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 9 Apr 2017 16:39:34 -0700 Subject: [PATCH 091/252] this disabling module madness is breaking far more than it solves Also we need an elegant solution, not a stupid hack. --- src/main/java/com/extrahardmode/ExtraHardMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 63f4df49..5570cfb6 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -80,6 +80,7 @@ public void onEnable() registerModule(RootConfig.class, new RootConfig(this)); registerModule(MessageConfig.class, new MessageConfig(this)); registerModule(MsgModule.class, new MsgModule(this)); + registerModule(DataStoreModule.class, new DataStoreModule(this)); //TODO: add these in a (separate?), global config if (isNodeEnabled(RootNode.ENABLE_TUTORIAL)) @@ -93,7 +94,6 @@ public void onEnable() if (isNodeEnabled(RootNode.ENABLE_DEBUG)) registerModule(DebugMode.class, new DebugMode(this)); - registerModule(DataStoreModule.class, new DataStoreModule(this)); registerModule(BlockModule.class, new BlockModule(this)); registerModule(UtilityModule.class, new UtilityModule(this)); registerModule(PlayerModule.class, new PlayerModule(this)); From 2067d3d9be6ae5d3229a51e2a20f4b7f2a74ac56 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 9 Apr 2017 16:48:26 -0700 Subject: [PATCH 092/252] revert the disable module config Either the modules have to be enabled in a certain order, or they're dependent on each other. Also, if these are impacting performance, we need to go about fixing these instead of just blanket-disabling them. Debug could probably be disabled, although it seems a bit involved to do so(?) - or it could just be simply removed. The tutorial module should have an individual option for storing persistent data. Might be worth creating a global config option for this (albeit it'd be the only option in there for the moment...) --- .../java/com/extrahardmode/ExtraHardMode.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 5570cfb6..62eb1f05 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -79,21 +79,14 @@ public void onEnable() // Register modules registerModule(RootConfig.class, new RootConfig(this)); registerModule(MessageConfig.class, new MessageConfig(this)); - registerModule(MsgModule.class, new MsgModule(this)); - registerModule(DataStoreModule.class, new DataStoreModule(this)); - //TODO: add these in a (separate?), global config - if (isNodeEnabled(RootNode.ENABLE_TUTORIAL)) - { - File rootFolder = new File(getDataFolder().getPath() + File.separator + "persistence" + File.separator); - rootFolder.mkdirs(); - registerModule(MsgPersistModule.class, new MsgPersistModule(this, rootFolder + File.separator + "messages_count.db")); - registerModule(Tutorial.class, new Tutorial(this)); - } + File rootFolder = new File(getDataFolder().getPath() + File.separator + "persistence" + File.separator); + rootFolder.mkdirs(); + registerModule(MsgPersistModule.class, new MsgPersistModule(this, rootFolder + File.separator + "messages_count.db")); - if (isNodeEnabled(RootNode.ENABLE_DEBUG)) - registerModule(DebugMode.class, new DebugMode(this)); + registerModule(MsgModule.class, new MsgModule(this)); + registerModule(DataStoreModule.class, new DataStoreModule(this)); registerModule(BlockModule.class, new BlockModule(this)); registerModule(UtilityModule.class, new UtilityModule(this)); registerModule(PlayerModule.class, new PlayerModule(this)); @@ -105,6 +98,7 @@ public void onEnable() registerModule(AntiFarming.class, new AntiFarming(this)); registerModule(AnimalCrowdControl.class, new AnimalCrowdControl(this)); registerModule(AntiGrinder.class, new AntiGrinder(this)); + registerModule(DebugMode.class, new DebugMode(this)); registerModule(Explosions.class, new Explosions(this)); registerModule(HardenedStone.class, new HardenedStone(this)); registerModule(LimitedBuilding.class, new LimitedBuilding(this)); @@ -143,6 +137,8 @@ public void onEnable() registerModule(CompatHandler.class, new CompatHandler(this)); registerModule(ExplosionCompatStorage.class, new ExplosionCompatStorage(this)); + //TODO make modules + registerModule(Tutorial.class, new Tutorial(this)); OurRandom.reload(); From 00c610c7f4896ebb4e4e6a7ab8426398f0bef6fb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 9 Apr 2017 16:50:26 -0700 Subject: [PATCH 093/252] see prior commit --- src/main/java/com/extrahardmode/config/RootNode.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index af444f44..5930e6a7 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -52,14 +52,6 @@ public enum RootNode implements ConfigNode * Print Node Comments? */ PRINT_COMMENTS("Print Comments", VarType.BOOLEAN, true, "If comments like this should be printed"), - /** - * Globally disables certain modules. - * - */ - ENABLE_TUTORIAL("Enable.Tutorial", VarType.BOOLEAN, true, - "Enables the tutorial and persistence module"), - ENABLE_DEBUG("Enable.Debug", VarType.BOOLEAN, true, - "Enables the debug module"), /** * list of worlds where extra hard mode rules apply */ From 8c842699d5d516f1b967206eaa2eec5fe40a130e Mon Sep 17 00:00:00 2001 From: Erik1988 Date: Sat, 20 May 2017 11:39:38 +0200 Subject: [PATCH 094/252] re-add the stuff I forgot to put back in, (#93) I'm tired ok --- src/main/java/com/extrahardmode/ExtraHardMode.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 62eb1f05..8d0d2b7b 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -132,7 +132,12 @@ public void onEnable() registerModule(Spiders.class, new Spiders(this)); registerModule(Zombies.class, new Zombies(this)); registerModule(Witches.class, new Witches(this)); - + registerModule(KillerBunny.class, new KillerBunny(this)); + registerModule(Vindicator.class, new Vindicator(this)); + registerModule(CaveSpider.class, new CaveSpider(this)); + registerModule(Guardians.class, new Guardians(this)); + registerModule(Vex.class, new Vex(this)); + //Compatibility registerModule(CompatHandler.class, new CompatHandler(this)); registerModule(ExplosionCompatStorage.class, new ExplosionCompatStorage(this)); From 525a1524d7603ad5f3cbccc7e89b4c7bdf45cd9b Mon Sep 17 00:00:00 2001 From: Erik1988 Date: Sun, 21 May 2017 21:35:35 +0200 Subject: [PATCH 095/252] This allows skeletons to somtimes replace the enderman spawns in the (#94) end. --- .../com/extrahardmode/config/RootNode.java | 4 +++ .../features/monsters/Skeletors.java | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 5930e6a7..04b89cfa 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -516,6 +516,10 @@ public enum RootNode implements ConfigNode * whether or not arrows will pass harmlessly through skeletons */ SKELETONS_DEFLECT_ARROWS("Skeletons.Deflect Arrows Percent", VarType.INTEGER, SubType.PERCENTAGE, 100), + /** + * percentage of EnderMan which spawn as Skeletons in the end. + */ + BONUS_SKELETON_SPAWN_PERCENT("Skeletons.Spawn in End Percent", VarType.INTEGER, SubType.PERCENTAGE, 10), /** * ############## diff --git a/src/main/java/com/extrahardmode/features/monsters/Skeletors.java b/src/main/java/com/extrahardmode/features/monsters/Skeletors.java index 50a07a2a..3671599b 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Skeletors.java +++ b/src/main/java/com/extrahardmode/features/monsters/Skeletors.java @@ -438,4 +438,32 @@ public static UUID getParentOfMinion(LivingEntity minion, Plugin plugin) } return minion.getUniqueId(); } + /** + * When an Entity spawns: Spawn a Skeleton sometimes instead of a EnderMan in the end. + * + * @param event which occurred + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) + { + LivingEntity entity = event.getEntity(); + if (EntityHelper.isMarkedAsOurs(entity)) + return; + Location location = event.getLocation(); + World world = location.getWorld(); + EntityType entityType = entity.getType(); + + final int cavespiderSpawnPercent = CFG.getInt(RootNode.BONUS_SKELETON_SPAWN_PERCENT, world.getName()); + + // FEATURE: Skeletons spawns naturally in The End. + if (entityType == EntityType.ENDERMAN && world.getEnvironment() == World.Environment.THE_END + && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) + { + if (plugin.random(cavespiderSpawnPercent)) + { + event.setCancelled(true); + EntityHelper.spawn(location, EntityType.SKELETON); + } + } + } } \ No newline at end of file From f250e28763cda710c30cb7df744611c7703c5f06 Mon Sep 17 00:00:00 2001 From: Erik1988 Date: Mon, 22 May 2017 01:30:26 +0200 Subject: [PATCH 096/252] Configurable dragon health (#95) * Config option to set dragon health Default is 800 Vanilla value is 200. --- .../com/extrahardmode/config/RootNode.java | 6 +++++- .../features/monsters/Glydia.java | 20 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 04b89cfa..c847ae69 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -780,7 +780,11 @@ public enum RootNode implements ConfigNode */ ENDER_DRAGON_NO_BUILDING("EnderDragon.No Building Allowed", VarType.BOOLEAN, true, "Block building in the end to prevent players from building big protective structures."), - + /** + * Sets the health of the Ender Dragon (200 is vanilla) + */ + ENDER_DRAGON_HEALTH("EnderDragon.Health", VarType.INTEGER, SubType.NATURAL_NUMBER, Disable.ZERO, 800, + "Sets the health of the Ender Dragon"), /** * ########### * # FARMING # diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 3bfd69d6..a0a149ba 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -360,7 +360,9 @@ void onPlayerChangeWorld(PlayerChangedWorldEvent event) // if he's there, full health if (enderDragon != null) { - enderDragon.setHealth(enderDragon.getMaxHealth()); + final int enderDragonHealth = CFG.getInt(RootNode.ENDER_DRAGON_HEALTH, world.getName()); + enderDragon.setMaxHealth(enderDragonHealth); + enderDragon.setHealth(enderDragon.getMaxHealth()); } // otherwise, spawn one @@ -370,7 +372,21 @@ else if (respawnDragon) } } } - + /** + * when ender dragon spawns + * set new max health + * + */ + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onEnderDragonSpawn(final CreatureSpawnEvent event) { + if (event.getEntityType() == EntityType.ENDER_DRAGON) { + Location location = event.getLocation(); + World world = location.getWorld(); + final int enderDragonHealth = CFG.getInt(RootNode.ENDER_DRAGON_HEALTH, world.getName()); + event.getEntity().setMaxHealth(enderDragonHealth); + event.getEntity().setHealth(event.getEntity().getMaxHealth()); + } + } /** * when an item spawns From f9dd952e0cb389b1f186817ce1eb043b73c0ddac Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 18 Jun 2017 00:21:11 -0700 Subject: [PATCH 097/252] Fix #92 --- src/main/java/com/extrahardmode/features/MoreTnt.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/MoreTnt.java b/src/main/java/com/extrahardmode/features/MoreTnt.java index e1e49090..32c245bc 100644 --- a/src/main/java/com/extrahardmode/features/MoreTnt.java +++ b/src/main/java/com/extrahardmode/features/MoreTnt.java @@ -64,6 +64,8 @@ public void beforeCraft(PrepareItemCraftEvent event) case 1: break; default: + if (event.getRecipe().getResult() == null) + return; if (event.getRecipe().getResult().getType().equals(Material.TNT)) { //TODO LOW EhmMoreTntEvent From 9ce54e01b050dae0425a747313e8df1305a8b6fa Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 18 Jun 2017 00:24:01 -0700 Subject: [PATCH 098/252] version 3.12 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3193142e..fa491422 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.11 + 3.12 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From fd6e17ff5f35443772069f2335c7069d597618b7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 18 Jun 2017 00:33:58 -0700 Subject: [PATCH 099/252] Use new BlockBreakEvent#setDropItems Probably useless for our cases, I thought it could be applied to the block. --- pom.xml | 2 +- .../module/temporaryblock/TemporaryBlockHandler.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index fa491422..d0548e5d 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.11.2 + 1.12 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index f72f9711..3302e080 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -40,8 +40,7 @@ public void onBlockBreak(BlockBreakEvent event) { if (fireTemporaryBlockBreakEvent(event.getBlock())) { - event.setCancelled(true); - event.getBlock().setType(Material.AIR); + event.setDropItems(false); } } From 72939fde5ee22279cb784469d0499e3e47566422 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 18 Jun 2017 20:23:36 -0700 Subject: [PATCH 100/252] Actually fix #92 --- src/main/java/com/extrahardmode/features/MoreTnt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/MoreTnt.java b/src/main/java/com/extrahardmode/features/MoreTnt.java index 32c245bc..9fdb470b 100644 --- a/src/main/java/com/extrahardmode/features/MoreTnt.java +++ b/src/main/java/com/extrahardmode/features/MoreTnt.java @@ -64,7 +64,7 @@ public void beforeCraft(PrepareItemCraftEvent event) case 1: break; default: - if (event.getRecipe().getResult() == null) + if (event.getRecipe() == null) //1.12 will return null I guess return; if (event.getRecipe().getResult().getType().equals(Material.TNT)) { From ae97e5deb31fea1a8c844d6f5304fd9075eafad7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 18 Jun 2017 20:23:44 -0700 Subject: [PATCH 101/252] Revert "Use new BlockBreakEvent#setDropItems" This reverts commit fd6e17ff5f35443772069f2335c7069d597618b7. --- pom.xml | 2 +- .../module/temporaryblock/TemporaryBlockHandler.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d0548e5d..fa491422 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.12 + 1.11.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index 3302e080..f72f9711 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -40,7 +40,8 @@ public void onBlockBreak(BlockBreakEvent event) { if (fireTemporaryBlockBreakEvent(event.getBlock())) { - event.setDropItems(false); + event.setCancelled(true); + event.getBlock().setType(Material.AIR); } } From 6270fca668e16b4bc7558991390c056b62d89a8b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 18 Jun 2017 20:24:23 -0700 Subject: [PATCH 102/252] v3.12.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa491422..c69b7b26 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.12 + 3.12.1 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 1c4da6496f9a90a946796b20a2e17475cc8f30e0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 4 Jul 2017 10:02:00 -0700 Subject: [PATCH 103/252] Cache results from db access Closes #100 --- .../module/MsgPersistModule.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/MsgPersistModule.java b/src/main/java/com/extrahardmode/module/MsgPersistModule.java index 6b12ff8d..9783567c 100644 --- a/src/main/java/com/extrahardmode/module/MsgPersistModule.java +++ b/src/main/java/com/extrahardmode/module/MsgPersistModule.java @@ -27,6 +27,7 @@ import com.extrahardmode.config.messages.MessageNode; import com.extrahardmode.config.messages.MsgCategory; import com.extrahardmode.service.EHMModule; +import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import org.apache.commons.lang.Validate; @@ -48,8 +49,8 @@ public class MsgPersistModule extends EHMModule /** Buffer player ids (playerName, playerId) */ private Map playerIdBuffer; - /** Buffer data from the db (playerid, message, value) */ - private Table buffer; + /** Cache data from the db (playerid, message, value) */ + private Table cache; /** @@ -69,6 +70,7 @@ public void starting() { messages = plugin.getModuleForClass(MessageConfig.class); playerIdBuffer = new HashMap(); + cache = HashBasedTable.create(); testJDBC(); initializeTables(); } @@ -262,6 +264,7 @@ public void increment(MessageNode node, String playerName) private void set(MessageNode node, int playerId, int value) { Validate.isTrue(value >= 0, "Count has to be positive"); + incrementCache(playerId, node, value); Connection conn = null; Statement statement = null; try @@ -314,6 +317,10 @@ public int getCountFor(MessageNode node, String playerName) */ private int getCountFor(MessageNode node, int playerId) { + //Check cache first + if (cache.contains(playerId, node)) + return cache.get(playerId, node); + Connection conn = null; Statement statement = null; ResultSet result = null; @@ -351,6 +358,9 @@ private int getCountFor(MessageNode node, int playerId) } } + //Save to cache + cache.put(playerId, node, value); + return value; } @@ -371,4 +381,12 @@ public void resetAll(String playerName) } } } + + private void incrementCache(int id, MessageNode node, int count) + { + if (!cache.contains(id, node)) + return; + count += cache.get(id, node); + cache.put(id, node, count); + } } From 5f57583799458744acf3b1b5ffd909175501d895 Mon Sep 17 00:00:00 2001 From: DylanHolmesDH Date: Thu, 12 Oct 2017 18:23:25 -0700 Subject: [PATCH 104/252] Typo in pigmen damage reduction calculation (#109) --- .../java/com/extrahardmode/features/monsters/PigMen.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/PigMen.java b/src/main/java/com/extrahardmode/features/monsters/PigMen.java index 49cb2c08..355d2747 100644 --- a/src/main/java/com/extrahardmode/features/monsters/PigMen.java +++ b/src/main/java/com/extrahardmode/features/monsters/PigMen.java @@ -152,8 +152,8 @@ public void onChunkLoad(ChunkLoadEvent event) @EventHandler public void onPlayerDamaged(EntityDamageByEntityEvent event) { - int damagePercentage = CFG.getInt(RootNode.PIG_ZOMBIE_DMG_PERCENT, event.getEntity().getWorld().getName()) / 100; - if (damagePercentage <= 0) + double damagePercentage = CFG.getInt(RootNode.PIG_ZOMBIE_DMG_PERCENT, event.getEntity().getWorld().getName()) / 100.0; + if (damagePercentage <= 0.0) return; if (event.getEntity() instanceof Player && event.getDamager() instanceof PigZombie) { @@ -207,4 +207,4 @@ public void onLightingStrike(LightningStrikeEvent event) } } } -} \ No newline at end of file +} From 6d7ae48ae99c3baec68ea77702a66bb1380e5f81 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 28 Mar 2018 18:24:18 -0700 Subject: [PATCH 105/252] update name for My Worlds to My_Worlds --- src/main/resources/plugin.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c7a3b272..0b99fe59 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,10 +4,10 @@ version: ${project.version} description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ #project lead -author: Diemex -authors: [Mitsugaru, Big_Scary, RoboMWM] +author: RoboMWM +authors: [Diemex, Big_Scary] #ensure that we are loaded after multiworld plugins -softdepend: [Multiverse-Core, My Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] +softdepend: [Multiverse-Core, My_Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] commands: ehm: description: Root command for ExtraHardMode @@ -75,4 +75,4 @@ permissions: default: no ExtraHardMode.silent.no_torches_here: description: hides the no torches here message - default: no \ No newline at end of file + default: no From da5a60f7e92d43ea8556ecfcb170794737d01915 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 4 Apr 2018 11:25:42 -0700 Subject: [PATCH 106/252] fix #103 --- .../java/com/extrahardmode/features/monsters/Glydia.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index a0a149ba..49d476fa 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -372,6 +372,7 @@ else if (respawnDragon) } } } + /** * when ender dragon spawns * set new max health @@ -383,8 +384,10 @@ public void onEnderDragonSpawn(final CreatureSpawnEvent event) { Location location = event.getLocation(); World world = location.getWorld(); final int enderDragonHealth = CFG.getInt(RootNode.ENDER_DRAGON_HEALTH, world.getName()); - event.getEntity().setMaxHealth(enderDragonHealth); - event.getEntity().setHealth(event.getEntity().getMaxHealth()); + if (enderDragonHealth <= 0) + return; + event.getEntity().setMaxHealth(enderDragonHealth); + event.getEntity().setHealth(event.getEntity().getMaxHealth()); } } From 1d0c586a925a07f5fd1249ddcf400ed0c4fbda4a Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 4 Apr 2018 11:29:38 -0700 Subject: [PATCH 107/252] fix ancient typos mentioned in #96 Closes #96 --- src/main/java/com/extrahardmode/features/AntiGrinder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index df615ab1..5583e817 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -177,7 +177,7 @@ public boolean onEntityDeath(EntityDeathEvent event) case GUARDIAN: case ELDER_GUARDIAN: return true; - case SKELETON: + case WITHER_SKELETON: case ENDERMAN: { // tall monsters can get stuck when they spawn like WitherSkeletons @@ -202,7 +202,7 @@ public boolean onEntityDeath(EntityDeathEvent event) } for (int i = 0; i < adjacentFaces.length; i++) { - adjacentBlocks[i + adjacentFaces.length] = underBlock.getRelative(adjacentFaces[i]); + adjacentBlocks[i + adjacentFaces.length + 1] = underBlock.getRelative(adjacentFaces[i]); } for (Block adjacentBlock : adjacentBlocks) From df571bbda5bb1ef9ca21f6b84e15e5a0ea9a2e54 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 4 Apr 2018 12:06:18 -0700 Subject: [PATCH 108/252] Use EntityPickupItemEvent closes #102 --- pom.xml | 2 +- src/main/java/com/extrahardmode/features/Water.java | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index c69b7b26..b71b4703 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.11.2 + 1.12.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/features/Water.java b/src/main/java/com/extrahardmode/features/Water.java index 7a120159..42526a3c 100644 --- a/src/main/java/com/extrahardmode/features/Water.java +++ b/src/main/java/com/extrahardmode/features/Water.java @@ -37,10 +37,12 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.EntityType; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -212,10 +214,13 @@ void onPlayerDropItem(PlayerDropItemEvent event) * @param event - Event that occurred. */ @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - void onPlayerPickupItem(PlayerPickupItemEvent event) + void onPlayerPickupItem(EntityPickupItemEvent event) { + if (event.getEntityType() != EntityType.PLAYER) + return; + // FEATURE: players can't swim when they're carrying a lot of weight - Player player = event.getPlayer(); + Player player = (Player)event.getEntity(); PlayerData playerData = plugin.getModuleForClass(DataStoreModule.class).getPlayerData(player.getName()); playerData.cachedWeightStatus = -1.0F; } From 0e6bc904dd115d2547b07549b8912fa616f2a4fa Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 29 Apr 2018 10:33:34 -0700 Subject: [PATCH 109/252] Add debug config node, print debug statements for antigrinder To assist in resolving #82 --- .../java/com/extrahardmode/ExtraHardMode.java | 6 +++++ .../com/extrahardmode/config/RootNode.java | 4 ++++ .../extrahardmode/features/AntiGrinder.java | 23 ++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 8d0d2b7b..505664ab 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -172,6 +172,12 @@ public void onEnable() new ConfigPlotter(this, getModuleForClass(RootConfig.class)); } + public void debug(World world, Object message) + { + if ((getModuleForClass(RootConfig.class)).getBoolean(RootNode.DEBUG, world.getName())) + System.out.println(message); + } + @Override public void onDisable() diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index c847ae69..f62e99fa 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -57,6 +57,10 @@ public enum RootNode implements ConfigNode */ WORLDS("Enabled Worlds", VarType.LIST, new DefaultWorlds(), "Set the worlds you want ehm active here. F.e. [world, world_nether]. \"@all\" enables ehm for all worlds"), + /** + * Whether debug messages should be printed to console + */ + DEBUG("Debug", VarType.BOOLEAN, false, "Whether debug messages should be printed to console."), /** * ############# diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index 5583e817..8323ed43 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -166,6 +166,9 @@ public boolean onEntityDeath(EntityDeathEvent event) { if (EntityHelper.isLootLess(entity)) { + plugin.debug(world, event.getEntity().getType().name() + + "'s drops at " + entity.getLocation() + " was cleared " + + "(was from a spawner or environmental damage was >50% )"); clearDrops(event); return false; } @@ -182,7 +185,11 @@ public boolean onEntityDeath(EntityDeathEvent event) { // tall monsters can get stuck when they spawn like WitherSkeletons if (entity.getEyeLocation().getBlock().getType() != Material.AIR) + { + plugin.debug(world, event.getEntity().getType().name() + + "'s drops at " + entity.getLocation() + " was cleared (spawned inside a block)"); return clearDrops(event); + } break; } default: @@ -207,8 +214,13 @@ public boolean onEntityDeath(EntityDeathEvent event) for (Block adjacentBlock : adjacentBlocks) { - if (adjacentBlock != null && (adjacentBlock.getType() == Material.WATER || adjacentBlock.getType() == Material.STATIONARY_WATER)) + if (adjacentBlock != null && (adjacentBlock.getType() == Material.WATER + || adjacentBlock.getType() == Material.STATIONARY_WATER)) + { + plugin.debug(world, event.getEntity().getType().name() + + "'s drops at " + entity.getLocation() + " was cleared (in/near water)"); return clearDrops(event); + } } // also no loot for monsters who can't reach their (melee) killers @@ -231,7 +243,13 @@ public boolean onEntityDeath(EntityDeathEvent event) { // monster is blocked at eye level, unable to advance toward killer if (middleLocation.getBlock().getType() != Material.AIR) + { + plugin.debug(world, event.getEntity().getType().name() + + "'s drops at " + entity.getLocation() + " was cleared " + + "(blocked at eye level, was unable to reach killer)"); return clearDrops(event); + } + // monster doesn't have room above to hurdle a foot level block, unable to advance toward killer else { @@ -244,6 +262,9 @@ public boolean onEntityDeath(EntityDeathEvent event) || bottom.getType() == Material.COBBLE_WALL || bottom.getType() == Material.NETHER_FENCE) { + plugin.debug(world, event.getEntity().getType().name() + + "'s drops at " + entity.getLocation() + " was cleared " + + "(Unable to jump over a block due to low ceiling.)"); return clearDrops(event); } } From c368c2a3a231dd9c2172b9d8f862c49a44f4a8a6 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 18 Aug 2018 22:49:31 -0700 Subject: [PATCH 110/252] Start updating to 1.13 - there's quite a bit to do... There's quite a few abstracted data types that rely on IDs and data values and whatnot, so this is... going to take some time. --- pom.xml | 2 +- .../features/AnimalCrowdControl.java | 3 +- .../extrahardmode/features/AntiFarming.java | 8 +-- .../extrahardmode/features/AntiGrinder.java | 12 ++-- .../features/LimitedBuilding.java | 2 +- .../com/extrahardmode/features/MoreTnt.java | 2 +- .../features/RealisticChopping.java | 68 ++++++++----------- .../features/monsters/Blazes.java | 2 +- .../features/monsters/CaveSpider.java | 4 +- .../features/monsters/Endermen.java | 6 +- .../features/monsters/Glydia.java | 4 +- .../features/monsters/PigMen.java | 4 +- .../features/monsters/Silverfish.java | 2 +- .../features/monsters/Spiders.java | 2 +- .../features/monsters/Vindicator.java | 3 +- .../features/monsters/Zombies.java | 4 +- .../com/extrahardmode/module/BlockModule.java | 50 +++++++------- 17 files changed, 83 insertions(+), 95 deletions(-) diff --git a/pom.xml b/pom.xml index b71b4703..d5edffc3 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.12.2 + 1.13 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index d5e97988..fa04fab8 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -8,6 +8,7 @@ import com.extrahardmode.service.ListenerModule; import java.util.List; import org.bukkit.Effect; +import org.bukkit.Particle; import org.bukkit.World; import org.bukkit.entity.Animals; import org.bukkit.entity.Entity; @@ -133,7 +134,7 @@ public void run() { } if(dizziness < maxDizziness) { - world.spigot().playEffect(animal.getLocation(), Effect.VILLAGER_THUNDERCLOUD); + world.spawnParticle(Particle.VILLAGER_ANGRY, animal.getLocation(), 1); //TODO: confirm if this works } dizziness++; } diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index e28cf64b..03f38c2b 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -110,7 +110,7 @@ void onPlayerInteract(PlayerInteractEvent event) Material materialInHand = player.getItemInHand().getType(); // if bonemeal, cancel the event - if (materialInHand == Material.INK_SACK) // bukkit labels bonemeal as ink sack + if (materialInHand == Material.BONE_MEAL) { event.setCancelled(true); } @@ -137,10 +137,10 @@ public void onBlockBreak(BlockBreakEvent breakEvent) // FEATURE: no nether wart farming (always drops exactly 1 nether wart when broken) if (!playerBypasses && noFarmingNetherWart) { - if (block.getType() == Material.NETHER_WARTS) + if (block.getType() == Material.NETHER_WART_BLOCK) { block.getDrops().clear(); - block.getDrops().add(new ItemStack(Material.NETHER_STALK)); + block.getDrops().add(new ItemStack(Material.NETHER_WART)); } } } @@ -162,7 +162,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.ANTIFARMING); // FEATURE: no farming/placing nether wart - if (!playerBypasses && noFarmingNetherWart && block.getType() == Material.NETHER_WARTS) + if (!playerBypasses && noFarmingNetherWart && block.getType() == Material.NETHER_WART_BLOCK) { placeEvent.setCancelled(true); return; diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index 8323ed43..ac97f729 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -132,7 +132,7 @@ public boolean onEntitySpawn(CreatureSpawnEvent event) } break; case THE_END: - if (underBlockType != Material.ENDER_STONE && underBlockType != Material.OBSIDIAN && underBlockType != Material.AIR/*dragon*/) + if (underBlockType != Material.END_STONE && underBlockType != Material.OBSIDIAN && underBlockType != Material.AIR/*dragon*/) { event.setCancelled(true); return false; @@ -214,8 +214,7 @@ public boolean onEntityDeath(EntityDeathEvent event) for (Block adjacentBlock : adjacentBlocks) { - if (adjacentBlock != null && (adjacentBlock.getType() == Material.WATER - || adjacentBlock.getType() == Material.STATIONARY_WATER)) + if (adjacentBlock != null && (adjacentBlock.getType() == Material.WATER)) { plugin.debug(world, event.getEntity().getType().name() + "'s drops at " + entity.getLocation() + " was cleared (in/near water)"); @@ -257,10 +256,9 @@ public boolean onEntityDeath(EntityDeathEvent event) Block top = middleLocation.getBlock().getRelative(BlockFace.UP); if (top.getType() != Material.AIR && bottom.getType() != Material.AIR - || bottom.getType() == Material.FENCE - || bottom.getType() == Material.FENCE_GATE - || bottom.getType() == Material.COBBLE_WALL - || bottom.getType() == Material.NETHER_FENCE) + //Since this feature seems to cause issues anyways, I'm gonna do a lazy check for fences and fence gates + || bottom.getType().name().contains("_FENCE") + || bottom.getType() == Material.COBBLESTONE_WALL) { plugin.debug(world, event.getEntity().getType().name() + "'s drops at " + entity.getLocation() + " was cleared " + diff --git a/src/main/java/com/extrahardmode/features/LimitedBuilding.java b/src/main/java/com/extrahardmode/features/LimitedBuilding.java index 4220b3f2..4615592b 100644 --- a/src/main/java/com/extrahardmode/features/LimitedBuilding.java +++ b/src/main/java/com/extrahardmode/features/LimitedBuilding.java @@ -103,7 +103,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) } // if standing directly over lava, prevent placement - else if ((underBlock.getType() == Material.AIR || underBlock.getType() == Material.LAVA || underBlock.getType() == Material.STATIONARY_LAVA) + else if ((underBlock.getType() == Material.AIR || underBlock.getType() == Material.LAVA) && !(playerBlock.getType().name().contains("STEP") && playerBlock.getType().name().contains("STAIRS")) && block.getRelative(BlockFace.DOWN).getType() == Material.AIR) { diff --git a/src/main/java/com/extrahardmode/features/MoreTnt.java b/src/main/java/com/extrahardmode/features/MoreTnt.java index 9fdb470b..937170a9 100644 --- a/src/main/java/com/extrahardmode/features/MoreTnt.java +++ b/src/main/java/com/extrahardmode/features/MoreTnt.java @@ -74,7 +74,7 @@ public void beforeCraft(PrepareItemCraftEvent event) CraftingInventory craftInv = event.getInventory(); //The vanilla tnt recipe - ShapedRecipe vanillaTnt = new ShapedRecipe(new ItemStack(Material.TNT)).shape("gsg", "sgs", "gsg").setIngredient('g', Material.SULPHUR).setIngredient('s', Material.SAND); + ShapedRecipe vanillaTnt = new ShapedRecipe(new ItemStack(Material.TNT)).shape("gsg", "sgs", "gsg").setIngredient('g', Material.GUNPOWDER).setIngredient('s', Material.SAND); //Multiply the amount of tnt in enabled worlds if (UtilityModule.isSameRecipe(craftRecipe, vanillaTnt)) diff --git a/src/main/java/com/extrahardmode/features/RealisticChopping.java b/src/main/java/com/extrahardmode/features/RealisticChopping.java index c8147b66..6cf25869 100644 --- a/src/main/java/com/extrahardmode/features/RealisticChopping.java +++ b/src/main/java/com/extrahardmode/features/RealisticChopping.java @@ -31,6 +31,7 @@ import com.extrahardmode.service.ListenerModule; import com.extrahardmode.task.FallingLogsTask; import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -99,64 +100,51 @@ public void onBlockBreak(BlockBreakEvent breakEvent) final boolean playerHasBypass = playerModule.playerBypasses(player, Feature.REALISTIC_CHOPPING); // FEATURE: trees chop more naturally - if ((block.getType() == Material.LOG || block.getType() == Material.LOG_2) && betterTreeChoppingEnabled && !playerHasBypass) + if (Tag.LOGS.isTagged(block.getType()) && betterTreeChoppingEnabled && !playerHasBypass) { //Are there any leaves above the log? -> tree boolean isTree = false; - checkers: for (int i = 1; i < 30; i++) { Material upType = block.getRelative(BlockFace.UP, i).getType(); - switch (upType) + //skip to next iteration + //if something other than log/air this is most likely part of a building + if (Tag.LEAVES.isTagged(upType)) { - case LEAVES: - case LEAVES_2: - { - isTree = true; - break checkers; - } - case AIR: - case LOG: - case LOG_2: - { - break; //skip to next iteration - } - default: //if something other than log/air this is most likely part of a building - { - break checkers; - } + isTree = true; + break; + } + else if (!Tag.LOGS.isTagged(upType)) + { + break; } } if (isTree) { Block aboveLog = block.getRelative(BlockFace.UP); - loop: for (int limit = 0; limit < 30; limit++) { - switch (aboveLog.getType()) + Material aboveLogType = aboveLog.getType();//can air fall? +//we reached something that is not part of a tree or leaves + if (aboveLogType == Material.AIR) { - case AIR: - { - List logs = new LinkedList(Arrays.asList(blockModule.getBlocksInArea(aboveLog.getLocation(), 1, 5, Material.LOG))); - logs.addAll(Arrays.asList(blockModule.getBlocksInArea(aboveLog.getLocation(), 3, 5, Material.LOG_2))); - for (Block log : logs) - { - //TODO EhmRealisticChoppingLooseLogEvent - //check 2 blocks down for logs to see if it it's a stem - if (log.getRelative(BlockFace.DOWN).getType() != Material.LOG && !(log.getRelative(BlockFace.DOWN, 2).getType() == Material.LOG || log.getRelative(BlockFace.DOWN, 2).getType() == Material.LOG_2)) - plugin.getServer().getScheduler().runTaskLater(plugin, new FallingLogsTask(plugin, log), plugin.getRandom().nextInt(50/*so they don't fall at once*/)); - } - break; //can air fall? - } - case LOG: - case LOG_2: + List logs = new LinkedList(Arrays.asList(blockModule.getBlocksInArea(aboveLog.getLocation(), 3, 5, Tag.LOGS))); + for (Block log : logs) { - blockModule.applyPhysics(aboveLog, false); - break; + //TODO EhmRealisticChoppingLooseLogEvent + //check 2 blocks down for logs to see if it it's a stem + if (!Tag.LOGS.isTagged(log.getRelative(BlockFace.DOWN).getType())) + plugin.getServer().getScheduler().runTaskLater(plugin, new FallingLogsTask(plugin, log), plugin.getRandom().nextInt(50/*so they don't fall at once*/)); } - default: //we reached something that is not part of a tree or leaves - break loop; + } + else if (Tag.LOGS.isTagged(aboveLogType)) + { + blockModule.applyPhysics(aboveLog, false); + } + else + { + break; } aboveLog = aboveLog.getRelative(BlockFace.UP); } diff --git a/src/main/java/com/extrahardmode/features/monsters/Blazes.java b/src/main/java/com/extrahardmode/features/monsters/Blazes.java index 1a7ba592..2d537429 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Blazes.java +++ b/src/main/java/com/extrahardmode/features/monsters/Blazes.java @@ -146,7 +146,7 @@ public void onEntityDeath(EntityDeathEvent event) // 50% chance of each if (plugin.getRandom().nextInt(2) == 0) { - event.getDrops().add(new ItemStack(Material.SULPHUR, 2)); + event.getDrops().add(new ItemStack(Material.GUNPOWDER, 2)); } else { event.getDrops().add(new ItemStack(Material.GLOWSTONE_DUST, 2)); diff --git a/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java b/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java index 903916b0..506fc432 100644 --- a/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java +++ b/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java @@ -60,8 +60,8 @@ public void onEntitySpawn(CreatureSpawnEvent event) // FEATURE: CAVE SPIDERs spawns naturally in swamps. if (entityType == EntityType.SPIDER && world.getEnvironment() == World.Environment.NORMAL && entity.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.GRASS - && entity.getLocation().getBlock().getBiome() == Biome.SWAMPLAND - || entity.getLocation().getBlock().getBiome() == Biome.MUTATED_SWAMPLAND + && entity.getLocation().getBlock().getBiome() == Biome.SWAMP + || entity.getLocation().getBlock().getBiome() == Biome.SWAMP_HILLS && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) { if (plugin.random(cavespiderSpawnPercent)) diff --git a/src/main/java/com/extrahardmode/features/monsters/Endermen.java b/src/main/java/com/extrahardmode/features/monsters/Endermen.java index 672e9b5b..e35b8969 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Endermen.java +++ b/src/main/java/com/extrahardmode/features/monsters/Endermen.java @@ -102,7 +102,7 @@ public void onEntityTeleport(EntityTeleportEvent event) int distanceSquared = (int) player.getLocation().distanceSquared(enderman.getLocation()); // play sound at old location - world.playSound(player.getLocation(), Sound.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F); + world.playSound(player.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 1.0F); Block destinationBlock; // if the player is far away @@ -131,7 +131,7 @@ public void onEntityTeleport(EntityTeleportEvent event) //Prevent Enderman from loosing aggro because player got ported into water Material underType = destinationBlock.getRelative(BlockFace.DOWN).getType(); - if (underType == Material.WATER || underType == Material.STATIONARY_WATER) + if (underType == Material.WATER) return; EhmEndermanTeleportEvent teleportEvent = new EhmEndermanTeleportEvent(player, enderman, destinationBlock.getLocation()); @@ -142,7 +142,7 @@ public void onEntityTeleport(EntityTeleportEvent event) player.teleport(teleportEvent.getTeleportTo(), PlayerTeleportEvent.TeleportCause.ENDER_PEARL); // play sound at new location - world.playSound(player.getLocation(), Sound.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F); + world.playSound(player.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 1.0F); event.setCancelled(true); } } diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 49d476fa..6ad8735d 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -107,7 +107,7 @@ public void onBlockBreak(BlockBreakEvent breakEvent) // FEATURE: very limited building in the end, players are allowed to break only end stone, and only to create a stair up to ground level if (endNoBuilding && world.getEnvironment() == World.Environment.THE_END && !playerBypass) { - if (block.getType() != Material.ENDER_STONE) + if (block.getType() != Material.END_STONE) { breakEvent.setCancelled(true); messenger.send(player, MessageNode.LIMITED_END_BUILDING); @@ -177,7 +177,7 @@ public void onEntityDeath(EntityDeathEvent event) { if (glydiaDropsEggs) { - ItemStack itemStack = new ItemStack(Material.MONSTER_EGG, 2, (short) 120); + ItemStack itemStack = new ItemStack(Material.INFESTED_STONE, 2, (short) 120); world.dropItemNaturally(entity.getLocation().add(10, 0, 0), itemStack); } diff --git a/src/main/java/com/extrahardmode/features/monsters/PigMen.java b/src/main/java/com/extrahardmode/features/monsters/PigMen.java index 355d2747..38128f59 100644 --- a/src/main/java/com/extrahardmode/features/monsters/PigMen.java +++ b/src/main/java/com/extrahardmode/features/monsters/PigMen.java @@ -86,11 +86,11 @@ public void onEntityDeath(EntityDeathEvent event) { Block underBlock = entity.getLocation().getBlock().getRelative(BlockFace.DOWN); if (pigWartFortress && underBlock.getType() == Material.NETHER_BRICK) - event.getDrops().add(new ItemStack(Material.NETHER_STALK)); + event.getDrops().add(new ItemStack(Material.NETHER_WART)); // FEATURE: pig zombies sometimes drop nether wart when slain elsewhere else if (pigWartDropEveryWherePercent > 0 && plugin.random(pigWartDropEveryWherePercent)) - event.getDrops().add(new ItemStack(Material.NETHER_STALK)); + event.getDrops().add(new ItemStack(Material.NETHER_WART)); } } diff --git a/src/main/java/com/extrahardmode/features/monsters/Silverfish.java b/src/main/java/com/extrahardmode/features/monsters/Silverfish.java index 66583617..65cf9fbe 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Silverfish.java +++ b/src/main/java/com/extrahardmode/features/monsters/Silverfish.java @@ -77,7 +77,7 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) //Prevent Silverfish from entering blocks? if (silverFishCantEnter) { - if (event.getEntity().getType() == EntityType.SILVERFISH && event.getTo() == Material.MONSTER_EGGS) + if (event.getEntity().getType() == EntityType.SILVERFISH && event.getTo() == Material.INFESTED_STONE) //TODO: check for other infested variants? (1.13 change) { event.setCancelled(true); } diff --git a/src/main/java/com/extrahardmode/features/monsters/Spiders.java b/src/main/java/com/extrahardmode/features/monsters/Spiders.java index 386e3a73..8004ca42 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Spiders.java +++ b/src/main/java/com/extrahardmode/features/monsters/Spiders.java @@ -167,7 +167,7 @@ public void onEntityDeath(EntityDeathEvent event) if (!nextToCactus) { - block.setType(Material.WEB); + block.setType(Material.COBWEB); changedBlocks.add(block); } } diff --git a/src/main/java/com/extrahardmode/features/monsters/Vindicator.java b/src/main/java/com/extrahardmode/features/monsters/Vindicator.java index a267957d..cc43eb22 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Vindicator.java +++ b/src/main/java/com/extrahardmode/features/monsters/Vindicator.java @@ -58,8 +58,7 @@ public void onEntitySpawn(CreatureSpawnEvent event) // FEATURE: Vindicator spawns naturally if (entityType == EntityType.SKELETON && world.getEnvironment() == World.Environment.NORMAL - && entity.getLocation().getBlock().getBiome() == Biome.ROOFED_FOREST - || entity.getLocation().getBlock().getBiome() == Biome.MUTATED_ROOFED_FOREST + && entity.getLocation().getBlock().getBiome() == Biome.FOREST //TODO: formerly roofed and mutated roofed forest. Need confirmation from @erik1988 if this is sufficient && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) { if (plugin.random(vindicatorSpawnPercent)) diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index e7d34f3f..6c47c693 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -126,7 +126,7 @@ public void onEntityDeath(EntityDeathEvent event) TemporaryBlock tempBlock = null; //Water washes skulls away which then drop to the ground, cancelling the BlockFromToEvent didn't prevent the skull from dropping Material type = entity.getLocation().getBlock().getType(); - if (placeSkulls && (type != Material.WATER && type != Material.STATIONARY_WATER)) + if (placeSkulls && type != Material.WATER) { Block block = entity.getLocation().getBlock(); //Don't replace blocks that aren't air, but aren't solid either @@ -136,7 +136,7 @@ public void onEntityDeath(EntityDeathEvent event) location.setY(location.getY()+1); block = location.getBlock(); } - block.setType(Material.SKULL); + block.setType(Material.ZOMBIE_HEAD); Skull skull = (Skull) block.getState(); skull.setSkullType(SkullType.ZOMBIE); //Random rotation diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index bc0a8a39..e07c77b2 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -31,6 +31,7 @@ import com.extrahardmode.task.BlockPhysicsCheckTask; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; @@ -109,10 +110,10 @@ public UUID applyPhysics(Block block, boolean damageEntities) return null; // grass and mycel become dirt when they fall - if ((block.getType() == Material.GRASS || block.getType() == Material.MYCEL) && CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_TURN_TO_DIRT, block.getWorld().getName())) + if ((block.getType() == Material.GRASS || block.getType() == Material.MYCELIUM) && CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_TURN_TO_DIRT, block.getWorld().getName())) block.setType(Material.DIRT); - FallingBlock fallingBlock = block.getWorld().spawnFallingBlock(block.getLocation().add(0.5D, 0.0D, 0.5D), block.getTypeId(), block.getData()); + FallingBlock fallingBlock = block.getWorld().spawnFallingBlock(block.getLocation().add(0.5D, 0.0D, 0.5D), block.getBlockData()); fallingBlock.setDropItem(CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_DROP_ITEM, block.getWorld().getName())); // remove original block CompatHandler.logFallingBlockFall(block); @@ -146,7 +147,7 @@ public UUID applyPhysics(Block block, boolean damageEntities) EntityHelper.markAsOurs(plugin, fallingBlock); //TODO: Figure out how to make cancelable (ultra low priority) - plugin.getServer().getPluginManager().callEvent(new EntityChangeBlockEvent(fallingBlock, block, Material.AIR, (byte)0)); + plugin.getServer().getPluginManager().callEvent(new EntityChangeBlockEvent(fallingBlock, block, Material.AIR.createBlockData())); return fallingBlock.getUniqueId(); } @@ -212,7 +213,7 @@ public boolean plantDies(Block block, MaterialData newDataValue) if (newDataValue.getData() >= 7) { Material material = block.getType(); - if (material == Material.CROPS || material == Material.CARROT || material == Material.POTATO || material == Material.BEETROOT_BLOCK) + if (material == Material.WHEAT || material == Material.CARROTS || material == Material.POTATOES || material == Material.BEETROOTS) { int deathProbability = lossRate; @@ -233,7 +234,7 @@ public boolean plantDies(Block block, MaterialData newDataValue) // unwatered crops are more likely to die Block belowBlock = block.getRelative(BlockFace.DOWN); byte moistureLevel = 0; - if (belowBlock.getType() == Material.SOIL) + if (belowBlock.getType() == Material.FARMLAND) { moistureLevel = belowBlock.getData(); } @@ -296,11 +297,11 @@ public static BlockFace[] getHorizontalAdjacentFaces() * @param loc Center of the search area * @param height how many blocks up to check * @param radius of the search (cubic search radius) - * @param type of Material to search for + * @param tag of Material to search for * * @return all the Block with the given Type in the specified radius */ - public Block[] getBlocksInArea(Location loc, int height, int radius, Material type) + public Block[] getBlocksInArea(Location loc, int height, int radius, Tag tag) { List blocks = new ArrayList(); //Height @@ -311,7 +312,7 @@ public Block[] getBlocksInArea(Location loc, int height, int radius, Material ty for (int z = -radius; z <= radius; z++) { Block checkBlock = loc.getBlock().getRelative(x, y, z); - if (checkBlock.getType().equals(type)) + if (tag.isTagged(checkBlock.getType())) { blocks.add(checkBlock); } @@ -332,12 +333,12 @@ public Block[] getBlocksInArea(Location loc, int height, int radius, Material ty public boolean breaksFallingBlock(Material mat) { return (mat.isTransparent() && - mat != Material.PORTAL && - mat != Material.ENDER_PORTAL) || - mat == Material.WEB || + mat != Material.NETHER_PORTAL && + mat != Material.END_PORTAL) || + mat == Material.COBWEB || mat == Material.DAYLIGHT_DETECTOR || - mat == Material.TRAP_DOOR || - mat == Material.SIGN_POST || + Tag.TRAPDOORS.isTagged(mat) || + mat == Material.SIGN || mat == Material.WALL_SIGN || //Match all slabs besides double slab slabPattern.matcher(mat.name()).matches(); @@ -347,12 +348,12 @@ public boolean breaksFallingBlock(Material mat) /** Returns if Material is a plant that should be affected by the farming Rules */ public boolean isPlant(Material material) { - return material.equals(Material.CROPS) + return material.equals(Material.WHEAT) || material.equals(Material.POTATO) || material.equals(Material.CARROT) || material.equals(Material.MELON_STEM) || material.equals(Material.PUMPKIN_STEM) - || material.equals(Material.BEETROOT_BLOCK); + || material.equals(Material.BEETROOTS); } @@ -365,8 +366,8 @@ public boolean isPlant(Material material) */ public static boolean isHorseFood(Material material) { - return material.equals(Material.CARROT_ITEM) - || material.equals(Material.POTATO_ITEM) + return material.equals(Material.CARROT) + || material.equals(Material.POTATO) || material.equals(Material.APPLE) //|| material.equals(Material.HAY_BLOCK) || material.equals(Material.WHEAT); @@ -383,7 +384,7 @@ public static boolean isTool(Material material) || material.name().endsWith("BUCKET") //water, milk, lava,.. || material.equals(Material.BOW) || material.equals(Material.FISHING_ROD) - || material.equals(Material.WATCH) + || material.equals(Material.CLOCK) || material.equals(Material.COMPASS) || material.equals(Material.FLINT_AND_STEEL); } @@ -458,29 +459,30 @@ else if (placed.getZ() != against.getZ() && playerBlock.getZ() == against.getZ() */ public static Material getDroppedMaterial(Material mat) { + if (Tag.LEAVES.isTagged(mat)) + return Material.AIR; + switch (mat) { case GRASS: - case SOIL: + case FARMLAND: return Material.DIRT; case STONE: return Material.COBBLESTONE; case COAL_ORE: return Material.COAL; case LAPIS_ORE: - return Material.INK_SACK; + return Material.INK_SAC; case EMERALD_ORE: return Material.EMERALD; case REDSTONE_ORE: - case GLOWING_REDSTONE_ORE: return Material.REDSTONE; case DIAMOND_ORE: return Material.DIAMOND; - case QUARTZ_ORE: + case NETHER_QUARTZ_ORE: return Material.QUARTZ; case ICE: - case LEAVES: - case MOB_SPAWNER: + case SPAWNER: return Material.AIR; } return mat; From 29065d439e2e65764ea94562539e1f115b80bd1c Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 6 Oct 2018 15:20:58 -0700 Subject: [PATCH 111/252] so uh this class is like mostly useless now. Kind of difficult to determine some of the stuff this does, but uh yea this is not my kind of fun. --- .../service/config/customtypes/BlockType.java | 69 ++++++++++--------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java index 8e1ce96a..e21240bf 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java @@ -13,12 +13,14 @@ * Holds one blocktype, but a range of metadata for that block. * F.e. this could have meta for spruce, oak and jungle wood, but exclude birch. * + * RoboMWM - this class is no longer that useful since 1.13 "flattened" IDs. Durability value is now only used for tools afaik. + * * @author Diemex */ public final class BlockType { - private static Pattern seperators = Pattern.compile("[^A-Za-z0-9_]"); - private int blockId = -1; + private static Pattern separators = Pattern.compile("[^A-Za-z0-9_]"); + private Material material; private Set meta = new LinkedHashSet(); @@ -28,37 +30,39 @@ public BlockType(int blockId) } + @Deprecated + //Used for default tool durabilities?? public BlockType(Material mat, Short... meta) { - this.blockId = mat.getId(); - Collections.addAll(this.meta, meta); - } - - - public BlockType(int blockId, Short... meta) - { - this.blockId = blockId; + this.material = mat; Collections.addAll(this.meta, meta); } - public BlockType(int blockId, short meta) - { - this.blockId = blockId; - this.meta.add(meta); - } - - - public BlockType(int blockId, Collection meta) - { - this.blockId = blockId; - this.meta.addAll(meta); - } +// public BlockType(int blockId, Short... meta) +// { +// this.blockId = blockId; +// Collections.addAll(this.meta, meta); +// } +// +// +// public BlockType(int blockId, short meta) +// { +// this.blockId = blockId; +// this.meta.add(meta); +// } +// +// +// public BlockType(int blockId, Collection meta) +// { +// this.blockId = blockId; +// this.meta.addAll(meta); +// } - public int getBlockId() + public Material getBlockType() { - return blockId; + return material; } @@ -95,27 +99,28 @@ private boolean matchesMeta(short meta) } - public boolean matches(int blockId) + public boolean matches(Material material) { - return this.blockId == blockId; + return this.material == material; } - public boolean matches(int blockId, short meta) + public boolean matches(Material material, short meta) { - return matches(blockId) && matchesMeta(meta); + return matches(material) && matchesMeta(meta); } public boolean matches(Block block) { - return matches(block.getTypeId(), block.getData()); + return matches(block.getType()); } - + @Deprecated + //Do we need to check durability here too? I'm guessing no... public boolean matches(ItemStack stack) { - return matches(stack.getTypeId(), stack.getData().getData()); + return matches(stack.getType(), stack.getData().getData()); } @@ -127,7 +132,7 @@ public static BlockType loadFromConfig(String input) int blockId; Set meta = new HashSet(); input = RegexHelper.trimWhitespace(input); - String[] splitted = seperators.split(input); + String[] splitted = separators.split(input); if (splitted.length == 0) return null; //BLOCK META From 8725b5ad1c84d77b51617d6fd784ba66158aca73 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 14 Oct 2018 17:15:11 -0700 Subject: [PATCH 112/252] Revert "so uh this class is like mostly useless now." This reverts commit 29065d439e2e65764ea94562539e1f115b80bd1c. --- .../service/config/customtypes/BlockType.java | 69 +++++++++---------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java index e21240bf..8e1ce96a 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java @@ -13,14 +13,12 @@ * Holds one blocktype, but a range of metadata for that block. * F.e. this could have meta for spruce, oak and jungle wood, but exclude birch. * - * RoboMWM - this class is no longer that useful since 1.13 "flattened" IDs. Durability value is now only used for tools afaik. - * * @author Diemex */ public final class BlockType { - private static Pattern separators = Pattern.compile("[^A-Za-z0-9_]"); - private Material material; + private static Pattern seperators = Pattern.compile("[^A-Za-z0-9_]"); + private int blockId = -1; private Set meta = new LinkedHashSet(); @@ -30,39 +28,37 @@ public BlockType(int blockId) } - @Deprecated - //Used for default tool durabilities?? public BlockType(Material mat, Short... meta) { - this.material = mat; + this.blockId = mat.getId(); + Collections.addAll(this.meta, meta); + } + + + public BlockType(int blockId, Short... meta) + { + this.blockId = blockId; Collections.addAll(this.meta, meta); } -// public BlockType(int blockId, Short... meta) -// { -// this.blockId = blockId; -// Collections.addAll(this.meta, meta); -// } -// -// -// public BlockType(int blockId, short meta) -// { -// this.blockId = blockId; -// this.meta.add(meta); -// } -// -// -// public BlockType(int blockId, Collection meta) -// { -// this.blockId = blockId; -// this.meta.addAll(meta); -// } + public BlockType(int blockId, short meta) + { + this.blockId = blockId; + this.meta.add(meta); + } + + + public BlockType(int blockId, Collection meta) + { + this.blockId = blockId; + this.meta.addAll(meta); + } - public Material getBlockType() + public int getBlockId() { - return material; + return blockId; } @@ -99,28 +95,27 @@ private boolean matchesMeta(short meta) } - public boolean matches(Material material) + public boolean matches(int blockId) { - return this.material == material; + return this.blockId == blockId; } - public boolean matches(Material material, short meta) + public boolean matches(int blockId, short meta) { - return matches(material) && matchesMeta(meta); + return matches(blockId) && matchesMeta(meta); } public boolean matches(Block block) { - return matches(block.getType()); + return matches(block.getTypeId(), block.getData()); } - @Deprecated - //Do we need to check durability here too? I'm guessing no... + public boolean matches(ItemStack stack) { - return matches(stack.getType(), stack.getData().getData()); + return matches(stack.getTypeId(), stack.getData().getData()); } @@ -132,7 +127,7 @@ public static BlockType loadFromConfig(String input) int blockId; Set meta = new HashSet(); input = RegexHelper.trimWhitespace(input); - String[] splitted = separators.split(input); + String[] splitted = seperators.split(input); if (splitted.length == 0) return null; //BLOCK META From ef6ab03ac4961289405d634ef789c4562032f9b9 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 14 Oct 2018 22:27:42 -0700 Subject: [PATCH 113/252] lazy 1.13 compat for BlockType Too big of a mess to fix right now, this abstracted class is used in many, many places. --- .../service/config/customtypes/BlockType.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java index 8e1ce96a..641b64b0 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java @@ -17,7 +17,7 @@ */ public final class BlockType { - private static Pattern seperators = Pattern.compile("[^A-Za-z0-9_]"); + private static Pattern separators = Pattern.compile("[^A-Za-z0-9_]"); private int blockId = -1; private Set meta = new LinkedHashSet(); @@ -109,13 +109,13 @@ public boolean matches(int blockId, short meta) public boolean matches(Block block) { - return matches(block.getTypeId(), block.getData()); + return matches(block.getType().getId(), block.getData()); } public boolean matches(ItemStack stack) { - return matches(stack.getTypeId(), stack.getData().getData()); + return matches(stack.getType().getId(), stack.getData().getData()); } @@ -127,7 +127,7 @@ public static BlockType loadFromConfig(String input) int blockId; Set meta = new HashSet(); input = RegexHelper.trimWhitespace(input); - String[] splitted = seperators.split(input); + String[] splitted = separators.split(input); if (splitted.length == 0) return null; //BLOCK META @@ -158,7 +158,7 @@ public static BlockType loadFromConfig(String input) public String saveToString() { StringBuilder builder = new StringBuilder(); - Material material = Material.getMaterial(blockId); + Material material = getMaterial(blockId); builder.append(material != null ? material.name() : blockId); boolean first = true; @@ -173,6 +173,16 @@ public String saveToString() return builder.toString(); } + //Temporary thing for for 1.13 compatibility + //TODO: remove when properly supporting 1.13 (if there's even a use for this package at this point) + private Material getMaterial(int id) + { + for (Material material : Material.values()) + if (material.getId() == id) + return material; + return null; + } + public boolean isValid() { From 2e73f496c74081774be4767f414987beefaac9f2 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 15 Oct 2018 00:07:51 -0700 Subject: [PATCH 114/252] Wow, this really is a deprecated abstraction jungle If it took this much work to do 1.13 support using deprecated APIs, just imagine how much more time would be needed to convert to non-deprecated APIs... Anyways, some things have been temporarily removed or half-converted. All relevant areas are marked with //TODO: 1.13. While a lot of it was just converting Material names, there are quite a number of methods that do other deprecated things, some of which were actually removed in the API. The only deleted things are MaterialHelper and its test, as it's only used to give the plural form of material types when printing the item types lost on death. --- pom.xml | 46 +++++- .../java/com/extrahardmode/ExtraHardMode.java | 16 ++ .../compatibility/CompatCoreProtect.java | 148 +++++++++--------- .../compatibility/CompatHandler.java | 50 +++--- .../compatibility/CompatHawkEye.java | 102 ++++++------ .../compatibility/CompatLogBlock.java | 94 +++++------ .../com/extrahardmode/config/RootNode.java | 12 +- .../events/EhmHardenedStoneEvent.java | 2 +- .../extrahardmode/features/HardenedStone.java | 3 +- .../com/extrahardmode/features/Torches.java | 4 +- .../com/extrahardmode/features/Tutorial.java | 5 +- .../com/extrahardmode/features/Water.java | 4 +- .../com/extrahardmode/module/BlockModule.java | 2 +- .../extrahardmode/module/EntityHelper.java | 4 +- .../extrahardmode/module/MaterialHelper.java | 140 ----------------- .../extrahardmode/module/PlayerModule.java | 8 +- .../customtypes/BlockRelationsList.java | 2 +- .../service/config/customtypes/BlockType.java | 4 + .../config/customtypes/BlockTypeList.java | 2 +- .../task/EvaporateWaterTask.java | 4 +- .../extrahardmode/task/FallingLogsTask.java | 145 ++++++++--------- .../task/RemoveExposedTorchesTask.java | 18 ++- .../extrahardmode/task/WebCleanupTask.java | 2 +- .../modules/TestBlockModule.java | 38 ++--- .../extrahardmode/modules/TestDamageTool.java | 6 +- .../modules/TestInventoryWeight.java | 2 +- .../modules/TestMaterialHelper.java | 45 ------ 27 files changed, 391 insertions(+), 517 deletions(-) delete mode 100644 src/main/java/com/extrahardmode/module/MaterialHelper.java delete mode 100644 src/test/com/extrahardmode/modules/TestMaterialHelper.java diff --git a/pom.xml b/pom.xml index d5edffc3..e832800f 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.12.1 + 3.13.alpha ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode @@ -66,8 +66,8 @@ maven-compiler-plugin 3.0 - 1.6 - 1.6 + 1.8 + 1.8 @@ -110,6 +110,35 @@ + + org.apache.maven.plugins + maven-shade-plugin + 3.1.0 + + true + false + + + org.bstats.bStats-Metrics:bstats-bukkit + + + + + org.bstats + com.extrahardmode + + + + + + package + + shade + + + + + @@ -150,6 +179,10 @@ sk89q-repo http://maven.sk89q.com/repo/ + + jitpack.io + https://jitpack.io + com.extrahardmode ExtraHardMode - 3.13.alpha + 3.13.alpha.2 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode diff --git a/src/main/java/com/extrahardmode/LooseTags.java b/src/main/java/com/extrahardmode/LooseTags.java new file mode 100644 index 00000000..37d3ee83 --- /dev/null +++ b/src/main/java/com/extrahardmode/LooseTags.java @@ -0,0 +1,32 @@ +package com.extrahardmode; + +import org.bukkit.Material; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created on 10/17/2018. + * + * @author RoboMWM + */ +public enum LooseTags +{ + TORCH; + + private Set materials = new HashSet<>(); + + LooseTags() + { + for (Material material : Material.values()) + { + if (material.name().contains(this.name())) + materials.add(material); + } + } + + public boolean isTagged(Material material) + { + return materials.contains(material); + } +} diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index 03f38c2b..c7e29c84 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -107,7 +107,7 @@ void onPlayerInteract(PlayerInteractEvent event) if (block.getType() == Material.RED_MUSHROOM || block.getType() == Material.BROWN_MUSHROOM) { // what's the player holding? - Material materialInHand = player.getItemInHand().getType(); + Material materialInHand = event.getItem().getType(); // if bonemeal, cancel the event if (materialInHand == Material.BONE_MEAL) @@ -137,7 +137,7 @@ public void onBlockBreak(BlockBreakEvent breakEvent) // FEATURE: no nether wart farming (always drops exactly 1 nether wart when broken) if (!playerBypasses && noFarmingNetherWart) { - if (block.getType() == Material.NETHER_WART_BLOCK) + if (block.getType() == Material.NETHER_WART) { block.getDrops().clear(); block.getDrops().add(new ItemStack(Material.NETHER_WART)); @@ -162,7 +162,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.ANTIFARMING); // FEATURE: no farming/placing nether wart - if (!playerBypasses && noFarmingNetherWart && block.getType() == Material.NETHER_WART_BLOCK) + if (!playerBypasses && noFarmingNetherWart && block.getType() == Material.NETHER_WART) { placeEvent.setCancelled(true); return; @@ -412,7 +412,7 @@ public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.ANTIFARMING); // FEATURE: can't move water source blocks - if (!playerBypasses && dontMoveWaterEnabled && player.getItemInHand().getType().equals(Material.WATER_BUCKET)) + if (!playerBypasses && dontMoveWaterEnabled && event.getBucket().equals(Material.WATER_BUCKET)) { // plan to change this block into a non-source block on the next tick Block block = event.getBlockClicked().getRelative(event.getBlockFace()); diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index 535d7bfa..bebaf16c 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -23,6 +23,7 @@ import com.extrahardmode.ExtraHardMode; +import com.extrahardmode.LooseTags; import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.config.messages.MessageNode; @@ -105,6 +106,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) if (block.getRelative(BlockFace.DOWN).getType() != Material.NETHERRACK) break; case TORCH: + case WALL_TORCH: case JACK_O_LANTERN: messenger.send(player, MessageNode.NO_TORCHES_HERE, PermissionNode.SILENT_NO_TORCHES_HERE, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); placeEvent.setCancelled(true); @@ -119,15 +121,15 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) if (blockType == null) blockType = block.getType(); - if (blockType == Material.TORCH) + if (LooseTags.TORCH.isTagged(blockType)) { - Torch torch = new Torch(Material.TORCH, block.getData()); + Torch torch = new Torch(blockType); Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); switch (attachmentMaterial) { case DIRT: case GRASS_BLOCK: - case GRASS: //TODO: idk how one can attach a torch to LONG_GRASS... + case GRASS: //TODO: 1.13: idk how one can attach a torch to LONG_GRASS... case SAND: case GRAVEL: if (soundFizzEnabled) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 646f5c9a..9f25732c 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -210,7 +210,9 @@ public boolean plantDies(Block block, MaterialData newDataValue) if (weakFoodCropsEnabled) { // not evaluated until the plant is nearly full grown - if (newDataValue.getData() >= 7) + //For some plants (netherwart, beetroot), this is at data value 3. + //TODO: 1.13 + if (newDataValue.getData() >= 2) { Material material = block.getType(); if (material == Material.WHEAT || material == Material.CARROTS || material == Material.POTATOES || material == Material.BEETROOTS) diff --git a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java index 140191f2..0a4baaef 100644 --- a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java +++ b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java @@ -27,6 +27,8 @@ import com.extrahardmode.module.BlockModule; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.data.Levelled; +import org.bukkit.block.data.Waterlogged; /** * Changes a water source block to a non-source block, allowing it to spread and evaporate away. @@ -62,7 +64,8 @@ public void run() { if (block.getType() == Material.WATER) { - //block.setData((byte) 1); //TODO: 1.13: how do you turn a water source block into a non source? + Levelled waterLevel = (Levelled)block.getBlockData(); + waterLevel.setLevel(1); //Finished processing blockModule.removeMark(block); } diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index cab67c9c..ff0b1257 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -110,6 +110,7 @@ public void run() case AIR: /* we continue down until we hit something which isn't AIR */ continue loopDown; case TORCH: + case WALL_TORCH: { if (rainBreaksTorches && temperature < 1.0) //excludes warmer biomes like mesa and desert in which no rain falls { @@ -126,6 +127,7 @@ public void run() } case WHEAT_SEEDS: //TODO: 1.13: need to confirm if = CROPS and below case MELON_STEM: + case MELON: case CARROT: case PUMPKIN_STEM: case POTATO: @@ -134,6 +136,7 @@ public void run() case GRASS: //I still can't recall if the replacement for LONG_GRASS is GRASS or TALL_GRASS... case TALL_GRASS: case BEETROOT_SEEDS: //BEETROOT_BLOCK + case BEETROOTS: { if (snowBreaksCrops && temperature <= 0.15) //cold biomes in which snow falls { From d3fb790f640d4f6e4e99591b75c45dce931227dd Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 17 Oct 2018 21:55:38 -0700 Subject: [PATCH 116/252] deploy builds to appveyor --- .travis.yml | 3 --- appveyor.yml | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) delete mode 100644 .travis.yml create mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d8220495..00000000 --- a/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -script: mvn test -jdk: - - oraclejdk8 diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..d057926c --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,35 @@ +version: '{build}' +skip_tags: true +clone_depth: 10 +environment: + matrix: + - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 +branches: + only: + - master + except: + - gh-pages +os: Windows Server 2012 +install: +- ps: | + Add-Type -AssemblyName System.IO.Compression.FileSystem + if (!(Test-Path -Path "C:\maven" )) { + (new-object System.Net.WebClient).DownloadFile('http://www.us.apache.org/dist/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.zip', 'C:\maven-bin.zip') + [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\maven-bin.zip", "C:\maven") + } +- cmd: SET PATH=C:\maven\apache-maven-3.2.5\bin;%JAVA_HOME%\bin;%PATH:C:\Ruby193\bin;=% +- cmd: SET MAVEN_OPTS=-XX:MaxPermSize=2g -Xmx4g +- cmd: SET JAVA_OPTS=-XX:MaxPermSize=2g -Xmx4g +- cmd: SET M2_HOME=C:\maven\apache-maven-3.2.5 +- cmd: mvn --version +- cmd: java -version +build_script: +- mvn clean package -B -Dmaven.test.skip=true +test_script: +- mvn clean install --batch-mode -Pqulice +cache: +- C:\maven\ +- C:\Users\appveyor\.m2 +artifacts: +- path: target/ExtraHardMode.jar + name: ExtraHardMode \ No newline at end of file From ef010a2d6d459cd626a3563f83f106d8c16ea2c1 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 17 Oct 2018 22:24:23 -0700 Subject: [PATCH 117/252] api-version 1.13 --- src/main/resources/plugin.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0b99fe59..afa6b7a1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,6 +8,7 @@ author: RoboMWM authors: [Diemex, Big_Scary] #ensure that we are loaded after multiworld plugins softdepend: [Multiverse-Core, My_Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] +api-version: 1.13 commands: ehm: description: Root command for ExtraHardMode From ba210410ef84ad641c7a22a019d69dcc32989ad1 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 23 Oct 2018 14:56:30 -0700 Subject: [PATCH 118/252] add more common soft blocks to deny torch placement --- src/main/java/com/extrahardmode/LooseTags.java | 2 +- src/main/java/com/extrahardmode/features/Torches.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/LooseTags.java b/src/main/java/com/extrahardmode/LooseTags.java index 37d3ee83..5df78fc7 100644 --- a/src/main/java/com/extrahardmode/LooseTags.java +++ b/src/main/java/com/extrahardmode/LooseTags.java @@ -20,7 +20,7 @@ public enum LooseTags { for (Material material : Material.values()) { - if (material.name().contains(this.name())) + if (material.name().contains(this.name()) && !material.name().contains("LEGACY")) materials.add(material); } } diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index bebaf16c..f3b15497 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -129,9 +129,12 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) { case DIRT: case GRASS_BLOCK: - case GRASS: //TODO: 1.13: idk how one can attach a torch to LONG_GRASS... case SAND: case GRAVEL: + case COARSE_DIRT: + case MYCELIUM: + case PODZOL: + case SOUL_SAND: if (soundFizzEnabled) messenger.send(player, MessageNode.LIMITED_TORCH_PLACEMENTS, PermissionNode.SILENT_LIMITED_TORCH_PLACEMENT, Sound.ENTITY_GENERIC_EXTINGUISH_FIRE , 20); placeEvent.setCancelled(true); From 699048078d2e5fe30c389ea3ac5403e1678e96a6 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 23 Oct 2018 15:12:43 -0700 Subject: [PATCH 119/252] set blockdata to water block It's unclear if Block#getBlockData is a copy or the actual data. I'm assuming it's a copy... --- src/main/java/com/extrahardmode/task/EvaporateWaterTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java index 0a4baaef..c0ee2208 100644 --- a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java +++ b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java @@ -66,6 +66,7 @@ public void run() { Levelled waterLevel = (Levelled)block.getBlockData(); waterLevel.setLevel(1); + block.setBlockData(waterLevel, true); //Finished processing blockModule.removeMark(block); } From 79a75ac8e37ff6067688fbe87fe8543c27a184f6 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 23 Oct 2018 15:13:20 -0700 Subject: [PATCH 120/252] 3.13 alpha 3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164ddef6..75ee215f 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.alpha.2 + 3.13.alpha.3 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 5e6654745c682ff9c18b75f8960d06fab87a9146 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sat, 27 Oct 2018 11:59:49 -0700 Subject: [PATCH 121/252] Bump maven-shade-plugin from 3.1.0 to 3.2.0 (#137) Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.1.0...maven-shade-plugin-3.2.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 75ee215f..1aff17fe 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.1.0 + 3.2.0 true false From 5a7e8acbc011d4ec15d37b2be7789569843d6221 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sun, 28 Oct 2018 23:50:23 -0700 Subject: [PATCH 122/252] Bump maven-compiler-plugin from 3.0 to 3.8.0 (#139) Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.0 to 3.8.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.0...maven-compiler-plugin-3.8.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1aff17fe..8c1c50ce 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.0 + 3.8.0 1.8 1.8 From b310247bf3c0c50057d50087ba7b78ae609ca583 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 10:14:43 -0800 Subject: [PATCH 123/252] debug torch features --- src/main/java/com/extrahardmode/features/Torches.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index f3b15497..d764233c 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -94,6 +94,9 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final int torchMinY = CFG.getInt(RootNode.STANDARD_TORCH_MIN_Y, world.getName()); final boolean playerBypasses = playerModule.playerBypasses(player, Feature.TORCHES); + plugin.getLogger().info("torchcheck: y is " + block.getY() + ", blocktype is " + block.getType() + + ", torchminy is " + torchMinY + ", playerbypass is " + playerBypasses); + // FEATURE: no standard torches, jack o lanterns, or fire on top of netherrack near diamond level if (torchMinY > 0 && !playerBypasses) { @@ -123,8 +126,9 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) if (LooseTags.TORCH.isTagged(blockType)) { - Torch torch = new Torch(blockType); - Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); +// Torch torch = new Torch(blockType); +// Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); + Material attachmentMaterial = placeEvent.getBlockAgainst().getType(); switch (attachmentMaterial) { case DIRT: From 31d56de3090066780782e59011b8dbb32c0084f0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 10:25:17 -0800 Subject: [PATCH 124/252] Use placeevent#getBlockAgainst instead of checking for attachment material Since only wall torches "attach" to blocks (and apparently the Torch constructor doesn't do this check properly?), use getBlockAgainst instead to check for the attachment. The torch is not guaranteed to be placed/attached to the getBlockAgainst block though, but should stop most cases, as the idea is to prevent landscapes from being littered with torches moreso then preventing torches from being attached to any soft material. remove debug --- src/main/java/com/extrahardmode/features/Torches.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index d764233c..e68a0b87 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -94,9 +94,6 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final int torchMinY = CFG.getInt(RootNode.STANDARD_TORCH_MIN_Y, world.getName()); final boolean playerBypasses = playerModule.playerBypasses(player, Feature.TORCHES); - plugin.getLogger().info("torchcheck: y is " + block.getY() + ", blocktype is " + block.getType() + - ", torchminy is " + torchMinY + ", playerbypass is " + playerBypasses); - // FEATURE: no standard torches, jack o lanterns, or fire on top of netherrack near diamond level if (torchMinY > 0 && !playerBypasses) { From eefaf18477c4b479bfc9049c27cea15cd9ef0450 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 10:26:33 -0800 Subject: [PATCH 125/252] Alpha 4 Fixes preventing placement of torches on soft materials #128 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8c1c50ce..8f691d14 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.alpha.3 + 3.13.alpha.4 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From f66a7e3e47c9f84facd17ba7e6d71650d120b385 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 12:15:42 -0800 Subject: [PATCH 126/252] remove FallingBlocks damage config node the suffocation modifier already applies this damage, and is far more accurate and performant, as this one does a nearbyEntities check after the block has formed, The effect applied (Confusion) and its attributes are fixed (whereas configurable in the enhanced environmental damage section). --- .../com/extrahardmode/config/RootNode.java | 10 ++--- .../com/extrahardmode/features/Physics.java | 38 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index efc8b30f..a193a83e 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -874,11 +874,11 @@ public enum RootNode implements ConfigNode */ MORE_FALLING_BLOCKS_CASCADE("Additional Falling Blocks.Landed Blocks Can Cause Blocks To Fall", VarType.BOOLEAN, true, "When a falling block lands it checks if the blocks around it should fall as well. Can cascade downwards infinitely."), - /** - * How much damage loose Falling Logs do to Players and Animals - */ - MORE_FALLING_BLOCKS_DMG_AMOUNT("Additional Falling Blocks.Dmg Amount When Hitting Players", VarType.INTEGER, SubType.NATURAL_NUMBER, 2, - "Should a falling block damage players when it lands on them."), +// /** +// * How much damage loose Falling Logs do to Players and Animals +// */ +// MORE_FALLING_BLOCKS_DMG_AMOUNT("Additional Falling Blocks.Dmg Amount When Hitting Players", VarType.INTEGER, SubType.NATURAL_NUMBER, 2, +// "Should a falling block damage players when it lands on them."), /** * wheter falling grass/mycel turns into dirt */ diff --git a/src/main/java/com/extrahardmode/features/Physics.java b/src/main/java/com/extrahardmode/features/Physics.java index 6669252b..c63a7b60 100644 --- a/src/main/java/com/extrahardmode/features/Physics.java +++ b/src/main/java/com/extrahardmode/features/Physics.java @@ -152,25 +152,25 @@ public void whenBlockLands(EntityChangeBlockEvent event) Entity entity = event.getEntity(); World world = entity.getWorld(); - final int damageAmount = CFG.getInt(RootNode.MORE_FALLING_BLOCKS_DMG_AMOUNT, world.getName()); - final boolean environmentalDmg = CFG.getBoolean(RootNode.ENHANCED_ENVIRONMENTAL_DAMAGE, world.getName()); - - //Only when Block has been marked to deal damage - if (entity.getType().equals(EntityType.FALLING_BLOCK) && damageAmount > 0 && EntityHelper.isMarkedForProcessing(entity)) - { - List entities = entity.getNearbyEntities(0, 1, 0); - for (Entity ent : entities) - { - if (ent instanceof LivingEntity) - { - LivingEntity entityWithDamagedHead = (LivingEntity) ent; - //Frighten the player - entityWithDamagedHead.damage(damageAmount, entity); - if (environmentalDmg) - entityWithDamagedHead.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 140, 10)); - } - } - } +// final int damageAmount = CFG.getInt(RootNode.MORE_FALLING_BLOCKS_DMG_AMOUNT, world.getName()); +// final boolean environmentalDmg = CFG.getBoolean(RootNode.ENHANCED_ENVIRONMENTAL_DAMAGE, world.getName()); +// +// //Only when Block has been marked to deal damage +// if (entity.getType().equals(EntityType.FALLING_BLOCK) && damageAmount > 0 && EntityHelper.isMarkedForProcessing(entity)) +// { +// List entities = entity.getNearbyEntities(0, 1, 0); +// for (Entity ent : entities) +// { +// if (ent instanceof LivingEntity) +// { +// LivingEntity entityWithDamagedHead = (LivingEntity) ent; +// //Frighten the player +// entityWithDamagedHead.damage(damageAmount, entity); +// if (environmentalDmg) +// entityWithDamagedHead.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 140, 10)); +// } +// } +// } if (event.getEntity() instanceof FallingBlock && EntityHelper.isMarkedAsOurs(event.getEntity())) { From 2acafd72d7176eebbc8cb4f6a740c034787186dc Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 12:37:51 -0800 Subject: [PATCH 127/252] add remaining default falling blocks to add, deprecate BlockType --- src/main/java/com/extrahardmode/config/RootNode.java | 11 +++++------ .../service/config/customtypes/BlockType.java | 3 +++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index a193a83e..9dcab8c8 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -1448,11 +1448,9 @@ public DefaultFallingBlocks() this.add(new BlockType(Material.GRASS)); this.add(new BlockType(Material.COBBLESTONE)); this.add(new BlockType(Material.MOSSY_COBBLESTONE)); - //TODO: 1.13 -// this.add(new BlockType(Material.DOUBLE_STEP, (short) 3)); //cobble double halfslabs -// this.add(new BlockType(Material.STEP, (short) 3)); //normal -// this.add(new BlockType(Material.STEP, (short) 11)); //upside -// this.add(new BlockType(Material.MYCEL)); + this.add(new BlockType(Material.STONE_SLAB)); + this.add(new BlockType(Material.COBBLESTONE_SLAB)); + this.add(new BlockType(Material.MYCELIUM)); } } @@ -1480,7 +1478,7 @@ public DefaultPhysicsBlocks() /** - * Default list of falling blocks. + * Default list of tool durabilities */ private static class DefaultToolDurabilities extends BlockTypeList { @@ -1546,3 +1544,4 @@ public DefaultWorlds() } } } + diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java index b1465b6d..c19d42f1 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java @@ -13,8 +13,11 @@ * Holds one blocktype, but a range of metadata for that block. * F.e. this could have meta for spruce, oak and jungle wood, but exclude birch. * + * @deprecated No longer needed with "The Flattening" in 1.13 + * * @author Diemex */ +@Deprecated public final class BlockType { private static Pattern separators = Pattern.compile("[^A-Za-z0-9_]"); From c78b5175f4e3d2ec7833aa890991a73345f9ce8b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 13:49:29 -0800 Subject: [PATCH 128/252] deprecate all custom types that rely on deprecated BlockType --- .../java/com/extrahardmode/service/config/ConfigNode.java | 6 +++--- .../service/config/customtypes/BlockRelation.java | 3 +++ .../service/config/customtypes/BlockRelationsList.java | 5 +++++ .../service/config/customtypes/BlockTypeList.java | 4 ++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/service/config/ConfigNode.java b/src/main/java/com/extrahardmode/service/config/ConfigNode.java index 5c67fdf3..e55ef0c4 100644 --- a/src/main/java/com/extrahardmode/service/config/ConfigNode.java +++ b/src/main/java/com/extrahardmode/service/config/ConfigNode.java @@ -73,9 +73,9 @@ public enum VarType LIST, COLOR, POTION_EFFECT, - BLOCKTYPE, - BLOCKTYPE_LIST, - BLOCK_RELATION_LIST, + @Deprecated BLOCKTYPE, + @Deprecated BLOCKTYPE_LIST, + @Deprecated BLOCK_RELATION_LIST, COMMENT } diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java index 4fe6ab0a..eb6581dd 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java @@ -3,7 +3,10 @@ /** * Simple Pair + * + * @deprecated Unused, uses BlockType */ +@Deprecated public final class BlockRelation { private BlockType mBlock1 = null; diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java index 08cdb9c1..132a4fc7 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java @@ -8,7 +8,12 @@ /** * Holds a relationship. BlockTypes can be retrieved by their key BlockType. F.e stone -> cobblestone + * + * @deprecated Uses deprecated BlockTypes + * + * Only used for the "soften surrounding stone" feature, turning one block (e.g. stone) into another (e.g. cobblestone) */ +@Deprecated public class BlockRelationsList { private Map mBlockRelations = new HashMap(); diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java index 631beb3b..260a8000 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java @@ -5,6 +5,10 @@ import java.util.*; +/** + * @deprecated BlockType is deprecated + */ +@Deprecated public class BlockTypeList { private Map blockTypeMap = new HashMap(); From 6a7ddb57cf70fcd6d4b0f9022fb0bdda3a8e7b85 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 13:58:26 -0800 Subject: [PATCH 129/252] Entirely disable fallinglogs/realistic tree chopping Replaced wih GraviTree, another Big_Scary-created plugin. --- .../java/com/extrahardmode/ExtraHardMode.java | 2 +- .../java/com/extrahardmode/config/RootNode.java | 15 ++++++++------- .../extrahardmode/features/RealisticChopping.java | 4 ++-- .../com/extrahardmode/metrics/ConfigPlotter.java | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index 11590576..c30cc0c9 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -142,7 +142,7 @@ public String call() throws Exception } registerModule(MonsterRules.class, new MonsterRules(this)); registerModule(PigMen.class, new PigMen(this)); - registerModule(RealisticChopping.class, new RealisticChopping(this)); + //registerModule(RealisticChopping.class, new RealisticChopping(this)); registerModule(Silverfish.class, new Silverfish(this)); registerModule(Skeletors.class, new Skeletors(this)); registerModule(Spiders.class, new Spiders(this)); diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 9dcab8c8..ff64fffa 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -188,13 +188,14 @@ public enum RootNode implements ConfigNode */ LIMITED_BLOCK_PLACEMENT("World Rules.Limited Block Placement", VarType.BOOLEAN, true, "Blocks jumping and placing a block directly beneath you and branching out with no blocks to support"), - /** - * whether tree logs respect gravity - */ - BETTER_TREE_CHOPPING("World Rules.Better Tree Felling", VarType.BOOLEAN, true, - "The trunk and branches of a tree will fall and potentially injure you.", - "It makes it easier to chop trees, but you have to watch out a little for the falling logs.", - "Also by making logs of branches fall down most treetops should decay naturally."), + //Feaure replaced with GraviTree (another Big_Scary-created plugin) https://dev.bukkit.org/projects/gravitree +// /** +// * whether tree logs respect gravity +// */ +// BETTER_TREE_CHOPPING("World Rules.Better Tree Felling", VarType.BOOLEAN, true, +// "The trunk and branches of a tree will fall and potentially injure you.", +// "It makes it easier to chop trees, but you have to watch out a little for the falling logs.", +// "Also by making logs of branches fall down most treetops should decay naturally."), /** * ################################# * # ENHANCED ENVIRONMENTAL DAMAGE # diff --git a/src/main/java/com/extrahardmode/features/RealisticChopping.java b/src/main/java/com/extrahardmode/features/RealisticChopping.java index 6cf25869..27fe94b1 100644 --- a/src/main/java/com/extrahardmode/features/RealisticChopping.java +++ b/src/main/java/com/extrahardmode/features/RealisticChopping.java @@ -96,7 +96,7 @@ public void onBlockBreak(BlockBreakEvent breakEvent) World world = block.getWorld(); Player player = breakEvent.getPlayer(); - final boolean betterTreeChoppingEnabled = CFG.getBoolean(RootNode.BETTER_TREE_CHOPPING, world.getName()); + final boolean betterTreeChoppingEnabled = false; //CFG.getBoolean(RootNode.BETTER_TREE_CHOPPING, world.getName()); final boolean playerHasBypass = playerModule.playerBypasses(player, Feature.REALISTIC_CHOPPING); // FEATURE: trees chop more naturally @@ -126,7 +126,7 @@ else if (!Tag.LOGS.isTagged(upType)) for (int limit = 0; limit < 30; limit++) { Material aboveLogType = aboveLog.getType();//can air fall? -//we reached something that is not part of a tree or leaves + //we reached something that is not part of a tree or leaves if (aboveLogType == Material.AIR) { List logs = new LinkedList(Arrays.asList(blockModule.getBlocksInArea(aboveLog.getLocation(), 3, 5, Tag.LOGS))); diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java index b949363b..095b4fe1 100644 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -81,7 +81,7 @@ public int getValue() case ANIMAL_EXP_NERF: case ANIMAL_OVERCROWD_CONTROL: case BETTER_TNT: - case BETTER_TREE_CHOPPING: + //case BETTER_TREE_CHOPPING: case BLAZES_EXPLODE_ON_DEATH: case CANT_CRAFT_MELONSEEDS: case CHARGED_CREEPERS_EXPLODE_ON_HIT: From 64cf3c1d227236d016052a3644700d1175818308 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 14:15:58 -0800 Subject: [PATCH 130/252] 3.13 beta --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8f691d14..d9a90484 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.alpha.4 + 3.13.beta ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/server-mods/fun-hard-mode From 57c3d643b9cc452fcff6094f26d448cf6f1d712d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 7 Nov 2018 15:00:26 -0800 Subject: [PATCH 131/252] Remove dead hidendra mcstats --- pom.xml | 14 +- .../java/com/extrahardmode/ExtraHardMode.java | 14 - .../extrahardmode/metrics/ConfigPlotter.java | 130 ++- .../com/extrahardmode/metrics/Metrics.java | 764 ------------------ 4 files changed, 72 insertions(+), 850 deletions(-) delete mode 100644 src/main/java/com/extrahardmode/metrics/Metrics.java diff --git a/pom.xml b/pom.xml index d9a90484..77926a6e 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 3.13.beta ExtraHardMode New game rules and mechanics for Minecraft. - http://dev.bukkit.org/server-mods/fun-hard-mode + http://dev.bukkit.org/projects/fun-hard-mode @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.13 + 1.13.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ @@ -119,7 +119,7 @@ false - org.bstats.bStats-Metrics:bstats-bukkit + org.bstats:bstats-bukkit @@ -183,6 +183,10 @@ jitpack.io https://jitpack.io + + CodeMC + https://repo.codemc.org/repository/maven-public/ + + + pl.project13.maven + git-commit-id-plugin + 2.2.5 + + + get-the-git-infos + + revision + + validate + + + + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index afa6b7a1..ae490259 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: ExtraHardMode main: com.extrahardmode.ExtraHardMode -version: ${project.version} +version: ${project.version} commit ${git.commit.id.describe-short} description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ #project lead From b0f8883fddcbe292a7011d9d15837f0eee0d068b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 8 Nov 2018 21:49:07 -0800 Subject: [PATCH 133/252] use blockdata for skull rotation. Closes #142 --- .../com/extrahardmode/features/monsters/Zombies.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index 6c47c693..6be179f3 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -43,6 +43,8 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Skull; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Rotatable; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -137,13 +139,12 @@ public void onEntityDeath(EntityDeathEvent event) block = location.getBlock(); } block.setType(Material.ZOMBIE_HEAD); - Skull skull = (Skull) block.getState(); - skull.setSkullType(SkullType.ZOMBIE); //Random rotation BlockFace[] faces = BlockModule.getHorizontalAdjacentFaces(); + Rotatable skull = (Rotatable)block.getBlockData(); skull.setRotation(faces[OurRandom.nextInt(faces.length)]); - skull.update(); - tempBlock = temporaryBlockHandler.addTemporaryBlock(skull.getLocation(), "respawn_skull"); + block.setBlockData(skull); + tempBlock = temporaryBlockHandler.addTemporaryBlock(block.getLocation(), "respawn_skull"); } RespawnZombieTask task = new RespawnZombieTask(plugin, entity.getLocation(), player, tempBlock); int respawnSeconds = plugin.getRandom().nextInt(6) + 3; // 3-8 seconds From 2e005bb4c8d62a62d8e45edfb2ddfe3ceb003766 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 00:52:55 -0800 Subject: [PATCH 134/252] set enderdragon phase on spawn hopefully fixes #104 --- src/main/java/com/extrahardmode/module/EntityHelper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/extrahardmode/module/EntityHelper.java b/src/main/java/com/extrahardmode/module/EntityHelper.java index 4911c03b..df415ec0 100644 --- a/src/main/java/com/extrahardmode/module/EntityHelper.java +++ b/src/main/java/com/extrahardmode/module/EntityHelper.java @@ -258,6 +258,10 @@ public static LivingEntity spawn(Location loc, EntityType type) case PIG_ZOMBIE: entity.getEquipment().setItemInHand(new ItemStack(Material.GOLDEN_SWORD)); break; + case ENDER_DRAGON: + entity.setAI(true); + EnderDragon dragon = (EnderDragon)entity; + dragon.setPhase(EnderDragon.Phase.CIRCLING); } if (entity != null && CompatHandler.canMonsterSpawn(loc)) entity.remove(); From 0235027df269439b6ec85ddb69c9f21a7952778d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 00:57:33 -0800 Subject: [PATCH 135/252] allow zombie heads to be broken in claims --- .../module/temporaryblock/TemporaryBlockHandler.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index f72f9711..6cd6327b 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -7,6 +7,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockEvent; import org.bukkit.event.block.BlockExplodeEvent; @@ -35,13 +36,13 @@ public TemporaryBlockHandler(ExtraHardMode plugin) * onTempBlockBreakEvent * onZombieRespawnTask -> check if broken */ - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOWEST) public void onBlockBreak(BlockBreakEvent event) { if (fireTemporaryBlockBreakEvent(event.getBlock())) { event.setCancelled(true); - event.getBlock().setType(Material.AIR); + event.getBlock().setType(Material.AIR, false); } } @@ -52,7 +53,7 @@ public void onWaterBreakBlock(BlockFromToEvent event) if (fireTemporaryBlockBreakEvent(event.getToBlock())) { event.setCancelled(true); //TODO: only way to prevent skull from dropping as item? - event.getToBlock().setType(Material.AIR); + event.getToBlock().setType(Material.AIR, false); } } @@ -66,7 +67,7 @@ public void onEntityExplosionBreak(EntityExplodeEvent event) if (fireTemporaryBlockBreakEvent(block)) { event.blockList().remove(block); - block.setType(Material.AIR); + block.setType(Material.AIR, false); } } } @@ -81,7 +82,7 @@ public void onBlockExplosionBreak(BlockExplodeEvent event) if (fireTemporaryBlockBreakEvent(block)) { event.blockList().remove(block); - block.setType(Material.AIR); + block.setType(Material.AIR, false); } } } From d6a4b798ad11861a0c61eced771e199c600cd0b1 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 01:01:20 -0800 Subject: [PATCH 136/252] don't forcibly place zombie skulls closes #98 --- src/main/java/com/extrahardmode/features/monsters/Zombies.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index 6be179f3..4fed203e 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -137,6 +137,8 @@ public void onEntityDeath(EntityDeathEvent event) Location location = block.getLocation(); location.setY(location.getY()+1); block = location.getBlock(); + if (block.getType() != Material.AIR) + return; } block.setType(Material.ZOMBIE_HEAD); //Random rotation From ae3240955adb7e67108f271c8320b7e1791ce206 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 12:54:43 -0800 Subject: [PATCH 137/252] Account for plugins that improperly fire bukkit events Closes #127 and other related issues --- src/main/java/com/extrahardmode/module/PlayerModule.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/module/PlayerModule.java b/src/main/java/com/extrahardmode/module/PlayerModule.java index cf317661..059f19f5 100644 --- a/src/main/java/com/extrahardmode/module/PlayerModule.java +++ b/src/main/java/com/extrahardmode/module/PlayerModule.java @@ -61,7 +61,9 @@ public void starting() public boolean playerBypasses(Player player, Feature feature) { - Validate.notNull(player, "We can't check if a Player bypasses if there is no Player!"); + //Validate.notNull(player, "We can't check if a Player bypasses if there is no Player!"); + if (player == null) + return false; final boolean bypassPermsEnabled = CFG.getBoolean(RootNode.BYPASS_PERMISSION, player.getWorld().getName()); final boolean opsBypass = CFG.getBoolean(RootNode.BYPASS_OPS, player.getWorld().getName()); From 9a4acb6e6b50c5b792b69d7c62e1fb6b22f8dc27 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 12:57:42 -0800 Subject: [PATCH 138/252] Stage potential fix for #11 #11 needs confirmation that it's still an issue with existing code. --- .../features/monsters/PigMen.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/PigMen.java b/src/main/java/com/extrahardmode/features/monsters/PigMen.java index 38128f59..fd74b46f 100644 --- a/src/main/java/com/extrahardmode/features/monsters/PigMen.java +++ b/src/main/java/com/extrahardmode/features/monsters/PigMen.java @@ -33,7 +33,11 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.PigZombie; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -153,12 +157,18 @@ public void onChunkLoad(ChunkLoadEvent event) public void onPlayerDamaged(EntityDamageByEntityEvent event) { double damagePercentage = CFG.getInt(RootNode.PIG_ZOMBIE_DMG_PERCENT, event.getEntity().getWorld().getName()) / 100.0; - if (damagePercentage <= 0.0) - return; - if (event.getEntity() instanceof Player && event.getDamager() instanceof PigZombie) + final boolean pigAlwaysAggro = CFG.getBoolean(RootNode.ALWAYS_ANGRY_PIG_ZOMBIES, event.getEntity().getWorld().getName()); + + if (damagePercentage > 0.0 && event.getEntity() instanceof Player && event.getDamager() instanceof PigZombie) { event.setDamage(event.getDamage() * damagePercentage); } + //TODO: test issue #11 first +// else if (pigAlwaysAggro && event.getEntity() instanceof PigZombie && event.getDamager() instanceof Player) +// { +// PigZombie pigZombie = (PigZombie)event.getEntity(); +// pigZombie.setTarget((LivingEntity)event.getDamager()); +// } } From 28596be8d98cf038eaa670c65f7624edf9493553 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 12:58:11 -0800 Subject: [PATCH 139/252] beta 2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 94cbfbe8..d92ddd25 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.beta + 3.13.beta.2 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From 7293dfe2c1057ff79a935071876eb303129d1849 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 9 Nov 2018 14:34:46 -0800 Subject: [PATCH 140/252] evaluate beetroot crop death at data value 3 Still not properly using 1.13 blockdata(?) here but it'll do for now. closes #143 --- .../com/extrahardmode/module/BlockModule.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 9f25732c..0b7f4964 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -36,7 +36,6 @@ import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.EntityType; import org.bukkit.entity.FallingBlock; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.material.MaterialData; @@ -211,12 +210,24 @@ public boolean plantDies(Block block, MaterialData newDataValue) { // not evaluated until the plant is nearly full grown //For some plants (netherwart, beetroot), this is at data value 3. + + int fullGrowthValue = 7; + switch (block.getType()) + { + case BEETROOTS: + fullGrowthValue = 3; + break; + case WHEAT: + case CARROTS: + case POTATOES: + break; + default: + return false; + } + //TODO: 1.13 - if (newDataValue.getData() >= 2) + if (newDataValue.getData() >= fullGrowthValue) { - Material material = block.getType(); - if (material == Material.WHEAT || material == Material.CARROTS || material == Material.POTATOES || material == Material.BEETROOTS) - { int deathProbability = lossRate; // plants in the dark always die @@ -251,7 +262,6 @@ public boolean plantDies(Block block, MaterialData newDataValue) { return true; } - } } } From 50b0cee74fa125393fa3badf399a92cb74bddd82 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Nov 2018 10:45:04 -0800 Subject: [PATCH 141/252] could not reproduce issue #11 closes #11 zombie pigmen that were attacked by another player chased after that player. --- .../java/com/extrahardmode/features/monsters/PigMen.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/PigMen.java b/src/main/java/com/extrahardmode/features/monsters/PigMen.java index fd74b46f..0281aa02 100644 --- a/src/main/java/com/extrahardmode/features/monsters/PigMen.java +++ b/src/main/java/com/extrahardmode/features/monsters/PigMen.java @@ -157,18 +157,9 @@ public void onChunkLoad(ChunkLoadEvent event) public void onPlayerDamaged(EntityDamageByEntityEvent event) { double damagePercentage = CFG.getInt(RootNode.PIG_ZOMBIE_DMG_PERCENT, event.getEntity().getWorld().getName()) / 100.0; - final boolean pigAlwaysAggro = CFG.getBoolean(RootNode.ALWAYS_ANGRY_PIG_ZOMBIES, event.getEntity().getWorld().getName()); if (damagePercentage > 0.0 && event.getEntity() instanceof Player && event.getDamager() instanceof PigZombie) - { event.setDamage(event.getDamage() * damagePercentage); - } - //TODO: test issue #11 first -// else if (pigAlwaysAggro && event.getEntity() instanceof PigZombie && event.getDamager() instanceof Player) -// { -// PigZombie pigZombie = (PigZombie)event.getEntity(); -// pigZombie.setTarget((LivingEntity)event.getDamager()); -// } } From 5f266fa2d68b19977b38086de610246edf5a4320 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Nov 2018 10:48:50 -0800 Subject: [PATCH 142/252] 3.13.0 --- pom.xml | 2 +- src/main/resources/plugin.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d92ddd25..fbfebaec 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.beta.2 + 3.13.0 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ae490259..55d1e39b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: ExtraHardMode main: com.extrahardmode.ExtraHardMode -version: ${project.version} commit ${git.commit.id.describe-short} +version: ${project.version}-${git.commit.id.describe-short} description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ #project lead From d1a7b7df28c5e26d4b54b6cd0d4997904eb8293f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 12 Nov 2018 05:58:26 +0000 Subject: [PATCH 143/252] Bump maven-shade-plugin from 3.2.0 to 3.2.1 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.0 to 3.2.1. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.0...maven-shade-plugin-3.2.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fbfebaec..39f6b107 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.0 + 3.2.1 true false From 230b997dd622804115b6d057b2d10de363283da3 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Nov 2018 20:30:59 -0800 Subject: [PATCH 144/252] TIL maven git-commit-id plugin uses the tag and number of commits after for the "describe" variable --- src/main/resources/plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 55d1e39b..ba8616c7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: ExtraHardMode main: com.extrahardmode.ExtraHardMode -version: ${project.version}-${git.commit.id.describe-short} +version: ${project.version}-${git.commit.id.abbrev} description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ #project lead From 60b5c0cdd3540bcb94e52d61977428bdb57c57f9 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 26 Nov 2018 23:51:33 -0800 Subject: [PATCH 145/252] use getBlockData for FallingBlock entities --- .../java/com/extrahardmode/ExtraHardMode.java | 48 +++++++++++++++---- .../extrahardmode/features/Explosions.java | 14 ++++-- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index f73d5033..e731f807 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -28,17 +28,50 @@ import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.config.messages.MessageConfig; -import com.extrahardmode.features.*; -import com.extrahardmode.features.monsters.*; +import com.extrahardmode.features.AnimalCrowdControl; +import com.extrahardmode.features.AntiFarming; +import com.extrahardmode.features.AntiGrinder; +import com.extrahardmode.features.DebugMode; +import com.extrahardmode.features.Explosions; +import com.extrahardmode.features.HardenedStone; +import com.extrahardmode.features.LimitedBuilding; +import com.extrahardmode.features.MoreTnt; +import com.extrahardmode.features.Physics; +import com.extrahardmode.features.Players; +import com.extrahardmode.features.Torches; +import com.extrahardmode.features.Tutorial; +import com.extrahardmode.features.Water; +import com.extrahardmode.features.monsters.Blazes; +import com.extrahardmode.features.monsters.BumBumBens; +import com.extrahardmode.features.monsters.CaveSpider; +import com.extrahardmode.features.monsters.Endermen; +import com.extrahardmode.features.monsters.Ghasts; +import com.extrahardmode.features.monsters.Glydia; +import com.extrahardmode.features.monsters.Guardians; +import com.extrahardmode.features.monsters.Horses; +import com.extrahardmode.features.monsters.KillerBunny; +import com.extrahardmode.features.monsters.MonsterRules; +import com.extrahardmode.features.monsters.PigMen; +import com.extrahardmode.features.monsters.Silverfish; +import com.extrahardmode.features.monsters.Skeletors; +import com.extrahardmode.features.monsters.Spiders; +import com.extrahardmode.features.monsters.Vex; +import com.extrahardmode.features.monsters.Vindicator; +import com.extrahardmode.features.monsters.Witches; +import com.extrahardmode.features.monsters.Zombies; import com.extrahardmode.metrics.ConfigPlotter; -import com.extrahardmode.module.*; +import com.extrahardmode.module.BlockModule; +import com.extrahardmode.module.DataStoreModule; +import com.extrahardmode.module.ExplosionCompatStorage; +import com.extrahardmode.module.MsgModule; +import com.extrahardmode.module.MsgPersistModule; +import com.extrahardmode.module.PlayerModule; +import com.extrahardmode.module.UtilityModule; import com.extrahardmode.module.temporaryblock.TemporaryBlockHandler; import com.extrahardmode.service.IModule; import com.extrahardmode.service.OurRandom; -import com.extrahardmode.task.ArmorWeightTask; import com.extrahardmode.task.MoreMonstersTask; import com.extrahardmode.task.WeightCheckTask; -import org.bstats.bukkit.Metrics; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -47,7 +80,6 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Random; -import java.util.concurrent.Callable; /** @@ -174,10 +206,10 @@ public void onEnable() new ConfigPlotter(this, getModuleForClass(RootConfig.class)); } - public void debug(World world, Object message) + public void debug(World world, String message) { if ((getModuleForClass(RootConfig.class)).getBoolean(RootNode.DEBUG, world.getName())) - System.out.println(message); + this.getLogger().info(message); } diff --git a/src/main/java/com/extrahardmode/features/Explosions.java b/src/main/java/com/extrahardmode/features/Explosions.java index 24ecaea1..e4615a89 100644 --- a/src/main/java/com/extrahardmode/features/Explosions.java +++ b/src/main/java/com/extrahardmode/features/Explosions.java @@ -28,7 +28,6 @@ import com.extrahardmode.config.RootNode; import com.extrahardmode.events.fakeevents.FakeEntityExplodeEvent; import com.extrahardmode.module.BlockModule; -import com.extrahardmode.module.ExplosionCompatStorage; import com.extrahardmode.module.UtilityModule; import com.extrahardmode.service.ListenerModule; import com.extrahardmode.task.CreateExplosionTask; @@ -37,7 +36,12 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.entity.*; +import org.bukkit.entity.Creeper; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Ghast; +import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityChangeBlockEvent; @@ -287,8 +291,8 @@ public void handleLandedBlocksFromPhysics(EntityChangeBlockEvent event) //If close place the block as if the player broke it first: stone -> cobble, gras -> dirt etc. else { - Material type = BlockModule.getDroppedMaterial(fallBaby.getMaterial()); - if (type.isBlock() && type == fallBaby.getMaterial()) //preserve blockdata. See issue #69 //Alternatively could block#setType in second condition + Material type = BlockModule.getDroppedMaterial(fallBaby.getBlockData().getMaterial()); + if (type.isBlock() && type == fallBaby.getBlockData().getMaterial()) //preserve blockdata. See issue #69 //Alternatively could block#setType in second condition return; else if (type.isBlock()) block.setType(type); @@ -415,7 +419,7 @@ public void applyExplosionPhysics(Collection blocks, final Location cente //Only a few of the blocks fly as an effect if (plugin.random(flyPercentage)) { - FallingBlock fall = block.getLocation().getWorld().spawnFallingBlock(block.getLocation(), block.getType(), block.getData()); + FallingBlock fall = block.getLocation().getWorld().spawnFallingBlock(block.getLocation(), block.getBlockData()); fall.setMetadata(tag, new FixedMetadataValue(plugin, block.getLocation())); //decide on the distance if block should be placed //fall.setMetadata("drops", new FixedMetadataValue(plugin, block.getDrops())); fall.setDropItem(CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_DROP_ITEM, block.getWorld().getName())); From 59445b082729322f719dc71a36c106d3c9383813 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 28 Nov 2018 16:29:12 -0800 Subject: [PATCH 146/252] chat prefix can be configured. Closes #51 I mean at least it's not a 14 character tag *ahem*likesomeotherplugin but gotta have that "custom" feel I guess --- pom.xml | 2 +- src/main/java/com/extrahardmode/ExtraHardMode.java | 9 +++++++-- .../com/extrahardmode/config/messages/MessageNode.java | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 39f6b107..ed42d859 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.0 + 3.13.1 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index e731f807..ed5a5803 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -28,6 +28,7 @@ import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.config.messages.MessageConfig; +import com.extrahardmode.config.messages.MessageNode; import com.extrahardmode.features.AnimalCrowdControl; import com.extrahardmode.features.AntiFarming; import com.extrahardmode.features.AntiGrinder; @@ -91,7 +92,7 @@ public class ExtraHardMode extends JavaPlugin /** * Plugin tag. */ - public static final String TAG = "[EHM]"; + public static String TAG = "[EHM]"; /** * Registered modules. @@ -112,7 +113,11 @@ public void onEnable() { // Register modules registerModule(RootConfig.class, new RootConfig(this)); - registerModule(MessageConfig.class, new MessageConfig(this)); + MessageConfig config = new MessageConfig(this); + registerModule(MessageConfig.class, config); + String prefix = config.getString(MessageNode.EHM_CHAT_PREFIX); + if (prefix != null) + TAG = prefix; File rootFolder = new File(getDataFolder().getPath() + File.separator + "persistence" + File.separator); rootFolder.mkdirs(); diff --git a/src/main/java/com/extrahardmode/config/messages/MessageNode.java b/src/main/java/com/extrahardmode/config/messages/MessageNode.java index 49e45ba3..ba8e26b0 100644 --- a/src/main/java/com/extrahardmode/config/messages/MessageNode.java +++ b/src/main/java/com/extrahardmode/config/messages/MessageNode.java @@ -295,7 +295,8 @@ public enum MessageNode implements ConfigNode ("NetherWarning.Mode", MsgCategory.TUTORIAL), NETHER_WARNING ("NetherWarning.Msg", MsgCategory.TUTORIAL, "nether_warn", - "This is a dangerous place. Make sure you come prepared with arrows and good gear."); + "This is a dangerous place. Make sure you come prepared with arrows and good gear."), + EHM_CHAT_PREFIX("ChatPrefix", VarType.STRING, "[EHM]"); /** * Path in the Config From a39f0f9b323a2d36cac93cddec844ceea1e2a7d6 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 14 Dec 2018 00:01:40 -0800 Subject: [PATCH 147/252] use snow block. Fixes #149 --- .../com/extrahardmode/task/RemoveExposedTorchesTask.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index ff0b1257..875acf23 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -145,14 +145,16 @@ public void run() //Snow can't be placed if its tilled soil if (block.getRelative(BlockFace.DOWN).getType() == Material.FARMLAND) block.getRelative(BlockFace.DOWN).setType(Material.DIRT); - block.setType(Material.SNOW); + block.setType(Material.SNOW_BLOCK); + Snow snow = ((Snow)block.getBlockData()); if (plugin.getRandom().nextBoolean()) { - ((Snow)block.getBlockData()).setLayers(1); //TODO: 1.13: block.setData(1) and 2, respectively + snow.setLayers(1); } else { - ((Snow)block.getBlockData()).setLayers(2); + snow.setLayers(2); } + block.setBlockData(snow); } break loopDown; } From 99dfec1ea110ba182a53f8ff1599bd35e41543ae Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 14 Dec 2018 07:21:29 -0800 Subject: [PATCH 148/252] Nevermind, this is supposed to be a SNOW for snow layer Not sure what's going on in #149 ... --- .../java/com/extrahardmode/task/RemoveExposedTorchesTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index 875acf23..82987262 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -145,7 +145,7 @@ public void run() //Snow can't be placed if its tilled soil if (block.getRelative(BlockFace.DOWN).getType() == Material.FARMLAND) block.getRelative(BlockFace.DOWN).setType(Material.DIRT); - block.setType(Material.SNOW_BLOCK); + block.setType(Material.SNOW); Snow snow = ((Snow)block.getBlockData()); if (plugin.getRandom().nextBoolean()) { From b55af08e5c9d58912fda9bc40fcedb7755b450f4 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 14 Dec 2018 11:29:34 -0800 Subject: [PATCH 149/252] just use setBlockData to change the block type. Should definitely fix #149 --- .../java/com/extrahardmode/task/RemoveExposedTorchesTask.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index 82987262..14ace468 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -145,8 +145,7 @@ public void run() //Snow can't be placed if its tilled soil if (block.getRelative(BlockFace.DOWN).getType() == Material.FARMLAND) block.getRelative(BlockFace.DOWN).setType(Material.DIRT); - block.setType(Material.SNOW); - Snow snow = ((Snow)block.getBlockData()); + Snow snow = (Snow)Material.SNOW.createBlockData(); if (plugin.getRandom().nextBoolean()) { snow.setLayers(1); From 843dfc52ff42cb7eb7eab5239d1b6decc3d1858b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Sat, 5 Jan 2019 05:14:27 +0000 Subject: [PATCH 150/252] Bump git-commit-id-plugin from 2.2.5 to 2.2.6 Bumps [git-commit-id-plugin](https://github.com/ktoso/maven-git-commit-id-plugin) from 2.2.5 to 2.2.6. - [Release notes](https://github.com/ktoso/maven-git-commit-id-plugin/releases) - [Commits](https://github.com/ktoso/maven-git-commit-id-plugin/compare/v2.2.5...v2.2.6) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ed42d859..ed7cba00 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 2.2.5 + 2.2.6 get-the-git-infos From f9a754f709045305b9dd46de1e91c78168f9c034 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 23 Feb 2019 18:14:36 -0800 Subject: [PATCH 151/252] sometimes enderman teleport to the void I guess Closes #165 --- .../com/extrahardmode/features/monsters/Endermen.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Endermen.java b/src/main/java/com/extrahardmode/features/monsters/Endermen.java index e35b8969..174d4758 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Endermen.java +++ b/src/main/java/com/extrahardmode/features/monsters/Endermen.java @@ -124,9 +124,15 @@ public void onEntityTeleport(EntityTeleportEvent event) && destinationBlock.getY() < destinationBlock.getWorld().getMaxHeight()) destinationBlock = destinationBlock.getRelative(BlockFace.UP); - //Limit the height difference so players arent teleported into caves or teleported out of caves etc. + int playerY = player.getLocation().getBlockY(), destY = destinationBlock.getLocation().getBlockY(); - if (playerY > destY ? (playerY - destY) > 10 : (destY - playerY) > 10) + + //Sometimes enderman will teleport at/below bedrock into the void? See issue #165 + if (destY < 3) + return; + + //Limit the height difference so players arent teleported into caves or teleported out of caves etc. + if (Math.abs(playerY - destY) > 10) return; //Prevent Enderman from loosing aggro because player got ported into water From 717f3b58f347aa41a5330adffc65b57387f4c45d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 23 Feb 2019 19:05:49 -0800 Subject: [PATCH 152/252] GRASS should be GRASS_BLOCK Closes #163 --- src/main/java/com/extrahardmode/module/BlockModule.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 0b7f4964..58c82714 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -109,7 +109,7 @@ public UUID applyPhysics(Block block, boolean damageEntities) return null; // grass and mycel become dirt when they fall - if ((block.getType() == Material.GRASS || block.getType() == Material.MYCELIUM) && CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_TURN_TO_DIRT, block.getWorld().getName())) + if ((block.getType() == Material.GRASS_BLOCK || block.getType() == Material.MYCELIUM) && CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_TURN_TO_DIRT, block.getWorld().getName())) block.setType(Material.DIRT); FallingBlock fallingBlock = block.getWorld().spawnFallingBlock(block.getLocation().add(0.5D, 0.0D, 0.5D), block.getBlockData()); @@ -415,7 +415,7 @@ public boolean isArmor(Material material) /** Consider this block a natural block for spawning? */ public boolean isNaturalSpawnMaterial(Material material) { - return material == Material.GRASS + return material == Material.GRASS_BLOCK || material == Material.DIRT || material == Material.STONE || material == Material.SAND @@ -476,7 +476,7 @@ public static Material getDroppedMaterial(Material mat) switch (mat) { - case GRASS: + case GRASS_BLOCK: case FARMLAND: return Material.DIRT; case STONE: From 0e410d721388ff643f67fe373ded0d00cb021aa2 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 23 Feb 2019 20:28:42 -0800 Subject: [PATCH 153/252] return after removing animal claustrophibic metadata for crowd control Closes #159 --- src/main/java/com/extrahardmode/features/AnimalCrowdControl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index fa04fab8..6944af53 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -123,6 +123,7 @@ public void run() { animal.removeMetadata("hasRunnable", plugin); animal.removeMetadata("isClaustrophobic", plugin); this.cancel(); + return; } else if (dizziness >= maxDizziness) { animal.damage(0.5, animal); animal.setVelocity(new Vector()); //Triggers animal's "run away" AI From 5d308ff10064bcc2d166aea99aefc25fa06b4a9e Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 21:06:35 -0800 Subject: [PATCH 154/252] Don't perform enderdragon cleanup in non-EHM worlds. Fixes #162 --- src/main/java/com/extrahardmode/features/monsters/Glydia.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 6ad8735d..675c1c32 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -333,6 +333,10 @@ void onPlayerChangeWorld(PlayerChangedWorldEvent event) { World world = event.getFrom(); + //Ignore if world is not EHM-enabled + if (!CFG.isEnabledIn(world.getName())) + return; + final boolean respawnDragon = CFG.getBoolean(RootNode.RESPAWN_ENDER_DRAGON, world.getName()); // FEATURE: respawn the ender dragon when the last player leaves the end From 8eefe253f241efe15accfff352763aec213289a6 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 21:06:58 -0800 Subject: [PATCH 155/252] deprecate getters for deprecated classes --- .../com/extrahardmode/service/config/MultiWorldConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java index f8ab7d84..451ed17d 100644 --- a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java +++ b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java @@ -456,6 +456,7 @@ else if (enabledForAll) } + @Deprecated public BlockTypeList getBlocktypeList(final ConfigNode node, final String world) { BlockTypeList blockList; @@ -480,7 +481,7 @@ else if (enabledForAll) return blockList; } - + @Deprecated public BlockRelationsList getBlockRelationList(final ConfigNode node, final String world) { BlockRelationsList blockList; From fa0adb208dc484bcf2c32af24c24f0fd76513374 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 21:10:35 -0800 Subject: [PATCH 156/252] prevent torches being placed on top of grass `grass` normally (and naturally) spawns on top of `grass_block`, a "soft material," so it's acceptable to be listed here. Closes #156 --- src/main/java/com/extrahardmode/features/Torches.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index e68a0b87..e5242c71 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -130,6 +130,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) { case DIRT: case GRASS_BLOCK: + case GRASS: case SAND: case GRAVEL: case COARSE_DIRT: From 43f2db2764a60c7d24944e54847495e996b27ea7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 21:16:31 -0800 Subject: [PATCH 157/252] check for and evaporate waterlogged blocks Should close #151 --- .../java/com/extrahardmode/task/EvaporateWaterTask.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java index c0ee2208..9d235b15 100644 --- a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java +++ b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java @@ -70,5 +70,12 @@ public void run() //Finished processing blockModule.removeMark(block); } + else if (block.getBlockData() instanceof Waterlogged) + { + Waterlogged wowWater = (Waterlogged)block.getBlockData(); + wowWater.setWaterlogged(false); + block.setBlockData(wowWater, true); + blockModule.removeMark(block); + } } } From b2a4fc034d32eb9bc84d1abcc2288eafca914ff9 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 23:14:35 -0800 Subject: [PATCH 158/252] fix some ancient typo from before my time Closes #112 --- src/main/java/com/extrahardmode/features/Players.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 47e9284a..28bf7bf9 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -173,7 +173,7 @@ public void onEntityDeath(PlayerDeathEvent event) final int deathLossPercent = CFG.getInt(RootNode.PLAYER_DEATH_ITEM_STACKS_FORFEIT_PERCENT, world.getName()); final boolean playerBypasses = playerModule.playerBypasses(player, Feature.DEATH_INV_LOSS); - final int toolDmgPercent = CFG.getInt(RootNode.PLAYER_DEATH_ITEM_STACKS_FORFEIT_PERCENT, world.getName()); + final int toolDmgPercent = CFG.getInt(RootNode.PLAYER_DEATH_TOOLS_DMG_PERCENTAGE, world.getName()); final BlockTypeList blacklisted = CFG.getBlocktypeList(RootNode.PLAYER_DEATH_ITEMS_BLACKLIST, world.getName()); final BlockTypeList toolIds = CFG.getBlocktypeList(RootNode.PLAYER_DEATH_TOOLS_LIST, world.getName()); final boolean destroyTools = CFG.getBoolean(RootNode.PLAYER_DEATH_TOOLS_KEEP_DAMAGED, world.getName()); From 8dd68580f73a4a3dd9f9a36e517f2961c6f75df3 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 23:23:05 -0800 Subject: [PATCH 159/252] ensure at least one item will be removed if set to remove Closes #113 Though this algorithm should probably be altered to be a percent chance for each item rather than attempting to meet a quota IMO --- src/main/java/com/extrahardmode/features/Players.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 28bf7bf9..7f587841 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -185,6 +185,8 @@ public void onEntityDeath(PlayerDeathEvent event) List removedDrops = new ArrayList(); int numberOfStacksToRemove = (int) (drops.size() * (deathLossPercent / 100.0f)); + if (numberOfStacksToRemove == 0 && deathLossPercent > 0) + numberOfStacksToRemove = 1; loop: for (int i = 0; i < numberOfStacksToRemove && drops.size() > 0; i++) { From 417bf09237feee75e6310a9d832a70ac1a032dc2 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 23:31:38 -0800 Subject: [PATCH 160/252] extend delay between each torch cleanup task Also add debug message for WeatherChangeEvent to determine if somehow EHM is interfering --- src/main/java/com/extrahardmode/features/Torches.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index e5242c71..b364db08 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -156,6 +156,8 @@ public void onWeatherChange(WeatherChangeEvent event) { World world = event.getWorld(); + plugin.debug(world, "WeatherChangeEvent called"); + final boolean rainBreaksTorchesEnabled = CFG.getBoolean(RootNode.RAIN_BREAKS_TORCHES, world.getName()); final boolean snowBreaksCrops = CFG.getBoolean(RootNode.SNOW_BREAKS_CROPS, world.getName()); @@ -163,6 +165,7 @@ public void onWeatherChange(WeatherChangeEvent event) { if (rainBreaksTorchesEnabled || snowBreaksCrops) { + plugin.debug(world, "WeatherChangeEvent says the sky is now falling and will proceed to massacre torches (and exposed crops in snow biomes)"); // plan to remove torches chunk by chunk gradually throughout the rainperiod Chunk[] chunks = world.getLoadedChunks(); if (chunks.length > 0) @@ -173,7 +176,7 @@ public void onWeatherChange(WeatherChangeEvent event) Chunk chunk = chunks[(startOffset + i) % chunks.length]; RemoveExposedTorchesTask task = new RemoveExposedTorchesTask(plugin, chunk); - plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, i * 15L); + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, i * 100L); } } } From c64f6f8e069a5307bdb0ec8c5d668455abc5480b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 28 Feb 2019 23:49:00 -0800 Subject: [PATCH 161/252] Attempt to bypass protection plugins when animals are suffering from claustrophobia Hopefully fixes #58 --- .../java/com/extrahardmode/features/AnimalCrowdControl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index 6944af53..7b949efd 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -125,7 +125,10 @@ public void run() { this.cancel(); return; } else if (dizziness >= maxDizziness) { + double health = animal.getHealth(); animal.damage(0.5, animal); + if (animal.getHealth() == health) + animal.damage(0.5); //Attempt to override protection plugins like Worldguard animal.setVelocity(new Vector()); //Triggers animal's "run away" AI dizziness = 0; } From f494af34bb931cec4111a164a02056e2d9f5e9f0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 1 Mar 2019 09:47:25 -0800 Subject: [PATCH 162/252] mark both clicked and adjacent block for evaporation since waterlogging is a thing Closes #151 entirely. Also adds debugging for dispensers. --- .../com/extrahardmode/features/AntiFarming.java | 6 ++++-- .../extrahardmode/task/EvaporateWaterTask.java | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index c7e29c84..23ba2dad 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -235,6 +235,7 @@ void onBlockDispense(BlockDispenseEvent event) // FEATURE: can't move water source blocks if (dontMoveWaterEnabled) { + plugin.debug(world, event.getItem().getType().name() + event.getVelocity()); // only care about water if (event.getItem().getType() == Material.WATER_BUCKET) { @@ -255,7 +256,7 @@ void onBlockDispense(BlockDispenseEvent event) block = event.getBlock().getLocation().add(0.0, 0.0, -1.0).getBlock(); } - EvaporateWaterTask task = new EvaporateWaterTask(block, plugin); + EvaporateWaterTask task = new EvaporateWaterTask(block, block, plugin); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, 1L); } } @@ -417,7 +418,8 @@ public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) // plan to change this block into a non-source block on the next tick Block block = event.getBlockClicked().getRelative(event.getBlockFace()); blockModule.mark(block); - EvaporateWaterTask task = new EvaporateWaterTask(block, plugin); + blockModule.mark(event.getBlockClicked()); + EvaporateWaterTask task = new EvaporateWaterTask(block, event.getBlockClicked(), plugin); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, 10L); } } diff --git a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java index 9d235b15..4f57fa75 100644 --- a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java +++ b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java @@ -41,6 +41,11 @@ public class EvaporateWaterTask implements Runnable */ private final Block block; + /** + * The clicked block, in case it waterlogged it (1.13) + */ + private final Block clickedBlock; + /** * Module for Metadata */ @@ -52,9 +57,10 @@ public class EvaporateWaterTask implements Runnable * * @param block - Target block. */ - public EvaporateWaterTask(Block block, ExtraHardMode plugin) + public EvaporateWaterTask(Block block, Block clickedBlock, ExtraHardMode plugin) { this.block = block; + this.clickedBlock = clickedBlock; blockModule = plugin.getModuleForClass(BlockModule.class); } @@ -67,15 +73,16 @@ public void run() Levelled waterLevel = (Levelled)block.getBlockData(); waterLevel.setLevel(1); block.setBlockData(waterLevel, true); - //Finished processing - blockModule.removeMark(block); } - else if (block.getBlockData() instanceof Waterlogged) + else if (clickedBlock.getBlockData() instanceof Waterlogged) { Waterlogged wowWater = (Waterlogged)block.getBlockData(); wowWater.setWaterlogged(false); block.setBlockData(wowWater, true); - blockModule.removeMark(block); } + + //Finished processing + blockModule.removeMark(block); + blockModule.removeMark(clickedBlock); } } From a87833d7f26d95229d4cae5ebb2c8666d04d8cb0 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 1 Mar 2019 09:55:21 -0800 Subject: [PATCH 163/252] Fix evaporation of water placed by dispensers Once upon a time, getVelocity used to return something else for water buckets. Seems it just gives the location of the placed water bucket. That or this was a long-unchecked assumption. Closes #87 --- .../extrahardmode/features/AntiFarming.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index 23ba2dad..f32fa28e 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -235,27 +235,11 @@ void onBlockDispense(BlockDispenseEvent event) // FEATURE: can't move water source blocks if (dontMoveWaterEnabled) { - plugin.debug(world, event.getItem().getType().name() + event.getVelocity()); // only care about water if (event.getItem().getType() == Material.WATER_BUCKET) { // plan to evaporate the water next tick - Block block; - Vector velocity = event.getVelocity(); - if (velocity.getX() > 0.0) - { - block = event.getBlock().getLocation().add(1.0, 0.0, 0.0).getBlock(); - } else if (velocity.getX() < 0.0) - { - block = event.getBlock().getLocation().add(-1.0, 0.0, 0.0).getBlock(); - } else if (velocity.getZ() > 0.0) - { - block = event.getBlock().getLocation().add(0.0, 0.0, 1.0).getBlock(); - } else - { - block = event.getBlock().getLocation().add(0.0, 0.0, -1.0).getBlock(); - } - + Block block = event.getVelocity().toLocation(world).getBlock(); EvaporateWaterTask task = new EvaporateWaterTask(block, block, plugin); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, 1L); } From a92e6afd4a85a35454e4f1d7d265602b50caa138 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 1 Mar 2019 10:21:14 -0800 Subject: [PATCH 164/252] version 3.13.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ed7cba00..b43c16cf 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.1 + 3.13.2 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From 8617aeed085c63eef2633905268992766ed7da83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 1 May 2019 04:25:36 +0000 Subject: [PATCH 165/252] Bump git-commit-id-plugin from 2.2.6 to 3.0.0 Bumps [git-commit-id-plugin](https://github.com/git-commit-id/maven-git-commit-id-plugin) from 2.2.6 to 3.0.0. - [Release notes](https://github.com/git-commit-id/maven-git-commit-id-plugin/releases) - [Commits](https://github.com/git-commit-id/maven-git-commit-id-plugin/compare/v2.2.6...v3.0.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b43c16cf..355ce44a 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 2.2.6 + 3.0.0 get-the-git-infos From d369c9d8f39d90233954ac36bdae65abec8a6ac2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 3 May 2019 04:21:21 +0000 Subject: [PATCH 166/252] Bump maven-compiler-plugin from 3.8.0 to 3.8.1 Bumps [maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.8.0 to 3.8.1. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.8.0...maven-compiler-plugin-3.8.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 355ce44a..2ee13a30 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.8.1 1.8 1.8 From 00056ec7f6bdf96877b4d5f772113d21d1aab14d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 14 May 2019 04:25:19 +0000 Subject: [PATCH 167/252] Bump bstats-bukkit from 1.4 to 1.5 Bumps [bstats-bukkit](https://github.com/Bastian/bStats-Metrics) from 1.4 to 1.5. - [Release notes](https://github.com/Bastian/bStats-Metrics/releases) - [Commits](https://github.com/Bastian/bStats-Metrics/compare/1.4...1.5) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2ee13a30..03bb896e 100644 --- a/pom.xml +++ b/pom.xml @@ -305,7 +305,7 @@ org.bstats bstats-bukkit - 1.4 + 1.5 compile From fb36a79901f517c1773a23d62ba55aee8622a8ca Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 9 Jun 2019 15:18:42 -0700 Subject: [PATCH 168/252] ignore attempting to get ID of non-legacy materials. Closes #171 --- pom.xml | 2 +- .../com/extrahardmode/service/config/customtypes/BlockType.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 03bb896e..7ab94317 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.13.2 + 1.14.2 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java index c19d42f1..21cfef2b 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java @@ -33,6 +33,8 @@ public BlockType(int blockId) public BlockType(Material mat, Short... meta) { + if (!mat.isLegacy()) + return; this.blockId = mat.getId(); Collections.addAll(this.meta, meta); } From 5c6d2615e1bf328217e22b20bd5402874e385988 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 9 Jun 2019 15:43:53 -0700 Subject: [PATCH 169/252] 1.14 materials --- src/main/java/com/extrahardmode/module/BlockModule.java | 4 ++-- .../java/com/extrahardmode/task/RemoveExposedTorchesTask.java | 2 +- src/main/resources/plugin.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 58c82714..64e8d0c0 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -350,8 +350,8 @@ public boolean breaksFallingBlock(Material mat) mat == Material.COBWEB || mat == Material.DAYLIGHT_DETECTOR || Tag.TRAPDOORS.isTagged(mat) || - mat == Material.SIGN || - mat == Material.WALL_SIGN || + Tag.SIGNS.isTagged(mat) || + Tag.WALL_SIGNS.isTagged(mat) || //Match all slabs besides double slab slabPattern.matcher(mat.name()).matches(); } diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index 14ace468..117a45a7 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -131,7 +131,7 @@ public void run() case CARROT: case PUMPKIN_STEM: case POTATO: - case ROSE_RED: //RED_ROSE + case ROSE_BUSH: //RED_ROSE //ROSE_RED case DANDELION: //YELLOW FLOWER case GRASS: //I still can't recall if the replacement for LONG_GRASS is GRASS or TALL_GRASS... case TALL_GRASS: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ba8616c7..f897c260 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,7 +8,7 @@ author: RoboMWM authors: [Diemex, Big_Scary] #ensure that we are loaded after multiworld plugins softdepend: [Multiverse-Core, My_Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] -api-version: 1.13 +api-version: '1.14' commands: ehm: description: Root command for ExtraHardMode From f00ecfdeaaf71b9d768cfd7f06893a4414dd4ccb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 22 Jun 2019 13:28:50 -0700 Subject: [PATCH 170/252] Semi alpha 1.14 update - Remove blocktype entirely (#172) --- pom.xml | 2 +- .../com/extrahardmode/config/EHMConfig.java | 39 ++- .../com/extrahardmode/config/RootNode.java | 75 +++--- .../extrahardmode/features/HardenedStone.java | 94 ++++--- .../com/extrahardmode/features/Players.java | 14 +- .../service/config/ConfigNode.java | 4 +- .../service/config/MultiWorldConfig.java | 28 +-- .../config/customtypes/BlockRelation.java | 33 --- .../customtypes/BlockRelationsList.java | 31 +-- .../service/config/customtypes/BlockType.java | 231 ------------------ .../config/customtypes/BlockTypeList.java | 75 ------ .../task/BlockPhysicsCheckTask.java | 7 +- src/main/resources/plugin.yml | 2 +- .../extrahardmode/service/BlockTypeTest.java | 87 ------- 14 files changed, 136 insertions(+), 586 deletions(-) delete mode 100644 src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java delete mode 100644 src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java delete mode 100644 src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java delete mode 100644 src/test/com/extrahardmode/service/BlockTypeTest.java diff --git a/pom.xml b/pom.xml index 7ab94317..f5900b81 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.13.2 + 3.14.alpha ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode diff --git a/src/main/java/com/extrahardmode/config/EHMConfig.java b/src/main/java/com/extrahardmode/config/EHMConfig.java index bcb79455..409b5d17 100644 --- a/src/main/java/com/extrahardmode/config/EHMConfig.java +++ b/src/main/java/com/extrahardmode/config/EHMConfig.java @@ -25,10 +25,9 @@ import com.extrahardmode.service.IoHelper; import com.extrahardmode.service.config.*; import com.extrahardmode.service.config.customtypes.BlockRelationsList; -import com.extrahardmode.service.config.customtypes.BlockType; -import com.extrahardmode.service.config.customtypes.BlockTypeList; import com.extrahardmode.service.config.customtypes.PotionEffectHolder; import org.apache.commons.lang.Validate; +import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -474,27 +473,27 @@ public void loadNodes() obj = PotionEffectHolder.loadFromConfig(section); break; } - case BLOCKTYPE: + case MATERIAL: { if (mConfig.getString(node.getPath()) != null) - obj = BlockType.loadFromConfig(mConfig.getString(node.getPath())); + obj = Material.matchMaterial(mConfig.getString(node.getPath())); break; } - case BLOCKTYPE_LIST: + case MATERIAL_LIST: { + List materialList = new ArrayList<>(); if (mConfig.get(node.getPath()) instanceof List) { List list = mConfig.getStringList(node.getPath()); - BlockTypeList blocks = new BlockTypeList(); for (String str : list) { - BlockType block = BlockType.loadFromConfig(str); - if (block != null) - blocks.add(block); + Material material = Material.matchMaterial(str); + if (material != null) + materialList.add(material); } - obj = blocks; + obj = materialList; } else if (mConfig.isSet(node.getPath())) - obj = BlockTypeList.EMPTY_LIST; + obj = materialList; //obj = BlockTypeList.EMPTY_LIST; //No idea why this is empty but ok? break; } case BLOCK_RELATION_LIST: @@ -568,22 +567,22 @@ private void saveNodes() //Custom writing code for our custom objects switch (node.getVarType()) { - case BLOCKTYPE: + case MATERIAL: { - if (value instanceof BlockType) + if (value instanceof Material) { - outConfig.set(node.getPath(), ((BlockType) value).saveToString()); + outConfig.set(node.getPath(), ((Material)value).name()); break; } } - case BLOCKTYPE_LIST: + case MATERIAL_LIST: { - if (value instanceof BlockTypeList) + if (value instanceof ArrayList) { - List blockStrings = new ArrayList(); - for (BlockType blockType : ((BlockTypeList) value).toArray()) - blockStrings.add(blockType.saveToString()); - outConfig.set(node.getPath(), blockStrings); + List materialStrings = new ArrayList<>(); + for (Material material : (ArrayList)value) + materialStrings.add(material.name()); + outConfig.set(node.getPath(), materialStrings); break; } } diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index ff64fffa..eef5cbff 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -25,8 +25,6 @@ import com.extrahardmode.service.config.ConfigNode; import com.extrahardmode.service.config.MultiWorldConfig; import com.extrahardmode.service.config.customtypes.BlockRelationsList; -import com.extrahardmode.service.config.customtypes.BlockType; -import com.extrahardmode.service.config.customtypes.BlockTypeList; import com.extrahardmode.service.config.customtypes.PotionEffectHolder; import org.bukkit.Material; import org.bukkit.potion.PotionEffectType; @@ -96,7 +94,7 @@ public enum RootNode implements ConfigNode */ SUPER_HARD_STONE("World Rules.Mining.Inhibit Tunneling.Enable", VarType.BOOLEAN, true, "If hardened blocks can only be broken by specific tools"), - SUPER_HARD_BLOCKS("World Rules.Mining.Inhibit Tunneling.Hardened Blocks", VarType.BLOCKTYPE_LIST, new DefaultHardBlocks(), + SUPER_HARD_BLOCKS("World Rules.Mining.Inhibit Tunneling.Hardened Blocks", VarType.MATERIAL_LIST, new DefaultHardBlocks(), "These blocks will be treated as hardened"), /** * If ore placement next to stone blocks should be blocked to prevent tunneling @@ -111,7 +109,7 @@ public enum RootNode implements ConfigNode /** * whether stone is hardened to encourage cave exploration over tunneling */ - SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine (Tool@Blocks)", VarType.BLOCKTYPE_LIST, new DefaultToolDurabilities(), + SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine (Tool@Blocks)", VarType.MATERIAL_LIST, new DefaultToolDurabilities(), "List of tools that can mine stone. If a tool isn't in the list it can't mine stone.", "F.e. DIAMOND_PICKAXE@100 = Mine 100 stone blocks -> pick broken"), /** @@ -128,7 +126,7 @@ public enum RootNode implements ConfigNode /** * These Blocks will turn surrounding stone into cobblestone */ - SUPER_HARD_STONE_ORE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Blocks (Block@id,id2)", VarType.BLOCKTYPE_LIST, new DefaultPhysicsBlocks(), + SUPER_HARD_STONE_ORE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Blocks (Block@id,id2)", VarType.MATERIAL_LIST, new DefaultPhysicsBlocks(), "Ore blocks that will soften surrounding stone blocks."), /** * Stone Blocks and their counter respective cobblestone blocks @@ -276,9 +274,9 @@ public enum RootNode implements ConfigNode /** * List of items that count as tools */ - PLAYER_DEATH_TOOLS_LIST("Player.Death.Loose Items On Death.Tools", VarType.BLOCKTYPE_LIST, new DefaultValuableTools(), + PLAYER_DEATH_TOOLS_LIST("Player.Death.Loose Items On Death.Tools", VarType.MATERIAL_LIST, new DefaultValuableTools(), "Tool settings apply only to these tools"), - PLAYER_DEATH_ITEMS_BLACKLIST("Player.Death.Loose Items On Death.Blacklisted Items", VarType.BLOCKTYPE_LIST, BlockTypeList.EMPTY_LIST, + PLAYER_DEATH_ITEMS_BLACKLIST("Player.Death.Loose Items On Death.Blacklisted Items", VarType.MATERIAL_LIST, new ArrayList(), "These items will never be removed on death."), /** * Enable custom Health @@ -887,7 +885,7 @@ public enum RootNode implements ConfigNode /** * which materials beyond sand and gravel should be subject to gravity */ - MORE_FALLING_BLOCKS("Additional Falling Blocks.Enabled Blocks", VarType.BLOCKTYPE_LIST, new DefaultFallingBlocks()), + MORE_FALLING_BLOCKS("Additional Falling Blocks.Enabled Blocks", VarType.MATERIAL_LIST, new DefaultFallingBlocks()), /** * ############################## @@ -1376,9 +1374,9 @@ public Object getValueToDisable() obj = Collections.emptyList(); break; } - case BLOCKTYPE_LIST: + case MATERIAL_LIST: { - obj = BlockTypeList.EMPTY_LIST; + obj = new ArrayList(); break; } case BLOCK_RELATION_LIST: @@ -1437,7 +1435,7 @@ public Object get() /** * Default list of falling blocks. */ - private static class DefaultFallingBlocks extends BlockTypeList + private static class DefaultFallingBlocks extends ArrayList { /** * Constructor. @@ -1445,13 +1443,13 @@ private static class DefaultFallingBlocks extends BlockTypeList public DefaultFallingBlocks() { super(); - this.add(new BlockType(Material.DIRT)); - this.add(new BlockType(Material.GRASS)); - this.add(new BlockType(Material.COBBLESTONE)); - this.add(new BlockType(Material.MOSSY_COBBLESTONE)); - this.add(new BlockType(Material.STONE_SLAB)); - this.add(new BlockType(Material.COBBLESTONE_SLAB)); - this.add(new BlockType(Material.MYCELIUM)); + this.add(Material.DIRT); + this.add(Material.GRASS); + this.add(Material.COBBLESTONE); + this.add(Material.MOSSY_COBBLESTONE); + this.add(Material.STONE_SLAB); + this.add(Material.COBBLESTONE_SLAB); + this.add(Material.MYCELIUM); } } @@ -1459,7 +1457,7 @@ public DefaultFallingBlocks() /** * Default list of falling blocks. */ - private static class DefaultPhysicsBlocks extends BlockTypeList + private static class DefaultPhysicsBlocks extends ArrayList { /** * Constructor. @@ -1467,21 +1465,22 @@ private static class DefaultPhysicsBlocks extends BlockTypeList public DefaultPhysicsBlocks() { super(); - this.add(new BlockType(Material.COAL_ORE)); - this.add(new BlockType(Material.IRON_ORE)); - this.add(new BlockType(Material.GOLD_ORE)); - this.add(new BlockType(Material.LAPIS_ORE)); - this.add(new BlockType(Material.REDSTONE_ORE)); - this.add(new BlockType(Material.EMERALD_ORE)); - this.add(new BlockType(Material.DIAMOND_ORE)); + this.add(Material.COAL_ORE); + this.add(Material.IRON_ORE); + this.add(Material.GOLD_ORE); + this.add(Material.LAPIS_ORE); + this.add(Material.REDSTONE_ORE); + this.add(Material.EMERALD_ORE); + this.add(Material.DIAMOND_ORE); } } + //TODO: fix, somehow /** * Default list of tool durabilities */ - private static class DefaultToolDurabilities extends BlockTypeList + private static class DefaultToolDurabilities extends ArrayList { /** * Constructor. @@ -1489,8 +1488,10 @@ private static class DefaultToolDurabilities extends BlockTypeList public DefaultToolDurabilities() { super(); - this.add(new BlockType(Material.IRON_PICKAXE, (short) 32)); - this.add(new BlockType(Material.DIAMOND_PICKAXE, (short) 64)); + //this.add(new BlockType(Material.IRON_PICKAXE, (short) 32)); + //this.add(new BlockType(Material.DIAMOND_PICKAXE, (short) 64)); + this.add(Material.IRON_PICKAXE); + this.add(Material.DIAMOND_PICKAXE); } } @@ -1506,31 +1507,31 @@ private static class DefaultStoneBlocks extends BlockRelationsList public DefaultStoneBlocks() { super(); - this.add(new BlockType(Material.STONE), new BlockType(Material.COBBLESTONE)); + this.add(Material.STONE, Material.COBBLESTONE); } } - private static class DefaultValuableTools extends BlockTypeList + private static class DefaultValuableTools extends ArrayList { public DefaultValuableTools() { super(); - this.add(new BlockType(Material.DIAMOND_AXE)); - this.add(new BlockType(Material.DIAMOND_SWORD)); - this.add(new BlockType(Material.DIAMOND_PICKAXE)); - this.add(new BlockType(Material.DIAMOND_SHOVEL)); + this.add(Material.DIAMOND_AXE); + this.add(Material.DIAMOND_SWORD); + this.add(Material.DIAMOND_PICKAXE); + this.add(Material.DIAMOND_SHOVEL); } } - private static class DefaultHardBlocks extends BlockTypeList + private static class DefaultHardBlocks extends ArrayList { public DefaultHardBlocks() { super(); - this.add(new BlockType(Material.STONE)); + this.add(Material.STONE); } } diff --git a/src/main/java/com/extrahardmode/features/HardenedStone.java b/src/main/java/com/extrahardmode/features/HardenedStone.java index 136ff4db..a5fa065f 100644 --- a/src/main/java/com/extrahardmode/features/HardenedStone.java +++ b/src/main/java/com/extrahardmode/features/HardenedStone.java @@ -26,17 +26,13 @@ import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.config.messages.MessageNode; -import com.extrahardmode.events.EhmHardenedStoneEvent; import com.extrahardmode.module.BlockModule; import com.extrahardmode.module.MsgModule; import com.extrahardmode.module.PlayerModule; -import com.extrahardmode.module.UtilityModule; import com.extrahardmode.service.Feature; import com.extrahardmode.service.ListenerModule; -import com.extrahardmode.service.PermissionNode; import com.extrahardmode.service.config.customtypes.BlockRelationsList; -import com.extrahardmode.service.config.customtypes.BlockType; -import com.extrahardmode.service.config.customtypes.BlockTypeList; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -47,7 +43,6 @@ import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; @@ -101,55 +96,54 @@ public void onBlockBreak(BlockBreakEvent event) final boolean applyPhysics = CFG.getBoolean(RootNode.SUPER_HARD_STONE_PHYSICS_APPLY, world.getName()); final boolean playerBypasses = playerModule.playerBypasses(player, Feature.HARDENEDSTONE); - final BlockTypeList tools = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_TOOLS, world.getName()); - final BlockTypeList physicsBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); +// final BlockTypeList tools = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_TOOLS, world.getName()); + final List physicsBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); - final BlockTypeList hardBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_BLOCKS, world.getName()); +// final BlockTypeList hardBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_BLOCKS, world.getName()); // FEATURE: stone breaks tools much quicker - if (hardStoneEnabled && hardBlocks.contains(block) && !playerBypasses) - { - ItemStack inHandStack = player.getItemInHand(); - - if (inHandStack != null) - { - int toolId = inHandStack.getType().getId(); - short blocks = 0; - BlockType toolSettings = tools.get(toolId); - if (toolSettings != null && toolSettings.getAllMeta().size() > 0) - blocks = toolSettings.getMeta(); - EhmHardenedStoneEvent hardEvent = new EhmHardenedStoneEvent(player, inHandStack, blocks); - - if (toolSettings != null) - { - /* Broadcast an Event for other Plugins to change if the tool can break stone and the amount of blocks */ - plugin.getServer().getPluginManager().callEvent(hardEvent); - - // otherwise, drastically reduce tool durability when breaking stone - if (hardEvent.getNumOfBlocks() > 0) - { - player.setItemInHand(UtilityModule.damage(hardEvent.getTool(), hardEvent.getNumOfBlocks())); - } - } - if (hardEvent.getNumOfBlocks() == 0) - { - messenger.send(player, MessageNode.STONE_MINING_HELP, PermissionNode.SILENT_STONE_MINING_HELP); - event.setCancelled(true); - return; - } - } - } +// if (hardStoneEnabled && hardBlocks.contains(block) && !playerBypasses) +// { +// ItemStack inHandStack = player.getItemInHand(); +// +// if (inHandStack != null) +// { +// int toolId = inHandStack.getType().getId(); +// short blocks = 0; +// BlockType toolSettings = tools.get(toolId); +// if (toolSettings != null && toolSettings.getAllMeta().size() > 0) +// blocks = toolSettings.getMeta(); +// EhmHardenedStoneEvent hardEvent = new EhmHardenedStoneEvent(player, inHandStack, blocks); +// +// if (toolSettings != null) +// { +// /* Broadcast an Event for other Plugins to change if the tool can break stone and the amount of blocks */ +// plugin.getServer().getPluginManager().callEvent(hardEvent); +// +// // otherwise, drastically reduce tool durability when breaking stone +// if (hardEvent.getNumOfBlocks() > 0) +// { +// player.setItemInHand(UtilityModule.damage(hardEvent.getTool(), hardEvent.getNumOfBlocks())); +// } +// } +// if (hardEvent.getNumOfBlocks() == 0) +// { +// messenger.send(player, MessageNode.STONE_MINING_HELP, PermissionNode.SILENT_STONE_MINING_HELP); +// event.setCancelled(true); +// return; +// } +// } +// } // when ore is broken, it softens adjacent stone important to ensure players can reach the ore they break - if (hardStonePhysix && physicsBlocks.contains(block)) + if (hardStonePhysix && physicsBlocks.contains(block.getType())) { for (BlockFace face : blockModule.getTouchingFaces()) { Block adjacentBlock = block.getRelative(face); if (stoneBlocks.contains(adjacentBlock)) { - //TODO: 1.13: adjacentBlock.setTypeIdAndData(stoneBlocks.get(adjacentBlock).getBlockId(), stoneBlocks.get(adjacentBlock).getByteMeta(), true); - adjacentBlock.setType(stoneBlocks.get(adjacentBlock).getType()); + adjacentBlock.setType(stoneBlocks.get(adjacentBlock)); if (applyPhysics) blockModule.applyPhysics(adjacentBlock, true); } @@ -171,10 +165,10 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.HARDENEDSTONE); final boolean hardstoneEnabled = CFG.getBoolean(RootNode.SUPER_HARD_STONE, world.getName()); final boolean blockOrePlacement = CFG.getBoolean(RootNode.SUPER_HARD_STONE_BLOCK_ORE_PLACEMENT, world.getName()); - final BlockTypeList oreBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List oreBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); - if (hardstoneEnabled && blockOrePlacement && !playerBypasses && oreBlocks.contains(block)) + if (hardstoneEnabled && blockOrePlacement && !playerBypasses && oreBlocks.contains(block.getType())) { ArrayList adjacentBlocks = new ArrayList(); for (BlockFace face : blockModule.getTouchingFaces()) @@ -207,7 +201,7 @@ public void onBlockPistonExtend(BlockPistonExtendEvent event) final boolean superHardStone = CFG.getBoolean(RootNode.SUPER_HARD_STONE, world.getName()); final boolean blockPistons = CFG.getBoolean(RootNode.SUPER_HARD_STONE_BLOCK_PISTONS, world.getName()); - final BlockTypeList oreBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List oreBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); if (superHardStone && blockPistons) @@ -216,7 +210,7 @@ public void onBlockPistonExtend(BlockPistonExtendEvent event) for (Block block : blocks) { // if any are ore or stone, don't push - if (stoneBlocks.contains(block) || oreBlocks.contains(block)) + if (stoneBlocks.contains(block) || oreBlocks.contains(block.getType())) { event.setCancelled(true); return; @@ -240,13 +234,13 @@ public void onBlockPistonRetract(BlockPistonRetractEvent event) final boolean superHardStone = CFG.getBoolean(RootNode.SUPER_HARD_STONE, world.getName()); final boolean blockPistons = CFG.getBoolean(RootNode.SUPER_HARD_STONE_BLOCK_PISTONS, world.getName()); - final BlockTypeList oreBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List oreBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); // only sticky pistons can pull back blocks if (event.isSticky() && superHardStone && blockPistons) { - if (stoneBlocks.contains(block) || oreBlocks.contains(block)) + if (stoneBlocks.contains(block) || oreBlocks.contains(block.getType())) { event.setCancelled(true); return; diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index 7f587841..fbde4000 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -32,8 +32,6 @@ import com.extrahardmode.module.PlayerModule; import com.extrahardmode.service.Feature; import com.extrahardmode.service.ListenerModule; -import com.extrahardmode.service.config.customtypes.BlockType; -import com.extrahardmode.service.config.customtypes.BlockTypeList; import com.extrahardmode.service.config.customtypes.PotionEffectHolder; import com.extrahardmode.task.ArmorWeightTask; import com.extrahardmode.task.SetPlayerHealthAndFoodTask; @@ -174,8 +172,8 @@ public void onEntityDeath(PlayerDeathEvent event) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.DEATH_INV_LOSS); final int toolDmgPercent = CFG.getInt(RootNode.PLAYER_DEATH_TOOLS_DMG_PERCENTAGE, world.getName()); - final BlockTypeList blacklisted = CFG.getBlocktypeList(RootNode.PLAYER_DEATH_ITEMS_BLACKLIST, world.getName()); - final BlockTypeList toolIds = CFG.getBlocktypeList(RootNode.PLAYER_DEATH_TOOLS_LIST, world.getName()); + final List blacklisted = CFG.getMaterialList(RootNode.PLAYER_DEATH_ITEMS_BLACKLIST, world.getName()); + final List toolIds = CFG.getMaterialList(RootNode.PLAYER_DEATH_TOOLS_LIST, world.getName()); final boolean destroyTools = CFG.getBoolean(RootNode.PLAYER_DEATH_TOOLS_KEEP_DAMAGED, world.getName()); // FEATURE: some portion of player inventory is permanently lost on death @@ -191,8 +189,8 @@ public void onEntityDeath(PlayerDeathEvent event) for (int i = 0; i < numberOfStacksToRemove && drops.size() > 0; i++) { ItemStack toRemove = drops.get(plugin.getRandom().nextInt(drops.size())); - for (BlockType block : blacklisted.toArray()) - if (block.matches(toRemove)) + for (Material material : blacklisted) + if (material == toRemove.getType()) continue loop; //don't remove blacklisted items removedDrops.add(toRemove); } @@ -206,10 +204,10 @@ public void onEntityDeath(PlayerDeathEvent event) outer: for (ItemStack item : evntDropsRemove) { - for (BlockType tool : toolIds.toArray()) + for (Material tool : toolIds) { //Damage valuable tools instead of completely destroying them - if (tool.matches(item)) + if (tool == item.getType()) { short dur = item.getDurability(); short maxDurability = item.getType().getMaxDurability(); diff --git a/src/main/java/com/extrahardmode/service/config/ConfigNode.java b/src/main/java/com/extrahardmode/service/config/ConfigNode.java index e55ef0c4..c245f69c 100644 --- a/src/main/java/com/extrahardmode/service/config/ConfigNode.java +++ b/src/main/java/com/extrahardmode/service/config/ConfigNode.java @@ -73,8 +73,8 @@ public enum VarType LIST, COLOR, POTION_EFFECT, - @Deprecated BLOCKTYPE, - @Deprecated BLOCKTYPE_LIST, + MATERIAL, + MATERIAL_LIST, @Deprecated BLOCK_RELATION_LIST, COMMENT } diff --git a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java index 451ed17d..7bd749bd 100644 --- a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java +++ b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java @@ -25,14 +25,13 @@ import com.extrahardmode.ExtraHardMode; import com.extrahardmode.service.EHMModule; import com.extrahardmode.service.config.customtypes.BlockRelationsList; -import com.extrahardmode.service.config.customtypes.BlockType; -import com.extrahardmode.service.config.customtypes.BlockTypeList; import com.extrahardmode.service.config.customtypes.PotionEffectHolder; import com.google.common.collect.BiMap; import com.google.common.collect.HashBasedTable; import com.google.common.collect.HashBiMap; import com.google.common.collect.Table; import org.apache.commons.lang.Validate; +import org.bukkit.Material; import java.util.ArrayList; import java.util.List; @@ -146,17 +145,9 @@ public void set(final String world, final ConfigNode node, Object value) break; } } - case BLOCKTYPE: + case MATERIAL: { - if (value instanceof BlockType) - { - OPTIONS.put(world, node, value); - break; - } - } - case BLOCKTYPE_LIST: - { - if (value instanceof BlockTypeList) + if (value instanceof Material) { OPTIONS.put(world, node, value); break; @@ -240,8 +231,7 @@ public String getAllWorldString() { varTypeClassMap.put(ConfigNode.VarType.INTEGER, Integer.class); varTypeClassMap.put(ConfigNode.VarType.BOOLEAN, Boolean.class); - varTypeClassMap.put(ConfigNode.VarType.BLOCKTYPE, BlockType.class); - varTypeClassMap.put(ConfigNode.VarType.BLOCKTYPE_LIST, BlockTypeList.class); + varTypeClassMap.put(ConfigNode.VarType.MATERIAL, Material.class); varTypeClassMap.put(ConfigNode.VarType.BLOCK_RELATION_LIST, BlockRelationsList.class); varTypeClassMap.put(ConfigNode.VarType.DOUBLE, Double.class); varTypeClassMap.put(ConfigNode.VarType.LIST, List.class); @@ -457,25 +447,25 @@ else if (enabledForAll) @Deprecated - public BlockTypeList getBlocktypeList(final ConfigNode node, final String world) + public List getMaterialList(final ConfigNode node, final String world) { - BlockTypeList blockList; + List blockList; switch (node.getVarType()) { - case BLOCKTYPE_LIST: + case MATERIAL_LIST: { Object obj = null; if (OPTIONS.contains(world, node)) obj = OPTIONS.get(world, node); else if (enabledForAll) obj = OPTIONS.get(ALL_WORLDS, node); - blockList = obj instanceof BlockTypeList ? (BlockTypeList) obj : (BlockTypeList) node.getValueToDisable(); + blockList = obj instanceof List? (List) obj : (List) node.getValueToDisable(); break; } default: { - throw new IllegalArgumentException("Attempted to get " + node.toString() + " of type " + node.getVarType() + " as a BlockTypeList."); + throw new IllegalArgumentException("Attempted to get " + node.toString() + " of type " + node.getVarType() + " as a List."); } } return blockList; diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java deleted file mode 100644 index eb6581dd..00000000 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelation.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.extrahardmode.service.config.customtypes; - - -/** - * Simple Pair - * - * @deprecated Unused, uses BlockType - */ -@Deprecated -public final class BlockRelation -{ - private BlockType mBlock1 = null; - private BlockType mBlock2 = null; - - - public BlockRelation(BlockType block1, BlockType block2) - { - this.mBlock1 = block1; - this.mBlock2 = block2; - } - - - public BlockType getKeyBlock() - { - return mBlock1; - } - - - public BlockType getValueBlock() - { - return mBlock2; - } -} diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java index 132a4fc7..56919db1 100644 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java +++ b/src/main/java/com/extrahardmode/service/config/customtypes/BlockRelationsList.java @@ -1,6 +1,7 @@ package com.extrahardmode.service.config.customtypes; +import org.bukkit.Material; import org.bukkit.block.Block; import java.util.HashMap; @@ -9,14 +10,14 @@ /** * Holds a relationship. BlockTypes can be retrieved by their key BlockType. F.e stone -> cobblestone * - * @deprecated Uses deprecated BlockTypes + * @deprecated Was originally used to hold the now-deprecated BlockTypes. Maybe now just overkill? idk. * * Only used for the "soften surrounding stone" feature, turning one block (e.g. stone) into another (e.g. cobblestone) */ @Deprecated public class BlockRelationsList { - private Map mBlockRelations = new HashMap(); + private Map mBlockRelations = new HashMap<>(); /** * An empty list */ @@ -37,9 +38,9 @@ public void addFromConfig(String configString) if (splitted.length < 2) return; - BlockType block1 = BlockType.loadFromConfig(splitted[0]); - BlockType block2 = BlockType.loadFromConfig(splitted[1]); - if (block1.isValid() && block2.isValid()) + Material block1 = Material.matchMaterial(splitted[0]); + Material block2 = Material.matchMaterial(splitted[1]); + if (block1 != null && block2 != null) add(block1, block2); } @@ -55,7 +56,7 @@ public String[] toConfigStrings() return new String[]{""}; String[] configStrings = new String[mBlockRelations.size()]; int i = 0; - for (Map.Entry relation : mBlockRelations.entrySet()) + for (Map.Entry relation : mBlockRelations.entrySet()) { configStrings[i] = relation.getKey().toString() + "-" + relation.getValue().toString(); i++; @@ -64,25 +65,17 @@ public String[] toConfigStrings() } - public void add(BlockType block1, BlockType block2) + public void add(Material block1, Material block2) { mBlockRelations.put(block1, block2); } - public BlockType get(BlockType blockType) + public Material get(Block block) { - for (Map.Entry entry : mBlockRelations.entrySet()) - if (entry.getKey().equals(blockType)) - return entry.getValue(); - return null; - } - - - public BlockType get(Block block) - { - for (Map.Entry entry : mBlockRelations.entrySet()) - if (entry.getKey().matches(block.getType().getId(), block.getData())) + Material material = block.getType(); + for (Map.Entry entry : mBlockRelations.entrySet()) + if (entry.getKey() == material) return entry.getValue(); return null; } diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java deleted file mode 100644 index 21cfef2b..00000000 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockType.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.extrahardmode.service.config.customtypes; - - -import com.extrahardmode.service.RegexHelper; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; - -import java.util.*; -import java.util.regex.Pattern; - -/** - * Holds one blocktype, but a range of metadata for that block. - * F.e. this could have meta for spruce, oak and jungle wood, but exclude birch. - * - * @deprecated No longer needed with "The Flattening" in 1.13 - * - * @author Diemex - */ -@Deprecated -public final class BlockType -{ - private static Pattern separators = Pattern.compile("[^A-Za-z0-9_]"); - private int blockId = -1; - private Set meta = new LinkedHashSet(); - - - public BlockType(int blockId) - { - this.blockId = blockId; - } - - - public BlockType(Material mat, Short... meta) - { - if (!mat.isLegacy()) - return; - this.blockId = mat.getId(); - Collections.addAll(this.meta, meta); - } - - - public BlockType(int blockId, Short... meta) - { - this.blockId = blockId; - Collections.addAll(this.meta, meta); - } - - - public BlockType(int blockId, short meta) - { - this.blockId = blockId; - this.meta.add(meta); - } - - - public BlockType(int blockId, Collection meta) - { - this.blockId = blockId; - this.meta.addAll(meta); - } - - - public int getBlockId() - { - return blockId; - } - - - public Set getAllMeta() - { - return new HashSet(meta); - } - - - public byte getByteMeta() - { - return meta.size() > 0 ? (byte) RegexHelper.safeCast(meta.iterator().next(), Byte.MIN_VALUE, Byte.MAX_VALUE) : 0; - } - - - public short getMeta() - { - return meta.size() > 0 ? meta.iterator().next() : 0; - } - - - private boolean matchesMeta(short meta) - { - if (this.meta.size() > 0) - { - for (Short aMeta : this.meta) - { - if (aMeta == meta) - return true; - } - } else //no meta specified -> all blocks match - return true; - return false; - } - - - public boolean matches(int blockId) - { - return this.blockId == blockId; - } - - - public boolean matches(int blockId, short meta) - { - return matches(blockId) && matchesMeta(meta); - } - - - public boolean matches(Block block) - { - return matches(block.getType().getId(), block.getData()); - } - - - public boolean matches(ItemStack stack) - { - return matches(stack.getType().getId(), stack.getData().getData()); - } - - - public static BlockType loadFromConfig(String input) - { - if (input == null) - return null; - //PREPARATION - int blockId; - Set meta = new HashSet(); - input = RegexHelper.trimWhitespace(input); - String[] splitted = separators.split(input); - if (splitted.length == 0) - return null; - //BLOCK META - for (int i = 1; i < splitted.length; i++) //first value is blockId - meta.add(RegexHelper.parseShort(splitted[i])); - - //BLOCK ID - String blockIdString = splitted[0]; - Material material = Material.matchMaterial(blockIdString); - if (material == null) //Not found in material enum - { - // try as a number (blockId) - String tempId = RegexHelper.stripNumber(blockIdString); - if (!tempId.isEmpty()) - material = Material.getMaterial(tempId); - // still fail -> try as enum again but strip numbers - if (material == null) - material = Material.matchMaterial(RegexHelper.stripEnum(blockIdString)); - } - if (material != null) - blockId = material.getId(); - else //mod item or -1 if not valid - blockId = RegexHelper.parseNumber(blockIdString, -1); - return new BlockType(blockId, meta); - } - - - public String saveToString() - { - StringBuilder builder = new StringBuilder(); - Material material = getMaterial(blockId); - builder.append(material != null ? material.name() : blockId); - - boolean first = true; - for (Short metaBit : meta) - { - if (first) builder.append('@'); - else builder.append(','); - builder.append(metaBit); - if (first) first = false; - } - - return builder.toString(); - } - - //Temporary thing for for 1.13 compatibility - //TODO: remove when properly supporting 1.13 (if there's even a use for this package at this point) - private Material getMaterial(int id) - { - for (Material material : Material.values()) - if (material.getId() == id) - return material; - return null; - } - public Material getType() - { - return getMaterial(blockId); - } - - - public boolean isValid() - { - return blockId >= 0; - } - - - @Override - public String toString() - { - return saveToString(); - } - - - @Override - public boolean equals(Object obj) - { - if (obj == null) - return false; - else if (obj == this) - return true; - else if (!(obj instanceof BlockType)) - return false; - return blockId == ((BlockType) obj).blockId && - meta.equals(((BlockType) obj).meta); - } - - - @Override - public int hashCode() - { - int hash = blockId; - for (short data : meta) - hash += data; - return hash; - } -} diff --git a/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java b/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java deleted file mode 100644 index 260a8000..00000000 --- a/src/main/java/com/extrahardmode/service/config/customtypes/BlockTypeList.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.extrahardmode.service.config.customtypes; - - -import org.bukkit.block.Block; - -import java.util.*; - -/** - * @deprecated BlockType is deprecated - */ -@Deprecated -public class BlockTypeList -{ - private Map blockTypeMap = new HashMap(); - /** - * Empty List with no values - */ - public final static BlockTypeList EMPTY_LIST = new BlockTypeList(); - - - public BlockTypeList() - { - } - - - public BlockTypeList(Collection blockTypes) - { - for (BlockType blockType : blockTypes) - add(blockType); - } - - - public boolean contains(Block block) - { - BlockType type = blockTypeMap.get(block.getType().getId()); - return type != null && type.matches(block); - } - - - public boolean contains(int blockId) - { - return blockTypeMap.containsKey(blockId); - } - - - public void add(BlockType blockType) - { - //merge meta if exists - if (blockTypeMap.containsKey(blockType.getBlockId())) - { - Set merged = blockTypeMap.get(blockType.getBlockId()).getAllMeta(); - merged.addAll(blockType.getAllMeta()); - blockType = new BlockType(blockType.getBlockId(), merged); - } - blockTypeMap.put(blockType.getBlockId(), blockType); - } - - - public BlockType get(int blockId) - { - return blockTypeMap.get(blockId); - } - - - public Iterator iterator() - { - return blockTypeMap.keySet().iterator(); - } - - - public BlockType[] toArray() - { - return blockTypeMap.values().toArray(new BlockType[blockTypeMap.size()]); - } -} diff --git a/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java b/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java index 2eff0ad0..af4d9222 100644 --- a/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java +++ b/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java @@ -26,11 +26,12 @@ import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.module.BlockModule; -import com.extrahardmode.service.config.customtypes.BlockTypeList; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import java.util.List; + /** * Called to apply physics to a block and its neighbors if necessary. */ @@ -89,13 +90,13 @@ public void run() boolean fall = false; final boolean fallingBlocksEnabled = CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_ENABLE, block.getWorld().getName()); - final BlockTypeList fallingBlocks = CFG.getBlocktypeList(RootNode.MORE_FALLING_BLOCKS, block.getWorld().getName()); + final List fallingBlocks = CFG.getMaterialList(RootNode.MORE_FALLING_BLOCKS, block.getWorld().getName()); Material material = block.getType(); Block underBlock = block.getRelative(BlockFace.DOWN); if ((underBlock.getType() == Material.AIR || underBlock.isLiquid() || underBlock.getType() == Material.TORCH) - && (material == Material.SAND || material == Material.GRAVEL || fallingBlocks.contains(block) + && (material == Material.SAND || material == Material.GRAVEL || fallingBlocks.contains(block.getType()) && fallingBlocksEnabled && material != Material.AIR)) { module.applyPhysics(block, true); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f897c260..53b5df3a 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: ExtraHardMode main: com.extrahardmode.ExtraHardMode -version: ${project.version}-${git.commit.id.abbrev} +version: '${project.version}-${git.commit.id.abbrev}' description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ #project lead diff --git a/src/test/com/extrahardmode/service/BlockTypeTest.java b/src/test/com/extrahardmode/service/BlockTypeTest.java deleted file mode 100644 index 9738e620..00000000 --- a/src/test/com/extrahardmode/service/BlockTypeTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.extrahardmode.service; - - -import com.extrahardmode.service.config.customtypes.BlockType; -import org.bukkit.Material; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author Diemex - */ -public class BlockTypeTest -{ - @Test - public void matches_simple() - { - BlockType block = new BlockType(1); - assertTrue(block.matches(1, (byte) 0)); - } - - - @Test - public void matches_simple_false() - { - BlockType block = new BlockType(1); - assertFalse(block.matches(2, (byte) 0)); - } - - - @Test - public void matches_advanced() - { - BlockType block = new BlockType(3, (short) 1, (short) 3, (short) 4); - - assertTrue(block.matches(3, (short) 1)); - assertFalse(block.matches(3, (short) 2)); - assertTrue(block.matches(3, (short) 4)); - - assertFalse(block.matches(1, (short) 1)); - } - - - @Test - public void loadFromConfig_simple() - { - String input = "STONE"; - BlockType expected = new BlockType(Material.STONE); - assertEquals(expected, BlockType.loadFromConfig(input)); - } - - - @Test - public void loadFromConfig_fail() - { - String input = "Srtone"; - BlockType expected = new BlockType(-1); - assertEquals(expected, BlockType.loadFromConfig(input)); - } - - - @Test - public void loadFromConfig_meta_simple() - { - String input = "Stone,2"; - BlockType expected = new BlockType(Material.STONE, (short) 2); - assertEquals(expected, BlockType.loadFromConfig(input)); - } - - - @Test - public void loadFromConfig_meta_advanced() - { - String input = "Stone,2,3,4"; - BlockType expected = new BlockType(Material.STONE, (short) 2, (short) 3, (short) 4); - assertEquals(expected, BlockType.loadFromConfig(input)); - } - - - @Test - public void saveToConfig_simple() - { - String expected = "STONE@1,2,3"; - BlockType block = new BlockType(Material.STONE, (short) 1, (short) 2, (short) 3); - assertEquals(expected, block.saveToString()); - } -} From 37afd9b837f01deebabd4602a8473468b46d9596 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 24 Jun 2019 18:56:13 -0700 Subject: [PATCH 171/252] remove completely useless map in DebugMode --- .../com/extrahardmode/events/EhmHardenedStoneEvent.java | 8 ++++---- src/main/java/com/extrahardmode/features/DebugMode.java | 7 ------- src/main/resources/plugin.yml | 1 - 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java b/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java index 3bebe8da..85c3476a 100644 --- a/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java +++ b/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java @@ -92,13 +92,13 @@ public ItemStack getTool() /** - * Get the id + * Get the material * - * @return id of the Tool which broke the Stone + * @return material of the Tool which broke the Stone */ - public int getToolId() + public Material getToolId() { - return tool.getType().getId(); + return tool.getType(); } diff --git a/src/main/java/com/extrahardmode/features/DebugMode.java b/src/main/java/com/extrahardmode/features/DebugMode.java index 46eefac3..da07cc94 100644 --- a/src/main/java/com/extrahardmode/features/DebugMode.java +++ b/src/main/java/com/extrahardmode/features/DebugMode.java @@ -25,19 +25,12 @@ public class DebugMode extends ListenerModule private final String key_blockdata_msg = "key_blockdata_msg_"; - private final HashSet transparentBlocksIds; - public DebugMode(ExtraHardMode plugin) { super(plugin); dataStoreModule = plugin.getModuleForClass(DataStoreModule.class); msgModule = plugin.getModuleForClass(MsgModule.class); - transparentBlocksIds = new HashSet(); - for (Material material : Material.values()) - if (material.isTransparent() && material.getId() < Byte.MAX_VALUE) //They might add more blocks currently they are at 175 of 255 available slots - transparentBlocksIds.add((byte) material.getId()); - } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 53b5df3a..a17710ba 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,6 @@ main: com.extrahardmode.ExtraHardMode version: '${project.version}-${git.commit.id.abbrev}' description: Add new challenges to minecraft dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ -#project lead author: RoboMWM authors: [Diemex, Big_Scary] #ensure that we are loaded after multiworld plugins From 2c994655646420055b6f5f12ece355a03b17c8e4 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 24 Jun 2019 20:02:20 -0700 Subject: [PATCH 172/252] dev builds --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f259eee8..1c90fa4f 100644 --- a/README.md +++ b/README.md @@ -10,5 +10,5 @@ We use maven to handle our dependencies. * Install [Maven 3](http://maven.apache.org/download.html) * Check out this repo and: `mvn clean package` -All the required dependencies can be found in maven central. All other dependencies are in this [maven repo](http://di3mex.github.io/repo_bukkit/). -You can manually download the dependencies from there and add them to your classpath. +## Development builds +Use at your own risk. https://ci.appveyor.com/project/RoboMWM39862/extrahardmode/build/artifacts From 3fc941c54f460ec5d3ec85cd9ca57f0bd7de9fec Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 26 Jun 2019 22:30:41 -0700 Subject: [PATCH 173/252] Try just making this a list there's no need for this to be a material_list specifically(?) maybe closes #175 closes #176 --- src/main/java/com/extrahardmode/config/RootNode.java | 12 ++++++------ .../com/extrahardmode/service/config/ConfigNode.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index eef5cbff..c855e163 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -94,7 +94,7 @@ public enum RootNode implements ConfigNode */ SUPER_HARD_STONE("World Rules.Mining.Inhibit Tunneling.Enable", VarType.BOOLEAN, true, "If hardened blocks can only be broken by specific tools"), - SUPER_HARD_BLOCKS("World Rules.Mining.Inhibit Tunneling.Hardened Blocks", VarType.MATERIAL_LIST, new DefaultHardBlocks(), + SUPER_HARD_BLOCKS("World Rules.Mining.Inhibit Tunneling.Hardened Blocks", VarType.LIST, new DefaultHardBlocks(), "These blocks will be treated as hardened"), /** * If ore placement next to stone blocks should be blocked to prevent tunneling @@ -109,7 +109,7 @@ public enum RootNode implements ConfigNode /** * whether stone is hardened to encourage cave exploration over tunneling */ - SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine (Tool@Blocks)", VarType.MATERIAL_LIST, new DefaultToolDurabilities(), + SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine (Tool@Blocks)", VarType.LIST, new DefaultToolDurabilities(), "List of tools that can mine stone. If a tool isn't in the list it can't mine stone.", "F.e. DIAMOND_PICKAXE@100 = Mine 100 stone blocks -> pick broken"), /** @@ -126,7 +126,7 @@ public enum RootNode implements ConfigNode /** * These Blocks will turn surrounding stone into cobblestone */ - SUPER_HARD_STONE_ORE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Blocks (Block@id,id2)", VarType.MATERIAL_LIST, new DefaultPhysicsBlocks(), + SUPER_HARD_STONE_ORE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Blocks (Block@id,id2)", VarType.LIST, new DefaultPhysicsBlocks(), "Ore blocks that will soften surrounding stone blocks."), /** * Stone Blocks and their counter respective cobblestone blocks @@ -274,9 +274,9 @@ public enum RootNode implements ConfigNode /** * List of items that count as tools */ - PLAYER_DEATH_TOOLS_LIST("Player.Death.Loose Items On Death.Tools", VarType.MATERIAL_LIST, new DefaultValuableTools(), + PLAYER_DEATH_TOOLS_LIST("Player.Death.Loose Items On Death.Tools", VarType.LIST, new DefaultValuableTools(), "Tool settings apply only to these tools"), - PLAYER_DEATH_ITEMS_BLACKLIST("Player.Death.Loose Items On Death.Blacklisted Items", VarType.MATERIAL_LIST, new ArrayList(), + PLAYER_DEATH_ITEMS_BLACKLIST("Player.Death.Loose Items On Death.Blacklisted Items", VarType.LIST, new ArrayList(), "These items will never be removed on death."), /** * Enable custom Health @@ -885,7 +885,7 @@ public enum RootNode implements ConfigNode /** * which materials beyond sand and gravel should be subject to gravity */ - MORE_FALLING_BLOCKS("Additional Falling Blocks.Enabled Blocks", VarType.MATERIAL_LIST, new DefaultFallingBlocks()), + MORE_FALLING_BLOCKS("Additional Falling Blocks.Enabled Blocks", VarType.LIST, new DefaultFallingBlocks()), /** * ############################## diff --git a/src/main/java/com/extrahardmode/service/config/ConfigNode.java b/src/main/java/com/extrahardmode/service/config/ConfigNode.java index c245f69c..91cf9aa2 100644 --- a/src/main/java/com/extrahardmode/service/config/ConfigNode.java +++ b/src/main/java/com/extrahardmode/service/config/ConfigNode.java @@ -74,7 +74,7 @@ public enum VarType COLOR, POTION_EFFECT, MATERIAL, - MATERIAL_LIST, + @Deprecated MATERIAL_LIST, @Deprecated BLOCK_RELATION_LIST, COMMENT } From 009e5c752ad5ac5ac640eea0c17b990885c73340 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 5 Jul 2019 00:40:40 -0700 Subject: [PATCH 174/252] also check for just the normal List type. Should close #177 --- .../java/com/extrahardmode/service/config/MultiWorldConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java index 7bd749bd..c640c75c 100644 --- a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java +++ b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java @@ -454,6 +454,7 @@ public List getMaterialList(final ConfigNode node, final String world) switch (node.getVarType()) { case MATERIAL_LIST: + case LIST: { Object obj = null; if (OPTIONS.contains(world, node)) From 564b3acca0df2d3d8457a6425ad308c9577cdf4a Mon Sep 17 00:00:00 2001 From: Shane Bee Date: Sun, 7 Jul 2019 12:18:55 -0700 Subject: [PATCH 175/252] Campfires (#179) Adds the ability for campfires to be extinguished when it rains (similar to torches burning out) --- src/main/java/com/extrahardmode/config/RootNode.java | 12 ++++++++++++ .../java/com/extrahardmode/features/Torches.java | 3 ++- .../extrahardmode/task/RemoveExposedTorchesTask.java | 12 ++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index c855e163..93e802fb 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -155,6 +155,18 @@ public enum RootNode implements ConfigNode "When it rains there is a chance that torches will be removed in a chunk.", "Any kind of block above the torch is enough to protect the torch"), + /** + * ############# + * # CAMPFIRES # + * ############# + */ + /** + * whether rain should extinguish campfires + */ + RAIN_EXTINGUISHES_CAMPFIRES("World Rules.Campfires.Rain Extinguishes Campfires", VarType.BOOLEAN, true, + "When it rains there is a chance that campfires will be extinguished in a chunk.", + "Any kind of block above the campfire is enough to protect the campfire"), + /** * ########## * # SOUNDS # diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index b364db08..9dc994d1 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -159,11 +159,12 @@ public void onWeatherChange(WeatherChangeEvent event) plugin.debug(world, "WeatherChangeEvent called"); final boolean rainBreaksTorchesEnabled = CFG.getBoolean(RootNode.RAIN_BREAKS_TORCHES, world.getName()); + final boolean rainExtinguishesCampfiresEnabled = CFG.getBoolean(RootNode.RAIN_EXTINGUISHES_CAMPFIRES, world.getName()); final boolean snowBreaksCrops = CFG.getBoolean(RootNode.SNOW_BREAKS_CROPS, world.getName()); if (event.toWeatherState()) //is it raining { - if (rainBreaksTorchesEnabled || snowBreaksCrops) + if (rainBreaksTorchesEnabled || rainExtinguishesCampfiresEnabled || snowBreaksCrops) { plugin.debug(world, "WeatherChangeEvent says the sky is now falling and will proceed to massacre torches (and exposed crops in snow biomes)"); // plan to remove torches chunk by chunk gradually throughout the rainperiod diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index 117a45a7..b32bbb69 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -30,6 +30,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Campfire; import org.bukkit.block.data.type.Snow; /** @@ -89,6 +90,7 @@ public RemoveExposedTorchesTask(ExtraHardMode plugin, Chunk chunk, boolean force public void run() { final boolean rainBreaksTorches = CFG.getBoolean(RootNode.RAIN_BREAKS_TORCHES, this.chunk.getWorld().getName()); + final boolean rainExtinguishesCampfires = CFG.getBoolean(RootNode.RAIN_EXTINGUISHES_CAMPFIRES, this.chunk.getWorld().getName()); final boolean snowBreaksCrops = CFG.getBoolean(RootNode.WEAK_FOOD_CROPS, this.chunk.getWorld().getName()) && CFG.getBoolean(RootNode.SNOW_BREAKS_CROPS, this.chunk.getWorld().getName()); if (this.chunk.getWorld().hasStorm() || force) @@ -125,6 +127,16 @@ public void run() } break loopDown; } + case CAMPFIRE: + { + if (rainExtinguishesCampfires && temperature < 1.0) + { + Campfire campfire = (Campfire) block.getBlockData(); + campfire.setLit(false); + block.setBlockData(campfire); + } + break loopDown; + } case WHEAT_SEEDS: //TODO: 1.13: need to confirm if = CROPS and below case MELON_STEM: case MELON: From e859c88c5b1103c4ca425253fccf87a9a1b67e7e Mon Sep 17 00:00:00 2001 From: Shane Bee Date: Sun, 7 Jul 2019 12:27:52 -0700 Subject: [PATCH 176/252] Update 1.13 farm blocks (#181) --- .../com/extrahardmode/task/RemoveExposedTorchesTask.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java index b32bbb69..c15f9427 100644 --- a/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java +++ b/src/main/java/com/extrahardmode/task/RemoveExposedTorchesTask.java @@ -139,15 +139,17 @@ public void run() } case WHEAT_SEEDS: //TODO: 1.13: need to confirm if = CROPS and below case MELON_STEM: + case ATTACHED_MELON_STEM: case MELON: - case CARROT: + case CARROTS: case PUMPKIN_STEM: - case POTATO: + case ATTACHED_PUMPKIN_STEM: + case PUMPKIN: //I followed suit with the melon and added pumpkin + case POTATOES: case ROSE_BUSH: //RED_ROSE //ROSE_RED case DANDELION: //YELLOW FLOWER case GRASS: //I still can't recall if the replacement for LONG_GRASS is GRASS or TALL_GRASS... case TALL_GRASS: - case BEETROOT_SEEDS: //BEETROOT_BLOCK case BEETROOTS: { if (snowBreaksCrops && temperature <= 0.15) //cold biomes in which snow falls From 11d7a4c509482bc2cacedee37539c90a4196df4f Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 20 Jul 2019 23:18:05 -0700 Subject: [PATCH 177/252] rain extinguishing campfires defaults to off --- src/main/java/com/extrahardmode/config/RootNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 93e802fb..fd727667 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -163,7 +163,7 @@ public enum RootNode implements ConfigNode /** * whether rain should extinguish campfires */ - RAIN_EXTINGUISHES_CAMPFIRES("World Rules.Campfires.Rain Extinguishes Campfires", VarType.BOOLEAN, true, + RAIN_EXTINGUISHES_CAMPFIRES("World Rules.Campfires.Rain Extinguishes Campfires", VarType.BOOLEAN, false, "When it rains there is a chance that campfires will be extinguished in a chunk.", "Any kind of block above the campfire is enough to protect the campfire"), From 4f0ffa16ca1743d024bfaff06d194ff9ce32a10a Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 20 Jul 2019 23:34:13 -0700 Subject: [PATCH 178/252] remove unused MATERIAL_LIST parser --- .../com/extrahardmode/config/EHMConfig.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/EHMConfig.java b/src/main/java/com/extrahardmode/config/EHMConfig.java index 409b5d17..62fa1130 100644 --- a/src/main/java/com/extrahardmode/config/EHMConfig.java +++ b/src/main/java/com/extrahardmode/config/EHMConfig.java @@ -479,23 +479,6 @@ public void loadNodes() obj = Material.matchMaterial(mConfig.getString(node.getPath())); break; } - case MATERIAL_LIST: - { - List materialList = new ArrayList<>(); - if (mConfig.get(node.getPath()) instanceof List) - { - List list = mConfig.getStringList(node.getPath()); - for (String str : list) - { - Material material = Material.matchMaterial(str); - if (material != null) - materialList.add(material); - } - obj = materialList; - } else if (mConfig.isSet(node.getPath())) - obj = materialList; //obj = BlockTypeList.EMPTY_LIST; //No idea why this is empty but ok? - break; - } case BLOCK_RELATION_LIST: { if (mConfig.get(node.getPath()) instanceof List) From 58abafb3f71205a103f08560f76ff8598b0eea01 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 20 Jul 2019 23:40:12 -0700 Subject: [PATCH 179/252] Construct string lists, not Material Lists Should fix #182 --- .../com/extrahardmode/config/RootNode.java | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index fd727667..8d031146 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -1386,11 +1386,6 @@ public Object getValueToDisable() obj = Collections.emptyList(); break; } - case MATERIAL_LIST: - { - obj = new ArrayList(); - break; - } case BLOCK_RELATION_LIST: { obj = BlockRelationsList.EMPTY_LIST; @@ -1447,7 +1442,7 @@ public Object get() /** * Default list of falling blocks. */ - private static class DefaultFallingBlocks extends ArrayList + private static class DefaultFallingBlocks extends ArrayList { /** * Constructor. @@ -1455,13 +1450,13 @@ private static class DefaultFallingBlocks extends ArrayList public DefaultFallingBlocks() { super(); - this.add(Material.DIRT); - this.add(Material.GRASS); - this.add(Material.COBBLESTONE); - this.add(Material.MOSSY_COBBLESTONE); - this.add(Material.STONE_SLAB); - this.add(Material.COBBLESTONE_SLAB); - this.add(Material.MYCELIUM); + this.add(Material.DIRT.name()); + this.add(Material.GRASS.name()); + this.add(Material.COBBLESTONE.name()); + this.add(Material.MOSSY_COBBLESTONE.name()); + this.add(Material.STONE_SLAB.name()); + this.add(Material.COBBLESTONE_SLAB.name()); + this.add(Material.MYCELIUM.name()); } } @@ -1469,7 +1464,7 @@ public DefaultFallingBlocks() /** * Default list of falling blocks. */ - private static class DefaultPhysicsBlocks extends ArrayList + private static class DefaultPhysicsBlocks extends ArrayList { /** * Constructor. @@ -1477,13 +1472,13 @@ private static class DefaultPhysicsBlocks extends ArrayList public DefaultPhysicsBlocks() { super(); - this.add(Material.COAL_ORE); - this.add(Material.IRON_ORE); - this.add(Material.GOLD_ORE); - this.add(Material.LAPIS_ORE); - this.add(Material.REDSTONE_ORE); - this.add(Material.EMERALD_ORE); - this.add(Material.DIAMOND_ORE); + this.add(Material.COAL_ORE.name()); + this.add(Material.IRON_ORE.name()); + this.add(Material.GOLD_ORE.name()); + this.add(Material.LAPIS_ORE.name()); + this.add(Material.REDSTONE_ORE.name()); + this.add(Material.EMERALD_ORE.name()); + this.add(Material.DIAMOND_ORE.name()); } } @@ -1492,7 +1487,7 @@ public DefaultPhysicsBlocks() /** * Default list of tool durabilities */ - private static class DefaultToolDurabilities extends ArrayList + private static class DefaultToolDurabilities extends ArrayList { /** * Constructor. @@ -1502,8 +1497,8 @@ public DefaultToolDurabilities() super(); //this.add(new BlockType(Material.IRON_PICKAXE, (short) 32)); //this.add(new BlockType(Material.DIAMOND_PICKAXE, (short) 64)); - this.add(Material.IRON_PICKAXE); - this.add(Material.DIAMOND_PICKAXE); + this.add(Material.IRON_PICKAXE.name()); + this.add(Material.DIAMOND_PICKAXE.name()); } } @@ -1524,26 +1519,26 @@ public DefaultStoneBlocks() } - private static class DefaultValuableTools extends ArrayList + private static class DefaultValuableTools extends ArrayList { public DefaultValuableTools() { super(); - this.add(Material.DIAMOND_AXE); - this.add(Material.DIAMOND_SWORD); - this.add(Material.DIAMOND_PICKAXE); - this.add(Material.DIAMOND_SHOVEL); + this.add(Material.DIAMOND_AXE.name()); + this.add(Material.DIAMOND_SWORD.name()); + this.add(Material.DIAMOND_PICKAXE.name()); + this.add(Material.DIAMOND_SHOVEL.name()); } } - private static class DefaultHardBlocks extends ArrayList + private static class DefaultHardBlocks extends ArrayList { public DefaultHardBlocks() { super(); - this.add(Material.STONE); + this.add(Material.STONE.name()); } } From cb1b0678eb9c9ba56161c0fd56c19257538ba3bb Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 20 Jul 2019 23:41:04 -0700 Subject: [PATCH 180/252] remove another unused MATERIAL_LIST parser --- src/main/java/com/extrahardmode/config/EHMConfig.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/EHMConfig.java b/src/main/java/com/extrahardmode/config/EHMConfig.java index 62fa1130..86e9b39d 100644 --- a/src/main/java/com/extrahardmode/config/EHMConfig.java +++ b/src/main/java/com/extrahardmode/config/EHMConfig.java @@ -558,17 +558,6 @@ private void saveNodes() break; } } - case MATERIAL_LIST: - { - if (value instanceof ArrayList) - { - List materialStrings = new ArrayList<>(); - for (Material material : (ArrayList)value) - materialStrings.add(material.name()); - outConfig.set(node.getPath(), materialStrings); - break; - } - } case BLOCK_RELATION_LIST: { if (value instanceof BlockRelationsList) From e91eb377923b0ee47f5282c06898565a8d4a8f80 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 21 Jul 2019 00:01:38 -0700 Subject: [PATCH 181/252] refactor getMaterialList to getStringListAsMaterialList and also make it actually convert a string list to a material list should fix some of https://github.com/MLG-Fortress/ExtraHardMode/issues/182#issuecomment-509928344 --- .../extrahardmode/features/HardenedStone.java | 8 +++---- .../com/extrahardmode/features/Players.java | 4 ++-- .../service/config/MultiWorldConfig.java | 21 ++++++++++++++----- .../task/BlockPhysicsCheckTask.java | 2 +- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/HardenedStone.java b/src/main/java/com/extrahardmode/features/HardenedStone.java index a5fa065f..fd4c14be 100644 --- a/src/main/java/com/extrahardmode/features/HardenedStone.java +++ b/src/main/java/com/extrahardmode/features/HardenedStone.java @@ -97,7 +97,7 @@ public void onBlockBreak(BlockBreakEvent event) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.HARDENEDSTONE); // final BlockTypeList tools = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_TOOLS, world.getName()); - final List physicsBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List physicsBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); // final BlockTypeList hardBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_BLOCKS, world.getName()); @@ -165,7 +165,7 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.HARDENEDSTONE); final boolean hardstoneEnabled = CFG.getBoolean(RootNode.SUPER_HARD_STONE, world.getName()); final boolean blockOrePlacement = CFG.getBoolean(RootNode.SUPER_HARD_STONE_BLOCK_ORE_PLACEMENT, world.getName()); - final List oreBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List oreBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); if (hardstoneEnabled && blockOrePlacement && !playerBypasses && oreBlocks.contains(block.getType())) @@ -201,7 +201,7 @@ public void onBlockPistonExtend(BlockPistonExtendEvent event) final boolean superHardStone = CFG.getBoolean(RootNode.SUPER_HARD_STONE, world.getName()); final boolean blockPistons = CFG.getBoolean(RootNode.SUPER_HARD_STONE_BLOCK_PISTONS, world.getName()); - final List oreBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List oreBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); if (superHardStone && blockPistons) @@ -234,7 +234,7 @@ public void onBlockPistonRetract(BlockPistonRetractEvent event) final boolean superHardStone = CFG.getBoolean(RootNode.SUPER_HARD_STONE, world.getName()); final boolean blockPistons = CFG.getBoolean(RootNode.SUPER_HARD_STONE_BLOCK_PISTONS, world.getName()); - final List oreBlocks = CFG.getMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); + final List oreBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); // only sticky pistons can pull back blocks diff --git a/src/main/java/com/extrahardmode/features/Players.java b/src/main/java/com/extrahardmode/features/Players.java index fbde4000..10446970 100644 --- a/src/main/java/com/extrahardmode/features/Players.java +++ b/src/main/java/com/extrahardmode/features/Players.java @@ -172,8 +172,8 @@ public void onEntityDeath(PlayerDeathEvent event) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.DEATH_INV_LOSS); final int toolDmgPercent = CFG.getInt(RootNode.PLAYER_DEATH_TOOLS_DMG_PERCENTAGE, world.getName()); - final List blacklisted = CFG.getMaterialList(RootNode.PLAYER_DEATH_ITEMS_BLACKLIST, world.getName()); - final List toolIds = CFG.getMaterialList(RootNode.PLAYER_DEATH_TOOLS_LIST, world.getName()); + final List blacklisted = CFG.getStringListAsMaterialList(RootNode.PLAYER_DEATH_ITEMS_BLACKLIST, world.getName()); + final List toolIds = CFG.getStringListAsMaterialList(RootNode.PLAYER_DEATH_TOOLS_LIST, world.getName()); final boolean destroyTools = CFG.getBoolean(RootNode.PLAYER_DEATH_TOOLS_KEEP_DAMAGED, world.getName()); // FEATURE: some portion of player inventory is permanently lost on death diff --git a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java index c640c75c..50fbdd60 100644 --- a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java +++ b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java @@ -447,13 +447,12 @@ else if (enabledForAll) @Deprecated - public List getMaterialList(final ConfigNode node, final String world) + public List getStringListAsMaterialList(final ConfigNode node, final String world) { - List blockList; + List blockList = new ArrayList<>(); switch (node.getVarType()) { - case MATERIAL_LIST: case LIST: { Object obj = null; @@ -461,12 +460,24 @@ public List getMaterialList(final ConfigNode node, final String world) obj = OPTIONS.get(world, node); else if (enabledForAll) obj = OPTIONS.get(ALL_WORLDS, node); - blockList = obj instanceof List? (List) obj : (List) node.getValueToDisable(); + if (!(obj instanceof List)) + break; + for (String materialName : (List) obj) + { + Material material = Material.matchMaterial(materialName); + if (material == null) + { + plugin.getLogger().warning(materialName + " is not a valid material. Please fix or remove from config.yml " + node.getPath()); + continue; + } + blockList.add(material); + } + break; } default: { - throw new IllegalArgumentException("Attempted to get " + node.toString() + " of type " + node.getVarType() + " as a List."); + throw new IllegalArgumentException("Attempted to get " + node.toString() + " of type " + node.getVarType() + " converted to a List."); } } return blockList; diff --git a/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java b/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java index af4d9222..bf0ba1e6 100644 --- a/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java +++ b/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java @@ -90,7 +90,7 @@ public void run() boolean fall = false; final boolean fallingBlocksEnabled = CFG.getBoolean(RootNode.MORE_FALLING_BLOCKS_ENABLE, block.getWorld().getName()); - final List fallingBlocks = CFG.getMaterialList(RootNode.MORE_FALLING_BLOCKS, block.getWorld().getName()); + final List fallingBlocks = CFG.getStringListAsMaterialList(RootNode.MORE_FALLING_BLOCKS, block.getWorld().getName()); Material material = block.getType(); Block underBlock = block.getRelative(BlockFace.DOWN); From af17eb6abd41da3374781b328681b5d78b5030df Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 3 Aug 2019 23:34:16 -0700 Subject: [PATCH 182/252] restore Mining.Inhibit Tunneling feature --- pom.xml | 11 ++- .../com/extrahardmode/config/RootNode.java | 5 +- .../events/EhmHardenedStoneEvent.java | 6 +- .../extrahardmode/features/HardenedStone.java | 98 ++++++++++++------- .../extrahardmode/module/UtilityModule.java | 2 +- .../service/config/MultiWorldConfig.java | 10 +- 6 files changed, 82 insertions(+), 50 deletions(-) diff --git a/pom.xml b/pom.xml index f5900b81..1df4de8b 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.14.2 + 1.14.4 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ @@ -316,15 +316,20 @@ bigscary - https://github.com/ryanhamshire + https://github.com/bigscary - + Diemex di.em.ex@gmx.de https://github.com/Di3mex GMT + + + RoboMWM + https://github.com/RoboMWM + Mitsugaru diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 8d031146..9faba453 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -1483,7 +1483,6 @@ public DefaultPhysicsBlocks() } - //TODO: fix, somehow /** * Default list of tool durabilities */ @@ -1497,8 +1496,8 @@ public DefaultToolDurabilities() super(); //this.add(new BlockType(Material.IRON_PICKAXE, (short) 32)); //this.add(new BlockType(Material.DIAMOND_PICKAXE, (short) 64)); - this.add(Material.IRON_PICKAXE.name()); - this.add(Material.DIAMOND_PICKAXE.name()); + this.add(Material.IRON_PICKAXE.name() + "@32"); + this.add(Material.DIAMOND_PICKAXE.name() + "@64"); } } diff --git a/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java b/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java index 85c3476a..2b9713ba 100644 --- a/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java +++ b/src/main/java/com/extrahardmode/events/EhmHardenedStoneEvent.java @@ -52,7 +52,7 @@ public class EhmHardenedStoneEvent extends Event /** * The amount of blocks this tool can mine */ - private short numOfBlocks; + private int numOfBlocks; /** @@ -61,7 +61,7 @@ public class EhmHardenedStoneEvent extends Event * @param tool the tool which broke the Stone * @param numOfBlocks amount of blocks tool can mine */ - public EhmHardenedStoneEvent(Player player, ItemStack tool, short numOfBlocks) + public EhmHardenedStoneEvent(Player player, ItemStack tool, int numOfBlocks) { this.player = player; this.tool = tool; @@ -128,7 +128,7 @@ public void setNumOfBlocks(short blocks) *

* Will be 0 if the tool isn't able to break stone by default. */ - public short getNumOfBlocks() + public int getNumOfBlocks() { return numOfBlocks; } diff --git a/src/main/java/com/extrahardmode/features/HardenedStone.java b/src/main/java/com/extrahardmode/features/HardenedStone.java index fd4c14be..5a573df2 100644 --- a/src/main/java/com/extrahardmode/features/HardenedStone.java +++ b/src/main/java/com/extrahardmode/features/HardenedStone.java @@ -26,11 +26,14 @@ import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.config.messages.MessageNode; +import com.extrahardmode.events.EhmHardenedStoneEvent; import com.extrahardmode.module.BlockModule; import com.extrahardmode.module.MsgModule; import com.extrahardmode.module.PlayerModule; +import com.extrahardmode.module.UtilityModule; import com.extrahardmode.service.Feature; import com.extrahardmode.service.ListenerModule; +import com.extrahardmode.service.PermissionNode; import com.extrahardmode.service.config.customtypes.BlockRelationsList; import org.bukkit.Material; import org.bukkit.World; @@ -43,13 +46,15 @@ import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Hardened Stone is there to make branchmining harder/impossible - *

* Only Iron/Diamond Picks can break stone , Tools break faster when breaking stone , Breaking ore causes surounding * stone to fall , Various Fixes to prevent working around the hardened stone */ @@ -96,44 +101,67 @@ public void onBlockBreak(BlockBreakEvent event) final boolean applyPhysics = CFG.getBoolean(RootNode.SUPER_HARD_STONE_PHYSICS_APPLY, world.getName()); final boolean playerBypasses = playerModule.playerBypasses(player, Feature.HARDENEDSTONE); -// final BlockTypeList tools = CFG.getBlocktypeList(RootNode.SUPER_HARD_STONE_TOOLS, world.getName()); + final List tools = CFG.getStringList(RootNode.SUPER_HARD_STONE_TOOLS, world.getName()); final List physicsBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_STONE_ORE_BLOCKS, world.getName()); final BlockRelationsList stoneBlocks = CFG.getBlockRelationList(RootNode.SUPER_HARD_STONE_STONE_BLOCKS, world.getName()); -// final BlockTypeList hardBlocks = CFG.getBlocktypeList(RootNode.SUPER_HARD_BLOCKS, world.getName()); + final List hardBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_BLOCKS, world.getName()); + + final Map toolDurabilityMap = new HashMap<>(); + + try + { + for (String tool : tools) + { + String[] parsedTool = tool.split("@"); + Material material = Material.matchMaterial(parsedTool[0]); + if (material == null) + { + plugin.getLogger().warning("Material " + material + " does not exist. Please remove this entry from Mining.Inhibit Tunneling."); + continue; + } + int durability = Integer.parseInt(parsedTool[1]); + toolDurabilityMap.put(material, durability); + } + } + catch (Throwable rock) + { + plugin.getLogger().severe("Mining.Inhibit Tunneling config node is not properly formatted. Should be MATERIAL@durability in blocks e.g. IRON_PICKAXE@32 for each entry."); + return; + } // FEATURE: stone breaks tools much quicker -// if (hardStoneEnabled && hardBlocks.contains(block) && !playerBypasses) -// { -// ItemStack inHandStack = player.getItemInHand(); -// -// if (inHandStack != null) -// { -// int toolId = inHandStack.getType().getId(); -// short blocks = 0; -// BlockType toolSettings = tools.get(toolId); -// if (toolSettings != null && toolSettings.getAllMeta().size() > 0) -// blocks = toolSettings.getMeta(); -// EhmHardenedStoneEvent hardEvent = new EhmHardenedStoneEvent(player, inHandStack, blocks); -// -// if (toolSettings != null) -// { -// /* Broadcast an Event for other Plugins to change if the tool can break stone and the amount of blocks */ -// plugin.getServer().getPluginManager().callEvent(hardEvent); -// -// // otherwise, drastically reduce tool durability when breaking stone -// if (hardEvent.getNumOfBlocks() > 0) -// { -// player.setItemInHand(UtilityModule.damage(hardEvent.getTool(), hardEvent.getNumOfBlocks())); -// } -// } -// if (hardEvent.getNumOfBlocks() == 0) -// { -// messenger.send(player, MessageNode.STONE_MINING_HELP, PermissionNode.SILENT_STONE_MINING_HELP); -// event.setCancelled(true); -// return; -// } -// } -// } + if (hardStoneEnabled && hardBlocks.contains(block) && !playerBypasses) + { + ItemStack inHandStack = player.getInventory().getItemInMainHand(); + + if (inHandStack.getType() != Material.AIR) + { + Material tool = inHandStack.getType(); + int blocks = 0; + Integer toolSettings = toolDurabilityMap.get(tool); + if (toolSettings != null) + blocks = toolSettings; + EhmHardenedStoneEvent hardEvent = new EhmHardenedStoneEvent(player, inHandStack, blocks); + + if (toolSettings != null) + { + /* Broadcast an Event for other Plugins to change if the tool can break stone and the amount of blocks */ + plugin.getServer().getPluginManager().callEvent(hardEvent); + + // otherwise, drastically reduce tool durability when breaking stone + if (hardEvent.getNumOfBlocks() > 0) + { + player.setItemInHand(UtilityModule.damage(hardEvent.getTool(), hardEvent.getNumOfBlocks())); + } + } + if (hardEvent.getNumOfBlocks() == 0) + { + messenger.send(player, MessageNode.STONE_MINING_HELP, PermissionNode.SILENT_STONE_MINING_HELP); + event.setCancelled(true); + return; + } + } + } // when ore is broken, it softens adjacent stone important to ensure players can reach the ore they break if (hardStonePhysix && physicsBlocks.contains(block.getType())) diff --git a/src/main/java/com/extrahardmode/module/UtilityModule.java b/src/main/java/com/extrahardmode/module/UtilityModule.java index 3a878531..ccdf962a 100644 --- a/src/main/java/com/extrahardmode/module/UtilityModule.java +++ b/src/main/java/com/extrahardmode/module/UtilityModule.java @@ -91,7 +91,7 @@ public void fireWorkRandomColors(FireworkEffect.Type type, Location location) * * @return the damaged Item, can be completely broken */ - public static ItemStack damage(ItemStack item, short blocks) + public static ItemStack damage(ItemStack item, int blocks) { short maxDurability = item.getType().getMaxDurability(); Validate.isTrue(maxDurability > 1, "This item is not damageable"); diff --git a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java index 50fbdd60..4fb62516 100644 --- a/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java +++ b/src/main/java/com/extrahardmode/service/config/MultiWorldConfig.java @@ -397,9 +397,9 @@ else if (enabledForAll) * * @return Value of the node. Returns an empty list if unknown. */ - public List getStringList(final ConfigNode node, final String world) + public List getStringList(final ConfigNode node, final String world) { - List list = new ArrayList(); + List list; switch (node.getVarType()) { case LIST: @@ -409,12 +409,12 @@ public List getStringList(final ConfigNode node, final String world) obj = OPTIONS.get(world, node); else if (enabledForAll) obj = OPTIONS.get(ALL_WORLDS, node); - list = obj instanceof List ? (List) obj : (List) node.getValueToDisable(); + list = obj instanceof List ? (List) obj : (List) node.getValueToDisable(); break; } default: { - throw new IllegalArgumentException("Attempted to get " + node.toString() + " of type " + node.getVarType() + " as a List."); + throw new IllegalArgumentException("Attempted to get " + node.toString() + " of type " + node.getVarType() + " as a List."); } } return list; @@ -446,7 +446,7 @@ else if (enabledForAll) } - @Deprecated + @Deprecated //Should encourage use of getStringList, since this is performing an unchecked cast? public List getStringListAsMaterialList(final ConfigNode node, final String world) { List blockList = new ArrayList<>(); From a250747343481b141b19b9b8540fb775ca5476bf Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 3 Aug 2019 23:35:57 -0700 Subject: [PATCH 183/252] Create FUNDING.yml --- .github/FUNDING.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..fb6f53cc --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: RoboMWM +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 8e72ff121b6b841e699b50c5473a83146d65daa7 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 3 Aug 2019 23:41:51 -0700 Subject: [PATCH 184/252] promote to beta --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1df4de8b..40dc4f61 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.14.alpha + 3.14.beta ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From 11d3614fcfd96e0f1594de2eae68bcdcb40f70ec Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 4 Aug 2019 00:14:22 -0700 Subject: [PATCH 185/252] Remove examples in config keys Since these need to be updated to use Material names anyways, there's really no need to convert old config values to this one. --- .../java/com/extrahardmode/config/RootNode.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 9faba453..fceb4e07 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -54,7 +54,7 @@ public enum RootNode implements ConfigNode * list of worlds where extra hard mode rules apply */ WORLDS("Enabled Worlds", VarType.LIST, new DefaultWorlds(), - "Set the worlds you want ehm active here. F.e. [world, world_nether]. \"@all\" enables ehm for all worlds"), + "Set the worlds you want ehm active here. E.g. [world, world_nether]. \"@all\" enables ehm for all worlds"), /** * Whether debug messages should be printed to console */ @@ -109,9 +109,9 @@ public enum RootNode implements ConfigNode /** * whether stone is hardened to encourage cave exploration over tunneling */ - SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine (Tool@Blocks)", VarType.LIST, new DefaultToolDurabilities(), + SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine", VarType.LIST, new DefaultToolDurabilities(), "List of tools that can mine stone. If a tool isn't in the list it can't mine stone.", - "F.e. DIAMOND_PICKAXE@100 = Mine 100 stone blocks -> pick broken"), + "E.g. DIAMOND_PICKAXE@100 = Mine 100 stone blocks -> pick broken"), /** * Breaking an ore will cause surrounding stone to turn to cobble and fall */ @@ -126,13 +126,13 @@ public enum RootNode implements ConfigNode /** * These Blocks will turn surrounding stone into cobblestone */ - SUPER_HARD_STONE_ORE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Blocks (Block@id,id2)", VarType.LIST, new DefaultPhysicsBlocks(), + SUPER_HARD_STONE_ORE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Blocks", VarType.LIST, new DefaultPhysicsBlocks(), "Ore blocks that will soften surrounding stone blocks."), /** * Stone Blocks and their counter respective cobblestone blocks */ - SUPER_HARD_STONE_STONE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Stone Blocks (Stone@data-Cobble@data)", VarType.BLOCK_RELATION_LIST, new DefaultStoneBlocks(), - "Here you can specify custom stone blocks or change what stone softens into."), + SUPER_HARD_STONE_STONE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Stone Blocks", VarType.BLOCK_RELATION_LIST, new DefaultStoneBlocks(), + "Here you can specify custom stone blocks or change what stone softens into. (Stone@data-Cobble@data)"), /** * ########### * # TORCHES # @@ -393,7 +393,7 @@ public enum RootNode implements ConfigNode INHIBIT_MONSTER_GRINDERS("General Monster Rules.Inhibit Monster Grinders", VarType.BOOLEAN, true, "This is an advanced anti monster grinder module. It will block drops if the monster", "spawned on an unnatural block, took too much damage from natural causes (falldmg etc.)", - "cant reach a player or can not easily reach a player f.e. monster is in water."), + "cant reach a player or can not easily reach a player e.g. monster is in water."), /** * max y value for extra monster spawns */ @@ -463,7 +463,7 @@ public enum RootNode implements ConfigNode "What percentage of the placed skulls should drop as an item, when broken before the zombie respawns."), ZOMBIES_REANIMATE_PERCENT("Zombies.Reanimate.Percent", VarType.INTEGER, SubType.PERCENTAGE, 50, "Percentage for the 1st respawn to occur. To reduce the amount of consecutive respawns the percentage reduced by 1/n respawns.", - "F.e 1: 50%, 2: 1/2 of 50% = 25%, 3: 1/3 of 25% = 7.5% and so on"), + "E.g. 1: 50%, 2: 1/2 of 50% = 25%, 3: 1/3 of 25% = 7.5% and so on"), /** * ############# From 97f5a4fe157f533390c0497fece8540f43274bbe Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 4 Aug 2019 00:14:41 -0700 Subject: [PATCH 186/252] Use semver formatting for version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 40dc4f61..9b2f6fd2 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.14.beta + 3.14.0-beta ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From d07d609bd15e1d987d24de1190696e89159d2868 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 4 Aug 2019 13:07:49 -0700 Subject: [PATCH 187/252] check list for material type, not block object Should fix #185 --- src/main/java/com/extrahardmode/features/HardenedStone.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/HardenedStone.java b/src/main/java/com/extrahardmode/features/HardenedStone.java index 5a573df2..306ac71e 100644 --- a/src/main/java/com/extrahardmode/features/HardenedStone.java +++ b/src/main/java/com/extrahardmode/features/HardenedStone.java @@ -89,7 +89,7 @@ public void starting() /** * When a player breaks stone */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); @@ -130,7 +130,7 @@ public void onBlockBreak(BlockBreakEvent event) } // FEATURE: stone breaks tools much quicker - if (hardStoneEnabled && hardBlocks.contains(block) && !playerBypasses) + if (hardStoneEnabled && hardBlocks.contains(block.getType()) && !playerBypasses) { ItemStack inHandStack = player.getInventory().getItemInMainHand(); From 489dcf0a49fcfbae643d0a13e1f919e06638ab07 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Aug 2019 13:15:39 -0700 Subject: [PATCH 188/252] version 3.14.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b2f6fd2..22e16816 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.14.0-beta + 3.14.0 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From 6edec4708d5cba033437b4b6f7507e48df66b085 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Aug 2019 13:35:20 -0700 Subject: [PATCH 189/252] add another debug message to obtain info for #110 --- src/main/java/com/extrahardmode/features/Torches.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index 9dc994d1..2b1f41d6 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -156,7 +156,7 @@ public void onWeatherChange(WeatherChangeEvent event) { World world = event.getWorld(); - plugin.debug(world, "WeatherChangeEvent called"); + plugin.debug(world, "WeatherChangeEvent called. toWeatherState: " + event.toWeatherState()); final boolean rainBreaksTorchesEnabled = CFG.getBoolean(RootNode.RAIN_BREAKS_TORCHES, world.getName()); final boolean rainExtinguishesCampfiresEnabled = CFG.getBoolean(RootNode.RAIN_EXTINGUISHES_CAMPFIRES, world.getName()); @@ -171,14 +171,16 @@ public void onWeatherChange(WeatherChangeEvent event) Chunk[] chunks = world.getLoadedChunks(); if (chunks.length > 0) { + int i; int startOffset = plugin.getRandom().nextInt(chunks.length); - for (int i = 0; i < chunks.length; i++) + for (i = 0; i < chunks.length; i++) { Chunk chunk = chunks[(startOffset + i) % chunks.length]; RemoveExposedTorchesTask task = new RemoveExposedTorchesTask(plugin, chunk); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, i * 100L); } + plugin.debug(world, "Scheduled " + i + " tasks."); } } } From 3b6a889033dbee097fc220616c75165606a94b61 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Aug 2019 19:32:49 -0700 Subject: [PATCH 190/252] remove unused paper maven repo Paper is fully supported, it's just not exclusively used as a dependency here. --- pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pom.xml b/pom.xml index 22e16816..315b925a 100644 --- a/pom.xml +++ b/pom.xml @@ -185,11 +185,6 @@ spigot-repo http://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - destroystokyo-repo - https://repo.destroystokyo.com/repository/maven-public/ - sk89q-repo From ec11593b21519a71d659c4aebd38e303563d58e5 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Aug 2019 22:28:32 -0700 Subject: [PATCH 191/252] have loadWorlds read the value from its internal node-value map Fixes #186 Debugging for this issue can be found in branch debug/186 --- src/main/java/com/extrahardmode/config/EHMConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/EHMConfig.java b/src/main/java/com/extrahardmode/config/EHMConfig.java index 86e9b39d..1c6232a9 100644 --- a/src/main/java/com/extrahardmode/config/EHMConfig.java +++ b/src/main/java/com/extrahardmode/config/EHMConfig.java @@ -185,10 +185,10 @@ public void load() if (mConfigNodes.isEmpty()) throw new IllegalStateException("You forgot to add nodes to " + mConfigFile.getName()); loadMode(); - loadWorlds(); loadCommentOptions(); loadNodes(); validateNodes(); + loadWorlds(); } @@ -409,7 +409,7 @@ public void loadMode() */ public void loadWorlds() { - mWorlds.addAll(mConfig.getStringList(mWorldsNode.getPath())); + mWorlds.addAll((List)mLoadedNodes.get(RootNode.WORLDS)); //Check for all worlds placeholder = Enables plugin for all worlds for (String world : mWorlds) From e490375b14546482b6121915098ecf1faaa3b5ed Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 11 Aug 2019 10:59:46 -0700 Subject: [PATCH 192/252] add NETHER_BRICKS to natural spawns for the nether If only there were descriptions for some of these enums... Closes #187 --- .../com/extrahardmode/module/BlockModule.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 64e8d0c0..64010ce1 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -432,11 +432,18 @@ public boolean isNaturalSpawnMaterial(Material material) /** Is this a natural block for netherspawning? */ public boolean isNaturalNetherSpawn(Material material) { - return material == Material.NETHERRACK - || material == Material.NETHER_BRICK - || material == Material.SOUL_SAND - || material == Material.GRAVEL - || material == Material.AIR; + switch (material) + { + case NETHERRACK: + case NETHER_BRICK: //I'm guessing this is the nether brick item, not the block. If so, this should be removed. + case NETHER_BRICKS: + case NETHER_BRICK_SLAB: + case SOUL_SAND: + case GRAVEL: + case AIR: + return true; + } + return false; } From 45647e84552a7c29dd8152373f1f902b330da7f1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2019 04:16:50 +0000 Subject: [PATCH 193/252] Bump git-commit-id-plugin from 3.0.0 to 3.0.1 Bumps [git-commit-id-plugin](https://github.com/git-commit-id/maven-git-commit-id-plugin) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/git-commit-id/maven-git-commit-id-plugin/releases) - [Commits](https://github.com/git-commit-id/maven-git-commit-id-plugin/compare/v3.0.0...v3.0.1) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 315b925a..5a8b4e04 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 3.0.0 + 3.0.1 get-the-git-infos From c4a52634141bc7f1977e985b2b7e95c3055232d9 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 8 Sep 2019 17:11:52 -0700 Subject: [PATCH 194/252] use namespacedkey for tnt recipe so we can use the non-deprecated constructor and fix #189 --- src/main/java/com/extrahardmode/features/MoreTnt.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/MoreTnt.java b/src/main/java/com/extrahardmode/features/MoreTnt.java index 937170a9..8c217a40 100644 --- a/src/main/java/com/extrahardmode/features/MoreTnt.java +++ b/src/main/java/com/extrahardmode/features/MoreTnt.java @@ -10,6 +10,7 @@ import com.extrahardmode.service.ListenerModule; import org.apache.commons.lang.Validate; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -74,7 +75,7 @@ public void beforeCraft(PrepareItemCraftEvent event) CraftingInventory craftInv = event.getInventory(); //The vanilla tnt recipe - ShapedRecipe vanillaTnt = new ShapedRecipe(new ItemStack(Material.TNT)).shape("gsg", "sgs", "gsg").setIngredient('g', Material.GUNPOWDER).setIngredient('s', Material.SAND); + ShapedRecipe vanillaTnt = new ShapedRecipe(new NamespacedKey(plugin, "moretnt"), new ItemStack(Material.TNT)).shape("gsg", "sgs", "gsg").setIngredient('g', Material.GUNPOWDER).setIngredient('s', Material.SAND); //Multiply the amount of tnt in enabled worlds if (UtilityModule.isSameRecipe(craftRecipe, vanillaTnt)) From 1eed4bf1c138bd4db6084941625e8990dd69df4d Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 22 Sep 2019 07:39:43 -0700 Subject: [PATCH 195/252] fix error message to print the invalid entry As seen in #193 --- src/main/java/com/extrahardmode/features/HardenedStone.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/HardenedStone.java b/src/main/java/com/extrahardmode/features/HardenedStone.java index 306ac71e..21a81225 100644 --- a/src/main/java/com/extrahardmode/features/HardenedStone.java +++ b/src/main/java/com/extrahardmode/features/HardenedStone.java @@ -116,7 +116,7 @@ public void onBlockBreak(BlockBreakEvent event) Material material = Material.matchMaterial(parsedTool[0]); if (material == null) { - plugin.getLogger().warning("Material " + material + " does not exist. Please remove this entry from Mining.Inhibit Tunneling."); + plugin.getLogger().warning("Material " + parsedTool[0] + " does not exist. Please remove this entry from Mining.Inhibit Tunneling."); continue; } int durability = Integer.parseInt(parsedTool[1]); From e28a665ba73744863a4112ac26d8c3fffd9bb045 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 22 Sep 2019 10:50:35 -0700 Subject: [PATCH 196/252] remove deprecated @ data syntax from config comment --- src/main/java/com/extrahardmode/config/RootNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index fceb4e07..5aac9e9c 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -132,7 +132,7 @@ public enum RootNode implements ConfigNode * Stone Blocks and their counter respective cobblestone blocks */ SUPER_HARD_STONE_STONE_BLOCKS("World Rules.Mining.Breaking Blocks Softens Surrounding Stone.Stone Blocks", VarType.BLOCK_RELATION_LIST, new DefaultStoneBlocks(), - "Here you can specify custom stone blocks or change what stone softens into. (Stone@data-Cobble@data)"), + "Here you can specify custom stone blocks or change what stone softens into. (STONE-COBBLESTONE)"), /** * ########### * # TORCHES # From 8e55e4e2a92f8d6f003425bf67c13f87a0f484d4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2019 05:15:54 +0000 Subject: [PATCH 197/252] Bump git-commit-id-plugin from 3.0.1 to 4.0.0 Bumps [git-commit-id-plugin](https://github.com/git-commit-id/maven-git-commit-id-plugin) from 3.0.1 to 4.0.0. - [Release notes](https://github.com/git-commit-id/maven-git-commit-id-plugin/releases) - [Commits](https://github.com/git-commit-id/maven-git-commit-id-plugin/compare/v3.0.1...v4.0.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5a8b4e04..7b2b3b93 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 3.0.1 + 4.0.0 get-the-git-infos From d896dd615780037dae50a610716cf88b56b41a77 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2020 05:18:21 +0000 Subject: [PATCH 198/252] Bump bstats-bukkit from 1.5 to 1.6 Bumps [bstats-bukkit](https://github.com/Bastian/bStats-Metrics) from 1.5 to 1.6. - [Release notes](https://github.com/Bastian/bStats-Metrics/releases) - [Commits](https://github.com/Bastian/bStats-Metrics/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7b2b3b93..e4c3683a 100644 --- a/pom.xml +++ b/pom.xml @@ -300,7 +300,7 @@ org.bstats bstats-bukkit - 1.5 + 1.6 compile From bc85496ec289918f57a7bff381549e573230673a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2020 05:16:38 +0000 Subject: [PATCH 199/252] Bump maven-shade-plugin from 3.2.1 to 3.2.2 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.1...maven-shade-plugin-3.2.2) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e4c3683a..ddf02a03 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.1 + 3.2.2 true false From cc48c3ff905ba43042ba716a20f2e60f50fc54df Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 15 Feb 2020 03:47:45 -0800 Subject: [PATCH 200/252] Update README.md c: --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c90fa4f..de3d1006 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ExtraHardMode ============= -Official repository for [ExtraHardMode Bukkit Plugin](http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/). +Official repository for [ExtraHardMode Bukkit Plugin. Download and more info here.](http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/). ## Build instructions From e77ea616d656a4b41d81de7708e0f7957a93a009 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2020 04:13:14 +0000 Subject: [PATCH 201/252] Bump maven-shade-plugin from 3.2.2 to 3.2.3 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.2 to 3.2.3. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.2...maven-shade-plugin-3.2.3) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ddf02a03..b914287b 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.2 + 3.2.3 true false From 862462d029413987941703575f0288225f42517b Mon Sep 17 00:00:00 2001 From: Shane Bee Date: Wed, 13 May 2020 22:14:39 -0700 Subject: [PATCH 202/252] Include CAVE_AIR as AIR in the falling blocks check #218 --- .../java/com/extrahardmode/task/BlockPhysicsCheckTask.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java b/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java index bf0ba1e6..d7f00405 100644 --- a/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java +++ b/src/main/java/com/extrahardmode/task/BlockPhysicsCheckTask.java @@ -94,8 +94,9 @@ public void run() Material material = block.getType(); Block underBlock = block.getRelative(BlockFace.DOWN); + Material underType = underBlock.getType(); - if ((underBlock.getType() == Material.AIR || underBlock.isLiquid() || underBlock.getType() == Material.TORCH) + if ((underType == Material.AIR || underType == Material.CAVE_AIR || underBlock.isLiquid() || underType == Material.TORCH) && (material == Material.SAND || material == Material.GRAVEL || fallingBlocks.contains(block.getType()) && fallingBlocksEnabled && material != Material.AIR)) { From c4d5473386a7b0da30b03c895bcb2ca1a88ae6f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Tue, 2 Jun 2020 13:32:58 +0900 Subject: [PATCH 203/252] Use event#getBlock directly for evaporating waterlogged blocks (#219) --- .../com/extrahardmode/features/AntiFarming.java | 9 +++------ .../com/extrahardmode/task/EvaporateWaterTask.java | 13 +++---------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index f32fa28e..6fccd909 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -44,7 +44,6 @@ import org.bukkit.event.block.*; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.SheepRegrowWoolEvent; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; @@ -53,7 +52,6 @@ import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; /** * Antifarming module @@ -240,7 +238,7 @@ void onBlockDispense(BlockDispenseEvent event) { // plan to evaporate the water next tick Block block = event.getVelocity().toLocation(world).getBlock(); - EvaporateWaterTask task = new EvaporateWaterTask(block, block, plugin); + EvaporateWaterTask task = new EvaporateWaterTask(block, plugin); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, 1L); } } @@ -400,10 +398,9 @@ public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) if (!playerBypasses && dontMoveWaterEnabled && event.getBucket().equals(Material.WATER_BUCKET)) { // plan to change this block into a non-source block on the next tick - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + Block block = event.getBlock(); blockModule.mark(block); - blockModule.mark(event.getBlockClicked()); - EvaporateWaterTask task = new EvaporateWaterTask(block, event.getBlockClicked(), plugin); + EvaporateWaterTask task = new EvaporateWaterTask(block, plugin); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, 10L); } } diff --git a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java index 4f57fa75..ecaee079 100644 --- a/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java +++ b/src/main/java/com/extrahardmode/task/EvaporateWaterTask.java @@ -37,15 +37,10 @@ public class EvaporateWaterTask implements Runnable { /** - * Target block. + * Target block. Water source or waterlogging blocks. */ private final Block block; - /** - * The clicked block, in case it waterlogged it (1.13) - */ - private final Block clickedBlock; - /** * Module for Metadata */ @@ -57,10 +52,9 @@ public class EvaporateWaterTask implements Runnable * * @param block - Target block. */ - public EvaporateWaterTask(Block block, Block clickedBlock, ExtraHardMode plugin) + public EvaporateWaterTask(Block block, ExtraHardMode plugin) { this.block = block; - this.clickedBlock = clickedBlock; blockModule = plugin.getModuleForClass(BlockModule.class); } @@ -74,7 +68,7 @@ public void run() waterLevel.setLevel(1); block.setBlockData(waterLevel, true); } - else if (clickedBlock.getBlockData() instanceof Waterlogged) + else if (block.getBlockData() instanceof Waterlogged) { Waterlogged wowWater = (Waterlogged)block.getBlockData(); wowWater.setWaterlogged(false); @@ -83,6 +77,5 @@ else if (clickedBlock.getBlockData() instanceof Waterlogged) //Finished processing blockModule.removeMark(block); - blockModule.removeMark(clickedBlock); } } From ef1d9540194effee27bbe476c89cd96a968f0446 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2020 04:13:20 +0000 Subject: [PATCH 204/252] Bump maven-shade-plugin from 3.2.3 to 3.2.4 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.3 to 3.2.4. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.3...maven-shade-plugin-3.2.4) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b914287b..ed15c5a5 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.3 + 3.2.4 true false From 98eaffbeb3862273f79f54e8713de5b4aaea07c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Thu, 4 Jun 2020 01:13:17 +0900 Subject: [PATCH 205/252] Remove gradle (#223) --- build.gradle | 71 ---------- gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 - gradlew | 160 ----------------------- gradlew.bat | 90 ------------- settings.gradle | 1 - spigot.gradle | 50 ------- spigot/server/start-server.bat | 1 - 8 files changed, 379 deletions(-) delete mode 100644 build.gradle delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 gradlew delete mode 100644 gradlew.bat delete mode 100644 settings.gradle delete mode 100644 spigot.gradle delete mode 100644 spigot/server/start-server.bat diff --git a/build.gradle b/build.gradle deleted file mode 100644 index c5f23d98..00000000 --- a/build.gradle +++ /dev/null @@ -1,71 +0,0 @@ -buildscript{ - repositories { jcenter() } - dependencies{ - classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.2' - } -} -apply from: 'spigot.gradle' - -apply plugin: 'java' -apply plugin: 'maven' -apply plugin: 'com.github.johnrengelman.shadow' - -group = 'com.extrahardmode' -version = '3.6.6' - -description = """ExtraHardMode""" - -sourceCompatibility = 1.6 -targetCompatibility = 1.6 - -repositories { - mavenCentral() - jcenter() - maven { - name 'github hosted plugin repo' - url 'http://di3mex.github.io/repo_bukkit/releases/' - } - maven { - name 'github hosted snapshot plugin repo' - url 'http://di3mex.github.io/repo_bukkit/snapshots/' - } - maven { - name 'Spigot' - url 'https://hub.spigotmc.org/nexus/content/groups/public/' - } - maven { - name 'Md5' - url 'http://repo.md-5.net/content/groups/public/' - } - maven { - name 'BungeeCord' - url 'https://oss.sonatype.org/content/repositories/snapshots' - } - maven { - name 'Build github repos that are not in a maven repo' - url 'https://jitpack.io' - } -} - -shadowJar { - dependencies { - include(dependency('org.mcstats.bukkit:metrics:R7')) - } -} - -dependencies { - compile 'org.bukkit:bukkit:1.8.8-R0.1-SNAPSHOT' - compile 'org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT' - compile group: 'org.mcstats.bukkit', name: 'metrics', version: 'R7' - compile group: 'com.sk89q', name: 'worldguard', version: '5.8.1-SNAPSHOT' -// compile group: 'me.botsko', name: 'prism', version: '2.0' - compile group: 'net.coreprotect.CoreProtect', name: 'CoreProtect', version: '2.0.8' - compile group: 'de.diddiz', name: 'logblock', version: '1.8' - compile group: 'uk.co.oliwali', name: 'HawkEye', version: '1.6.0' - compile 'com.google.guava:guava:14.0.1' - testCompile 'junit:junit:version:4.11' - testCompile 'org.mockito:mockito-all:1.9.5' - testCompile 'org.powermock:powermock-api-mockito:1.5' - testCompile 'org.powermock:powermock-core:1.5' - testCompile 'org.powermock:powermock-module-junit4:1.5' -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 941144813d241db74e1bf25b6804c679fbe7f0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 DXC5Z7 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 26930c22..00000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Dec 04 15:55:32 CET 2015 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip diff --git a/gradlew b/gradlew deleted file mode 100644 index 9d82f789..00000000 --- a/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 8a0b282a..00000000 --- a/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index e3093003..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'ExtraHardMode' diff --git a/spigot.gradle b/spigot.gradle deleted file mode 100644 index 443d056f..00000000 --- a/spigot.gradle +++ /dev/null @@ -1,50 +0,0 @@ -def buildTools = file('/spigot/BuildTools.jar').getAbsolutePath() - -task spigotDownloadBuildtools() { - def sourceUrl = 'https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar' - def target = file(buildTools).newOutputStream() - target << new URL(sourceUrl).openStream() - target.close() -} - -task spigotRunBuildTools (type: Exec) { - commandLine 'java -jar spigot/BuildTools.jar' -} - -task copySpigotToServer(type: Copy) { - from 'spigot/' - into 'spigot/server' - include 'spigot-*.jar' -} - -task copyEHMToServer(type: Copy) { - from 'build/libs' - into 'spigot/server/plugins' - include 'ExtraHardMode-*-all.jar' -} - -task buildEHM { - dependsOn 'build' - dependsOn 'shadowJar' - dependsOn 'copySpigotToServer' - dependsOn 'copyEHMToServer' - tasks.findByName('copySpigotToServer').mustRunAfter 'shadowJar' - tasks.findByName('copyEHMToServer').mustRunAfter 'shadowJar' -} - -configure(spigotDownloadBuildtools){ - group = 'EHM' -} -configure(spigotRunBuildTools){ - group = 'EHM' -} -configure(copyEHMToServer){ - group = 'EHM' -} -configure(copySpigotToServer){ - group = 'EHM' -} -configure(buildEHM){ - group = 'EHM' -} - diff --git a/spigot/server/start-server.bat b/spigot/server/start-server.bat deleted file mode 100644 index 7fb8df73..00000000 --- a/spigot/server/start-server.bat +++ /dev/null @@ -1 +0,0 @@ -java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar spigot-1.8.8.jar \ No newline at end of file From 8cecd80114f494f270b15820f67034386f755e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Thu, 4 Jun 2020 08:29:24 +0900 Subject: [PATCH 206/252] comment out unused variables (#228) --- src/main/java/com/extrahardmode/features/Physics.java | 6 +++--- src/main/java/com/extrahardmode/metrics/ConfigPlotter.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Physics.java b/src/main/java/com/extrahardmode/features/Physics.java index c63a7b60..0283c8a9 100644 --- a/src/main/java/com/extrahardmode/features/Physics.java +++ b/src/main/java/com/extrahardmode/features/Physics.java @@ -150,8 +150,8 @@ public void onBlockBreak(BlockBreakEvent breakEvent) public void whenBlockLands(EntityChangeBlockEvent event) { Entity entity = event.getEntity(); - World world = entity.getWorld(); - +// World world = entity.getWorld(); +// // final int damageAmount = CFG.getInt(RootNode.MORE_FALLING_BLOCKS_DMG_AMOUNT, world.getName()); // final boolean environmentalDmg = CFG.getBoolean(RootNode.ENHANCED_ENVIRONMENTAL_DAMAGE, world.getName()); // @@ -172,7 +172,7 @@ public void whenBlockLands(EntityChangeBlockEvent event) // } // } - if (event.getEntity() instanceof FallingBlock && EntityHelper.isMarkedAsOurs(event.getEntity())) + if (entity instanceof FallingBlock && EntityHelper.isMarkedAsOurs(entity)) { BlockState newState = event.getBlock().getState(); newState.setType(event.getTo()); diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java index 7b545fe3..13309155 100644 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -47,7 +47,7 @@ public String call() throws Exception } })); - final int percent = CFG.getEnabledWorlds().length > 0 ? (plugin.getServer().getWorlds().size() * 100 / CFG.getEnabledWorlds().length) : 0; +// final int percent = CFG.getEnabledWorlds().length > 0 ? (plugin.getServer().getWorlds().size() * 100 / CFG.getEnabledWorlds().length) : 0; // Metrics.Graph graph = metrics.createGraph("Enabled for % of worlds"); // graph.addPlotter( // new Metrics.Plotter("0-25%") From ec71971c8fa0e5e0687a1b7bc0bba9d7adcba6c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Thu, 4 Jun 2020 08:29:55 +0900 Subject: [PATCH 207/252] Remove unused imports (#226) --- src/main/java/com/extrahardmode/command/EnabledCommand.java | 1 - .../java/com/extrahardmode/features/AnimalCrowdControl.java | 1 - src/main/java/com/extrahardmode/features/Physics.java | 4 ---- .../java/com/extrahardmode/features/monsters/Glydia.java | 1 - .../java/com/extrahardmode/features/monsters/Guardians.java | 2 -- .../com/extrahardmode/features/monsters/KillerBunny.java | 2 -- src/main/java/com/extrahardmode/features/monsters/Vex.java | 3 --- .../java/com/extrahardmode/features/monsters/Vindicator.java | 2 -- .../java/com/extrahardmode/features/monsters/Witches.java | 1 - .../java/com/extrahardmode/features/monsters/Zombies.java | 2 -- src/main/java/com/extrahardmode/module/PlayerModule.java | 2 -- .../module/temporaryblock/TemporaryBlockHandler.java | 1 - .../java/com/extrahardmode/task/CreateExplosionTask.java | 1 - src/main/java/com/extrahardmode/task/FallingLogsTask.java | 5 ----- src/main/java/com/extrahardmode/task/MoreMonstersTask.java | 2 -- 15 files changed, 30 deletions(-) diff --git a/src/main/java/com/extrahardmode/command/EnabledCommand.java b/src/main/java/com/extrahardmode/command/EnabledCommand.java index 3e209339..0f6a3c83 100644 --- a/src/main/java/com/extrahardmode/command/EnabledCommand.java +++ b/src/main/java/com/extrahardmode/command/EnabledCommand.java @@ -13,7 +13,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; /** diff --git a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java index 7b949efd..35c3014d 100644 --- a/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java +++ b/src/main/java/com/extrahardmode/features/AnimalCrowdControl.java @@ -7,7 +7,6 @@ import com.extrahardmode.module.MsgModule; import com.extrahardmode.service.ListenerModule; import java.util.List; -import org.bukkit.Effect; import org.bukkit.Particle; import org.bukkit.World; import org.bukkit.entity.Animals; diff --git a/src/main/java/com/extrahardmode/features/Physics.java b/src/main/java/com/extrahardmode/features/Physics.java index 0283c8a9..4734964a 100644 --- a/src/main/java/com/extrahardmode/features/Physics.java +++ b/src/main/java/com/extrahardmode/features/Physics.java @@ -42,10 +42,6 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.List; /** * Physics include diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 675c1c32..662cc983 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -50,7 +50,6 @@ import org.bukkit.event.entity.*; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.projectiles.ProjectileSource; import org.bukkit.util.Vector; import java.util.List; diff --git a/src/main/java/com/extrahardmode/features/monsters/Guardians.java b/src/main/java/com/extrahardmode/features/monsters/Guardians.java index a189b20e..4a6a441a 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Guardians.java +++ b/src/main/java/com/extrahardmode/features/monsters/Guardians.java @@ -9,10 +9,8 @@ import com.extrahardmode.module.EntityHelper; import com.extrahardmode.service.ListenerModule; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; -import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java b/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java index 95642c1a..884b52c5 100644 --- a/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java +++ b/src/main/java/com/extrahardmode/features/monsters/KillerBunny.java @@ -9,9 +9,7 @@ import com.extrahardmode.module.EntityHelper; import com.extrahardmode.service.ListenerModule; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/extrahardmode/features/monsters/Vex.java b/src/main/java/com/extrahardmode/features/monsters/Vex.java index 77514164..71423467 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Vex.java +++ b/src/main/java/com/extrahardmode/features/monsters/Vex.java @@ -9,10 +9,7 @@ import com.extrahardmode.module.EntityHelper; import com.extrahardmode.service.ListenerModule; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/extrahardmode/features/monsters/Vindicator.java b/src/main/java/com/extrahardmode/features/monsters/Vindicator.java index cc43eb22..d832a199 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Vindicator.java +++ b/src/main/java/com/extrahardmode/features/monsters/Vindicator.java @@ -9,10 +9,8 @@ import com.extrahardmode.module.EntityHelper; import com.extrahardmode.service.ListenerModule; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; -import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/extrahardmode/features/monsters/Witches.java b/src/main/java/com/extrahardmode/features/monsters/Witches.java index 2ef01077..84a91066 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Witches.java +++ b/src/main/java/com/extrahardmode/features/monsters/Witches.java @@ -38,7 +38,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.PotionSplashEvent; -import org.bukkit.projectiles.ProjectileSource; /** * All the changes to Witches diff --git a/src/main/java/com/extrahardmode/features/monsters/Zombies.java b/src/main/java/com/extrahardmode/features/monsters/Zombies.java index 4fed203e..37da867b 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Zombies.java +++ b/src/main/java/com/extrahardmode/features/monsters/Zombies.java @@ -42,8 +42,6 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.Skull; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Rotatable; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; diff --git a/src/main/java/com/extrahardmode/module/PlayerModule.java b/src/main/java/com/extrahardmode/module/PlayerModule.java index 059f19f5..e48b8e73 100644 --- a/src/main/java/com/extrahardmode/module/PlayerModule.java +++ b/src/main/java/com/extrahardmode/module/PlayerModule.java @@ -27,13 +27,11 @@ import com.extrahardmode.config.RootNode; import com.extrahardmode.service.EHMModule; import com.extrahardmode.service.Feature; -import org.apache.commons.lang.Validate; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.bukkit.scheduler.BukkitScheduler; /** * Player centric actions diff --git a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java index 6cd6327b..99f1bf9c 100644 --- a/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java +++ b/src/main/java/com/extrahardmode/module/temporaryblock/TemporaryBlockHandler.java @@ -9,7 +9,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockEvent; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.entity.EntityExplodeEvent; diff --git a/src/main/java/com/extrahardmode/task/CreateExplosionTask.java b/src/main/java/com/extrahardmode/task/CreateExplosionTask.java index d33869e6..2be0cbb9 100644 --- a/src/main/java/com/extrahardmode/task/CreateExplosionTask.java +++ b/src/main/java/com/extrahardmode/task/CreateExplosionTask.java @@ -27,7 +27,6 @@ import com.extrahardmode.config.RootConfig; import com.extrahardmode.config.RootNode; import com.extrahardmode.module.EntityHelper; -import com.extrahardmode.module.ExplosionCompatStorage; import org.bukkit.Location; import org.bukkit.entity.Entity; diff --git a/src/main/java/com/extrahardmode/task/FallingLogsTask.java b/src/main/java/com/extrahardmode/task/FallingLogsTask.java index a03f124a..98433fe7 100644 --- a/src/main/java/com/extrahardmode/task/FallingLogsTask.java +++ b/src/main/java/com/extrahardmode/task/FallingLogsTask.java @@ -25,12 +25,7 @@ import com.extrahardmode.ExtraHardMode; import com.extrahardmode.module.BlockModule; import org.apache.commons.lang.Validate; -import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; - -import java.util.ArrayList; -import java.util.List; /** * Gradually let's Logs which have been marked as loose fall down. diff --git a/src/main/java/com/extrahardmode/task/MoreMonstersTask.java b/src/main/java/com/extrahardmode/task/MoreMonstersTask.java index 464d1414..06277d6b 100644 --- a/src/main/java/com/extrahardmode/task/MoreMonstersTask.java +++ b/src/main/java/com/extrahardmode/task/MoreMonstersTask.java @@ -23,8 +23,6 @@ import java.util.AbstractMap.SimpleEntry; -import java.util.Collection; -import java.util.List; import org.bukkit.Location; import org.bukkit.World; From b6a4b499e64413103cdd3a09084d77804e8875e1 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 1 Jul 2020 02:24:24 -0700 Subject: [PATCH 208/252] zombie villagers, ok, but now no more zombie pigmen? --- pom.xml | 4 ++-- src/main/java/com/extrahardmode/features/Tutorial.java | 2 +- src/main/java/com/extrahardmode/features/monsters/Blazes.java | 2 +- src/main/java/com/extrahardmode/module/EntityHelper.java | 2 +- src/main/resources/plugin.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index ed15c5a5..7b8339bd 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.14.0 + 3.14.1 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.14.4 + 1.16.1 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ diff --git a/src/main/java/com/extrahardmode/features/Tutorial.java b/src/main/java/com/extrahardmode/features/Tutorial.java index fd77bea7..843beb3b 100644 --- a/src/main/java/com/extrahardmode/features/Tutorial.java +++ b/src/main/java/com/extrahardmode/features/Tutorial.java @@ -105,7 +105,7 @@ public void onEntityTarget(EntityTargetEvent event) messenger.send(player, MessageNode.GHAST_TARGET); break; } - case PIG_ZOMBIE: + case ZOMBIFIED_PIGLIN: { if (CFG.getBoolean(RootNode.ALWAYS_ANGRY_PIG_ZOMBIES, world.getName())) messenger.send(player, MessageNode.PIGZOMBIE_TARGET); diff --git a/src/main/java/com/extrahardmode/features/monsters/Blazes.java b/src/main/java/com/extrahardmode/features/monsters/Blazes.java index 2d537429..73e1fe18 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Blazes.java +++ b/src/main/java/com/extrahardmode/features/monsters/Blazes.java @@ -88,7 +88,7 @@ public void onEntitySpawn(CreatureSpawnEvent event) EntityType entityType = entity.getType(); // FEATURE: more blazes in nether - if (entityType == EntityType.PIG_ZOMBIE && world.getEnvironment() == World.Environment.NETHER) + if (entityType == EntityType.ZOMBIFIED_PIGLIN && world.getEnvironment() == World.Environment.NETHER) { if (plugin.random(bonusNetherBlazeSpawnPercent)) { diff --git a/src/main/java/com/extrahardmode/module/EntityHelper.java b/src/main/java/com/extrahardmode/module/EntityHelper.java index df415ec0..e22487b7 100644 --- a/src/main/java/com/extrahardmode/module/EntityHelper.java +++ b/src/main/java/com/extrahardmode/module/EntityHelper.java @@ -255,7 +255,7 @@ public static LivingEntity spawn(Location loc, EntityType type) case SKELETON: entity.getEquipment().setItemInHand(new ItemStack(Material.BOW)); break; - case PIG_ZOMBIE: + case ZOMBIFIED_PIGLIN: entity.getEquipment().setItemInHand(new ItemStack(Material.GOLDEN_SWORD)); break; case ENDER_DRAGON: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a17710ba..b56ebe35 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,7 +7,7 @@ author: RoboMWM authors: [Diemex, Big_Scary] #ensure that we are loaded after multiworld plugins softdepend: [Multiverse-Core, My_Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] -api-version: '1.14' +api-version: '1.15' commands: ehm: description: Root command for ExtraHardMode From 3d1df637110a1cee766cecb5cec2a9b6bfb2d96b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 10 Jul 2020 10:38:20 -0700 Subject: [PATCH 209/252] yet the class remains as PigZombie. Interesting. --- src/test/com/extrahardmode/mocks/MockLivingEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/com/extrahardmode/mocks/MockLivingEntity.java b/src/test/com/extrahardmode/mocks/MockLivingEntity.java index 16995582..f7c109ca 100644 --- a/src/test/com/extrahardmode/mocks/MockLivingEntity.java +++ b/src/test/com/extrahardmode/mocks/MockLivingEntity.java @@ -78,7 +78,7 @@ private void mockForType(EntityType type) case GHAST: entity = mock(Ghast.class); break; - case PIG_ZOMBIE: + case ZOMBIFIED_PIGLIN: entity = mock(PigZombie.class); break; case SILVERFISH: From 4693b7d2f11d379aacb568f4ae1e29b874464f5a Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Fri, 10 Jul 2020 10:42:07 -0700 Subject: [PATCH 210/252] one more instance, also version 3.14.1 for some time --- src/test/com/extrahardmode/features/TestAntiGrinder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/com/extrahardmode/features/TestAntiGrinder.java b/src/test/com/extrahardmode/features/TestAntiGrinder.java index 2fe8be12..615811f5 100644 --- a/src/test/com/extrahardmode/features/TestAntiGrinder.java +++ b/src/test/com/extrahardmode/features/TestAntiGrinder.java @@ -99,7 +99,7 @@ public void zombieSpawns() @Test public void naturalSpawns() { - MockCreatureSpawnEvent event = new MockCreatureSpawnEvent(EntityType.PIG_ZOMBIE, "world", CreatureSpawnEvent.SpawnReason.NATURAL); + MockCreatureSpawnEvent event = new MockCreatureSpawnEvent(EntityType.ZOMBIFIED_PIGLIN, "world", CreatureSpawnEvent.SpawnReason.NATURAL); //Set a Block at the given Location MockBlock block = new MockBlock(); From 3eb29fe2ef1dfc563ddcf667c93c7655515a739d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2020 04:12:15 +0000 Subject: [PATCH 211/252] Bump git-commit-id-plugin from 4.0.0 to 4.0.1 Bumps git-commit-id-plugin from 4.0.0 to 4.0.1. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7b8339bd..1aac08d7 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 4.0.0 + 4.0.1 get-the-git-infos From 690ab0195ea5d918b6a03885da19192bf729b0d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Fri, 24 Jul 2020 08:27:19 +0900 Subject: [PATCH 212/252] deny fish bucket, kelp, seagrass for antifarming weakness (#232) - prevent using fish bucket - prevent placing kelp or seagrass that keep water --- .../com/extrahardmode/features/AntiFarming.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index 6fccd909..1c7bafb9 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -395,7 +395,7 @@ public void onPlayerEmptyBucket(PlayerBucketEmptyEvent event) final boolean playerBypasses = playerModule.playerBypasses(player, Feature.ANTIFARMING); // FEATURE: can't move water source blocks - if (!playerBypasses && dontMoveWaterEnabled && event.getBucket().equals(Material.WATER_BUCKET)) + if (!playerBypasses && dontMoveWaterEnabled && (event.getBucket() != Material.LAVA_BUCKET && event.getBucket() != Material.MILK_BUCKET)) { // plan to change this block into a non-source block on the next tick Block block = event.getBlock(); @@ -431,4 +431,18 @@ public void run() }); } } + + /** + * When a player place kelp or seagrass in markd water. + * + * @param event Event that occurred. + */ + @EventHandler(ignoreCancelled = true) + public void onPlaceKelpOrSeaGrass(BlockPlaceEvent event) { + Block placedBlock = event.getBlockPlaced(); + if ((placedBlock.getType() == Material.KELP || placedBlock.getType() == Material.SEAGRASS) + && blockModule.isMarked(placedBlock)) { + event.setCancelled(true); + } + } } From dc46ff5d7e5a72864694758b22a5234c20434097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Sat, 1 Aug 2020 12:07:13 +0900 Subject: [PATCH 213/252] Deny edge case where torches can be attached to soft blocks (#239) --- .../java/com/extrahardmode/features/Torches.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/Torches.java b/src/main/java/com/extrahardmode/features/Torches.java index 2b1f41d6..a0786ebc 100644 --- a/src/main/java/com/extrahardmode/features/Torches.java +++ b/src/main/java/com/extrahardmode/features/Torches.java @@ -39,12 +39,13 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.weather.WeatherChangeEvent; -import org.bukkit.material.Torch; /** * Torches @@ -123,9 +124,14 @@ public void onBlockPlace(BlockPlaceEvent placeEvent) if (LooseTags.TORCH.isTagged(blockType)) { -// Torch torch = new Torch(blockType); -// Material attachmentMaterial = block.getRelative(torch.getAttachedFace()).getType(); - Material attachmentMaterial = placeEvent.getBlockAgainst().getType(); + + BlockData blockData = block.getBlockData(); + Material attachmentMaterial = (blockData instanceof Directional) + // wall torch + ? block.getRelative(((Directional) blockData).getFacing().getOppositeFace()).getType() + // torch on ground + : block.getRelative(BlockFace.DOWN).getType(); + switch (attachmentMaterial) { case DIRT: From a1313f9af860fc9c2e3e37f2014bbec9cec0371d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2020 04:14:22 +0000 Subject: [PATCH 214/252] Bump git-commit-id-plugin from 4.0.1 to 4.0.2 Bumps git-commit-id-plugin from 4.0.1 to 4.0.2. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1aac08d7..de316d9e 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 4.0.1 + 4.0.2 get-the-git-infos From 05143738d4bc615a1ed712d17b914ac3f36cf071 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 31 Aug 2020 14:41:16 -0700 Subject: [PATCH 215/252] Skip computing guardian spawn chance if 0% Fixes #243 --- pom.xml | 2 +- .../features/monsters/Guardians.java | 3 ++ .../extrahardmode/metrics/ConfigPlotter.java | 28 ++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index de316d9e..0690c44d 100644 --- a/pom.xml +++ b/pom.xml @@ -300,7 +300,7 @@ org.bstats bstats-bukkit - 1.6 + 1.7 compile diff --git a/src/main/java/com/extrahardmode/features/monsters/Guardians.java b/src/main/java/com/extrahardmode/features/monsters/Guardians.java index 4a6a441a..998cbf4e 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Guardians.java +++ b/src/main/java/com/extrahardmode/features/monsters/Guardians.java @@ -54,6 +54,9 @@ public void onEntitySpawn(CreatureSpawnEvent event) final int guardiansSpawnPercent = CFG.getInt(RootNode.BONUS_GUARDIANS_SPAWN_PERCENT, world.getName()); + if (guardiansSpawnPercent == 0) + return; + // FEATURE: Guardians spawns naturally if (entityType == EntityType.SQUID && world.getEnvironment() == World.Environment.NORMAL && entity.getLocation().getBlock().getBiome() == Biome.DEEP_OCEAN diff --git a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java index 13309155..251118c1 100644 --- a/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java +++ b/src/main/java/com/extrahardmode/metrics/ConfigPlotter.java @@ -13,6 +13,8 @@ * Output all the choosen modules to mcstats in nice plots * * @author Diemex + * + * Well, now it goes to bstats. */ public class ConfigPlotter { @@ -36,7 +38,7 @@ private void createPlot() Metrics metrics; try { - metrics = new Metrics(plugin); + metrics = new Metrics(plugin, 3342); metrics.addCustomChart(new Metrics.SimplePie("bukkit_implementation", new Callable() { @@ -145,6 +147,30 @@ public String call() throws Exception metrics.addCustomChart(new Metrics.SimplePie(node.toString(), () -> result)); break; } + //Please add future config nodes here, the bstats site defaults IDs to lowercase and does not allow editing of existing charts, nor easy bulk input of new ones... +// case SOMETHING_ELSE: +// { +// final int metricsVal = getMetricsValue(node); +// String result; +// switch (metricsVal) +// { +// case 0: +// result = "Completely disabled"; +// break; +// case 1: +// result = "Enabled in all worlds"; +// break; +// case 2: +// result = "Enabled in some"; +// break; +// default: +// result = "Unknown"; +// break; +// } +// +// metrics.addCustomChart(new Metrics.SimplePie(node.toString().toLowerCase(), () -> result)); +// break; +// } } } } catch (Exception ignored) From 3aea1a5d7048654e3eb0ecd8f0b5cf92f9e4ed13 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 14 Sep 2020 00:05:39 -0700 Subject: [PATCH 216/252] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index de3d1006..7dbbf178 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ExtraHardMode ============= -Official repository for [ExtraHardMode Bukkit Plugin. Download and more info here.](http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/). +Official repository for [ExtraHardMode Bukkit Plugin.](https://dev.bukkit.org/bukkit-plugins/fun-hard-mode/) Project page and downloads can be found here: https://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ ## Build instructions From 3b567aa43a556c4bcc7674c670bb0a67390df6dc Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 14 Sep 2020 00:10:05 -0700 Subject: [PATCH 217/252] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0690c44d..8e11c7f4 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.14.1 + 3.14.2 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From dc95e548c58ae1afa6689f2eed7083d0e0630df8 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 22 Sep 2020 14:20:31 -0700 Subject: [PATCH 218/252] @PrepareForTest breaks in JDK 11 --- src/test/com/extrahardmode/config/TestRootConfig.java | 2 +- src/test/com/extrahardmode/service/TestMultiWorldConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/com/extrahardmode/config/TestRootConfig.java b/src/test/com/extrahardmode/config/TestRootConfig.java index 50c48ffd..3ba8c352 100644 --- a/src/test/com/extrahardmode/config/TestRootConfig.java +++ b/src/test/com/extrahardmode/config/TestRootConfig.java @@ -41,7 +41,7 @@ */ @RunWith(PowerMockRunner.class) -@PrepareForTest({RootConfig.class, ExtraHardMode.class}) +//@PrepareForTest({RootConfig.class, ExtraHardMode.class}) //Breaks in JDK 11 apparently public class TestRootConfig { //Mock Plugin diff --git a/src/test/com/extrahardmode/service/TestMultiWorldConfig.java b/src/test/com/extrahardmode/service/TestMultiWorldConfig.java index ca1713f4..de74294d 100644 --- a/src/test/com/extrahardmode/service/TestMultiWorldConfig.java +++ b/src/test/com/extrahardmode/service/TestMultiWorldConfig.java @@ -36,7 +36,7 @@ import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) -@PrepareForTest({MultiWorldConfig.class, JavaPlugin.class, PluginLogger.class}) +//@PrepareForTest({MultiWorldConfig.class, JavaPlugin.class, PluginLogger.class}) //Breaks in JDK 11 apparently public class TestMultiWorldConfig { private final ExtraHardMode plugin = new MockExtraHardMode().get(); From 7ed65c14eec42549b6b71d45270f900cd7817926 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 28 Sep 2020 18:16:59 -0700 Subject: [PATCH 219/252] include netherite pickaxe in default config Also adjust stone mining defaults to around half the vanilla value. Closes #235 --- src/main/java/com/extrahardmode/config/RootNode.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/config/RootNode.java b/src/main/java/com/extrahardmode/config/RootNode.java index 5aac9e9c..9cdfdbe2 100644 --- a/src/main/java/com/extrahardmode/config/RootNode.java +++ b/src/main/java/com/extrahardmode/config/RootNode.java @@ -111,7 +111,8 @@ public enum RootNode implements ConfigNode */ SUPER_HARD_STONE_TOOLS("World Rules.Mining.Inhibit Tunneling.Amount of Stone Tool Can Mine", VarType.LIST, new DefaultToolDurabilities(), "List of tools that can mine stone. If a tool isn't in the list it can't mine stone.", - "E.g. DIAMOND_PICKAXE@100 = Mine 100 stone blocks -> pick broken"), + "E.g. DIAMOND_PICKAXE@100 = Mine 100 stone blocks -> pick broken", + "Vanilla reference: Iron: 250, Diamond: 1561, Netherite: 2031"), /** * Breaking an ore will cause surrounding stone to turn to cobble and fall */ @@ -1496,8 +1497,9 @@ public DefaultToolDurabilities() super(); //this.add(new BlockType(Material.IRON_PICKAXE, (short) 32)); //this.add(new BlockType(Material.DIAMOND_PICKAXE, (short) 64)); - this.add(Material.IRON_PICKAXE.name() + "@32"); - this.add(Material.DIAMOND_PICKAXE.name() + "@64"); + this.add(Material.IRON_PICKAXE.name() + "@128"); + this.add(Material.DIAMOND_PICKAXE.name() + "@512"); + this.add(Material.NETHERITE_PICKAXE.name() + "@1024"); } } From b5ab692fbe8d727479bc65c776308aab2e539f6b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2020 05:14:51 +0000 Subject: [PATCH 220/252] Bump git-commit-id-plugin from 4.0.2 to 4.0.3 Bumps git-commit-id-plugin from 4.0.2 to 4.0.3. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e11c7f4..81e7f0e3 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 4.0.2 + 4.0.3 get-the-git-infos From 6a4d2e432f9c5d739986c8ea3395b1b903c64892 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 5 Nov 2020 16:24:16 -0800 Subject: [PATCH 221/252] implement durability modifier for tools with durability enchant #213 --- .../com/extrahardmode/features/HardenedStone.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/extrahardmode/features/HardenedStone.java b/src/main/java/com/extrahardmode/features/HardenedStone.java index 21a81225..23cd2d6f 100644 --- a/src/main/java/com/extrahardmode/features/HardenedStone.java +++ b/src/main/java/com/extrahardmode/features/HardenedStone.java @@ -39,6 +39,7 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -107,6 +108,7 @@ public void onBlockBreak(BlockBreakEvent event) final List hardBlocks = CFG.getStringListAsMaterialList(RootNode.SUPER_HARD_BLOCKS, world.getName()); final Map toolDurabilityMap = new HashMap<>(); + final Map toolUnbreakingMap = new HashMap<>(); try { @@ -121,6 +123,12 @@ public void onBlockBreak(BlockBreakEvent event) } int durability = Integer.parseInt(parsedTool[1]); toolDurabilityMap.put(material, durability); + + if (parsedTool.length > 2) + { + int unbreakingDurability = Integer.parseInt(parsedTool[1]); + toolUnbreakingMap.put(material, unbreakingDurability); + } } } catch (Throwable rock) @@ -139,8 +147,13 @@ public void onBlockBreak(BlockBreakEvent event) Material tool = inHandStack.getType(); int blocks = 0; Integer toolSettings = toolDurabilityMap.get(tool); + + if (toolUnbreakingMap.containsKey(tool) && inHandStack.containsEnchantment(Enchantment.DURABILITY)) + toolSettings *= toolUnbreakingMap.get(tool); + if (toolSettings != null) blocks = toolSettings; + EhmHardenedStoneEvent hardEvent = new EhmHardenedStoneEvent(player, inHandStack, blocks); if (toolSettings != null) From 12aedb8f6e3b950986e411f9da06fce0c5d17430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=80=A0=E6=83=B0?= Date: Wed, 11 Nov 2020 01:03:43 +0900 Subject: [PATCH 222/252] Add blacklisted buckets for dispensers (#254) --- src/main/java/com/extrahardmode/features/AntiFarming.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index 1c7bafb9..d180aa5f 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -234,7 +234,12 @@ void onBlockDispense(BlockDispenseEvent event) if (dontMoveWaterEnabled) { // only care about water - if (event.getItem().getType() == Material.WATER_BUCKET) + Material item = event.getItem().getType(); + if (item == Material.WATER_BUCKET + || item == Material.COD_BUCKET + || item == Material.SALMON_BUCKET + || item == Material.TROPICAL_FISH_BUCKET + || item == Material.PUFFERFISH_BUCKET) { // plan to evaporate the water next tick Block block = event.getVelocity().toLocation(world).getBlock(); From 5bfe557e7ad83171b10a882abeaa52bc490bc731 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Tue, 24 Nov 2020 22:37:49 -0800 Subject: [PATCH 223/252] I should figure out a template or github action to standardize these readmes --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7dbbf178..618020e8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ ExtraHardMode Official repository for [ExtraHardMode Bukkit Plugin.](https://dev.bukkit.org/bukkit-plugins/fun-hard-mode/) Project page and downloads can be found here: https://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ +Support for feature requests and debugging are available to [patrons.](https://r.robomwm.com/patreon) + ## Build instructions We use maven to handle our dependencies. @@ -10,5 +12,4 @@ We use maven to handle our dependencies. * Install [Maven 3](http://maven.apache.org/download.html) * Check out this repo and: `mvn clean package` -## Development builds -Use at your own risk. https://ci.appveyor.com/project/RoboMWM39862/extrahardmode/build/artifacts +Development builds: Use at your own [risk.](https://ci.appveyor.com/project/RoboMWM39862/extrahardmode/build/artifacts) From 86dd7c64ca56a2de27906653e9fcbb693e080332 Mon Sep 17 00:00:00 2001 From: mrbrwnmail <74878885+mrbrwnmail@users.noreply.github.com> Date: Sat, 28 Nov 2020 04:38:13 +0300 Subject: [PATCH 224/252] Drop a villager egg on ender dragon death (#256) --- src/main/java/com/extrahardmode/features/monsters/Glydia.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Glydia.java b/src/main/java/com/extrahardmode/features/monsters/Glydia.java index 662cc983..2a1470fa 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Glydia.java +++ b/src/main/java/com/extrahardmode/features/monsters/Glydia.java @@ -176,7 +176,7 @@ public void onEntityDeath(EntityDeathEvent event) { if (glydiaDropsEggs) { - ItemStack itemStack = new ItemStack(Material.INFESTED_STONE, 2, (short) 120); + ItemStack itemStack = new ItemStack(Material.VILLAGER_SPAWN_EGG, 2, (short) 120); world.dropItemNaturally(entity.getLocation().add(10, 0, 0), itemStack); } From f68dd22cfa4bb74950099171973a5c123b6bd605 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 20 Dec 2020 17:00:50 -0800 Subject: [PATCH 225/252] Create maven-publish.yml --- .github/workflows/maven-publish.yml | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/maven-publish.yml diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml new file mode 100644 index 00000000..05177993 --- /dev/null +++ b/.github/workflows/maven-publish.yml @@ -0,0 +1,30 @@ +# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java#apache-maven-with-a-settings-path + +name: Maven Package + +on: + release: + types: [created] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.11 + uses: actions/setup-java@v1 + with: + java-version: 1.11 + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + + - name: Build with Maven + run: mvn -B package --file pom.xml + + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml + env: + GITHUB_TOKEN: ${{ github.token }} From 20d844e67f47d3caa607fc282cf13445c2351d10 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 20 Dec 2020 17:41:07 -0800 Subject: [PATCH 226/252] upload to the release, not a package --- .github/workflows/maven-publish.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 05177993..51b504aa 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -1,6 +1,3 @@ -# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created -# For more information see: https://github.com/actions/setup-java#apache-maven-with-a-settings-path - name: Maven Package on: @@ -24,7 +21,12 @@ jobs: - name: Build with Maven run: mvn -B package --file pom.xml - - name: Publish to GitHub Packages Apache Maven - run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + with: + upload_url: ${{ github.event.release.upload_url }} # how come I found this on the second page of bing results in some guys blog instead of in the documentation, or am I just not looking in the right spots. https://itnext.io/getting-started-with-github-actions-fe94167dbc6d?gi=a7321180760b + asset_path: target/${{ github.repository.name }}.jar + asset_name: ${{ github.repository.name }}.jar env: GITHUB_TOKEN: ${{ github.token }} From 53c8d8b9f376d22915ff5f0cb00f5b0ea8c95e78 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 20 Dec 2020 18:12:22 -0800 Subject: [PATCH 227/252] add asset_content_type a sad day for github actions' documentation --- .github/workflows/maven-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 51b504aa..0de67319 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -28,5 +28,6 @@ jobs: upload_url: ${{ github.event.release.upload_url }} # how come I found this on the second page of bing results in some guys blog instead of in the documentation, or am I just not looking in the right spots. https://itnext.io/getting-started-with-github-actions-fe94167dbc6d?gi=a7321180760b asset_path: target/${{ github.repository.name }}.jar asset_name: ${{ github.repository.name }}.jar + asset_content_type: application/java-archive env: GITHUB_TOKEN: ${{ github.token }} From 09ddff2887acac87516e95145e292d13555dd104 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 20 Dec 2020 18:18:02 -0800 Subject: [PATCH 228/252] hardcode jar name for now --- .github/workflows/maven-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index 0de67319..d0702ab9 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -26,8 +26,8 @@ jobs: uses: actions/upload-release-asset@v1 with: upload_url: ${{ github.event.release.upload_url }} # how come I found this on the second page of bing results in some guys blog instead of in the documentation, or am I just not looking in the right spots. https://itnext.io/getting-started-with-github-actions-fe94167dbc6d?gi=a7321180760b - asset_path: target/${{ github.repository.name }}.jar - asset_name: ${{ github.repository.name }}.jar + asset_path: target/ExtraHardMode.jar + asset_name: ExtraHardMode.jar asset_content_type: application/java-archive env: GITHUB_TOKEN: ${{ github.token }} From 95b4a4ee21ae4b64cba11c7cb2a88bdf43084be4 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sun, 20 Dec 2020 19:09:59 -0800 Subject: [PATCH 229/252] Figured out the correct expression variable for repo name --- .github/workflows/maven-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index d0702ab9..9f2988ee 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -26,8 +26,8 @@ jobs: uses: actions/upload-release-asset@v1 with: upload_url: ${{ github.event.release.upload_url }} # how come I found this on the second page of bing results in some guys blog instead of in the documentation, or am I just not looking in the right spots. https://itnext.io/getting-started-with-github-actions-fe94167dbc6d?gi=a7321180760b - asset_path: target/ExtraHardMode.jar - asset_name: ExtraHardMode.jar + asset_path: target/${{ github.event.repository.name }}.jar + asset_name: ${{ github.event.repository.name }}.jar asset_content_type: application/java-archive env: GITHUB_TOKEN: ${{ github.token }} From 2b896f641620ba23e69097cef5e3bb01f0f994d1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 22 Dec 2020 05:16:48 +0000 Subject: [PATCH 230/252] Bump bstats-bukkit from 1.7 to 1.8 Bumps [bstats-bukkit](https://github.com/Bastian/bStats-Metrics) from 1.7 to 1.8. - [Release notes](https://github.com/Bastian/bStats-Metrics/releases) - [Commits](https://github.com/Bastian/bStats-Metrics/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 81e7f0e3..9063088b 100644 --- a/pom.xml +++ b/pom.xml @@ -300,7 +300,7 @@ org.bstats bstats-bukkit - 1.7 + 1.8 compile From 7c88c1814463cf769a281e74456dd4266d05c538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=89=E3=81=9A?= Date: Wed, 20 Jan 2021 02:23:31 +0900 Subject: [PATCH 231/252] use static instead of instance (#227) --- src/main/java/com/extrahardmode/features/AntiGrinder.java | 2 +- src/main/java/com/extrahardmode/features/Water.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index ac97f729..3ae7d40b 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -198,7 +198,7 @@ public boolean onEntityDeath(EntityDeathEvent event) Block block = entity.getLocation().getBlock(); Block underBlock = block.getRelative(BlockFace.DOWN); - BlockFace[] adjacentFaces = blockModule.getHorizontalAdjacentFaces(); + BlockFace[] adjacentFaces = BlockModule.getHorizontalAdjacentFaces(); Block[] adjacentBlocks = new Block[adjacentFaces.length * 2 + 1]; //All Blocks directly surrounding the Monster diff --git a/src/main/java/com/extrahardmode/features/Water.java b/src/main/java/com/extrahardmode/features/Water.java index 9e243d11..23ce111a 100644 --- a/src/main/java/com/extrahardmode/features/Water.java +++ b/src/main/java/com/extrahardmode/features/Water.java @@ -122,7 +122,7 @@ void onPlayerMove(PlayerMoveEvent event) // if no cached value, calculate if (playerData.cachedWeightStatus <= 0) { - playerData.cachedWeightStatus = playerModule.inventoryWeight(player, armorPoints, inventoryPoints, toolPoints); + playerData.cachedWeightStatus = PlayerModule.inventoryWeight(player, armorPoints, inventoryPoints, toolPoints); } // if too heavy let player feel the weight by pulling them down, if in boat can always swim if (playerData.cachedWeightStatus > maxWeight && !player.isInsideVehicle()) @@ -135,7 +135,7 @@ else if (blockWaterElevators && !playerModule.isPlayerOnLadder(player) && !playe { if (playerData.cachedWeightStatus <= 0) { - playerData.cachedWeightStatus = playerModule.inventoryWeight(player, armorPoints, inventoryPoints, toolPoints); + playerData.cachedWeightStatus = PlayerModule.inventoryWeight(player, armorPoints, inventoryPoints, toolPoints); } else if (playerData.cachedWeightStatus > maxWeight) { //Detect waterfalls From 34b704e56f77d34157966c56c33b21c9e6fe1a70 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 17 Mar 2021 04:13:00 +0000 Subject: [PATCH 232/252] Bump git-commit-id-plugin from 4.0.3 to 4.0.4 Bumps git-commit-id-plugin from 4.0.3 to 4.0.4. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9063088b..e405b7bf 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 4.0.3 + 4.0.4 get-the-git-infos From 39d10aff956bc2dd1ebe491932616a5d894ceb71 Mon Sep 17 00:00:00 2001 From: Exusiai <70209532+ExusiaiMoe@users.noreply.github.com> Date: Mon, 19 Apr 2021 01:57:36 +0800 Subject: [PATCH 233/252] Add placeholders for weight (#278) --- pom.xml | 11 +++ .../java/com/extrahardmode/ExtraHardMode.java | 7 ++ .../placeholder/Placeholder.java | 89 +++++++++++++++++++ src/main/resources/plugin.yml | 2 +- 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/extrahardmode/placeholder/Placeholder.java diff --git a/pom.xml b/pom.xml index e405b7bf..d8559e16 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,10 @@ + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + github-releases http://di3mex.github.io/repo_bukkit/releases/ @@ -304,6 +308,13 @@ compile + + me.clip + placeholderapi + 2.10.9 + provided + + diff --git a/src/main/java/com/extrahardmode/ExtraHardMode.java b/src/main/java/com/extrahardmode/ExtraHardMode.java index ed5a5803..aee03dbe 100644 --- a/src/main/java/com/extrahardmode/ExtraHardMode.java +++ b/src/main/java/com/extrahardmode/ExtraHardMode.java @@ -69,6 +69,7 @@ import com.extrahardmode.module.PlayerModule; import com.extrahardmode.module.UtilityModule; import com.extrahardmode.module.temporaryblock.TemporaryBlockHandler; +import com.extrahardmode.placeholder.Placeholder; import com.extrahardmode.service.IModule; import com.extrahardmode.service.OurRandom; import com.extrahardmode.task.MoreMonstersTask; @@ -209,6 +210,12 @@ public void onEnable() */ //Metrics Plotter, this gets included by maven new ConfigPlotter(this, getModuleForClass(RootConfig.class)); + + //Register Placeholder + if(this.getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) + { + new Placeholder(this).register(); + } } public void debug(World world, String message) diff --git a/src/main/java/com/extrahardmode/placeholder/Placeholder.java b/src/main/java/com/extrahardmode/placeholder/Placeholder.java new file mode 100644 index 00000000..bad88552 --- /dev/null +++ b/src/main/java/com/extrahardmode/placeholder/Placeholder.java @@ -0,0 +1,89 @@ +package com.extrahardmode.placeholder; + + +import com.extrahardmode.ExtraHardMode; +import com.extrahardmode.config.RootConfig; +import com.extrahardmode.config.RootNode; +import com.extrahardmode.module.DataStoreModule; +import com.extrahardmode.module.PlayerData; +import com.extrahardmode.module.PlayerModule; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.World; +import org.bukkit.entity.Player; + +public class Placeholder extends PlaceholderExpansion +{ + private ExtraHardMode plugin; + private RootConfig CFG; + + + public Placeholder(ExtraHardMode plugin) + { + this.plugin = plugin; + this.CFG = plugin.getModuleForClass(RootConfig.class); + } + + + @Override + public boolean persist() + { + return true; + } + + + @Override + public boolean canRegister() + { + return true; + } + + + @Override + public String getAuthor() + { + return plugin.getDescription().getAuthors().toString(); + } + + + @Override + public String getIdentifier() + { + return "extrahardmode"; + } + + + @Override + public String getVersion() + { + return plugin.getDescription().getVersion(); + } + + + @Override + public String onPlaceholderRequest(Player player, String identifier) + { + if (player == null) + { + return ""; + } + + if (identifier.equals("weight")) + { + PlayerData playerData = plugin.getModuleForClass(DataStoreModule.class).getPlayerData(player.getName()); + if (playerData.cachedWeightStatus <= 0) + { + World world = player.getWorld(); + float armorPoints = (float) CFG.getDouble(RootNode.NO_SWIMMING_IN_ARMOR_ARMOR_POINTS, world.getName()); + float inventoryPoints = (float) CFG.getDouble(RootNode.NO_SWIMMING_IN_ARMOR_INV_POINTS, world.getName()); + float toolPoints = (float) CFG.getDouble(RootNode.NO_SWIMMING_IN_ARMOR_TOOL_POINTS, world.getName()); + playerData.cachedWeightStatus = PlayerModule.inventoryWeight(player, armorPoints, inventoryPoints, toolPoints); + } + return String.format("%.1f", playerData.cachedWeightStatus); + } else if (identifier.equals("max_weight")) + { + final double maxPoints = CFG.getDouble(RootNode.NO_SWIMMING_IN_ARMOR_MAX_POINTS, player.getWorld().getName()); + return String.format("%.1f", maxPoints); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b56ebe35..606ad9f7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,7 +6,7 @@ dev-url: http://dev.bukkit.org/bukkit-plugins/fun-hard-mode/ author: RoboMWM authors: [Diemex, Big_Scary] #ensure that we are loaded after multiworld plugins -softdepend: [Multiverse-Core, My_Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot] +softdepend: [Multiverse-Core, My_Worlds, MystCraft, Transporter, WorldGuard, Prism, LogBlock, CoreProtect, HawkEye, Crackshot, PlaceholderAPI] api-version: '1.15' commands: ehm: From cb59426d8295c1e998d156f022c278d149243fb0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 10 Jun 2021 04:17:44 +0000 Subject: [PATCH 234/252] Bump git-commit-id-plugin from 4.0.4 to 4.0.5 Bumps git-commit-id-plugin from 4.0.4 to 4.0.5. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d8559e16..942510ba 100644 --- a/pom.xml +++ b/pom.xml @@ -143,7 +143,7 @@ pl.project13.maven git-commit-id-plugin - 4.0.4 + 4.0.5 get-the-git-infos From acc4783e82cc0262491d65673e1437f56bfff961 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 10 Jul 2021 12:58:15 -0700 Subject: [PATCH 235/252] update to 1.17, use jdk 16, close #282 --- appveyor.yml | 2 +- pom.xml | 6 +++--- src/main/java/com/extrahardmode/features/AntiFarming.java | 2 +- src/main/java/com/extrahardmode/features/AntiGrinder.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d057926c..a93d56a8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,7 +3,7 @@ skip_tags: true clone_depth: 10 environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 + - JAVA_HOME: C:\Program Files\Java\jdk1.16.0 branches: only: - master diff --git a/pom.xml b/pom.xml index 942510ba..60b64be7 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.16.1 + 1.17.1 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ @@ -66,8 +66,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 16 + 16 diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index d180aa5f..a787aabe 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -438,7 +438,7 @@ public void run() } /** - * When a player place kelp or seagrass in markd water. + * When a player place kelp or seagrass in marked water. * * @param event Event that occurred. */ diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index 3ae7d40b..10667f19 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -214,9 +214,9 @@ public boolean onEntityDeath(EntityDeathEvent event) for (Block adjacentBlock : adjacentBlocks) { - if (adjacentBlock != null && (adjacentBlock.getType() == Material.WATER)) + if (adjacentBlock != null && adjacentBlock.getType() == Material.WATER && entity.getType() != EntityType.DROWNED) { - plugin.debug(world, event.getEntity().getType().name() + + plugin.debug(world, entity.getType().name() + "'s drops at " + entity.getLocation() + " was cleared (in/near water)"); return clearDrops(event); } From 69de1c93ab6fef41449ec19a3474319b2e995caf Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 17 Jul 2021 09:12:43 -0700 Subject: [PATCH 236/252] fix appveyor build java path syntax is different --- appveyor.yml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index a93d56a8..4ae75c31 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,7 +3,7 @@ skip_tags: true clone_depth: 10 environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.16.0 + - JAVA_HOME: C:\Program Files\Java\jdk16 branches: only: - master diff --git a/pom.xml b/pom.xml index 60b64be7..bdbe7bc4 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.14.2 + 3.15.0 ExtraHardMode New game rules and mechanics for Minecraft. http://dev.bukkit.org/projects/fun-hard-mode From de150e29ec7468fd0907872ac02a9803ec364d50 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 7 Aug 2021 08:05:40 -0700 Subject: [PATCH 237/252] have appveyor use windows server 2019 for jdk 16 --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 4ae75c31..d2f53666 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,7 +9,7 @@ branches: - master except: - gh-pages -os: Windows Server 2012 +os: Windows Server 2019 install: - ps: | Add-Type -AssemblyName System.IO.Compression.FileSystem @@ -32,4 +32,4 @@ cache: - C:\Users\appveyor\.m2 artifacts: - path: target/ExtraHardMode.jar - name: ExtraHardMode \ No newline at end of file + name: ExtraHardMode From 1e46c444bc802c48fb1c9308471183f5b92ae064 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 7 Aug 2021 08:08:22 -0700 Subject: [PATCH 238/252] try `image` instead of `os` --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d2f53666..56a09655 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,7 +9,7 @@ branches: - master except: - gh-pages -os: Windows Server 2019 +image: Visual Studio 2019 install: - ps: | Add-Type -AssemblyName System.IO.Compression.FileSystem From 2dc3237f4d31d7650349bd820ee88f929d14535b Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 7 Aug 2021 08:10:54 -0700 Subject: [PATCH 239/252] remove install scripts maven is already present on VM --- appveyor.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 56a09655..625cf956 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,9 +1,6 @@ version: '{build}' skip_tags: true clone_depth: 10 -environment: - matrix: - - JAVA_HOME: C:\Program Files\Java\jdk16 branches: only: - master @@ -11,16 +8,6 @@ branches: - gh-pages image: Visual Studio 2019 install: -- ps: | - Add-Type -AssemblyName System.IO.Compression.FileSystem - if (!(Test-Path -Path "C:\maven" )) { - (new-object System.Net.WebClient).DownloadFile('http://www.us.apache.org/dist/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.zip', 'C:\maven-bin.zip') - [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\maven-bin.zip", "C:\maven") - } -- cmd: SET PATH=C:\maven\apache-maven-3.2.5\bin;%JAVA_HOME%\bin;%PATH:C:\Ruby193\bin;=% -- cmd: SET MAVEN_OPTS=-XX:MaxPermSize=2g -Xmx4g -- cmd: SET JAVA_OPTS=-XX:MaxPermSize=2g -Xmx4g -- cmd: SET M2_HOME=C:\maven\apache-maven-3.2.5 - cmd: mvn --version - cmd: java -version build_script: From 89b8de41f873e6a0f760f1fed437a8b912accb08 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Sat, 7 Aug 2021 08:13:54 -0700 Subject: [PATCH 240/252] revert all appveyor changes Idk who's brilliant idea in the maven team decided to do http blocking and all --- appveyor.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 625cf956..fdf4c7cb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,13 +1,26 @@ version: '{build}' skip_tags: true clone_depth: 10 +environment: + matrix: + - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 branches: only: - master except: - gh-pages -image: Visual Studio 2019 +os: Windows Server 2012 install: +- ps: | + Add-Type -AssemblyName System.IO.Compression.FileSystem + if (!(Test-Path -Path "C:\maven" )) { + (new-object System.Net.WebClient).DownloadFile('http://www.us.apache.org/dist/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.zip', 'C:\maven-bin.zip') + [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\maven-bin.zip", "C:\maven") + } +- cmd: SET PATH=C:\maven\apache-maven-3.2.5\bin;%JAVA_HOME%\bin;%PATH:C:\Ruby193\bin;=% +- cmd: SET MAVEN_OPTS=-XX:MaxPermSize=2g -Xmx4g +- cmd: SET JAVA_OPTS=-XX:MaxPermSize=2g -Xmx4g +- cmd: SET M2_HOME=C:\maven\apache-maven-3.2.5 - cmd: mvn --version - cmd: java -version build_script: From bc0aa04979386bd8bf7603fdd1acf7c8bb6db251 Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 9 Aug 2021 08:31:14 -0700 Subject: [PATCH 241/252] revert to building with jdk 8 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bdbe7bc4..b0ef0929 100644 --- a/pom.xml +++ b/pom.xml @@ -66,8 +66,8 @@ maven-compiler-plugin 3.8.1 - 16 - 16 + 8 + 8 From 6ff295d63e02d5aae5d39d5813ed67e0afb586ed Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 6 Oct 2021 19:16:50 -0700 Subject: [PATCH 242/252] kickoff ci build --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index fdf4c7cb..00cd54c4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: '{build}' skip_tags: true -clone_depth: 10 +clone_depth: 2 environment: matrix: - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 From a64e83855abb29852c5bb6df326ba3180ce7c591 Mon Sep 17 00:00:00 2001 From: GiorgioBrux <18328525+GiorgioBrux@users.noreply.github.com> Date: Fri, 10 Dec 2021 22:11:06 +0100 Subject: [PATCH 243/252] appveyor to java17 (#297) --- appveyor.yml | 18 ++++-------------- jitpack.yml | 3 +++ pom.xml | 6 +++--- 3 files changed, 10 insertions(+), 17 deletions(-) create mode 100644 jitpack.yml diff --git a/appveyor.yml b/appveyor.yml index 00cd54c4..9c6fa67e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,24 +3,15 @@ skip_tags: true clone_depth: 2 environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 + - appveyor_build_worker_image: Visual Studio 2022 + JAVA_HOME: C:\Program Files\Java\jdk17 branches: only: - master - except: - - gh-pages os: Windows Server 2012 install: -- ps: | - Add-Type -AssemblyName System.IO.Compression.FileSystem - if (!(Test-Path -Path "C:\maven" )) { - (new-object System.Net.WebClient).DownloadFile('http://www.us.apache.org/dist/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.zip', 'C:\maven-bin.zip') - [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\maven-bin.zip", "C:\maven") - } -- cmd: SET PATH=C:\maven\apache-maven-3.2.5\bin;%JAVA_HOME%\bin;%PATH:C:\Ruby193\bin;=% -- cmd: SET MAVEN_OPTS=-XX:MaxPermSize=2g -Xmx4g -- cmd: SET JAVA_OPTS=-XX:MaxPermSize=2g -Xmx4g -- cmd: SET M2_HOME=C:\maven\apache-maven-3.2.5 +- cmd: SET MAVEN_OPTS=-Xmx4g +- cmd: SET JAVA_OPTS=-Xmx4g - cmd: mvn --version - cmd: java -version build_script: @@ -28,7 +19,6 @@ build_script: test_script: - mvn clean install --batch-mode -Pqulice cache: -- C:\maven\ - C:\Users\appveyor\.m2 artifacts: - path: target/ExtraHardMode.jar diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 00000000..12db4bdd --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,3 @@ +before_install: + - sdk install java 17.0.1-open + - sdk use java 17.0.1-open \ No newline at end of file diff --git a/pom.xml b/pom.xml index b0ef0929..2e407d11 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ com.extrahardmode.ExtraHardMode ${project.build.outputDirectory} - 1.17.1 + 1.18 R0.1-SNAPSHOT ${basedir}/src/test/ ${basedir}/src/main/java/ @@ -66,8 +66,8 @@ maven-compiler-plugin 3.8.1 - 8 - 8 + 17 + 17 From 6bb6ff43914302120a3dd1c74c30e55a11696cd7 Mon Sep 17 00:00:00 2001 From: GiorgioBrux <18328525+GiorgioBrux@users.noreply.github.com> Date: Fri, 10 Dec 2021 23:02:13 +0100 Subject: [PATCH 244/252] Fix Java17 Specific issues and remove DESERT_HILLS (#296) --- pom.xml | 45 ++++++++++++------- .../extrahardmode/features/AntiFarming.java | 2 +- .../com/extrahardmode/features/Tutorial.java | 1 - .../com/extrahardmode/module/BlockModule.java | 2 +- .../com/extrahardmode/mocks/MockBlock.java | 2 +- .../service/TestMultiWorldConfig.java | 2 + 6 files changed, 35 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 2e407d11..6bc8b76c 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 3.15.0 ExtraHardMode New game rules and mechanics for Minecraft. - http://dev.bukkit.org/projects/fun-hard-mode + https://dev.bukkit.org/projects/fun-hard-mode @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.3.0-SNAPSHOT true false @@ -155,6 +155,14 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED + + @@ -166,11 +174,11 @@ github-releases - http://di3mex.github.io/repo_bukkit/releases/ + https://di3mex.github.io/repo_bukkit/releases/ github-snapshots - http://di3mex.github.io/repo_bukkit/snapshots/ + https://di3mex.github.io/repo_bukkit/snapshots/ @@ -178,21 +186,21 @@ md_5-releases - http://repo.md-5.net/content/repositories/releases/ + https://repo.md-5.net/content/repositories/releases/ md_5-snapshots - http://repo.md-5.net/content/repositories/snapshots/ + https://repo.md-5.net/content/repositories/snapshots/ spigot-repo - http://hub.spigotmc.org/nexus/content/repositories/snapshots/ + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ sk89q-repo - http://maven.sk89q.com/repo/ + https://maven.sk89q.com/repo/ jitpack.io @@ -208,6 +216,13 @@ --> + + + apache.snapshots + https://repository.apache.org/snapshots/ + + + @@ -236,33 +251,33 @@ junit junit - 4.11 + 4.13.2 test org.mockito - mockito-all - 1.9.5 + mockito-core + 4.1.0 test org.powermock - powermock-api-mockito - 1.5 + powermock-api-mockito2 + 2.0.9 test org.powermock powermock-core - 1.5 + 2.0.9 test org.powermock powermock-module-junit4 - 1.5 + 2.0.9 test diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index a787aabe..5c3f7d2e 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -210,7 +210,7 @@ public void onStructureGrow(StructureGrowEvent event) if (aridDesertsEnabled) { Biome biome = block.getBiome(); - if (biome == Biome.DESERT || biome == Biome.DESERT_HILLS) + if (biome == Biome.DESERT) { event.setCancelled(true); } diff --git a/src/main/java/com/extrahardmode/features/Tutorial.java b/src/main/java/com/extrahardmode/features/Tutorial.java index 843beb3b..e44dbe2f 100644 --- a/src/main/java/com/extrahardmode/features/Tutorial.java +++ b/src/main/java/com/extrahardmode/features/Tutorial.java @@ -267,7 +267,6 @@ public void onBlockPlace(BlockPlaceEvent event) switch (block.getBiome()) { case DESERT: - case DESERT_HILLS: { messenger.send(player, MessageNode.ANTIFARMING_DESSERT_WARNING); break; diff --git a/src/main/java/com/extrahardmode/module/BlockModule.java b/src/main/java/com/extrahardmode/module/BlockModule.java index 64010ce1..a152d99c 100644 --- a/src/main/java/com/extrahardmode/module/BlockModule.java +++ b/src/main/java/com/extrahardmode/module/BlockModule.java @@ -239,7 +239,7 @@ public boolean plantDies(Block block, MaterialData newDataValue) Biome biome = block.getBiome(); // the desert environment is very rough on crops - if ((biome == Biome.DESERT || biome == Biome.DESERT_HILLS) && aridDesertsEnabled) + if ((biome == Biome.DESERT) && aridDesertsEnabled) { deathProbability += 50; } diff --git a/src/test/com/extrahardmode/mocks/MockBlock.java b/src/test/com/extrahardmode/mocks/MockBlock.java index f9dce09f..098fead1 100644 --- a/src/test/com/extrahardmode/mocks/MockBlock.java +++ b/src/test/com/extrahardmode/mocks/MockBlock.java @@ -27,7 +27,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/src/test/com/extrahardmode/service/TestMultiWorldConfig.java b/src/test/com/extrahardmode/service/TestMultiWorldConfig.java index de74294d..51f5344d 100644 --- a/src/test/com/extrahardmode/service/TestMultiWorldConfig.java +++ b/src/test/com/extrahardmode/service/TestMultiWorldConfig.java @@ -31,6 +31,7 @@ import org.bukkit.plugin.PluginLogger; import org.bukkit.plugin.java.JavaPlugin; import org.junit.Before; +import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @@ -86,6 +87,7 @@ public void closing() @Before + @Test public void prepare() { //normal values From e9c12af95997d4a78abc5a326feba093aa609a6c Mon Sep 17 00:00:00 2001 From: Alex <637714+alexchandel@users.noreply.github.com> Date: Mon, 13 Dec 2021 21:32:36 -0600 Subject: [PATCH 245/252] Remove Biome.SWAMP_HILLS (#292) --- .../java/com/extrahardmode/features/monsters/CaveSpider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java b/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java index 506fc432..0cfae62e 100644 --- a/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java +++ b/src/main/java/com/extrahardmode/features/monsters/CaveSpider.java @@ -61,7 +61,6 @@ public void onEntitySpawn(CreatureSpawnEvent event) if (entityType == EntityType.SPIDER && world.getEnvironment() == World.Environment.NORMAL && entity.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.GRASS && entity.getLocation().getBlock().getBiome() == Biome.SWAMP - || entity.getLocation().getBlock().getBiome() == Biome.SWAMP_HILLS && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL) { if (plugin.random(cavespiderSpawnPercent)) From 56bb52ab3351798ddd9ed51e1c060845d634a7d1 Mon Sep 17 00:00:00 2001 From: GiorgioBrux <18328525+GiorgioBrux@users.noreply.github.com> Date: Wed, 5 Jan 2022 06:17:12 +0100 Subject: [PATCH 246/252] Change min height from 0 to -64 (#302) --- src/main/java/com/extrahardmode/features/monsters/Spiders.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/monsters/Spiders.java b/src/main/java/com/extrahardmode/features/monsters/Spiders.java index 8004ca42..2cf1ef26 100644 --- a/src/main/java/com/extrahardmode/features/monsters/Spiders.java +++ b/src/main/java/com/extrahardmode/features/monsters/Spiders.java @@ -141,7 +141,7 @@ public void onEntityDeath(EntityDeathEvent event) continue; // only place web on the ground, not hanging up in the air - for (int i = 0; i < 5 || block.getY() < 0; i++) + for (int i = 0; i < 5 || block.getY() < -64; i++) { if (block.getRelative(BlockFace.DOWN).getType() == Material.AIR) block = block.getRelative(BlockFace.DOWN); From e4f17b107651b0765f9a75a39399637c36ffd38c Mon Sep 17 00:00:00 2001 From: GiorgioBrux <18328525+GiorgioBrux@users.noreply.github.com> Date: Sun, 3 Apr 2022 10:29:44 +0200 Subject: [PATCH 247/252] Make scoreboard wider (#293) --- .../java/de/diemex/scoreboardnotifier/NotificationHolder.java | 2 +- .../java/de/diemex/scoreboardnotifier/message/StringUtil.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/diemex/scoreboardnotifier/NotificationHolder.java b/src/main/java/de/diemex/scoreboardnotifier/NotificationHolder.java index 06738370..89598633 100644 --- a/src/main/java/de/diemex/scoreboardnotifier/NotificationHolder.java +++ b/src/main/java/de/diemex/scoreboardnotifier/NotificationHolder.java @@ -72,7 +72,7 @@ public NotificationHolder(MsgSettings type, String title, List ms { if (sb.length() != 0) sb.append(" "); - Validate.isTrue(line.length() <= 16, "Scoreboards have a max of 16 characters per line. Given line was " + line.length() + " long. Content: \"" + line + "\""); + Validate.isTrue(line.length() <= 40, "Scoreboards have a max of 40 characters per line. Given line was " + line.length() + " long. Content: \"" + line + "\""); sb.append(line); } this.msgText = sb.toString(); diff --git a/src/main/java/de/diemex/scoreboardnotifier/message/StringUtil.java b/src/main/java/de/diemex/scoreboardnotifier/message/StringUtil.java index beddaf63..c589ef60 100644 --- a/src/main/java/de/diemex/scoreboardnotifier/message/StringUtil.java +++ b/src/main/java/de/diemex/scoreboardnotifier/message/StringUtil.java @@ -65,7 +65,7 @@ public static List getLines(String message, ChatColor lineColor, MsgLineHolder line = new MsgLineHolder(); int offset = 0; - int maxLineLength = lineColor != null ? 14 : 16; //Reserve 2 chars for the color code + int maxLineLength = lineColor != null ? 38 : 40; //Reserve 2 chars for the color code //Append every word to a line for (int i = 0; i < words.length; i++) { From 4fadc2b5f54c897a77c19a45de08bc246a339a73 Mon Sep 17 00:00:00 2001 From: evan Date: Fri, 18 Nov 2022 13:28:18 -0600 Subject: [PATCH 248/252] remove non-void EventHandlers (#316) * build: update EngineHub repository * build: update maven-shade-plugin to 3.3.0 * refactor: remove non-void EventHandlers --- pom.xml | 6 +++--- .../extrahardmode/features/AntiGrinder.java | 19 ++++++++++++------- .../features/TestAntiGrinder.java | 12 ++++++------ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 6bc8b76c..04c781e9 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.3.0-SNAPSHOT + 3.3.0 true false @@ -199,8 +199,8 @@ - sk89q-repo - https://maven.sk89q.com/repo/ + enginehub-repo + https://maven.enginehub.org/repo/ jitpack.io diff --git a/src/main/java/com/extrahardmode/features/AntiGrinder.java b/src/main/java/com/extrahardmode/features/AntiGrinder.java index 10667f19..8e440437 100644 --- a/src/main/java/com/extrahardmode/features/AntiGrinder.java +++ b/src/main/java/com/extrahardmode/features/AntiGrinder.java @@ -82,13 +82,22 @@ public void starting() } + @EventHandler(priority = EventPriority.LOW) + public void onEntitySpawn(CreatureSpawnEvent event) { + event.setCancelled(!handleEntitySpawn(event)); + } + + @EventHandler + public void onEntityDeath(EntityDeathEvent event) { + handleEntityDeath(event); + } + /** * When an Animal/Monster spawns check if the Location is "natural" * * @return true succeeded and false if cancelled or marked lootless */ - @EventHandler(priority = EventPriority.LOW) - public boolean onEntitySpawn(CreatureSpawnEvent event) + public boolean handleEntitySpawn(CreatureSpawnEvent event) { Location location = event.getLocation(); World world = location.getWorld(); @@ -120,21 +129,18 @@ public boolean onEntitySpawn(CreatureSpawnEvent event) case NORMAL: if (!blockModule.isNaturalSpawnMaterial(underBlockType)) { - event.setCancelled(true); return false; } break; case NETHER: if (!blockModule.isNaturalNetherSpawn(underBlockType)) { - event.setCancelled(true); return false; } break; case THE_END: if (underBlockType != Material.END_STONE && underBlockType != Material.OBSIDIAN && underBlockType != Material.AIR/*dragon*/) { - event.setCancelled(true); return false; } break; @@ -153,8 +159,7 @@ public boolean onEntitySpawn(CreatureSpawnEvent event) * * @return true if drops loot, false if loot was blocked */ - @EventHandler - public boolean onEntityDeath(EntityDeathEvent event) + public boolean handleEntityDeath(EntityDeathEvent event) { LivingEntity entity = event.getEntity(); World world = entity.getWorld(); diff --git a/src/test/com/extrahardmode/features/TestAntiGrinder.java b/src/test/com/extrahardmode/features/TestAntiGrinder.java index 615811f5..1df0c562 100644 --- a/src/test/com/extrahardmode/features/TestAntiGrinder.java +++ b/src/test/com/extrahardmode/features/TestAntiGrinder.java @@ -63,10 +63,10 @@ public void prepare() public void spawnerSpawns() { CreatureSpawnEvent event = new MockCreatureSpawnEvent(EntityType.BLAZE, "world", CreatureSpawnEvent.SpawnReason.SPAWNER).get(); - assertFalse("Spawners should drop no exp", module.onEntitySpawn(event)); + assertFalse("Spawners should drop no exp", module.handleEntitySpawn(event)); event = new MockCreatureSpawnEvent(EntityType.ENDERMAN, "world", CreatureSpawnEvent.SpawnReason.SPAWNER).get(); - assertFalse("Spawners should drop no exp", module.onEntitySpawn(event)); + assertFalse("Spawners should drop no exp", module.handleEntitySpawn(event)); } @@ -92,7 +92,7 @@ public void zombieSpawns() MockWorld world = event.getWorld(); world.setEnvironment(World.Environment.NORMAL); - assertTrue("Zombie spawn succeeds", module.onEntitySpawn(event.get())); + assertTrue("Zombie spawn succeeds", module.handleEntitySpawn(event.get())); } @@ -118,7 +118,7 @@ public void naturalSpawns() MockWorld world = event.getWorld(); world.setEnvironment(World.Environment.NETHER); - assertTrue("Natural spawn in the Nether failed", module.onEntitySpawn(event.get())); + assertTrue("Natural spawn in the Nether failed", module.handleEntitySpawn(event.get())); world.setEnvironment(World.Environment.NETHER); @@ -127,7 +127,7 @@ public void naturalSpawns() relative.setMaterial(Material.COBBLESTONE); block.setRelative(BlockFace.DOWN, relative.get()); - assertFalse("Natural spawn in a not natural Location succeeded", module.onEntitySpawn(event.get())); + assertFalse("Natural spawn in a not natural Location succeeded", module.handleEntitySpawn(event.get())); //NetherRack doesn't spawn in the OverWorld @@ -136,6 +136,6 @@ public void naturalSpawns() world.setEnvironment(World.Environment.NORMAL); - assertFalse("Spawn on NetherRack in the OverWorld should have failed", module.onEntitySpawn(event.get())); + assertFalse("Spawn on NetherRack in the OverWorld should have failed", module.handleEntitySpawn(event.get())); } } From a486109b7d826047ed17de52064b35b92148dd1b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 26 Mar 2023 09:10:57 -0700 Subject: [PATCH 249/252] Upgrade to GitHub-native Dependabot (#279) Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- .github/dependabot.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..efa2ab54 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,33 @@ +version: 2 +updates: +- package-ecosystem: maven + directory: "/" + schedule: + interval: daily + time: "21:00" + timezone: America/Los_Angeles + pull-request-branch-name: + separator: "-" + open-pull-requests-limit: 10 + ignore: + - dependency-name: de.diddiz:logblock + versions: + - "> 1.8" + - dependency-name: junit:junit + versions: + - "> 4.11" + - dependency-name: org.mockito:mockito-all + versions: + - "> 1.9.5" + - dependency-name: org.powermock:powermock-api-mockito + versions: + - "> 1.5" + - dependency-name: org.powermock:powermock-core + versions: + - "> 1.5" + - dependency-name: org.powermock:powermock-module-junit4 + versions: + - "> 1.5" + - dependency-name: org.bstats:bstats-bukkit + versions: + - 2.1.0 From c1a56d85edf1e9c2fe66ffe21f0f66bc7bdd591a Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Mon, 15 May 2023 20:29:07 -0700 Subject: [PATCH 250/252] beta release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04c781e9..a5cc5eff 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.extrahardmode ExtraHardMode - 3.15.0 + 3.15.1-beta ExtraHardMode New game rules and mechanics for Minecraft. https://dev.bukkit.org/projects/fun-hard-mode From 720c392173be35eae8b6b4347f8267986f8ce1ff Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Wed, 17 Jul 2024 00:10:29 -0700 Subject: [PATCH 251/252] change dependencies to other repos instead of relying on now-defunct github-hosted repo Also removed hawkeye dependency, seemed to be unused --- pom.xml | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index a5cc5eff..0a535bff 100644 --- a/pom.xml +++ b/pom.xml @@ -173,13 +173,17 @@ https://repo.extendedclip.com/content/repositories/placeholderapi/ - github-releases - https://di3mex.github.io/repo_bukkit/releases/ - - - github-snapshots - https://di3mex.github.io/repo_bukkit/snapshots/ + playpro-repo + https://maven.playpro.com + + + + + + + + @@ -210,6 +214,14 @@ CodeMC https://repo.codemc.org/repository/maven-public/ + + Lumine + https://mvn.lumine.io/repository/maven-public/ + + + Comphenix + https://repo.comphenix.net/content/groups/public/ + - net.coreprotect.CoreProtect - CoreProtect - 2.0.8 + net.coreprotect + coreprotect + 22.4 + provided de.diddiz logblock - 1.8 - - - - uk.co.oliwali - HawkEye - 1.6.0 + 1.94 From fcc15eee0502d8a94506fb69228fdd4ce14f85bd Mon Sep 17 00:00:00 2001 From: RoboMWM Date: Thu, 5 Sep 2024 19:33:51 -0700 Subject: [PATCH 252/252] add debugging for #326 --- .../java/com/extrahardmode/features/AntiFarming.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extrahardmode/features/AntiFarming.java b/src/main/java/com/extrahardmode/features/AntiFarming.java index 5c3f7d2e..5d1b1237 100644 --- a/src/main/java/com/extrahardmode/features/AntiFarming.java +++ b/src/main/java/com/extrahardmode/features/AntiFarming.java @@ -52,6 +52,7 @@ import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; +import org.bukkit.material.MaterialData; /** * Antifarming module @@ -181,7 +182,14 @@ public void onBlockGrow(BlockGrowEvent event) final boolean weakCropsEnabled = CFG.getBoolean(RootNode.WEAK_FOOD_CROPS, world.getName()); // FEATURE: - if (weakCropsEnabled && plugin.getModuleForClass(BlockModule.class).plantDies(event.getBlock(), event.getNewState().getData())) + if (!weakCropsEnabled) + return; + + Block block = event.getBlock(); + plugin.debug(block.getWorld(), "BlockGrowEvent block material: " + block.getType().name() + ", location: " + block.getLocation()); + MaterialData newStateData = event.getNewState().getData(); + plugin.debug(block.getWorld(), "Successfully retrieved getNewState#getData"); + if (weakCropsEnabled && plugin.getModuleForClass(BlockModule.class).plantDies(block, newStateData)) { event.setCancelled(true); //shrub gets removed on farmland