package net.minecraft.server.commands; import com.google.common.collect.Lists; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import java.util.List; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.arguments.ObjectiveArgument; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.scores.Objective; import net.minecraft.world.scores.ReadOnlyScoreInfo; import net.minecraft.world.scores.ScoreAccess; import net.minecraft.world.scores.ScoreHolder; import net.minecraft.world.scores.Scoreboard; import net.minecraft.world.scores.criteria.ObjectiveCriteria; public class TriggerCommand { private static final SimpleCommandExceptionType ERROR_NOT_PRIMED = new SimpleCommandExceptionType(Component.translatable("commands.trigger.failed.unprimed")); private static final SimpleCommandExceptionType ERROR_INVALID_OBJECTIVE = new SimpleCommandExceptionType( Component.translatable("commands.trigger.failed.invalid") ); public static void register(CommandDispatcher dispatcher) { dispatcher.register( Commands.literal("trigger") .then( Commands.argument("objective", ObjectiveArgument.objective()) .suggests((commandContext, suggestionsBuilder) -> suggestObjectives(commandContext.getSource(), suggestionsBuilder)) .executes( commandContext -> simpleTrigger( commandContext.getSource(), commandContext.getSource().getPlayerOrException(), ObjectiveArgument.getObjective(commandContext, "objective") ) ) .then( Commands.literal("add") .then( Commands.argument("value", IntegerArgumentType.integer()) .executes( commandContext -> addValue( commandContext.getSource(), commandContext.getSource().getPlayerOrException(), ObjectiveArgument.getObjective(commandContext, "objective"), IntegerArgumentType.getInteger(commandContext, "value") ) ) ) ) .then( Commands.literal("set") .then( Commands.argument("value", IntegerArgumentType.integer()) .executes( commandContext -> setValue( commandContext.getSource(), commandContext.getSource().getPlayerOrException(), ObjectiveArgument.getObjective(commandContext, "objective"), IntegerArgumentType.getInteger(commandContext, "value") ) ) ) ) ) ); } public static CompletableFuture suggestObjectives(CommandSourceStack source, SuggestionsBuilder builder) { ScoreHolder scoreHolder = source.getEntity(); List list = Lists.newArrayList(); if (scoreHolder != null) { Scoreboard scoreboard = source.getServer().getScoreboard(); for (Objective objective : scoreboard.getObjectives()) { if (objective.getCriteria() == ObjectiveCriteria.TRIGGER) { ReadOnlyScoreInfo readOnlyScoreInfo = scoreboard.getPlayerScoreInfo(scoreHolder, objective); if (readOnlyScoreInfo != null && !readOnlyScoreInfo.isLocked()) { list.add(objective.getName()); } } } } return SharedSuggestionProvider.suggest(list, builder); } private static int addValue(CommandSourceStack source, ServerPlayer player, Objective objective, int value) throws CommandSyntaxException { ScoreAccess scoreAccess = getScore(source.getServer().getScoreboard(), player, objective); int i = scoreAccess.add(value); source.sendSuccess(() -> Component.translatable("commands.trigger.add.success", objective.getFormattedDisplayName(), value), true); return i; } private static int setValue(CommandSourceStack source, ServerPlayer player, Objective objective, int value) throws CommandSyntaxException { ScoreAccess scoreAccess = getScore(source.getServer().getScoreboard(), player, objective); scoreAccess.set(value); source.sendSuccess(() -> Component.translatable("commands.trigger.set.success", objective.getFormattedDisplayName(), value), true); return value; } private static int simpleTrigger(CommandSourceStack source, ServerPlayer player, Objective objective) throws CommandSyntaxException { ScoreAccess scoreAccess = getScore(source.getServer().getScoreboard(), player, objective); int i = scoreAccess.add(1); source.sendSuccess(() -> Component.translatable("commands.trigger.simple.success", objective.getFormattedDisplayName()), true); return i; } private static ScoreAccess getScore(Scoreboard scoreboard, ScoreHolder scoreHolder, Objective objective) throws CommandSyntaxException { if (objective.getCriteria() != ObjectiveCriteria.TRIGGER) { throw ERROR_INVALID_OBJECTIVE.create(); } else { ReadOnlyScoreInfo readOnlyScoreInfo = scoreboard.getPlayerScoreInfo(scoreHolder, objective); if (readOnlyScoreInfo != null && !readOnlyScoreInfo.isLocked()) { ScoreAccess scoreAccess = scoreboard.getOrCreatePlayerScore(scoreHolder, objective); scoreAccess.lock(); return scoreAccess; } else { throw ERROR_NOT_PRIMED.create(); } } } }