Fixed DoubleDrops for Mining, MANY nerfs to Rupture (PVP balance tweaks coming soon)

This commit is contained in:
nossr50 2019-03-23 22:57:44 -07:00
parent b68bbad766
commit aa25ba6338
9 changed files with 165 additions and 23 deletions

View File

@ -9,6 +9,17 @@ Key:
Version 2.1.23 Version 2.1.23
Fixed a bug with Double Drops for Mining Fixed a bug with Double Drops for Mining
Fixed a bug where killing entities with Rupture would not properly credit you as the killer
Fixed a bug where Serrated Strikes was applying Rupture twice
Players will now be ejected from Minecarts if they cast their fishing rod (anti-afk)
Rupture's strength is now related to your equipped Sword
Rupture will no longer be applied if the target is blocking, this doesn't prevent existing bleed damage from occurring though.
Wolf's Rupture has strength equivalent to a Stone Sword
Only Diamond swords will have bonus rupture damage at Rank 4
Rupture damage is cut in half for weapons below Diamond in quality, if the weapon is wooden, the damage is cut in half again.
Swords below Diamond quality will have their tick duration drastically reduced
Rupture is not lethal if the sword is Stone or Wooden
Rupture damage is reduced by 25% on players if they are wearing Full Armor (can be any type)
Note: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically. Note: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically.
NOTE: Here's what your Double_Drop entries in Config.yml for Mining should look like NOTE: Here's what your Double_Drop entries in Config.yml for Mining should look like
https://paste.gg/p/anonymous/dcd06f1215844311b4f2225f200090d1 https://paste.gg/p/anonymous/dcd06f1215844311b4f2225f200090d1

View File

