use of org.spongepowered.api.scoreboard.critieria.Criterion in project LanternServer by LanternPowered.
the class ScoreboardIO method read.
public static Scoreboard read(Path worldFolder) throws IOException {
DataView dataView = IOHelper.<DataView>read(worldFolder.resolve(SCOREBOARD_DATA), file -> {
try {
return NbtStreamUtils.read(Files.newInputStream(file), true);
} catch (IOException e) {
throw new IOException("Unable to access " + file.getFileName() + "!", e);
}
}).orElse(null);
final Scoreboard.Builder scoreboardBuilder = Scoreboard.builder();
if (dataView == null) {
return scoreboardBuilder.build();
}
final Map<String, Objective> objectives = new HashMap<>();
dataView = dataView.getView(DATA).orElseThrow(() -> new IllegalStateException("Unable to find the data compound."));
dataView.getViewList(OBJECTIVES).ifPresent(list -> list.forEach(entry -> {
final String name = entry.getString(NAME).get();
final Text displayName = LanternTexts.fromLegacy(entry.getString(DISPLAY_NAME).get());
final Criterion criterion = Sponge.getRegistry().getType(Criterion.class, entry.getString(CRITERION_NAME).get()).orElseGet(() -> {
Lantern.getLogger().warn("Unable to find a criterion with id: {}, default to dummy.", entry.getString(CRITERION_NAME).get());
return Criteria.DUMMY;
});
final ObjectiveDisplayMode objectiveDisplayMode = Sponge.getRegistry().getType(ObjectiveDisplayMode.class, entry.getString(DISPLAY_MODE).get()).orElseGet(() -> {
Lantern.getLogger().warn("Unable to find a display mode with id: {}, default to integer.", entry.getString(CRITERION_NAME).get());
return ObjectiveDisplayModes.INTEGER;
});
objectives.put(name, Objective.builder().name(name).displayName(displayName).criterion(criterion).objectiveDisplayMode(objectiveDisplayMode).build());
}));
dataView.getViewList(SCORES).ifPresent(list -> list.forEach(entry -> {
// We have to keep all the entries to remain compatible with vanilla mc.
if (entry.getInt(INVALID).orElse(0) > 0) {
return;
}
final Text name = LanternTexts.fromLegacy(entry.getString(NAME).get());
final int value = entry.getInt(SCORE).get();
// TODO
final boolean locked = entry.getInt(LOCKED).orElse(0) > 0;
final String objectiveName = entry.getString(OBJECTIVE).get();
Score score = null;
Objective objective = objectives.get(objectiveName);
if (objective != null) {
score = addToObjective(objective, null, name, value);
}
final List<String> extraObjectives = entry.getStringList(EXTRA_OBJECTIVES).orElse(null);
if (extraObjectives != null) {
for (String extraObjective : extraObjectives) {
objective = objectives.get(extraObjective);
if (objective != null) {
score = addToObjective(objective, score, name, value);
}
}
}
}));
final List<Team> teams = new ArrayList<>();
dataView.getViewList(TEAMS).ifPresent(list -> list.forEach(entry -> {
final Team.Builder builder = Team.builder().allowFriendlyFire(entry.getInt(ALLOW_FRIENDLY_FIRE).orElse(0) > 0).canSeeFriendlyInvisibles(entry.getInt(CAN_SEE_FRIENDLY_INVISIBLES).orElse(0) > 0).name(entry.getString(NAME).get()).displayName(LanternTexts.fromLegacy(entry.getString(DISPLAY_NAME).get())).prefix(LanternTexts.fromLegacy(entry.getString(PREFIX).get())).suffix(LanternTexts.fromLegacy(entry.getString(SUFFIX).get())).members(entry.getStringList(MEMBERS).get().stream().map(LanternTexts::fromLegacy).collect(Collectors.toSet()));
entry.getString(NAME_TAG_VISIBILITY).ifPresent(value -> builder.nameTagVisibility(Sponge.getRegistry().getAllOf(Visibility.class).stream().filter(visibility -> visibility.getName().equals(value)).findFirst().orElseGet(() -> {
Lantern.getLogger().warn("Unable to find a name tag visibility with id: {}, default to always.", value);
return Visibilities.ALWAYS;
})));
entry.getString(DEATH_MESSAGE_VISIBILITY).ifPresent(value -> builder.deathTextVisibility(Sponge.getRegistry().getAllOf(Visibility.class).stream().filter(visibility -> visibility.getName().equals(value)).findFirst().orElseGet(() -> {
Lantern.getLogger().warn("Unable to find a death message visibility with id: {}, default to always.", value);
return Visibilities.ALWAYS;
})));
entry.getString(COLLISION_RULE).ifPresent(value -> builder.collisionRule(Sponge.getRegistry().getAllOf(CollisionRule.class).stream().filter(visibility -> visibility.getName().equals(value)).findFirst().orElseGet(() -> {
Lantern.getLogger().warn("Unable to find a collision rule with id: {}, default to never.", value);
return CollisionRules.NEVER;
})));
entry.getString(TEAM_COLOR).ifPresent(color -> {
TextColor textColor = Sponge.getRegistry().getType(TextColor.class, color).orElseGet(() -> {
Lantern.getLogger().warn("Unable to find a team color with id: {}, default to none.", color);
return TextColors.NONE;
});
if (textColor != TextColors.NONE && textColor != TextColors.RESET) {
builder.color(textColor);
}
});
teams.add(builder.build());
}));
final Scoreboard scoreboard = scoreboardBuilder.objectives(new ArrayList<>(objectives.values())).teams(teams).build();
dataView.getView(DISPLAY_SLOTS).ifPresent(displaySlots -> {
for (DataQuery key : displaySlots.getKeys(false)) {
final Matcher matcher = DISPLAY_SLOT_PATTERN.matcher(key.getParts().get(0));
if (matcher.matches()) {
final int internalId = Integer.parseInt(matcher.group(1));
Lantern.getRegistry().getRegistryModule(DisplaySlotRegistryModule.class).get().getByInternalId(internalId).ifPresent(slot -> {
final Objective objective = objectives.get(displaySlots.getString(key).get());
if (objective != null) {
scoreboard.updateDisplaySlot(objective, slot);
}
});
}
}
});
return scoreboard;
}
use of org.spongepowered.api.scoreboard.critieria.Criterion in project LanternServer by LanternPowered.
the class CommandScoreboard method completeSpec.
@Override
public void completeSpec(PluginContainer pluginContainer, CommandSpec.Builder specBuilder) {
specBuilder.arguments(GenericArguments.flags().valueFlag(GenericArguments.world(CommandHelper.WORLD_KEY), "-world", "w").buildWith(GenericArguments.none())).child(CommandSpec.builder().child(CommandSpec.builder().executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
final Set<Objective> objectives = scoreboard.getObjectives();
if (objectives.isEmpty()) {
throw new CommandException(t("commands.scoreboard.objectives.list.empty"));
}
src.sendMessage(tb("commands.scoreboard.objectives.list.count", objectives.size()).color(TextColors.DARK_GREEN).build());
objectives.forEach(objective -> src.sendMessage(t("commands.scoreboard.objectives.list.entry", objective.getName(), objective.getDisplayName(), objective.getCriterion().getName())));
return CommandResult.success();
}).build(), "list").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("name")), GenericArguments.catalogedElement(Text.of("criterion"), Criterion.class), GenericArguments.flags().valueFlag(GenericArguments.catalogedElement(Text.of("display-mode"), ObjectiveDisplayMode.class), "-display-mode", "-dm", "d").buildWith(GenericArguments.none()), GenericArguments2.remainingString(Text.of("display-name"))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
final String name = args.<String>getOne("name").get();
final Criterion criterion = args.<Criterion>getOne("criterion").get();
if (scoreboard.getObjective(name).isPresent()) {
throw new CommandException(t("commands.scoreboard.objectives.add.alreadyExists", name));
}
if (name.length() > 16) {
throw new CommandException(t("commands.scoreboard.objectives.add.tooLong", name, 16));
}
String displayName = args.<String>getOne("display-name").orElse(null);
if (displayName != null && displayName.length() > 32) {
throw new CommandException(t("commands.scoreboard.objectives.add.displayTooLong", displayName, 32));
}
Objective.Builder builder = Objective.builder().name(name).criterion(criterion);
if (displayName != null && !displayName.isEmpty()) {
builder.displayName(Text.of(displayName));
}
args.<ObjectiveDisplayMode>getOne("display-mode").ifPresent(builder::objectiveDisplayMode);
scoreboard.addObjective(builder.build());
src.sendMessage(t("commands.scoreboard.objectives.add.success", name));
return CommandResult.success();
}).build(), "add").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("name"))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
final String name = args.<String>getOne("name").get();
scoreboard.removeObjective(scoreboard.getObjective(name).orElseThrow(() -> new CommandException(t("commands.scoreboard.objectiveNotFound", name))));
src.sendMessage(t("commands.scoreboard.objectives.remove.success", name));
return CommandResult.success();
}).build(), "remove").child(CommandSpec.builder().arguments(GenericArguments.catalogedElement(Text.of("display-slot"), DisplaySlot.class), GenericArguments.optional(GenericArguments.string(Text.of("name")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
final Optional<String> optName = args.<String>getOne("name");
DisplaySlot displaySlot = args.<DisplaySlot>getOne("display-slot").get();
Objective objective = null;
if (optName.isPresent()) {
final String name = optName.get();
objective = scoreboard.getObjective(name).orElseThrow(() -> new CommandException(t("commands.scoreboard.objectiveNotFound", name)));
src.sendMessage(t("commands.scoreboard.objectives.setdisplay.successSet", displaySlot.getName(), name));
} else {
src.sendMessage(t("commands.scoreboard.objectives.setdisplay.successCleared", displaySlot.getName()));
}
scoreboard.updateDisplaySlot(objective, displaySlot);
return CommandResult.success();
}).build(), "setdisplay").build(), "objectives").child(CommandSpec.builder().child(CommandSpec.builder().arguments(GenericArguments.optional(GenericArguments.string(Text.of("target")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
int result;
if (args.hasAny("target")) {
String entity = args.<String>getOne("target").get();
Set<Score> scores = scoreboard.getScores(Text.of(entity));
if (scores.isEmpty()) {
throw new CommandException(t("commands.scoreboard.players.list.player.empty"));
}
result = scores.size();
src.sendMessage(tb("commands.scoreboard.players.list.player.count", result, entity).color(TextColors.DARK_GREEN).build());
scores.forEach(score -> score.getObjectives().forEach(objective -> src.sendMessage(t("commands.scoreboard.players.list.player.entry", score.getScore(), objective.getDisplayName(), objective.getName()))));
} else {
Set<Text> names = scoreboard.getScores().stream().map(Score::getName).collect(Collectors.toSet());
if (names.isEmpty()) {
throw new CommandException(t("commands.scoreboard.players.list.empty"));
}
result = names.size();
src.sendMessage(tb("commands.scoreboard.players.list.count", result).color(TextColors.DARK_GREEN).build());
src.sendMessage(Text.joinWith(Text.of(", "), names));
}
return CommandResult.builder().successCount(1).queryResult(result).build();
}).build(), "list").child(createPlayerScoreSpec(Score::setScore), "set").child(createPlayerScoreSpec((score, value) -> score.setScore(score.getScore() + value)), "add").child(createPlayerScoreSpec((score, value) -> score.setScore(score.getScore() - value)), "remove").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("target")), GenericArguments.optional(GenericArguments.string(Text.of("objective")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
String target = args.<String>getOne("target").get();
if (args.hasAny("objective")) {
String objectiveName = args.<String>getOne("objective").get();
Objective objective = scoreboard.getObjective(objectiveName).orElseThrow(() -> new CommandException(t("commands.scoreboard.objectiveNotFound", objectiveName)));
objective.removeScore(Text.of(target));
src.sendMessage(t("commands.scoreboard.players.resetscore.success", objectiveName, target));
} else {
scoreboard.removeScores(Text.of(target));
src.sendMessage(t("commands.scoreboard.players.reset.success", target));
}
return CommandResult.success();
}).build(), "reset").build(), "players").child(CommandSpec.builder().child(CommandSpec.builder().arguments(GenericArguments.optional(GenericArguments.string(Text.of("name")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
int result;
if (args.hasAny("name")) {
String teamName = args.<String>getOne("name").get();
Team team = scoreboard.getTeam(teamName).orElseThrow(() -> new CommandException(t("commands.scoreboard.teamNotFound", teamName)));
Set<Text> members = team.getMembers();
if (members.isEmpty()) {
throw new CommandException(t("commands.scoreboard.teams.list.player.empty", teamName));
}
result = members.size();
src.sendMessage(tb("commands.scoreboard.teams.list.player.count", result, teamName).color(TextColors.DARK_GREEN).build());
src.sendMessage(Text.joinWith(Text.of(", "), members));
} else {
Set<Team> teams = scoreboard.getTeams();
if (teams.isEmpty()) {
throw new CommandException(t("commands.scoreboard.teams.list.empty"));
}
result = teams.size();
src.sendMessage(tb("commands.scoreboard.teams.list.count", result).color(TextColors.DARK_GREEN).build());
teams.forEach(team -> src.sendMessage(t("commands.scoreboard.teams.list.entry", team.getName(), team.getDisplayName(), team.getMembers().size())));
}
return CommandResult.builder().successCount(1).queryResult(result).build();
}).build(), "list").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("name")), GenericArguments.optional(GenericArguments2.remainingString(Text.of("display-name")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
final String teamName = args.<String>getOne("name").get();
if (scoreboard.getTeam(teamName).isPresent()) {
throw new CommandException(t("commands.scoreboard.teams.add.alreadyExists", teamName));
}
if (teamName.length() > 16) {
throw new CommandException(t("commands.scoreboard.teams.add.tooLong", teamName, 16));
}
String displayName = args.<String>getOne("display-name").orElse(null);
if (displayName != null && displayName.length() > 32) {
throw new CommandException(t("commands.scoreboard.teams.add.displayTooLong", displayName, 32));
}
Team.Builder teamBuilder = Team.builder().name(teamName);
if (displayName != null && !displayName.isEmpty()) {
teamBuilder.displayName(Text.of(displayName));
}
scoreboard.registerTeam(teamBuilder.build());
src.sendMessage(t("commands.scoreboard.teams.add.success", teamName));
return CommandResult.success();
}).build(), "add").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("name"))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
String teamName = args.<String>getOne("name").get();
final Team team = scoreboard.getTeam(teamName).orElseThrow(() -> new CommandException(t("commands.scoreboard.teamNotFound", teamName)));
team.unregister();
src.sendMessage(t("commands.scoreboard.teams.remove.success", teamName));
return CommandResult.success();
}).build(), "remove").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("name"))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
String teamName = args.<String>getOne("name").get();
final Team team = scoreboard.getTeam(teamName).orElseThrow(() -> new CommandException(t("commands.scoreboard.teamNotFound", teamName)));
Set<Text> members = team.getMembers();
if (members.isEmpty()) {
throw new CommandException(t("commands.scoreboard.teams.empty.alreadyEmpty", teamName));
}
int result = members.size();
((LanternTeam) team).removeMembers(members);
src.sendMessage(t("commands.scoreboard.teams.empty.success", result, teamName));
return CommandResult.builder().successCount(1).queryResult(result).build();
}).build(), "empty").child(CommandSpec.builder().arguments(GenericArguments.optional(GenericArguments.string(Text.of("name"))), GenericArguments.optional(GenericArguments2.remainingStringArray(Text.of("players")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
String teamName = args.<String>getOne("name").orElse(null);
final Team team = teamName == null ? null : scoreboard.getTeam(teamName).orElse(null);
Set<Text> members = args.<String[]>getOne("players").map(array -> Arrays.stream(array).map(LanternTexts::fromLegacy).collect(Collectors.toSet())).orElse(new HashSet<>());
// that wants to leave a team
if (teamName != null && team == null) {
members.add(LanternTexts.fromLegacy(teamName));
}
// If there are no members found, use the source if possible
if (members.isEmpty() && src instanceof Player) {
members.add(((Player) src).getTeamRepresentation());
}
// If there is a team specified, remove the members from a specific team
Collection<Team> teams = team == null ? scoreboard.getTeams() : Collections.singleton(team);
List<Text> failedMembers = null;
for (Team team0 : teams) {
List<Text> failedMembers0 = ((LanternTeam) team0).removeMembers(members);
if (failedMembers == null) {
failedMembers = failedMembers0;
} else {
failedMembers.retainAll(failedMembers0);
}
}
if (failedMembers != null) {
members.removeAll(failedMembers);
}
int result = members.size();
if (result > 0) {
src.sendMessage(t("commands.scoreboard.teams.leave.success", result, Text.joinWith(Text.of(", "), members)));
}
if (failedMembers != null && failedMembers.size() > 0) {
src.sendMessage(error(t("commands.scoreboard.teams.leave.failure", failedMembers.size(), Text.joinWith(Text.of(", "), failedMembers))));
}
return CommandResult.builder().successCount(1).queryResult(result).build();
}).build(), "leave").child(CommandSpec.builder().arguments(GenericArguments.string(Text.of("name")), GenericArguments.optional(GenericArguments2.remainingStringArray(Text.of("players")))).executor((src, args) -> {
// Get the scoreboard of the world the command source is located in
final Scoreboard scoreboard = CommandHelper.getWorld(src, args).getScoreboard();
String teamName = args.<String>getOne("name").get();
final Team team = scoreboard.getTeam(teamName).orElseThrow(() -> new CommandException(t("commands.scoreboard.teamNotFound", teamName)));
Set<Text> members = args.<String[]>getOne("players").map(array -> Arrays.stream(array).map(LanternTexts::fromLegacy).collect(Collectors.toSet())).orElse(new HashSet<>());
// If there are no members found, use the source if possible
if (members.isEmpty() && src instanceof Player) {
members.add(((Player) src).getTeamRepresentation());
}
List<Text> failedMembers = ((LanternTeam) team).addMembers(members);
int result = members.size();
if (result > 0) {
src.sendMessage(t("commands.scoreboard.teams.join.success", result, teamName, Text.joinWith(Text.of(", "), members)));
}
if (failedMembers.size() > 0) {
src.sendMessage(error(t("commands.scoreboard.teams.join.failure", failedMembers.size(), teamName, Text.joinWith(Text.of(", "), failedMembers))));
}
return CommandResult.builder().successCount(1).queryResult(result).build();
}).build(), "join").build(), "teams");
}
Aggregations