Ugly scoreboard persistence

This commit is contained in:
fullwall 2014-06-29 20:26:30 -07:00
parent 683ffc08f7
commit 9a998c149b
3 changed files with 127 additions and 9 deletions

View File

@ -42,6 +42,7 @@ import net.citizensnpcs.trait.CurrentLocation;
import net.citizensnpcs.trait.Gravity;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.trait.LookClose;
import net.citizensnpcs.trait.NPCScoreboard;
import net.citizensnpcs.trait.NPCSkeletonType;
import net.citizensnpcs.trait.OcelotModifiers;
import net.citizensnpcs.trait.Poses;
@ -79,6 +80,7 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.Skeleton.SkeletonType;
import org.bukkit.entity.Villager.Profession;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
@ -1135,16 +1137,22 @@ public class NPCCommands {
permission = "citizens.npc.scoreboard")
@Requirements(selected = true, ownership = true, types = EntityType.PLAYER)
public void scoreboard(CommandContext args, CommandSender sender, NPC npc) {
Scoreboard main = Bukkit.getScoreboardManager().getMainScoreboard();
String objective = args.getString(1);
String criteria = args.getString(2);
Iterable<MetadataValue> itr = npc.getEntity().getMetadata("citizens.scoreboard");
Scoreboard main;
if (!itr.iterator().hasNext()) {
main = Bukkit.getScoreboardManager().getNewScoreboard();
} else {
main = (Scoreboard) itr.iterator().next().value();
}
String objective = Colorizer.parseColors(args.getString(1));
String criteria = Colorizer.parseColors(args.getString(2));
Objective obj = main.getObjective(objective);
if (obj == null) {
obj = Bukkit.getScoreboardManager().getMainScoreboard().registerNewObjective(objective, criteria);
obj = main.registerNewObjective(objective, criteria);
}
Player entity = (Player) npc.getEntity();
if (args.hasValueFlag("team")) {
String team = args.getFlag("team");
String team = Colorizer.parseColors(args.getFlag("team"));
if (main.getPlayerTeam(entity) != null)
main.getPlayerTeam(entity).removePlayer(entity);
if (main.getTeam(team) == null)
@ -1157,6 +1165,7 @@ public class NPCCommands {
if (args.hasValueFlag("score")) {
obj.getScore(entity).setScore(args.getFlagInteger("score"));
}
npc.getTrait(NPCScoreboard.class).persistObjective(obj);
}
@Command(

View File

@ -24,6 +24,7 @@ import net.citizensnpcs.trait.CurrentLocation;
import net.citizensnpcs.trait.Gravity;
import net.citizensnpcs.trait.HorseModifiers;
import net.citizensnpcs.trait.LookClose;
import net.citizensnpcs.trait.NPCScoreboard;
import net.citizensnpcs.trait.NPCSkeletonType;
import net.citizensnpcs.trait.OcelotModifiers;
import net.citizensnpcs.trait.Poses;
@ -63,6 +64,7 @@ public class CitizensTraitFactory implements TraitFactory {
registerTrait(TraitInfo.create(Powered.class).withName("powered"));
registerTrait(TraitInfo.create(Saddle.class).withName("saddle"));
registerTrait(TraitInfo.create(Sheared.class).withName("sheared"));
registerTrait(TraitInfo.create(NPCScoreboard.class).withName("npcscoreboard"));
registerTrait(TraitInfo.create(NPCSkeletonType.class).withName("skeletontype"));
registerTrait(TraitInfo.create(SlimeSize.class).withName("slimesize"));
registerTrait(TraitInfo.create(Spawned.class).withName("spawned"));

View File

@ -0,0 +1,107 @@
package net.citizensnpcs.trait;
import java.util.Set;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.util.DataKey;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
public class NPCScoreboard extends Trait {
private Set<Objective> objectives;
private Scoreboard scoreboard;
private String team;
public NPCScoreboard() {
super("npcscoreboard");
}
private void checkScoreboard() {
if (scoreboard == null) {
if (npc.isSpawned() && !npc.getEntity().getMetadata("citizens.scoreboard").isEmpty()) {
scoreboard = (Scoreboard) npc.getEntity().getMetadata("citizens.scoreboard").iterator().next().value();
} else {
scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
}
}
if (npc.getEntity() instanceof Player && npc.getEntity().getMetadata("citizens.scoreboard").isEmpty()) {
npc.getEntity().setMetadata("citizens.scoreboard",
new FixedMetadataValue(CitizensAPI.getPlugin(), scoreboard));
}
}
@Override
public void load(DataKey root) {
checkScoreboard();
if (root.keyExists("team")) {
team = root.getString("team");
}
if (!root.keyExists("objectives"))
return;
for (DataKey sub : root.getRelative("objectives").getSubKeys()) {
String objName = sub.name();
Objective objective;
if (scoreboard.getObjective(objName) != null) {
objective = scoreboard.getObjective(objName);
} else {
objective = scoreboard.registerNewObjective(objName, root.getString("criteria"));
}
objective.setDisplaySlot(DisplaySlot.valueOf(sub.getString("display")));
objectives.add(objective);
if (npc.isSpawned() && npc.getEntity() instanceof Player) {
objective.getScore((Player) npc.getEntity()).setScore(sub.getInt("score"));
}
}
}
@Override
public void onSpawn() {
if (npc.getEntity() instanceof Player && team != null) {
checkScoreboard();
scoreboard.getTeam(team).addPlayer((Player) npc.getEntity());
}
}
public void persistObjective(Objective objective) {
if (!objectives.contains(objective)) {
objectives.add(objective);
}
Team playerTeam = objectives.iterator().next().getScoreboard().getPlayerTeam((Player) npc.getEntity());
if (team == null) {
team = playerTeam.getName();
}
if (scoreboard == null) {
scoreboard = objective.getScoreboard();
}
}
@Override
public void save(DataKey root) {
root.removeKey("objectives");
root.removeKey("team");
if (objectives.isEmpty()) {
return;
}
for (Objective objective : objectives) {
DataKey key = root.getRelative("objectives." + objective.getName());
key.setString("criteria", objective.getCriteria());
key.setString("display", objective.getDisplaySlot().name());
if (npc.getEntity() instanceof Player) {
key.setInt("score", objective.getScore((Player) npc.getEntity()).getScore());
}
}
if (npc.getEntity() instanceof Player && team == null) {
team = objectives.iterator().next().getScoreboard().getPlayerTeam((Player) npc.getEntity()).getName();
}
if (team != null) {
root.setString("team", team);
}
}
}