@ -25,6 +25,8 @@ import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardManager;
import com.gmail.nossr50.worldguard.WorldGuardUtils; import com.gmail.nossr50.worldguard.WorldGuardUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -193,6 +195,16 @@ public class EntityListener implements Listener {
*/ */
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
double damage = event.getFinalDamage();
Entity defender = event.getEntity();
Entity attacker = event.getDamager();
if(defender.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() > 0)
{
defender.removeMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, plugin);
return;
}
/* WORLD BLACKLIST CHECK */ /* WORLD BLACKLIST CHECK */
if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
return; return;
@ -211,10 +223,6 @@ public class EntityListener implements Listener {
return; return;
} }
double damage = event.getFinalDamage();
Entity defender = event.getEntity();
Entity attacker = event.getDamager();
if(attacker instanceof Player) if(attacker instanceof Player)
{ {
Player player = (Player) attacker; Player player = (Player) attacker;
@ -263,8 +271,6 @@ public class EntityListener implements Listener {
return; return;
} }
if (Misc.isNPCEntity(attacker)) { if (Misc.isNPCEntity(attacker)) {
return; return;
} }

View File

@ -97,6 +97,7 @@ public class mcMMO extends JavaPlugin {
/* Metadata Values */ /* Metadata Values */
public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker";
public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage";
public final static String entityMetadataKey = "mcMMO: Spawned Entity"; public final static String entityMetadataKey = "mcMMO: Spawned Entity";
public final static String blockMetadataKey = "mcMMO: Piston Tracking"; public final static String blockMetadataKey = "mcMMO: Piston Tracking";
public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace"; public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace";

View File

@ -5,14 +5,16 @@ import org.bukkit.entity.LivingEntity;
public class BleedContainer { public class BleedContainer {
public int bleedTicks; public int bleedTicks;
public int bleedRank; public int bleedRank;
public int toolTier;
public LivingEntity target; public LivingEntity target;
public LivingEntity damageSource; public LivingEntity damageSource;
public BleedContainer(LivingEntity target, int bleedTicks, int bleedRank, LivingEntity damageSource) public BleedContainer(LivingEntity target, int bleedTicks, int bleedRank, int toolTier, LivingEntity damageSource)
{ {
this.target = target; this.target = target;
this.bleedTicks = bleedTicks; this.bleedTicks = bleedTicks;
this.bleedRank = bleedRank; this.bleedRank = bleedRank;
this.toolTier = toolTier;
this.damageSource = damageSource; this.damageSource = damageSource;
} }
} }

View File

@ -9,8 +9,11 @@ import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.gmail.nossr50.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundManager;
import com.gmail.nossr50.util.sounds.SoundType; import com.gmail.nossr50.util.sounds.SoundType;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap; import java.util.HashMap;
@ -28,21 +31,32 @@ public class BleedTimerTask extends BukkitRunnable {
while (bleedIterator.hasNext()) { while (bleedIterator.hasNext()) {
Entry<LivingEntity, BleedContainer> containerEntry = bleedIterator.next(); Entry<LivingEntity, BleedContainer> containerEntry = bleedIterator.next();
LivingEntity target = containerEntry.getKey(); LivingEntity target = containerEntry.getKey();
int toolTier = containerEntry.getValue().toolTier;
int bleedTicks = containerEntry.getValue().bleedTicks; // String debugMessage = "";
// debugMessage += ChatColor.GOLD + "Target ["+target.getName()+"]: " + ChatColor.RESET;
// debugMessage+="RemainingTicks=["+containerEntry.getValue().bleedTicks+"], ";
if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) { if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) {
if(target instanceof Player)
{
NotificationManager.sendPlayerInformation((Player) target, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped");
}
bleedIterator.remove(); bleedIterator.remove();
continue; continue;
} }
int armorCount = 0;
double damage; double damage;
if (target instanceof Player) { if (target instanceof Player) {
damage = AdvancedConfig.getInstance().getRuptureDamagePlayer(); damage = AdvancedConfig.getInstance().getRuptureDamagePlayer();
//Above Bleed Rank 3 deals 50% more damage //Above Bleed Rank 3 deals 50% more damage
if (containerEntry.getValue().bleedRank >= 3) if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3)
damage = damage * 1.5; damage = damage * 1.5;
Player player = (Player) target; Player player = (Player) target;
@ -51,28 +65,77 @@ public class BleedTimerTask extends BukkitRunnable {
continue; continue;
} }
NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); //Count Armor
for(ItemStack armorPiece : ((Player) target).getInventory().getArmorContents())
{
if(armorPiece != null)
armorCount++;
}
} else { } else {
damage = AdvancedConfig.getInstance().getRuptureDamageMobs(); damage = AdvancedConfig.getInstance().getRuptureDamageMobs();
// debugMessage+="BaseDMG=["+damage+"], ";
//Above Bleed Rank 3 deals 50% more damage //Above Bleed Rank 3 deals 50% more damage
if (containerEntry.getValue().bleedRank >= 3) if (containerEntry.getValue().bleedRank >= 3)
{
damage = damage * 1.5; damage = damage * 1.5;
}
// debugMessage+="Rank4Bonus=["+String.valueOf(containerEntry.getValue().bleedRank >= 3)+"], ";
MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars
} }
CombatUtils.dealNoInvulnerabilityTickDamage(target, damage, containerEntry.getValue().damageSource); // debugMessage+="FullArmor=["+String.valueOf(armorCount > 3)+"], ";
if(armorCount > 3)
{
damage = damage * .75;
}
// debugMessage+="AfterRankAndArmorChecks["+damage+"], ";
//Weapons below Diamond get damage cut in half
if(toolTier < 4)
damage = damage / 2;
// debugMessage+="AfterDiamondCheck=["+String.valueOf(damage)+"], ";
//Wood weapons get damage cut in half again
if(toolTier < 2)
damage = damage / 2;
// debugMessage+="AfterWoodenCheck=["+String.valueOf(damage)+"], ";
double victimHealth = target.getHealth();
// debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], ";
CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier);
double victimHealthAftermath = target.getHealth();
// debugMessage+="TargetHealthAfterDMG=["+String.valueOf(target.getHealth())+"], ";
if(victimHealthAftermath <= 0 || victimHealth != victimHealthAftermath)
{
//Play Bleed Sound //Play Bleed Sound
SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED);
ParticleEffectUtils.playBleedEffect(target); ParticleEffectUtils.playBleedEffect(target);
}
//Lower Bleed Ticks //Lower Bleed Ticks
BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue()); BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue());
loweredBleedContainer.bleedTicks -= 1; loweredBleedContainer.bleedTicks -= 1;
// debugMessage+="RemainingTicks=["+loweredBleedContainer.bleedTicks+"]";
containerEntry.setValue(loweredBleedContainer); containerEntry.setValue(loweredBleedContainer);
// Bukkit.broadcastMessage(debugMessage);
} }
} }
@ -82,8 +145,9 @@ public class BleedTimerTask extends BukkitRunnable {
LivingEntity source = container.damageSource; LivingEntity source = container.damageSource;
int bleedTicks = container.bleedTicks; int bleedTicks = container.bleedTicks;
int bleedRank = container.bleedRank; int bleedRank = container.bleedRank;
int toolTier = container.toolTier;
BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, source); BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, toolTier, source);
return newContainer; return newContainer;
} }
@ -108,8 +172,11 @@ public class BleedTimerTask extends BukkitRunnable {
* @param entity LivingEntity to add * @param entity LivingEntity to add
* @param ticks Number of bleeding ticks * @param ticks Number of bleeding ticks
*/ */
public static void add(LivingEntity entity, LivingEntity attacker, int ticks, int bleedRank) { public static void add(LivingEntity entity, LivingEntity attacker, int ticks, int bleedRank, int toolTier) {
BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, attacker); if(toolTier < 4)
ticks = Math.max(1, (ticks / 3));
BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker);
bleedList.put(entity, newBleedContainer); bleedList.put(entity, newBleedContainer);
} }

