public void OpenChat() { chatText.Text = ""; chatChrome.Visible = true; chatScrollPanel.ScrollToBottom(); if (!chatText.IsDisabled()) { chatText.TakeKeyboardFocus(); } chatOverlay.Visible = false; }
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, ModData modData, bool isMenuChat, Dictionary <string, MiniYaml> logicArgs) { this.orderManager = orderManager; this.modRules = modData.DefaultRules; chatTraits = world.WorldActor.TraitsImplementing <INotifyChat>().ToArray(); var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant && !p.IsBot); var isObserver = orderManager.LocalClient != null && orderManager.LocalClient.IsObserver; var isOnlyObserver = isObserver && orderManager.LobbyInfo.Clients.All(c => c == orderManager.LocalClient || !c.IsObserver); var observersExist = orderManager.LobbyInfo.Clients.Any(c => c.IsObserver); var alwaysDisabled = world.IsReplay || world.LobbyInfo.NonBotClients.Count() == 1; var disableTeamChat = alwaysDisabled || isOnlyObserver || (world.LocalPlayer != null && !players.Any(p => p.IsAlliedWith(world.LocalPlayer))); var teamChat = !disableTeamChat; tabCompletion.Commands = chatTraits.OfType <ChatCommands>().SelectMany(x => x.Commands.Keys).ToList(); tabCompletion.Names = orderManager.LobbyInfo.Clients.Select(c => c.Name).Distinct().ToList(); var chatPanel = (ContainerWidget)widget; chatOverlay = chatPanel.GetOrNull <ContainerWidget>("CHAT_OVERLAY"); if (chatOverlay != null) { chatOverlayDisplay = chatOverlay.Get <ChatDisplayWidget>("CHAT_DISPLAY"); chatOverlay.Visible = false; } chatChrome = chatPanel.Get <ContainerWidget>("CHAT_CHROME"); chatChrome.Visible = true; var chatMode = chatChrome.Get <ButtonWidget>("CHAT_MODE"); chatMode.GetText = () => teamChat && !disableTeamChat ? "Team" : "All"; chatMode.OnClick = () => teamChat ^= true; // Team chat is disabled if we are the only spectator // This changes as soon as a defeated player can talk in the spectator chat if (!alwaysDisabled && isOnlyObserver) { chatMode.IsDisabled = () => { if (world.IsGameOver) { return(true); } disableTeamChat = players.All(p => p.WinState == WinState.Undefined); return(disableTeamChat); }; } else if (!alwaysDisabled && world.LocalPlayer != null) { chatMode.IsDisabled = () => { if (world.IsGameOver) { return(true); } // Check if we are the only living team member if (players.All(p => p.WinState != WinState.Undefined || !p.IsAlliedWith(world.LocalPlayer))) { disableTeamChat = true; return(disableTeamChat); } // Still alive and nothing changed since the start if (world.LocalPlayer.WinState == WinState.Undefined) { return(disableTeamChat); } // At this point our player is dead // Allow to chat with existing spectators if (observersExist) { disableTeamChat = false; return(disableTeamChat); } // Or wait until another player died disableTeamChat = players.All(p => p.WinState == WinState.Undefined); return(disableTeamChat); }; } else { chatMode.IsDisabled = () => disableTeamChat; } // Disable team chat after the game ended world.GameOver += () => disableTeamChat = true; chatText = chatChrome.Get <TextFieldWidget>("CHAT_TEXTFIELD"); chatText.MaxLength = UnitOrders.ChatMessageMaxLength; chatText.OnEnterKey = () => { var team = teamChat && !disableTeamChat; if (chatText.Text != "") { if (!chatText.Text.StartsWith("/", StringComparison.Ordinal)) { // This should never happen, but avoid a crash if it does somehow (chat will just stay open) if (!isObserver && orderManager.LocalClient == null && world.LocalPlayer == null) { return(true); } var teamNumber = 0U; if (team) { teamNumber = (isObserver || world.LocalPlayer.WinState != WinState.Undefined) ? uint.MaxValue : (uint)orderManager.LocalClient.Team; } orderManager.IssueOrder(Order.Chat(chatText.Text.Trim(), teamNumber)); } else if (chatTraits != null) { var text = chatText.Text.Trim(); var from = world.IsReplay ? null : orderManager.LocalClient.Name; foreach (var trait in chatTraits) { trait.OnChat(from, text); } } } chatText.Text = ""; if (!isMenuChat) { CloseChat(); } return(true); }; chatText.OnTabKey = () => { var previousText = chatText.Text; chatText.Text = tabCompletion.Complete(chatText.Text); chatText.CursorPosition = chatText.Text.Length; if (chatText.Text == previousText && !disableTeamChat) { teamChat ^= true; } return(true); }; chatText.OnEscKey = () => { if (!isMenuChat) { CloseChat(); } else { chatText.YieldKeyboardFocus(); } return(true); }; if (!isMenuChat) { var chatClose = chatChrome.Get <ButtonWidget>("CHAT_CLOSE"); chatClose.OnClick += CloseChat; chatPanel.OnKeyPress = e => { if (e.Event == KeyInputEvent.Up) { return(false); } if (!chatChrome.IsVisible() && (e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER)) { OpenChat(); return(true); } return(false); }; } chatScrollPanel = chatChrome.Get <ScrollPanelWidget>("CHAT_SCROLLPANEL"); chatTemplate = chatScrollPanel.Get <ContainerWidget>("CHAT_TEMPLATE"); chatScrollPanel.RemoveChildren(); chatScrollPanel.ScrollToBottom(); foreach (var chatLine in orderManager.ChatCache) { AddChatLine(chatLine.Name, chatLine.Color, chatLine.Text, chatLine.TextColor, true); } orderManager.AddChatLine += AddChatLineWrapper; chatText.IsDisabled = () => world.IsReplay && !Game.Settings.Debug.EnableDebugCommandsInReplays; if (!isMenuChat) { CloseChat(); var keyListener = chatChrome.Get <LogicKeyListenerWidget>("KEY_LISTENER"); keyListener.AddHandler(e => { if (e.Event == KeyInputEvent.Up || !chatText.IsDisabled()) { return(false); } if ((e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER || e.Key == Keycode.ESCAPE) && e.Modifiers == Modifiers.None) { CloseChat(); return(true); } return(false); }); } MiniYaml yaml; if (logicArgs.TryGetValue("ChatLineSound", out yaml)) { chatLineSound = yaml.Value; } }
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, ModData modData, bool isMenuChat) { this.orderManager = orderManager; this.modRules = modData.DefaultRules; chatTraits = world.WorldActor.TraitsImplementing <INotifyChat>().ToArray(); var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant && !p.IsBot); disableTeamChat = world.IsReplay || world.LobbyInfo.NonBotClients.Count() == 1 || (world.LocalPlayer != null && !players.Any(p => p.IsAlliedWith(world.LocalPlayer))); teamChat = !disableTeamChat; tabCompletion.Commands = chatTraits.OfType <ChatCommands>().SelectMany(x => x.Commands.Keys).ToList(); tabCompletion.Names = orderManager.LobbyInfo.Clients.Select(c => c.Name).Distinct().ToList(); var chatPanel = (ContainerWidget)widget; chatOverlay = chatPanel.GetOrNull <ContainerWidget>("CHAT_OVERLAY"); if (chatOverlay != null) { chatOverlayDisplay = chatOverlay.Get <ChatDisplayWidget>("CHAT_DISPLAY"); chatOverlay.Visible = false; } chatChrome = chatPanel.Get <ContainerWidget>("CHAT_CHROME"); chatChrome.Visible = true; var chatMode = chatChrome.Get <ButtonWidget>("CHAT_MODE"); chatMode.GetText = () => teamChat ? "Team" : "All"; chatMode.OnClick = () => teamChat ^= true; chatMode.IsDisabled = () => disableTeamChat; chatText = chatChrome.Get <TextFieldWidget>("CHAT_TEXTFIELD"); chatText.MaxLength = UnitOrders.ChatMessageMaxLength; chatText.OnEnterKey = () => { var team = teamChat && !disableTeamChat; if (chatText.Text != "") { if (!chatText.Text.StartsWith("/", StringComparison.Ordinal)) { orderManager.IssueOrder(Order.Chat(team, chatText.Text.Trim())); } else if (chatTraits != null) { var text = chatText.Text.Trim(); foreach (var trait in chatTraits) { trait.OnChat(orderManager.LocalClient.Name, text); } } } chatText.Text = ""; if (!isMenuChat) { CloseChat(); } return(true); }; chatText.OnTabKey = () => { var previousText = chatText.Text; chatText.Text = tabCompletion.Complete(chatText.Text); chatText.CursorPosition = chatText.Text.Length; if (chatText.Text == previousText) { return(SwitchTeamChat()); } else { return(true); } }; chatText.OnEscKey = () => { if (!isMenuChat) { CloseChat(); } else { chatText.YieldKeyboardFocus(); } return(true); }; if (!isMenuChat) { var chatClose = chatChrome.Get <ButtonWidget>("CHAT_CLOSE"); chatClose.OnClick += CloseChat; chatPanel.OnKeyPress = e => { if (e.Event == KeyInputEvent.Up) { return(false); } if (!chatChrome.IsVisible() && (e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER)) { OpenChat(); return(true); } return(false); }; } chatScrollPanel = chatChrome.Get <ScrollPanelWidget>("CHAT_SCROLLPANEL"); chatTemplate = chatScrollPanel.Get <ContainerWidget>("CHAT_TEMPLATE"); chatScrollPanel.RemoveChildren(); chatScrollPanel.ScrollToBottom(); foreach (var chatLine in orderManager.ChatCache) { AddChatLine(chatLine.Color, chatLine.Name, chatLine.Text, true); } orderManager.AddChatLine += AddChatLineWrapper; Game.BeforeGameStart += UnregisterEvents; chatText.IsDisabled = () => world.IsReplay && !Game.Settings.Debug.EnableDebugCommandsInReplays; if (!isMenuChat) { CloseChat(); var keyListener = chatChrome.Get <LogicKeyListenerWidget>("KEY_LISTENER"); keyListener.AddHandler(e => { if (e.Event == KeyInputEvent.Up || !chatText.IsDisabled()) { return(false); } if ((e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER || e.Key == Keycode.ESCAPE) && e.Modifiers == Modifiers.None) { CloseChat(); return(true); } return(false); }); } }
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, ModData modData, bool isMenuChat, Dictionary <string, MiniYaml> logicArgs) { this.orderManager = orderManager; modRules = modData.DefaultRules; this.isMenuChat = isMenuChat; this.world = world; var chatTraits = world.WorldActor.TraitsImplementing <INotifyChat>().ToArray(); var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant && !p.IsBot); var isObserver = orderManager.LocalClient != null && orderManager.LocalClient.IsObserver; var alwaysDisabled = world.IsReplay || world.LobbyInfo.NonBotClients.Count() == 1; var disableTeamChat = alwaysDisabled || (world.LocalPlayer != null && !players.Any(p => p.IsAlliedWith(world.LocalPlayer))); var teamChat = !disableTeamChat; tabCompletion.Commands = chatTraits.OfType <ChatCommands>().SelectMany(x => x.Commands.Keys).ToList(); tabCompletion.Names = orderManager.LobbyInfo.Clients.Select(c => c.Name).Distinct().ToList(); if (logicArgs.TryGetValue("Templates", out var templateIds)) { foreach (var item in templateIds.Nodes) { var key = FieldLoader.GetValue <TextNotificationPool>("key", item.Key); templates[key] = Ui.LoadWidget(item.Value.Value, null, new WidgetArgs()); } } var chatPanel = (ContainerWidget)widget; chatOverlay = chatPanel.GetOrNull <ContainerWidget>("CHAT_OVERLAY"); if (chatOverlay != null) { chatOverlayDisplay = chatOverlay.Get <TextNotificationsDisplayWidget>("CHAT_DISPLAY"); chatOverlay.Visible = false; } chatChrome = chatPanel.Get <ContainerWidget>("CHAT_CHROME"); chatChrome.Visible = true; var chatMode = chatChrome.Get <ButtonWidget>("CHAT_MODE"); chatMode.GetText = () => teamChat && !disableTeamChat ? "Team" : "All"; chatMode.OnClick = () => teamChat ^= true; // Enable teamchat if we are a player and die, // or disable it when we are the only one left in the team if (!alwaysDisabled && world.LocalPlayer != null) { chatMode.IsDisabled = () => { if (world.IsGameOver || !chatEnabled) { return(true); } // The game is over for us, join spectator team chat if (world.LocalPlayer.WinState != WinState.Undefined) { disableTeamChat = false; return(disableTeamChat); } // If team chat isn't already disabled, check if we are the only living team member if (!disableTeamChat) { disableTeamChat = players.All(p => p.WinState != WinState.Undefined || !p.IsAlliedWith(world.LocalPlayer)); } return(disableTeamChat); }; } else { chatMode.IsDisabled = () => disableTeamChat || !chatEnabled; } // Disable team chat after the game ended world.GameOver += () => disableTeamChat = true; chatText = chatChrome.Get <TextFieldWidget>("CHAT_TEXTFIELD"); chatText.MaxLength = UnitOrders.ChatMessageMaxLength; chatText.OnEnterKey = _ => { var team = teamChat && !disableTeamChat; if (chatText.Text != "") { if (!chatText.Text.StartsWith("/", StringComparison.Ordinal)) { // This should never happen, but avoid a crash if it does somehow (chat will just stay open) if (!isObserver && orderManager.LocalClient == null && world.LocalPlayer == null) { return(true); } var teamNumber = 0U; if (team) { teamNumber = (isObserver || world.LocalPlayer.WinState != WinState.Undefined) ? uint.MaxValue : (uint)orderManager.LocalClient.Team; } orderManager.IssueOrder(Order.Chat(chatText.Text.Trim(), teamNumber)); } else if (chatTraits != null) { var text = chatText.Text.Trim(); var from = world.IsReplay ? null : orderManager.LocalClient.Name; foreach (var trait in chatTraits) { trait.OnChat(from, text); } } } chatText.Text = ""; if (!isMenuChat) { CloseChat(); } return(true); }; chatText.OnTabKey = e => { if (!chatMode.Key.IsActivatedBy(e) || chatMode.IsDisabled()) { chatText.Text = tabCompletion.Complete(chatText.Text); chatText.CursorPosition = chatText.Text.Length; } else { chatMode.OnKeyPress(e); } return(true); }; chatText.OnEscKey = _ => { if (!isMenuChat) { CloseChat(); } else { chatText.YieldKeyboardFocus(); } return(true); }; chatDisabledLabel = new CachedTransform <int, string>(x => x > 0 ? $"Chat available in {x} seconds..." : "Chat Disabled"); if (!isMenuChat) { var openTeamChatKey = new HotkeyReference(); if (logicArgs.TryGetValue("OpenTeamChatKey", out var hotkeyArg)) { openTeamChatKey = modData.Hotkeys[hotkeyArg.Value]; } var openGeneralChatKey = new HotkeyReference(); if (logicArgs.TryGetValue("OpenGeneralChatKey", out hotkeyArg)) { openGeneralChatKey = modData.Hotkeys[hotkeyArg.Value]; } var chatClose = chatChrome.Get <ButtonWidget>("CHAT_CLOSE"); chatClose.OnClick += CloseChat; chatPanel.OnKeyPress = e => { if (e.Event == KeyInputEvent.Up) { return(false); } if (!chatChrome.IsVisible() && (openTeamChatKey.IsActivatedBy(e) || openGeneralChatKey.IsActivatedBy(e))) { teamChat = !disableTeamChat && !openGeneralChatKey.IsActivatedBy(e); OpenChat(); return(true); } return(false); }; } chatScrollPanel = chatChrome.Get <ScrollPanelWidget>("CHAT_SCROLLPANEL"); chatScrollPanel.RemoveChildren(); chatScrollPanel.ScrollToBottom(); foreach (var notification in orderManager.NotificationsCache) { if (IsNotificationEligible(notification)) { AddNotification(notification, true); } } orderManager.AddTextNotification += AddNotificationWrapper; chatText.IsDisabled = () => !chatEnabled || (world.IsReplay && !Game.Settings.Debug.EnableDebugCommandsInReplays); if (!isMenuChat) { CloseChat(); var keyListener = chatChrome.Get <LogicKeyListenerWidget>("KEY_LISTENER"); keyListener.AddHandler(e => { if (e.Event == KeyInputEvent.Up || !chatText.IsDisabled()) { return(false); } if ((e.Key == Keycode.RETURN || e.Key == Keycode.KP_ENTER || e.Key == Keycode.ESCAPE) && e.Modifiers == Modifiers.None) { CloseChat(); return(true); } return(false); }); } if (logicArgs.TryGetValue("ChatLineSound", out var yaml)) { chatLineSound = yaml.Value; } }