->Strikers can no longer hit and block player's arrows.

->Fixed a bug causing Defenders to be hit every tick for tanking others'
attacks.
->Ghast fireballs can be reflected once again.
->Remove global attack cooldown on Elite monsters for Rangers.
->Elite Monsters now carry axes instead of swords, causing shields to go
on a cooldown.
->The Elite Monster healthbar now shows its current target next to its
name.
->Added removeNoDamageTick(damager,target) to API.
->Line Drive is more responsive and has a proper AoE Range now.
->Knockup of Line Drive reduced slightly.
->Hellfire Zombie Pigmen now behave like Hellfire Zombies in the
Overworld.
->Players can no longer be in Ranger mode while holding an equip in
their off-hand.
->Update Elite Boss mechanics.
->Elite monsters are no longer affected by portals.
->Fixed a bug where the Elite boss global attack cooldown was not being
applied.
->Fixed a bug where the Elite boss would be stuck forver in the middle
of an attack after killing someone.
->Players with the Full Ranger set will now benefit from all the set
effects regardless of the mode they are in.
This commit is contained in:
sigonasr2 2016-08-14 12:32:04 -05:00
parent ecbe7f9d2b
commit 9b3bc4e144
9 changed files with 391 additions and 124 deletions

Binary file not shown.

View File

@ -1,6 +1,6 @@
name: TwosideKeeper
main: sig.plugin.TwosideKeeper.TwosideKeeper
version: 3.8.3
version: 3.8.3r1
commands:
money:
description: Tells the player the amount of money they are holding.

View File

