Merge branch 'xma/dev_temp' into xma/dev
commit
a578651df9
|
|
@ -0,0 +1 @@
|
|||
{"channel":"MHT", "Setting":{"LanguagePackager":{"desc":"\u672c\u5730\u5316\u5904\u7406", "versionCode":"26", "isActive":"1"}, "ServerVersion":{"desc":"\u7528\u4e8e\u5207\u6362\u6b63\u5f0f\u670d\u548c\u63d0\u5ba1\u670d", "value":"1", "versionCode":"26", "isActive":"1"}, "ThinkAnalysis_GetDeviceID":{"desc":"\u6570\u6570\u83b7\u53d6DeviceID\u65b9\u6cd5", "versionCode":"24", "isActive":"1"}, "LayoutBuilderWrap":{"desc":"\u5f3a\u5236\u5237\u65b0layout\u7ec4\u4ef6\u5927\u5c0f\u7684\u65b9\u6cd5\u4fee\u6539\u5230lua\u4e2d\u8c03\u7528", "versionCode":"25", "isActive":"1"}}, "subChannel":"2000", "serverUrl":"http://119.28.117.110:8080/"}
|
||||
|
|
@ -1 +1 @@
|
|||
{"subChannel":"1", "buglyId":"261348dcd3", "channel":"pc", "resUrl":"http://jl.tyu89.wang/mht/en/", "packageVersion":"0.1", "version":"0.1.1", "serverUrl":"http://42.193.191.129:8080/"}
|
||||
{"subChannel":"1", "buglyId":"261348dcd3", "channel":"pc", "resUrl":"http://60.1.1.12/jieling_dl/dev/assetBundles/subChannal094-test/", "packageVersion":"0.2", "version":"0.15.0", "serverUrl":"http://60.1.1.23:8080/"}
|
||||
|
|
@ -164,8 +164,9 @@ namespace GameLogic
|
|||
|
||||
public static string LaQi_JoinRoom_Url = string.Empty; //拉起应用链接
|
||||
|
||||
public const string LoadingMD5Flie = "files.txt"; //加载界面更新MD5文件
|
||||
public const string GameVersionFile = "version.txt"; //游戏版本号文件
|
||||
public const string LoadingMD5Flie = "files.txt"; //加载界面更新MD5文件
|
||||
public const string GameVersionFile = "version.txt"; //游戏版本号文件
|
||||
public const string GameConfigFile = "config.txt"; //游戏版本号文件
|
||||
|
||||
public static int UserId; //用户ID
|
||||
public static int Token; //用户Token
|
||||
|
|
|
|||
|
|
@ -180,12 +180,23 @@ public class App : UnitySingleton<App>
|
|||
return VersionManager.Instance;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 配置数据管理器管理器
|
||||
/// </summary>
|
||||
public static ConfigManager ConfigMgr
|
||||
{
|
||||
get
|
||||
{
|
||||
return ConfigManager.Instance;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化
|
||||
/// </summary>
|
||||
public void Initialize()
|
||||
{
|
||||
ConfigMgr.Init();
|
||||
VersionMgr.Initialize();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,172 @@
|
|||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using GameCore;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System;
|
||||
|
||||
namespace GameLogic
|
||||
{
|
||||
public class MConfig
|
||||
{
|
||||
Hashtable info;
|
||||
|
||||
public MConfig(string json)
|
||||
{
|
||||
info = MiniJSON.jsonDecode(json) as Hashtable;
|
||||
}
|
||||
|
||||
public string ToJson()
|
||||
{
|
||||
return MiniJSON.jsonEncode(info);
|
||||
}
|
||||
|
||||
public string GetInfo(string key)
|
||||
{
|
||||
string[] ks = key.Split('.');
|
||||
Hashtable ins = info;
|
||||
for (int i = 0; i < ks.Length; i++)
|
||||
{
|
||||
string k = ks[i];
|
||||
if (!ins.ContainsKey(k))
|
||||
{
|
||||
break;
|
||||
}
|
||||
// 没有下一个值直接返回
|
||||
if (i + 1 == ks.Length)
|
||||
{
|
||||
return ins[k] as string;
|
||||
}
|
||||
else
|
||||
{
|
||||
ins = ins[k] as Hashtable;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void RemoveInfo(string key)
|
||||
{
|
||||
string[] ks = key.Split('.');
|
||||
Hashtable ins = info;
|
||||
for (int i = 0; i < ks.Length; i++)
|
||||
{
|
||||
string k = ks[i];
|
||||
if (!ins.ContainsKey(k))
|
||||
{
|
||||
break;
|
||||
}
|
||||
//
|
||||
if (i + 1 == ks.Length)
|
||||
{
|
||||
ins.Remove(k);
|
||||
}
|
||||
else
|
||||
{
|
||||
ins = ins[k] as Hashtable;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetInfo(string key, string value)
|
||||
{
|
||||
string[] ks = key.Split('.');
|
||||
Hashtable ins = info;
|
||||
for (int i = 0; i < ks.Length; i++)
|
||||
{
|
||||
string k = ks[i];
|
||||
if (!ins.ContainsKey(k))
|
||||
{
|
||||
break;
|
||||
}
|
||||
//
|
||||
if (i + 1 == ks.Length)
|
||||
{
|
||||
ins[k] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
ins = ins[k] as Hashtable;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public class ConfigManager : Singleton<ConfigManager>
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 版本号文件
|
||||
/// </summary>
|
||||
const string configFile = "config";
|
||||
/// <summary>
|
||||
/// 版本文件路径
|
||||
/// </summary>
|
||||
string configFilePath
|
||||
{
|
||||
get
|
||||
{
|
||||
return AppConst.PersistentDataPath + configFile + ".txt";
|
||||
}
|
||||
}
|
||||
|
||||
MConfig NetInfo;
|
||||
// 初始化 获取本地的数据
|
||||
public void Init()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists(configFilePath))
|
||||
{
|
||||
NetInfo = new MConfig(File.ReadAllText(configFilePath, System.Text.Encoding.UTF8));
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetNetInfo(string info)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
NetInfo = new MConfig(info);
|
||||
SaveToFiles();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError(e);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存到文件
|
||||
/// </summary>
|
||||
void SaveToFiles()
|
||||
{
|
||||
string directoryPath = Path.GetDirectoryName(configFilePath);
|
||||
if (!Directory.Exists(directoryPath)) Directory.CreateDirectory(directoryPath);
|
||||
File.WriteAllText(configFilePath, NetInfo.ToJson(), System.Text.Encoding.UTF8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public string GetConfigInfo(string key)
|
||||
{
|
||||
string v = GetConfigNetInfo(key);
|
||||
if (v != null) return v;
|
||||
return null;
|
||||
}
|
||||
public string GetConfigNetInfo(string key)
|
||||
{
|
||||
if (NetInfo == null) return null;
|
||||
string v = NetInfo.GetInfo(key);
|
||||
return v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 252b072fc95a44740976d9126b5b4626
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -5,7 +5,6 @@
|
|||
* @Created by MagicianJoker
|
||||
--]]
|
||||
|
||||
SERVER_VERSION = 0 -- 0 正式服 1 提审服
|
||||
-- 启用功能引导
|
||||
ENABLE_FUNC_GUIDE = 1 --0关闭1开启
|
||||
RECHARGEABLE = true --false不可充值 true可充值
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
languageDic={}
|
||||
|
||||
IsLanguagePack = ServerConfigManager.IsSettingActive(ServerConfigManager.SettingConfig.LanguagePackager)
|
||||
|
||||
function InitLanguageData()
|
||||
local languageData= ConfigManager.GetConfig(ConfigName.Language)
|
||||
for index, config in ConfigPairs(languageData) do
|
||||
|
|
@ -13,4 +15,5 @@ function InitLanguageData()
|
|||
end
|
||||
LogGreen("语言初始化完成:"..tostring(#languageData))
|
||||
end
|
||||
|
||||
InitLanguageData()
|
||||
|
|
@ -21,6 +21,7 @@ RRenderMgr = App.RRenderMgr
|
|||
--shareSDKMgr = App.ShareSDKMgr
|
||||
SDKMgr = App.SDKMgr
|
||||
VersionManager=App.VersionMgr
|
||||
ConfigMgr=App.ConfigMgr
|
||||
--umengsdk=App.UmengSdkMgr
|
||||
imageDownloadMgr = App.ImageDownloadMgr
|
||||
--BuglySdkManager=App.BuglySdkMgr
|
||||
|
|
@ -33,7 +34,6 @@ Input = UnityEngine.Input
|
|||
Screen = UnityEngine.Screen
|
||||
RectTransformUtility = UnityEngine.RectTransformUtility
|
||||
LayoutUtility = UnityEngine.UI.LayoutUtility
|
||||
LayoutRebuilder = UnityEngine.UI.LayoutRebuilder
|
||||
|
||||
Tweening = DG.Tweening
|
||||
Ease = DG.Tweening.Ease
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ require "Framework/Manager/PoolManager"
|
|||
require "Framework/Manager/SoundManager"
|
||||
require "Framework/Manager/CardRendererManager"
|
||||
require "Framework/Manager/RoleRenderManager"
|
||||
require "Framework/Manager/ServerConfigManager"
|
||||
require "Data/UIData"
|
||||
require "Data/SoundData"
|
||||
require "Data/ConfigData"
|
||||
|
|
@ -89,6 +90,7 @@ function Framework. Initialize()
|
|||
UIManager.Initialize()
|
||||
poolManager = PoolManager:new()
|
||||
CardRendererManager.Initialize()
|
||||
ServerConfigManager.Initialize()
|
||||
|
||||
UpdateBeat:Add(update, Framework)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
|
||||
ServerConfigManager = { }
|
||||
local _ActiveCode = 26 -- 激活版本
|
||||
|
||||
ServerConfigManager.SettingConfig = {
|
||||
ServerVersion = "ServerVersion", -- 用于切换正式服和提审服
|
||||
ThinkAnalysis_GetDeviceID = "ThinkAnalysis_GetDeviceID", -- 数数获取DeviceID方法
|
||||
LayoutBuilderWrap = "LayoutBuilderWrap", -- 强制刷新layout组件大小的方法修改到lua中调用
|
||||
LanguagePackager = "LanguagePackager", -- 本地化处理
|
||||
}
|
||||
|
||||
|
||||
function ServerConfigManager.Initialize()
|
||||
|
||||
end
|
||||
|
||||
-- 判断设置是否激活
|
||||
function ServerConfigManager.IsSettingActive(settingType)
|
||||
local s_isActive = "Setting."..settingType..".isActive"
|
||||
local s_versionCode = "Setting."..settingType..".versionCode"
|
||||
local isActive = ServerConfigManager.GetConfigInfo(s_isActive) == "1"
|
||||
if isActive then -- 激活
|
||||
if not AppConst.isSDK then
|
||||
return true
|
||||
end
|
||||
local vc = AndroidDeviceInfo.Instance:GetVersionCode()
|
||||
if vc >= tonumber(ServerConfigManager.GetConfigInfo(s_versionCode)) then --符合包版本
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
function ServerConfigManager.GetSettingValue(settingType)
|
||||
if ServerConfigManager.IsSettingActive(settingType) then
|
||||
local s_value = "Setting."..settingType..".value"
|
||||
local value = ServerConfigManager.GetConfigInfo(s_value)
|
||||
LogGreen(s_value .. " | ".. value)
|
||||
return value
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取version信息(老版本信息,新版中用于获取版本号,包版本号,)
|
||||
function ServerConfigManager.GetVersionInfo(key)
|
||||
-- 包版本大于启用的版本使用新的配置
|
||||
if not AppConst.isSDK or AndroidDeviceInfo.Instance:GetVersionCode() >= _ActiveCode then
|
||||
local v = ServerConfigManager.GetConfigInfo(key)
|
||||
if not v then
|
||||
v = VersionManager:GetVersionInfo(key)
|
||||
end
|
||||
return v
|
||||
else
|
||||
return VersionManager:GetVersionInfo(key)
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
function ServerConfigManager.GetConfigInfo(key)
|
||||
local s = ConfigMgr:GetConfigInfo(key)
|
||||
return s
|
||||
end
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 587696ae067d4004ba3b5b8c40e674e9
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -222,31 +222,47 @@ function Network:ReceiveErrorInfo(buffer)
|
|||
if msg.errCode == -1 then
|
||||
LogError("Network ReceiveErrorInfo errDes:"..msg.errMsg)
|
||||
end
|
||||
local errorCfg = ConfigManager.TryGetConfigData(ConfigName.ErrorCodeHint, msg.errCode)
|
||||
if errorCfg then
|
||||
if errorCfg.ShowType == 1 then --tips
|
||||
PopupTipPanel.ShowTip(string.format(GetLanguageStrById(errorCfg.Desc), unpack(msg.errParams)))
|
||||
elseif errorCfg.ShowType == 2 then --弹窗
|
||||
local contexts = string.split(GetLanguageStrById(errorCfg.Desc), "#") --标题#内容
|
||||
MsgPanel.ShowOne(string.format(contexts[2], unpack(msg.errParams)), nil, nil, contexts[1])
|
||||
|
||||
local desc, title = self:GetErrorTip(msg)
|
||||
if msg.errCode == -101 or msg.errCode == -102 or msg.errCode == -103 then
|
||||
if(Time.time- self.ReconnectTime<10)then
|
||||
return
|
||||
end
|
||||
--被顶号或者被封号
|
||||
Game.Logout()
|
||||
AppConst.Code = desc--TODO:重登会重置所有lua变量信息,用一个不用的C#变量记录,用于记录异常退出信息
|
||||
return
|
||||
end
|
||||
if desc then
|
||||
if title then
|
||||
MsgPanel.ShowOne(desc, nil, nil, title)
|
||||
else
|
||||
PopupTipPanel.ShowTip(msg.errMsg)
|
||||
PopupTipPanel.ShowTip(desc)
|
||||
end
|
||||
else
|
||||
if msg.errCode == -101 or msg.errCode == -102 then
|
||||
|
||||
if(Time.time- self.ReconnectTime<10)then
|
||||
return
|
||||
end
|
||||
--被顶号或者被封号
|
||||
Game.Logout()
|
||||
AppConst.Code = msg.errMsg --TODO:重登会重置所有lua变量信息,用一个不用的C#变量记录,用于记录异常退出信息
|
||||
else
|
||||
PopupTipPanel.ShowTip(msg.errMsg)
|
||||
end
|
||||
PopupTipPanel.ShowTip(msg.errMsg)
|
||||
end
|
||||
end
|
||||
|
||||
function Network:GetErrorTip(msg)
|
||||
local errorCfg = ConfigManager.TryGetConfigData(ConfigName.ErrorCodeHint, msg.errCode)
|
||||
if errorCfg then
|
||||
local params = {}
|
||||
for i = 1, #msg.errParams do
|
||||
table.insert(params, GetLanguageStrById(msg.errParams[i]))
|
||||
end
|
||||
if errorCfg.ShowType == 1 then --tips
|
||||
return string.format(GetLanguageStrById(errorCfg.Desc), unpack(params))
|
||||
elseif errorCfg.ShowType == 2 then --弹窗
|
||||
local contexts = string.split(GetLanguageStrById(errorCfg.Desc), "#") --标题#内容
|
||||
return string.format(contexts[2], unpack(params)), contexts[1]
|
||||
end
|
||||
end
|
||||
return msg.errMsg
|
||||
end
|
||||
|
||||
|
||||
|
||||
--注册消息模块
|
||||
function Network:RegisterMessage(nMsgId, pMessageHandle)
|
||||
self.socket:RegistNetMessage(nMsgId, pMessageHandle)
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ end
|
|||
-- 获取设备Id
|
||||
function this.GetDeviceId()
|
||||
if AppConst.isSDK then
|
||||
if AndroidDeviceInfo.Instance:GetVersionCode() > 24 then
|
||||
if ServerConfigManager.IsSettingActive(ServerConfigManager.SettingConfig.ThinkAnalysis_GetDeviceID) then
|
||||
return App.TAMgr:GetDeviceId()
|
||||
end
|
||||
return AndroidDeviceInfo.Instance:GetDeviceID()
|
||||
|
|
|
|||
|
|
@ -249,11 +249,11 @@ end
|
|||
--界面打开时调用(用于子类重写)
|
||||
function GuildInfoPopup:OnOpen(...)
|
||||
this.RefreshShow()
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(this.layoutName.transform)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(this.layoutLevel.transform)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(this.layoutMaster.transform)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(this.layoutMember.transform)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(this.layoutDeclaration.transform)
|
||||
ForceRebuildLayout(this.layoutName.transform)
|
||||
ForceRebuildLayout(this.layoutLevel.transform)
|
||||
ForceRebuildLayout(this.layoutMaster.transform)
|
||||
ForceRebuildLayout(this.layoutMember.transform)
|
||||
ForceRebuildLayout(this.layoutDeclaration.transform)
|
||||
end
|
||||
|
||||
--界面打开或者重新打开后,界面刷新时调用(用于子类重写)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ this.IsLogin = false
|
|||
this.pt_pId = ""
|
||||
this.pt_gId = ""
|
||||
|
||||
local LoginRoot_Url = VersionManager:GetVersionInfo("serverUrl")
|
||||
local LoginRoot_Url = ServerConfigManager.GetVersionInfo("serverUrl")
|
||||
function this.Initialize()
|
||||
this.IsLogin = false
|
||||
this.GameName='DouDou'
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ LoginPanel = Inherit(BasePanel)
|
|||
local this = LoginPanel
|
||||
this.LoginWay = { Account = 0, WeChat = 1 }
|
||||
|
||||
|
||||
SERVER_VERSION = tonumber(ServerConfigManager.GetSettingValue(ServerConfigManager.SettingConfig.ServerVersion) or 0)
|
||||
local ServerVersion = SERVER_VERSION
|
||||
local IsShowNotice = SERVER_VERSION == 0 -- 正式服显示公告
|
||||
|
||||
|
|
@ -15,11 +15,11 @@ local openIdkey = "openIdkey"
|
|||
local openIdPw = "openIdPw"
|
||||
local defaultOpenIdkey = Language[11135]
|
||||
local defaultOpenIdPw = ""
|
||||
local LoginRoot_Url = VersionManager:GetVersionInfo("serverUrl")
|
||||
local LoginRoot_SubChannel = VersionManager:GetVersionInfo("subChannel")
|
||||
local LoginRoot_Channel = VersionManager:GetVersionInfo("channel")
|
||||
local LoginRoot_Version = VersionManager:GetVersionInfo("version")
|
||||
local LoginRoot_PackageVersion = VersionManager:GetVersionInfo("packageVersion")
|
||||
local LoginRoot_Url = ServerConfigManager.GetVersionInfo("serverUrl")
|
||||
local LoginRoot_SubChannel = ServerConfigManager.GetVersionInfo("subChannel")
|
||||
local LoginRoot_Channel = ServerConfigManager.GetVersionInfo("channel")
|
||||
local LoginRoot_Version = ServerConfigManager.GetVersionInfo("version")
|
||||
local LoginRoot_PackageVersion = ServerConfigManager.GetVersionInfo("packageVersion")
|
||||
local orginLayer
|
||||
|
||||
local timeStamp = Time.realtimeSinceStartup
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
require("Base/BasePanel")
|
||||
NoticePopup = Inherit(BasePanel)
|
||||
local this = NoticePopup
|
||||
local LoginRoot_Url = VersionManager:GetVersionInfo("serverUrl")
|
||||
local LoginRoot_Url = ServerConfigManager.GetVersionInfo("serverUrl")
|
||||
--初始化组件(用于子类重写)
|
||||
function NoticePopup:InitComponent()
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ function MsgPanel.ShowOne(msg, action, text, title)
|
|||
MsgPanel.btn_Left.gameObject:SetActive(true)
|
||||
MsgPanel.btn_Right.gameObject:SetActive(false)
|
||||
MsgPanel._toggle.gameObject:SetActive(false)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(MsgPanel._toggle.transform)
|
||||
ForceRebuildLayout(MsgPanel._toggle.transform)
|
||||
end
|
||||
|
||||
--展示两个按钮
|
||||
|
|
@ -88,7 +88,7 @@ function MsgPanel.ShowTwo(msg, leftAction, rightAction, leftText, rightText, tit
|
|||
else
|
||||
MsgPanel._toggle.gameObject:SetActive(false)
|
||||
end
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(MsgPanel._toggle.transform)
|
||||
ForceRebuildLayout(MsgPanel._toggle.transform)
|
||||
end
|
||||
|
||||
function MsgPanel.Hide()
|
||||
|
|
|
|||
|
|
@ -110,8 +110,8 @@ function RewardTalismanSingleShowPopup:OnShow()
|
|||
self.btnSure:SetActive(false)
|
||||
end
|
||||
self:OnShowPanelData()
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(self.curMainProscroll.transform)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(self.curotherProscroll.transform)
|
||||
ForceRebuildLayout(self.curMainProscroll.transform)
|
||||
ForceRebuildLayout(self.curotherProscroll.transform)
|
||||
end
|
||||
function RewardTalismanSingleShowPopup:OnShowPanelData()
|
||||
local curEquipTreasureFigData = {}
|
||||
|
|
|
|||
|
|
@ -40,44 +40,54 @@ function SettingInfo:InitComponent(gameObject, rootPanel)
|
|||
-- this.languageBtn = Util.GetGameObject(gameObject, "other/box/languageBtn")
|
||||
-- this.languageText= Util.GetGameObject(this.languageBtn,"Text"):GetComponent("Text")
|
||||
-- this.languageText.text=GetCurLanguage()==0 and "中文" or "英文"
|
||||
|
||||
if IsLanguagePack then
|
||||
this.dropDown = Util.GetGameObject(gameObject,"other/box1/Dropdown"):GetComponent("Dropdown")
|
||||
this.dropDownText = Util.GetGameObject(gameObject,"other/box1/Dropdown/Label"):GetComponent("Text")
|
||||
this.dropDownTip = Util.GetGameObject(gameObject,"other/box1/tip")
|
||||
else
|
||||
this.dropDown = Util.GetGameObject(gameObject,"other/box1/Dropdown")
|
||||
this.dropDown:SetActive(false)
|
||||
|
||||
this.dropDown = Util.GetGameObject(gameObject,"other/box1/Dropdown"):GetComponent("Dropdown")
|
||||
this.dropDownText = Util.GetGameObject(gameObject,"other/box1/Dropdown/Label"):GetComponent("Text")
|
||||
this.dropDownTip = Util.GetGameObject(gameObject,"other/box1/tip")
|
||||
end
|
||||
end
|
||||
|
||||
function SettingInfo:SetTipShow()
|
||||
local flag = PlayerPrefs.GetInt("language_flag")
|
||||
LogGreen("PlayerPrefs:"..flag)
|
||||
if flag == 0 then
|
||||
this.dropDownText.text = Language[11854]
|
||||
elseif flag == 2 then
|
||||
this.dropDownText.text = "Tiếng Việt"
|
||||
elseif flag == 1 then
|
||||
this.dropDownText.text = "English"
|
||||
end
|
||||
this.dropDown.value = flag
|
||||
if GetCurLanguage() ~= flag then
|
||||
this.dropDownTip.gameObject:SetActive(true)
|
||||
else
|
||||
this.dropDownTip.gameObject:SetActive(false)
|
||||
if IsLanguagePack then
|
||||
local flag = PlayerPrefs.GetInt("language_flag")
|
||||
LogGreen("PlayerPrefs:"..flag)
|
||||
if flag == 0 then
|
||||
this.dropDownText.text = Language[11854]
|
||||
elseif flag == 2 then
|
||||
this.dropDownText.text = "Tiếng Việt"
|
||||
elseif flag == 1 then
|
||||
this.dropDownText.text = "English"
|
||||
end
|
||||
this.dropDown.value = flag
|
||||
if GetCurLanguage() ~= flag then
|
||||
this.dropDownTip.gameObject:SetActive(true)
|
||||
else
|
||||
this.dropDownTip.gameObject:SetActive(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--绑定事件(用于子类重写)
|
||||
function SettingInfo:BindEvent()
|
||||
this.dropDown.onValueChanged:AddListener(
|
||||
function(value)
|
||||
PlayerPrefs.SetInt("language_flag",value)
|
||||
this:SetTipShow()
|
||||
if value == GetCurLanguage() then
|
||||
return
|
||||
end
|
||||
MsgPanel.ShowTwo(Language[11856],function() end,function()
|
||||
Game.Logout()
|
||||
end,Language[10731],Language[10732],"",false,"")
|
||||
end
|
||||
)
|
||||
if IsLanguagePack then
|
||||
this.dropDown.onValueChanged:AddListener(
|
||||
function(value)
|
||||
PlayerPrefs.SetInt("language_flag",value)
|
||||
this:SetTipShow()
|
||||
if value == GetCurLanguage() then
|
||||
return
|
||||
end
|
||||
MsgPanel.ShowTwo(Language[11856],function() end,function()
|
||||
Game.Logout()
|
||||
end,Language[10731],Language[10732],"",false,"")
|
||||
end
|
||||
)
|
||||
end
|
||||
--cdKey兑换
|
||||
Util.AddClick(this.cdKey, function()
|
||||
UIManager.OpenPanel(UIName.CDKeyExchangePanel)
|
||||
|
|
|
|||
|
|
@ -56,20 +56,21 @@ function reimport(name)
|
|||
return require(name)
|
||||
end
|
||||
|
||||
|
||||
function GetPreferredHeight(_transform)
|
||||
if LayoutRebuilder then
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(_transform)
|
||||
end
|
||||
ForceRebuildLayout(_transform)
|
||||
return LayoutUtility.GetPreferredHeight(_transform)
|
||||
end
|
||||
function GetPreferredWidth(_transform)
|
||||
if LayoutRebuilder then
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(_transform)
|
||||
end
|
||||
ForceRebuildLayout(_transform)
|
||||
return LayoutUtility.GetPreferredWidth(_transform)
|
||||
end
|
||||
|
||||
function ForceRebuildLayout(_transform)
|
||||
if LayoutRebuilder then
|
||||
if ServerConfigManager.IsSettingActive(ServerConfigManager.SettingConfig.LayoutBuilderWrap) then
|
||||
if not LayoutRebuilder then
|
||||
LayoutRebuilder = UnityEngine.UI.LayoutRebuilder
|
||||
end
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(_transform)
|
||||
end
|
||||
end
|
||||
|
|
@ -314,6 +314,25 @@ namespace ResUpdate
|
|||
}
|
||||
|
||||
downLoadURL = VersionManager.Instance.GetVersionInfo("resUrl") + AppConst.PlatformPath + "/";
|
||||
|
||||
// 获取config
|
||||
string conUrl = downLoadURL + AppConst.GameConfigFile;
|
||||
Debug.Log("Download_Resouces_Url:" + conUrl);
|
||||
UnityWebRequest request0 = UnityWebRequest.Get(conUrl);
|
||||
request0.certificateHandler = new AcceptAllCertificatesSignedWithASpecificPublicKey();
|
||||
yield return request0.SendWebRequest();
|
||||
if (request0.isNetworkError)
|
||||
{
|
||||
SetResourcesUpdateState(true, ResourcesUpdateState.GetGameConfigsFailed);
|
||||
yield break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("www.text.config:" + request0.downloadHandler.text);
|
||||
ConfigManager.Instance.SetNetInfo(request0.downloadHandler.text);
|
||||
}
|
||||
|
||||
// 获取version
|
||||
string resUrl = downLoadURL + AppConst.GameVersionFile;
|
||||
Debug.Log("Download_Resouces_Url:" + resUrl);
|
||||
|
||||
|
|
@ -327,7 +346,7 @@ namespace ResUpdate
|
|||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("www.text:" + request.downloadHandler.text);
|
||||
Debug.Log("www.text.version:" + request.downloadHandler.text);
|
||||
Hashtable table = MiniJSON.jsonDecode(request.downloadHandler.text) as Hashtable;
|
||||
|
||||
if (table == null)
|
||||
|
|
|
|||
|
|
@ -249,6 +249,7 @@ public static class CustomSettings
|
|||
_GT(typeof(ResourcesUpdateState)),
|
||||
_GT(typeof(ImageDownloadManager)),
|
||||
_GT(typeof(VersionManager)),
|
||||
_GT(typeof(ConfigManager)),
|
||||
_GT(typeof(UpdateManager)),
|
||||
_GT(typeof(SetInternetPic)),
|
||||
_GT(typeof(SkeletonGraphic)),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,129 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using GameEditor.Core;
|
||||
using GameEditor.GameEditor.PlayerBuilder;
|
||||
using GameLogic;
|
||||
using System.Diagnostics;
|
||||
using ResUpdate;
|
||||
using System.Threading;
|
||||
|
||||
namespace GameEditor.FrameTool {
|
||||
public class ConfigWindow : EditorWindow
|
||||
{
|
||||
|
||||
string m_ExcelPath;
|
||||
private void OnEnable()
|
||||
{
|
||||
m_ExcelPath = EditorPrefs.GetString("m_ExcelPath");
|
||||
}
|
||||
|
||||
// Add menu named "My Window" to the Window menu
|
||||
[MenuItem("Build/Config")]
|
||||
static void Init()
|
||||
{
|
||||
|
||||
// Get existing open window or if none, make a new one:
|
||||
ConfigWindow window = (ConfigWindow)EditorWindow.GetWindow(typeof(ConfigWindow));
|
||||
window.Show();
|
||||
window.InitWindow();
|
||||
|
||||
}
|
||||
|
||||
void InitWindow()
|
||||
{
|
||||
InitSize();
|
||||
InitGames();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化大小
|
||||
/// </summary>
|
||||
void InitSize()
|
||||
{
|
||||
minSize = new Vector2(300, 400);
|
||||
maxSize = new Vector2(300, 650);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 初始化游戏
|
||||
/// </summary>
|
||||
void InitGames()
|
||||
{
|
||||
}
|
||||
|
||||
void OnGUI()
|
||||
{
|
||||
|
||||
|
||||
EditorGUILayout.BeginVertical();
|
||||
EditorGUILayout.Space();
|
||||
EditorGUILayout.LabelField("Config文件路径:");
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
m_ExcelPath = EditorGUILayout.TextField("", m_ExcelPath);
|
||||
if (GUILayout.Button("加载", GUILayout.Width(60f)))
|
||||
{
|
||||
}
|
||||
if (GUILayout.Button("打开目录", GUILayout.Width(60f)))
|
||||
{
|
||||
OpenDirectory(m_ExcelPath);
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
|
||||
//if (excelArr != null && excelArr.Length > 0)
|
||||
//{
|
||||
// excelIndex = EditorGUILayout.Popup("选择excel文件:", excelIndex, excelArr);
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
static string shellPath;
|
||||
public static void OpenDirectory(string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path)) return;
|
||||
|
||||
if (!Directory.Exists(path))
|
||||
{
|
||||
UnityEngine.Debug.LogError("No Directory: " + path);
|
||||
return;
|
||||
}
|
||||
|
||||
//Application.dataPath 只能在主线程中获取
|
||||
int lastIndex = Application.dataPath.LastIndexOf("/");
|
||||
shellPath = Application.dataPath.Substring(0, lastIndex) + "/Shell/";
|
||||
|
||||
// 新开线程防止锁死
|
||||
Thread newThread = new Thread(new ParameterizedThreadStart(CmdOpenDirectory));
|
||||
newThread.Start(path);
|
||||
}
|
||||
private static void CmdOpenDirectory(object obj)
|
||||
{
|
||||
Process p = new Process();
|
||||
#if UNITY_EDITOR_WIN
|
||||
p.StartInfo.FileName = "cmd.exe";
|
||||
p.StartInfo.Arguments = "/c start " + obj.ToString();
|
||||
#elif UNITY_EDITOR_OSX
|
||||
p.StartInfo.FileName = "bash";
|
||||
string shPath = shellPath + "openDir.sh";
|
||||
p.StartInfo.Arguments = shPath + " " + obj.ToString();
|
||||
#endif
|
||||
//UnityEngine.Debug.Log(p.StartInfo.Arguments);
|
||||
p.StartInfo.UseShellExecute = false;
|
||||
p.StartInfo.RedirectStandardInput = true;
|
||||
p.StartInfo.RedirectStandardOutput = true;
|
||||
p.StartInfo.RedirectStandardError = true;
|
||||
p.StartInfo.CreateNoWindow = true;
|
||||
p.Start();
|
||||
|
||||
p.WaitForExit();
|
||||
p.Close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 430a2ef9ef9800c4d8bff3f5edc235e1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -29,6 +29,7 @@ public class AppWrap
|
|||
L.RegVar("SDKMgr", get_SDKMgr, null);
|
||||
L.RegVar("RRenderMgr", get_RRenderMgr, null);
|
||||
L.RegVar("VersionMgr", get_VersionMgr, null);
|
||||
L.RegVar("ConfigMgr", get_ConfigMgr, null);
|
||||
L.EndClass();
|
||||
}
|
||||
|
||||
|
|
@ -341,5 +342,19 @@ public class AppWrap
|
|||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int get_ConfigMgr(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToLua.PushObject(L, App.ConfigMgr);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
//this source code was auto-generated by tolua#, do not modify it
|
||||
using System;
|
||||
using LuaInterface;
|
||||
|
||||
public class GameCore_Singleton_GameLogic_ConfigManagerWrap
|
||||
{
|
||||
public static void Register(LuaState L)
|
||||
{
|
||||
L.BeginClass(typeof(GameCore.Singleton<GameLogic.ConfigManager>), typeof(System.Object), "Singleton_GameLogic_ConfigManager");
|
||||
L.RegFunction("__tostring", ToLua.op_ToString);
|
||||
L.RegVar("Instance", get_Instance, null);
|
||||
L.EndClass();
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int get_Instance(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToLua.PushObject(L, GameCore.Singleton<GameLogic.ConfigManager>.Instance);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 67952d9124f8ab5498b0ac978bcbdea7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -53,6 +53,7 @@ public class GameLogic_AppConstWrap
|
|||
L.RegVar("LaQi_JoinRoom_Url", get_LaQi_JoinRoom_Url, set_LaQi_JoinRoom_Url);
|
||||
L.RegVar("LoadingMD5Flie", get_LoadingMD5Flie, null);
|
||||
L.RegVar("GameVersionFile", get_GameVersionFile, null);
|
||||
L.RegVar("GameConfigFile", get_GameConfigFile, null);
|
||||
L.RegVar("UserId", get_UserId, set_UserId);
|
||||
L.RegVar("Token", get_Token, set_Token);
|
||||
L.RegVar("SdkId", get_SdkId, set_SdkId);
|
||||
|
|
@ -730,6 +731,20 @@ public class GameLogic_AppConstWrap
|
|||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int get_GameConfigFile(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
LuaDLL.lua_pushstring(L, GameLogic.AppConst.GameConfigFile);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int get_UserId(IntPtr L)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,112 @@
|
|||
//this source code was auto-generated by tolua#, do not modify it
|
||||
using System;
|
||||
using LuaInterface;
|
||||
|
||||
public class GameLogic_ConfigManagerWrap
|
||||
{
|
||||
public static void Register(LuaState L)
|
||||
{
|
||||
L.BeginClass(typeof(GameLogic.ConfigManager), typeof(GameCore.Singleton<GameLogic.ConfigManager>));
|
||||
L.RegFunction("Init", Init);
|
||||
L.RegFunction("SetNetInfo", SetNetInfo);
|
||||
L.RegFunction("GetConfigInfo", GetConfigInfo);
|
||||
L.RegFunction("GetConfigNetInfo", GetConfigNetInfo);
|
||||
L.RegFunction("New", _CreateGameLogic_ConfigManager);
|
||||
L.RegFunction("__tostring", ToLua.op_ToString);
|
||||
L.EndClass();
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int _CreateGameLogic_ConfigManager(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
int count = LuaDLL.lua_gettop(L);
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
GameLogic.ConfigManager obj = new GameLogic.ConfigManager();
|
||||
ToLua.PushObject(L, obj);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return LuaDLL.luaL_throw(L, "invalid arguments to ctor method: GameLogic.ConfigManager.New");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int Init(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToLua.CheckArgsCount(L, 1);
|
||||
GameLogic.ConfigManager obj = (GameLogic.ConfigManager)ToLua.CheckObject<GameLogic.ConfigManager>(L, 1);
|
||||
obj.Init();
|
||||
return 0;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int SetNetInfo(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToLua.CheckArgsCount(L, 2);
|
||||
GameLogic.ConfigManager obj = (GameLogic.ConfigManager)ToLua.CheckObject<GameLogic.ConfigManager>(L, 1);
|
||||
string arg0 = ToLua.CheckString(L, 2);
|
||||
obj.SetNetInfo(arg0);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int GetConfigInfo(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToLua.CheckArgsCount(L, 2);
|
||||
GameLogic.ConfigManager obj = (GameLogic.ConfigManager)ToLua.CheckObject<GameLogic.ConfigManager>(L, 1);
|
||||
string arg0 = ToLua.CheckString(L, 2);
|
||||
string o = obj.GetConfigInfo(arg0);
|
||||
LuaDLL.lua_pushstring(L, o);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
|
||||
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
|
||||
static int GetConfigNetInfo(IntPtr L)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToLua.CheckArgsCount(L, 2);
|
||||
GameLogic.ConfigManager obj = (GameLogic.ConfigManager)ToLua.CheckObject<GameLogic.ConfigManager>(L, 1);
|
||||
string arg0 = ToLua.CheckString(L, 2);
|
||||
string o = obj.GetConfigNetInfo(arg0);
|
||||
LuaDLL.lua_pushstring(L, o);
|
||||
return 1;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return LuaDLL.toluaL_exception(L, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 467effe90bc1d524a8830982f9034e0f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -51,6 +51,7 @@ public static class LuaBinder
|
|||
GameCore_UnitySingleton_SDK_SDKManagerWrap.Register(L);
|
||||
GameCore_UnitySingleton_GameLogic_ImageDownloadManagerWrap.Register(L);
|
||||
GameCore_Singleton_GameLogic_VersionManagerWrap.Register(L);
|
||||
GameCore_Singleton_GameLogic_ConfigManagerWrap.Register(L);
|
||||
GameCore_Singleton_GameLogic_UpdateManagerWrap.Register(L);
|
||||
GameCore_UnitySingleton_GameLogic_PhoneManagerWrap.Register(L);
|
||||
GameCore_UnitySingleton_GameLogic_ObjectPoolManagerWrap.Register(L);
|
||||
|
|
@ -180,6 +181,7 @@ public static class LuaBinder
|
|||
UnityEngine_UI_VerticalLayoutGroupWrap.Register(L);
|
||||
UnityEngine_UI_LayoutElementWrap.Register(L);
|
||||
UnityEngine_UI_ContentSizeFitterWrap.Register(L);
|
||||
UnityEngine_UI_SpriteStateWrap.Register(L);
|
||||
UnityEngine_UI_LayoutUtilityWrap.Register(L);
|
||||
UnityEngine_UI_LayoutRebuilderWrap.Register(L);
|
||||
UnityEngine_UI_GraphicWrap.Register(L);
|
||||
|
|
@ -264,6 +266,7 @@ public static class LuaBinder
|
|||
GameLogic_UIDepthAdapterWrap.Register(L);
|
||||
GameLogic_ImageDownloadManagerWrap.Register(L);
|
||||
GameLogic_VersionManagerWrap.Register(L);
|
||||
GameLogic_ConfigManagerWrap.Register(L);
|
||||
GameLogic_UpdateManagerWrap.Register(L);
|
||||
GameLogic_PhoneManagerWrap.Register(L);
|
||||
GameLogic_EventTriggerListenerWrap.Register(L);
|
||||
|
|
|
|||
Loading…
Reference in New Issue