+>Test Dummies have been scattered throughout various areas in towns.

You can use these to freely test DPS. They will announce DPS results
after you stop hitting them.
+>Fixed Debilitation mode poison application issues. No longer resets
the level of poison on a target when you miss a headshot on a high
poison stack target.
+>Poison deals a true damage DoT based on number of poison stacks every
second. Poison damage ticks are twice as slow on Undead monsters.
(Zombies, Skeletons, Wither)
+>The healthbar of Elite monsters and boss monsters now appears when you
are nearby them.
>Removed the reliance on Minecraft's poison system and debuff system to
determine if a monster is poisoned or not.
testdev
sigonasr2 8 years ago
parent ec0fb8e22b
commit 46b7cb9779
  1. BIN
      TwosideKeeper.jar
  2. 12
      src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java
  3. 7
      src/sig/plugin/TwosideKeeper/Boss/EliteZombie.java
  4. 15
      src/sig/plugin/TwosideKeeper/BossMonster.java
  5. 49
      src/sig/plugin/TwosideKeeper/Buff.java
  6. 104
      src/sig/plugin/TwosideKeeper/CustomDamage.java
  7. 12
      src/sig/plugin/TwosideKeeper/CustomMonster.java
  8. 17
      src/sig/plugin/TwosideKeeper/EliteMonster.java
  9. 17
      src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java
  10. 20
      src/sig/plugin/TwosideKeeper/HelperStructures/Utils/Classes/MovementModifier.java
  11. 1
      src/sig/plugin/TwosideKeeper/LivingEntityStructure.java
  12. 104
      src/sig/plugin/TwosideKeeper/Monster/Dummy.java
  13. 40
      src/sig/plugin/TwosideKeeper/PlayerStructure.java
  14. 23
      src/sig/plugin/TwosideKeeper/TwosideKeeper.java
  15. 31
      src/sig/plugin/TwosideKeeper/runServerHeartbeat.java

Binary file not shown.

@ -14,6 +14,14 @@ import sig.plugin.TwosideKeeper.HelperStructures.WorldShop;
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
public class ActionBarBuffUpdater{
/*
* LIST OF BUFFS:
* basename / icon string
*
* Poison ChatColor.YELLOW+"☣"
* DeathMark ChatColor.DARK_RED+"☠"
*/
public static String getActionBarPrefix(LivingEntity p) {
StringBuilder actionbardisplay = new StringBuilder("");
@ -199,11 +207,11 @@ public class ActionBarBuffUpdater{
effectString.append(ChatColor.WHITE);
effectString.append("➠");
} else
if (pet.equals(PotionEffectType.POISON) ||
/*if (pet.equals(PotionEffectType.POISON) ||
(pet.equals(PotionEffectType.BLINDNESS) && (p instanceof LivingEntity && !(p instanceof Player)))) {
effectString.append(ChatColor.YELLOW);
effectString.append("☣");
} else
} else*/
/*if ((pet.equals(PotionEffectType.UNLUCK) && (p instanceof LivingEntity && !(p instanceof Player)))) {
effectString.append(ChatColor.DARK_RED);
effectString.append("☠");

@ -92,14 +92,17 @@ public class EliteZombie extends EliteMonster{
protected void createBossHealthbar() {
List<Player> currentplayers = bar.getPlayers();
for (int i=0;i<currentplayers.size();i++) {
/*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.removeAll();
willpower_bar.removeAll();
bar.setProgress(m.getHealth()/m.getMaxHealth());
bar.setTitle(GenericFunctions.getDisplayName(m) + ((m.getTarget()!=null && (m.getTarget() instanceof Player))?(ChatColor.DARK_AQUA+" "+arrow+" "+ChatColor.YELLOW+((Player)m.getTarget()).getName()):""));
displayHealthbarToNearbyPlayers();
for (int i=0;i<targetlist.size();i++) {
if (!currentplayers.contains(targetlist.get(i))) {
bar.addPlayer(targetlist.get(i));

@ -5,6 +5,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag;
@ -150,18 +151,28 @@ public class BossMonster {
protected void createBossHealthbar() {
List<Player> currentplayers = bar.getPlayers();
for (int i=0;i<currentplayers.size();i++) {
/*for (int i=0;i<currentplayers.size();i++) {
if (!targetlist.contains(currentplayers.get(i))) {
bar.removePlayer(currentplayers.get(i));
}
}
}*/
bar.removeAll();
bar.setProgress(m.getHealth()/m.getMaxHealth());
bar.setTitle(GenericFunctions.getDisplayName(m) + ((m instanceof Monster && ((Monster)m).getTarget()!=null && (((Monster)m).getTarget() instanceof Player))?(ChatColor.DARK_AQUA+" "+arrow+" "+ChatColor.YELLOW+((Player)((Monster)m).getTarget()).getName()):""));
displayHealthbarToNearbyPlayers();
for (int i=0;i<targetlist.size();i++) {
if (!currentplayers.contains(targetlist.get(i))) {
bar.addPlayer(targetlist.get(i));
}
}
}
private void displayHealthbarToNearbyPlayers() {
for (Player p : Bukkit.getOnlinePlayers()) {
if (m.getLocation().distanceSquared(p.getLocation())<=2500) {
bar.addPlayer(p);
}
}
}
}

@ -16,13 +16,15 @@ public class Buff {
private int level;
private Color col;
private String icon;
private boolean isGoodBuff; //If false, it's a debuff.
public Buff(String displayName, long duration, int amplifier, Color buffcolor, String icon) {
public Buff(String displayName, long duration, int amplifier, Color buffcolor, String icon, boolean isGoodBuff) {
this.displayName=displayName;
this.expireTime=TwosideKeeper.getServerTickTime()+duration;
this.level=amplifier;
this.col=buffcolor;
this.icon=icon;
this.isGoodBuff=isGoodBuff;
}
public static boolean hasBuffInHashMap(LivingEntity l, String name) {
@ -109,10 +111,44 @@ public class Buff {
if (l instanceof Player) {
Player p = (Player)l;
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
pd.buffs.put(name, buff);
int oldlv = 0;
long oldduration = 0;
if (hasBuff(p,name)) {
oldlv = pd.buffs.get(name).getAmplifier();
oldduration = pd.buffs.get(name).getRemainingBuffTime();
} else {
pd.buffs.put(name, buff);
return;
}
if (buff.getAmplifier()>=oldlv) {
if (buff.getAmplifier()==oldlv) { //Check if duration is longer or same.
if (buff.getRemainingBuffTime()>=oldduration) {
pd.buffs.put(name, buff);
}
} else {
pd.buffs.put(name, buff); //If Buff level is greater than old level.
}
}
} else {
LivingEntityStructure les = LivingEntityStructure.GetLivingEntityStructure(l);
les.buffs.put(name, buff);
int oldlv = 0;
long oldduration = 0;
if (hasBuff(l,name)) {
oldlv = les.buffs.get(name).getAmplifier();
oldduration = les.buffs.get(name).getRemainingBuffTime();
} else {
les.buffs.put(name, buff);
return;
}
if (buff.getAmplifier()>=oldlv) {
if (buff.getAmplifier()==oldlv) { //Check if duration is longer or same.
if (buff.getRemainingBuffTime()>=oldduration) {
les.buffs.put(name, buff);
}
} else {
les.buffs.put(name, buff); //If Buff level is greater than old level.
}
}
}
}
public static void removeBuff(LivingEntity l, String name) {
@ -147,6 +183,13 @@ public class Buff {
public void refreshDuration(int duration) {
expireTime=TwosideKeeper.getServerTickTime()+duration;
}
public boolean isGoodBuff() {
return isGoodBuff;
}
public boolean isDebuff() {
return !isGoodBuff;
}
private static boolean hasBuffExpired(Buff b) {
if (b.expireTime<TwosideKeeper.getServerTickTime()) {

@ -9,6 +9,7 @@ import java.util.UUID;
import org.bukkit.Achievement;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Difficulty;
import org.bukkit.GameMode;
import org.bukkit.Location;
@ -38,7 +39,9 @@ import org.bukkit.entity.Snowball;
import org.bukkit.entity.SpectralArrow;
import org.bukkit.entity.Spider;
import org.bukkit.entity.TippedArrow;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Wither;
import org.bukkit.entity.Zombie;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.inventory.ItemStack;
@ -69,6 +72,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Utils.EntityUtils;
import sig.plugin.TwosideKeeper.HelperStructures.Utils.IndicatorType;
import sig.plugin.TwosideKeeper.HelperStructures.Utils.SoundUtils;
import sig.plugin.TwosideKeeper.HolidayEvents.Christmas;
import sig.plugin.TwosideKeeper.Monster.Dummy;
import sig.plugin.TwosideKeeper.Monster.HellfireGhast;
import sig.plugin.TwosideKeeper.Monster.HellfireSpider;
@ -119,6 +123,7 @@ public class CustomDamage {
* &nbsp;&nbsp;&nbsp;&nbsp;CRITICALSTRIKE - Force a Critical Strike.<br>
* &nbsp;&nbsp;&nbsp;&nbsp;IGNOREDODGE - Ignores all Dodge and invulnerability checks.<br>
* &nbsp;&nbsp;&nbsp;&nbsp;TRUEDMG - Ignores all additional calculations/reductions, applying the damage directly.<br>
* &nbsp;&nbsp;&nbsp;&nbsp;IGNORE_DAMAGE_TICK - Ignores the fact the entity is in an invulnerable state and applies the damage.<br>
* <br><b>Combining flags example:</b> CRITICALSTRIKE|IGNOREDODGE (Force a critical strike AND ignore invulnerability check)
* @return Whether or not this attack actually was applied. Returns false if it was dodged, nodamageticks, cancelled, etc.
*/
@ -439,11 +444,12 @@ public class CustomDamage {
target.setMaximumNoDamageTicks(0);
damage = subtractAbsorptionHearts(damage,target);
damage = applyOnHitEffects(damage,damager,target,weapon,reason,flags);
EntityUtils.applyDamageIndicator(target, damage, (isFlagSet(flags,IS_CRIT))?IndicatorType.CRIT:IndicatorType.REGULAR);
if (getDamagerEntity(damager) instanceof Player) { //Player dealing damage to living entities does a custom damage modifier.
TwosideKeeper.log("Dealing "+damage+" damage.", 5);
TwosideKeeper.log("Sending out "+(damage+TwosideKeeper.CUSTOM_DAMAGE_IDENTIFIER)+" damage.",5);
target.damage(damage+TwosideKeeper.CUSTOM_DAMAGE_IDENTIFIER,getDamagerEntity(damager));
PlayerStructure pd = PlayerStructure.GetPlayerStructure((Player)getDamagerEntity(damager));
EntityUtils.applyDamageIndicator(target, damage, (isFlagSet(pd.lasthitproperties,IS_CRIT))?IndicatorType.CRIT:IndicatorType.REGULAR);
} else
if (!(getDamagerEntity(damager) instanceof LivingEntity) || (damage!=0 && isFlagSet(flags,SPECIALATTACK))) {
//TwosideKeeper.log("Sending out "+damage+" damage.",2);
@ -451,6 +457,10 @@ public class CustomDamage {
aPlugin.API.sendEntityHurtAnimation(target);
}
if (damager==null && reason.equalsIgnoreCase("POISON") && !(target instanceof Player)) {
EntityUtils.applyDamageIndicator(target, damage, IndicatorType.DOT);
}
if (target instanceof Player) { //Update player health whenever hit.
Player p = (Player)target;
TwosideKeeper.setPlayerMaxHealth(p);
@ -586,7 +596,8 @@ public class CustomDamage {
target.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,20*5,slownesslv));
}
if (a.hasMetadata("POISON_ARR")) {
target.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,20*20,0));
//target.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,20*20,0));
Buff.addBuff(target,"Poison",new Buff("Poison",20*20,1,Color.YELLOW,ChatColor.YELLOW+"☣",false));
}
}
provokeMonster(target,p,weapon);
@ -684,11 +695,12 @@ public class CustomDamage {
}
if (ItemSet.HasSetBonusBasedOnSetBonusCount(GenericFunctions.getBaubles(p), p, ItemSet.MOONSHADOW, 2)) {
int poisonlv = (int)ItemSet.TotalBaseAmountBasedOnSetBonusCount(GenericFunctions.getBaubles(p), p, ItemSet.MOONSHADOW, 2, 2);
if (target.hasPotionEffect(PotionEffectType.BLINDNESS) && GenericFunctions.getPotionEffectLevel(PotionEffectType.BLINDNESS, target)<=poisonlv) {
/*if (target.hasPotionEffect(PotionEffectType.BLINDNESS) && GenericFunctions.getPotionEffectLevel(PotionEffectType.BLINDNESS, target)<=poisonlv) {
GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.BLINDNESS, 20*15, (int)poisonlv, target);
} else {
GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.BLINDNESS, 20*15, (int)poisonlv, target, true);
}
}*/
Buff.addBuff(target, "Poison", new Buff("Poison",20*15,(int)poisonlv,Color.YELLOW,ChatColor.YELLOW+"☣",false));
}
Bukkit.getScheduler().scheduleSyncDelayedTask(TwosideKeeper.plugin,new Runnable() {
@ -1239,11 +1251,28 @@ public class CustomDamage {
}
if (target instanceof Wither) {
Wither w = (Wither)target;
for (UUID id : TwosideKeeper.custommonsters.keySet()) {
/*for (UUID id : TwosideKeeper.custommonsters.keySet()) {
if (id.equals(w.getUniqueId())) {
sig.plugin.TwosideKeeper.Monster.Wither wi = (sig.plugin.TwosideKeeper.Monster.Wither)TwosideKeeper.custommonsters.get(id);
wi.runHitEvent(p, dmg);
}
}*/
if (TwosideKeeper.custommonsters.containsKey(w.getUniqueId())) {
sig.plugin.TwosideKeeper.Monster.Wither wi = (sig.plugin.TwosideKeeper.Monster.Wither)TwosideKeeper.custommonsters.get(w.getUniqueId());
wi.runHitEvent(p, dmg);
}
}
if (target instanceof Villager) {
Villager v = (Villager)target;
/*for (UUID id : TwosideKeeper.custommonsters.keySet()) {
if (id.equals(v.getUniqueId())) {
sig.plugin.TwosideKeeper.Monster.Wither wi = (sig.plugin.TwosideKeeper.Monster.Wither)TwosideKeeper.custommonsters.get(id);
wi.runHitEvent(p, dmg);
}
}*/
if (TwosideKeeper.custommonsters.containsKey(v.getUniqueId())) {
Dummy dm = (Dummy)TwosideKeeper.custommonsters.get(v.getUniqueId());
dm.customHitHandler(p, dmg);
}
}
}
@ -2515,23 +2544,36 @@ public class CustomDamage {
}
if (PlayerMode.isRanger(p) && GenericFunctions.getBowMode(p)==BowMode.DEBILITATION) {
if (m.hasPotionEffect(PotionEffectType.BLINDNESS) && isheadshot) {
//Add to the current stack of BLINDNESS.
for (PotionEffect pe : m.getActivePotionEffects()) {
if (pe.getType().equals(PotionEffectType.BLINDNESS)) {
int lv = pe.getAmplifier();
TwosideKeeper.log("New BLINDNESS level: "+lv,5);
SoundUtils.playLocalSound(p, Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f+((lv+1)*0.5f));
m.removePotionEffect(PotionEffectType.BLINDNESS);
m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,lv+1),true);
break;
}
}
} else {
m.removePotionEffect(PotionEffectType.BLINDNESS);
m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,0));
if (isheadshot) {
/*if (m.hasPotionEffect(PotionEffectType.BLINDNESS)) {
//Add to the current stack of BLINDNESS.
for (PotionEffect pe : m.getActivePotionEffects()) {
if (pe.getType().equals(PotionEffectType.BLINDNESS)) {
int lv = pe.getAmplifier();
TwosideKeeper.log("New BLINDNESS level: "+lv,5);
SoundUtils.playLocalSound(p, Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f+((lv+1)*0.5f));
m.removePotionEffect(PotionEffectType.BLINDNESS);
m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,lv+1),true);
break;
}
}
} else {
m.removePotionEffect(PotionEffectType.BLINDNESS);
m.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS,400,0));
SoundUtils.playLocalSound(p, Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f);
}*/
if (Buff.hasBuff(target, "Poison")) {
int oldlv = Buff.getBuff(target, "Poison").getAmplifier();
SoundUtils.playLocalSound(p, Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f+((oldlv+1)*0.5f));
Buff.addBuff(target, "Poison", new Buff("Poison",20*20,++oldlv,Color.YELLOW,ChatColor.YELLOW+"☣",false));
} else {
SoundUtils.playLocalSound(p, Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f);
Buff.addBuff(target, "Poison", new Buff("Poison",20*20,1,Color.YELLOW,ChatColor.YELLOW+"☣",false));
}
} else {
SoundUtils.playLocalSound(p, Sound.ENTITY_RABBIT_ATTACK, 0.1f, 0.1f);
}
Buff.addBuff(target, "Poison", new Buff("Poison",20*20,1,Color.YELLOW,ChatColor.YELLOW+"☣",false));
}
}
}
}
@ -2649,6 +2691,21 @@ public class CustomDamage {
}
return critchance;
}
//0.0-1.0. 0% meaning no resistance. 100% meaning full resistance.
public static double getPoisonResistance(LivingEntity target) {
double resist=0.0d;
if (target instanceof Player) {
//Nothing here yet.
} else {
if (target instanceof Zombie ||
target instanceof Skeleton ||
target instanceof Wither) {
resist+=0.5d;
}
}
return resist;
}
//Chance is between 0.0-1.0. 1.0 is 100%.
static boolean isCriticalStrike(double chance) {
@ -2684,8 +2741,11 @@ public class CustomDamage {
if (target.hasPotionEffect(PotionEffectType.POISON)) {
mult += (GenericFunctions.getPotionEffectLevel(PotionEffectType.POISON, target)+1)*0.5;
}
if (target.hasPotionEffect(PotionEffectType.BLINDNESS)) {
/*if (target.hasPotionEffect(PotionEffectType.BLINDNESS)) {
mult += (GenericFunctions.getPotionEffectLevel(PotionEffectType.BLINDNESS, target)+1)*0.5;
}*/
if (Buff.hasBuff(target, "Poison")) {
mult += Buff.getBuff(target, "Poison").getAmplifier()*0.5;
}
}
TwosideKeeper.log("Mult is "+mult, 5);

@ -4,6 +4,7 @@ import java.io.File;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
import org.bukkit.entity.Player;
public class CustomMonster {
protected LivingEntity m;
@ -34,7 +35,18 @@ public class CustomMonster {
}
}
public static boolean recognizeMonsterConditions(LivingEntity m) {
return false;
}
public void runTick() {
}
public void customHitHandler() {
}
public void customHitHandler(Player p, double dmg) {
}
}

@ -112,11 +112,13 @@ public class EliteMonster {
}
protected void createBossHealthbar() {
if (m instanceof Wither || m instanceof EnderDragon) {
/*if (m instanceof Wither || m instanceof EnderDragon) {
bar.removeAll();
willpower_bar.removeAll();
return;
}
}*/
bar.removeAll();
willpower_bar.removeAll();
List<Player> currentplayers = bar.getPlayers();
for (int i=0;i<currentplayers.size();i++) {
if (!targetlist.contains(currentplayers.get(i))) {
@ -126,6 +128,9 @@ public class EliteMonster {
}
bar.setProgress(m.getHealth()/m.getMaxHealth());
bar.setTitle(GenericFunctions.getDisplayName(m) + ((m.getTarget()!=null && (m.getTarget() instanceof Player))?(ChatColor.DARK_AQUA+" "+arrow+" "+ChatColor.YELLOW+((Player)m.getTarget()).getName()):""));
if (!(m instanceof Wither || m instanceof EnderDragon)) {
displayHealthbarToNearbyPlayers();
}
for (int i=0;i<targetlist.size();i++) {
if (!currentplayers.contains(targetlist.get(i))) {
bar.addPlayer(targetlist.get(i));
@ -133,6 +138,14 @@ public class EliteMonster {
}
}
protected void displayHealthbarToNearbyPlayers() {
for (Player p : Bukkit.getOnlinePlayers()) {
if (m.getLocation().distanceSquared(p.getLocation())<=2500) {
bar.addPlayer(p);
}
}
}
protected void resetToSpawn() {
if (!leaping && targetlist.size()==0 && m.getLocation().getWorld().equals(myspawn.getWorld()) && m.getLocation().distanceSquared(myspawn)>81) {
while (myspawn.getBlock().getRelative(0, -1, 0).getType()==Material.AIR && myspawn.getY()>1) {

@ -2538,7 +2538,7 @@ public class GenericFunctions {
deathmarkBuff.refreshDuration(99);
stackamt = deathmarkBuff.getAmplifier();
} else {
buffdata.put("DeathMark", new Buff("Death Mark",99,1,org.bukkit.Color.MAROON,ChatColor.DARK_RED+"☠"));
buffdata.put("DeathMark", new Buff("Death Mark",99,1,org.bukkit.Color.MAROON,ChatColor.DARK_RED+"☠",false));
stackamt = 1;
}
RefreshBuffColor(ent, stackamt);
@ -5076,7 +5076,18 @@ public class GenericFunctions {
}
GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.SLOW, 20*15, poisonlv, ent);
}
if (ent.hasPotionEffect(PotionEffectType.BLINDNESS)) {
if (Buff.hasBuff(ent, "Poison")) {
Buff b = Buff.getBuff(ent, "Poison");
int poisonlv = b.getAmplifier();
long poisondur = b.getRemainingBuffTime();
totalpoisonlv+=poisonlv+1;
if (poisondur<20*15) {
//GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.POISON, 20*15, poisonlv, ent, true);
b.refreshDuration(20*15);
}
GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.SLOW, 20*15, poisonlv, ent);
}
/*if (ent.hasPotionEffect(PotionEffectType.BLINDNESS)) {
int poisonlv = GenericFunctions.getPotionEffectLevel(PotionEffectType.BLINDNESS, ent);
int poisondur = GenericFunctions.getPotionEffectDuration(PotionEffectType.BLINDNESS, ent);
totalpoisonlv+=poisonlv+1;
@ -5084,7 +5095,7 @@ public class GenericFunctions {
GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.BLINDNESS, 20*15, poisonlv, ent, true);
}
GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.SLOW, 20*15, poisonlv, ent);
}
}*/
CustomDamage.ApplyDamage(totalpoisonlv*10, p, ent, null, "Siphon", CustomDamage.TRUEDMG|CustomDamage.IGNOREDODGE|CustomDamage.IGNORE_DAMAGE_TICK);
}
CustomDamage.setAbsorptionHearts(p, CustomDamage.getAbsorptionHearts(p)+totalpoisonstacks*4);

@ -0,0 +1,20 @@
package sig.plugin.TwosideKeeper.HelperStructures.Utils.Classes;
import org.bukkit.entity.LivingEntity;
import org.bukkit.util.Vector;
public class MovementModifier implements Runnable{
LivingEntity l;
Vector v;
public MovementModifier(LivingEntity l, Vector newvel) {
this.l=l;
this.v=newvel;
}
@Override
public void run() {
l.setVelocity(v);
}
}

@ -29,6 +29,7 @@ public class LivingEntityStructure {
public boolean hasRallied=false;
public HashMap<String,Buff> buffs = new HashMap<String,Buff>();
public long lastpotionparticles=0;
public long lastPoisonTick=0;
public LivingEntityStructure(LivingEntity m) {
target=null;

@ -0,0 +1,104 @@
package sig.plugin.TwosideKeeper.Monster;
import java.util.List;
import java.text.DecimalFormat;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Villager.Profession;
import org.bukkit.util.Vector;
import sig.plugin.TwosideKeeper.CustomMonster;
import sig.plugin.TwosideKeeper.TwosideKeeper;
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
import sig.plugin.TwosideKeeper.HelperStructures.Utils.Classes.MovementModifier;
public class Dummy extends CustomMonster{
final static int maxhp = 1000000;
double dmgdealt = 0;
long timeStartedHitting = 0;
long lastHitTime = 0;
int numbOfHits = 0;
Location spawnLoc;
List<Player> playerHitList = new ArrayList<Player>();
public Dummy(LivingEntity m) {
super(m);
m.setCustomName(ChatColor.MAGIC+" "+ChatColor.RESET+"Test Dummy"+ChatColor.MAGIC+" ");
m.setCustomNameVisible(true);
this.spawnLoc = m.getLocation();
//m.setCollidable(false);
m.setMaxHealth(maxhp);
m.setHealth(m.getMaxHealth());
m.setRemoveWhenFarAway(false);
if (m instanceof Villager) {
Villager v = (Villager)m;
v.setAdult();
v.setProfession(Profession.PRIEST);
}
}
public static boolean isDummy(LivingEntity m) {
boolean isDummy = (m.getMaxHealth()==maxhp && m instanceof Villager && ((Villager)m).getProfession()==Profession.PRIEST);
return isDummy;
}
public void runTick() {
if (numbOfHits>0 && lastHitTime+20*5<=TwosideKeeper.getServerTickTime()) {
for (Player p : playerHitList) {
p.sendMessage(getDamageOutput());
}
numbOfHits=0;
}
m.setHealth(maxhp);
m.teleport(spawnLoc);
Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, new MovementModifier(m,new Vector(0,0,0)), 1);
}
private String getDamageOutput() {
StringBuilder sb = new StringBuilder();
sb.append(m.getCustomName());
sb.append(" Results:");
sb.append("\n");
sb.append(ChatColor.GREEN);
sb.append("Total Damage: ");
DecimalFormat df = new DecimalFormat("0.00");
sb.append(df.format(dmgdealt));
sb.append("\n");
sb.append(ChatColor.YELLOW);
sb.append("DPS: ");
long duration = (TwosideKeeper.getServerTickTime()-timeStartedHitting)/20; //In seconds.
sb.append(df.format(dmgdealt/duration));
sb.append("\n");
sb.append(ChatColor.GRAY);
sb.append("Hits: ");
sb.append(numbOfHits);
sb.append(" (");
sb.append(" Avg ");
sb.append(df.format(dmgdealt/numbOfHits));
sb.append(" dmg)");
return sb.toString();
}
public void customHitHandler(Player p, double dmg) {
super.customHitHandler(p,dmg);
if (numbOfHits==0) {
timeStartedHitting=TwosideKeeper.getServerTickTime();
dmgdealt=0;
}
if (!playerHitList.contains(p)) {
playerHitList.add(p);
}
lastHitTime=TwosideKeeper.getServerTickTime();
numbOfHits++;
dmgdealt+=dmg;
}
}

@ -9,6 +9,7 @@ import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@ -199,6 +200,7 @@ public class PlayerStructure {
public boolean equiparmor=true;
public long lastpotionparticles=0;
public Location restartLoc = null; //Set to a value when the player has to be re-teleported after being controlled by a camera.
public long lastPoisonTick=0;
List<ItemStack> equipmentset = new ArrayList<ItemStack>();
@ -404,6 +406,13 @@ public class PlayerStructure {
workable.set("COOLDOWN_lastmock", last_mock);
workable.set("COOLDOWN_lastassassinatetime", lastassassinatetime);
workable.set("COOLDOWN_lastlifesavertime", lastlifesavertime);
int buffcounter=0;
for (String key : buffs.keySet()) {
Buff b = buffs.get(key);
SaveBuff(workable, buffcounter, key, b);
buffcounter++;
}
workable.set("BUFFCOUNT", buffcounter);
if (restartLoc!=null) {
workable.set("restartloc_x", restartLoc.getX());
workable.set("restartloc_y", restartLoc.getY());
@ -420,6 +429,16 @@ public class PlayerStructure {
}
}
private void SaveBuff(FileConfiguration workable, int buffcounter, String key, Buff b) {
workable.set("BUFF"+(buffcounter)+"_key", key);
workable.set("BUFF"+(buffcounter)+"_name", b.getDisplayName());
workable.set("BUFF"+(buffcounter)+"_duration", b.getRemainingBuffTime());
workable.set("BUFF"+(buffcounter)+"_amplifier", b.getAmplifier());
workable.set("BUFF"+(buffcounter)+"_color", b.getBuffParticleColor().asRGB());
workable.set("BUFF"+(buffcounter)+"_icon", b.getBuffIcon());
workable.set("BUFF"+(buffcounter)+"_isGoodBuff", b.isGoodBuff());
}
//Create a config for the player.
public void loadConfig(){
Player p = Bukkit.getPlayer(name);
@ -480,6 +499,7 @@ public class PlayerStructure {
workable.addDefault("COOLDOWN_lastmock", last_mock);
workable.addDefault("COOLDOWN_lastassassinatetime", lastassassinatetime);
workable.addDefault("COOLDOWN_lastlifesavertime", lastlifesavertime);
workable.addDefault("BUFFCOUNT", 0);
workable.options().copyDefaults();
@ -543,6 +563,26 @@ public class PlayerStructure {
this.restartLoc = new Location(Bukkit.getWorld(tempworld),workable.getDouble("restartloc_x"),workable.getDouble("restartloc_y"),workable.getDouble("restartloc_z"));
}
int buffcount = workable.getInt("BUFFCOUNT");
for (int i=0;i<buffcount;i++) {
/*Buff.addBuff(p, workable.getString("BUFF"+i+"_key"), new Buff(
workable.getString("BUFF"+i+"_name"),
workable.getLong("BUFF"+i+"_duration"),
workable.getInt("BUFF"+i+"_amplifier"),
Color.fromRGB(workable.getInt("BUFF"+i+"_color")),
workable.getString("BUFF"+i+"_icon"),
workable.getBoolean("BUFF"+i+"_isGoodBuff")
));*/
buffs.put(workable.getString("BUFF"+i+"_key"), new Buff(
workable.getString("BUFF"+i+"_name"),
workable.getLong("BUFF"+i+"_duration"),
workable.getInt("BUFF"+i+"_amplifier"),
Color.fromRGB(workable.getInt("BUFF"+i+"_color")),
workable.getString("BUFF"+i+"_icon"),
workable.getBoolean("BUFF"+i+"_isGoodBuff")
));
}
if (this.hasDied) {
List<ItemStack> deathlootlist = new ArrayList<ItemStack>();
//ConfigurationSection deathlootsection = workable.getConfigurationSection("deathloot");

@ -78,6 +78,7 @@ import org.bukkit.entity.Snowball;
import org.bukkit.entity.Snowman;
import org.bukkit.entity.ThrownPotion;
import org.bukkit.entity.TippedArrow;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Witch;
import org.bukkit.entity.Wither;
import org.bukkit.entity.WitherSkull;
@ -261,6 +262,7 @@ import sig.plugin.TwosideKeeper.HolidayEvents.TreeBuilder;
import sig.plugin.TwosideKeeper.Logging.BowModeLogger;
import sig.plugin.TwosideKeeper.Logging.LootLogger;
import sig.plugin.TwosideKeeper.Logging.MysteriousEssenceLogger;
import sig.plugin.TwosideKeeper.Monster.Dummy;
import sig.plugin.TwosideKeeper.Monster.HellfireGhast;
import sig.plugin.TwosideKeeper.Monster.HellfireSpider;
import sig.plugin.TwosideKeeper.Monster.MonsterTemplate;
@ -1819,6 +1821,13 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
new Buff("Bleeding",20*14,5,Color.MAROON,ChatColor.RED+"☣"),
});*/
}break;
case "TESTDUMMY":{
Villager dummy = (Villager)p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);
custommonsters.put(dummy.getUniqueId(),new Dummy(dummy));
}break;
case "POISON":{
Buff.addBuff(p, "Poison", new Buff("Poison",20*20,Integer.parseInt(args[1]),Color.YELLOW,ChatColor.YELLOW+"☣",false));
}break;
}
}
@ -3106,13 +3115,16 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
}
}
@EventHandler(priority=EventPriority.LOW)
@EventHandler(priority=EventPriority.LOW,ignoreCancelled=true)
public void onPlayerInteract(PlayerInteractEntityEvent ev) {
Player p = ev.getPlayer();
PlayerStructure pd = PlayerStructure.GetPlayerStructure(ev.getPlayer());
if (ev.getRightClicked() instanceof LivingEntity &&
!(ev.getRightClicked() instanceof Player)) {
LivingEntity ent = (LivingEntity)ev.getRightClicked();
if (Dummy.isDummy(ent)) {
ev.setCancelled(true);
}
if (Christmas.isWinterSolsticeAugury(p.getEquipment().getItemInMainHand()) &&
pd.icewandused+GenericFunctions.GetModifiedCooldown(TwosideKeeper.ICEWAND_COOLDOWN,ev.getPlayer())<getServerTickTime()) {
//Freeze the entity in the nearest grid-locked square and set the AI to false.
@ -4272,7 +4284,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
if (stackamt<5) {
Buff.removeBuff(m, "DeathMark");
} else {
Buff.addBuff(m, "DeathMark", new Buff("Death Mark",99,stackamt/2,Color.MAROON,ChatColor.DARK_RED+"☠"));
Buff.addBuff(m, "DeathMark", new Buff("Death Mark",99,stackamt/2,Color.MAROON,ChatColor.DARK_RED+"☠",false));
GenericFunctions.RefreshBuffColor(m, stackamt/2);
}
//player.playSound(m.getLocation(), Sound.ENTITY_ZOMBIE_BREAK_DOOR_WOOD, 1.0f, 1.0f);
@ -5936,6 +5948,10 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
public void updateMonsterFlags(LivingEntity m) {
LivingEntityStructure ms = LivingEntityStructure.GetLivingEntityStructure(m);
if (Dummy.isDummy(m)) {
TwosideKeeper.custommonsters.put(m.getUniqueId(), new Dummy(m));
return;
}
if (m instanceof Monster) {
MonsterDifficulty md = MonsterController.getMonsterDifficulty((Monster)m);
if (md == MonsterDifficulty.ELITE) {
@ -5945,9 +5961,11 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
m = MonsterController.convertMonster((Monster)m,md);
log("Setting a monster with Difficulty "+MonsterController.getMonsterDifficulty((Monster)m).name()+" w/"+m.getHealth()+"/"+m.getMaxHealth()+" HP to a Leader.",5);
ms.SetLeader(true);
return;
}
if (m instanceof Wither) {
ms.SetLeader(true);
return;
}
if (TwosideKeeper.ELITEGUARDIANS_ACTIVATED) {
if (m instanceof Guardian) {
@ -5956,6 +5974,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
ms.SetElite(true);
g.setCustomName(ChatColor.LIGHT_PURPLE+"Elite Guardian");
g.setCustomNameVisible(true);
return;
}
}
}

@ -58,6 +58,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Utils.MessageUtils;
import sig.plugin.TwosideKeeper.HelperStructures.Utils.PlayerUtils;
import sig.plugin.TwosideKeeper.HelperStructures.Utils.SoundUtils;
import sig.plugin.TwosideKeeper.HolidayEvents.Christmas;
import sig.plugin.TwosideKeeper.Monster.Dummy;
final class runServerHeartbeat implements Runnable {
/**
@ -257,6 +258,8 @@ final class runServerHeartbeat implements Runnable {
ManagePlayerScoreboardAndHealth(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Scoreboard/Health Management", (int)(System.nanoTime()-time));time=System.nanoTime();
PerformPoisonTick(p);
if (PlayerMode.isBarbarian(p)) {
AutoConsumeFoods(p);
TwosideKeeper.HeartbeatLogger.AddEntry("Auto Consume Food", (int)(System.nanoTime()-time));time=System.nanoTime();
@ -339,6 +342,30 @@ final class runServerHeartbeat implements Runnable {
TwosideKeeper.HeartbeatLogger.AddEntry(ChatColor.LIGHT_PURPLE+"Total Server Heartbeat", (int)(System.nanoTime()-totaltime));totaltime=System.nanoTime();
}
private void PerformPoisonTick(LivingEntity ent) {
if (ent instanceof Player) {
PlayerStructure pd = PlayerStructure.GetPlayerStructure((Player)ent);
if (Buff.hasBuff(ent, "Poison") && pd.lastPoisonTick+getPoisonTickDelay(ent)<=TwosideKeeper.getServerTickTime()) {
CustomDamage.ApplyDamage(Buff.getBuff(ent, "Poison").getAmplifier(), null, ent, null, "POISON", CustomDamage.IGNOREDODGE|CustomDamage.TRUEDMG);
pd.lastPoisonTick=TwosideKeeper.getServerTickTime();
}
} else {
LivingEntityStructure les = LivingEntityStructure.GetLivingEntityStructure(ent);
if (Buff.hasBuff(ent, "Poison") && les.lastPoisonTick+getPoisonTickDelay(ent)<=TwosideKeeper.getServerTickTime()) {
CustomDamage.ApplyDamage(Buff.getBuff(ent, "Poison").getAmplifier(), null, ent, null, "POISON", CustomDamage.IGNOREDODGE|CustomDamage.TRUEDMG);
les.lastPoisonTick=TwosideKeeper.getServerTickTime();
}
}
}
private double getPoisonTickDelay(LivingEntity ent) {
if (CustomDamage.getPoisonResistance(ent)>0.9) {
return 200;
} else {
return (1d/(1d-CustomDamage.getPoisonResistance(ent)))*20;
}
}
private void createPotionParticles(LivingEntity l) {
if (l instanceof Player) {
PlayerStructure pd = PlayerStructure.GetPlayerStructure((Player)l);
@ -897,7 +924,7 @@ final class runServerHeartbeat implements Runnable {
} else {
AddEliteStructureIfOneDoesNotExist(ms);
TwosideKeeper.HeartbeatLogger.AddEntry("Monster Management - Add Elite Structure", (int)(System.nanoTime()-time));time=System.nanoTime();
if (ms.GetTarget()!=null && ms.GetTarget().isValid() && !ms.GetTarget().isDead() && ms.m.hasAI()) {
if (ms.GetTarget()!=null && ms.GetTarget().isValid() && !ms.GetTarget().isDead() && ms.m.hasAI() && !Dummy.isDummy(ms.m)) {
//Randomly move this monster a tiny bit in case they are stuck.
double xdir=((ms.m.getLocation().getX()>ms.GetTarget().getLocation().getX())?-0.25:0.25)+(Math.random()/8)-(Math.random()/8);
double zdir=((ms.m.getLocation().getZ()>ms.GetTarget().getLocation().getZ())?-0.25:0.25)+(Math.random()/8)-(Math.random()/8);
@ -910,6 +937,8 @@ final class runServerHeartbeat implements Runnable {
TwosideKeeper.HeartbeatLogger.AddEntry("Monster Management - Create Potion Particles", (int)(System.nanoTime()-time));time=System.nanoTime();
LivingEntityStructure.UpdateMobName(ms.m);
TwosideKeeper.HeartbeatLogger.AddEntry("Monster Management - Update Mob Names", (int)(System.nanoTime()-time));time=System.nanoTime();
PerformPoisonTick(ms.m);
TwosideKeeper.HeartbeatLogger.AddEntry("Monster Management - Perform Poison Tick", (int)(System.nanoTime()-time));time=System.nanoTime();
}
}
}

Loading…
Cancel
Save