From bffaa9d221e2f0e547067bf545fd659ec7fef38c Mon Sep 17 00:00:00 2001 From: ci-gitlab Date: Tue, 8 Mar 2022 16:05:01 +0800 Subject: [PATCH] feat:update upm --- CHANGELOG.md | 197 ++++++++++++++++++ CHANGELOG.md.meta | 3 + Documentation.meta | 8 + Documentation/README.md | 257 ++++++++++++++++++++++++ Documentation/README.md.meta | 7 + Plugins.meta | 8 + Plugins/TapTap.Bootstrap.deps.json | 233 +++++++++++++++++++++ Plugins/TapTap.Bootstrap.deps.json.meta | 7 + Plugins/TapTap.Bootstrap.dll | Bin 0 -> 28672 bytes Plugins/TapTap.Bootstrap.dll.meta | 33 +++ Plugins/TapTap.Bootstrap.pdb | Bin 0 -> 14088 bytes Plugins/TapTap.Bootstrap.pdb.meta | 7 + README.md | 254 +++++++++++++++++++++++ README.md.meta | 3 + VERSIONNOTE.md | 7 + VERSIONNOTE.md.meta | 7 + package.json | 14 ++ package.json.meta | 7 + 18 files changed, 1052 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 CHANGELOG.md.meta create mode 100644 Documentation.meta create mode 100644 Documentation/README.md create mode 100644 Documentation/README.md.meta create mode 100644 Plugins.meta create mode 100644 Plugins/TapTap.Bootstrap.deps.json create mode 100644 Plugins/TapTap.Bootstrap.deps.json.meta create mode 100644 Plugins/TapTap.Bootstrap.dll create mode 100644 Plugins/TapTap.Bootstrap.dll.meta create mode 100644 Plugins/TapTap.Bootstrap.pdb create mode 100644 Plugins/TapTap.Bootstrap.pdb.meta create mode 100644 README.md create mode 100644 README.md.meta create mode 100644 VERSIONNOTE.md create mode 100644 VERSIONNOTE.md.meta create mode 100644 package.json create mode 100644 package.json.meta diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d64f3e1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,197 @@ +# ChangeLog + +## 3.6.1 + +### Dependencies + +- TapTap.Login v3.6.3 +- TapTap.Common v3.6.3 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.6.1 + +### Dependencies + +- TapTap.Login v3.6.1 +- TapTap.Common v3.6.1 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.6.0 + +### Dependencies + +- TapTap.Login v3.6.0 +- TapTap.Common v3.6.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.5.0 + +### Dependencies + +- TapTap.Login v3.5.0 +- TapTap.Common v3.5.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.4.0 + +### Dependencies + +- TapTap.Login v3.4.0 +- TapTap.Common v3.4.0 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 + +## 3.3.0 + +### Dependencies + +- TapTap.Login v3.3.0 +- TapTap.Common v3.3.0 +- LeanCloud.Realtime v0.9.11 +- LeanCloud.Storage v0.9.11 + +## 3.2.0 + +### New Feature + +- 支持云存档 + +### Dependencies + +- TapTap.Login v3.2.0 +- TapTap.Common v3.2.0 +- LeanCloud.Storage v0.9.5 +- LeanCloud.Realtime v0.9.5 + +## 3.1.0 + +### New Feature + +- `TDSUser` 新增好友系统操作 + +### Dependencies + +- TapTap.Login v3.1.0 +- TapTap.Common v3.1.0 +- LeanCloud.Storage v0.9.2 +- LeanCloud.Realtime v0.9.2 + +## 3.0.0 + +TapSDK 3.0 开始,我们在单纯的 TapTap 登录之外,还提供了一个内建账户系统供游戏使用:开发者可以直接用 TapTap OAuth +授权的结果生成一个游戏内的账号(TDSUser),然后用该账号保存更多玩家数据。同时,我们也支持将更多第三方认证登录的结果绑定到这一账号上来(以及后续的解绑操作)。 + +### New Feature + +- 新增 `TDSUser` 用于内建账户系统操作 + +### BreakingChange + +- `TapBootstrap` 接口仅保留 `TapBootstrap.Init(tapConfig)` 接口 + +### Dependencies + +- LeanCloud.Storage v0.8.2 +- TapTap.Login v3.0.0 +- TapTap.Common v3.0.0 + +## 2.1.7 + +### Dependencies + +- TapTap.Common v2.1.7 + +## 2.1.6 + +### Dependencies + +- TapTap.Common v2.1.6 + +## 2.1.5 + +### Dependencies + +- TapTap.Common v2.1.5 + +## 2.1.4 + +### Optimization and fixed bugs + +- 优化多语言相关 + +### Dependencies + +- TapTap.Common v2.1.4 + +## 2.1.3 + +### Feature + +* 新增繁中、日文、韩文、泰文和印尼语多语言配置 + +## 2.1.2 + +### BreakingChange + +* 废弃 OpenUserCenter 接口 + +### Dependencies + +* TapTap.Common v2.1.2 + +## 2.1.1 + +### Feature + +* 新增篝火测试资格校验 + ``` + TapBootstrap.GetTestQualification((bool, error)=>{ }): + ``` +* 通过 TapConfig 进行初始化配置 + * 新增 TapDBConfig 用于 TapDB 初始化配置 + * 新增 ClientSecret 用于 TapSDK 初始化 + ```c# + //建议使用以下 TapConfig 构造方法进行初始化 + var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientSecret("client_secret") + .RegionType(RegionType.CN) + .TapDBConfig(true, "gameChannel", "gameVersion", true) + .ConfigBuilder(); + TapBootstrap.Init(config); + ``` + +### Breaking changes + +* LoginType 删除 Apple、Guest 登陆方式 +* TDS-Info.plist 删除 Apple_SignIn_Enable 配置 +* 废弃 Bind 接口 +* TapConfig 构造方法参数修改 + +### Dependencies + +* TapTap.Common v2.1.1 + +## 2.1.0 + +### Feature + +* 支持性改动用于 TapTap.Friends + +### Dependencies + +* TapTap.Common v2.1.0 + +## 2.0.0 + +### Feature + +* TapTap Bootstrap + +### Dependencies + +* TapTap.Common v2.0.0 \ No newline at end of file diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta new file mode 100644 index 0000000..419383c --- /dev/null +++ b/CHANGELOG.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7388165be5344a9682382768c5fce466 +timeCreated: 1616755935 \ No newline at end of file diff --git a/Documentation.meta b/Documentation.meta new file mode 100644 index 0000000..1130a03 --- /dev/null +++ b/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd03b50332353477c899419b5b455fb0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation/README.md b/Documentation/README.md new file mode 100644 index 0000000..2564c0c --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,257 @@ +# 使用 TapTap.Bootstrap + +## 使用前提 + +使用 TapTap.Bootstrap 前提是必须依赖以下库: +* [TapTap.Common](https://github.com/TapTap/TapCommon-Unity.git) +* [TapTap.Login](https://github.com/TapTap/TapLogin-Unity.git) +* [LeanCloud.Storage](https://github.com/leancloud/csharp-sdk) +* [LeanCloud.RealTime](https://github.com/leancloud/csharp-sdk) + +## 命名空间 + +```c# +using TapTap.Bootstrap; +``` + +## 接口描述 + +## 1.初始化 + +TapBootstrap 会根据 TapConfig 中的 TapDBConfig 配置来进行 TapDB 的自动初始化。 + +### 开启 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) + .TapDBConfig(true,"channel","gameVersion",true) + .Builder(); +``` +### 关闭 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) +//# .TapDBConfig(false,null,null,false) + .EnableTapDB(false) + .Builder(); +``` +### 初始化 +```c# +TapBootstrap.Init(config); +``` + +## 2.账户系统 + +> 登陆成功之后,都会得到一个 `TDSUser` 实例 + +### 使用 TapTap OAuth 授权结果直接登陆/注册账户系统 + +```c# +var tdsUser = await TDSUser.LoginWithTapTap(); +``` + +### 游客登陆 + +```c# +var tdsUser = await TDSUser.LoginAnonymously(); +``` + +### 使用第三方平台授权登录/注册账户 + +```c# +var tdsUser = await TDSUser.LoginWithAuthData(Dictionary authData, string platform, +LCUserAuthDataLoginOption option = null); +``` + +### 绑定第三方平台授权 + +```c# +await TDSUser.AssociateAuthData(Dictionary authData, string platform); +``` + +### 退出登陆 + +```c# +TDSUser.Logout(); +``` + +## 3.好友系统 + +### 申请成为好友 + +```c# +TDSUser tom, jerry; +await tom.ApplyFriendship(jerry); +``` +申请成功的回调中,我们会得到一个 LCFriendshipRequest 的实例,这个实例中包含了两个用户: +- sourceUser,指请求的发起方,上面的例子中就是 `tom`。 +- friend,指请求的目的方,上面的例子中就是 `jerry`。 + +tom 也可以在申请好友的时候,添加更多的属性,例如 tom 希望加 jerry 为好友的时候,也设定一个名为 cat 的圈子,可以这样操作: + +```cs +Dictionary attrs = new Dictionary { + { "group", "cat" } +}; +await tom.ApplyFriendship(jerry, attrs); +``` + +### 获取好友申请列表 +好友申请有三种状态: + +- `pending`,对方没有回应,还处于等待中。 +- `accepted`,对方已经接受,现在双方成为好友。 +- `declined`,对方已经拒绝。 + +好友请求创建之后默认是 `pending` 状态。 + +jerry 这里可以通过 `friendshipRequestQuery` 来查找不同状态的请求。例如 jerry 想看看新的好友请求,可以这样操作: + +```cs +LCQuery query = jerry.GetFriendshipRequestQuery(LCFriendshipRequest.STATUS_PENDING, false, true); +ReadOnlyCollection reqs = await query.Find(); +foreach (LCFriendshipRequest req in reqs) { + Console.WriteLine(req); +} +``` + +### 处理好友申请 + +jerry 对于新的好友请求,可以同意或者拒绝,也可以什么都不做,无视这些请求,甚至直接删除。这些操作我们都是支持的,请看下面的示例: + +```cs +LCFriendshipRequest tomRequest, tuffyRequest, otherRequest; +await jerry.AcceptFriendshipRequest(tomRequest); +await jerry.DeclineFriendshipRequest(tuffyRequest); +await jerry.DeleteFriendshipRequest(otherRequest); +``` + +注意: +* 在 jerry 拒绝了 tom 的好友请求之后,如果 tom 再次请求成为 jerry 的好友,tom 在执行 applyFriendshipInBackground 时会直接得到错误的应答,表明 jerry 不想和 ta 成为好友。 +* jerry 同意了 tuffy 的好友请求之后,它们就成为了好友,之后两个人中任何一人再次调用 applyFriendshipInBackground 申请横位好友时,也会直接得到错误的应答,表明它们已经是好友无需再次申请。 +* jerry 删除陌生人的好友请求后,对方还可以再次发起请求。 + +### 响应好友变化通知 + +TDS 好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。好友状态变化的接口包括 + +```cs +public class FriendshipNotification { + public Action OnNewRequestComing { get; set; } + public Action OnRequestAccepted { get; set; } + public Action OnRequestDeclined { get; set; } +} +``` + +其中: +- onNewRequestComing 表示有其他人申请成为当前用户的好友,通过调用 `LCFriendshipRequest#getSourceUser()` 方法可以获得发起方用户信息。 +- onRequestAccepted 表示当前用户的好友申请被对方通过,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 +- onRequestDeclined 表示当前用户的好友申请被对方拒绝,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 + +开发者可以通过 `TDSUser#registerFriendshipNotification` 来注册通知接收器,通过调用 `TDSUser#unregisterFriendshipNotification` 来取消通知接收器。 + +### 获取好友列表 + +调用 `TDSUser#friendshipQuery()` 可以得到查询好友的 `LCQuery` 实例,之后调用 `LCQuery#findInBackground()` 方法就可以得到好友列表。示例如下: + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +``` + +LCFriendship 里面会包含两个用户: + +- `LCFriendship#getLCUser(LCFriendship.ATTR_USER)` 得到的是 jerry 自己; +- `LCFriendship#getLCUser(LCFriendship.ATTR_FOLLOWEE)` 得到的就是另一方的用户信息。 + +### 删除好友 + +成为好友关系的两个用户,之后也可以单方面删除好友。例如 jerry 不想再和 tom 成为好友,那只需要在自己的好友列表中删除包含 tom 的那条 LCFriendship 记录即可: + +```cs +await friendship.Delete(); +``` + +### 查询好友关系 + +我们使用 LCQuery 可以单独查询两个用户是否为好友关系。 + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +query.whereEqualTo("followee", tom); +int count = await query.Count(); +if (count > 0) { + // tom is a friend of jerry. +} else { + // tom isn't a friend of jerry. +} +``` + +这一查询是通过网络发送到服务端执行的,一般情况下,我们推荐开发者在游戏启动时拉取一次当前登录用户的好友列表,然后缓存在本地,以后需要检查另外玩家是否为当前用户的好友时,直接从缓存中查询即可。如果担心好友数据变化,缓存没有得到及时更新,可以调用前面「响应好友变化通知」的方法,对好友数据更新进行监听,这样在绝大部分时候数据同步都是可以保证的。 + +## 4.云存档 + +### 构建云存档元数据 + +```c# +var gameSave = new TapGameSave +{ + Name = "GameSave_Name",// 存档名称 + Summary = "GameSave_Description", // 该字段会作为展示给用户的实际存档名 + ModifiedAt = DateTime.Now.ToLocalTime(), // 原文件修改时间 + PlayedTime = 1000L, // 游戏时长,单位 ms (非必填) + ProgressValue = 100, // 游戏进度 ,单位 int (非必填) + CoverFilePath = pic, // 游戏封面,可以传入一个本地文件路径,SDK 限制为 png/jpeg 格式 + GameFilePath = dll // 存档源文件,可以传入一个本地文件路径 +}; + +``` +### 保存存档 + +保存存档时,会去检查当前`TDSUser`是否已经登录以及元数据。 + +同时 SDK 在上传时会去限制存档本身以及相关联的两个文件( Cover 以及 GameFile )的权限为当前用户本身。 +```c# +await gameSave.Save(); +``` + +### 查询当前用户的所有存档 + +```c# +var collection = await TapGameSave.GetCurrentUserGameSaves(); + +foreach(var gameSave in collection){ + // 存档概览 + var name = gameSave.Summary; + // 原文件修改时间 + var modifiedAt = gameSave.ModifiedAt; + // 游戏时长 + var playedTime = gameSave.PlayedTime; + // 游戏进度 + var progressValue = gameSave.ProgressValue; + // 游戏封面 + var coverFile = gameSave.CoverFile; + // 存档源文件 + var gameFile = gameSave.GameFile; + // 源文件下载地址 + var gameFileUrl = gameFile.Url; +} +``` + +### 查询当前用户存档 + +我们使用 `LCQuery` 来查询当前用户的云存档。 + +SDK 查询封装了一个限定方法用于查询当前`TDSUser`的云存档。 +```c# +TDSUser user = await TDSUser.GetCurrent(); +LCQuery gameSaveQuery = TapGameSave.GetQueryWithUser(user); +// 查询 Name 为 TDSUser_GameSave_Name 的云存档 +gameSaveQuery.WhereEqualTo("name","TDSUser_GameSave_Name"); +var collection = await gameSaveQuery.Find(); +``` \ No newline at end of file diff --git a/Documentation/README.md.meta b/Documentation/README.md.meta new file mode 100644 index 0000000..125a6de --- /dev/null +++ b/Documentation/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 17ed6166c017a4fcda77ff618f2703db +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins.meta b/Plugins.meta new file mode 100644 index 0000000..bbcf194 --- /dev/null +++ b/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc389bcfbbddc4d35a997cbc06799975 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.deps.json b/Plugins/TapTap.Bootstrap.deps.json new file mode 100644 index 0000000..1229ab6 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.deps.json @@ -0,0 +1,233 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "TapTap.Bootstrap/1.0.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "TapTap.Common": "1.0.0", + "TapTap.Login": "1.0.0", + "Common": "1.0.0.0", + "LiveQuery": "1.0.0.0", + "Storage": "1.0.0.0", + "Storage.Unity": "1.0.0.0", + "UnityEngine": "0.0.0.0" + }, + "runtime": { + "TapTap.Bootstrap.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "TapTap.Common/1.0.0": { + "runtime": { + "TapTap.Common.dll": {} + } + }, + "TapTap.Login/1.0.0": { + "dependencies": { + "TapTap.Common": "1.0.0" + }, + "runtime": { + "TapTap.Login.dll": {} + } + }, + "Common/1.0.0.0": { + "runtime": { + "Common.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "LiveQuery/1.0.0.0": { + "runtime": { + "LiveQuery.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Storage/1.0.0.0": { + "runtime": { + "Storage.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "Storage.Unity/1.0.0.0": { + "runtime": { + "Storage.Unity.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "UnityEngine/0.0.0.0": { + "runtime": { + "UnityEngine.dll": { + "assemblyVersion": "0.0.0.0", + "fileVersion": "0.0.0.0" + } + } + }, + "LC.Newtonsoft.Json/11.0.0.0": { + "runtime": { + "LC.Newtonsoft.Json.dll": { + "assemblyVersion": "11.0.0.0", + "fileVersion": "11.0.1.0" + } + } + }, + "Realtime/1.0.0.0": { + "runtime": { + "Realtime.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "LC.Google.Protobuf/3.14.0.0": { + "runtime": { + "LC.Google.Protobuf.dll": { + "assemblyVersion": "3.14.0.0", + "fileVersion": "3.14.0.0" + } + } + }, + "System.Memory/4.0.1.1": { + "runtime": { + "System.Memory.dll": { + "assemblyVersion": "4.0.1.1", + "fileVersion": "4.6.27617.2" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/4.0.4.1": { + "runtime": { + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.1", + "fileVersion": "4.0.0.0" + } + } + }, + "System.Buffers/4.0.2.0": { + "runtime": { + "System.Buffers.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Numerics.Vectors/4.1.3.0": { + "runtime": { + "System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.25519.3" + } + } + } + } + }, + "libraries": { + "TapTap.Bootstrap/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "TapTap.Common/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "TapTap.Login/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Common/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LiveQuery/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Storage/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Storage.Unity/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "UnityEngine/0.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LC.Newtonsoft.Json/11.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Realtime/1.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "LC.Google.Protobuf/3.14.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Memory/4.0.1.1": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Runtime.CompilerServices.Unsafe/4.0.4.1": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Buffers/4.0.2.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "System.Numerics.Vectors/4.1.3.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Plugins/TapTap.Bootstrap.deps.json.meta b/Plugins/TapTap.Bootstrap.deps.json.meta new file mode 100644 index 0000000..92c4277 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 31cab863b627d4a509bd0f259bcf6a31 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.dll b/Plugins/TapTap.Bootstrap.dll new file mode 100644 index 0000000000000000000000000000000000000000..d61922d0ced5b0403f7a198ece82ce2a2d596093 GIT binary patch literal 28672 zcmeHwdwd(!mH(NMG4KXO1n@JT3Vo`PfB5dZD@g(7TTo?-A5siwoCbS*)6ne*|z+`?|aUjk;Zlc z-QQ>X`RpI7pfl%n&%Ni|b6+zf({jZ}$wfqNeBXVS=pkJBvsU1HgHebhv;HPR5BQ&* z{gBrD?Cg%-WUjJ5o9W3W`YO8;>2xMvx!bJF4yG%U>B`2|_R79Yw^RVxK`qO6knoJ!FAPcW^nuE^9msN{BhB)>sgim zD_$*Y98K|i_&05b8_ zYBwnPR1)o~&E~RQprma_fv}@j;p_OUMR(O^%~S@8+*Ue{FWXAv>-elCTIV1Iy^Z6F z54TMx4^6!g#x@XX!u_vr#a1Mw(87DoEBCO{?zvZ`#ci_V8hu%o#$R(KAw_$0>u zFKd-E=GCa*m6;4QGljua0A*U;dd3e}HB;3G+d5^f<|>w+I~xik9)wIE zW|%{4j7*%%D!OJIJ%1csJ&ulyqmeGkUKP=F)L)1C5%%acUep$t95iBD{4BKiRM|BK zI5nXh1jebdQKn7=ybBE@J{|HGEd`h%4bjt)IkV2D0K3C}EyERcMPn4Nfcgjm=8lm* zf^gyL8bPdZEgwNhaXqNSaYVVg3gul?i}FaD=-;6iwD?Sz$j(QQXT>wKfCr2k*QDy8 zk*frenGG<=dR4VK?#NO0r4Z$ruJ{}KdMl0ySEd zLWVK!nXFjLCFt$OyG1q1AMjb4s|1>W7vzUmnXrWZvXrs>E(R%OzZKI3IB3kg9=#fD29(s8}6V4v~y?Bfbdb76!9_M2XyD z;0N?LlDNS4xW@7`OQ2Kv8V1#pU{-`nRUr&Vqb8Uwcj#jT8_1SxFb}zP9?wPw12T|V z4gl4&S#<@Mu3D;RuLc!g35v%ukKJ=|#Sr4L3p6l-@-lW&k&Ic)Xgp>WJC50-+M?pf zYFJ?#aE{j!ws9WYz^Ik72r!pbWE{?LS*GGh!9Z25v?hmc6+15C{KBLejUyY3fFXg; ztbureA)RF7+&y~cLJ^D|>Nmr^>`4H7sLNPyhuz|wexchQ)Cpi}K#d>NAArO)JYoD! zoa-;P=km2^%?K71H%8VlUtO7cc8up;jxi?7s1jtb#svb^C5To7u%OqKLE{XNjUa1Y zI}yQXnv8KaJ+mH+7ptr}H$)Y2!W6IOuf2@mqoyL)@CK;5hA#q~6yFG#{Wx5>27z?X zubHyo8qA9BQ$`Q!$u&Vbf0QM0OuE(53D;oSb1L?-;w7TUk~n6{>cS*@gar6e~E>rQ%>}+A|V9n;dm$H~j zQAQs@9*YgkwroSO<6dQhDTfX87=;}+Fgb_~OaQpLMlkMib&p_3<61s~_TqX_sqsdG z+r^Z_W-DwWQ3~zCct;t11bK+7Yh;yN-6I&mpgkiPw78a!V3xr3pi+Ml{<{>^ORbZ7}7q!S!Q!v2T}h ze_@D7S&SVntH?Ndh08J($LQy|hQ~v$qtJI8cg(vOJ!VOQpIp!RZc zjN6RP#d4tpZg$$JO1o^0=L#AwcYGULxx$4>|79op3TAH|$BtilI&Nk=b9qnp1^9xE zS~RxyWM z74&ACz%eoj5DPpDXL_@jfz~s-nRYL%^2++lhlRj`>Iy{_q#>oPq~5H_)pfI`SM4Ry zZ-jkkRF69YImAtnKxRMBsEHC%iyq&@=p$fGQTsHZUtqI6kOYh>HBTTnX|n2D$-Avq z-=gQxr>+syCVh;K=RQ{AI7SNhF;glJ3-iVlhb;shW%Ln*T5OBafNL#rEK6x zQHiFhIcO!?H5In9zeJOH+!^s+2;)fxOwO-yFPK#AiC-n&NZ!=wMpd@Vp#H*~t$Zxl zDu?X7Y;kAA~2GH zkpo8akd2O_i`>`?xacET>#>+4Ztq=K(%LuSY>vic>Qa7Z6!L7AZ+m^>F4u>d%NfJhQ{~{Qh)RV<{4dxZGA4*%dO2!hOd1~b#&3pH z1+&QZ#t(yArN)VuUVfFPS@A=XA%3^8v^Iw+))?g-X<`03E4K~2s%QHAqW^}+YCYM+bq&IpGGv%o#>l5l+ZUTPuD4HWK^*RcM66#B9Hk9q1NM= zoFwI#%RRzZM~`qJM~@65X>^W~hodAG#ZuH0|41Q9MYcEoQI3N>pLi+RUx*Voz!g8D zC)qvA*)YZp${`R ztRLiy!yPUHBb;C%U%?qSJ0sS_3?_o2Gex%TjNRu~4HSIgo$eT4zEJRG5k&B1gFd_j zm_EEz;4;AY$Ijpv7lB{P`J%SJ@C(zb_{CiK#TSQPT;vRXi8V1Z#;+oKykGl93Vtny zS%+V4`f9CT7NXS7h7X6?5?5wFUpM4RHGBqE8n5TMZHXTOR-T8T?=c__2mB>M#I5FnNj} z%!MC(arnVS&ftew6EkD{D6%K|(Y?3e#|1F#=qDFV#+*G<#?pllasFY^y&KNy!}Vaq zTX`zI6`qxOVxIUXfLKc}tLstE$U43rTniZU=)B5Rzx1ROX8}h4LB5_U$7oX%DVKw# z+t?%)*N`v!O)QdfKv$ccGH=YQb~|bTR26wg8c@)x$gA_pTYaKaA7(CQ;)8s3?02LV zuk3fqjHnUz7lyEphp^a`Mn`>)AzWk^f@qK7ldlzG$i9w=A%-W-k{I%d3o)#VBRvA~ zPXT298X$<9%D3Zc?cZ2S_l{tD2Zz=J#xy;S39b4>tIjtq+(G>yUrv={R?}qv#zkP{ z(=c*kN{C$$BU0KIzmwUrK`V0ON5NG0N%(G7qPMU=;~HJ@V@xWL5QvEA?UK@_NBnM~ZWy z!g?XS!y6P?EySMK8M9gx**>*e*n7|X2Mc|(5mp_2qS@kG3q%29y$jAFvx%La zqH&%h#oaZ@_-EL?&jLuMV+h!p&ILKsFXgK`sUp+S;ngqwP7JVsGo7!e$}vN!Oy_dQ z^v|TIkF{PPzuMXVCC0N2@Y2k3cWzT{zV%cRTdq zc9d4<^+zFDs8#919bjdWn2?RkV{Dc0GhYW=bI00pFATfoc0%TFp(Vz@^?t^U%yFn- zGUl5X@yCHLj9C@#Emr80TNz4>-IuhduPC05XGnd>oq00ewxG3`OD@ADXw;!6NY8x` z$|Kvr(T5de=?J@OGcIQa8}<&z02g{*a>HVF3wkg2Z8S^nPDdSrBoBJLVMxF*3D?`s2x$m>=2LMP$IZsGq zCaD-nTX3w9>HRED#tG8+QIvJ&VgxOohlnl37cI4OaVwfOX3od>rTNlNS3-n-+JOt^ z{6^Kt8vVqG!ZOdG23f`UE`(zh<8rtQv6CUpe^H@VO%>V6dvCM@99Q-JMo>0FCt0U2hoN2BKGnQ2Xcnb zGJH0ZGF+bLlSvkhokdW2WYCv=Unwz2^E3R3_l}Yh`a879pbFnheuG}~eJW(oM+LSB zyh`AY1pdnVsZfBf^|yr$@-3AxE27__F{eJvr8*;wukhW0vPP84{=n!7MrfJA_+;(EQiB#~&jlis)R?nd^SUB* zzs~siuyZqwh!>jH6O7RZW9gVd-wkl7heY#>q3?Jiv|lXGfQ~^ImvD{yQ14{wF+!oq z^ja{4*1q6r3!hKdV+a`Z@sdv?CM9TzL32ylmtEnuaDc8x1OjxOm;L&5kmE2MWc*gK z{I;Lsv z#~@pQeD(;nHmE4CP#+deAM&5eU1CuYq1yak2oK=NPN`52i!6*xWX(@S*h-Yn7RnS^ zjIe)%Y{;S(3iT>9oA8{V7Og3zSr|hraEJd2p&}Nwom?2KI{e!P*-p9^R43AU1;)WH zk#SCM!|aq0>JviEq%LyJE+vey{g7z*{1J4Y;E8PQXw2KLhC>==1(%bg}o#4xMj` z&T)}G0eFx0j6?doga0%CN;<6n+CLf5{Vm{w^bVv$Zcjj?tpb+;7Hcm7{}1$p!&(WX zKZWn77drB9G%__iqw9h+Qb*}JNk7+r_tsb16 z{=3nhAIH{DXwN1{mCf6=?IKNx<*UF~Wj_$gIc%OghOf~N>1ru;@H9Hy{?)vK;PaH{ zXP)b!sXkA6=0&d$=(M?#=^Lirh*{4?DWP7~Skpyc7wT4;7yTIC7dkGK()7^xggPYU zJhX8(;d3jsd2SAP=%`SyYFvYdUJ>dDtt|N{T6oqR);u!x!zIsS23#PNvT0DQP^xx= zRyt%}>Tt-sv|%n=xxsh9sKc8Oms`}eMk%O07PTo>hqoK{ThtY?QcyQq)XCD12LklC zMZHn_DNxT_)cwZMK#=r#s)k36&w?tqs9F9WV)i@VqLv_QL$t}F`b+K&glU&Woo6tW zwWzlvUjj91QPTpYxbOW*i}Hagp$CLIM2}!?Dy3##!mVB@rR|EM9{&T-Ju1|#6fAuV z)K4wySnLO&Ub84Fc>&by1w|`SS}T-_Zj|nH$YS(0MNvcGB;GAL?$9iwNoTVaRc;d9 zER^c8a{8DwJ1GU3hIXzbrJe@ zD!pJ)ZRp#n^rA%#xCXUp^mB{aDb%kNMK^|j8JI?I3Uw>(^t=J;KP{@%`*z?gde@>V zLT?8u@MwztyOl!0w*xaNY*BB9-wssLB#X*=-VV&6=@wNLdjs#Q&atQ{sQGk`MOAzC z-~w7~Q6$V>A^+RZc&ROdT=Ri zx2R3gdBNp$n?*eltO50+MV-{o4X&WY=O~ZnxGo8vThL6JwhF!JHs~wFQk99Wd9JpHMo|_tJ%s8^bg^? zgX?ICMLib%da#i;TGZj_cY+&er$yZj>LSWp)P1pMf*Wb!LS^N{v40L;Lf2W;g`r=7 z`a6r-8S?ARR8}LJGWRr7g;1|*zbUDsX4*MM);mUa-x%2gLY>rp6E#rocI?lIPHMk3 zrh~dqC^bv9&@+~dHCyPq#YN2)`YVfK*(Q2oNl~_mek_!-(n=?UQX{98UKQ$ET28MA zTj}2{>Ra?CsJE1+@5}z*fqKWHp7Lv9Vf2zSw~qIYv=TQ7h&m#KHgw~WrgoBN=tRRG+0{dqR$nq+3oqM zaDJ<^{&k{rNti9z96r;oag~<3v8yXB)v#w`xYN%ze;i}YJ*5oSmoNv5DDVx?xAC7x zoj6N>9%c9fG@H`|Q9;eg{^}9atH6;JmW~Z#wM2O^6*h@$bONe+Qnv z?7-859XK8Az?o+U?|@1)l;+*uG{69z16WE+1l9?x7uY25Qi0n9-UL`q_W~O9Fmc{L zOgv-!lW>v(Z_?U4v*{+Sr{rupqOs-??LtghN3?Idm*PBjRk#lL;?fHMH%Hb(^Y0@U z(^`^>jq+f07#fAEvKjXZbN$JK#S`4{QI& zb2so$;!N|f_D0|y;MaM-0DM{K9(qpuk^U9n*ShYele8uH0N~Ex!}O+hoACs_37cnQ z)Kb~g^n0|n6nJ&uhj=W)_?vWrw+@ltQTk8h7tTrOmm=nOd0z+Q7EYq`0)IrbnNuO0 z3gOHX&3W{Qr$(Dc1L0NLLTUd(y28~A{6NW0Z8@!r_5=PVI;chUk9ZBVoY3Y3Jpx~* z=_&t^wi=~w(oWL#r61861)r_Yi+)Kv2kqfii|cKcdYh%*0qrjDDQ!UGwhd_K1^jx4 zv}C(zZWqn%qIr^9Ty?ZW|7moUzC?c^x&bg5-Kw9Y2fThgB&`ieYeTdx`a{~L9gFqr z-E>RvIzaZQTfFP0ha)vwN@__7KPCK=+PkI4^?Lo3e>?i_>%lto+B^F5dY-nHysRIj zUtrJn96js$HSk)*;j7xqB_7vvv@je3T!rjduOQ}gx>adh*l75*c znKn(kr?lNQO}iEFBz;}K!u2NoF^WFL4kqFHE3t69Sh!uvPLjGNp{{0alGIfpmgmvK z?r*t1EBap){V$4sh3Hp^eud~ai+;24n}y$OwfTwQ9QP5zZVYgaYb)Rdu_dkt#O9-7 z^HH%mTmRSS^ZF6lf7NSSOa9%R)HpH&8b>Cn)glf98pmWnp(tZ_YSPjm0@p`*>ygtS|-rJH^ko?&d$&+#lX-jNo%#dkNn?$<)-)0?z9?Wor@ zCRz9=ya$asZJEcfM{pj!$B1A?{CmI)t0VoC!p zr$d0N=q|w3^fusH>hSyMaT@T)=t#bX6Zj^ePX9r};QwAY9*uRv0?PqwF+Vqj zYB3wP0Zyj@z`1k)u$sOKxQxCFcs@N3*gz)%FA;t_V5N2?y&jsYchSF zT%gOv(zyZ~1a=9$R^Vp@en;TX1-jgBy96E;_=>>F65$IxD)1G7m8Hx-E|8*(*U)CnmHY9w z#JA{Wa%*$7HtieQceUrVpKAZ2{aX9IHbtMUcj|wse^&pB{;2+x9&_F7`VUvkeaQW? z`yF?c=ewStdw%P=+3;hvkDwnX^QM9BG-hG_-x*{0R_R>8;|9Oryu!Z_FkiA5aE-xm zZOID283EP|2@HD}FAFl@caHXz$0#kkGR%^_zooBb&Ue*xa-OHT+0A; ztSfxSwHy$;GOXGfR(U`0sc5B!l^gdbu-1nGr(;i`VeN?m&Om7mYkoQSwJ4$Ce&rP4 zi%~+u8b1yAQk2k;mD7PQM+qJG9A^P0u}9GGL&Dj>_tIS8DL|e2iIVCGI|2|Bzg+?B>EokDf9~PDfBboQ!%ql2YeOyGl;XVJd{pH6S! zJDq+5yn@~WRzbf5K7;-f_zc{=ngM^_0X~yX0iT5}*>rBNHUljU0G~}E;BzPfd=8ZY z|1s+IYtywxtyepw9n=0sE72F|!}{&|KkBdP=eg=#S=W&3S=T?gzUY3)o%9TN{@U{y z&o@2)?0Ma@*4Sw5Fw%y5l=ptl58pAzPO|X1(|8&?+wod$(Bcoac7@Ng*a!2+$-55w z)$wIR$O`^A^?oCIif_Z`v2W+!1n_+#1N~tjbNuKFKl;Frz7HW|BItt%Vjn@wBZzeb z5sV&ZjmcbpDlycMO5}3OSFuu?*^|uW&FqG3 z(oA>fdXxQ|GWq15WLF{&!%~=5H)nd1X|At+FyGsl$S0((CA9h?Gv6?n&6?@_mYkWr zDA8wfJ9D;JH3fRkrhr_tsjsmlZZm6@uD?2wg!7=95e2?9TsmlG zhk#9Vx<1{#C5@Vzy2Zbx)RfLITS}|*68#mOoxr)ZOYIgdrN*Q*BLRyLN*L?YneTvFo^orFFD= zOFH}B$-pI{w+7#qO!r{QTtf{hq)i^rY#W;E+uJ)g)wiri4C@=3DQD(8`Pyz~_nFx( zZNP?*XnnO!t<;ojYHg>@^&J~KH@B_d(1cqT<1>sBR;s~3{_?>Ds_n8Z6#F++Y+NAt36z6{97yJDD=K!q%RosaWg#63JA7Q{N3Y z@<}$)SZu)hH0PpaGu>tm44S!oquG^8rorVHv`*kk(rroS5_`QnngqCFIdAUHSM3;D5XrH7$o7kMq?BPO9xviNL767aKCX|-~f>^;6T)IAG3eKY| z&6+*jl~`rW?hZ6k^=y&E@?i=eb7_7^#ekY*mTu2O){^MzMOb*)kD<|T4q>t;%$~H5pmGW=UtKG?f}n9@oSJ8iCBpLSF+={=cjpKJmWJPDp&t09x#lk6GHieAx(@>!T|W-75?uv}4Yw*dLpJ=m3>C}0DL z^iWY?WxVk7NlewqouX7Sj{l|#wnNf&D(S{>E;92qDklBa*8#+@s9E)Z%-2-7}_f^sq-u>`GCs+8G6Hcwo|R!urYz1)(tVd1br_ zI}))ih-ww}CA#WUJ((;vynTe3EYCxMuyIxhG9_yw7xD>SPiQhdu<2?IN(5NqSQet+If^H?QL6DyTu>N@i# zA4}zXZ~O>rX`@Fhje?)Ce5 zOT+y7Y!7zz>3r*8zI9JqBHd$7lx-SJrHb4wY2F^9hYnyql{gh;SU8G=ZMw+Gs5-4E zsytSMn=_g^G8gA?kv?8OFqlYnWUz_BZiy#EYL|7VxY<-z6m8*_;X=Am6F5Z*%W~nQ zMI6W>2i=;b#J&W^nZ5mRENq(w`*xdId&gnzOEzS(vI1eUkk!vpLcb^X;26|xoT-q43Vt9TQkY-F=r&j=2>Dad-a-pXXkEpj^fA_M*BwW+t9>L9^n>_S*Ov=b>V1< zCbni-+??s!i%UZyl~P+3uq0)uqp_V+M~03dyeSj}lee79_zWtHq}o-fwNE&hd%Jo& zGLGXY?`WLlAlqhltWzJ$ZFGGa$H2lkkrv3b$~xAW6T3F5?NU%KEg9@!z_jMF#$=)= zoyp~sT{)X&PwBjD@gAUE?L%|c%8!unbeAjCi}kRd4;f&gUI&%1_Y5L%IAyP4Ia-IE zHVke^CGdJJ(msd1$nwt4JpSI8-JHS#Rm)MxsgBBFhayv1j!<`BQf8w<5yu2wXeIX8 zU3>$9w`d%CK6a}?Xmc*Z)M;9*hF-I4uRRQNYFflrZZJnVb=hkUDK=suhp+m)%*YNB zS&Xd+(nPHh_8{1dM)2W5w%xLB)B63%JjV{K!Bn2xV_`i=B`a<$w^3ndu${(QizN{q zBS$xDUymA#qtoVDDyI|hhHoOD1JRESntg-CHl+AAl~rd)9{D)+QwtXLP5cMYcnt8u zzBy~|N$%&h=@N6uj(}r+P-ET}$m(dZWD0iNc2IpVh#4R|B<9;K+*(5%N0sK}K2ruB zB2mN=$!aJH_W0witi)S(!$o7Eh!3*?VGzg!wRxGw4P8ZcL`R}k&@PC%_ze8Gbn%bgWh!XcM_i7XRoJzRA6QI-JB7%qtrbE27L{oae z=M2~?{^n4QqeAB=P>!=B3mdG>SQC8XsHO1FM8C6ywb$dDKtz~}+WbthO)AMDs(tvE zKnLh_ zumL5x1>_&J+DraTg_g9BZAtVZOHwG+YIE8lVcV7BtE#1vY`sdfj_v0m-z{4G@V*CB z1}&|`bCiBicx|k#lg3-5EyXTyw@mX-4=(=xa`{T=dfDHw%IDr-lP5r zBdZN@=|OKuCY5vl*;EI5nP(RYcH&JjYm6LfIhfcZ-ceUf0;|WWRPJGt`(lgICCx4bWpBGnk1@{G(~kI@%p=r0AaU zy44&_9w#d99gyz@Ck=nLfXn0eJQ~Im!4ZD^GaJi6@V0 zL{Pbt$K!(YfXX(ZWjuPCapkILrb z;BRG(KIy5{wMfM6)nau7#?g}ahsb)sJ9_UaXQnO@f_N_97BS_R5P z8{NqIq<68VY538QJHQ;6YQcl$SbcQ#IUnq_M53cFp!SLiJbKn*OAN0btBcjSjo9c* zx}obv#BD@JPrC5vleN%Bv`DNEq8_vjuS#*Fd`5X}^d|8^FT?K?wP>@qJUV(ri_OE! zje>!VCN%phsXR8KDW%OJ5uxlMXtI2>7sT~k%&S>gpi*IF6bV-9!US5uiZ^L7A4i~! zf?ge_J`OtO^P>vJ%ZS^+JcO!@&`jNn*90Q?aN$pCu~qC(#ne!#2DgMIfr_oN zAlHGI>0<|Ax=Gc53ma*&tu;lP4fJHJNyj*W!?%>ObI>19`4SsY<#6G019rKAXmi}_ zB4G(|Uu;UBDv2&q@V@qWFdNQrXQG7#My^%_0|s!&PHVRCzk z*CRsZSIop4AIjlKvEE(CVa0?^PJl>k^xmSldlI?FipR=(i>j$AuOHP}X5h85XEmNp zLnz%8Gi~>nYr7}eS8$K1XuoZJRkYvdb@`&B--zLF#c_Hg$w7GoI$$(!g#m%EeYHEQ z$?h!MR8w^Sa&M5kN18PHSOI%n%8ouB8!cjwDc)loJe4h@k0Y6p1$l!G=v-EAOk#zS4nUAR1b~b=zC_k?A>Q;Ub?jE zPd{SqF77`6T&K&c{`^(g+g+c1N}T!Lhpfi&O;Y=m|Ju2*`M<-6-SXJP^G0mqwyLrN z``97^xt#cOF07y&8VY&#z74wSFVE&|}QHAU0JuDy)qQ zwg}kr+@Tvjmk~`uV=BH&yw>`Kt1PEbR(l!<=UKug>pBotLK$SSc_Ark5m4`tig?Rm zBlG-hRm~NaT_xighFf#5%a{=<*il^GH(*2d4Omplm_-~l+eIJemdb=@BaflPMOB)-aC3RmIx-)jA{7cO4k z>_xA@lSR*(ELT}GJGW|;z09n#ml?b_X*t4in-Pgf6AH^BHb~qe_{riDB`j{Xctd^+ zQ+&7*jp7P0=j%G}J%t+ZDuv5AgsT|L3y4g5Jc#%}PjHFV0JgU1O7O5&xbWVxJC5D} z62{jDA~wXJ36zc>6xwBd8s32B&rJTIe}_K#GCU64lt~w!|KJ{Y=IWdVJzexx;^ooW zP3t>w`&ZsdS!g{oyI|ka+QqOCnY6)vvTnURCoemcFulzy^)hoVftM+;Zk8#Ow;*8Km_Ztv$1i_j`;iR`4@KHKvyZS9Ti&vz`ipnJyL z<{J+DWZ&;EU!G77y)*1{Yo4xG10K&voxzT7wtn@57$PwQ058CiuNi;7G{1;l} z?+cBNEv)_$5@xgseAe5D@8w7F6HMF`us@|POb)aa&qO)_*W(^pJDw!8;^{*tuA6Wl ztyNSXbN~7jZ`0J5S&XZ{Ys6RH#i_N7DfMZ@1%Ek2?$OzI=$mk-j_;20XP%Vmz@0jN z`jNvuKfa@9-I*4RuekeRR70EcazBsn8Bes-EINyE_f-8`j{CWY0iN{muP+)<8$X-k zI)>np_4EUBwcA#(7TOv7!=p~Ai?`SOxmax2bvDY~&n{^T-?1*X^-r<27`p=e_7$c0 zNyt`wv#70TV+rnKFD`t!ZX7z%3;d*rb@|Cn%HhHL)me)>rF_SlKiHtaRx|AIu>hGI9B)`i4AKcFW KZQ7qD0{;&sbd>-A literal 0 HcmV?d00001 diff --git a/Plugins/TapTap.Bootstrap.dll.meta b/Plugins/TapTap.Bootstrap.dll.meta new file mode 100644 index 0000000..6dcd382 --- /dev/null +++ b/Plugins/TapTap.Bootstrap.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 03acb073a9f88474581401ef1020c1c4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/TapTap.Bootstrap.pdb b/Plugins/TapTap.Bootstrap.pdb new file mode 100644 index 0000000000000000000000000000000000000000..db313c5483d6f5a4a5199b14695268e01bfb8ff8 GIT binary patch literal 14088 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 Hb#VEAs-%`8 literal 0 HcmV?d00001 diff --git a/Plugins/TapTap.Bootstrap.pdb.meta b/Plugins/TapTap.Bootstrap.pdb.meta new file mode 100644 index 0000000..1456e1e --- /dev/null +++ b/Plugins/TapTap.Bootstrap.pdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b3d6c5154fb9d4319a2a32e6fde07f63 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md new file mode 100644 index 0000000..ac2eea9 --- /dev/null +++ b/README.md @@ -0,0 +1,254 @@ +# [使用 TapTap.Bootstrap ](./Documentation/README.md) + +## 使用前提 + +使用 TapTap.Bootstrap 前提是必须依赖以下库: +* [TapTap.Common](https://github.com/TapTap/TapCommon-Unity.git) +* [TapTap.Login](https://github.com/TapTap/TapLogin-Unity.git) +* [LeanCloud.Storage](https://github.com/leancloud/csharp-sdk) +* [LeanCloud.RealTime](https://github.com/leancloud/csharp-sdk) + +## 命名空间 + +```c# +using TapTap.Bootstrap; +``` + +## 接口描述 + +## 1.初始化 + +TapBootstrap 会根据 TapConfig 中的 TapDBConfig 配置来进行 TapDB 的自动初始化。 + +### 开启 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) + .TapDBConfig(true,"channel","gameVersion",true) + .Builder(); +``` +### 关闭 TapDB +```c# +var config = new TapConfig.Builder() + .ClientID("client_id") + .ClientToken("client_token") + .ServerURL("https://ikggdre2.lc-cn-n1-shared.com") + .RegionType(RegionType.CN) +//# .TapDBConfig(false,null,null,false) + .EnableTapDB(false) + .Builder(); +``` +### 初始化 +```c# +TapBootstrap.Init(config); +``` + +## 2.账户系统 + +> 登陆成功之后,都会得到一个 `TDSUser` 实例 + +### 使用 TapTap OAuth 授权结果直接登陆/注册账户系统 + +```c# +var tdsUser = await TDSUser.LoginWithTapTap(); +``` + +### 游客登陆 + +```c# +var tdsUser = await TDSUser.LoginAnonymously(); +``` + +### 使用第三方平台授权登录/注册账户 + +```c# +var tdsUser = await TDSUser.LoginWithAuthData(Dictionary authData, string platform, +LCUserAuthDataLoginOption option = null); +``` + +### 绑定第三方平台授权 + +```c# +await TDSUser.AssociateAuthData(Dictionary authData, string platform); +``` + +### 退出登陆 + +```c# +TDSUser.Logout(); +``` + +## 3.好友系统 + +### 申请成为好友 + +```c# +TDSUser tom, jerry; +await tom.ApplyFriendship(jerry); +``` +申请成功的回调中,我们会得到一个 LCFriendshipRequest 的实例,这个实例中包含了两个用户: +- sourceUser,指请求的发起方,上面的例子中就是 `tom`。 +- friend,指请求的目的方,上面的例子中就是 `jerry`。 + +tom 也可以在申请好友的时候,添加更多的属性,例如 tom 希望加 jerry 为好友的时候,也设定一个名为 cat 的圈子,可以这样操作: + +```cs +Dictionary attrs = new Dictionary { + { "group", "cat" } +}; +await tom.ApplyFriendship(jerry, attrs); +``` + +### 获取好友申请列表 +好友申请有三种状态: + +- `pending`,对方没有回应,还处于等待中。 +- `accepted`,对方已经接受,现在双方成为好友。 +- `declined`,对方已经拒绝。 + +好友请求创建之后默认是 `pending` 状态。 + +jerry 这里可以通过 `friendshipRequestQuery` 来查找不同状态的请求。例如 jerry 想看看新的好友请求,可以这样操作: + +```cs +LCQuery query = jerry.GetFriendshipRequestQuery(LCFriendshipRequest.STATUS_PENDING, false, true); +ReadOnlyCollection reqs = await query.Find(); +foreach (LCFriendshipRequest req in reqs) { + Console.WriteLine(req); +} +``` + +### 处理好友申请 + +jerry 对于新的好友请求,可以同意或者拒绝,也可以什么都不做,无视这些请求,甚至直接删除。这些操作我们都是支持的,请看下面的示例: + +```cs +LCFriendshipRequest tomRequest, tuffyRequest, otherRequest; +await jerry.AcceptFriendshipRequest(tomRequest); +await jerry.DeclineFriendshipRequest(tuffyRequest); +await jerry.DeleteFriendshipRequest(otherRequest); +``` + +注意: +* 在 jerry 拒绝了 tom 的好友请求之后,如果 tom 再次请求成为 jerry 的好友,tom 在执行 applyFriendshipInBackground 时会直接得到错误的应答,表明 jerry 不想和 ta 成为好友。 +* jerry 同意了 tuffy 的好友请求之后,它们就成为了好友,之后两个人中任何一人再次调用 applyFriendshipInBackground 申请横位好友时,也会直接得到错误的应答,表明它们已经是好友无需再次申请。 +* jerry 删除陌生人的好友请求后,对方还可以再次发起请求。 + +### 响应好友变化通知 + +TDS 好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。好友状态变化的接口包括 + +```cs +public class FriendshipNotification { + public Action OnNewRequestComing { get; set; } + public Action OnRequestAccepted { get; set; } + public Action OnRequestDeclined { get; set; } +} +``` + +其中: +- onNewRequestComing 表示有其他人申请成为当前用户的好友,通过调用 `LCFriendshipRequest#getSourceUser()` 方法可以获得发起方用户信息。 +- onRequestAccepted 表示当前用户的好友申请被对方通过,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 +- onRequestDeclined 表示当前用户的好友申请被对方拒绝,通过调用 `LCFriendshipRequest#getFriend()` 方法可以获得对方用户信息。 + +开发者可以通过 `TDSUser#registerFriendshipNotification` 来注册通知接收器,通过调用 `TDSUser#unregisterFriendshipNotification` 来取消通知接收器。 + +### 获取好友列表 + +调用 `TDSUser#friendshipQuery()` 可以得到查询好友的 `LCQuery` 实例,之后调用 `LCQuery#findInBackground()` 方法就可以得到好友列表。示例如下: + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +``` + +LCFriendship 里面会包含两个用户: + +- `LCFriendship#getLCUser(LCFriendship.ATTR_USER)` 得到的是 jerry 自己; +- `LCFriendship#getLCUser(LCFriendship.ATTR_FOLLOWEE)` 得到的就是另一方的用户信息。 + +### 删除好友 + +成为好友关系的两个用户,之后也可以单方面删除好友。例如 jerry 不想再和 tom 成为好友,那只需要在自己的好友列表中删除包含 tom 的那条 LCFriendship 记录即可: + +```cs +await friendship.Delete(); +``` + +### 查询好友关系 + +我们使用 LCQuery 可以单独查询两个用户是否为好友关系。 + +```cs +LCQuery query = jerry.GetFirendshipQuery(); +query.whereEqualTo("followee", tom); +int count = await query.Count(); +if (count > 0) { + // tom is a friend of jerry. +} else { + // tom isn't a friend of jerry. +} +``` + +这一查询是通过网络发送到服务端执行的,一般情况下,我们推荐开发者在游戏启动时拉取一次当前登录用户的好友列表,然后缓存在本地,以后需要检查另外玩家是否为当前用户的好友时,直接从缓存中查询即可。如果担心好友数据变化,缓存没有得到及时更新,可以调用前面「响应好友变化通知」的方法,对好友数据更新进行监听,这样在绝大部分时候数据同步都是可以保证的。 + +## 4.云存档 + +### 构建云存档元数据 + +```c# +var gameSave = new TapGameSave +{ + Name = "GameSave_Name",// 存档名称 + Summary = "GameSave_Description", // 该字段会作为展示给用户的实际存档名 + ModifiedAt = DateTime.Now.ToLocalTime(), // 原文件修改时间 + PlayedTime = 1000L, // 游戏时长,单位 ms (非必填) + ProgressValue = 100, // 游戏进度 ,单位 int (非必填) + CoverFilePath = pic, // 游戏封面,可以传入一个本地文件路径,SDK 限制为 png/jpeg 格式 + GameFilePath = dll // 存档源文件,可以传入一个本地文件路径 +}; + +``` +### 保存存档 + +保存存档时,会去检查当前`TDSUser`是否已经登录以及元数据。 + +同时 SDK 在上传时会去限制存档本身以及相关联的两个文件( Cover 以及 GameFile )的权限为当前用户本身。 +```c# +await gameSave.Save(); +``` + +### 查询当前用户的所有存档 + +```c# +var collection = await TapGameSave.GetCurrentUserGameSaves(); + +foreach(var gameSave in collection){ + // 存档概览 + var name = gameSave.Summary; + // 原文件修改时间 + var modifiedAt = gameSave.ModifiedAt; + // 游戏时长 + var playedTime = gameSave.PlayedTime; + // 游戏进度 + var progressValue = gameSave.ProgressValue; + // 游戏封面 + var coverFile = gameSave.CoverFile; + // 存档源文件 + var gameFile = gameSave.GameFile; + // 源文件下载地址 + var gameFileUrl = gameFile.Url; +} +``` + +### 查询云存档 +云存档只能查询当前用户的所有存档,需要查询该用户的特定存档时,可以增加相应过滤,可参考 [查询条件](https://developer.taptap.com/docs/sdk/storage/guide/objc/#%E6%9F%A5%E8%AF%A2%E6%9D%A1%E4%BB%B6) +```c# +TDSUser user = await TDSUser.GetCurrent(); +LCQuery gameSaveQuery = TapGameSave.GetQueryWithUser(user); +// 查询 Name 为 TDSUser_GameSave_Name 的云存档 +gameSaveQuery.WhereEqualTo("name","TDSUser_GameSave_Name"); +var collection = await gameSaveQuery.Find(); +``` diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..74191cc --- /dev/null +++ b/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5330aab2c6a41699a1601f1af6b27d9 +timeCreated: 1616755935 \ No newline at end of file diff --git a/VERSIONNOTE.md b/VERSIONNOTE.md new file mode 100644 index 0000000..b2a6e0a --- /dev/null +++ b/VERSIONNOTE.md @@ -0,0 +1,7 @@ + +### Dependencies + +- TapTap.Login v3.6.3 +- TapTap.Common v3.6.3 +- LeanCloud.Realtime v0.10.0 +- LeanCloud.Storage v0.10.0 \ No newline at end of file diff --git a/VERSIONNOTE.md.meta b/VERSIONNOTE.md.meta new file mode 100644 index 0000000..4bb7039 --- /dev/null +++ b/VERSIONNOTE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d5391b17003874fb2afc3e309a3f63ef +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json new file mode 100644 index 0000000..ab5dc11 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.taptap.tds.bootstrap", + "displayName": "TapTap Bootstrap", + "description": "TapTap Develop Service", + "version": "3.6.3", + "unity": "2018.3", + "license": "MIT", + "dependencies": { + "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.6.3", + "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.6.3", + "com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.0", + "com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.0" + } +} diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..a42bf59 --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e618b9375caf846708cffea428908521 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: