From 40af51fc05063551d419541977675035873662c3 Mon Sep 17 00:00:00 2001 From: NuclearW Date: Wed, 15 Feb 2012 16:57:48 -0500 Subject: [PATCH] Re-added event calling Re-added other dealDamage methods Added FakeEntityDamageByEntityEvent for us to filter our own mess out, this was the issue with Skull Splitter and Serrated Strikes earlier (a loop) Moved FakeBlockBreakEvent to be with other events Added configuration option to control event calling Learned how to changelog Broke those cuffs --- Changelog.txt | 3 + src/main/java/com/gmail/nossr50/Combat.java | 60 +++++++++++++++++-- .../gmail/nossr50/config/LoadProperties.java | 3 +- .../FakeBlockBreakEvent.java | 56 ++++++++--------- .../events/FakeEntityDamageByEntityEvent.java | 11 ++++ .../nossr50/listeners/mcBlockListener.java | 2 +- src/main/java/com/gmail/nossr50/m.java | 2 +- .../java/com/gmail/nossr50/skills/Axes.java | 4 +- .../java/com/gmail/nossr50/skills/Swords.java | 4 +- src/main/resources/config.yml | 2 + 10 files changed, 106 insertions(+), 41 deletions(-) rename src/main/java/com/gmail/nossr50/{datatypes => events}/FakeBlockBreakEvent.java (93%) create mode 100644 src/main/java/com/gmail/nossr50/events/FakeEntityDamageByEntityEvent.java diff --git a/Changelog.txt b/Changelog.txt index bf0c121bc..1d9770bed 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,9 @@ Changelog: #Versions without changelogs probably had very small misc fixes, like tweaks to the source code Version 2.0-dev - Fixed /mcability not respecting permissions + - Changed to use Bukkit's built-in ignoreCancelledEvents system + - Re-added mcMMO reporting damage events + - Added configuration option to control mcMMO reporting damage events Version 1.2.12 - Fixed issue that caused terrible MySQL performance and negative XP on levelup (Issue #134) diff --git a/src/main/java/com/gmail/nossr50/Combat.java b/src/main/java/com/gmail/nossr50/Combat.java index 5266690e4..d034c26ed 100644 --- a/src/main/java/com/gmail/nossr50/Combat.java +++ b/src/main/java/com/gmail/nossr50/Combat.java @@ -16,6 +16,7 @@ */ package com.gmail.nossr50; +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -26,6 +27,7 @@ import org.bukkit.plugin.Plugin; import com.gmail.nossr50.config.LoadProperties; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; +import com.gmail.nossr50.events.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.locale.mcLocale; import com.gmail.nossr50.party.Party; import com.gmail.nossr50.skills.Acrobatics; @@ -87,10 +89,12 @@ public class Combat event.setDamage(event.getDamage() + (event.getDamage() / 2)); //Handle Ability Interactions - if(PPa.getSkullSplitterMode() && m.isAxes(attacker.getItemInHand())) - Axes.applyAoeDamage(attacker, eventb, pluginx); - if(PPa.getSerratedStrikesMode() && m.isSwords(attacker.getItemInHand())) - Swords.applySerratedStrikes(attacker, eventb, pluginx); + if(!(event instanceof FakeEntityDamageByEntityEvent)) { + if(PPa.getSkullSplitterMode() && m.isAxes(attacker.getItemInHand())) + Axes.applyAoeDamage(attacker, eventb, pluginx); + if(PPa.getSerratedStrikesMode() && m.isSwords(attacker.getItemInHand())) + Swords.applySerratedStrikes(attacker, eventb, pluginx); + } //Experience if(event.getEntity() instanceof Player) @@ -358,8 +362,52 @@ public class Combat } } - public static void dealDamage(LivingEntity target, int dmg) { - target.damage(dmg); + /** + * Attempt to damage target for value dmg with reason CUSTOM + * + * @param target LivingEntity which to attempt to damage + * @param dmg Amount of damage to attempt to do + */ + public static void dealDamage(LivingEntity target, int dmg){ + dealDamage(target, dmg, EntityDamageEvent.DamageCause.CUSTOM); + } + + /** + * Attempt to damage target for value dmg with reason cause + * + * @param target LivingEntity which to attempt to damage + * @param dmg Amount of damage to attempt to do + * @param cause DamageCause to pass to damage event + */ + public static void dealDamage(LivingEntity target, int dmg, DamageCause cause) { + if(LoadProperties.eventCallback) { + EntityDamageEvent ede = new EntityDamageEvent(target, cause, dmg); + Bukkit.getPluginManager().callEvent(ede); + if(ede.isCancelled()) return; + + target.damage(ede.getDamage()); + } else { + target.damage(dmg); + } + } + + /** + * Attempt to damage target for value dmg with reason ENTITY_ATTACK with damager attacker + * + * @param target LivingEntity which to attempt to damage + * @param dmg Amount of damage to attempt to do + * @param attacker Player to pass to event as damager + */ + public static void dealDamage(LivingEntity target, int dmg, Player attacker) { + if(LoadProperties.eventCallback) { + EntityDamageEvent ede = (EntityDamageByEntityEvent) new FakeEntityDamageByEntityEvent(attacker, target, EntityDamageEvent.DamageCause.ENTITY_ATTACK, dmg); + Bukkit.getPluginManager().callEvent(ede); + if(ede.isCancelled()) return; + + target.damage(ede.getDamage()); + } else { + target.damage(dmg); + } } public static boolean pvpAllowed(EntityDamageByEntityEvent event, World world) diff --git a/src/main/java/com/gmail/nossr50/config/LoadProperties.java b/src/main/java/com/gmail/nossr50/config/LoadProperties.java index 3fa3b9c42..7fd941164 100644 --- a/src/main/java/com/gmail/nossr50/config/LoadProperties.java +++ b/src/main/java/com/gmail/nossr50/config/LoadProperties.java @@ -43,7 +43,7 @@ public class LoadProperties { diamondArmor, woodenTools, stoneTools, ironTools, goldTools, diamondTools, enderPearl, blazeRod, records, glowstoneDust, fishingDiamonds, aDisplayNames, pDisplayNames, enableSmoothToMossy, - enableDirtToGrass, statsTracking; + enableDirtToGrass, statsTracking, eventCallback; public static String MySQLtablePrefix, MySQLuserName, MySQLserverName, MySQLdbName, MySQLdbPass, nWood, nStone, @@ -299,6 +299,7 @@ public class LoadProperties { enableRegen = readBoolean("General.HP_Regeneration.Enabled", true); saveInterval = readInteger("General.Save_Interval", 10); statsTracking = readBoolean("General.Stats_Tracking", true); + eventCallback = readBoolean("General.Event_Callback", true); enableCobbleToMossy = readBoolean("Skills.Herbalism.Green_Thumb.Cobble_To_Mossy", true); enableSmoothToMossy = readBoolean("Skills.Herbalism.Green_Thumb.SmoothBrick_To_MossyBrick", true); diff --git a/src/main/java/com/gmail/nossr50/datatypes/FakeBlockBreakEvent.java b/src/main/java/com/gmail/nossr50/events/FakeBlockBreakEvent.java similarity index 93% rename from src/main/java/com/gmail/nossr50/datatypes/FakeBlockBreakEvent.java rename to src/main/java/com/gmail/nossr50/events/FakeBlockBreakEvent.java index d9d4595b0..f1e44f8ce 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/FakeBlockBreakEvent.java +++ b/src/main/java/com/gmail/nossr50/events/FakeBlockBreakEvent.java @@ -1,29 +1,29 @@ -/* - This file is part of mcMMO. - - mcMMO is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - mcMMO is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with mcMMO. If not, see . -*/ -package com.gmail.nossr50.datatypes; - -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; - -public class FakeBlockBreakEvent extends BlockBreakEvent { - private static final long serialVersionUID = 1L; - - public FakeBlockBreakEvent(Block theBlock, Player player) { - super(theBlock, player); - } +/* + This file is part of mcMMO. + + mcMMO is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + mcMMO is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with mcMMO. If not, see . +*/ +package com.gmail.nossr50.events; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; + +public class FakeBlockBreakEvent extends BlockBreakEvent { + private static final long serialVersionUID = 1L; + + public FakeBlockBreakEvent(Block theBlock, Player player) { + super(theBlock, player); + } } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/events/FakeEntityDamageByEntityEvent.java b/src/main/java/com/gmail/nossr50/events/FakeEntityDamageByEntityEvent.java new file mode 100644 index 000000000..8ff2fb292 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/FakeEntityDamageByEntityEvent.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.events; + +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +@SuppressWarnings("serial") +public class FakeEntityDamageByEntityEvent extends EntityDamageByEntityEvent { + public FakeEntityDamageByEntityEvent(Entity damager, Entity damagee, DamageCause cause, int damage) { + super(damager, damagee, cause, damage); + } +} diff --git a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java index 9fc1f111a..e3805ede1 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java @@ -47,7 +47,7 @@ import org.getspout.spoutapi.sound.SoundEffect; import com.gmail.nossr50.locale.mcLocale; import com.gmail.nossr50.skills.*; -import com.gmail.nossr50.datatypes.FakeBlockBreakEvent; +import com.gmail.nossr50.events.FakeBlockBreakEvent; public class mcBlockListener implements Listener { diff --git a/src/main/java/com/gmail/nossr50/m.java b/src/main/java/com/gmail/nossr50/m.java index 93097f06c..133672f48 100644 --- a/src/main/java/com/gmail/nossr50/m.java +++ b/src/main/java/com/gmail/nossr50/m.java @@ -29,8 +29,8 @@ import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; import com.gmail.nossr50.config.*; import com.gmail.nossr50.datatypes.PlayerProfile; -import com.gmail.nossr50.datatypes.FakeBlockBreakEvent; import com.gmail.nossr50.datatypes.SkillType; +import com.gmail.nossr50.events.FakeBlockBreakEvent; import com.gmail.nossr50.events.McMMOItemSpawnEvent; public class m diff --git a/src/main/java/com/gmail/nossr50/skills/Axes.java b/src/main/java/com/gmail/nossr50/skills/Axes.java index c15f2236b..c189db207 100644 --- a/src/main/java/com/gmail/nossr50/skills/Axes.java +++ b/src/main/java/com/gmail/nossr50/skills/Axes.java @@ -164,7 +164,7 @@ public class Axes { if(targets >= 1 && derp.getWorld().getPVP()) { - Combat.dealDamage(target, dmgAmount); + Combat.dealDamage(target, dmgAmount, attacker); target.sendMessage(ChatColor.DARK_RED+"Struck by CLEAVE!"); targets--; continue; @@ -174,7 +174,7 @@ public class Axes { else { LivingEntity target = (LivingEntity)derp; - Combat.dealDamage(target, dmgAmount); + Combat.dealDamage(target, dmgAmount, attacker); targets--; } } diff --git a/src/main/java/com/gmail/nossr50/skills/Swords.java b/src/main/java/com/gmail/nossr50/skills/Swords.java index c3065e94e..dc025f881 100644 --- a/src/main/java/com/gmail/nossr50/skills/Swords.java +++ b/src/main/java/com/gmail/nossr50/skills/Swords.java @@ -152,7 +152,7 @@ public class Swords continue; if(targets >= 1 && derp.getWorld().getPVP()) { - Combat.dealDamage(target, dmgAmount); + Combat.dealDamage(target, dmgAmount, attacker); target.sendMessage(ChatColor.DARK_RED+"Struck by Serrated Strikes!"); Users.getProfile(target).addBleedTicks(5); targets--; @@ -165,7 +165,7 @@ public class Swords pluginx.misc.addToBleedQue((LivingEntity)derp); LivingEntity target = (LivingEntity)derp; - Combat.dealDamage(target, dmgAmount); + Combat.dealDamage(target, dmgAmount, attacker); targets--; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 320ccd371..1cb6de2b2 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -265,6 +265,8 @@ General: Save_Interval: 10 #Allow mcMMO to report on basic anonymous usage Stats_Tracking: true + #Allow mcMMO to inform other plugins of damage being dealt + Event_Callback: true Excavation: Drops: Cake: true