// Copyright (c) 2015, Christopher "BlayTheNinth" Baker package net.blay09.mods.eirairc.client; import net.blay09.mods.eirairc.CommonProxy; import net.blay09.mods.eirairc.ConnectionManager; import net.blay09.mods.eirairc.EiraIRC; import net.blay09.mods.eirairc.addon.Compatibility; import net.blay09.mods.eirairc.addon.DirectUploadHoster; import net.blay09.mods.eirairc.addon.ImgurHoster; import net.blay09.mods.eirairc.api.EiraIRCAPI; import net.blay09.mods.eirairc.api.config.IConfigManager; import net.blay09.mods.eirairc.api.event.IRCChannelMessageEvent; import net.blay09.mods.eirairc.api.irc.IRCConnection; import net.blay09.mods.eirairc.api.irc.IRCContext; import net.blay09.mods.eirairc.client.gui.*; import net.blay09.mods.eirairc.client.gui.chat.GuiChatExtended; import net.blay09.mods.eirairc.client.gui.chat.GuiSleepExtended; import net.blay09.mods.eirairc.client.gui.overlay.OverlayNotification; import net.blay09.mods.eirairc.client.gui.screenshot.GuiScreenshots; import net.blay09.mods.eirairc.client.screenshot.Screenshot; import net.blay09.mods.eirairc.client.screenshot.ScreenshotManager; import net.blay09.mods.eirairc.command.base.IRCCommandHandler; import net.blay09.mods.eirairc.config.*; import net.blay09.mods.eirairc.handler.ChatSessionHandler; import net.blay09.mods.eirairc.util.ChatComponentBuilder; import net.blay09.mods.eirairc.util.NotificationType; import net.blay09.mods.eirairc.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.*; import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.client.settings.KeyBinding; import net.minecraft.command.ICommandSender; import net.minecraft.crash.CrashReport; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.network.FMLNetworkEvent; import org.lwjgl.input.Keyboard; import java.io.File; import java.io.IOException; import java.util.List; public class ClientProxy extends CommonProxy { private static final KeyBinding[] keyBindings = new KeyBinding[]{ ClientGlobalConfig.keyScreenshotShare, ClientGlobalConfig.keyOpenScreenshots, ClientGlobalConfig.keyToggleTarget, ClientGlobalConfig.keyOpenMenu }; private ChatSessionHandler chatSession; private OverlayNotification notificationGUI; private int screenshotCheck; private int keyChat; private int keyCommand; private int openWelcomeScreen; private long lastToggleTarget; private boolean wasToggleTargetDown; private boolean isFirstMainMenu = true; @Override public void init() { this.chatSession = EiraIRC.instance.getChatSessionHandler(); notificationGUI = new OverlayNotification(); Minecraft mc = Minecraft.getMinecraft(); keyChat = mc.gameSettings.keyBindChat.getKeyCode(); keyCommand = mc.gameSettings.keyBindCommand.getKeyCode(); ScreenshotManager.create(); MinecraftForge.EVENT_BUS.register(this); for (KeyBinding keyBinding : keyBindings) { ClientRegistry.registerKeyBinding(keyBinding); } // Dirty hack to stop toggle target overshadowing player list key when they share the same key code (they do by default) KeyBinding keyBindPlayerList = mc.gameSettings.keyBindPlayerList; if (ClientGlobalConfig.keyToggleTarget.getKeyCode() == keyBindPlayerList.getKeyCode()) { mc.gameSettings.keyBindPlayerList = new KeyBinding(keyBindPlayerList.getKeyDescription(), keyBindPlayerList.getKeyCodeDefault(), keyBindPlayerList.getKeyCategory()); mc.gameSettings.keyBindPlayerList.setKeyCode(keyBindPlayerList.getKeyCode()); } EiraIRC.instance.registerCommands(ClientCommandHandler.instance, false); if (ClientGlobalConfig.registerShortCommands.get()) { IRCCommandHandler.registerQuickCommands(ClientCommandHandler.instance); } EiraGui.init(mc.getResourceManager()); try { ConfigurationHandler.loadSuggestedChannels(mc.getResourceManager()); } catch (IOException ignored) { } } @Override public void postInit() { super.postInit(); EiraIRCAPI.registerUploadHoster(new DirectUploadHoster()); EiraIRCAPI.registerUploadHoster(new ImgurHoster()); } @Override public void addScheduledTask(Runnable runnable) { Minecraft.getMinecraft().addScheduledTask(runnable); } @Override public void publishNotification(NotificationType type, String text) { NotificationStyle config = NotificationStyle.None; switch (type) { case FriendJoined: config = ClientGlobalConfig.ntfyFriendJoined.get(); break; case PlayerMentioned: config = ClientGlobalConfig.ntfyNameMentioned.get(); break; case PrivateMessage: config = ClientGlobalConfig.ntfyPrivateMessage.get(); break; default: } if (config != NotificationStyle.None && config != NotificationStyle.SoundOnly) { notificationGUI.showNotification(type, text); } if (config == NotificationStyle.TextAndSound || config == NotificationStyle.SoundOnly) { Minecraft.getMinecraft().getSoundHandler().playSound(new PositionedSoundRecord(new ResourceLocation(ClientGlobalConfig.notificationSound.get()), ClientGlobalConfig.notificationSoundVolume.get(), 1f, 0f, 0f, 0f)); } } @Override public String getUsername() { return Minecraft.getMinecraft().getSession().getUsername(); } @Override public void loadConfig(File configDir, boolean reloadFile) { super.loadConfig(configDir, reloadFile); ClientGlobalConfig.load(configDir, reloadFile); } @Override public void handleRedirect(ServerConfig serverConfig) { TrustedServer server = ConfigurationHandler.getOrCreateTrustedServer(Utils.getServerAddress()); if (server.isAllowRedirect()) { ConnectionManager.redirectTo(serverConfig, server.isRedirectSolo()); } else { Minecraft.getMinecraft().displayGuiScreen(new GuiEiraIRCRedirect(serverConfig)); } } @Override public boolean handleConfigCommand(ICommandSender sender, String key, String value) { return super.handleConfigCommand(sender, key, value) || ClientGlobalConfig.handleConfigCommand(sender, key, value); } @Override public String handleConfigCommand(ICommandSender sender, String key) { String result = super.handleConfigCommand(sender, key); if (result == null) { return ClientGlobalConfig.handleConfigCommand(sender, key); } else { return result; } } @Override public void addConfigOptionsToList(List<String> list, String option, boolean autoCompleteOption) { super.addConfigOptionsToList(list, option, autoCompleteOption); ClientGlobalConfig.addOptionsToList(list, option, autoCompleteOption); } @Override public boolean checkClientBridge(IRCChannelMessageEvent event) { EntityPlayerSP entityPlayer = FMLClientHandler.instance().getClientPlayerEntity(); if (entityPlayer != null && event.sender != null && ClientGlobalConfig.clientBridge.get()) { for (NetworkPlayerInfo playerInfo : entityPlayer.sendQueue.getPlayerInfoMap()) { if (event.sender.getName().equalsIgnoreCase(playerInfo.getGameProfile().getName())) { return true; } } } return false; } @Override public void saveConfig() { super.saveConfig(); if (ClientGlobalConfig.thisConfig.hasChanged()) { ClientGlobalConfig.thisConfig.save(); } } @SubscribeEvent public void onGuiOpen(GuiOpenEvent event) { if (event.gui instanceof GuiMainMenu) { if (isFirstMainMenu && ClientGlobalConfig.showModpackConfirmation.get() && !LocalConfig.disableModpackConfirmation.get()) { event.gui = new GuiModpackConfirmation(); isFirstMainMenu = false; } } } @SubscribeEvent public void keyInput(GuiScreenEvent.KeyboardInputEvent.Pre event) { if (!(Minecraft.getMinecraft().currentScreen instanceof GuiControls) && ClientGlobalConfig.keyScreenshotShare.getKeyCode() != 0 && Keyboard.getEventKey() == ClientGlobalConfig.keyScreenshotShare.getKeyCode()) { Screenshot screenshot = ScreenshotManager.getInstance().takeScreenshot(); if (screenshot != null) { ScreenshotManager.getInstance().uploadScreenshot(screenshot, ScreenshotAction.UploadShare); } } } @SubscribeEvent public void keyInput(InputEvent.KeyInputEvent event) { if (Keyboard.getEventKeyState()) { int keyCode = Keyboard.getEventKey(); if (ClientGlobalConfig.keyOpenMenu.getKeyCode() != 0 && keyCode == ClientGlobalConfig.keyOpenMenu.getKeyCode()) { if (Minecraft.getMinecraft().currentScreen == null) { Minecraft.getMinecraft().displayGuiScreen(new GuiEiraIRCMenu()); } } else if (ClientGlobalConfig.keyOpenScreenshots.getKeyCode() != 0 && keyCode == ClientGlobalConfig.keyOpenScreenshots.getKeyCode()) { if (Minecraft.getMinecraft().currentScreen == null) { Minecraft.getMinecraft().displayGuiScreen(new GuiScreenshots(null)); } } else if (ClientGlobalConfig.keyScreenshotShare.getKeyCode() != 0 && keyCode == ClientGlobalConfig.keyScreenshotShare.getKeyCode()) { Screenshot screenshot = ScreenshotManager.getInstance().takeScreenshot(); if (screenshot != null) { ScreenshotManager.getInstance().uploadScreenshot(screenshot, ScreenshotAction.UploadShare); } } else { if (!ClientGlobalConfig.chatNoOverride.get() && !Compatibility.isTabbyChat2Installed()) { GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen; if (currentScreen == null || currentScreen.getClass() == GuiChat.class) { if (Keyboard.getEventKey() == keyChat) { Minecraft.getMinecraft().gameSettings.keyBindChat.isPressed(); Minecraft.getMinecraft().displayGuiScreen(new GuiChatExtended()); } else if (Keyboard.getEventKey() == keyCommand) { Minecraft.getMinecraft().gameSettings.keyBindCommand.isPressed(); Minecraft.getMinecraft().displayGuiScreen(new GuiChatExtended("/")); } } } } } } @SubscribeEvent public void worldJoined(FMLNetworkEvent.ClientConnectedToServerEvent event) { if (!ConnectionManager.isIRCRunning()) { ConnectionManager.startIRC(); } if (ClientGlobalConfig.showWelcomeScreen.get() && !LocalConfig.disableWelcomeScreen.get() && !LocalConfig.disableModpackIRC.get()) { openWelcomeScreen = 20; } } @SubscribeEvent public void clientTick(TickEvent.ClientTickEvent event) { ConnectionManager.tickConnections(); GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen; if (currentScreen == null && openWelcomeScreen > 0) { openWelcomeScreen--; if (openWelcomeScreen <= 0) { Minecraft.getMinecraft().displayGuiScreen(new GuiWelcome()); } } if (currentScreen instanceof GuiChat && !ClientGlobalConfig.disableChatToggle.get() && !ClientGlobalConfig.clientBridge.get() && !Compatibility.isTabbyChat2Installed()) { if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(ClientGlobalConfig.keyToggleTarget.getKeyCode())) { if (!wasToggleTargetDown) { boolean users = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL); IRCContext newTarget = chatSession.getNextTarget(users); if (!users) { lastToggleTarget = System.currentTimeMillis(); } if (!users || newTarget != null) { chatSession.setChatTarget(newTarget); if (ClientGlobalConfig.chatNoOverride.get()) { ChatComponentBuilder ccb = new ChatComponentBuilder(); ccb.text(">> ").lang("eirairc:general.chattingTo", ccb.push().color('6').text(newTarget == null ? "Minecraft" : newTarget.getName()).pop()).text(" <<").send(); } } wasToggleTargetDown = true; } else { if (System.currentTimeMillis() - lastToggleTarget >= 1000) { chatSession.setChatTarget(null); if (ClientGlobalConfig.chatNoOverride.get()) { ChatComponentBuilder ccb = new ChatComponentBuilder(); ccb.text(">> ").lang("eirairc:general.chattingTo", ccb.push().color('6').text("Minecraft").pop()).text(" <<").send(); } lastToggleTarget = System.currentTimeMillis(); } } } else { wasToggleTargetDown = false; } } if (currentScreen != null && currentScreen.getClass() == GuiSleepMP.class) { Minecraft.getMinecraft().displayGuiScreen(new GuiSleepExtended()); } if (Minecraft.getMinecraft().gameSettings.keyBindScreenshot.getKeyCode() > 0 && Keyboard.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindScreenshot.getKeyCode())) { screenshotCheck = 10; } else if (screenshotCheck > 0) { screenshotCheck--; if (screenshotCheck == 0) { ScreenshotManager.getInstance().findNewScreenshots(); } } ScreenshotManager.getInstance().clientTick(event); } @SubscribeEvent public void renderTick(TickEvent.RenderTickEvent event) { notificationGUI.updateAndRender(event.renderTickTime); } @Override public IConfigManager getClientGlobalConfig() { return ClientGlobalConfig.manager; } @Override public void handleException(IRCConnection connection, Exception e) { Minecraft.getMinecraft().crashed(new CrashReport("Exception in IRC connection " + connection.getHost(), e)); } }