package net.geforcemods.securitycraft.util;
import java.util.ArrayList;
import java.util.List;
import net.geforcemods.securitycraft.api.CustomizableSCTE;
import net.geforcemods.securitycraft.blocks.BlockKeycardReader;
import net.geforcemods.securitycraft.blocks.BlockKeypad;
import net.geforcemods.securitycraft.misc.EnumCustomModules;
import net.geforcemods.securitycraft.tileentity.TileEntityInventoryScanner;
import net.geforcemods.securitycraft.tileentity.TileEntityKeycardReader;
import net.geforcemods.securitycraft.tileentity.TileEntityKeypad;
import net.geforcemods.securitycraft.tileentity.TileEntityRetinalScanner;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
public class ModuleUtils{
/**
* Insert a module into a customizable TileEntity. <p>
*
* Args: world, x, y, z, moduleType.
*/
public static void insertModule(World par1World, int par2, int par3, int par4, EnumCustomModules module){
((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4)).insertModule(module);
}
/**
* Used by the Laser Block to insert modules in all directions.
*
* Args: world, x, y, z, direction, blockToCheckFor, range, module, updateAdjecentBlocks
*/
public static void checkForBlockAndInsertModule(World par1World, int par2, int par3, int par4, String dir, Block blockToCheckFor, int range, ItemStack module, boolean updateAdjecentBlocks){
for(int i = 1; i <= range; i++){
if(dir.equalsIgnoreCase("x+")){
if(par1World.getBlock(par2 + i, par3, par4) == blockToCheckFor && !((CustomizableSCTE) par1World.getTileEntity(par2 + i, par3, par4)).hasModule(EnumCustomModules.getModuleFromStack(module))){
((CustomizableSCTE) par1World.getTileEntity(par2 + i, par3, par4)).insertModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndInsertModule(par1World, par2 + i, par3, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("x-")){
if(par1World.getBlock(par2 - i, par3, par4) == blockToCheckFor && !((CustomizableSCTE) par1World.getTileEntity(par2 - i, par3, par4)).hasModule(EnumCustomModules.getModuleFromStack(module))){
((CustomizableSCTE) par1World.getTileEntity(par2 - i, par3, par4)).insertModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndInsertModule(par1World, par2 - i, par3, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("y+")){
if(par1World.getBlock(par2, par3 + i, par4) == blockToCheckFor && !((CustomizableSCTE) par1World.getTileEntity(par2, par3 + i, par4)).hasModule(EnumCustomModules.getModuleFromStack(module))){
((CustomizableSCTE) par1World.getTileEntity(par2, par3 + i, par4)).insertModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndInsertModule(par1World, par2, par3 + i, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("y-")){
if(par1World.getBlock(par2, par3 - i, par4) == blockToCheckFor && !((CustomizableSCTE) par1World.getTileEntity(par2, par3 - i, par4)).hasModule(EnumCustomModules.getModuleFromStack(module))){
((CustomizableSCTE) par1World.getTileEntity(par2, par3 - i, par4)).insertModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndInsertModule(par1World, par2, par3 - i, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("z+")){
if(par1World.getBlock(par2, par3, par4 + i) == blockToCheckFor && !((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 + i)).hasModule(EnumCustomModules.getModuleFromStack(module))){
((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 + i)).insertModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndInsertModule(par1World, par2, par3, par4 + i, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("z-")){
if(par1World.getBlock(par2, par3, par4 - i) == blockToCheckFor && !((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 - i)).hasModule(EnumCustomModules.getModuleFromStack(module))){
((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 - i)).insertModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndInsertModule(par1World, par2, par3, par4 - i, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}
}
}
public static void checkInAllDirsAndInsertModule(World par1World, int par2, int par3, int par4, Block blockToCheckFor, int range, ItemStack module, boolean updateAdjecentBlocks){
checkForBlockAndInsertModule(par1World, par2, par3, par4, "x+", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndInsertModule(par1World, par2, par3, par4, "x-", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndInsertModule(par1World, par2, par3, par4, "y+", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndInsertModule(par1World, par2, par3, par4, "y-", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndInsertModule(par1World, par2, par3, par4, "z+", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndInsertModule(par1World, par2, par3, par4, "z-", blockToCheckFor, range, module, updateAdjecentBlocks);
}
/**
* Used by the Laser Block to remove modules in all directions.
*
* Args: world, x, y, z, direction, blockToCheckFor, range, module, updateAdjecentBlocks
*/
public static void checkForBlockAndRemoveModule(World par1World, int par2, int par3, int par4, String dir, Block blockToCheckFor, int range, EnumCustomModules module, boolean updateAdjecentBlocks){
for(int i = 1; i <= range; i++){
if(dir.equalsIgnoreCase("x+")){
if(par1World.getBlock(par2 + i, par3, par4) == blockToCheckFor && ((CustomizableSCTE) par1World.getTileEntity(par2 + i, par3, par4)).hasModule(module)){
((CustomizableSCTE) par1World.getTileEntity(par2 + i, par3, par4)).removeModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndRemoveModule(par1World, par2 + i, par3, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("x-")){
if(par1World.getBlock(par2 - i, par3, par4) == blockToCheckFor && ((CustomizableSCTE) par1World.getTileEntity(par2 - i, par3, par4)).hasModule(module)){
((CustomizableSCTE) par1World.getTileEntity(par2 - i, par3, par4)).removeModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndRemoveModule(par1World, par2 - i, par3, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("y+")){
if(par1World.getBlock(par2, par3 + i, par4) == blockToCheckFor && ((CustomizableSCTE) par1World.getTileEntity(par2, par3 + i, par4)).hasModule(module)){
((CustomizableSCTE) par1World.getTileEntity(par2, par3 + i, par4)).removeModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndRemoveModule(par1World, par2, par3 + i, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("y-")){
if(par1World.getBlock(par2, par3 - i, par4) == blockToCheckFor && ((CustomizableSCTE) par1World.getTileEntity(par2, par3 - i, par4)).hasModule(module)){
((CustomizableSCTE) par1World.getTileEntity(par2, par3 - i, par4)).removeModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndRemoveModule(par1World, par2, par3 - i, par4, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("z+")){
if(par1World.getBlock(par2, par3, par4 + i) == blockToCheckFor && ((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 + i)).hasModule(module)){
((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 + i)).removeModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndRemoveModule(par1World, par2, par3, par4 + i, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}else if(dir.equalsIgnoreCase("z-")){
if(par1World.getBlock(par2, par3, par4 - i) == blockToCheckFor && ((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 - i)).hasModule(module)){
((CustomizableSCTE) par1World.getTileEntity(par2, par3, par4 - i)).removeModule(module);
if(updateAdjecentBlocks){
checkInAllDirsAndRemoveModule(par1World, par2, par3, par4 - i, blockToCheckFor, range, module, updateAdjecentBlocks);
}
}
}
}
}
public static void checkInAllDirsAndRemoveModule(World par1World, int par2, int par3, int par4, Block blockToCheckFor, int range, EnumCustomModules module, boolean updateAdjecentBlocks){
checkForBlockAndRemoveModule(par1World, par2, par3, par4, "x+", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndRemoveModule(par1World, par2, par3, par4, "x-", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndRemoveModule(par1World, par2, par3, par4, "y+", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndRemoveModule(par1World, par2, par3, par4, "y-", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndRemoveModule(par1World, par2, par3, par4, "z+", blockToCheckFor, range, module, updateAdjecentBlocks);
checkForBlockAndRemoveModule(par1World, par2, par3, par4, "z-", blockToCheckFor, range, module, updateAdjecentBlocks);
}
/**
* Gets the players added to customizable modules (such as the Whitelist Module.) <p>
*
* Args: world, x, y, z, moduleType.
*/
public static List<String> getPlayersFromModule(World par1World, int par2, int par3, int par4, EnumCustomModules module) {
List<String> list = new ArrayList<String>();
CustomizableSCTE te = (CustomizableSCTE) par1World.getTileEntity(par2, par3, par4);
if(te.hasModule(module)){
ItemStack item = te.getModule(module);
for(int i = 1; i <= 10; i++){
if(item.stackTagCompound != null && item.stackTagCompound.getString("Player" + i) != null && !item.stackTagCompound.getString("Player" + i).isEmpty()){
list.add(item.stackTagCompound.getString("Player" + i).toLowerCase());
}
}
}
return list;
}
/**
* A large block of code that checks if the TileEntity at the specified coordinates has the given module inserted, and what should happen if it does. <p>
*
* Args: world, x, y, z, player, moduleType.
*/
public static boolean checkForModule(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, EnumCustomModules module){
TileEntity te = par1World.getTileEntity(par2, par3, par4);
if(te == null || !(te instanceof CustomizableSCTE)){ return false; }
if(te instanceof TileEntityKeypad){
if(module == EnumCustomModules.WHITELIST && ((CustomizableSCTE) te).hasModule(EnumCustomModules.WHITELIST) && getPlayersFromModule(par1World, par2, par3, par4, EnumCustomModules.WHITELIST).contains(par5EntityPlayer.getCommandSenderName().toLowerCase())){
PlayerUtils.sendMessageToPlayer(par5EntityPlayer, StatCollector.translateToLocal("tile.keypad.name"), StatCollector.translateToLocal("messages.module.whitelisted"), EnumChatFormatting.GREEN);
BlockKeypad.activate(par1World, par2, par3, par4);
return true;
}
if(module == EnumCustomModules.BLACKLIST && ((CustomizableSCTE) te).hasModule(EnumCustomModules.BLACKLIST) && getPlayersFromModule(par1World, par2, par3, par4, EnumCustomModules.BLACKLIST).contains(par5EntityPlayer.getCommandSenderName().toLowerCase())){
PlayerUtils.sendMessageToPlayer(par5EntityPlayer, StatCollector.translateToLocal("tile.keypad.name"), StatCollector.translateToLocal("messages.module.blacklisted"), EnumChatFormatting.RED);
return true;
}
}else if(te instanceof TileEntityKeycardReader){
if(module == EnumCustomModules.WHITELIST && ((CustomizableSCTE) te).hasModule(EnumCustomModules.WHITELIST) && getPlayersFromModule(par1World, par2, par3, par4, EnumCustomModules.WHITELIST).contains(par5EntityPlayer.getCommandSenderName().toLowerCase())){
PlayerUtils.sendMessageToPlayer(par5EntityPlayer, StatCollector.translateToLocal("tile.keycardReader.name"), StatCollector.translateToLocal("messages.module.whitelisted"), EnumChatFormatting.GREEN);
BlockKeycardReader.activate(par1World, par2, par3, par4);
return true;
}
if(module == EnumCustomModules.BLACKLIST && ((CustomizableSCTE) te).hasModule(EnumCustomModules.BLACKLIST) && getPlayersFromModule(par1World, par2, par3, par4, EnumCustomModules.BLACKLIST).contains(par5EntityPlayer.getCommandSenderName().toLowerCase())){
PlayerUtils.sendMessageToPlayer(par5EntityPlayer, StatCollector.translateToLocal("tile.keycardReader.name"), StatCollector.translateToLocal("messages.module.blacklisted"), EnumChatFormatting.RED);
return true;
}
}else if(te instanceof TileEntityRetinalScanner){
if(module == EnumCustomModules.WHITELIST && ((CustomizableSCTE) te).hasModule(EnumCustomModules.WHITELIST) && getPlayersFromModule(par1World, par2, par3, par4, EnumCustomModules.WHITELIST).contains(par5EntityPlayer.getCommandSenderName().toLowerCase())){
return true;
}
}else if(te instanceof TileEntityInventoryScanner){
if(module == EnumCustomModules.WHITELIST && ((CustomizableSCTE) te).hasModule(EnumCustomModules.WHITELIST) && getPlayersFromModule(par1World, par2, par3, par4, EnumCustomModules.WHITELIST).contains(par5EntityPlayer.getCommandSenderName().toLowerCase())){
return true;
}
}
return false;
}
}