private void RefreshBroadcastChatHistory() { m_chatHistory.Clear(); var history = MyChatSystem.GetChatHistory(MySession.Static.LocalPlayerId); var chat = history.GlobalChatHistory.Chat; foreach (var text in chat) { var identity = MySession.Static.Players.TryGetIdentity(text.IdentityId); if (identity == null) { continue; } bool isPlayer = identity.IdentityId == MySession.Static.LocalPlayerId; m_chatHistory.AppendText(identity.DisplayName, isPlayer ? MyFontEnum.DarkBlue : MyFontEnum.Blue, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendText(": ", isPlayer ? MyFontEnum.DarkBlue : MyFontEnum.Blue, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendText(text.Text, MyFontEnum.White, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendLine(); } m_factionList.SelectedItems.Clear(); m_chatHistory.ScrollbarOffset = 1.0f; }
private static void OnPlayerMessageRequest(MySyncCharacter sync, ref SendPlayerMessageMsg msg, MyNetworkClient sender) { //Ignore messages that have improper lengths if (msg.Text.Length == 0 || msg.Text.Length > MyChatConstants.MAX_CHAT_STRING_LENGTH) { return; } var receiverId = MySession.Static.Players.TryGetPlayerIdentity(new MyPlayer.PlayerId(msg.ReceiverSteamId)); var senderId = MySession.Static.Players.TryGetPlayerIdentity(new MyPlayer.PlayerId(msg.SenderSteamId)); //TODO(AF) Check if message was already received if (receiverId != null && receiverId.Character != null && senderId != null && senderId.Character != null && MyAntennaSystem.CheckConnection(senderId, receiverId)) { Sync.Layer.SendMessage(ref msg, msg.ReceiverSteamId, MyTransportMessageEnum.Success); Sync.Layer.SendMessage(ref msg, sender.SteamUserId, MyTransportMessageEnum.Success); //Save chat history on server for non-server players if (receiverId.Character != MySession.LocalCharacter) { MyChatSystem.AddPlayerChatItem(receiverId.IdentityId, senderId.IdentityId, new MyPlayerChatItem(msg.Text, senderId.IdentityId, msg.Timestamp, true)); } if (senderId.Character != MySession.LocalCharacter) { MyChatSystem.AddPlayerChatItem(senderId.IdentityId, receiverId.IdentityId, new MyPlayerChatItem(msg.Text, senderId.IdentityId, msg.Timestamp, true)); } } }
private static void OnGlobalMessageRequest(MySyncCharacter sync, ref SendGlobalMessageMsg msg, MyNetworkClient sender) { //Ignore messages that have improper lengths if (msg.Text.Length == 0 || msg.Text.Length > MyChatConstants.MAX_CHAT_STRING_LENGTH) { return; } var senderId = MySession.Static.Players.TryGetPlayerIdentity(new MyPlayer.PlayerId(msg.SenderSteamId)); var allPlayers = MySession.Static.Players.GetOnlinePlayers(); foreach (var player in allPlayers) { var receiverId = player.Identity; if (receiverId != null && receiverId.Character != null && senderId != null && senderId.Character != null && MyAntennaSystem.CheckConnection(senderId, receiverId)) { Sync.Layer.SendMessage(ref msg, player.Id.SteamId, MyTransportMessageEnum.Success); //Save chat history on server for non-server players if (receiverId.Character != MySession.LocalCharacter) { MyChatSystem.AddGlobalChatItem(player.Identity.IdentityId, new MyGlobalChatItem(msg.Text, senderId.IdentityId)); } } } }
void m_playerList_ItemsSelected(MyGuiControlListbox obj) { if (m_playerList.SelectedItems.Count > 0) { var selectedItem = m_playerList.SelectedItems[0]; if (selectedItem != m_globalItem) { var playerIdentity = (MyIdentity)selectedItem.UserData; RefreshPlayerChatHistory(playerIdentity); var playerChatHistory = MyChatSystem.GetPlayerChatHistory(MySession.LocalPlayerId, playerIdentity.IdentityId); if (playerChatHistory != null && playerChatHistory.UnreadMessageCount > 0) { playerChatHistory.UnreadMessageCount = 0; UpdatePlayerList(); } } else { RefreshGlobalChatHistory(); MyChatHistory chatHistory; if (MySession.Static.ChatHistory.TryGetValue(MySession.LocalPlayerId, out chatHistory) && chatHistory.GlobalChatHistory.UnreadMessageCount > 0) { chatHistory.GlobalChatHistory.UnreadMessageCount = 0; UpdatePlayerList(); } } m_chatbox.SetText(m_emptyText); } }
private void RefreshFactionChatHistory(MyFaction faction) { m_chatHistory.Clear(); var localFaction = MySession.Static.Factions.TryGetPlayerFaction(MySession.Static.LocalPlayerId); if (localFaction == null) { System.Diagnostics.Debug.Fail("Chat shouldn't be refreshed if local player is not a member of a faction!"); return; } MyFactionChatHistory factionChat = MyChatSystem.FindFactionChatHistory(faction.FactionId, localFaction.FactionId); if (factionChat != null) { var chat = factionChat.Chat; foreach (var item in chat) { bool alreadySentToMe; if (item.IdentityId == MySession.Static.LocalPlayerId || (item.PlayersToSendTo.TryGetValue(MySession.Static.LocalPlayerId, out alreadySentToMe) && alreadySentToMe)) { int alreadySentToCount = 0; foreach (var keyValue in item.PlayersToSendTo) { if (keyValue.Value) { alreadySentToCount++; } } var identity = MySession.Static.Players.TryGetIdentity(item.IdentityId); if (identity == null) { continue; } bool isPlayer = identity.IdentityId == MySession.Static.LocalPlayerId; m_chatHistory.AppendText(identity.DisplayName, isPlayer ? MyFontEnum.DarkBlue : MyFontEnum.Blue, m_chatHistory.TextScale, Vector4.One); if (item.PlayersToSendTo != null && item.PlayersToSendTo.Count > 0 && alreadySentToCount < item.PlayersToSendTo.Count) { var pendingText = new StringBuilder(); pendingText.Append(" ("); pendingText.Append(alreadySentToCount.ToString()); pendingText.Append("/"); pendingText.Append(item.PlayersToSendTo.Count.ToString()); pendingText.Append(") "); m_chatHistory.AppendText(pendingText, MyFontEnum.Red, m_chatHistory.TextScale, Vector4.One); } m_chatHistory.AppendText(": ", isPlayer ? MyFontEnum.DarkBlue : MyFontEnum.Blue, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendText(item.Text, MyFontEnum.White, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendLine(); } } } m_playerList.SelectedItems.Clear(); m_chatHistory.ScrollbarOffset = 1.0f; }
private static void OnFactionMessageRequest(MySyncCharacter sync, ref SendNewFactionMessageMsg msg, MyNetworkClient sender) { //Ignore messages that have improper lengths if (msg.ChatItem.Text.Length == 0 || msg.ChatItem.Text.Length > MyChatConstants.MAX_CHAT_STRING_LENGTH) { return; } long currentSenderId = MyEntityIdentifier.ConstructId(MyEntityIdentifier.ID_OBJECT_TYPE.IDENTITY, msg.ChatItem.IdentityIdUniqueNumber); var senderId = MySession.Static.Players.TryGetIdentity(currentSenderId); var chatItem = new MyFactionChatItem(); chatItem.Init(msg.ChatItem); //Find all members that can receive this messages m_tempValidIds.Clear(); for (int i = 0; i < msg.ChatItem.PlayersToSendToUniqueNumber.Count; i++) { if (!msg.ChatItem.IsAlreadySentTo[i]) { long receiverIdentityId = MyEntityIdentifier.ConstructId(MyEntityIdentifier.ID_OBJECT_TYPE.IDENTITY, msg.ChatItem.PlayersToSendToUniqueNumber[i]); var receiverId = MySession.Static.Players.TryGetIdentity(receiverIdentityId); if (receiverId != null && receiverId.Character != null && MyAntennaSystem.CheckConnection(senderId, receiverId)) { m_tempValidIds.Add(receiverIdentityId); } } } //Set their sent flag to true, so that everyone knows they already got it (no need for confirm message) foreach (var id in m_tempValidIds) { chatItem.PlayersToSendTo[id] = true; } //Save the flags back in the message msg.ChatItem = chatItem.GetObjectBuilder(); //Send success message back to all recepient members foreach (var id in m_tempValidIds) { MyPlayer.PlayerId receiverPlayerId; MySession.Static.Players.TryGetPlayerId(id, out receiverPlayerId); ulong steamId = receiverPlayerId.SteamId; Sync.Layer.SendMessage(ref msg, steamId, MyTransportMessageEnum.Success); } //Save chat history on server for non-server players if (senderId.Character != MySession.LocalCharacter) { MyChatSystem.AddFactionChatItem(senderId.IdentityId, msg.FactionId1, msg.FactionId2, chatItem); } }
public void IncrementFactionUnreadMessageCount(long factionId, bool refresh) { var chatHistory = MyChatSystem.GetFactionChatHistory(MySession.Static.LocalPlayerId, factionId); if (chatHistory != null) { chatHistory.UnreadMessageCount++; if (refresh) { UpdateFactionList(true); } } }
public void IncrementPlayerUnreadMessageCount(long otherPlayerId, bool refresh) { MyPlayerChatHistory chatHistory = MyChatSystem.GetPlayerChatHistory(MySession.Static.LocalPlayerId, otherPlayerId); if (chatHistory != null) { chatHistory.UnreadMessageCount++; if (refresh) { UpdatePlayerList(); } } }
private void RefreshFactionList() { var localFaction = MySession.Static.Factions.TryGetPlayerFaction(MySession.Static.LocalPlayerId); if (localFaction != null) { //Add local player faction first m_tempStringBuilder.Clear(); m_tempStringBuilder.Append(localFaction.Name); var chatHistory = MyChatSystem.GetFactionChatHistory(MySession.Static.LocalPlayerId, localFaction.FactionId); if (chatHistory != null && chatHistory.UnreadMessageCount > 0) { m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(chatHistory.UnreadMessageCount); m_tempStringBuilder.Append(")"); } var item = new MyGuiControlListbox.Item(text: m_tempStringBuilder, userData: localFaction); m_factionList.Add(item); m_factionList.SetToolTip(string.Empty); foreach (var faction in MySession.Static.Factions) { //Don't add local player faction twice if (faction.Value != localFaction && faction.Value.AcceptHumans) { m_tempStringBuilder.Clear(); m_tempStringBuilder.Append(faction.Value.Name); chatHistory = MyChatSystem.GetFactionChatHistory(MySession.Static.LocalPlayerId, faction.Value.FactionId); if (chatHistory != null && chatHistory.UnreadMessageCount > 0) { m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(chatHistory.UnreadMessageCount); m_tempStringBuilder.Append(")"); } item = new MyGuiControlListbox.Item(text: m_tempStringBuilder, userData: faction.Value); m_factionList.Add(item); } } } else { m_factionList.SelectedItems.Clear(); m_factionList.Items.Clear(); m_factionList.SetToolTip(MyTexts.GetString(MySpaceTexts.TerminalTab_Chat_NoFaction)); } }
private static void OnGlobalMessageSuccess(MySyncCharacter sync, ref SendGlobalMessageMsg msg, MyNetworkClient sender) { var senderId = MySession.Static.Players.TryGetPlayerIdentity(new MyPlayer.PlayerId(msg.SenderSteamId)); if (MySession.LocalCharacter != null) { MyChatSystem.AddGlobalChatItem(MySession.LocalPlayerId, new MyGlobalChatItem(msg.Text, senderId.IdentityId)); MySession.Static.ChatSystem.OnNewGlobalMessage(senderId.IdentityId); if (MySession.LocalPlayerId != senderId.IdentityId) { MySession.Static.Gpss.ScanText(msg.Text, MyTexts.GetString(MySpaceTexts.TerminalTab_GPS_NewFromBroadcast)); } } }
private static void OnFactionMessageSuccess(MySyncCharacter sync, ref SendNewFactionMessageMsg msg, MyNetworkClient sender) { long senderIdentityId = MyEntityIdentifier.ConstructId(MyEntityIdentifier.ID_OBJECT_TYPE.IDENTITY, msg.ChatItem.IdentityIdUniqueNumber); var factionChatItem = new MyFactionChatItem(); factionChatItem.Init(msg.ChatItem); if (!(Sync.IsServer && senderIdentityId != MySession.LocalPlayerId)) { MyChatSystem.AddFactionChatItem(MySession.LocalPlayerId, msg.FactionId1, msg.FactionId2, factionChatItem); } if (senderIdentityId != MySession.LocalPlayerId) { MySession.Static.Gpss.ScanText(factionChatItem.Text, MyTexts.GetString(MySpaceTexts.TerminalTab_GPS_NewFromFactionComms)); } MySession.Static.ChatSystem.OnNewFactionMessage(msg.FactionId1, msg.FactionId2, senderIdentityId, true); }
private static MyFactionChatItem FindFactionChatItem(long playerId, long factionId1, long factionId2, TimeSpan timestamp, string text) { var factionChat = MyChatSystem.FindFactionChatHistory(factionId1, factionId2); if (factionChat != null) { foreach (var factionChatItem in factionChat.Chat) { if (factionChatItem.Timestamp == timestamp && factionChatItem.Text == text) { return(factionChatItem); } } } return(null); }
private static void OnPlayerMessageSuccess(MySyncCharacter sync, ref SendPlayerMessageMsg msg, MyNetworkClient sender) { var receiverId = MySession.Static.Players.TryGetPlayerIdentity(new MyPlayer.PlayerId(msg.ReceiverSteamId)); var senderId = MySession.Static.Players.TryGetPlayerIdentity(new MyPlayer.PlayerId(msg.SenderSteamId)); if (receiverId != null && receiverId.Character != null && senderId != null && senderId.Character != null) { if (receiverId.Character == MySession.LocalCharacter && receiverId.Character != senderId.Character) { MyChatSystem.AddPlayerChatItem(receiverId.IdentityId, senderId.IdentityId, new MyPlayerChatItem(msg.Text, senderId.IdentityId, msg.Timestamp, true)); MySession.Static.ChatSystem.OnNewPlayerMessage(senderId.IdentityId, senderId.IdentityId); MySession.Static.Gpss.ScanText(msg.Text, MyTexts.GetString(MySpaceTexts.TerminalTab_GPS_NewFromPrivateComms)); } else { MyChatSystem.SetPlayerChatItemSent(senderId.IdentityId, receiverId.IdentityId, msg.Text, new TimeSpan(msg.Timestamp), true); MySession.Static.ChatSystem.OnNewPlayerMessage(receiverId.IdentityId, senderId.IdentityId); } } }
private void RefreshPlayerChatHistory(MyIdentity playerIdentity) { m_chatHistory.Clear(); var history = MyChatSystem.GetChatHistory(MySession.Static.LocalPlayerId); var playerId = playerIdentity.IdentityId; MyPlayerChatHistory playerChat; if (history.PlayerChatHistory.TryGetValue(playerId, out playerChat)) { var chat = playerChat.Chat; foreach (var text in chat) { var identity = MySession.Static.Players.TryGetIdentity(text.IdentityId); if (identity == null) { continue; } bool isPlayer = identity.IdentityId == MySession.Static.LocalPlayerId; m_chatHistory.AppendText(identity.DisplayName, isPlayer ? MyFontEnum.DarkBlue : MyFontEnum.Blue, m_chatHistory.TextScale, Vector4.One); if (!text.Sent) { m_tempStringBuilder.Clear(); m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(MyTexts.GetString(MySpaceTexts.TerminalTab_Chat_Pending)); m_tempStringBuilder.Append(")"); m_chatHistory.AppendText(m_tempStringBuilder, MyFontEnum.Red, m_chatHistory.TextScale, Vector4.One); } m_chatHistory.AppendText(": ", isPlayer ? MyFontEnum.DarkBlue : MyFontEnum.Blue, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendText(text.Text, MyFontEnum.White, m_chatHistory.TextScale, Vector4.One); m_chatHistory.AppendLine(); } } m_factionList.SelectedItems.Clear(); m_chatHistory.ScrollbarOffset = 1.0f; }
void m_factionList_ItemsSelected(MyGuiControlListbox obj) { if (m_factionList.SelectedItems.Count > 0) { var selectedItem = m_factionList.SelectedItems[0]; var faction = (MyFaction)selectedItem.UserData; RefreshFactionChatHistory(faction); var factions = MySession.Static.Factions; var localFaction = factions.TryGetPlayerFaction(MySession.Static.LocalPlayerId); if (localFaction != null) { MyFactionChatHistory factionChat = MyChatSystem.FindFactionChatHistory(faction.FactionId, localFaction.FactionId); if (factionChat != null) { factionChat.UnreadMessageCount = 0; UpdateFactionList(true); } } m_chatbox.SetText(m_emptyText); } }
private void RefreshPlayerList() { //Add the global chat log first m_globalItem = new MyGuiControlListbox.Item(MyTexts.Get(MySpaceTexts.TerminalTab_Chat_ChatHistory)); m_playerList.Add(m_globalItem); //Comms broadcast history m_tempStringBuilder.Clear(); m_tempStringBuilder.Append(MyTexts.Get(MySpaceTexts.TerminalTab_Chat_GlobalChat)); MyChatHistory chatHistory; if (MySession.Static.ChatHistory.TryGetValue(MySession.Static.LocalPlayerId, out chatHistory) && chatHistory.GlobalChatHistory.UnreadMessageCount > 0) { m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(chatHistory.GlobalChatHistory.UnreadMessageCount); m_tempStringBuilder.Append(")"); } m_broadcastItem = new MyGuiControlListbox.Item(m_tempStringBuilder); m_playerList.Add(m_broadcastItem); //var allPlayers = MySession.Static.Players.GetAllIdentities(); var allPlayers = MySession.Static.Players.GetAllPlayers(); m_tempOnlinePlayers.Clear(); m_tempOfflinePlayers.Clear(); foreach (var player in allPlayers) { var playerIdentity = MySession.Static.Players.TryGetIdentity(MySession.Static.Players.TryGetIdentityId(player.SteamId, player.SerialId)); if (playerIdentity != null && playerIdentity.IdentityId != MySession.Static.LocalPlayerId && player.SerialId == 0) { if (playerIdentity.Character == null) { m_tempOfflinePlayers.Add(playerIdentity); } else { m_tempOnlinePlayers.Add(playerIdentity); } } } foreach (var onlinePlayer in m_tempOnlinePlayers) { m_tempStringBuilder.Clear(); m_tempStringBuilder.Append(onlinePlayer.DisplayName); var playerChatHistory = MyChatSystem.GetPlayerChatHistory(MySession.Static.LocalPlayerId, onlinePlayer.IdentityId); if (playerChatHistory != null && playerChatHistory.UnreadMessageCount > 0) { m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(playerChatHistory.UnreadMessageCount); m_tempStringBuilder.Append(")"); } var item = new MyGuiControlListbox.Item(text: m_tempStringBuilder, userData: onlinePlayer); m_playerList.Add(item); } foreach (var offlinePlayer in m_tempOfflinePlayers) { m_tempStringBuilder.Clear(); m_tempStringBuilder.Append(offlinePlayer.DisplayName); m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(MyTexts.GetString(MySpaceTexts.TerminalTab_Chat_Offline)); m_tempStringBuilder.Append(")"); var playerChatHistory = MyChatSystem.GetPlayerChatHistory(MySession.Static.LocalPlayerId, offlinePlayer.IdentityId); if (playerChatHistory != null && playerChatHistory.UnreadMessageCount > 0) { m_tempStringBuilder.Append(" ("); m_tempStringBuilder.Append(playerChatHistory.UnreadMessageCount); m_tempStringBuilder.Append(")"); } var item = new MyGuiControlListbox.Item(text: m_tempStringBuilder, userData: offlinePlayer, fontOverride: MyFontEnum.DarkBlue); m_playerList.Add(item); } }
private void SendMessage() { //Cannot send any message if local character is missing if (MySession.Static.LocalCharacter == null) { return; } m_chatboxText.Clear(); m_chatbox.GetText(m_chatboxText); MyDebug.AssertDebug(m_chatboxText.Length > 0, "Length of chat text should be positive"); MyDebug.AssertDebug(m_chatboxText.Length <= MyChatConstants.MAX_CHAT_STRING_LENGTH, "Length of chat text should not exceed maximum allowed"); var history = MyChatSystem.GetChatHistory(MySession.Static.LocalPlayerId); if (m_playerList.SelectedItems.Count > 0) { var selectedItem = m_playerList.SelectedItems[0]; if (selectedItem == m_globalItem) { //messages entered in the global chat history should be treated as normal ingame chat if (MyMultiplayer.Static != null) { MyMultiplayer.Static.SendChatMessage(m_chatboxText.ToString()); } else { MyHud.Chat.ShowMessage(MySession.Static.LocalHumanPlayer == null ? "Player" : MySession.Static.LocalHumanPlayer.DisplayName, m_chatboxText.ToString()); } //add the message to history //MySession.Static.GlobalChatHistory.GlobalChatHistory.Chat.Enqueue(new MyGlobalChatItem //{ // IdentityId = MySession.Static.LocalPlayerId, // Text = m_chatboxText.ToString() //}); RefreshGlobalChatHistory(); } else if (selectedItem == m_broadcastItem) { MySession.Static.LocalCharacter.SendNewGlobalMessage(MySession.Static.LocalHumanPlayer.Id, m_chatboxText.ToString()); } else { var playerIdentity = (MyIdentity)selectedItem.UserData; MySession.Static.ChatHistory[MySession.Static.LocalPlayerId].AddPlayerChatItem(new MyPlayerChatItem(m_chatboxText.ToString(), MySession.Static.LocalPlayerId, MySession.Static.ElapsedGameTime, false), playerIdentity.IdentityId); RefreshPlayerChatHistory(playerIdentity); } } else if (m_factionList.SelectedItems.Count > 0) { var toSendTo = new Dictionary <long, bool>(); var selectedItem = m_factionList.SelectedItems[0]; var targetFaction = (MyFaction)selectedItem.UserData; foreach (var member in targetFaction.Members) { toSendTo.Add(member.Value.PlayerId, false); } if (!targetFaction.IsMember(MySession.Static.LocalPlayerId)) { var localFaction = MySession.Static.Factions.TryGetPlayerFaction(MySession.Static.LocalPlayerId); if (localFaction != null) { foreach (var member in localFaction.Members) { toSendTo.Add(member.Value.PlayerId, false); } } } var factionChatItem = new MyFactionChatItem(m_chatboxText.ToString(), MySession.Static.LocalPlayerId, MySession.Static.ElapsedGameTime, toSendTo); //This has to exist! var currentFaction = MySession.Static.Factions.TryGetPlayerFaction(MySession.Static.LocalPlayerId); MySession.Static.LocalCharacter.SendNewFactionMessage(targetFaction.FactionId, currentFaction.FactionId, factionChatItem); RefreshFactionChatHistory(targetFaction); } m_chatbox.SetText(m_emptyText); }