Added PVP Scoreboard displays, fleshed out more PVP bugs. Added

experimental anti-lag block breaking code in hopes of making Efficiency
X tools much better to use.
This commit is contained in:
sigonasr2 2017-06-07 21:12:55 -05:00
parent 245b3f5e07
commit 8570e2706f
11 changed files with 433 additions and 33 deletions

Binary file not shown.

View File

@ -790,7 +790,7 @@ public class CustomDamage {
damage=0; damage=0;
} }
if (damage>0 && GenericFunctions.AttemptRevive(p, damage, reason)) { if (damage>0 && GenericFunctions.AttemptRevive(p, damager, damage, reason)) {
damage=0; damage=0;
} }
@ -2282,7 +2282,7 @@ public class CustomDamage {
target.setLastDamage(0); target.setLastDamage(0);
target.setNoDamageTicks(0); target.setNoDamageTicks(0);
target.setMaximumNoDamageTicks(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() //!((Player)target).isOnline()
//!damager.getWorld().getPVP() //!damager.getWorld().getPVP()
Player attacker = (Player)damager; Player attacker = (Player)damager;
@ -2303,10 +2303,14 @@ public class CustomDamage {
PVP.sendPvPRequest(attacker,defender); PVP.sendPvPRequest(attacker,defender);
} }
} }
return true; //Cancel all PvP related events. 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)) { 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. return true; //Cancel any damage events in Spectator mode or Creative Mode.
} }

View File