@ -42,7 +42,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
public class EliteMonster {
static int REFRESH_BUFFS = 20*30;
static int RESTORE_HEALTH = 20*10;
static float DEFAULT_MOVE_SPD = 0.4f;
static float DEFAULT_MOVE_SPD = 0.3f;
static float FAST_MOVE_SPD = 0.65f;
static long BURST_TIME = 20*3;
static float BURST_LIMIT = 10f;
@ -51,6 +51,8 @@ public class EliteMonster {
static int LEAP_COOLDOWN = 20*40;
static int ENRAGE_COOLDOWN = 20*60;
static int STORINGENERGY_COOLDOWN = 20*50;
static int WILLPOWER_COOLDOWN = 20*50;
static int IGNORE_TARGET_DURATION = 20*20;
static int GLOW_TIME = 20*1;
static int WAIT_TIME = 20*10;
@ -59,11 +61,13 @@ public class EliteMonster {
long last_regen_time=0;
long last_burstcheck_time=0;
long last_applyglow_time=0;
long last_willpower_increase=0;
double hp_before_burstcheck=0;
double last_leap_time=0;
double last_enrage_time=0;
double last_storingenergy_time=0;
double last_storingenergy_health=0;
double last_ignoretarget_time=0;
double storingenergy_hit=0;
boolean leaping=false;
boolean chasing=false;
@ -73,6 +77,12 @@ public class EliteMonster {
Location myspawn = null;
HashMap<Block,Material> storedblocks = new HashMap<Block,Material>();
BossBar bar = null;
BossBar willpower_bar = null;
boolean first_willpower_notification=false;
int scroll=0;
int willpower=0;
String arrow = "->";
Player my_only_target=null;
List<Player> targetlist = new ArrayList<Player>();
List<Player> participantlist = new ArrayList<Player>();
@ -84,18 +94,22 @@ public class EliteMonster {
m.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(DEFAULT_MOVE_SPD);
this.hp_before_burstcheck=m.getHealth();
this.myspawn=m.getLocation();
bar = m.getServer().createBossBar(m.getCustomName(), BarColor.RED, BarStyle.SEGMENTED_6, BarFlag.CREATE_FOG);
bar = m.getServer().createBossBar(m.getCustomName(), BarColor.WHITE, BarStyle.SEGMENTED_6, BarFlag.CREATE_FOG);
willpower_bar = m.getServer().createBossBar("Willpower", BarColor.PINK, BarStyle.SOLID, BarFlag.CREATE_FOG);
}
public void runTick() {
//This monster constantly gives itself its buffs as it may lose some (Debilitation mode).
increaseBarTextScroll();
dontDrown();
rebuff();
regenerateHealth();
moveFasterToTarget();
resetToSpawn();
createBossHealthbar();
ignoreAllOtherTargets();
if (m.isValid() && targetlist.size()>0) {
adjustWillpower();
weakenTeam();
retargetInAir();
destroyLiquids(2);
@ -103,13 +117,145 @@ public class EliteMonster {
}
}
private void createBossHealthbar() {
bar.removeAll();
for (int i=0;i<targetlist.size();i++) {
bar.addPlayer(targetlist.get(i));
bar.setProgress(m.getHealth()/m.getMaxHealth());
private void ignoreAllOtherTargets() {
if (my_only_target!=null && targetlist.contains(my_only_target)) {
m.setTarget(my_only_target);
TwosideKeeper.log("I aim at "+m.getTarget()+"!!", 2);
if (last_ignoretarget_time+IGNORE_TARGET_DURATION<TwosideKeeper.getServerTickTime()) {
my_only_target=null;
}
}
}
private void increaseBarTextScroll() {
scroll++;
switch (scroll%22) {
case 11:{
arrow=" -";
}break;
case 12:{
arrow=" ";
}break;
case 13:{
arrow="> ";
}break;
case 14:{
arrow="->";
}break;
}
}
private void adjustWillpower() {
//Check for nearby mobs. Each mob increases willpower by 1.
if (Math.random()<=0.3 && !leaping && !storingenergy) {
int mobcount=0;
List<Monster> monsterlist = GenericFunctions.getNearbyMobs(m.getLocation(), 10);
mobcount=monsterlist.size()-1;
TwosideKeeper.log("Detected mob count: "+mobcount, 5);
if (mobcount>0) {
willpower+=mobcount;
last_willpower_increase=TwosideKeeper.getServerTickTime();
if (!first_willpower_notification) {
for (int i=0;i<targetlist.size();i++) {
targetlist.get(i).sendMessage(ChatColor.ITALIC+"The "+m.getCustomName()+ChatColor.RESET+ChatColor.ITALIC+" gains morale and the will to fight from its minions!");
}
first_willpower_notification=true;
}
if (willpower>=100) {
for (int i=0;i<targetlist.size();i++) {
targetlist.get(i).sendMessage(ChatColor.RED+"The "+m.getCustomName()+ChatColor.RED+" unleashes its Willpower!");
}
if (m.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) {
final int previous_str_level = GenericFunctions.getPotionEffectLevel(PotionEffectType.INCREASE_DAMAGE, m);
final int previous_str_duration = GenericFunctions.getPotionEffectDuration(PotionEffectType.INCREASE_DAMAGE, m);
m.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE,20*5,previous_str_level+15),true);
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
m.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE,previous_str_duration,previous_str_level),true);
}
},50);
} else {
m.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE,20*5,14),true);
}
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
for (int i=0;i<targetlist.size();i++) {
targetlist.get(i).sendMessage(ChatColor.DARK_RED+"The "+m.getCustomName()+ChatColor.DARK_RED+" is now focused on its target!");
}
my_only_target = ChooseRandomTarget();
last_ignoretarget_time = TwosideKeeper.getServerTickTime();
}
},50);
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
performLeap();
last_leap_time=0;
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
performLeap();
last_leap_time=0;
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
performLeap();
last_leap_time=0;
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
performLeap();
last_leap_time=0;
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin, new Runnable() {
public void run() {
performLeap();
last_leap_time=0;
}
},5);
}
},5);
}
},5);
}
},10);
}
},10);
willpower=0;
} else
if (willpower>95) {
}
} else {
if (willpower>0) {
willpower--;
}
}
}
}
private void createBossHealthbar() {
List<Player> currentplayers = bar.getPlayers();
for (int i=0;i<currentplayers.size();i++) {
if (!targetlist.contains(currentplayers.get(i))) {
bar.removePlayer(currentplayers.get(i));
willpower_bar.removePlayer(currentplayers.get(i));
}
}
bar.setProgress(m.getHealth()/m.getMaxHealth());
bar.setTitle(m.getCustomName() + ((m.getTarget()!=null && (m.getTarget() instanceof Player))?(ChatColor.DARK_AQUA+" "+arrow+" "+ChatColor.YELLOW+((Player)m.getTarget()).getName()):""));
for (int i=0;i<targetlist.size();i++) {
if (!currentplayers.contains(targetlist.get(i))) {
bar.addPlayer(targetlist.get(i));
}
}
currentplayers = willpower_bar.getPlayers();
if ((last_willpower_increase+20*3)>TwosideKeeper.getServerTickTime()) {
for (int i=0;i<targetlist.size();i++) {
if (!currentplayers.contains(targetlist.get(i))) {
willpower_bar.addPlayer(targetlist.get(i));
}
}
} else {
willpower_bar.removeAll();
}
willpower_bar.setProgress(Math.min(willpower/100d,1));
}
private void resetToSpawn() {
if (targetlist.size()==0 && m.getLocation().distanceSquared(myspawn)>81) {
@ -124,7 +270,10 @@ public class EliteMonster {
Bukkit.getServer().broadcastMessage(generateDPSReport());
aPlugin.API.discordSendRaw(m.getCustomName()+" Takedown Failed...\n\n"+ChatColor.YELLOW+"DPS Breakdown:"+"\n```\n"+generateDPSReport()+"\n```");
}
bar.setColor(BarColor.WHITE);
first_willpower_notification=false;
dpslist.clear();
willpower=0;
}
}
@ -159,7 +308,7 @@ public class EliteMonster {
}
private void retargetInAir() {
if (Math.random()<=0.04) {
if (Math.random()<=0.02) {
Player p = ChooseRandomTarget();
//p.addPotionEffect(new PotionEffect(PotionEffectType.LEVITATION,20*5,-31));
p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP,20*5,-1));
@ -202,6 +351,7 @@ public class EliteMonster {
private void regenerateHealth() {
if (m.getHealth()<m.getMaxHealth() && last_regen_time+RESTORE_HEALTH<=TwosideKeeper.getServerTickTime()) {
bar.setColor(BarColor.GREEN);
m.setHealth(Math.min(m.getHealth()+1,m.getMaxHealth()));
}
}
@ -266,7 +416,7 @@ public class EliteMonster {
m.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,Integer.MAX_VALUE,8),true);
m.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,Integer.MAX_VALUE,8),true);
//m.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION,Integer.MAX_VALUE,2),true);
ItemStack helm = new ItemStack(Material.GOLD_SWORD);
ItemStack helm = new ItemStack(Material.GOLD_AXE);
m.getEquipment().setItemInMainHand(helm);
m.getEquipment().setItemInMainHandDropChance(1.0f);
helm = new ItemStack(Material.GOLD_HELMET);
@ -283,6 +433,7 @@ public class EliteMonster {
//Triggers when this mob is hit.
public void runHitEvent(LivingEntity damager, double dmg) {
bar.setColor(BarColor.RED);
if (!targetlist.contains(damager) && (damager instanceof Player)) {
targetlist.add((Player)damager);
}
@ -297,7 +448,8 @@ public class EliteMonster {
currentdps = dpslist.get(p.getName());
}
dpslist.put(p.getName(), currentdps+dmg);
if (!p.hasPotionEffect(PotionEffectType.WEAKNESS)) {
if ((!p.hasPotionEffect(PotionEffectType.WEAKNESS) || GenericFunctions.getPotionEffectLevel(PotionEffectType.WEAKNESS, p)<9) &&
!GenericFunctions.isRanger(p)) {
p.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS,35,9),true);
}
}
@ -331,6 +483,8 @@ public class EliteMonster {
m.setTarget(target);
storingenergy=false;
}
} else {
storingenergy=false;
}
}
},5*20);
@ -447,6 +601,10 @@ public class EliteMonster {
b.getLocation().getWorld().playSound(b.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.7f, 1.2f);
}
storedblocks.clear();
List<Player> nearbyplayers = GenericFunctions.getNearbyPlayers(target_leap_loc, radius);
for (int i=0;i<nearbyplayers.size();i++) {
GenericFunctions.removeNoDamageTick(nearbyplayers.get(i), m);
}
GenericFunctions.DealDamageToNearbyPlayers(target_leap_loc, 5, radius, true, 2, m, true);
//GenericFunctions.getNear
}

