Classes Improved

This commit is contained in:
BunSLaPatate
2018-09-22 22:45:22 +02:00
parent 3021ed1280
commit 04fce1fdd5
14 changed files with 43 additions and 714 deletions

View File

@@ -5,7 +5,7 @@ import net.berrygames.witchrush.team.TeamInfos;
import net.berrygames.witchrush.team.TeamManager;
import net.berrygames.witchrush.tools.ItemFactory;
import net.berrygames.witchrush.tools.Locations;
import net.berrygames.witchrush.tools.ScoreboardSign;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.Material;
@@ -13,6 +13,10 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
import java.util.HashMap;
import java.util.Map;
@@ -78,30 +82,6 @@ public class WitchPlayer {
.done());
}
public void sendGameScoreboard(){
ScoreboardSign scoreboard = new ScoreboardSign(player, "§5§lWitchRush");
scoreboard.setLine(15, WitchRush.get().getState()+":"+WitchRush.get().getStateTimer());
scoreboard.setLine(14, "§r ");
scoreboard.setLine(13, manager.isInLife(TeamInfos.BLEU) ? "§a✔": "§c✖"+ "§bBleu"+ manager.getTeamBoss(TeamInfos.BLEU).getLife());
scoreboard.setLine(12, manager.isInLife(TeamInfos.ROUGE) ? "§a✔": "§c✖"+ "§cRouge"+ manager.getTeamBoss(TeamInfos.ROUGE).getLife());
scoreboard.setLine(11, manager.isInLife(TeamInfos.JAUNE) ? "§a✔": "§c✖"+ "§eJaune"+ manager.getTeamBoss(TeamInfos.JAUNE).getLife());
scoreboard.setLine(10, manager.isInLife(TeamInfos.VERT) ? "§a✔": "§c✖"+ "§aVert"+ manager.getTeamBoss(TeamInfos.VERT).getLife());
scoreboard.setLine(9, "§r ");
scoreboard.setLine(8, "§7Kills: "+WitchPlayer.get(player).getKills());
scoreboard.setLine(7, "§7Morts: "+WitchPlayer.get(player).getDeath());
scoreboard.setLine(6, "§r ");
scoreboard.setLine(5, "§6play.berrygames.net");
}
public void sendLobbyScoreboard(){
ScoreboardSign scoreboard = new ScoreboardSign(player, "§5§lWitchRush");
scoreboard.setLine(14, "§r ");
scoreboard.setLine(13, "§7Joueurs: ");
scoreboard.setLine(12, "§d"+WitchPlayer.getwitchMap().size()+"/16");
scoreboard.setLine(9, "§r ");
scoreboard.setLine(8, "§6play.berrygames.net");
}
public static WitchPlayer get(final Player player) {
if (WitchPlayer.witchMap.get(player) == null) {
WitchPlayer.witchMap.put(player, new WitchPlayer(player));

View File

@@ -60,21 +60,6 @@ public class WitchRush extends JavaPlugin {
public GameState getState(){
return this.gameState;
}
public String getStateTimer(){
switch (getState()){
case WAITING:
return null;
case STARTING:
return new StartTask().getTimer();
case NOWITCH:
return new NoPVPTask().getTimer();
case PVP:
return new PVPTask().getTimer();
case DEATH_MATCH:
return new DeathMatchTask().getTimer();
}
return null;
}
public TeamManager getTeamManager() {
return teamManager;
}

View File

@@ -20,6 +20,8 @@ public class GameCMD implements CommandExecutor {
if(args.length == 1 && args[0].equals("start")){
if(!player.isOp())return false;
if(!WitchRush.get().getState().equals(GameState.WAITING)) return false;
WitchRush.get().setForcedStart(true);
new StartTask().runTaskTimer(WitchRush.get(), 0, 20);
WitchRush.get().setState(GameState.STARTING);

View File

@@ -64,7 +64,6 @@ public class GameManager {
playerOnline.setGameMode(GameMode.SURVIVAL);
witchPlayer.giveStuff();
TeamsTagsManager.setNameTag(playerOnline, teamInfos.getIDName(), teamInfos.getChatColor()+teamInfos.getTeamName()+" ");
witchPlayer.sendGameScoreboard();
});
}

View File

@@ -18,7 +18,7 @@ public class WinManager {
++teamLeft;
}
if(teamManager.getPlayerTeamList(teamInfos).size() == 0){
teamManager.getTeamBoss(teamInfos).getWitch().remove();
teamManager.killTeamBoss(teamInfos);
}
}
if (teamLeft == 1) {

View File

@@ -1,30 +1,17 @@
package net.berrygames.witchrush.game.task;
import net.berrygames.witchrush.WitchPlayer;
import net.berrygames.witchrush.WitchRush;
import net.berrygames.witchrush.game.WinManager;
import net.berrygames.witchrush.team.TeamInfos;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
public class DeathMatchTask extends BukkitRunnable {
private int sec = 0;
private int min = 3 * 60;
private int timer = 0;
@Override
public void run() {
if(this.sec == 60){
this.sec = 0;
this.min += min;
}
for(Player pls : Bukkit.getOnlinePlayers()){
WitchPlayer.get(pls).sendGameScoreboard();
}
for(TeamInfos infos : TeamInfos.values()){
if(WitchRush.get().getTeamManager().isInLife(infos)){
if(WitchRush.get().getTeamManager().getBossEntityMap().get(infos).getLife() > 0){
@@ -36,10 +23,7 @@ public class DeathMatchTask extends BukkitRunnable {
}
new WinManager();
this.sec++;
this.timer++;
}
public String getTimer() {
return this.min+":"+this.sec;
}
}

View File

@@ -12,27 +12,17 @@ import org.bukkit.scheduler.BukkitRunnable;
public class NoPVPTask extends BukkitRunnable {
private int sec = 0;
private int min = 3 * 60;
private int timer = 3 * 20;
@Override
public void run() {
if(this.sec == 0){
this.sec = 60;
this.min -= min;
}
if(this.min == 0 && this.sec == 0){
if(timer == 0){
new PVPTask().runTaskTimer(WitchRush.get(), 0, 20);
WitchRush.get().setState(GameState.PVP);
for(Player pls : Bukkit.getOnlinePlayers()){
WitchPlayer.get(pls).sendGameScoreboard();
}
Bukkit.broadcastMessage(WitchRush.prefix()+"Les §6Witchs §dsont apparues, §d§nBonne chance à vous !");
new WitchBoss(TeamInfos.ROUGE, Locations.WITCH_ROUGE.getLocation());
new WitchBoss(TeamInfos.BLEU, Locations.WITCH_BLEU.getLocation());
new WitchBoss(TeamInfos.VERT, Locations.WITCH_VERT.getLocation());
@@ -40,10 +30,6 @@ public class NoPVPTask extends BukkitRunnable {
new HealthRunnable().runTaskTimer(WitchRush.get(), 0L, 20L);
cancel();
}
sec--;
}
public String getTimer() {
return this.min+":"+this.sec;
this.timer--;
}
}

View File

@@ -10,22 +10,13 @@ import org.bukkit.scheduler.BukkitRunnable;
public class PVPTask extends BukkitRunnable {
private int sec = 0;
private int min = 20 * 60;
private int timer = 20 * 60;
@Override
public void run() {
if(this.sec == 0){
this.sec = 60;
this.min -= min;
}
if(this.min == 0 && this.sec == 0){
if(this.timer == 0){
new DeathMatchTask().runTaskTimer(WitchRush.get(), 0, 20 * 5);
for(Player pls : Bukkit.getOnlinePlayers()){
WitchPlayer.get(pls).sendGameScoreboard();
}
WitchRush.get().setState(GameState.DEATH_MATCH);
Bukkit.broadcastMessage(WitchRush.prefix()+"Le DeathMatch commence.");
Bukkit.broadcastMessage(WitchRush.prefix()+"Les §5§lWitchs §dcommencent à perdre de la vie !");
@@ -34,11 +25,6 @@ public class PVPTask extends BukkitRunnable {
new WinManager();
this.sec--;
this.timer--;
}
public String getTimer() {
return this.min+":"+this.sec;
}
}

View File

@@ -10,17 +10,11 @@ import org.bukkit.scheduler.BukkitRunnable;
public class StartTask extends BukkitRunnable {
private int sec = 0;
private int min = WitchRush.get().isForcedStart() ? 0 : 2 * 60;
private int timer = WitchRush.get().isForcedStart() ? 30 : 2 * 60;
@Override
public void run() {
if(this.sec == 0){
this.sec = 60;
this.min -= min;
}
if (Bukkit.getOnlinePlayers().size() < 4 && !WitchRush.get().isForcedStart()) {
Bukkit.broadcastMessage(WitchRush.prefix()+"Il n'y a pas assez de joueurs pour lancer la partie !");
WitchRush.get().setState(GameState.WAITING);
@@ -28,47 +22,28 @@ public class StartTask extends BukkitRunnable {
return;
}
if(this.min == 0 && this.sec == 0){
WitchRush.get().getTeamManager().checkNoTeamPlayers();
if(this.timer == 0){
new GameManager();
cancel();
}
if(this.timer == 120 || this.timer == 60 ||this.timer == 30 || this.timer == 15 || this.timer == 10 || this.timer == 5 || this.timer == 4
|| this.timer == 3 || this.timer == 2 ){
Bukkit.broadcastMessage(WitchRush.prefix()+"Lancement de la partie dans §5"+this.timer+" §dsecondes");
for(Player pls : Bukkit.getOnlinePlayers()){
pls.playSound(pls.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
}
}
if(this.timer == 1){
Bukkit.broadcastMessage(WitchRush.prefix()+"Lancement de la partie dans §5"+this.timer+" §dseconde");
for(Player pls : Bukkit.getOnlinePlayers()){
pls.playSound(pls.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
}
}
while(this.min == 2){
if(this.sec == 0){
Bukkit.broadcastMessage(WitchRush.prefix()+"Lancement de la partie dans §5"+this.sec+" §dsecondes");
for(Player pls : Bukkit.getOnlinePlayers()){
pls.playSound(pls.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
}
}
for(Player pls : Bukkit.getOnlinePlayers()){
pls.setLevel(timer);
}
while(this.min == 1){
if(this.sec == 30){
Bukkit.broadcastMessage(WitchRush.prefix()+"Lancement de la partie dans §5"+this.sec+" §dsecondes");
for(Player pls : Bukkit.getOnlinePlayers()){
pls.playSound(pls.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
}
}
}
while(this.min == 0){
if(this.sec == 30 || this.sec == 15 || this.sec == 10 || this.sec == 5 || this.sec == 4
|| this.sec == 3 || this.sec == 2){
Bukkit.broadcastMessage(WitchRush.prefix()+"Lancement de la partie dans §5"+this.sec+" §dsecondes");
for(Player pls : Bukkit.getOnlinePlayers()){
pls.playSound(pls.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
}
}
if(this.sec == 1){
Bukkit.broadcastMessage(WitchRush.prefix()+"Lancement de la partie dans §5"+this.sec+" §dseconde");
for(Player pls : Bukkit.getOnlinePlayers()){
pls.playSound(pls.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
}
}
}
this.sec--;
}
public String getTimer() {
return min+":"+sec;
this.timer--;
}
}

View File

@@ -1,53 +0,0 @@
package net.berrygames.witchrush.listeners.players;
import net.berrygames.witchrush.WitchPlayer;
import net.berrygames.witchrush.WitchRush;
import net.berrygames.witchrush.game.GameState;
import net.berrygames.witchrush.team.TeamInfos;
import net.berrygames.witchrush.team.TeamManager;
import net.berrygames.witchrush.tools.WitchBoss;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Witch;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
public class DamageEvent implements Listener {
@EventHandler
public void onEntityDamageByEntity(final EntityDamageByEntityEvent e) {
final TeamManager teamManager = WitchRush.get().getTeamManager();
if(!WitchRush.get().getState().equals(GameState.WAITING) && !WitchRush.get().getState().equals(GameState.STARTING)){
if ((e.getDamager() instanceof Player) && (e.getEntity() instanceof Witch)){
final Player player = (Player)e.getDamager();
final Witch witch = (Witch) e.getEntity();
final TeamInfos playerTeamInfos = teamManager.getPlayerTeam(player);
if(teamManager.getTeamBoss(playerTeamInfos).getWitch().equals(witch)) {
player.sendMessage("§cVous ne pouvez pas tuer votre boss !");
e.setCancelled(true);
return;
}
for (final TeamInfos teamInfos : TeamInfos.values()) {
if (teamManager.getTeamBoss(teamInfos).getWitch().equals(witch)) {
teamManager.getTeamBoss(teamInfos).getWitch().teleport(teamManager.getBossLocation(teamInfos));
Bukkit.getOnlinePlayers().forEach(playerOnline -> {
WitchPlayer witchPlayer = WitchPlayer.get(playerOnline);
if (teamManager.isPlayerInTeam(playerOnline, teamInfos) && !witchPlayer.isSpectator()) {
playerOnline.sendTitle("§cWitch attaquée !", " ");
//WitchRush.get().getTeamManager().getTeamBoss(teamInfos).getWitch().setHealth(
// WitchRush.get().getTeamManager().getTeamBoss(teamInfos).getWitch().getHealth() - e.getDamage()
//);
}
});
}
}
} else if (e.getDamager() instanceof Player && e.getEntity() instanceof Villager){
e.setCancelled(true);
}
}
}
}

View File

@@ -1,148 +0,0 @@
package net.berrygames.witchrush.listeners.players;
import net.berrygames.witchrush.WitchPlayer;
import net.berrygames.witchrush.WitchRush;
import net.berrygames.witchrush.game.GameState;
import net.berrygames.witchrush.game.task.HealthRunnable;
import net.berrygames.witchrush.listeners.custom.BossDeathEvent;
import net.berrygames.witchrush.team.TeamInfos;
import net.berrygames.witchrush.team.TeamManager;
import net.berrygames.witchrush.tools.DeadPlayer;
import net.berrygames.witchrush.tools.Locations;
import net.berrygames.witchrush.tools.TeamsTagsManager;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.entity.Witch;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.inventory.ItemStack;
public class DeathEvent implements Listener {
TeamManager teamManager = WitchRush.get().getTeamManager();
@EventHandler
public void death(PlayerDeathEvent e) {
Player player = e.getEntity().getPlayer();
Player killer = e.getEntity().getKiller();
WitchPlayer witchPlayer = WitchPlayer.get(player);
WitchPlayer witchKiller = WitchPlayer.get(killer);
TeamInfos teamvictim;
TeamInfos teamKiller;
if(WitchRush.get().getState().equals(GameState.WAITING) || WitchRush.get().getState().equals(GameState.STARTING)){
e.setDeathMessage(null);
player.kickPlayer("ENFAIT TOI T'ES FORT PCQ NORMALEMENT YA PAS CA");
} else {
if(killer instanceof Player){
switch (WitchRush.get().getState()){
case PVP:
if(!teamManager.isInLife(teamManager.getPlayerTeam(player))){
checkDrop(e);
TeamInfos team = WitchRush.get().getTeamManager().getPlayerTeam(player);
e.setDeathMessage(WitchRush.prefix()+team.getChatColor()+player.getName()+"§c est éliminé");
witchPlayer.setDeath(witchPlayer.getDeath()+1);
witchPlayer.setSpectator(true);
player.teleport(Locations.SPAWN_SPECTATORS.getLocation());
player.setGameMode(GameMode.SPECTATOR);
teamManager.removePlayerAllTeam(player);
player.sendMessage(" ");
player.sendMessage("§8(Spectateur) §7Vous êtes éliminé.");
player.sendMessage("§7Seuls les autres spectateurs voient vos messages !");
player.sendMessage(" ");
TeamsTagsManager.setNameTag(player, player.getName(), "§8(Spec)§7 ");
} else {
teamvictim = WitchRush.get().getTeamManager().getPlayerTeam(player);
teamKiller = WitchRush.get().getTeamManager().getPlayerTeam(killer);
e.setDeathMessage(WitchRush.prefix()+teamvictim.getChatColor()+player.getName()+"§d a été tué par "+teamKiller.getChatColor()+ killer.getName());
checkDrop(e);
new DeadPlayer(player);
witchKiller.setKills(witchKiller.getKills()+1);
witchPlayer.setDeath(witchPlayer.getDeath()+1);
}
break;
case NOWITCH:
teamvictim = WitchRush.get().getTeamManager().getPlayerTeam(player);
teamKiller = WitchRush.get().getTeamManager().getPlayerTeam(killer);
e.setDeathMessage(WitchRush.prefix()+teamvictim.getChatColor()+player.getName()+"§d a été tué par "+teamKiller.getChatColor()+ killer.getName());
new DeadPlayer(player);
witchKiller.setKills(witchKiller.getKills()+1);
witchPlayer.setDeath(witchPlayer.getDeath()+1);
break;
}
} else {
TeamInfos team = WitchRush.get().getTeamManager().getPlayerTeam(player);
e.setDeathMessage(WitchRush.prefix()+team.getChatColor()+player.getName()+"§d est mort");
checkDrop(e);
new DeadPlayer(player);
player.setHealth(20);
witchPlayer.setDeath(witchPlayer.getDeath()+1);
}
}
}
@EventHandler
public void onEntityDeath(final EntityDeathEvent e) {
if (e.getEntity() instanceof Witch) {
if(WitchRush.get().getState().equals(GameState.PVP)){
final Witch witch = (Witch)e.getEntity();
final TeamManager teamManager = WitchRush.get().getTeamManager();
for (final ItemStack itemStack : e.getDrops()) {
itemStack.setType(Material.AIR);
}
TeamInfos teamInfos = null;
for (final TeamInfos teamInfosList : TeamInfos.values()) {
if (teamManager.getTeamBoss(teamInfosList).getWitch().equals(witch)) {
teamInfos = teamInfosList;
}
}
Bukkit.broadcastMessage(WitchRush.prefix()+"L'équipe "+teamInfos.getChatColor()+teamInfos.getTeamName()+" §dest morte !");
if (e.getEntity().getKiller() instanceof Player) {
Bukkit.getPluginManager().callEvent(new BossDeathEvent(teamInfos, e.getEntity().getKiller()));
teamManager.getBossEntityMap().remove(teamInfos);
new HealthRunnable().arMap.remove(teamInfos);
}
for (final Player playerOnline : Bukkit.getOnlinePlayers()) {
playerOnline.playSound(playerOnline.getLocation(), Sound.ENTITY_WITHER_DEATH, 1.0f, 1.0f);
if (teamManager.isPlayerInTeam(playerOnline, teamInfos)) {
playerOnline.sendMessage(WitchRush.prefix()+"Votre Boss est mort! Ne mourrez pas !");
playerOnline.sendTitle("§cAttention","Votre boss est mort !");
}
}
}
}
}
private void checkDrop(PlayerDeathEvent e){
for(int i = 0; i<e.getDrops().size(); i++){
ItemStack stack = e.getDrops().get(i);
switch (stack.getType()){
case LEATHER_BOOTS:
e.getDrops().get(i).setType(Material.AIR);
break;
case LEATHER_LEGGINGS:
e.getDrops().get(i).setType(Material.AIR);
break;
case LEATHER_CHESTPLATE:
e.getDrops().get(i).setType(Material.AIR);
break;
case LEATHER_HELMET:
e.getDrops().get(i).setType(Material.AIR);
break;
case DIAMOND_SWORD:
e.getDrops().get(i).setType(Material.AIR);
break;
}
}
}
}

View File

@@ -35,11 +35,10 @@ public class PlayerJoin implements Listener {
player.setFoodLevel(20);
player.teleport(Locations.PLAYER_SPAWN_WAITING_ROOM.getLocation());
witchPlayer.sendWaitingStuff();
witchPlayer.sendLobbyScoreboard();
TeamsTagsManager.setNameTag(player, player.getName(), "§7");
if(WitchPlayer.getwitchMap().size() >= 4){
if(WitchRush.get().getState().equals(GameState.WAITING) && WitchPlayer.getwitchMap().size() >= 4){
new StartTask().runTaskTimer(WitchRush.get(), 0, 20);
WitchRush.get().setState(GameState.STARTING);
}
@@ -58,7 +57,6 @@ public class PlayerJoin implements Listener {
player.setHealth(20);
player.setFoodLevel(20);
player.teleport(Locations.SPAWN_SPECTATORS.getLocation());
witchPlayer.sendGameScoreboard();
}
}

View File

@@ -1,5 +1,6 @@
package net.berrygames.witchrush.team;
import net.berrygames.witchrush.game.task.HealthRunnable;
import net.berrygames.witchrush.tools.Locations;
import net.berrygames.witchrush.tools.WitchBoss;
import org.bukkit.Bukkit;
@@ -49,7 +50,7 @@ public class TeamManager {
if(!isPlayerInTeam(pls , infos)) teamMap.put(infos, getPlayerTeamList(infos));
}
}
if(!playerHaveTeam(player)) addPlayerTeam(player, teamMap.lastKey());
if(!playerHaveTeam(player)) addPlayerTeam(player, teamMap.firstKey());
}
public void checkNoTeamPlayers() {
@@ -128,6 +129,11 @@ public class TeamManager {
return this.bossEntityMap.get(teamInfos);
}
public void killTeamBoss(final TeamInfos infos){
this.getBossEntityMap().remove(infos);
new HealthRunnable().arMap.remove(infos);
}
public Map<TeamInfos, List<Player>> getPlayerTeamList() {
return this.playerTeamList;
}

View File

@@ -1,371 +0,0 @@
package net.berrygames.witchrush.tools;
import net.minecraft.server.v1_12_R1.*;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class ScoreboardSign {
private boolean created = false;
private final VirtualTeam[] lines = new VirtualTeam[15];
private final Player player;
private String objectiveName;
/**
* Create a scoreboard sign for a given player and using a specifig objective name
* @param player the player viewing the scoreboard sign
* @param objectiveName the name of the scoreboard sign (displayed at the top of the scoreboard)
*/
public ScoreboardSign(Player player, String objectiveName) {
this.player = player;
this.objectiveName = objectiveName;
}
/**
* Send the initial creation packets for this scoreboard sign. Must be called at least once.
*/
public void create() {
if (created)
return;
PlayerConnection player = getPlayer();
player.sendPacket(createObjectivePacket(0, objectiveName));
player.sendPacket(setObjectiveSlot());
int i = 0;
while (i < lines.length)
sendLine(i++);
created = true;
}
/**
* Send the packets to remove this scoreboard sign. A destroyed scoreboard sign must be recreated using {@link ScoreboardSign#create()} in order
* to be used again
*/
public void destroy() {
if (!created)
return;
getPlayer().sendPacket(createObjectivePacket(1, null));
for (VirtualTeam team : lines)
if (team != null)
getPlayer().sendPacket(team.removeTeam());
created = false;
}
/**
* Change the name of the objective. The name is displayed at the top of the scoreboard.
* @param name the name of the objective, max 32 char
*/
public void setObjectiveName(String name) {
this.objectiveName = name;
if (created)
getPlayer().sendPacket(createObjectivePacket(2, name));
}
/**
* Change a scoreboard line and send the packets to the player. Can be called async.
* @param line the number of the line (0 <= line < 15)
* @param value the new value for the scoreboard line
*/
public void setLine(int line, String value) {
VirtualTeam team = getOrCreateTeam(line);
String old = team.getCurrentPlayer();
if (old != null && created)
getPlayer().sendPacket(removeLine(old));
team.setValue(value);
sendLine(line);
}
/**
* Remove a given scoreboard line
* @param line the line to remove
*/
public void removeLine(int line) {
VirtualTeam team = getOrCreateTeam(line);
String old = team.getCurrentPlayer();
if (old != null && created) {
getPlayer().sendPacket(removeLine(old));
getPlayer().sendPacket(team.removeTeam());
}
lines[line] = null;
}
/**
* Get the current value for a line
* @param line the line
* @return the content of the line
*/
public String getLine(int line) {
if (line > 14)
return null;
if (line < 0)
return null;
return getOrCreateTeam(line).getValue();
}
/**
* Get the team assigned to a line
* @return the {@link VirtualTeam} used to display this line
*/
public VirtualTeam getTeam(int line) {
if (line > 14)
return null;
if (line < 0)
return null;
return getOrCreateTeam(line);
}
private PlayerConnection getPlayer() {
return ((CraftPlayer) player).getHandle().playerConnection;
}
@SuppressWarnings("rawtypes")
private void sendLine(int line) {
if (line > 14)
return;
if (line < 0)
return;
if (!created)
return;
int score = (15 - line);
VirtualTeam val = getOrCreateTeam(line);
for (Packet packet : val.sendLine())
getPlayer().sendPacket(packet);
getPlayer().sendPacket(sendScore(val.getCurrentPlayer(), score));
val.reset();
}
private VirtualTeam getOrCreateTeam(int line) {
if (lines[line] == null)
lines[line] = new VirtualTeam("__fakeScore" + line);
return lines[line];
}
/*
Factories
*/
private PacketPlayOutScoreboardObjective createObjectivePacket(int mode, String displayName) {
PacketPlayOutScoreboardObjective packet = new PacketPlayOutScoreboardObjective();
// Nom de l'objectif
setField(packet, "a", player.getName());
// Mode
// 0 : créer
// 1 : Supprimer
// 2 : Mettre à jour
setField(packet, "d", mode);
if (mode == 0 || mode == 2) {
setField(packet, "b", displayName);
setField(packet, "c", IScoreboardCriteria.EnumScoreboardHealthDisplay.INTEGER);
}
return packet;
}
private PacketPlayOutScoreboardDisplayObjective setObjectiveSlot() {
PacketPlayOutScoreboardDisplayObjective packet = new PacketPlayOutScoreboardDisplayObjective();
// Slot
setField(packet, "a", 1);
setField(packet, "b", player.getName());
return packet;
}
private PacketPlayOutScoreboardScore sendScore(String line, int score) {
PacketPlayOutScoreboardScore packet = new PacketPlayOutScoreboardScore(line);
setField(packet, "b", player.getName());
setField(packet, "c", score);
setField(packet, "d", PacketPlayOutScoreboardScore.EnumScoreboardAction.CHANGE);
return packet;
}
private PacketPlayOutScoreboardScore removeLine(String line) {
return new PacketPlayOutScoreboardScore(line);
}
/**
* This class is used to manage the content of a line. Advanced users can use it as they want, but they are encouraged to read and understand the
* code before doing so. Use these methods at your own risk.
*/
public class VirtualTeam {
private final String name;
private String prefix;
private String suffix;
private String currentPlayer;
private String oldPlayer;
private boolean prefixChanged, suffixChanged, playerChanged = false;
private boolean first = true;
private VirtualTeam(String name, String prefix, String suffix) {
this.name = name;
this.prefix = prefix;
this.suffix = suffix;
}
private VirtualTeam(String name) {
this(name, "", "");
}
public String getName() {
return name;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
if (this.prefix == null || !this.prefix.equals(prefix))
this.prefixChanged = true;
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
if (this.suffix == null || !this.suffix.equals(prefix))
this.suffixChanged = true;
this.suffix = suffix;
}
private PacketPlayOutScoreboardTeam createPacket(int mode) {
PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
setField(packet, "a", name);
setField(packet, "b", "");
setField(packet, "c", prefix);
setField(packet, "d", suffix);
setField(packet, "i", 0);
setField(packet, "e", "always");
setField(packet, "g", 0);
setField(packet, "i", mode);
return packet;
}
public PacketPlayOutScoreboardTeam createTeam() {
return createPacket(0);
}
public PacketPlayOutScoreboardTeam updateTeam() {
return createPacket(2);
}
public PacketPlayOutScoreboardTeam removeTeam() {
PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
setField(packet, "a", name);
setField(packet, "i", 1);
first = true;
return packet;
}
public void setPlayer(String name) {
if (this.currentPlayer == null || !this.currentPlayer.equals(name))
this.playerChanged = true;
this.oldPlayer = this.currentPlayer;
this.currentPlayer = name;
}
public Iterable<PacketPlayOutScoreboardTeam> sendLine() {
List<PacketPlayOutScoreboardTeam> packets = new ArrayList<>();
if (first) {
packets.add(createTeam());
} else if (prefixChanged || suffixChanged) {
packets.add(updateTeam());
}
if (first || playerChanged) {
if (oldPlayer != null) // remove these two lines ?
packets.add(addOrRemovePlayer(4, oldPlayer)); //
packets.add(changePlayer());
}
if (first)
first = false;
return packets;
}
public void reset() {
prefixChanged = false;
suffixChanged = false;
playerChanged = false;
oldPlayer = null;
}
public PacketPlayOutScoreboardTeam changePlayer() {
return addOrRemovePlayer(3, currentPlayer);
}
@SuppressWarnings("unchecked")
public PacketPlayOutScoreboardTeam addOrRemovePlayer(int mode, String playerName) {
PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam();
setField(packet, "a", name);
setField(packet, "i", mode);
try {
Field f = packet.getClass().getDeclaredField("h");
f.setAccessible(true);
((List<String>) f.get(packet)).add(playerName);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
return packet;
}
public String getCurrentPlayer() {
return currentPlayer;
}
public String getValue() {
return getPrefix() + getCurrentPlayer() + getSuffix();
}
public void setValue(String value) {
if (value.length() <= 16) {
setPrefix("");
setSuffix("");
setPlayer(value);
} else if (value.length() <= 32) {
setPrefix(value.substring(0, 16));
setPlayer(value.substring(16));
setSuffix("");
} else if (value.length() <= 48) {
setPrefix(value.substring(0, 16));
setPlayer(value.substring(16, 32));
setSuffix(value.substring(32));
} else {
throw new IllegalArgumentException("Too long value ! Max 48 characters, value was " + value.length() + " !");
}
}
}
private static void setField(Object edit, String fieldName, Object value) {
try {
Field field = edit.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(edit, value);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}