struct PrivateChatSpace{ bool ExistInSameChannel; // 同じ座標チャンネルにいるかどうか string PlayerID; string UserCode; bool IsLoggedIn; string UserName; list MessageList; PrivateChatSpace() { ExistInSameChannel = true; IsLoggedIn = false; MessageList = new list(); } } component TCModelPrivateChat { TCViewModel m_ViewModel; TCModelCommon m_ModelCommon; TCMessageManagerList m_PrivateChatMessageList; list m_PrivateChatSpaceList; list m_ReceivedIndividualChatDataCache; int m_DataFromActionPaletteWithServer; //誰とテキチャしているか string m_CurrentChatterUserCode; string m_PrevID; public TCModelPrivateChat() { m_ViewModel = system.Layer_GetComponentByName("textchat_common"); m_ModelCommon = system.Layer_GetComponentByName("textchat_common"); m_PrivateChatMessageList = new TCMessageManagerList(); m_PrivateChatMessageList.SetLayerName(CHAT_TYPE_PRIVATE); m_PrivateChatMessageList.SetMessageListType(TC_MESSAGELIST_TYPE_ID_PRIVATE); m_PrivateChatSpaceList = new list(); m_ReceivedIndividualChatDataCache = new list(); m_DataFromActionPaletteWithServer = -1; m_PrevID = ""; m_CurrentChatterUserCode = ""; } public void Update(){ m_PrivateChatMessageList.Update(); } public void Exit() { m_PrivateChatMessageList.Clear(); m_PrivateChatSpaceList.Clear(); m_ViewModel.EnabledIndividualChatTab(false); // 個別チャットタブを無効にする } public void Close() { } //テキストチャットを送信 public void SendTextChat(string message) { _SendChat(message, false); } //エモートスタンプを送信 public void SendEmoteStamp(string emoteIndex) { _SendChat(emoteIndex, true); } // チャット送信用APIのラッパー関数 public void _SendChat(string message, bool IsEmote) { // 個別チャット JsVal sendVal = m_ModelCommon.GetSharedSendParam(message, IsEmote); if(sendVal === null || sendVal.IsNull()) return; if(m_CurrentChatterUserCode.IsEmpty()) return; string propname = ""; for(int i = 0; i < m_PrivateChatSpaceList.Count(); i++) { if(m_PrivateChatSpaceList[i].UserCode == m_CurrentChatterUserCode) { if(m_PrivateChatSpaceList[i].IsLoggedIn) { propname = "target_vket_id"; } else { propname = "target_guest_uuid"; } // もし同じ座標チャンネルにいないのならAPI単位でも送信できない状態にする if(!m_PrivateChatSpaceList[i].ExistInSameChannel) return; break; } } // 宛先が見つけられなかった if(propname == "") return; sendVal.AddProperty(propname).SetType(JS_STR).SetStr(m_CurrentChatterUserCode); // もし、一時ブロックしている(orされている)相手ならば個別チャットは送信しない bool shouldNotSendPrivateMessage=false; LayerBundle profOptionLayer = hsLayerGet("prof_option_layer"); if(profOptionLayer !== null) { Func IsTempBlockerUser = system.Layer_GetComponentMethod(profOptionLayer.GetCurrent()._GetInstanceID(), "ProfRejector", "IsTemporaryBlockerUserCode"); Func IsTempBlockedUser = system.Layer_GetComponentMethod(profOptionLayer.GetCurrent()._GetInstanceID(), "ProfRejector", "IsTemporaryBlockedUserCode"); Func IsBlockerUser = system.Layer_GetComponentMethod(profOptionLayer.GetCurrent()._GetInstanceID(), "ProfRejector", "IsBlockedUserCode"); Func IsBlockedUser = system.Layer_GetComponentMethod(profOptionLayer.GetCurrent()._GetInstanceID(), "ProfRejector", "IsBlockerUserCode"); if(!IsTempBlockerUser.IsEmpty()){ shouldNotSendPrivateMessage = shouldNotSendPrivateMessage || IsTempBlockerUser(m_CurrentChatterUserCode); } if(!IsTempBlockedUser.IsEmpty()){ shouldNotSendPrivateMessage = shouldNotSendPrivateMessage || IsTempBlockedUser(m_CurrentChatterUserCode); } if(!IsBlockerUser.IsEmpty()){ shouldNotSendPrivateMessage = shouldNotSendPrivateMessage || IsBlockerUser(m_CurrentChatterUserCode); } if(!IsBlockedUser.IsEmpty()){ shouldNotSendPrivateMessage = shouldNotSendPrivateMessage || IsBlockedUser(m_CurrentChatterUserCode); } } // メッセージを送信 if(!shouldNotSendPrivateMessage) { heliport.v3.api.textChat.sendIndividualChat(_SendMessageResponseCallback,sendVal); } // メッセージ送信後の後処理 m_ModelCommon.DoSharedSendProcess(); } public void SetDataFromActionPaletteWithServerCallback(string data) { m_DataFromActionPaletteWithServer = data.ToInt(); } void _SendMessageResponseCallback(JsVal Val){ ReturnType result = hsLoadReturnType(Val); if(!result.IsValid()) return; JsVal individual_chat_text = result.data.GetProperty("individual_chat_text"); string target_id = result.data.GetProperty("target_id").GetStr(); if(individual_chat_text === null || individual_chat_text.IsNull()) return; string message_type = individual_chat_text.GetProperty("message_type").GetStr(); string icon = individual_chat_text.GetProperty("user_icon").GetStr(); string createdAt = individual_chat_text.GetProperty("created_at").GetStr(); string message = individual_chat_text.GetProperty("message").GetStr(); Player selfPlayer = hsPlayerGet(); string name = selfPlayer.GetName(); string userCode = selfPlayer.GetCustomState("UserCode"); string userType = selfPlayer.GetCustomState("UserType"); JsVal messageObj = CreateMessageDataFormat(); messageObj.GetProperty("messageType").SetStr(message_type); messageObj.GetProperty("userID").SetStr(userCode); messageObj.GetProperty("logInTypeCode").SetStr(userType); messageObj.GetProperty("userName").SetStr(name); messageObj.GetProperty("userIconURL").SetStr(icon); messageObj.GetProperty("timestamp").SetStr(createdAt); messageObj.GetProperty("message").SetStr(message); TCMessageGUIManager messageCore = new TCMessageGUIManager(); bool selfMessageFlag = true; messageCore.LoadMessageData(messageObj, selfMessageFlag); messageCore.SetPrivateFlag(true); AddPrivateChatMessage(messageCore, target_id); } //個別チャットを受け取った際のコールバック public void ReceiveTextChatMessagePersonal(string param) { Player SelfPlayer = hsPlayerGet(); string SelfUserCode = SelfPlayer.GetCustomState("UserCode"); string SelfUserType = SelfPlayer.GetCustomState("UserType"); if(SelfUserCode.IsEmpty()) return; Json messageJson = hsLoadJson(param); if(messageJson === null) return; m_ReceivedIndividualChatDataCache.Add(messageJson); string messageType; messageJson.FindValueString("MessageType", messageType); if(messageType == "Text"){ int referenceID; messageJson.FindValueInt("ReferenceID", referenceID); JsVal getParam = makeJsObj(); getParam.AddProperty("id").SetType(JS_STR).SetStr(referenceID.ToString()); getParam.AddProperty("isLoggedIn").SetType(JS_BOOL).SetBool(SelfUserType == "login"); heliport.v3.api.textChat.getIndividualChat(_ReceiveTextChatMessagePersonal,getParam); } else if (messageType == "EmoteStamp"){ _ReceiveEmoteStampPersonal(param); } } //個別チャットを受け取った際にテキストだった場合の処理 void _ReceiveTextChatMessagePersonal(JsVal jsVal) { //情報の取得に失敗したら何もしない ReturnType result = hsLoadReturnType(jsVal); if(!result.IsValid()) return; //データをパース JsVal ictVal = result.data.GetProperty("individual_chat_text"); if(ictVal.IsNull()) return; //メッセージ受信イベントデータのキャッシュから当該チャットデータを見つける Json messageJson = null; for(int i = 0 ; i < m_ReceivedIndividualChatDataCache.Count() ; i++) { int referenceID; m_ReceivedIndividualChatDataCache[i].FindValueInt("ReferenceID", referenceID); if(referenceID == ictVal.GetProperty("id").GetNum().ToString().ToInt()){ messageJson = m_ReceivedIndividualChatDataCache[i]; m_ReceivedIndividualChatDataCache.RemoveAt(i); break; } } if(messageJson === null) return; JsVal messageObj = CreateMessageByJson(messageJson); string userID = GetPropertyString(messageObj, "userID"); string userName = GetPropertyString(messageObj, "userName"); bool isLoggedIn = GetPropertyString(messageObj, "logInTypeCode") == "login"; //個別テキチャリスト PrivateChatSpace itcml = null; for(int i = 0; i < m_PrivateChatSpaceList.Count(); i++){ if(m_PrivateChatSpaceList[i].UserCode == userID){ itcml = m_PrivateChatSpaceList[i]; } } if(itcml === null){ itcml = CreateChatSpace("", userID, isLoggedIn, userName); } else{ itcml.ExistInSameChannel = true; // 送信可能状態にする if(itcml.UserName != userName){ itcml.UserName = userName; } } // チャットスペースが存在しないのならエラーとする if(itcml === null) { system.Output("[Error] Invalid chat space operation.\n"); return; } // 送信可能UIを更新 if(m_ViewModel.IsTextChatOpened() && m_CurrentChatterUserCode == itcml.UserCode) { m_ViewModel.SetTextChatConnectFlag(itcml.ExistInSameChannel); } messageObj.GetProperty("message").SetStr(ictVal.GetProperty("message").GetStr()); TCMessageGUIManager messageCore = new TCMessageGUIManager(); bool selfMessageFlag = true; messageCore.LoadMessageData(messageObj, selfMessageFlag); messageCore.SetPrivateFlag(true); AddPrivateChatMessage(messageCore, userID); } //個別チャット エモートスタンプだった場合の処理 void _ReceiveEmoteStampPersonal(string param){ Json messageJson = hsLoadJson(param); if(messageJson === null) return; JsVal messageObj = CreateMessageByJson(messageJson); string userID = GetPropertyString(messageObj, "userID"); string userName = GetPropertyString(messageObj, "userName"); bool isLoggedIn = GetPropertyString(messageObj, "logInTypeCode") == "login"; //個別テキチャリスト PrivateChatSpace itcml = null; for(int i = 0; i < m_PrivateChatSpaceList.Count(); i++){ if(m_PrivateChatSpaceList[i].UserCode == userID){ itcml = m_PrivateChatSpaceList[i]; } } if(itcml === null){ itcml = CreateChatSpace("", userID, isLoggedIn, userName); } else{ itcml.ExistInSameChannel = true; // 送信可能状態にする if(itcml.UserName != userName){ itcml.UserName = userName; } } // チャットスペースが存在しないのならエラーとする if(itcml === null) { system.Output("[Error] Invalid chat space operation.\n"); return; } // 送信可能UIを更新 if(m_ViewModel.IsTextChatOpened() && m_CurrentChatterUserCode == itcml.UserCode) { m_ViewModel.SetTextChatConnectFlag(itcml.ExistInSameChannel); } Json emote_stamp = messageJson.Find(EJSONDataType_Block, "EmoteStamp"); string emote_url = ""; if(emote_stamp !== null) { emote_stamp.FindValueString("URL", emote_url); } messageObj.GetProperty("message").SetStr(emote_url); TCMessageGUIManager messageCore = new TCMessageGUIManager(); bool selfMessageFlag = false; messageCore.LoadMessageData(messageObj, selfMessageFlag); messageCore.SetPrivateFlag(true); AddPrivateChatMessage(messageCore, userID); } // 要素名だけ生成(送信と受信でデータフォーマットが何故か違うので、そこのクッション用) private JsVal CreateMessageDataFormat(){ JsVal messageData = makeJsObj(); // 送信タイプ messageData.AddPropertyByVal("messageType", makeJsStrFrom("")); // 送信者名 messageData.AddPropertyByVal("userName", makeJsStrFrom("")); // 送信者アイコン画像URL messageData.AddPropertyByVal("userIconURL", makeJsStrFrom("")); // 送信者ID (vket_id / guest_id) messageData.AddPropertyByVal("userID", makeJsStrFrom("")); // ログイン判定 messageData.AddPropertyByVal("logInTypeCode", makeJsStrFrom("")); // 送信タイムスタンプ messageData.AddPropertyByVal("timestamp", makeJsStrFrom("")); // 送信内容 messageData.AddPropertyByVal("message", makeJsStrFrom("")); return messageData; } private JsVal CreateMessageByJson(Json messageJson){ JsVal messageData = CreateMessageDataFormat(); // 送信タイプ string messageTypeCode = ""; messageJson.FindValueString("MessageType", messageTypeCode); messageData.GetProperty("messageType").SetStr(messageTypeCode); // 送信者名 string userName = ""; messageJson.FindValueString("UserNameJA", userName); if(userName.IsEmpty()){ messageJson.FindValueString("UserNameEN", userName); } messageData.GetProperty("userName").SetStr(userName); // 送信者アイコン画像URL string userIconURL = ""; messageJson.FindValueString("UserIcon", userIconURL); messageData.GetProperty("userIconURL").SetStr(userIconURL); // ログイン判定 string userLogInType = "login"; // 送信者ID (vket_id / guest_id) string userUUID = ""; messageJson.FindValueString("VketID", userUUID); // vketIDが無い場合はゲストを取ってくる if(userUUID.IsEmpty()){ messageJson.FindValueString("GuestUserID", userUUID); userLogInType = "guest"; } messageData.GetProperty("userID").SetStr(userUUID); messageData.GetProperty("logInTypeCode").SetStr(userLogInType); // 送信タイムスタンプ string messageCreatedAt = ""; messageJson.FindValueString("MessageCreatedAt", messageCreatedAt); messageData.GetProperty("timestamp").SetStr(messageCreatedAt); // 送信内容 string message = ""; messageJson.FindValueString("Message", message); messageData.GetProperty("message").SetStr(message); return messageData; } //メッセージリストに追加(個別テキチャ) void AddPrivateChatMessage(TCMessageGUIManager guiManager, string personalChatUserCode) { // ---メッセージマネージャーを登録--- // 現在開いている個別テキストチャットのUserCodeならメッセージリストに追加する if(m_CurrentChatterUserCode == personalChatUserCode) { m_PrivateChatMessageList.Add(guiManager); } // 個別チャットスペースリストにメッセージを追加 if(!personalChatUserCode.IsEmpty()) { for(int i = 0; i < m_PrivateChatSpaceList.Count() ; i++){ PrivateChatSpace itcml = m_PrivateChatSpaceList[i]; if(itcml.UserCode == personalChatUserCode){ NoticeBatch(guiManager); guiManager.SetNotifiedFlag(true); itcml.MessageList.Add(guiManager); break; } } } } private void NoticeBatch(TCMessageGUIManager guiManager){ if(guiManager.IsNotified()) { return; } // PrivateChatSpaceに一時格納したら通知をここで発火させる。 TCModelCommon tcModelCommon; tcModelCommon = system.Layer_GetComponentByName("textchat_common"); // ワールド内のチャットバルーン表示設定 bool showChatBallonFlag = false; // HUDの簡易プレビューに登録 tcModelCommon.DoReceiveSharedProcess(guiManager, showChatBallonFlag); // 通知バッチGUIの表示登録 TCViewModel _viewModel = system.Layer_GetComponentByName("textchat_common"); _viewModel.ShowBadge(CHAT_TYPE_PRIVATE); } public bool CanToggleIndividual(){ return (m_PrivateChatSpaceList !== null) && (m_PrivateChatSpaceList.Count() > 0); } //個別テキチャ可能な人リストを更新 void UpdateIndivisualChatist(){ // 個別チャットプルダウンの表示切替 m_ViewModel.ShowPrvChatPulldown("false"); //実際に個別テキチャを送れるユーザー一覧を作成 for(int i = 0; i < m_PrivateChatSpaceList.Count(); i++){ bool isShow = true; if(i < m_PrivateChatSpaceList.Count()) { PrivateChatSpace itcml = m_PrivateChatSpaceList[i]; string playerName = itcml.UserName; string UserCode = itcml.UserCode; hsCanvasResetToggleDefault("Toggle_PrvTextChat_Pulldown_%d" % i); hsCanvasToggleChange("Toggle_PrvTextChat_Pulldown_%d" % i); hsCanvasSetGUIText("textchat_common", "dynamic_prvchat_pulldown_list_txt_%d" % i, playerName); } else{ isShow = false; } if(!isShow && m_PrivateChatSpaceList.Count() > 0){ hsCanvasResetToggleDefault("Toggle_PrvTextChat_Pulldown_%d" % i); } } int SpaceCount = m_PrivateChatSpaceList.Count(); {//La float w,h; system.Canvas_GetGUISize("textchat_common",false,"chat_prv_txt_chat_pulldown_opened",w,h); float pdw,pdh; system.Canvas_GetGUISize("textchat_common",false,"chat_prv_txt_chat_pulldown_open",pdw,pdh); h = 26 * SpaceCount + pdh; system.Canvas_SetGUISize("textchat_common",false,"chat_prv_txt_chat_pulldown_opened",w,h); } {//Po float w,h; system.Canvas_GetGUISize("textchat_common",true,"chat_prv_txt_chat_pulldown_opened",w,h); float pdw,pdh; system.Canvas_GetGUISize("textchat_common",true,"chat_prv_txt_chat_pulldown_open",pdw,pdh); h = 90 * SpaceCount + pdh; system.Canvas_SetGUISize("textchat_common",true,"chat_prv_txt_chat_pulldown_opened",w,h); } // 個別チャットタブを有効にする if(m_PrivateChatSpaceList.Count() > 0) { m_ViewModel.EnabledIndividualChatTab(true); } } // チャットスペースを作成 PrivateChatSpace CreateChatSpace(string PlayerID, string UserCode, bool isLoggedIn, string UserName) { if(UserCode.IsEmpty() || UserName.IsEmpty()) { system.OutputLog("[HS Error] Failed to create ChatSpace. UserCode or UserName is Empty.\n"); return null; } // データ確保 PrivateChatSpace itcml = new PrivateChatSpace(); itcml.ExistInSameChannel = true; // 送信可能状態にする itcml.PlayerID = PlayerID; itcml.UserCode = UserCode; itcml.IsLoggedIn = isLoggedIn; itcml.UserName = UserName; m_PrivateChatSpaceList.Add(itcml); // プルダウンのUIを作成 int Order = m_PrivateChatSpaceList.Count() - 1; CreatePullDown(false, Order, UserCode); CreatePullDown(true, Order, UserCode); // ユーザーリストを更新 UpdateIndivisualChatist(); return itcml; } void CreatePullDown(bool IsPortrait, int Order, string UserCode) { if(IsPortrait) { hsAddGUIButton( "textchat_common", IsPortrait, "dynamic_prvchat_pulldown_list_%d" % Order, "", "", "", true, 18, -35, -799 + Order * (90), 520,70, 0.0, 0.5, "CM", true, 0.0, "gui2024/clear.png", "", "", "", 520,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_%d" % Order, "Toggle_PrvTextChat_Pulldown_OpenClose", false); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_%d" % Order, "Toggle_PrvTextChat_Pulldown_%d" % Order, false); // GUIActionを追加 // system.Canvas_AddGUIAction("textchat_common", "dynamic_prvchat_pulldown_list_%d" % Order, "false,String,String,ToggleChange,Toggle_PrvTextChat_Pulldown_OpenClose,"); hsAddGUIText( "textchat_common", IsPortrait, "dynamic_prvchat_pulldown_list_txt_%d" % Order, true, 20, -23,-799 + Order * (90), 520,70, 0.0,0.5, "CM", true, 0.0, "", "BIZUDPGothic", 37, 1.0, 1.0, 1.0, 1.0, "LM", 0, 0, false, false, 1.0, 1.0, 1.0, 1.0 ); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_txt_%d" % Order, "Toggle_PrvTextChat_Pulldown_OpenClose", false); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_txt_%d" % Order, "Toggle_PrvTextChat_Pulldown_%d" % Order, false); } else { hsAddGUIButton( "textchat_common", IsPortrait, "dynamic_prvchat_pulldown_list_%d" % Order, "", "", "", true, 30, -173,-258 + Order * (26), 135,20, 0.5,0.0, "RM", true, 0.0, "gui2024/clear.png", "", "", "", 135,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_%d" % Order, "Toggle_PrvTextChat_Pulldown_OpenClose", false); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_%d" % Order, "Toggle_PrvTextChat_Pulldown_%d" % Order, false); // GUIActionを追加 // system.Canvas_AddGUIAction("textchat_common", "dynamic_prvchat_pulldown_list_%d" % Order, "false,String,String,ToggleChange,Toggle_PrvTextChat_Pulldown_OpenClose,"); hsAddGUIText( "textchat_common", IsPortrait, "dynamic_prvchat_pulldown_list_txt_%d" % Order, true, 32, -173,-258 + Order * (26), 135,20, 0.5,0.0, "RM", true, 0.0, "", "BIZUDPGothic", 14, 1.0, 1.0, 1.0, 1.0, "LM", 0, 0, false, false, 1.0, 1.0, 1.0, 1.0 ); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_txt_%d" % Order, "Toggle_PrvTextChat_Pulldown_OpenClose", false); system.Canvas_AddGUIToggle("textchat_common", "dynamic_prvchat_pulldown_list_txt_%d" % Order, "Toggle_PrvTextChat_Pulldown_%d" % Order, false); } } //個別テキチャの開始 public void StartIndividualChat(string PlayerID) { Player player = hsPlayerGetByID(PlayerID); string UserCode = player.GetCustomState("UserCode"); string UserType = player.GetCustomState("UserType"); //すでにこのユーザーとチャットをしているか for(int i = 0; i < m_PrivateChatSpaceList.Count(); i++){ PrivateChatSpace itcml = m_PrivateChatSpaceList[i]; if(itcml.UserCode == UserCode){ // 一度退出した後にまた同じチャンネルに戻ってきたので送信ボタンを再有効化する if(!itcml.ExistInSameChannel) { m_PrivateChatSpaceList[i].ExistInSameChannel = true; m_ViewModel.SetTextChatConnectFlag(m_PrivateChatSpaceList[i].ExistInSameChannel); } return; } } // このユーザーとチャットをしたことが無いのでチャットルームを作成する PrivateChatSpace itcml = CreateChatSpace(PlayerID, UserCode, (UserType == "login"), player.GetName()); } // 個別テキチャの終了 public void EndIndividualChat(string PlayerID, bool IndividualChatOpened) { if(PlayerID.IsEmpty()) return; Player player = hsPlayerGetByID(PlayerID); if(player === null) return; string UserCode = player.GetCustomState("UserCode"); if(UserCode.IsEmpty()) return; for(int i = 0; i < m_PrivateChatSpaceList.Count() ; i++) { PrivateChatSpace data = m_PrivateChatSpaceList[i]; if(data === null) continue; if(UserCode != m_PrivateChatSpaceList[i].UserCode) continue; // 既に送信不能状態なら何もしない if(!m_PrivateChatSpaceList[i].ExistInSameChannel) { break; } // 送信不能状態にする(UI更新は開いた時に行われるので不要) m_PrivateChatSpaceList[i].ExistInSameChannel = false; if(IndividualChatOpened && !m_CurrentChatterUserCode.IsEmpty() && m_CurrentChatterUserCode == data.UserCode) { // メッセージを送信不能状態にする m_ViewModel.SetTextChatConnectFlag(m_PrivateChatSpaceList[i].ExistInSameChannel); // テキストチャットを開いていたら汎用ダイアログでユーザーがもういないのでその旨を通知 string Message = ""; if(hsIsLangJA()) { Message = "『%s』が退出したためメッセージを送信することができません。" % data.UserName; } else { Message = "Cannot send message because '%s' has left the chat." % data.UserName; } hsCommonDialogSetUseCloseButton(false); hsCommonDialogSetOKButtonText("OK"); hsCommonDialogSetText(Message); hsCommonDialogSetTextAlignment(HSAlignCM); hsCommonDialogSetTextOverflowWrap(true); hsCommonDialogOpen("canvas"); } break; } } // 個別テキチャの再スタート public void ReStartIndividualChat(string PlayerID) { if(PlayerID.IsEmpty()) return; Player player = hsPlayerGetByID(PlayerID); if(player === null) return; string UserCode = player.GetCustomState("UserCode"); if(UserCode.IsEmpty()) return; // 一度退出したユーザーが戻ってきたときに再びテキストチャットを送信可能状態にする for(int i = 0; i < m_PrivateChatSpaceList.Count() ; i++) { PrivateChatSpace data = m_PrivateChatSpaceList[i]; if(data === null) continue; if(UserCode != m_PrivateChatSpaceList[i].UserCode) continue; // 送信可能状態にする m_PrivateChatSpaceList[i].ExistInSameChannel = true; // テキストチャットを開いていてかつ現在そのユーザーと会話しているのならUIを更新する if(m_ViewModel.IsTextChatOpened() && m_CurrentChatterUserCode == m_PrivateChatSpaceList[i].UserCode) { m_ViewModel.SetTextChatConnectFlag(m_PrivateChatSpaceList[i].ExistInSameChannel); } return; } } // PlayerIDに合致するチャットスペースを選択する public void SelectIndividualChatByPlayerID(string PlayerID) { int chatSpaceIndex = 0; //個別テキチャの相手を切り替える for(int i = 0; i < m_PrivateChatSpaceList.Count(); i++) { if(PlayerID == m_PrivateChatSpaceList[i].PlayerID) { // id検索でHitしたらそのIndexをもってループ退出 chatSpaceIndex = i; break; } } // PlayerIDにどれも当てはまらなかったので最初の人をチャット相手にする SelectPlayerIndividualChatPulldown(chatSpaceIndex); } // 個別テキチャのプレイヤーの選択切り替え public void SelectPlayerIndividualChatPulldown(int Index) { if(Index < 0 || Index >= m_PrivateChatSpaceList.Count()) return; // ToDo: PrivateChatSpaceは名前がよくないので後で変更する PrivateChatSpace CurrentIndividualChat = m_PrivateChatSpaceList[Index]; if(CurrentIndividualChat === null) return; // 現在の個別チャット対象を切り替え m_CurrentChatterUserCode = CurrentIndividualChat.UserCode; // 個別テキチャのメッセージリストをリセット m_PrivateChatMessageList.Clear(); // これからチャットを行うチャットスペースのメッセージを再追加する list messageList = CurrentIndividualChat.MessageList; for(int i = 0; i < messageList.Count(); i++) { m_PrivateChatMessageList.Add(messageList[i]); } // テキストチャットを送信可能かどうかでUI表示を切り替える m_ViewModel.SetTextChatConnectFlag(CurrentIndividualChat.ExistInSameChannel); hsCanvasSetGUIText("textchat_common", "chat_prv_txt_chat_pulldown_open_txt", CurrentIndividualChat.UserName); } private string GetPropertyString(JsVal targetObj, string propertyName){ return targetObj.GetProperty(propertyName).GetStr(); } }