package net.minecraft.command; import javax.annotation.Nullable; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.scoreboard.Score; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.server.MinecraftServer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; public class CommandResultStats { /** The number of result command result types that are possible. */ private static final int NUM_RESULT_TYPES = CommandResultStats.Type.values().length; private static final String[] STRING_RESULT_TYPES = new String[NUM_RESULT_TYPES]; /** List of entityID who set a stat, username for a player, UUID for all entities */ private String[] entitiesID; /** List of all the Objectives names */ private String[] objectives; public CommandResultStats() { this.entitiesID = STRING_RESULT_TYPES; this.objectives = STRING_RESULT_TYPES; } public void setCommandStatForSender(MinecraftServer server, final ICommandSender sender, CommandResultStats.Type typeIn, int p_184932_4_) { String s = this.entitiesID[typeIn.getTypeID()]; if (s != null) { ICommandSender icommandsender = new ICommandSender() { /** * Get the name of this object. For players this returns their username */ public String getName() { return sender.getName(); } /** * Get the formatted ChatComponent that will be used for the sender's username in chat */ public ITextComponent getDisplayName() { return sender.getDisplayName(); } /** * Send a chat message to the CommandSender */ public void sendMessage(ITextComponent component) { sender.sendMessage(component); } /** * Returns {@code true} if the CommandSender is allowed to execute the command, {@code false} if not */ public boolean canUseCommand(int permLevel, String commandName) { return true; } /** * Get the position in the world. {@code null} is not allowed! If you are not an entity in the * world, return the coordinates 0, 0, 0 */ public BlockPos getPosition() { return sender.getPosition(); } /** * Get the position vector. {@code null} is not allowed! If you are not an entity in the world, * return 0.0D, 0.0D, 0.0D */ public Vec3d getPositionVector() { return sender.getPositionVector(); } /** * Get the world, if available. {@code null} is not allowed! If you are not an entity in the * world, return the overworld */ public World getEntityWorld() { return sender.getEntityWorld(); } /** * Returns the entity associated with the command sender. MAY BE NULL! */ public Entity getCommandSenderEntity() { return sender.getCommandSenderEntity(); } /** * Returns true if the command sender should be sent feedback about executed commands */ public boolean sendCommandFeedback() { return sender.sendCommandFeedback(); } public void setCommandStat(CommandResultStats.Type type, int amount) { sender.setCommandStat(type, amount); } /** * Get the Minecraft server instance */ public MinecraftServer getServer() { return sender.getServer(); } }; String s1; try { s1 = CommandBase.getEntityName(server, icommandsender, s); } catch (CommandException var12) { return; } String s2 = this.objectives[typeIn.getTypeID()]; if (s2 != null) { Scoreboard scoreboard = sender.getEntityWorld().getScoreboard(); ScoreObjective scoreobjective = scoreboard.getObjective(s2); if (scoreobjective != null) { if (scoreboard.entityHasObjective(s1, scoreobjective)) { Score score = scoreboard.getOrCreateScore(s1, scoreobjective); score.setScorePoints(p_184932_4_); } } } } } public void readStatsFromNBT(NBTTagCompound tagcompound) { if (tagcompound.hasKey("CommandStats", 10)) { NBTTagCompound nbttagcompound = tagcompound.getCompoundTag("CommandStats"); for (CommandResultStats.Type commandresultstats$type : CommandResultStats.Type.values()) { String s = commandresultstats$type.getTypeName() + "Name"; String s1 = commandresultstats$type.getTypeName() + "Objective"; if (nbttagcompound.hasKey(s, 8) && nbttagcompound.hasKey(s1, 8)) { String s2 = nbttagcompound.getString(s); String s3 = nbttagcompound.getString(s1); setScoreBoardStat(this, commandresultstats$type, s2, s3); } } } } public void writeStatsToNBT(NBTTagCompound tagcompound) { NBTTagCompound nbttagcompound = new NBTTagCompound(); for (CommandResultStats.Type commandresultstats$type : CommandResultStats.Type.values()) { String s = this.entitiesID[commandresultstats$type.getTypeID()]; String s1 = this.objectives[commandresultstats$type.getTypeID()]; if (s != null && s1 != null) { nbttagcompound.setString(commandresultstats$type.getTypeName() + "Name", s); nbttagcompound.setString(commandresultstats$type.getTypeName() + "Objective", s1); } } if (!nbttagcompound.hasNoTags()) { tagcompound.setTag("CommandStats", nbttagcompound); } } /** * Set a stat in the scoreboard */ public static void setScoreBoardStat(CommandResultStats stats, CommandResultStats.Type resultType, @Nullable String entityID, @Nullable String objectiveName) { if (entityID != null && !entityID.isEmpty() && objectiveName != null && !objectiveName.isEmpty()) { if (stats.entitiesID == STRING_RESULT_TYPES || stats.objectives == STRING_RESULT_TYPES) { stats.entitiesID = new String[NUM_RESULT_TYPES]; stats.objectives = new String[NUM_RESULT_TYPES]; } stats.entitiesID[resultType.getTypeID()] = entityID; stats.objectives[resultType.getTypeID()] = objectiveName; } else { removeScoreBoardStat(stats, resultType); } } /** * Remove a stat from the scoreboard */ private static void removeScoreBoardStat(CommandResultStats resultStatsIn, CommandResultStats.Type resultTypeIn) { if (resultStatsIn.entitiesID != STRING_RESULT_TYPES && resultStatsIn.objectives != STRING_RESULT_TYPES) { resultStatsIn.entitiesID[resultTypeIn.getTypeID()] = null; resultStatsIn.objectives[resultTypeIn.getTypeID()] = null; boolean flag = true; for (CommandResultStats.Type commandresultstats$type : CommandResultStats.Type.values()) { if (resultStatsIn.entitiesID[commandresultstats$type.getTypeID()] != null && resultStatsIn.objectives[commandresultstats$type.getTypeID()] != null) { flag = false; break; } } if (flag) { resultStatsIn.entitiesID = STRING_RESULT_TYPES; resultStatsIn.objectives = STRING_RESULT_TYPES; } } } /** * Add all stats in the CommandResultStats */ public void addAllStats(CommandResultStats resultStatsIn) { for (CommandResultStats.Type commandresultstats$type : CommandResultStats.Type.values()) { setScoreBoardStat(this, commandresultstats$type, resultStatsIn.entitiesID[commandresultstats$type.getTypeID()], resultStatsIn.objectives[commandresultstats$type.getTypeID()]); } } public static enum Type { SUCCESS_COUNT(0, "SuccessCount"), AFFECTED_BLOCKS(1, "AffectedBlocks"), AFFECTED_ENTITIES(2, "AffectedEntities"), AFFECTED_ITEMS(3, "AffectedItems"), QUERY_RESULT(4, "QueryResult"); /** The integer ID of the Result Type. */ final int typeID; /** The string representation of the type. */ final String typeName; private Type(int id, String name) { this.typeID = id; this.typeName = name; } /** * Retrieves the integer ID of the result type. */ public int getTypeID() { return this.typeID; } /** * Retrieves the name of the type. */ public String getTypeName() { return this.typeName; } /** * Returns the names of all possible Result Types. */ public static String[] getTypeNames() { String[] astring = new String[values().length]; int i = 0; for (CommandResultStats.Type commandresultstats$type : values()) { astring[i++] = commandresultstats$type.getTypeName(); } return astring; } /** * Retrieves the Type indicated by the supplied name string. */ @Nullable public static CommandResultStats.Type getTypeByName(String name) { for (CommandResultStats.Type commandresultstats$type : values()) { if (commandresultstats$type.getTypeName().equals(name)) { return commandresultstats$type; } } return null; } } }