diff --git a/TwosideKeeper.jar b/TwosideKeeper.jar index 5ce0ea1..3e4f2a8 100644 Binary files a/TwosideKeeper.jar and b/TwosideKeeper.jar differ diff --git a/src/plugin.yml b/src/plugin.yml index b95f695..4511b72 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: TwosideKeeper main: sig.plugin.TwosideKeeper.TwosideKeeper -version: 3.5.3 +version: 3.5.4 commands: money: description: Tells the player the amount of money they are holding. diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/ArtifactAbility.java b/src/sig/plugin/TwosideKeeper/HelperStructures/ArtifactAbility.java index 6bffb47..bb1250e 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/ArtifactAbility.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/ArtifactAbility.java @@ -64,7 +64,7 @@ public enum ArtifactAbility { new double[]{1.0,0.90,0.85,0.8,0.75,0.7,0.6,0.55,0.5,0.45},100,1,UpgradePath.ARMOR), STATUS_EFFECT_RESISTANCE("Resistance","When a debuff is applied, there is a [VAL]% chance to remove it.",new double[]{3,3.5,4,4.5,5,5.5,6,6.5,7,7.5}, new double[]{4.0,3.85,3.70,3.55,3.40,3.25,3.10,2.95,2.80,2.65},100,1,UpgradePath.ARMOR), - SHADOWWALKER("Shadow Walker",ChatColor.GRAY+"Increases your speed in dark areas. Damage Reduction increases by [VAL]% in dark areas. Dodge chance increases by [DODGEVAL]% in dark areas.",new double[]{5,5,5,5,5,5,5,5,5,5}, + SHADOWWALKER("Shadow Walker","Increases your speed in dark areas. Damage Reduction increases by [VAL]% in dark areas. Dodge chance increases by [DODGEVAL]% in dark areas.",new double[]{5,5,5,5,5,5,5,5,5,5}, new double[]{1.5,1.4,1.3,1.2,1.1,1.0,0.9,0.8,0.7,0.55},100,10,UpgradePath.ARMOR), /*SURVIVOR("Survivor",ChatColor.GRAY+"[Unimplemented] Taking fatal damage will not kill you and instead consume this ability, removes all debuffs, and restoring your health.",new double[]{-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0}, new double[]{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},1,1000,UpgradePath.ARMOR),*/ @@ -107,9 +107,9 @@ public enum ArtifactAbility { new double[]{0.6,0.575,0.55,0.525,0.5,0.475,0.45,0.425,0.4,0.375},100,10,UpgradePath.SCYTHE), //General abilities - AUTOREPAIR("Auto Repair","1% chance to repair [VAL] durability to the artifact item every second.\n\nThe item must be sitting in your hotbar or must be equipped for this ability to work.",new double[]{15,16,17,18,19,20,21,22,23,24}, + AUTOREPAIR("Auto Repair","1% chance every second to repair [VAL] durability to the artifact item\n\nThe item must be sitting in your hotbar or must be equipped for this ability to work. This ability is less effective with no sunlight!",new double[]{6,7,8,9,10,11,12,13,14,15}, new double[]{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0},10,1,UpgradePath.ALL), - GREED("Greed","Increases Drop rate by [VAL]% . Health is halved, health regeneration is halved, and damage reduction is halved. Consumes one level of Greed per level up.",new double[]{50,50,50,50,50,50,50,50,50,50}, + GREED("Greed","Increases Drop rate by [VAL]% . Health is halved, health regeneration is halved, and damage reduction is halved. Consumes one level of Greed per level up.",new double[]{50,55,60,65,70,75,80,85,90,95}, new double[]{2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0},100,10,UpgradePath.ALL), /*GROWTH("Growth",ChatColor.GRAY+"[Unimplemented] Increases artifact EXP gained by [VAL]% . Health is halved, health regeneration is halved, and damage reduction is halved. Consumes one level of Growth per level up.",new double[]{100,100,100,100,100,100,100,100,100,100}, new double[]{2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0},100,1000,UpgradePath.ALL),*/ diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java index 026e5aa..7c7cb0e 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java @@ -18,6 +18,9 @@ import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; import org.bukkit.entity.Skeleton.SkeletonType; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -32,6 +35,7 @@ import com.google.common.collect.Iterables; import sig.plugin.TwosideKeeper.Artifact; import sig.plugin.TwosideKeeper.AwakenedArtifact; import sig.plugin.TwosideKeeper.MonsterController; +import sig.plugin.TwosideKeeper.MonsterStructure; import sig.plugin.TwosideKeeper.PlayerStructure; import sig.plugin.TwosideKeeper.TwosideKeeper; import sig.plugin.TwosideKeeper.HelperStructures.ArtifactAbility; @@ -2036,7 +2040,7 @@ public class GenericFunctions { item.getType()!=Material.AIR) { int mendinglv = item.getEnchantmentLevel(Enchantment.MENDING); int infinitylv = item.getEnchantmentLevel(Enchantment.ARROW_INFINITE); - if (mendinglv>0 && Math.random()<=0.00048828125) { + if (mendinglv>0 && Math.random()<=0.00048828125*(isHarvestingTool(item)?0.75:1d)) { mendinglv--; if (mendinglv>0) { item.addUnsafeEnchantment(Enchantment.MENDING, mendinglv); @@ -2045,7 +2049,7 @@ public class GenericFunctions { } p.sendMessage(ChatColor.DARK_AQUA+"A level of "+ChatColor.YELLOW+"Mending"+ChatColor.DARK_AQUA+" has been knocked off of your "+((item.hasItemMeta() && item.getItemMeta().hasDisplayName())?item.getItemMeta().getDisplayName():UserFriendlyMaterialName(item))); } - if (infinitylv>0 && Math.random()<=0.00048828125) { + if (infinitylv>0 && Math.random()<=0.00048828125*(isHarvestingTool(item)?0.75:1d)) { infinitylv--; if (infinitylv>0) { item.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, infinitylv); @@ -2064,12 +2068,12 @@ public class GenericFunctions { for (int i=0;i=0 && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { dodgechance+=0.01*p.getEquipment().getArmorContents()[i].getEnchantmentLevel(Enchantment.LUCK); } } if (ArtifactAbility.containsEnchantment(ArtifactAbility.SHADOWWALKER, p.getEquipment().getItemInMainHand()) && - p.isOnGround() && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { + p.isOnGround() && p.getLocation().getY()>=0 && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { dodgechance+=0.01*p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.LUCK); } @@ -2089,6 +2093,10 @@ public class GenericFunctions { if (Math.random() <= repairamt%1) { repairamt++; } + if (p.getLocation().getY()>=0 && p.getLocation().getBlock().getLightFromSky()==0) { + repairamt/=2.0d; + //TwosideKeeper.log("In Darkness.",2); + } double chance = 1; if (Math.random()<=chance/100d) { if (p.getInventory().getItem(i).getDurability()-repairamt<0) { @@ -2110,6 +2118,10 @@ public class GenericFunctions { if (Math.random() <= repairamt%1) { repairamt++; } + if (p.getLocation().getY()>=0 && p.getLocation().getBlock().getLightFromSky()==0) { + repairamt/=2.0d; + //TwosideKeeper.log("In Darkness.",2); + } double chance = 1; if (Math.random()<=chance/100d) { if (equip.getDurability()-repairamt<0) { @@ -2139,40 +2151,24 @@ public class GenericFunctions { if ((target instanceof Monster) && damager!=null) { Monster m = (Monster)target; m.setTarget(damager); + if (TwosideKeeper.monsterdata.containsKey(m.getUniqueId())) { + MonsterStructure ms = (MonsterStructure)TwosideKeeper.monsterdata.get(m.getUniqueId()); + ms.SetTarget(damager); + } else { + TwosideKeeper.monsterdata.put(m.getUniqueId(),new MonsterStructure(damager)); + } } if (target.getHealth()>finaldmg) { + TwosideKeeper.log("NOT FULL HEALTH", 5); target.setHealth(target.getHealth()-finaldmg); - if (damager!=null) { - target.damage(0.01); - if (target instanceof Monster) { - Monster m = (Monster)target; - m.setTarget(damager); - } - } else { - target.damage(0.01,damager); - } + target.damage(0.01); + target.setNoDamageTicks(20); } else { - if (target instanceof Monster) { - Monster m = (Monster)target; - m.setTarget(damager); - } - target.setHealth(0.0001); - target.removePotionEffect(PotionEffectType.DAMAGE_RESISTANCE); - if (damager!=null) { - target.damage(0.1); - if (target instanceof Monster) { - Monster m = (Monster)target; - m.setTarget(damager); - } - if (!(target instanceof Player)) { - target.setHealth(0.0); - } - } else { - target.damage(0.1,damager); - if (!(target instanceof Player)) { - target.setHealth(0.0); - } - } + //Bukkit.getPluginManager().callEvent(new EntityDamageByEntityEvent(damager,target,DamageCause.ENTITY_ATTACK,finaldmg)); + //target.setHealth(0); + target.setHealth(0.1); + target.damage(9999999); + target.setNoDamageTicks(20); } } } diff --git a/src/sig/plugin/TwosideKeeper/MonsterStructure.java b/src/sig/plugin/TwosideKeeper/MonsterStructure.java new file mode 100644 index 0000000..6eaf811 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/MonsterStructure.java @@ -0,0 +1,26 @@ +package sig.plugin.TwosideKeeper; + +import org.bukkit.entity.LivingEntity; + +public class MonsterStructure { + public LivingEntity target; + + public MonsterStructure() { + target=null; + } + public MonsterStructure(LivingEntity target) { + this.target=target; + } + + public LivingEntity GetTarget() { + if (this.target!=null && + !this.target.isDead()) { + return this.target; + } else { + return null; + } + } + public void SetTarget(LivingEntity target) { + this.target=target; + } +} diff --git a/src/sig/plugin/TwosideKeeper/PlayerStructure.java b/src/sig/plugin/TwosideKeeper/PlayerStructure.java index d49a498..d8b3813 100644 --- a/src/sig/plugin/TwosideKeeper/PlayerStructure.java +++ b/src/sig/plugin/TwosideKeeper/PlayerStructure.java @@ -60,6 +60,7 @@ public class PlayerStructure { public long last_strikerspell=TwosideKeeper.getServerTickTime(); public boolean highwinder=false; public double highwinderdmg=0.0; + public int nextarrowxp = 0; //How much bonus XP to give to an Artifact Bow. public double prev_weapondmg=0.0; public double prev_buffdmg=0.0; @@ -98,6 +99,7 @@ public class PlayerStructure { this.last_swordhit=TwosideKeeper.getServerTickTime(); this.highwinder=false; this.highwinderdmg=0.0; + this.nextarrowxp=0; this.last_strikerspell=TwosideKeeper.getServerTickTime(); //Set defaults first, in case this is a new user. loadConfig(); diff --git a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java index c5c1462..bb376ad 100644 --- a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java +++ b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Random; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -216,6 +217,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public static ServerType SERVER_TYPE=ServerType.TEST; //The type of server this is running on. public static File filesave; public static HashMap playerdata; + public static HashMap monsterdata; public static SpleefManager TwosideSpleefGames; public static WorldShopManager TwosideShops; public static MysteriousEssenceLogger EssenceLogger; //The logger for Essences. @@ -321,8 +323,9 @@ public class TwosideKeeper extends JavaPlugin implements Listener { TwosideShops = new WorldShopManager(); //Initialize Player Data structure. - playerdata = new HashMap(); + playerdata = new HashMap(); banksessions = new HashMap(); + monsterdata = new HashMap(); //tpstracker = new Lag(); @@ -332,7 +335,6 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //playerdata.add(new PlayerStructure((Player)Bukkit.getOnlinePlayers().toArray()[i],getServerTickTime())); } Player p; - //Announce the server has restarted soon after. if (SERVER_TYPE!=ServerType.QUIET) { Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @@ -390,7 +392,9 @@ public class TwosideKeeper extends JavaPlugin implements Listener { if (SERVER_TYPE==ServerType.MAIN) { //Only perform this on the official servers. Test servers do not require constant updating. //Every 5 minutes, check for a plugin update. - Bukkit.getScheduler().scheduleSyncRepeatingTask(this, pluginupdater, 20*300, 20*300); + if (!restarting_server) { + Bukkit.getScheduler().scheduleSyncRepeatingTask(this, pluginupdater, 20*300, 20*300); + } } getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){ @@ -599,12 +603,12 @@ public class TwosideKeeper extends JavaPlugin implements Listener { }*/ for (int i3=0;i3=0 && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,20,2)); } } if (ArtifactAbility.containsEnchantment(ArtifactAbility.SHADOWWALKER, p.getEquipment().getItemInMainHand()) && - p.isOnGround() && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { + p.isOnGround() && p.getLocation().getY()>=0 && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,20,2)); //log("Apply speed. The light level here is "+p.getLocation().add(0,-1,0).getBlock().getLightLevel(),2); } @@ -1751,6 +1755,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //This has stacks, burst! bursted=true; aPlugin.API.sendCooldownPacket(player, player.getEquipment().getItemInMainHand(), 240); + aPlugin.API.sendCooldownPacket(player, player.getEquipment().getItemInMainHand(), 240); pd.last_deathmark = getServerTickTime(); int stackamt = GenericFunctions.GetDeathMarkAmt(m); GenericFunctions.DealDamageToMob(stackamt*dmg, m, player, true); @@ -2513,23 +2518,37 @@ public class TwosideKeeper extends JavaPlugin implements Listener { PlayerStructure pd = (PlayerStructure)playerdata.get(ev.getPlayer().getUniqueId()); if (ev.getPlayer().isOnGround() && pd.last_strikerspell+160 droplist = ev.getDrops(); - log("Drop list contains "+droplist.size()+" elements.",2); - log(" Drops ["+droplist.size()+"]: "+droplist.toString(),3); Monster m = (Monster)ev.getEntity(); double dropmult = 0.0d; boolean isBoss=false; boolean killedByPlayer = false; final Location deathloc = m.getLocation(); - - if (m.getTarget()!=null && (m.getTarget() instanceof Player)) { + MonsterStructure ms = null; + if (monsterdata.containsKey(m.getUniqueId())) { + log("Killed by a player.",5); killedByPlayer = true; + ms = (MonsterStructure)monsterdata.get(m.getUniqueId()); } - if (m.getTarget() instanceof Player) { - Player p = (Player)m.getTarget(); - PlayerStructure pd = (PlayerStructure)playerdata.get(p.getUniqueId()); - dropmult+=pd.partybonus*0.33; //Party bonus increases drop rate by 33% per party member. - ItemStack item = p.getEquipment().getItemInMainHand(); - if (item!=null && - item.getType()!=Material.AIR && - GenericFunctions.isWeapon(item)) { - dropmult+=item.getEnchantmentLevel(Enchantment.LOOT_BONUS_MOBS)*0.1; //Looting increases drop rate by 10% per level. - } - for (int i=0;i originaldroplist = new ArrayList(); + for (int i=0;i drop = new ArrayList(); drop.addAll(droplist); @@ -4115,9 +4182,13 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //Determine EXP amount and explosion type. switch (MonsterController.getMonsterDifficulty(m)) { + case NORMAL: + droplist.addAll(originaldroplist); + break; case DANGEROUS: totalexp=ev.getDroppedExp()*4; ev.setDroppedExp((int)(totalexp*0.75)); + droplist.addAll(originaldroplist); break; case DEADLY: m.getWorld().playSound(m.getLocation(), Sound.ENTITY_CREEPER_PRIMED, 1.0f, 1.0f); @@ -4126,6 +4197,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { final Monster mer = m; final int expdrop = totalexp; droplist.clear(); //Clear the drop list. We are going to delay the drops. + droplist.addAll(originaldroplist); Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { public void run() { if (mer.getLocation().getBlockY()<48) { @@ -4152,6 +4224,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { final Monster mer1 = m; final int expdrop1 = totalexp; droplist.clear(); //Clear the drop list. We are going to delay the drops. + droplist.addAll(originaldroplist); Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { public void run() { if (mer1.getLocation().getBlockY()<48) { @@ -4172,7 +4245,12 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ,50); break; } - + log("Drop list contains "+(droplist.size()+originaldroplist.size())+" elements.",5); + log(" Drops ["+(drop.size()+originaldroplist.size())+"]: "+originaldroplist.toString()+","+drop.toString(),3); + } + + if (monsterdata.containsKey(m.getUniqueId())) { + monsterdata.remove(m.getUniqueId()); } } } @@ -4269,14 +4347,15 @@ public class TwosideKeeper extends JavaPlugin implements Listener { List affected = ev.getAffectedEntities(); for (int i=0;i0) { + AwakenedArtifact.addPotentialEXP(p.getEquipment().getItemInMainHand(), pd.nextarrowxp, p); + pd.nextarrowxp=0; + } + } if (ev.getEntityType()==EntityType.PLAYER && (ev.getProjectile().getType()==EntityType.ARROW || ev.getProjectile().getType()==EntityType.TIPPED_ARROW)) { @@ -6095,9 +6197,10 @@ public class TwosideKeeper extends JavaPlugin implements Listener { PlayerStructure pd = (PlayerStructure)playerdata.get(p.getUniqueId()); partylevel = pd.partybonus; if (partylevel>9) {partylevel=9;} - log("Light level: "+p.getLocation().add(0,0,0).getBlock().getLightLevel(),5); + if (p.getLocation().getY()>=0) {log("Light level: "+p.getLocation().add(0,0,0).getBlock().getLightLevel(),5);} for (int i=0;i=0 && p.isOnGround() && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) { double dmgreduce = 1d-(ArtifactAbility.calculateValue(ArtifactAbility.SHADOWWALKER, p.getEquipment().getArmorContents()[i].getEnchantmentLevel(Enchantment.LUCK), ArtifactAbility.getEnchantmentLevel(ArtifactAbility.SHADOWWALKER, p.getEquipment().getArmorContents()[i]))/100d); basedmg *= dmgreduce;