@ -3680,7 +3680,7 @@ public class GenericFunctions {
return orb; 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 revived=false;
boolean fromRoom=false; boolean fromRoom=false;
if (p.getHealth()<=dmg) { if (p.getHealth()<=dmg) {
@ -3691,18 +3691,35 @@ public class GenericFunctions {
pd.lasthitdesc=reason; pd.lasthitdesc=reason;
pd.slayermodehp = p.getMaxHealth(); 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(); 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) { if (!revived) {
for (Room r : TwosideKeeper.roominstances) { for (Room r : TwosideKeeper.roominstances) {
if (r.onPlayerDeath(p)) { if (r.onPlayerDeath(p)) {
revived=true; revived=true;
fromRoom=true; fromRoom=true;
RevivePlayer(p, p.getMaxHealth()); RevivePlayer(p, p.getMaxHealth());
return true; //Intentionally prevent other revive effects from working. return true; //Intentionally prevent other revive effects from working.
}
} }
}
} }
if (!revived) { if (!revived) {
@ -4926,7 +4943,7 @@ public class GenericFunctions {
ItemSet.meetsSlayerSwordConditions(ItemSet.STEALTH, 9, 1, p)) { ItemSet.meetsSlayerSwordConditions(ItemSet.STEALTH, 9, 1, p)) {
return; return;
} else { } else {
if (!aPlugin.API.isAFK(p)) { if (!aPluginAPIWrapper.isAFK(p)) {
ItemStack[] inv = p.getInventory().getContents(); ItemStack[] inv = p.getInventory().getContents();
for (int i=0;i<9;i++) { for (int i=0;i<9;i++) {
if (inv[i]!=null && if (inv[i]!=null &&

View File

@ -762,7 +762,7 @@ public class Christmas {
Block b = p.getWorld().getHighestBlockAt(p.getLocation().getBlockX()+blockx, p.getLocation().getBlockZ()+blockz); Block b = p.getWorld().getHighestBlockAt(p.getLocation().getBlockX()+blockx, p.getLocation().getBlockZ()+blockz);
Block bbelow = b.getRelative(0, -1, 0); Block bbelow = b.getRelative(0, -1, 0);
if (p.isOnGround()) { if (p.isOnGround()) {
if (!aPlugin.API.isAFK(p)) { if (!aPluginAPIWrapper.isAFK(p)) {
AddRocketBoosterCharges(p); AddRocketBoosterCharges(p);
} }
if (pd.falldamageimmunity && pd.lastusedrocketbooster+20<TwosideKeeper.getServerTickTime()) { if (pd.falldamageimmunity && pd.lastusedrocketbooster+20<TwosideKeeper.getServerTickTime()) {

View File

@ -223,7 +223,7 @@ public class MonsterController {
double dist = 999999999; double dist = 999999999;
int nearbyplayers=0; int nearbyplayers=0;
for (Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {
if (ent.getWorld().equals(p.getWorld()) && !aPlugin.API.isAFK(p)) { if (ent.getWorld().equals(p.getWorld()) && !aPluginAPIWrapper.isAFK(p)) {
double temp = ent.getLocation().distanceSquared(p.getLocation()); double temp = ent.getLocation().distanceSquared(p.getLocation());
if (Math.abs(ent.getLocation().getY()-p.getLocation().getY())<=30) { if (Math.abs(ent.getLocation().getY()-p.getLocation().getY())<=30) {
if (temp<4096) {nearbyplayers++;} if (temp<4096) {nearbyplayers++;}

View File

@ -7,6 +7,7 @@ import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -31,6 +32,7 @@ public class PVP {
int team1score=0; int team1score=0;
int team2score=0; int team2score=0;
long timelimit; long timelimit;
long nextRoundTime=0;
boolean scorematch = false; //If true, uses score limit. If false uses timer. boolean scorematch = false; //If true, uses score limit. If false uses timer.
//NEUTRAL team //NEUTRAL team
@ -250,37 +252,242 @@ public class PVP {
case FIGHTING:{ case FIGHTING:{
removeInactivePlayers(); removeInactivePlayers();
if (conditionsToWin() || notEnoughPlayers()) { if (conditionsToWin() || notEnoughPlayers()) {
StringBuilder sb = PrepareCurrentScores();
Bukkit.getServer().broadcastMessage(sb.toString());
aPlugin.API.discordSendRaw("```"+sb.toString()+"```");
computeWinner(); computeWinner();
announceWinner(); announceWinner();
resetTeams();
return false; return false;
} else {
setupNextRound();
state = CHOICEENGINE.FINISHED;
nextRoundTime = TwosideKeeper.getServerTickTime()+120;
}
}break;
case FINISHED:{
if (nextRoundTime<TwosideKeeper.getServerTickTime()) {
state=CHOICEENGINE.FIGHTING;
} }
}break; }break;
} }
return true; return true;
} }
private void setupNextRound() {
boolean deadTeam=false;
if (scorematch) {
if (players.size()>2) {
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<Score> sortedscores = new ArrayList<Score>();
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<Math.max(16-s.name.length(), 1);i++) {
sb.append(".");
}
sb.append(" ");
sb.append(s.score);
sb.append(" \n");
alttext=!alttext;
}
}
private void DisplaySortedScoreboard(StringBuilder sb) {
List<Score> scorelist= new ArrayList<Score>();
for (String s : players.keySet()) {
PVPPlayer pp = players.get(s);
scorelist.add(new Score(s,pp.score));
}
List<Score> sortedscores = new ArrayList<Score>();
while (scorelist.size()>0) {
boolean found=false;
for (int i=0;i<sortedscores.size();i++) {
if (scorelist.get(0).score>sortedscores.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<Math.max(16-s.name.length(), 1);i++) {
sb.append(".");
}
sb.append(" ");
sb.append(s.score);
sb.append(" \n");
alttext=!alttext;
}
}
private boolean AllPlayersOnTeamDead(int teamnumb) {
List<String> 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() { private void computeWinner() {
if (scorematch) { if (scorematch) {
if (team1score>team2score) { if (team1score>team2score) {
for (String s : getPlayersInTeam(2)) { for (String s : getPlayersInTeam(2)) {
losers.add(s);
players.remove(s);
} }
} else { } 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<String> removals = new ArrayList<String>();
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() { private boolean conditionsToWin() {
if (scorematch) { if (scorematch) {
return (team1score>=scorelimit || team2score>=scorelimit); return (team1score>=scorelimit || team2score>=scorelimit) || (players.size()==2 && PlayerHasReachedScoreLimit());
} else { } else {
return TwosideKeeper.getServerTickTime()>=timelimit; 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() { private void announceWinner() {
String firstPlayer = null; String firstPlayer = null;
determineWinnerByEliminatingLosers();
for (String s : players.keySet()) { for (String s : players.keySet()) {
firstPlayer = s; firstPlayer = s;
break; 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<String> removals = new ArrayList<String>();
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() { private void removeInactivePlayers() {
String removedPlayer = null; String removedPlayer = null;
for (String s : players.keySet()) { for (String s : players.keySet()) {
@ -385,9 +628,9 @@ public class PVP {
} }
pp.lastLoc = Bukkit.getPlayer(s).getLocation().clone(); pp.lastLoc = Bukkit.getPlayer(s).getLocation().clone();
Bukkit.getPlayer(s).sendMessage(ChatColor.GREEN+"The PVP Match between "+getParticipants()+" has begun!"); 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() { private void DisplayStageChoices() {
@ -639,6 +882,10 @@ public class PVP {
teams.put(p.getName(), teamName); 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) { public static void setOnSameTeam(Player p, Player...allies) {
addPlayerToTeamStructure(p); addPlayerToTeamStructure(p);
String myTeam = getTeam(p); String myTeam = getTeam(p);
@ -670,6 +917,30 @@ public class PVP {
base.addExtra(tc2); base.addExtra(tc2);
defender.spigot().sendMessage(base); 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 { class PVPPlayer {
@ -678,6 +949,8 @@ class PVPPlayer {
Location lastLoc; Location lastLoc;
PVPOption choice; PVPOption choice;
int team; int team;
boolean isAlive;
long respawnTimer;
PVPPlayer() { PVPPlayer() {
score=0; score=0;
@ -685,6 +958,7 @@ class PVPPlayer {
choice=PVPOption.NONE; choice=PVPOption.NONE;
lastLoc=null; lastLoc=null;
team=0; team=0;
isAlive=true;
} }
} }
@ -698,6 +972,15 @@ enum CHOICEENGINE {
FINISHED, //Any cleanup that has to be done. Warp all players back. 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 { 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"), 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."), ROUNDS3(1,ChatColor.WHITE+"Best of 3","The team that wins 2 of 3 total rounds wins the duel."),

View File

@ -8,6 +8,8 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.md_5.bungee.api.ChatColor; 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.Common.GenericFunctions;
import sig.plugin.TwosideKeeper.HelperStructures.Utils.TextUtils; import sig.plugin.TwosideKeeper.HelperStructures.Utils.TextUtils;
@ -21,12 +23,19 @@ public class PartyManager {
totalparties=0; totalparties=0;
ClearAllParties(); ClearAllParties();
for (Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {
if (!IsInParty(p)) { if (!PVP.isPvPing(p)) {
//We only care about adding a player that's not in a party already. if (!IsInParty(p)) {
//We have to make a new party for this player. //We only care about adding a player that's not in a party already.
AddPlayerToParty(p,totalparties++); //We have to make a new party for this player.
//Now find nearby players and add them to this party. AddPlayerToParty(p,totalparties++);
AddNearbyPlayersToSameParty(p); //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(); UpdatePartyScoreboards();

View File

@ -273,6 +273,7 @@ public class PlayerStructure {
public int afkLength = 60; public int afkLength = 60;
public boolean isAFKState = false; public boolean isAFKState = false;
public int unafkLength = 0; public int unafkLength = 0;
public int gracePeriod = 0;
//Prevent Automatic AFK moving the camera just to avoid the system. //Prevent Automatic AFK moving the camera just to avoid the system.
public long lastAdjustmentReading = 0; //When the last adjustment reading started. 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 int averageAdjustmentsMadeCount = 0; //Stored number of adjustments used in average.
public boolean tooConsistentAdjustments = false; //Adjustments are too consistent. 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. //Needs the instance of the player object to get all other info. Only to be called at the beginning.
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public PlayerStructure(Player p, long serverTickTime) { public PlayerStructure(Player p, long serverTickTime) {

View File

@ -137,6 +137,7 @@ import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.event.player.PlayerExpChangeEvent;
import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerFishEvent.State; import org.bukkit.event.player.PlayerFishEvent.State;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemBreakEvent; import org.bukkit.event.player.PlayerItemBreakEvent;
@ -1044,17 +1045,21 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
public static void SetupAndModifyDurabilities(Player p) { public static void SetupAndModifyDurabilities(Player p) {
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (aPluginAPIWrapper.isAFK(p)) { if (aPluginAPIWrapper.isAFK(p)) {
pd.actionRecords++;
if (pd.durability.size()!=9) { if (pd.durability.size()!=9) {
PopulateDurabilityValues(p); PopulateDurabilityValues(p);
} else { } else {
//See if durability values are different. If so, multiply the difference. //See if durability values are different. If so, multiply the difference.
List<Integer> diff = GetDifferences(p); List<Integer> diff = GetDifferences(p);
for (int i=0;i<9;i++) { if (pd.gracePeriod==0) {
if (diff.get(i)>0) { for (int i=0;i<9;i++) {
aPlugin.API.damageItem(p, p.getInventory().getItem(i), (int)(diff.get(i)*PlayerStructure.getAFKMultiplier(p))); if (diff.get(i)>0) {
TwosideKeeper.log(" Damaged item slot"+i+" an extra "+((int)(diff.get(i)*PlayerStructure.getAFKMultiplier(p)))+" damage due to AFK state.", 2); 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); 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("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("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("AAVG",(int)pd.averageAdjustmentsMade)+Display("AVGC",(int)pd.averageAdjustmentsMadeCount)+Display("ACT",pd.actionRecords));
sender.sendMessage(ChatColor.WHITE+Display("ADJ",(int)pd.adjustmentReading));
} else { } else {
sender.sendMessage("Could not find player "+ChatColor.YELLOW+args[0]+ChatColor.RESET+"!"); 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.NIGHT_VISION,ev.getPlayer());
GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.LEVITATION,ev.getPlayer()); GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.LEVITATION,ev.getPlayer());
GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.JUMP,ev.getPlayer()); GenericFunctions.logAndRemovePotionEffectFromEntity(PotionEffectType.JUMP,ev.getPlayer());
if (TwosideKeeper.SERVER_TYPE!=ServerType.TEST) {
ev.getPlayer().setGameMode(GameMode.SURVIVAL);
}
runServerHeartbeat.UpdatePlayerScoreboardAndHealth(ev.getPlayer()); runServerHeartbeat.UpdatePlayerScoreboardAndHealth(ev.getPlayer());
ev.getPlayer().getAttribute(Attribute.GENERIC_ATTACK_SPEED).setBaseValue(4.0d); ev.getPlayer().getAttribute(Attribute.GENERIC_ATTACK_SPEED).setBaseValue(4.0d);
@ -3285,6 +3294,16 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
log("[TASK] Player Data for "+ev.getPlayer().getName()+" has been removed. Size of array: "+playerdata.size(),4); 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) @EventHandler(priority=EventPriority.LOW,ignoreCancelled = true)
public void onPlayerChat(final AsyncPlayerChatEvent ev) { public void onPlayerChat(final AsyncPlayerChatEvent ev) {
if (ev.getMessage().length()>=1) { if (ev.getMessage().length()>=1) {
@ -8057,8 +8076,8 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
ev.getEntity() instanceof Monster) { ev.getEntity() instanceof Monster) {
Player p = (Player)ev.getTarget(); Player p = (Player)ev.getTarget();
Monster m = (Monster)ev.getEntity(); Monster m = (Monster)ev.getEntity();
if (GenericFunctions.hasStealth(p) && if (PVP.isPvPing(p) || (GenericFunctions.hasStealth(p) &&
m.getTarget()==null) { m.getTarget()==null)) {
ev.setCancelled(true); ev.setCancelled(true);
return; 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 (iterations<distance && (pointerloc.getBlockX()!=targetblock.getLocation().getBlockX() ||
pointerloc.getBlockY()!=targetblock.getLocation().getBlockY() ||
pointerloc.getBlockZ()!=targetblock.getLocation().getBlockZ())) {
//TwosideKeeper.log("Deleting pointer block: "+pointerloc, 1);
if (pointerloc.getBlock().getType()!=Material.AIR &&
!pointerloc.getBlock().isLiquid() &&
pointerloc.getBlock().getType().isSolid()
/*targetblock.getType()==pointerloc.getBlock().getType()*/) {
TwosideKeeper.log("WARNING! Block "+pointerloc.getBlock()+" did not break properly! Breaking manually...", 1);
pointerloc.getBlock().breakNaturally();
}
pointerloc.add(diffs);
iterations++;
}
if (iterations==50) {
TwosideKeeper.log("WARNING! Reached 50 iterations and cancelled.", 1);
}
}, 1);
if (ev.getBlock().getType()==Material.CHEST || if (ev.getBlock().getType()==Material.CHEST ||
ev.getBlock().getType()==Material.TRAPPED_CHEST) { ev.getBlock().getType()==Material.TRAPPED_CHEST) {
Chest cc = (Chest)ev.getBlock().getState(); Chest cc = (Chest)ev.getBlock().getState();
@ -9178,7 +9245,20 @@ public class TwosideKeeper extends JavaPlugin implements Listener {
} }
} }
@EventHandler(priority=EventPriority.LOW,ignoreCancelled = true) private double largestVector(Vector diffs) {
double largestvector = -999999;
if (Math.abs(diffs.getX())>largestvector) {
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) { public void onaPluginPickupEvent(PlayerGainItemEvent ev) {
TwosideKeeper.log("["+TwosideKeeper.getServerTickTime()+"] PlayerGainItemEvent fired w/ "+ev.getItemStack(), 4); TwosideKeeper.log("["+TwosideKeeper.getServerTickTime()+"] PlayerGainItemEvent fired w/ "+ev.getItemStack(), 4);
Player p = ev.getPlayer(); Player p = ev.getPlayer();

View File

@ -25,6 +25,7 @@ public class aPluginAPIWrapper {
} }
if (pd.isAFKState) { if (pd.isAFKState) {
pd.isAFKState=false; pd.isAFKState=false;
pd.gracePeriod=3;
TwosideKeeper.log(">>Player "+p.getName()+" is no longer AFK.", 2); TwosideKeeper.log(">>Player "+p.getName()+" is no longer AFK.", 2);
} }
return true; return true;

View File

@ -239,7 +239,7 @@ final public class runServerHeartbeat implements Runnable {
TwosideKeeper.HeartbeatLogger.AddEntry("Purchase Notification Sending", (int)(System.nanoTime()-time));time=System.nanoTime(); TwosideKeeper.HeartbeatLogger.AddEntry("Purchase Notification Sending", (int)(System.nanoTime()-time));time=System.nanoTime();
long notafktime = System.nanoTime(); long notafktime = System.nanoTime();
if (!aPlugin.API.isAFK(p)) { if (!aPluginAPIWrapper.isAFK(p)) {
EndShopSession(p); EndShopSession(p);
TwosideKeeper.HeartbeatLogger.AddEntry("End Shop Session", (int)(System.nanoTime()-time));time=System.nanoTime(); 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); //TwosideKeeper.log("Current adjustment reading: "+pd.averageAdjustmentsMade+" <--> "+pd.adjustmentReading, 2);
if (Math.abs(pd.adjustmentReading-pd.averageAdjustmentsMade)<=2 && pd.averageAdjustmentsMadeCount>=10) { //Too consistent. if (Math.abs(pd.adjustmentReading-pd.averageAdjustmentsMade)<=2 && pd.averageAdjustmentsMadeCount>=10) { //Too consistent.
pd.readingBroken++; pd.readingBroken++;
if (pd.gracePeriod>0) {
pd.gracePeriod--;
} else
if (pd.readingBroken>=3) { if (pd.readingBroken>=3) {
pd.tooConsistentAdjustments=true; pd.tooConsistentAdjustments=true;
} }