package de.maxgb.minecraft.second_screen.commands.mss_sub;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MovingObjectPosition;
import de.maxgb.minecraft.second_screen.commands.BaseCommand;
import de.maxgb.minecraft.second_screen.data.ObservingManager;
import de.maxgb.minecraft.second_screen.util.Helper;
import de.maxgb.minecraft.second_screen.util.Logger;
import de.maxgb.minecraft.second_screen.world_observer.ObservedBlock;
import de.maxgb.minecraft.second_screen.world_observer.ObservedBlock.ObservingType;
import de.maxgb.minecraft.second_screen.world_observer.RedstoneObserver;
/**
* Command which is used to register Observer for blocks
* @author Max
*
*/
public class RegisterObserverCommand implements MssCommand.MssSubCommand {
private final String TAG = "RegisterObserverCommand";
@Override
public boolean canCommandSenderUseCommand(ICommandSender var1) {
if (var1 instanceof EntityPlayer) {
return true;
}
return false;
}
@Override
public String getCommandName() {
return "observer";
}
@Override
public void processCommand(ICommandSender var1, String[] var2) {
if (var2 == null || var2.length < 1) {
invalidArguments(var1);
return;
}
if (var2[0].equals("add")) {
if(var2.length<2|| var2.length>4){
invalidArguments(var1);
return;
}
EntityPlayer player;
if (var1 instanceof EntityPlayer) {
player = (EntityPlayer) var1;
} else {
sendMessage(var1, "Player only command");
return;
}
MovingObjectPosition p = Helper.getPlayerLookingSpot(player, true);
if (p == null || p.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) {
sendMessage(var1, "You have to look at a block");
return;
}
Block block = player.worldObj.getBlockState(p.getBlockPos()).getBlock();
TileEntity tile = player.worldObj.getTileEntity(p.getBlockPos());
boolean publ = false;
ObservingType type = null;
//analysis of params
if (var2.length >= 3) {
ArrayList<String> params = new ArrayList<String>();
for (int i = 2; i < var2.length; i++) {
params.add(var2[i]);
}
//Checks if it should be a public observation
if (params.contains("public")) {
publ = true;
params.remove("public");
}
params.remove("private");
// Check if a type is specified in command
if (params.size() > 0) {
for (ObservingType t : ObservedBlock.getObservingTypes()) {
if (t.getIdentifier().equalsIgnoreCase(params.get(0))
|| t.getShortIndentifier().equals(params.get(0))) {
if (t.canObserve(block, tile)) {
type = t;
} else {
sendMessage(var1, "This block cannot be observed with " + t.getIdentifier());
return;
}
}
}
}
}
//Gathers all possible ObservationTypes for this block, except there was one specified by the command
List<ObservingType> types = new ArrayList<ObservingType>();
if (type != null) {
types.add(type);
} else {
for (ObservingType t : ObservedBlock.getObservingTypes()) {
if (t.canObserve(block, tile)) {
if (!(t instanceof RedstoneObserver)) { // Dont add
// redstone
// observer to
// the list,
// redinfo
// should be
// used
types.add(t);
}
}
}
}
//If there is just one possiblity, add this block together with its type to obserer list
//Otherwise inform user
if (types.size() == 1) {
if (ObservingManager.observeBlock(var1.getName(), publ, new ObservedBlock(var2[1],
p.getBlockPos(), player.worldObj.provider.getDimensionId(), types.get(0).getId(),
p.sideHit))) {
sendMessage(var1, "Successfully added block to observer list (" + types.get(0).getIdentifier()
+ ")");
} else {
sendMessage(var1, "Successfully added block to observer list (" + types.get(0).getIdentifier()
+ "), but overrode another block with the same label");
}
} else if (types.size() == 0) {
sendMessage(var1, "This block cannot be observed");
} else {
sendMessage(var1, "There are multiple possible observing types");
sendMessage(var1, "Specify the wanted type by adding it's (short) identifier at the end of the command");
sendMessage(var1, "Possible types:");
for (ObservingType t : types) {
sendMessage(var1, t.getIdentifier() + " (short: " + t.getShortIndentifier() + ")");
}
}
} else if (var2[0].equals("remove")) {
if(var2.length!=2){
invalidArguments(var1);
return;
}
if (ObservingManager.removeObservedBlock(var1.getName(), var2[1])) {
sendMessage(var1, "Successfully removed block from observer list");
} else {
sendMessage(var1, "Failed to remove block from observer list. There is no block with this label");
}
} else if (var2[0].equals("list")) {
sendMessage(var1, "Observation Types");
for (ObservingType t : ObservedBlock.getObservingTypes()) {
if (!(t instanceof RedstoneObserver)) {
sendMessage(var1, t.getIdentifier() + " (short: " + t.getShortIndentifier() + ")");
}
}
} else {
invalidArguments(var1);
}
}
@Override
public void sendCommandUsage(ICommandSender var1) {
sendMessage(var1, "observer add <label> (private/public) (<indentifier>)");
sendMessage(var1, "observer remove <label>");
sendMessage(var1, "observer list");
}
private void sendMessage(ICommandSender var1, String msg) {
BaseCommand.sendMessage(var1, msg);
}
private void invalidArguments(ICommandSender var1){
Logger.i(TAG, "Invalid arguments");
sendMessage(var1, "Invalid arguments. Usage:");
sendCommandUsage(var1);
}
}