const string VCC_WINDOW_TYPE_ICONONLY = "VCC_WINDOW_TYPE_ICONONLY"; const string VCC_WINDOW_TYPE_NAME = "VCC_WINDOW_TYPE_NAME"; const string VCC_WINDOW_TYPE_NONE = "VCC_WINDOW_TYPE_NONE"; component VCCViewModel { VCCModel m_Model; VCCView m_View; int m_SelectedSpaceIndex; string m_SelectedChannelId; string m_SelectedChannelType; bool m_IsOpenedChannelList; string m_CurrentWindowType; public VCCViewModel() { m_View = new VCCView(); m_Model = system.Layer_GetComponentByName("vcc_icon_only_base"); m_SelectedChannelType = CHANNEL_TYPE_OPEN; m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; m_IsOpenedChannelList = false; hsAddEventListener("ui-open-enter-channel-dialog", EnterChannelWithDialog); hsAddEventListener("ui-close-enter-channel-dialog", CloseEnterChannelDialog); hsAddEventListener("ui-enter-voice-channel", EnterChannelFromID); hsAddEventListener("vcc-notify-removed", NotifyRemoved); } public string GetCurrentChannelID() { VCCChannelData CurrentChannel = m_Model.GetCurrentChannel(); string ChannelId; if(CurrentChannel !== null) { ChannelId = CurrentChannel.ChannelId; } return ChannelId; } public void RequestCurrentLocalTransform() { m_Model.RequestCurrentLocalTransform(); } public void ResizeCallback() { m_View.ResizeCallback(); } // 強制終了の処理 // JavaScriptの beforeunload, WindowsのWM_CLOSEに対応 public void OnBeforeUnload() { hel_net_disconnect(_NetDisconnectCallback); } // 強制終了の処理 // JavaScriptの unload, WindowsのWM_DESTROYに対応 public void OnUnload() { hel_net_disconnect(_NetDisconnectCallback); } void _NetDisconnectCallback() { } // マイクオンオフコールバック public void OnEnabledSelfPlayerMic(bool MicOn) { m_Model.EnabledVoice(MicOn); } public void UpdateSelfUserData(string param) { if(param.IsEmpty()) return; Json data = hsLoadJson(param); if(data === null) return; string UserName; data.FindValueString("UserName", UserName); string IconURL; data.FindValueString("IconURL", IconURL); string UserCode; data.FindValueString("UserCode", UserCode); string UserType; data.FindValueString("UserType", UserType); m_Model.UpdateSelfUserData(UserName, IconURL, UserCode, UserType); } public void UpdateCurrentPlayerCount(string params) { JsVal val = makeJsValFromJson(params); if(val.IsNull()) return; m_View.UpdateCurrentPlayerCount(val); } public void ClickArrowDown(string param) { if(!hsNetUseUserTable()) return; // 既に開いているウィンドウを閉じる m_SelectedChannelType = CHANNEL_TYPE_OPEN; m_View.CloseChannelSettings(); m_View.CloseChannelNumInput(); CloseChannelList(""); // アイコンユーザーリストを表示する // m_CurrentWindowType = VCC_WINDOW_TYPE_ICONONLY; // m_View.OpenIconOnlyUserList(m_Model.GetCurrentChannel(), m_Model.GetCurrentUserTable()); // #11976 ボイスチャットの一段階目をオミットする OpenUserList(""); m_View.ShowUserListArrowUp(true); } public void ClickVoiceEnable(string param) { bool enable = (param != "false"); m_Model.EnabledNormalVoice(enable); } public void ClickLiveVoiceEnable(string param) { bool enable = (param != "false"); m_Model.EnabledLiveVoice(enable); } public void ClickArrowUp(string param) { m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; m_View.CloseIconOnlyUserList(); m_View.CloseUserList(); m_View.ShowUserListArrowUp(false); } public void ClearAllVCCLayer(string param) { m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; if(m_Model.IsConnected()) { m_View.ShowUserListArrowUp(false); } m_View.CloseIconOnlyUserList(); m_View.CloseUserList(); CloseUserListConference(); CloseChannelList(""); m_SelectedChannelType = CHANNEL_TYPE_OPEN; m_View.CloseChannelSettings(); } public void OpenChannelList(string param) { if(!hsNetUseUserTable()) return; m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; m_View.CloseIconOnlyUserList(); m_View.CloseUserList(); CloseUserListConference(); if(!m_IsOpenedChannelList) { m_Model.OpenChannelList(); m_IsOpenedChannelList = true; } } public void PageBackChannelPager() { m_Model.UpdateChannelPager(-1); } public void PageNextChannelPager() { m_Model.UpdateChannelPager(1); } public void ShowChannelList(list ChannelList, int PagerIndex) { m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; m_View.ShowChannelList(ChannelList, PagerIndex); } public void CloseChannelList(string param) { m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; m_View.CloseChannelList(); m_IsOpenedChannelList = false; } public void OpenUserList(string param) { m_View.CloseIconOnlyUserList(); m_CurrentWindowType = VCC_WINDOW_TYPE_NAME; m_View.OpenUserList(m_Model.GetCurrentChannel(), m_Model.GetVCNumber(), m_Model.GetCurrentUserTable()); // 重なって表示されてしまうのでPoの時はカンファレンスUIのユーザーリストを閉じる if(hsCanvasIsPortrait()) CloseUserListConference(); } public void CloseUserList(string param) { m_View.CloseUserList(); m_CurrentWindowType = VCC_WINDOW_TYPE_ICONONLY; m_View.OpenIconOnlyUserList(m_Model.GetCurrentChannel(), m_Model.GetCurrentUserTable()); } public void ExitChannel(string param) { m_CurrentWindowType = VCC_WINDOW_TYPE_NONE; m_View.CloseIconOnlyUserList(); m_View.CloseUserList(); CloseUserListConference(); m_View.ShowUserListArrowUp(false); if (param == "fromUserList") { m_Model.ExitChannelByUserList(); } else { m_Model.ExitChannel(); } m_SelectedChannelId = ""; } public void MoveChannel(string param) { m_View.ShowUserListArrowUp(false); m_View.CloseIconOnlyUserList(); m_View.CloseUserList(); CloseUserListConference(); m_Model.OpenChannelList(); } public void SelectChannel(string param) { int ChannelIndex = param.ToInt(); VCCChannelData Channel = m_Model.GetSelectedChannel(ChannelIndex); if(Channel !== null) { m_SelectedChannelId = Channel.ChannelId; string ChannelName = Channel.ChannelName; m_View.OpenEnterDialog(ChannelName, false); } } public void ClickEnterButton(string param) { m_View.CloseEnterDialog(); CloseChannelList(""); m_Model.EnterChannel(m_SelectedChannelId); } public void EnterChannelFromID(string ChannelId) { // 初期化のタイミング前なのかm_Modelから取ると、配列アクセスをしていないのに『範囲外アクセスエラー』が出るので毎回Modelを取得する VCCModel Model = system.Layer_GetComponentByName("vcc_icon_only_base"); Model.EnterChannel(ChannelId); } void EnterChannelWithDialog(string param) { if(param.IsEmpty()) return; JsVal val = makeJsValFromJson(param); if(val === null || val.IsNull()) return; string channel_id; { JsVal prop = val.GetProperty("channel_id"); if(prop === null || prop.IsNull()) return; channel_id = prop.GetStr(); } string name; { JsVal prop = val.GetProperty("name"); if(prop === null || prop.IsNull()) return; name = prop.GetStr(); } bool controllable = false; { JsVal prop = val.GetProperty("controllable"); if(prop !== null && !prop.IsNull()) { controllable = prop.GetBool(); } } m_SelectedChannelId = channel_id; m_View.OpenEnterDialog(name, false, controllable); } void CloseEnterChannelDialog(string _) { m_View.CloseEnterDialog(); } public void ClickEnterFromNumber(string param) { // ViewからNumberを取得(後日実装) // string ChannelNumber = m_View.GetChannelNumberInput(); // m_Model.EnterFromChannelNumber(ChannelNumber); } public void UpdateConnectStatus(string ChannelName, int VoiceChannelIndex, bool IsConnected, bool IsUpdateArrow) { m_View.UpdateConnectStatus(ChannelName, VoiceChannelIndex , IsConnected, IsUpdateArrow); } public void ClickCancelButton(string param) { m_View.CloseEnterDialog(); } public void OpenChannelSettings(string param) { bool IsChange = (param != "false"); if(IsChange) { if(!m_Model.IsChannelCreator()) return; m_View.CloseIconOnlyUserList(); m_View.CloseUserList(); CloseUserListConference(); m_View.ShowUserListArrowUp(false); } CloseChannelList(""); m_View.UpdateSelectedNewChannelType(true); m_View.OpenChannelSettings(IsChange); } public void CloseChannelSettings(string param) { m_SelectedChannelType = CHANNEL_TYPE_OPEN; m_View.CloseChannelSettings(); } public void OpenChannelNumInput(string param) { CloseChannelList(""); m_View.OpenChannelNumInput(); } public void CloseChannelNumInput(string param) { m_View.CloseChannelNumInput(); } public void SelectNewChannelType(string param) { m_SelectedChannelType = param; m_View.UpdateSelectedNewChannelType((param == CHANNEL_TYPE_OPEN)); } public void CreateNewChannel(string param) { // VRモード中はGUI要素からチャンネル名を取得する bool IsVrMode = hsSystemIsVRMode(); string ChannelName = GetChannelName(IsVrMode); ChannelName = ChannelName.SubString(0, 50); // 空文字なら何もしない if(ChannelName.IsEmpty() || _IsEmptyWithTrim(ChannelName)) { return; } m_Model.CreateNewChannel(ChannelName, m_SelectedChannelType); m_SelectedChannelType = CHANNEL_TYPE_OPEN; m_View.CloseChannelSettings(); } public void UpdateChannel(string param) { // VRモード中はGUI要素からチャンネル名を取得する bool IsVrMode = hsSystemIsVRMode(); string ChannelName = GetChannelName(IsVrMode); ChannelName = ChannelName.SubString(0, 50); // 空文字なら何もしない if(ChannelName.IsEmpty() || _IsEmptyWithTrim(ChannelName)) { return; } m_Model.UpdateChannel(ChannelName, m_SelectedChannelType); m_SelectedChannelType = CHANNEL_TYPE_OPEN; m_View.CloseChannelSettings(); } bool _IsEmptyWithTrim(string src) { if(src.IsEmpty()) return true; for(int i = 0; i < src.Length(); i++) { string val = src.SubString(i, 1); if(val != "\n" && val != " ") { return false; // 空白も改行もない完全なEmptyである } } return true; } public void ShowUserProfile(string PlayerID) { Player OtherPlayer = hsPlayerGetByID(PlayerID); string OtherUserCode = OtherPlayer.GetCustomState("UserCode"); string OtherUserType = OtherPlayer.GetCustomState("UserType"); if(!OtherUserCode.IsEmpty() && !OtherUserType.IsEmpty()) { Player SelfPlayer = hsPlayerGet(); string SelfUserCode = SelfPlayer.GetCustomState("UserCode"); string SelfUserType = SelfPlayer.GetCustomState("UserType"); LayerBundle layer = hsLayerGet("other_profile"); if(layer !== null) { Func FindUserDataAndShowProfileFromUserID = system.Layer_GetComponentMethod(layer.GetCurrent()._GetInstanceID(), "ProfileModel", "FindUserDataAndShowProfileFromUserID"); if(!FindUserDataAndShowProfileFromUserID.IsEmpty()) FindUserDataAndShowProfileFromUserID(OtherUserCode, OtherUserType, (SelfUserType == "login" && SelfUserCode != OtherUserCode)); } } } public void OpenSpaceList() { m_Model.OpenSpaceList(); } public void PageBackSpacePager() { m_Model.UpdateSpacePager(-1); } public void PageNextSpacePager() { m_Model.UpdateSpacePager(1); } public void ShowSpaceList(list SpaceList, int PagerIndex) { m_View.ShowSpaceList(SpaceList, PagerIndex); } public void CloseSpaceList() { m_View.CloseSpaceList(); } public void JoinSpace(string param) { m_SelectedSpaceIndex = param.ToInt(); m_View.OpenEnterDialog("", true); } public void ExitSpace() { m_Model.ExitSpace(); } public void ClickEnterSpaceButton() { m_View.CloseEnterDialog(); m_View.CloseWorldInfo(); CloseSpaceList(); m_Model.EnterSpace(m_SelectedSpaceIndex); } public void OpenUserListConference() { m_View.CloseChannelSettings(); m_View.CloseChannelNumInput(); CloseChannelList(""); m_View.OpenUserListConference(); } public void CloseUserListConference() { m_View.CloseUserListConference(); } public void UpdateLiveChannelName(string ChannelName) { m_View.SetLiveChannelName(ChannelName); } //ネットワーク同期周り///////////////////////////////////////////////////////////////// public list GetCurrentUserTable() { return m_Model.GetCurrentUserTable(); } public bool IsExistPlayer(string PlayerID) { bool result = false; // 初期化のタイミング前なのかm_Modelから取ると、配列アクセスをしていないのに『範囲外アクセスエラー』が出るので毎回Modelを取得する VCCModel Model = system.Layer_GetComponentByName("vcc_icon_only_base"); list UserTable = Model.GetCurrentUserTable(); for(int i = 0; i < UserTable.Count(); i++) { if(UserTable[i].PlayerID == PlayerID) { result = true; break; } } return result; } public string GetPlayerIDFromUserCode(string UserCode) { string PlayerID; // 初期化のタイミング前なのかm_Modelから取ると、配列アクセスをしていないのに『範囲外アクセスエラー』が出るので毎回Modelを取得する VCCModel Model = system.Layer_GetComponentByName("vcc_icon_only_base"); list UserTable = Model.GetCurrentUserTable(); for(int i = 0; i < UserTable.Count(); i++) { if(UserTable[i].UserCode == UserCode) { PlayerID = UserTable[i].PlayerID; break; } } return PlayerID; } public string GetUserCodeFromPlayerID(string PlayerID) { string UserCode; // 初期化のタイミング前なのかm_Modelから取ると、配列アクセスをしていないのに『範囲外アクセスエラー』が出るので毎回Modelを取得する VCCModel Model = system.Layer_GetComponentByName("vcc_icon_only_base"); list UserTable = Model.GetCurrentUserTable(); for(int i = 0; i < UserTable.Count(); i++) { if(UserTable[i].PlayerID == PlayerID) { UserCode = UserTable[i].UserCode; break; } } return UserCode; } //自分以外のVketID文字列(JsVal.Array)を取得する public string GetOtherUserCodesJsVal(){ VCCModel Model = system.Layer_GetComponentByName("vcc_icon_only_base"); list UserList = Model.GetCurrentUserTable(); JsVal val = makeJsArray(); Player player = hsPlayerGet(); for(int i = 0; i < UserList.Count(); ++i){ if(UserList[i].PlayerID == "" || UserList[i].PlayerID == player.GetID()) { continue; } val.AddElementByVal(makeJsStrFrom(UserList[i].PlayerID)); } return val.ToString(); } // 自分以外のVketID文字列(カンマ区切り)を取得する public string GetOtherUserCodesString(){ list UserList = m_Model.GetCurrentUserTable(); string strRet = ""; Player player=hsPlayerGet(); for(int i=0;i