diff --git a/TwosideKeeper.jar b/TwosideKeeper.jar index 1856283..4f9df1c 100644 Binary files a/TwosideKeeper.jar and b/TwosideKeeper.jar differ diff --git a/src/sig/plugin/TwosideKeeper/CustomDamage.java b/src/sig/plugin/TwosideKeeper/CustomDamage.java index 6496d06..5a3b44c 100644 --- a/src/sig/plugin/TwosideKeeper/CustomDamage.java +++ b/src/sig/plugin/TwosideKeeper/CustomDamage.java @@ -790,7 +790,7 @@ public class CustomDamage { damage=0; } - if (damage>0 && GenericFunctions.AttemptRevive(p, damage, reason)) { + if (damage>0 && GenericFunctions.AttemptRevive(p, damager, damage, reason)) { damage=0; } @@ -2282,7 +2282,7 @@ public class CustomDamage { target.setLastDamage(0); target.setNoDamageTicks(0); target.setMaximumNoDamageTicks(0); - if (damager instanceof Player && target instanceof Player) { //PvP Checks + if (shooter instanceof Player && target instanceof Player) { //PvP Checks //!((Player)target).isOnline() //!damager.getWorld().getPVP() Player attacker = (Player)damager; @@ -2303,10 +2303,14 @@ public class CustomDamage { PVP.sendPvPRequest(attacker,defender); } } - return true; //Cancel all PvP related events. } } + if (shooter instanceof Player && !(target instanceof Player)) { + if (PVP.isPvPing((Player)shooter)) { + return true; //Can't hit non-PVP targets while PVP'ing. + } + } if (target instanceof Player && (((Player)target).getGameMode()==GameMode.SPECTATOR || ((Player)target).getGameMode()==GameMode.CREATIVE)) { return true; //Cancel any damage events in Spectator mode or Creative Mode. } diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java index c5de1c4..c284a59 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java @@ -3680,7 +3680,7 @@ public class GenericFunctions { return orb; } - public static boolean AttemptRevive(Player p, double dmg, String reason) { + public static boolean AttemptRevive(Player p, Entity damager, double dmg, String reason) { boolean revived=false; boolean fromRoom=false; if (p.getHealth()<=dmg) { @@ -3691,18 +3691,35 @@ public class GenericFunctions { pd.lasthitdesc=reason; pd.slayermodehp = p.getMaxHealth(); + if (damager!=null) { + LivingEntity shooter = CustomDamage.getDamagerEntity(damager); + if (shooter instanceof Player) { + Player pl = (Player)shooter; + pd.lastplayerHitBy = pl.getName(); + } + } + ItemStack[] equips = p.getEquipment().getArmorContents(); + if (!revived) { + if (PVP.isPvPing(p)) { + revived=true; + RevivePlayer(p, p.getMaxHealth()); + PVP session = PVP.getMatch(p); + session.onDeathEvent(p); + return true; //Intentionally prevent other revive effects from working. + } + } if (!revived) { - for (Room r : TwosideKeeper.roominstances) { - if (r.onPlayerDeath(p)) { - revived=true; - fromRoom=true; - RevivePlayer(p, p.getMaxHealth()); - return true; //Intentionally prevent other revive effects from working. - } + for (Room r : TwosideKeeper.roominstances) { + if (r.onPlayerDeath(p)) { + revived=true; + fromRoom=true; + RevivePlayer(p, p.getMaxHealth()); + return true; //Intentionally prevent other revive effects from working. } + } } if (!revived) { @@ -4926,7 +4943,7 @@ public class GenericFunctions { ItemSet.meetsSlayerSwordConditions(ItemSet.STEALTH, 9, 1, p)) { return; } else { - if (!aPlugin.API.isAFK(p)) { + if (!aPluginAPIWrapper.isAFK(p)) { ItemStack[] inv = p.getInventory().getContents(); for (int i=0;i<9;i++) { if (inv[i]!=null && diff --git a/src/sig/plugin/TwosideKeeper/HolidayEvents/Christmas.java b/src/sig/plugin/TwosideKeeper/HolidayEvents/Christmas.java index 4469465..fb7c1ad 100644 --- a/src/sig/plugin/TwosideKeeper/HolidayEvents/Christmas.java +++ b/src/sig/plugin/TwosideKeeper/HolidayEvents/Christmas.java @@ -762,7 +762,7 @@ public class Christmas { Block b = p.getWorld().getHighestBlockAt(p.getLocation().getBlockX()+blockx, p.getLocation().getBlockZ()+blockz); Block bbelow = b.getRelative(0, -1, 0); if (p.isOnGround()) { - if (!aPlugin.API.isAFK(p)) { + if (!aPluginAPIWrapper.isAFK(p)) { AddRocketBoosterCharges(p); } if (pd.falldamageimmunity && pd.lastusedrocketbooster+202) { + if (AllPlayersOnTeamDead(1)) { + team2score++; + deadTeam=true; + } else + if (AllPlayersOnTeamDead(2)){ + team1score++; + deadTeam=true; + } + } else { + for (String s : players.keySet()) { + PVPPlayer pp = players.get(s); + if (!pp.isAlive) { + deadTeam=true; + } + } + } + if (deadTeam) { + StringBuilder sb = PrepareCurrentScores(); + for (String s : players.keySet()) { + PVPPlayer pp = players.get(s); + Player p = Bukkit.getPlayer(s); + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + p.setHealth(p.getMaxHealth()); + p.sendMessage(sb.toString()); + pd.customtitle.modifySmallCenterTitle(ChatColor.GREEN+"Next match starting...", 100); + for (int i=0;i<5;i++) { + final int counter = i; + Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, ()->{ + if (p!=null && p.isOnline()) { + pd.customtitle.modifyLargeCenterTitle(ChatColor.GREEN+Integer.toString(5-counter), 20); + pd.customtitle.update(); + } + }, 20*i); + } + Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, ()->{ + if (p!=null && p.isOnline()) { + pp.isAlive=true; + p.setGameMode(GameMode.SURVIVAL); + Location myLoc = p.getLocation().clone(); + //myLoc.setY(p.getLocation().getChunk().getChunkSnapshot().getHighestBlockYAt(Math.floorMod(p.getLocation().getBlockX(),16), Math.floorMod(p.getLocation().getBlockZ(),16))); + p.teleport(pp.startingLoc); + } + }, 120); + } + } + } + } + + private StringBuilder PrepareCurrentScores() { + StringBuilder sb = new StringBuilder("\n\n"); + sb.append("------- PVP Match -------\n"); + if ((scorematch && players.size()==2) || (!scorematch)) { + DisplaySortedScoreboard(sb); + } else { + DisplayTeamScoreboard(sb); + } + sb.append("----- "); + sb.append(style.getTitle()); + sb.append(" -----"); + return sb; + } + + private void DisplayTeamScoreboard(StringBuilder sb) { + List sortedscores = new ArrayList(); + if (team1score>team2score) { + sortedscores.add(new Score(ChatColor.BLUE+"Team 1",team1score)); + sortedscores.add(new Score(ChatColor.RED+"Team 2",team2score)); + } else { + sortedscores.add(new Score(ChatColor.RED+"Team 2",team2score)); + sortedscores.add(new Score(ChatColor.BLUE+"Team 1",team1score)); + } + boolean alttext=false; + for (Score s : sortedscores) { + sb.append((alttext)?ChatColor.GRAY:ChatColor.WHITE); + sb.append(" "); + sb.append(s.name); + sb.append(" "); + for (int i=0;i scorelist= new ArrayList(); + for (String s : players.keySet()) { + PVPPlayer pp = players.get(s); + scorelist.add(new Score(s,pp.score)); + } + List sortedscores = new ArrayList(); + while (scorelist.size()>0) { + boolean found=false; + for (int i=0;isortedscores.get(i).score) { + sortedscores.add(i,scorelist.remove(0)); + found=true; + break; + } + } + if (!found) { + sortedscores.add(scorelist.remove(0)); + } + } + boolean alttext=false; + for (Score s : sortedscores) { + sb.append((alttext)?ChatColor.GRAY:ChatColor.WHITE); + sb.append(" "); + sb.append(s.name); + sb.append(" "); + for (int i=0;i members = getPlayersInTeam(teamnumb); + for (String s : members) { + PVPPlayer pp = players.get(s); + if (pp.isAlive) { + return false; + } + } + return true; + } + + private void resetTeams() { + for (String s : players.keySet()) { + PVP.setTeam("NEUTRAL", s); + Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, ()->{ + if (Bukkit.getPlayer(s)!=null && Bukkit.getPlayer(s).isOnline()) { + Bukkit.getPlayer(s).setGameMode(GameMode.SURVIVAL); + } + }, 5); + } + for (String s : losers) { + PVP.setTeam("NEUTRAL", s); + Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, ()->{ + if (Bukkit.getPlayer(s)!=null && Bukkit.getPlayer(s).isOnline()) { + Bukkit.getPlayer(s).setGameMode(GameMode.SURVIVAL); + } + }, 5); + } + } + private void computeWinner() { if (scorematch) { if (team1score>team2score) { for (String s : getPlayersInTeam(2)) { - + losers.add(s); + players.remove(s); } } else { - + for (String s : getPlayersInTeam(1)) { + losers.add(s); + players.remove(s); + } + } + } else { + int highestscore = Integer.MIN_VALUE; + String highestscoreplayer = ""; + for (String s : players.keySet()) { + PVPPlayer pp = players.get(s); + if (pp.score>highestscore) { + highestscoreplayer = s; + highestscore = pp.score; + } + } + List removals = new ArrayList(); + for (String s : players.keySet()) { + if (!s.equalsIgnoreCase(highestscoreplayer)) { + removals.add(s); + } + } + for (String s : removals) { + players.remove(s); + losers.add(s); } } } private boolean conditionsToWin() { if (scorematch) { - return (team1score>=scorelimit || team2score>=scorelimit); + return (team1score>=scorelimit || team2score>=scorelimit) || (players.size()==2 && PlayerHasReachedScoreLimit()); } else { return TwosideKeeper.getServerTickTime()>=timelimit; } } + private boolean PlayerHasReachedScoreLimit() { + for (String s : players.keySet()) { + PVPPlayer pp = players.get(s); + if (pp.score>=scorelimit) { + return true; + } + } + return false; + } + private void announceWinner() { String firstPlayer = null; + determineWinnerByEliminatingLosers(); for (String s : players.keySet()) { firstPlayer = s; break; @@ -304,6 +511,42 @@ public class PVP { } } + private void determineWinnerByEliminatingLosers() { + if (players.size()==2) { + String higherscoreplayer = ""; + int higherscore = Integer.MIN_VALUE; + for (String s : players.keySet()) { + PVPPlayer pp = players.get(s); + if (pp.score>higherscore) { + higherscoreplayer = s; + higherscore = pp.score; + } + } + List removals = new ArrayList(); + for (String s : players.keySet()) { + if (!s.equalsIgnoreCase(higherscoreplayer)) { + losers.add(s); + removals.add(s); + } + } + for (String s : removals) { + players.remove(s); + } + } else { + if (team1score>team2score) { + for (String s : getPlayersInTeam(2)) { + losers.add(s); + players.remove(s); + } + } else { + for (String s : getPlayersInTeam(1)) { + losers.add(s); + players.remove(s); + } + } + } + } + private void removeInactivePlayers() { String removedPlayer = null; for (String s : players.keySet()) { @@ -385,9 +628,9 @@ public class PVP { } pp.lastLoc = Bukkit.getPlayer(s).getLocation().clone(); Bukkit.getPlayer(s).sendMessage(ChatColor.GREEN+"The PVP Match between "+getParticipants()+" has begun!"); - aPlugin.API.discordSendRawItalicized("The PVP Match between **"+getParticipants()+"** has begun!"); } } + aPlugin.API.discordSendRawItalicized("The PVP Match between **"+getParticipants()+"** has begun!"); } private void DisplayStageChoices() { @@ -638,6 +881,10 @@ public class PVP { public static void setTeam(String teamName, Player p) { teams.put(p.getName(), teamName); } + + private static void setTeam(String teamName, String s) { + teams.put(s, teamName); + } public static void setOnSameTeam(Player p, Player...allies) { addPlayerToTeamStructure(p); @@ -670,6 +917,30 @@ public class PVP { base.addExtra(tc2); defender.spigot().sendMessage(base); } + + public void onDeathEvent(Player p) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + if (pd.lastplayerHitBy!=null && + players.containsKey(pd.lastplayerHitBy)) { + String killedByPlayer = pd.lastplayerHitBy; + PVPPlayer killer = players.get(killedByPlayer); + killer.score++; + PVPPlayer myself = players.get(p.getName()); + if (!scorematch) { + myself.score--; + } + myself.isAlive=false; + p.setGameMode(GameMode.SPECTATOR); + p.setSpectatorTarget(Bukkit.getPlayer(killedByPlayer)); + p.sendMessage(" Killed by "+ChatColor.RED+killedByPlayer+ChatColor.RESET+"."); + } + /*if (getPlayersInTeam(1).contains(killer)) { + team1score++; + } else { + team2score++; + }*/ + + } } class PVPPlayer { @@ -678,6 +949,8 @@ class PVPPlayer { Location lastLoc; PVPOption choice; int team; + boolean isAlive; + long respawnTimer; PVPPlayer() { score=0; @@ -685,6 +958,7 @@ class PVPPlayer { choice=PVPOption.NONE; lastLoc=null; team=0; + isAlive=true; } } @@ -698,6 +972,15 @@ enum CHOICEENGINE { FINISHED, //Any cleanup that has to be done. Warp all players back. } +class Score{ + String name; + int score; + Score(String name, int score) { + this.name=name; + this.score=score; + } +} + enum PVPOption { NONE(0,"No Choice","Hey look! It's my favorite streamer! The one and only >>Legendary<<, yes LEGENDARY Captain_Marrow aka Storm! We break ultimate plates, alchemize Artifacts, miss skillshots, break Master Swords, collect food because we cannot dodge the Ganon, deny our combat-buddies from keeping their legendary equipment, and jump off boats right before they leave ( cy@ VoHiYo )! Come join the fun! Kappa"), ROUNDS3(1,ChatColor.WHITE+"Best of 3","The team that wins 2 of 3 total rounds wins the duel."), diff --git a/src/sig/plugin/TwosideKeeper/PartyManager.java b/src/sig/plugin/TwosideKeeper/PartyManager.java index 0bd0980..b574cdf 100644 --- a/src/sig/plugin/TwosideKeeper/PartyManager.java +++ b/src/sig/plugin/TwosideKeeper/PartyManager.java @@ -8,6 +8,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import net.md_5.bungee.api.ChatColor; +import net.minecraft.server.v1_9_R1.Scoreboard; +import net.minecraft.server.v1_9_R1.ScoreboardObjective; import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; import sig.plugin.TwosideKeeper.HelperStructures.Utils.TextUtils; @@ -21,12 +23,19 @@ public class PartyManager { totalparties=0; ClearAllParties(); for (Player p : Bukkit.getOnlinePlayers()) { - if (!IsInParty(p)) { - //We only care about adding a player that's not in a party already. - //We have to make a new party for this player. - AddPlayerToParty(p,totalparties++); - //Now find nearby players and add them to this party. - AddNearbyPlayersToSameParty(p); + if (!PVP.isPvPing(p)) { + if (!IsInParty(p)) { + //We only care about adding a player that's not in a party already. + //We have to make a new party for this player. + AddPlayerToParty(p,totalparties++); + //Now find nearby players and add them to this party. + AddNearbyPlayersToSameParty(p); + } + } else { + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives remove Party"+pd.previousparty); + pd.currentparty=-1; + pd.partybonus=0; } } UpdatePartyScoreboards(); diff --git a/src/sig/plugin/TwosideKeeper/PlayerStructure.java b/src/sig/plugin/TwosideKeeper/PlayerStructure.java index 0508e24..9a4cab4 100644 --- a/src/sig/plugin/TwosideKeeper/PlayerStructure.java +++ b/src/sig/plugin/TwosideKeeper/PlayerStructure.java @@ -273,6 +273,7 @@ public class PlayerStructure { public int afkLength = 60; public boolean isAFKState = false; public int unafkLength = 0; + public int gracePeriod = 0; //Prevent Automatic AFK moving the camera just to avoid the system. public long lastAdjustmentReading = 0; //When the last adjustment reading started. @@ -282,6 +283,8 @@ public class PlayerStructure { public int averageAdjustmentsMadeCount = 0; //Stored number of adjustments used in average. public boolean tooConsistentAdjustments = false; //Adjustments are too consistent. + public String lastplayerHitBy = ""; //The last player that hurt this player. + //Needs the instance of the player object to get all other info. Only to be called at the beginning. @SuppressWarnings("deprecation") public PlayerStructure(Player p, long serverTickTime) { diff --git a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java index 4c081f5..06dc541 100644 --- a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java +++ b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java @@ -137,6 +137,7 @@ import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerFishEvent.State; +import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemBreakEvent; @@ -1044,17 +1045,21 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public static void SetupAndModifyDurabilities(Player p) { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); if (aPluginAPIWrapper.isAFK(p)) { - pd.actionRecords++; if (pd.durability.size()!=9) { PopulateDurabilityValues(p); } else { //See if durability values are different. If so, multiply the difference. List diff = GetDifferences(p); - for (int i=0;i<9;i++) { - if (diff.get(i)>0) { - aPlugin.API.damageItem(p, p.getInventory().getItem(i), (int)(diff.get(i)*PlayerStructure.getAFKMultiplier(p))); - TwosideKeeper.log(" Damaged item slot"+i+" an extra "+((int)(diff.get(i)*PlayerStructure.getAFKMultiplier(p)))+" damage due to AFK state.", 2); + if (pd.gracePeriod==0) { + for (int i=0;i<9;i++) { + if (diff.get(i)>0) { + pd.actionRecords+=5; + aPlugin.API.damageItem(p, p.getInventory().getItem(i), (int)(diff.get(i)*PlayerStructure.getAFKMultiplier(p))); + TwosideKeeper.log(" Damaged item slot"+i+" an extra "+((int)(diff.get(i)*PlayerStructure.getAFKMultiplier(p)))+" damage due to AFK state.", 2); + } } + } else { + pd.gracePeriod--; } PopulateDurabilityValues(p); } @@ -1584,6 +1589,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { sender.sendMessage(ChatColor.WHITE+Display("HIT",pd.hitlist.size())+Display("ITE",pd.itemcubelist.size())+Display("LAS",pd.lasteffectlist.size())); sender.sendMessage(ChatColor.WHITE+Display("BLO",pd.blockscanlist.size())+Display("AFK",pd.afkLength)+Display("UAFK",pd.unafkLength)); sender.sendMessage(ChatColor.WHITE+Display("AAVG",(int)pd.averageAdjustmentsMade)+Display("AVGC",(int)pd.averageAdjustmentsMadeCount)+Display("ACT",pd.actionRecords)); + sender.sendMessage(ChatColor.WHITE+Display("ADJ",(int)pd.adjustmentReading)); } else { sender.sendMessage("Could not find player "+ChatColor.YELLOW+args[0]+ChatColor.RESET+"!"); } @@ -3217,6 +3223,9 @@ public class TwosideKeeper extends JavaPlugin implements Listener { GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.NIGHT_VISION,ev.getPlayer()); GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.LEVITATION,ev.getPlayer()); GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.JUMP,ev.getPlayer()); + if (TwosideKeeper.SERVER_TYPE!=ServerType.TEST) { + ev.getPlayer().setGameMode(GameMode.SURVIVAL); + } runServerHeartbeat.UpdatePlayerScoreboardAndHealth(ev.getPlayer()); ev.getPlayer().getAttribute(Attribute.GENERIC_ATTACK_SPEED).setBaseValue(4.0d); @@ -3284,6 +3293,16 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard players reset "+ev.getPlayer().getName().toLowerCase()); log("[TASK] Player Data for "+ev.getPlayer().getName()+" has been removed. Size of array: "+playerdata.size(),4); } + + @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) + public void onPlayerModeChange(PlayerGameModeChangeEvent ev) { + if (ev.getNewGameMode()==GameMode.SURVIVAL && + PVP.isPvPing(ev.getPlayer()) && + !PVP.getMatch(ev.getPlayer()).players.get(ev.getPlayer().getName()).isAlive) { + ev.getPlayer().sendMessage("You must wait for the next round before respawning!"); + ev.setCancelled(true); + } + } @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void onPlayerChat(final AsyncPlayerChatEvent ev) { @@ -8057,8 +8076,8 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.getEntity() instanceof Monster) { Player p = (Player)ev.getTarget(); Monster m = (Monster)ev.getEntity(); - if (GenericFunctions.hasStealth(p) && - m.getTarget()==null) { + if (PVP.isPvPing(p) || (GenericFunctions.hasStealth(p) && + m.getTarget()==null)) { ev.setCancelled(true); return; } @@ -9024,6 +9043,54 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } } + /*Material type = ev.getBlock().getType(); + Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, ()->{ + StringBuilder blockmap = new StringBuilder(""); + for (int y=0;y<2;y++) { + for (int z=-2;z<3;z++) { + for (int x=-2;x<3;x++) { + blockmap.append(ev.getPlayer().getLocation().getBlock().getRelative(x, y, z).getType().name().substring(0, 1)); + } + blockmap.append("\n"); + } + blockmap.append(ChatColor.DARK_RED+"\n\n"); + } + p.sendMessage(blockmap.toString()); + }, 1);*/ + /** + * EXPERIMENTAL BLOCK ANTI-LAG CODE. + */ + Bukkit.getScheduler().runTaskLater(TwosideKeeper.plugin, ()->{ + Block baseblock = ev.getPlayer().getLocation().getBlock().getRelative(0, 1, 0); + Block targetblock = ev.getBlock(); + Vector diffs = new Vector(targetblock.getLocation().getBlockX()-baseblock.getLocation().getBlockX(), + targetblock.getLocation().getBlockY()-baseblock.getLocation().getBlockY(), + targetblock.getLocation().getBlockZ()-baseblock.getLocation().getBlockZ()); + //TwosideKeeper.log("Vector is "+diffs, 1); + diffs = diffs.multiply(1d/largestVector(diffs)); + Location pointerloc = p.getLocation().add(new Vector(0,p.getEyeHeight()+0.01,0)); + //TwosideKeeper.log("Vector is "+diffs, 1); + int iterations = 0; + int distance = (int)baseblock.getLocation().distance(targetblock.getLocation())+1; + while (iterationslargestvector) { + largestvector = Math.abs(diffs.getX()); + } + if (Math.abs(diffs.getY())>largestvector) { + largestvector = Math.abs(diffs.getY()); + } + if (Math.abs(diffs.getZ())>largestvector) { + largestvector = Math.abs(diffs.getZ()); + } + return largestvector; + } + @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) public void onaPluginPickupEvent(PlayerGainItemEvent ev) { TwosideKeeper.log("["+TwosideKeeper.getServerTickTime()+"] PlayerGainItemEvent fired w/ "+ev.getItemStack(), 4); Player p = ev.getPlayer(); diff --git a/src/sig/plugin/TwosideKeeper/aPluginAPIWrapper.java b/src/sig/plugin/TwosideKeeper/aPluginAPIWrapper.java index e7e9e00..1b510e6 100644 --- a/src/sig/plugin/TwosideKeeper/aPluginAPIWrapper.java +++ b/src/sig/plugin/TwosideKeeper/aPluginAPIWrapper.java @@ -25,6 +25,7 @@ public class aPluginAPIWrapper { } if (pd.isAFKState) { pd.isAFKState=false; + pd.gracePeriod=3; TwosideKeeper.log(">>Player "+p.getName()+" is no longer AFK.", 2); } return true; diff --git a/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java b/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java index 09e0e5d..a7fc85e 100644 --- a/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java +++ b/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java @@ -239,7 +239,7 @@ final public class runServerHeartbeat implements Runnable { TwosideKeeper.HeartbeatLogger.AddEntry("Purchase Notification Sending", (int)(System.nanoTime()-time));time=System.nanoTime(); long notafktime = System.nanoTime(); - if (!aPlugin.API.isAFK(p)) { + if (!aPluginAPIWrapper.isAFK(p)) { EndShopSession(p); TwosideKeeper.HeartbeatLogger.AddEntry("End Shop Session", (int)(System.nanoTime()-time));time=System.nanoTime(); @@ -432,6 +432,9 @@ final public class runServerHeartbeat implements Runnable { //TwosideKeeper.log("Current adjustment reading: "+pd.averageAdjustmentsMade+" <--> "+pd.adjustmentReading, 2); if (Math.abs(pd.adjustmentReading-pd.averageAdjustmentsMade)<=2 && pd.averageAdjustmentsMadeCount>=10) { //Too consistent. pd.readingBroken++; + if (pd.gracePeriod>0) { + pd.gracePeriod--; + } else if (pd.readingBroken>=3) { pd.tooConsistentAdjustments=true; }