319 lines
11 KiB
Java
319 lines
11 KiB
Java
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. <b>{@code null} is not allowed!</b> 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. <b>{@code null} is not allowed!</b> 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. <b>{@code null} is not allowed!</b> 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;
|
|
}
|
|
}
|
|
} |