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;