2024-08-23 15:49:34 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using Module.Log;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
/// <summary>PC部分的SDK接口类</summary>
|
|
|
|
|
public abstract class SdkBase
|
|
|
|
|
{
|
|
|
|
|
public int defaultServer { get; protected set; }
|
|
|
|
|
public string loadUri { get; private set; }
|
|
|
|
|
// 防止反复发送LoadData的功能
|
|
|
|
|
private readonly HashSet<LoadDataType> _loadData = new HashSet<LoadDataType>();
|
|
|
|
|
|
|
|
|
|
protected abstract string noticeUri { get; }
|
|
|
|
|
protected abstract string redemptionUri { get; }
|
|
|
|
|
|
|
|
|
|
public abstract bool useGm { get; }
|
|
|
|
|
|
|
|
|
|
public abstract string platformId { get; }
|
|
|
|
|
|
|
|
|
|
public abstract string sdkAccount { get; }
|
|
|
|
|
|
|
|
|
|
public virtual string tableVariant
|
|
|
|
|
{
|
|
|
|
|
get { return "tables"; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public abstract void Dispose();
|
|
|
|
|
|
|
|
|
|
protected static bool IsSuccess(string args)
|
|
|
|
|
{
|
|
|
|
|
var result = args == "success";
|
|
|
|
|
// 注:失败必然有报错信息,因此不考虑
|
|
|
|
|
if (!result)
|
|
|
|
|
{
|
|
|
|
|
var i = args.IndexOf(',');
|
|
|
|
|
if (i < 1)
|
|
|
|
|
{
|
|
|
|
|
LogModule.ErrorLog("Unable to parse Sdk Message:\n" + args);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result = "success" == args.Remove(i);
|
|
|
|
|
if (!result)
|
|
|
|
|
LogModule.ErrorLog("Unable to parse Sdk Message:\n" + args);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region Unity输入指令
|
|
|
|
|
|
|
|
|
|
public abstract void Logout();
|
|
|
|
|
|
|
|
|
|
public abstract void SwitchAccount();
|
|
|
|
|
|
|
|
|
|
public abstract void ShakeDevice();
|
|
|
|
|
|
|
|
|
|
public virtual void SubmitData(RoleDataSubmit submitType)
|
|
|
|
|
{
|
|
|
|
|
// 大部分不需要提交数据,所以不使用abstract处理
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public abstract void CloseGame();
|
|
|
|
|
|
|
|
|
|
public abstract bool IsLogin();
|
|
|
|
|
|
|
|
|
|
public abstract void GetServerList();
|
|
|
|
|
|
|
|
|
|
public void SubmitLoadData(LoadDataType action)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(loadUri) && _loadData.Add(action))
|
|
|
|
|
{
|
|
|
|
|
int level;
|
|
|
|
|
if (GameManager.gameManager &&
|
|
|
|
|
GameManager.gameManager.PlayerDataPool != null &&
|
|
|
|
|
GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr != null)
|
|
|
|
|
{
|
|
|
|
|
level = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
level = default(int);
|
|
|
|
|
if (level < 1)
|
|
|
|
|
level = 1;
|
|
|
|
|
var endPoint = NetWorkLogic.GetMe().GetLocalEndPoint() as IPEndPoint;
|
|
|
|
|
var dateTime = DateTime.Now;
|
|
|
|
|
var loadBuilder = new StringBuilder();
|
|
|
|
|
loadBuilder.Append(platformId);
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append(SdkControl.instance.currentServerData.m_id);
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append(sdkAccount);
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append(level);
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append((int)action);
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append(GetType().IsSubclassOf(typeof(SdkIosBase)) ? 2 : 1);
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append(endPoint == null ? "0.0.0.0" : endPoint.Address.ToString());
|
|
|
|
|
loadBuilder.Append('|');
|
|
|
|
|
loadBuilder.Append(string.Format("{0:yyyy-MM-dd HH:mm:ss}", dateTime));
|
|
|
|
|
var loadData = loadBuilder.ToString();
|
|
|
|
|
loadBuilder.Append("027a47eabf1ebcb409b7fe680ff69008");
|
|
|
|
|
var loadMd5 = loadBuilder.ToString();
|
|
|
|
|
loadMd5 = AssetUtils.GetTextMd5(loadMd5);
|
|
|
|
|
Debug.Log("Load Data: " + loadData);
|
|
|
|
|
var data = new Dictionary<string, string>();
|
|
|
|
|
data["counter"] = "load";
|
|
|
|
|
data["data"] = loadData;
|
|
|
|
|
data["sign"] = loadMd5;
|
|
|
|
|
var jsonDownloader = new DownloadJsonFile(loadUri, 10f, data);
|
|
|
|
|
jsonDownloader.Start();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected static Dictionary<string, string> GetRoleInfoDict(RoleDataSubmit submitType)
|
|
|
|
|
{
|
|
|
|
|
var playerData = GameManager.gameManager.PlayerDataPool;
|
|
|
|
|
var mainPlayer = playerData.MainPlayerBaseAttr;
|
|
|
|
|
var serverData = SdkControl.instance.currentServerData;
|
|
|
|
|
var result = new Dictionary<string, string>();
|
|
|
|
|
result["Event"] = submitType.ToString();
|
|
|
|
|
result["ServerId"] = serverData.m_id.ToString();
|
|
|
|
|
result["ServerName"] = serverData.m_name;
|
|
|
|
|
result["RoleName"] = mainPlayer.RoleName;
|
|
|
|
|
result["RoleId"] = mainPlayer.Guid.ToString();
|
|
|
|
|
result["Level"] = mainPlayer.Level.ToString();
|
|
|
|
|
var vip = playerData.VipCost;
|
|
|
|
|
if (vip < 0)
|
|
|
|
|
vip = 0;
|
|
|
|
|
result["Vip"] = vip.ToString();
|
|
|
|
|
result["Balance"] = playerData.Money.GetMoney_YuanBao().ToString();
|
|
|
|
|
result["OnlineTime"] = Mathf.FloorToInt(Time.realtimeSinceStartup).ToString();
|
|
|
|
|
// 暂时客户端没有这个数据,只能做个假的
|
|
|
|
|
result["CreateTime"] = ((long) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds).ToString();
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Hack:临时用这个方式进行模块统一
|
|
|
|
|
protected void LoginPhpWithToken(DownloadJsonFile action, string token)
|
|
|
|
|
{
|
|
|
|
|
string ip;
|
|
|
|
|
int port;
|
|
|
|
|
var userId = default(string);
|
|
|
|
|
var serverId = default(int);
|
|
|
|
|
var channel = default(string);
|
|
|
|
|
if (!string.IsNullOrEmpty(action.error))
|
|
|
|
|
{
|
|
|
|
|
port = -1;
|
|
|
|
|
ip = action.error;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var json = action.jsonData;
|
|
|
|
|
var msg = json["msg"].ToString();
|
|
|
|
|
if (msg != "success")
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(string.Format("OnPhpLoginComplete Error: " + msg));
|
|
|
|
|
port = -1;
|
|
|
|
|
ip = msg;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var data = json["data"];
|
|
|
|
|
userId = data["user"].ToString();
|
|
|
|
|
serverId = int.Parse(data["serverid"].ToString());
|
|
|
|
|
ip = data["srvaddr"].ToString();
|
|
|
|
|
port = int.Parse(data["srvport"].ToString());
|
|
|
|
|
channel = data["cchid"].ToString();
|
|
|
|
|
var newPlayer = int.Parse(data["isnew"].ToString()) > 0;
|
|
|
|
|
if (newPlayer)
|
|
|
|
|
loadUri = data["loadurl"].ToString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(e);
|
|
|
|
|
ip = e.ToString();
|
|
|
|
|
port = -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (port >= 0)
|
|
|
|
|
{
|
|
|
|
|
var accountData = new LoginData.AccountData();
|
|
|
|
|
LoginData.accountData = accountData;
|
|
|
|
|
accountData.SetSDKData(userId, serverId, token, channel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SdkControl.instance.LoginPhpComplete(ip, port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected object ParseServerList(DownloadJsonFile action)
|
|
|
|
|
{
|
|
|
|
|
// 特殊处理,字符串代表报错,服务器列表代表有效
|
|
|
|
|
object result = null;
|
|
|
|
|
if (!string.IsNullOrEmpty(action.error))
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(action.error);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var jsonData = action.jsonData;
|
|
|
|
|
var msg = jsonData["msg"];
|
|
|
|
|
if (msg == null || msg.ToString() != "success")
|
|
|
|
|
{
|
|
|
|
|
if (msg != null)
|
|
|
|
|
result = msg.ToString();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var serverData = jsonData["data"];
|
|
|
|
|
var serverListJson = serverData["server_list"];
|
|
|
|
|
//服务器分区列表
|
|
|
|
|
var zoneListJson = serverData["server_zone"];
|
|
|
|
|
var defaultServerJson = serverData["default_server"];
|
|
|
|
|
var zoneList = new List<MyTuple<string, LoginData.ServerPageData>>();
|
|
|
|
|
for (var i = 0; i < zoneListJson.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
var json = zoneListJson[i];
|
|
|
|
|
var zoneStart = int.Parse(json["start"].ToString());
|
|
|
|
|
var zoneEnd = int.Parse(json["end"].ToString());
|
|
|
|
|
var zoneName = string.Format("{0}区-{1}区", zoneStart, zoneEnd);
|
|
|
|
|
var zoneId = zoneStart.ToString() + zoneEnd;
|
|
|
|
|
var page = new LoginData.ServerPageData(zoneName);
|
|
|
|
|
zoneList.Add(new MyTuple<string, LoginData.ServerPageData>(zoneId, page));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var list = new List<LoginData.ServerListData>();
|
|
|
|
|
foreach (var zoneId in serverListJson.Keys)
|
|
|
|
|
{
|
|
|
|
|
var zoneTuple = zoneList.Find(a => a.first == zoneId);
|
|
|
|
|
if (zoneTuple == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(string.Format("Unable to find server in zone {0}!", zoneId));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var zoneJson = serverListJson[zoneId];
|
|
|
|
|
var zone = zoneTuple.second;
|
|
|
|
|
for (var i = 0; i < zoneJson.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
var serverJson = zoneJson[i];
|
|
|
|
|
var id = int.Parse(serverJson["server_id"].ToString());
|
|
|
|
|
var name = serverJson["name"].ToString();
|
|
|
|
|
var state = int.Parse(serverJson["status"].ToString());
|
|
|
|
|
var recommend = state == 7 ? 1 : 0;
|
|
|
|
|
// 翻译Php的State到实际游戏State
|
|
|
|
|
ServerListItem.State serverState;
|
|
|
|
|
switch (state)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
case 2:
|
|
|
|
|
case 6:
|
|
|
|
|
serverState = ServerListItem.State.STOP;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
serverState = ServerListItem.State.HOT;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
serverState = ServerListItem.State.NORAML;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var server = new LoginData.ServerListData(id, name, serverState, recommend, 0);
|
|
|
|
|
list.Add(server);
|
|
|
|
|
zone.pageList.Add(server);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var defaultId = int.Parse(defaultServerJson["server_num"].ToString());
|
|
|
|
|
this.defaultServer = defaultId;
|
|
|
|
|
var defaultServer = list.Find(a => a.m_id == defaultId);
|
|
|
|
|
if (defaultServer != null)
|
|
|
|
|
defaultServer.isDefault = true;
|
|
|
|
|
result = zoneList.Select(a => a.second).ToList();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(e);
|
|
|
|
|
result = e.ToString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 通知Php服务器登录事件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public abstract void LoginPhp(int serverId);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 打开SDK登陆界面
|
|
|
|
|
/// </summary>
|
|
|
|
|
public abstract void LoginSdk(bool isAuto);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Php服务器支付,然后Sdk支付流程
|
|
|
|
|
/// 可能部分Sdk会交换顺序,因此处理成这个鸟样
|
|
|
|
|
/// </summary>
|
|
|
|
|
public abstract void Payment(int goodsId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void Notice(bool alwaysOpen)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(noticeUri))
|
|
|
|
|
{
|
2024-09-23 22:56:51 +08:00
|
|
|
|
Debug.Log("NoticeUri: " + noticeUri);
|
2024-08-23 15:49:34 +08:00
|
|
|
|
var jsonDownloader = new DownloadJsonFile(noticeUri, 10f)
|
|
|
|
|
{
|
|
|
|
|
// 标志位,是为空object,否为null;
|
|
|
|
|
token = alwaysOpen ? new object() : null,
|
|
|
|
|
onDownloadComplete = OnNoticeComplete
|
|
|
|
|
};
|
|
|
|
|
jsonDownloader.Start();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnNoticeComplete(DownloadJsonFile action)
|
|
|
|
|
{
|
|
|
|
|
var title = default(string);
|
|
|
|
|
var content = default(string);
|
|
|
|
|
var willOpen = false;
|
|
|
|
|
if (!string.IsNullOrEmpty(action.error))
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(action.error);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var jsonData = action.jsonData;
|
|
|
|
|
var msg = jsonData["msg"];
|
|
|
|
|
if (msg == null || msg.ToString() != "success")
|
|
|
|
|
Debug.LogError("Get Notice didn't get success!");
|
|
|
|
|
else
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var data = jsonData["data"];
|
|
|
|
|
if (data.IsArray)
|
|
|
|
|
{
|
|
|
|
|
data = data[0];
|
|
|
|
|
title = data["title"].ToString();
|
|
|
|
|
content = data["content"].ToString();
|
|
|
|
|
willOpen = !data["is_show"].ToString().Equals("0");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError(e);
|
|
|
|
|
title = default(string);
|
|
|
|
|
content = default(string);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SdkControl.instance.NoticeComplete(title, content, willOpen || action.token != null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RedemptionCode(string code)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(redemptionUri))
|
|
|
|
|
{
|
|
|
|
|
var data = new Dictionary<string, string>();
|
|
|
|
|
data["server_id"] = LoginData.accountData.serverId.ToString();
|
|
|
|
|
data["cch_id"] = LoginData.accountData.channel;
|
|
|
|
|
data["actorid"] = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid.ToString();
|
|
|
|
|
data["code"] = code;
|
|
|
|
|
var jsonDownloader = new DownloadJsonFile(redemptionUri, 10f, data)
|
|
|
|
|
{
|
|
|
|
|
onDownloadComplete = OnRedemptionCodeComplete
|
|
|
|
|
};
|
|
|
|
|
jsonDownloader.Start();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnRedemptionCodeComplete(DownloadJsonFile action)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(action.error))
|
|
|
|
|
{
|
|
|
|
|
MessageBoxLogic.OpenOKBox("兑换失败,请在网络通畅时重试!");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var jsonData = action.jsonData;
|
|
|
|
|
var msg = jsonData["msg"];
|
|
|
|
|
var msgText = msg == null ? string.Empty : msg.ToString();
|
|
|
|
|
if (msgText != "success")
|
|
|
|
|
MessageBoxLogic.OpenOKBox(msgText);
|
|
|
|
|
// 激活成功由服务器发消息
|
|
|
|
|
// else
|
|
|
|
|
// MessageBoxLogic.OpenOKBox("(Not Localized)兑换成功!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Sdk输入指令
|
|
|
|
|
|
|
|
|
|
public abstract bool LoginComplete(string args);
|
|
|
|
|
|
|
|
|
|
public abstract bool LogOutComplete(string args);
|
|
|
|
|
|
|
|
|
|
public abstract bool PaymentComplete(string data);
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum LoadDataType
|
|
|
|
|
{
|
|
|
|
|
EnterCreate = 2, // 进入创角页面
|
|
|
|
|
StartCreate = 3, // 开始创建角色
|
|
|
|
|
EndCreate = 4, // 完成创建角色
|
|
|
|
|
EnterGame = 5, // 进入游戏
|
|
|
|
|
}
|