diff --git a/AssetBundles/Android/Android b/AssetBundles/Android/Android deleted file mode 100644 index 8e3ec2f..0000000 Binary files a/AssetBundles/Android/Android and /dev/null differ diff --git a/AssetBundles/Android/Android.manifest b/AssetBundles/Android/Android.manifest deleted file mode 100644 index febab23..0000000 --- a/AssetBundles/Android/Android.manifest +++ /dev/null @@ -1,23 +0,0 @@ -ManifestFileVersion: 0 -CRC: 3747323971 -AssetBundleManifest: - AssetBundleInfos: - Info_0: - Name: ui_homepage.ab - Dependencies: - Dependency_0: common.ab - Info_1: - Name: common.ab - Dependencies: {} - Info_2: - Name: language.ab - Dependencies: {} - Info_3: - Name: ui_common.ab - Dependencies: - Dependency_0: common.ab - Dependency_1: ui_loginpage.ab - Info_4: - Name: ui_loginpage.ab - Dependencies: - Dependency_0: ui_common.ab diff --git a/AssetBundles/Android/common.ab.manifest.meta b/AssetBundles/Android/common.ab.manifest.meta new file mode 100644 index 0000000..27e8a35 --- /dev/null +++ b/AssetBundles/Android/common.ab.manifest.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8efc0a24208a4ad4199a43f0fff4f33d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/common.ab.meta b/AssetBundles/Android/common.ab.meta new file mode 100644 index 0000000..39901fa --- /dev/null +++ b/AssetBundles/Android/common.ab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2beb8f636348f43418639d8d3b8398f8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/google-services-desktop.json b/AssetBundles/Android/google-services-desktop.json new file mode 100644 index 0000000..28770f6 --- /dev/null +++ b/AssetBundles/Android/google-services-desktop.json @@ -0,0 +1,46 @@ +{ + "project_info": { + "project_number": "785438724947", + "project_id": "photonmatrix-ac0b5", + "storage_bucket": "photonmatrix-ac0b5.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:785438724947:android:352ede76bb25311f51c7a6", + "android_client_info": { + "package_name": "com.photonmatrix.photonmatrix" + } + }, + "oauth_client": [ + { + "client_id": "785438724947-kpjbqi43hbj6eddianbjsgkgkkclkfmd.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAntcCsZGurbXg7TFbPMPx5aek6HDYYVxk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "785438724947-kpjbqi43hbj6eddianbjsgkgkkclkfmd.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "785438724947-r578u4au09ebieu0pnahj8ef08s1uhqp.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.photonmatrix.photonmatrix" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/AssetBundles/Android/google-services-desktop.json.meta b/AssetBundles/Android/google-services-desktop.json.meta new file mode 100644 index 0000000..67700b6 --- /dev/null +++ b/AssetBundles/Android/google-services-desktop.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c24a7550296d5d54d91f866dd40936db +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/language.ab b/AssetBundles/Android/language.ab index 6726167..053d55c 100644 Binary files a/AssetBundles/Android/language.ab and b/AssetBundles/Android/language.ab differ diff --git a/AssetBundles/Android/language.ab.manifest b/AssetBundles/Android/language.ab.manifest index 8835540..5948615 100644 --- a/AssetBundles/Android/language.ab.manifest +++ b/AssetBundles/Android/language.ab.manifest @@ -1,15 +1,15 @@ ManifestFileVersion: 0 -CRC: 1723046804 +CRC: 749593259 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 797f6f2f02274927028e5eb11bb9976e + Hash: 81a8de0bb4c5928c43220b249b335c6b TypeTreeHash: serializedVersion: 2 Hash: 5ad585dd02dfb5016c0dad519eab8f49 IncrementalBuildHash: serializedVersion: 2 - Hash: 797f6f2f02274927028e5eb11bb9976e + Hash: 81a8de0bb4c5928c43220b249b335c6b HashAppended: 0 ClassTypes: - Class: 49 diff --git a/AssetBundles/Android/language.ab.manifest.meta b/AssetBundles/Android/language.ab.manifest.meta new file mode 100644 index 0000000..f859f20 --- /dev/null +++ b/AssetBundles/Android/language.ab.manifest.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4e4b248a1ea1d1647b673d83229260a8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/language.ab.meta b/AssetBundles/Android/language.ab.meta new file mode 100644 index 0000000..7836c5f --- /dev/null +++ b/AssetBundles/Android/language.ab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 92d0cbb4b3e260c4fb37b1f2def9aacd +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/list.json b/AssetBundles/Android/list.json index 6b62bd4..74d5909 100644 --- a/AssetBundles/Android/list.json +++ b/AssetBundles/Android/list.json @@ -1,30 +1,55 @@ { - "version": "1.0.0", + "version": "1.0.1", "assetbundles": [ { - "name": "common", + "name": "common.ab", "size": 12854223, "md5": "c2fa51b131e3d8a65d4134c8670ee99b" }, { - "name": "language", - "size": 2141, - "md5": "e11b0286b48552dc19ca3c556b2bf1fd" + "name": "language.ab", + "size": 2226, + "md5": "6e10d9c8c23778a25684dd8d69350510" }, { - "name": "ui_common", + "name": "ui_common.ab", "size": 12606, "md5": "1dfaf11957a90b775e0be5f6fe37452b" }, { - "name": "ui_homepage", + "name": "ui_homepage.ab", "size": 9787, "md5": "4c4595943f5c31673338e2ca83147ee8" }, { - "name": "ui_loginpage", - "size": 242126, - "md5": "55c7e98bc05f6114de0a1445c68d7ea5" + "name": "ui_loginpage.ab", + "size": 241923, + "md5": "520989d12bfdae3368c3fd88f8381d3e" + }, + { + "name": "common.ab.manifest", + "size": 2173, + "md5": "7f35fb8fc14986f31d17c6483a90b4f3" + }, + { + "name": "language.ab.manifest", + "size": 473, + "md5": "335cc7d7481861141ee8e6fff52f3976" + }, + { + "name": "ui_common.ab.manifest", + "size": 2905, + "md5": "a05683fbffe6068095d6b7ef877f0ef4" + }, + { + "name": "ui_homepage.ab.manifest", + "size": 2419, + "md5": "c3971548d08125ef72bade017cebabdc" + }, + { + "name": "ui_loginpage.ab.manifest", + "size": 4757, + "md5": "99941302876547c4759f674f80fee5db" } ] } \ No newline at end of file diff --git a/AssetBundles/Android/list.json.meta b/AssetBundles/Android/list.json.meta new file mode 100644 index 0000000..c14d649 --- /dev/null +++ b/AssetBundles/Android/list.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e56d42cf285d10847a9084054c83be13 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/ui_common.ab.manifest.meta b/AssetBundles/Android/ui_common.ab.manifest.meta new file mode 100644 index 0000000..a42880d --- /dev/null +++ b/AssetBundles/Android/ui_common.ab.manifest.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 411ccbd3ce3893b4cb7c2f82531993fe +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/ui_common.ab.meta b/AssetBundles/Android/ui_common.ab.meta new file mode 100644 index 0000000..64463e7 --- /dev/null +++ b/AssetBundles/Android/ui_common.ab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6692d8124d25ece40acb1da49bb1bf7e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/ui_homepage.ab.manifest.meta b/AssetBundles/Android/ui_homepage.ab.manifest.meta new file mode 100644 index 0000000..effca9f --- /dev/null +++ b/AssetBundles/Android/ui_homepage.ab.manifest.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 427bee84e8448674196ec081992050a0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/ui_homepage.ab.meta b/AssetBundles/Android/ui_homepage.ab.meta new file mode 100644 index 0000000..b4463c5 --- /dev/null +++ b/AssetBundles/Android/ui_homepage.ab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6012662144bcee14e9f85185bd36b2c1 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/ui_loginpage.ab b/AssetBundles/Android/ui_loginpage.ab index 810cc6d..8a25ca6 100644 Binary files a/AssetBundles/Android/ui_loginpage.ab and b/AssetBundles/Android/ui_loginpage.ab differ diff --git a/AssetBundles/Android/ui_loginpage.ab.manifest b/AssetBundles/Android/ui_loginpage.ab.manifest index b550189..f202b4f 100644 --- a/AssetBundles/Android/ui_loginpage.ab.manifest +++ b/AssetBundles/Android/ui_loginpage.ab.manifest @@ -1,15 +1,15 @@ ManifestFileVersion: 0 -CRC: 4164004111 +CRC: 4028950989 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 7ac2dfa1ef8c51780a36380c1952f749 + Hash: 59dce4d2a0ce9e0ae41212946c77f075 TypeTreeHash: serializedVersion: 2 - Hash: 91ff5ca08bee0306c72c34bd9a34b897 + Hash: 70589c2c13c216b3c5fa3022c1dc899e IncrementalBuildHash: serializedVersion: 2 - Hash: 7ac2dfa1ef8c51780a36380c1952f749 + Hash: 59dce4d2a0ce9e0ae41212946c77f075 HashAppended: 0 ClassTypes: - Class: 1 @@ -34,6 +34,8 @@ ClassTypes: Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 271b50f7241504b49a6a7493d13721e7, type: 3} +- Class: 114 + Script: {fileID: 11500000, guid: f53257c6334f5224a8c3d192d5653d1c, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - Class: 114 diff --git a/AssetBundles/Android/ui_loginpage.ab.manifest.meta b/AssetBundles/Android/ui_loginpage.ab.manifest.meta new file mode 100644 index 0000000..5643b2f --- /dev/null +++ b/AssetBundles/Android/ui_loginpage.ab.manifest.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8d67207d165a11a41abac6e85483b748 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AssetBundles/Android/ui_loginpage.ab.meta b/AssetBundles/Android/ui_loginpage.ab.meta new file mode 100644 index 0000000..6608e5c --- /dev/null +++ b/AssetBundles/Android/ui_loginpage.ab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 65d66671e6ec89c46a4bd059254702a0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/YqcTools.cs b/Assets/Editor/YqcTools.cs index aabc8ff..11c0d98 100644 --- a/Assets/Editor/YqcTools.cs +++ b/Assets/Editor/YqcTools.cs @@ -83,13 +83,31 @@ public class AssetBundleListGenerator : EditorWindow { List bundleInfos = new List(); - // 获取目录下所有.ab文件 + // 获取目录下所有.ab文件和.ab.manifest文件 string[] abFiles = Directory.GetFiles(folderPath, "*.ab", SearchOption.AllDirectories); + string[] manifestFiles = Directory.GetFiles(folderPath, "*.ab.manifest", SearchOption.AllDirectories); foreach (string filePath in abFiles) { FileInfo fileInfo = new FileInfo(filePath); - string fileName = Path.GetFileNameWithoutExtension(filePath); + string fileName = Path.GetFileName(filePath); + + // 创建AssetBundleInfo对象 + AssetBundleInfo info = new AssetBundleInfo() + { + name = fileName, + size = fileInfo.Length, + md5 = GetMD5HashFromFile(filePath) + }; + + bundleInfos.Add(info); + } + + // 添加.manifest文件 + foreach (string filePath in manifestFiles) + { + FileInfo fileInfo = new FileInfo(filePath); + string fileName = Path.GetFileName(filePath); // 保留.manifest后缀 // 创建AssetBundleInfo对象 AssetBundleInfo info = new AssetBundleInfo() diff --git a/Assets/Res/language/language.json b/Assets/Res/language/language.json index 9c23e8c..8d48986 100644 --- a/Assets/Res/language/language.json +++ b/Assets/Res/language/language.json @@ -198,6 +198,16 @@ "key": "100040", "zh": "账号或密码错误,请重试", "en": "Incorrect username or password. Please try again" + }, + { + "key": "100041", + "zh": "该邮箱已绑定至其他账号,请更换邮箱", + "en": "This email is already linked to another account. Please use a different email" + }, + { + "key": "100042", + "zh": "第三方账号授权失败,请重试", + "en": "Authorization failed. Please try again" } ] diff --git a/Assets/Res/ui/loginPage/loginPage.prefab b/Assets/Res/ui/loginPage/loginPage.prefab index d22ae8b..c3f0480 100644 --- a/Assets/Res/ui/loginPage/loginPage.prefab +++ b/Assets/Res/ui/loginPage/loginPage.prefab @@ -1742,6 +1742,7 @@ MonoBehaviour: - {fileID: 3193987252293487442} - {fileID: 6955140603665847554} - {fileID: 3147153994057625843} + - {fileID: 1019959377021005830} PrivacyAgreementTip: {fileID: 2496689810772355960} PrivacyAgreementPlane: - {fileID: 6381042080645703062} @@ -10183,13 +10184,14 @@ GameObject: m_Component: - component: {fileID: 1639875081832707489} - component: {fileID: 3652785914819211941} + - component: {fileID: 1019959377021005830} m_Layer: 5 m_Name: "\u7ED1\u5B9A\u7B2C\u4E09\u65B9" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1639875081832707489 RectTransform: m_ObjectHideFlags: 0 @@ -10220,6 +10222,22 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8197244891143982658} m_CullTransparentMesh: 1 +--- !u!114 &1019959377021005830 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8197244891143982658} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f53257c6334f5224a8c3d192d5653d1c, type: 3} + m_Name: + m_EditorClassIdentifier: + pageType: 5 + emailInput: {fileID: 3767868839594136140} + errorText: {fileID: 8713072464975864109} + nextBtn: {fileID: 1994062947339244197} --- !u!1 &8253023617244837761 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity index c79ddcf..c735ee0 100644 --- a/Assets/Scenes/MainScene.unity +++ b/Assets/Scenes/MainScene.unity @@ -224,140 +224,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!1001 &301505139 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 1896827481} - m_Modifications: - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 2315241295588288027, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_Name - value: loginPage - objectReference: {fileID: 0} - - target: {fileID: 8197244891143982658, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8954635767052804253, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - propertyPath: m_IsActive - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: f96c15501623f0a4f9a2d5047a50f35a, type: 3} ---- !u!224 &301505140 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 554090642281332281, guid: f96c15501623f0a4f9a2d5047a50f35a, - type: 3} - m_PrefabInstance: {fileID: 301505139} - m_PrefabAsset: {fileID: 0} --- !u!1 &433695806 GameObject: m_ObjectHideFlags: 0 @@ -506,7 +372,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 05b49f3efc06bd84b91275be192861eb, type: 3} m_Name: m_EditorClassIdentifier: - resPosition: 1 + resPosition: 2 commonList: - common - ui_common @@ -522,7 +388,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 401839f502466cb4a8a96f5f45e15280, type: 3} m_Name: m_EditorClassIdentifier: - languageType: 0 + languageType: 1 --- !u!114 &609900190 MonoBehaviour: m_ObjectHideFlags: 0 @@ -546,9 +412,9 @@ MonoBehaviour: value: maxConcurrentRequests: 5 resourceUrls: - - https://nextreal.cn/photon-matrix-api + - https://cdn.muffin100.com/MuffinSpace/test1/ nowResourceIndex: 0 - resourceVersion: 1.0.0 + resourceVersion: 1.0.1 nowBundleList: version: assetbundles: [] @@ -573,6 +439,9 @@ MonoBehaviour: email: username: role: + exam_completed: 0 + device_count: 0 + total_kill_count: 0 --- !u!114 &609900193 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1178,8 +1047,7 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 301505140} + m_Children: [] m_Father: {fileID: 1547547273} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} diff --git a/Assets/Scripts/Managers/DataBase.cs b/Assets/Scripts/Managers/DataBase.cs index 77c6405..abd5697 100644 --- a/Assets/Scripts/Managers/DataBase.cs +++ b/Assets/Scripts/Managers/DataBase.cs @@ -66,6 +66,9 @@ namespace Kill.Managers public string email; public string username; public string role; + public bool exam_completed; + public int device_count; + public int total_kill_count; } #endregion #region 登录注册 @@ -110,6 +113,27 @@ namespace Kill.Managers { public string firebase_token; } + public class BindFireBaseRequest + { + public string code; + public string email; + public string temp_token; + } + + /// + /// Firebase 绑定响应 + /// + public class FirebaseBindResponse + { + public int code; + public string message; + public FirebaseBindData data; + } + + public class FirebaseBindData + { + public bool firebase_bind; + } #endregion } diff --git a/Assets/Scripts/Managers/DataManager.cs b/Assets/Scripts/Managers/DataManager.cs index 80e95b3..f25a244 100644 --- a/Assets/Scripts/Managers/DataManager.cs +++ b/Assets/Scripts/Managers/DataManager.cs @@ -23,6 +23,7 @@ namespace Kill.Managers this.token = token; this.userInfo = userInfo; string userData =JsonUtility.ToJson(userInfo); + Debug.Log(userData); PlayerPrefs.SetString("token", token); PlayerPrefs.SetString("userData", userData); NetworkCtrl.Instance.RemoveGlobalHeader("Authorization"); diff --git a/Assets/Scripts/Managers/FirebaseAuthManager.cs b/Assets/Scripts/Managers/FirebaseAuthManager.cs index a5ddf6b..ceda0d2 100644 --- a/Assets/Scripts/Managers/FirebaseAuthManager.cs +++ b/Assets/Scripts/Managers/FirebaseAuthManager.cs @@ -59,7 +59,8 @@ namespace Kill.Managers /// 谷歌登录 /// 使用 Firebase 内置的 Google 登录弹窗 /// - public void SignInWithGoogle(Action onSuccess, Action onError) + /// 超时时间(秒),默认30秒 + public void SignInWithGoogle(Action onSuccess, Action onError, int timeoutSeconds = 30) { #if UNITY_ANDROID && !UNITY_EDITOR if (auth == null) @@ -68,6 +69,19 @@ namespace Kill.Managers return; } + bool isCompleted = false; + + // 启动超时检测 + Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(timeoutSeconds)); + if (!isCompleted) + { + isCompleted = true; + MainThread.Enqueue(() => onError?.Invoke($"Google 登录超时({timeoutSeconds}秒)")); + } + }); + // 获取 Google 登录 Provider var provider = new FederatedOAuthProviderData("google.com"); provider.Scopes = new string[] { "email", "profile" }; @@ -76,6 +90,9 @@ namespace Kill.Managers auth.SignInWithProviderAsync(federatedProvider).ContinueWith(task => { + if (isCompleted) return; // 已超时,忽略结果 + isCompleted = true; + if (task.IsFaulted) { MainThread.Enqueue(() => onError?.Invoke("Google 登录失败")); @@ -118,13 +135,14 @@ namespace Kill.Managers { var mockResult = new GoogleLoginResult { - FirebaseUserId = "mock_firebase_user_id_12345", + FirebaseUserId = "1231232345", Email = "mock@gmail.com", DisplayName = "Mock User", PhotoUrl = "", IdToken = "" }; - onSuccess?.Invoke(mockResult); + //onSuccess?.Invoke(mockResult); + onError?.Invoke("Google 登录被取消"); }); }); #endif diff --git a/Assets/Scripts/Managers/LanguageManager.cs b/Assets/Scripts/Managers/LanguageManager.cs index fd9cb8d..7de4dde 100644 --- a/Assets/Scripts/Managers/LanguageManager.cs +++ b/Assets/Scripts/Managers/LanguageManager.cs @@ -3,11 +3,13 @@ using System.Collections.Generic; using System.Threading.Tasks; using Newtonsoft.Json; using UnityEngine; + namespace Kill.Managers { public class LanguageManager : MonoBehaviour { public static LanguageManager Instance; + [System.Serializable] public struct Language { @@ -15,18 +17,54 @@ namespace Kill.Managers public string zh; public string en; } + List languageList; + [System.Serializable] public enum LanguageType { Chinese, English } + void Awake() { Instance = this; } + public LanguageType languageType = LanguageType.English; + + /// + /// 根据系统语言自动设置 App 语言 + /// 只有简体中文和繁体中文显示中文,其他全部显示英文 + /// + public void SetLanguageBySystem() + { + SystemLanguage systemLanguage = Application.systemLanguage; + Debug.Log($"系统语言: {systemLanguage}"); + + if (systemLanguage == SystemLanguage.Chinese || + systemLanguage == SystemLanguage.ChineseSimplified || + systemLanguage == SystemLanguage.ChineseTraditional) + { + languageType = LanguageType.Chinese; + Debug.Log("设置语言为: 中文"); + } + else + { + languageType = LanguageType.English; + Debug.Log("设置语言为: 英文"); + } + } + + /// + /// 手动设置语言 + /// + public void SetLanguage(LanguageType type) + { + languageType = type; + Debug.Log($"手动设置语言为: {type}"); + } public async Task Init() { TextAsset textAsset = await LoadRes.Instance.LoadAssetAsync("language", "language.json"); diff --git a/Assets/Scripts/Network/NetworkCtrl.cs b/Assets/Scripts/Network/NetworkCtrl.cs index 9c6275d..718d900 100644 --- a/Assets/Scripts/Network/NetworkCtrl.cs +++ b/Assets/Scripts/Network/NetworkCtrl.cs @@ -447,7 +447,7 @@ namespace Kill.Network public async Task GetBundleList() { - string url = nowResourceUrl + $"{resourceVersion}/{platform}/list.json"; + string url = nowResourceUrl + $"{platform}/{resourceVersion}/list.json"; using (UnityWebRequest webRequest = UnityWebRequest.Get(url)) { var operation = webRequest.SendWebRequest(); @@ -521,7 +521,7 @@ namespace Kill.Network } else { - ToastUI.Show("100039"); + ToastUI.ShowText("资源更新失败"); Debug.LogError("资源更新失败"); await UpdateResources(); } @@ -596,7 +596,7 @@ namespace Kill.Network foreach (var bundle in updateList) { - string url = nowResourceUrl + $"{resourceVersion}/{platform}/{bundle.name}"; + string url = nowResourceUrl + $"{platform}/{resourceVersion}/{bundle.name}"; string savePath = Path.Combine(localPath, bundle.name); string directory = Path.GetDirectoryName(savePath); diff --git a/Assets/Scripts/UI/Pages/Login/LoginPageCtrl.cs b/Assets/Scripts/UI/Pages/Login/LoginPageCtrl.cs index 32fb533..3f1db9c 100644 --- a/Assets/Scripts/UI/Pages/Login/LoginPageCtrl.cs +++ b/Assets/Scripts/UI/Pages/Login/LoginPageCtrl.cs @@ -288,7 +288,6 @@ namespace Kill.UI.Pages #region 当前登录邮箱 private string currentEmail = ""; - /// /// 设置当前登录邮箱 /// @@ -310,7 +309,7 @@ namespace Kill.UI.Pages #region 验证邮箱是否已注册 /// - /// 验证邮箱是否已注册(模拟接口) + /// 验证邮箱是否已注册 /// public async Task CheckEmailRegistered(string email, Action onSuccess, Action onError) { @@ -338,7 +337,6 @@ namespace Kill.UI.Pages } - #endregion #region 发送验证码 @@ -447,7 +445,6 @@ namespace Kill.UI.Pages } } #endregion - #region 重置密码 @@ -465,7 +462,7 @@ namespace Kill.UI.Pages }; try { - var response = await NetworkCtrl.Instance.Post("/api/v1/auth/reset-password", requestData); + var response = await NetworkCtrl.Instance.Post("/api/v1/auth/password/reset", requestData); LoadingUI.Hide(); ResponseCodeHandler.HandleResponse(response, onSuccess: (data) => @@ -484,7 +481,48 @@ namespace Kill.UI.Pages } } #endregion + #region 当前第三方Id + private string currentFireBaseId=""; + public string GetCurrentFireBaseId() + { + return currentFireBaseId; + } + public void SetCurrentFireBaseId(string id) + { + currentFireBaseId = id; + } + #endregion + #region 验证邮箱是已绑定第三方帐号 + /// + /// 验证邮箱是已绑定第三方帐号 + /// + public async Task CheckEmailRegisteredFireBase(string email, Action onSuccess, Action onError) + { + LoadingUI.Show(); + + var requestData = new EmailCodeRequest + { + email = email + }; + + var response = await NetworkCtrl.Instance.Post("/api/v1/auth/firebase/check", requestData); + + LoadingUI.Hide(); + + ResponseCodeHandler.HandleResponse(response, + onSuccess: (response) => + { + Debug.Log(response.data.firebase_bind); + bool isRegistered =response.data.firebase_bind; + onSuccess?.Invoke(isRegistered); + }, + onError: onError + ); + + + } + #endregion #region 第三方账号登录 /// /// 谷歌登录 @@ -500,20 +538,22 @@ namespace Kill.UI.Pages { LoadingUI.Hide(); Debug.Log($"谷歌登录成功: {result.DisplayName}, FirebaseID: {result.FirebaseUserId}"); + SetCurrentFireBaseId(result.FirebaseUserId); FireBaseLogin(result.FirebaseUserId, onSuccess:(response) => { Debug.Log(response.token); - + },onError:(code,message)=> { Debug.Log(message); + ShowSubPage(SubPageType.ThirdPartyBind); }); }, onError: (error) => { LoadingUI.Hide(); Debug.LogError($"谷歌登录失败: {error}"); - ToastUI.Show("100036"); // 登录失败提示 + ToastUI.Show("100042"); // 登录失败提示 } ); } @@ -535,7 +575,9 @@ namespace Kill.UI.Pages onSuccess: (data) => { Debug.Log("Firebase登录成功"); + ToastUI.ShowText("登录成功"); onSuccess?.Invoke(response.Data.data); + DataManager.Instance.SetToken(response.Data.data.token,response.Data.data.user); }, onError: onError ); @@ -550,6 +592,38 @@ namespace Kill.UI.Pages + #endregion + #region 绑定第三方帐号 + public async Task BindFireBase(string code, Action onSuccess, Action onError) + { + LoadingUI.Show(); + var requestData = new BindFireBaseRequest + { + code = code, + temp_token = currentFireBaseId, + email = currentEmail + }; + try + { + var response = await NetworkCtrl.Instance.Post("/api/v1/auth/firebase/bind", requestData); + LoadingUI.Hide(); + ResponseCodeHandler.HandleResponse(response, + onSuccess: (response) => + { + Debug.Log("绑定Firebase成功"); + DataManager.Instance.SetToken(response.data.token,response.data.user); + onSuccess?.Invoke(response.data); + }, + onError: onError + ); + } + catch (Exception ex) + { + LoadingUI.Hide(); + Debug.LogError("绑定Firebase异常: " + ex.Message); + onError?.Invoke(-1, ex.Message); + } + } #endregion } } diff --git a/Assets/Scripts/UI/Pages/Login/SubPages/LoginPasswordPanel.cs b/Assets/Scripts/UI/Pages/Login/SubPages/LoginPasswordPanel.cs index 894c4b7..2181e09 100644 --- a/Assets/Scripts/UI/Pages/Login/SubPages/LoginPasswordPanel.cs +++ b/Assets/Scripts/UI/Pages/Login/SubPages/LoginPasswordPanel.cs @@ -3,6 +3,7 @@ using UnityEngine.UI; using Kill.Managers; using Kill.Utils; using Kill.Network; +using Kill.UI.Components; namespace Kill.UI.Pages { @@ -53,6 +54,7 @@ namespace Kill.UI.Pages { // 登录成功 Debug.Log("登录成功,准备跳转主页"); + ToastUI.ShowText("登录成功"); // UIManager.Instance.OpenPage(UIManager.PageName.HomePage); }, onError: (code, message) => diff --git a/Assets/Scripts/UI/Pages/Login/SubPages/ThirdPartyBindPanel.cs b/Assets/Scripts/UI/Pages/Login/SubPages/ThirdPartyBindPanel.cs index 6d3779d..eb3af9c 100644 --- a/Assets/Scripts/UI/Pages/Login/SubPages/ThirdPartyBindPanel.cs +++ b/Assets/Scripts/UI/Pages/Login/SubPages/ThirdPartyBindPanel.cs @@ -2,6 +2,7 @@ using UnityEngine; using UnityEngine.UI; using Kill.Managers; using Kill.UI.Components; +using Kill.Utils; namespace Kill.UI.Pages { @@ -10,96 +11,67 @@ namespace Kill.UI.Pages /// public class ThirdPartyBindPanel : LoginSubPageBase { - [Header("登录按钮")] - public Button wechatBtn; - public Button qqBtn; - public Button appleBtn; - public Button googleBtn; // 谷歌登录按钮 + + [Header("输入组件")] + public InputField emailInput; + [Header("显示组件")] + public Text errorText; - [Header("返回")] - public Button backBtn; + [Header("按钮")] + public Button nextBtn; protected override void OnInitialize() { - if (wechatBtn != null) - wechatBtn.onClick.AddListener(() => OnThirdPartyLogin("wechat")); - - if (qqBtn != null) - qqBtn.onClick.AddListener(() => OnThirdPartyLogin("qq")); - - if (appleBtn != null) - appleBtn.onClick.AddListener(() => OnThirdPartyLogin("apple")); - - if (googleBtn != null) - googleBtn.onClick.AddListener(OnGoogleLogin); - - if (backBtn != null) - backBtn.onClick.AddListener(GoBack); - - // Android 平台显示谷歌登录按钮 -#if UNITY_ANDROID && !UNITY_EDITOR - if (googleBtn != null) - googleBtn.gameObject.SetActive(true); -#else - if (googleBtn != null) - googleBtn.gameObject.SetActive(false); -#endif + // 绑定按钮事件 + if (nextBtn != null) + nextBtn.onClick.AddListener(OnGetCodeAsync); } - /// - /// 谷歌登录 - /// - private void OnGoogleLogin() + protected override void OnShow() { - Debug.Log("开始谷歌登录..."); + errorText.text = ""; + emailInput.text = ""; + } - LoadingUI.Show(); - - FirebaseAuthManager.Instance.SignInWithGoogle( - onSuccess: (result) => + private async void OnGetCodeAsync() + { + string email = emailInput != null ? emailInput.text : ""; + if (string.IsNullOrEmpty(email) || !ValidationUtils.IsValidEmailStrict(email)) + { + errorText.text = LanguageManager.Instance.GetLanguage("100006"); + return; + } + await LoginPageCtrl.Instance.CheckEmailRegisteredFireBase(email, + onSuccess: async (data) => { - LoadingUI.Hide(); - Debug.Log($"谷歌登录成功: {result.DisplayName}, FirebaseID: {result.FirebaseUserId}"); + if (data) + { + errorText.text = LanguageManager.Instance.GetLanguage("100041"); + return; + } + else + { + LoginPageCtrl.Instance.SetCurrentEmail(email); + await LoginPageCtrl.Instance.SendCode(email, () => + { + // 设置验证码页面为注册场景 + var verifyPanel = GetSubPage(LoginPageCtrl.SubPageType.VerificationCode) as VerificationCodePanel; + if (verifyPanel != null) + { + verifyPanel.SetSceneType(VerificationCodePanel.CodeSceneType.bindThirdParty); + } + ShowPage(LoginPageCtrl.SubPageType.VerificationCode); + }); + } - // 调用后端绑定接口 - BindGoogleAccount(result); }, - onError: (error) => + onError: (code, message) => { - LoadingUI.Hide(); - Debug.LogError($"谷歌登录失败: {error}"); - ToastUI.Show("100036"); // 登录失败提示 + errorText.text = message; + return; } ); - } - - /// - /// 绑定谷歌账号到本系统 - /// - private void BindGoogleAccount(GoogleLoginResult googleResult) - { - string email = LoginPageCtrl.Instance.GetCurrentEmail(); - } - - private void OnThirdPartyLogin(string platform) - { - Debug.Log($"第三方登录: {platform}"); - - // TODO: 调用对应平台的SDK - switch (platform) - { - case "wechat": - // 微信登录 - break; - case "qq": - // QQ登录 - break; - case "apple": - // Apple登录 - break; - } - } } } diff --git a/Assets/Scripts/UI/Pages/Login/SubPages/VerificationCodePanel.cs b/Assets/Scripts/UI/Pages/Login/SubPages/VerificationCodePanel.cs index bf50a1b..9238139 100644 --- a/Assets/Scripts/UI/Pages/Login/SubPages/VerificationCodePanel.cs +++ b/Assets/Scripts/UI/Pages/Login/SubPages/VerificationCodePanel.cs @@ -36,7 +36,9 @@ namespace Kill.UI.Pages public enum CodeSceneType { Register, // 注册 - ResetPassword // 忘记密码重置 + ResetPassword, // 忘记密码重置 + + bindThirdParty //绑定第三方帐号 } protected override void OnInitialize() { @@ -92,10 +94,24 @@ namespace Kill.UI.Pages currentSceneType = type; } - private void OnConfirm() + private async Task OnConfirm() { string code = codeInput != null ? codeInput.GetCode() : ""; - + if (currentSceneType == CodeSceneType.bindThirdParty) + { + await LoginPageCtrl.Instance.BindFireBase(code, + onSuccess: (data) => + { + ToastUI.ShowText("登录成功"); + }, + onError: (code, message) => + { + // 显示错误 + errorText.text = LanguageManager.Instance.GetLanguage("100017"); + } + ); + return; + } // 验证验证码 LoginPageCtrl.Instance.VerifyCode(emailText.text, code, onSuccess: () => diff --git a/Assets/Scripts/Utils/MainThread.cs b/Assets/Scripts/Utils/MainThread.cs index 1084006..23925bf 100644 --- a/Assets/Scripts/Utils/MainThread.cs +++ b/Assets/Scripts/Utils/MainThread.cs @@ -39,8 +39,17 @@ namespace Kill.Utils { if (action == null) return; - // 如果已经在主线程,直接执行 - if (_instance != null && _instance.gameObject != null) + // 编辑器环境下,如果调度器未初始化,直接执行 +#if UNITY_EDITOR + if (_instance == null) + { + action?.Invoke(); + return; + } +#endif + + // 如果调度器已初始化,加入队列 + if (_instance != null) { lock (_lock) { @@ -49,8 +58,7 @@ namespace Kill.Utils } else { - // 如果调度器还没初始化,延迟执行 - Debug.LogWarning("MainThread 未初始化,尝试延迟执行"); + // 真机环境下调度器应该已初始化,如果未初始化则直接执行 action?.Invoke(); } } diff --git a/Assets/StreamingAssets/google-services-desktop.json.meta b/Assets/StreamingAssets/google-services-desktop.json.meta index b5e04e4..67700b6 100644 --- a/Assets/StreamingAssets/google-services-desktop.json.meta +++ b/Assets/StreamingAssets/google-services-desktop.json.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e86b33b2ff0aaba4b90c494668bbb115 +guid: c24a7550296d5d54d91f866dd40936db TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/StreamingAssets/language.ab b/Assets/StreamingAssets/language.ab index 6726167..053d55c 100644 Binary files a/Assets/StreamingAssets/language.ab and b/Assets/StreamingAssets/language.ab differ diff --git a/Assets/StreamingAssets/language.ab.manifest b/Assets/StreamingAssets/language.ab.manifest index 8835540..5948615 100644 --- a/Assets/StreamingAssets/language.ab.manifest +++ b/Assets/StreamingAssets/language.ab.manifest @@ -1,15 +1,15 @@ ManifestFileVersion: 0 -CRC: 1723046804 +CRC: 749593259 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 797f6f2f02274927028e5eb11bb9976e + Hash: 81a8de0bb4c5928c43220b249b335c6b TypeTreeHash: serializedVersion: 2 Hash: 5ad585dd02dfb5016c0dad519eab8f49 IncrementalBuildHash: serializedVersion: 2 - Hash: 797f6f2f02274927028e5eb11bb9976e + Hash: 81a8de0bb4c5928c43220b249b335c6b HashAppended: 0 ClassTypes: - Class: 49 diff --git a/Assets/StreamingAssets/list.json b/Assets/StreamingAssets/list.json index 6b62bd4..74d5909 100644 --- a/Assets/StreamingAssets/list.json +++ b/Assets/StreamingAssets/list.json @@ -1,30 +1,55 @@ { - "version": "1.0.0", + "version": "1.0.1", "assetbundles": [ { - "name": "common", + "name": "common.ab", "size": 12854223, "md5": "c2fa51b131e3d8a65d4134c8670ee99b" }, { - "name": "language", - "size": 2141, - "md5": "e11b0286b48552dc19ca3c556b2bf1fd" + "name": "language.ab", + "size": 2226, + "md5": "6e10d9c8c23778a25684dd8d69350510" }, { - "name": "ui_common", + "name": "ui_common.ab", "size": 12606, "md5": "1dfaf11957a90b775e0be5f6fe37452b" }, { - "name": "ui_homepage", + "name": "ui_homepage.ab", "size": 9787, "md5": "4c4595943f5c31673338e2ca83147ee8" }, { - "name": "ui_loginpage", - "size": 242126, - "md5": "55c7e98bc05f6114de0a1445c68d7ea5" + "name": "ui_loginpage.ab", + "size": 241923, + "md5": "520989d12bfdae3368c3fd88f8381d3e" + }, + { + "name": "common.ab.manifest", + "size": 2173, + "md5": "7f35fb8fc14986f31d17c6483a90b4f3" + }, + { + "name": "language.ab.manifest", + "size": 473, + "md5": "335cc7d7481861141ee8e6fff52f3976" + }, + { + "name": "ui_common.ab.manifest", + "size": 2905, + "md5": "a05683fbffe6068095d6b7ef877f0ef4" + }, + { + "name": "ui_homepage.ab.manifest", + "size": 2419, + "md5": "c3971548d08125ef72bade017cebabdc" + }, + { + "name": "ui_loginpage.ab.manifest", + "size": 4757, + "md5": "99941302876547c4759f674f80fee5db" } ] } \ No newline at end of file diff --git a/Assets/StreamingAssets/ui_loginpage.ab b/Assets/StreamingAssets/ui_loginpage.ab index 810cc6d..8a25ca6 100644 Binary files a/Assets/StreamingAssets/ui_loginpage.ab and b/Assets/StreamingAssets/ui_loginpage.ab differ diff --git a/Assets/StreamingAssets/ui_loginpage.ab.manifest b/Assets/StreamingAssets/ui_loginpage.ab.manifest index b550189..f202b4f 100644 --- a/Assets/StreamingAssets/ui_loginpage.ab.manifest +++ b/Assets/StreamingAssets/ui_loginpage.ab.manifest @@ -1,15 +1,15 @@ ManifestFileVersion: 0 -CRC: 4164004111 +CRC: 4028950989 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 7ac2dfa1ef8c51780a36380c1952f749 + Hash: 59dce4d2a0ce9e0ae41212946c77f075 TypeTreeHash: serializedVersion: 2 - Hash: 91ff5ca08bee0306c72c34bd9a34b897 + Hash: 70589c2c13c216b3c5fa3022c1dc899e IncrementalBuildHash: serializedVersion: 2 - Hash: 7ac2dfa1ef8c51780a36380c1952f749 + Hash: 59dce4d2a0ce9e0ae41212946c77f075 HashAppended: 0 ClassTypes: - Class: 1 @@ -34,6 +34,8 @@ ClassTypes: Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 271b50f7241504b49a6a7493d13721e7, type: 3} +- Class: 114 + Script: {fileID: 11500000, guid: f53257c6334f5224a8c3d192d5653d1c, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - Class: 114