feat: add TeamManager

This commit is contained in:
Simon Giesel 2020-05-14 00:13:39 +02:00
parent 2a3caad9ae
commit e0fc3b91e3
4 changed files with 273 additions and 23 deletions

View file

@ -34,6 +34,7 @@ public class PlayerJoinQuitListener implements Listener {
Bukkit.broadcast(this.plugin.getMessageUtils().getServiceMessage(e.getPlayer().getName(), Bukkit.broadcast(this.plugin.getMessageUtils().getServiceMessage(e.getPlayer().getName(),
"hat den Server verlassen.")); "hat den Server verlassen."));
} }
this.plugin.getTeamManager().setAFK(e.getPlayer().getName());
} }
@EventHandler @EventHandler
@ -42,6 +43,8 @@ public class PlayerJoinQuitListener implements Listener {
this.plugin.getNPCManager().removeClone(e.getPlayer()); this.plugin.getNPCManager().removeClone(e.getPlayer());
this.plugin.getNPCManager().syncClones(e.getPlayer()); this.plugin.getNPCManager().syncClones(e.getPlayer());
this.plugin.getTeamManager().setTeam(e.getPlayer());
// Inject PacketReader // Inject PacketReader
final PacketReader packetReader = new PacketReader(this.plugin, e.getPlayer()); final PacketReader packetReader = new PacketReader(this.plugin, e.getPlayer());
packetReader.inject(); packetReader.inject();

View file

@ -9,7 +9,6 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.Property;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.World; import org.bukkit.World;
@ -21,8 +20,6 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
@ -53,23 +50,12 @@ public class NPCManager {
private final ArrayList<EntityPlayer> npcs = new ArrayList<EntityPlayer>(); private final ArrayList<EntityPlayer> npcs = new ArrayList<EntityPlayer>();
private final ArrayList<Integer> isDying = new ArrayList<Integer>(); private final ArrayList<Integer> isDying = new ArrayList<Integer>();
private final HashMap<UUID, PlayerInventory> inventories = new HashMap<UUID, PlayerInventory>(); private final HashMap<UUID, PlayerInventory> inventories = new HashMap<UUID, PlayerInventory>();
private final Scoreboard scoreboard;
private Team afkTeam;
public NPCManager(final Varo plugin) { public NPCManager(final Varo plugin) {
this.plugin = plugin; this.plugin = plugin;
this.scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
if (scoreboard.getTeam("afk") == null) {
this.afkTeam = scoreboard.registerNewTeam("afk");
} else {
this.afkTeam = scoreboard.getTeam("afk");
}
this.afkTeam.setPrefix("§8§l[AFK] ");
this.afkTeam.setColor(ChatColor.GRAY);
} }
public void createClone(final Player player, final boolean shouldHaveAFKPrefix) { public void createClone(final Player player) {
final Location location = player.getLocation(); final Location location = player.getLocation();
final MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer(); final MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
final WorldServer nmsWorld = ((CraftWorld) player.getWorld()).getHandle(); final WorldServer nmsWorld = ((CraftWorld) player.getWorld()).getHandle();
@ -90,13 +76,7 @@ public class NPCManager {
final EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, playerInteractManager); final EntityPlayer npc = new EntityPlayer(nmsServer, nmsWorld, gameProfile, playerInteractManager);
npc.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); npc.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
npc.setHealth((float) player.getHealth()); npc.setHealth((float) player.getHealth());
if (shouldHaveAFKPrefix) {
this.afkTeam.addEntry(npc.getName());
}
npcs.add(npc); npcs.add(npc);
for (final Player connectionPlayer : Bukkit.getOnlinePlayers()) { for (final Player connectionPlayer : Bukkit.getOnlinePlayers()) {
@ -218,7 +198,6 @@ public class NPCManager {
// FIXME: Only for debug reasons -- Remove // FIXME: Only for debug reasons -- Remove
public void removeClone(final Player player) { public void removeClone(final Player player) {
this.afkTeam.removeEntry(player.getName());
for (int i = 0; i < this.npcs.size(); i++) { for (int i = 0; i < this.npcs.size(); i++) {
final EntityPlayer npc = this.npcs.get(i); final EntityPlayer npc = this.npcs.get(i);
if (npc.getUniqueID().equals(player.getUniqueId())) { if (npc.getUniqueID().equals(player.getUniqueId())) {
@ -253,7 +232,6 @@ public class NPCManager {
@Override @Override
public void run() { public void run() {
nmsWorld.removeEntity(npc); nmsWorld.removeEntity(npc);
afkTeam.removeEntry(npc.getName());
npcs.remove(npc); npcs.remove(npc);
} }
}.runTask(this.plugin); }.runTask(this.plugin);

View file

@ -0,0 +1,147 @@
package de.cliffbreak.varo.managers;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.json.simple.parser.ParseException;
import de.cliffbreak.varo.Varo;
import de.cliffbreak.varo.uitls.JSONConfig;
import de.cliffbreak.varo.uitls.WebUtils;
public class TeamManager {
private final Varo plugin;
private final JSONConfig config;
private final Scoreboard scoreboard;
private final ArrayList<Team> teams;
public TeamManager(final Varo plugin) {
this.plugin = plugin;
this.config = new JSONConfig(new File("plugins/CliffbreakVaro", "teams.json"), getDefaults());
this.config.save();
this.scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
this.teams = new ArrayList<Team>();
this.init();
}
private void init() {
final JSONArray jsonTeams = config.getArray("Teams");
for (final Object jsonRawTeam : jsonTeams) {
final JSONObject jsonTeam = (JSONObject) jsonRawTeam;
final Team team, afkTeam;
if (jsonTeam.get("Name") == null)
continue;
if (scoreboard.getTeam((String) jsonTeam.get("Name")) == null) {
team = this.scoreboard.registerNewTeam((String) jsonTeam.get("Name"));
} else {
team = scoreboard.getTeam((String) jsonTeam.get("Name"));
}
if (scoreboard.getTeam("afk" + jsonTeam.get("Name")) == null) {
afkTeam = this.scoreboard.registerNewTeam("afk" + jsonTeam.get("Name"));
} else {
afkTeam = scoreboard.getTeam("afk" + jsonTeam.get("Name"));
}
teams.add(team);
teams.add(afkTeam);
team.setPrefix(ChatColor.valueOf((String) jsonTeam.get("Color")) + "§l[" + jsonTeam.get("Prefix") + "] ");
afkTeam.setPrefix("§8§l[AFK] ");
team.setColor(ChatColor.WHITE);
afkTeam.setColor(ChatColor.valueOf((String) jsonTeam.get("Color")));
for (final String entry : team.getEntries()) {
team.removeEntry(entry);
}
for (final String entry : afkTeam.getEntries()) {
team.removeEntry(entry);
}
for (final Object uuid : (JSONArray) jsonTeam.get("Players")) {
try {
final String result = WebUtils
.GET("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid);
if (result.isEmpty()) {
continue;
}
final JSONObject profile = (JSONObject) JSONValue.parseWithException(result);
team.addEntry((String) profile.get("name"));
} catch (IOException | ParseException e) {
this.plugin.getLogger().info(
"§c§lFehler:§r§c beim Verbinden mit der Mojang-API ist ein Fehler aufgetreten. Eventuell sind die Mojang Server down.");
}
}
}
}
public Team getTeamByPlayer(final String player) {
for (final Team team : this.teams) {
if (team.hasEntry(player)) {
return team;
}
}
return null;
}
public void setAFK(String player) {
Team oldTeam = getTeamByPlayer(player);
for (final Team team : this.teams) {
if (team.getName().equals("afk" + oldTeam.getName())) {
team.addEntry(player);
}
}
}
public void setTeam(Player player) {
final JSONArray jsonTeams = config.getArray("Teams");
for (final Object jsonRawTeam : jsonTeams) {
JSONObject jsonTeam = (JSONObject) jsonRawTeam;
if (((JSONArray) jsonTeam.get("Players")).contains(player.getUniqueId().toString().replace("-", ""))) {
for (Team team : this.teams) {
if (team.getName().equals(jsonTeam.get("Name").toString())) {
team.addEntry(player.getName());
}
}
}
}
}
@SuppressWarnings("unchecked")
private HashMap<String, Object> getDefaults() {
final HashMap<String, Object> defaults = new HashMap<String, Object>();
final JSONObject team1 = new JSONObject();
team1.put("Name", "Demo-Team");
team1.put("Color", ChatColor.RED);
team1.put("Prefix", "DMO");
final JSONArray team1Players = new JSONArray();
team1Players.add("a6019ccffe694bf780bcc3f3afa265dd");
team1Players.add("069a79f444e94726a5befca90e38aaf5");
team1.put("Players", team1Players);
final JSONObject team2 = new JSONObject();
team2.put("Name", "Demo-Team 2");
team2.put("Color", ChatColor.GREEN);
team2.put("Prefix", "DM2");
final JSONArray team2Players = new JSONArray();
team2Players.add("dff082fcd52d4ad2b2d8d8202aea53ec");
team2.put("Players", team2Players);
final JSONArray teams = new JSONArray();
teams.add(team1);
teams.add(team2);
defaults.put("Teams", teams);
return defaults;
}
}

View file

@ -0,0 +1,122 @@
package de.cliffbreak.varo.uitls;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.TreeMap;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.bukkit.ChatColor;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
public class JSONConfig {
private final File file;
private JSONObject json;
private final JSONParser parser = new JSONParser();
private final HashMap<String, Object> defaults;
public JSONConfig(final File file, final HashMap<String, Object> defaults) {
this.file = file;
this.defaults = defaults;
reload();
}
public void reload() {
try {
if (!this.file.getParentFile().exists()) {
this.file.getParentFile().mkdirs();
}
if (!this.file.exists()) {
final PrintWriter pw = new PrintWriter(file, "UTF-8");
pw.print("{");
pw.print("}");
pw.flush();
pw.close();
}
this.json = (JSONObject) this.parser.parse(new InputStreamReader(new FileInputStream(this.file), "UTF-8"));
} catch (final Exception ex) {
ex.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public boolean save() {
try {
final JSONObject toSave = new JSONObject();
for (final String s : this.defaults.keySet()) {
final Object o = this.defaults.get(s);
if (o instanceof String) {
toSave.put(s, getString(s));
} else if (o instanceof Double) {
toSave.put(s, getDouble(s));
} else if (o instanceof Integer) {
toSave.put(s, getInteger(s));
} else if (o instanceof JSONObject) {
toSave.put(s, getObject(s));
} else if (o instanceof JSONArray) {
toSave.put(s, getArray(s));
}
}
final TreeMap<String, Object> treeMap = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER);
treeMap.putAll(toSave);
final Gson g = new GsonBuilder().setPrettyPrinting().create();
final String prettyJsonString = g.toJson(treeMap);
final FileWriter fw = new FileWriter(this.file);
fw.write(prettyJsonString);
fw.flush();
fw.close();
return true;
} catch (final Exception ex) {
ex.printStackTrace();
return false;
}
}
private String getRawData(final String key) {
return this.json.containsKey(key) ? this.json.get(key).toString()
: (this.defaults.containsKey(key) ? this.defaults.get(key).toString() : key);
}
private String getString(final String key) {
return ChatColor.translateAlternateColorCodes('&', getRawData(key));
}
private double getDouble(final String key) {
try {
return Double.parseDouble(getRawData(key));
} catch (final Exception ex) {
}
return -1;
}
private double getInteger(final String key) {
try {
return Integer.parseInt(getRawData(key));
} catch (final Exception ex) {
}
return -1;
}
private JSONObject getObject(final String key) {
return this.json.containsKey(key) ? (JSONObject) json.get(key)
: (this.defaults.containsKey(key) ? (JSONObject) this.defaults.get(key) : new JSONObject());
}
private JSONArray getArray(final String key) {
return this.json.containsKey(key) ? (JSONArray) json.get(key)
: (this.defaults.containsKey(key) ? (JSONArray) this.defaults.get(key) : new JSONArray());
}
}