package net.geforcemods.securitycraft.handlers;
import java.util.HashMap;
import java.util.Random;
import net.geforcemods.securitycraft.api.CustomizableSCTE;
import net.geforcemods.securitycraft.api.EnumLinkedAction;
import net.geforcemods.securitycraft.api.INameable;
import net.geforcemods.securitycraft.api.IOwnable;
import net.geforcemods.securitycraft.api.IPasswordProtected;
import net.geforcemods.securitycraft.blocks.BlockLaserBlock;
import net.geforcemods.securitycraft.blocks.BlockOwnable;
import net.geforcemods.securitycraft.blocks.BlockSecurityCamera;
import net.geforcemods.securitycraft.entity.EntitySecurityCamera;
import net.geforcemods.securitycraft.gui.GuiHandler;
import net.geforcemods.securitycraft.ircbot.SCIRCBot;
import net.geforcemods.securitycraft.items.ItemModule;
import net.geforcemods.securitycraft.main.mod_SecurityCraft;
import net.geforcemods.securitycraft.misc.CustomDamageSources;
import net.geforcemods.securitycraft.misc.SCSounds;
import net.geforcemods.securitycraft.network.packets.PacketCPlaySoundAtPos;
import net.geforcemods.securitycraft.tileentity.TileEntityOwnable;
import net.geforcemods.securitycraft.util.BlockUtils;
import net.geforcemods.securitycraft.util.GuiUtils;
import net.geforcemods.securitycraft.util.PlayerUtils;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.EntityLiving;
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.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.translation.I18n;
import net.minecraft.world.World;
import net.minecraftforge.client.event.FOVUpdateEvent;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.event.ServerChatEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent;
import net.minecraftforge.event.entity.player.FillBucketEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock;
import net.minecraftforge.event.world.BlockEvent.BreakEvent;
import net.minecraftforge.event.world.BlockEvent.PlaceEvent;
import net.minecraftforge.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ForgeEventHandler {
private static HashMap<String, String> tipsWithLink = new HashMap<String, String>();
public ForgeEventHandler()
{
tipsWithLink.put("trello", "https://trello.com/b/dbCNZwx0/securitycraft");
tipsWithLink.put("patreon", "https://www.patreon.com/Geforce");
}
@SubscribeEvent
public void onPlayerLoggedIn(PlayerLoggedInEvent event){
mod_SecurityCraft.instance.createIrcBot(event.player.getName());
String tipKey = getRandomTip();
ITextComponent TextComponentString;
if(tipsWithLink.containsKey(tipKey.split("\\.")[2])) {
TextComponentString = new TextComponentString("[" + TextFormatting.GOLD + "SecurityCraft" + TextFormatting.WHITE + "] " + I18n.translateToLocal("messages.thanks").replace("#", mod_SecurityCraft.getVersion()) + " " + I18n.translateToLocal("messages.tip") + " " + I18n.translateToLocal(tipKey) + " ").appendSibling(ForgeHooks.newChatWithLinks(tipsWithLink.get(tipKey.split("\\.")[2])));
}
else {
TextComponentString = new TextComponentString("[" + TextFormatting.GOLD + "SecurityCraft" + TextFormatting.WHITE + "] " + I18n.translateToLocal("messages.thanks").replace("#", mod_SecurityCraft.getVersion()) + " " + I18n.translateToLocal("messages.tip") + " " + I18n.translateToLocal(tipKey));
}
if(mod_SecurityCraft.configHandler.sayThanksMessage){
event.player.addChatComponentMessage(TextComponentString);
}
}
@SubscribeEvent
public void onDamageTaken(LivingHurtEvent event)
{
if(event.getEntityLiving() != null && PlayerUtils.isPlayerMountedOnCamera(event.getEntityLiving())){
event.setCanceled(true);
return;
}
if(event.getSource() == CustomDamageSources.electricity)
mod_SecurityCraft.network.sendToAll(new PacketCPlaySoundAtPos(event.getEntity().posX, event.getEntity().posY, event.getEntity().posZ, SCSounds.ELECTRIFIED.path, 0.25F));
}
@SubscribeEvent
public void onBucketUsed(FillBucketEvent event){
ItemStack result = fillBucket(event.getWorld(), event.getTarget().getBlockPos());
if(result == null){ return; }
event.setFilledBucket(result);
event.setResult(Result.ALLOW);
}
@SubscribeEvent
public void onServerChatEvent(ServerChatEvent event)
{
SCIRCBot bot = mod_SecurityCraft.instance.getIrcBot(event.getPlayer().getName());
if(bot != null && bot.getMessageMode())
{
event.setCanceled(true);
bot.sendMessage("> " + event.getMessage());
bot.sendMessageToPlayer(TextFormatting.GRAY + "<" + event.getPlayer().getName() + " --> IRC> " + event.getMessage(), event.getPlayer());
}
}
@SubscribeEvent
public void onPlayerLoggedOut(PlayerLoggedOutEvent event){
if(mod_SecurityCraft.configHandler.disconnectOnWorldClose && mod_SecurityCraft.instance.getIrcBot(event.player.getName()) != null){
mod_SecurityCraft.instance.getIrcBot(event.player.getName()).disconnect();
mod_SecurityCraft.instance.removeIrcBot(event.player.getName());
}
}
@SubscribeEvent
public void onRightClickBlock(RightClickBlock event){
if(!event.getEntityPlayer().worldObj.isRemote){
World world = event.getEntityPlayer().worldObj;
TileEntity tileEntity = event.getEntityPlayer().worldObj.getTileEntity(event.getPos());
Block block = event.getEntityPlayer().worldObj.getBlockState(event.getPos()).getBlock();
if(PlayerUtils.isHoldingItem(event.getEntityPlayer(), mod_SecurityCraft.codebreaker) && handleCodebreaking(event)) {
event.setCanceled(true);
return;
}
if(tileEntity != null && tileEntity instanceof CustomizableSCTE && PlayerUtils.isHoldingItem(event.getEntityPlayer(), mod_SecurityCraft.universalBlockModifier)){
event.setCanceled(true);
if(!((IOwnable) tileEntity).getOwner().isOwner(event.getEntityPlayer())){
PlayerUtils.sendMessageToPlayer(event.getEntityPlayer(), I18n.translateToLocal("item.universalBlockModifier.name"), I18n.translateToLocal("messages.notOwned").replace("#", ((TileEntityOwnable) tileEntity).getOwner().getName()), TextFormatting.RED);
return;
}
event.getEntityPlayer().openGui(mod_SecurityCraft.instance, GuiHandler.CUSTOMIZE_BLOCK, world, event.getPos().getX(), event.getPos().getY(), event.getPos().getZ());
return;
}
if(tileEntity instanceof INameable && ((INameable) tileEntity).canBeNamed() && PlayerUtils.isHoldingItem(event.getEntityPlayer(), Items.NAME_TAG) && event.getEntityPlayer().inventory.getCurrentItem().hasDisplayName()){
event.setCanceled(true);
for(String character : new String[]{"(", ")"}) {
if(event.getEntityPlayer().inventory.getCurrentItem().getDisplayName().contains(character)) {
PlayerUtils.sendMessageToPlayer(event.getEntityPlayer(), "Naming", I18n.translateToLocal("messages.naming.error").replace("#n", event.getEntityPlayer().inventory.getCurrentItem().getDisplayName()).replace("#c", character), TextFormatting.RED);
return;
}
}
if(((INameable) tileEntity).getCustomName().matches(event.getEntityPlayer().inventory.getCurrentItem().getDisplayName())) {
PlayerUtils.sendMessageToPlayer(event.getEntityPlayer(), "Naming", I18n.translateToLocal("messages.naming.alreadyMatches").replace("#n", ((INameable) tileEntity).getCustomName()), TextFormatting.RED);
return;
}
event.getEntityPlayer().inventory.getCurrentItem().stackSize--;
((INameable) tileEntity).setCustomName(event.getEntityPlayer().inventory.getCurrentItem().getDisplayName());
return;
}
if(tileEntity != null && isOwnableBlock(block, tileEntity) && PlayerUtils.isHoldingItem(event.getEntityPlayer(), mod_SecurityCraft.universalBlockRemover)){
event.setCanceled(true);
if(!((IOwnable) tileEntity).getOwner().isOwner(event.getEntityPlayer())){
PlayerUtils.sendMessageToPlayer(event.getEntityPlayer(), I18n.translateToLocal("item.universalBlockRemover.name"), I18n.translateToLocal("messages.notOwned").replace("#", ((TileEntityOwnable) tileEntity).getOwner().getName()), TextFormatting.RED);
return;
}
if(block == mod_SecurityCraft.laserBlock){
world.destroyBlock(event.getPos(), true);
BlockLaserBlock.destroyAdjacentLasers(event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ());
event.getEntityPlayer().inventory.getCurrentItem().damageItem(1, event.getEntityPlayer());
}else{
world.destroyBlock(event.getPos(), true);
world.removeTileEntity(event.getPos());
event.getEntityPlayer().inventory.getCurrentItem().damageItem(1, event.getEntityPlayer());
}
}
}
}
@SubscribeEvent
public void onConfigChanged(OnConfigChangedEvent event) {
if(event.getModID().equals("securitycraft")){
mod_SecurityCraft.configFile.save();
mod_SecurityCraft.configHandler.setupConfiguration();
}
}
@SubscribeEvent
public void onBlockPlaced(PlaceEvent event) {
handleOwnableTEs(event);
}
@SubscribeEvent
public void onBlockBroken(BreakEvent event){
if(!event.getWorld().isRemote){
if(event.getWorld().getTileEntity(event.getPos()) != null && event.getWorld().getTileEntity(event.getPos()) instanceof CustomizableSCTE){
CustomizableSCTE te = (CustomizableSCTE) event.getWorld().getTileEntity(event.getPos());
for(int i = 0; i < te.getNumberOfCustomizableOptions(); i++){
if(te.itemStacks[i] != null){
ItemStack stack = te.itemStacks[i];
EntityItem item = new EntityItem(event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ(), stack);
event.getWorld().spawnEntityInWorld(item);
te.onModuleRemoved(stack, ((ItemModule) stack.getItem()).getModule());
te.createLinkedBlockAction(EnumLinkedAction.MODULE_REMOVED, new Object[]{ stack, ((ItemModule) stack.getItem()).getModule() }, te);
}
}
}
}
}
@SubscribeEvent
public void onLivingSetAttackTarget(LivingSetAttackTargetEvent event)
{
if(event.getTarget() != null && event.getTarget() instanceof EntityPlayer && event.getTarget() != event.getEntityLiving().getAttackingEntity())
{
if(PlayerUtils.isPlayerMountedOnCamera(event.getTarget()))
((EntityLiving)event.getEntityLiving()).setAttackTarget(null);
}
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onPlayerRendered(RenderPlayerEvent.Pre event) {
if(PlayerUtils.isPlayerMountedOnCamera(event.getEntityPlayer())){
event.setCanceled(true);
}
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void renderGameOverlay(RenderGameOverlayEvent event) {
if(Minecraft.getMinecraft().thePlayer != null && PlayerUtils.isPlayerMountedOnCamera(Minecraft.getMinecraft().thePlayer)){
if(event.getType() == RenderGameOverlayEvent.ElementType.EXPERIENCE && ((BlockUtils.getBlock(Minecraft.getMinecraft().theWorld, BlockUtils.toPos((int)Math.floor(Minecraft.getMinecraft().thePlayer.getRidingEntity().posX), (int)(Minecraft.getMinecraft().thePlayer.getRidingEntity().posY - 1.0D), (int)Math.floor(Minecraft.getMinecraft().thePlayer.getRidingEntity().posZ))) instanceof BlockSecurityCamera))){
GuiUtils.drawCameraOverlay(Minecraft.getMinecraft(), Minecraft.getMinecraft().ingameGUI, event.getResolution(), Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().theWorld, BlockUtils.toPos((int)Math.floor(Minecraft.getMinecraft().thePlayer.getRidingEntity().posX), (int)(Minecraft.getMinecraft().thePlayer.getRidingEntity().posY - 1.0D), (int)Math.floor(Minecraft.getMinecraft().thePlayer.getRidingEntity().posZ)));
}
}
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void fovUpdateEvent(FOVUpdateEvent event){
if(PlayerUtils.isPlayerMountedOnCamera(event.getEntity())){
event.setNewfov(((EntitySecurityCamera) event.getEntity().getRidingEntity()).getZoomAmount());
}
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void renderHandEvent(RenderHandEvent event){
if(PlayerUtils.isPlayerMountedOnCamera(Minecraft.getMinecraft().thePlayer)){
event.setCanceled(true);
}
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onMouseClicked(MouseEvent event) {
if(Minecraft.getMinecraft().theWorld != null)
{
if(PlayerUtils.isPlayerMountedOnCamera(Minecraft.getMinecraft().thePlayer))
{
event.setCanceled(true);
}
}
}
private ItemStack fillBucket(World world, BlockPos pos){
Block block = world.getBlockState(pos).getBlock();
if(block == mod_SecurityCraft.bogusWater){
world.setBlockToAir(pos);
return new ItemStack(mod_SecurityCraft.fWaterBucket, 1);
}else if(block == mod_SecurityCraft.bogusLava){
world.setBlockToAir(pos);
return new ItemStack(mod_SecurityCraft.fLavaBucket, 1);
}else{
return null;
}
}
private void handleOwnableTEs(PlaceEvent event) {
if(event.getWorld().getTileEntity(event.getPos()) instanceof IOwnable) {
String name = event.getPlayer().getName();
String uuid = event.getPlayer().getGameProfile().getId().toString();
((IOwnable) event.getWorld().getTileEntity(event.getPos())).getOwner().set(uuid, name);
}
}
private boolean handleCodebreaking(PlayerInteractEvent event) {
World world = event.getEntityPlayer().worldObj;
TileEntity tileEntity = event.getEntityPlayer().worldObj.getTileEntity(event.getPos());
if(tileEntity != null && tileEntity instanceof IPasswordProtected) {
return ((IPasswordProtected) tileEntity).onCodebreakerUsed(world.getBlockState(event.getPos()), event.getEntityPlayer(), !mod_SecurityCraft.configHandler.allowCodebreakerItem);
}
return false;
}
private String getRandomTip(){
String[] tips = {
"messages.tip.scHelp",
"messages.tip.scConnect",
"messages.tip.trello",
"messages.tip.patreon"
};
return tips[new Random().nextInt(tips.length)];
}
private boolean isOwnableBlock(Block block, TileEntity tileEntity){
return (tileEntity instanceof TileEntityOwnable || tileEntity instanceof IOwnable || block instanceof BlockOwnable);
}
}