View File

@ -18,7 +18,6 @@ import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.NotificationManager;
import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.random.RandomChanceUtil;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.skills.SkillActivationType;
import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.skills.SkillUtils;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;

View File

@ -8,6 +8,7 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import com.gmail.nossr50.datatypes.skills.ToolType; import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.NotificationManager;
import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.player.UserManager;
@ -19,6 +20,7 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.inventory.ItemStack;
import java.util.Map; import java.util.Map;
@ -60,13 +62,17 @@ public class SwordsManager extends SkillManager {
if (target instanceof Player) { if (target instanceof Player) {
Player defender = (Player) target; Player defender = (Player) target;
//Don't start or add to a bleed if they are blocking
if(defender.isBlocking())
return;
if (UserManager.getPlayer(defender).useChatNotifications()) { if (UserManager.getPlayer(defender).useChatNotifications()) {
if(!BleedTimerTask.isBleeding(defender)) if(!BleedTimerTask.isBleeding(defender))
NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started");
} }
} }
BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE)); BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand()));
if (mcMMOPlayer.useChatNotifications()) { if (mcMMOPlayer.useChatNotifications()) {
NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding");
@ -74,6 +80,18 @@ public class SwordsManager extends SkillManager {
} }
} }
public int getToolTier(ItemStack itemStack)
{
if(ItemUtils.isDiamondTool(itemStack))
return 4;
else if(ItemUtils.isIronTool(itemStack) || ItemUtils.isGoldTool(itemStack))
return 3;
else if(ItemUtils.isStoneTool(itemStack))
return 2;
else
return 1;
}
public int getRuptureBleedTicks() public int getRuptureBleedTicks()
{ {
int bleedTicks = 2 * RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE); int bleedTicks = 2 * RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE);
@ -110,6 +128,5 @@ public class SwordsManager extends SkillManager {
*/ */
public void serratedStrikes(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers) { public void serratedStrikes(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers) {
CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill); CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill);
BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE));
} }
} }

View File

@ -124,7 +124,7 @@ public class TamingManager extends SkillManager {
return 0; return 0;
} }
BleedTimerTask.add(target, getPlayer(), Taming.goreBleedTicks, 1); BleedTimerTask.add(target, getPlayer(), Taming.goreBleedTicks, 1, 2);
if (target instanceof Player) { if (target instanceof Player) {
NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore");

View File

@ -32,6 +32,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.util.Vector;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
@ -394,9 +395,47 @@ public final class CombatUtils {
double incDmg = callFakeDamageEvent(attacker, target, DamageCause.CUSTOM, damage); double incDmg = callFakeDamageEvent(attacker, target, DamageCause.CUSTOM, damage);
double newHealth = Math.max(0, target.getHealth() - incDmg); double newHealth = Math.max(0, target.getHealth() - incDmg);
if(newHealth == 0)
{
target.damage(9999, attacker);
}
else
target.setHealth(newHealth); target.setHealth(newHealth);
} }
public static void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) {
if (target.isDead()) {
return;
}
int noDamageTicks = target.getNoDamageTicks();
double incDmg = callFakeDamageEvent(attacker, target, DamageCause.CUSTOM, damage);
double newHealth = Math.max(0, target.getHealth() - incDmg);
//Don't kill things with a stone or wooden weapon
if(toolTier < 3 && newHealth == 0)
return;
target.setMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.metadataValue);
if(newHealth == 0)
{
target.damage(99999, attacker);
}
else
{
Vector beforeRuptureVec = new Vector(target.getVelocity().getX(), target.getVelocity().getY(), target.getVelocity().getZ()); ;
target.damage(damage, attacker);
target.setNoDamageTicks(noDamageTicks);
target.setVelocity(beforeRuptureVec);
}
}
/** /**
* Apply Area-of-Effect ability actions. * Apply Area-of-Effect ability actions.
* *
@ -427,7 +466,7 @@ public final class CombatUtils {
NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck"); NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck");
} }
BleedTimerTask.add(livingEntity, attacker, UserManager.getPlayer(attacker).getSwordsManager().getRuptureBleedTicks(), RankUtils.getRank(attacker, SubSkillType.SWORDS_RUPTURE)); UserManager.getPlayer(attacker).getSwordsManager().ruptureCheck(target);
break; break;
case AXES: case AXES: