package jas.spawner.legacy.command;
import jas.common.JustAnotherSpawner;
import jas.spawner.legacy.TAGProfile;
import jas.spawner.legacy.spawner.CustomSpawner;
import jas.spawner.legacy.spawner.EntityCounter;
import jas.spawner.legacy.spawner.CustomSpawner.ChunkStat;
import jas.spawner.legacy.spawner.EntityCounter.CountableInt;
import jas.spawner.legacy.spawner.creature.type.CreatureType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.NumberInvalidException;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
public class CommandCountCap extends CommandJasBase {
public String getCommandName() {
return "countcap";
}
/**
* Return the required permission level for this command.
*/
public int getRequiredPermissionLevel() {
return 2;
}
@Override
public String getCommandUsage(ICommandSender par1ICommandSender) {
return "commands.jascountcap.usage";
}
/**
* Command stringArgs :
*
* /jascountcap <targetPlayer> <EntityType> --OUTPUT--> For Dimension Player is in: Count of <EntityType> is <XX>
* out of <EntityTypeCap>
*
* /jascountcap <EntityType> --OUTPUT--> New Line for Each Dimension of <EntityType> is <XX> out of <EntityTypeCap>
*/
@Override
public void process(ICommandSender commandSender, String[] stringArgs) {
if (stringArgs.length >= 3) {
throw new WrongUsageException("commands.jascountcap.usage", new Object[0]);
}
World targetWorld = null;
if (stringArgs.length > 0) {
targetWorld = getTargetWorld(stringArgs[0], commandSender);
}
if (targetWorld == null) {
targetWorld = getPlayer(commandSender, commandSender.getCommandSenderName()).worldObj;
}
String typeName = stringArgs.length == 0 ? "*" : stringArgs[stringArgs.length == 1 ? 0 : 1];
World[] worlds = stringArgs.length == 2 && stringArgs[0].equals("*") ? MinecraftServer.getServer().worldServers
: new World[] { targetWorld };
for (int i = 0; i < worlds.length; i++) {
if (worlds[i] == null) {
continue;
}
World world = worlds[i];
HashMap<ChunkCoordIntPair, ChunkStat> eligibleChunksForSpawning = CustomSpawner.determineChunksForSpawnering(
world, JustAnotherSpawner.globalSettings().chunkSpawnDistance);
EntityCounter creatureTypeCount = new EntityCounter();
EntityCounter creatureCount = new EntityCounter();
CustomSpawner.countEntityInChunks(world, creatureTypeCount, creatureCount);
Iterator<CreatureType> iterator = TAGProfile.worldSettings().creatureTypeRegistry()
.getCreatureTypes();
StringBuilder worldTypeContents = new StringBuilder();
worldTypeContents.append("Results World (");
worldTypeContents.append(world.provider.getDimensionName());
worldTypeContents.append("|");
worldTypeContents.append(world.provider.dimensionId);
worldTypeContents.append(")");
boolean foundMatch = false;
while (iterator.hasNext()) {
CreatureType entityType = iterator.next();
if (typeName.equals("*") || entityType.typeID.equalsIgnoreCase(typeName)) {
CountableInt counter = creatureTypeCount.getOrPutIfAbsent(entityType.typeID, 0);
if (!foundMatch) {
foundMatch = true;
worldTypeContents.append(" ");
} else {
worldTypeContents.append(", ");
}
int entityTypeCap = entityType.maxNumberOfCreature * eligibleChunksForSpawning.size() / 256;
worldTypeContents.append("\u00A7r").append(entityType.typeID).append(":")
.append(counter.get() >= entityTypeCap ? "\u00A74" : "\u00A72").append(counter.get())
.append("\u00A7r").append("/").append(entityTypeCap);
}
}
if (!foundMatch) {
throw new WrongUsageException("commands.jascountcap.typenotfound", new Object[0]);
} else {
commandSender.addChatMessage(new ChatComponentText(worldTypeContents.toString()));
}
}
}
private World getTargetWorld(String arg, ICommandSender commandSender) {
try {
EntityPlayerMP targetPlayer = getPlayer(commandSender, arg);
return targetPlayer.worldObj;
} catch (Exception e) {
}
try {
int targetDim = parseInt(commandSender, arg);
for (WorldServer world : MinecraftServer.getServer().worldServers) {
if (targetDim == world.provider.dimensionId) {
return world;
}
}
} catch (NumberInvalidException e) {
}
return null;
}
/**
* Adds the strings available in this command to the given list of tab completion options.
*/
@Override
public List<String> getTabCompletions(ICommandSender commandSender, String[] stringArgs) {
stringArgs = correctedParseArgs(stringArgs, false);
List<String> tabCompletions = new ArrayList<String>();
if (stringArgs.length == 1) {
addEntityTypes(tabCompletions);
addPlayerUsernames(tabCompletions);
} else if (stringArgs.length == 2) {
addEntityTypes(tabCompletions);
}
if (!tabCompletions.isEmpty()) {
return getStringsMatchingLastWord(stringArgs, tabCompletions);
} else {
return tabCompletions;
}
}
}