component AvatarModel { // fetch中かどうか bool m_Fetching; AvatarViewModel m_ViewModel; string m_MyAvatarUUIDFromCookie; list m_AvatarList; list m_PresetAvatarList; int m_PagerIndex; int m_PresetPagerIndex; int m_MaxPage; public AvatarModel() { m_Fetching = false; m_ViewModel = system.Layer_GetComponentByName("mainmenu_mypage_avatar_base"); m_AvatarList = new list(); m_PresetAvatarList = new list(); m_PagerIndex = 0; m_PresetPagerIndex = 0; m_MaxPage = 0; _SetDataFromCookie(); } public int GetPagerIndex() { return m_PagerIndex; } public int GetPresetPagerIndex(){ return m_PresetPagerIndex; } public int GetMaxPageElemCount() { return ((hsCanvasIsPortrait())? 16 : 10); } public int GetMyAvatarCount() { return m_AvatarList.Count; } public void Update() { } public void Release() { m_Fetching = false; m_AvatarList.Clear(); } public void OnNetCreatedPlayerID(string ID) { bool loginValid = hel_net_is_logged_in(); if(hsPlayerUseMyAvatar() && loginValid && hel_skyway_get_avatar() == -1 && !m_MyAvatarUUIDFromCookie.IsEmpty()) { _ChangeMyAvatarFromUUID(m_MyAvatarUUIDFromCookie); heliport.v3.api.avatars.fetchMyAvatarList(_OnloadedFetchMyAvatarListCallback); } else { if(hel_skyway_get_avatar() == -1) { hel_setText(ETextParamType_ReplaceMyAvatar, "0"); } } } public void FetchMyAvatarDataList(int PagerIndex) { // fetch中なら何もしない // MyAvatar APIはレスポンスが遅く、連打されると複数個リクエストが返ってきたりして表示がおかしくなってしまうのでその対策 if(m_Fetching) return; m_PagerIndex = PagerIndex; if(!hsPlayerUseMyAvatar()) { return; } bool loginValid = hel_net_is_logged_in(); if(!loginValid) { m_ViewModel.ShowLoginButtonOnMyAvatar(); } else { m_Fetching = true; int MaxPageElemCount = GetMaxPageElemCount(); int Offset = m_PagerIndex * MaxPageElemCount; heliport.v3.api.avatars.fetchMyAvatarPageList(_FetchMyAvatarListCallback, MaxPageElemCount, Offset); } } void _FetchMyAvatarListCallback(JsVal val) { ReturnType result = hsLoadReturnType(val); if(!result.IsValid()) return; JsVal assets = result.data.GetProperty("assets"); if(assets === null) return; list ArrayList = assets.GetPropertyList(); // アバターリストを作り直す Release(); for(int i = 0; i < ArrayList.Count; i++) { JsVal avatar = ArrayList[i].GetValue(); if(avatar === null) return; JsVal latest_version = avatar.GetProperty("latest_version"); if(latest_version === null) return; JsVal thumbnail = latest_version.GetProperty("thumbnail"); if(thumbnail === null) return; string Name = avatar.GetProperty("name").GetStr(); string UUID = latest_version.GetProperty("uuid").GetStr(); string ThumbnailURI = thumbnail.GetProperty("url").GetStr(); MyAvatarData Data = new MyAvatarData(); Data.SetVal(UUID, ThumbnailURI, Name); m_AvatarList.Add(Data); } int asset_count = result.data.GetProperty("asset_count").GetNum(); int MaxPageElemCount = GetMaxPageElemCount(); m_MaxPage = (asset_count + MaxPageElemCount - 1) / MaxPageElemCount; m_ViewModel.UpdateViewDataByAvatars(m_AvatarList, m_PagerIndex); } void _OnloadedFetchMyAvatarListCallback(JsVal val) { ReturnType result = hsLoadReturnType(val); if(!result.IsValid()) return; JsVal assets = result.data.GetProperty("assets"); if(assets === null) return; list ArrayList = assets.GetPropertyList(); list AvatarList = new list(); for(int i = 0; i < ArrayList.Count; i++) { JsVal avatar = ArrayList[i].GetValue(); if(avatar === null) return; JsVal latest_version = avatar.GetProperty("latest_version"); if(latest_version === null) return; JsVal thumbnail = latest_version.GetProperty("thumbnail"); if(thumbnail === null) return; string Name = avatar.GetProperty("name").GetStr(); string UUID = latest_version.GetProperty("uuid").GetStr(); string ThumbnailURI = thumbnail.GetProperty("url").GetStr(); MyAvatarData Data = new MyAvatarData(); Data.SetVal(UUID, ThumbnailURI, Name); AvatarList.Add(Data); } int PrevSelectedIndex = -1; for(int i = 0; i < AvatarList.Count; i++) { MyAvatarData data = AvatarList[i]; if(data.GetUUID() == m_MyAvatarUUIDFromCookie) { PrevSelectedIndex = i; break; } } AvatarList.Clear(); m_ViewModel.SetCurrentAvatarItemIndexOnLoaded(PrevSelectedIndex); } public void FetchPresetAvatarDataList(int PagerIndex) { // fetch中なら何もしない // MyAvatar APIはレスポンスが遅く、連打されると複数個リクエストが返ってきたりして表示がおかしくなってしまうのでその対策 m_PresetAvatarList.Clear(); m_PresetPagerIndex = PagerIndex; Release(); int PresetAvatarCount = hsPlayerGetPresetAvatarCount(); int MaxPageElemCount = (hsCanvasIsPortrait())? 16 : 10; for(int i = 0; i < PresetAvatarCount; i++) { string ThumbnailURI; if(system.IsLangJA()) { ThumbnailURI = hsPlayerGetPresetAvatarThumbnailURL(i); } else { ThumbnailURI = hsPlayerGetPresetAvatarEN_ThumbnailURL(i); } if(ThumbnailURI.IsEmpty()) { ThumbnailURI = "gui2024/noimage.png"; } else { // サムネイル画像はCDNではなくローカルから読みたいので相対パスを指定する ThumbnailURI = "./" + ThumbnailURI; } PresetAvatarData Data = new PresetAvatarData(); Data.SetVal("%d" % (i),ThumbnailURI); m_PresetAvatarList.Add(Data); } m_MaxPage = PresetAvatarCount/MaxPageElemCount + 1; m_ViewModel.UpdateViewDataByPresetAvatars(m_PresetAvatarList, m_PresetPagerIndex); } public void SelectPresetAvatar(int AvatarID) { //プリセットアバター時にもアバタータイプをセットする //現状、プリセットアバターにはアバタータイプはないが //マイアバター→プリセットアバターにした際にアバタータイプが変更されない事となり //エモート再生時のアバタータイプが前のものを引きずるため、ここではいったんプリセットアバター="common"固定という //扱いにします。将来的にプリセットアバターにもアバタータイプが適用され次第、適切な処理を記述します Player player=hsPlayerGet(); if(player!==null){ player._SetAvatarType("common");//プリセットアバター時は"common"固定(今の所) } if(!hel_net_get_my_avatar().IsNull()) { // マイアバターからプリセットアバターに変更したのでChannelSessionsからavatar_infoの設定を解除する hel_net_set_my_avatar(_UnsetMyAvatarCallback, makeJsNull()); } player.SetPresetAvatar(AvatarID + GetMaxPageElemCount() * m_PresetPagerIndex); hel_skyway_change_avatar(AvatarID + GetMaxPageElemCount() * m_PresetPagerIndex,1,true); } void _UnsetMyAvatarCallback() { } public void SelectMyAvatar(int SelectedAvatarItemIndex) { if(!hsPlayerUseMyAvatar()) return; if(SelectedAvatarItemIndex >= 0 && SelectedAvatarItemIndex < m_AvatarList.Count()) { string UUID = m_AvatarList[SelectedAvatarItemIndex].GetUUID(); _ChangeMyAvatarFromUUID(UUID); } } public void SelectMyAvatarFromUUID(string UUID) { if(!hsPlayerUseMyAvatar()) return; _ChangeMyAvatarFromUUID(UUID); } void _ChangeMyAvatarFromUUID(string UUID) { JsVal sendVal = makeJsObj(); sendVal.AddProperty("uuid").SetType(JS_STR).SetStr(UUID); heliport.v3.api.tokens.generateMyAvatarToken(_FetchMyAvatarTokenCallback, sendVal); } void _FetchMyAvatarTokenCallback(JsVal val) { ReturnType result = hsLoadReturnType(val); if(!result.IsValid()) { hsSendToastNotice(TOASTNOTICE_TYPE_ERROR_ID, "Invalid avater data. Reset to default.", 8); m_ViewModel.ResetAvatar(); return; } // マイアバターの反映 hel_net_set_my_avatar(_SetMyAvatarCallback, result.data); // 現在のマイアバターUUIDを保持 m_MyAvatarUUIDFromCookie = result.data.GetProperty("uuid").GetStr(); // マイアバター用のネームプレートアイコンを描画 m_ViewModel.DrawProfileNameplateIcon(); } void _SetMyAvatarCallback() { } void _SetDataFromCookie() { string UUID = hel_get_cookie_onEmptyStr("MyAvatarUUID"); if(!UUID.IsEmpty() && hel_skyway_get_avatar() == -1) { m_MyAvatarUUIDFromCookie = UUID; } int ID = hel_skyway_get_avatar(); } public void UpdatePager(int val,string currentTab) { int PagerIndex = m_PagerIndex; if(currentTab == "PRESET_AVATAR_TAB"){ PagerIndex = m_PresetPagerIndex; } PagerIndex += val; if(PagerIndex < 0) { PagerIndex = 0; return; } else if(PagerIndex >= m_MaxPage) { PagerIndex = (m_MaxPage - 1); return; } if(currentTab == "MY_AVATAR_TAB"){ FetchMyAvatarDataList(PagerIndex); }else{ FetchPresetAvatarDataList(PagerIndex); } } public int GetCurrentMyAvatarIndex(){ int Index = -1; JsVal avatarInfo = hel_net_get_my_avatar(); if(!avatarInfo.IsNull()) { string uuid = avatarInfo.GetProperty("uuid").GetStr(); for(int i = 0; i < m_AvatarList.Count; i++) { if(m_AvatarList[i].GetUUID() == uuid) { Index = i; break; } } } return Index; } }