package org.freeforums.geforce.securitycraft.handlers;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.event.entity.player.FillBucketEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
import net.minecraftforge.event.world.BlockEvent.BreakEvent;
import net.minecraftforge.event.world.WorldEvent.Unload;
import org.freeforums.geforce.securitycraft.blocks.BlockLaserBlock;
import org.freeforums.geforce.securitycraft.main.HelpfulMethods;
import org.freeforums.geforce.securitycraft.main.mod_SecurityCraft;
import org.freeforums.geforce.securitycraft.network.packets.PacketCheckRetinalScanner;
import org.freeforums.geforce.securitycraft.tileentity.CustomizableSCTE;
import org.freeforums.geforce.securitycraft.tileentity.TileEntityKeypadChest;
import org.freeforums.geforce.securitycraft.tileentity.TileEntityOwnable;
import org.freeforums.geforce.securitycraft.tileentity.TileEntityPortableRadar;
import org.freeforums.geforce.securitycraft.tileentity.TileEntityReinforcedDoor;
import cpw.mods.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.Event.Result;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SuppressWarnings({"unused", "rawtypes"})
public class ForgeEventHandler {
private int counter = 0;
private int cooldownCounter = 0;
@SubscribeEvent
public void onPlayerLoggedIn(PlayerLoggedInEvent event){
ChatComponentTranslation chatcomponenttranslation = new ChatComponentTranslation("Thanks for using SecurityCraft " + mod_SecurityCraft.getVersion() + "! Tip: " + getRandomTip(), new Object[0]);
if(mod_SecurityCraft.configHandler.sayThanksMessage){
event.player.addChatComponentMessage(chatcomponenttranslation);
}
}
private String getRandomTip(){
Random random = new Random();
int randomInt = random.nextInt(4);
if(randomInt == 0){
return "Check out " + EnumChatFormatting.ITALIC + "geforce.freeforums.org" + EnumChatFormatting.RESET + " for new updates, news, reporting bugs, and more!";
}else if(randomInt == 1){
return "Use the command '/sc' to get information on different things this mod adds. /sc recipe laserblock will display the recipe for the laser block.";
}else if(randomInt == 2){
return "Use the command '/sc' to get information on different things this mod adds. /sc help codebreaker will display a description on the codebreaker.";
}else if(randomInt == 3){
return "Join my IRC channel " + EnumChatFormatting.ITALIC + "#GeforceMods" + EnumChatFormatting.RESET + " on EsperNet to chat with me for support and discussion on mods I have made.";
}else{
return "";
}
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void renderGameOverlay(RenderGameOverlayEvent event){
// if(mod_SecurityCraft.instance.configHandler.currentHackIndex != "" && !mod_SecurityCraft.instance.configHandler.hackingFailed){
// Minecraft.getMinecraft().fontRenderer.drawString(":Hacking:", 2, 2, 0xffffff);
// Minecraft.getMinecraft().fontRenderer.drawString(mod_SecurityCraft.instance.configHandler.currentHackIndex, 2, 12, 0xffffff);
// }else if(mod_SecurityCraft.instance.configHandler.hackingFailed){
// Minecraft.getMinecraft().fontRenderer.drawString(":Hacking failed:", 2, 2, 0xffffff);
// Minecraft.getMinecraft().fontRenderer.drawString("*Too far from keypad*", 2, 12, 0xffffff);
// }else{
//
// }
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onPlayerTick(PlayerTickEvent event){
counter++;
if(cooldownCounter > 0){
cooldownCounter--;
}
if(counter >= 20){
mod_SecurityCraft.network.sendToServer(new PacketCheckRetinalScanner(event.player.getCommandSenderName()));
counter = 0;
}
}
@SubscribeEvent
public void onBucketUsed(FillBucketEvent event){
ItemStack result = fillBucket(event.world, event.target);
if(result == null){ return; }
event.result = result;
event.setResult(Result.ALLOW);
}
@SubscribeEvent //TODO I used the Unload event before.
public void onPlayerLoggedOut(PlayerLoggedOutEvent event){
if(mod_SecurityCraft.configHandler.disconnectOnWorldClose && mod_SecurityCraft.instance.getIrcBot() != null){
mod_SecurityCraft.instance.getIrcBot().disconnect();
mod_SecurityCraft.instance.setIrcBot(null);
}
}
@SubscribeEvent
public void onPlayerInteracted(PlayerInteractEvent event){
if(event.entityPlayer.worldObj.isRemote){
return;
}else{
if(event.action == Action.RIGHT_CLICK_BLOCK && isCustomizableBlock(event.entityPlayer.worldObj.getBlock(event.x, event.y, event.z)) && event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() == mod_SecurityCraft.universalBlockModifier){
event.setCanceled(true);
if(((CustomizableSCTE) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerUUID() != null && !((CustomizableSCTE) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerUUID().matches(event.entityPlayer.getGameProfile().getId())){
HelpfulMethods.sendMessageToPlayer(event.entityPlayer, "I'm sorry, you can not customize this block. This block is owned by " + ((TileEntityOwnable) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerName() + ".", EnumChatFormatting.RED);
return;
}
event.entityPlayer.openGui(mod_SecurityCraft.instance, 100, event.entityPlayer.worldObj, event.x, event.y, event.z);
return;
}
if(event.action == Action.RIGHT_CLICK_BLOCK && event.entityPlayer.worldObj.getBlock(event.x, event.y, event.z) == mod_SecurityCraft.portableRadar && event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() == Items.name_tag && event.entityPlayer.getCurrentEquippedItem().hasDisplayName()){
event.setCanceled(true);
event.entityPlayer.getCurrentEquippedItem().stackSize--;
((TileEntityPortableRadar) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).setCustomName(event.entityPlayer.getCurrentEquippedItem().getDisplayName());
return;
}
if(event.action == Action.RIGHT_CLICK_BLOCK && isOwnableBlock(event.entityPlayer.worldObj.getBlock(event.x, event.y, event.z)) && event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z) != null && event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z) instanceof TileEntityOwnable && event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() == mod_SecurityCraft.universalBlockRemover){
event.setCanceled(true);
if(((TileEntityOwnable) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerUUID() != null && !((TileEntityOwnable) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerUUID().matches(event.entityPlayer.getGameProfile().getId())){
HelpfulMethods.sendMessageToPlayer(event.entityPlayer, "I'm sorry, you can not remove this block. This block is owned by " + ((TileEntityOwnable) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerName() + ".", EnumChatFormatting.RED);
return;
}
if(event.entityPlayer.worldObj.getBlock(event.x, event.y, event.z) == mod_SecurityCraft.doorIndestructableIron){
checkForReinforcedDoor(event.entityPlayer.worldObj, event.x, event.y, event.z, event.entityPlayer);
}else{
if(event.entityPlayer.worldObj.getBlock(event.x, event.y, event.z) == mod_SecurityCraft.LaserBlock){
event.entityPlayer.worldObj.func_147480_a(event.x, event.y, event.z, true);
BlockLaserBlock.destroyAdjecentLasers(event.world, event.x, event.y, event.z);
event.entityPlayer.getCurrentEquippedItem().damageItem(1, event.entityPlayer);
}else{
event.entityPlayer.worldObj.func_147480_a(event.x, event.y, event.z, true);
event.entityPlayer.worldObj.removeTileEntity(event.x, event.y, event.z);
event.entityPlayer.getCurrentEquippedItem().damageItem(1, event.entityPlayer);
}
}
}else if(event.action == Action.RIGHT_CLICK_BLOCK && isOwnableBlock(event.entityPlayer.worldObj.getBlock(event.x, event.y, event.z)) && event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z) != null && event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z) instanceof TileEntityKeypadChest && event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() == mod_SecurityCraft.universalBlockRemover){
event.setCanceled(true);
if(((TileEntityKeypadChest) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerUUID() != null && !((TileEntityKeypadChest) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerUUID().matches(event.entityPlayer.getCommandSenderName())){
HelpfulMethods.sendMessageToPlayer(event.entityPlayer, "I'm sorry, you can not remove this block. This block is owned by " + ((TileEntityKeypadChest) event.entityPlayer.worldObj.getTileEntity(event.x, event.y, event.z)).getOwnerName() + ".", EnumChatFormatting.RED);
return;
}else{
event.entityPlayer.worldObj.func_147480_a(event.x, event.y, event.z, true);
event.entityPlayer.worldObj.removeTileEntity(event.x, event.y, event.z);
}
}
}
}
@SubscribeEvent
public void onConfigChanged(OnConfigChangedEvent event) {
if(event.modID.equals("securitycraft")){
mod_SecurityCraft.configFile.save();
}
}
@SubscribeEvent
public void onBlockBroken(BreakEvent event){
if(!event.world.isRemote){
if(event.world.getTileEntity(event.x, event.y, event.z) != null && event.world.getTileEntity(event.x, event.y, event.z) instanceof CustomizableSCTE){
for(int i = 0; i < ((CustomizableSCTE) event.world.getTileEntity(event.x, event.y, event.z)).getNumberOfCustomizableOptions(); i++){
if(((CustomizableSCTE) event.world.getTileEntity(event.x, event.y, event.z)).itemStacks[i] != null){
EntityItem item = new EntityItem(event.world, (double) event.x, (double) event.y, (double) event.z, ((CustomizableSCTE) event.world.getTileEntity(event.x, event.y, event.z)).itemStacks[i]);
event.world.spawnEntityInWorld(item);
}
}
}
}
}
private ItemStack fillBucket(World world, MovingObjectPosition position){
Block block = world.getBlock(position.blockX, position.blockY, position.blockZ);
if(block == mod_SecurityCraft.bogusWater){
world.setBlockToAir(position.blockX, position.blockY, position.blockZ);
return new ItemStack(mod_SecurityCraft.fWaterBucket, 1);
}else if(block == mod_SecurityCraft.bogusLava){
world.setBlockToAir(position.blockX, position.blockY, position.blockZ);
return new ItemStack(mod_SecurityCraft.fLavaBucket, 1);
}else{
return null;
}
}
private int[] getBlockInFront(World par1World, EntityPlayer par2EntityPlayer, double reach){
int[] blockInfo = {0, 0, 0, 0, -1, 0};
MovingObjectPosition movingobjectposition = getMovingObjectPositionFromPlayer(par1World, par2EntityPlayer, true, reach);
if(movingobjectposition != null){
if(movingobjectposition.typeOfHit == MovingObjectType.BLOCK){
blockInfo[1] = movingobjectposition.blockX;
blockInfo[2] = movingobjectposition.blockY;
blockInfo[3] = movingobjectposition.blockZ;
blockInfo[4] = movingobjectposition.sideHit;
blockInfo[5] = par1World.getBlockMetadata(blockInfo[1], blockInfo[2], blockInfo[3]);
blockInfo[0] = Block.getIdFromBlock(par1World.getBlock(blockInfo[1], blockInfo[2], blockInfo[3]));
}
}
return blockInfo;
}
private MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean flag, double reach){
float f = 1.0F;
float playerPitch = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * f;
float playerYaw = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * f;
double playerPosX = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * f;
double playerPosY = (par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * f + 1.6200000000000001D) - par2EntityPlayer.yOffset;
double playerPosZ = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * f;
Vec3 vecPlayer = Vec3.createVectorHelper(playerPosX, playerPosY, playerPosZ);
float cosYaw = MathHelper.cos(-playerYaw * 0.01745329F - 3.141593F);
float sinYaw = MathHelper.sin(-playerYaw * 0.01745329F - 3.141593F);
float cosPitch = -MathHelper.cos(-playerPitch * 0.01745329F);
float sinPitch = -MathHelper.sin(-playerPitch * 0.01745329F);
float pointX = sinYaw * cosPitch;
float pointY = sinPitch;
float pointZ = cosYaw * cosPitch;
Vec3 vecPoint = vecPlayer.addVector(pointX * reach, pointY * reach, pointZ * reach);
MovingObjectPosition movingobjectposition = par1World.rayTraceBlocks(vecPlayer, vecPoint, flag);
return movingobjectposition;
}
private void notifyPlayers(String username, EntityPlayer par2EntityPlayer, int par3, int par4, int par5) {
HelpfulMethods.sendMessageToPlayer(par2EntityPlayer, username + " destroyed a reinforced door with a universal block remover at X: " + par3 + " Y: " + par4 + " Z: " + par5, null);
}
private void sendChatMessageTo(EntityPlayer par1EntityPlayer, TileEntityReinforcedDoor TERD){
if(TERD.getOwnerUUID() != null){
HelpfulMethods.sendMessageToPlayer(par1EntityPlayer, "Im sorry, you can not remove this door. This door is owned by " + TERD.getOwnerName() + ".", EnumChatFormatting.RED);
}
}
private void checkForReinforcedDoor(World par1World, int par2, int par3, int par4, EntityPlayer player){
if(par1World.getBlockMetadata(par2, par3, par4) == 8){
TileEntityReinforcedDoor TERD = (TileEntityReinforcedDoor) par1World.getTileEntity(par2, par3, par4);
TileEntityReinforcedDoor TERD2 = null;
if(TERD == null){
TERD2 = (TileEntityReinforcedDoor) par1World.getTileEntity(par2, par3 + 1, par4);
if(player.getCommandSenderName().matches(TERD2.getOwnerUUID())){
par1World.func_147480_a(par2, par3, par4, false);
notifyPlayers(player.getCommandSenderName(), player, par2, par3, par4);
player.getCurrentEquippedItem().damageItem(1, player);
}else{
sendChatMessageTo(player, TERD2);
}
return;
}
if(TERD != null && TERD.getOwnerUUID() != null){
if(player.getCommandSenderName().matches(TERD.getOwnerUUID())){
par1World.func_147480_a(par2, par3, par4, false);
notifyPlayers(player.getCommandSenderName(), player, par2, par3, par4);
player.getCurrentEquippedItem().damageItem(1, player);
}else{
sendChatMessageTo(player, TERD);
}
}
}
}
private boolean isOwnableBlock(Block par1Block){
if(par1Block == mod_SecurityCraft.doorIndestructableIron || par1Block == mod_SecurityCraft.Keypad || par1Block == mod_SecurityCraft.keycardReader || par1Block == mod_SecurityCraft.retinalScanner || par1Block == mod_SecurityCraft.reinforcedGlass || par1Block == mod_SecurityCraft.alarm || par1Block == mod_SecurityCraft.reinforcedStone || par1Block == mod_SecurityCraft.unbreakableIronBars || par1Block == mod_SecurityCraft.reinforcedFencegate || par1Block == mod_SecurityCraft.LaserBlock || par1Block == mod_SecurityCraft.keypadChest || par1Block == mod_SecurityCraft.reinforcedWoodPlanks){
return true;
}else{
return false;
}
}
private boolean isCustomizableBlock(Block par1Block){
if(par1Block == mod_SecurityCraft.portableRadar || par1Block == mod_SecurityCraft.Keypad || par1Block == mod_SecurityCraft.retinalScanner || par1Block == mod_SecurityCraft.keycardReader || par1Block == mod_SecurityCraft.LaserBlock || par1Block == mod_SecurityCraft.inventoryScanner){
return true;
}else{
return false;
}
}
@SideOnly(Side.SERVER)
public World getServerWorld(){
return MinecraftServer.getServer().getEntityWorld();
}
public Side getSide(){
return FMLCommonHandler.instance().getEffectiveSide();
}
public EntityPlayer getPlayerFromName(String par1){
List players = MinecraftServer.getServer().getConfigurationManager().playerEntityList;
Iterator iterator = players.iterator();
while(iterator.hasNext()){
EntityPlayer tempPlayer = (EntityPlayer) iterator.next();
if(tempPlayer.getCommandSenderName().matches(par1)){
return tempPlayer;
}
}
return null;
}
public void setCooldown(int par1){
this.cooldownCounter = par1;
}
public int getCooldown(){
return this.cooldownCounter;
}
}