package net.minecraft.command; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.parser.Parser; import net.minecraft.command.parser.ParsingManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.Scoreboard; public class CommandResultStats { private static final int typeCount = CommandResultStats.Type.values().length; private static final String[] pseudoNull = new String[typeCount]; private static final Target[] pseudoNullTarget = new Target[typeCount]; private Target[] targets; private String[] objectiveNames; @SuppressWarnings("unused") private static final String __OBFID = "CL_00002364"; public CommandResultStats() { this.targets = pseudoNullTarget; this.objectiveNames = pseudoNull; } /** * main function (set stat) */ public void func_179672_a(final ICommandSender sender, final CommandResultStats.Type stat, final int amount) { final Target target = this.targets[stat.statId()]; if (target == null) return; final String objectiveName = this.objectiveNames[stat.statId()]; if (objectiveName == null) return; final Scoreboard scoreboard = sender.getEntityWorld().getScoreboard(); final ScoreObjective objective = scoreboard.getObjective(objectiveName); if (objective == null) return; final List<String> entityIdentifiers; try { entityIdentifiers = target.getTarget().eval(sender); } catch (final CommandException e) { return; } // boolean scoreSet(...) // if (scoreboard.func_178819_b(entityIdentifiers, objective)) <-- set score even if not yet existing for (final String entityIdentifier : entityIdentifiers) scoreboard.getValueFromObjective(entityIdentifier, objective).setScorePoints(amount); } /** * Read from NBT */ public void func_179668_a(final NBTTagCompound tag) { if (tag.hasKey("CommandStats", 10)) { final NBTTagCompound statsCompound = tag.getCompoundTag("CommandStats"); final CommandResultStats.Type[] types = CommandResultStats.Type.values(); final int typeCount = types.length; for (int i = 0; i < typeCount; ++i) { final CommandResultStats.Type type = types[i]; // typeIdentifier? final String targetTagName = type.func_179637_b() + "Name"; final String objectiveTagName = type.func_179637_b() + "Objective"; if (statsCompound.hasKey(targetTagName, 8) && statsCompound.hasKey(objectiveTagName, 8)) { final String target = statsCompound.getString(targetTagName); final String objectiveName = statsCompound.getString(objectiveTagName); func_179667_a(this, type, target, objectiveName); } } } } /** * Write to NBT */ public void func_179670_b(final NBTTagCompound tag) { final NBTTagCompound statsTag = new NBTTagCompound(); final CommandResultStats.Type[] types = CommandResultStats.Type.values(); for (final Type type : types) { final Target target = this.targets[type.statId()]; final String objectiveName = this.objectiveNames[type.statId()]; if (target != null && objectiveName != null) { statsTag.setString(type.func_179637_b() + "Name", target.get()); statsTag.setString(type.func_179637_b() + "Objective", objectiveName); } } if (!statsTag.hasNoTags()) tag.setTag("CommandStats", statsTag); } /** * Set target-objective pair */ public static void func_179667_a(final CommandResultStats stats, final CommandResultStats.Type type, final String targetString, final String objectiveName) { if (targetString != null && targetString.length() != 0 && objectiveName != null && objectiveName.length() != 0) { if (stats.targets == pseudoNullTarget || stats.objectiveNames == pseudoNull) { stats.targets = new Target[typeCount]; stats.objectiveNames = new String[typeCount]; } stats.targets[type.statId()] = Target.create(targetString, stats.targets[type.statId()]); // Only create new Target if needed (makes '/entitydata' a LOT more efficient) stats.objectiveNames[type.statId()] = objectiveName; } else removeTypeData(stats, type); } private static void removeTypeData(final CommandResultStats stats, final CommandResultStats.Type type) { if (stats.targets != pseudoNullTarget && stats.objectiveNames != pseudoNull) { stats.targets[type.statId()] = null; stats.objectiveNames[type.statId()] = null; boolean nowEmpty = true; final CommandResultStats.Type[] types = CommandResultStats.Type.values(); final int typeCount = types.length; for (int i = 0; i < typeCount; ++i) { final CommandResultStats.Type curType = types[i]; if (stats.targets[curType.statId()] != null && stats.objectiveNames[curType.statId()] != null) { nowEmpty = false; break; } } if (nowEmpty) { stats.targets = pseudoNullTarget; stats.objectiveNames = pseudoNull; } } } // Copy public void func_179671_a(final CommandResultStats stats) { final CommandResultStats.Type[] types = CommandResultStats.Type.values(); for (final Type type : types) { final Target target = stats.targets[type.statId()]; func_179667_a(this, type, target == null ? null : target.get(), stats.objectiveNames[type.statId()]); } } public static enum Type { SUCCESS_COUNT("SUCCESS_COUNT", 0, 0, "SuccessCount"), AFFECTED_BLOCKS("AFFECTED_BLOCKS", 1, 1, "AffectedBlocks"), AFFECTED_ENTITIES("AFFECTED_ENTITIES", 2, 2, "AffectedEntities"), AFFECTED_ITEMS("AFFECTED_ITEMS", 3, 3, "AffectedItems"), QUERY_RESULT("QUERY_RESULT", 4, 4, "QueryResult"); /** * StatID */ final int field_179639_f; /** * Name */ final String field_179640_g; @SuppressWarnings("unused") private static final CommandResultStats.Type[] $VALUES = new CommandResultStats.Type[] { SUCCESS_COUNT, AFFECTED_BLOCKS, AFFECTED_ENTITIES, AFFECTED_ITEMS, QUERY_RESULT }; @SuppressWarnings("unused") private static final String __OBFID = "CL_00002363"; private Type(@SuppressWarnings("unused") final String p_i46050_1_, @SuppressWarnings("unused") final int p_i46050_2_, final int statID, final String name) { this.field_179639_f = statID; this.field_179640_g = name; } public int statId() { return this.field_179639_f; } /** * getName */ public String func_179637_b() { return this.field_179640_g; } /** * getNames */ public static String[] func_179634_c() { final String[] var0 = new String[values().length]; int i2 = 0; final CommandResultStats.Type[] types = values(); final int typeCount = types.length; for (int i = 0; i < typeCount; ++i) { final CommandResultStats.Type type = types[i]; var0[i2++] = type.func_179637_b(); } return var0; } /** * getTypeByName */ public static CommandResultStats.Type func_179635_a(final String name) { final CommandResultStats.Type[] types = values(); final int typeCount = types.length; for (int i = 0; i < typeCount; ++i) { final CommandResultStats.Type type = types[i]; if (type.func_179637_b().equals(name)) return type; } return null; } } public static class Target { private String targetString; private Future<CommandArg<List<String>>> fTarget; private CommandArg<List<String>> target; public Target() { this.targetString = ""; this.fTarget = null; this.target = initTarget; } public Target(final String targetString) { this.targetString = targetString; this.fTarget = ParsingManager.submitTarget(this.targetString); this.target = null; } public static Target create(final String targetString, final Target fallback) { return fallback != null && targetString == fallback.targetString ? fallback : new Target(targetString); } public final String get() { return this.targetString; } public final void set(final String targetString) { this.targetString = targetString; this.fTarget = ParsingManager.submitTarget(this.targetString); this.target = null; } public CommandArg<List<String>> getTarget() { if (this.target == null) { try { try { this.target = this.fTarget.get(); } catch (final InterruptedException e) { this.target = Parser.parseStatsTarget(this.targetString); } } catch (final ExecutionException | SyntaxErrorException e) { this.target = initTarget; } this.fTarget = null; } return this.target; } private static final CommandArg<List<String>> initTarget = new CommandArg<List<String>>() { @Override public List<String> eval(final ICommandSender sender) throws CommandException { return Collections.emptyList(); } }; } }