->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:
parent
ecbe7f9d2b
commit
9b3bc4e144
Binary file not shown.
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user