View File

@ -2021,8 +2021,8 @@ public class GenericFunctions {
}
public static boolean isRanger(Player p) {
if (p!=null && !p.isDead() && (((p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && (p.getInventory().getExtraContents()[0]==null || p.getInventory().getExtraContents()[0].getType()==Material.AIR)) || //Satisfy just a bow in main hand.
(p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()!=Material.SHIELD) || /*Satisfy a bow in main hand and no shield in off-hand.*/
(p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()!=Material.SHIELD && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW) || /*Satisfy a bow in off-hand and no shield in main hand.*/
(p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && p.getInventory().getExtraContents()[0]!=null && !isEquip(p.getInventory().getExtraContents()[0])) || /*Satisfy a bow in main hand and no shield in off-hand.*/
(p.getEquipment().getItemInMainHand()!=null && !isEquip(p.getEquipment().getItemInMainHand()) && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW) || /*Satisfy a bow in off-hand and no shield in main hand.*/
((p.getEquipment().getItemInMainHand()==null || p.getEquipment().getItemInMainHand().getType()==Material.AIR) && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW)) /*Satisfy just a bow in off-hand.*/ &&
AllLeatherArmor(p))) {
return true;
@ -2475,7 +2475,6 @@ public class GenericFunctions {
int rangerarmort3 = 0;
int rangerarmort4 = 0;
if (isRanger(p)) {
for (int i=0;i<p.getEquipment().getArmorContents().length;i++) {
ItemStack equip = p.getEquipment().getArmorContents()[i];
if (equip!=null
@ -2495,7 +2494,6 @@ public class GenericFunctions {
}
}
}
}
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
@ -2877,9 +2875,9 @@ public class GenericFunctions {
entity.setNoDamageTicks(0);
entity.setMaximumNoDamageTicks(0);
}
dmg = NewCombat.calculateDefenderAbsorbtion(entity, dmg);
boolean hitallowed=enoughTicksHavePassed(entity,damager);
if (hitallowed) {
dmg = NewCombat.calculateDefenderAbsorbtion(entity, dmg);
TwosideKeeper.log("Damage is "+dmg, 4);
updateNoDamageTickMap(entity,damager);
if (damager instanceof Player &&
@ -3028,6 +3026,7 @@ public class GenericFunctions {
if (damager!=null) {
if (md.hitlist.containsKey(damager.getUniqueId())) {
long time = md.hitlist.get(damager.getUniqueId());
TwosideKeeper.log("Last hit on "+time+". Current time: "+TwosideKeeper.getServerTickTime(), 2);
if (time+10<TwosideKeeper.getServerTickTime()) {
return true;
}
@ -3037,6 +3036,7 @@ public class GenericFunctions {
} else {
if (md.hitlist.containsKey(m.getUniqueId())) {
long time = md.hitlist.get(m.getUniqueId());
TwosideKeeper.log("->Last hit on "+time+". Current time: "+TwosideKeeper.getServerTickTime(), 2);
if (time+10<TwosideKeeper.getServerTickTime()) {
return true;
}
@ -3050,9 +3050,31 @@ public class GenericFunctions {
!(entity instanceof Player)) {
return true;
}
TwosideKeeper.log("Returning false... "+TwosideKeeper.getServerTickTime(), 2);
return false;
}
public static void removeNoDamageTick(LivingEntity entity, LivingEntity damager) {
if (entity instanceof Player) {
Player p = (Player)entity;
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (damager!=null) {
pd.hitlist.put(damager.getUniqueId(), TwosideKeeper.getServerTickTime()-10);
} else {
pd.hitlist.put(p.getUniqueId(), TwosideKeeper.getServerTickTime()-10);
}
}
if (entity instanceof Monster) {
Monster m = (Monster)entity;
MonsterStructure md = MonsterStructure.getMonsterStructure(m);
if (damager!=null) {
md.hitlist.put(damager.getUniqueId(), TwosideKeeper.getServerTickTime()-10);
} else {
md.hitlist.put(m.getUniqueId(), TwosideKeeper.getServerTickTime()-10);
}
}
}
public static void updateNoDamageTickMap(LivingEntity entity, LivingEntity damager) {
if (entity instanceof Player) {
Player p = (Player)entity;
@ -3427,6 +3449,45 @@ public class GenericFunctions {
}
}
public static void DealDamageToNearbyMobs(Location l, double basedmg, int range, boolean knockup, double knockupamt, Entity damager, boolean isLineDrive) {
Collection<Entity> ents = l.getWorld().getNearbyEntities(l, range, range, range);
//We cleared the non-living entities, deal damage to the rest.
for (Entity e : ents) {
double dodgechance = 0.0;
if (e instanceof Monster) {
Monster m = (Monster)e;
if (enoughTicksHavePassed(m,(Player)damager)) {
if (isLineDrive) {
basedmg=TwosideKeeperAPI.getFinalDamage(basedmg, damager, m, false, "Line Drive");
basedmg*=1.0d+(4*((NewCombat.getPercentHealthMissing(m))/100d));
}
if (knockup) {
m.setVelocity(new Vector(0,knockupamt,0));
}
TwosideKeeperAPI.DealDamageToEntity(basedmg, m, damager,"Line Drive");
if (m.isDead() && isLineDrive) {
Player p = (Player)damager;
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
pd.last_strikerspell = pd.last_strikerspell-40;
aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), (int)(TwosideKeeper.LINEDRIVE_COOLDOWN-(TwosideKeeper.getServerTickTime()-pd.last_strikerspell)));
}
updateNoDamageTickMap(m,(Player)damager);
}
}
}
}
public static List<Monster> getNearbyMobs(Location l, int range) {
Collection<Entity> ents = l.getWorld().getNearbyEntities(l, range, range, range);
List<Monster> monsterlist = new ArrayList<Monster>();
for (Entity e : ents) {
if ((e instanceof Monster)) {
monsterlist.add((Monster)e);
}
}
return monsterlist;
}
public static List<Player> getNearbyPlayers(Location l, int range) {
List<Player> players = new ArrayList<Player>();
Collection<Entity> nearbyentities = l.getWorld().getNearbyEntities(l, range, range, range);
@ -3571,6 +3632,14 @@ public class GenericFunctions {
Location testloc = loc;
if ((testloc.getBlock().getType()==Material.PORTAL ||
testloc.getBlock().getType()==Material.ENDER_PORTAL) ||
(testloc.getBlock().getRelative(0, 0, 1).getType()==Material.PORTAL ||
testloc.getBlock().getRelative(0, 0, 1).getType()==Material.ENDER_PORTAL) ||
(testloc.getBlock().getRelative(0, 0, -1).getType()==Material.PORTAL ||
testloc.getBlock().getRelative(0, 0, -1).getType()==Material.ENDER_PORTAL) ||
(testloc.getBlock().getRelative(-1, 0, 0).getType()==Material.PORTAL ||
testloc.getBlock().getRelative(-1, 0, 0).getType()==Material.ENDER_PORTAL) ||
(testloc.getBlock().getRelative(1, 0, 0).getType()==Material.PORTAL ||
testloc.getBlock().getRelative(1, 0, 0).getType()==Material.ENDER_PORTAL) ||
testloc.getBlock().getRelative(0, 1, 0).getType()!=Material.AIR) {
do {
testloc = testloc.add(2-Math.random()*4,2-Math.random()*4,2-Math.random()*4);

View File

@ -58,6 +58,7 @@ public class DamageLogger {
public void addEventToLogger(String name, double val) {
if (val!=0.0) {
TwosideKeeper.log("Add "+name+" w/value "+val, 2);
if (breakdownlist.containsKey(name)) {
//Add to the already existing value.
double dmg = breakdownlist.get(name);

View File

@ -900,7 +900,7 @@ public class MonsterController {
}
public static boolean isChargeZombie(Monster m) {
if (m.getType()==EntityType.ZOMBIE &&
if ((m.getType()==EntityType.ZOMBIE || m.getType()==EntityType.PIG_ZOMBIE) &&
MonsterController.getMonsterDifficulty((Monster)m)==MonsterDifficulty.HELLFIRE &&
!TwosideKeeper.chargezombies.contains((Monster)m)) {
return true;

View File

@ -66,7 +66,7 @@ public class NewCombat {
}
public static double applyDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike) {
return applyDamage(basedmg, target,damager,false,"Attack Base Damage");
return applyDamage(basedmg, target,damager,false,"");
}
public static double applyDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike, String reason) {
@ -107,7 +107,7 @@ public class NewCombat {
}
public static double calculatePlayerDamage(double basedmg,LivingEntity target, Entity damager, boolean isCriticalStrike) {
return calculatePlayerDamage(basedmg,target,damager,isCriticalStrike,"Attack Base Damage");
return calculatePlayerDamage(basedmg,target,damager,isCriticalStrike,"");
}
public static double calculatePlayerDamage(double basedmg,LivingEntity target, Entity damager, boolean isCriticalStrike, String reason) {
@ -177,7 +177,7 @@ public class NewCombat {
}
static double calculateTotalDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike) {
return calculateTotalDamage(basedmg,target,damager,isCriticalStrike,"Attack Base Damage");
return calculateTotalDamage(basedmg,target,damager,isCriticalStrike,"");
}
static double calculateTotalDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike, String reason) {
@ -536,7 +536,7 @@ public class NewCombat {
}
public static double CalculateWeaponDamage(Entity damager, LivingEntity target,boolean useBow) {
return CalculateWeaponDamage(0,damager,target,useBow,"Attack Base Damage");
return CalculateWeaponDamage(0,damager,target,useBow,"");
}
public static double CalculateWeaponDamage(double basedmg, Entity damager, LivingEntity target) {
@ -544,7 +544,7 @@ public class NewCombat {
}
public static double CalculateWeaponDamage(double basedmg, Entity damager, LivingEntity target, boolean useBow) {
return CalculateWeaponDamage(basedmg, damager,target,false,"Attack Base Damage");
return CalculateWeaponDamage(basedmg, damager,target,false,"");
}
public static double CalculateWeaponDamage(double suppliedDmg, Entity damager, LivingEntity target, boolean useBow, String reason) {
@ -562,15 +562,23 @@ public class NewCombat {
if (suppliedDmg!=0) {
basedmg += suppliedDmg;
addToPlayerLogger(ent,reason,basedmg);
//addToPlayerLogger(ent,reason,suppliedDmg);
} else {
if (GenericFunctions.isArtifactEquip(weapon)) {
double dmg = getBaseArtifactDamageByType(weapon);
if (reason.length()>0) {
addToPlayerLogger(ent,reason,dmg);
} else {
addToPlayerLogger(ent,"Weapon Base Damage",dmg);
}
basedmg += dmg;
} else {
double dmg = getBaseDamageByType(weapon);
if (reason.length()>0) {
addToPlayerLogger(ent,reason,dmg);
} else {
addToPlayerLogger(ent,"Weapon Base Damage",dmg);
}
basedmg += dmg;
}
}
@ -912,7 +920,7 @@ public class NewCombat {
static double getPercentHealthRemaining(LivingEntity target) {
return ((target.getHealth()/target.getMaxHealth())*100);
}
static double getPercentHealthMissing(LivingEntity target) {
public static double getPercentHealthMissing(LivingEntity target) {
return 100-getPercentHealthRemaining(target);
}
@ -1015,19 +1023,23 @@ public class NewCombat {
static double calculatePotionEffectMultiplier(LivingEntity damager) {
double mult = 1.0;
if (damager.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) {
double mult1 = 1.0+(GenericFunctions.getPotionEffectLevel(PotionEffectType.INCREASE_DAMAGE, damager)+1)*0.1;
addMultiplierToPlayerLogger(damager,"STRENGTH Mult",mult1);
mult *= mult1;
}
if (damager.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) {
int weaknesslv = Math.abs(GenericFunctions.getPotionEffectLevel(PotionEffectType.WEAKNESS, damager))+1;
if (weaknesslv<=10) {
mult1 = 1.0-(weaknesslv*0.1);
addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",mult1);
double mult1 = 1.0-(weaknesslv*0.1);
addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",-mult1);
mult *= 1.0-(weaknesslv*0.1);
} else {
addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",0.0);
mult = 0.0;
}
}
return mult;
}
@ -1661,7 +1673,7 @@ public class NewCombat {
for (int i=0;i<partymembers.size();i++) {
Player check = partymembers.get(i);
if (PartyManager.IsInSameParty(p, check)) {
TwosideKeeper.log("In here",2);
TwosideKeeper.log("In here",5);
if (GenericFunctions.isDefender(check) &&
check.isBlocking() &&
!p.equals(check)) {
@ -1677,7 +1689,7 @@ public class NewCombat {
}
}
}
TwosideKeeper.log("In here",2);
TwosideKeeper.log("In here",5);
}
return dmg;
}

View File

@ -445,9 +445,12 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
m.getLocation().add(0,-1,0).getBlock().getType()!=Material.AIR &&
!m.getLocation().add(0,-1,0).getBlock().isLiquid()) {
m.setVelocity(new Vector(0,0.5,0));
if (m.getLocation().getWorld().getName().equalsIgnoreCase("world_nether")) {
m.getLocation().getBlock().setType(Material.NETHERRACK);
m.getLocation().getWorld().playSound(m.getLocation(), Sound.BLOCK_STONE_PLACE, 1.0f, 1.0f);
} else {
switch (r.nextInt(3)) {
case 0:{
m.getLocation().getBlock().setType(Material.DIRT);
m.getLocation().getWorld().playSound(m.getLocation(), Sound.BLOCK_GRAVEL_PLACE, 1.0f, 1.0f);
}break;
case 1:{
@ -461,6 +464,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
}
}
}
}
cz.BreakBlocksAroundArea(1);
}
}
@ -3082,12 +3086,17 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
ev1.getPlayer().setVelocity(facing1.multiply(8));
GenericFunctions.addIFrame(ev1.getPlayer(), 10);
ev1.getPlayer().playSound(ev1.getPlayer().getLocation(), Sound.ITEM_CHORUS_FRUIT_TELEPORT, 1.0f, 1.0f);
final Location newpos=new Location(ev1.getPlayer().getWorld(),xpos,ypos,zpos);
final double xpos=ev1.getPlayer().getLocation().getX();
final double ypos=ev1.getPlayer().getLocation().getY();
final double zpos=ev1.getPlayer().getLocation().getZ();
AreaEffectCloud lp = (AreaEffectCloud)ev1.getPlayer().getWorld().spawnEntity(newpos, EntityType.AREA_EFFECT_CLOUD);
double dmgdealt=0;
List<Monster> monsters = GenericFunctions.getNearbyMobs(newpos, 2);
for (int i=0;i<monsters.size();i++) {
GenericFunctions.removeNoDamageTick(monsters.get(i), ev1.getPlayer());
}
GenericFunctions.DealDamageToNearbyMobs(newpos, dmgdealt, 2, true, 0.8d, ev1.getPlayer(),true);
lp.setColor(Color.OLIVE);
DecimalFormat df = new DecimalFormat("0.00");
lp.setCustomName("LD "+df.format(NewCombat.CalculateWeaponDamage(ev1.getPlayer(),null))+" "+ev1.getPlayer().getName());
@ -3097,7 +3106,6 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
lp.setBasePotionData(new PotionData(PotionType.INSTANT_DAMAGE));
lp.setParticle(Particle.FLAME);
ev1.getPlayer().playSound(ev1.getPlayer().getLocation(), Sound.ENTITY_ARMORSTAND_HIT, 1.0f, 0.5f);
int range=8;
final String customname = lp.getCustomName();
for (int i=0;i<range;i++) {
@ -3109,6 +3117,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
Bukkit.getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("TwosideKeeper"), new Runnable() {
public void run() {
AreaEffectCloud lp = (AreaEffectCloud)newpos2.getWorld().spawnEntity(newpos2, EntityType.AREA_EFFECT_CLOUD);
GenericFunctions.DealDamageToNearbyMobs(newpos2, dmgdealt, 2, true, 0.4d, ev1.getPlayer(),true);
lp.setColor(Color.OLIVE);
lp.setCustomName(customname);
lp.setBasePotionData(new PotionData(PotionType.INSTANT_DAMAGE));
@ -3900,7 +3909,8 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
if (ev.getCause()==DamageCause.FIRE || ev.getCause()==DamageCause.FIRE_TICK ||
ev.getCause()==DamageCause.LAVA || ev.getCause()==DamageCause.SUFFOCATION ||
ev.getCause()==DamageCause.WITHER || ev.getCause()==DamageCause.POISON
|| ev.getCause()==DamageCause.THORNS || ev.getCause()==DamageCause.VOID) {
|| ev.getCause()==DamageCause.THORNS || ev.getCause()==DamageCause.VOID ||
ev.getCause() == DamageCause.WITHER) {
if (ev.getEntity() instanceof LivingEntity) {
ev.setDamage(DamageModifier.MAGIC,0);
ev.setDamage(DamageModifier.RESISTANCE,0);
@ -4172,6 +4182,10 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
@EventHandler(priority=EventPriority.LOW,ignoreCancelled = true)
public void onEndermanTeleport(EntityTeleportEvent ev) {
if (elitemonsters.contains(ev.getEntity())) {
ev.setCancelled(true);
}
if (ev.getEntity().isDead()) {
ev.setCancelled(true);
}
@ -4430,8 +4444,11 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
}
} else
if (dmg>=0) {
log("->Entity is of type "+ev.getEntity().getType()+", Damager is of type "+ev.getDamager().getType(),5);
if (ev.getEntity() instanceof LivingEntity) {
NewCombat.setupTrueDamage(ev); //Apply this as true damage.
ev.setDamage(0);
log("Entity is of type "+ev.getEntity().getType()+", Damager is of type "+ev.getDamager().getType(),5);
//ev.setCancelled(true);
if (ev.getEntity() instanceof LivingEntity) {
((LivingEntity)ev.getEntity()).setLastDamage(0);
@ -4484,6 +4501,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
}
//aPlugin.API.showDamage((LivingEntity)ev.getEntity(), (int)(dmg/10));
}
}
} //Negative damage doesn't make sense. We'd apply it normally.
}
}
@ -4897,7 +4915,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
GenericFunctions.DealDamageToMob(reduceddmg, affected.get(i), Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]), Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]).getEquipment().getItemInMainHand());
} else
if (ev.getEntity().getCustomName().contains("LD ")) {
Player p = Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]);
/*Player p = Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]); //LEGACY LINE DRIVE CODE.
double dmgdealt=Double.parseDouble(ev.getEntity().getCustomName().split(" ")[1]);
dmgdealt*=1.0d+(4*((NewCombat.getPercentHealthMissing((Monster)affected.get(i)))/100d));
log("Dealing "+dmgdealt+" damage. Player is "+p.getName(),5);
@ -4910,7 +4928,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
pd.last_strikerspell = pd.last_strikerspell-40;
aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), (int)(LINEDRIVE_COOLDOWN-(TwosideKeeper.getServerTickTime()-pd.last_strikerspell)));
}
}*/
} else {
affected.remove(i);
i--;
@ -5361,6 +5379,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
ev.getProjectile().getType()==EntityType.TIPPED_ARROW)) {
//Now we know this is a player who shot a regular old arrow.
final Player p = (Player)ev.getEntity();
ev.getProjectile().setCustomName("HIT");
//We need to give one back to them.
if (ev.getProjectile().getType()==EntityType.ARROW) {
//This was an arrow quiver. We need to verify that, check the player's inventory for one.

View File

@ -195,6 +195,14 @@ public final class TwosideKeeperAPI {
public static double getFinalDamage(double dmg, Entity damager, LivingEntity target, boolean isCriticalStrike, String reason) {
return NewCombat.applyDamage(dmg, target, damager, isCriticalStrike, reason);
}
/**
* Makes the target vulnerable to the damager again by removing their last hit time.
* @param damager The damager that will have their no damage tick flag removed.
* @param target The target that will be vulnerable to the damager again.
*/
public static void removeNoDamageTick(LivingEntity damager, LivingEntity target) {
GenericFunctions.removeNoDamageTick(target, damager);
}
//Message COMMANDS.
public static void playMessageNotification(Player sender) {