AppVer 1.28.0 | DocVer 1.28.1 | Release
This commit is contained in:
parent
c05e3a8a11
commit
01cd7f005c
4314 changed files with 671337 additions and 1 deletions
|
@ -4,7 +4,7 @@
|
|||
|
||||
- Client
|
||||
- Share
|
||||
- Scripts (soon)
|
||||
- Scripts
|
||||
- Sha1
|
||||
|
||||
## Known Issue
|
||||
|
|
140
Script/launch/XLaunchAppPathModule.lua
Normal file
140
Script/launch/XLaunchAppPathModule.lua
Normal file
|
@ -0,0 +1,140 @@
|
|||
local UnityApplication = CS.UnityEngine.Application
|
||||
local UnityRuntimePlatform = CS.UnityEngine.RuntimePlatform
|
||||
|
||||
local CsApplication = CS.XApplication
|
||||
-- local CsLog = CS.XLog
|
||||
local CsInfo = CS.XInfo
|
||||
|
||||
-- 应用路径模块
|
||||
local XLaunchAppPathModule = {}
|
||||
|
||||
local RuntimePlatform = {
|
||||
ANDROID = 1,
|
||||
IOS = 2,
|
||||
EDITOR = 3,
|
||||
STANDALONE = 4,
|
||||
}
|
||||
|
||||
local CurRuntimePlatform
|
||||
local IsEditorOrStandalone
|
||||
local PLATFORM
|
||||
|
||||
-- platform
|
||||
local DocumentUrl
|
||||
local ConfigUrl
|
||||
local ApplicationFilePath
|
||||
|
||||
-- editor/standalone
|
||||
local ProductPath
|
||||
local DebugFilePath
|
||||
|
||||
-- common
|
||||
local AppUpgradeUrl
|
||||
local DocumentFilePath
|
||||
|
||||
-- Local Function
|
||||
local function Init()
|
||||
AppUpgradeUrl = "client/patch"
|
||||
DocumentFilePath = UnityApplication.persistentDataPath .. "/document"
|
||||
|
||||
if UnityApplication.platform == UnityRuntimePlatform.Android then
|
||||
-- 安卓平台
|
||||
CurRuntimePlatform = RuntimePlatform.ANDROID
|
||||
PLATFORM = "android"
|
||||
DocumentUrl = "client/patch/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/android"
|
||||
ConfigUrl = "client/config/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/android"
|
||||
ApplicationFilePath = UnityApplication.streamingAssetsPath .. "/resource"
|
||||
elseif UnityApplication.platform == UnityRuntimePlatform.IPhonePlayer then
|
||||
-- iOS平台
|
||||
CurRuntimePlatform = RuntimePlatform.IOS
|
||||
PLATFORM = "ios"
|
||||
DocumentUrl = "client/patch/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/ios"
|
||||
ConfigUrl = "client/config/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/ios"
|
||||
ApplicationFilePath = UnityApplication.streamingAssetsPath .. "/resource"
|
||||
else
|
||||
--
|
||||
PLATFORM = "win"
|
||||
if UnityApplication.platform == UnityRuntimePlatform.WindowsEditor or
|
||||
UnityApplication.platform == UnityRuntimePlatform.OSXEditor or
|
||||
UnityApplication.platform == UnityRuntimePlatform.LinuxEditor then
|
||||
-- 编辑器平台
|
||||
PLATFORM = CS.XLaunchManager.PLATFORM --编辑器平台,随平台选择而变化
|
||||
CurRuntimePlatform = RuntimePlatform.EDITOR
|
||||
DocumentUrl = "client/patch/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/editor"
|
||||
ConfigUrl = "client/config/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/editor"
|
||||
ProductPath = UnityApplication.dataPath .. "/../../../Product"
|
||||
DebugFilePath = ProductPath .. "/File/win/debug"
|
||||
ApplicationFilePath = CsApplication.Debug and ProductPath .. "/File/" .. PLATFORM .. "/release"
|
||||
or ProductPath .. "/Bin/Client/Win/Release/harukuroPC_Data/StreamingAssets/resource"
|
||||
|
||||
--DocumentUrl = "client/patch/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/android" --editor上 test androd
|
||||
elseif UnityApplication.platform == UnityRuntimePlatform.WindowsPlayer or
|
||||
UnityApplication.platform == UnityRuntimePlatform.OSXPlayer or
|
||||
UnityApplication.platform == UnityRuntimePlatform.LinuxPlayer then
|
||||
-- 电脑系统平台
|
||||
CurRuntimePlatform = RuntimePlatform.STANDALONE
|
||||
DocumentUrl = "client/patch/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/standalone"
|
||||
ConfigUrl = "client/config/" .. CsInfo.Identifier .. "/" .. CsInfo.Version .. "/standalone"
|
||||
ProductPath = UnityApplication.dataPath .. "/../../../../.."
|
||||
DebugFilePath = ProductPath .. "/File/win/debug"
|
||||
ApplicationFilePath = CsApplication.Debug and ProductPath .. "/File/" .. PLATFORM .. "/release"
|
||||
or UnityApplication.streamingAssetsPath .. "/resource"
|
||||
if not CsApplication.Debug then
|
||||
-- Release包 资源目录跟安装目录相同
|
||||
DocumentFilePath = UnityApplication.streamingAssetsPath .. "/document"
|
||||
end
|
||||
end
|
||||
end
|
||||
IsEditorOrStandalone = CurRuntimePlatform == RuntimePlatform.EDITOR or CurRuntimePlatform == RuntimePlatform.STANDALONE
|
||||
end
|
||||
|
||||
-- local function PrintPath()
|
||||
-- --
|
||||
-- CsLog.Error("Check files. PLATFORM = " .. PLATFORM)
|
||||
-- CsLog.Error("Check files. DocumentUrl = " .. DocumentUrl)
|
||||
-- CsLog.Error("Check files. ConfigUrl = " .. ConfigUrl)
|
||||
-- CsLog.Error("Check files. ApplicationFilePath = " .. ApplicationFilePath)
|
||||
-- CsLog.Error("Check files. ProductPath = " .. ProductPath)
|
||||
-- CsLog.Error("Check files. DebugFilePath = " .. DebugFilePath)
|
||||
-- end
|
||||
|
||||
Init()
|
||||
--PrintPath()
|
||||
|
||||
function XLaunchAppPathModule.IsEditorOrStandalone()
|
||||
return IsEditorOrStandalone
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.IsAndroid()
|
||||
return CurRuntimePlatform == RuntimePlatform.ANDROID
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.IsIos()
|
||||
return CurRuntimePlatform == RuntimePlatform.IOS;
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.GetApplicationFilePath()
|
||||
return ApplicationFilePath
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.GetDocumentFilePath()
|
||||
return DocumentFilePath
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.GetDebugFilePath()
|
||||
return DebugFilePath
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.GetDocumentUrl()
|
||||
return DocumentUrl
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.GetConfigUrl()
|
||||
return ConfigUrl
|
||||
end
|
||||
|
||||
function XLaunchAppPathModule.GetAppUpgradeUrl()
|
||||
return AppUpgradeUrl
|
||||
end
|
||||
|
||||
return XLaunchAppPathModule
|
109
Script/launch/XLaunchAppVersionModule.lua
Normal file
109
Script/launch/XLaunchAppVersionModule.lua
Normal file
|
@ -0,0 +1,109 @@
|
|||
local UnityPlayerPrefs = CS.UnityEngine.PlayerPrefs
|
||||
local CsLog = CS.XLog
|
||||
local CsInfo = CS.XInfo
|
||||
local CsRemoteConfig = CS.XRemoteConfig
|
||||
|
||||
-- 应用版本模块
|
||||
local XLaunchAppVersionModule = {}
|
||||
|
||||
local DOCUMENT_VERSION = "DOCUMENT_VERSION"
|
||||
local LAUNCH_MODULE_VERSION = "LAUNCH_MODULE_VERSION"
|
||||
|
||||
local AppVersion
|
||||
|
||||
local OldDocVersion
|
||||
local NewDocVersion
|
||||
|
||||
local OldLaunchModuleVersion
|
||||
local NewLaunchModuleVersion
|
||||
|
||||
local IsCurAppVersionMatched = false
|
||||
local IsCurDocVersionMatched = false
|
||||
local IsCurLaunchModuleVersionMatched = false
|
||||
|
||||
local IsDocUpdated = true
|
||||
local IsLaunchModuleUpdated = true
|
||||
|
||||
local PrintVersion
|
||||
|
||||
-- 初始化
|
||||
local Init = function()
|
||||
AppVersion = CsInfo.Version
|
||||
IsCurAppVersionMatched = CsRemoteConfig.ApplicationVersion == AppVersion
|
||||
|
||||
OldDocVersion = UnityPlayerPrefs.GetString(DOCUMENT_VERSION, CsInfo.Version)
|
||||
NewDocVersion = CsRemoteConfig.DocumentVersion
|
||||
IsCurDocVersionMatched = NewDocVersion == AppVersion
|
||||
IsDocUpdated = NewDocVersion == OldDocVersion
|
||||
|
||||
OldLaunchModuleVersion = UnityPlayerPrefs.GetString(LAUNCH_MODULE_VERSION, CsInfo.Version)
|
||||
NewLaunchModuleVersion = CsRemoteConfig.LaunchModuleVersion
|
||||
IsCurLaunchModuleVersionMatched = AppVersion == NewLaunchModuleVersion
|
||||
IsLaunchModuleUpdated = OldLaunchModuleVersion == NewLaunchModuleVersion
|
||||
|
||||
PrintVersion()
|
||||
end
|
||||
|
||||
PrintVersion = function()
|
||||
CsLog.Debug("AppVersion: " .. tostring(AppVersion))
|
||||
CsLog.Debug("OldDocVersion: " .. tostring(OldDocVersion))
|
||||
CsLog.Debug("NewDocVersion: " .. tostring(NewDocVersion))
|
||||
CsLog.Debug("OldLaunchModuleVersion: " .. tostring(OldLaunchModuleVersion))
|
||||
CsLog.Debug("NewLaunchModuleVersion: " .. tostring(NewLaunchModuleVersion))
|
||||
CsLog.Debug("IsCurDocVersionMatched: " .. tostring(IsCurDocVersionMatched))
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.GetAppVersion()
|
||||
return AppVersion
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.GetNewDocVersion()
|
||||
return NewDocVersion
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.GetNewLaunchModuleVersion()
|
||||
return NewLaunchModuleVersion
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.CheckAppUpdate()
|
||||
return not IsCurAppVersionMatched
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.CheckDocUpdate()
|
||||
return not IsCurDocVersionMatched
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.CheckLaunchModuleUpdate()
|
||||
return not IsCurLaunchModuleVersionMatched
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.HasDocUpdated()
|
||||
return IsDocUpdated
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.HasLaunchModuleUpdated()
|
||||
return IsLaunchModuleUpdated
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.UpdateDocVersion()
|
||||
OldDocVersion = NewDocVersion
|
||||
IsCurDocVersionMatched = NewDocVersion == AppVersion
|
||||
IsDocUpdated = NewDocVersion == OldDocVersion
|
||||
|
||||
UnityPlayerPrefs.SetString(DOCUMENT_VERSION, CsRemoteConfig.DocumentVersion)
|
||||
UnityPlayerPrefs.Save()
|
||||
end
|
||||
|
||||
function XLaunchAppVersionModule.UpdateLaunchVersion()
|
||||
OldLaunchModuleVersion = NewLaunchModuleVersion
|
||||
IsCurLaunchModuleVersionMatched = AppVersion == NewLaunchModuleVersion
|
||||
IsLaunchModuleUpdated = OldLaunchModuleVersion == NewLaunchModuleVersion
|
||||
|
||||
UnityPlayerPrefs.SetString(LAUNCH_MODULE_VERSION, CsRemoteConfig.LaunchModuleVersion)
|
||||
UnityPlayerPrefs.Save()
|
||||
end
|
||||
|
||||
Init()
|
||||
--PrintVersion()
|
||||
|
||||
return XLaunchAppVersionModule
|
165
Script/launch/XLaunchDlcManager.lua
Normal file
165
Script/launch/XLaunchDlcManager.lua
Normal file
|
@ -0,0 +1,165 @@
|
|||
local UnityPlayerPrefs = CS.UnityEngine.PlayerPrefs
|
||||
local DLC_HAS_DOWNLOADED_KEY = "DLC_HAS_DOWNLOADED_KEY"
|
||||
local DLC_HAS_START_DOWNLOADED_KEY = "DLC_HAS_START_DOWNLOADED_KEY"
|
||||
local HAS_SELECT_DOWNLOAD_PART_KEY = "HAS_SELECT_DOWNLOAD_PART_KEY"
|
||||
local CsApplication = CS.XApplication
|
||||
local CsLog = CS.XLog
|
||||
|
||||
local M = {}
|
||||
local XLaunchDlcManager = M
|
||||
|
||||
local IndexTable = {}
|
||||
local CommonIdSet = {}
|
||||
|
||||
local HasStartDownloadDic = {}
|
||||
local DownloadedDic = {}
|
||||
|
||||
local DlcSizeDic = {}
|
||||
local DlcIndexInfo = {}
|
||||
|
||||
local IsDlcBuild = false
|
||||
|
||||
local DLC_BASE_INDEX = 0 -- 基础资源包索引
|
||||
local DLC_COMMON_INDEX = -1 -- 通用资源包索引
|
||||
|
||||
local STATE_DEFAULT = 0 -- 未开始下载
|
||||
local STATE_START = 1 -- 已开始(选择)下载
|
||||
|
||||
|
||||
--====启动逻辑接口 begin=====
|
||||
|
||||
M.Init = function(indexTable, commonIdList)
|
||||
IndexTable = indexTable
|
||||
for _, dlcId in pairs(commonIdList) do
|
||||
CommonIdSet[dlcId] = true
|
||||
end
|
||||
|
||||
for dlcId, info in pairs(IndexTable) do
|
||||
HasStartDownloadDic[dlcId] = UnityPlayerPrefs.GetInt(DLC_HAS_START_DOWNLOADED_KEY .. dlcId, STATE_DEFAULT)
|
||||
DownloadedDic[dlcId] = UnityPlayerPrefs.GetInt(DLC_HAS_DOWNLOADED_KEY .. dlcId, STATE_DEFAULT)
|
||||
end
|
||||
end
|
||||
|
||||
M.SetIsDlcBuild = function(isDlcBuild)
|
||||
IsDlcBuild = isDlcBuild
|
||||
end
|
||||
|
||||
M.SetDlcIndexInfo = function(dlcId, dlcIndexInfo) -- 记录size后即可丢弃
|
||||
DlcIndexInfo[dlcId] = dlcIndexInfo
|
||||
end
|
||||
|
||||
M.DoDownloadDlc = function(progressCb, doneCb, exitCb)
|
||||
local PathModule = require("XLaunchAppPathModule")
|
||||
local FileModuleCreator = require("XLaunchFileModule")
|
||||
local VersionModule = require("XLaunchAppVersionModule")
|
||||
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
CsLog.Debug("Release 模式运行")
|
||||
local DocFileModule = FileModuleCreator()
|
||||
DocFileModule.Check(RES_FILE_TYPE.MATRIX_FILE, PathModule, VersionModule, doneCb, progressCb, exitCb)
|
||||
elseif PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Debug then
|
||||
CsLog.Debug("Debug 模式运行")
|
||||
doneCb()
|
||||
elseif PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Editor then
|
||||
CsLog.Debug("Editor 模式运行")
|
||||
doneCb()
|
||||
end
|
||||
end
|
||||
|
||||
-- 是否下载过指定id的分包
|
||||
M.HasStartDownloadDlc = function(id)
|
||||
return HasStartDownloadDic[id] == STATE_START
|
||||
end
|
||||
|
||||
M.HasDownloadedDlc = function(id)
|
||||
return DownloadedDic[id] == STATE_START
|
||||
end
|
||||
|
||||
M.DoneDownload = function()
|
||||
for dlcId, v in pairs(HasStartDownloadDic) do
|
||||
if v == STATE_START then
|
||||
DownloadedDic[dlcId] = STATE_START
|
||||
UnityPlayerPrefs.SetInt(DLC_HAS_DOWNLOADED_KEY .. dlcId, STATE_START)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
M.SetNeedDownload = function (id)
|
||||
local state = STATE_START
|
||||
CsLog.Debug("SetNeedDownload:" .. tostring(id))
|
||||
HasStartDownloadDic[id] = state
|
||||
UnityPlayerPrefs.SetInt(DLC_HAS_START_DOWNLOADED_KEY .. id, state)
|
||||
|
||||
-- 当依赖了通用资源的分包开始下载时,下载通用资源包
|
||||
if CommonIdSet[id] and HasStartDownloadDic[DLC_COMMON_INDEX] ~= state then
|
||||
HasStartDownloadDic[DLC_COMMON_INDEX] = state
|
||||
UnityPlayerPrefs.SetInt(DLC_HAS_START_DOWNLOADED_KEY .. DLC_COMMON_INDEX, state)
|
||||
end
|
||||
end
|
||||
|
||||
M.SetAllNeedDownload = function()
|
||||
for dlcId, info in pairs(IndexTable) do
|
||||
M.SetNeedDownload(dlcId)
|
||||
end
|
||||
end
|
||||
|
||||
M.DownloadDlc = function (ids, processCb, doneCb)
|
||||
for _, id in pairs(ids) do
|
||||
M.SetNeedDownload(id)
|
||||
end
|
||||
|
||||
XLuaUiManager.OpenWithCallback("UiLaunch",function()
|
||||
M.DoDownloadDlc(processCb,
|
||||
function()
|
||||
XLuaUiManager.Close("UiLaunch")
|
||||
if doneCb then
|
||||
doneCb()
|
||||
end
|
||||
end,
|
||||
function()
|
||||
XLuaUiManager.Close("UiLaunch")
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
M.NeedShowSelectDownloadPart = function(appVer)
|
||||
return UnityPlayerPrefs.GetInt(HAS_SELECT_DOWNLOAD_PART_KEY .. appVer, STATE_DEFAULT) == STATE_DEFAULT
|
||||
end
|
||||
|
||||
M.DoneSelectDownloadPart = function(appVer)
|
||||
UnityPlayerPrefs.SetInt(HAS_SELECT_DOWNLOAD_PART_KEY .. appVer, STATE_START)
|
||||
end
|
||||
--====启动逻辑接口 end=====
|
||||
|
||||
|
||||
--======== 业务层接口 begin ====
|
||||
M.NeedDownloadDlc = function(dlcId)
|
||||
return DownloadedDic[dlcId] == STATE_DEFAULT
|
||||
end
|
||||
|
||||
local GetDlcSize = function(dlcId)
|
||||
if not DlcSizeDic[dlcId] then
|
||||
local size = 0
|
||||
local indexInfo = DlcIndexInfo[dlcId]
|
||||
if indexInfo == nil then
|
||||
return 0
|
||||
end
|
||||
for assetPath, docInfo in pairs(indexInfo) do
|
||||
size = size + docInfo[3]
|
||||
end
|
||||
DlcSizeDic[dlcId] = size
|
||||
end
|
||||
return DlcSizeDic[dlcId]
|
||||
end
|
||||
|
||||
M.GetDownloadSize = function(dlcIds)
|
||||
local size = 0
|
||||
for _, dlcId in pairs(dlcIds) do
|
||||
size = size + GetDlcSize(dlcId)
|
||||
end
|
||||
return size
|
||||
end
|
||||
--======== 业务层接口 end ====
|
||||
|
||||
return XLaunchDlcManager
|
873
Script/launch/XLaunchFileModule.lua
Normal file
873
Script/launch/XLaunchFileModule.lua
Normal file
|
@ -0,0 +1,873 @@
|
|||
local UnityApplication = CS.UnityEngine.Application
|
||||
|
||||
local CsApplication = CS.XApplication
|
||||
local CsLog = CS.XLog
|
||||
local CsRemoteConfig = CS.XRemoteConfig
|
||||
local CsTool = CS.XTool
|
||||
local CsGameEventManager = CS.XGameEventManager.Instance
|
||||
|
||||
local CsInfo = CS.XInfo
|
||||
|
||||
local CsDownloadService = CS.XDownloadService.Instance
|
||||
local DownloadState = {
|
||||
NONE = -1,
|
||||
DONE = 0,
|
||||
ING = 1,
|
||||
FAIL = 2
|
||||
}
|
||||
|
||||
local IosDownloadState = {
|
||||
PreparingLocalFiles = 0,
|
||||
PreparingDownload = 1,
|
||||
Downloading = 2,
|
||||
AppendDownloading = 3,
|
||||
Verifying = 4,
|
||||
Finished = 5
|
||||
}
|
||||
|
||||
-- 版更时需要强清本地资源的版本
|
||||
local ForceVersion = {["1.22.0"] = true}
|
||||
local ForceVersionNum = 22
|
||||
|
||||
|
||||
local SPECIAL_DELETE_MATRIX_PREF_KEY = "__Kuro__reset_Matrix_files_"
|
||||
local UNCHECKED_FILE_EXTENSION = ".unchecked"
|
||||
|
||||
local module_creator = function()
|
||||
local XLaunchFileModule = {}
|
||||
|
||||
local MESSAGE_PACK_MODULE_NAME = "XLaunchCommon/XMessagePack"
|
||||
require(MESSAGE_PACK_MODULE_NAME)
|
||||
|
||||
|
||||
local XLaunchDlcManager = require("XLaunchDlcManager")
|
||||
|
||||
local SIZE = 10 * 1024 * 1024
|
||||
local TIMEOUT = 5 * 1000
|
||||
local READ_TIMEOUT = 10 * 1000
|
||||
local RETRY = 10
|
||||
|
||||
local INDEX = "index"
|
||||
|
||||
local ResFileType
|
||||
local AppPathModule
|
||||
local AppVersionModule
|
||||
local OnCompleteCallback
|
||||
local OnProgressCallback
|
||||
local OnExitCallback
|
||||
|
||||
local ApplicationFilePath
|
||||
local DocumentFilePath
|
||||
local DocumentUrl
|
||||
|
||||
local DocumentIndexDir
|
||||
local DocumentIndexPath
|
||||
|
||||
local NewVersion
|
||||
local NeedUpdate
|
||||
local HasUpdated
|
||||
|
||||
-- common
|
||||
local ApplicationIndexTable
|
||||
local DocumentIndexTable
|
||||
|
||||
local DlcIndexTable
|
||||
local DlcCommonIdList
|
||||
|
||||
local CurrentFileTable = nil
|
||||
local AllFileTableDlc = nil
|
||||
local NeedFileSet = nil
|
||||
|
||||
local UpdateTable = {}
|
||||
local UpdateTableCount = 0
|
||||
local UpdateSize = 0
|
||||
|
||||
local AllUpdateTable = {}
|
||||
local AllUpdateTableCount = 0
|
||||
local AllUpdateSize = 0
|
||||
|
||||
local CurrentUpdateSize = 0
|
||||
--
|
||||
local HasLocalFiles = false
|
||||
|
||||
-- Local Function
|
||||
local CheckIndexFile
|
||||
local ResolveResIndex
|
||||
local PrepareDownload
|
||||
local DownloadFiles
|
||||
local CompleteDownload
|
||||
local OnCompleteResFilesInit
|
||||
local LoadIndexTable
|
||||
local LoadIndexTableWithDlcInfo
|
||||
local InitDocumentIndex
|
||||
local DownloadDlcIndexs
|
||||
local DoPrepareDownload
|
||||
local OnNotifyEvent
|
||||
|
||||
local IsDlcBuild = false
|
||||
local NeedShowSelect = false
|
||||
|
||||
function XLaunchFileModule.Check(resFileType, appPathModule, appVersionModule, completeCb,progressCb,exitCb)
|
||||
ResFileType = resFileType
|
||||
AppPathModule = appPathModule
|
||||
AppVersionModule = appVersionModule
|
||||
OnCompleteCallback = completeCb
|
||||
OnProgressCallback = progressCb
|
||||
OnExitCallback = exitCb
|
||||
|
||||
ApplicationFilePath = AppPathModule.GetApplicationFilePath()
|
||||
DocumentFilePath = AppPathModule.GetDocumentFilePath()
|
||||
DocumentUrl = AppPathModule.GetDocumentUrl()
|
||||
|
||||
IsDlcBuild = CsInfo.IsDlcBuild
|
||||
XLaunchDlcManager.SetIsDlcBuild(IsDlcBuild)
|
||||
|
||||
DocumentIndexDir = DocumentFilePath .. "/" .. ResFileType .. "/"
|
||||
DocumentIndexPath= DocumentIndexDir .. INDEX
|
||||
|
||||
|
||||
NeedUpdate = false
|
||||
NeedShowSelect = false
|
||||
|
||||
if ResFileType == RES_FILE_TYPE.LAUNCH_MODULE then
|
||||
NeedUpdate = AppVersionModule.CheckLaunchModuleUpdate()
|
||||
HasUpdated = AppVersionModule.HasLaunchModuleUpdated()
|
||||
NewVersion = AppVersionModule.GetNewLaunchModuleVersion()
|
||||
elseif ResFileType == RES_FILE_TYPE.MATRIX_FILE then
|
||||
|
||||
NeedUpdate = AppVersionModule.CheckDocUpdate()
|
||||
HasUpdated = AppVersionModule.HasDocUpdated()
|
||||
NewVersion = AppVersionModule.GetNewDocVersion()
|
||||
|
||||
NeedShowSelect = XLaunchDlcManager.NeedShowSelectDownloadPart(CsInfo.Version) and IsDlcBuild -- 每个大版本只会弹出一次选择更新,小更新沿用选择结果
|
||||
end
|
||||
|
||||
if CS.XRemoteConfig.IsHideFunc then
|
||||
--NeedUpdate = false
|
||||
end
|
||||
|
||||
CsLog.Debug("NeedUpdate:"..tostring(NeedUpdate)..",type:"..ResFileType)
|
||||
--
|
||||
CheckIndexFile()
|
||||
end
|
||||
|
||||
-- function XLaunchFileModule.GetOffset()
|
||||
-- return OFFSET
|
||||
-- end
|
||||
|
||||
DownloadDlcIndexs = function(cb)
|
||||
if not IsDlcBuild then
|
||||
cb()
|
||||
return
|
||||
end
|
||||
|
||||
DocumentIndexTable, DlcIndexTable, DlcCommonIdList = LoadIndexTableWithDlcInfo(DocumentIndexPath)
|
||||
|
||||
local count = 0
|
||||
local totalCount = 0
|
||||
if DlcIndexTable then
|
||||
for _, _ in pairs(DlcIndexTable) do
|
||||
totalCount = totalCount + 1
|
||||
end
|
||||
end
|
||||
if totalCount > 0 then
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD, totalCount, false, CsApplication.GetText("UpdateIndex") .. "(%d/%d)") -- 检查更新(0/10)
|
||||
CsApplication.SetProgress(0)
|
||||
end
|
||||
local iter, t, key = pairs(DlcIndexTable)
|
||||
local info
|
||||
|
||||
local iterKey = nil
|
||||
local Loop
|
||||
Loop = function()
|
||||
key, info = iter(t, iterKey)
|
||||
|
||||
if not key then
|
||||
CsApplication.SetProgress(1)
|
||||
cb()
|
||||
return
|
||||
end
|
||||
|
||||
local id = key
|
||||
local name = info[1]
|
||||
local sha1 = info[2]
|
||||
local cache = true -- 本地缓存 校验通过不重复下载
|
||||
|
||||
local str = string.format("%s/%s/%s/%s", DocumentUrl, NewVersion, ResFileType, name)
|
||||
local str2 = DocumentFilePath .. "/" .. ResFileType .. "/" .. name
|
||||
local downloader = CS.XUriPrefixDownloader(str, str2, cache, sha1, TIMEOUT, RETRY, READ_TIMEOUT)
|
||||
local size = 0
|
||||
--CsLog.Debug("DocumentUrl:"..DocumentUrl)
|
||||
--CsLog.Debug("str:"..str)
|
||||
--CsLog.Debug("str2:"..str2)
|
||||
CsTool.WaitCoroutinePerFrame(downloader:Send(), function(isComplete)
|
||||
if not isComplete then
|
||||
--
|
||||
else
|
||||
if downloader.State ~= CS.XDownloaderState.Success then
|
||||
local msg = "XFileManager Download error, state error, state: " .. tostring(downloader.State)
|
||||
CsLog.Error(msg)
|
||||
local dict = {}
|
||||
dict.file_name = name
|
||||
dict.file_size = 1
|
||||
CS.XRecord.Record(dict, "80007", "XFileManagerDownloadError")
|
||||
ShowStartErrorDialog("FileManagerInitFileTableDownloadError", CsApplication.Exit, function()
|
||||
Loop()
|
||||
end, CsApplication.GetText("Retry")) -- 重试
|
||||
return
|
||||
end
|
||||
|
||||
count = count + 1
|
||||
CsApplication.SetProgress(count / totalCount)
|
||||
CsLog.Debug("[] EVENT_LAUNCH_START_DOWNLOAD count:" .. tostring(count))
|
||||
iterKey = key
|
||||
Loop()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
Loop()
|
||||
end
|
||||
|
||||
-- 检测资源列表文件
|
||||
CheckIndexFile = function()
|
||||
CS.XAppEventManager.LogAppEvent(CS.XAppEventConfig.Version_Checking_Start)
|
||||
local documentFilePath = DocumentFilePath .. "/" .. ResFileType .. "/" .. INDEX
|
||||
local keepLocalIndex = CS.System.IO.File.Exists(DocumentFilePath .. "/DevelopmentIndex") -- 用于Release环境不清理本地index文件(兼顾覆盖安装和手动放资源的情况)
|
||||
|
||||
CsLog.Debug("[Download] CheckIndexFile:"..ResFileType .. ", documentFilePath:" .. tostring(CS.System.IO.File.Exists(documentFilePath))
|
||||
.. ", Debug:" .. tostring(CsRemoteConfig.Debug) .. ", NeedUpdate:" .. tostring(NeedUpdate) .. ", keepLocalIndex:" .. tostring(keepLocalIndex))
|
||||
if not NeedUpdate then
|
||||
if CS.System.IO.File.Exists(documentFilePath) and not CsRemoteConfig.Debug then -- debug情况下不需更新但要保留本地index
|
||||
if not keepLocalIndex then
|
||||
CS.XFileTool.DeleteFile(documentFilePath)
|
||||
end
|
||||
end
|
||||
-- 原始版本,直接进
|
||||
ResolveResIndex()
|
||||
return
|
||||
end
|
||||
|
||||
-- 下载/检测 当前index文件是否最新
|
||||
local sha1 = "empty"
|
||||
local newVersion = ""
|
||||
if ResFileType == RES_FILE_TYPE.LAUNCH_MODULE then
|
||||
sha1 = CsRemoteConfig.LaunchIndexSha1
|
||||
newVersion = CsRemoteConfig.LaunchModuleVersion
|
||||
elseif ResFileType == RES_FILE_TYPE.MATRIX_FILE then
|
||||
sha1 = CsRemoteConfig.IndexSha1
|
||||
newVersion = CsRemoteConfig.DocumentVersion
|
||||
end
|
||||
|
||||
if HasUpdated and CS.XFileTool.CheckSha1(documentFilePath, sha1) then
|
||||
CsLog.Debug("[Download] HasUpdated:" .. tostring(HasUpdated))
|
||||
ResolveResIndex()
|
||||
return
|
||||
end
|
||||
--CsLog.Debug("index download DocumentUrl:"..DocumentUrl)
|
||||
local uriPrefixStr = DocumentUrl .. "/" .. newVersion .. "/" .. ResFileType .. "/" .. INDEX
|
||||
local downloader = CS.XUriPrefixDownloader(uriPrefixStr, documentFilePath, false, sha1)
|
||||
CsTool.WaitCoroutine(downloader:Send(), function()
|
||||
if downloader.State ~= CS.XDownloaderState.Success then
|
||||
ShowStartErrorDialog("FileManagerInitVersionDownLoadError")
|
||||
else
|
||||
if ResFileType == RES_FILE_TYPE.LAUNCH_MODULE then
|
||||
AppVersionModule.UpdateLaunchVersion()
|
||||
ResolveResIndex()
|
||||
elseif ResFileType == RES_FILE_TYPE.MATRIX_FILE then
|
||||
|
||||
DownloadDlcIndexs(function()
|
||||
AppVersionModule.UpdateDocVersion()
|
||||
ResolveResIndex()
|
||||
end)
|
||||
end
|
||||
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
LoadIndexTable = function(indexPath)
|
||||
local assetBundle = CS.UnityEngine.AssetBundle.LoadFromFile(indexPath)
|
||||
if (assetBundle and assetBundle:Exist()) then
|
||||
local assetName = assetBundle:GetAllAssetNames()[0]
|
||||
local asset = assetBundle:LoadAsset(assetName, typeof(CS.UnityEngine.TextAsset))
|
||||
local indexFile = XMessagePack.Decode(asset.bytes)
|
||||
local indexTable = indexFile[1]
|
||||
assetBundle:Unload(true)
|
||||
return indexTable
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
LoadIndexTableWithDlcInfo = function(indexPath)
|
||||
local assetBundle = CS.UnityEngine.AssetBundle.LoadFromFile(indexPath)
|
||||
if (assetBundle and assetBundle:Exist()) then
|
||||
local assetName = assetBundle:GetAllAssetNames()[0]
|
||||
local asset = assetBundle:LoadAsset(assetName, typeof(CS.UnityEngine.TextAsset))
|
||||
local indexFile = XMessagePack.Decode(asset.bytes)
|
||||
local indexTable = indexFile[1]
|
||||
local dlcIndexTable = indexFile[2] or {}
|
||||
local dlcCommonIdList = indexFile[3] or {}
|
||||
assetBundle:Unload(true)
|
||||
return indexTable, dlcIndexTable, dlcCommonIdList
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- 解析doc目录下index
|
||||
InitDocumentIndex = function()
|
||||
if not CS.System.IO.File.Exists(DocumentIndexPath) then
|
||||
CsLog.Error("[Download] Init DocumentIndex Failed, file not exist: " .. tostring(DocumentIndexPath))
|
||||
return
|
||||
end
|
||||
|
||||
if not DocumentIndexTable then
|
||||
if IsDlcBuild then
|
||||
DocumentIndexTable, DlcIndexTable, DlcCommonIdList = LoadIndexTableWithDlcInfo(DocumentIndexPath)
|
||||
else
|
||||
DocumentIndexTable = LoadIndexTable(DocumentIndexPath) -- {[assetPath] = value{[1] = Name, [2] = Sha1, [3] = Size}, ... }
|
||||
end
|
||||
end
|
||||
|
||||
CurrentFileTable = {} -- 当前需下载资源
|
||||
AllFileTableDlc = {} -- DLC完整资源
|
||||
|
||||
local count = 0
|
||||
NeedFileSet = {} -- 需下载标记
|
||||
|
||||
-- 基础补丁
|
||||
for asset, info in pairs(DocumentIndexTable) do
|
||||
NeedFileSet[info[1]] = true
|
||||
CurrentFileTable[asset] = info
|
||||
AllFileTableDlc[asset] = info
|
||||
end
|
||||
|
||||
-- 统计资源
|
||||
if IsDlcBuild then
|
||||
XLaunchDlcManager.Init(DlcIndexTable, DlcCommonIdList)
|
||||
|
||||
-- 分包补丁
|
||||
for dlcId, dlcIndexInfo in pairs(DlcIndexTable) do
|
||||
local dlcIndexPath = DocumentIndexDir .. dlcIndexInfo[1]
|
||||
local dlcTable = LoadIndexTable(dlcIndexPath)
|
||||
XLaunchDlcManager.SetDlcIndexInfo(dlcId, dlcTable)
|
||||
|
||||
-- 历史选择的分包下载记录(不弹出选择框是用于默认下载)
|
||||
local hasDownloadDlc = (not NeedShowSelect) and XLaunchDlcManager.HasStartDownloadDlc(dlcId)
|
||||
CsLog.Debug("[DLC] dlcId: ".. tostring(dlcId) .. ", hasDownloadDlc: " .. tostring(hasDownloadDlc) .. ", NeedShowSelect:" .. tostring(NeedShowSelect))
|
||||
|
||||
for asset, info in pairs(dlcTable) do
|
||||
NeedFileSet[info[1]] = true
|
||||
|
||||
if hasDownloadDlc then
|
||||
CurrentFileTable[asset] = info
|
||||
end
|
||||
AllFileTableDlc[asset] = info
|
||||
end
|
||||
end
|
||||
|
||||
-- 剔除包内已有资源(需asset与Name都对应)
|
||||
for asset, info in pairs(ApplicationIndexTable) do
|
||||
local value = AllFileTableDlc[asset]
|
||||
if value and value[1] == info[1] then
|
||||
AllFileTableDlc[asset] = nil
|
||||
CurrentFileTable[asset] = nil
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
else
|
||||
CurrentFileTable = DocumentIndexTable
|
||||
|
||||
-- 剔除包内已有资源(需asset与Name都对应)
|
||||
for asset, info in pairs(ApplicationIndexTable) do
|
||||
local value = CurrentFileTable[asset]
|
||||
if value and value[1] == info[1] then
|
||||
CurrentFileTable[asset] = nil
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
CsLog.Debug("[Download] 包内已有资源数量:" .. count)
|
||||
end
|
||||
|
||||
|
||||
ResolveResIndex = function()
|
||||
CS.XAppEventManager.LogAppEvent(CS.XAppEventConfig.Version_Checking_End)
|
||||
local applicationIndexPath = ApplicationFilePath .. "/" .. ResFileType .. "/" .. INDEX
|
||||
ApplicationIndexTable = LoadIndexTable(applicationIndexPath)
|
||||
|
||||
CsLog.Debug("[Download] ResolveResIndex. NeedUpdate:" .. tostring(NeedUpdate) .. ", applicationIndexPath:" .. applicationIndexPath .. ", documentIndexPath:" .. DocumentIndexPath)
|
||||
if not NeedUpdate then -- 原始版本
|
||||
if CS.System.IO.File.Exists(DocumentIndexPath) then
|
||||
CsLog.Debug("Local index:" .. DocumentIndexPath)
|
||||
InitDocumentIndex()
|
||||
HasLocalFiles = true
|
||||
end
|
||||
|
||||
OnCompleteResFilesInit() -- 无需更新,直接完成
|
||||
return
|
||||
end
|
||||
|
||||
InitDocumentIndex()
|
||||
|
||||
UpdateSize = 0
|
||||
UpdateTableCount = 0
|
||||
UpdateTable = {}
|
||||
for _, info in pairs(CurrentFileTable) do
|
||||
if UpdateTable[info[1]] then
|
||||
local dict = {}
|
||||
dict["file_name"] = info[1]
|
||||
CS.XRecord.Record(dict, "80006", "UpdateTableAddFileError")
|
||||
CsLog.Error("repeat update file:" .. tostring(info[1]))
|
||||
ShowStartErrorDialog("FileManagerInitFileTableUpdateTableError")
|
||||
return
|
||||
end
|
||||
|
||||
UpdateTable[info[1]] = info
|
||||
UpdateTableCount = UpdateTableCount + 1
|
||||
UpdateSize = UpdateSize + info[3]
|
||||
end
|
||||
|
||||
AllUpdateSize = 0
|
||||
AllUpdateTable = {}
|
||||
AllUpdateTableCount = 0
|
||||
if NeedShowSelect then
|
||||
for _, info in pairs(AllFileTableDlc) do
|
||||
AllUpdateTable[info[1]] = info
|
||||
AllUpdateTableCount = AllUpdateTableCount + 1
|
||||
AllUpdateSize = AllUpdateSize + info[3]
|
||||
end
|
||||
end
|
||||
|
||||
CsLog.Debug("[Download] IsDlcBuild:" .. tostring(IsDlcBuild))
|
||||
CsLog.Debug(string.format("[Download] UpdateSize: %d, UpdateTableCount: %d, AllUpdateSize: %d, AllUpdateTableCount: %d", UpdateSize, UpdateTableCount, AllUpdateSize, AllUpdateTableCount)) -- 2166 -- 基础包补丁
|
||||
|
||||
local deleteKey = SPECIAL_DELETE_MATRIX_PREF_KEY .. tostring(AppVersionModule.GetAppVersion())
|
||||
local isMatrix = ResFileType == "matrix"
|
||||
local cleanFlag = CS.UnityEngine.PlayerPrefs.GetInt(deleteKey, 0)
|
||||
local checkClean = (isMatrix and (not cleanFlag or cleanFlag ~= 1))
|
||||
local isForceClean = ForceVersion[CsInfo.Version]
|
||||
|
||||
if isMatrix and not isForceClean then -- 补充强删资源逻辑
|
||||
|
||||
local theDeleteKey = SPECIAL_DELETE_MATRIX_PREF_KEY .. "1." .. ForceVersionNum .. ".0"
|
||||
local theCleanFlag = CS.UnityEngine.PlayerPrefs.GetInt(theDeleteKey, 0)
|
||||
CsLog.Debug("key:" .. theDeleteKey .. ", cleanFlag:" .. tostring(cleanFlag) .. ", force cleanFlag :" .. tostring(theCleanFlag))
|
||||
|
||||
if cleanFlag ~= 1 and (theCleanFlag ~= 1) then -- 首次检测当前版本、 且没经历过强删版本
|
||||
for versionNum = ForceVersionNum - 1, 10, -1 do -- 经历过再之前版本 -- 属于旧包覆盖安装,需要强清资源
|
||||
local lastDeleteKey = SPECIAL_DELETE_MATRIX_PREF_KEY .. "1." .. versionNum .. ".0"
|
||||
local lastCleanFlag = CS.UnityEngine.PlayerPrefs.GetInt(lastDeleteKey, 0)
|
||||
CsLog.Debug("[Download] Check Force Clean Key:" .. lastDeleteKey .. ", cleanFlag:" .. tostring(lastCleanFlag) .. ", " .. type(lastCleanFlag))
|
||||
|
||||
if lastCleanFlag == 1 then
|
||||
isForceClean = true
|
||||
CsLog.Debug("[Download] 过旧版本 需要全面清理资源, version:" .. lastDeleteKey)
|
||||
|
||||
-- 完成后增加强删版本的标记
|
||||
CS.UnityEngine.PlayerPrefs.SetInt(theDeleteKey, 1)
|
||||
CS.UnityEngine.PlayerPrefs.Save()
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
CsLog.Debug("[Download] 上一版本资源key: " .. tostring(deleteKey) .. ", type: " .. tostring(ResFileType) .. ", checkClean: " .. tostring(checkClean) .. ", force:" .. tostring(isForceClean) .. ", CsInfo.Version:" .. tostring(CsInfo.Version))
|
||||
|
||||
local files = CS.XFileTool.GetFiles(DocumentFilePath .. "/" .. ResFileType)
|
||||
|
||||
local lastVerCount = 0
|
||||
local otherCount = 0
|
||||
local totalCount = 0
|
||||
|
||||
--是否启用IOS后台下载
|
||||
--在启用时,由于IOS校验流程的统一需要,因此文件下载完可能还未校验,需要假设资源是完整的
|
||||
--在以上条件下,需要合理估计仍然需要下载的文件大小,因此需要减去对仅未验证的文件的大小
|
||||
local isUseIosDownloadService = (CS.XRemoteConfig.DownloadMethod == 0) and AppPathModule.IsIos()
|
||||
|
||||
for i = 0, files.Length - 1 do
|
||||
local file = files[i]
|
||||
local name = CS.XFileTool.GetFileName(file)
|
||||
totalCount = totalCount + 1
|
||||
|
||||
local isIndex = IsDlcBuild and (string.sub(name,1,5) == INDEX) or (name == INDEX)
|
||||
if isIndex then
|
||||
goto CONTINUE
|
||||
end
|
||||
|
||||
if checkClean then
|
||||
if isForceClean or not NeedFileSet[name] then
|
||||
CsLog.Debug("[Download] 清理上一版本资源" .. tostring(name) .. ", need:" .. tostring((not NeedFileSet[name])))
|
||||
CS.XFileTool.DeleteFile(file)
|
||||
lastVerCount = lastVerCount + 1
|
||||
goto CONTINUE
|
||||
end
|
||||
end
|
||||
-- 检查更新文件是否存在
|
||||
local hasUpdated = false
|
||||
|
||||
local info = UpdateTable[name]
|
||||
if info then
|
||||
UpdateTable[name] = nil
|
||||
UpdateTableCount = UpdateTableCount - 1
|
||||
UpdateSize = UpdateSize - info[3]
|
||||
hasUpdated = true
|
||||
end
|
||||
if NeedShowSelect then
|
||||
local infoDlc = AllUpdateTable[name]
|
||||
if infoDlc then
|
||||
AllUpdateTable[name] = nil
|
||||
AllUpdateTableCount = AllUpdateTableCount - 1
|
||||
AllUpdateSize = AllUpdateSize - infoDlc[3]
|
||||
hasUpdated = true
|
||||
end
|
||||
end
|
||||
if hasUpdated then
|
||||
goto CONTINUE
|
||||
end
|
||||
|
||||
local nameWithOutExtension = CS.XFileTool.GetFileNameWithoutExtension(file)
|
||||
if UpdateTable[nameWithOutExtension] then -- 下载时临时文件(name.download)将会保留
|
||||
info = UpdateTable[nameWithOutExtension]
|
||||
if isUseIosDownloadService then
|
||||
if CS.XFileTool.GetFileExtension(file) == UNCHECKED_FILE_EXTENSION then
|
||||
UpdateSize = UpdateSize - info[3]
|
||||
end
|
||||
end
|
||||
goto CONTINUE
|
||||
end
|
||||
|
||||
otherCount = otherCount + 1
|
||||
CS.XFileTool.DeleteFile(file)
|
||||
|
||||
:: CONTINUE ::
|
||||
end
|
||||
|
||||
CsLog.Debug(string.format("[Download] 资源清理 本地总数:%d, 清理上版本数:%d, 其他清理:%d, 需更新: %d, dlc需更新:%d",
|
||||
totalCount, lastVerCount, otherCount, UpdateTableCount, AllUpdateTableCount))
|
||||
|
||||
if checkClean then
|
||||
CsLog.Debug("[Download] 清理上一版本资源完成。")
|
||||
CS.UnityEngine.PlayerPrefs.SetInt(deleteKey, 1)
|
||||
CS.UnityEngine.PlayerPrefs.Save()
|
||||
end
|
||||
|
||||
PrepareDownload()
|
||||
end
|
||||
|
||||
local GetSizeAndUnit = function(size)
|
||||
local unit = "k"
|
||||
local num = size / 1024
|
||||
if (num > 100) then
|
||||
unit = "MB"
|
||||
num = num / 1024
|
||||
end
|
||||
return unit,num
|
||||
end
|
||||
|
||||
OnDoneSelect = function(isFullDownload)
|
||||
DlcManager.DoneSelectDownloadPart(CsInfo.Version)
|
||||
if isFullDownload then
|
||||
DlcManager.SetAllNeedDownload()
|
||||
UpdateTable = AllUpdateTable
|
||||
end
|
||||
|
||||
DoPrepareDownload()
|
||||
end
|
||||
|
||||
PrepareDownload = function()
|
||||
if UpdateTableCount <= 0 and (not NeedShowSelect or AllUpdateTableCount <=0) then
|
||||
OnCompleteResFilesInit()
|
||||
return
|
||||
end
|
||||
|
||||
--todo 如果是dlc打包,显示选择框,选择完重新下载
|
||||
if NeedShowSelect then
|
||||
CsGameEventManager:RegisterEvent(CS.XEventId.EVENT_LAUNCH_DONE_DOWNLOAD_SELECT, function(evt,data)
|
||||
OnDoneSelect(data[0])
|
||||
end)
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_SHOW_DOWNLOAD_SELECT,UpdateSize,AllUpdateSize)
|
||||
else
|
||||
DoPrepareDownload()
|
||||
end
|
||||
end
|
||||
|
||||
DoPrepareDownload = function()
|
||||
local dict = {["type"] = ResFileType, ["version"] = NewVersion}
|
||||
CS.XRecord.Record(dict, "80011", "StartDownloadNewFiles")
|
||||
|
||||
local unit,num = GetSizeAndUnit(UpdateSize)
|
||||
-- 日服不做热更时网络状态判断
|
||||
--if (UnityApplication.internetReachability == CS.UnityEngine.NetworkReachability.ReachableViaCarrierDataNetwork and UpdateSize > SIZE) then
|
||||
--BDC
|
||||
-- CS.XHeroBdcAgent.BdcUpdateGame("203", "1", "0")
|
||||
-- local tmpStr = string.format("%0.2f%s%s", num, unit, CsApplication.GetText("UpdateCheck"))
|
||||
-- CsTool.WaitCoroutine(CsApplication.CoDialog(CsApplication.GetText("Tip"), tmpStr, CsApplication.Exit, function()
|
||||
-- DownloadFiles()
|
||||
-- end))
|
||||
-- return
|
||||
--end
|
||||
|
||||
--BDC
|
||||
CS.XHeroBdcAgent.BdcUpdateGame("203", "1", "0")
|
||||
local tmpStr = string.format("%s%0.2f %s", CsApplication.GetText("UpdateCheck"), num, unit) -- 海外调整热更文本 -- #104203 文本最后与单位新增一个空格
|
||||
CsTool.WaitCoroutine(CsApplication.CoDialog(CsApplication.GetText("Tip"), tmpStr, CsApplication.Exit, function()
|
||||
DownloadFiles()
|
||||
end))
|
||||
return
|
||||
end
|
||||
|
||||
local AndroidBackgroundDownload = function()
|
||||
--android background download todo
|
||||
--1.组建好一个数组,传给backgroud download组件,开始下载
|
||||
--2.每帧获取下载状态,更新界面(当前下载文件,下载进度)
|
||||
--3.重试状态
|
||||
--4.下载完成状态
|
||||
local urlPrefix = string.format("%s/%s/%s/", DocumentUrl, NewVersion, ResFileType)
|
||||
local downloadDir = DocumentFilePath .. "/" .. ResFileType .. "/"
|
||||
|
||||
local allNameTable = {}
|
||||
local allSha1Table = {}
|
||||
local allSizeTable = {}
|
||||
|
||||
for name, info in pairs(UpdateTable) do
|
||||
table.insert(allNameTable, info[1])
|
||||
table.insert(allSha1Table, info[2])
|
||||
table.insert(allSizeTable, info[3])
|
||||
end
|
||||
|
||||
local names = table.concat(allNameTable,";")
|
||||
local sha1s = table.concat(allSha1Table,";")
|
||||
local sizes = table.concat(allSizeTable,";")
|
||||
|
||||
CsDownloadService:Download(urlPrefix, downloadDir, names, sha1s, TIMEOUT, RETRY, sizes)
|
||||
|
||||
local waitTimeCnt = 0
|
||||
local updateInfoCb = nil
|
||||
updateInfoCb = function()
|
||||
-- 下载进度
|
||||
local state = CsDownloadService:GetDownloadState()
|
||||
local fileSize = CsDownloadService:GetCurrentFileSize()
|
||||
local curDoneSize = CsDownloadService:GetCurrentDownloadSize()
|
||||
if state == DownloadState.ING then
|
||||
waitTimeCnt = 0
|
||||
local updateProgress = UpdateSize == 0 and 0 or curDoneSize / UpdateSize
|
||||
if updateProgress>1 then updateProgress =1 end
|
||||
|
||||
CsApplication.SetProgress(updateProgress)
|
||||
if OnProgressCallback then
|
||||
OnProgressCallback(updateProgress)
|
||||
end
|
||||
elseif state == DownloadState.FAIL or (state == DownloadState.NONE and waitTimeCnt > 20) then
|
||||
CsTool.RemoveUpdateEvent(updateInfoCb)
|
||||
local errMsg = CsDownloadService:GetExceptionInfo()
|
||||
local name = CsDownloadService:GetCurrentFileName()
|
||||
CsLog.Error("[Download] Android Download error, state error, state: " .. tostring(state)..", err:" .. errMsg .. ", name:" .. tostring(name) .. ", fileSize:" .. tostring(fileSize))
|
||||
local exitCb = OnExitCallback or CsApplication.Exit
|
||||
|
||||
CsLog.Debug("[Download Android Backgroud] Istate " .. tostring(state) .. ",waitTimeCnt: " .. tostring(waitTimeCnt))
|
||||
ShowStartErrorDialog("FileManagerInitFileTableDownloadError", exitCb, function()
|
||||
CheckIndexFile()
|
||||
end, CsApplication.GetText("Retry"))
|
||||
|
||||
elseif state == DownloadState.DONE then
|
||||
CsLog.Debug("[Download Android Backgroud] Istate == DownloadState.DONE! ")
|
||||
CsTool.RemoveUpdateEvent(updateInfoCb)
|
||||
CompleteDownload()
|
||||
elseif state == DownloadState.NONE then
|
||||
waitTimeCnt = waitTimeCnt + CS.UnityEngine.Time.deltaTime
|
||||
end
|
||||
end
|
||||
CsTool.AddUpdateEvent(updateInfoCb)
|
||||
end
|
||||
|
||||
local IosBackgroundDownload = function()
|
||||
local urlPrefix = string.format("%s/%s/%s", DocumentUrl, NewVersion, ResFileType)
|
||||
CS.XIOSDownloadConfig.PrepareCNDList(urlPrefix);
|
||||
local taskArr = {}
|
||||
for _,v in pairs(UpdateTable) do
|
||||
table.insert(taskArr, string.format("%s %s %s", v[1], v[3], v[2]))
|
||||
end
|
||||
local taskInfo = table.concat(taskArr,"\n")
|
||||
CS.XIOSDownloadCustomer.Instance:SetTaskInfo(taskInfo)
|
||||
local manager = CS.XIOSDownloadManager.Instance
|
||||
local verifier = CS.XIOSDownloadVerifier.Instance
|
||||
|
||||
local updateEvent
|
||||
updateEvent = function()
|
||||
if manager.StateInt == IosDownloadState.PreparingLocalFiles then
|
||||
--Nothing Here
|
||||
elseif manager.StateInt == IosDownloadState.PreparingDownload then
|
||||
--Nothing Here
|
||||
elseif manager.StateInt == IosDownloadState.Downloading or manager.StateInt == IosDownloadState.AppendDownloading then
|
||||
if manager.StateInt == IosDownloadState.AppendDownloading and manager.TotalTaskBytes ~= 0 then
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD, manager.TotalTaskBytes)
|
||||
end
|
||||
local progress = manager.CurDownloadedBytes / manager.TotalTaskBytes;
|
||||
if progress and progress ~= math.huge then
|
||||
CsApplication.SetProgress(progress)
|
||||
end
|
||||
if OnProgressCallback then
|
||||
OnProgressCallback(progress)
|
||||
end
|
||||
elseif manager.StateInt == IosDownloadState.Verifying then
|
||||
CS.XGameEventManager.Instance:Notify(CS.XEventId.EVENT_LAUNCH_START_LOADING)
|
||||
CsApplication.SetMessage(string.format("正在校验中(%d/%d)", verifier.CurrentCheckCount, verifier.TotalNeedCheckCount))
|
||||
CsApplication.SetProgress(verifier.CurrentCheckCount / verifier.TotalNeedCheckCount)
|
||||
elseif manager.StateInt == IosDownloadState.Finished then
|
||||
CsTool.RemoveUpdateEvent(updateEvent)
|
||||
manager:Clear()
|
||||
CompleteDownload()
|
||||
end
|
||||
end
|
||||
|
||||
manager:Prepare()
|
||||
|
||||
manager:SetDownloadErrorHandler(function(file)
|
||||
local exitCb = OnExitCallback or CsApplication.Exit
|
||||
ShowStartErrorDialog("FileManagerInitFileTableDownloadError", exitCb, function()
|
||||
manager:ContinueDownloading()
|
||||
end, CsApplication.GetText("Retry")) -- 重试
|
||||
end)
|
||||
|
||||
CsTool.AddUpdateEvent(updateEvent)
|
||||
end
|
||||
|
||||
local TraditionalDownload = function()
|
||||
local updateFileText = CsApplication.GetText("UpdateFile")
|
||||
local iter, t, key = pairs(UpdateTable)
|
||||
local info
|
||||
local iterKey = nil
|
||||
local Loop
|
||||
Loop = function()
|
||||
key, info = iter(t, iterKey)
|
||||
|
||||
if not key then
|
||||
CompleteDownload()
|
||||
return
|
||||
end
|
||||
|
||||
local name = info[1]
|
||||
local sha1 = info[2] -- 补丁index中记录的sha1,和下载后文件sha1对比
|
||||
|
||||
CsApplication.SetMessage(updateFileText .. ": " .. name)
|
||||
|
||||
local str = string.format("%s/%s/%s/%s", DocumentUrl, NewVersion, ResFileType, name)
|
||||
local str2 = DocumentFilePath .. "/" .. ResFileType .. "/" .. name
|
||||
local downloader = CS.XUriPrefixDownloader(str, str2, true, sha1, TIMEOUT, RETRY, READ_TIMEOUT)
|
||||
local size = 0
|
||||
|
||||
CsTool.WaitCoroutinePerFrame(downloader:Send(), function(isComplete)
|
||||
if not isComplete then
|
||||
--
|
||||
CurrentUpdateSize = CurrentUpdateSize - size + downloader.CurrentSize
|
||||
size = downloader.CurrentSize
|
||||
local updateProgress = UpdateSize == 0 and 0 or CurrentUpdateSize / UpdateSize
|
||||
CsApplication.SetProgress(updateProgress)
|
||||
|
||||
if OnProgressCallback then
|
||||
OnProgressCallback(updateProgress)
|
||||
end
|
||||
else
|
||||
if downloader.State ~= CS.XDownloaderState.Success then
|
||||
local msg = "[Download] error, state error, state: " .. tostring(downloader.State)
|
||||
CsLog.Error(msg)
|
||||
local dict = {}
|
||||
dict.file_name = name
|
||||
dict.file_size = info[3]
|
||||
CS.XRecord.Record(dict, "80007", "XFileManagerDownloadError")
|
||||
local exitCb = OnExitCallback or CsApplication.Exit
|
||||
|
||||
ShowStartErrorDialog("FileManagerInitFileTableDownloadError",exitCb, function()
|
||||
Loop()
|
||||
end, CsApplication.GetText("Retry")) -- 重试
|
||||
return
|
||||
end
|
||||
|
||||
CurrentUpdateSize = CurrentUpdateSize - size + downloader.Size
|
||||
iterKey = key
|
||||
Loop()
|
||||
end
|
||||
end)
|
||||
end
|
||||
Loop()
|
||||
end
|
||||
|
||||
DownloadFiles = function()
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD, UpdateSize)
|
||||
CS.XAppEventManager.LogAppEvent(CS.XAppEventConfig.Resource_Download_Start)
|
||||
CS.XHeroBdcAgent.BdcUpdateGame("204", "1", "0")
|
||||
CsApplication.SetMessage(CsApplication.GetText("GameUpdate"))
|
||||
CsApplication.SetProgress(0)
|
||||
|
||||
local isUseAndroidDownloadService = (CS.XRemoteConfig.DownloadMethod == 0) and AppPathModule.IsAndroid()
|
||||
local isUseIosDownloadService = (CS.XRemoteConfig.DownloadMethod == 0) and AppPathModule.IsIos()
|
||||
|
||||
if isUseAndroidDownloadService and ResFileType == RES_FILE_TYPE.MATRIX_FILE then
|
||||
CsLog.Debug("安卓后台下载模式")
|
||||
AndroidBackgroundDownload()
|
||||
elseif isUseIosDownloadService and ResFileType == RES_FILE_TYPE.MATRIX_FILE then
|
||||
CsLog.Debug("IOS后台下载模式")
|
||||
IosBackgroundDownload()
|
||||
else
|
||||
CsLog.Debug("传统下载模式")
|
||||
TraditionalDownload()
|
||||
end
|
||||
end
|
||||
|
||||
CompleteDownload = function()
|
||||
CsApplication.SetProgress(1)
|
||||
local dict = {["type"] = ResFileType, ["version"] = NewVersion}
|
||||
CS.XRecord.Record(dict, "80012", "DownloadNewFilesEnd")
|
||||
CS.XAppEventManager.LogAppEvent(CS.XAppEventConfig.Resource_Download_End)
|
||||
OnCompleteResFilesInit()
|
||||
end
|
||||
|
||||
OnCompleteResFilesInit = function()
|
||||
local urlTable = {}
|
||||
|
||||
if IsDlcBuild then
|
||||
if AllFileTableDlc then
|
||||
for asset, info in pairs(AllFileTableDlc) do
|
||||
urlTable[asset] = DocumentFilePath .. "/" .. ResFileType .. "/" .. info[1]
|
||||
end
|
||||
XLaunchDlcManager.DoneDownload()
|
||||
end
|
||||
else
|
||||
if DocumentIndexTable then
|
||||
for asset, info in pairs(DocumentIndexTable) do
|
||||
urlTable[asset] = DocumentFilePath .. "/" .. ResFileType .. "/" .. info[1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for asset, info in pairs(ApplicationIndexTable) do
|
||||
if not urlTable[asset] or HasLocalFiles then -- 包体资源优先于本地测试资源
|
||||
urlTable[asset] = ApplicationFilePath .. "/" .. ResFileType .. "/" .. info[1]
|
||||
end
|
||||
end
|
||||
|
||||
ApplicationIndexTable = nil
|
||||
DocumentIndexTable = nil
|
||||
CurrentFileTable = nil
|
||||
|
||||
DlcIndexTable = nil
|
||||
AllFileTableDlc = nil
|
||||
|
||||
if NeedShowSelect then
|
||||
CsGameEventManager:RemoveEvent(CS.XEventId.EVENT_LAUNCH_DONE_DOWNLOAD_SELECT, OnNotifyEvent)
|
||||
XLaunchDlcManager.DoneSelectDownloadPart(CsInfo.Version) -- 下载完成后才记录选择记录
|
||||
end
|
||||
|
||||
-- 完成回调
|
||||
if OnCompleteCallback then
|
||||
OnCompleteCallback(urlTable, NeedUpdate, HasLocalFiles)
|
||||
end
|
||||
end
|
||||
|
||||
return XLaunchFileModule
|
||||
end
|
||||
|
||||
return module_creator
|
438
Script/launch/XLaunchModule.lua
Normal file
438
Script/launch/XLaunchModule.lua
Normal file
|
@ -0,0 +1,438 @@
|
|||
local CsApplication = CS.XApplication
|
||||
local CsLog = CS.XLog
|
||||
local CsInfo = CS.XInfo
|
||||
local CsTool = CS.XTool
|
||||
local CsStringEx = CS.XStringEx
|
||||
local CsGameEventManager = CS.XGameEventManager.Instance
|
||||
local IO = CS.System.IO
|
||||
local CsRemoteConfig = CS.XRemoteConfig
|
||||
|
||||
--Test 设置模式
|
||||
--CsApplication.Mode = CS.XMode.Debug
|
||||
print("Launch Version Code 1." )
|
||||
|
||||
RES_FILE_TYPE = {
|
||||
LAUNCH_MODULE = "launch",
|
||||
MATRIX_FILE = "matrix",
|
||||
CG_FILE = "cg",
|
||||
}
|
||||
|
||||
local APP_PATH_MODULE_NAME = "XLaunchAppPathModule"
|
||||
local APP_VERSION_MODULE_NAME = "XLaunchAppVersionModule"
|
||||
local FILE_MODULE_NAME = "XLaunchFileModule"
|
||||
local UI_MODULE_NAME = "XLaunchUiModule"
|
||||
|
||||
local PathModule = require(APP_PATH_MODULE_NAME)
|
||||
local FileModuleCreator = require(FILE_MODULE_NAME)
|
||||
local XLaunchUiModule = require(UI_MODULE_NAME)
|
||||
local VersionModule
|
||||
|
||||
local LaunchFileModule
|
||||
local DocFileModule
|
||||
|
||||
local IsReloaded = false
|
||||
local ResFileUrlTable = {}
|
||||
|
||||
-- 游戏内强更
|
||||
local DOWNLOAD_APK_VERSION = "download_apk_ver"
|
||||
local OPPO_CHANNEL_ID = 1
|
||||
local ApkListUrl = "client/patch/config.js"
|
||||
local ApkFileName = "Punishing.apk"
|
||||
local ApkSavePath = string.format("%s/%s", CS.UnityEngine.Application.persistentDataPath, ApkFileName)
|
||||
local ApkFileSize = 0
|
||||
local APK_TIMEOUT = 5000
|
||||
-- local IsApkTesting = true -- 调试用
|
||||
|
||||
--- >>>>>>>>>>>>>>>>>>>>>>>>>> 私有方法 * 声明 >>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
local CheckLaunchModuleUpdate
|
||||
local CheckDocUpdate
|
||||
local DownloadDlc
|
||||
|
||||
local OnCheckLaunchModuleComplete
|
||||
local InitGame
|
||||
|
||||
local CheckDownloadChannel
|
||||
local TryDownloadApk
|
||||
local BeforeDownloadApk
|
||||
local StartDownloadApk
|
||||
|
||||
local CheckLocalZipFile
|
||||
--- <<<<<<<<<<<<<<<<<<<<<<<<<< 私有方法 * 声明 <<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
GetResFileUrl = GetResFileUrl or nil
|
||||
|
||||
-- 注意:重载模块需要释放的对象
|
||||
ShowStartErrorDialog = function(errorCode, confirmCB, cancelCB, cancelStr)
|
||||
CS.XHeroBdcAgent.BdcStartUpError(errorCode)
|
||||
confirmCB = confirmCB or CsApplication.Exit
|
||||
CsTool.WaitCoroutine(CsApplication.CoDialog(CsApplication.GetText("Tip"), CsApplication.GetText(errorCode), cancelCB, confirmCB, cancelStr))
|
||||
end
|
||||
|
||||
--- >>>>>>>>>>>>>>>>>>>>>>>>>> 私有方法 * 定义 >>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
CheckLaunchModuleUpdate = function()
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
LaunchFileModule = FileModuleCreator()
|
||||
LaunchFileModule.Check(RES_FILE_TYPE.LAUNCH_MODULE, PathModule, VersionModule, OnCheckLaunchModuleComplete)
|
||||
else
|
||||
CheckDocUpdate()
|
||||
end
|
||||
end
|
||||
|
||||
CheckDocUpdate = function()
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
CsLog.Debug("Release 模式运行")
|
||||
DocFileModule = FileModuleCreator()
|
||||
DocFileModule.Check(RES_FILE_TYPE.MATRIX_FILE, PathModule, VersionModule, InitGame)
|
||||
elseif PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Debug then
|
||||
CsLog.Debug("Debug 模式运行")
|
||||
InitGame()
|
||||
elseif PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Editor then
|
||||
CsLog.Debug("Editor 模式运行")
|
||||
CS.XResourceManager.InitEditor()
|
||||
InitGame()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OnCheckLaunchModuleComplete = function(urlTable, needUpdate, hasLocalFiles)
|
||||
if not needUpdate or IsReloaded then
|
||||
CheckDocUpdate()
|
||||
if hasLocalFiles then
|
||||
CS.XLaunchManager.SetUrlTable(urlTable)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
CS.XUiManager.Instance:Clear()
|
||||
CS.XResourceManager.Clear()
|
||||
CS.XResourceManager.ClearFileDelegate()
|
||||
CS.XLaunchManager.SetUrlTable(urlTable)
|
||||
CS.XResourceManager.ResolveBundleManifest("launchmanifest")
|
||||
|
||||
ShowStartErrorDialog = nil
|
||||
CheckUpdate = nil
|
||||
CS.XLaunchManager.GetLaunchUi = nil
|
||||
|
||||
CS.XGame.ReloadLaunchModule()
|
||||
end
|
||||
|
||||
|
||||
InitGame = function(urlTable)
|
||||
urlTable = urlTable or {}
|
||||
for k, v in pairs(urlTable) do
|
||||
local url = ResFileUrlTable[k]
|
||||
if url then
|
||||
CS.XLog.Error("资源文件key重复,key:" .. tostring(k))
|
||||
return
|
||||
end
|
||||
ResFileUrlTable[k] = v
|
||||
end
|
||||
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_LOADING)
|
||||
|
||||
local import = CS.XLuaEngine.Import
|
||||
|
||||
import("XLaunchCommon")
|
||||
import("XLaunchUi")
|
||||
|
||||
--TODO
|
||||
GetResFileUrl = function(path)
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
return ResFileUrlTable[path]
|
||||
elseif PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Debug then
|
||||
return PathModule.GetDebugFilePath() .. "/" .. path
|
||||
else
|
||||
return path
|
||||
end
|
||||
end
|
||||
|
||||
CS.XLaunchManager.GetPrimaryFileUrl = GetResFileUrl
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
--
|
||||
--CS.XResourceManager.ClearFileDelegate()
|
||||
CS.XResourceManager.AddFileDelegate(GetResFileUrl)
|
||||
|
||||
CS.XResourceManager.ResolveBundleManifest("matrixmanifest")
|
||||
end
|
||||
CS.XGame.InitGame()
|
||||
end
|
||||
--- <<<<<<<<<<<<<<<<<<<<<<<<<< 私有方法 * 定义 <<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
CheckUpdate = function(isReloaded)
|
||||
IsReloaded = isReloaded or false
|
||||
CS.XLaunchManager.GetLaunchUi = XLaunchUiModule.NewLaunchUi
|
||||
if not IsReloaded then
|
||||
XLaunchUiModule.RegisterLaunchUi()
|
||||
end
|
||||
|
||||
--测试模式,初始化资源管理器
|
||||
if PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Debug then
|
||||
CS.XResourceManager.InitBundleDebug(PathModule.GetDebugFilePath())
|
||||
elseif PathModule.IsEditorOrStandalone() and CsApplication.Mode == CS.XMode.Editor then
|
||||
CS.XResourceManager.InitEditor()
|
||||
end
|
||||
|
||||
-- 开启Launch模块Ui
|
||||
CS.XUiManager.Instance:Open("UiLaunch")
|
||||
CS.XRecord.Record("50000", "UiLaunchand")
|
||||
|
||||
VersionModule = require(APP_VERSION_MODULE_NAME)
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
CS.XHeroBdcAgent.BdcUpdateGame("201", "1", "0")
|
||||
end
|
||||
|
||||
if VersionModule.CheckAppUpdate() then
|
||||
-- if IsApkTesting or VersionModule.CheckAppUpdate() then
|
||||
local tmpStr = CsStringEx.Format(CsApplication.GetText("UpdateApplication"), CsInfo.Version)
|
||||
CsTool.WaitCoroutine(CsApplication.CoDialog(CsApplication.GetText("Tip"), tmpStr, nil, function()
|
||||
local jumpCB = function()
|
||||
print("[Apk] - Failed to Download Apk.")
|
||||
CsTool.WaitCoroutine(CsApplication.GoToUpdateURL(PathModule.GetAppUpgradeUrl()), nil)
|
||||
end
|
||||
local downloadCB = function(url)
|
||||
BeforeDownloadApk(url)
|
||||
end
|
||||
TryDownloadApk(downloadCB, jumpCB)
|
||||
end))
|
||||
else
|
||||
-- 无需更新,并删除本地下载的Apk
|
||||
if CheckDownloadChannel() and IO.File.Exists(ApkSavePath) then
|
||||
print("[Apk] - Clean Apk path:" .. ApkSavePath)
|
||||
CS.XFileTool.DeleteFile(ApkSavePath)
|
||||
end
|
||||
|
||||
local LaunchUpdateFunc = function()
|
||||
if not PathModule.IsEditorOrStandalone() or CsApplication.Mode == CS.XMode.Release then
|
||||
CS.XHeroBdcAgent.BdcUpdateGame("202", "1", "0")
|
||||
end
|
||||
CheckLaunchModuleUpdate()
|
||||
end
|
||||
|
||||
if CsRemoteConfig.Debug then
|
||||
CheckLocalZipFile(LaunchUpdateFunc)
|
||||
else
|
||||
LaunchUpdateFunc()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
GetAppUpgradeUrl = function ()
|
||||
return PathModule.GetAppUpgradeUrl()
|
||||
end
|
||||
|
||||
|
||||
--============检查本地压缩包=========
|
||||
function CheckLocalZipFile(cb)
|
||||
local documentPath = CS.UnityEngine.Application.persistentDataPath .. "/document"
|
||||
if not CS.System.IO.Directory.Exists(documentPath) then
|
||||
cb()
|
||||
return
|
||||
end
|
||||
|
||||
local files = CS.System.IO.Directory.GetFiles(documentPath, "*.zip", CS.System.IO.SearchOption.TopDirectoryOnly)
|
||||
print("[Unzip] DocumentPath:" .. tostring(documentPath) .. ", files.length:" .. tostring(files.Length))
|
||||
local length = files.Length
|
||||
local function UnzipFile(index)
|
||||
if index >= length then
|
||||
if index > 0 then
|
||||
CsApplication.SetProgress(1)
|
||||
print("[Unzip] Finished.")
|
||||
end
|
||||
cb()
|
||||
return
|
||||
end
|
||||
local file = files[index]
|
||||
local nextIndex = index + 1
|
||||
if string.find(file, "source") then
|
||||
local overwrite = true
|
||||
local password = nil
|
||||
local totalCount = CS.ZipUtility.GetZipEntityCount(file, password)
|
||||
print("[Unzip] Start File: " .. tostring(file))
|
||||
|
||||
if (totalCount > 0) then
|
||||
local cancelCB = function()
|
||||
UnzipFile(nextIndex)
|
||||
end
|
||||
local confirmCB = function()
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD, totalCount, false, CsApplication.GetText("Unzip") .. "(%d/%d)") -- 解压资源
|
||||
CsApplication.SetProgress(0)
|
||||
|
||||
local progressCB = function(counter, name)
|
||||
local progress = counter / totalCount
|
||||
CsApplication.SetProgress(progress)
|
||||
|
||||
print("[Unzip] progress:" .. tostring(counter) .. "/" .. tostring(totalCount) .. ", name:" .. tostring(name) .. ", zipFile: " .. tostring(file) .. ", outputPath:" .. tostring(documentPath))
|
||||
end
|
||||
|
||||
local finishCB = function(counter)
|
||||
if counter >= totalCount then
|
||||
print("[Unzip] Completed file:" .. tostring(file))
|
||||
CS.XFileTool.DeleteFile(file)
|
||||
UnzipFile(nextIndex)
|
||||
end
|
||||
end
|
||||
CS.ZipUtility.UnzipFile(file, documentPath, progressCB, finishCB, overwrite, password)
|
||||
end
|
||||
local text = "检查到本地压缩文件" .. CS.XFileTool.GetFileNameWithoutExtension(file) .. ", 是否进行解压?"
|
||||
CsTool.WaitCoroutine(CsApplication.CoDialog(CsApplication.GetText("Tip"), text, cancelCB, confirmCB))
|
||||
else
|
||||
print("[Unzip] count <= 0, zipFile: " .. tostring(file))
|
||||
UnzipFile(nextIndex)
|
||||
end
|
||||
else
|
||||
print("[Unzip] name not Contains 'source', zipFile: " .. tostring(file))
|
||||
UnzipFile(nextIndex)
|
||||
end
|
||||
end
|
||||
local index = 0
|
||||
UnzipFile(index)
|
||||
end
|
||||
|
||||
|
||||
--============包内下载apk逻辑=========
|
||||
function CheckDownloadChannel()
|
||||
local channelId = CS.XHgSdkAgent.GetChannelId()
|
||||
return (channelId == OPPO_CHANNEL_ID)
|
||||
end
|
||||
|
||||
-- 可在包内强更 调用downloadCB, 否则调用jumpCB跳转外链下载
|
||||
function TryDownloadApk(downloadCB, jumpCB)
|
||||
if not CheckDownloadChannel() then
|
||||
-- if not IsApkTesting and not CheckDownloadChannel() then
|
||||
jumpCB()
|
||||
return
|
||||
end
|
||||
|
||||
-- 清理过期的下载临时文件
|
||||
local curVersion = CsRemoteConfig.ApplicationVersion
|
||||
local tempFile = ApkSavePath .. ".download"
|
||||
if IO.File.Exists(tempFile) then
|
||||
local lastDownloadVersion = CS.UnityEngine.PlayerPrefs.GetString(DOWNLOAD_APK_VERSION, "")
|
||||
print("[APK] - Last down load versin:" .. lastDownloadVersion .. ", current:" .. curVersion)
|
||||
if lastDownloadVersion ~= curVersion then
|
||||
CS.XFileTool.DeleteFile(tempFile)
|
||||
end
|
||||
end
|
||||
CS.UnityEngine.PlayerPrefs.SetString(DOWNLOAD_APK_VERSION, curVersion)
|
||||
CS.UnityEngine.PlayerPrefs.Save()
|
||||
|
||||
local channelId = CS.XHgSdkAgent.GetChannelId()
|
||||
-- local channelId = IsApkTesting and OPPO_CHANNEL_ID or CS.XHeroSdkAgent.GetChannelId()
|
||||
|
||||
local request = CS.XUriPrefixRequest.Get(ApkListUrl, nil, APK_TIMEOUT)
|
||||
CS.XTool.WaitCoroutine(request:SendWebRequest(), function()
|
||||
if request.isNetworkError or request.isHttpError or not request.downloadHandler then
|
||||
CsLog.Error("[Apk] - Request apkList error:" .. tostring(request.error))
|
||||
jumpCB()
|
||||
return
|
||||
end
|
||||
|
||||
local content = request.downloadHandler.text
|
||||
local url = nil
|
||||
for k, v in string.gmatch(content, "\"(%d+)\" : \"(.-)\"") do
|
||||
local cid = tonumber(k)
|
||||
if cid == channelId then
|
||||
url = v
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if url then
|
||||
downloadCB(url)
|
||||
else
|
||||
jumpCB()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- 获取apk大小并开始下载
|
||||
function BeforeDownloadApk(apkUrl)
|
||||
print("[Apk] - Start Downloading Apk:" .. apkUrl)
|
||||
local request = CS.UnityEngine.Networking.UnityWebRequest.Head(apkUrl)
|
||||
request.timeout = APK_TIMEOUT
|
||||
CS.XTool.WaitNativeCoroutine(request:SendWebRequest(), function()
|
||||
if request.isNetworkError or request.isHttpError then
|
||||
CsLog.Error("[Apk] - Request ApkUrl error:" .. tostring(request.error))
|
||||
ShowStartErrorDialog("DownloadAPKError", function()
|
||||
BeforeDownloadApk(apkUrl)
|
||||
end)
|
||||
return
|
||||
end
|
||||
|
||||
ApkFileSize = request:GetResponseHeader("Content-Length")
|
||||
print("[Apk] - Request ApkFileSize is " .. tostring(ApkFileSize))
|
||||
ApkFileSize = tonumber(ApkFileSize)
|
||||
StartDownloadApk(apkUrl)
|
||||
end)
|
||||
end
|
||||
|
||||
function StartDownloadApk(apkUrl)
|
||||
print("[Apk] - Start to download.")
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD, ApkFileSize)
|
||||
|
||||
local cache = true
|
||||
local sha1 = nil
|
||||
local downloader = CS.XDownloader(apkUrl, ApkSavePath, cache, sha1, APK_TIMEOUT)
|
||||
|
||||
local isDownloading = false
|
||||
CS.XTool.WaitCoroutinePerFrame(downloader:Send(), function(isComplete)
|
||||
if not isComplete then
|
||||
if not isDownloading then
|
||||
isDownloading = true
|
||||
print("[Apk] - Init Download Apk Info:", downloader.CurrentSize, ApkFileSize)
|
||||
CsGameEventManager:Notify(CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD, ApkFileSize)
|
||||
end
|
||||
|
||||
local downloadedSize = downloader.CurrentSize
|
||||
local progress = downloadedSize / ApkFileSize
|
||||
CsApplication.SetProgress(progress)
|
||||
|
||||
else
|
||||
local localFileSize = 0
|
||||
if isDownloading then
|
||||
localFileSize = downloader.CurrentSize
|
||||
elseif IO.File.Exists(ApkSavePath) then
|
||||
local fs = IO.File.Open(ApkSavePath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
|
||||
localFileSize = tonumber(fs.Length)
|
||||
fs:Close()
|
||||
end
|
||||
local isFinish = (localFileSize == ApkFileSize)
|
||||
|
||||
print("[Apk] - Finish Download:" .. tostring(downloader.State) .. ", localFileSize:" .. localFileSize.. ", Size:" .. ApkFileSize .. ", isFinish:" .. tostring(isFinish))
|
||||
if not isFinish then
|
||||
local function CleanAndDownload()
|
||||
if IO.File.Exists(ApkSavePath) then
|
||||
print("[Apk] - Clean downloaded Error File:" .. ApkSavePath)
|
||||
CS.XFileTool.DeleteFile(ApkSavePath)
|
||||
end
|
||||
StartDownloadApk(apkUrl)
|
||||
end
|
||||
|
||||
if isDownloading then -- 下载过程失败才询问
|
||||
ShowStartErrorDialog("DownloadAPKError", CleanAndDownload, CsApplication.Exit)
|
||||
else
|
||||
CleanAndDownload()
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if downloader.State ~= CS.XDownloaderState.Success then
|
||||
CsLog.Error("[Apk] - Download Error state:" .. tostring(downloader.State) .. ", Exception:" .. tostring(downloader.Exception and downloader.Exception.Message))
|
||||
ShowStartErrorDialog("DownloadAPKError", function()
|
||||
StartDownloadApk(apkUrl)
|
||||
end)
|
||||
return
|
||||
end
|
||||
|
||||
CsApplication.SetProgress(1)
|
||||
CS.XTool.OpenFile(ApkSavePath, function(result)
|
||||
print("[Apk] - Open File result:" .. tostring(result))
|
||||
CsApplication.Exit()
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end
|
||||
--============包内下载apk逻辑 end=========
|
24
Script/launch/XLaunchUiModule.lua
Normal file
24
Script/launch/XLaunchUiModule.lua
Normal file
|
@ -0,0 +1,24 @@
|
|||
local XLaunchUiModule = {}
|
||||
local LAUNCH_UI = "XLaunchUi/XLaunchUi"
|
||||
local LAUNCH_UI_PREFAB = "Assets/Launch/Ui/Prefab/UiLaunch.prefab"
|
||||
local hot_ui_ctor = require(LAUNCH_UI)
|
||||
|
||||
function XLaunchUiModule.RegisterLaunchUi()
|
||||
local success = CS.XUiManager.Instance:Register("UiLaunch", CS.XUiType.Normal, CS.XUiResType.Bundle, true, LAUNCH_UI_PREFAB, nil, nil, 0, false, false)
|
||||
if not success then
|
||||
CS.XLog.Error("注册UI: UiLaunch 失败!!")
|
||||
end
|
||||
return success
|
||||
end
|
||||
|
||||
function XLaunchUiModule.NewLaunchUi(uiName, uiProxy)
|
||||
if uiName == "UiLaunch" then
|
||||
local ui = hot_ui_ctor()
|
||||
ui:Ctor(uiName, uiProxy)
|
||||
return ui
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
return XLaunchUiModule
|
293
Script/launch/xlaunchcommon/XMessagePack.lua
Normal file
293
Script/launch/xlaunchcommon/XMessagePack.lua
Normal file
|
@ -0,0 +1,293 @@
|
|||
local type = type
|
||||
local pairs = pairs
|
||||
local pcall = pcall
|
||||
local select = select
|
||||
local table = table
|
||||
local string = string
|
||||
local math = math
|
||||
local utf8 = utf8
|
||||
|
||||
local tableConcat = table.concat
|
||||
local tableInsert = table.insert
|
||||
local tableUnpack = table.unpack
|
||||
local stringPack = string.pack
|
||||
local stringUnpack = string.unpack
|
||||
local stringFormat = string.format
|
||||
local mathType = math.type
|
||||
local utf8Len = utf8.len
|
||||
|
||||
local decoderTable
|
||||
|
||||
local function Unpack(context, format)
|
||||
local value, position = stringUnpack(format, context.input, context.position)
|
||||
context.position = position
|
||||
return value
|
||||
end
|
||||
|
||||
local function DecodeNext(context)
|
||||
return decoderTable[Unpack(context, ">B")](context)
|
||||
end
|
||||
|
||||
local function DecodeArray(context, length)
|
||||
local array = {}
|
||||
for i = 1, length do
|
||||
array[i] = DecodeNext(context)
|
||||
end
|
||||
return array
|
||||
end
|
||||
|
||||
local function DecodeMap(context, length)
|
||||
local map = {}
|
||||
for _ = 1, length do
|
||||
local k = DecodeNext(context)
|
||||
local v = DecodeNext(context)
|
||||
map[k] = v
|
||||
end
|
||||
return map
|
||||
end
|
||||
|
||||
decoderTable = {
|
||||
[192] = function() return nil end,
|
||||
[194] = function() return false end,
|
||||
[195] = function() return true end,
|
||||
[196] = function(context) return Unpack(context, ">s1") end,
|
||||
[197] = function(context) return Unpack(context, ">s2") end,
|
||||
[198] = function(context) return Unpack(context, ">s4") end,
|
||||
[202] = function(context) return Unpack(context, ">f") end,
|
||||
[203] = function(context) return Unpack(context, ">d") end,
|
||||
[204] = function(context) return Unpack(context, ">I1") end,
|
||||
[205] = function(context) return Unpack(context, ">I2") end,
|
||||
[206] = function(context) return Unpack(context, ">I4") end,
|
||||
[207] = function(context) return Unpack(context, ">I8") end,
|
||||
[208] = function(context) return Unpack(context, ">i1") end,
|
||||
[209] = function(context) return Unpack(context, ">i2") end,
|
||||
[210] = function(context) return Unpack(context, ">i4") end,
|
||||
[211] = function(context) return Unpack(context, ">i8") end,
|
||||
[217] = function(context) return Unpack(context, ">s1") end,
|
||||
[218] = function(context) return Unpack(context, ">s2") end,
|
||||
[219] = function(context) return Unpack(context, ">s4") end,
|
||||
[220] = function(context) return DecodeArray(context, Unpack(context, ">I2")) end,
|
||||
[221] = function(context) return DecodeArray(context, Unpack(context, ">I4")) end,
|
||||
[222] = function(context) return DecodeMap(context, Unpack(context, ">I2")) end,
|
||||
[223] = function(context) return DecodeMap(context, Unpack(context, ">I4")) end,
|
||||
}
|
||||
|
||||
-- add single byte integers
|
||||
for i = 0, 127 do
|
||||
decoderTable[i] = function() return i end
|
||||
end
|
||||
for i = 224, 255 do
|
||||
decoderTable[i] = function() return -32 + i - 224 end
|
||||
end
|
||||
|
||||
-- add fixed maps
|
||||
for i = 128, 143 do
|
||||
decoderTable[i] = function(context) return DecodeMap(context, i - 128) end
|
||||
end
|
||||
|
||||
-- add fixed arrays
|
||||
for i = 144, 159 do
|
||||
decoderTable[i] = function(context) return DecodeArray(context, i - 144) end
|
||||
end
|
||||
|
||||
-- add fixed strings
|
||||
for i = 160, 191 do
|
||||
local format = stringFormat(">c%d", i - 160)
|
||||
decoderTable[i] = function(context) return Unpack(context, format) end
|
||||
end
|
||||
|
||||
local encoderTable
|
||||
|
||||
local function EncodeValue(value)
|
||||
return encoderTable[type(value)](value)
|
||||
end
|
||||
|
||||
local function CheckArray(value) -- simple function to verify a table is a proper array
|
||||
local count = 0
|
||||
for k in pairs(value) do
|
||||
if type(k) ~= "number" then
|
||||
return false
|
||||
else
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
for i = 1, count do
|
||||
if not value[i] and type(value[i]) ~= "nil" then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
encoderTable = {
|
||||
["nil"] = function()
|
||||
return stringPack(">B", 192)
|
||||
end,
|
||||
|
||||
["boolean"] = function(value)
|
||||
return stringPack(">B", value and 195 or 194)
|
||||
end,
|
||||
|
||||
["string"] = function(value)
|
||||
local length = #value
|
||||
if utf8Len(value) then -- valid UTF-8 ... encode as string
|
||||
if length < 32 then
|
||||
return stringPack(">B", 160 + length) .. value
|
||||
elseif length <= 255 then
|
||||
return stringPack(">B s1", 217, value)
|
||||
elseif length <= 65535 then
|
||||
return stringPack(">B s2", 218, value)
|
||||
else
|
||||
return stringPack(">B s4", 219, value)
|
||||
end
|
||||
else -- encode as binary
|
||||
if length <= 255 then
|
||||
return stringPack(">B s1", 196, value)
|
||||
elseif length <= 65535 then
|
||||
return stringPack(">B s2", 197, value)
|
||||
else
|
||||
return stringPack(">B s4", 198, value)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
["number"] = function(value)
|
||||
if mathType(value) == "integer" then
|
||||
if value >= 0 then
|
||||
if value <= 127 then
|
||||
return stringPack(">B", value)
|
||||
elseif value <= 255 then
|
||||
return stringPack(">B I1", 204, value)
|
||||
elseif value <= 65535 then
|
||||
return stringPack(">B I2", 205, value)
|
||||
elseif value <= 4294967295 then
|
||||
return stringPack(">B I4", 206, value)
|
||||
else
|
||||
return stringPack(">B I8", 207, value)
|
||||
end
|
||||
else
|
||||
if value >= -32 then
|
||||
return stringPack(">B", 224 + value + 32)
|
||||
elseif value >= -127 then
|
||||
return stringPack(">B i1", 208, value)
|
||||
elseif value >= -32767 then
|
||||
return stringPack(">B i2", 209, value)
|
||||
elseif value >= -2147483647 then
|
||||
return stringPack(">B i4", 210, value)
|
||||
else
|
||||
return stringPack(">B i8", 211, value)
|
||||
end
|
||||
end
|
||||
else
|
||||
local converted = stringUnpack(">f", stringPack(">f", value))
|
||||
if converted == value then
|
||||
return stringPack(">B f", 202, value)
|
||||
else
|
||||
return stringPack(">B d", 203, value)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
["table"] = function(value)
|
||||
local meta = getmetatable(value)
|
||||
if CheckArray(value) and (meta == nil or not meta.IsTable) then
|
||||
local elements = {}
|
||||
for i, v in pairs(value) do
|
||||
elements[i] = EncodeValue(v)
|
||||
end
|
||||
|
||||
local length = #elements
|
||||
if length == 0 then
|
||||
return stringPack(">B", 192)
|
||||
end
|
||||
|
||||
if length <= 15 then
|
||||
return stringPack(">B", 144 + length) .. tableConcat(elements)
|
||||
elseif length <= 65535 then
|
||||
return stringPack(">B I2", 220, length) .. tableConcat(elements)
|
||||
else
|
||||
return stringPack(">B I4", 221, length) .. tableConcat(elements)
|
||||
end
|
||||
else
|
||||
local elements = {}
|
||||
for k, v in pairs(value) do
|
||||
elements[#elements + 1] = EncodeValue(k)
|
||||
elements[#elements + 1] = EncodeValue(v)
|
||||
end
|
||||
|
||||
local length = #elements // 2
|
||||
if length == 0 then
|
||||
return stringPack(">B", 192)
|
||||
end
|
||||
|
||||
if length <= 15 then
|
||||
return stringPack(">B", 128 + length) .. tableConcat(elements)
|
||||
elseif length <= 65535 then
|
||||
return stringPack(">B I2", 222, length) .. tableConcat(elements)
|
||||
else
|
||||
return stringPack(">B I4", 223, length) .. tableConcat(elements)
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
XMessagePack = XMessagePack or {}
|
||||
|
||||
function XMessagePack.Encode(value)
|
||||
local ok, result = pcall(EncodeValue, value)
|
||||
if ok then
|
||||
return result
|
||||
else
|
||||
return nil, stringFormat("XMessagePack cannot encode type %s", type(value))
|
||||
end
|
||||
end
|
||||
|
||||
function XMessagePack.EncodeAll(...)
|
||||
local result = {}
|
||||
for i = 1, select("#", ...) do
|
||||
local data, error = XMessagePack.Encode(select(i, ...))
|
||||
if data then
|
||||
tableInsert(result, data)
|
||||
else
|
||||
return nil, error
|
||||
end
|
||||
end
|
||||
return tableConcat(result)
|
||||
end
|
||||
|
||||
function XMessagePack.Decode(input, position)
|
||||
local context = { input = input, position = position or 1 }
|
||||
local ok, result = pcall(DecodeNext, context)
|
||||
if ok then
|
||||
return result, context.position
|
||||
else
|
||||
return nil, stringFormat("XMessagePack cannot decode position %d", context.position)
|
||||
end
|
||||
end
|
||||
|
||||
function XMessagePack.DecodeAll(input, position)
|
||||
local context = { input = input, position = position or 1 }
|
||||
local result = {}
|
||||
while context.position <= #context.input do
|
||||
local ok, value = pcall(DecodeNext, context)
|
||||
if ok then
|
||||
tableInsert(result, value)
|
||||
else
|
||||
return nil, stringFormat("XMessagePack cannot decode position %d", context.position)
|
||||
end
|
||||
end
|
||||
return tableUnpack(result)
|
||||
end
|
||||
|
||||
function XMessagePack.MarkAsTable(value)
|
||||
if value == nil then
|
||||
CS.XLog.Error("XMessagePack.MarkAsTable 函数错误, 参数value不能为空")
|
||||
return
|
||||
end
|
||||
if type(value) ~= "table" then
|
||||
local errorInfo = "XMessagePack.MarkAsTable 函数错误, 参数value的类型需要是table类型的, value的类型是" .. type(value)
|
||||
CS.XLog.Error(errorInfo)
|
||||
return
|
||||
end
|
||||
setmetatable(value, {IsTable = true})
|
||||
end
|
377
Script/launch/xlaunchui/XLaunchUi.lua
Normal file
377
Script/launch/xlaunchui/XLaunchUi.lua
Normal file
|
@ -0,0 +1,377 @@
|
|||
local Creator = function()
|
||||
local XUiLaunchUi = {}
|
||||
|
||||
function XUiLaunchUi:OnAwake()
|
||||
--self.TxtProgressLoading.gameObject:SetActiveEx(true)
|
||||
--CS.XLog.Error("new ui lua.")
|
||||
self.UiLoading = self.UiLoading.gameObject
|
||||
self.UiDownload = self.UiDownload.gameObject
|
||||
self.UiVideoPlay = self.UiVideoPlay.gameObject
|
||||
self.UiDownlosdTips = self.UiDownlosdTips.gameObject
|
||||
|
||||
self.UiLoading:SetActiveEx(false)
|
||||
self.UiDownload:SetActiveEx(false)
|
||||
self.UiVideoPlay:SetActiveEx(false)
|
||||
self.UiDownlosdTips:SetActiveEx(false)
|
||||
|
||||
--self.BtnSkipVideo.CallBack = delegate(int i) { }
|
||||
self.BtnMusicOn.CallBack = function()
|
||||
self.BtnMusicOn.gameObject:SetActiveEx(false)
|
||||
self.BtnMusicOff.gameObject:SetActiveEx(true)
|
||||
end
|
||||
self.BtnMusicOff.CallBack = function()
|
||||
self.BtnMusicOn.gameObject:SetActiveEx(true)
|
||||
self.BtnMusicOff.gameObject:SetActiveEx(false)
|
||||
end
|
||||
|
||||
self.BtnBasic.CallBack = function() self:OnSelectBasic() end
|
||||
self.BtnAll.CallBack = function() self:OnSelectAllDlc() end
|
||||
self.BtnConfirmSelect.CallBack = function() self:OnConfirmSelect() end
|
||||
|
||||
|
||||
--self.BtnVideo.CallBack = delegate (int i) { }
|
||||
self.UpdateSize = 0
|
||||
self.MBSize = 0
|
||||
self.LastUpdateTime = 0
|
||||
self.LastProgress = 0
|
||||
|
||||
self.CurrentDownloadSelect = 1
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnStart()
|
||||
self:HideHealthTip()
|
||||
end
|
||||
|
||||
function XUiLaunchUi:HideHealthTip()
|
||||
if self.UiLoading then -- 海外屏蔽健康提示十六字真言(不想改UI免得还得修改)
|
||||
for i = 1, self.UiLoading.transform.childCount do
|
||||
local child = self.UiLoading.transform:GetChild(i-1)
|
||||
if child.name == "Text" then
|
||||
child.gameObject:SetActiveEx(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnEnable()
|
||||
CS.UnityEngine.Screen.sleepTimeout = CS.UnityEngine.SleepTimeout.NeverSleep
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnDisable()
|
||||
CS.UnityEngine.Screen.sleepTimeout = CS.UnityEngine.SleepTimeout.SystemSetting
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnDestroy()
|
||||
self.BtnMusicOn.CallBack = nil
|
||||
self.BtnMusicOff.CallBack = nil
|
||||
|
||||
self.BtnBasic.CallBack = nil
|
||||
self.BtnAll.CallBack = nil
|
||||
self.BtnConfirmSelect.CallBack = nil
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnGetEvents()
|
||||
return { CS.XEventId.EVENT_LAUNCH_SETMESSAGE,
|
||||
CS.XEventId.EVENT_LAUNCH_SETPROGRESS,
|
||||
CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD,
|
||||
CS.XEventId.EVENT_LAUNCH_START_LOADING,
|
||||
CS.XEventId.EVENT_LAUNCH_SHOW_DOWNLOAD_SELECT}
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnNotify(evt, ...)
|
||||
local args = { ... }
|
||||
if evt == CS.XEventId.EVENT_LAUNCH_START_DOWNLOAD then
|
||||
self.UiDownload:SetActiveEx(true)
|
||||
self.UiLoading:SetActiveEx(false)
|
||||
self.UpdateSize = args[1]
|
||||
self.NeedUnit = (args[2] ~= false)
|
||||
self.MBSize = self.NeedUnit and self.UpdateSize / 1024 / 1024 or self.UpdateSize
|
||||
self.CustomFormat = args[3]
|
||||
|
||||
if self.NeedUnit then
|
||||
self.TxtDownloadSize.text = string.format("(0MB/%dMB)", math.floor(self.MBSize))
|
||||
else
|
||||
self.TxtDownloadSize.text = string.format("(0/%d)", math.floor(self.MBSize))
|
||||
self.TxtDownloadSpeed.text = ""
|
||||
end
|
||||
elseif evt == CS.XEventId.EVENT_LAUNCH_START_LOADING then
|
||||
self.UiDownload:SetActiveEx(false)
|
||||
self.UiLoading:SetActiveEx(true)
|
||||
elseif evt == CS.XEventId.EVENT_LAUNCH_SETMESSAGE then
|
||||
self.TxtMessageLoading.text = tostring(args[1])
|
||||
elseif evt == CS.XEventId.EVENT_LAUNCH_SETPROGRESS then
|
||||
self.VideoPlayer.targetCamera = CS.XUiManager.Instance.UiCamera
|
||||
local progress = args[1]
|
||||
if (self.UiLoading.activeInHierarchy) then
|
||||
self.SliderLoading.value = progress
|
||||
self.TxtProgressLoading.text = string.format("%d%%", math.floor(progress * 100))
|
||||
elseif (self.UiDownload.activeInHierarchy) then
|
||||
-- 版本
|
||||
if (self.TxtAppVer ~= nil and self.TxtAppVer:Exist()) then
|
||||
self.TxtAppVer.text = CS.XRemoteConfig.ApplicationVersion .. " (ApplicationVersion)"
|
||||
end
|
||||
if (self.TxtDocVer ~= nil and self.TxtDocVer:Exist()) then
|
||||
self.TxtDocVer.text = CS.XRemoteConfig.DocumentVersion .. " (DocumentVersion)"
|
||||
end
|
||||
-- 速度
|
||||
if self.NeedUnit and (CS.UnityEngine.Time.time - self.LastUpdateTime > 1) then
|
||||
local kBSpeed = (progress - self.LastProgress) * (self.UpdateSize / 1024)
|
||||
self.TxtDownloadSpeed.text = string.format("%dKB/S", math.floor(kBSpeed))
|
||||
self.LastUpdateTime = CS.UnityEngine.Time.time
|
||||
self.LastProgress = progress
|
||||
end
|
||||
self.SliderDownload.value = progress
|
||||
self.TxtProgressDownload.text = string.format("%d%%", math.floor(progress * 100))
|
||||
self.TxtDownloadSize.text = string.format("(%dMB/%dMB)", math.floor(self.MBSize * progress), math.floor(self.MBSize))
|
||||
-- 进度
|
||||
if self.NeedUnit then
|
||||
self.TxtDownloadSize.text = string.format(self.CustomFormat or "(%dMB/%dMB)", math.floor(self.MBSize * progress), math.floor(self.MBSize))
|
||||
else
|
||||
self.TxtDownloadSize.text = string.format(self.CustomFormat or "(%d/%d)", math.floor(self.MBSize * progress), math.floor(self.MBSize))
|
||||
end
|
||||
|
||||
elseif (self.UiVideoPlay.activeInHierarchy) then
|
||||
self.TxtProgressVideoPlay.text = string.format("%d%%", math.floor(progress * 100))
|
||||
end
|
||||
elseif evt == CS.XEventId.EVENT_LAUNCH_SHOW_DOWNLOAD_SELECT then
|
||||
self:SetupDownloadSelect(args)
|
||||
end
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnSelectBasic()
|
||||
self.CurrentDownloadSelect = 1
|
||||
self.BtnBasic:SetButtonState(CS.UiButtonState.Select)
|
||||
self.BtnAll:SetButtonState(CS.UiButtonState.Normal)
|
||||
|
||||
--CS.XLog.Debug(" self.CurrentDownloadSelect == 1")
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnSelectAllDlc()
|
||||
self.CurrentDownloadSelect = 2
|
||||
self.BtnBasic:SetButtonState(CS.UiButtonState.Normal)
|
||||
self.BtnAll:SetButtonState(CS.UiButtonState.Select)
|
||||
--CS.XLog.Debug(" self.CurrentDownloadSelect == 2")
|
||||
end
|
||||
|
||||
function XUiLaunchUi:OnConfirmSelect()
|
||||
self.UiDownlosdTips:SetActiveEx(false)
|
||||
CS.XGameEventManager.Instance:Notify(CS.XEventId.EVENT_LAUNCH_DONE_DOWNLOAD_SELECT,self.CurrentDownloadSelect==2)
|
||||
end
|
||||
|
||||
local GetSizeAndUnit = function(size)
|
||||
local unit = "KB"
|
||||
local num = size / 1024
|
||||
if (num > 100) then
|
||||
unit = "MB"
|
||||
num = num / 1024
|
||||
end
|
||||
return num,unit
|
||||
end
|
||||
|
||||
function XUiLaunchUi:SetupDownloadSelect(args)
|
||||
self.UiDownlosdTips:SetActiveEx(true)
|
||||
local baseUpdateSize = args[1]
|
||||
local allUpdateSize = args[2]
|
||||
|
||||
if self.CurrentDownloadSelect == 1 then
|
||||
self:OnSelectBasic()
|
||||
else
|
||||
self:OnSelectAllDlc()
|
||||
end
|
||||
|
||||
local baseSize,baseUnit = GetSizeAndUnit(baseUpdateSize)
|
||||
local allSize,allUnit = GetSizeAndUnit(allUpdateSize)
|
||||
|
||||
|
||||
self.BtnBasic:SetNameByGroup(1,string.format("<b>%s%s</b>", tostring(math.ceil(baseSize)),baseUnit))
|
||||
|
||||
self.BtnAll:SetNameByGroup(1,string.format("<b>%s%s</b>", tostring(math.ceil(allSize)),allUnit))
|
||||
|
||||
end
|
||||
|
||||
function XUiLaunchUi:Ctor(name, uiProxy)
|
||||
self.Name = name
|
||||
self.UiProxy = uiProxy
|
||||
self.Ui = uiProxy.Ui
|
||||
end
|
||||
|
||||
function XUiLaunchUi:SetGameObject()
|
||||
self.Transform = self.Ui.Transform
|
||||
self.GameObject = self.Ui.GameObject
|
||||
self.UiAnimation = self.Ui.UiAnimation
|
||||
self:InitUiObjects()
|
||||
end
|
||||
|
||||
--用于释放lua的内存
|
||||
function XUiLaunchUi:OnRelease()
|
||||
|
||||
--self.Name = nil
|
||||
self.UiProxy = nil
|
||||
self.Ui = nil
|
||||
|
||||
self.Transform = nil
|
||||
self.GameObject = nil
|
||||
self.UiAnimation = nil
|
||||
|
||||
if self.Obj and self.Obj:Exist() then
|
||||
local nameList = self.Obj.NameList
|
||||
for _, v in pairs(nameList) do
|
||||
self[v] = nil
|
||||
end
|
||||
self.Obj = nil
|
||||
end
|
||||
|
||||
for k, v in pairs(self) do
|
||||
local t = type(v)
|
||||
if t == 'userdata' and CsXUiHelper.IsUnityObject(v) then
|
||||
self[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function XUiLaunchUi:SetUiSprite(image, spriteName, callBack)
|
||||
self.UiProxy:SetUiSprite(image, spriteName, callBack)
|
||||
end
|
||||
|
||||
--快捷隐藏界面(不建议使用)
|
||||
function XUiLaunchUi:SetActive(active)
|
||||
local temp = active and true or false
|
||||
self.UiProxy:SetActive(temp)
|
||||
end
|
||||
|
||||
--快捷关闭界面
|
||||
function XUiLaunchUi:Close()
|
||||
|
||||
if self.UiProxy == nil then
|
||||
XLog.Error(self.Name .. "重复Close")
|
||||
else
|
||||
self.UiProxy:Close()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--快捷移除UI,移除的UI不会播放进场、退场动画
|
||||
function XUiLaunchUi:Remove()
|
||||
if self.UiProxy then
|
||||
self.UiProxy:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
--注册点击事件
|
||||
--function XUiLaunchUi:RegisterClickEvent(button, handle, clear)
|
||||
--
|
||||
-- clear = clear and true or false
|
||||
-- self.UiProxy:RegisterClickEvent(button, function(eventData)
|
||||
-- if handle then
|
||||
-- handle(self, eventData)
|
||||
-- end
|
||||
-- end, clear)
|
||||
--
|
||||
--end
|
||||
--返回指定名字的子节点的Component
|
||||
--@name 子节点名称
|
||||
--@type Component类型
|
||||
function XUiLaunchUi:FindComponent(name, type)
|
||||
return self.UiProxy:FindComponent(name, type)
|
||||
end
|
||||
|
||||
|
||||
--通过名字查找GameObject 例如:A/B/C
|
||||
--@name 要查找的名字
|
||||
function XUiLaunchUi:FindGameObject(name)
|
||||
return self.UiProxy:FindGameObject(name)
|
||||
end
|
||||
|
||||
--通过名字查找Transfrom 例如:A/B/C
|
||||
--@name 要查找的名字
|
||||
function XUiLaunchUi:FindTransform(name)
|
||||
return self.UiProxy:FindTransform(name)
|
||||
end
|
||||
|
||||
--打开一个子UI
|
||||
--@childUIName 子UI名字
|
||||
--@... 传到OnStart的参数
|
||||
function XUiLaunchUi:OpenChildUi(childUIName, ...)
|
||||
self.UiProxy:OpenChildUi(childUIName, ...)
|
||||
end
|
||||
|
||||
--打开一个子UI,会关闭其他已显示的子UI
|
||||
--@childUIName 子UI名字
|
||||
--@... 传到OnStart的参数
|
||||
function XUiLaunchUi:OpenOneChildUi(childUIName, ...)
|
||||
self.UiProxy:OpenOneChildUi(childUIName, ...)
|
||||
end
|
||||
|
||||
--关闭子UI
|
||||
--@childUIName 子UI名字
|
||||
function XUiLaunchUi:CloseChildUi(childUIName)
|
||||
self.UiProxy:CloseChildUi(childUIName)
|
||||
end
|
||||
|
||||
--查找子窗口对应的lua对象
|
||||
--@childUiName 子窗口名字
|
||||
function XUiLaunchUi:FindChildUiObj(childUiName)
|
||||
local childUi = self.UiProxy:FindChildUi(childUiName)
|
||||
if childUi then
|
||||
return childUi.UiProxy.UiLuaTable
|
||||
end
|
||||
end
|
||||
|
||||
function XUiLaunchUi:InitChildUis()
|
||||
if self.Ui == nil then
|
||||
return
|
||||
end
|
||||
|
||||
if not self.Ui.UiData.HasChildUi then
|
||||
return
|
||||
end
|
||||
|
||||
local childUis = self.Ui:GetAllChildUis()
|
||||
|
||||
if childUis == nil then
|
||||
return
|
||||
end
|
||||
|
||||
--子UI初始化完成后可在父UI通过【self.Child+子UI】名称的方式直接获取句柄
|
||||
local childUiName
|
||||
for k, v in pairs(childUis) do
|
||||
childUiName = "Child" .. k
|
||||
if self[childUiName] then
|
||||
XLog.Error(string.format("%s该名字已被占用", childUiName))
|
||||
else
|
||||
self[childUiName] = v.UiProxy.UiLuaTable
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XUiLaunchUi:InitUiObjects()
|
||||
self.Obj = self.Transform:GetComponent("UiObject")
|
||||
if self.Obj ~= nil and self.Obj:Exist() then
|
||||
for i = 0, self.Obj.NameList.Count - 1 do
|
||||
self[self.Obj.NameList[i]] = self.Obj.ObjList[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--播放动画(只支持Timeline模式)
|
||||
function XUiLaunchUi:PlayAnimation(animName, callback, beginCallback)
|
||||
self.UiProxy:PlayAnimation(animName, callback, beginCallback)
|
||||
end
|
||||
|
||||
--播放动画(只支持Timeline模式, 增加Mask阻止操作打断动画)
|
||||
function XUiLaunchUi:PlayAnimationWithMask(animName, callback)
|
||||
self.UiProxy:PlayAnimation(animName, function()
|
||||
CS.XUiManager.Instance:SetMask(false)
|
||||
if callback then
|
||||
callback()
|
||||
end
|
||||
end, function()
|
||||
CS.XUiManager.Instance:SetMask(true)
|
||||
end)
|
||||
end
|
||||
|
||||
return XUiLaunchUi
|
||||
end
|
||||
|
||||
return Creator
|
1095
Script/matrix/UiRegistry.lua
Normal file
1095
Script/matrix/UiRegistry.lua
Normal file
File diff suppressed because it is too large
Load diff
164
Script/matrix/XGame.lua
Normal file
164
Script/matrix/XGame.lua
Normal file
|
@ -0,0 +1,164 @@
|
|||
XGame = XGame or {}
|
||||
|
||||
local UI_LOGIN = "UiLogin"
|
||||
|
||||
XGame.Profiler = CS.XGame.Profiler:CreateChild("XGame")
|
||||
|
||||
XGame.Start1 = function()
|
||||
XGame.Profiler:Start()
|
||||
|
||||
XConfigCenter.Init()
|
||||
--打点
|
||||
CS.XRecord.Record("23009", "LuaXGameStart")
|
||||
CS.XApplication.SetProgress(0.86)
|
||||
end
|
||||
|
||||
XGame.Start2 = function()
|
||||
XLoginManager.Init()
|
||||
|
||||
XDataCenter.Init()
|
||||
if XDataCenter.UiPcManager.IsPc() then
|
||||
XDataCenter.UiPcManager.FullScreenableCheck()
|
||||
end
|
||||
|
||||
CS.XApplication.SetProgress(0.88)
|
||||
end
|
||||
|
||||
XGame.Start3 = function()
|
||||
local playerProfiler = XGame.Profiler:CreateChild("XPlayerManager")
|
||||
playerProfiler:Start()
|
||||
XPlayerManager.Init()
|
||||
playerProfiler:Stop()
|
||||
|
||||
local userProfiler = XGame.Profiler:CreateChild("XUserManager")
|
||||
userProfiler:Start()
|
||||
XUserManager.Init()
|
||||
userProfiler:Stop()
|
||||
|
||||
local functionProfiler = XGame.Profiler:CreateChild("XFunctionManager")
|
||||
functionProfiler:Start()
|
||||
XFunctionManager.Init()
|
||||
functionProfiler:Stop()
|
||||
|
||||
local resetProfiler = XGame.Profiler:CreateChild("XResetManager")
|
||||
resetProfiler:Start()
|
||||
XResetManager.Init()
|
||||
resetProfiler:Stop()
|
||||
CS.XApplication.SetProgress(0.89)
|
||||
end
|
||||
|
||||
XGame.Start4 = function()
|
||||
XAttribManager.Init()
|
||||
CS.XApplication.SetProgress(0.95)
|
||||
end
|
||||
|
||||
XGame.Start5 = function()
|
||||
local magicProfiler = XGame.Profiler:CreateChild("XMagicSkillManager")
|
||||
magicProfiler:Start()
|
||||
XMagicSkillManager.Init()
|
||||
magicProfiler:Stop()
|
||||
|
||||
local fightCharacterProfiler = XGame.Profiler:CreateChild("XFightCharacterManager")
|
||||
fightCharacterProfiler:Start()
|
||||
XFightCharacterManager.Init()
|
||||
fightCharacterProfiler:Stop()
|
||||
|
||||
local fightEquipProfiler = XGame.Profiler:CreateChild("XFightEquipManager")
|
||||
fightEquipProfiler:Start()
|
||||
XFightEquipManager.Init()
|
||||
fightEquipProfiler:Stop()
|
||||
|
||||
local fightPartnerProfiler = XGame.Profiler:CreateChild("XFightPartnerManager")
|
||||
fightPartnerProfiler:Start()
|
||||
XFightPartnerManager.Init()
|
||||
fightPartnerProfiler:Stop()
|
||||
|
||||
local modelProfiler = XGame.Profiler:CreateChild("XModelManager")
|
||||
modelProfiler:Start()
|
||||
XModelManager.Init()
|
||||
modelProfiler:Stop()
|
||||
|
||||
local conditionProfiler = XGame.Profiler:CreateChild("XConditionManager")
|
||||
conditionProfiler:Start()
|
||||
XConditionManager.Init()
|
||||
conditionProfiler:Stop()
|
||||
|
||||
local rewardProfiler = XGame.Profiler:CreateChild("XRewardManager")
|
||||
rewardProfiler:Start()
|
||||
XRewardManager.Init()
|
||||
rewardProfiler:Stop()
|
||||
|
||||
local roomSingleProfiler = XGame.Profiler:CreateChild("XRoomSingleManager")
|
||||
roomSingleProfiler:Start()
|
||||
XRoomSingleManager.Init()
|
||||
roomSingleProfiler:Stop()
|
||||
|
||||
local robotProfiler = XGame.Profiler:CreateChild("XRobotManager")
|
||||
robotProfiler:Start()
|
||||
XRobotManager.Init()
|
||||
robotProfiler:Stop()
|
||||
|
||||
local redPointProfiler = XGame.Profiler:CreateChild("XRedPointManager")
|
||||
redPointProfiler:Start()
|
||||
XRedPointManager.Init()
|
||||
redPointProfiler:Stop()
|
||||
|
||||
--local hudProfiler = XGame.Profiler:CreateChild("XHudManager")
|
||||
--hudProfiler:Start()
|
||||
--XHudManager.Init()
|
||||
--hudProfiler:Stop()
|
||||
local permissionProfiler = XGame.Profiler:CreateChild("XPermissionManager")
|
||||
permissionProfiler:Start()
|
||||
XPermissionManager.Init()
|
||||
permissionProfiler:Stop()
|
||||
|
||||
CS.XApplication.SetProgress(1, true)
|
||||
end
|
||||
|
||||
XGame.Start6 = function()
|
||||
local serverProfiler = XGame.Profiler:CreateChild("XServerManager")
|
||||
serverProfiler:Start()
|
||||
XServerManager.Init(function()
|
||||
local UiLoginMovieId = CS.XGame.ClientConfig:GetInt("UiLoginMovieId")
|
||||
local key = string.format("LoginVideo-%s", UiLoginMovieId)
|
||||
local isPlayed = XSaveTool.GetData(key)
|
||||
if isPlayed == 1 or UiLoginMovieId == 0 then
|
||||
XLuaUiManager.PopAllThenOpen(UI_LOGIN)
|
||||
return
|
||||
end
|
||||
XSaveTool.SaveData(key, 1)
|
||||
XDataCenter.VideoManager.PlayMovie(UiLoginMovieId, function()
|
||||
XLuaUiManager.PopAllThenOpen(UI_LOGIN)
|
||||
end)
|
||||
|
||||
end)
|
||||
serverProfiler:Stop()
|
||||
XGame.Profiler:Stop()
|
||||
|
||||
XTableManager.ReleaseAll(true)
|
||||
CS.BinaryManager.OnPreloadFight(true)
|
||||
collectgarbage("collect")
|
||||
|
||||
--打点
|
||||
CS.XRecord.Record("23014", "LuaXGameStartFinish")
|
||||
LuaGC()
|
||||
end
|
||||
|
||||
local BreakPointTimerId = nil
|
||||
local BreakSocketHandle = nil
|
||||
XGame.InitBreakPointTimer = function()
|
||||
if CS.UnityEngine.Application.platform ~= CS.UnityEngine.RuntimePlatform.WindowsEditor then
|
||||
return
|
||||
end
|
||||
|
||||
-- if BreakPointTimerId then
|
||||
-- XScheduleManager.UnSchedule(BreakPointTimerId)
|
||||
-- BreakPointTimerId = nil
|
||||
-- end
|
||||
-- if not BreakSocketHandle then
|
||||
-- local debugXpCall
|
||||
-- BreakSocketHandle, debugXpCall = require("XDebug/LuaDebug")("localhost", 7003)
|
||||
-- end
|
||||
-- BreakPointTimerId = XScheduleManager.ScheduleForever(BreakSocketHandle, 0)
|
||||
end
|
||||
XGame.InitBreakPointTimer()
|
129
Script/matrix/XHotReload.lua
Normal file
129
Script/matrix/XHotReload.lua
Normal file
|
@ -0,0 +1,129 @@
|
|||
-- 用于运行时热重载LUA逻辑,热键F3,在XDataCenter中初始化的相关Manager文件中涉及数据的改动需要重登或断线重连后生效(仅editor + debug模式下生效)
|
||||
XHotReload = XHotReload or {}
|
||||
|
||||
local function updateFunc(newFunc, oldFunc)
|
||||
assert("function" == type(newFunc))
|
||||
assert("function" == type(oldFunc))
|
||||
|
||||
local newUpvalueDic = {}
|
||||
for i = 1, math.huge do
|
||||
local name, newValue = debug.getupvalue(newFunc, i)
|
||||
if not name then break end
|
||||
newUpvalueDic[name] = newValue
|
||||
end
|
||||
|
||||
for i = 1, math.huge do
|
||||
local name = debug.getupvalue(oldFunc, i)
|
||||
if not name then break end
|
||||
local newValue = newUpvalueDic[name]
|
||||
if newValue then
|
||||
debug.setupvalue(oldFunc, i, newValue)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local updateTable
|
||||
function updateTable(newTable, oldTable)
|
||||
if "table" ~= type(oldTable) then return end
|
||||
if "table" ~= type(newTable) then return end
|
||||
|
||||
for key, newValue in pairs(newTable) do
|
||||
local oldValue = oldTable[key]
|
||||
local typeValue = type(newValue)
|
||||
|
||||
if typeValue == "table" then
|
||||
updateTable(newValue, oldValue)
|
||||
elseif typeValue == "function" then
|
||||
updateFunc(newValue, oldValue)
|
||||
end
|
||||
oldTable[key] = newValue--此处未处理newTable中值数量少于oldTable的情况
|
||||
end
|
||||
|
||||
local oldMeta = debug.getmetatable(oldTable)
|
||||
local newMeta = debug.getmetatable(newTable)
|
||||
if type(oldMeta) == "table" and type(newMeta) == "table" then
|
||||
updateTable(newMeta, oldMeta)
|
||||
end
|
||||
end
|
||||
|
||||
local function TryRunInitConfig(fileName)
|
||||
local _, endPos = string.find(fileName, "XConfig/")
|
||||
if not endPos or endPos < 0 then return end
|
||||
|
||||
local className = string.sub(fileName, endPos + 1)
|
||||
local class = rawget(_G, className)
|
||||
if not class then return end
|
||||
|
||||
if class.Init then class.Init() end
|
||||
end
|
||||
|
||||
local function TryReplaceManager(filePath)
|
||||
local _, endPos = string.find(filePath, "XManager/")
|
||||
if not endPos or endPos < 0 then return end
|
||||
local name = string.sub(filePath, endPos + 1)
|
||||
|
||||
local creatorName = string.format("%sCreator", name)
|
||||
local managerVar = rawget(_G, creatorName) or rawget(_G, name)
|
||||
if type(managerVar) == "function" then
|
||||
local newManager = managerVar()
|
||||
updateTable(newManager, XDataCenter[name])
|
||||
elseif type(managerVar) == "table" and managerVar.Init then
|
||||
managerVar.Init()
|
||||
XLog.Debug(string.format("已重新运行%s的Init", name))
|
||||
end
|
||||
end
|
||||
|
||||
function XHotReload.Reload(fileName)
|
||||
if not XMain.IsEditorDebug then return end
|
||||
|
||||
--local info = debug.getinfo(2)
|
||||
if not package.loaded[fileName] then
|
||||
XLog.Error("XHotReload.Reload reload file error: file never loaded, fileName is: ", fileName)
|
||||
return
|
||||
end
|
||||
|
||||
local oldModule = package.loaded[fileName]
|
||||
package.loaded[fileName] = nil
|
||||
|
||||
local ok, err = pcall(require, fileName)
|
||||
if not ok then
|
||||
package.loaded[fileName] = oldModule
|
||||
XLog.Error("XHotReload.Reload reload file error: ", err)
|
||||
return
|
||||
end
|
||||
|
||||
local newModule = package.loaded[fileName]
|
||||
if "table" ~= type(newModule) then
|
||||
TryRunInitConfig(fileName)--全局函数中只处理Config文件
|
||||
end
|
||||
updateTable(newModule, oldModule)
|
||||
UpdateClassType(newModule, oldModule)
|
||||
|
||||
if "boolean" == type(newModule) then
|
||||
TryReplaceManager(fileName) --改变XDataCenter所指向的Manager
|
||||
end
|
||||
|
||||
package.loaded[fileName] = oldModule
|
||||
XLog.Debug("kkkttt XHotReload.Reload suc, fileName is: ", fileName)
|
||||
end
|
||||
|
||||
-- 部分表在Manager里读取
|
||||
function XHotReload.InitMgrTab()
|
||||
if not XMain.IsDebug then return end
|
||||
XReadOnlyTable.HotLoad = true
|
||||
XConditionManager.Init()
|
||||
XFightUiManager.Init()
|
||||
XLoginManager.Init()
|
||||
XPlayerManager.Init()
|
||||
XResetManager.Init()
|
||||
XRobotManager.Init()
|
||||
XRoomSingleManager.Init()
|
||||
|
||||
XFunctionManager.Init()
|
||||
XModelManager.Init()
|
||||
XRewardManager.Init()
|
||||
XReadOnlyTable.HotLoad = false
|
||||
|
||||
CS.XGame.ClientConfig:Init("Client/Config/ClientConfig.tab")
|
||||
CS.XGame.Config:Init("Share/Config/Config.tab")
|
||||
end
|
215
Script/matrix/XMain.lua
Normal file
215
Script/matrix/XMain.lua
Normal file
|
@ -0,0 +1,215 @@
|
|||
XMain = XMain or {}
|
||||
|
||||
XMain.IsWindowsEditor = CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsEditor
|
||||
local IsWindowsPlayer = CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsPlayer
|
||||
|
||||
XMain.IsDebug = CS.XRemoteConfig.Debug
|
||||
XMain.IsEditorDebug = (XMain.IsWindowsEditor or IsWindowsPlayer) and XMain.IsDebug
|
||||
|
||||
local lockGMeta = {
|
||||
__newindex = function(t, k)
|
||||
XLog.Error("can't assign " .. k .. " in _G")
|
||||
end,
|
||||
__index = function(t, k)
|
||||
XLog.Error("can't index " .. k .. " in _G, which is nil")
|
||||
end
|
||||
}
|
||||
|
||||
function LuaLockG()
|
||||
setmetatable(_G, lockGMeta)
|
||||
end
|
||||
|
||||
local import = CS.XLuaEngine.Import
|
||||
|
||||
import("XCommon/XLog.lua")
|
||||
|
||||
XMain.Step1 = function()
|
||||
--打点
|
||||
CS.XRecord.Record("23000", "LuaXMainStart")
|
||||
|
||||
if XMain.IsEditorDebug then
|
||||
require("XHotReload")
|
||||
end
|
||||
|
||||
require("XCommon/XRpc")
|
||||
import("XCommon")
|
||||
import("XConfig")
|
||||
import("XOverseas/XConfig") -- 海外定制化目录
|
||||
require("XGame")
|
||||
import("XEntity")
|
||||
import("XOverseas/XEntity") -- 海外定制化目录
|
||||
-- import("XUi/XUiBase")
|
||||
-- import("XUi/XUiCommon/XScrollView")
|
||||
import("XBehavior")
|
||||
import("XGuide")
|
||||
require("XMovieActions/XMovieActionBase")
|
||||
CS.XApplication.SetProgress(0.52)
|
||||
end
|
||||
|
||||
|
||||
XMain.Step2 = function()
|
||||
import("XManager")
|
||||
import("XOverseas/XManager") -- 海外定制化目录
|
||||
import("XNotify")
|
||||
CS.XApplication.SetProgress(0.54)
|
||||
end
|
||||
|
||||
XMain.Step3 = function()
|
||||
-- import("XUi/XUiDlcDownload")
|
||||
-- import("XUi/XUiArena")
|
||||
-- import("XUi/XUiArenaActivityResult")
|
||||
-- import("XUi/XUiArenaFightResult")
|
||||
-- import("XUi/XUiArenaLevelDetail")
|
||||
-- import("XUi/XUiArenaStage")
|
||||
-- import("XUi/XUiArenaTask")
|
||||
-- import("XUi/XUiArenaTeam")
|
||||
-- import("XUi/XUiArenaTeamRank")
|
||||
-- import("XUi/XUiArenaWarZone")
|
||||
-- import("XUi/XUiNewAutoFightDialog")
|
||||
-- import("XUi/XUiAutoFightList")
|
||||
-- import("XUi/XUiAutoFightReward")
|
||||
-- import("XUi/XUiAutoFightTip")
|
||||
-- import("XUi/XUiAwarenessTf")
|
||||
-- import("XUi/XUiBag")
|
||||
-- import("XUi/XUiBaseEquip")
|
||||
-- import("XUi/XUiBfrt")
|
||||
-- import("XUi/XUiBuyAsset")
|
||||
-- import("XUi/XUiCharacter")
|
||||
-- import("XUi/XUiCharacterDetail")
|
||||
-- import("XUi/XUiChatServe")
|
||||
-- import("XUi/XUiComeAcross")
|
||||
-- import("XUi/XUiCommon")
|
||||
-- import("XUi/XUiDialog")
|
||||
-- import("XUi/XUiDorm")
|
||||
-- import("XUi/XUiDraw")
|
||||
CS.XApplication.SetProgress(0.56)
|
||||
end
|
||||
|
||||
XMain.Step4 = function()
|
||||
-- import("XUi/XUiEquip")
|
||||
-- import("XUi/XUiEquipAwarenessReplace")
|
||||
-- import("XUi/XUiEquipBreakThrough")
|
||||
-- import("XUi/XUiEquipDetail")
|
||||
-- import("XUi/XUiEquipReplace")
|
||||
-- import("XUi/XUiEquipReplaceNew")
|
||||
-- import("XUi/XUiEquipResonanceSelect")
|
||||
-- import("XUi/XUiEquipResonanceSkill")
|
||||
-- import("XUi/XUiEquipStrengthen")
|
||||
-- import("XUi/XUiFashion")
|
||||
-- import("XUi/XUiFavorability")
|
||||
-- import("XUi/XUiFightLoading")
|
||||
-- import("XUi/XUiFirstGetPopUp")
|
||||
-- import("XUi/XUiFuben")
|
||||
-- import("XUi/XUiFubenActivityBanner")
|
||||
-- import("XUi/XUiFubenActivityChapter")
|
||||
-- import("XUi/XUiFubenActivitySection")
|
||||
-- import("XUi/XUiFubenChallengeBanner")
|
||||
-- import("XUi/XUiFubenChallengeChapter")
|
||||
CS.XApplication.SetProgress(0.58)
|
||||
end
|
||||
|
||||
XMain.Step5 = function()
|
||||
-- import("XUi/XUiFubenChallengeEMEX")
|
||||
-- import("XUi/XUiFubenChallengeHSJYQZ")
|
||||
-- import("XUi/XUiFubenChallengeMap")
|
||||
-- import("XUi/XUiFubenBossSingle")
|
||||
-- import("XUi/XUiFubenChallengeMapEmex")
|
||||
-- import("XUi/XUiFubenChallengeSection")
|
||||
-- import("XUi/XUiFubenChallengeUrgent")
|
||||
-- import("XUi/XUiFubenChallengeYSHTX")
|
||||
-- import("XUi/XUiFubenCoinSkill")
|
||||
-- import("XUi/XUiFubenDailyBanner")
|
||||
-- import("XUi/XUiFubenDailyChapter")
|
||||
-- import("XUi/XUiFubenDialog")
|
||||
-- import("XUi/XUiFubenFlopReward")
|
||||
-- import("XUi/XUiFubenMainLineBanner")
|
||||
-- import("XUi/XUiFubenMainLineChapter")
|
||||
-- import("XUi/XUiFubenMainLineChapterBanner")
|
||||
-- import("XUi/XUiFubenMainLineDetail")
|
||||
-- import("XUi/XUiFubenResourceDetail")
|
||||
-- import("XUi/XUiFubenStageDetail")
|
||||
-- import("XUi/XUiFubenStory")
|
||||
CS.XApplication.SetProgress(0.6)
|
||||
end
|
||||
|
||||
XMain.Step6 = function()
|
||||
-- import("XUi/XUiFubenUrgentEventTip")
|
||||
-- import("XUi/XUiFunctionalOpen")
|
||||
-- import("XUi/XUiGameNotice")
|
||||
-- import("XUi/XUiGuide")
|
||||
-- import("XUi/XUiHomeMain")
|
||||
-- import("XUi/XUiHostelCharacterWork")
|
||||
-- import("XUi/XUiHostelDelegate")
|
||||
-- import("XUi/XUiHostelDelegateReporter")
|
||||
-- import("XUi/XUiHostelDeviceDetail")
|
||||
-- import("XUi/XUiHostelDeviceUpgradeResult")
|
||||
-- import("XUi/XUiHostelDeviceUpgrading")
|
||||
-- import("XUi/XUiHostelMissionComplete")
|
||||
-- import("XUi/XUiHostelQte")
|
||||
-- import("XUi/XUiHostelRest")
|
||||
-- import("XUi/XUiHostelRoom")
|
||||
-- import("XUi/XUiHud")
|
||||
-- import("XUi/XUiLogin")
|
||||
-- import("XUi/XUiLoginNotice")
|
||||
-- import("XUi/XUiMail")
|
||||
-- import("XUi/XUiMain")
|
||||
CS.XApplication.SetProgress(0.62)
|
||||
end
|
||||
|
||||
XMain.Step7 = function()
|
||||
-- import("XUi/XUiMission")
|
||||
-- import("XUi/XUiMoneyReward")
|
||||
-- import("XUi/XUiMoneyRewardFightTipFind")
|
||||
-- import("XUi/XUiNewPlayerTask")
|
||||
-- import("XUi/XUiNewRoleShow")
|
||||
-- import("XUi/XUiNewRoomSingle")
|
||||
-- import("XUi/XUiNoticeTips")
|
||||
-- import("XUi/XUiObtain")
|
||||
-- import("XUi/XUiOnlineBoss")
|
||||
-- import("XUi/XUiOnlineBossResult")
|
||||
-- import("XUi/XUiOnLineTranscript")
|
||||
-- import("XUi/XUiOnLineTranscriptRoom")
|
||||
-- import("XUi/XUiPersonalInfo")
|
||||
-- import("XUi/XUiPlayer")
|
||||
-- import("XUi/XUiPlayerUp")
|
||||
-- import("XUi/XUiPrequel")
|
||||
-- import("XUi/XUiPrequelLineDetail")
|
||||
-- import("XUi/XUiRegister")
|
||||
-- import("XUi/XUiRoomCharacter")
|
||||
-- import("XUi/XUiRoomMul")
|
||||
CS.XApplication.SetProgress(0.65)
|
||||
end
|
||||
|
||||
XMain.Step8 = function()
|
||||
-- require("XUi/XUiSet/XUiDlcTest")
|
||||
-- import("XUi/XUiRoomTeamPrefab")
|
||||
-- import("XUi/XUiSet")
|
||||
-- import("XUi/XUiSettleLose")
|
||||
-- import("XUi/XUiSettleUrgentEvent")
|
||||
-- import("XUi/XUiSettleWin")
|
||||
-- import("XUi/XUiSettleWinMainLine")
|
||||
-- import("XUi/XUiSettleWinSingleBoss")
|
||||
-- import("XUi/XUiShop")
|
||||
-- import("XUi/XUiSkip")
|
||||
-- import("XUi/XUiSocial")
|
||||
-- import("XUi/XUiStory")
|
||||
-- import("XUi/XUiTask")
|
||||
-- import("XUi/XUiTest")
|
||||
-- import("XUi/XUiTip")
|
||||
-- import("XUi/XUiTipReward")
|
||||
-- import("XUi/XUiTower")
|
||||
-- import("XUi/XUiTrial")
|
||||
import("XHome")
|
||||
import("XScene")
|
||||
-- import("XUi")
|
||||
require("XUi/XUiCommon/XUiCommon") --XUiGridCommon,
|
||||
import("XOverseas/XUi") -- 海外定制化目录
|
||||
import("XMerge")
|
||||
CS.XApplication.SetProgress(0.68)
|
||||
end
|
||||
|
||||
XMain.Step9 = function()
|
||||
LuaLockG()
|
||||
--打点
|
||||
CS.XRecord.Record("23008", "LuaXMainStartFinish")
|
||||
end
|
115
Script/matrix/binary/Binary.lua
Normal file
115
Script/matrix/binary/Binary.lua
Normal file
|
@ -0,0 +1,115 @@
|
|||
local Binary = {}
|
||||
local Reader = require("Binary/Reader")
|
||||
local OFFSET = 0
|
||||
|
||||
|
||||
function Binary.New(path)
|
||||
local temp = {}
|
||||
setmetatable(temp, { __index = Binary })
|
||||
local result = temp:Ctor(path)
|
||||
if not result then
|
||||
return nil
|
||||
end
|
||||
|
||||
return temp
|
||||
end
|
||||
|
||||
function Binary:Ctor(path)
|
||||
local file, err = io.open(path, "rb")
|
||||
if not file then
|
||||
XLog.Error(string.format("Binary:Ctor 打开文件失败 %s ,%s", path, err))
|
||||
return
|
||||
end
|
||||
|
||||
local len = assert(file:seek("end"))
|
||||
self.file = path
|
||||
self.len = len
|
||||
self.fileStream = file
|
||||
return true
|
||||
end
|
||||
|
||||
--读取int默认4字节,其他类型暂时不管了
|
||||
function Binary:ReadInt(position)
|
||||
position = position or 0
|
||||
if position >= self.len then
|
||||
XLog.Error(string.format("Binary.ReadInt 超出长度 %s,position = %s", self.len, position))
|
||||
return
|
||||
end
|
||||
|
||||
local startPos = self:Seek("set", 0)
|
||||
local bytes = self:Read(4)
|
||||
if not bytes then
|
||||
return 0
|
||||
end
|
||||
|
||||
local b1, b2, b3, b4 = string.byte(bytes, 1, 4)
|
||||
return b1 | b2 << 8 | b3 << 16 | b4 << 24
|
||||
end
|
||||
|
||||
--读取字节
|
||||
function Binary:Read(len)
|
||||
local bytes, err = self.fileStream:read(len)
|
||||
|
||||
if not bytes then
|
||||
XLog.Error(string.format("Binary.Read 读取二进制失败 len = %s,%s", len, err))
|
||||
return
|
||||
end
|
||||
|
||||
return bytes
|
||||
end
|
||||
|
||||
--读取内存块
|
||||
function Binary:GetReader(len, offset)
|
||||
local bytes = self:ReadBytes(len, offset)
|
||||
local reader = Reader.New(bytes, len)
|
||||
|
||||
return reader
|
||||
end
|
||||
|
||||
--读取内存块
|
||||
function Binary:ReadBytes(len, offset)
|
||||
if not len then
|
||||
XLog.Error(len)
|
||||
end
|
||||
|
||||
if len >= self.len then
|
||||
XLog.Error(string.format("Binary.ReadBytes 超出长度 %s, len = %s", self.len, len))
|
||||
return
|
||||
end
|
||||
|
||||
local startPos = self:Seek("set", offset)
|
||||
local bytes = self:Read(len)
|
||||
|
||||
return bytes
|
||||
end
|
||||
|
||||
|
||||
--定位
|
||||
function Binary:Seek(position, offset)
|
||||
offset = offset and offset + OFFSET or OFFSET
|
||||
local len, err = self.fileStream:seek(position, offset)
|
||||
|
||||
if not len then
|
||||
XLog.Error(string.format("Binary.Seek 失败,offset = %s ,position = %s,%s", offset, position, err))
|
||||
return
|
||||
end
|
||||
|
||||
return len
|
||||
end
|
||||
|
||||
|
||||
function Binary:ReadAll()
|
||||
local startPos = self:Seek("set", 0)
|
||||
local bytes = self:Read("*a")
|
||||
|
||||
|
||||
return bytes
|
||||
end
|
||||
|
||||
|
||||
function Binary:Close()
|
||||
self.fileStream:close()
|
||||
self.fileStream = nil
|
||||
end
|
||||
|
||||
return Binary
|
528
Script/matrix/binary/BinaryTable.lua
Normal file
528
Script/matrix/binary/BinaryTable.lua
Normal file
|
@ -0,0 +1,528 @@
|
|||
local BinaryTable = {}
|
||||
local Binary = require("Binary/Binary")
|
||||
local tableEmpty = {}
|
||||
|
||||
local BinaryPool = {}
|
||||
local BINARY_LIMIT_COUNT = 10
|
||||
|
||||
local Reader = require("Binary/Reader")
|
||||
|
||||
|
||||
local DefaultOfTypeNew = {
|
||||
[1] = false,
|
||||
[2] = nil,
|
||||
[3] = fix.zero,
|
||||
[4] = tableEmpty,
|
||||
[5] = tableEmpty,
|
||||
[6] = tableEmpty,
|
||||
[7] = tableEmpty,
|
||||
[8] = tableEmpty,
|
||||
[9] = tableEmpty,
|
||||
[10] = tableEmpty,
|
||||
[11] = tableEmpty,
|
||||
[12] = tableEmpty,
|
||||
[13] = tableEmpty,
|
||||
[14] = 0,
|
||||
[15] = 0,
|
||||
}
|
||||
|
||||
|
||||
function BinaryTable.New(path)
|
||||
local temp = {}
|
||||
setmetatable(temp, { __index = BinaryTable })
|
||||
temp:Ctor(path)
|
||||
return temp
|
||||
end
|
||||
|
||||
function BinaryTable:Ctor(path)
|
||||
self.filePath = path
|
||||
self.canRead = false
|
||||
end
|
||||
|
||||
--读取全部
|
||||
function BinaryTable.ReadAll(path, identifier)
|
||||
local temp = BinaryTable.New(path)
|
||||
|
||||
if not temp or not temp:InitBinary() then
|
||||
return
|
||||
end
|
||||
|
||||
local tab = temp:ReadAllContent(identifier)
|
||||
|
||||
temp:Release(true)
|
||||
temp = nil
|
||||
|
||||
return tab
|
||||
end
|
||||
|
||||
--读取句柄
|
||||
function BinaryTable.ReadHandle(path)
|
||||
local temp = BinaryTable.New(path)
|
||||
|
||||
if not temp or not temp:InitBinary() then
|
||||
return
|
||||
end
|
||||
|
||||
return temp
|
||||
end
|
||||
|
||||
|
||||
|
||||
function BinaryTable:InitBinary()
|
||||
|
||||
local bytes = CS.BinaryManager.LoadBytes(self.filePath)
|
||||
|
||||
if not bytes then
|
||||
XLog.Error(string.format("BinaryTable.InitBinary 加载文件失败 %s", self.filePath))
|
||||
return
|
||||
end
|
||||
|
||||
self.len = string.len(bytes)
|
||||
self.bytes = bytes
|
||||
local result = self:Init()
|
||||
|
||||
CS.PrefProfiler.ProfilerCore.RecordTableBinaryLoad(self.filePath, self.len, self.row)
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
--初始化基础信息
|
||||
function BinaryTable:Init()
|
||||
local reader = self:GetReader()
|
||||
|
||||
|
||||
local len = reader:ReadIntFix()
|
||||
self.col = reader:ReadInt()
|
||||
self.infoTrunkLen = len
|
||||
|
||||
self.colTypes = {}
|
||||
self.colNames = {}
|
||||
for i = 1, self.col do
|
||||
table.insert(self.colTypes, reader:ReadInt())
|
||||
local name = reader:ReadString()
|
||||
table.insert(self.colNames, name)
|
||||
end
|
||||
|
||||
local hasPrimarykey = reader:ReadBool()
|
||||
self.primarykeyCount = 0
|
||||
|
||||
if hasPrimarykey then
|
||||
self.primarykeyCount = 1
|
||||
self.primarykey = reader:ReadString()
|
||||
self.primarykeyLen = reader:ReadInt()
|
||||
end
|
||||
|
||||
for i = 1, #self.colNames do
|
||||
local name = self.colNames[i]
|
||||
if self.primarykey == name then
|
||||
self.primarykeyType = self.colTypes[i]
|
||||
end
|
||||
end
|
||||
|
||||
self.rowTrunkLen = reader:ReadInt()
|
||||
self.row = reader:ReadInt()
|
||||
self.contentTrunkLen = reader:ReadInt()
|
||||
|
||||
if not self.contentTrunkLen then
|
||||
if XMain.IsDebug then
|
||||
XLog.Warning(string.format("BinaryTable:InitBinary,%s, 空表", self.filePath))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local position = self:GetContenTrunkPosition()
|
||||
|
||||
reader:Close()
|
||||
reader = nil
|
||||
|
||||
self.canRead = true
|
||||
self.caches = {}
|
||||
self.cachesCount = 0
|
||||
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
--获取内容块
|
||||
function BinaryTable:GetContentTrunkReader()
|
||||
local position = self:GetContenTrunkPosition()
|
||||
|
||||
if position < 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local reader = self:GetReader(position)
|
||||
return reader
|
||||
end
|
||||
|
||||
--获取内容块位置
|
||||
function BinaryTable:GetContenTrunkPosition()
|
||||
local position = self.infoTrunkLen + 4
|
||||
local count = self.primarykeyCount
|
||||
|
||||
if count > 0 then
|
||||
position = position + self.primarykeyLen
|
||||
end
|
||||
|
||||
position = position + self.rowTrunkLen
|
||||
return position
|
||||
end
|
||||
|
||||
function BinaryTable:ReadAllContent(identifier)
|
||||
|
||||
local reader = self:GetContentTrunkReader()
|
||||
|
||||
if not reader then
|
||||
XLog.Error(string.format("可能是空表 路径:%s 请检查", self.filePath))
|
||||
return tableEmpty
|
||||
end
|
||||
|
||||
local row = self.row
|
||||
local col = self.col
|
||||
local colType = self.colTypes
|
||||
local colNames = self.colNames
|
||||
|
||||
local colNameIndex = {}
|
||||
|
||||
local index = 0
|
||||
for i = 1, #colNames do
|
||||
local name = colNames[i]
|
||||
if name == identifier then
|
||||
index = i
|
||||
end
|
||||
colNameIndex[name] = i
|
||||
end
|
||||
|
||||
if index <= 0 then
|
||||
XLog.Warning(string.format("找不到键值 Key:%s 请检查该键值和表头是否匹配", self.filePath))
|
||||
end
|
||||
|
||||
---每一个表对应一个元表
|
||||
local metaTable = {}
|
||||
|
||||
metaTable.__index = function(tbl, colName)
|
||||
local idx = colNameIndex[colName]
|
||||
|
||||
if not idx or not tbl then
|
||||
return nil
|
||||
end
|
||||
|
||||
local result = rawget(tbl, idx)
|
||||
|
||||
if not result then
|
||||
local resultType = colType[idx]
|
||||
|
||||
if not resultType then
|
||||
XLog.Error(string.format("找不到键值 Key:%s 请检查该键值和表头是否匹配", colName))
|
||||
end
|
||||
|
||||
result = DefaultOfTypeNew[resultType]
|
||||
end
|
||||
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
metaTable.__newindex = function()
|
||||
XLog.Error("attempt to update a readonly table")
|
||||
end
|
||||
|
||||
metaTable.__metatable = "readonly table"
|
||||
|
||||
|
||||
metaTable.__pairs = function(t)
|
||||
local function stateless_iter(tbl, key)
|
||||
local nk, v = next(tbl, key)
|
||||
|
||||
if nk and v then
|
||||
local nv = t[v] or t[nk]
|
||||
return nk, nv
|
||||
end
|
||||
end
|
||||
|
||||
return stateless_iter, colNameIndex, nil
|
||||
end
|
||||
|
||||
local tab = {}
|
||||
for i = 1, row do
|
||||
local temp = {}
|
||||
local keyValue = nil
|
||||
for j = 1, col do
|
||||
local type = colType[j]
|
||||
local value = reader:Read(type)
|
||||
temp[j] = value
|
||||
if index > 0 and j == index then
|
||||
keyValue = value or 0
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if index == 0 then
|
||||
keyValue = i
|
||||
end
|
||||
|
||||
setmetatable(temp, metaTable)
|
||||
tab[keyValue] = temp
|
||||
|
||||
self.caches[keyValue] = temp
|
||||
CS.PrefProfiler.ProfilerCore.RecordGetTableBinaryItem(self.filePath)
|
||||
end
|
||||
|
||||
self.cachesCount = self.row
|
||||
reader:Close()
|
||||
reader = nil
|
||||
|
||||
return tab
|
||||
end
|
||||
|
||||
function BinaryTable:GetLength()
|
||||
return self.row
|
||||
end
|
||||
|
||||
function BinaryTable:Get(key)
|
||||
local v = self.caches[key]
|
||||
if v then
|
||||
return v
|
||||
end
|
||||
|
||||
local t = self:ReadElement(key)
|
||||
self.caches[key] = t
|
||||
if t ~= nil then
|
||||
self.cachesCount = self.cachesCount + 1
|
||||
end
|
||||
CS.PrefProfiler.ProfilerCore.RecordGetTableBinaryItem(self.filePath)
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
--读取内存块
|
||||
function BinaryTable:GetReader(offset)
|
||||
|
||||
if not self.bytes then
|
||||
self.bytes = CS.BinaryManager.LoadBytes(self.filePath)
|
||||
CS.PrefProfiler.ProfilerCore.RecordTableBinaryLoad(self.filePath, self.len, self.row)
|
||||
end
|
||||
|
||||
offset = offset or 0
|
||||
local reader = Reader.New(self.bytes, self.len, offset + 1)
|
||||
return reader
|
||||
end
|
||||
|
||||
--读取索引块
|
||||
function BinaryTable:ReadIndexTrunk()
|
||||
|
||||
local len = self.primarykeyLen
|
||||
local position = self.infoTrunkLen + 4
|
||||
|
||||
if len <= 0 or position < 0 then
|
||||
XLog.Error(string.format("%s,读取索引块失败!! primarykey = %s", self.filePath, self.primarykey))
|
||||
return
|
||||
end
|
||||
|
||||
self.primarykeyList = {}
|
||||
|
||||
local reader = self:GetReader(position)
|
||||
for i = 1, self.row do
|
||||
local temp = reader:Read(self.primarykeyType) or 0
|
||||
self.primarykeyList[temp] = i
|
||||
--table.insert(self.primarykeyList, temp)
|
||||
end
|
||||
|
||||
reader:Close()
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
-- 读取每行的位置和长度
|
||||
function BinaryTable:ReadRowInfoTrunk()
|
||||
|
||||
local len = self.rowTrunkLen
|
||||
local position = self.infoTrunkLen + 4
|
||||
|
||||
if self.primarykeyCount > 0 then
|
||||
position = position + self.primarykeyLen
|
||||
end
|
||||
|
||||
if len <= 0 or position < 0 then
|
||||
XLog.Error(string.format("%s,BinaryTable:ReadRowInfoTrunk 读取行位置块失败!", self.filePath))
|
||||
return
|
||||
end
|
||||
|
||||
self.rowInfoArray = {}
|
||||
local reader = self:GetReader(position)
|
||||
for i = 1, self.row do
|
||||
|
||||
local rowInfo = {}
|
||||
rowInfo.start = reader:ReadInt() or 0
|
||||
rowInfo.tail = reader:ReadInt() or 0
|
||||
table.insert(self.rowInfoArray, rowInfo)
|
||||
end
|
||||
|
||||
reader:Close()
|
||||
reader = nil
|
||||
end
|
||||
|
||||
|
||||
--获取某一行信息
|
||||
function BinaryTable:TryGetRowInfo(index)
|
||||
|
||||
if not self.rowInfoArray then
|
||||
self:ReadRowInfoTrunk()
|
||||
end
|
||||
|
||||
if not self.rowInfoArray or #self.rowInfoArray <= 0 then
|
||||
XLog.Error(string.format("%s,BinaryTable:TryGetRowInfo 读取行位置数据失败", self.filePath))
|
||||
return
|
||||
end
|
||||
|
||||
if index > #self.rowInfoArray then
|
||||
XLog.Error(string.format("%s,BinaryTable:TryGetRowInfo 超出总行数长度 : %s 查询长度 : %s", self.filePath, #self.rowInfoArray, index))
|
||||
return
|
||||
end
|
||||
|
||||
return self.rowInfoArray[index]
|
||||
end
|
||||
|
||||
--读取条目
|
||||
function BinaryTable:ReadElement(value)
|
||||
|
||||
if not self.primarykey then
|
||||
XLog.Error(string.format("%s,主键未初始化 ", self.filePath))
|
||||
return nil
|
||||
end
|
||||
|
||||
if not self.primarykeyList then
|
||||
self:ReadIndexTrunk()
|
||||
end
|
||||
|
||||
local element = nil
|
||||
local index = self.primarykeyList[value]
|
||||
if index then
|
||||
local info = self:TryGetRowInfo(index)
|
||||
element = self:ReadElementInner(info, index, value)
|
||||
end
|
||||
|
||||
if not element then
|
||||
-- XLog.Warning(string.format("%s,BinaryTable:ReadElement,查询失败,未找到条目 %s = %s", self.filePath, self.primarykey, value))
|
||||
return
|
||||
end
|
||||
|
||||
return element
|
||||
end
|
||||
|
||||
function BinaryTable:ReadRow(info, offset)
|
||||
|
||||
if info.start < 0 or info.tail <= 0 then
|
||||
XLog.Error(string.format("%s,BinaryTable:ReadRow,行数据异常 %s = %s", self.filePath, info.start, info.tail))
|
||||
return
|
||||
end
|
||||
|
||||
local len = info.tail - info.start
|
||||
local startIndex = offset + info.start
|
||||
|
||||
local reader = self:GetReader(startIndex)
|
||||
return reader
|
||||
end
|
||||
|
||||
|
||||
function BinaryTable:ReadElementInner(info, index, value)
|
||||
|
||||
local position = self:GetContenTrunkPosition()
|
||||
local reader = self:ReadRow(info, position)
|
||||
if not reader then
|
||||
XLog.Warning(string.format("%s,BinaryTable:ReadElementInner,查询数据失败 %s = %s", self.filePath, self.primarykey, value))
|
||||
return
|
||||
end
|
||||
|
||||
local colType = self.colTypes
|
||||
local colNames = self.colNames
|
||||
|
||||
self.colNameIndex = {}
|
||||
|
||||
for i = 1, #colNames do
|
||||
local name = colNames[i]
|
||||
self.colNameIndex[name] = i
|
||||
end
|
||||
|
||||
---每一个表对应一个元表
|
||||
local metaTable = {}
|
||||
|
||||
metaTable.__index = function(tbl, colName)
|
||||
local idx = self.colNameIndex[colName]
|
||||
|
||||
if not idx or not tbl then
|
||||
return nil
|
||||
end
|
||||
|
||||
local result = rawget(tbl, idx)
|
||||
|
||||
if not result then
|
||||
local resultType = colType[idx]
|
||||
|
||||
if not resultType then
|
||||
XLog.Error(string.format("找不到键值 Key:%s 请检查该键值和表头是否匹配", colName))
|
||||
end
|
||||
|
||||
result = DefaultOfTypeNew[resultType]
|
||||
end
|
||||
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
metaTable.__newindex = function()
|
||||
XLog.Error("attempt to update a readonly table")
|
||||
end
|
||||
|
||||
metaTable.__metatable = "readonly table"
|
||||
|
||||
|
||||
metaTable.__pairs = function(t)
|
||||
local function stateless_iter(tbl, key)
|
||||
local nk, v = next(tbl, key)
|
||||
|
||||
if nk and v then
|
||||
local nv = t[v] or t[nk]
|
||||
return nk, nv
|
||||
end
|
||||
end
|
||||
|
||||
return stateless_iter, self.colNameIndex, nil
|
||||
end
|
||||
|
||||
local temp = {}
|
||||
local keyValue = nil
|
||||
|
||||
for j = 1, self.col do
|
||||
local type = colType[j]
|
||||
local value = reader:Read(type)
|
||||
temp[j] = value
|
||||
end
|
||||
|
||||
setmetatable(temp, metaTable)
|
||||
|
||||
reader:Close()
|
||||
reader = nil
|
||||
return temp
|
||||
end
|
||||
|
||||
|
||||
function BinaryTable:Release(uload)
|
||||
|
||||
CS.PrefProfiler.ProfilerCore.RecordTableBinaryUnload(self.filePath, uload and true or false)
|
||||
|
||||
if uload then
|
||||
self.bytes = nil
|
||||
end
|
||||
|
||||
self.caches = {}
|
||||
self.cachesCount = 0
|
||||
end
|
||||
|
||||
|
||||
function BinaryTable:Close()
|
||||
self.bytes = nil
|
||||
end
|
||||
|
||||
return BinaryTable
|
333
Script/matrix/binary/Reader.lua
Normal file
333
Script/matrix/binary/Reader.lua
Normal file
|
@ -0,0 +1,333 @@
|
|||
local Reader = XClass(nil, "Reader")
|
||||
local ReadByType = {}
|
||||
local MaxInt32 = 2147483647
|
||||
local FloatToInt = 10000
|
||||
function Reader:Ctor(bytes, len, index)
|
||||
self.bytes = bytes
|
||||
self.len = len
|
||||
self.index = index or 1
|
||||
end
|
||||
|
||||
function Reader:Close()
|
||||
self.bytes = nil
|
||||
end
|
||||
|
||||
|
||||
function Reader:Read(type)
|
||||
return ReadByType[type](self)
|
||||
end
|
||||
|
||||
function Reader:ReadFloat()
|
||||
|
||||
local num = self:ReadInt()
|
||||
if not num then
|
||||
return nil
|
||||
end
|
||||
|
||||
num = num / 10000
|
||||
|
||||
local a, b = math.modf(num) --拆分整数位和小数位
|
||||
if b == 0 then
|
||||
num = a
|
||||
end
|
||||
|
||||
return num
|
||||
--
|
||||
-- if self.index + 3 > self.len then
|
||||
-- return
|
||||
-- end
|
||||
-- local b1, b2, b3, b4 = string.byte(self.bytes, self.index, self.index + 3)
|
||||
-- self.index = self.index + 4
|
||||
-- local sign = b4 > 0x7F --最高位符号位
|
||||
-- local expo = (b4 % 0x80) * 0x02 + math.floor(b3 / 0x80) --整数部分
|
||||
-- local mant = ((b3 % 0x80) * 0x100 + b2) * 0x100 + b1 --小数部分
|
||||
-- if sign then
|
||||
-- sign = -1
|
||||
-- else
|
||||
-- sign = 1
|
||||
-- end
|
||||
-- local n
|
||||
-- if mant == 0 and expo == 0 then
|
||||
-- n = sign * 0
|
||||
-- elseif expo == 0xFF then
|
||||
-- if mant == 0 then
|
||||
-- n = sign * math.huge
|
||||
-- else
|
||||
-- n = nil
|
||||
-- end
|
||||
-- else
|
||||
-- if (expo > 0) and (expo < 0xFF) then
|
||||
-- n = sign * (1 + mant / 8388608) * (1 << (expo - 0x7F))
|
||||
-- else
|
||||
-- n = sign * (mant / 8388608) * (1 << 0x7F)
|
||||
-- end
|
||||
-- end
|
||||
-- return n
|
||||
end
|
||||
|
||||
|
||||
function Reader:ReadBool()
|
||||
local value = string.byte(self.bytes, self.index, self.index)
|
||||
self.index = self.index + 1
|
||||
return value == 1 and true or nil
|
||||
end
|
||||
|
||||
--读取string
|
||||
function Reader:ReadString()
|
||||
|
||||
local postion = self.index
|
||||
local ass = string.byte(self.bytes, postion, postion)
|
||||
|
||||
while ass > 0 do
|
||||
postion = postion + 1
|
||||
ass = string.byte(self.bytes, postion, postion)
|
||||
if ass == nil then
|
||||
XLog.Error(string.format("读取字符串异常 postion = %s,len = %s index =%s", postion, self.len, self.index))
|
||||
end
|
||||
end
|
||||
|
||||
if postion == self.index then
|
||||
self.index = self.index + 1
|
||||
return
|
||||
end
|
||||
|
||||
local value = string.char(string.byte(self.bytes, self.index, postion - 1))
|
||||
self.index = postion + 1
|
||||
|
||||
return value
|
||||
end
|
||||
|
||||
function Reader:ReadIntFix()
|
||||
self.index = self.index + 4
|
||||
local b1, b2, b3, b4 = string.byte(self.bytes, 1, 4)
|
||||
return b1 | b2 << 8 | b3 << 16 | b4 << 24
|
||||
end
|
||||
|
||||
function Reader:ReadInt()
|
||||
return self:ReadInt32Variant()
|
||||
end
|
||||
|
||||
function Reader:ReadInt32Variant()
|
||||
return self:ReadUInt32Variant()
|
||||
end
|
||||
|
||||
function Reader:ReadUInt32Variant()
|
||||
local value = 0
|
||||
local tempByte
|
||||
local index = 0
|
||||
|
||||
while not tempByte or ((tempByte >> 7) > 0) do
|
||||
tempByte = string.byte(self.bytes, self.index, self.index)
|
||||
local temp1 = (tempByte & 0x7F) << index
|
||||
value = value | temp1
|
||||
index = index + 7
|
||||
self.index = self.index + 1
|
||||
end
|
||||
|
||||
--负数,MaxInt32 = 2147483647 因为lua number是64bit 所以需要特殊处理负数
|
||||
if value > MaxInt32 then
|
||||
local newValue = 0
|
||||
value = -(((~ value) & MaxInt32) + 1)
|
||||
end
|
||||
|
||||
if value == 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
return value
|
||||
end
|
||||
|
||||
function Reader:ReadListString()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local list = {}
|
||||
for i = 1, len do
|
||||
table.insert(list, self:ReadString())
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
|
||||
function Reader:ReadListBool()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local list = {}
|
||||
for i = 1, len do
|
||||
table.insert(list, self:ReadBool())
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
|
||||
function Reader:ReadListInt()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local list = {}
|
||||
for i = 1, len do
|
||||
table.insert(list, self:ReadInt() or 0)
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
function Reader:ReadListFloat()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local list = {}
|
||||
for i = 1, len do
|
||||
table.insert(list, self:ReadFloat() or 0)
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
function Reader:ReadDicStringString()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local dic = {}
|
||||
for i = 1, len do
|
||||
local key = self:ReadString()
|
||||
local value = self:ReadString()
|
||||
dic[key] = value
|
||||
end
|
||||
|
||||
return dic
|
||||
end
|
||||
|
||||
function Reader:ReadDicIntInt()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local dic = {}
|
||||
for i = 1, len do
|
||||
local key = self:ReadInt() or 0
|
||||
local value = self:ReadInt() or 0
|
||||
dic[key] = value
|
||||
end
|
||||
|
||||
return dic
|
||||
end
|
||||
|
||||
function Reader:ReadDicIntString()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local dic = {}
|
||||
for i = 1, len do
|
||||
local key = self:ReadInt() or 0
|
||||
local value = self:ReadString()
|
||||
dic[key] = value
|
||||
end
|
||||
|
||||
return dic
|
||||
end
|
||||
|
||||
|
||||
function Reader:ReadDicStringInt()
|
||||
|
||||
local len = self:ReadInt() or 0
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local dic = {}
|
||||
for i = 1, len do
|
||||
local key = self:ReadString()
|
||||
local value = self:ReadInt()
|
||||
dic[key] = value
|
||||
end
|
||||
|
||||
return dic
|
||||
end
|
||||
|
||||
function Reader:ReadDicIntFloat()
|
||||
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local dic = {}
|
||||
for i = 1, len do
|
||||
local key = self:ReadInt() or 0
|
||||
local value = self:ReadFloat()
|
||||
dic[key] = value
|
||||
end
|
||||
|
||||
return dic
|
||||
end
|
||||
|
||||
--读取Fix
|
||||
function Reader:ReadFix()
|
||||
local str = self:ReadString()
|
||||
if not str then
|
||||
return nil
|
||||
end
|
||||
|
||||
return FixParse(str)
|
||||
end
|
||||
|
||||
--读取Fix
|
||||
function Reader:ReadListFix()
|
||||
local len = self:ReadInt()
|
||||
if not len or len <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
local list = {}
|
||||
for i = 1, len do
|
||||
table.insert(list, self:ReadFix())
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
|
||||
ReadByType = {
|
||||
[1] = Reader.ReadBool,
|
||||
[2] = Reader.ReadString,
|
||||
[3] = Reader.ReadFix,
|
||||
[4] = Reader.ReadListString,
|
||||
[5] = Reader.ReadListBool,
|
||||
[6] = Reader.ReadListInt,
|
||||
[7] = Reader.ReadListFloat,
|
||||
[8] = Reader.ReadListFix,
|
||||
[9] = Reader.ReadDicStringString,
|
||||
[10] = Reader.ReadDicIntInt,
|
||||
[11] = Reader.ReadDicIntString,
|
||||
[12] = Reader.ReadDicStringInt,
|
||||
[13] = Reader.ReadDicIntFloat,
|
||||
[14] = Reader.ReadInt,
|
||||
[15] = Reader.ReadFloat,
|
||||
}
|
||||
|
||||
|
||||
return Reader
|
34
Script/matrix/xbehavior/XLuaBehaviorAgent.lua
Normal file
34
Script/matrix/xbehavior/XLuaBehaviorAgent.lua
Normal file
|
@ -0,0 +1,34 @@
|
|||
XLuaBehaviorAgent = XClass(nil, "XLuaBehaviorAgent")
|
||||
|
||||
function XLuaBehaviorAgent:Ctor(agentName, agentProxy)
|
||||
self.Name = agentName
|
||||
self.AgentProxy = agentProxy
|
||||
self.Agent = agentProxy.BTAgent
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnAwake()
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnStart()
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnEnable()
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnDisable()
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnDestroy()
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnUpdate()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnNotify()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorAgent:OnGetEvents()
|
||||
|
||||
end
|
61
Script/matrix/xbehavior/XLuaBehaviorManager.lua
Normal file
61
Script/matrix/xbehavior/XLuaBehaviorManager.lua
Normal file
|
@ -0,0 +1,61 @@
|
|||
CsXBehaviorManager = CS.BehaviorTree.XBehaviorTreeManager
|
||||
CsNodeStatus = CS.BehaviorTree.XNodeStatus
|
||||
CsBehaviorNodeType = CS.BehaviorTree.XBehaviorNodeType
|
||||
|
||||
XLuaBehaviorManager = {}
|
||||
|
||||
local NodeClassType = {}
|
||||
local AgentClassType = {}
|
||||
|
||||
--注册行为节点
|
||||
function XLuaBehaviorManager.RegisterNode(super, classType, nodeType, islua, needUpdate)
|
||||
super = XLuaBehaviorNode or super
|
||||
CsXBehaviorManager.Instance:RegisterLuaNodeProxy(classType, nodeType, islua, needUpdate)
|
||||
local behaviorNode = XClass(super, classType)
|
||||
NodeClassType[classType] = behaviorNode
|
||||
return behaviorNode
|
||||
end
|
||||
|
||||
--创建行为节点实例
|
||||
function XLuaBehaviorManager.NewLuaNodeProxy(className, nodeProxy)
|
||||
local baseName = className
|
||||
local class = NodeClassType[baseName]
|
||||
if not class then
|
||||
class = NodeClassType[baseName]
|
||||
if not class then
|
||||
XLog.Error("XLuaBehaviorManager.NewLuaNodeProxy error, class not exist, name: " .. className)
|
||||
return nil
|
||||
end
|
||||
end
|
||||
local obj = class.New(className, nodeProxy)
|
||||
return obj
|
||||
end
|
||||
|
||||
--注册行为主体
|
||||
function XLuaBehaviorManager.RegisterAgent(super, classType)
|
||||
super = XLuaBehaviorAgent or super
|
||||
CsXBehaviorManager.Instance:RegisterLuaAgentProxy(classType)
|
||||
local behaviorNode = XClass(super, classType)
|
||||
AgentClassType[classType] = behaviorNode
|
||||
return behaviorNode
|
||||
end
|
||||
|
||||
--创建行为主体实例
|
||||
function XLuaBehaviorManager.NewLuaAgentProxy(className, agentProxy)
|
||||
local baseName = className
|
||||
local class = AgentClassType[baseName]
|
||||
if not class then
|
||||
class = AgentClassType[baseName]
|
||||
if not class then
|
||||
XLog.Error("XLuaBehaviorManager.NewLuaAgentProxy error, class not exist, name: " .. className)
|
||||
return nil
|
||||
end
|
||||
end
|
||||
local obj = class.New(className, agentProxy)
|
||||
return obj
|
||||
end
|
||||
|
||||
|
||||
function XLuaBehaviorManager.PlayId(id, agent)
|
||||
agent:PlayBehavior(id)
|
||||
end
|
89
Script/matrix/xbehavior/XLuaBehaviorNode.lua
Normal file
89
Script/matrix/xbehavior/XLuaBehaviorNode.lua
Normal file
|
@ -0,0 +1,89 @@
|
|||
XLuaBehaviorNode = XClass(nil, "XLuaBehaviorNode")
|
||||
|
||||
function XLuaBehaviorNode:Ctor(className, nodeProxy)
|
||||
self.Name = className
|
||||
self.NodeProxy = nodeProxy
|
||||
self.Node = nodeProxy.Node
|
||||
self.BehaviorTree = nodeProxy.Node.BTree
|
||||
self:InitNodeData()
|
||||
end
|
||||
|
||||
--初始化数据
|
||||
function XLuaBehaviorNode:InitNodeData()
|
||||
|
||||
if not self.Node.Fields then
|
||||
self.Fields = nil
|
||||
return
|
||||
end
|
||||
|
||||
self.Fields = {}
|
||||
|
||||
local fields = self.Node.Fields.Fields
|
||||
|
||||
for _, v in pairs(fields) do
|
||||
self.Fields[v.FieldName] = v.Value
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function XLuaBehaviorNode:OnAwake()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:SetAgent()
|
||||
self.Agent = self.BehaviorTree.BTAgent
|
||||
self.Proxy = self.Agent.Proxy
|
||||
self.AgentProxy = self.Agent.Proxy.LuaAgentProxy
|
||||
self:OnStart()
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnEnable()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnStart()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnRecycle()
|
||||
self.Agent = nil
|
||||
self.Proxy = nil
|
||||
self.AgentProxy = nil
|
||||
end
|
||||
|
||||
|
||||
function XLuaBehaviorNode:OnDisable()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnEnter()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnExit()
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnReset()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnDestroy()
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnUpdate(dt)
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnFixedUpdate(dt)
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnNotify(evt, ...)
|
||||
|
||||
end
|
||||
|
||||
function XLuaBehaviorNode:OnGetEvents()
|
||||
|
||||
end
|
8
Script/matrix/xcommon/Fix.lua
Normal file
8
Script/matrix/xcommon/Fix.lua
Normal file
|
@ -0,0 +1,8 @@
|
|||
fix = CS.Mathematics.fix
|
||||
--fix.zero = CS.Mathematics.fix.zero
|
||||
--fix.hundred = CS.Mathematics.fix.hundred
|
||||
--fix.thousand = CS.Mathematics.fix.thousand
|
||||
--fix.deg2rad = CS.Mathematics.fix.deg2rad
|
||||
FixParse = CS.FixExtension.Parse
|
||||
FixToInt = CS.FixExtension.FixToInt
|
||||
FixToDouble = CS.FixExtension.FixToDouble
|
397
Script/matrix/xcommon/Json.lua
Normal file
397
Script/matrix/xcommon/Json.lua
Normal file
|
@ -0,0 +1,397 @@
|
|||
--
|
||||
-- json.lua
|
||||
--
|
||||
-- Copyright (c) 2019 rxi
|
||||
--
|
||||
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
-- this software and associated documentation files (the "Software"), to deal in
|
||||
-- the Software without restriction, including without limitation the rights to
|
||||
-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
-- of the Software, and to permit persons to whom the Software is furnished to do
|
||||
-- so, subject to the following conditions:
|
||||
--
|
||||
-- The above copyright notice and this permission notice shall be included in all
|
||||
-- copies or substantial portions of the Software.
|
||||
--
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
-- SOFTWARE.
|
||||
--
|
||||
local json = { _version = "0.1.2" }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Encode
|
||||
-------------------------------------------------------------------------------
|
||||
local encode
|
||||
|
||||
local escape_char_map = {
|
||||
["\\"] = "\\\\",
|
||||
["\""] = "\\\"",
|
||||
["\b"] = "\\b",
|
||||
["\f"] = "\\f",
|
||||
["\n"] = "\\n",
|
||||
["\r"] = "\\r",
|
||||
["\t"] = "\\t",
|
||||
}
|
||||
|
||||
local escape_char_map_inv = {["\\/"] = "/" }
|
||||
for k, v in pairs(escape_char_map) do
|
||||
escape_char_map_inv[v] = k
|
||||
end
|
||||
|
||||
|
||||
local function escape_char(c)
|
||||
return escape_char_map[c] or string.format("\\u%04x", c:byte())
|
||||
end
|
||||
|
||||
|
||||
local function encode_nil()
|
||||
return "null"
|
||||
end
|
||||
|
||||
|
||||
local function encode_table(val, stack)
|
||||
local res = {}
|
||||
stack = stack or {}
|
||||
|
||||
-- Circular reference?
|
||||
if stack[val] then error("circular reference") end
|
||||
|
||||
stack[val] = true
|
||||
|
||||
if rawget(val, 1) ~= nil or next(val) == nil then
|
||||
-- Treat as array -- check keys are valid and it is not sparse
|
||||
local n = 0
|
||||
for k in pairs(val) do
|
||||
if type(k) ~= "number" then
|
||||
error("invalid table: mixed or invalid key types")
|
||||
end
|
||||
n = n + 1
|
||||
end
|
||||
if n ~= #val then
|
||||
error("invalid table: sparse array")
|
||||
end
|
||||
-- Encode
|
||||
for _, v in ipairs(val) do
|
||||
table.insert(res, encode(v, stack))
|
||||
end
|
||||
stack[val] = nil
|
||||
return "[" .. table.concat(res, ",") .. "]"
|
||||
|
||||
else
|
||||
-- Treat as an object
|
||||
for k, v in pairs(val) do
|
||||
if type(k) ~= "string" then
|
||||
error("invalid table: mixed or invalid key types")
|
||||
end
|
||||
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
|
||||
end
|
||||
stack[val] = nil
|
||||
return "{" .. table.concat(res, ",") .. "}"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function encode_string(val)
|
||||
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
|
||||
end
|
||||
|
||||
|
||||
local function encode_number(val)
|
||||
-- Check for NaN, -inf and inf
|
||||
if val ~= val or val <= -math.huge or val >= math.huge then
|
||||
error("unexpected number value '" .. tostring(val) .. "'")
|
||||
end
|
||||
return string.format("%.14g", val)
|
||||
end
|
||||
|
||||
|
||||
local type_func_map = {
|
||||
["nil" ] = encode_nil,
|
||||
["table"] = encode_table,
|
||||
["string"] = encode_string,
|
||||
["number"] = encode_number,
|
||||
["boolean"] = tostring,
|
||||
}
|
||||
|
||||
|
||||
encode = function(val, stack)
|
||||
local t = type(val)
|
||||
local f = type_func_map[t]
|
||||
if f then
|
||||
return f(val, stack)
|
||||
end
|
||||
error("unexpected type '" .. t .. "'")
|
||||
end
|
||||
|
||||
|
||||
function json.encode(val)
|
||||
return (encode(val))
|
||||
end
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Decode
|
||||
-------------------------------------------------------------------------------
|
||||
local parse
|
||||
|
||||
local function create_set(...)
|
||||
local res = {}
|
||||
for i = 1, select("#", ...) do
|
||||
res[select(i, ...)] = true
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
local space_chars = create_set(" ", "\t", "\r", "\n")
|
||||
local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",")
|
||||
local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")
|
||||
local literals = create_set("true", "false", "null")
|
||||
|
||||
local literal_map = {
|
||||
["true"] = true,
|
||||
["false"] = false,
|
||||
["null"] = nil,
|
||||
}
|
||||
|
||||
|
||||
local function next_char(str, idx, set, negate)
|
||||
for i = idx, #str do
|
||||
if set[str:sub(i, i)] ~= negate then
|
||||
return i
|
||||
end
|
||||
end
|
||||
return #str + 1
|
||||
end
|
||||
|
||||
|
||||
local function decode_error(str, idx, msg)
|
||||
local line_count = 1
|
||||
local col_count = 1
|
||||
for i = 1, idx - 1 do
|
||||
col_count = col_count + 1
|
||||
if str:sub(i, i) == "\n" then
|
||||
line_count = line_count + 1
|
||||
col_count = 1
|
||||
end
|
||||
end
|
||||
error(string.format("%s at line %d col %d", msg, line_count, col_count))
|
||||
end
|
||||
|
||||
|
||||
local function codepoint_to_utf8(n)
|
||||
-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa
|
||||
local f = math.floor
|
||||
if n <= 0x7f then
|
||||
return string.char(n)
|
||||
elseif n <= 0x7ff then
|
||||
return string.char(f(n / 64) + 192, n % 64 + 128)
|
||||
elseif n <= 0xffff then
|
||||
return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)
|
||||
elseif n <= 0x10ffff then
|
||||
return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,
|
||||
f(n % 4096 / 64) + 128, n % 64 + 128)
|
||||
end
|
||||
error(string.format("invalid unicode codepoint '%x'", n))
|
||||
end
|
||||
|
||||
|
||||
local function parse_unicode_escape(s)
|
||||
local n1 = tonumber(s:sub(3, 6), 16)
|
||||
local n2 = tonumber(s:sub(9, 12), 16)
|
||||
-- Surrogate pair?
|
||||
if n2 then
|
||||
return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)
|
||||
else
|
||||
return codepoint_to_utf8(n1)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function parse_string(str, i)
|
||||
local has_unicode_escape = false
|
||||
local has_surrogate_escape = false
|
||||
local has_escape = false
|
||||
local last
|
||||
for j = i + 1, #str do
|
||||
local x = str:byte(j)
|
||||
|
||||
if x < 32 then
|
||||
decode_error(str, j, "control character in string")
|
||||
end
|
||||
|
||||
if last == 92 then -- "\\" (escape char)
|
||||
if x == 117 then -- "u" (unicode escape sequence)
|
||||
local hex = str:sub(j + 1, j + 5)
|
||||
if not hex:find("%x%x%x%x") then
|
||||
decode_error(str, j, "invalid unicode escape in string")
|
||||
end
|
||||
if hex:find("^[dD][89aAbB]") then
|
||||
has_surrogate_escape = true
|
||||
else
|
||||
has_unicode_escape = true
|
||||
end
|
||||
else
|
||||
local c = string.char(x)
|
||||
if not escape_chars[c] then
|
||||
decode_error(str, j, "invalid escape char '" .. c .. "' in string")
|
||||
end
|
||||
has_escape = true
|
||||
end
|
||||
last = nil
|
||||
|
||||
elseif x == 34 then -- '"' (end of string)
|
||||
local s = str:sub(i + 1, j - 1)
|
||||
if has_surrogate_escape then
|
||||
s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape)
|
||||
end
|
||||
if has_unicode_escape then
|
||||
s = s:gsub("\\u....", parse_unicode_escape)
|
||||
end
|
||||
if has_escape then
|
||||
s = s:gsub("\\.", escape_char_map_inv)
|
||||
end
|
||||
return s, j + 1
|
||||
|
||||
else
|
||||
last = x
|
||||
end
|
||||
end
|
||||
decode_error(str, i, "expected closing quote for string")
|
||||
end
|
||||
|
||||
|
||||
local function parse_number(str, i)
|
||||
local x = next_char(str, i, delim_chars)
|
||||
local s = str:sub(i, x - 1)
|
||||
local n = tonumber(s)
|
||||
if not n then
|
||||
decode_error(str, i, "invalid number '" .. s .. "'")
|
||||
end
|
||||
return n, x
|
||||
end
|
||||
|
||||
|
||||
local function parse_literal(str, i)
|
||||
local x = next_char(str, i, delim_chars)
|
||||
local word = str:sub(i, x - 1)
|
||||
if not literals[word] then
|
||||
decode_error(str, i, "invalid literal '" .. word .. "'")
|
||||
end
|
||||
return literal_map[word], x
|
||||
end
|
||||
|
||||
|
||||
local function parse_array(str, i)
|
||||
local res = {}
|
||||
local n = 1
|
||||
i = i + 1
|
||||
while 1 do
|
||||
local x
|
||||
i = next_char(str, i, space_chars, true)
|
||||
-- Empty / end of array?
|
||||
if str:sub(i, i) == "]" then
|
||||
i = i + 1
|
||||
break
|
||||
end
|
||||
-- Read token
|
||||
x, i = parse(str, i)
|
||||
res[n] = x
|
||||
n = n + 1
|
||||
-- Next token
|
||||
i = next_char(str, i, space_chars, true)
|
||||
local chr = str:sub(i, i)
|
||||
i = i + 1
|
||||
if chr == "]" then break end
|
||||
if chr ~= "," then decode_error(str, i, "expected ']' or ','") end
|
||||
end
|
||||
return res, i
|
||||
end
|
||||
|
||||
|
||||
local function parse_object(str, i)
|
||||
local res = {}
|
||||
i = i + 1
|
||||
while 1 do
|
||||
local key, val
|
||||
i = next_char(str, i, space_chars, true)
|
||||
-- Empty / end of object?
|
||||
if str:sub(i, i) == "}" then
|
||||
i = i + 1
|
||||
break
|
||||
end
|
||||
-- Read key
|
||||
if str:sub(i, i) ~= '"' then
|
||||
decode_error(str, i, "expected string for key")
|
||||
end
|
||||
key, i = parse(str, i)
|
||||
-- Read ':' delimiter
|
||||
i = next_char(str, i, space_chars, true)
|
||||
if str:sub(i, i) ~= ":" then
|
||||
decode_error(str, i, "expected ':' after key")
|
||||
end
|
||||
i = next_char(str, i + 1, space_chars, true)
|
||||
-- Read value
|
||||
val, i = parse(str, i)
|
||||
-- Set
|
||||
res[key] = val
|
||||
-- Next token
|
||||
i = next_char(str, i, space_chars, true)
|
||||
local chr = str:sub(i, i)
|
||||
i = i + 1
|
||||
if chr == "}" then break end
|
||||
if chr ~= "," then decode_error(str, i, "expected '}' or ','") end
|
||||
end
|
||||
return res, i
|
||||
end
|
||||
|
||||
|
||||
local char_func_map = {
|
||||
['"'] = parse_string,
|
||||
["0"] = parse_number,
|
||||
["1"] = parse_number,
|
||||
["2"] = parse_number,
|
||||
["3"] = parse_number,
|
||||
["4"] = parse_number,
|
||||
["5"] = parse_number,
|
||||
["6"] = parse_number,
|
||||
["7"] = parse_number,
|
||||
["8"] = parse_number,
|
||||
["9"] = parse_number,
|
||||
["-"] = parse_number,
|
||||
["t"] = parse_literal,
|
||||
["f"] = parse_literal,
|
||||
["n"] = parse_literal,
|
||||
["["] = parse_array,
|
||||
["{"] = parse_object,
|
||||
}
|
||||
|
||||
|
||||
parse = function(str, idx)
|
||||
local chr = str:sub(idx, idx)
|
||||
local f = char_func_map[chr]
|
||||
if f then
|
||||
return f(str, idx)
|
||||
end
|
||||
decode_error(str, idx, "unexpected character '" .. chr .. "'")
|
||||
end
|
||||
|
||||
|
||||
function json.decode(str)
|
||||
if type(str) ~= "string" then
|
||||
error("expected argument of type string, got " .. type(str))
|
||||
end
|
||||
local res, idx = parse(str, next_char(str, 1, space_chars, true))
|
||||
idx = next_char(str, idx, space_chars, true)
|
||||
if idx <= #str then
|
||||
decode_error(str, idx, "trailing garbage")
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
|
||||
return json
|
35
Script/matrix/xcommon/XAnalyticsEvent.lua
Normal file
35
Script/matrix/xcommon/XAnalyticsEvent.lua
Normal file
|
@ -0,0 +1,35 @@
|
|||
--==============================--
|
||||
-- 通用数据收集事件
|
||||
--==============================--
|
||||
XAnalyticsEvent = XAnalyticsEvent or {}
|
||||
|
||||
local OnRoleCreate = function()
|
||||
if XUserManager.IsUseSdk() then
|
||||
XHeroSdkManager.CreateNewRole()
|
||||
end
|
||||
end
|
||||
|
||||
local OnLogin = function()
|
||||
if XUserManager.IsUseSdk() then
|
||||
XHeroSdkManager.EnterGame()
|
||||
end
|
||||
|
||||
CS.BuglyAgent.SetUserId(tostring(XPlayer.Id))
|
||||
end
|
||||
|
||||
local OnLevelUp = function()
|
||||
if XUserManager.IsUseSdk() then
|
||||
XHeroSdkManager.RoleLevelUp()
|
||||
end
|
||||
end
|
||||
|
||||
local OnLogout = function()
|
||||
|
||||
end
|
||||
|
||||
function XAnalyticsEvent.Init()
|
||||
XEventManager.AddEventListener(XEventId.EVENT_NEW_PLAYER, OnRoleCreate)
|
||||
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_SUCCESS, OnLogin)
|
||||
XEventManager.AddEventListener(XEventId.EVENT_PLAYER_LEVEL_CHANGE, OnLevelUp)
|
||||
XEventManager.AddEventListener(XEventId.EVENT_USER_LOGOUT, OnLogout)
|
||||
end
|
171
Script/matrix/xcommon/XBindTools.lua
Normal file
171
Script/matrix/xcommon/XBindTools.lua
Normal file
|
@ -0,0 +1,171 @@
|
|||
local rawget = rawget
|
||||
local rawset = rawset
|
||||
local getmetatable = getmetatable
|
||||
local setmetatable = setmetatable
|
||||
|
||||
XBindTool = XBindTool or {}
|
||||
|
||||
local oldPairs = pairs
|
||||
|
||||
local pairs = function(arr)
|
||||
local meta_t = getmetatable(arr)
|
||||
if meta_t and meta_t.__pairs then
|
||||
return meta_t.__pairs(arr)
|
||||
end
|
||||
return oldPairs(arr)
|
||||
end
|
||||
|
||||
local function InitBind(obj)
|
||||
if rawget(obj, "___isBinded") then return end
|
||||
|
||||
local store = {}
|
||||
for key, _ in pairs(obj) do
|
||||
local v = rawget(obj, key)
|
||||
if v ~= nil then
|
||||
store[key] = v
|
||||
obj[key] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local meta_t = getmetatable(obj)
|
||||
if meta_t then setmetatable(store, meta_t) end
|
||||
|
||||
setmetatable(obj, {
|
||||
__index = function(_, index)
|
||||
local ret = rawget(obj, index)
|
||||
if ret ~= nil then return ret end
|
||||
return store[index]
|
||||
end,
|
||||
__newindex = function(_, index, v)
|
||||
local event = rawget(obj, "___bind_event")
|
||||
local old_v = store[index]
|
||||
store[index] = v
|
||||
if old_v ~= v then
|
||||
if event and event[index] then
|
||||
event[index].running = true
|
||||
for key, func in pairs(event[index].callList) do
|
||||
if not event[index].removeList[key] then
|
||||
func(v, old_v)
|
||||
end
|
||||
end
|
||||
event[index].running = nil
|
||||
if next(event[index].removeList) then
|
||||
for removeIndex, _ in pairs(event[index].removeList) do
|
||||
event[index].callList[removeIndex] = nil
|
||||
end
|
||||
event[index].removeList = {}
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
__pairs = function(_)
|
||||
return oldPairs(store)
|
||||
end
|
||||
})
|
||||
|
||||
rawset(obj, "___isBinded", true)
|
||||
rawset(obj, "___bind_store", store)
|
||||
rawset(obj, "___bind_event", {})
|
||||
rawset(obj, "___bind_id", 0)
|
||||
end
|
||||
|
||||
function XBindTool.BindAttr(obj, attr, callback)
|
||||
InitBind(obj)
|
||||
|
||||
local event = rawget(obj, "___bind_event")
|
||||
local id = rawget(obj, "___bind_id")
|
||||
event[attr] = event[attr] or { callList = {}, removeList = {} }
|
||||
id = id + 1
|
||||
rawset(obj, "___bind_id", id)
|
||||
event[attr].callList[id] = callback
|
||||
|
||||
local value = obj[attr]
|
||||
if value ~= nil then
|
||||
callback(value)
|
||||
end
|
||||
return { obj = obj, attr = attr, id = id }
|
||||
end
|
||||
|
||||
function XBindTool.GetBindInfo(val)
|
||||
if type(val) ~= "table" then return val, false end
|
||||
if not rawget(val, "___isBinded") then return val, false end
|
||||
return rawget(val, "___bind_store"), true
|
||||
end
|
||||
|
||||
function XBindTool.UnBind(handle)
|
||||
local event = rawget(handle.obj, "___bind_event")
|
||||
if event and event[handle.attr] then
|
||||
if event[handle.attr].running then
|
||||
event[handle.attr].removeList[handle.id] = true
|
||||
else
|
||||
event[handle.attr].callList[handle.id] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XBindTool.UnBindObj(obj)
|
||||
local event = rawget(obj, "___bind_event")
|
||||
if event then
|
||||
for _, attrListener in pairs(event) do
|
||||
if attrListener.running then
|
||||
for key, _ in pairs(attrListener.callList) do
|
||||
attrListener.removeList[key] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
rawset(obj, "___bind_event", {})
|
||||
end
|
||||
end
|
||||
|
||||
local NodeBindInfoRecord = {}
|
||||
|
||||
function XBindTool.BindNode(node, obj, attr, func, unbindFunc)
|
||||
if not NodeBindInfoRecord[node] then
|
||||
NodeBindInfoRecord[node] = {}
|
||||
end
|
||||
local bindInfo = NodeBindInfoRecord[node]
|
||||
bindInfo[obj] = bindInfo[obj] or { length = 0, record = {} }
|
||||
local checkExist
|
||||
if node.Exist then
|
||||
checkExist = function() return node:Exist() end
|
||||
else
|
||||
local gameObject = node.GameObject or node.gameObject or node.Transform or node.transform
|
||||
if gameObject and gameObject.Exist then
|
||||
checkExist = function() return gameObject:Exist() end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
local handle
|
||||
if checkExist then
|
||||
handle = XBindTool.BindAttr(obj, attr, function(...)
|
||||
if not checkExist() then
|
||||
XBindTool.UnBindNode(node)
|
||||
if unbindFunc then
|
||||
unbindFunc()
|
||||
end
|
||||
else
|
||||
func(...)
|
||||
end
|
||||
end)
|
||||
else
|
||||
handle = XBindTool.BindAttr(obj, attr, func)
|
||||
end
|
||||
|
||||
bindInfo[obj].record[handle.id] = handle
|
||||
bindInfo[obj].length = bindInfo[obj].length + 1
|
||||
return handle
|
||||
end
|
||||
|
||||
function XBindTool.UnBindNode(node)
|
||||
local bindInfo = NodeBindInfoRecord[node]
|
||||
if bindInfo then
|
||||
for key, val in pairs(bindInfo) do
|
||||
for _, item in pairs(val.record) do
|
||||
XBindTool.UnBind(item)
|
||||
end
|
||||
bindInfo[key] = nil
|
||||
end
|
||||
NodeBindInfoRecord[node] = nil
|
||||
end
|
||||
end
|
115
Script/matrix/xcommon/XCameraHelper.lua
Normal file
115
Script/matrix/xcommon/XCameraHelper.lua
Normal file
|
@ -0,0 +1,115 @@
|
|||
XCameraHelper = XCameraHelper or {}
|
||||
|
||||
function XCameraHelper.SetCameraTarget(cameraCtrl, targetTrans, distance)
|
||||
if cameraCtrl and cameraCtrl:Exist() then
|
||||
distance = distance or 0
|
||||
cameraCtrl:SetLookAt(targetTrans, distance)
|
||||
end
|
||||
end
|
||||
|
||||
XCameraHelper.SCREEN_SHOT_WIDTH = 1920;
|
||||
XCameraHelper.SCREEN_SHOT_HEIGHT = 1080;
|
||||
XCameraHelper.DefaultRect = CS.UnityEngine.Rect(0, 0, XCameraHelper.SCREEN_SHOT_WIDTH, XCameraHelper.SCREEN_SHOT_HEIGHT);
|
||||
XCameraHelper.ScreenRect = CS.UnityEngine.Rect(0, 0, CS.UnityEngine.Screen.width, CS.UnityEngine.Screen.height)
|
||||
|
||||
function XCameraHelper.ScreenShot(image, beginCb, cb)
|
||||
if beginCb then
|
||||
beginCb()
|
||||
end
|
||||
CS.XTool.WaitForEndOfFrame(function()
|
||||
local screenShot = XCameraHelper.DoScreenShot(image)
|
||||
if cb then
|
||||
cb(screenShot)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- 截取屏幕画面到image中 (注意内存开销,需使用后及时释放)
|
||||
-- image Image组件
|
||||
-- cameraFar Camera组件
|
||||
-- cameraNear Camera组件(可选)
|
||||
function XCameraHelper.DoScreenShot(image)
|
||||
if XTool.UObjIsNil(image) then
|
||||
XLog.Error("ScreenShot image is nil")
|
||||
return
|
||||
end
|
||||
|
||||
-- if XTool.UObjIsNil(cameraFar) then
|
||||
-- XLog.Error("ScreenShot cameraFar is nil")
|
||||
-- return
|
||||
-- end
|
||||
|
||||
local rect = XCameraHelper.ScreenRect
|
||||
-- -- 创建一个rt对象
|
||||
-- local rt = CS.UnityEngine.RenderTexture(rect.width, rect.height, 24)
|
||||
-- rt.antiAliasing = 8
|
||||
|
||||
-- cameraFar.targetTexture = rt;
|
||||
-- if not XTool.UObjIsNil(cameraNear) then
|
||||
-- cameraNear.targetTexture = rt
|
||||
-- end
|
||||
|
||||
-- cameraFar:Render();
|
||||
-- if not XTool.UObjIsNil(cameraNear) then
|
||||
-- cameraNear:Render()
|
||||
-- end
|
||||
|
||||
-- local currentRT = CS.UnityEngine.RenderTexture.active
|
||||
-- -- 激活rt 读取像素
|
||||
-- CS.UnityEngine.RenderTexture.active = rt;
|
||||
local screenShot = CS.UnityEngine.Texture2D(rect.width, rect.height, CS.UnityEngine.TextureFormat.RGB24, false);
|
||||
screenShot:ReadPixels(rect, 0, 0);
|
||||
screenShot:Apply();
|
||||
|
||||
-- 重置相关参数
|
||||
-- cameraFar.targetTexture = nil;
|
||||
-- if not XTool.UObjIsNil(cameraNear) then
|
||||
-- cameraNear.targetTexture = nil;
|
||||
-- end
|
||||
|
||||
-- CS.UnityEngine.RenderTexture.active = currentRT;
|
||||
-- CS.UnityEngine.Object.Destroy(rt);
|
||||
|
||||
local sprite = CS.UnityEngine.Sprite.Create(screenShot, rect, CS.UnityEngine.Vector2.zero);
|
||||
image.sprite = sprite
|
||||
|
||||
return screenShot
|
||||
end
|
||||
|
||||
-- 调用该接口,由ScreenCaptureWithCallBack回调函数传出的Texture用完后必须销毁
|
||||
function XCameraHelper.ScreenShotNew(image, camera, cb, beginCb)
|
||||
if not image then
|
||||
XLog.Error("ScreenShot Call invalid parameter:image is nil")
|
||||
return
|
||||
end
|
||||
|
||||
if not camera then
|
||||
XLog.Error("ScreenShot Call invalid parameter:camera is nil")
|
||||
return
|
||||
end
|
||||
|
||||
if not cb then
|
||||
XLog.Error("The ScreenShot API Must Need CallBack")
|
||||
return
|
||||
end
|
||||
|
||||
-- if not XTool.UObjIsNil(image.mainTexture) and image.mainTexture.name ~= "UnityWhite" then -- 销毁texture2d (UnityWhite为默认的texture2d)
|
||||
-- CS.UnityEngine.Object.Destroy(image.mainTexture)
|
||||
-- end
|
||||
|
||||
if beginCb then
|
||||
beginCb()
|
||||
end
|
||||
CS.XScreenCapture.ScreenCaptureWithCallBack(camera,function(texture)
|
||||
local rect = CS.UnityEngine.Rect(0, 0, texture.width, texture.height)
|
||||
local sprite = CS.UnityEngine.Sprite.Create(texture, rect, CS.UnityEngine.Vector2.zero);
|
||||
image.sprite = sprite
|
||||
if cb then
|
||||
cb(texture)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function XCameraHelper.GetBlendTime(cameraBrain, index)
|
||||
return cameraBrain.m_CustomBlends.m_CustomBlends[index].m_Blend.m_Time
|
||||
end
|
153
Script/matrix/xcommon/XClass.lua
Normal file
153
Script/matrix/xcommon/XClass.lua
Normal file
|
@ -0,0 +1,153 @@
|
|||
local getinfo = debug.getinfo
|
||||
local type = type
|
||||
|
||||
local _class = {}
|
||||
local _classNameDic = {}
|
||||
|
||||
function XClass(super, className)
|
||||
local class
|
||||
|
||||
if XMain.IsEditorDebug then
|
||||
local fullClassName = className .. getinfo(2, "S").source
|
||||
class = _classNameDic[fullClassName]
|
||||
if class then
|
||||
class.Super = super
|
||||
if _class[class] then
|
||||
_class[class].Super = super
|
||||
end
|
||||
return class
|
||||
end
|
||||
|
||||
class = {}
|
||||
_classNameDic[fullClassName] = class
|
||||
else
|
||||
class = {}
|
||||
end
|
||||
|
||||
class.Ctor = false
|
||||
class.Super = super
|
||||
class.New = function(...)
|
||||
local obj = {}
|
||||
obj.__cname = className
|
||||
obj.__class = class --for typeof
|
||||
setmetatable(obj, { __index = _class[class] })
|
||||
do
|
||||
local create
|
||||
create = function(c, ...)
|
||||
if c.Super then
|
||||
create(c.Super, ...)
|
||||
end
|
||||
|
||||
if c.Ctor then
|
||||
c.Ctor(obj, ...)
|
||||
end
|
||||
end
|
||||
create(class, ...)
|
||||
end
|
||||
return obj
|
||||
end
|
||||
|
||||
local vtbl = {}
|
||||
_class[class] = vtbl
|
||||
|
||||
setmetatable(class, {
|
||||
__newindex = function(_, k, v)
|
||||
vtbl[k] = v
|
||||
end,
|
||||
__index = function(_, k)
|
||||
return vtbl[k]
|
||||
end
|
||||
})
|
||||
|
||||
if super then
|
||||
vtbl.Super = super
|
||||
setmetatable(vtbl, {
|
||||
__index = function(_, k)
|
||||
local ret = _class[super][k]
|
||||
vtbl[k] = ret
|
||||
return ret
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
return class
|
||||
end
|
||||
|
||||
function GetClassVituralTable(class)
|
||||
return _class[class]
|
||||
end
|
||||
|
||||
function UpdateClassType(newClass, oldClass)
|
||||
if "table" ~= type(newClass) then return end
|
||||
if "table" ~= type(oldClass) then return end
|
||||
|
||||
if oldClass == newClass then return end
|
||||
|
||||
local new_vtbl = _class[newClass]
|
||||
local old_vtbl = _class[oldClass]
|
||||
if not new_vtbl or not old_vtbl then return end
|
||||
|
||||
_class[oldClass] = new_vtbl
|
||||
_class[newClass] = nil
|
||||
end
|
||||
|
||||
-- 检查obj是否从super中继承过来
|
||||
function CheckClassSuper(obj, super)
|
||||
if obj == nil or obj.Super == nil then
|
||||
return false
|
||||
end
|
||||
local checkSuper = obj.Super
|
||||
while checkSuper do
|
||||
if checkSuper == super then
|
||||
return true
|
||||
end
|
||||
checkSuper = checkSuper.Super
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function CheckIsClass(obj) -- hack
|
||||
return obj.Ctor ~= nil and obj.New ~= nil
|
||||
end
|
||||
|
||||
-- 创建匿名方法类
|
||||
function CreateAnonClassInstance(funcDic, super, ...)
|
||||
local result = super.New(...)
|
||||
result.Super = super
|
||||
for funcName, func in pairs(funcDic) do
|
||||
result[funcName] = func
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function become_const(const_table, tipsError)
|
||||
function Const(const_table)
|
||||
local mt = {
|
||||
__index = function(t, k)
|
||||
if const_table[k] then
|
||||
return const_table[k]
|
||||
elseif tipsError then
|
||||
XLog.Error(string.format("const or enum key = %s is nil", k))
|
||||
end
|
||||
end,
|
||||
__newindex = function (t,k,v)
|
||||
XLog.Error("can't set " .. tostring(const_table) .."." .. tostring(k) .." to " .. tostring(v))
|
||||
end
|
||||
}
|
||||
return mt
|
||||
end
|
||||
|
||||
local t = {}
|
||||
setmetatable(t, Const(const_table))
|
||||
return t
|
||||
end
|
||||
|
||||
function enum(t, tipsError)
|
||||
local ret = {}
|
||||
for k, v in pairs(t) do
|
||||
ret[k] = v
|
||||
ret[v] = k
|
||||
end
|
||||
ret.dic = t
|
||||
return become_const(ret, tipsError)
|
||||
end
|
30
Script/matrix/xcommon/XCode.lua
Normal file
30
Script/matrix/xcommon/XCode.lua
Normal file
|
@ -0,0 +1,30 @@
|
|||
XCode = {}
|
||||
|
||||
local XCodeKeyMap = nil
|
||||
|
||||
local mt = {
|
||||
__index = function(t, k)
|
||||
local code = XCodeKeyMap[k]
|
||||
if code then
|
||||
t[k] = code
|
||||
XCodeKeyMap[k] = nil
|
||||
else
|
||||
XLog.Error("XCode Key:" .. tostring(k) .. "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XCodeText.tab<61><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ϸ<EFBFBD>Key<65>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ã<EFBFBD>XCode.cs<63>ж<EFBFBD><D0B6>壩")
|
||||
end
|
||||
return code
|
||||
end
|
||||
}
|
||||
setmetatable(XCode, mt)
|
||||
|
||||
function XCode.Init()
|
||||
if XCodeKeyMap then
|
||||
return
|
||||
end
|
||||
XCodeKeyMap = {}
|
||||
|
||||
local TABLE_CODE_TEXT = "Share/Text/CodeText.tab"
|
||||
local codeTextTemplates = XTableManager.ReadByStringKey(TABLE_CODE_TEXT, XTable.XTableCodeText, "Key")
|
||||
for k, v in pairs(codeTextTemplates) do
|
||||
XCodeKeyMap[k] = v.Id
|
||||
end
|
||||
end
|
127
Script/matrix/xcommon/XCountDown.lua
Normal file
127
Script/matrix/xcommon/XCountDown.lua
Normal file
|
@ -0,0 +1,127 @@
|
|||
XCountDown = XCountDown or {}
|
||||
|
||||
XCountDown.GTimerName = {
|
||||
UrgentEvent = "UrgentEvent",
|
||||
FubenInfestorExplore = "FubenInfestorExplore",
|
||||
FubenInfestorExploreDaily = "FubenInfestorExploreDaily",
|
||||
Stronghold = "Stronghold", --超级据点活动倒计时
|
||||
KillZone = "KillZone", --杀戮无双活动倒计时
|
||||
LivWarmSoundsActivity = "LivWarmSoundsActivity", --丽芙预热音频解密倒计时
|
||||
LivWarmExActivity = "LivWarmExActivity", --丽芙预热宣发活动
|
||||
AreaWar = "AreaWar", --全服决战
|
||||
Doomsday = "Doomsday", --末日生存
|
||||
}
|
||||
|
||||
-- 倒计时存储容器
|
||||
-- bindCnt : 当前倒计时的总数
|
||||
-- record : 倒计时
|
||||
-- record[name] : 通过倒计时命名来记录
|
||||
-- record[name].remainTime : 剩余时间
|
||||
-- record[name].lastTime : 最后一次绑定时间
|
||||
-- record[name].bindCnt : 单个命名绑定的倒计时的个数
|
||||
-- record[name].nodeList : 记录当前名字存下的节点
|
||||
-- timeHandle : 处理事件
|
||||
local TimerRecord = { bindCnt = 0, record = {}, timeHandle = nil }
|
||||
|
||||
local function UpdateTimerRecord()
|
||||
local now = XTime.GetServerNowTimestamp()
|
||||
for _, v in pairs(TimerRecord.record) do
|
||||
if v.bindCnt > 0 and v.remainTime > 0 then
|
||||
v.remainTime = v.remainTime - (now - v.lastTime)
|
||||
v.lastTime = now
|
||||
if v.remainTime < 0 then
|
||||
v.remainTime = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XCountDown.CreateTimer(name, remainTime, now)
|
||||
if not TimerRecord.record[name] then
|
||||
TimerRecord.record[name] = {
|
||||
bindCnt = 0,
|
||||
}
|
||||
end
|
||||
now = now or XTime.GetServerNowTimestamp()
|
||||
TimerRecord.record[name].remainTime = remainTime
|
||||
TimerRecord.record[name].lastTime = now
|
||||
end
|
||||
|
||||
function XCountDown.RemoveTimer(name)
|
||||
local record = TimerRecord.record[name]
|
||||
if record then
|
||||
TimerRecord.bindCnt = TimerRecord.bindCnt - record.bindCnt
|
||||
XBindTool.UnBindObj(record)
|
||||
TimerRecord.record[name] = nil
|
||||
if TimerRecord.bindCnt == 0 and TimerRecord.timeHandle then
|
||||
XScheduleManager.UnSchedule(TimerRecord.timeHandle)
|
||||
TimerRecord.timeHandle = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XCountDown.GetRemainTime(name)
|
||||
local record = TimerRecord.record[name]
|
||||
if record then
|
||||
local now = XTime.GetServerNowTimestamp()
|
||||
if record.bindCnt > 0 and record.remainTime > 0 then
|
||||
record.remainTime = record.remainTime - (now - record.lastTime)
|
||||
record.lastTime = now
|
||||
if record.remainTime < 0 then
|
||||
record.remainTime = 0
|
||||
end
|
||||
end
|
||||
return record.remainTime
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
function XCountDown.BindTimer(node, name, cb)
|
||||
local record = TimerRecord.record[name]
|
||||
if record then
|
||||
if not record.nodeList then
|
||||
record.nodeList = {}
|
||||
end
|
||||
table.insert(record.nodeList, node)
|
||||
|
||||
if not TimerRecord.timeHandle then
|
||||
TimerRecord.timeHandle = XScheduleManager.ScheduleForever(function()
|
||||
UpdateTimerRecord()
|
||||
end, XScheduleManager.SECOND, 0)
|
||||
UpdateTimerRecord()
|
||||
end
|
||||
|
||||
TimerRecord.bindCnt = TimerRecord.bindCnt + 1
|
||||
record.bindCnt = record.bindCnt + 1
|
||||
XBindTool.BindNode(node, record, "remainTime", cb, function()
|
||||
TimerRecord.bindCnt = TimerRecord.bindCnt - 1
|
||||
record.bindCnt = record.bindCnt - 1
|
||||
if TimerRecord.bindCnt == 0 then
|
||||
XScheduleManager.UnSchedule(TimerRecord.timeHandle)
|
||||
TimerRecord.timeHandle = nil
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function XCountDown.UnBindTimer(curNode, name)
|
||||
XBindTool.UnBindNode(curNode)
|
||||
|
||||
local record = TimerRecord.record[name]
|
||||
if not record or not record.nodeList then
|
||||
return
|
||||
end
|
||||
|
||||
for i = 1, #record.nodeList do
|
||||
if record.nodeList[i] == curNode then
|
||||
TimerRecord.bindCnt = TimerRecord.bindCnt - 1
|
||||
record.bindCnt = record.bindCnt - 1
|
||||
if TimerRecord.bindCnt == 0 then
|
||||
XScheduleManager.UnSchedule(TimerRecord.timeHandle)
|
||||
TimerRecord.timeHandle = nil
|
||||
end
|
||||
table.remove(record.nodeList, i)
|
||||
end
|
||||
end
|
||||
end
|
274
Script/matrix/xcommon/XDynamicList.lua
Normal file
274
Script/matrix/xcommon/XDynamicList.lua
Normal file
|
@ -0,0 +1,274 @@
|
|||
XDynamicList = XClass(nil, "XDynamicList")
|
||||
|
||||
DLDelegateEvent = {
|
||||
DYNAMIC_GRID_TOUCHED = 5,
|
||||
DYNAMIC_GRID_ATINDEX = 6,
|
||||
DYNAMIC_GRID_RECYCLE = 7,
|
||||
}
|
||||
|
||||
DLInsertDataDir = {
|
||||
None = 0,
|
||||
Head = 1,
|
||||
Tail = 2,
|
||||
}
|
||||
|
||||
DLScrollDataDir = {
|
||||
None = 0,
|
||||
Head = 1,
|
||||
Tail = 2
|
||||
}
|
||||
|
||||
function XDynamicList:DebugLog(...)
|
||||
if self.showLog then
|
||||
XLog.Error(...)
|
||||
end
|
||||
end
|
||||
|
||||
function XDynamicList:Ctor(ui)
|
||||
self.GameObject = ui.gameObject
|
||||
self.Transform = ui.transform
|
||||
self.ItemCache = {}
|
||||
|
||||
self.showLog = false
|
||||
|
||||
self:ResetData()
|
||||
self:InitView()
|
||||
end
|
||||
|
||||
function XDynamicList:ResetData()--重置数据
|
||||
self.Data = {}
|
||||
self.curDataMaxIndex = 0--当前数据最大的索引
|
||||
self.dataHeadIndex = -1 --当前数据头索引
|
||||
self.dataTailIndex = -1--当前数据尾索引
|
||||
self.NodeListData = {}
|
||||
|
||||
self.curShowHeadIndex = -1--当前展示的头索引
|
||||
self.curShowTailIndex = -1--当前展示的尾索引
|
||||
end
|
||||
|
||||
function XDynamicList:InitView()
|
||||
self.DynamicList = self.Transform:GetComponent("XVerticalDynamicList")
|
||||
self.DynamicListBar = self.DynamicList.verticalScrollbar
|
||||
if self.DynamicList == nil then
|
||||
XLog.Error("Not Find XVerticalDynamicList Component!")
|
||||
return
|
||||
end
|
||||
self.DynamicList:SetViewSize(self.Transform:GetComponent("RectTransform").rect.size)
|
||||
end
|
||||
|
||||
function XDynamicList:SetData(data, cb, scrollCb)--设置数据
|
||||
self:DebugLog("------数据初始化----", data)
|
||||
self:ResetData()
|
||||
self.CallBack = cb
|
||||
self.ScrollCallBack = scrollCb --滑动回调
|
||||
self.DynamicList.tableViewGridDelegate = function(evt, index, dir)
|
||||
return self:GenerateItem(evt, dir, index)
|
||||
end
|
||||
self:FormatData(data)
|
||||
end
|
||||
|
||||
function XDynamicList:FormatData(data)--格式化数据
|
||||
if data == nil then
|
||||
XLog.Error("------FormatData is error!------> data is nil! please check!")
|
||||
return
|
||||
end
|
||||
self.dataHeadIndex = 1
|
||||
self.dataTailIndex = #data
|
||||
self.NodeListData = {}
|
||||
for i = 1, self.dataTailIndex do
|
||||
self.curDataMaxIndex = self.curDataMaxIndex + 1
|
||||
local temp = {}
|
||||
temp.data = data[i]
|
||||
temp.index = self.curDataMaxIndex
|
||||
temp.Pre = (i == 1) and -1 or self.curDataMaxIndex - 1
|
||||
temp.Next = (i == #data) and -1 or self.curDataMaxIndex + 1
|
||||
self.NodeListData[self.curDataMaxIndex] = temp
|
||||
end
|
||||
self:DebugLog("------FormatData------", self.NodeListData)
|
||||
self:ReloadData()
|
||||
end
|
||||
|
||||
function XDynamicList:ReloadData()
|
||||
-- if #self.NodeListData <= 0 then
|
||||
-- return
|
||||
-- end
|
||||
self.curShowTailIndex = -1
|
||||
self.curShowHeadIndex = -1
|
||||
self.DynamicList.TotalCount = #self.NodeListData
|
||||
self.DynamicList:ReloadData(true)
|
||||
self:DebugLog("------ReloadData------", self.NodeListData)
|
||||
end
|
||||
|
||||
function XDynamicList:InsertData(insertData, dir, isReload)--插入数据
|
||||
if #insertData == 0 then
|
||||
XLog.Error("-----------insertData is null--------------")
|
||||
return
|
||||
end
|
||||
local tempDataHeadIndex = self.dataHeadIndex
|
||||
local tempDataTailIndex = self.dataTailIndex
|
||||
for i = 1, #insertData do
|
||||
self.curDataMaxIndex = self.curDataMaxIndex + 1
|
||||
local temp = {}
|
||||
temp.data = insertData[i]
|
||||
temp.index = self.curDataMaxIndex
|
||||
if dir == DLInsertDataDir.Head then
|
||||
temp.Pre = (i == 1) and -1 or self.curDataMaxIndex - 1
|
||||
if #self.NodeListData == 0 then
|
||||
temp.Next = -1
|
||||
else
|
||||
temp.Next = (i == #insertData) and self.dataHeadIndex or self.curDataMaxIndex + 1
|
||||
end
|
||||
if i == 1 then
|
||||
tempDataHeadIndex = self.curDataMaxIndex
|
||||
end
|
||||
if i == #insertData and #self.NodeListData > 0 then
|
||||
self.NodeListData[self.dataHeadIndex].Pre = self.curDataMaxIndex
|
||||
end
|
||||
elseif dir == DLInsertDataDir.Tail then
|
||||
if #self.NodeListData == 0 then
|
||||
temp.Pre = -1
|
||||
else
|
||||
temp.Pre = (i == 1) and self.dataTailIndex or self.curDataMaxIndex - 1
|
||||
end
|
||||
temp.Next = (i == #insertData) and -1 or self.curDataMaxIndex + 1
|
||||
if i == 1 and #self.NodeListData > 0 then
|
||||
self.NodeListData[self.dataTailIndex].Next = self.curDataMaxIndex
|
||||
end
|
||||
if i == #insertData then
|
||||
tempDataTailIndex = self.curDataMaxIndex
|
||||
end
|
||||
end
|
||||
self.NodeListData[self.curDataMaxIndex] = temp
|
||||
end
|
||||
self.dataHeadIndex = tempDataHeadIndex
|
||||
self.dataTailIndex = tempDataTailIndex
|
||||
self:AddTotalCount(#insertData, dir)
|
||||
if isReload then
|
||||
self:ReloadData()
|
||||
end
|
||||
end
|
||||
|
||||
function XDynamicList:AddTotalCount(addCount, dir)
|
||||
self.DynamicList.TotalCount = self.DynamicList.TotalCount + addCount;
|
||||
if dir == DLInsertDataDir.Head then
|
||||
self.DynamicList.StartIndex = self.DynamicList.StartIndex + addCount
|
||||
-- self.DynamicList.EndIndex = self.DynamicList.EndIndex + addCount
|
||||
end
|
||||
end
|
||||
|
||||
function XDynamicList:GenerateItem(evt, dir, index)
|
||||
if self.DynamicListBar then
|
||||
if self:GetBarValue() <= 0 then--拉到底了
|
||||
XEventManager.DispatchEvent(XEventId.EVENT_PULL_SCROLLVIEW_END, 0)
|
||||
-- 添加新事件系统触发
|
||||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_PULL_SCROLLVIEW_END, 0)
|
||||
elseif self:GetBarValue() >= 1 then--拉到顶了
|
||||
XEventManager.DispatchEvent(XEventId.EVENT_PULL_SCROLLVIEW_UP, 0)
|
||||
-- 添加新事件系统触发
|
||||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_PULL_SCROLLVIEW_UP, 0)
|
||||
end
|
||||
end
|
||||
|
||||
if self.ScrollCallBack then
|
||||
self.ScrollCallBack()
|
||||
end
|
||||
|
||||
if not self.CallBack then
|
||||
XLog.Error("You must be set callBack......")
|
||||
return
|
||||
end
|
||||
if evt == DLDelegateEvent.DYNAMIC_GRID_ATINDEX then
|
||||
if #self.NodeListData == 0 then
|
||||
return true
|
||||
end
|
||||
local curShowDataIndex = nil--下一个需要展示的数据index
|
||||
if dir == DLScrollDataDir.Head then
|
||||
if not self.NodeListData[self.curShowHeadIndex] then
|
||||
return true
|
||||
end
|
||||
if self.NodeListData[self.curShowHeadIndex].Pre == -1 then
|
||||
return true
|
||||
end
|
||||
self.curShowHeadIndex = self.NodeListData[self.curShowHeadIndex].Pre
|
||||
curShowDataIndex = self.curShowHeadIndex
|
||||
elseif dir == DLScrollDataDir.Tail then
|
||||
if self.curShowTailIndex == -1 and self.curShowHeadIndex == -1 then
|
||||
self.curShowHeadIndex = self.dataHeadIndex
|
||||
self.curShowTailIndex = self.dataHeadIndex
|
||||
else
|
||||
if not self.NodeListData[self.curShowTailIndex] then
|
||||
return true
|
||||
end
|
||||
if self.NodeListData[self.curShowTailIndex].Next == -1 then
|
||||
return true
|
||||
end
|
||||
self.curShowTailIndex = self.NodeListData[self.curShowTailIndex].Next
|
||||
end
|
||||
curShowDataIndex = self.curShowTailIndex
|
||||
end
|
||||
self.CallBack(self.NodeListData[curShowDataIndex].data, function(poolName, ctor)
|
||||
local item = self.DynamicList:PreDequeueGrid(poolName, index)
|
||||
local xlayoutNode = item:GetComponent("XLayoutNode")
|
||||
if self.DynamicList and xlayoutNode then
|
||||
xlayoutNode.minSize = CS.UnityEngine.Vector2(self.DynamicList.transform:GetComponent("RectTransform").rect.width, 0)
|
||||
end
|
||||
if item == nil then
|
||||
XLog.Error("GenerateItem is Fail......index = ", index)
|
||||
return false
|
||||
end
|
||||
local key = item.gameObject:GetHashCode()
|
||||
local itemScript = self.ItemCache[key]
|
||||
if itemScript ~= nil then
|
||||
return itemScript
|
||||
else
|
||||
local newItemScript = ctor(item.gameObject)
|
||||
self.ItemCache[key] = newItemScript
|
||||
return newItemScript
|
||||
end
|
||||
|
||||
end)
|
||||
return false
|
||||
elseif evt == DLDelegateEvent.DYNAMIC_GRID_RECYCLE then
|
||||
if dir == DLScrollDataDir.Head then
|
||||
self.curShowHeadIndex = self.NodeListData[self.curShowHeadIndex].Next
|
||||
elseif dir == DLScrollDataDir.Tail then
|
||||
self.curShowTailIndex = self.NodeListData[self.curShowTailIndex].Pre
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--------------------------Set-------------------
|
||||
function XDynamicList:SetReverse(code)
|
||||
self.DynamicList.Reverse = code
|
||||
end
|
||||
|
||||
function XDynamicList:SetBarValue(value)
|
||||
self.DynamicListBar.value = value
|
||||
end
|
||||
|
||||
function XDynamicList:SetViewSize(rectSize, isReload)
|
||||
self.DynamicList:SetViewSize(rectSize)
|
||||
if isReload then
|
||||
self:ReloadData()
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------Get-----------------
|
||||
function XDynamicList:GetBarValue()
|
||||
if self.DynamicListBar then
|
||||
return self.DynamicListBar.value
|
||||
else
|
||||
XLog.Error("------DynamicList Not ScrollBar Component!------")
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
function XDynamicList:GetCurDataCount()
|
||||
return #self.NodeListData
|
||||
end
|
||||
|
||||
function XDynamicList:AddObjectPools(poolName, prefab)
|
||||
self.DynamicList.ObjectPool:Add(poolName, prefab)
|
||||
end
|
194
Script/matrix/xcommon/XEntityHelper.lua
Normal file
194
Script/matrix/xcommon/XEntityHelper.lua
Normal file
|
@ -0,0 +1,194 @@
|
|||
XEntityHelper = XEntityHelper or {}
|
||||
|
||||
XEntityHelper.TEAM_MAX_ROLE_COUNT = 3
|
||||
|
||||
-- entityId : CharacterId or RobotId
|
||||
function XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
if XRobotManager.CheckIsRobotId(entityId) then
|
||||
return XRobotManager.GetRobotTemplate(entityId).CharacterId
|
||||
else
|
||||
return entityId
|
||||
end
|
||||
end
|
||||
|
||||
function XEntityHelper.GetIsRobot(entityId)
|
||||
return XRobotManager.CheckIsRobotId(entityId)
|
||||
end
|
||||
|
||||
function XEntityHelper.GetRobotCharacterType(robotId)
|
||||
local characterId = XRobotManager.GetCharacterId(robotId)
|
||||
return XCharacterConfigs.GetCharacterType(characterId)
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterName(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
local config = XCharacterConfigs.GetCharacterTemplate(characterId)
|
||||
if not config then return "none" end
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterTradeName(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
local config = XCharacterConfigs.GetCharacterTemplate(characterId)
|
||||
if not config then return "none" end
|
||||
return config.TradeName
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterLogName(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
local config = XCharacterConfigs.GetCharacterTemplate(characterId)
|
||||
if not config then return "none" end
|
||||
return config.LogName
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterSmallIcon(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
return XDataCenter.CharacterManager.GetCharSmallHeadIcon(characterId, 0, true)
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterType(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
return XCharacterConfigs.GetCharacterType(characterId)
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterAbility(entityId)
|
||||
local ability = XEntityHelper.GetIsRobot(entityId) and XRobotManager.GetRobotAbility(entityId) or XDataCenter.CharacterManager.GetCharacterAbilityById(entityId)
|
||||
return math.ceil(ability)
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharBigRoundnessNotItemHeadIcon(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
return XDataCenter.CharacterManager.GetCharBigRoundnessNotItemHeadIcon(characterId)
|
||||
end
|
||||
|
||||
-- 根据奖励Id获取第一个奖励的图标
|
||||
function XEntityHelper.GetRewardIcon(rewardId)
|
||||
local rewardList = XRewardManager.GetRewardList(rewardId)
|
||||
return XEntityHelper.GetItemIcon(rewardList[1].TemplateId)
|
||||
end
|
||||
|
||||
function XEntityHelper.GetRewardItemId(rewardId, index)
|
||||
if index == nil then index = 1 end
|
||||
local rewardList = XRewardManager.GetRewardList(rewardId)
|
||||
return rewardList[index]
|
||||
end
|
||||
|
||||
function XEntityHelper.GetItemIcon(itemId)
|
||||
local result = XGoodsCommonManager.GetGoodsIcon(itemId)
|
||||
if result then return result end
|
||||
local config = XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId)
|
||||
return config.Icon
|
||||
end
|
||||
|
||||
function XEntityHelper.GetItemName(itemId)
|
||||
return XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId).Name
|
||||
end
|
||||
|
||||
function XEntityHelper.GetItemQuality(itemId)
|
||||
local result = XGoodsCommonManager.GetGoodsDefaultQuality(itemId)
|
||||
if result then return result end
|
||||
local config = XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId)
|
||||
return config.Quality or -1
|
||||
end
|
||||
|
||||
function XEntityHelper.GetCharacterHalfBodyImage(entityId)
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
return XDataCenter.CharacterManager.GetCharHalfBodyImage(characterId)
|
||||
end
|
||||
|
||||
-- 检查物品数量是否满足指定数量
|
||||
function XEntityHelper.CheckItemCountIsEnough(itemId, count, showTip)
|
||||
if showTip == nil then showTip = true end
|
||||
if XDataCenter.ItemManager.GetCount(itemId) < count then
|
||||
if showTip then
|
||||
XUiManager.TipError(XUiHelper.GetText("AssetsBuyConsumeNotEnough", XDataCenter.ItemManager.GetItemName(itemId)))
|
||||
end
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- 排序物品
|
||||
--[[
|
||||
itemData : {
|
||||
TemplateId,
|
||||
Count,
|
||||
}
|
||||
]]
|
||||
function XEntityHelper.SortItemDatas(itemDatas)
|
||||
table.sort(itemDatas, function(itemDataA, itemDataB)
|
||||
local itemIdA = itemDataA.TemplateId
|
||||
local itemIdB = itemDataB.TemplateId
|
||||
local itemCountA = itemDataA.Count or 0
|
||||
local itemCountB = itemDataB.Count or 0
|
||||
local qualityA = XEntityHelper.GetItemQuality(itemIdA)
|
||||
local qualityB = XEntityHelper.GetItemQuality(itemIdB)
|
||||
-- 品质
|
||||
if qualityA ~= qualityB then
|
||||
return qualityA > qualityB
|
||||
end
|
||||
-- id
|
||||
if itemIdA ~= itemIdB then
|
||||
return itemIdA > itemIdB
|
||||
end
|
||||
-- 数量
|
||||
return itemCountA > itemCountB
|
||||
end)
|
||||
end
|
||||
|
||||
function XEntityHelper.CheckIsNeedRoleLimit(stageId, viewModels)
|
||||
local limitType = XFubenConfigs.GetStageCharacterLimitType(stageId)
|
||||
if limitType == XFubenConfigs.CharacterLimitType.All then
|
||||
return false
|
||||
end
|
||||
if #viewModels <= 0 then
|
||||
return true
|
||||
end
|
||||
local characterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(limitType)
|
||||
for _, viewModel in ipairs(viewModels) do
|
||||
if viewModel:GetCharacterType() ~= characterType then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function XEntityHelper.CheckIsNeedCareerLimit(stageId, viewModels)
|
||||
local careerLimitTypes = XFubenConfigs.GetStageCareerSuggestTypes(stageId)
|
||||
if #careerLimitTypes <= 0 then
|
||||
return false
|
||||
end
|
||||
local isContain, containIndex
|
||||
local result = {}
|
||||
for _, viewModel in pairs(viewModels) do
|
||||
isContain, containIndex = table.contains(careerLimitTypes, viewModel:GetCareer())
|
||||
if isContain then
|
||||
result[containIndex] = true
|
||||
end
|
||||
end
|
||||
if table.nums(result) == #careerLimitTypes then -- 都满足
|
||||
return false
|
||||
end
|
||||
return true, careerLimitTypes, result
|
||||
end
|
||||
|
||||
-- ids : 可包含机器人或角色Id,返回对应的机器人或角色实体
|
||||
function XEntityHelper.GetEntityByIds(ids)
|
||||
local result = {}
|
||||
for _, id in ipairs(ids) do
|
||||
if XEntityHelper.GetIsRobot(id) then
|
||||
table.insert(result, XRobotManager.GetRobotById(id))
|
||||
else
|
||||
table.insert(result, XDataCenter.CharacterManager.GetCharacter(id))
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function XEntityHelper.ClearErrorTeamEntityId(team, checkHasFunc)
|
||||
for pos, entityId in pairs(team:GetEntityIds()) do
|
||||
if entityId > 0 and not checkHasFunc(entityId) then
|
||||
team:UpdateEntityTeamPos(entityId, pos, false)
|
||||
end
|
||||
end
|
||||
end
|
1048
Script/matrix/xcommon/XEventId.lua
Normal file
1048
Script/matrix/xcommon/XEventId.lua
Normal file
File diff suppressed because it is too large
Load diff
28
Script/matrix/xcommon/XFightNetwork.lua
Normal file
28
Script/matrix/xcommon/XFightNetwork.lua
Normal file
|
@ -0,0 +1,28 @@
|
|||
XFightNetwork = XFightNetwork or {}
|
||||
|
||||
function XFightNetwork.Send(handler, request)
|
||||
local requestContent, error = XMessagePack.Encode(request)
|
||||
if requestContent == nil then
|
||||
XLog.Error("Lua.XFightNetwork.Send 函数错误, 客户端发送给服务端的数据编码处理失败, 失败原因:" .. error)
|
||||
return
|
||||
end
|
||||
|
||||
CS.XFightNetwork.Send(handler, requestContent);
|
||||
end
|
||||
|
||||
function XFightNetwork.Call(handler, request, reply)
|
||||
local requestContent, error = XMessagePack.Encode(request)
|
||||
if requestContent == nil then
|
||||
XLog.Error("Lua.XFightNetwork.Call 函数错误, 客户端发送给服务端的数据编码处理失败, 失败原因: " .. error)
|
||||
return
|
||||
end
|
||||
|
||||
CS.XFightNetwork.Call(handler, requestContent, function(responseContent)
|
||||
local response, err = XMessagePack.Decode(responseContent)
|
||||
if response == nil then
|
||||
XLog.Error("Lua.XFightNetwork.Call 函数错误, 服务端返回的数据解码失败, 失败原因: " .. err)
|
||||
return
|
||||
end
|
||||
reply(response)
|
||||
end)
|
||||
end
|
187
Script/matrix/xcommon/XGlobalFunc.lua
Normal file
187
Script/matrix/xcommon/XGlobalFunc.lua
Normal file
|
@ -0,0 +1,187 @@
|
|||
local coroutineRunning = coroutine.running
|
||||
local coroutineResume = coroutine.resume
|
||||
local coroutineYield = coroutine.yield
|
||||
local coroutineWrap = coroutine.wrap
|
||||
local tablePack = table.pack
|
||||
local tableUnpack = table.unpack
|
||||
local select = select
|
||||
|
||||
function Handler(target, func)
|
||||
return function(...)
|
||||
return func(target, ...)
|
||||
end
|
||||
end
|
||||
handler = Handler
|
||||
|
||||
function LuaGC()
|
||||
collectgarbage("collect")
|
||||
end
|
||||
|
||||
--回调转异步任务(需和RunAsyn配合使用)
|
||||
---@param func: 带回调的function类型, 示例:local testFunc = function(..., callback) end
|
||||
---@param callbackPos: 回调在参数列表中的位置, 传nil默认为最后一位, 示例:local testFunc = function(p1, p2, callback) end-->callbackPos = 3
|
||||
---@return asynTask:不处理原函数返回值,异步需求默认void,原函数中的callback回调将不再可用,必须传nil)
|
||||
---@Examplemple
|
||||
--[[
|
||||
local testFunc = function(str, cb)
|
||||
XScheduleManager.ScheduleOnce(function()
|
||||
XLog.Debug(str)
|
||||
if cb then cb() end
|
||||
end, XScheduleManager.SECOND)
|
||||
end
|
||||
|
||||
--callback hell
|
||||
XLog.Debug("test callback begin")
|
||||
testFunc("test callback CallBack 1"
|
||||
, function()
|
||||
testFunc("test callback CallBack 2"
|
||||
, function()
|
||||
testFunc("test callback CallBack 3")
|
||||
end)
|
||||
end)
|
||||
XLog.Debug("test callback end")
|
||||
|
||||
--asyn task
|
||||
XLog.Debug("test asyn task begin")
|
||||
local asynTest = asynTask(testFunc)
|
||||
RunAsyn(function()
|
||||
asynTest("test asyn CallBack 1")
|
||||
XLog.Debug("test asyn after 1")
|
||||
asynTest("test asyn CallBack 2")
|
||||
asynTest("test asyn CallBack 3")
|
||||
end)
|
||||
XLog.Debug("test asyn task end")
|
||||
]]
|
||||
function asynTask(func, caller, callbackPos)
|
||||
return function(...)
|
||||
local results = {}
|
||||
local isSync --同步方法,回调直接执行
|
||||
local args = { ... }
|
||||
local running = coroutineRunning()
|
||||
callbackPos = callbackPos or select("#", ...) + 1
|
||||
args[callbackPos] = function()
|
||||
isSync = true
|
||||
coroutineResume(running, tableUnpack(results))
|
||||
end
|
||||
results = caller and tablePack(func(caller, tableUnpack(args))) or tablePack(func(tableUnpack(args)))
|
||||
return not isSync and coroutineYield() or nil
|
||||
end
|
||||
end
|
||||
|
||||
--异步等待second秒(需和RunAsyn配合使用)
|
||||
function asynWaitSecond(second)
|
||||
asynTask(
|
||||
function(cb)
|
||||
XScheduleManager.ScheduleOnce(cb, second * XScheduleManager.SECOND)
|
||||
end
|
||||
)()
|
||||
end
|
||||
|
||||
--异步执行
|
||||
function RunAsyn(func)
|
||||
return coroutineWrap(func)()
|
||||
end
|
||||
|
||||
function appendArray(dst, src)
|
||||
if src == nil then return dst end
|
||||
for i, v in ipairs(src) do
|
||||
table.insert(dst, v)
|
||||
end
|
||||
return dst
|
||||
end
|
||||
|
||||
-- 保留digit位小数
|
||||
function getRoundingValue(value, digit)
|
||||
return math.floor(value * math.pow(10, digit)) / math.pow(10, digit)
|
||||
end
|
||||
|
||||
function math.pow(a, b)
|
||||
return a ^ b
|
||||
end
|
||||
|
||||
function math.round(value)
|
||||
return math.floor(value + 0.5)
|
||||
end
|
||||
|
||||
function table.indexof(array, value, begin)
|
||||
for i = begin or 1, #array do
|
||||
if array[i] == value then
|
||||
return i
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function table.contains(tbl, ele)
|
||||
for i, v in pairs(tbl) do
|
||||
if v == ele then
|
||||
return true, i
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function table.dicToArray(dic, keyName, valueName)
|
||||
keyName = keyName or "key"
|
||||
valueName = valueName or "value"
|
||||
local array = {}
|
||||
for k, v in pairs(dic) do
|
||||
array[#array + 1] = {
|
||||
[keyName] = k,
|
||||
[valueName] = v
|
||||
}
|
||||
end
|
||||
return array
|
||||
end
|
||||
|
||||
function table.arrayToDic(array)
|
||||
local dic = {}
|
||||
for i, v in ipairs(array) do
|
||||
dic[v] = i
|
||||
end
|
||||
return dic
|
||||
end
|
||||
|
||||
function table.range(t, start, count)
|
||||
local ret = {}
|
||||
for i = start, start + count - 1 do
|
||||
ret[#ret + 1] = t[i]
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
function table.nums(t)
|
||||
return XTool.GetTableCount(t)
|
||||
end
|
||||
|
||||
--[[
|
||||
@desc: 列表去重
|
||||
--@t:需要去重的列表
|
||||
--@bArray: true 更新列表的所有为新索引
|
||||
false 保留元素原来的索引
|
||||
@return:去重后的列表
|
||||
]]
|
||||
function table.unique(t, bArray)
|
||||
local check = {}
|
||||
local n = {}
|
||||
local idx = 1
|
||||
for k, v in ipairs(t) do
|
||||
if not check[v] then
|
||||
if bArray then
|
||||
n[idx] = v
|
||||
idx = idx + 1
|
||||
else
|
||||
n[k] = v
|
||||
end
|
||||
check[v] = true
|
||||
end
|
||||
end
|
||||
return n
|
||||
end
|
||||
|
||||
--程序暂停
|
||||
function ApplicationPause(pause)
|
||||
if XEventManager then
|
||||
XEventManager.DispatchEvent(XEventId.EVENT_APPLICATION_PAUSE, pause)
|
||||
end
|
||||
end
|
43
Script/matrix/xcommon/XGlobalVar.lua
Normal file
43
Script/matrix/xcommon/XGlobalVar.lua
Normal file
|
@ -0,0 +1,43 @@
|
|||
local IncId = 0
|
||||
|
||||
XGlobalVar = {
|
||||
ScrollViewScrollDir = {
|
||||
ScrollDown = "ScrollDown", --从上往下滚
|
||||
ScrollRight = "ScrollRight" --从左往右滚
|
||||
},
|
||||
|
||||
UiDesignSize = { --ui设计尺寸
|
||||
Width = 1920,
|
||||
Height = 1080,
|
||||
},
|
||||
|
||||
GetIncId = function()
|
||||
IncId = IncId + 1
|
||||
return IncId
|
||||
end,
|
||||
|
||||
BtnBuriedSpotTypeLevelOne = {
|
||||
BtnUiMainBtnRoleInfo = 1,
|
||||
BtnUiMainBtnNotice = 2,
|
||||
BtnUiMainPanelAd = 3,
|
||||
BtnUiMainBtnChat = 4,
|
||||
BtnUiMainBtnRole = 5,
|
||||
BtnUiMainBtnSecond = 6,
|
||||
BtnUiMainBtnActivityEntry1 = 7,
|
||||
BtnUiMainBtnActivityEntry2 = 8,
|
||||
BtnUiMainBtnActivityEntry3 = 9,
|
||||
BtnUiMainBtnStore = 10,
|
||||
BtnUiMainBtnRecharge = 11,
|
||||
},
|
||||
BtnBuriedSpotTypeLevelTwo = {
|
||||
BtnUiPurchaseBtnTabSkip1 = 1,
|
||||
BtnUiPurchaseBtnTabSkip2 = 2,
|
||||
BtnUiPurchaseBtnTabSkip3 = 3,
|
||||
BtnUiPurchaseBtnTabSkip4 = 4,
|
||||
BtnUiPurchaseGroupTabSkip1 = 5,
|
||||
BtnUiPurchaseGroupTabSkip2 = 6,
|
||||
BtnUiPurchaseGroupTabSkip3 = 7,
|
||||
BtnUiPurchaseGroupTabSkip4 = 8,
|
||||
}
|
||||
|
||||
}
|
188
Script/matrix/xcommon/XLog.lua
Normal file
188
Script/matrix/xcommon/XLog.lua
Normal file
|
@ -0,0 +1,188 @@
|
|||
XLog = XLog or {}
|
||||
|
||||
local MAX_DEPTH = 15
|
||||
|
||||
local Type = type
|
||||
local Tostring = tostring
|
||||
local TableRemove = table.remove
|
||||
local TableInsert = table.insert
|
||||
local TableConcat = table.concat
|
||||
local StringGub = string.gsub
|
||||
local DebugTraceback = debug.traceback
|
||||
local XLogDebug = CS.XLog.Debug
|
||||
local XLogWarning = CS.XLog.Warning
|
||||
local XLogError = CS.XLog.Error
|
||||
|
||||
local Pairs = function(arr)
|
||||
local meta_t = getmetatable(arr)
|
||||
if meta_t and meta_t.__pairs then
|
||||
return meta_t.__pairs(arr)
|
||||
end
|
||||
return pairs(arr)
|
||||
end
|
||||
|
||||
|
||||
local indentCache = { "" }
|
||||
local function GetIndent(depth)
|
||||
if not indentCache[depth] then
|
||||
indentCache[depth] = GetIndent(depth - 1) .. " "
|
||||
end
|
||||
return indentCache[depth]
|
||||
end
|
||||
|
||||
local function Dump(target)
|
||||
local content = {}
|
||||
local stack = {
|
||||
{
|
||||
obj = target,
|
||||
name = nil,
|
||||
depth = 1,
|
||||
symbol = nil,
|
||||
}
|
||||
}
|
||||
|
||||
while #stack > 0 do
|
||||
local top = TableRemove(stack)
|
||||
local obj = top.obj
|
||||
local name = top.name
|
||||
local depth = top.depth
|
||||
local symbol = top.symbol
|
||||
|
||||
if Type(obj) == "table" then
|
||||
if depth > MAX_DEPTH then
|
||||
TableInsert(stack, {
|
||||
obj = "too depth ...",
|
||||
name = name,
|
||||
depth = depth,
|
||||
symbol = symbol,
|
||||
})
|
||||
else
|
||||
TableInsert(stack, {
|
||||
obj = "}",
|
||||
name = nil,
|
||||
depth = depth,
|
||||
symbol = symbol,
|
||||
})
|
||||
|
||||
local temp = {}
|
||||
for k, v in Pairs(obj) do
|
||||
TableInsert(temp, {
|
||||
obj = v,
|
||||
name = k,
|
||||
depth = depth + 1,
|
||||
symbol = ",",
|
||||
})
|
||||
end
|
||||
|
||||
local count = #temp
|
||||
for i = 1, count do
|
||||
TableInsert(stack, temp[count - i + 1])
|
||||
end
|
||||
|
||||
TableInsert(stack, {
|
||||
obj = "{",
|
||||
name = name,
|
||||
depth = depth,
|
||||
symbol = nil,
|
||||
})
|
||||
end
|
||||
else
|
||||
TableInsert(content, GetIndent(depth))
|
||||
|
||||
if name then
|
||||
if Type(name) == "string" then
|
||||
TableInsert(content, "[\"")
|
||||
TableInsert(content, name)
|
||||
TableInsert(content, "\"]")
|
||||
else
|
||||
TableInsert(content, "[")
|
||||
TableInsert(content, Tostring(name))
|
||||
TableInsert(content, "]")
|
||||
end
|
||||
|
||||
TableInsert(content, " = ")
|
||||
end
|
||||
|
||||
if obj and Type(obj) == "string" then
|
||||
if obj ~= "{" and obj ~= "}" then
|
||||
TableInsert(content, "\"")
|
||||
TableInsert(content, obj)
|
||||
TableInsert(content, "\"")
|
||||
else
|
||||
TableInsert(content, obj)
|
||||
end
|
||||
else
|
||||
TableInsert(content, Tostring(obj))
|
||||
end
|
||||
|
||||
if symbol then
|
||||
TableInsert(content, symbol)
|
||||
end
|
||||
|
||||
TableInsert(content, "\n")
|
||||
end
|
||||
end
|
||||
|
||||
return TableConcat(content)
|
||||
end
|
||||
|
||||
local Print = function(...)
|
||||
local args = { ... }
|
||||
local count = #args
|
||||
|
||||
if count <= 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local content = {}
|
||||
for i = 1, count do
|
||||
if Type(args[i]) == "table" then
|
||||
TableInsert(content, Dump(args[i]))
|
||||
else
|
||||
TableInsert(content, Tostring(args[i]))
|
||||
TableInsert(content, "\n")
|
||||
end
|
||||
end
|
||||
|
||||
return TableConcat(content)
|
||||
-- return StringGub(StringGub(TableConcat(content), "{", "/{"), "}", "/}")
|
||||
end
|
||||
|
||||
XLog.Debug = function(...)
|
||||
local content = Print(...)
|
||||
if content then
|
||||
XLogDebug(content .. "\n" .. DebugTraceback())
|
||||
else
|
||||
XLogDebug("nil\n" .. DebugTraceback())
|
||||
end
|
||||
end
|
||||
|
||||
XLog.Warning = function(...)
|
||||
local content = Print(...)
|
||||
if content then
|
||||
XLogWarning(content .. "\n" .. DebugTraceback())
|
||||
else
|
||||
XLogWarning("nil\n" .. DebugTraceback())
|
||||
end
|
||||
end
|
||||
|
||||
XLog.Error = function(...)
|
||||
local content = Print(...)
|
||||
if content then
|
||||
XLogError(content .. "\n" .. DebugTraceback())
|
||||
else
|
||||
XLogError("nil\n" .. DebugTraceback())
|
||||
end
|
||||
end
|
||||
|
||||
-- 表格找不到数据错误统一输出接口
|
||||
XLog.ErrorTableDataNotFound = function(functionName, dataName, tablePath, paramName, paramValue)
|
||||
XLog.Error(string.format("%s出错:找不到%s数据。搜索路径: %s 索引%s = %s", functionName, dataName, tablePath, paramName, paramValue))
|
||||
end
|
||||
|
||||
XLog.Dump = function(value)
|
||||
if type(value) ~= "table" then
|
||||
return tostring(value)
|
||||
end
|
||||
return Dump(value)
|
||||
end
|
34
Script/matrix/xcommon/XLuaBehaviour.lua
Normal file
34
Script/matrix/xcommon/XLuaBehaviour.lua
Normal file
|
@ -0,0 +1,34 @@
|
|||
XLuaBehaviour = XClass(nil, "XLuaBehaviour")
|
||||
|
||||
function XLuaBehaviour:Ctor(rootUi, ui)
|
||||
self.Transform = ui.transform
|
||||
self.GameObject = ui.gameObject
|
||||
|
||||
local behaviour = self.GameObject:GetComponent(typeof(CS.XLuaBehaviour))
|
||||
if not behaviour then
|
||||
behaviour = self.GameObject:AddComponent(typeof(CS.XLuaBehaviour))
|
||||
end
|
||||
|
||||
if self.Start then
|
||||
behaviour.LuaStart = function() self:Start() end
|
||||
end
|
||||
|
||||
if self.Update then
|
||||
behaviour.LuaUpdate = function() self:Update() end
|
||||
end
|
||||
|
||||
if self.LateUpdate then
|
||||
behaviour.LuaLateUpdate = function() self:LateUpdate() end
|
||||
end
|
||||
|
||||
if self.OnDestroy then
|
||||
behaviour.LuaOnDestroy = function() self:OnDestroy() end
|
||||
end
|
||||
end
|
||||
|
||||
function XLuaBehaviour:Dispose()
|
||||
local xLuaBehaviour = self.Transform:GetComponent(typeof(CS.XLuaBehaviour))
|
||||
if (xLuaBehaviour) then
|
||||
CS.UnityEngine.GameObject.Destroy(xLuaBehaviour)
|
||||
end
|
||||
end
|
59
Script/matrix/xcommon/XMath.lua
Normal file
59
Script/matrix/xcommon/XMath.lua
Normal file
|
@ -0,0 +1,59 @@
|
|||
local math = math
|
||||
|
||||
local mathFloor = math.floor
|
||||
local mathRandom = math.random
|
||||
|
||||
XMath = XMath or {}
|
||||
|
||||
function XMath.RandByWeights(weights)
|
||||
local weightSum = 0
|
||||
for i = 1, #weights do
|
||||
weightSum = weightSum + weights[i]
|
||||
end
|
||||
|
||||
local rand = mathRandom(weightSum)
|
||||
local curWeight = 0
|
||||
for i = 1, #weights do
|
||||
local weight = weights[i]
|
||||
curWeight = curWeight + weight
|
||||
if rand < curWeight then
|
||||
return i
|
||||
end
|
||||
end
|
||||
|
||||
return #weights
|
||||
end
|
||||
|
||||
function XMath.Clamp(value, min, max)
|
||||
if value < min then
|
||||
return min
|
||||
end
|
||||
if value > max then
|
||||
return max
|
||||
end
|
||||
return value
|
||||
end
|
||||
|
||||
|
||||
--==============================--
|
||||
--desc: 转换成整数,浮点数四舍五入
|
||||
--==============================--
|
||||
XMath.ToInt = function(val)
|
||||
if not val then return end
|
||||
return mathFloor(val + 0.5)
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 转换成整数,浮点数向下取整数
|
||||
--==============================--
|
||||
XMath.ToMinInt = function(val)
|
||||
if not val then return end
|
||||
return mathFloor(val)
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 最大整数,与C#一致
|
||||
--==============================--
|
||||
XMath.IntMax = function()
|
||||
return 2147483647
|
||||
end
|
280
Script/matrix/xcommon/XNetwork.lua
Normal file
280
Script/matrix/xcommon/XNetwork.lua
Normal file
|
@ -0,0 +1,280 @@
|
|||
XNetwork = XNetwork or {}
|
||||
|
||||
local Ip
|
||||
local Port
|
||||
local LastIp
|
||||
local LastPort
|
||||
local XRpc = XRpc
|
||||
local IsDebug = XMain.IsEditorDebug
|
||||
local ShieldedProtocol = {}
|
||||
local NeedShieldProtocol = false
|
||||
|
||||
XNetwork.NetworkMode = {
|
||||
Auto = 1,
|
||||
Ipv4 = 2,
|
||||
Ipv6 = 3,
|
||||
}
|
||||
XNetwork.NetworkModeKey = "NETWORK_MODE_KEY"
|
||||
|
||||
local function GetIpAndPort()
|
||||
return Ip, Port
|
||||
end
|
||||
|
||||
function XNetwork.SetGateAddress(ip, port)
|
||||
Ip = ip
|
||||
Port = port
|
||||
end
|
||||
|
||||
function XNetwork.CheckIsChangedGate()
|
||||
return LastIp ~= Ip or LastPort ~= Port
|
||||
end
|
||||
|
||||
local LogTableFunc = IsDebug and XLog.Debug or XLog.Error
|
||||
|
||||
local function TipTableDiff(sha1Table)
|
||||
if not CS.XTableManager.NeedSha1 then -- 开发环境下不解析Sha1
|
||||
return
|
||||
end
|
||||
|
||||
XTool.LoopMap(CS.XTableManager.Sha1Table, function(k, v)
|
||||
local sha1 = sha1Table[k]
|
||||
if not sha1 then
|
||||
LogTableFunc("多余表格: " .. k)
|
||||
return
|
||||
end
|
||||
|
||||
if v ~= sha1 then
|
||||
LogTableFunc("差异表格: " .. k .. ", 客户端sha1: " .. v .. " , 服务端sha1: " .. sha1)
|
||||
end
|
||||
|
||||
sha1Table[k] = nil
|
||||
end)
|
||||
|
||||
for k, _ in pairs(sha1Table) do
|
||||
LogTableFunc("缺少表格: " .. k)
|
||||
end
|
||||
end
|
||||
|
||||
XRpc.NotifyCheckTableSha1 = function(data)
|
||||
TipTableDiff(data.Sha1Table)
|
||||
end
|
||||
|
||||
function XNetwork.ConnectGateServer(args)
|
||||
if not args then
|
||||
return
|
||||
end
|
||||
|
||||
if IsDebug then
|
||||
XRpc.CheckLuaNetLogEnable()
|
||||
end
|
||||
|
||||
CS.XNetwork.OnConnect = function()
|
||||
if args.IsReconnect then
|
||||
local request = { PlayerId = XPlayer.Id, Token = XUserManager.ReconnectedToken, LastMsgSeqNo = CS.XNetwork.ServerMsgSeqNo }
|
||||
if CS.XNetwork.IsShowNetLog then
|
||||
XLog.Debug("PlayerId=" .. request.PlayerId .. ", Token=" .. request.Token .. ", LastMsgSeqNo=" .. request.LastMsgSeqNo)
|
||||
end
|
||||
|
||||
local request_func
|
||||
request_func = function()
|
||||
XNetwork.Call("ReconnectRequest", request, function(res)
|
||||
if res.Code ~= XCode.Success then
|
||||
if CS.XNetwork.IsShowNetLog then
|
||||
XLog.Debug("服务器返回断线重连失败。" .. tostring(res.Code))
|
||||
end
|
||||
XLoginManager.DoDisconnect()
|
||||
else
|
||||
XNetwork.Send("ReconnectAck")
|
||||
if CS.XNetwork.IsShowNetLog then
|
||||
XLog.Debug("服务器返回断线重连成功。")
|
||||
end
|
||||
XUserManager.ReconnectedToken = res.ReconnectToken
|
||||
if args.ConnectCb then
|
||||
args.ConnectCb()
|
||||
end
|
||||
|
||||
if res.OfflineMessages then
|
||||
CS.XNetwork.ProcessReconnectMessageList(res.OfflineMessages)
|
||||
end
|
||||
CS.XNetwork.ReCall(res.RequestNo)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
request_func()
|
||||
else
|
||||
XNetwork.Call("HandshakeRequest", {
|
||||
ApplicationVersion = CS.XRemoteConfig.ApplicationVersion,
|
||||
DocumentVersion = CS.XRemoteConfig.DocumentVersion,
|
||||
Sha1 = CS.XTableManager.Sha1
|
||||
}, function(response)
|
||||
if args.RemoveHandshakeTimerCb then
|
||||
args.RemoveHandshakeTimerCb()
|
||||
end
|
||||
|
||||
if response.Code ~= XCode.Success then
|
||||
local msgTab = {}
|
||||
msgTab.error_code = response.Code
|
||||
CS.XRecord.Record(msgTab, "24019", "HandshakeRequest")
|
||||
if response.Code == XCode.GateServerNotOpen then
|
||||
local localTimeStr = XTime.TimestampToLocalDateTimeString(response.UtcOpenTime, "yyyy-MM-dd HH:mm(G'M'T z)")
|
||||
local context = CS.XTextManager.GetCodeText(response.Code) .. localTimeStr
|
||||
XUiManager.SystemDialogTip("", context, XUiManager.DialogType.OnlySure)
|
||||
elseif response.Code == XCode.LoginApplicationVersionError then
|
||||
-- 处于调试模式时进错服显示取消按钮,否则不显示
|
||||
local cancelCb = XMain.IsDebug and function() end or nil
|
||||
CS.XTool.WaitCoroutine(CS.XApplication.CoDialog(CS.XApplication.GetText("Tip"),
|
||||
CS.XStringEx.Format(CS.XApplication.GetText("UpdateApplication"),
|
||||
CS.XInfo.Version), cancelCb, function() CS.XTool.WaitCoroutine(CS.XApplication.GoToUpdateURL(GetAppUpgradeUrl()), nil) end))
|
||||
else
|
||||
XUiManager.DialogTip("", CS.XTextManager.GetCodeText(response.Code), XUiManager.DialogType.OnlySure)
|
||||
end
|
||||
|
||||
if response.Code == XCode.LoginTableError then
|
||||
XLog.Error("配置表客户端和服务端不一致")
|
||||
TipTableDiff(response.Sha1Table)
|
||||
end
|
||||
|
||||
CS.XNetwork.Disconnect()
|
||||
return
|
||||
end
|
||||
|
||||
CS.XRecord.Record("24020", "HandshakeRequestSuccess")
|
||||
if args.ConnectCb then
|
||||
args.ConnectCb()
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
CS.XNetwork.OnDisconnect = function()
|
||||
if args.DisconnectCb then
|
||||
args.DisconnectCb()
|
||||
end
|
||||
end
|
||||
CS.XNetwork.OnRemoteDisconnect = function()
|
||||
if args.RemoteDisconnectCb then
|
||||
args.RemoteDisconnectCb()
|
||||
end
|
||||
end
|
||||
CS.XNetwork.OnError = function(error)
|
||||
if args.ErrorCb then
|
||||
args.ErrorCb(error)
|
||||
end
|
||||
end
|
||||
CS.XNetwork.OnMessageError = function()
|
||||
if args.MsgErrorCb then
|
||||
args.MsgErrorCb()
|
||||
end
|
||||
end
|
||||
CS.XNetwork.OnReconnectRequestFrequently = function()
|
||||
if args.ReconnectRequestFrequentlyCb then
|
||||
args.ReconnectRequestFrequentlyCb()
|
||||
end
|
||||
end
|
||||
|
||||
local ip, port
|
||||
if args.IsReconnect then
|
||||
ip, port = LastIp, LastPort
|
||||
else
|
||||
ip, port = GetIpAndPort()
|
||||
end
|
||||
|
||||
XNetwork.ConnectServer(ip, port, args.IsReconnect)
|
||||
end
|
||||
|
||||
function XNetwork.ConnectServer(ip, port, bReconnect)
|
||||
if not ip or not port then
|
||||
return
|
||||
end
|
||||
|
||||
LastIp, LastPort = ip, port
|
||||
local networkMode = XSaveTool.GetData(XNetwork.NetworkModeKey) or XNetwork.NetworkMode.Auto
|
||||
if networkMode == XNetwork.NetworkMode.Auto then
|
||||
CS.XNetwork.Connect(ip, tonumber(port), bReconnect, CS.XNetwork.NetworkMode.Auto)
|
||||
elseif networkMode == XNetwork.NetworkMode.Ipv4 then
|
||||
CS.XNetwork.Connect(ip, tonumber(port), bReconnect, CS.XNetwork.NetworkMode.Ipv4)
|
||||
elseif networkMode == XNetwork.NetworkMode.Ipv6 then
|
||||
CS.XNetwork.Connect(ip, tonumber(port), bReconnect, CS.XNetwork.NetworkMode.Ipv6)
|
||||
else -- Auto保底
|
||||
CS.XNetwork.Connect(ip, tonumber(port), bReconnect, CS.XNetwork.NetworkMode.Auto)
|
||||
end
|
||||
end
|
||||
|
||||
function XNetwork.Send(handler, request)
|
||||
-- 检查是否是屏蔽协议
|
||||
if NeedShieldProtocol and ShieldedProtocol[handler] then
|
||||
XUiManager.TipMsg(CS.XGame.ClientConfig:GetString("ShieldedProtocol"))
|
||||
return
|
||||
end
|
||||
local requestContent, error = XMessagePack.Encode(request)
|
||||
if IsDebug then
|
||||
XRpc.DebugPrint(XRpc.DEBUG_TYPE.Send, handler, requestContent)
|
||||
end
|
||||
|
||||
if requestContent == nil then
|
||||
XLog.Error("XNetwork.Send 函数错误, 客户端发送给服务端的数据编码处理失败, 失败原因:" .. error)
|
||||
return
|
||||
end
|
||||
|
||||
CS.XNetwork.Send(handler, requestContent);
|
||||
end
|
||||
|
||||
function XNetwork.Call(handler, request, reply, isEncoded)
|
||||
-- 检查是否是屏蔽协议
|
||||
if NeedShieldProtocol and ShieldedProtocol[handler] then
|
||||
XUiManager.TipMsg(CS.XGame.ClientConfig:GetString("ShieldedProtocol"))
|
||||
return
|
||||
end
|
||||
|
||||
if IsDebug then
|
||||
XRpc.DebugPrint(XRpc.DEBUG_TYPE.Send_Call, handler, isEncoded and XMessagePack.Decode(request) or request)
|
||||
end
|
||||
local requestContent, error
|
||||
if isEncoded == true then
|
||||
requestContent = request
|
||||
else
|
||||
requestContent, error = XMessagePack.Encode(request)
|
||||
if requestContent == nil then
|
||||
XLog.Error("XNetwork.Call 函数错误, 客户端发送给服务端的数据编码处理失败, 失败原因: " .. error)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
CS.XNetwork.Call(handler, requestContent, function(responseContent)
|
||||
local response, err = XMessagePack.Decode(responseContent)
|
||||
if response == nil then
|
||||
XLog.Error("XNetwork.Call 函数错误, 服务端返回的数据解码失败, 失败原因: " .. err)
|
||||
return
|
||||
end
|
||||
|
||||
if IsDebug then
|
||||
XRpc.DebugPrint(XRpc.DEBUG_TYPE.Recv_Call, handler, response)
|
||||
end
|
||||
|
||||
reply(response)
|
||||
end)
|
||||
end
|
||||
|
||||
function XNetwork.CallWithAutoHandleErrorCode(handler, request, reply, isEncoded)
|
||||
XNetwork.Call(handler, request, function(res)
|
||||
if res.Code ~= XCode.Success then
|
||||
XUiManager.TipCode(res.Code)
|
||||
return
|
||||
end
|
||||
if reply then reply(res) end
|
||||
end, isEncoded)
|
||||
end
|
||||
|
||||
--================
|
||||
--设置协议屏蔽列表
|
||||
--@param protocolList:屏蔽协议名列表
|
||||
--================
|
||||
function XNetwork.SetShieldedProtocolList(protocolList)
|
||||
if not protocolList then return end
|
||||
ShieldedProtocol = {}
|
||||
NeedShieldProtocol = false
|
||||
for _, protocolName in pairs(protocolList) do
|
||||
NeedShieldProtocol = true
|
||||
ShieldedProtocol[protocolName] = true
|
||||
end
|
||||
end
|
101
Script/matrix/xcommon/XNpcAttribType.lua
Normal file
101
Script/matrix/xcommon/XNpcAttribType.lua
Normal file
|
@ -0,0 +1,101 @@
|
|||
-- auto export form enum
|
||||
-- Automatic generation of code, forbid to edit or delete
|
||||
XNpcAttribType = {
|
||||
Life = 1, -- 生命
|
||||
Energy = 2, -- 能量
|
||||
RunSpeed = 3, -- 跑速度(逻辑单位/帧)
|
||||
WalkSpeed = 4, -- 走速度(逻辑单位/帧)
|
||||
TurnRoundSpeed = 5, -- 转身角速度(度/千帧)
|
||||
BallInterval = 6, -- 出球间隔帧
|
||||
DamageNormalImmunity = 7, -- 普通伤害免疫
|
||||
DamageMagicImmunity = 8, -- 元素伤害免疫
|
||||
AntiDamageNormalImmunity = 9, -- 反普通伤害免疫
|
||||
AntiDamageMagicImmunity = 10, -- 反元素伤害免疫
|
||||
AttackNormal = 11, -- 普通攻击
|
||||
AttackMagicBegin = 11, -- 元素攻击起始
|
||||
AttackMagic1 = 12, -- 元素1攻击
|
||||
AttackMagic2 = 13, -- 元素2攻击
|
||||
AttackMagic3 = 14, -- 元素3攻击
|
||||
AttackMagic4 = 15, -- 元素4攻击
|
||||
AttackMagicEnd = 16, -- 元素攻击结束
|
||||
AntiAttackNormal = 17, -- 反普通攻击
|
||||
AntiAttackMagicBegin = 17, -- 反元素攻击起始
|
||||
AntiAttackMagic1 = 18, -- 反元素1攻击
|
||||
AntiAttackMagic2 = 19, -- 反元素2攻击
|
||||
AntiAttackMagic3 = 20, -- 反元素3攻击
|
||||
AntiAttackMagic4 = 21, -- 反元素4攻击
|
||||
AntiAttackMagicEnd = 22, -- 反元素攻击结束
|
||||
DefenseNormal = 23, -- 普通防御
|
||||
AntiDefenseNormal = 24, -- 反普通防御
|
||||
DamageChangeP = 25, -- 总伤害加深率
|
||||
DamageNormalChangeP = 26, -- 普通伤害加深率
|
||||
DamageMagicChangePBegin = 26, -- 元素伤害加深率起始
|
||||
DamageMagic1ChangeP = 27, -- 元素1伤害加深率
|
||||
DamageMagic2ChangeP = 28, -- 元素2伤害加深率
|
||||
DamageMagic3ChangeP = 29, -- 元素3伤害加深率
|
||||
DamageMagic4ChangeP = 30, -- 元素4伤害加深率
|
||||
DamageMagicChangePEnd = 31, -- 元素伤害加深率结束
|
||||
AntiDamageChangeP = 32, -- 反总伤害加深率
|
||||
AntiDamageNormalChangeP = 33, -- 反普通伤害加深率
|
||||
AntiDamageMagicChangePBegin = 33, -- 反元素伤害加深率起始
|
||||
AntiDamageMagic1ChangeP = 34, -- 反元素1伤害加深率
|
||||
AntiDamageMagic2ChangeP = 35, -- 反元素2伤害加深率
|
||||
AntiDamageMagic3ChangeP = 36, -- 反元素3伤害加深率
|
||||
AntiDamageMagic4ChangeP = 37, -- 反元素4伤害加深率
|
||||
AntiDamageMagicChangePEnd = 38, -- 反元素伤害加深率结束
|
||||
DamagePBegin = 39, -- 类型伤害率起始
|
||||
Damage1P = 40, -- 类型1伤害率
|
||||
Damage2P = 41, -- 类型2伤害率
|
||||
Damage3P = 42, -- 类型3伤害率
|
||||
DamagePEnd = 43, -- 类型伤害率结束
|
||||
Crit = 44, -- 暴击
|
||||
CritP = 45, -- 暴击率
|
||||
CritDamageP = 46, -- 暴击伤害率
|
||||
AntiCritP = 47, -- 反暴击率
|
||||
AntiCritDamageP = 48, -- 反暴击伤害率
|
||||
Lifesteal = 49, -- 吸血
|
||||
LifestealP = 50, -- 吸血率
|
||||
CureChangeP = 51, -- 治疗加深率
|
||||
AntiCureChangeP = 52, -- 反治疗加深率
|
||||
Endure = 53, -- 霸体值
|
||||
ThreatRateP = 54, -- 仇恨生成速率
|
||||
DodgeEnergy = 55, -- 闪避能量值
|
||||
DodgeEnergyAutoRecovery = 56, -- 闪避能量自动回复
|
||||
CustomEnergy = 57, -- 自定义能量值
|
||||
AccuResistance1 = 58, -- 积蓄抗性1
|
||||
AccuResistance2 = 59, -- 积蓄抗性2
|
||||
AccuResistance3 = 60, -- 积蓄抗性3
|
||||
AccuResistance4 = 61, -- 积蓄抗性4
|
||||
AccuResistance5 = 62, -- 积蓄抗性5
|
||||
AccuResistance6 = 63, -- 积蓄抗性6
|
||||
AccuResistance7 = 64, -- 积蓄抗性7
|
||||
AccuResistance8 = 65, -- 积蓄抗性8
|
||||
AccuResistance9 = 66, -- 积蓄抗性9
|
||||
AccuResistance10 = 67, -- 积蓄抗性10
|
||||
SquatSpeed = 68, -- 蹲走速度
|
||||
NormalWeaknessP = 69, -- 物理弱点
|
||||
MagicWeaknessPBegin = 69, -- 元素弱点起始
|
||||
Magic1WeaknessP = 70, -- 元素弱点1
|
||||
Magic2WeaknessP = 71, -- 元素弱点2
|
||||
Magic3WeaknessP = 72, -- 元素弱点3
|
||||
Magic4WeaknessP = 73, -- 元素弱点4
|
||||
SprintSpeed = 74, -- 疾跑速度(逻辑单位/帧)
|
||||
CustomEnergyGroup1 = 75, -- 自定义能量组1
|
||||
CustomEnergyGroup2 = 76, -- 自定义能量组2
|
||||
CustomEnergyGroup3 = 77, -- 自定义能量组3
|
||||
CustomEnergyGroup4 = 78, -- 自定义能量组4
|
||||
Hack = 79, -- 处决值
|
||||
HackChangeP = 80, -- 处决加深率
|
||||
AntiHackChangeP = 81, -- 处决抵抗率
|
||||
HackAutoRecovery = 82, -- 处决值自动回复
|
||||
SkillDamageChangeP = 83, -- 技能倍率加深率
|
||||
ReduceHackDynamicScoringCoe = 84, -- 怪物处决值减少时的动态评分系数
|
||||
BeExecutedDynamicScoringCoe = 85, -- 怪物受到处决的动态评分系数
|
||||
DynamicScoringScoreChangeP = 86, -- 动态评分点数获取提升率
|
||||
DynamicScoringScoreChangeV = 87, -- 动态评分点数获取提升值
|
||||
ReduceDynamicScoringScorePerSecondChangeP = 88, -- 动态评分每秒固定点数下降提升率
|
||||
ReduceDynamicScoringScorePerSecondChangeV = 89, -- 动态评分每秒固定点数下降提升值
|
||||
ReduceDynamicScoringScoreWhenBeDamagedChangeP = 90, -- 受伤时动态评分点数下降提升率
|
||||
ReduceDynamicScoringScoreWhenBeDamagedChangeV = 91, -- 受伤时动态评分点数下降提升值
|
||||
End = 92, --
|
||||
}
|
82
Script/matrix/xcommon/XPerformance.lua
Normal file
82
Script/matrix/xcommon/XPerformance.lua
Normal file
|
@ -0,0 +1,82 @@
|
|||
XPerformance = XPerformance or {}
|
||||
|
||||
local CsTime = CS.UnityEngine.Time
|
||||
local IO = CS.System.IO
|
||||
local collectgarbage = collectgarbage
|
||||
local AutoSaveTime = 10
|
||||
local LastSaveTime = 0
|
||||
local TraceLevel = 5
|
||||
|
||||
XPerformance.SaveDataPath = XPerformance.SaveDataPath or string.format("Log/MemData_%s.tab", CS.System.DateTime.Now:ToString("MMddhhmm"))
|
||||
XPerformance.SaveTimerId = XPerformance.SaveTimerId or 0
|
||||
XPerformance.LuaMemData = XPerformance.LuaMemData or {}
|
||||
|
||||
-- 定期保存数据
|
||||
function XPerformance.StartLuaMenCollect()
|
||||
if CS.UnityEngine.Application.platform ~= CS.UnityEngine.RuntimePlatform.WindowsEditor then
|
||||
return
|
||||
end
|
||||
if XPerformance.SaveTimerId then
|
||||
XScheduleManager.UnSchedule(XPerformance.SaveTimerId)
|
||||
XPerformance.SaveTimerId = 0
|
||||
end
|
||||
XPerformance.SaveTimerId = XScheduleManager.ScheduleForever(function()
|
||||
if not next(XPerformance.LuaMemData) then
|
||||
return
|
||||
end
|
||||
local nowTime = CsTime.realtimeSinceStartup
|
||||
if nowTime - LastSaveTime > AutoSaveTime then
|
||||
LastSaveTime = nowTime
|
||||
XPerformance.SaveMemData()
|
||||
end
|
||||
end, AutoSaveTime * 1000)
|
||||
end
|
||||
|
||||
-- 保存数据
|
||||
function XPerformance.SaveMemData()
|
||||
local sw
|
||||
if not IO.File.Exists(XPerformance.SaveDataPath) then
|
||||
sw = IO.File.CreateText(XPerformance.SaveDataPath)
|
||||
sw:Write("traceName\tkey\tcostMem\tcurrentMem\n")
|
||||
else
|
||||
sw = IO.File.AppendText(XPerformance.SaveDataPath)
|
||||
sw:Write("\n")
|
||||
end
|
||||
|
||||
local tab = {}
|
||||
for key, str in pairs(XPerformance.LuaMemData) do
|
||||
table.insert(tab, str)
|
||||
end
|
||||
XPerformance.LuaMemData = {}
|
||||
local content = table.concat(tab, '\n')
|
||||
sw:Write(content)
|
||||
sw:Flush()
|
||||
sw:Close()
|
||||
|
||||
XLog.Debug("... save data:" .. content)
|
||||
end
|
||||
|
||||
-- 记录一段代码消耗的lua内存
|
||||
function XPerformance.RecordLuaMemData(name, func, isCollect)
|
||||
if isCollect == nil then
|
||||
isCollect = true
|
||||
end
|
||||
if isCollect then
|
||||
collectgarbage("collect")
|
||||
end
|
||||
local beforeMem = collectgarbage("count")
|
||||
func()
|
||||
if isCollect then
|
||||
collectgarbage("collect")
|
||||
end
|
||||
local currentMem = collectgarbage("count")
|
||||
|
||||
local costMem = currentMem - beforeMem
|
||||
costMem = math.floor(costMem / 1024 * 10000) / 10000
|
||||
currentMem = math.floor(beforeMem / 1024 * 10000) / 10000
|
||||
|
||||
-- 记录消耗
|
||||
local traceName = XTool.GetStackTraceName(TraceLevel)
|
||||
local str = string.format("%s\t%s\t%s\t%s", traceName, name, costMem, currentMem)
|
||||
table.insert(XPerformance.LuaMemData, str)
|
||||
end
|
60
Script/matrix/xcommon/XPool.lua
Normal file
60
Script/matrix/xcommon/XPool.lua
Normal file
|
@ -0,0 +1,60 @@
|
|||
XPool = XClass(nil, "XPool")
|
||||
|
||||
function XPool:Ctor(createFunc, onRelease)
|
||||
if not createFunc then
|
||||
XLog.Error("XPool:Ctor Error:createFunc is Empty.")
|
||||
return
|
||||
end
|
||||
|
||||
self.__Container = XStack.New()
|
||||
self.__CreateFunc = createFunc
|
||||
self.__OnRelease = onRelease
|
||||
self.__TotalCount = 0
|
||||
end
|
||||
|
||||
function XPool:Clear()
|
||||
self.__TotalCount = 0
|
||||
self.__Container:Clear()
|
||||
end
|
||||
|
||||
function XPool:GetItemFromPool()
|
||||
local item = self.__Container:Pop()
|
||||
if not item then
|
||||
item = self.__CreateFunc()
|
||||
if not item then
|
||||
XLog.Error("XPool:GetItemFromPool Error:createFunc return nil.")
|
||||
return
|
||||
end
|
||||
self.__TotalCount = self.__TotalCount + 1
|
||||
end
|
||||
return item
|
||||
end
|
||||
|
||||
function XPool:ReturnItemToPool(item)
|
||||
if not item then return end
|
||||
|
||||
if self:UsingCount() < 1 then
|
||||
return
|
||||
end
|
||||
|
||||
if self.__OnRelease then
|
||||
self.__OnRelease(item)
|
||||
end
|
||||
|
||||
self.__Container:Push(item)
|
||||
end
|
||||
|
||||
--池中剩余对象数量
|
||||
function XPool:LeftCount()
|
||||
return self.__Container:Count()
|
||||
end
|
||||
|
||||
--使用中对象数量
|
||||
function XPool:UsingCount()
|
||||
return self.__TotalCount - self:LeftCount()
|
||||
end
|
||||
|
||||
--已创建对象数量
|
||||
function XPool:TotalCount()
|
||||
return self.__TotalCount
|
||||
end
|
54
Script/matrix/xcommon/XPrefs.lua
Normal file
54
Script/matrix/xcommon/XPrefs.lua
Normal file
|
@ -0,0 +1,54 @@
|
|||
XPrefs = XPrefs or {}
|
||||
|
||||
-- 登陆模块
|
||||
XPrefs.UserId = "USER_ID"
|
||||
XPrefs.UserName = "USER_NAME"
|
||||
XPrefs.Channel = "CHANNEL"
|
||||
XPrefs.Token = "TOKEN"
|
||||
XPrefs.PasswordStatus = "PASSWORD_STATUS"
|
||||
|
||||
XPrefs.ServerId = "SERVER_ID"
|
||||
XPrefs.User_ServerId = "USER_SERVER_ID"
|
||||
|
||||
XPrefs.CharacterStoryRecord = "CHARACTER_STORY_RECORD"
|
||||
|
||||
XPrefs.AssistSwitch = "ASSIST_SWITCH"
|
||||
XPrefs.GuideTrigger = "GUIDE_DISABLE"
|
||||
XPrefs.CommunicationTrigger = "COMMUNICATION_DISABLE"
|
||||
XPrefs.FunctionEventTrigger = "FUNCTION_EVENT_DISABLE"
|
||||
XPrefs.StoryTrigger = "STORY_DISABLE"
|
||||
XPrefs.AccountHistory = "ACCOUNT_HISTORY"
|
||||
XPrefs.LuaNetLog = "LUA_NET_LOG"
|
||||
XPrefs.NoticeTrigger = "NOTICE_DISABLE"
|
||||
|
||||
XPrefs.TowerTip = "TOWER_TIP"
|
||||
|
||||
XPrefs.DormNewHint = "DORM_NEW_HINT_"
|
||||
XPrefs.PayOrder = "PAY_ORDER_"
|
||||
|
||||
XPrefs.BaseEquip = "BASE_EQUIP"
|
||||
|
||||
XPrefs.AutoWindowEach = "AUTO_WINDOW_EACH"
|
||||
|
||||
XPrefs.AutoWindowPeriod = "AUTO_WINDOW_PERIOD"
|
||||
|
||||
XPrefs.YKLocalCache = "YK_LOCAL_CACHAE"
|
||||
XPrefs.YKContinueBuy = "YK_CONTINUE_BUY"
|
||||
|
||||
XPrefs.ArenaTeamResult = "Arena_Team_Result"
|
||||
|
||||
XPrefs.ArenaOnlineInvit = "AreanOnline_Invit"
|
||||
|
||||
XPrefs.ArenaOnlineFirstOpen = "AreanOnline_First_Open"
|
||||
|
||||
-- 战斗设置
|
||||
XPrefs.DynamicJoystick = "DYNAMIC_JOYSTICK"
|
||||
XPrefs.FocusType = "FOCUS_TYPE"
|
||||
XPrefs.FocusButton = "FOCUS_BUTTON"
|
||||
XPrefs.InviteButton = "INVITE_BUTTON"
|
||||
|
||||
-- 武器显示设置
|
||||
XPrefs.WeaponTransType = "WEAPON_TRANS_TYPE"
|
||||
|
||||
-- 累积充值显示设置
|
||||
XPrefs.RechargeType = "RECHARGE_TYPE"
|
51
Script/matrix/xcommon/XQueue.lua
Normal file
51
Script/matrix/xcommon/XQueue.lua
Normal file
|
@ -0,0 +1,51 @@
|
|||
XQueue = XClass(nil, "XQueue")
|
||||
|
||||
function XQueue:Ctor()
|
||||
self:Clear()
|
||||
end
|
||||
|
||||
function XQueue:Clear()
|
||||
self.__Container = {}
|
||||
self.__StartIndex = 1
|
||||
self.__EndIndex = 0
|
||||
end
|
||||
|
||||
function XQueue:IsEmpty()
|
||||
return self.__StartIndex > self.__EndIndex
|
||||
end
|
||||
|
||||
function XQueue:Count()
|
||||
return self.__EndIndex - self.__StartIndex + 1
|
||||
end
|
||||
|
||||
function XQueue:Enqueue(element)
|
||||
if not element then return end
|
||||
|
||||
local endIndex = self.__EndIndex + 1
|
||||
self.__EndIndex = endIndex
|
||||
self.__Container[endIndex] = element
|
||||
end
|
||||
|
||||
function XQueue:EnqueueFront(element)
|
||||
self.__Container[self.__StartIndex - 1] = element
|
||||
self.__StartIndex = self.__StartIndex - 1
|
||||
end
|
||||
|
||||
function XQueue:Dequeue()
|
||||
if self:IsEmpty() then
|
||||
self:Clear()
|
||||
return
|
||||
end
|
||||
|
||||
local startIndex = self.__StartIndex
|
||||
local element = self.__Container[startIndex]
|
||||
|
||||
self.__StartIndex = startIndex + 1
|
||||
self.__Container[startIndex] = nil
|
||||
|
||||
return element
|
||||
end
|
||||
|
||||
function XQueue:Peek()
|
||||
return self.__Container[self.__StartIndex]
|
||||
end
|
100
Script/matrix/xcommon/XRpc.lua
Normal file
100
Script/matrix/xcommon/XRpc.lua
Normal file
|
@ -0,0 +1,100 @@
|
|||
XRpc = XRpc or {}
|
||||
|
||||
------- 方便调试协议的打印 ------
|
||||
local IsPrintLuaRpc = false
|
||||
if XMain.IsEditorDebug then
|
||||
CS.XNetwork.IsShowNetLog = false
|
||||
end
|
||||
XRpc.IgnoreRpcNames = { ["HeartbeatRequest"] = true, ["HeartbeatResponse"] = true, ["KcpHeartbeatRequest"] = true, ["KcpHeartbeatResponse"] = true
|
||||
, ["NotifyGuildDormSyncEntities"] = true, ["GuildDormHeartbeatRequest"] = true }
|
||||
XRpc.DEBUG_TYPE = {
|
||||
Send = "Send",
|
||||
Send_Call = "Send_Call",
|
||||
Recv = "Recv",
|
||||
Recv_Call = "Recv_Call",
|
||||
}
|
||||
XRpc.DEBUG_TYPE_COLOR = {
|
||||
Send = "#5bf54f",
|
||||
Send_Call = "#5bf54f",
|
||||
Recv = "#42a8fa",
|
||||
Recv_Call = "#42a8fa",
|
||||
}
|
||||
-- 浅色主题用的字体颜色
|
||||
-- XRpc.DEBUG_TYPE_COLOR = {
|
||||
-- Send = "green",
|
||||
-- Send_Call = "green",
|
||||
-- Recv = "blue",
|
||||
-- Recv_Call = "blue",
|
||||
-- }
|
||||
XRpc.DebugKeyWords = {"GuildBoss"} -- 【关键协议】
|
||||
|
||||
function XRpc.CheckLuaNetLogEnable()
|
||||
IsPrintLuaRpc = XMain.IsEditorDebug and XSaveTool.GetData(XPrefs.LuaNetLog)
|
||||
return IsPrintLuaRpc
|
||||
end
|
||||
|
||||
function XRpc.SetLuaNetLogEnable(value)
|
||||
IsPrintLuaRpc = value
|
||||
XSaveTool.SaveData(XPrefs.LuaNetLog, IsPrintLuaRpc)
|
||||
end
|
||||
|
||||
function XRpc.DebugPrint(debugType, rpcName, request)
|
||||
if not IsPrintLuaRpc or XRpc.IgnoreRpcNames[rpcName] then
|
||||
return
|
||||
end
|
||||
local color = XRpc.DEBUG_TYPE_COLOR[debugType]
|
||||
if XRpc.DebugKeyWords then
|
||||
for i, keyWord in ipairs(XRpc.DebugKeyWords) do
|
||||
if (string.find(rpcName, keyWord)) then
|
||||
rpcName = "<color=red>" .. rpcName .. "</color>" -- 【关键协议】显示为红色 可本地自定义
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
XLog.Debug("<color=" .. color .. "> " .. debugType .. ": " .. rpcName .. ", content: </color>" .. XLog.Dump(request))
|
||||
end
|
||||
-------------------------------
|
||||
|
||||
local handlers = {}
|
||||
local IsHotReloadOpen = XMain.IsEditorDebug
|
||||
|
||||
function XRpc.Do(name, content)
|
||||
local handler = handlers[name]
|
||||
if handler == nil then
|
||||
XLog.Error("XRpc.Do 函数错误, 没有定义相应的接收服务端数据的函数, 函数名是: " .. name)
|
||||
return
|
||||
end
|
||||
|
||||
local request, error = XMessagePack.Decode(content)
|
||||
if request == nil then
|
||||
XLog.Error("XRpc.Do 函数错误, 服务端返回的数据解码错误, 错误原因: " .. error)
|
||||
return
|
||||
end
|
||||
|
||||
XRpc.DebugPrint(XRpc.DEBUG_TYPE.Recv, name, request)
|
||||
handler(request)
|
||||
end
|
||||
|
||||
setmetatable(XRpc, {
|
||||
__newindex = function(_, name, handler)
|
||||
if type(name) ~= "string" then
|
||||
XLog.Error("XRpc.register 函数错误, 参数name必须是string类型, type: " .. type(name))
|
||||
return
|
||||
end
|
||||
|
||||
if type(handler) ~= "function" then
|
||||
XLog.Error("XRpc.register 函数错误, 注册的接收服务端数据的函数的值必须是函数类型, type: " .. type(handler))
|
||||
return
|
||||
end
|
||||
|
||||
if handlers[name] and not IsHotReloadOpen then
|
||||
XLog.Error("XRpc.register 函数错误, 存在相同名字的接收服务端数据的函数, 名字是: " .. name)
|
||||
return
|
||||
end
|
||||
handlers[name] = handler
|
||||
end,
|
||||
})
|
||||
|
||||
XRpc.TestRequest = function(request)
|
||||
XLog.Warning(request);
|
||||
end
|
14
Script/matrix/xcommon/XRpcExceptionCode.lua
Normal file
14
Script/matrix/xcommon/XRpcExceptionCode.lua
Normal file
|
@ -0,0 +1,14 @@
|
|||
-- auto export form enum
|
||||
-- Automatic generation of code, forbid to edit or delete
|
||||
XRpcExceptionCode = {
|
||||
Success = 0,
|
||||
DecodeError = 1,
|
||||
ServerInternalError = 2,
|
||||
RequestOutOfLimit = 3,
|
||||
RpcTimeout = 4,
|
||||
InvalidRequest = 5,
|
||||
InvalidArgument = 6,
|
||||
FeaturesNotOpen = 7,
|
||||
RequestBlocked = 8,
|
||||
ServiceUnavailable = 9,
|
||||
}
|
146
Script/matrix/xcommon/XSaveTool.lua
Normal file
146
Script/matrix/xcommon/XSaveTool.lua
Normal file
|
@ -0,0 +1,146 @@
|
|||
local tostring = tostring
|
||||
local load = load
|
||||
local type = type
|
||||
local ipairs = ipairs
|
||||
local pairs = pairs
|
||||
local string = string
|
||||
local table = table
|
||||
|
||||
local stringDump = string.dump
|
||||
local stringGmatch = string.gmatch
|
||||
local tableUnpack = table.unpack
|
||||
local tableInsert = table.insert
|
||||
local tableSort = table.sort
|
||||
local tableConcat = table.concat
|
||||
|
||||
|
||||
XSaveTool = XSaveTool or {}
|
||||
XSaveTool.LocalCache = {}
|
||||
|
||||
local function fret(...)
|
||||
local args = { ... }
|
||||
return function()
|
||||
return tableUnpack(args)
|
||||
end
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 数据字符串化
|
||||
--@val: 需要封装成字符串的数据
|
||||
--@needSort: 是否需要排序
|
||||
--@cache: 缓存处理,table引用死锁判断
|
||||
--@return 封装好的字符串
|
||||
--==============================--
|
||||
function XSaveTool.Stringify(val, needSort, cache)
|
||||
cache = cache or {}
|
||||
|
||||
return (({
|
||||
["nil"] = fret "nil",
|
||||
["boolean"] = fret(tostring(val)),
|
||||
["number"] = fret(val),
|
||||
["function"] = function()
|
||||
return "function(...)" ..
|
||||
"return load(" ..
|
||||
XSaveTool.Stringify(stringDump(val), needSort, cache) ..
|
||||
")(...)" ..
|
||||
"end"
|
||||
end,
|
||||
["string"] = function()
|
||||
local s = "\""
|
||||
for c in stringGmatch(val, ".") do
|
||||
s = s .. "\\" .. c:byte()
|
||||
end
|
||||
return s .. "\""
|
||||
end,
|
||||
["table"] = function()
|
||||
if cache[val] then
|
||||
XLog.Error("loop Stringify")
|
||||
return
|
||||
end
|
||||
cache[val] = true
|
||||
local members = {}
|
||||
if needSort then
|
||||
local keys = {}
|
||||
for k, _ in pairs(val) do
|
||||
tableInsert(keys, k)
|
||||
end
|
||||
tableSort(keys)
|
||||
for _, v in ipairs(keys) do
|
||||
tableInsert(members, "[" .. XSaveTool.Stringify(v, needSort, cache) .. "]=" .. XSaveTool.Stringify(val[v], needSort, cache))
|
||||
end
|
||||
else
|
||||
for k, v in pairs(val) do
|
||||
tableInsert(members, "[" .. XSaveTool.Stringify(k, needSort, cache) .. "]=" .. XSaveTool.Stringify(v, needSort, cache))
|
||||
end
|
||||
end
|
||||
return "{" .. tableConcat(members, ",") .. "}"
|
||||
end,
|
||||
})[type(val)] or function()
|
||||
XLog.Error("cannot Stringify type:" .. type(val), 2)
|
||||
end)()
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 本地数据持久化
|
||||
--@key: 存储key
|
||||
--@value: 存储值
|
||||
--==============================--
|
||||
function XSaveTool.SaveData(key, value)
|
||||
local k = XSaveTool.Stringify(key, true)
|
||||
if value == false then
|
||||
XSaveTool.LocalCache[k] = nil
|
||||
else
|
||||
XSaveTool.LocalCache[k] = value or XSaveTool.LocalCache[k]
|
||||
end
|
||||
CS.UnityEngine.PlayerPrefs.SetString("LuaData:" .. k, XSaveTool.Stringify(XSaveTool.LocalCache[k]))
|
||||
CS.UnityEngine.PlayerPrefs.Save()
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 持久化数据删除
|
||||
--@key: 数据key
|
||||
--==============================--
|
||||
function XSaveTool.RemoveData(key)
|
||||
local k = XSaveTool.Stringify(key, true)
|
||||
XSaveTool.LocalCache[k] = nil
|
||||
CS.UnityEngine.PlayerPrefs.DeleteKey("LuaData:" .. k)
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 获取持久化数据
|
||||
--@key: 存储key
|
||||
--@return 存储值
|
||||
--==============================--
|
||||
function XSaveTool.GetData(key)
|
||||
local k = XSaveTool.Stringify(key, true)
|
||||
if XSaveTool.LocalCache[k] then
|
||||
return XSaveTool.LocalCache[k]
|
||||
end
|
||||
|
||||
local str = CS.UnityEngine.PlayerPrefs.GetString("LuaData:" .. k)
|
||||
if str and str ~= "" then
|
||||
local obj = load("return " .. str)()
|
||||
XSaveTool.LocalCache[k] = obj
|
||||
return obj
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 移除所有持久化数据(调试)
|
||||
--==============================--
|
||||
function XSaveTool.RemoveAll()
|
||||
local enable1 = XDataCenter.GuideManager.CheckFuncDisable()
|
||||
local enable2 = XDataCenter.CommunicationManager.CheckFuncDisable()
|
||||
local enable3 = XDataCenter.FunctionEventManager.CheckFuncDisable()
|
||||
local enable4 = XRpc.CheckLuaNetLogEnable()
|
||||
|
||||
XSaveTool.LocalCache = {}
|
||||
CS.UnityEngine.PlayerPrefs.DeleteAll()
|
||||
|
||||
XDataCenter.GuideManager.ChangeFuncDisable(enable1)
|
||||
XDataCenter.CommunicationManager.ChangeFuncDisable(enable2)
|
||||
XDataCenter.FunctionEventManager.ChangeFuncDisable(enable3)
|
||||
XRpc.SetLuaNetLogEnable(enable4)
|
||||
end
|
86
Script/matrix/xcommon/XScheduleManager.lua
Normal file
86
Script/matrix/xcommon/XScheduleManager.lua
Normal file
|
@ -0,0 +1,86 @@
|
|||
XScheduleManager = XScheduleManager or {}
|
||||
|
||||
local CSXScheduleManager = CS.XScheduleManager
|
||||
XScheduleManager.SECOND = CSXScheduleManager.SECOND
|
||||
|
||||
require("XCommon/XTool")
|
||||
local XTool = XTool
|
||||
local IsEditor = XMain.IsEditorDebug
|
||||
|
||||
-- /// <summary>
|
||||
-- /// 启动定时器
|
||||
-- /// </summary>
|
||||
-- /// <param name="handler">处理函数</param>
|
||||
-- /// <param name="interval">间隔毫秒(第一次执行在间隔时间后)</param>
|
||||
-- /// <param name="loop">循环次数</param>
|
||||
-- /// <param name="delay">延迟毫秒</param>
|
||||
-- /// <returns>定时器id</returns>
|
||||
function XScheduleManager.Schedule(func, interval, loop, delay)
|
||||
local name = IsEditor and XTool.GetStackTraceName() or nil
|
||||
return CSXScheduleManager.Schedule(func, interval, loop, delay or 0, name)
|
||||
end
|
||||
|
||||
-- /// <summary>
|
||||
-- /// 启动单次定时器
|
||||
-- /// </summary>
|
||||
-- /// <param name="handler">处理函数</param>
|
||||
-- /// <param name="delay">延迟毫秒</param>
|
||||
-- /// <returns>定时器id</returns>
|
||||
function XScheduleManager.ScheduleOnce(func, delay)
|
||||
local name = IsEditor and XTool.GetStackTraceName() or nil
|
||||
return CSXScheduleManager.ScheduleOnce(func, delay, name)
|
||||
end
|
||||
|
||||
-- /// <summary>
|
||||
-- /// 启动指定时间单次定时器
|
||||
-- /// </summary>
|
||||
-- /// <param name="handler">处理函数</param>
|
||||
-- /// <param name="timeStamp">需要启动的时间</param>
|
||||
-- /// <returns>定时器id</returns>
|
||||
function XScheduleManager.ScheduleAtTimestamp(func, timeStamp)
|
||||
local name = IsEditor and XTool.GetStackTraceName() or nil
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
if timeStamp <= nowTime then
|
||||
return
|
||||
end
|
||||
return CSXScheduleManager.ScheduleOnce(func, (timeStamp - nowTime) * XScheduleManager.SECOND, name)
|
||||
end
|
||||
|
||||
-- /// <summary>
|
||||
-- /// 启动永久定时器
|
||||
-- /// </summary>
|
||||
-- /// <param name="handler">处理函数</param>
|
||||
-- /// <param name="interval">间隔毫秒</param>
|
||||
-- /// <param name="delay">延迟毫秒</param>
|
||||
-- /// <returns>定时器id</returns>
|
||||
function XScheduleManager.ScheduleForever(func, interval, delay)
|
||||
local name = IsEditor and XTool.GetStackTraceName() or nil
|
||||
return CSXScheduleManager.ScheduleForever(func, interval, delay or 0, name)
|
||||
end
|
||||
|
||||
-- /// <summary>
|
||||
-- /// 启动永久定时器
|
||||
-- /// </summary>
|
||||
-- /// <param name="handler">处理函数</param>
|
||||
-- /// <param name="interval">间隔毫秒</param>
|
||||
-- /// <param name="delay">延迟毫秒</param>
|
||||
-- /// <returns>定时器id</returns>
|
||||
-- /// PS:去除了XScheduleManager.ScheduleForever里计算时间自动叠加多一次的Interval
|
||||
function XScheduleManager.ScheduleForeverEx(func, interval, delay)
|
||||
local name = IsEditor and XTool.GetStackTraceName() or nil
|
||||
return CSXScheduleManager.ScheduleForever(func, interval, (delay or 0) - interval, name)
|
||||
end
|
||||
|
||||
-- /// <summary>
|
||||
-- /// 取消定时器
|
||||
-- /// </summary>
|
||||
-- /// <param name="id">定时器id</param>
|
||||
function XScheduleManager.UnSchedule(id)
|
||||
return CSXScheduleManager.UnSchedule(id)
|
||||
end
|
||||
|
||||
-- 释放所有定时器
|
||||
function XScheduleManager.UnScheduleAll()
|
||||
XTool.ResetInitSchedule()
|
||||
return CSXScheduleManager.UnScheduleAll()
|
||||
end
|
290
Script/matrix/xcommon/XSignBoardPlayer.lua
Normal file
290
Script/matrix/xcommon/XSignBoardPlayer.lua
Normal file
|
@ -0,0 +1,290 @@
|
|||
local XSignBoardPlayer = {}
|
||||
|
||||
local PlayerState = {
|
||||
IDLE = 0,
|
||||
PLAYING = 1,
|
||||
CHANGING = 2,
|
||||
PAUSE = 3
|
||||
}
|
||||
|
||||
--创建一个播放器
|
||||
function XSignBoardPlayer.New(playUi, coolTime, delay)
|
||||
if playUi == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
local player = {}
|
||||
setmetatable(player, { __index = XSignBoardPlayer })
|
||||
player:Init(playUi, coolTime, delay)
|
||||
return player
|
||||
end
|
||||
|
||||
--初始化
|
||||
function XSignBoardPlayer:Init(playUi, coolTime, delay)
|
||||
|
||||
self.CoolTime = coolTime --冷却时间
|
||||
self.PlayUi = playUi --执行Ui
|
||||
self.Status = PlayerState.IDLE
|
||||
self.DelayStart = XTime.GetServerNowTimestamp() + delay
|
||||
self.LastPlayTime = -1
|
||||
self.Delay = delay
|
||||
self.Time = XTime.GetServerNowTimestamp()
|
||||
self.AutoPlay = true
|
||||
self.PlayOne = false
|
||||
end
|
||||
|
||||
|
||||
-- self.PlayerData.PlayerList = {} --播放列表
|
||||
-- self.PlayerData..PlayingElement = nil --播放对象
|
||||
-- self.PlayerData.PlayedList = {} --播放过的列表
|
||||
-- self.LastPlayTime = -1 --上次播放时间
|
||||
function XSignBoardPlayer:SetPlayerData(data)
|
||||
self.PlayerData = data
|
||||
end
|
||||
|
||||
--设置播放队列
|
||||
function XSignBoardPlayer:SetPlayList(playList)
|
||||
if not playList or #playList <= 0 then
|
||||
return
|
||||
end
|
||||
|
||||
self.PlayerData.PlayerList = {}
|
||||
self.PlayerData.LastPlayTime = -1
|
||||
self.DelayStart = self.Time + self.Delay
|
||||
|
||||
for _, element in ipairs(playList) do
|
||||
table.insert(self.PlayerData.PlayerList, element)
|
||||
end
|
||||
end
|
||||
|
||||
--播放
|
||||
function XSignBoardPlayer:Play(tab, cvType)
|
||||
if not tab then
|
||||
return false
|
||||
end
|
||||
|
||||
if not self:IsActive() then
|
||||
return false
|
||||
end
|
||||
|
||||
if self.PlayerData.PlayingElement and self.PlayerData.PlayingElement.Id == tab.Id then
|
||||
return false
|
||||
end
|
||||
|
||||
local element = {}
|
||||
element.Id = tab.Id --Id
|
||||
element.AddTime = self.Time -- 添加事件
|
||||
element.StartTime = -1 --开始播放的时间
|
||||
element.EndTime = -1 --结束时间
|
||||
|
||||
-- 获取相应语言的动作持续时间
|
||||
local duration
|
||||
local defaultCvType = 1
|
||||
local curElementCvType = cvType or CS.UnityEngine.PlayerPrefs.GetInt("CV_TYPE", defaultCvType)
|
||||
|
||||
if tab.Duration[curElementCvType] == nil then
|
||||
if tab.Duration[defaultCvType] == nil then
|
||||
XLog.Error(string.format("XSignBoardPlayer:Play函数错误,配置表SignboardFeedback.tab没有配置Id:%s的Duration数据", tostring(element.Id)))
|
||||
return false
|
||||
end
|
||||
duration = tab.Duration[defaultCvType]
|
||||
else
|
||||
duration = tab.Duration[curElementCvType]
|
||||
end
|
||||
|
||||
element.Duration = duration
|
||||
element.Validity = tab.Validity --有效期
|
||||
element.CoolTime = 0--tab.CoolTime --冷却时间
|
||||
element.Weight = tab.Weight --权重
|
||||
element.SignBoardConfig = tab
|
||||
element.CvType = cvType
|
||||
table.insert(self.PlayerData.PlayerList, 1, element)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
--播放下一个
|
||||
--isRecord决定是否要保存当前动作播放记录
|
||||
function XSignBoardPlayer:PlayNext(isRecord)
|
||||
if not self:IsActive() then
|
||||
return
|
||||
end
|
||||
|
||||
if not self.PlayerData.PlayerList or #self.PlayerData.PlayerList == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
--获取第一个在有限期之类的动画
|
||||
local head = nil
|
||||
while #self.PlayerData.PlayerList > 0 and not head do
|
||||
|
||||
local temp = table.remove(self.PlayerData.PlayerList, 1)
|
||||
-- local lastPlayTime = self.PlayerData.PlayedList[temp.Id]
|
||||
-- --如果还在冷却中
|
||||
-- if lastPlayTime and self.Time < lastPlayTime then
|
||||
-- if #self.PlayerData.PlayerList <= 0 then
|
||||
-- break
|
||||
-- end
|
||||
-- temp = table.remove(self.PlayerData.PlayerList, 1)
|
||||
-- end
|
||||
--检测是否过期
|
||||
if temp.Validity < 0 then
|
||||
head = temp
|
||||
else
|
||||
local validity = temp.Validity + temp.AddTime
|
||||
if validity > self.Time then
|
||||
head = temp
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--如果找不到合适的动画
|
||||
if not head then
|
||||
return
|
||||
end
|
||||
|
||||
head.StartTime = self.Time
|
||||
|
||||
self.PlayerData.PlayingElement = head
|
||||
self.Status = PlayerState.PLAYING
|
||||
self.PlayerData.LastPlayTime = head.StartTime + head.Duration
|
||||
|
||||
if isRecord then
|
||||
-- 记录播放过的动作
|
||||
XDataCenter.SignBoardManager.RecordSignBoard(head.SignBoardConfig)
|
||||
end
|
||||
|
||||
self.PlayUi:Play(head)
|
||||
|
||||
if self.PlayOne then
|
||||
-- 清空播放列表,只播放当前权重最高的动画(head)
|
||||
self.PlayerData.PlayerList = {}
|
||||
end
|
||||
end
|
||||
|
||||
--停止
|
||||
function XSignBoardPlayer:Stop()
|
||||
if self.PlayerData.PlayingElement == nil then
|
||||
return
|
||||
end
|
||||
|
||||
self.PlayerData.PlayedList[self.PlayerData.PlayingElement.Id] = XTime.GetServerNowTimestamp() + self.PlayerData.PlayingElement.CoolTime
|
||||
self.PlayUi:OnStop(self.PlayerData.PlayingElement)
|
||||
self.PlayerData.PlayingElement = nil
|
||||
self.Status = PlayerState.IDLE
|
||||
self.LastPlayTime = XTime.GetServerNowTimestamp()
|
||||
end
|
||||
|
||||
--暂停
|
||||
function XSignBoardPlayer:Pause()
|
||||
self.Status = PlayerState.PAUSE
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:Freeze()
|
||||
self.Status = PlayerState.STOP
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:Resume()
|
||||
self.LastPlayTime = XTime.GetServerNowTimestamp()
|
||||
self.Status = PlayerState.IDLE
|
||||
end
|
||||
|
||||
--更新
|
||||
function XSignBoardPlayer:Update(deltaTime)
|
||||
self.Time = self.Time + deltaTime
|
||||
|
||||
if self.Time < self.DelayStart then
|
||||
return
|
||||
end
|
||||
|
||||
if not self:IsActive() then
|
||||
return
|
||||
end
|
||||
|
||||
if (not self.PlayerData.PlayerList or #self.PlayerData.PlayerList == 0) and self.PlayerData.PlayingElement == nil then
|
||||
return
|
||||
end
|
||||
|
||||
if self.Status == PlayerState.STOP then
|
||||
return
|
||||
end
|
||||
|
||||
if self.Status == PlayerState.PAUSE then
|
||||
return
|
||||
end
|
||||
|
||||
local nextElementTime = self.PlayerData.LastPlayTime + self.CoolTime
|
||||
|
||||
--存在播放中的动作
|
||||
if self.PlayerData.PlayingElement ~= nil and self.PlayerData.PlayingElement.Duration > 0 then
|
||||
local deadline = self.PlayerData.PlayingElement.StartTime + self.PlayerData.PlayingElement.Duration
|
||||
if deadline < self.Time then
|
||||
if self.PlayUi.Parent.SetWhetherPlayChangeActionEffect then
|
||||
--动作生命周期正常结束,不用播放打断特效
|
||||
self.PlayUi.Parent:SetWhetherPlayChangeActionEffect(false)
|
||||
end
|
||||
self:SetInterruptDetection(false)
|
||||
self:Stop()
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
--冷却时间
|
||||
if nextElementTime < self.Time and self.Status ~= PlayerState.PLAYING and self.AutoPlay then
|
||||
self:PlayNext(true)
|
||||
end
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:SetInterruptDetection(boolValue)
|
||||
self.IsInInterruptDetection = boolValue
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:GetInterruptDetection()
|
||||
return self.IsInInterruptDetection
|
||||
end
|
||||
|
||||
--强制运行
|
||||
function XSignBoardPlayer:ForcePlay(tab, cvType, isRecord)
|
||||
if self.Status == PlayerState.STOP then
|
||||
return
|
||||
end
|
||||
|
||||
if self:Play(tab, cvType) then
|
||||
self:PlayNext(isRecord)
|
||||
end
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:IsPlaying()
|
||||
return self.Status == PlayerState.PLAYING
|
||||
end
|
||||
|
||||
--设置自动播放
|
||||
function XSignBoardPlayer:SetAutoPlay(bAutoPlay)
|
||||
self.AutoPlay = bAutoPlay
|
||||
end
|
||||
|
||||
-- 播放队列是否只播放权重最高的动画
|
||||
function XSignBoardPlayer:SetPlayOne(bPlayOne)
|
||||
self.PlayOne = bPlayOne
|
||||
end
|
||||
|
||||
---生命周期----------------------------------------------
|
||||
function XSignBoardPlayer:IsActive()
|
||||
return self.Active
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:OnEnable()
|
||||
self.Active = true
|
||||
self:Resume()
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:OnDisable()
|
||||
self.Active = false
|
||||
self:Stop()
|
||||
end
|
||||
|
||||
function XSignBoardPlayer:OnDestroy()
|
||||
self:Stop()
|
||||
end
|
||||
|
||||
return XSignBoardPlayer
|
45
Script/matrix/xcommon/XStack.lua
Normal file
45
Script/matrix/xcommon/XStack.lua
Normal file
|
@ -0,0 +1,45 @@
|
|||
XStack = XClass(nil, "XStack")
|
||||
|
||||
function XStack:Ctor()
|
||||
self:Clear()
|
||||
end
|
||||
|
||||
function XStack:Clear()
|
||||
self.__Container = {}
|
||||
self.__EndIndex = 0
|
||||
end
|
||||
|
||||
function XStack:IsEmpty()
|
||||
return self.__EndIndex < 1
|
||||
end
|
||||
|
||||
function XStack:Count()
|
||||
return self.__EndIndex
|
||||
end
|
||||
|
||||
function XStack:Push(element)
|
||||
if not element then return end
|
||||
|
||||
local endIndex = self.__EndIndex + 1
|
||||
self.__EndIndex = endIndex
|
||||
self.__Container[endIndex] = element
|
||||
end
|
||||
|
||||
function XStack:Pop()
|
||||
if self:IsEmpty() then
|
||||
self:Clear()
|
||||
return
|
||||
end
|
||||
|
||||
local endIndex = self.__EndIndex
|
||||
local element = self.__Container[endIndex]
|
||||
|
||||
self.__EndIndex = endIndex - 1
|
||||
self.__Container[endIndex] = nil
|
||||
|
||||
return element
|
||||
end
|
||||
|
||||
function XStack:Peek()
|
||||
return self.__Container[self.__EndIndex]
|
||||
end
|
411
Script/matrix/xcommon/XString.lua
Normal file
411
Script/matrix/xcommon/XString.lua
Normal file
|
@ -0,0 +1,411 @@
|
|||
--==============================--
|
||||
-- 字符串相关扩展方法
|
||||
--==============================--
|
||||
local tonumber = tonumber
|
||||
local next = next
|
||||
local pairs = pairs
|
||||
local string = string
|
||||
local table = table
|
||||
local math = math
|
||||
|
||||
local stringLen = string.len
|
||||
local stringByte = string.byte
|
||||
local stringSub = string.sub
|
||||
local stringGsub = string.gsub
|
||||
local stringFind = string.find
|
||||
local stringMatch = string.match
|
||||
local tableInsert = table.insert
|
||||
local mathFloor = math.floor
|
||||
|
||||
--==============================--
|
||||
--desc: 通过utf8获取字符串长度
|
||||
--@str: 字符串
|
||||
--@return 字符串长度
|
||||
--==============================--
|
||||
function string.Utf8Len(str)
|
||||
local len = stringLen(str)
|
||||
local left = len
|
||||
local cnt = 0
|
||||
local arr = { 0, 192, 224, 240, 248, 252 }
|
||||
while left ~= 0 do
|
||||
local tmp = stringByte(str, -left)
|
||||
local i = #arr
|
||||
while arr[i] do
|
||||
if tmp >= arr[i] then
|
||||
left = left - i
|
||||
break
|
||||
end
|
||||
i = i - 1
|
||||
end
|
||||
cnt = cnt + 1
|
||||
end
|
||||
return cnt
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 通过utf8获取单个字符长度
|
||||
--@str: 单个字符
|
||||
--@return 字符串长度
|
||||
--==============================--
|
||||
function string.Utf8Size(char)
|
||||
if not char then
|
||||
return 0
|
||||
elseif char >= 252 then
|
||||
return 6
|
||||
elseif char >= 248 then
|
||||
return 5
|
||||
elseif char >= 240 then
|
||||
return 4
|
||||
elseif char >= 225 then
|
||||
return 3
|
||||
elseif char >= 192 then
|
||||
return 2
|
||||
else
|
||||
return 1
|
||||
end
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 按utf8长度截取字符串
|
||||
--@str: 字符串
|
||||
--@return 字符串
|
||||
--==============================--
|
||||
function string.Utf8Sub(str, startChar, numChars)
|
||||
local startIndex = 1
|
||||
while startChar > 1 do
|
||||
local char = stringByte(str, startIndex)
|
||||
startIndex = startIndex + string.Utf8Size(char)
|
||||
startChar = startChar - 1
|
||||
end
|
||||
|
||||
local currentIndex = startIndex
|
||||
while numChars > 0 and currentIndex <= #str do
|
||||
local char = stringByte(str, currentIndex)
|
||||
currentIndex = currentIndex + string.Utf8Size(char)
|
||||
numChars = numChars - 1
|
||||
end
|
||||
return str:sub(startIndex, currentIndex - 1)
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 将字符串分割成char table
|
||||
--@str: 字符串
|
||||
--@return char table
|
||||
--==============================--
|
||||
function string.SplitWordsToCharTab(str)
|
||||
local len = stringLen(str)
|
||||
local left = len
|
||||
local chartab = {}
|
||||
local arr = { 0, 192, 224, 240, 248, 252 }
|
||||
while left ~= 0 do
|
||||
local tmp = stringByte(str, -left)
|
||||
local i = #arr
|
||||
local value = left
|
||||
|
||||
while arr[i] do
|
||||
if tmp >= arr[i] then
|
||||
left = left - i
|
||||
break
|
||||
end
|
||||
i = i - 1
|
||||
end
|
||||
|
||||
local char = stringSub(str, -value, -left - 1)
|
||||
if stringSub(str, -left, -left + 1) == "\\n" then
|
||||
left = left - 2
|
||||
char = char .. "\n"
|
||||
end
|
||||
tableInsert(chartab, char)
|
||||
end
|
||||
return chartab
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 把有富文本格式的字符串变成char table
|
||||
--@str: 富文本字符串
|
||||
--@return char table
|
||||
--==============================--
|
||||
function string.CharsConvertToCharTab(str)
|
||||
--str = "我只是用来{<color=#00ffffff><size=40>测一测</size></color>}别xiabibi{<size=25><color=#ff0000ff>红色试一试</color></size>}试玩啦"--
|
||||
local leftindexs = {}
|
||||
local rightindexs = {}
|
||||
local startpos = 1
|
||||
while true do
|
||||
local pos = stringFind(str, "{", startpos)
|
||||
|
||||
if not pos then
|
||||
break
|
||||
end
|
||||
|
||||
tableInsert(leftindexs, pos)
|
||||
pos = stringFind(str, "}", pos + 1)
|
||||
if not pos then
|
||||
break
|
||||
end
|
||||
|
||||
tableInsert(rightindexs, pos)
|
||||
startpos = pos + 1
|
||||
end
|
||||
|
||||
local words = {}
|
||||
if #leftindexs > 0 then
|
||||
startpos = 1
|
||||
for i = 1, #leftindexs do
|
||||
tableInsert(words, stringSub(str, startpos, leftindexs[i] - 1))
|
||||
tableInsert(words, stringSub(str, leftindexs[i] + 1, rightindexs[i] - 1))
|
||||
startpos = rightindexs[i] + 1
|
||||
end
|
||||
|
||||
if rightindexs[#rightindexs] ~= stringLen(str) then
|
||||
tableInsert(words, stringSub(str, startpos))
|
||||
end
|
||||
else
|
||||
tableInsert(words, str)
|
||||
end
|
||||
|
||||
local result = {}
|
||||
for i = 1, #words do
|
||||
local tab
|
||||
local IsRichText
|
||||
local format
|
||||
|
||||
if stringSub(words[i], 1, 1) == "<" then
|
||||
IsRichText = true
|
||||
local pa = stringMatch(words[i], "%b></")
|
||||
pa = stringMatch(pa, ">(.*)<")
|
||||
format = stringGsub(words[i], "%b></", ">#$#</", 1)
|
||||
tab = string.SplitWordsToCharTab(pa)
|
||||
else
|
||||
IsRichText = false
|
||||
format = ""
|
||||
tab = string.SplitWordsToCharTab(words[i])
|
||||
end
|
||||
|
||||
for j = 1, #tab do
|
||||
if IsRichText then
|
||||
local char = stringGsub(format, "#$#", tab[j])
|
||||
tableInsert(result, char)
|
||||
else
|
||||
tableInsert(result, tab[j])
|
||||
end
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 检查字符串的开头是否与指定字符串匹配
|
||||
--@str: 需要检查的字符串
|
||||
--@value: 指定的字符串
|
||||
--@return true:匹配,false:不匹配
|
||||
--==============================--
|
||||
function string.StartsWith(str, value)
|
||||
return stringSub(str, 1, stringLen(value)) == value
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 检查字符串的结尾是否与指定字符串匹配
|
||||
--@str: 需要检查的字符串
|
||||
--@value: 指定的字符串
|
||||
--@return true:匹配,false:不匹配
|
||||
--==============================--
|
||||
function string.EndsWith(str, value)
|
||||
return value == "" or stringSub(str, -stringLen(value)) == value
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 字符串分割
|
||||
--@str: 原字符串
|
||||
--@separator: 分割符
|
||||
--@return 字符串数组
|
||||
--==============================--
|
||||
function string.Split(str, separator)
|
||||
if str == nil or str == "" then
|
||||
return {}
|
||||
end
|
||||
|
||||
if not separator then
|
||||
separator = "|"
|
||||
end
|
||||
|
||||
local result = {}
|
||||
local startPos = 1
|
||||
while true do
|
||||
local endPos = str:find(separator, startPos)
|
||||
if endPos == nil then
|
||||
break
|
||||
end
|
||||
|
||||
local elem = str:sub(startPos, endPos - 1)
|
||||
tableInsert(result, elem)
|
||||
startPos = endPos + #separator
|
||||
end
|
||||
|
||||
tableInsert(result, str:sub(startPos))
|
||||
return result
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 将字符串分割成int数组
|
||||
--@str: 原字符串
|
||||
--@separator: 分割符
|
||||
--@return int数组
|
||||
--==============================--
|
||||
function string.ToIntArray(str, separator)
|
||||
local strs = string.Split(str, separator)
|
||||
local array = {}
|
||||
if next(strs) then
|
||||
for _, v in pairs(strs) do
|
||||
tableInsert(array, mathFloor(tonumber(v)))
|
||||
end
|
||||
end
|
||||
return array
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 从一个字符串中查找另一个字符串的第一次匹配的索引
|
||||
--@str: 原字符串
|
||||
--@separator: 需要匹配的字符串
|
||||
--@return 索引号
|
||||
--==============================--
|
||||
function string.IndexOf(str, separator)
|
||||
if not str or str == "" or not separator or separator == "" then
|
||||
return -1
|
||||
end
|
||||
for i = 1, #str do
|
||||
local success = true
|
||||
for s = 1, #separator do
|
||||
local strChar = stringByte(str, i + s - 1)
|
||||
local sepChar = stringByte(separator, s)
|
||||
if strChar ~= sepChar then
|
||||
success = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if success then
|
||||
return i
|
||||
end
|
||||
end
|
||||
return -1
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 从一个字符串中查找另一个字符串的最后一次匹配的索引
|
||||
--@str: 原字符串
|
||||
--@separator: 需要匹配的字符串
|
||||
--@return 索引号
|
||||
--==============================--
|
||||
function string.LastIndexOf(str, separator)
|
||||
if not str or str == "" or not separator or separator == "" then
|
||||
return -1
|
||||
end
|
||||
local strLen = #str
|
||||
local sepLen = #separator
|
||||
for i = 0, strLen - 1 do
|
||||
local success = true
|
||||
for s = 0, sepLen - 1 do
|
||||
local strChar = stringByte(str, strLen - i - s)
|
||||
local sepChar = stringByte(separator, sepLen - s)
|
||||
if strChar ~= sepChar then
|
||||
success = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if success then
|
||||
return strLen - i - sepLen + 1
|
||||
end
|
||||
end
|
||||
return -1
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 判断字符串是否为nil或者为空
|
||||
--@str: 字符串对象
|
||||
--@return 如果为nil或者为空,返回true,否则返回fale
|
||||
--==============================--
|
||||
function string.IsNilOrEmpty(str)
|
||||
return str == nil or #str == 0
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 过滤utf文本特殊屏蔽字干扰字符
|
||||
--@str: 字符串对象
|
||||
--@return 过滤后文本
|
||||
--==============================--
|
||||
local FilterSymbols = [[·~!@#¥%……&*()-=——+【】{}、|;‘’:“”,。、《》?[]{}""'';:./?,<>\|-_=+*()!@#$%^&*~` ]]
|
||||
local FilterSymbolsTable = FilterSymbols:SplitWordsToCharTab()
|
||||
function string.FilterWords(str)
|
||||
local result = ""
|
||||
for i = 1, string.Utf8Len(str) do
|
||||
local nowStr = string.Utf8Sub(str, i, 1)
|
||||
local isValid = true
|
||||
for _, v in pairs(FilterSymbolsTable) do
|
||||
if nowStr == v then
|
||||
isValid = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if isValid then
|
||||
result = result .. nowStr
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 字符串每隔X个字符插入 需要的字符串
|
||||
--@str: 字符串对象
|
||||
--@interval: 间隔多少个字符
|
||||
--@insertStr: 插入的字符串
|
||||
--@return 过滤后文本
|
||||
--==============================--
|
||||
function string.InsertStr(str, interval, insertStr)
|
||||
local index = 1
|
||||
local worldCount = 0
|
||||
local result = ""
|
||||
|
||||
while true do
|
||||
local world = stringSub(str, index, index)
|
||||
local byte = stringByte(world)
|
||||
|
||||
if byte > 128 then
|
||||
world = stringSub(str, index, index + 2)
|
||||
index = index + 3
|
||||
else
|
||||
index = index + 1
|
||||
end
|
||||
|
||||
result = result .. world
|
||||
worldCount = worldCount + 1
|
||||
if worldCount >= interval then
|
||||
result = result .. insertStr
|
||||
worldCount = 0
|
||||
end
|
||||
|
||||
if index > #str then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
--判断字符串是否为合法IP"[0-255].[0-255].[0-255].[0-255]"
|
||||
function string.IsIp(ip)
|
||||
if string.IsNilOrEmpty(ip) then return false end
|
||||
local valueSet = table.pack(string.find(ip, "(%d+)%.(%d+)%.(%d+)%.(%d+)"))
|
||||
local pureIpStr = table.concat(valueSet, '.', 3, 6)
|
||||
|
||||
if not valueSet[1] then return false end
|
||||
|
||||
local ipNum
|
||||
for i = 3, 6 do
|
||||
ipNum = tonumber(valueSet[i])
|
||||
if not ipNum or ipNum < 0 or ipNum > 255 then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true, pureIpStr
|
||||
end
|
11971
Script/matrix/xcommon/XTable.lua
Normal file
11971
Script/matrix/xcommon/XTable.lua
Normal file
File diff suppressed because it is too large
Load diff
360
Script/matrix/xcommon/XTime.lua
Normal file
360
Script/matrix/xcommon/XTime.lua
Normal file
|
@ -0,0 +1,360 @@
|
|||
XTime = XTime or {}
|
||||
|
||||
local floor = math.floor
|
||||
local CsTime = CS.UnityEngine.Time
|
||||
|
||||
local ServerTimeWhenStartupList = {} --客户端启动时,服务器的时间戳
|
||||
local ServerTimeMaxCount = 10 --保存服务端时间的最大个数
|
||||
local CurrentSaveIndex = 1 --当前保存到的下标
|
||||
local ServerTimeWhenStartupAverage = 0 --客户端启动时,服务器的时间戳平局值
|
||||
|
||||
local PingTimeList = {}
|
||||
local PingTimeIndex = 0
|
||||
local PingTimeLength = 10
|
||||
|
||||
-- 一星期中的第几天 (3)[1 - 6 = 星期天 - 星期六]
|
||||
local WeekOfDay = {
|
||||
Sun = 0,
|
||||
Mon = 1,
|
||||
Tues = 2,
|
||||
Wed = 3,
|
||||
Thur = 4,
|
||||
Fri = 5,
|
||||
Sat = 6,
|
||||
NorSun = 7
|
||||
}
|
||||
|
||||
local WeekOfDayIndex = {
|
||||
[WeekOfDay.Mon] = 1,
|
||||
[WeekOfDay.Tues] = 2,
|
||||
[WeekOfDay.Wed] = 3,
|
||||
[WeekOfDay.Thur] = 4,
|
||||
[WeekOfDay.Fri] = 5,
|
||||
[WeekOfDay.Sat] = 6,
|
||||
[WeekOfDay.Sun] = 7,
|
||||
[WeekOfDay.NorSun] = 7
|
||||
}
|
||||
local WeekLength = 7
|
||||
local sec_of_a_day = 24 * 60 * 60
|
||||
local sec_of_one_hour = 60 * 60
|
||||
local sec_of_refresh_time = 7 * 60 * 60
|
||||
|
||||
--==============================--
|
||||
--desc: 获取服务器当前时间戳
|
||||
--@return 长整型时间戳,单位(秒)
|
||||
--==============================--
|
||||
function XTime.GetServerNowTimestamp()
|
||||
local sinceStartup = CsTime.realtimeSinceStartup
|
||||
return floor(ServerTimeWhenStartupAverage + sinceStartup)
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 同步时间
|
||||
--@serverTime: 服务器时间
|
||||
--@reqTime: 发起请求时间
|
||||
--@resTime: 收到响应时间
|
||||
--==============================--
|
||||
function XTime.SyncTime(serverTime, reqTime, resTime)
|
||||
local startup = (reqTime + resTime) * 0.5
|
||||
local span = serverTime - startup
|
||||
|
||||
if CurrentSaveIndex > ServerTimeMaxCount then
|
||||
CurrentSaveIndex = CurrentSaveIndex - ServerTimeMaxCount
|
||||
end
|
||||
ServerTimeWhenStartupList[CurrentSaveIndex] = span
|
||||
CurrentSaveIndex = CurrentSaveIndex + 1
|
||||
|
||||
local count = #ServerTimeWhenStartupList
|
||||
local total = 0
|
||||
for _, v in ipairs(ServerTimeWhenStartupList) do
|
||||
total = total + v
|
||||
end
|
||||
ServerTimeWhenStartupAverage = total / count
|
||||
|
||||
local gap = resTime - reqTime
|
||||
PingTimeIndex = (PingTimeIndex % PingTimeLength) + 1
|
||||
PingTimeList[PingTimeIndex] = gap
|
||||
-- print(" ======= ping(ms) ... gap: " .. tostring(gap) .. ", avr:" .. tostring(XTime.GetPingTime()) .. ", i:" .. tostring(PingTimeIndex) .. ", t:" .. tostring(CS.UnityEngine.Time.realtimeSinceStartup))
|
||||
end
|
||||
|
||||
-- 获取网络延时 单位: ms
|
||||
function XTime.GetPingTime()
|
||||
if #PingTimeList == 0 then
|
||||
return 0
|
||||
end
|
||||
|
||||
local total = 0
|
||||
for _, v in ipairs(PingTimeList) do
|
||||
total = total + v
|
||||
end
|
||||
return math.floor(total * 1000) / #PingTimeList
|
||||
end
|
||||
|
||||
function XTime.ClearPingTime()
|
||||
PingTimeList = {}
|
||||
PingTimeIndex = 0
|
||||
end
|
||||
|
||||
--==============================--
|
||||
--desc: 时间字符串转服务器时区时间戳
|
||||
--@dateTimeString: 时间字符串
|
||||
--@return 转失败返回nil
|
||||
--==============================--
|
||||
function XTime.ParseToTimestamp(dateTimeString)
|
||||
if dateTimeString == nil or dateTimeString == "" then
|
||||
return
|
||||
end
|
||||
|
||||
local success, timestamp = CS.XDateUtil.TryParseToTimestamp(dateTimeString)
|
||||
if not success then
|
||||
XLog.Error("XTime.TryParseToTimestamp parse to timestamp failed. try use ParseToTimestampMDY: " .. tostring(dateTimeString))
|
||||
return XTime.ParseToTimestampMDY(dateTimeString)
|
||||
end
|
||||
|
||||
return timestamp
|
||||
end
|
||||
|
||||
function XTime.ParseToTimestampMDY(dateTimeString)
|
||||
local arr = string.Split(dateTimeString, " ")
|
||||
local date = arr[1]
|
||||
local time = arr[2]
|
||||
local dateArr = string.Split(date, "/")
|
||||
local m = dateArr[1]
|
||||
local d = dateArr[2]
|
||||
local y = dateArr[3]
|
||||
dateTimeString = y .. "/" .. m .. "/" .. d .. " " .. time
|
||||
local success, timestamp = CS.XDateUtil.TryParseToTimestamp(dateTimeString)
|
||||
if not success then
|
||||
XLog.Error("XTime.TryParseToTimestamp parse to timestamp failed. invalid time argument: " .. tostring(dateTimeString))
|
||||
return -- 该类在CS中不存在,且在1.18版本出现时区格式问题
|
||||
-- return CS.XDate.GetTime(dateTimeString)
|
||||
end
|
||||
|
||||
return timestamp
|
||||
end
|
||||
|
||||
--时间戳转utc时间字符串
|
||||
function XTime.TimestampToUtcDateTimeString(timestamp, format)
|
||||
format = format or "yyyy-MM-dd HH:mm:ss"
|
||||
local dt = CS.XDateUtil.GetUtcDateTime(timestamp)
|
||||
return dt:ToString(format)
|
||||
end
|
||||
|
||||
--时间戳转设备本地时间字符串
|
||||
function XTime.TimestampToLocalDateTimeString(timestamp, format)
|
||||
format = format or "yyyy-MM-dd HH:mm:ss"
|
||||
local dt = CS.XDateUtil.GetLocalDateTime(timestamp)
|
||||
return dt:ToString(format)
|
||||
end
|
||||
|
||||
--时间戳转游戏指定时区时间字符串
|
||||
function XTime.TimestampToGameDateTimeString(timestamp, format)
|
||||
format = format or "yyyy-MM-dd HH:mm:ss"
|
||||
local dt = CS.XDateUtil.GetGameDateTime(timestamp)
|
||||
return dt:ToString(format)
|
||||
end
|
||||
|
||||
-- c#星期枚举转整形数
|
||||
function XTime.DayOfWeekToInt(dayOfWeek, isNormlSunDay)
|
||||
if dayOfWeek == CS.System.DayOfWeek.Sunday then
|
||||
return isNormlSunDay and 7 or 0
|
||||
elseif dayOfWeek == CS.System.DayOfWeek.Monday then
|
||||
return 1
|
||||
elseif dayOfWeek == CS.System.DayOfWeek.Tuesday then
|
||||
return 2
|
||||
elseif dayOfWeek == CS.System.DayOfWeek.Wednesday then
|
||||
return 3
|
||||
elseif dayOfWeek == CS.System.DayOfWeek.Thursday then
|
||||
return 4
|
||||
elseif dayOfWeek == CS.System.DayOfWeek.Friday then
|
||||
return 5
|
||||
else
|
||||
return 6
|
||||
end
|
||||
end
|
||||
|
||||
--获取今天时间
|
||||
function XTime.GetTodayTime(hour, min, sec)
|
||||
hour = hour or 0
|
||||
min = min or 0
|
||||
sec = sec or 0
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
local dt = CS.XDateUtil.GetGameDateTime(nowTime)
|
||||
return dt.Date:AddHours(hour):AddMinutes(min):AddSeconds(sec):ToTimestamp()
|
||||
end
|
||||
|
||||
function XTime.GeyServerTime(hour, min, sec)
|
||||
hour = hour or 0
|
||||
min = min or 0
|
||||
sec = sec or 0
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
local dt = CS.XDateUtil.GetGameDateTime(nowTime)
|
||||
dt = dt.Date;
|
||||
dt = dt:AddSeconds(sec)
|
||||
dt = dt:AddMinutes(min)
|
||||
dt = dt:AddHours(hour)
|
||||
return dt:ToTimestamp()
|
||||
end
|
||||
|
||||
-- 获取距离下一个星期x的时间,默认每周第一天为周一
|
||||
function XTime.GetNextWeekOfDayStartWithMon(weekOfDay, offsetTime)
|
||||
local needTime
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
local dateTime = CS.XDateUtil.GetGameDateTime(nowTime)
|
||||
local weekZero = CS.XDateUtil.GetFirstDayOfThisWeek(dateTime):ToTimestamp()
|
||||
|
||||
local resetTime = (WeekOfDayIndex[weekOfDay] - 1) * sec_of_a_day + offsetTime + weekZero
|
||||
if nowTime < resetTime then
|
||||
needTime = resetTime - nowTime
|
||||
else
|
||||
needTime = WeekLength * sec_of_a_day - (nowTime - resetTime)
|
||||
end
|
||||
|
||||
return needTime
|
||||
end
|
||||
|
||||
-- 获取最近一个未到达的星期X的服务器更新时间
|
||||
function XTime.GetSeverNextWeekOfDayRefreshTime(weekOfDay)
|
||||
local needTime = XTime.GetNextWeekOfDayStartWithMon(weekOfDay, sec_of_refresh_time)
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
return nowTime + needTime
|
||||
end
|
||||
|
||||
-- 获取服务器当天5点更新时间戳
|
||||
function XTime.GetSeverTodayFreshTime()
|
||||
local now = XTime.GetServerNowTimestamp()
|
||||
local dateTime = CS.XDateUtil.GetGameDateTime(now)
|
||||
local dayZero = dateTime.Date:ToTimestamp()
|
||||
|
||||
return dayZero + sec_of_refresh_time
|
||||
end
|
||||
--=========================
|
||||
--获取服务器当天目标时间的时间戳
|
||||
--oclock : 目标时间,例如晚上8点为20, 8点半为 20.5
|
||||
--=========================
|
||||
function XTime.GetServerTodayTargetTime(oclock)
|
||||
local now = XTime.GetServerNowTimestamp()
|
||||
local dateTime = CS.XDateUtil.GetGameDateTime(now)
|
||||
local dayZero = dateTime.Date:ToTimestamp()
|
||||
return dayZero + (oclock * sec_of_one_hour)
|
||||
end
|
||||
|
||||
-- 获取服务器明天5点更新时间戳
|
||||
function XTime.GetSeverTomorrowFreshTime()
|
||||
local dayFreshTime = XTime.GetSeverTodayFreshTime()
|
||||
return dayFreshTime + sec_of_a_day
|
||||
end
|
||||
--=========================
|
||||
--获取服务器当天目标时间的时间戳
|
||||
--oclock : 目标时间(例:晚上8点 = 20, 晚上8点30分 = 20.5)
|
||||
--=========================
|
||||
function XTime.GetServerTomorrowTargetTime(oclock)
|
||||
local dayFreshTime = XTime.GetServerTodayTargetTime(oclock)
|
||||
return dayFreshTime + sec_of_a_day
|
||||
end
|
||||
-- 获取服务器昨天5点更新时间戳
|
||||
function XTime.GetSeverYesterdayFreshTime()
|
||||
local dayFreshTime = XTime.GetSeverTodayFreshTime()
|
||||
return dayFreshTime - sec_of_a_day
|
||||
end
|
||||
|
||||
--获取服务器下一次5点更新时间戳
|
||||
function XTime.GetSeverNextRefreshTime()
|
||||
local nextRefreshTime
|
||||
|
||||
local dayRefreshTime = XTime.GetSeverTodayFreshTime()
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
nextRefreshTime = nowTime > dayRefreshTime and XTime.GetSeverTomorrowFreshTime() or dayRefreshTime
|
||||
|
||||
return nextRefreshTime
|
||||
end
|
||||
--=========================
|
||||
--获取服务器下一次目标时间的时间戳
|
||||
--oclock : 目标时间(例:晚上8点 = 20, 晚上8点30分 = 20.5)
|
||||
--=========================
|
||||
function XTime.GetServerNextTargetTime(oclock)
|
||||
local nextTargetTime
|
||||
local dayTargetTime = XTime.GetServerTodayTargetTime(oclock)
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
nextTargetTime = nowTime > dayTargetTime and XTime.GetServerTomorrowTargetTime(oclock) or dayTargetTime
|
||||
return nextTargetTime
|
||||
end
|
||||
--=========================
|
||||
--获取服务器到下一次目标时间的剩余时间(单位秒)
|
||||
--oclock : 目标时间(例:晚上8点 = 20, 晚上8点30分 = 20.5)
|
||||
--=========================
|
||||
function XTime.GetServerLeftTimeToTargetTime(oclock)
|
||||
local nextTargetTime = XTime.GetServerNextTargetTime(oclock)
|
||||
local now = XTime.GetServerNowTimestamp()
|
||||
return nextTargetTime - now
|
||||
end
|
||||
-- 判断服务器当下是否是周末
|
||||
function XTime.CheckWeekend()
|
||||
local now = XTime.GetServerNowTimestamp()
|
||||
local weekday = XTime.GetWeekDay(now, false)
|
||||
|
||||
if weekday == WeekOfDay.Sun then
|
||||
return true
|
||||
elseif weekday == WeekOfDay.Sat then
|
||||
local todayFreshTime = XTime.GetSeverTodayFreshTime()
|
||||
return now >= todayFreshTime
|
||||
elseif weekday == WeekOfDay.Mon then
|
||||
local todayFreshTime = XTime.GetSeverTodayFreshTime()
|
||||
return now < todayFreshTime
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- 判断时间戳是周几
|
||||
function XTime.GetWeekDay(time, isNormlSunDay)
|
||||
local dateTime = CS.XDateUtil.GetGameDateTime(time)
|
||||
local weekday = XTime.DayOfWeekToInt(dateTime.DayOfWeek, isNormlSunDay)
|
||||
return weekday
|
||||
end
|
||||
|
||||
--获取一个时间戳的当天刷新的时间
|
||||
function XTime.GetTimeDayFreshTime(time)
|
||||
local todayRefreshTime
|
||||
|
||||
local dateTime = CS.XDateUtil.GetGameDateTime(time)
|
||||
local dayZero = dateTime.Date:ToTimestamp()
|
||||
todayRefreshTime = dayZero + sec_of_refresh_time
|
||||
|
||||
return todayRefreshTime
|
||||
end
|
||||
|
||||
function XTime.GetWeekDayText(time)
|
||||
local weekDay = XTime.GetWeekDay(time, true)
|
||||
if weekDay == 1 then
|
||||
return CSXTextManagerGetText("Monday")
|
||||
elseif weekDay == 2 then
|
||||
return CSXTextManagerGetText("Tuesday")
|
||||
elseif weekDay == 3 then
|
||||
return CSXTextManagerGetText("Wednesday")
|
||||
elseif weekDay == 4 then
|
||||
return CSXTextManagerGetText("Thursday")
|
||||
elseif weekDay == 5 then
|
||||
return CSXTextManagerGetText("Friday")
|
||||
elseif weekDay == 6 then
|
||||
return CSXTextManagerGetText("Saturday")
|
||||
elseif weekDay == 7 then
|
||||
return CSXTextManagerGetText("Sunday")
|
||||
end
|
||||
end
|
||||
|
||||
--判断两个时间戳是否在同一天
|
||||
function XTime.IsToday(formTime, toTime)
|
||||
local formDateTime = CS.XDateUtil.GetGameDateTime(formTime)
|
||||
local toDateTime = CS.XDateUtil.GetGameDateTime(toTime)
|
||||
|
||||
local formDay = formDateTime.Day
|
||||
local formMonth = formDateTime.Month
|
||||
local formYear = formDateTime.Year
|
||||
|
||||
local toDay = toDateTime.Day
|
||||
local toMonth = toDateTime.Month
|
||||
local toYear = toDateTime.Year
|
||||
|
||||
return formDay == toDay and formMonth == toMonth and formYear == toYear
|
||||
end
|
655
Script/matrix/xcommon/XTool.lua
Normal file
655
Script/matrix/xcommon/XTool.lua
Normal file
|
@ -0,0 +1,655 @@
|
|||
local Json = require("XCommon/Json")
|
||||
local type = type
|
||||
local table = table
|
||||
local string = string
|
||||
local math = math
|
||||
local next = next
|
||||
local debug = debug
|
||||
local tostring = tostring
|
||||
|
||||
local tableInsert = table.insert
|
||||
local stringMatch = string.match
|
||||
local mathModf = math.modf
|
||||
|
||||
XTool =
|
||||
XTool or
|
||||
{
|
||||
_IsAutoRefreshOnNextFrame = true
|
||||
}
|
||||
|
||||
XTool.USENEWBATTLEROOM = true
|
||||
|
||||
XTool.UObjIsNil = function(uobj)
|
||||
return uobj == nil or not uobj:Exist()
|
||||
end
|
||||
|
||||
XTool.LoopMap = function(map, func)
|
||||
if type(map) == "userdata" then
|
||||
if not map then
|
||||
return
|
||||
end
|
||||
|
||||
local e = map:GetEnumerator()
|
||||
while e:MoveNext() do
|
||||
func(e.Current.Key, e.Current.Value)
|
||||
end
|
||||
e:Dispose()
|
||||
elseif type(map) == "table" then
|
||||
for key, value in pairs(map) do
|
||||
func(key, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
XTool.LoopCollection = function(collection, func)
|
||||
if type(collection) == "table" then
|
||||
for _, value in pairs(collection) do
|
||||
func(value)
|
||||
end
|
||||
elseif type(collection) == "userdata" then
|
||||
for i = 0, collection.Count - 1 do
|
||||
func(collection[i])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
XTool.LoopArray = function(collection, func)
|
||||
for i = 0, collection.Length - 1 do
|
||||
func(collection[i])
|
||||
end
|
||||
end
|
||||
|
||||
XTool.CsList2LuaTable = function(collection)
|
||||
local ret = {}
|
||||
for i = 0, collection.Count - 1 do
|
||||
tableInsert(ret, collection[i])
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
XTool.CsMap2LuaTable = function(map)
|
||||
local ret = {}
|
||||
local e = map:GetEnumerator()
|
||||
while e:MoveNext() do
|
||||
ret[e.Current.Key] = e.Current.Value
|
||||
end
|
||||
e:Dispose()
|
||||
return ret
|
||||
end
|
||||
|
||||
XTool.CsObjectFields2LuaTable = function(CsObj)
|
||||
if CsObj == nil or type(CsObj) ~= "userdata" then
|
||||
return {}
|
||||
end
|
||||
local jsonStr = CS.XTool.SerializeObject(CsObj)
|
||||
return Json.decode(jsonStr)
|
||||
end
|
||||
|
||||
XTool.Clone = function(t)
|
||||
local cache = {}
|
||||
|
||||
local function clone(o)
|
||||
if type(o) ~= "table" then
|
||||
return o
|
||||
end
|
||||
if cache[o] then
|
||||
return cache[o]
|
||||
end
|
||||
|
||||
local newO = {}
|
||||
for k, v in pairs(o) do
|
||||
newO[clone(k)] = clone(v)
|
||||
end
|
||||
|
||||
local mTable = getmetatable(o)
|
||||
if type(mTable) == "table" then
|
||||
setmetatable(newO, mTable)
|
||||
end
|
||||
|
||||
cache[o] = newO
|
||||
|
||||
return newO
|
||||
end
|
||||
|
||||
return clone(t)
|
||||
end
|
||||
|
||||
XTool.GetFileNameWithoutExtension = function(path)
|
||||
return stringMatch(path, "[./]*([^/]*)%.%w+")
|
||||
end
|
||||
|
||||
XTool.GetFileName = function(path)
|
||||
return stringMatch(path, "[./]*([^/]*%.%w+)")
|
||||
end
|
||||
|
||||
XTool.GetExtension = function(path)
|
||||
return stringMatch(path, "[./]*(%.%w+)")
|
||||
end
|
||||
|
||||
XTool.GetTableCount = function(list)
|
||||
if type(list) ~= "table" then
|
||||
return 0
|
||||
end
|
||||
|
||||
local count = 0
|
||||
for _, _ in pairs(list) do
|
||||
count = count + 1
|
||||
end
|
||||
|
||||
return count
|
||||
end
|
||||
|
||||
local NumberText = {
|
||||
[0] = "",
|
||||
[1] = CS.XTextManager.GetText("One"),
|
||||
[2] = CS.XTextManager.GetText("Two"),
|
||||
[3] = CS.XTextManager.GetText("Three"),
|
||||
[4] = CS.XTextManager.GetText("Four"),
|
||||
[5] = CS.XTextManager.GetText("Five"),
|
||||
[6] = CS.XTextManager.GetText("Six"),
|
||||
[7] = CS.XTextManager.GetText("Seven"),
|
||||
[8] = CS.XTextManager.GetText("Eight"),
|
||||
[9] = CS.XTextManager.GetText("Nine"),
|
||||
[10] = CS.XTextManager.GetText("Ten")
|
||||
}
|
||||
|
||||
XTool.ParseNumberString = function(num)
|
||||
return NumberText[mathModf(num / 10)] .. NumberText[num % 10]
|
||||
end
|
||||
|
||||
XTool.ConvertNumberString = function(num)
|
||||
return NumberText[num] or ""
|
||||
end
|
||||
|
||||
XTool.MatchEmoji = function(text)
|
||||
return stringMatch(text, "%[%d%d%d%d%d%]")
|
||||
end
|
||||
|
||||
XTool.CopyToClipboard = function(text)
|
||||
CS.XAppPlatBridge.CopyStringToClipboard(tostring(text))
|
||||
XUiManager.TipText("Clipboard", XUiManager.UiTipType.Tip)
|
||||
end
|
||||
|
||||
XTool.ToArray = function(t)
|
||||
local array = {}
|
||||
for _, v in pairs(t) do
|
||||
table.insert(array, v)
|
||||
end
|
||||
return array
|
||||
end
|
||||
|
||||
XTool.MergeArray = function(...)
|
||||
local res = {}
|
||||
for _, t in pairs({...}) do
|
||||
if type(t) == "table" then
|
||||
for _, v in pairs(t) do
|
||||
table.insert(res, v)
|
||||
end
|
||||
end
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
function XTool.ReverseList(list)
|
||||
if not list then
|
||||
return
|
||||
end
|
||||
|
||||
local length = #list
|
||||
local middle = math.floor(length * 0.5)
|
||||
for i = 1, middle do
|
||||
local reverseI = length - i + 1
|
||||
local tmp = list[i]
|
||||
list[i] = list[reverseI]
|
||||
list[reverseI] = tmp
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
XTool.Waterfall = function(cbList)
|
||||
local last
|
||||
for i = #cbList, 1, -1 do
|
||||
if type(cbList[i]) == "function" then
|
||||
local nextCb = last
|
||||
local cb = function()
|
||||
cbList[i](nextCb)
|
||||
end
|
||||
last = cb
|
||||
else
|
||||
XLog.Error("XTool.Waterfall error, unit is not function")
|
||||
end
|
||||
end
|
||||
if last then
|
||||
last()
|
||||
end
|
||||
end
|
||||
|
||||
XTool.InitUiObject = function(targetObj)
|
||||
targetObj.Obj = targetObj.Transform:GetComponent("UiObject")
|
||||
if targetObj.Obj ~= nil then
|
||||
for i = 0, targetObj.Obj.NameList.Count - 1 do
|
||||
targetObj[targetObj.Obj.NameList[i]] = targetObj.Obj.ObjList[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
XTool.InitUiObjectByInstance = function(uiObject, instance)
|
||||
for i = 0, uiObject.NameList.Count - 1 do
|
||||
instance[uiObject.NameList[i]] = uiObject.ObjList[i]
|
||||
end
|
||||
end
|
||||
|
||||
XTool.InitUiObjectByUi = function(targetUi, uiPrefab)
|
||||
targetUi.GameObject = uiPrefab.gameObject
|
||||
targetUi.Transform = uiPrefab.transform
|
||||
XTool.InitUiObject(targetUi)
|
||||
return targetUi
|
||||
end
|
||||
|
||||
XTool.DestroyChildren = function(gameObject)
|
||||
if not gameObject then
|
||||
return
|
||||
end
|
||||
|
||||
if XTool.UObjIsNil(gameObject) then
|
||||
return
|
||||
end
|
||||
|
||||
local transform = gameObject.transform
|
||||
for i = 0, transform.childCount - 1, 1 do
|
||||
CS.UnityEngine.Object.Destroy(transform:GetChild(i).gameObject)
|
||||
end
|
||||
end
|
||||
|
||||
XTool.IsTableEmpty = function(tb)
|
||||
return not tb or not next(tb)
|
||||
end
|
||||
|
||||
XTool.IsNumberValid = function(number)
|
||||
return number and number ~= 0 or false
|
||||
end
|
||||
|
||||
XTool.GetStackTraceName = function(level)
|
||||
level = level or 3
|
||||
local info
|
||||
for i = level, 2, -1 do
|
||||
info = debug.getinfo(i)
|
||||
if info then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
local name = "lua:" .. tostring(info.source) .. "_" .. tostring(info.currentline)
|
||||
return name
|
||||
end
|
||||
|
||||
-- datas : 只接受数组
|
||||
XTool.TableRemove = function(datas, removeValue)
|
||||
local removePos = nil
|
||||
for index, value in ipairs(datas) do
|
||||
if value == removeValue then
|
||||
removePos = index
|
||||
break
|
||||
end
|
||||
end
|
||||
if removePos then
|
||||
table.remove(datas, removePos)
|
||||
end
|
||||
end
|
||||
|
||||
-- 直接使用getRoundingValue
|
||||
-- 保留digit位小数
|
||||
XTool.MathGetRoundingValue = function(value, digit)
|
||||
return math.floor(value * XTool.MathPow(10, digit)) / XTool.MathPow(10, digit)
|
||||
end
|
||||
|
||||
-- 直接使用math.pow
|
||||
XTool.MathPow = function(a, b)
|
||||
return a ^ b
|
||||
end
|
||||
|
||||
--==================
|
||||
--将utf8字符转换为unicode编码格式对应的十进制数值
|
||||
--==================
|
||||
XTool.Utf8_to_unicode = function(convertStr)
|
||||
if type(convertStr) ~= "string" then
|
||||
return convertStr
|
||||
end
|
||||
local resultDec = 0
|
||||
local i = 1
|
||||
local num1 = string.byte(convertStr, i)
|
||||
if num1 ~= nil then
|
||||
local tempVar1, tempVar2 = 0, 0
|
||||
if num1 >= 0x00 and num1 <= 0x7f then
|
||||
tempVar1 = num1
|
||||
tempVar2 = 0
|
||||
elseif num1 & 0xe0 == 0xc0 then
|
||||
local t1 = 0
|
||||
local t2 = 0
|
||||
t1 = num1 & 0xff >> 3
|
||||
i = i + 1
|
||||
num1 = string.byte(convertStr, i)
|
||||
t2 = num1 & 0xff >> 2
|
||||
tempVar1 = t2 | ((t1 & (0xff >> 6)) << 6)
|
||||
tempVar2 = t1 >> 2
|
||||
elseif num1 & 0xf0 == 0xe0 then
|
||||
local t1 = 0
|
||||
local t2 = 0
|
||||
local t3 = 0
|
||||
t1 = num1 & (0xff >> 3)
|
||||
i = i + 1
|
||||
num1 = string.byte(convertStr, i)
|
||||
t2 = num1 & (0xff >> 2)
|
||||
i = i + 1
|
||||
num1 = string.byte(convertStr, i)
|
||||
t3 = num1 & (0xff >> 2)
|
||||
tempVar1 = ((t2 & (0xff >> 6)) << 6) | t3
|
||||
tempVar2 = (t1 << 4) | (t2 >> 2)
|
||||
end
|
||||
resultDec = tempVar2 * 256 + tempVar1
|
||||
end
|
||||
return resultDec
|
||||
end
|
||||
--==================
|
||||
--提取字符串中的英文和汉字文本
|
||||
--==================
|
||||
XTool.GetPureStr = function(str)
|
||||
if str == nil then
|
||||
return nil
|
||||
end
|
||||
local resultChar = {}
|
||||
for i = 1, #str do
|
||||
local curByte = string.byte(str, i)
|
||||
local byteCount = 1
|
||||
if curByte > 239 then
|
||||
byteCount = 4
|
||||
elseif curByte > 223 then
|
||||
byteCount = 3
|
||||
elseif curByte > 128 then
|
||||
byteCount = 2
|
||||
else
|
||||
byteCount = 1
|
||||
end
|
||||
local subStr = string.sub(str, i, i + byteCount - 1)
|
||||
local charUnicodeNum = XTool.Utf8_to_unicode(subStr)
|
||||
--
|
||||
--[[if curByte == 32 or --空格
|
||||
(curByte > 47 and curByte < 58) or --数字
|
||||
(curByte > 96 and curByte < 123) or --小写字母
|
||||
(curByte > 64 and curByte < 91) --大写字母
|
||||
]] if
|
||||
(curByte > 96 and curByte < 123) or (curByte > 64 and curByte < 91) or
|
||||
(charUnicodeNum >= 19968 and charUnicodeNum <= 40891)
|
||||
then --汉字/u4E00 -- /u9fbb
|
||||
table.insert(resultChar, subStr)
|
||||
end
|
||||
i = i + byteCount
|
||||
if i > #str then
|
||||
return table.concat(resultChar)
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
--随机打乱
|
||||
XTool.RandomBreakTableOrder = function(t)
|
||||
local index
|
||||
local temp
|
||||
local total = #t
|
||||
for i = 1, total, 1 do
|
||||
for j = i + 1, total, 1 do
|
||||
index = math.random(j, total)
|
||||
temp = t[i]
|
||||
t[i] = t[index]
|
||||
t[index] = temp
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
--权重随机算法(输入:带有Weight字段的元素组 输出:加权后的随机元素)
|
||||
XTool.WeightRandomSelect = function(elements, isNotSetRandomseed)
|
||||
local sum = 0
|
||||
for _, v in ipairs(elements) do
|
||||
sum = sum + v.Weight
|
||||
end
|
||||
|
||||
if not isNotSetRandomseed then
|
||||
math.randomseed(os.time())
|
||||
end
|
||||
local compareWeight = math.random(1, sum)
|
||||
local index = 1
|
||||
while sum > 0 do
|
||||
sum = sum - elements[index].Weight
|
||||
if sum < compareWeight then
|
||||
return elements[index]
|
||||
end
|
||||
index = index + 1
|
||||
end
|
||||
XLog.Error("compare error, return nil")
|
||||
return nil
|
||||
end
|
||||
|
||||
-- 权重随机算法(输入:权重数组 输出:加权后的随机index)
|
||||
XTool.RandomSelectByWeightArray = function(weights)
|
||||
local sum = 0
|
||||
for i = 1, #weights do
|
||||
sum = sum + weights[i]
|
||||
end
|
||||
|
||||
math.randomseed(os.time())
|
||||
local compareWeight = math.random(1, sum)
|
||||
local index = 1
|
||||
while sum > 0 do
|
||||
sum = sum - weights[index]
|
||||
if sum < compareWeight then
|
||||
return index
|
||||
end
|
||||
index = index + 1
|
||||
end
|
||||
XLog.Error("compare error, return nil")
|
||||
return nil
|
||||
end
|
||||
|
||||
--从1-limit之间获取指定count不重复随机数
|
||||
function XTool.GetRandomNumbers(limit, count)
|
||||
local result = {}
|
||||
|
||||
for i = 1, limit do
|
||||
tableInsert(result, i)
|
||||
end
|
||||
|
||||
local num, tmp
|
||||
math.randomseed(os.time())
|
||||
for i = 1, limit do
|
||||
num = math.random(1, limit)
|
||||
tmp = result[i]
|
||||
result[i] = result[num]
|
||||
result[num] = tmp
|
||||
end
|
||||
|
||||
if count then
|
||||
for i = count + 1, limit do
|
||||
result[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
XTool.ResetInitSchedule = function()
|
||||
XTool.__InitSchedule = nil
|
||||
end
|
||||
|
||||
--[[
|
||||
描述:调用函数时延迟到下一帧统一调用,避免同一个函数在同一帧多次调用
|
||||
使用场景:
|
||||
1.可在注册事件中调用, 多个事件重复触发,也仅在帧结束回调一次
|
||||
2.可在自己函数内使用,因逻辑上导致的多次触发可归为帧结束回调一次
|
||||
]]
|
||||
XTool.CallFunctionOnNextFrame = function(callback, caller, ...)
|
||||
return XTool._RegisterFunctionOnNextFrame(callback, caller, ...)
|
||||
end
|
||||
|
||||
XTool._RegisterFunctionOnNextFrame = function(callback, caller, ...)
|
||||
if callback == nil then
|
||||
return false
|
||||
end
|
||||
if not XTool._IsAutoRefreshOnNextFrame then
|
||||
if caller then
|
||||
callback(caller, ...)
|
||||
else
|
||||
callback(...)
|
||||
end
|
||||
return true
|
||||
end
|
||||
XTool._FunctionsOnNextFrame = XTool._FunctionsOnNextFrame or {}
|
||||
local callerData
|
||||
-- 分开处理避免两个不同的类调用同一个方法导致其中一个调用缺失
|
||||
if caller then
|
||||
callerData = XTool._FunctionsOnNextFrame[caller] or {}
|
||||
callerData[callback] = {caller, ...}
|
||||
XTool._FunctionsOnNextFrame[caller] = callerData
|
||||
else
|
||||
callerData = XTool._FunctionsOnNextFrame["STATIC"] or {}
|
||||
callerData[callback] = {...}
|
||||
XTool._FunctionsOnNextFrame["STATIC"] = callerData
|
||||
end
|
||||
if not XTool.__InitSchedule then
|
||||
XTool.__InitSchedule = true
|
||||
XScheduleManager.ScheduleForever(XTool._AutoRefreshOnNextFrame, 0, 0)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
XTool._AutoRefreshOnNextFrame = function()
|
||||
if XTool.IsTableEmpty(XTool._FunctionsOnNextFrame) then
|
||||
return
|
||||
end
|
||||
for key, callbackDic in pairs(XTool._FunctionsOnNextFrame) do
|
||||
for callback, args in pairs(callbackDic) do
|
||||
callback(table.unpack(args))
|
||||
end
|
||||
XTool._FunctionsOnNextFrame[key] = nil
|
||||
end
|
||||
end
|
||||
|
||||
XTool.ConnectSignal = function(source, path, event, callback, caller, returnArgKey)
|
||||
local controlVar = XTool._CheckSignalPath(source, path, event, callback, caller)
|
||||
if not controlVar then
|
||||
return
|
||||
end
|
||||
if caller == nil then
|
||||
caller = source
|
||||
end
|
||||
return XTool._ConnectSignal(controlVar, path, event, callback, caller, returnArgKey)
|
||||
end
|
||||
|
||||
XTool.ConnectSignals = function(source, path, event, callback, caller)
|
||||
local controlVar = XTool._CheckSignalPath(source, path, event, callback, caller)
|
||||
if not controlVar then
|
||||
return
|
||||
end
|
||||
if caller == nil then
|
||||
caller = source
|
||||
end
|
||||
local result = {}
|
||||
for _, var in ipairs(controlVar) do
|
||||
table.insert(result, XTool._ConnectSignal(var, path, event, callback, caller))
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
XTool._CheckSignalPath = function(source, path, event, callback, caller)
|
||||
local varNames = string.Split(path, "/")
|
||||
local controlVar = source
|
||||
for _, v in ipairs(varNames) do
|
||||
controlVar = controlVar[v]
|
||||
if controlVar == nil then
|
||||
XLog.Error("信号连接失败,请检查路径:", path)
|
||||
return
|
||||
end
|
||||
end
|
||||
return controlVar
|
||||
end
|
||||
|
||||
XTool._ConnectSignal = function(controlVar, path, event, callback, caller, returnArgKey)
|
||||
local signalData = controlVar.SignalData
|
||||
if signalData == nil and CheckClassSuper(controlVar, XSignalData) then
|
||||
signalData = controlVar
|
||||
end
|
||||
if not signalData then
|
||||
XLog.Error("信号连接失败,查找对象不属于信号数据:", path)
|
||||
return
|
||||
end
|
||||
signalData:ConnectSignal(event, caller, callback, returnArgKey)
|
||||
return signalData
|
||||
end
|
||||
|
||||
XTool.RegisterSignalWrap = function(source)
|
||||
local wrapResult = {}
|
||||
setmetatable(
|
||||
wrapResult,
|
||||
{
|
||||
__index = function(_, k)
|
||||
return source[k]
|
||||
end
|
||||
}
|
||||
)
|
||||
wrapResult.SignalData = XSignalData.New()
|
||||
wrapResult.__Source = source
|
||||
return wrapResult
|
||||
end
|
||||
|
||||
XTool.GetTableNameByTablePath = function(tablePath)
|
||||
local tableParts = string.Split(tablePath, "/")
|
||||
return string.gsub(tableParts[#tableParts], ".tab", "")
|
||||
end
|
||||
|
||||
--字符串转为Vector3 格式为 x|y|z
|
||||
XTool.ConvertStringToVector3 = function(str)
|
||||
local values = string.Split(str,"|")
|
||||
local x = 0
|
||||
local y = 0
|
||||
local z = 0
|
||||
if values[1] then
|
||||
x = tonumber(values[1])
|
||||
end
|
||||
if values[2] then
|
||||
y = tonumber(values[2])
|
||||
end
|
||||
if values[3] then
|
||||
z = tonumber(values[3])
|
||||
end
|
||||
return CS.UnityEngine.Vector3(x, y, z)
|
||||
end
|
||||
|
||||
XTool.Random = function(a, b)
|
||||
if nil ~= a and nil ~= b then
|
||||
if math.round(a) ~= a or math.round(b) ~= b then
|
||||
return a + math.random() * (b - a)
|
||||
end
|
||||
if a > b then
|
||||
XLog.Warning("math.random param b must be bigger than param a")
|
||||
end
|
||||
return math.random(a, b)
|
||||
elseif nil ~= a then
|
||||
return math.random(a)
|
||||
end
|
||||
return math.random()
|
||||
end
|
||||
|
||||
-- 循坏分割字符串
|
||||
XTool.LoopSplitStr = function(content, splitStr, splitLen)
|
||||
local totalLenght = string.Utf8Len(content)
|
||||
if totalLenght <= splitLen then
|
||||
return content
|
||||
end
|
||||
local result = string.Utf8Sub(content, 1, splitLen)
|
||||
local remaind = string.Utf8Sub(content, splitLen + 1, totalLenght - splitLen)
|
||||
result = result .. splitStr .. XTool.LoopSplitStr(remaind, splitStr, splitLen)
|
||||
return result
|
||||
end
|
56
Script/matrix/xcommon/XUiGravity.lua
Normal file
56
Script/matrix/xcommon/XUiGravity.lua
Normal file
|
@ -0,0 +1,56 @@
|
|||
XUiGravity = XClass(XLuaBehaviour, "XUiGravity")
|
||||
-- 范围(防止画面抖动)
|
||||
local range = 0.01
|
||||
|
||||
function XUiGravity:Ctor(rootUi, ui, minX, maxX, minY, maxY)
|
||||
self.minX = minX
|
||||
self.maxX = maxX
|
||||
self.minY = minY
|
||||
self.maxY = maxY
|
||||
self.lastAttitude = CS.UnityEngine.Vector3.zero
|
||||
self.testV = 0
|
||||
self.testSpeed = 0.01
|
||||
end
|
||||
|
||||
function XUiGravity:Start()
|
||||
CS.UnityEngine.Input.gyro.enabled = true
|
||||
end
|
||||
|
||||
function XUiGravity:Update()
|
||||
self.testV = self.testV + self.testSpeed
|
||||
if self.testV > 1 then
|
||||
self.testSpeed = -0.01
|
||||
elseif self.testV < -1 then
|
||||
self.testSpeed = 0.01
|
||||
end
|
||||
local transform = self.Transform
|
||||
-- local attitude = CS.UnityEngine.Vector3(CS.UnityEngine.Input.gyro.attitude.x, CS.UnityEngine.Input.gyro.attitude.y, 0)
|
||||
local attitude = CS.UnityEngine.Vector3(self.testV, 0, 0)
|
||||
--使安全范围内 - 1之1
|
||||
attitude.x = XMath.Clamp(attitude.x, -1, 1);
|
||||
attitude.y = XMath.Clamp(attitude.y, -1, 1);
|
||||
|
||||
local x = transform.localPosition.x
|
||||
local y = transform.localPosition.y
|
||||
|
||||
local isDirty = false
|
||||
if math.abs(self.lastAttitude.x - attitude.x) >= range then
|
||||
isDirty = true
|
||||
local direction = attitude.x - self.lastAttitude.x
|
||||
local position = direction * (self.maxX - self.minX) / 2
|
||||
x = XMath.Clamp(transform.localPosition.x - position, self.minX, self.maxX);
|
||||
self.lastAttitude = attitude
|
||||
end
|
||||
if math.abs(self.lastAttitude.y - attitude.y) >= range then
|
||||
isDirty = true
|
||||
local direction = attitude.y - self.lastAttitude.y
|
||||
local position = direction * (self.maxY - self.minY) / 2
|
||||
y = XMath.Clamp(transform.localPosition.y - position, self.minY, self.maxY);
|
||||
self.lastAttitude = attitude
|
||||
end
|
||||
if isDirty then
|
||||
transform.localPosition = CS.UnityEngine.Vector3(x, y, transform.localPosition.z);
|
||||
end
|
||||
end
|
||||
|
||||
return XUiGravity
|
1494
Script/matrix/xcommon/XUiHelper.lua
Normal file
1494
Script/matrix/xcommon/XUiHelper.lua
Normal file
File diff suppressed because it is too large
Load diff
140
Script/matrix/xconfig/XAccumulatedConsumeConfig.lua
Normal file
140
Script/matrix/xconfig/XAccumulatedConsumeConfig.lua
Normal file
|
@ -0,0 +1,140 @@
|
|||
XAccumulatedConsumeConfig = XAccumulatedConsumeConfig or {}
|
||||
|
||||
local SHARE_CONSUME_DRAW_ACTIVITY = "Share/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawActivity.tab"
|
||||
local SHARE_CONSUME_DRAW_REWARD = "Share/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawReward.tab"
|
||||
|
||||
local CLIENT_CONSUME_DRAW_ACTIVITY_DETAIL = "Client/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawActivityDetail.tab"
|
||||
local CLIENT_CONSUME_DRAW_EXCHANGE_ICON = "Client/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawExchangeIcon.tab"
|
||||
local CLIENT_CONSUME_DRAW_PROB_SHOW = "Client/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawProbShow.tab"
|
||||
local CLIENT_CONSUME_DRAW_RULE = "Client/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawRule.tab"
|
||||
local CLIENT_CONSUME_DRAW_REWARD_TYPE = "Client/MiniActivity/AccumulatedConsumeDraw/AccumulatedConsumeDrawRewardType.tab"
|
||||
|
||||
local ConsumeDrawActivity = {}
|
||||
local ConsumeDrawReward = {}
|
||||
|
||||
local ConsumeDrawActivityDetail = {}
|
||||
local ConsumeDrawProbShow = {}
|
||||
local ConsumeDrawRule = {}
|
||||
local ConsumeDrawRewardType = {}
|
||||
|
||||
function XAccumulatedConsumeConfig.Init()
|
||||
ConsumeDrawActivity = XTableManager.ReadByIntKey(SHARE_CONSUME_DRAW_ACTIVITY, XTable.XTableAccumulatedConsumeDrawActivity, "Id")
|
||||
ConsumeDrawReward = XTableManager.ReadByIntKey(SHARE_CONSUME_DRAW_REWARD, XTable.XTableAccumulatedConsumeDrawReward, "ActId")
|
||||
|
||||
ConsumeDrawActivityDetail = XTableManager.ReadByIntKey(CLIENT_CONSUME_DRAW_ACTIVITY_DETAIL, XTable.XTableAccumulatedConsumeDrawActivityDetail, "Id")
|
||||
ConsumeDrawProbShow = XTableManager.ReadByIntKey(CLIENT_CONSUME_DRAW_PROB_SHOW, XTable.XTableAccumulatedConsumeDrawProbShow, "Id")
|
||||
ConsumeDrawRule = XTableManager.ReadByIntKey(CLIENT_CONSUME_DRAW_RULE, XTable.XTableAccumulatedConsumeDrawRule, "DrawId")
|
||||
ConsumeDrawRewardType = XTableManager.ReadByIntKey(CLIENT_CONSUME_DRAW_REWARD_TYPE, XTable.XTableAccumulatedConsumeDrawRewardType, "RewardType")
|
||||
|
||||
XConfigCenter.CreateGetPropertyByFunc(XAccumulatedConsumeConfig, "ConsumeDrawExchangeConfig", function()
|
||||
return XTableManager.ReadByStringKey(CLIENT_CONSUME_DRAW_EXCHANGE_ICON, XTable.XTableAccumulatedConsumeDrawExchangeIcon, "Key")
|
||||
end)
|
||||
end
|
||||
|
||||
--region AccumulatedConsumeDrawActivity.tab
|
||||
|
||||
local function GetConsumeDrawActivity(id)
|
||||
local config = ConsumeDrawActivity[id]
|
||||
if not config then
|
||||
XLog.Error("XAccumulatedConsumeConfig GetConsumeDrawActivity error:配置不存在,Id:" .. id .. ",Path:" .. SHARE_CONSUME_DRAW_ACTIVITY)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDrawActivity(id)
|
||||
return GetConsumeDrawActivity(id)
|
||||
end
|
||||
|
||||
--endregion
|
||||
|
||||
--region AccumulatedConsumeDrawReward.tab
|
||||
|
||||
local function GetConsumeDrawReward(actId)
|
||||
local config = ConsumeDrawReward[actId]
|
||||
if not config then
|
||||
XLog.Error("XAccumulatedConsumeConfig GetConsumeDrawReward error:配置不存在,ActId:" .. actId .. ",Path:" .. SHARE_CONSUME_DRAW_REWARD)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDrawReward(actId)
|
||||
return GetConsumeDrawReward(actId)
|
||||
end
|
||||
|
||||
--endregion
|
||||
|
||||
--region AccumulatedConsumeDrawActivityDetail.tab
|
||||
|
||||
local function GetConsumeDrawActivityDetail(id)
|
||||
local config = ConsumeDrawActivityDetail[id]
|
||||
if not config then
|
||||
XLog.Error("XAccumulatedConsumeConfig GetConsumeDrawActivityDetail error:配置不存在,id:" .. id .. ",Path:" .. CLIENT_CONSUME_DRAW_ACTIVITY_DETAIL)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDrawActivityDetail(id)
|
||||
return GetConsumeDrawActivityDetail(id)
|
||||
end
|
||||
|
||||
--endregion
|
||||
|
||||
--region AccumulatedConsumeDrawProbShow.tab
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDrawProbShowByDrawId(drawId)
|
||||
local config = {}
|
||||
for _, pronShow in pairs(ConsumeDrawProbShow) do
|
||||
if pronShow.DrawId == drawId then
|
||||
table.insert(config, pronShow)
|
||||
end
|
||||
end
|
||||
table.sort(config, function(a, b)
|
||||
return a.Id < b.Id
|
||||
end)
|
||||
return config
|
||||
end
|
||||
|
||||
--endregion
|
||||
|
||||
--region AccumulatedConsumeDrawRule.tab
|
||||
|
||||
local function GetConsumeDrawRule(drawId)
|
||||
local config = ConsumeDrawRule[drawId]
|
||||
if not config then
|
||||
XLog.Error("XAccumulatedConsumeConfig GetConsumeDrawRule error:配置不存在,drawId:" .. drawId .. ",Path:" .. CLIENT_CONSUME_DRAW_RULE)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDrawRule(drawId)
|
||||
return GetConsumeDrawRule(drawId)
|
||||
end
|
||||
|
||||
--endregion
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDrawRewardTypeConfig()
|
||||
return ConsumeDrawRewardType
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetDefaultActivityId()
|
||||
local defaultActivityId = 0
|
||||
for activityId, config in pairs(ConsumeDrawActivity) do
|
||||
defaultActivityId = activityId
|
||||
if XTool.IsNumberValid(config.TimeId) and XFunctionManager.CheckInTimeByTimeId(config.TimeId) then
|
||||
break
|
||||
end
|
||||
end
|
||||
return defaultActivityId
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetConsumeSpecialIcons()
|
||||
return XAccumulatedConsumeConfig.GetConsumeDrawExchangeConfig("ConsumeIcons").Values
|
||||
end
|
||||
|
||||
function XAccumulatedConsumeConfig.GetTargetIcon()
|
||||
return XAccumulatedConsumeConfig.GetConsumeDrawExchangeConfig("TargetIcon").Values[1]
|
||||
end
|
114
Script/matrix/xconfig/XAchievementConfigs.lua
Normal file
114
Script/matrix/xconfig/XAchievementConfigs.lua
Normal file
|
@ -0,0 +1,114 @@
|
|||
--==================
|
||||
--成就系统相关配置表
|
||||
--模块负责:吕天元
|
||||
--==================
|
||||
XAchievementConfigs = XAchievementConfigs or {}
|
||||
--================================================================
|
||||
-- 配置表地址 --
|
||||
--================================================================
|
||||
local SHARE_TABLE_PATH = "Share/Achievement/"
|
||||
local CLIENT_TABLE_PATH = "Client/Achievement/"
|
||||
|
||||
local TABLE_ACHIEVEMENT_BASETYPE = CLIENT_TABLE_PATH .. "AchievementBaseTypeInfo.tab"
|
||||
local TABLE_ACHIEVEMENT_TYPE = CLIENT_TABLE_PATH .. "AchievementTypeInfo.tab"
|
||||
--local TABLE_REVIEW_ACTIVITY_INFO = CLIENT_TABLE_PATH .. "ReviewActivityInfo.tab"
|
||||
local TABLE_ACHIEVEMENT = SHARE_TABLE_PATH .. "Achievement.tab"
|
||||
--local TABLE_REVIEW_ACTIVITY = SHARE_TABLE_PATH .. "ReviewActivity.tab"
|
||||
--=================================================
|
||||
--=================================================
|
||||
local Configs = {}
|
||||
--=============
|
||||
--配置表枚举
|
||||
--Id : 枚举Id
|
||||
--Path : 关联的表地址 (日志中使用)
|
||||
--Key : 要检查的字段名 (日志中使用)
|
||||
--=============
|
||||
XAchievementConfigs.TableKey = {
|
||||
AchievementBaseType = {Id = 1, Path = TABLE_ACHIEVEMENT_BASETYPE}, --成就基础类型配置
|
||||
AchievementType = {Id = 2, Path = TABLE_ACHIEVEMENT_TYPE}, --成就类型配置
|
||||
--ReviewActivityInfo = {Id = 3, Path = TABLE_REVIEW_ACTIVITY_INFO}, --回顾活动文本信息
|
||||
Achievement = {Id = 3, Path = TABLE_ACHIEVEMENT}, --成就表配置
|
||||
--ReviewActivity = {Id = 5, Path = TABLE_REVIEW_ACTIVITY}, --回顾活动配置
|
||||
Type2AchievementDic = {Id = 4, Path = TABLE_ACHIEVEMENT, Key = "AchievementTypeId"}, --
|
||||
BaseId2AchievementTypeDic = {Id = 5, Path = TABLE_ACHIEVEMENT_TYPE, Key = "BaseTypeId"}
|
||||
}
|
||||
|
||||
--=============
|
||||
--初始化BaseTypeId -> 成就类型字典
|
||||
--=============
|
||||
local InitBaseId2AchievementTypeDic = function()
|
||||
local tableId = XAchievementConfigs.TableKey.BaseId2AchievementTypeDic.Id
|
||||
Configs[tableId] = {}
|
||||
for _, cfg in pairs (XAchievementConfigs.GetAllConfigs(XAchievementConfigs.TableKey.AchievementType) or {}) do
|
||||
local id = cfg.BaseTypeId
|
||||
if not Configs[tableId][id] then Configs[tableId][id] = {} end
|
||||
table.insert(Configs[tableId][id], cfg)
|
||||
end
|
||||
end
|
||||
--=============
|
||||
--初始化TypeId -> 成就类型字典
|
||||
--=============
|
||||
local InitType2AchievementDic = function()
|
||||
local tableId = XAchievementConfigs.TableKey.Type2AchievementDic.Id
|
||||
Configs[tableId] = {}
|
||||
for _, cfg in pairs (XAchievementConfigs.GetAllConfigs(XAchievementConfigs.TableKey.Achievement) or {}) do
|
||||
local id = cfg.AchievementTypeId
|
||||
if not Configs[tableId][id] then Configs[tableId][id] = {} end
|
||||
table.insert(Configs[tableId][id], cfg)
|
||||
end
|
||||
end
|
||||
--=============
|
||||
--初始化所有配置表和字典
|
||||
--=============
|
||||
function XAchievementConfigs.Init()
|
||||
Configs[XAchievementConfigs.TableKey.AchievementBaseType.Id] = XTableManager.ReadByIntKey(TABLE_ACHIEVEMENT_BASETYPE, XTable.XTableAchievementBaseTypeInfo, "Id")
|
||||
Configs[XAchievementConfigs.TableKey.AchievementType.Id] = XTableManager.ReadByIntKey(TABLE_ACHIEVEMENT_TYPE, XTable.XTableAchievementTypeInfo, "Id")
|
||||
--Configs[XAchievementConfigs.TableKey.ReviewActivityInfo.Id] = XTableManager.ReadByStringKey(TABLE_REVIEW_ACTIVITY_INFO, XTable.XTableReviewActivityInfo, "Key")
|
||||
Configs[XAchievementConfigs.TableKey.Achievement.Id] = XTableManager.ReadByIntKey(TABLE_ACHIEVEMENT, XTable.XTableAchievement, "Id")
|
||||
--Configs[XAchievementConfigs.TableKey.ReviewActivity.Id] = XTableManager.ReadByIntKey(TABLE_REVIEW_ACTIVITY, XTable.XTableReviewActivity, "Id")
|
||||
InitBaseId2AchievementTypeDic()
|
||||
InitType2AchievementDic()
|
||||
end
|
||||
--=============
|
||||
--给定配置表Key,获取该配置表全部配置
|
||||
--@tableKey : XAchievementConfigs.TableKey枚举项
|
||||
--=============
|
||||
function XAchievementConfigs.GetAllConfigs(tableKey)
|
||||
if not tableKey or not tableKey.Id then
|
||||
XLog.Error("The tableKey given is not exist. tableKey : " .. tostring(tableKey))
|
||||
return {}
|
||||
end
|
||||
return Configs[tableKey.Id]
|
||||
end
|
||||
--=============
|
||||
--给定配置表Key和Id,获取该配置表指定Id的配置
|
||||
--@params:
|
||||
--tableKey : XAchievementConfigs.TableKey枚举项
|
||||
--idKey : 该配置表的主键Id或Key
|
||||
--noTips : 若没有查找到对应项,是否要打印错误日志
|
||||
--=============
|
||||
function XAchievementConfigs.GetCfgByIdKey(tableKey, idKey, noTips)
|
||||
if not tableKey or not idKey then
|
||||
if not noTips then
|
||||
XLog.Error("XAchievementConfigs.GetCfgByIdKey error: tableKey or idKey is null!")
|
||||
end
|
||||
return {}
|
||||
end
|
||||
local allCfgs = XAchievementConfigs.GetAllConfigs(tableKey)
|
||||
if not allCfgs then
|
||||
return {}
|
||||
end
|
||||
local cfg = allCfgs[idKey]
|
||||
if not cfg then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XAchievementConfigs.GetCfgByIdKey",
|
||||
tableKey.Key or "唯一Id",
|
||||
tableKey.Path,
|
||||
tableKey.Key or "唯一Id",
|
||||
tostring(idKey))
|
||||
end
|
||||
return {}
|
||||
end
|
||||
return cfg
|
||||
end
|
252
Script/matrix/xconfig/XActivityBriefConfigs.lua
Normal file
252
Script/matrix/xconfig/XActivityBriefConfigs.lua
Normal file
|
@ -0,0 +1,252 @@
|
|||
local TABLE_ACTIVITY_PATH = "Client/ActivityBrief/ActivityBrief.tab"
|
||||
local TABLE_ACTIVITY_SHOP = "Client/ActivityBrief/ActivityBriefShop.tab"
|
||||
local TABLE_ACTIVITY_TASK = "Client/ActivityBrief/ActivityBriefTask.tab"
|
||||
local TABLE_ACTIVITY_GROUP_PATH = "Client/ActivityBrief/ActivityBriefGroup.tab"
|
||||
local TABLE_ACTIVITY_SPECIAL = "Client/ActivityBrief/SpecialActivity.tab"
|
||||
local TABLE_ACTIVITY_Story = "Share/ActivityBrief/ActivityBriefStory.tab"
|
||||
|
||||
local ParseToTimestamp = XTime.ParseToTimestamp
|
||||
|
||||
local ActivityTemplates = {}
|
||||
local ActivityShopTemplates = {}
|
||||
local ActivityTaskTemplates = {}
|
||||
local ActivityGroupTemplates = {}
|
||||
local SpecialActivityTemplates = {}
|
||||
local ActivityStoryTemplates = {}
|
||||
local SkipIdToRedPointConditionsDic = {}
|
||||
|
||||
XActivityBriefConfigs = XActivityBriefConfigs or {}
|
||||
|
||||
-- 活动名称Id(有需要新增,勿删改!)
|
||||
XActivityBriefConfigs.ActivityGroupId = {
|
||||
MainLine = 1, --主线活动
|
||||
Branch = 2, --支线活动
|
||||
BossSingle = 3, --单机Boss活动
|
||||
BossOnline = 4, --联机Boss活动
|
||||
Prequel = 5, --间章故事-角色A
|
||||
BabelTower = 6, --巴别塔
|
||||
RougueLike = 7, --爬塔
|
||||
RepeatChallenge = 8, --复刷关
|
||||
ArenaOnline = 9, --区域联机
|
||||
UnionKill = 10, --狙击战
|
||||
ShortStories = 11, --短篇故事
|
||||
Prequel2 = 12, --间章故事-角色B
|
||||
Labyrinth = 13, --迷宫
|
||||
Society = 14, --公会
|
||||
Resource = 15, --资源
|
||||
BigWar = 16, --大作战
|
||||
Extra = 17, --番外-普通
|
||||
WorldBoss = 18, --世界Boss
|
||||
Expedition = 19, --自走棋
|
||||
FubenBossSingle = 20, --幻痛囚笼
|
||||
ActivityBriefShop = 21, --活动商店
|
||||
Extra2 = 22, --番外-隐藏
|
||||
MaintainerAction = 23, --大富翁
|
||||
RpgTower = 24, --RPG玩法
|
||||
ActivityDrawCard = 25, --活动抽卡
|
||||
TRPGMainLine = 26, --终焉福音-主线跑团活动
|
||||
NewCharActivity = 27, -- 新角色教学活动
|
||||
FubenActivityTrial = 28, -- 试玩关
|
||||
ShiTu = 29, -- 师徒系统
|
||||
Nier = 30, -- 尼尔玩法
|
||||
Pokemon = 31, -- 口袋战双
|
||||
Pursuit = 32, -- 追击玩法
|
||||
StrongHold = 33, --超级据点
|
||||
Simulate = 34, -- 模拟战
|
||||
Partner = 35, --伙伴系统
|
||||
MoeWar = 38, --萌战
|
||||
PetCard = 39, --宠物抽卡
|
||||
PetTrial = 40, --新宠物活动
|
||||
PokerGuessing = 41, --翻牌小游戏
|
||||
Hack = 42, --骇客
|
||||
RpgMaker = 43, --端午活动
|
||||
Reform = 44, --改造玩法
|
||||
CoupleCombat = 45, --双人同行
|
||||
SuperTower = 46, --超级爬塔
|
||||
SummerSeries = 47, --夏活系列关
|
||||
KillZone = 48, --杀戮无双
|
||||
Expedition = 49, --虚像地平线
|
||||
SameColorGame = 50, --三消游戏
|
||||
AreaWar = 51, --全服对决
|
||||
SuperSmashBros = 52, --超限乱斗
|
||||
TeachingSkin = 53, --教学关内涂装试玩
|
||||
Maverick = 54, --射击玩法 异构阵线
|
||||
MemorySave = 55, --意识营救战
|
||||
Theatre = 56, --肉鸽玩法
|
||||
DoomsDay = 57, --免疫之城
|
||||
PivotCombat = 58, --Sp战力验证
|
||||
Escape = 59, --大逃杀玩法
|
||||
FubenShortStory = 60, --故事集
|
||||
DoubleTowers = 61, --动作塔防
|
||||
SecondActivityBriefShop = 62, --活动商店
|
||||
SecondBriefPanel = 63, --副面板
|
||||
GuildWar = 64, --工会战
|
||||
GoldenMiner = 65, --黄金矿工
|
||||
QiGuan = 66, --春节七关
|
||||
TaikoMaster = 67, -- 音游小游戏
|
||||
MultiDim = 68, -- 多维挑战
|
||||
Festival = 69, -- 节日活动 v1.27:白色情人节
|
||||
}
|
||||
--跳转id
|
||||
XActivityBriefConfigs.SkipId =
|
||||
{
|
||||
LivWarmExtActivity = 11767, --丽芙宣发活动
|
||||
LivWarmRace = 20097, --二周年预热-赛跑小游戏
|
||||
Doomsday = 82050, --免疫之城
|
||||
NewYearLuck = 20112, --元旦奖券小游戏
|
||||
BodyCombineGame = 20118, --接头霸王(哈卡玛预热小游戏)
|
||||
AccumulateConsume = 20120, --累消活动
|
||||
WhiteValentine = 20133, --白情活动
|
||||
InvertCardGame = 20134, --翻牌小游戏(二期)
|
||||
MineSweepingGame = 20140, --扫雷小游戏
|
||||
}
|
||||
|
||||
local InitSkipIdToRedPointConditionsDic = function()
|
||||
SkipIdToRedPointConditionsDic[11739] = {XRedPointConditions.Types.CONDITION_GUARD_CAMP_RED}
|
||||
SkipIdToRedPointConditionsDic[80011] = {XRedPointConditions.Types.CONDITION_WHITEVALENTINE2021_ENTRYRED}
|
||||
SkipIdToRedPointConditionsDic[11753] = {XRedPointConditions.Types.CONDITION_FINGERGUESSING_TASK}
|
||||
SkipIdToRedPointConditionsDic[11757] = {XRedPointConditions.Types.CONDITION_MOVIE_ASSEMBLE_01}
|
||||
SkipIdToRedPointConditionsDic[11761] = {XRedPointConditions.Types.CONDITION_FASHION_STORY_HAVE_STAGE}
|
||||
SkipIdToRedPointConditionsDic[81103] = {XRedPointConditions.Types.CONDITION_RPG_MAKER_GAME_RED}
|
||||
SkipIdToRedPointConditionsDic[20091] = {XRedPointConditions.Types.CONDITION_LIV_WARM_ACTIVITY}
|
||||
SkipIdToRedPointConditionsDic[20107] = {XRedPointConditions.Types.CONDITION_DICEGAME_RED}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.LivWarmExtActivity] = {XRedPointConditions.Types.CONDITION_LIV_WARM_EXT_ACTIVITY}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.LivWarmRace] = {XRedPointConditions.Types.CONDITION_LIV_WARM_RACE_REWARD}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.Doomsday] = {XRedPointConditions.Types.XRedPointConditionDoomsdayActivity}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.NewYearLuck] = {XRedPointConditions.Types.CONDITION_NEW_YEAR_LUCK_RULE_RED}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.BodyCombineGame] = {XRedPointConditions.Types.CONDITION_BODYCOMBINEGAME_MAIN}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.AccumulateConsume] = {XRedPointConditions.Types.CONDITION_CONSUME_ACTIVITY}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.WhiteValentine] = {XRedPointConditions.Types.CONDITION_ACTIVITY_WHITE_VALENTINE}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.InvertCardGame] = {XRedPointConditions.Types.CONDITION_INVERTCARDGAME_RED}
|
||||
SkipIdToRedPointConditionsDic[XActivityBriefConfigs.SkipId.MineSweepingGame] = {XRedPointConditions.Types.CONDITION_MINSWEEPING_RED}
|
||||
SkipIdToRedPointConditionsDic[1400008] = {XRedPointConditions.Types.CONDITION_SLOTMACHINE_RED}
|
||||
SkipIdToRedPointConditionsDic[1400009] = {XRedPointConditions.Types.CONDITION_SLOTMACHINE_REDL}
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.Init()
|
||||
ActivityTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_PATH, XTable.XTableBriefActivity, "Id")
|
||||
ActivityShopTemplates= XTableManager.ReadByIntKey(TABLE_ACTIVITY_SHOP, XTable.XTableActivityBriefShop, "Id")
|
||||
ActivityTaskTemplates= XTableManager.ReadByIntKey(TABLE_ACTIVITY_TASK, XTable.XTableActivityBriefTask, "Id")
|
||||
ActivityGroupTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_GROUP_PATH, XTable.XTableActivityBriefGroup, "Id")
|
||||
SpecialActivityTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_SPECIAL, XTable.XTableSpecialActivity, "Id")
|
||||
ActivityStoryTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_Story, XTable.XTableActivityBriefStory, "Id")
|
||||
|
||||
InitSkipIdToRedPointConditionsDic()
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityBeginTime()
|
||||
local config = XActivityBriefConfigs.GetActivityConfig()
|
||||
return XFunctionManager.GetStartTimeByTimeId(config.TimeId)
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityEndTime()
|
||||
local config = XActivityBriefConfigs.GetActivityConfig()
|
||||
return XFunctionManager.GetEndTimeByTimeId(config.TimeId)
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityConfig()
|
||||
return ActivityTemplates[1]
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityModels()
|
||||
local config = XActivityBriefConfigs.GetActivityConfig()
|
||||
return config.UIModelId or {}
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetSpinePath(index)
|
||||
local config = XActivityBriefConfigs.GetActivityConfig()
|
||||
return config.SpinePath[index] or ""
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
--v1.27 活动面板优化:根据活动主题主副面板Id和SpineIndex获取SpinePath
|
||||
--===========================================================================
|
||||
function XActivityBriefConfigs.GetSpinePathByType(panelType, index)
|
||||
local config = ActivityTemplates[panelType]
|
||||
return config.SpinePath[index] or ""
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
--v1.27 活动面板优化:根据活动主题主副面板Id获取当前的 SpinePath List
|
||||
--===========================================================================
|
||||
function XActivityBriefConfigs.GetSpinePathList(panelType)
|
||||
local config = ActivityTemplates[panelType]
|
||||
return config.SpinePath or {}
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
--v1.27 活动面板优化:根据活动主题主副面板Id获取当前的 GroupId List
|
||||
--===========================================================================
|
||||
function XActivityBriefConfigs.GetGroupIdList(panelType)
|
||||
local config = ActivityTemplates[panelType]
|
||||
return config.GroupIdList or ""
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityEntrySkipId(id)
|
||||
return SpecialActivityTemplates[id].SkipId
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetAllActivityEntryConfig()
|
||||
return SpecialActivityTemplates
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityShopByInfoId(id)
|
||||
return ActivityShopTemplates[id]
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityTaskByInfoId(id)
|
||||
return ActivityTaskTemplates[id]
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityGroupConfig(groupId)
|
||||
local groupConfig = ActivityGroupTemplates[groupId]
|
||||
if not groupConfig then
|
||||
XLog.ErrorTableDataNotFound("XActivityBriefConfigs.GetActivityGroupConfig",
|
||||
"根据groupId获取的配置表项", TABLE_ACTIVITY_GROUP_PATH, "groupId", tostring(groupId))
|
||||
return
|
||||
end
|
||||
return groupConfig
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
--v1.27 活动面板优化:根据活动GroupId获取该Btn点击事件绑定函数名
|
||||
--===========================================================================
|
||||
function XActivityBriefConfigs.GetActivityGroupBtnInitMethodName(groupId)
|
||||
local groupConfig = ActivityGroupTemplates[groupId]
|
||||
if not groupConfig then
|
||||
XLog.ErrorTableDataNotFound("XActivityBriefConfigs.GetActivityGroupBtnInitMethodName",
|
||||
"根据groupId获取的配置表项", TABLE_ACTIVITY_GROUP_PATH, "groupId", tostring(groupId))
|
||||
return
|
||||
end
|
||||
return groupConfig.BtnInitMethodName or nil
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.TestOpenActivity()
|
||||
local newTemplate = {}
|
||||
for id, template in pairs(ActivityTemplates) do
|
||||
if id ~= 1 then
|
||||
newTemplate[id] = template
|
||||
else
|
||||
newTemplate[id] = XTool.Clone(template)
|
||||
newTemplate[id].TimeId = 24
|
||||
end
|
||||
end
|
||||
ActivityTemplates = newTemplate
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetTableActivityPath()
|
||||
return TABLE_ACTIVITY_PATH
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityStoryConfig()
|
||||
return ActivityStoryTemplates
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetActivityBriefGroup(id)
|
||||
local config = XActivityBriefConfigs.GetActivityGroupConfig(id)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XActivityBriefConfigs.GetRedPointConditionsBySkipId(skipId)
|
||||
return skipId and SkipIdToRedPointConditionsDic[skipId]
|
||||
end
|
19
Script/matrix/xconfig/XActivityCalendarConfigs.lua
Normal file
19
Script/matrix/xconfig/XActivityCalendarConfigs.lua
Normal file
|
@ -0,0 +1,19 @@
|
|||
XActivityCalendarConfigs = XActivityCalendarConfigs or {}
|
||||
|
||||
local ACTIVITY_CALENDAR_PATH = "Client/Calendar/ActivityCalendar.tab"
|
||||
|
||||
XActivityCalendarConfigs.ActivityState = {
|
||||
Lock = 1,
|
||||
Active = 2,
|
||||
End = 3
|
||||
}
|
||||
|
||||
local ActivityCalendarConfigs = {}
|
||||
|
||||
function XActivityCalendarConfigs.Init()
|
||||
ActivityCalendarConfigs = XTableManager.ReadByIntKey(ACTIVITY_CALENDAR_PATH,XTable.XTableActivityCalendar,"Id")
|
||||
end
|
||||
|
||||
function XActivityCalendarConfigs.GetActivityConfigs()
|
||||
return ActivityCalendarConfigs
|
||||
end
|
112
Script/matrix/xconfig/XActivityConfigs.lua
Normal file
112
Script/matrix/xconfig/XActivityConfigs.lua
Normal file
|
@ -0,0 +1,112 @@
|
|||
local ParseToTimestamp = XTime.ParseToTimestamp
|
||||
local TimestampToGameDateTimeString = XTime.TimestampToGameDateTimeString
|
||||
|
||||
local TABLE_ACTIVITY_PATH = "Client/Activity/Activity.tab"
|
||||
local TABLE_ACTIVITY_GROUP_PATH = "Client/Activity/ActivityGroup.tab"
|
||||
local TABLE_ACTIVITY_LINK_PATH = "Client/Activity/ActivityLink.tab"
|
||||
|
||||
local ActivityTemplates = {}
|
||||
local ActivityGroupTemplates = {}
|
||||
local ActivityLinkTemplates = {}
|
||||
|
||||
XActivityConfigs = XActivityConfigs or {}
|
||||
|
||||
--活动类型
|
||||
XActivityConfigs.ActivityType = {
|
||||
Task = 1, --任务
|
||||
Shop = 2, --商店
|
||||
Skip = 3, --跳转
|
||||
SendInvitation = 4, --邀请他人
|
||||
AcceptInvitation = 5, -- 接受邀请
|
||||
JigsawPuzzle = 6, -- 拼图
|
||||
Link = 7, --活动外链类型
|
||||
ConsumeReward = 8, -- 累消奖励
|
||||
ScratchTicket = 9, -- 普通刮刮乐
|
||||
ScratchTicketGolden = 10, -- 黄金刮刮乐
|
||||
}
|
||||
|
||||
-- 活动背景类型
|
||||
XActivityConfigs.ActivityBgType = {
|
||||
Image = 1, -- 普通图片
|
||||
Spine = 2, -- Spine动画
|
||||
}
|
||||
|
||||
-- 任务面板跳转类型
|
||||
XActivityConfigs.TaskPanelSkipType = {
|
||||
CanZhangHeMing_Qu = 20031, -- 拼图游戏(曲版本预热)
|
||||
CanZhangHeMing_LuNa = 20036, -- 拼图游戏(露娜预热)
|
||||
ChrismasTree_Dress = 20048, -- 装点圣诞树小游戏
|
||||
Couplet_Game = 20064, -- 春节对联游戏
|
||||
CanZhangHeMing_SP = 20070, -- 拼图游戏(SP角色预热)
|
||||
InvertCard_Game = 20076, -- 翻牌小游戏
|
||||
LivWarmPop_Game = 20091, -- 消消乐
|
||||
DiceGame = 20107,
|
||||
BodyCombineGame = 20118, -- 接头霸王(哈卡玛预热)
|
||||
InvertCardGame2 = 20134, --翻牌小游戏(二期)
|
||||
}
|
||||
|
||||
function XActivityConfigs.Init()
|
||||
ActivityTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_PATH, XTable.XTableActivity, "Id")
|
||||
ActivityGroupTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_GROUP_PATH, XTable.XTableActivityGroup, "Id")
|
||||
ActivityLinkTemplates = XTableManager.ReadByIntKey(TABLE_ACTIVITY_LINK_PATH, XTable.XTableActivityLink, "Id")
|
||||
end
|
||||
|
||||
function XActivityConfigs.GetActivityTemplates()
|
||||
return ActivityTemplates
|
||||
end
|
||||
|
||||
function XActivityConfigs.GetActivityGroupTemplates()
|
||||
return ActivityGroupTemplates
|
||||
end
|
||||
|
||||
function XActivityConfigs.GetActivityTemplate(activityId)
|
||||
return ActivityTemplates[activityId]
|
||||
end
|
||||
|
||||
|
||||
function XActivityConfigs.GetActivityTimeStr(activityId, beginTime, endTime)
|
||||
local activityCfg = XActivityConfigs.GetActivityTemplate(activityId)
|
||||
local format = "yyyy-MM-dd HH:mm"
|
||||
local beginTimeStr = ""
|
||||
local endTimeStr = ""
|
||||
if not string.IsNilOrEmpty(activityCfg.ShowBeginTime) then
|
||||
beginTimeStr = activityCfg.ShowBeginTime
|
||||
else
|
||||
if beginTime and beginTime ~= 0 then
|
||||
beginTimeStr = TimestampToGameDateTimeString(beginTime, format)
|
||||
else
|
||||
beginTimeStr = TimestampToGameDateTimeString(XFunctionManager.GetStartTimeByTimeId(activityCfg.TimeId), format)
|
||||
end
|
||||
end
|
||||
|
||||
if not string.IsNilOrEmpty(activityCfg.ShowEndTime) then
|
||||
endTimeStr = activityCfg.ShowEndTime
|
||||
else
|
||||
if endTime and endTime ~= 0 then
|
||||
endTimeStr = TimestampToGameDateTimeString(endTime, format)
|
||||
else
|
||||
endTimeStr = TimestampToGameDateTimeString(XFunctionManager.GetEndTimeByTimeId(activityCfg.TimeId), format)
|
||||
end
|
||||
end
|
||||
|
||||
if not string.IsNilOrEmpty(beginTimeStr) and not string.IsNilOrEmpty(endTimeStr) then
|
||||
return beginTimeStr .. "~" .. endTimeStr
|
||||
else
|
||||
if not string.IsNilOrEmpty(beginTimeStr) then
|
||||
return beginTimeStr
|
||||
elseif not string.IsNilOrEmpty(endTimeStr) then
|
||||
return endTimeStr
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XActivityConfigs.GetActivityLinkCfg(id)
|
||||
return ActivityLinkTemplates[id]
|
||||
end
|
||||
|
||||
function XActivityConfigs.GetActivityLinkTemplate()
|
||||
return ActivityLinkTemplates
|
||||
end
|
||||
|
9
Script/matrix/xconfig/XAppConfigs.lua
Normal file
9
Script/matrix/xconfig/XAppConfigs.lua
Normal file
|
@ -0,0 +1,9 @@
|
|||
--
|
||||
-- Author: wujie
|
||||
-- Note: app lua层配置相关
|
||||
|
||||
XAppConfigs = XAppConfigs or {}
|
||||
|
||||
XAppConfigs.PackageName = {
|
||||
Hero = "com.kurogame.haru.hero",
|
||||
}
|
919
Script/matrix/xconfig/XArchiveConfigs.lua
Normal file
919
Script/matrix/xconfig/XArchiveConfigs.lua
Normal file
|
@ -0,0 +1,919 @@
|
|||
--
|
||||
-- Author: zhangshuang、wujie
|
||||
-- Note: 图鉴配置相关
|
||||
XArchiveConfigs = XArchiveConfigs or {}
|
||||
|
||||
|
||||
XArchiveConfigs.SubSystemType = {
|
||||
Monster = 1,
|
||||
Weapon = 2,
|
||||
Awareness = 3,
|
||||
Story = 4,
|
||||
CG = 5,
|
||||
NPC = 6,
|
||||
Email = 7,
|
||||
Partner = 8,
|
||||
PV = 9,
|
||||
}
|
||||
|
||||
XArchiveConfigs.SettingType = {
|
||||
All = 0,
|
||||
Setting = 1,
|
||||
Story = 2,
|
||||
}
|
||||
|
||||
-- 设定位置
|
||||
XArchiveConfigs.SettingIndex = {
|
||||
First = 1,
|
||||
}
|
||||
|
||||
XArchiveConfigs.WeaponCamera = {
|
||||
Main = 1, -- 武器详情默认是主镜头
|
||||
Setting = 2,
|
||||
}
|
||||
|
||||
XArchiveConfigs.MonsterType = {
|
||||
Pawn = 1,
|
||||
Elite = 2,
|
||||
Boss = 3,
|
||||
}
|
||||
|
||||
XArchiveConfigs.MonsterInfoType = {
|
||||
Short = 1,
|
||||
Long = 2,
|
||||
}
|
||||
|
||||
XArchiveConfigs.MonsterSettingType = {
|
||||
Setting = 1,
|
||||
Story = 2,
|
||||
}
|
||||
|
||||
XArchiveConfigs.MonsterDetailType = {
|
||||
Synopsis = 1,
|
||||
Info = 2,
|
||||
Setting = 3,
|
||||
Skill = 4,
|
||||
Zoom = 5,
|
||||
ScreenShot = 6,
|
||||
}
|
||||
|
||||
XArchiveConfigs.EquipStarType = {
|
||||
All = 0,
|
||||
One = 1,
|
||||
Two = 2,
|
||||
Three = 3,
|
||||
Four = 4,
|
||||
Five = 5,
|
||||
Six = 6,
|
||||
}
|
||||
|
||||
XArchiveConfigs.EquipLikeType = {
|
||||
NULL = 0,
|
||||
Dis = 1,
|
||||
Like = 2,
|
||||
}
|
||||
|
||||
XArchiveConfigs.StarToQualityName = {
|
||||
[XArchiveConfigs.EquipStarType.All] = CS.XTextManager.GetText("ArchiveAwarenessFliterAll"),
|
||||
[XArchiveConfigs.EquipStarType.Two] = CS.XTextManager.GetText("ArchiveAwarenessFliterTwoStar"),
|
||||
[XArchiveConfigs.EquipStarType.Three] = CS.XTextManager.GetText("ArchiveAwarenessFliterThreeStar"),
|
||||
[XArchiveConfigs.EquipStarType.Four] = CS.XTextManager.GetText("ArchiveAwarenessFliterFourStar"),
|
||||
[XArchiveConfigs.EquipStarType.Five] = CS.XTextManager.GetText("ArchiveAwarenessFliterFiveStar"),
|
||||
[XArchiveConfigs.EquipStarType.Six] = CS.XTextManager.GetText("ArchiveAwarenessFliterSixStar"),
|
||||
}
|
||||
|
||||
XArchiveConfigs.EvaluateOnForAll = CS.XGame.ClientConfig:GetInt("ArchiveEvaluateOnForAll")
|
||||
|
||||
XArchiveConfigs.OnForAllState = {
|
||||
Off = 0,
|
||||
On = 1,
|
||||
}
|
||||
|
||||
XArchiveConfigs.NpcGridState = {
|
||||
Open = 0,
|
||||
Close = 1,
|
||||
}
|
||||
|
||||
XArchiveConfigs.EmailType = {
|
||||
Email = 1,
|
||||
Communication = 2,
|
||||
}
|
||||
|
||||
XArchiveConfigs.PartnerSettingType = {
|
||||
Setting = 1,
|
||||
Story = 2,
|
||||
}
|
||||
|
||||
XArchiveConfigs.MonsterDetailUiType = {
|
||||
Default = 1, -- 默认图鉴打开
|
||||
Show = 2, -- 只负责显示,屏蔽玩家操作
|
||||
}
|
||||
|
||||
XArchiveConfigs.SpecialData = { --特判数据(仅武器天狼星使用)
|
||||
PayRewardId = 5,
|
||||
Equip = {--天狼星
|
||||
ResonanceCount = 0,
|
||||
Level = 1,
|
||||
Breakthrough = 0,
|
||||
Id = 2026003,
|
||||
},
|
||||
}
|
||||
|
||||
local TABLE_TAG = "Share/Archive/Tag.tab"
|
||||
local TABLE_ARCHIVE = "Share/Archive/Archive.tab"
|
||||
local TABLE_MONSTER = "Share/Archive/Monster.tab"
|
||||
local TABLE_MONSTERINFO = "Share/Archive/MonsterInfo.tab"
|
||||
local TABLE_MONSTERSKILL = "Share/Archive/MonsterSkill.tab"
|
||||
local TABLE_MONSTERSETTING = "Share/Archive/MonsterSetting.tab"
|
||||
local TABLE_SAMENPCGROUP = "Share/Archive/SameNpcGroup.tab"
|
||||
local TABLE_MONSTERNPCDATA = "Client/Archive/MonsterNpcData.tab"
|
||||
local TABLE_AWARENESSSETTING = "Share/Archive/AwarenessSetting.tab"
|
||||
local TABLE_WEAPONSETTING = "Share/Archive/WeaponSetting.tab"
|
||||
local TABLE_MONSTERMODEL_TRANS = "Client/Archive/MonsterModelTrans.tab"
|
||||
local TABLE_MONSTER_EFFECT = "Client/Archive/MonsterEffect.tab"
|
||||
|
||||
local TABLE_STORYGROUP = "Share/Archive/StoryGroup.tab"
|
||||
local TABLE_STORYCHAPTER = "Share/Archive/StoryChapter.tab"
|
||||
local TABLE_STORYDETAIL = "Share/Archive/StoryDetail.tab"
|
||||
|
||||
local TABLE_STORYNPC = "Share/Archive/StoryNpc.tab"
|
||||
local TABLE_STORYNPCSETTING = "Share/Archive/StoryNpcSetting.tab"
|
||||
|
||||
local TABLE_CGDETAIL = "Share/Archive/CGDetail.tab"
|
||||
local TABLE_CGGROUP = "Share/Archive/CGGroup.tab"
|
||||
|
||||
local TABLE_ARCHIVEMAIL = "Share/Archive/ArchiveMail.tab"
|
||||
local TABLE_COMMUNICATION = "Share/Archive/Communication.tab"
|
||||
local TABLE_EVENTDATEGROUP = "Share/Archive/EventDateGroup.tab"
|
||||
|
||||
local TABLE_ARCHIVE_WEAPON_GROUP_PATH = "Client/Archive/ArchiveWeaponGroup.tab"
|
||||
local TABLE_ARCHIVE_AWARENESS_GROUP_PATH = "Client/Archive/ArchiveAwarenessGroup.tab"
|
||||
local TABLE_ARCHIVE_AWARENESS_GROUPTYPE_PATH = "Client/Archive/ArchiveAwarenessGroupType.tab"
|
||||
|
||||
local TABLE_ARCHIVE_PARTNER_SETTING = "Share/Archive/PartnerSetting.tab"
|
||||
local TABLE_ARCHIVE_PARTNER = "Client/Archive/ArchivePartner.tab"
|
||||
local TABLE_ARCHIVE_PARTNER_GROUP = "Client/Archive/ArchivePartnerGroup.tab"
|
||||
|
||||
local TABLE_PVDETAIL = "Share/Archive/PVDetail.tab"
|
||||
local TABLE_PVGROUP = "Client/Archive/PVGroup.tab"
|
||||
|
||||
local TABLE_BIRTHDAYPLOT = "Share/BirthdayPlot/BirthdayPlot.tab"
|
||||
|
||||
local tableSort = table.sort
|
||||
|
||||
local Tags = {}
|
||||
local Archives = {}
|
||||
local Monsters = {}
|
||||
local MonsterInfos = {}
|
||||
local MonsterSkills = {}
|
||||
local MonsterSettings = {}
|
||||
local AwarenessSettings = {}
|
||||
local WeaponSettings = {}
|
||||
local SameNpcGroups = {}
|
||||
local MonsterNpcDatas = {}
|
||||
local MonsterModelTrans = {}
|
||||
local MonsterEffects = {}
|
||||
|
||||
local StoryGroups = {}
|
||||
local StoryChapters = {}
|
||||
local StoryDetails = {}
|
||||
|
||||
local StoryNpc = {}
|
||||
local StoryNpcSetting = {}
|
||||
|
||||
local CGGroups = {}
|
||||
local CGDetails = {}
|
||||
|
||||
local ArchiveMails = {}
|
||||
local ArchiveCommunications = {}
|
||||
local EventDateGroups = {}
|
||||
|
||||
local WeaponGroup = {}
|
||||
local WeaponTemplateIdToSettingListDic = {}
|
||||
local ShowedWeaponTypeList = {}
|
||||
local WeaponTypeToIdsDic = {}
|
||||
local WeaponSumCollectNum = 0
|
||||
|
||||
local AwarenessGroup = {}
|
||||
local AwarenessGroupType = {}
|
||||
local AwarenessShowedStatusDic = {}
|
||||
local AwarenessSumCollectNum = 0
|
||||
local AwarenessTypeToGroupDatasDic = {}
|
||||
local AwarenessSuitIdToSettingListDic = {}
|
||||
|
||||
local ArchiveTagAllList = {}
|
||||
local ArchiveStoryGroupAllList = {}
|
||||
local ArchiveSameNpc = {}
|
||||
local ArchiveMonsterTransDic = {}
|
||||
local ArchiveMonsterEffectDatasDic = {}
|
||||
|
||||
local ArchivePartnerSettings = {}
|
||||
local ArchivePartners = {}
|
||||
local ArchivePartnerGroups = {}
|
||||
|
||||
local PVGroups = {}
|
||||
local PVDetails = {}
|
||||
|
||||
local BirthdayPlot = {}
|
||||
|
||||
function XArchiveConfigs.Init()
|
||||
Tags = XTableManager.ReadByIntKey(TABLE_TAG, XTable.XTableArchiveTag, "Id")
|
||||
Archives = XTableManager.ReadByIntKey(TABLE_ARCHIVE, XTable.XTableArchive, "Id")
|
||||
Monsters = XTableManager.ReadAllByIntKey(TABLE_MONSTER, XTable.XTableArchiveMonster, "Id")
|
||||
MonsterInfos = XTableManager.ReadAllByIntKey(TABLE_MONSTERINFO, XTable.XTableArchiveMonsterInfo, "Id")
|
||||
MonsterSkills = XTableManager.ReadAllByIntKey(TABLE_MONSTERSKILL, XTable.XTableArchiveMonsterSkill, "Id")
|
||||
MonsterSettings = XTableManager.ReadAllByIntKey(TABLE_MONSTERSETTING, XTable.XTableMonsterSetting, "Id")
|
||||
SameNpcGroups = XTableManager.ReadByIntKey(TABLE_SAMENPCGROUP, XTable.XTableSameNpcGroup, "Id")
|
||||
|
||||
MonsterNpcDatas = XTableManager.ReadByIntKey(TABLE_MONSTERNPCDATA, XTable.XTableMonsterNpcData, "Id")
|
||||
MonsterModelTrans = XTableManager.ReadByIntKey(TABLE_MONSTERMODEL_TRANS, XTable.XTableMonsterModelTrans, "Id")
|
||||
MonsterEffects = XTableManager.ReadByIntKey(TABLE_MONSTER_EFFECT, XTable.XTableMonsterEffect, "Id")
|
||||
|
||||
StoryGroups = XTableManager.ReadByIntKey(TABLE_STORYGROUP, XTable.XTableArchiveStoryGroup, "Id")
|
||||
StoryChapters = XTableManager.ReadByIntKey(TABLE_STORYCHAPTER, XTable.XTableArchiveStoryChapter, "Id")
|
||||
StoryDetails = XTableManager.ReadByIntKey(TABLE_STORYDETAIL, XTable.XTableArchiveStoryDetail, "Id")
|
||||
|
||||
StoryNpc = XTableManager.ReadByIntKey(TABLE_STORYNPC, XTable.XTableArchiveStoryNpc, "Id")
|
||||
StoryNpcSetting = XTableManager.ReadByIntKey(TABLE_STORYNPCSETTING, XTable.XTableArchiveStoryNpcSetting, "Id")
|
||||
|
||||
CGGroups = XTableManager.ReadByIntKey(TABLE_CGGROUP, XTable.XTableArchiveCGGroup, "Id")
|
||||
CGDetails = XTableManager.ReadByIntKey(TABLE_CGDETAIL, XTable.XTableArchiveCGDetail, "Id")
|
||||
|
||||
ArchiveMails = XTableManager.ReadByIntKey(TABLE_ARCHIVEMAIL, XTable.XTableArchiveMail, "Id")
|
||||
ArchiveCommunications = XTableManager.ReadByIntKey(TABLE_COMMUNICATION, XTable.XTableArchiveCommunication, "Id")
|
||||
EventDateGroups = XTableManager.ReadByIntKey(TABLE_EVENTDATEGROUP, XTable.XTableArchiveEventDateGroup, "Id")
|
||||
|
||||
WeaponGroup = XTableManager.ReadByIntKey(TABLE_ARCHIVE_WEAPON_GROUP_PATH, XTable.XTableArchiveWeaponGroup, "Id")
|
||||
WeaponSettings = XTableManager.ReadByIntKey(TABLE_WEAPONSETTING, XTable.XTableWeaponSetting, "Id")
|
||||
|
||||
AwarenessGroup = XTableManager.ReadByIntKey(TABLE_ARCHIVE_AWARENESS_GROUP_PATH, XTable.XTableArchiveAwarenessGroup, "Id")
|
||||
AwarenessGroupType = XTableManager.ReadByIntKey(TABLE_ARCHIVE_AWARENESS_GROUPTYPE_PATH, XTable.XTableArchiveAwarenessGroupType, "GroupId")
|
||||
AwarenessSettings = XTableManager.ReadByIntKey(TABLE_AWARENESSSETTING, XTable.XTableAwarenessSetting, "Id")
|
||||
|
||||
ArchivePartnerSettings = XTableManager.ReadByIntKey(TABLE_ARCHIVE_PARTNER_SETTING, XTable.XTablePartnerSetting, "Id")
|
||||
ArchivePartners = XTableManager.ReadByIntKey(TABLE_ARCHIVE_PARTNER, XTable.XTableArchivePartner, "Id")
|
||||
ArchivePartnerGroups = XTableManager.ReadByIntKey(TABLE_ARCHIVE_PARTNER_GROUP, XTable.XTableArchivePartnerGroup, "Id")
|
||||
|
||||
PVGroups = XTableManager.ReadByIntKey(TABLE_PVGROUP, XTable.XTableArchivePVGroup, "Id")
|
||||
PVDetails = XTableManager.ReadByIntKey(TABLE_PVDETAIL, XTable.XTableArchivePVDetail, "Id")
|
||||
|
||||
BirthdayPlot = XTableManager.ReadByIntKey(TABLE_BIRTHDAYPLOT, XTable.XTableBirthdayPlot, "Id")
|
||||
|
||||
XArchiveConfigs.SetArchiveTagAllList()
|
||||
XArchiveConfigs.SetArchiveSameNpc()
|
||||
XArchiveConfigs.SetArchiveMonsterModelTransDic()
|
||||
XArchiveConfigs.SetArchiveMonsterEffectsDic()
|
||||
|
||||
XArchiveConfigs.CreateShowedWeaponTypeList()
|
||||
XArchiveConfigs.CreateWeaponTemplateIdToSettingDataListDic()
|
||||
XArchiveConfigs.SetWeaponSumCollectNum()
|
||||
XArchiveConfigs.CreateWeaponTypeToIdsDic()
|
||||
|
||||
XArchiveConfigs.CreateAwarenessShowedStatusDic()
|
||||
XArchiveConfigs.SetAwarenessSumCollectNum()
|
||||
XArchiveConfigs.CreateAwarenessTypeToGroupDatasDic()
|
||||
XArchiveConfigs.CreateAwarenessSiteToBgPathDic()
|
||||
XArchiveConfigs.CreateAwarenessSuitIdToSettingDataListDic()
|
||||
|
||||
XArchiveConfigs.SetArchiveStoryGroupAllList()
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveConfigById(Id)
|
||||
return Archives[Id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveConfigs()
|
||||
return Archives
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterConfigs()
|
||||
return Monsters
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterConfigById(id)
|
||||
return Monsters[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterInfoConfigs()
|
||||
return MonsterInfos
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterInfoConfigById(id)
|
||||
return MonsterInfos[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterSkillConfigs()
|
||||
return MonsterSkills
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterSkillConfigById(id)
|
||||
return MonsterSkills[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterSettingConfigs()
|
||||
return MonsterSettings
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMonsterSettingConfigById(id)
|
||||
return MonsterSettings[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveTagCfgById(id)
|
||||
return Tags[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveTagAllList()
|
||||
return ArchiveTagAllList
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetSameNpcId(npcId)
|
||||
return ArchiveSameNpc[npcId] and ArchiveSameNpc[npcId] or npcId
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetMonsterTransDataGroup(npcId)
|
||||
return ArchiveMonsterTransDic[npcId]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetMonsterTransDatas(npcId, npcState)
|
||||
local archiveMonsterTransData = ArchiveMonsterTransDic[npcId]
|
||||
return archiveMonsterTransData and archiveMonsterTransData[npcState]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetMonsterEffectDatas(npcId, npcState)
|
||||
local archiveMonsterEffectData = ArchiveMonsterEffectDatasDic[npcId]
|
||||
return archiveMonsterEffectData and archiveMonsterEffectData[npcState]
|
||||
end
|
||||
|
||||
-------------------------------------------------------------
|
||||
function XArchiveConfigs.GetAwarenessSettingById(Id)
|
||||
return AwarenessSettings[Id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSettings()
|
||||
return AwarenessSettings
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessGroupTypes()
|
||||
local list = {}
|
||||
for _, type in pairs(AwarenessGroupType) do
|
||||
table.insert(list, type)
|
||||
end
|
||||
return XArchiveConfigs.SortByOrder(list)
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponSettingById(Id)
|
||||
return WeaponSettings[Id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponSettings()
|
||||
return WeaponSettings
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetMonsterNpcDataById(Id)
|
||||
if not MonsterNpcDatas[Id] then
|
||||
XLog.ErrorTableDataNotFound("XArchiveConfigs.GetMonsterNpcDataById", "配置表项", TABLE_MONSTERNPCDATA, "Id", tostring(Id))
|
||||
end
|
||||
return MonsterNpcDatas[Id] or {}
|
||||
end
|
||||
|
||||
|
||||
-----------------------------怪物图鉴----------------------------
|
||||
function XArchiveConfigs.SetArchiveTagAllList()
|
||||
ArchiveTagAllList = {}
|
||||
for _, tag in pairs(Tags or {}) do
|
||||
for _, groupId in pairs(tag.TagGroupId) do
|
||||
if not ArchiveTagAllList[groupId] then
|
||||
ArchiveTagAllList[groupId] = {}
|
||||
end
|
||||
if tag.IsNotShow == 0 then
|
||||
table.insert(ArchiveTagAllList[groupId], tag)
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, v in pairs(ArchiveTagAllList) do
|
||||
XArchiveConfigs.SortByOrder(v)
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SetArchiveSameNpc()
|
||||
for _, group in pairs(SameNpcGroups or {}) do
|
||||
for _, npcId in pairs(group.NpcId) do
|
||||
ArchiveSameNpc[npcId] = group.Id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SetArchiveMonsterModelTransDic()
|
||||
for _, transData in pairs(MonsterModelTrans or {}) do
|
||||
local archiveMonsterTransData = ArchiveMonsterTransDic[transData.NpcId]
|
||||
if not archiveMonsterTransData then
|
||||
archiveMonsterTransData = {}
|
||||
ArchiveMonsterTransDic[transData.NpcId] = archiveMonsterTransData
|
||||
end
|
||||
|
||||
archiveMonsterTransData[transData.NpcState] = transData
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SetArchiveMonsterEffectsDic()
|
||||
for _, transData in pairs(MonsterEffects or {}) do
|
||||
local archiveMonsterEffectData = ArchiveMonsterEffectDatasDic[transData.NpcId]
|
||||
if not archiveMonsterEffectData then
|
||||
archiveMonsterEffectData = {}
|
||||
ArchiveMonsterEffectDatasDic[transData.NpcId] = archiveMonsterEffectData
|
||||
end
|
||||
|
||||
local archiveMonsterEffect = archiveMonsterEffectData[transData.NpcState]
|
||||
if not archiveMonsterEffect then
|
||||
archiveMonsterEffect = {}
|
||||
archiveMonsterEffectData[transData.NpcState] = archiveMonsterEffect
|
||||
end
|
||||
archiveMonsterEffect[transData.EffectNodeName] = transData.EffectPath
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SortByOrder(list)
|
||||
tableSort(list, function(a, b)
|
||||
if a.Order then
|
||||
if a.Order == b.Order then
|
||||
return a.Id > b.Id
|
||||
else
|
||||
return a.Order < b.Order
|
||||
end
|
||||
else
|
||||
if a:GetOrder() == b:GetOrder() then
|
||||
return a:GetId() > b:GetId()
|
||||
else
|
||||
return a:GetOrder() < b:GetOrder()
|
||||
end
|
||||
end
|
||||
end)
|
||||
return list
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetMonsterRealName(id)
|
||||
local name = XArchiveConfigs.GetMonsterNpcDataById(id).Name
|
||||
if not name then
|
||||
XLog.ErrorTableDataNotFound("XArchiveConfigs.GetMonsterRealName", "配置表项中的Name字段", TABLE_MONSTERNPCDATA, "id", tostring(id))
|
||||
return ""
|
||||
end
|
||||
return name
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetMonsterModel(id)
|
||||
return XArchiveConfigs.GetMonsterNpcDataById(id).ModelId
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetCountUnitChange(count)
|
||||
local newCount = count
|
||||
if count >= 1000 then
|
||||
newCount = count / 1000
|
||||
else
|
||||
return newCount
|
||||
end
|
||||
local a, b = math.modf(newCount)
|
||||
return b >= 0.05 and string.format("%.1fk", newCount) or string.format("%dk", a)
|
||||
end
|
||||
|
||||
-- 武器、意识相关------------->>>
|
||||
function XArchiveConfigs.CreateShowedWeaponTypeList()
|
||||
for _, group in pairs(WeaponGroup) do
|
||||
table.insert(ShowedWeaponTypeList, group.Id)
|
||||
end
|
||||
|
||||
table.sort(ShowedWeaponTypeList, function(aType, bType)
|
||||
local aData = XArchiveConfigs.GetWeaponGroupByType(aType)
|
||||
local bData = XArchiveConfigs.GetWeaponGroupByType(bType)
|
||||
return aData.Order < bData.Order
|
||||
end)
|
||||
end
|
||||
|
||||
function XArchiveConfigs.CreateWeaponTemplateIdToSettingDataListDic()
|
||||
local equipId
|
||||
for _, settingData in pairs(WeaponSettings) do
|
||||
equipId = settingData.EquipId
|
||||
WeaponTemplateIdToSettingListDic[equipId] = WeaponTemplateIdToSettingListDic[equipId] or {}
|
||||
table.insert(WeaponTemplateIdToSettingListDic[equipId], settingData)
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SetWeaponSumCollectNum()
|
||||
for _, _ in pairs(WeaponTemplateIdToSettingListDic) do
|
||||
WeaponSumCollectNum = WeaponSumCollectNum + 1
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.CreateWeaponTypeToIdsDic()
|
||||
for type, _ in pairs(WeaponGroup) do
|
||||
WeaponTypeToIdsDic[type] = {}
|
||||
end
|
||||
|
||||
local templateData
|
||||
local equipType
|
||||
for templateId, _ in pairs(WeaponTemplateIdToSettingListDic) do
|
||||
templateData = XEquipConfig.GetEquipCfg(templateId)
|
||||
equipType = templateData.Type
|
||||
if WeaponTypeToIdsDic[equipType] then
|
||||
table.insert(WeaponTypeToIdsDic[equipType], templateId)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.CreateAwarenessShowedStatusDic()
|
||||
local templateIdList
|
||||
for suitId, _ in pairs(AwarenessGroup) do
|
||||
templateIdList = XEquipConfig.GetEquipTemplateIdsBySuitId(suitId)
|
||||
for _, templateId in ipairs(templateIdList) do
|
||||
AwarenessShowedStatusDic[templateId] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SetAwarenessSumCollectNum()
|
||||
for _, _ in pairs(AwarenessShowedStatusDic) do
|
||||
AwarenessSumCollectNum = AwarenessSumCollectNum + 1
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.CreateAwarenessTypeToGroupDatasDic()
|
||||
for _, type in pairs(AwarenessGroupType) do
|
||||
AwarenessTypeToGroupDatasDic[type.GroupId] = {}
|
||||
end
|
||||
|
||||
local groupType
|
||||
for _, groupData in pairs(AwarenessGroup) do
|
||||
groupType = groupData.Type
|
||||
if AwarenessTypeToGroupDatasDic[groupType] then
|
||||
table.insert(AwarenessTypeToGroupDatasDic[groupType], groupData)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.CreateAwarenessSiteToBgPathDic()
|
||||
XArchiveConfigs.SiteToBgPath = {
|
||||
[XEquipConfig.EquipSite.Awareness.One] = CS.XGame.ClientConfig:GetString("ArchiveAwarenessSiteBgPath1"),
|
||||
[XEquipConfig.EquipSite.Awareness.Two] = CS.XGame.ClientConfig:GetString("ArchiveAwarenessSiteBgPath2"),
|
||||
[XEquipConfig.EquipSite.Awareness.Three] = CS.XGame.ClientConfig:GetString("ArchiveAwarenessSiteBgPath3"),
|
||||
[XEquipConfig.EquipSite.Awareness.Four] = CS.XGame.ClientConfig:GetString("ArchiveAwarenessSiteBgPath4"),
|
||||
[XEquipConfig.EquipSite.Awareness.Five] = CS.XGame.ClientConfig:GetString("ArchiveAwarenessSiteBgPath5"),
|
||||
[XEquipConfig.EquipSite.Awareness.Six] = CS.XGame.ClientConfig:GetString("ArchiveAwarenessSiteBgPath6"),
|
||||
}
|
||||
end
|
||||
|
||||
function XArchiveConfigs.CreateAwarenessSuitIdToSettingDataListDic()
|
||||
local suitId
|
||||
for _, settingData in pairs(AwarenessSettings) do
|
||||
suitId = settingData.SuitId
|
||||
AwarenessSuitIdToSettingListDic[suitId] = AwarenessSuitIdToSettingListDic[suitId] or {}
|
||||
table.insert(AwarenessSuitIdToSettingListDic[suitId], settingData)
|
||||
end
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponSumCollectNum()
|
||||
return WeaponSumCollectNum
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponGroup()
|
||||
return WeaponGroup
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponGroupByType(type)
|
||||
return WeaponGroup[type]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponGroupName(type)
|
||||
return WeaponGroup[type].GroupName
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetShowedWeaponTypeList()
|
||||
return ShowedWeaponTypeList
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponTypeToIdsDic()
|
||||
return WeaponTypeToIdsDic
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponTemplateIdListByType(type)
|
||||
return WeaponTypeToIdsDic[type]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSumCollectNum()
|
||||
return AwarenessSumCollectNum
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessGroup()
|
||||
return AwarenessGroup
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessTypeToGroupDatasDic()
|
||||
return AwarenessTypeToGroupDatasDic
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessShowedStatusDic()
|
||||
return AwarenessShowedStatusDic
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSuitInfoTemplate(suitId)
|
||||
return AwarenessGroup[suitId]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSuitInfoGetType(suitId)
|
||||
return AwarenessGroup[suitId].Type
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSuitInfoIconPath(suitId)
|
||||
return AwarenessGroup[suitId].IconPath
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponTemplateIdToSettingListDic()
|
||||
return WeaponTemplateIdToSettingListDic
|
||||
end
|
||||
|
||||
-- 武器设定或故事
|
||||
function XArchiveConfigs.GetWeaponSettingList(id, settingType)
|
||||
local list = {}
|
||||
local settingDataList = WeaponTemplateIdToSettingListDic[id]
|
||||
if settingDataList then
|
||||
if not settingType or settingType == XArchiveConfigs.SettingType.All then
|
||||
list = settingDataList
|
||||
else
|
||||
for _, settingData in pairs(settingDataList) do
|
||||
if settingData.Type == settingType then
|
||||
table.insert(list, settingData)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
return XArchiveConfigs.SortByOrder(list)
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponSettingType(id)
|
||||
return WeaponSettings[id].Type
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetWeaponTemplateIdBySettingId(id)
|
||||
return WeaponSettings[id].EquipId
|
||||
end
|
||||
|
||||
-- 意识设定或故事
|
||||
function XArchiveConfigs.GetAwarenessSettingList(id, settingType)
|
||||
local list = {}
|
||||
local settingDataList = AwarenessSuitIdToSettingListDic[id]
|
||||
if settingDataList then
|
||||
if not settingType or settingType == XArchiveConfigs.SettingType.All then
|
||||
list = settingDataList
|
||||
else
|
||||
for _, settingData in pairs(settingDataList) do
|
||||
if settingData.Type == settingType then
|
||||
table.insert(list, settingData)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
XLog.ErrorTableDataNotFound("XArchiveConfigs.GetAwarenessSettingList", "配置表项", TABLE_AWARENESSSETTING, "id", tostring(id))
|
||||
end
|
||||
return XArchiveConfigs.SortByOrder(list)
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSettingType(id)
|
||||
return AwarenessSettings[id].Type
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetAwarenessSuitIdBySettingId(id)
|
||||
return AwarenessSettings[id].SuitId
|
||||
end
|
||||
|
||||
-- 武器、意识相关-------------<<<
|
||||
-- 剧情相关------------->>>
|
||||
function XArchiveConfigs.GetArchiveStoryGroupAllList()
|
||||
return ArchiveStoryGroupAllList
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryChapterConfigs()
|
||||
return StoryChapters
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryChapterConfigById(id)
|
||||
return StoryChapters[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryDetailConfigs()
|
||||
return StoryDetails
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryDetailConfigById(id)
|
||||
return StoryDetails[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.SetArchiveStoryGroupAllList()
|
||||
for _, group in pairs(StoryGroups or {}) do
|
||||
table.insert(ArchiveStoryGroupAllList, group)
|
||||
end
|
||||
XArchiveConfigs.SortByOrder(ArchiveStoryGroupAllList)
|
||||
end
|
||||
-- 剧情相关-------------<<<
|
||||
-- NPC相关------------->>>
|
||||
function XArchiveConfigs.GetArchiveStoryNpcConfigs()
|
||||
return StoryNpc
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryNpcConfigById(id)
|
||||
return StoryNpc[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryNpcSettingConfigs()
|
||||
return StoryNpcSetting
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveStoryNpcSettingConfigById(id)
|
||||
return StoryNpcSetting[id]
|
||||
end
|
||||
-- NPC相关-------------<<<
|
||||
-- CG相关------------->>>
|
||||
function XArchiveConfigs.GetArchiveCGGroupConfigs()
|
||||
return CGGroups
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveCGDetailConfigs()
|
||||
return CGDetails
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveCGDetailConfigById(id)
|
||||
return CGDetails[id]
|
||||
end
|
||||
|
||||
-- CG相关-------------<<<
|
||||
-- 邮件通讯相关------------->>>
|
||||
function XArchiveConfigs.GetArchiveMailsConfigs()
|
||||
return ArchiveMails
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveMailsConfigById(id)
|
||||
return ArchiveMails[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveCommunicationsConfigs()
|
||||
return ArchiveCommunications
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetArchiveCommunicationsConfigById(id)
|
||||
return ArchiveCommunications[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetEventDateGroupsConfigs()
|
||||
return EventDateGroups
|
||||
end
|
||||
|
||||
-- 邮件通讯相关-------------<<<
|
||||
-- 伙伴相关------------->>>
|
||||
function XArchiveConfigs.GetPartnerSettingConfigs()
|
||||
return ArchivePartnerSettings
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPartnerSettingConfigById(id)
|
||||
if not ArchivePartnerSettings[id] then
|
||||
XLog.Error("Id is not exist in " .. TABLE_ARCHIVE_PARTNER_SETTING .. " id = " .. id)
|
||||
return
|
||||
end
|
||||
return ArchivePartnerSettings[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPartnerConfigs()
|
||||
return ArchivePartners
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPartnerConfigById(id)
|
||||
if not ArchivePartners[id] then
|
||||
XLog.Error("Id is not exist in " .. TABLE_ARCHIVE_PARTNER .. " id = " .. id)
|
||||
return
|
||||
end
|
||||
return ArchivePartners[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPartnerGroupConfigs()
|
||||
return ArchivePartnerGroups
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPartnerGroupConfigById(id)
|
||||
if not ArchivePartnerGroups[id] then
|
||||
XLog.Error("Id is not exist in " .. TABLE_ARCHIVE_PARTNER_GROUP .. " id = " .. id)
|
||||
return
|
||||
end
|
||||
return ArchivePartnerGroups[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetBirthdayPlotConfigById(id)
|
||||
if not BirthdayPlot[id] then
|
||||
XLog.Error("Id is not exist in " .. TABLE_BIRTHDAYPLOT .. " id = " .. id)
|
||||
return
|
||||
end
|
||||
return BirthdayPlot[id]
|
||||
end
|
||||
|
||||
-- 伙伴相关-------------<<<
|
||||
function XArchiveConfigs.GetWeaponSettingPath()
|
||||
return TABLE_WEAPONSETTING
|
||||
end
|
||||
|
||||
-- PV相关------------->>>
|
||||
function XArchiveConfigs.GetPVGroups()
|
||||
local list = {}
|
||||
for _, group in pairs(PVGroups) do
|
||||
table.insert(list, group)
|
||||
end
|
||||
return XArchiveConfigs.SortByOrder(list)
|
||||
end
|
||||
|
||||
local IsInitPVDetail = false
|
||||
local PVGroupIdToDetailIdList = {}
|
||||
local PVDetailIdList = {}
|
||||
local InitPVDetail = function()
|
||||
if IsInitPVDetail then
|
||||
return
|
||||
end
|
||||
|
||||
for id, v in pairs(PVDetails) do
|
||||
if not PVGroupIdToDetailIdList[v.GroupId] then
|
||||
PVGroupIdToDetailIdList[v.GroupId] = {}
|
||||
end
|
||||
table.insert(PVGroupIdToDetailIdList[v.GroupId], id)
|
||||
table.insert(PVDetailIdList, id)
|
||||
end
|
||||
for _, idList in pairs(PVGroupIdToDetailIdList) do
|
||||
tableSort(idList, function(a, b)
|
||||
return a < b
|
||||
end)
|
||||
end
|
||||
|
||||
IsInitPVDetail = true
|
||||
end
|
||||
|
||||
local GetPVDetailConfig = function(id)
|
||||
if not PVDetails[id] then
|
||||
XLog.Error("Id is not exist in " .. TABLE_PVDETAIL .. " id = " .. id)
|
||||
return
|
||||
end
|
||||
return PVDetails[id]
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailIdList(groupId)
|
||||
InitPVDetail()
|
||||
return groupId and PVGroupIdToDetailIdList[groupId] or PVDetailIdList
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailName(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailBg(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.Bg
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailLockBg(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.LockBg
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailUnLockTime(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.UnLockTime
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailCondition(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.Condition
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailPv(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.Pv
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailIsShowRedPoint(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.IsShowRed
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailBgWidth(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.BgWidth
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailBgHigh(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.BgHigh
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailBgOffSetX(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.BgOffSetX
|
||||
end
|
||||
|
||||
function XArchiveConfigs.GetPVDetailBgOffSetY(id)
|
||||
local config = GetPVDetailConfig(id)
|
||||
return config.BgOffSetY
|
||||
end
|
||||
-- PV相关-------------<<<
|
866
Script/matrix/xconfig/XAreaWarConfigs.lua
Normal file
866
Script/matrix/xconfig/XAreaWarConfigs.lua
Normal file
|
@ -0,0 +1,866 @@
|
|||
local tonumber = tonumber
|
||||
local tableInsert = table.insert
|
||||
local tableSort = table.sort
|
||||
local ipairs = ipairs
|
||||
local pairs = pairs
|
||||
local CSXTextManagerGetText = CS.XTextManager.GetText
|
||||
|
||||
XAreaWarConfigs = XAreaWarConfigs or {}
|
||||
|
||||
-----------------活动相关 begin-----------------
|
||||
local TABLE_ACITIVTY_PATH = "Share/AreaWar/AreaWarActivity.tab"
|
||||
|
||||
local ActivityConfig = {}
|
||||
|
||||
local function InitActivityConfig()
|
||||
ActivityConfig = XTableManager.ReadByIntKey(TABLE_ACITIVTY_PATH, XTable.XTableAreaWarActivity, "Id")
|
||||
end
|
||||
|
||||
local function GetActivityConfig(activityId)
|
||||
local config = ActivityConfig[activityId]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetActivityConfig error:配置不存在, activityId:" ..
|
||||
activityId .. ",path: " .. TABLE_ACITIVTY_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetActivityTimeId(activityId)
|
||||
local config = GetActivityConfig(activityId)
|
||||
return config.TimeId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetDefaultActivityId()
|
||||
local defaultActivityId = 0
|
||||
for activityId, config in pairs(ActivityConfig) do
|
||||
defaultActivityId = activityId
|
||||
if XTool.IsNumberValid(config.TimeId) and XFunctionManager.CheckInTimeByTimeId(config.TimeId) then
|
||||
break
|
||||
end
|
||||
end
|
||||
return defaultActivityId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityStartTime(activityId)
|
||||
local config = GetActivityConfig(activityId)
|
||||
return XFunctionManager.GetStartTimeByTimeId(GetActivityTimeId(activityId))
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityEndTime(activityId)
|
||||
return XFunctionManager.GetEndTimeByTimeId(GetActivityTimeId(activityId))
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityTimeLimitTaskIds(activityId)
|
||||
local taskIds = {}
|
||||
local config = GetActivityConfig(activityId)
|
||||
for _, taskId in ipairs(config.TimeLimitTaskId) do
|
||||
if XTool.IsNumberValid(taskId) then
|
||||
tableInsert(taskIds, taskId)
|
||||
end
|
||||
end
|
||||
return taskIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityShopIds(activityId)
|
||||
local shopIds = {}
|
||||
local config = GetActivityConfig(activityId)
|
||||
for _, shopId in ipairs(config.ShopId) do
|
||||
if XTool.IsNumberValid(shopId) then
|
||||
tableInsert(shopIds, shopId)
|
||||
end
|
||||
end
|
||||
return shopIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityTimeLimitTaskId(activityId, index)
|
||||
local config = GetActivityConfig(activityId)
|
||||
return config.TimeLimitTaskId[index] or 0
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityBanner(activityId)
|
||||
local config = GetActivityConfig(activityId)
|
||||
return config.ActivityBanner or ""
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetActivityName(activityId)
|
||||
local config = GetActivityConfig(activityId)
|
||||
return config.Name or ""
|
||||
end
|
||||
-----------------活动相关 end-------------------
|
||||
-----------------区域相关 begin-------------------
|
||||
local TABLE_AREA_PATH = "Client/AreaWar/AreaWarArea.tab"
|
||||
|
||||
local AreaConfig = {}
|
||||
|
||||
XAreaWarConfigs.Difficult = {
|
||||
Normal = 1,
|
||||
Hard = 2
|
||||
}
|
||||
|
||||
local function InitAreaConfig()
|
||||
AreaConfig = XTableManager.ReadByIntKey(TABLE_AREA_PATH, XTable.XTableAreaWarArea, "Id")
|
||||
end
|
||||
|
||||
local function GetAreaConfig(areaId)
|
||||
local config = AreaConfig[areaId]
|
||||
if not config then
|
||||
XLog.Error("XAreaWarConfigs GetAreaConfig error:配置不存在, areaId:" .. areaId .. ",path: " .. TABLE_AREA_PATH)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllAreaIds()
|
||||
local areaIds = {}
|
||||
for areaId in ipairs(AreaConfig) do
|
||||
tableInsert(areaIds, areaId)
|
||||
end
|
||||
return areaIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAreaUnlockBlockId(areaId)
|
||||
local config = GetAreaConfig(areaId)
|
||||
return config.UnlockBlockId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAreaName(areaId)
|
||||
local config = GetAreaConfig(areaId)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAreaBlockIds(areaId)
|
||||
local blockIds = {}
|
||||
local config = GetAreaConfig(areaId)
|
||||
for _, blockId in ipairs(config.BlockId) do
|
||||
if XTool.IsNumberValid(blockId) then
|
||||
tableInsert(blockIds, blockId)
|
||||
end
|
||||
end
|
||||
return blockIds
|
||||
end
|
||||
|
||||
--获取指定区块所属区域Id
|
||||
function XAreaWarConfigs.GetBlockAreaId(blockId)
|
||||
for areaId, config in pairs(AreaConfig) do
|
||||
for _, inBlockId in pairs(config.BlockId) do
|
||||
if inBlockId == blockId then
|
||||
return areaId
|
||||
end
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--获取指定区域内世界Boss的Ui类型(不同区域使用不同的UI)
|
||||
function XAreaWarConfigs.GetAreaWorldBossUiType(areaId)
|
||||
local config = GetAreaConfig(areaId)
|
||||
return config.WorldBossUiType
|
||||
end
|
||||
-----------------区域相关 end-------------------
|
||||
-----------------区块相关 begin-------------------
|
||||
local TABLE_BLOCK_PATH = "Share/AreaWar/AreaWarBlock.tab"
|
||||
local TABLE_BLOCK_SHOW_TYPE_PATH = "Client/AreaWar/AreaWarBlockShowType.tab"
|
||||
local TABLE_WORLD_BOSS_UI_PATH = "Client/AreaWar/AreaWarWorldBossUi.tab"
|
||||
|
||||
local BlockConfig = {}
|
||||
local BlockShowTypeConfig = {}
|
||||
local WorldBossUiConfig = {}
|
||||
|
||||
--区块类型
|
||||
XAreaWarConfigs.BlockType = {
|
||||
Init = 1, --初始区块
|
||||
Normal = 2, --常规区块
|
||||
WorldBoss = 3, --世界BOSS区块
|
||||
Mystery = 4 --神秘区块
|
||||
}
|
||||
|
||||
--区块展示类型
|
||||
XAreaWarConfigs.BlockShowType = {
|
||||
Init = 1, --初始区块
|
||||
NormalExplore = 2, --常规区块(探索)
|
||||
WorldBoss = 3, --世界Boss区块
|
||||
Mystery = 4, --神秘区块
|
||||
NormalBox = 5, --常规区块(宝箱)
|
||||
NormalCharacter = 6, --常规区块(角色特攻)
|
||||
NormalPurify = 7, --常规区块(净化加成)
|
||||
NormalBeacon = 8, --常规区块(灯塔)
|
||||
NormalBoss = 9 --常规区块(Boss)
|
||||
}
|
||||
|
||||
--世界BossUI类型
|
||||
XAreaWarConfigs.WorldBossUiType = {
|
||||
Normal = 1,
|
||||
Special = 2
|
||||
}
|
||||
|
||||
local function InitBlockConfig()
|
||||
BlockConfig = XTableManager.ReadByIntKey(TABLE_BLOCK_PATH, XTable.XTableAreaWarBlock, "Id")
|
||||
BlockShowTypeConfig =
|
||||
XTableManager.ReadByIntKey(TABLE_BLOCK_SHOW_TYPE_PATH, XTable.XTableAreaWarBlockShowType, "Id")
|
||||
WorldBossUiConfig = XTableManager.ReadByIntKey(TABLE_WORLD_BOSS_UI_PATH, XTable.XTableAreaWarWorldBossUi, "Id")
|
||||
end
|
||||
|
||||
local function GetBlockConfig(blockId)
|
||||
local config = BlockConfig[blockId]
|
||||
if not config then
|
||||
XLog.Error("XAreaWarConfigs GetBlockConfig error:配置不存在, blockId:" .. blockId .. ",path: " .. TABLE_BLOCK_PATH)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetBlockShowTypeConfig(showType)
|
||||
local config = BlockShowTypeConfig[showType]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetBlockShowTypeConfig error:配置不存在, showType:" ..
|
||||
showType .. ",path: " .. TABLE_BLOCK_SHOW_TYPE_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetWorldBossUiConfig(uiType)
|
||||
local config = WorldBossUiConfig[uiType]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetWorldBossUiConfig error:配置不存在, uiType:" ..
|
||||
uiType .. ",path: " .. TABLE_WORLD_BOSS_UI_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllBlockIds()
|
||||
local blockIds = {}
|
||||
for blockId in pairs(BlockConfig) do
|
||||
if XTool.IsNumberValid(blockId) then
|
||||
tableInsert(blockIds, blockId)
|
||||
end
|
||||
end
|
||||
return blockIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockIdByStageId(stageId)
|
||||
for blockId, config in pairs(BlockConfig) do
|
||||
if config.StageId == stageId then
|
||||
return blockId
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllBlockStageIds()
|
||||
local stageIds = {}
|
||||
for _, config in pairs(BlockConfig) do
|
||||
if XTool.IsNumberValid(config.StageId) then
|
||||
tableInsert(stageIds, config.StageId)
|
||||
end
|
||||
end
|
||||
return stageIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockRequirePurification(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.CleanNeed
|
||||
end
|
||||
|
||||
--获取前置区块Ids可选列表
|
||||
function XAreaWarConfigs.GetBlockPreBlockIdsAlternativeList(blockId)
|
||||
local alternativeList = {}
|
||||
local config = GetBlockConfig(blockId)
|
||||
for _, preBlockIdStr in pairs(config.PreBlockId) do
|
||||
local result = string.Split(preBlockIdStr)
|
||||
for index, str in pairs(result) do
|
||||
result[index] = tonumber(str)
|
||||
end
|
||||
tableInsert(alternativeList, result)
|
||||
end
|
||||
return alternativeList
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockName(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.Name or ""
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockNameEn(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.NameEn or ""
|
||||
end
|
||||
|
||||
--是否是初始区块
|
||||
function XAreaWarConfigs.IsInitBlock(blockId)
|
||||
return XAreaWarConfigs.GetBlockType(blockId) == XAreaWarConfigs.BlockType.Init
|
||||
end
|
||||
|
||||
--获取区块实际类型(服务端)
|
||||
function XAreaWarConfigs.GetBlockType(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.Type
|
||||
end
|
||||
|
||||
--获取区块展示类型
|
||||
function XAreaWarConfigs.GetBlockShowType(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.ShowType
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.CheckBlockShowType(blockId, showType)
|
||||
return XAreaWarConfigs.GetBlockShowType(blockId) == showType
|
||||
end
|
||||
|
||||
--活动开启后多少秒区块开启
|
||||
function XAreaWarConfigs.GetBlockOpenSeconds(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.OpenHour * 3600
|
||||
end
|
||||
|
||||
--世界Boss在区块开放后一天几点开启/关闭
|
||||
function XAreaWarConfigs.GetBlockWorldBossHour(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.WorldBossStartHour, config.WorldBossEndHour
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockShowRewardId(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.ShowRewardId
|
||||
end
|
||||
|
||||
--获取区块作战消耗活动体力
|
||||
function XAreaWarConfigs.GetBlockActionPoint(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.ActionPoint
|
||||
end
|
||||
|
||||
--获取区块派遣消耗活动体力
|
||||
function XAreaWarConfigs.GetBlockDetachActionPoint(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.DetachActionPoint
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockStageId(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.StageId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockMovieId(blockId)
|
||||
local config = GetBlockConfig(blockId)
|
||||
return config.MovieId
|
||||
end
|
||||
|
||||
--派遣基础奖励
|
||||
function XAreaWarConfigs.GetBlockDetachBasicRewardItems(blockId)
|
||||
local rewardItems = {}
|
||||
local config = GetBlockConfig(blockId)
|
||||
local rewardId = config.DetachBasicRewardId
|
||||
if XTool.IsNumberValid(rewardId) then
|
||||
rewardItems = XRewardManager.GetRewardList(rewardId)
|
||||
end
|
||||
return XRewardManager.MergeAndSortRewardGoodsList(rewardItems)
|
||||
end
|
||||
|
||||
--派遣满足条件额外奖励
|
||||
function XAreaWarConfigs.GetBlockDetachDetachExtraRewardItems(blockId, index)
|
||||
local rewardItems = {}
|
||||
local config = GetBlockConfig(blockId)
|
||||
local rewardId = config.DetachExtraRewardId[index]
|
||||
if XTool.IsNumberValid(rewardId) then
|
||||
rewardItems = XRewardManager.GetRewardList(rewardId)
|
||||
end
|
||||
return XRewardManager.MergeAndSortRewardGoodsList(rewardItems)
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllBlockShowTypes()
|
||||
local showTypes = {}
|
||||
for showType in pairs(BlockShowTypeConfig) do
|
||||
tableInsert(showTypes, showType)
|
||||
end
|
||||
return showTypes
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockShowTypeName(showType)
|
||||
local config = GetBlockShowTypeConfig(showType)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
--获取区块类型小图标
|
||||
function XAreaWarConfigs.GetBlockShowTypeIconByBlockId(blockId)
|
||||
local showType = XAreaWarConfigs.GetBlockShowType(blockId)
|
||||
return XAreaWarConfigs.GetBlockShowTypeIcon(showType)
|
||||
end
|
||||
|
||||
--获取区块类型关卡详情背景
|
||||
function XAreaWarConfigs.GetBlockShowTypeStageBgByBlockId(blockId)
|
||||
local showType = XAreaWarConfigs.GetBlockShowType(blockId)
|
||||
return XAreaWarConfigs.GetBlockShowTypeStageBg(showType)
|
||||
end
|
||||
|
||||
--获取区块类型格子预制体路径
|
||||
function XAreaWarConfigs.GetBlockShowTypePrefab(blockId)
|
||||
local showType = XAreaWarConfigs.GetBlockShowType(blockId)
|
||||
local config = GetBlockShowTypeConfig(showType)
|
||||
return config.Prefab
|
||||
end
|
||||
|
||||
--获取区块类型为常规区块(角色特攻)时对应的特攻角色小头像图标
|
||||
function XAreaWarConfigs.GetRoleBlockIcon(blockId)
|
||||
local roleId = XAreaWarConfigs.GetUnlockSpecialRoleIdByBlockId(blockId)
|
||||
return XAreaWarConfigs.GetBlockSpecialRoleIcon(roleId)
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetWorldBossUiName(uiType)
|
||||
local config = GetWorldBossUiConfig(uiType)
|
||||
return config.UiName
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockShowTypeIcon(showType)
|
||||
local config = GetBlockShowTypeConfig(showType)
|
||||
return config.Icon
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBlockShowTypeStageBg(showType)
|
||||
local config = GetBlockShowTypeConfig(showType)
|
||||
return config.StageDetailBg
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetWorldBossUiTitleIcon(uiType)
|
||||
local config = GetWorldBossUiConfig(uiType)
|
||||
return config.TitleIcon
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetWorldBossUiHeadName(uiType)
|
||||
local config = GetWorldBossUiConfig(uiType)
|
||||
return config.HeadName
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetWorldBossUiHeadIcon(uiType)
|
||||
local config = GetWorldBossUiConfig(uiType)
|
||||
return config.HeadIcon
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetWorldBossRankTitle(uiType)
|
||||
local config = GetWorldBossUiConfig(uiType)
|
||||
return config.RankTitle
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetWorldBossUiModelIdDic(uiType)
|
||||
local modelIds = {}
|
||||
local config = GetWorldBossUiConfig(uiType)
|
||||
for index, modelId in pairs(config.ModelId) do
|
||||
if XTool.IsNumberValid(modelId) then
|
||||
modelIds[index] = modelId
|
||||
end
|
||||
end
|
||||
return modelIds
|
||||
end
|
||||
|
||||
--获取世界Boss区块Ui名称
|
||||
function XAreaWarConfigs.GetBlockWorldBossUiName(blockId)
|
||||
local areaId = XAreaWarConfigs.GetBlockAreaId(blockId)
|
||||
local uiType = XAreaWarConfigs.GetAreaWorldBossUiType(areaId)
|
||||
return XAreaWarConfigs.GetWorldBossUiName(uiType)
|
||||
end
|
||||
|
||||
--获取世界Boss区块排行榜
|
||||
function XAreaWarConfigs.GetBlockWorldBossRankTitle(blockId)
|
||||
local areaId = XAreaWarConfigs.GetBlockAreaId(blockId)
|
||||
local uiType = XAreaWarConfigs.GetAreaWorldBossUiType(areaId)
|
||||
return XAreaWarConfigs.GetWorldBossRankTitle(uiType)
|
||||
end
|
||||
-----------------区块相关 end-------------------
|
||||
-----------------派遣相关 begin-------------------
|
||||
local TABLE_DISPATCH_CHARACTER_PATH = "Share/AreaWar/AreaWarDetachRole.tab"
|
||||
local TABLE_DISPATCH_CONDITION_PATH = "Share/AreaWar/AreaWarDetachCondition.tab"
|
||||
|
||||
local DispatchCharacterConfig = {}
|
||||
local DispatchConditionConfig = {}
|
||||
|
||||
local function InitDispatchConfig()
|
||||
DispatchCharacterConfig =
|
||||
XTableManager.ReadByIntKey(TABLE_DISPATCH_CHARACTER_PATH, XTable.XTableAreaWarDetachRole, "Id")
|
||||
DispatchConditionConfig =
|
||||
XTableManager.ReadByIntKey(TABLE_DISPATCH_CONDITION_PATH, XTable.XTableAreaWarDetachCondition, "Id")
|
||||
end
|
||||
|
||||
local function GetDispatchCharacterConfig(characterId)
|
||||
local config = DispatchCharacterConfig[characterId]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetDispatchCharacterConfig error:配置不存在, characterId:" ..
|
||||
characterId .. ",path: " .. TABLE_DISPATCH_CHARACTER_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetDispatchConditionConfig(conditionId)
|
||||
local config = DispatchConditionConfig[conditionId]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetDispatchConditionConfig error:配置不存在, conditionId:" ..
|
||||
conditionId .. ",path: " .. TABLE_DISPATCH_CONDITION_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
--获取指定派遣成员/机器人Id列表对应满足的所有条件检查表
|
||||
function XAreaWarConfigs.GetDispatchCharacterCondtionIdCheckDic(entityIds)
|
||||
local conditionIdCheckDic = {}
|
||||
for _, entityId in pairs(entityIds or {}) do
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
if XTool.IsNumberValid(characterId) then
|
||||
local config = GetDispatchCharacterConfig(characterId)
|
||||
for _, conditionId in pairs(config.DetachCondition) do
|
||||
conditionIdCheckDic[conditionId] = conditionId
|
||||
end
|
||||
end
|
||||
end
|
||||
return conditionIdCheckDic
|
||||
end
|
||||
|
||||
--获取指定派遣成员/机器人Id列表对应满足的所有条件检查表
|
||||
function XAreaWarConfigs.GetDispatchCharacterCondtionIds(entityId)
|
||||
local conditionIds = {}
|
||||
local characterId = XEntityHelper.GetCharacterIdByEntityId(entityId)
|
||||
if XTool.IsNumberValid(characterId) then
|
||||
local config = GetDispatchCharacterConfig(characterId)
|
||||
for _, conditionId in ipairs(config.DetachCondition) do
|
||||
tableInsert(conditionIds, conditionId)
|
||||
end
|
||||
end
|
||||
return conditionIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetDispatchConditionDesc(conditionId)
|
||||
local config = GetDispatchConditionConfig(conditionId)
|
||||
return config.Desc
|
||||
end
|
||||
-----------------派遣相关 end-------------------
|
||||
-----------------BUFF相关 begin-------------------
|
||||
local TABLE_BUFF_PATH = "Share/AreaWar/AreaWarBuff.tab"
|
||||
|
||||
local BuffConfig = {}
|
||||
|
||||
local function InitBuffConfig()
|
||||
BuffConfig = XTableManager.ReadByIntKey(TABLE_BUFF_PATH, XTable.XTableAreaWarBuff, "Id")
|
||||
end
|
||||
|
||||
local function GetBuffConfig(buffId)
|
||||
local config = BuffConfig[buffId]
|
||||
if not config then
|
||||
XLog.Error("XAreaWarConfigs GetBuffConfig error:配置不存在, buffId:" .. buffId .. ",path: " .. TABLE_BUFF_PATH)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBuffName(buffId)
|
||||
local config = GetBuffConfig(buffId)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBuffDesc(buffId)
|
||||
local config = GetBuffConfig(buffId)
|
||||
return config.Desc
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetBuffIcon(buffId)
|
||||
local config = GetBuffConfig(buffId)
|
||||
return config.Icon
|
||||
end
|
||||
-----------------BUFF相关 end-------------------
|
||||
-----------------特攻角色 begin-------------------
|
||||
local TABLE_SPECIAL_ROLE_PATH = "Share/AreaWar/AreaWarSpecialRole.tab"
|
||||
local TABLE_SPECIAL_ROLE_REWARD_PATH = "Share/AreaWar/AreaWarSpecialRoleReward.tab"
|
||||
|
||||
local SpecialRoleConfig = {}
|
||||
local SpecialRoleRewardConfig = {}
|
||||
|
||||
local function InitSpecialRoleConfig()
|
||||
SpecialRoleConfig = XTableManager.ReadByIntKey(TABLE_SPECIAL_ROLE_PATH, XTable.XTableAreaWarSpecialRole, "Id")
|
||||
SpecialRoleRewardConfig =
|
||||
XTableManager.ReadByIntKey(TABLE_SPECIAL_ROLE_REWARD_PATH, XTable.XTableAreaWarSpecialRoleReward, "Id")
|
||||
end
|
||||
|
||||
local function GetSpecialRoleConfig(roleId)
|
||||
local config = SpecialRoleConfig[roleId]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetSpecialRoleConfig error:配置不存在, roleId:" ..
|
||||
roleId .. ",path: " .. TABLE_SPECIAL_ROLE_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetSpecialRoleRewardConfig(rewardId)
|
||||
local config = SpecialRoleRewardConfig[rewardId]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetSpecialRoleRewardConfig error:配置不存在, rewardId:" ..
|
||||
rewardId .. ",path: " .. TABLE_SPECIAL_ROLE_REWARD_PATH
|
||||
)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllSpecialRoleIds()
|
||||
local roleIds = {}
|
||||
for roleId in pairs(SpecialRoleConfig) do
|
||||
if XTool.IsNumberValid(roleId) then
|
||||
tableInsert(roleIds, roleId)
|
||||
end
|
||||
end
|
||||
tableSort(
|
||||
roleIds,
|
||||
function(a, b)
|
||||
return GetSpecialRoleConfig(a).OrderId < GetSpecialRoleConfig(b).OrderId
|
||||
end
|
||||
)
|
||||
return roleIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleUnlockBlockId(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.UnlockBlockId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleRobotId(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.RobotId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleName(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleIcon(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.Icon
|
||||
end
|
||||
|
||||
--获取小地图上用的头像图标
|
||||
function XAreaWarConfigs.GetBlockSpecialRoleIcon(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.HeadIcon
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleBuffId(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.BuffId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleLihui(roleId)
|
||||
local config = GetSpecialRoleConfig(roleId)
|
||||
return config.Lihui
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetUnlockSpecialRoleIdByBlockId(blockId)
|
||||
if not XTool.IsNumberValid(blockId) then
|
||||
return 0
|
||||
end
|
||||
for roleId, config in pairs(SpecialRoleConfig) do
|
||||
if blockId == config.UnlockBlockId then
|
||||
return roleId
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--获取所有角色解锁奖励Id
|
||||
function XAreaWarConfigs.GetAllSpecialRoleUnlockRewardIds()
|
||||
local rewardIds = {}
|
||||
for rewardId, config in ipairs(SpecialRoleRewardConfig) do
|
||||
if XTool.IsNumberValid(config.RewardId) then
|
||||
tableInsert(rewardIds, rewardId)
|
||||
end
|
||||
end
|
||||
return rewardIds
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleRewardRewardId(rewardId)
|
||||
local config = GetSpecialRoleRewardConfig(rewardId)
|
||||
return config.RewardId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetSpecialRoleRewardUnlockCount(rewardId)
|
||||
local config = GetSpecialRoleRewardConfig(rewardId)
|
||||
return config.UnlockCount
|
||||
end
|
||||
|
||||
--获取指定奖励Id的上一个奖励解锁需要的区块净化数量
|
||||
function XAreaWarConfigs.GetSpecialRoleRewardLastUnlockCount(rewardId)
|
||||
local targetRewardId = rewardId - 1
|
||||
if SpecialRoleRewardConfig[targetRewardId] then
|
||||
return SpecialRoleRewardConfig[targetRewardId].UnlockCount
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--获取指定区域所有特攻角色Id
|
||||
function XAreaWarConfigs.GetAreaSpecialRoleIds(areaId)
|
||||
local roleIds = {}
|
||||
local blockIds = XAreaWarConfigs.GetAreaBlockIds(areaId)
|
||||
for _, blockId in ipairs(blockIds) do
|
||||
local roleId = XAreaWarConfigs.GetUnlockSpecialRoleIdByBlockId(blockId)
|
||||
if XTool.IsNumberValid(roleId) then
|
||||
tableInsert(roleIds, roleId)
|
||||
end
|
||||
end
|
||||
return roleIds
|
||||
end
|
||||
-----------------特攻角色 end-------------------
|
||||
-----------------挂机收益 begin-------------------
|
||||
local TABLE_HANG_UP_PATH = "Share/AreaWar/AreaWarHangUpReward.tab"
|
||||
|
||||
local HangUpConfig = {}
|
||||
|
||||
local function InitHangUpConfig()
|
||||
HangUpConfig = XTableManager.ReadByIntKey(TABLE_HANG_UP_PATH, XTable.XTableAreaWarHangUpReward, "Id")
|
||||
end
|
||||
|
||||
local function GetHangUpConfig(id)
|
||||
local config = HangUpConfig[id]
|
||||
if not config then
|
||||
XLog.Error("XAreaWarConfigs GetHangUpConfig error:配置不存在, id:" .. id .. ",path: " .. TABLE_HANG_UP_PATH)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllHangUpIds()
|
||||
local ids = {}
|
||||
for roleId in ipairs(HangUpConfig) do
|
||||
if XTool.IsNumberValid(roleId) then
|
||||
tableInsert(ids, roleId)
|
||||
end
|
||||
end
|
||||
return ids
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetHangUpUnlockBlockId(id)
|
||||
local config = GetHangUpConfig(id)
|
||||
return config.UnlockBlockId
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetHangUpUnlockAmount(id)
|
||||
local config = GetHangUpConfig(id)
|
||||
return config.ProductionAmount
|
||||
end
|
||||
-----------------挂机收益 end-------------------
|
||||
-----------------净化加成/插件相关 begin-------------------
|
||||
local TABLE_PURIFICATION_LEVEL_PATH = "Share/AreaWar/AreaWarPurificationLevel.tab"
|
||||
|
||||
local PurificationLevelConfig = {}
|
||||
|
||||
XAreaWarConfigs.PluginSlotCount = 3 --插件槽数量
|
||||
|
||||
local function InitPurificationConfig()
|
||||
PurificationLevelConfig =
|
||||
XTableManager.ReadByIntKey(TABLE_PURIFICATION_LEVEL_PATH, XTable.XTableAreaWarPurificationLevel, "Id")
|
||||
end
|
||||
|
||||
local function GetPurificationLevelConfig(level, ignoreError)
|
||||
local config = PurificationLevelConfig[level]
|
||||
if not config then
|
||||
if not ignoreError then
|
||||
XLog.Error(
|
||||
"XAreaWarConfigs GetPurificationLevelConfig error:配置不存在, level:" ..
|
||||
level .. ",path: " .. TABLE_PURIFICATION_LEVEL_PATH
|
||||
)
|
||||
end
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
--获取指定净化等级解锁插件槽数量
|
||||
function XAreaWarConfigs.GetPfLevelUnlockSlot(level)
|
||||
if not XTool.IsNumberValid(level) then
|
||||
return 0
|
||||
end
|
||||
local config = GetPurificationLevelConfig(level)
|
||||
return config.HoleCount
|
||||
end
|
||||
|
||||
--获取解锁指定插件槽需要净化等级
|
||||
function XAreaWarConfigs.GetUnlockSlotPfLevel(slot)
|
||||
for level in ipairs(PurificationLevelConfig) do
|
||||
if XAreaWarConfigs.GetPfLevelUnlockSlot(level) == slot then
|
||||
return level
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--获取指定净化等级升到下一级所需经验
|
||||
function XAreaWarConfigs.GetPfLevelNextLevelExp(level)
|
||||
local config = GetPurificationLevelConfig(level + 1, true)
|
||||
return config and config.Exp or 0
|
||||
end
|
||||
|
||||
--获取指定插件解锁等级
|
||||
function XAreaWarConfigs.GetPfLevelByPluginId(pluginId)
|
||||
for level, config in pairs(PurificationLevelConfig) do
|
||||
if config.BuffId == pluginId then
|
||||
return level
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--获取指定净化等级固定加成属性值
|
||||
function XAreaWarConfigs.GetPfLevelAddAttrs(level)
|
||||
if level < 1 then
|
||||
return {0, 0, 0, 0}
|
||||
end
|
||||
local config = GetPurificationLevelConfig(level)
|
||||
return config.AddAttr
|
||||
end
|
||||
|
||||
function XAreaWarConfigs.GetAllPluginIds()
|
||||
local pluginIds = {}
|
||||
for _, config in pairs(PurificationLevelConfig) do
|
||||
if XTool.IsNumberValid(config.BuffId) then
|
||||
tableInsert(pluginIds, config.BuffId)
|
||||
end
|
||||
end
|
||||
return pluginIds
|
||||
end
|
||||
|
||||
--获取从0级升到指定净化等级总共需要经验
|
||||
function XAreaWarConfigs.GetAccumulatedPfExp(targetLevel)
|
||||
local totalExp = 0
|
||||
for level = 0, targetLevel - 1 do
|
||||
totalExp = totalExp + XAreaWarConfigs.GetPfLevelNextLevelExp(level)
|
||||
end
|
||||
return totalExp
|
||||
end
|
||||
|
||||
--获取最大净化等级
|
||||
function XAreaWarConfigs.GetMaxPfLevel()
|
||||
return #PurificationLevelConfig
|
||||
end
|
||||
-----------------净化加成/插件相关 end-------------------
|
||||
function XAreaWarConfigs.Init()
|
||||
InitActivityConfig()
|
||||
InitAreaConfig()
|
||||
InitBlockConfig()
|
||||
InitBuffConfig()
|
||||
InitSpecialRoleConfig()
|
||||
InitHangUpConfig()
|
||||
InitPurificationConfig()
|
||||
InitDispatchConfig()
|
||||
end
|
333
Script/matrix/xconfig/XArenaConfigs.lua
Normal file
333
Script/matrix/xconfig/XArenaConfigs.lua
Normal file
|
@ -0,0 +1,333 @@
|
|||
---
|
||||
--- 竞技副本配置表
|
||||
---
|
||||
XArenaConfigs = XArenaConfigs or {}
|
||||
|
||||
--战区贡献道具的id
|
||||
XArenaConfigs.CONTRIBUTESCORE_ID = 54
|
||||
|
||||
XArenaActivityStatus = {
|
||||
--game服和竞技服等待数据的时候用
|
||||
Loading = -1,
|
||||
--默认状态
|
||||
Default = 0,
|
||||
--休息状态
|
||||
Rest = 1,
|
||||
--战斗状态
|
||||
Fight = 2,
|
||||
--结束
|
||||
Over = 3,
|
||||
}
|
||||
|
||||
--个人排行区域
|
||||
XArenaPlayerRankRegion = {
|
||||
UpRegion = 1, --晋级区
|
||||
KeepRegion = 2, --保级区
|
||||
DownRegion = 3, --降级区
|
||||
}
|
||||
|
||||
--竞技副本通关评级
|
||||
XArenaAppraiseType = {
|
||||
S = 1,
|
||||
A = 2,
|
||||
B = 3,
|
||||
C = 4,
|
||||
D = 5,
|
||||
}
|
||||
|
||||
XArenaConfigs.ArenaTimerName = "FubenArenaActivityTimer"
|
||||
XArenaConfigs.SHOP_ID = CS.XGame.ClientConfig:GetInt("AreanShopId")
|
||||
|
||||
local TABLE_ARENA_BUFF_DETAIL = "Client/Fuben/Arena/ArenaAreaBuffDetails.tab"
|
||||
local TABLE_ARENA_STAGE = "Client/Fuben/Arena/ArenaStage.tab"
|
||||
local TABLE_ARENA_LEVEL = "Share/Fuben/Arena/ArenaLevel.tab"
|
||||
local TABLE_CHALLENGE_AREA = "Share/Fuben/Arena/ChallengeArea.tab"
|
||||
local TABLE_AREA_STAGE = "Share/Fuben/Arena/AreaStage.tab"
|
||||
local TABLE_TEAM_RANK_REWARD = "Share/Fuben/Arena/TeamRankReward.tab"
|
||||
local TABLE_MARK = "Share/Fuben/Arena/Mark.tab"
|
||||
|
||||
local ArenaRankBottomCount --竞技排行基数
|
||||
local ArenaClientStageTemplate --競技客户端关卡表
|
||||
local ArenaLevelTemplate --竞技段位表
|
||||
local ChallengeAreaTemplate --挑战区域表
|
||||
local AreaStageTemplate --战区关卡配置表
|
||||
local TeamRankRewardTemplate --队伍排行奖励表
|
||||
local MarkTemplate --结算分数表
|
||||
local BuffDetail --Buff展示信息配置表
|
||||
|
||||
local MaxArenaLevel = 0 --最大竞技段位
|
||||
local PlayerLevelRangeToChallengeIds --玩家等级段索引挑战配置列表
|
||||
local MaxArenaStageCountPerArea = 0 --竞技战区最大关卡数
|
||||
local MaxChallengeId = 0 --最大挑战区域Id
|
||||
|
||||
--私有方法定义
|
||||
local InitChallengeAreaCfg
|
||||
local InitArenaLevelCfg
|
||||
local InitAreaStageTemplate
|
||||
|
||||
function XArenaConfigs.Init()
|
||||
ArenaRankBottomCount = CS.XGame.Config:GetInt("ArenaTeamRankShow")
|
||||
ArenaClientStageTemplate = XTableManager.ReadByIntKey(TABLE_ARENA_STAGE, XTable.XTableArenaStage, "StageId")
|
||||
ArenaLevelTemplate = XTableManager.ReadByIntKey(TABLE_ARENA_LEVEL, XTable.XTableArenaLevel, "Id")
|
||||
ChallengeAreaTemplate = XTableManager.ReadByIntKey(TABLE_CHALLENGE_AREA, XTable.XTableChallengeArea, "ChallengeId")
|
||||
AreaStageTemplate = XTableManager.ReadByIntKey(TABLE_AREA_STAGE, XTable.XTableAreaStage, "Id")
|
||||
TeamRankRewardTemplate = XTableManager.ReadByIntKey(TABLE_TEAM_RANK_REWARD, XTable.XTableTeamRankReward, "Id")
|
||||
MarkTemplate = XTableManager.ReadByIntKey(TABLE_MARK, XTable.XTableMark, "MarkId")
|
||||
BuffDetail = XTableManager.ReadByIntKey(TABLE_ARENA_BUFF_DETAIL,XTable.XTableArenaAreaBuffDetails,"Id")
|
||||
InitArenaLevelCfg()
|
||||
InitChallengeAreaCfg()
|
||||
InitAreaStageTemplate()
|
||||
end
|
||||
|
||||
InitArenaLevelCfg = function()
|
||||
for _, cfg in pairs(ArenaLevelTemplate) do
|
||||
if MaxArenaLevel < cfg.Id then
|
||||
MaxArenaLevel = cfg.Id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
InitChallengeAreaCfg = function()
|
||||
PlayerLevelRangeToChallengeIds = {}
|
||||
|
||||
local tempMap = {}
|
||||
local tempTypeId = 0
|
||||
|
||||
for id, cfg in pairs(ChallengeAreaTemplate) do
|
||||
if id > MaxChallengeId then
|
||||
MaxChallengeId = id
|
||||
end
|
||||
local typeId = tempMap[cfg.MinLv]
|
||||
if not typeId then
|
||||
typeId = tempTypeId + 1
|
||||
tempMap[cfg.MinLv] = typeId
|
||||
tempTypeId = typeId
|
||||
end
|
||||
|
||||
local map = PlayerLevelRangeToChallengeIds[typeId]
|
||||
if not map then
|
||||
map = {}
|
||||
PlayerLevelRangeToChallengeIds[typeId] = map
|
||||
end
|
||||
|
||||
map[id] = cfg
|
||||
end
|
||||
end
|
||||
|
||||
InitAreaStageTemplate = function()
|
||||
for _, cfg in pairs(AreaStageTemplate) do
|
||||
if MaxArenaStageCountPerArea < #cfg.StageId then
|
||||
MaxArenaStageCountPerArea = #cfg.StageId
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local GetChallengeCfgMapById = function(challengeId)
|
||||
for _, map in ipairs(PlayerLevelRangeToChallengeIds) do
|
||||
local cfg = map[challengeId]
|
||||
if cfg then
|
||||
return map
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
local SortChallenge = function(a, b)
|
||||
return a.ArenaLv < b.ArenaLv
|
||||
end
|
||||
|
||||
local SorTeamRankReward = function(a, b)
|
||||
return a.MinRank < b.MinRank
|
||||
end
|
||||
|
||||
-- 获取个人排行区文字
|
||||
function XArenaConfigs.GetRankRegionText(rankRegion)
|
||||
if rankRegion == XArenaPlayerRankRegion.UpRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityUpRegion")
|
||||
elseif rankRegion == XArenaPlayerRankRegion.DownRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityDownRegion")
|
||||
else
|
||||
return CS.XTextManager.GetText("ArenaActivityKeepRegion")
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取个人排行区文字带颜色
|
||||
function XArenaConfigs.GetRankRegionColorText(rankRegion)
|
||||
if rankRegion == XArenaPlayerRankRegion.UpRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityUpRegionColor")
|
||||
elseif rankRegion == XArenaPlayerRankRegion.DownRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityDownRegionColor")
|
||||
else
|
||||
return CS.XTextManager.GetText("ArenaActivityKeepRegionColor")
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取个人排行区描述
|
||||
function XArenaConfigs.GetRankRegionDescText(rankRegion, challengeCfg)
|
||||
if rankRegion == XArenaPlayerRankRegion.UpRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityUpRegionDesc", 1, challengeCfg.DanUpRank)
|
||||
elseif rankRegion == XArenaPlayerRankRegion.DownRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityDownRegionDesc", challengeCfg.DanKeepRank + 1, challengeCfg.DanDownRank)
|
||||
else
|
||||
return CS.XTextManager.GetText("ArenaActivityKeepRegionDesc", challengeCfg.DanUpRank + 1, challengeCfg.DanKeepRank)
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取个人排行不升段位描述
|
||||
function XArenaConfigs.GetRankNotRegionDescText(rankRegion)
|
||||
if rankRegion == XArenaPlayerRankRegion.UpRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityNotUpRegionDesc")
|
||||
elseif rankRegion == XArenaPlayerRankRegion.DownRegion then
|
||||
return CS.XTextManager.GetText("ArenaActivityNotDownRegionDesc")
|
||||
else
|
||||
return CS.XTextManager.GetText("ArenaActivityNotKeepRegionDesc")
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取个人排行区奖励id
|
||||
function XArenaConfigs.GetRankRegionRewardId(rankRegion, challengeCfg)
|
||||
if rankRegion == XArenaPlayerRankRegion.UpRegion then
|
||||
return challengeCfg.UpRewardId
|
||||
elseif rankRegion == XArenaPlayerRankRegion.DownRegion then
|
||||
return challengeCfg.DownRewardId
|
||||
else
|
||||
return challengeCfg.KeepRewardId
|
||||
end
|
||||
end
|
||||
|
||||
-- 是否是最大竞技段位
|
||||
function XArenaConfigs.IsMaxArenaLevel(level)
|
||||
return level >= MaxArenaLevel
|
||||
end
|
||||
|
||||
function XArenaConfigs.GetMaxChallengeCfg()
|
||||
return XArenaConfigs.GetChallengeArenaCfgById(MaxChallengeId)
|
||||
end
|
||||
|
||||
-- 获取竞技副本评级文字
|
||||
function XArenaConfigs.GetArenaFightAppraiseText(appraiseType)
|
||||
if appraiseType == XArenaAppraiseType.S then
|
||||
return "S"
|
||||
elseif appraiseType == XArenaAppraiseType.A then
|
||||
return "A"
|
||||
elseif appraiseType == XArenaAppraiseType.B then
|
||||
return "B"
|
||||
elseif appraiseType == XArenaAppraiseType.C then
|
||||
return "C"
|
||||
elseif appraiseType == XArenaAppraiseType.D then
|
||||
return "D"
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取竞技队伍排行榜统计基数
|
||||
function XArenaConfigs.GetArenaRankBottomCount()
|
||||
return ArenaRankBottomCount
|
||||
end
|
||||
|
||||
-- 获取竞技段位配置表
|
||||
function XArenaConfigs.GetArenaLevelCfgByLevel(level)
|
||||
return ArenaLevelTemplate[level]
|
||||
end
|
||||
|
||||
-- 获取竞技段位配置表
|
||||
function XArenaConfigs.GetArenaStageConfig(stageId)
|
||||
local t = ArenaClientStageTemplate[stageId]
|
||||
if not t then
|
||||
XLog.ErrorTableDataNotFound("XArenaConfigs.GetArenaStageConfig", "根据stageId获取的配置表项", TABLE_ARENA_STAGE, "stageId", tostring(stageId))
|
||||
return nil
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
-- 获取竞技挑战配置表
|
||||
function XArenaConfigs.GetChallengeArenaCfgById(challengeId)
|
||||
return ChallengeAreaTemplate[challengeId]
|
||||
end
|
||||
|
||||
-- 获取竞技挑战配置列表
|
||||
function XArenaConfigs.GetChallengeCfgListById(challengeId)
|
||||
local list = {}
|
||||
|
||||
local map = GetChallengeCfgMapById(challengeId)
|
||||
if map then
|
||||
for _, cfg in pairs(map) do
|
||||
table.insert(list, cfg)
|
||||
end
|
||||
table.sort(list, SortChallenge)
|
||||
end
|
||||
return list
|
||||
end
|
||||
|
||||
-- 获取竞技挑战最高等级
|
||||
function XArenaConfigs.GetChallengeMaxArenaLevel(challengeId)
|
||||
local maxArenalLevel = 0
|
||||
|
||||
local map = GetChallengeCfgMapById(challengeId)
|
||||
if map then
|
||||
for _, cfg in pairs(map) do
|
||||
if cfg.ArenaLv > maxArenalLevel then
|
||||
maxArenalLevel = cfg.ArenaLv
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return maxArenalLevel
|
||||
end
|
||||
|
||||
function XArenaConfigs.GetArenaStageCfg()
|
||||
return AreaStageTemplate
|
||||
end
|
||||
|
||||
-- 获取竞技区域关卡配置
|
||||
function XArenaConfigs.GetArenaAreaStageCfgByAreaId(areaId)
|
||||
return AreaStageTemplate[areaId]
|
||||
end
|
||||
|
||||
-- 获取竞技战区最大关卡数量
|
||||
function XArenaConfigs.GetTheMaxStageCountOfArenaArea()
|
||||
return MaxArenaStageCountPerArea
|
||||
end
|
||||
|
||||
-- 获取竞技队伍排行奖励配置列表
|
||||
function XArenaConfigs.GetTeamRankRewardCfgList(challengeId)
|
||||
local list = {}
|
||||
for _, cfg in pairs(TeamRankRewardTemplate) do
|
||||
if cfg.ChallengeId == challengeId then
|
||||
table.insert(list, cfg)
|
||||
end
|
||||
end
|
||||
|
||||
if #list > 2 then
|
||||
table.sort(list, SorTeamRankReward)
|
||||
end
|
||||
|
||||
return list
|
||||
end
|
||||
|
||||
-- 获取竞技队伍排行奖励配置
|
||||
function XArenaConfigs.GetTeamRankRewardCfgById(id)
|
||||
return TeamRankRewardTemplate[id]
|
||||
end
|
||||
|
||||
-- 获取竞技结算分数配置
|
||||
function XArenaConfigs.GetMarkCfgById(id)
|
||||
return MarkTemplate[id]
|
||||
end
|
||||
|
||||
-- 获取最大分数
|
||||
function XArenaConfigs.GetMarkMaxPointById(id)
|
||||
return MarkTemplate[id].MaxPoint
|
||||
end
|
||||
|
||||
-- 获取竞技章节名字以及副本名字
|
||||
function XArenaConfigs.GetChapterAndStageName(areaId, stageId)
|
||||
local chapterName = AreaStageTemplate[areaId].Name
|
||||
local stageName = XDataCenter.FubenManager.GetStageCfg(stageId).Name
|
||||
return chapterName, stageName
|
||||
end
|
||||
|
||||
-- 获取Buff客户端展示信息配置
|
||||
function XArenaConfigs.GetArenaBuffCfg(buffId)
|
||||
return BuffDetail[buffId]
|
||||
end
|
176
Script/matrix/xconfig/XArenaOnlineConfigs.lua
Normal file
176
Script/matrix/xconfig/XArenaOnlineConfigs.lua
Normal file
|
@ -0,0 +1,176 @@
|
|||
XArenaOnlineConfigs = XArenaOnlineConfigs or {}
|
||||
|
||||
local TABLE_ARENAONLINE_CHAPTER = "Share/Fuben/ArenaOnline/ArenaOnlineChapter.tab"
|
||||
local TABLE_ARENAONLINE_SECTION = "Share/Fuben/ArenaOnline/ArenaOnlineSection.tab"
|
||||
local TABLE_ARENAONLINE_STAGEGROUP = "Share/Fuben/ArenaOnline/ArenaOnlineStageGroup.tab"
|
||||
local TABLE_ARENAONLINE_STAGE = "Share/Fuben/ArenaOnline/ArenaOnlineStage.tab"
|
||||
local TABLE_ARENAONLINE_ACTIVEBUFF = "Share/Fuben/ArenaOnline/ArenaOnlineActiveBuff.tab"
|
||||
--local TABLE_NPC_AFFIX = "Client/Fight/Npc/NpcAffix.tab"
|
||||
local ArenaOnlineChapterCfg = {}
|
||||
local ArenaOnlineSectionCfg = {}
|
||||
local ArenaOnlineStageGroupCfg = {}
|
||||
local ArenaOnlineStageCfg = {}
|
||||
local ArenaOnlineActiveBuffCfg = {}
|
||||
--local NpcAffixCfg = {}
|
||||
XArenaOnlineConfigs.MAX_NAILI = CS.XGame.Config:GetInt("ArenaOnlineCharMaxEndurance")
|
||||
XArenaOnlineConfigs.SHOW_TIME = CS.XGame.ClientConfig:GetInt("ArenaOnlineInviteShowTime")
|
||||
XArenaOnlineConfigs.DEFAULT_CHAPTERID = CS.XGame.ClientConfig:GetInt("ArenaOnlineDefualtChapterId")
|
||||
|
||||
XArenaOnlineConfigs.MaskArenOnlineUIName = {
|
||||
UiPurchase = "UiPurchase",
|
||||
UiDraw = "UiDraw",
|
||||
UiMultiplayerRoom = "UiMultiplayerRoom",
|
||||
UiMultiplayerInviteFriend = "UiMultiplayerInviteFriend",
|
||||
UiSocial = "UiSocial",
|
||||
UiRoomCharacter = "UiRoomCharacter",
|
||||
UiDrawMain = "UiNewDrawMain",
|
||||
UiLoading = "UiLoading"
|
||||
}
|
||||
function XArenaOnlineConfigs.Init()
|
||||
ArenaOnlineChapterCfg = XTableManager.ReadByIntKey(TABLE_ARENAONLINE_CHAPTER, XTable.XTableArenaOnlineChapter, "Id")
|
||||
ArenaOnlineSectionCfg = XTableManager.ReadByIntKey(TABLE_ARENAONLINE_SECTION, XTable.XTableArenaOnlineSection, "Id")
|
||||
ArenaOnlineStageGroupCfg = XTableManager.ReadAllByIntKey(TABLE_ARENAONLINE_STAGEGROUP, XTable.XTableArenaOnlineStageGroup, "Id")
|
||||
ArenaOnlineStageCfg = XTableManager.ReadAllByIntKey(TABLE_ARENAONLINE_STAGE, XTable.XTableArenaOnlineStage, "Id")
|
||||
ArenaOnlineActiveBuffCfg = XTableManager.ReadByIntKey(TABLE_ARENAONLINE_ACTIVEBUFF, XTable.XTableArenaOnlineActiveBuff, "Id")
|
||||
--NpcAffixCfg = XTableManager.ReadByIntKey(TABLE_NPC_AFFIX, XTable.XTableNpcAffix, "Id")
|
||||
XArenaOnlineConfigs.ArenaOnlineShowTime = CS.XGame.ClientConfig:GetInt("ArenaOnlineShowTime") or -1
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetChapters()
|
||||
return ArenaOnlineChapterCfg
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStages()
|
||||
return ArenaOnlineStageCfg
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetChapterById(chapterId)
|
||||
local chapter = ArenaOnlineChapterCfg[chapterId]
|
||||
|
||||
if not chapter then
|
||||
XLog.ErrorTableDataNotFound("XArenaOnlineConfigs.GetChapterById", "chapter", TABLE_ARENAONLINE_CHAPTER, "chapterId", tostring(chapterId))
|
||||
return nil
|
||||
end
|
||||
|
||||
return chapter
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetSectionById(sectionId)
|
||||
local section = ArenaOnlineSectionCfg[sectionId]
|
||||
|
||||
if not section then
|
||||
XLog.ErrorTableDataNotFound("XArenaOnlineConfigs.GetSectionById", "section", TABLE_ARENAONLINE_SECTION, "sectionId", tostring(sectionId))
|
||||
return nil
|
||||
end
|
||||
|
||||
return section
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageById(stageId)
|
||||
local stage = ArenaOnlineStageCfg[stageId]
|
||||
|
||||
if not stage then
|
||||
XLog.ErrorTableDataNotFound("XArenaOnlineConfigs.GetStageById", "stage", TABLE_ARENAONLINE_STAGE, "stageId", tostring(stageId))
|
||||
return nil
|
||||
end
|
||||
|
||||
return stage
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageGroupById(groupId)
|
||||
local group = ArenaOnlineStageGroupCfg[groupId]
|
||||
|
||||
if not group then
|
||||
XLog.ErrorTableDataNotFound("XArenaOnlineConfigs.GetStageGroupById", "group", TABLE_ARENAONLINE_STAGEGROUP, "groupId", tostring(groupId))
|
||||
return nil
|
||||
end
|
||||
|
||||
return group
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageGroupPrefabPathById(groupId)
|
||||
local cfg = XArenaOnlineConfigs.GetStageGroupById(groupId)
|
||||
if cfg then
|
||||
return cfg.PrefabPath
|
||||
end
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageGroupIconById(groupId)
|
||||
local cfg = XArenaOnlineConfigs.GetStageGroupById(groupId)
|
||||
if cfg then
|
||||
return cfg.Icon
|
||||
end
|
||||
end
|
||||
function XArenaOnlineConfigs.GetActiveBuffById(activeBuffId)
|
||||
local buff = ArenaOnlineActiveBuffCfg[activeBuffId]
|
||||
|
||||
if not buff then
|
||||
XLog.ErrorTableDataNotFound("XArenaOnlineConfigs.GetActiveBuffById",
|
||||
"buff", TABLE_ARENAONLINE_ACTIVEBUFF, "activeBuffId", tostring(activeBuffId))
|
||||
return nil
|
||||
end
|
||||
|
||||
return buff
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetNpcAffixById(buffId)
|
||||
local npcAffix = nil
|
||||
|
||||
if CS.XNpcManager.AffixTable:ContainsKey(buffId) then
|
||||
npcAffix = CS.XNpcManager.AffixTable[buffId]
|
||||
end
|
||||
|
||||
if not npcAffix then
|
||||
XLog.ErrorTableDataNotFound("XArenaOnlineConfigs.GetNpcAffixById", "npcAffix", TABLE_NPC_AFFIX, "buffId", tostring(buffId))
|
||||
return nil
|
||||
end
|
||||
|
||||
return npcAffix
|
||||
end
|
||||
|
||||
|
||||
function XArenaOnlineConfigs.GetChaprerNameByChapterId(chapterId)
|
||||
local chapter = XArenaOnlineConfigs.GetChapterById(chapterId)
|
||||
return chapter.Name
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageSortByStageId(stageId)
|
||||
local stage = XArenaOnlineConfigs.GetStageById(stageId)
|
||||
return stage.Sort
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageEnduranceCostByStageId(stageId)
|
||||
local stage = XArenaOnlineConfigs.GetStageById(stageId)
|
||||
return stage.EnduranceCost
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageActiveBuffIdByStageId(stageId)
|
||||
local stage = XArenaOnlineConfigs.GetStageById(stageId)
|
||||
return stage.ActiveBuffId
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageBottomCountByStageId(stageId)
|
||||
local stage = XArenaOnlineConfigs.GetStageById(stageId)
|
||||
return stage.BottomCount
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetStageDropKeyByStageId(stageId)
|
||||
local stage = XArenaOnlineConfigs.GetStageById(stageId)
|
||||
return tostring(stage.ShowDropId) .. tostring(stage.ShowBottomId)
|
||||
end
|
||||
|
||||
|
||||
function XArenaOnlineConfigs.GetStageGroupRequireStar(groupId)
|
||||
local group = XArenaOnlineConfigs.GetStageGroupById(groupId)
|
||||
return group.RequireStar
|
||||
end
|
||||
|
||||
function XArenaOnlineConfigs.GetFirstChapterName()
|
||||
local name = ""
|
||||
for _, v in pairs(ArenaOnlineChapterCfg) do
|
||||
name = v.Name
|
||||
break
|
||||
end
|
||||
|
||||
return name
|
||||
end
|
65
Script/matrix/xconfig/XArrangeConfigs.lua
Normal file
65
Script/matrix/xconfig/XArrangeConfigs.lua
Normal file
|
@ -0,0 +1,65 @@
|
|||
local QualityBgPath = {
|
||||
CS.XGame.ClientConfig:GetString("CommonBagWhite"),
|
||||
CS.XGame.ClientConfig:GetString("CommonBagGreed"),
|
||||
CS.XGame.ClientConfig:GetString("CommonBagBlue"),
|
||||
CS.XGame.ClientConfig:GetString("CommonBagPurple"),
|
||||
CS.XGame.ClientConfig:GetString("CommonBagGold"),
|
||||
CS.XGame.ClientConfig:GetString("CommonBagRed"),
|
||||
CS.XGame.ClientConfig:GetString("CommonBagRed"),
|
||||
}
|
||||
|
||||
local QualityPath = {
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor1"),
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor2"),
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor3"),
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor4"),
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor5"),
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor6"),
|
||||
CS.XGame.ClientConfig:GetString("QualityIconColor7"),
|
||||
}
|
||||
|
||||
|
||||
XArrangeConfigs = XArrangeConfigs or {}
|
||||
|
||||
XArrangeConfigs.Types = {
|
||||
Error = 0,
|
||||
Item = 1, --道具
|
||||
Character = 2, --成员
|
||||
Weapon = 3, --武器
|
||||
Wafer = 4, --意识
|
||||
Part = 6,
|
||||
Fashion = 7, --时装
|
||||
BaseEquip = 8, --基地装备
|
||||
Furniture = 9, --家具
|
||||
HeadPortrait = 10, --头像
|
||||
DormCharacter = 11, --宿舍构造体
|
||||
ChatEmoji = 12, --聊天表情
|
||||
WeaponFashion = 13, --武器投影
|
||||
Collection = 14, --收藏
|
||||
Background = 15, --场景
|
||||
Pokemon = 16, --口袋战双
|
||||
Partner = 17,--伙伴
|
||||
Nameplate = 18, --铭牌
|
||||
RankScore = 20, --等级评分
|
||||
Medal = 21, --勋章
|
||||
}
|
||||
|
||||
function XArrangeConfigs.GetType(id)
|
||||
return math.floor(id / 1000000) + 1
|
||||
end
|
||||
|
||||
function XArrangeConfigs.GeQualityBgPath(quality)
|
||||
if not quality then
|
||||
XLog.Error("XArrangeConfigs.GeQualityBgPath 函数错误: 参数quality不能为空")
|
||||
return
|
||||
end
|
||||
return QualityBgPath[quality]
|
||||
end
|
||||
|
||||
function XArrangeConfigs.GeQualityPath(quality)
|
||||
if not quality then
|
||||
XLog.Error("XArrangeConfigs.GeQualityBgPath 函数错误: 参数quality不能为空")
|
||||
return
|
||||
end
|
||||
return QualityPath[quality]
|
||||
end
|
12
Script/matrix/xconfig/XAssistConfig.lua
Normal file
12
Script/matrix/xconfig/XAssistConfig.lua
Normal file
|
@ -0,0 +1,12 @@
|
|||
XAssistConfig = XAssistConfig or {}
|
||||
|
||||
local AssistRuleTemplate = {}
|
||||
|
||||
local TABLE_ASSISTRULE = "Share/Fuben/Assist/AssistRule.tab";
|
||||
|
||||
function XAssistConfig.Init()
|
||||
AssistRuleTemplate = XTableManager.ReadByIntKey(TABLE_ASSISTRULE, XTable.XTableAssistRule, "Id")
|
||||
end
|
||||
function XAssistConfig.GetAssistRuleTemplate(id)
|
||||
return AssistRuleTemplate[id]
|
||||
end
|
79
Script/matrix/xconfig/XAttribConfigs.lua
Normal file
79
Script/matrix/xconfig/XAttribConfigs.lua
Normal file
|
@ -0,0 +1,79 @@
|
|||
XAttribConfigs = XAttribConfigs or {}
|
||||
|
||||
local TABLE_ATTRIB_DESC_PATH = "Share/Attrib/AttribDesc.tab"
|
||||
local TABLE_ATTRIB_ABILITY_PATH = "Share/Attrib/AttribAbility.tab"
|
||||
local TABLE_ATTRIB_PATH = "Share/Attrib/Attrib"
|
||||
local TABLE_ATTRIB_PROMOTED_PATH = "Share/Attrib/AttribPromoted"
|
||||
local TABLE_ATTRIB_GROW_RATE_PATH = "Share/Attrib/AttribGrowRate"
|
||||
local TABLE_ATTRIB_POOL_PATH = "Share/Attrib/AttribPool"
|
||||
local TABLE_ATTRIB_REVISE_PATH = "Share/Attrib/AttribRevise"
|
||||
--local TABLE_NPC_PATH = "Share/Fight/Npc/Npc/Npc.tab"
|
||||
|
||||
local AttribAbilityTemplate = {}
|
||||
local AttribTemplates = {}
|
||||
local AttribPromotedTemplates = {}
|
||||
local AttribGrowRateTemplates = {}
|
||||
local AttribReviseTemplates = {}
|
||||
local AttribGroupTemplates = {}
|
||||
local AttribGroupPoolIdDic = {} --共鸣属性池字典
|
||||
--local NpcTemplates = {}
|
||||
--属性名字配置表
|
||||
local AttribDescTemplates = {}
|
||||
|
||||
local tableInsert = table.insert
|
||||
|
||||
function XAttribConfigs.Init()
|
||||
AttribTemplates = XTableManager.ReadByIntKey(TABLE_ATTRIB_PATH, XTable.XTableNpcAttrib, "Id")
|
||||
AttribPromotedTemplates = XTableManager.ReadByIntKey(TABLE_ATTRIB_PROMOTED_PATH, XTable.XTableNpcAttrib, "Id")
|
||||
AttribGrowRateTemplates = XTableManager.ReadByIntKey(TABLE_ATTRIB_GROW_RATE_PATH, XTable.XTableNpcAttrib, "Id")
|
||||
AttribGroupTemplates = XTableManager.ReadByIntKey(TABLE_ATTRIB_POOL_PATH, XTable.XTableAttribGroup, "Id")
|
||||
AttribReviseTemplates = XTableManager.ReadByIntKey(TABLE_ATTRIB_REVISE_PATH, XTable.XTableAttribRevise, "Id")
|
||||
--NpcTemplates = XTableManager.ReadByIntKey(TABLE_NPC_PATH, XTable.XTableNpc, "Id")
|
||||
AttribDescTemplates = XTableManager.ReadAllByIntKey(TABLE_ATTRIB_DESC_PATH, XTable.XTableAttribDesc, "Index")
|
||||
AttribAbilityTemplate = XTableManager.ReadByStringKey(TABLE_ATTRIB_ABILITY_PATH, XTable.XTableAttribAbility, "Key")
|
||||
|
||||
for _, template in pairs(AttribGroupTemplates) do
|
||||
AttribGroupPoolIdDic[template.PoolId] = AttribGroupPoolIdDic[template.PoolId] or {}
|
||||
tableInsert(AttribGroupPoolIdDic[template.PoolId], template)
|
||||
end
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribTemplates()
|
||||
return AttribTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribPromotedTemplates()
|
||||
return AttribPromotedTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribGrowRateTemplates()
|
||||
return AttribGrowRateTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribReviseTemplates()
|
||||
return AttribReviseTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribGroupTemplates()
|
||||
return AttribGroupTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribGroupCfgById(groupId)
|
||||
return AttribGroupTemplates[groupId]
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetNpcTemplates()
|
||||
return NpcTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribDescTemplates()
|
||||
return AttribDescTemplates
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribAbilityTemplate()
|
||||
return AttribAbilityTemplate
|
||||
end
|
||||
|
||||
function XAttribConfigs.GetAttribGroupTemplateByPoolId(poolId)
|
||||
return AttribGroupPoolIdDic[poolId] or {}
|
||||
end
|
13
Script/matrix/xconfig/XAutoFightConfig.lua
Normal file
13
Script/matrix/xconfig/XAutoFightConfig.lua
Normal file
|
@ -0,0 +1,13 @@
|
|||
XAutoFightConfig = XAutoFightConfig or {}
|
||||
|
||||
|
||||
local AutoFightCfgs = {}
|
||||
local TABLE_AUTO_FIGHT = "Share/Fuben/AutoFight.tab"
|
||||
|
||||
function XAutoFightConfig.Init()
|
||||
AutoFightCfgs = XTableManager.ReadByIntKey(TABLE_AUTO_FIGHT, XTable.XTableAutoFight, "Id")
|
||||
end
|
||||
|
||||
function XAutoFightConfig.GetCfg(autoFightId)
|
||||
return AutoFightCfgs[autoFightId]
|
||||
end
|
66
Script/matrix/xconfig/XAutoWindowConfigs.lua
Normal file
66
Script/matrix/xconfig/XAutoWindowConfigs.lua
Normal file
|
@ -0,0 +1,66 @@
|
|||
XAutoWindowConfigs = XAutoWindowConfigs or {}
|
||||
|
||||
XAutoWindowConfigs.AutoType = {
|
||||
EachTime = 1, -- 每次登陆弹出
|
||||
EachDay = 2, -- 每天登陆弹出
|
||||
EachWeek = 3, -- 每周登陆弹出
|
||||
EachMonth = 4, -- 每月登陆弹出
|
||||
Period = 5, -- 周期内弹出
|
||||
EachDayOffset = 6, -- 有时间偏移的每天登录(目前每个服写死,暂不改表)
|
||||
}
|
||||
|
||||
XAutoWindowConfigs.AutoFunctionType = {
|
||||
AutoWindowView = 1, -- 自动弹出公告
|
||||
Sign = 2, -- 签到
|
||||
FirstRecharge = 3, -- 首充
|
||||
Card = 4, -- 月卡
|
||||
Regression = 5, -- 回归活动(特殊处理类型)
|
||||
NewRegression = 6, -- 新回归活动(特殊处理类型)
|
||||
WeekChallenge = 7, -- 周挑战(特殊处理类型)
|
||||
-- 日服定制
|
||||
NewYearZhanBu = 500, -- 元旦占卜
|
||||
NewYearDrawActivity = 501, -- 元旦抽奖
|
||||
|
||||
Fireworks = 1001, --烟花活动
|
||||
}
|
||||
|
||||
XAutoWindowConfigs.AutoWindowSkinType = {
|
||||
None = 0, -- 未知
|
||||
BarSkin = 1, -- 条幅
|
||||
BigSkin = 2, -- 大图
|
||||
SpineSkin = 3, -- Spine动画
|
||||
}
|
||||
|
||||
local TABLE_AUTO_WINDOW_VIEW = "Client/AutoWindow/AutoWindowView.tab"
|
||||
local TABLE_AUTO_WINDOW_CONTROLLER = "Client/AutoWindow/AutoWindowController.tab"
|
||||
|
||||
local AutoWindowViewConfig = {} -- 自动弹窗公告配置表
|
||||
local AutoWindowControllerConfig = {} -- 自动弹窗控制配置表
|
||||
|
||||
function XAutoWindowConfigs.Init()
|
||||
AutoWindowViewConfig = XTableManager.ReadByIntKey(TABLE_AUTO_WINDOW_VIEW, XTable.XTableAutoWindowView, "Id")
|
||||
AutoWindowControllerConfig = XTableManager.ReadByIntKey(TABLE_AUTO_WINDOW_CONTROLLER, XTable.XTableAutoWindowController, "Id")
|
||||
end
|
||||
|
||||
function XAutoWindowConfigs.GetAutoWindowConfig(id)
|
||||
local t = AutoWindowViewConfig[id]
|
||||
if not t then
|
||||
XLog.ErrorTableDataNotFound("XAutoWindowConfigs.GetAutoWindowConfig", "配置表项", TABLE_AUTO_WINDOW_VIEW, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
function XAutoWindowConfigs.GetAutoWindowSkinType(id)
|
||||
local t = XAutoWindowConfigs.GetAutoWindowConfig(id)
|
||||
if t then
|
||||
return t.Type
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
function XAutoWindowConfigs.GetAutoWindowControllerConfig()
|
||||
return AutoWindowControllerConfig
|
||||
end
|
20
Script/matrix/xconfig/XBaseEquipConfigs.lua
Normal file
20
Script/matrix/xconfig/XBaseEquipConfigs.lua
Normal file
|
@ -0,0 +1,20 @@
|
|||
XBaseEquipConfigs =XBaseEquipConfigs or {}
|
||||
|
||||
local TABLE_BASE_EQUIP_PATH = "Share/BaseEquip/BaseEquip.tab"
|
||||
local TABLE_BASE_EQUIP_SCORE = "Client/BaseEquip/BaseEquipScore.tab"
|
||||
|
||||
local BaseEquipTemplates = {} -- 基地装备配置
|
||||
local BaseEquipScoreTemplates = {} -- 基地装备评分计算配置
|
||||
|
||||
function XBaseEquipConfigs.Init()
|
||||
BaseEquipTemplates = XTableManager.ReadByIntKey(TABLE_BASE_EQUIP_PATH, XTable.XTableBaseEquip, "Id")
|
||||
BaseEquipScoreTemplates = XTableManager.ReadByStringKey(TABLE_BASE_EQUIP_SCORE, XTable.XTableBaseEquipScore, "Key")
|
||||
end
|
||||
|
||||
function XBaseEquipConfigs.GetBaseEquipTemplates()
|
||||
return BaseEquipTemplates
|
||||
end
|
||||
|
||||
function XBaseEquipConfigs.GetBaseEquipScoreTemplates()
|
||||
return BaseEquipScoreTemplates
|
||||
end
|
50
Script/matrix/xconfig/XBfrtConfigs.lua
Normal file
50
Script/matrix/xconfig/XBfrtConfigs.lua
Normal file
|
@ -0,0 +1,50 @@
|
|||
local TABLE_BFRT_CHAPTER_PATH = "Share/Fuben/Bfrt/BfrtChapter.tab"
|
||||
local TABLE_BFRT_GROUP_PATH = "Share/Fuben/Bfrt/BfrtGroup.tab"
|
||||
local TABLE_ECHELON_INFO_PATH = "Share/Fuben/Bfrt/EchelonInfo.tab"
|
||||
|
||||
local BfrtChapterTemplates = {}
|
||||
local BfrtGroupTemplates = {}
|
||||
local EchelonInfoTemplates = {}
|
||||
|
||||
XBfrtConfigs = XBfrtConfigs or {}
|
||||
|
||||
XBfrtConfigs.CAPTIAN_MEMBER_INDEX = 1
|
||||
XBfrtConfigs.FIRST_FIGHT_MEMBER_INDEX = 1
|
||||
|
||||
XBfrtConfigs.MEMBER_POS_COLOR = {
|
||||
"FF1111FF", -- red
|
||||
"4F99FFFF", -- blue
|
||||
"F9CB35FF", -- yellow
|
||||
}
|
||||
|
||||
function XBfrtConfigs.Init()
|
||||
BfrtChapterTemplates = XTableManager.ReadAllByIntKey(TABLE_BFRT_CHAPTER_PATH, XTable.XTableBfrtChapter, "ChapterId")
|
||||
BfrtGroupTemplates = XTableManager.ReadAllByIntKey(TABLE_BFRT_GROUP_PATH, XTable.XTableBfrtGroup, "GroupId")
|
||||
EchelonInfoTemplates = XTableManager.ReadByIntKey(TABLE_ECHELON_INFO_PATH, XTable.XTableEchelonInfo, "Id")
|
||||
end
|
||||
|
||||
function XBfrtConfigs.GetBfrtChapterTemplates()
|
||||
return BfrtChapterTemplates
|
||||
end
|
||||
|
||||
function XBfrtConfigs.GetEchelonInfoTemplates()
|
||||
return EchelonInfoTemplates
|
||||
end
|
||||
|
||||
local function GetGroupCfg(groupId)
|
||||
local groupCfg = BfrtGroupTemplates[groupId]
|
||||
if not groupCfg then
|
||||
XLog.ErrorTableDataNotFound("GetGroupCfg", "groupCfg", "Share/Fuben/Bfrt/BfrtGroup.tab", "groupId", tostring(groupId))
|
||||
return
|
||||
end
|
||||
return groupCfg
|
||||
end
|
||||
|
||||
function XBfrtConfigs.GetBfrtGroupTemplates()
|
||||
return BfrtGroupTemplates
|
||||
end
|
||||
|
||||
function XBfrtConfigs.GetBfrtPreGroupId(groupId)
|
||||
local config = GetGroupCfg(groupId)
|
||||
return config.PreGroupId
|
||||
end
|
136
Script/matrix/xconfig/XBodyCombineGameConfigs.lua
Normal file
136
Script/matrix/xconfig/XBodyCombineGameConfigs.lua
Normal file
|
@ -0,0 +1,136 @@
|
|||
|
||||
--===========================================================================
|
||||
---@desc 哈卡玛小游戏配置
|
||||
--===========================================================================
|
||||
|
||||
XBodyCombineGameConfigs = XBodyCombineGameConfigs or {}
|
||||
|
||||
|
||||
--region 路径
|
||||
|
||||
local TABLE_ACTIVITY_PATH = "Share/MiniActivity/BodyCombineGame/BodyCombineGameActivity.tab"
|
||||
local TABLE_STAGE_PATH = "Share/MiniActivity/BodyCombineGame/BodyCombineGameStage.tab"
|
||||
local TABLE_SMALL_ICON_PATH = "Client/MiniActivity/BodyCombineGame/BodyCombineGameSmallIcon.tab"
|
||||
|
||||
--endregion
|
||||
|
||||
--region 局部变量
|
||||
local _Activity = {}
|
||||
local _Stage = {}
|
||||
local _SmallIcon = {}
|
||||
local _CoinId = 1032 --活动代币Id
|
||||
--endregion
|
||||
|
||||
--region 局部函数
|
||||
local InitConfig = function()
|
||||
_Activity = XTableManager.ReadByIntKey(TABLE_ACTIVITY_PATH, XTable.XTableBodyCombineGameActivity, "Id")
|
||||
_Stage = XTableManager.ReadByIntKey(TABLE_STAGE_PATH, XTable.XTableBodyCombineGameStage, "Id")
|
||||
_SmallIcon = XTableManager.ReadByIntKey(TABLE_SMALL_ICON_PATH, XTable.XTableBodyCombineGameSmallIcon, "Id")
|
||||
|
||||
end
|
||||
|
||||
---==============================
|
||||
---@desc: 获取活动配置
|
||||
---==============================
|
||||
local GetActivityCfg = function(activityId)
|
||||
if not activityId then return end
|
||||
local config = _Activity[activityId]
|
||||
if not config then
|
||||
XLog.Error("Can Not Get Activity Config, Path = "..TABLE_ACTIVITY_PATH..", ActivityId = "..activityId)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
---==============================
|
||||
---@desc: 当前活动的TimeId
|
||||
---==============================
|
||||
local GetActivityTimeId = function(activityId)
|
||||
local config = GetActivityCfg(activityId)
|
||||
if config then
|
||||
return config.TimeId
|
||||
end
|
||||
return 0
|
||||
end
|
||||
--endregion
|
||||
|
||||
--region 外部接口
|
||||
|
||||
--===========================================================================
|
||||
---@desc 默认活动Id
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetDefaultActivityId()
|
||||
for _, config in ipairs(_Activity) do
|
||||
local id = config.Id
|
||||
if XTool.IsNumberValid(id) then
|
||||
return id
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 活动开始时间戳
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetActivityStartTime(activityId)
|
||||
local timeId = GetActivityTimeId(activityId)
|
||||
return XFunctionManager.GetStartTimeByTimeId(timeId)
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 活动结束时间戳
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetActivityEndTime(activityId)
|
||||
local timeId = GetActivityTimeId(activityId)
|
||||
return XFunctionManager.GetEndTimeByTimeId(timeId)
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 关卡数据
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetStageData()
|
||||
return _Stage
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 活动钱币物品Id
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetCoinItemId()
|
||||
-- local cfg = GetActivityCfg(activityId)
|
||||
-- return cfg and cfg.CostItemId
|
||||
return _CoinId
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 活动标题图
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetActivityTitle(activityId)
|
||||
local cfg = GetActivityCfg(activityId)
|
||||
return cfg and cfg.ActivityTitle
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 全部关卡完成图
|
||||
--===========================================================================·
|
||||
function XBodyCombineGameConfigs.GetActivityFinishBanner(activityId)
|
||||
local cfg = GetActivityCfg(activityId)
|
||||
return cfg and cfg.FinishBanner
|
||||
end
|
||||
|
||||
--===========================================================================
|
||||
---@desc 图片路径
|
||||
--===========================================================================
|
||||
function XBodyCombineGameConfigs.GetSmallIcon(iconId)
|
||||
local cfg = _SmallIcon[iconId]
|
||||
return cfg and cfg.Path
|
||||
end
|
||||
|
||||
--endregion
|
||||
|
||||
---==============================
|
||||
---@desc: 初始化入口
|
||||
---==============================
|
||||
function XBodyCombineGameConfigs.Init()
|
||||
InitConfig()
|
||||
end
|
||||
|
51
Script/matrix/xconfig/XBountyTaskConfigs.lua
Normal file
51
Script/matrix/xconfig/XBountyTaskConfigs.lua
Normal file
|
@ -0,0 +1,51 @@
|
|||
XBountyTaskConfigs = XBountyTaskConfigs or {}
|
||||
|
||||
local TABLE_BOUNTYTASK_RANK_PATH = "Share/BountyTask/BountyTaskRank.tab"
|
||||
local TABLE_BOUNTYTASK_PATH = "Share/BountyTask/BountyTask.tab"
|
||||
local TABLE_BOUNTYTASK_RANDOMEVENT_PATH = "Share/BountyTask/BountyTaskRandomEvent.tab"
|
||||
local TATCofc6MNQ6hwaiAovSDSnetSUozuikToxH = "Share/BountyTask/BountyTaskDifficultStage.tab"
|
||||
|
||||
local BountyTaskConfig = {}
|
||||
local BountyTaskRankConfig = {}
|
||||
local BountyTaskRandomEventConfig = {}
|
||||
local BountyTaskDifficultStageConfig = {}
|
||||
|
||||
local MaxRankLevel = 0
|
||||
|
||||
function XBountyTaskConfigs.Init()
|
||||
BountyTaskConfig = XTableManager.ReadAllByIntKey(TABLE_BOUNTYTASK_PATH, XTable.XTableBountyTask, "Id")
|
||||
BountyTaskRankConfig = XTableManager.ReadByIntKey(TABLE_BOUNTYTASK_RANK_PATH, XTable.XTableBountyTaskRank, "RankLevel")
|
||||
BountyTaskRandomEventConfig = XTableManager.ReadByIntKey(TABLE_BOUNTYTASK_RANDOMEVENT_PATH, XTable.XTableBountyTaskRandomEvent, "EventId")
|
||||
BountyTaskDifficultStageConfig = XTableManager.ReadByIntKey(TATCofc6MNQ6hwaiAovSDSnetSUozuikToxH, XTable.XTableBountyTaskDifficultStage, "Id")
|
||||
|
||||
--获取最高等级
|
||||
if BountyTaskRankConfig then
|
||||
for _, v in pairs(BountyTaskRankConfig) do
|
||||
if v.RankLevel > MaxRankLevel then
|
||||
MaxRankLevel = v.RankLevel
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
XBountyTaskConfigs.MaxRankLevel = MaxRankLevel
|
||||
end
|
||||
|
||||
function XBountyTaskConfigs.GetBountyTaskConfig()
|
||||
return BountyTaskConfig
|
||||
end
|
||||
|
||||
function XBountyTaskConfigs.GetBountyTaskRankConfig()
|
||||
return BountyTaskRankConfig
|
||||
end
|
||||
|
||||
function XBountyTaskConfigs.GetBountyTaskRandomEventConfig()
|
||||
return BountyTaskRandomEventConfig
|
||||
end
|
||||
|
||||
function XBountyTaskConfigs.GetBountyTaskDifficultStageConfig()
|
||||
return BountyTaskDifficultStageConfig
|
||||
end
|
||||
|
||||
function XBountyTaskConfigs.GetBountyTaskPath()
|
||||
return TABLE_BOUNTYTASK_PATH
|
||||
end
|
1931
Script/matrix/xconfig/XCharacterConfigs.lua
Normal file
1931
Script/matrix/xconfig/XCharacterConfigs.lua
Normal file
File diff suppressed because it is too large
Load diff
92
Script/matrix/xconfig/XCharacterUiEffectConfig.lua
Normal file
92
Script/matrix/xconfig/XCharacterUiEffectConfig.lua
Normal file
|
@ -0,0 +1,92 @@
|
|||
XCharacterUiEffectConfig = XCharacterUiEffectConfig or {}
|
||||
local TABLE_CHARACTER_UI_EFFECT = "Client/Character/CharacterUiEffect.tab"
|
||||
local TABLE_FASHION = "Share/Fashion/Fashion.tab"
|
||||
local CharacterUiEffectTable = {}
|
||||
local EffectDictionary = {}
|
||||
function XCharacterUiEffectConfig.Init()
|
||||
EffectDictionary = {}
|
||||
CharacterUiEffectTable = XTableManager.ReadByIntKey(TABLE_CHARACTER_UI_EFFECT, XTable.XTableCharacterUiEffect, "Id")
|
||||
local FashionTemplates = XTableManager.ReadByIntKey(TABLE_FASHION, XTable.XTableFashion, "Id")
|
||||
for _, v in pairs(CharacterUiEffectTable) do
|
||||
if not v.FashionId then
|
||||
XLog.Error(string.format("CharacterUiEffect表出错!存在没有填FashionId的数据!表地址:" .. TABLE_CHARACTER_UI_EFFECT))
|
||||
end
|
||||
if not v.EffectPath then
|
||||
XLog.Error(string.format("CharacterUiEffect表出错!存在没有填EffectPath的数据!表地址:" .. TABLE_CHARACTER_UI_EFFECT .. "Id:" .. v.Id))
|
||||
end
|
||||
local fashionTemplate = FashionTemplates[v.FashionId]
|
||||
if not fashionTemplate then
|
||||
XLog.ErrorTableDataNotFound("CharacterUiEffectConfig.Init", "Fashion", TABLE_FASHION, "fashionId", tostring(v.FashionId))
|
||||
return
|
||||
end
|
||||
local characterId = fashionTemplate.CharacterId
|
||||
local character = EffectDictionary[characterId]
|
||||
if not character then
|
||||
EffectDictionary[characterId] = {}
|
||||
character = EffectDictionary[characterId]
|
||||
end
|
||||
local fashion = character[v.FashionId]
|
||||
if not fashion then
|
||||
character[v.FashionId] = {}
|
||||
fashion = character[v.FashionId]
|
||||
end
|
||||
local actionId = v.ActionId or "DefaultEffect"
|
||||
local mergedTable = fashion[actionId]
|
||||
if not mergedTable then
|
||||
mergedTable = {}
|
||||
fashion[actionId] = mergedTable
|
||||
mergedTable.ActionId = v.ActionId
|
||||
mergedTable.FashionId = v.FashionId
|
||||
mergedTable.Id = v.Id
|
||||
mergedTable.EffectRootName = {}
|
||||
mergedTable.EffectPath = {}
|
||||
end
|
||||
mergedTable.EffectPath[#mergedTable.EffectPath + 1] = v.EffectPath
|
||||
mergedTable.EffectRootName[#mergedTable.EffectPath] = v.EffectRootName
|
||||
end
|
||||
if XMain.IsDebug then
|
||||
for characterId, dict1 in pairs(EffectDictionary) do
|
||||
for fashionId, dict2 in pairs(dict1) do
|
||||
for actionId, mergedTable in pairs(dict2)do
|
||||
local usedRoot = {}
|
||||
for i = 1, #mergedTable.EffectPath do
|
||||
local rootName = mergedTable.EffectRootName[i] or "Root"
|
||||
if not usedRoot[rootName] then
|
||||
usedRoot[rootName] = true
|
||||
else
|
||||
XLog.Error("CharacterUiEffect表出错!同一动作不能有重复的EffectRootName数据项!首项Id: " .. mergedTable.Id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XCharacterUiEffectConfig.GetEffectInfo(characterId, fashionId, actionId)
|
||||
if not characterId or not fashionId then
|
||||
XLog.Error(string.format("XCharacterUiEffectConfig.GetEffectInfo出错,必须参数存在空值,characterId: %s,fashionId: %s",
|
||||
tostring(characterId), tostring(fashionId)))
|
||||
return nil
|
||||
end
|
||||
local character = EffectDictionary[characterId]
|
||||
if not character then
|
||||
--XLog.ErrorTableDataNotFound("XCharacterUiEffectConfig.GetEffectInfo", "Ui角色动作特效", TABLE_CHARACTER_UI_EFFECT, "CharacterId", tostring(characterId))
|
||||
return nil
|
||||
end
|
||||
local fashion = character[fashionId]
|
||||
if not fashion then
|
||||
--XLog.ErrorTableDataNotFound("XCharacterUiEffectConfig.GetEffectInfo", "Ui角色动作特效", TABLE_CHARACTER_UI_EFFECT, "FashionId", tostring(fashionId))
|
||||
return nil
|
||||
end
|
||||
local cfg
|
||||
if actionId then
|
||||
cfg = fashion[actionId]
|
||||
else
|
||||
cfg = fashion.DefaultEffect
|
||||
end
|
||||
if not cfg then
|
||||
return nil
|
||||
end
|
||||
return cfg.Id, cfg.EffectRootName, cfg.EffectPath
|
||||
end
|
122
Script/matrix/xconfig/XChatConfigs.lua
Normal file
122
Script/matrix/xconfig/XChatConfigs.lua
Normal file
|
@ -0,0 +1,122 @@
|
|||
local tableInsert = table.insert
|
||||
local tableSort = table.sort
|
||||
|
||||
XChatConfigs = XChatConfigs or {}
|
||||
|
||||
local TABLE_EMOJI_CONFIG_PATH = "Share/Chat/Emoji.tab"
|
||||
local TABLE_EMOJI_PACK_PATH = "Share/Chat/EmojiPack.tab"
|
||||
local TABLE_EFFECT_CONFIG_PATH = "Client/Chat/KeywordEffect.tab"
|
||||
local TABLE_REPEAT_CHAT_FORBID_PATH = "Client/Chat/RepeatChatForbid.tab"
|
||||
|
||||
local EmojiTemplates = {}
|
||||
local EmojiPackTemplates = {}
|
||||
local EffectTemplates = {}
|
||||
local RepeatChatForbidCfg = {}
|
||||
XChatConfigs.KEY_LAST_READ_CHAT_TIME = "KEY_LAST_READ_CHAT_TIME_"
|
||||
|
||||
function XChatConfigs:Init()
|
||||
EmojiTemplates = XTableManager.ReadByIntKey(TABLE_EMOJI_CONFIG_PATH, XTable.XTableEmoji, "Id")
|
||||
EmojiPackTemplates = XTableManager.ReadByIntKey(TABLE_EMOJI_PACK_PATH, XTable.XTableEmojiPack, "Id")
|
||||
EffectTemplates = XTableManager.ReadByIntKey(TABLE_EFFECT_CONFIG_PATH, XTable.XTableChatEffect, "Id")
|
||||
RepeatChatForbidCfg = XTableManager.ReadByIntKey(TABLE_REPEAT_CHAT_FORBID_PATH, XTable.XTableRepeatChatForbid, "Id")
|
||||
end
|
||||
|
||||
--这里这里用于传出完整配置条目,外部谨允许局部域生命周期内使用,不允许持有!!!!
|
||||
function XChatConfigs.GetEmojiConfigById(emojiId)
|
||||
if not EmojiTemplates[emojiId] then
|
||||
XLog.Error("没有找到相关配置,请检查配置表:>>>>", TABLE_EMOJI_CONFIG_PATH)
|
||||
return {}
|
||||
end
|
||||
return EmojiTemplates[emojiId]
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiIcon(emojiId)
|
||||
emojiId = tonumber(emojiId)
|
||||
emojiId = emojiId or 0
|
||||
local cfg = EmojiTemplates[emojiId]
|
||||
if cfg == nil then
|
||||
return nil
|
||||
end
|
||||
return cfg.Path
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiQuality()
|
||||
return 1
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiName(emojiId)
|
||||
if not EmojiTemplates[emojiId] then
|
||||
return ""
|
||||
end
|
||||
|
||||
return EmojiTemplates[emojiId].Name
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiDescription(emojiId)
|
||||
if not EmojiTemplates[emojiId] then
|
||||
return ""
|
||||
end
|
||||
|
||||
return EmojiTemplates[emojiId].Description
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiWorldDesc(emojiId)
|
||||
if not EmojiTemplates[emojiId] then
|
||||
return ""
|
||||
end
|
||||
|
||||
return EmojiTemplates[emojiId].WorldDesc
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiBigIcon(emojiId)
|
||||
if not EmojiTemplates[emojiId] then
|
||||
return ""
|
||||
end
|
||||
|
||||
return EmojiTemplates[emojiId].BigIcon
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiPackId(emojiId)
|
||||
if not EmojiTemplates[emojiId] then
|
||||
return 0
|
||||
end
|
||||
|
||||
return EmojiTemplates[emojiId].PackageId or 0
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEffectTemplates()
|
||||
return EffectTemplates
|
||||
end
|
||||
|
||||
function XChatConfigs.GetRepeatChatForbidCalculateTime()
|
||||
return RepeatChatForbidCfg[1].CalculateTime
|
||||
end
|
||||
|
||||
function XChatConfigs.GetRepeatChatForbidRepeatCount()
|
||||
return RepeatChatForbidCfg[1].RepeatCount
|
||||
end
|
||||
|
||||
function XChatConfigs.GetRepeatChatForbidStringFilter()
|
||||
return RepeatChatForbidCfg[1].StringFilter or {}
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiPackConfigs()
|
||||
return EmojiPackTemplates
|
||||
end
|
||||
|
||||
function XChatConfigs.GetEmojiPackCfgById(packId, noTips)
|
||||
local cfg = EmojiPackTemplates[packId]
|
||||
if not cfg then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"GetEmojiPackCfgById",
|
||||
"表情包",
|
||||
TABLE_EMOJI_PACK_PATH,
|
||||
"Id",
|
||||
tostring(packId)
|
||||
)
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return EmojiPackTemplates[packId]
|
||||
end
|
552
Script/matrix/xconfig/XChessPursuitConfig.lua
Normal file
552
Script/matrix/xconfig/XChessPursuitConfig.lua
Normal file
|
@ -0,0 +1,552 @@
|
|||
XChessPursuitConfig = XChessPursuitConfig or {}
|
||||
|
||||
local TABLE_CHESSPURSUITBOSS_PATH = "Share/ChessPursuit/ChessPursuitBoss.tab"
|
||||
local TABLE_CHESSPURSUITCARD_PATH = "Share/ChessPursuit/ChessPursuitCard.tab"
|
||||
local TABLE_CHESSPURSUITCARDEFFECT_PATH = "Share/ChessPursuit/ChessPursuitCardEffect.tab"
|
||||
local TABLE_CHESSPURSUITMAP_PATH = "Share/ChessPursuit/ChessPursuitMap.tab"
|
||||
local TABLE_CHESSPURSUITMAPCARDSHOP_PATH = "Share/ChessPursuit/ChessPursuitMapCardShop.tab"
|
||||
local TABLE_CHESSPURSUITMAPGROUP_PATH = "Share/ChessPursuit/ChessPursuitMapGroup.tab"
|
||||
local TABLE_CHESSPURSUITMAPINITFUNC_PATH = "Share/ChessPursuit/ChessPursuitMapInitFunc.tab"
|
||||
local TABLE_CHESSPURSUITTESTROLE_PATH = "Share/ChessPursuit/ChessPursuitTestRole.tab"
|
||||
local TABLE_CHESSPURSUITSTEP_PATH = "Client/ChessPursuit/ChessPursuitStep.tab"
|
||||
local TABLE_CHESS_PURSUIT_MAP_GROUP_REWARD_PATH = "Share/ChessPursuit/ChessPursuitMapGroupReward.tab"
|
||||
|
||||
local ChessPursuitBossTemplate = {}
|
||||
local ChessPursuitCardTemplate = {}
|
||||
local ChessPursuitCardEffectTemplate = {}
|
||||
local ChessPursuitMapTemplate = {}
|
||||
local ChessPursuitMapCardShopTemplate = {}
|
||||
local ChessPursuitMapGroupTemplate = {}
|
||||
local ChessPursuitMapInitFuncTemplate = {}
|
||||
local ChessPursuitTestRoleTemplate = {}
|
||||
local ChessPursuitStepTemplate = {}
|
||||
local ChessPursuitMapGroupRewardTemplate = {}
|
||||
|
||||
local MapGroupRewardByGroupIdToIdDic = {}
|
||||
|
||||
local CSXTextManagerGetText = CS.XTextManager.GetText
|
||||
|
||||
--追击玩法商币道具的id
|
||||
XChessPursuitConfig.SHOP_COIN_ITEM_ID = nil
|
||||
|
||||
XChessPursuitConfig.Period = {
|
||||
Stable = 0, --安稳期
|
||||
Fight = 1, --斗争期
|
||||
}
|
||||
|
||||
XChessPursuitConfig.MEMBER_POS_COLOR = {
|
||||
"FF1111FF", -- red
|
||||
"4F99FFFF", -- blue
|
||||
"F9CB35FF", -- yellow
|
||||
}
|
||||
|
||||
XChessPursuitConfig.InitFuncType = {
|
||||
InitAddCoin = 1007, --完成x地图则增加y的初始货币
|
||||
}
|
||||
|
||||
local function InitMapGroupRewardByGroupIdToIdDic()
|
||||
for _, v in ipairs(ChessPursuitMapGroupRewardTemplate) do
|
||||
if not MapGroupRewardByGroupIdToIdDic[v.GroupId] then
|
||||
MapGroupRewardByGroupIdToIdDic[v.GroupId] = {}
|
||||
end
|
||||
table.insert(MapGroupRewardByGroupIdToIdDic[v.GroupId], v.Id)
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.Init()
|
||||
ChessPursuitBossTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITBOSS_PATH, XTable.XTableChessPursuitBoss, "Id")
|
||||
ChessPursuitCardTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITCARD_PATH, XTable.XTableChessPursuitCard, "Id")
|
||||
ChessPursuitCardEffectTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITCARDEFFECT_PATH, XTable.XTableChessPursuitCardEffect, "Id")
|
||||
ChessPursuitMapTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITMAP_PATH, XTable.XTableChessPursuitMap, "Id")
|
||||
ChessPursuitMapCardShopTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITMAPCARDSHOP_PATH, XTable.XTableChessPursuitMapCardShop, "Id")
|
||||
ChessPursuitMapGroupTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITMAPGROUP_PATH, XTable.XTableChessPursuitMapGroup, "Id")
|
||||
ChessPursuitMapInitFuncTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITMAPINITFUNC_PATH, XTable.XTableChessPursuitMapInitFunc, "Id")
|
||||
ChessPursuitTestRoleTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITTESTROLE_PATH, XTable.XTableChessPursuitTestRole, "Id")
|
||||
ChessPursuitStepTemplate = XTableManager.ReadByIntKey(TABLE_CHESSPURSUITSTEP_PATH, XTable.XTableChessPursuitStep, "Id")
|
||||
ChessPursuitMapGroupRewardTemplate = XTableManager.ReadByIntKey(TABLE_CHESS_PURSUIT_MAP_GROUP_REWARD_PATH, XTable.XTableChessPursuitMapGroupReward, "Id")
|
||||
|
||||
XChessPursuitConfig.SHOP_COIN_ITEM_ID = ChessPursuitMapTemplate[1].CoinId
|
||||
InitMapGroupRewardByGroupIdToIdDic()
|
||||
end
|
||||
|
||||
--@region 各个表的主Get函数
|
||||
function XChessPursuitConfig.GetChessPursuitBossTemplate(id)
|
||||
local data = ChessPursuitBossTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitBossTemplate", "data", TABLE_CHESSPURSUITBOSS_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
local data = ChessPursuitCardTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitCardTemplate", "data", TABLE_CHESSPURSUITCARD_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitCardEffectTemplate(id)
|
||||
local data = ChessPursuitCardEffectTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitCardEffectTemplate", "data", TABLE_CHESSPURSUITCARDEFFECT_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitStepTemplate(id)
|
||||
local data = ChessPursuitStepTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitStepTemplate", "data", TABLE_CHESSPURSUITSTEP_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
local data = ChessPursuitMapTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitMapTemplate", "data", TABLE_CHESSPURSUITMAP_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapCardShopTemplate(id)
|
||||
local data = ChessPursuitMapCardShopTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitMapCardShopTemplate", "data", TABLE_CHESSPURSUITMAPCARDSHOP_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapGroupTemplate(id)
|
||||
local data = ChessPursuitMapGroupTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitMapGroupTemplate", "data", TABLE_CHESSPURSUITMAPGROUP_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapInitFuncTemplate(id)
|
||||
local data = ChessPursuitMapInitFuncTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitMapInitFuncTemplate", "data", TABLE_CHESSPURSUITMAPINITFUNC_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitTestRoleTemplate(id)
|
||||
local data = ChessPursuitTestRoleTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitTestRoleTemplate", "data", TABLE_CHESSPURSUITTESTROLE_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapGroupRewardTemplate(id)
|
||||
local data = ChessPursuitMapGroupRewardTemplate[id]
|
||||
if not data then
|
||||
XLog.ErrorTableDataNotFound("XChessPursuitConfig.GetChessPursuitMapGroupRewardTemplate", "data", TABLE_CHESS_PURSUIT_MAP_GROUP_REWARD_PATH, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
--@endregion
|
||||
|
||||
--@region 各表的衍生方法
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitTestRoleRoleIds(id)
|
||||
local data = XChessPursuitConfig.GetChessPursuitTestRoleTemplate(id)
|
||||
local roleIds = {}
|
||||
for i,v in ipairs(data.RoleId) do
|
||||
table.insert(roleIds, v)
|
||||
end
|
||||
|
||||
return roleIds
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetAllChessPursuitBossTemplate()
|
||||
return ChessPursuitBossTemplate
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapsByGroupId(groupId)
|
||||
local tl = {}
|
||||
for i,v in ipairs(ChessPursuitMapTemplate) do
|
||||
if v.GroupId == groupId then
|
||||
table.insert(tl, v)
|
||||
end
|
||||
end
|
||||
|
||||
return tl
|
||||
end
|
||||
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapByUiType(uiType)
|
||||
local groupId = XChessPursuitConfig.GetCurrentGroupId()
|
||||
local mapsCfg = XChessPursuitConfig.GetChessPursuitMapsByGroupId(groupId)
|
||||
|
||||
for _,cfg in ipairs(mapsCfg) do
|
||||
if uiType == cfg.Stage then
|
||||
return cfg
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function XChessPursuitConfig.CheckChessPursuitMapIsOpen(mapId)
|
||||
local cfg = ChessPursuitMapTemplate[mapId]
|
||||
for i,condition in ipairs(cfg.OpenCondition) do
|
||||
if condition > 0 then
|
||||
local isOpen, desc = XConditionManager.CheckCondition(condition)
|
||||
return isOpen
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitInTimeMapGroup()
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
for i, config in pairs(ChessPursuitMapGroupTemplate) do
|
||||
local beginTime = XFunctionManager.GetStartTimeByTimeId(config.TimeId)
|
||||
local endTime = XFunctionManager.GetEndTimeByTimeId(config.TimeId)
|
||||
if nowTime >= beginTime and nowTime < endTime then
|
||||
return config
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetActivityBeginTime()
|
||||
local config = XChessPursuitConfig.GetChessPursuitInTimeMapGroup()
|
||||
if not config then
|
||||
return 0
|
||||
end
|
||||
return XFunctionManager.GetStartTimeByTimeId(config.TimeId)
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetActivityEndTime()
|
||||
local config = XChessPursuitConfig.GetChessPursuitInTimeMapGroup()
|
||||
if not config then
|
||||
return 0
|
||||
end
|
||||
return XFunctionManager.GetEndTimeByTimeId(config.TimeId)
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetActivityFullBeginTime()
|
||||
local config = ChessPursuitMapGroupTemplate[1]
|
||||
if not config then
|
||||
return 0
|
||||
end
|
||||
return XFunctionManager.GetStartTimeByTimeId(config.TimeId)
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetActivityFullEndTime()
|
||||
local endTime = 0
|
||||
local endTimeTemp = 0
|
||||
for _, v in pairs(ChessPursuitMapGroupTemplate) do
|
||||
endTimeTemp = XFunctionManager.GetEndTimeByTimeId(v.TimeId)
|
||||
if endTimeTemp > endTime then
|
||||
endTime = endTimeTemp
|
||||
end
|
||||
end
|
||||
return endTime
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCurrentGroupId()
|
||||
local cfg = XChessPursuitConfig.GetChessPursuitInTimeMapGroup()
|
||||
if cfg then
|
||||
return cfg.Id
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapTeamGridList(mapId)
|
||||
local cfg = XChessPursuitConfig.GetChessPursuitMapTemplate(mapId)
|
||||
return cfg.TeamGrid
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetTeamGridIndexByPos(id, pos)
|
||||
local cfg = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
for i,v in ipairs(cfg.TeamGrid) do
|
||||
if pos == v then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitStepTemplateByStep(step)
|
||||
for i,v in ipairs(ChessPursuitStepTemplate) do
|
||||
if v.Step == step then
|
||||
return v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.CheckIsHaveStepCfgByCardEffectId(id)
|
||||
local data = ChessPursuitStepTemplate[id]
|
||||
|
||||
if data then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.IsChessPursuitMapGroupOpen(mapGroupId)
|
||||
if not mapGroupId then
|
||||
return false
|
||||
end
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapGroupTemplate(mapGroupId)
|
||||
local beginTime = XFunctionManager.GetStartTimeByTimeId(config.TimeId)
|
||||
local endTime = XFunctionManager.GetEndTimeByTimeId(config.TimeId)
|
||||
if nowTime >= beginTime and nowTime < endTime then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
--判断当前的地图是否已经关闭
|
||||
function XChessPursuitConfig.IsTimeOutByMapId(mapId)
|
||||
local cfg = XChessPursuitConfig.GetChessPursuitMapTemplate(mapId)
|
||||
local groupCfg = XChessPursuitConfig.GetChessPursuitMapGroupTemplate(cfg.GroupId)
|
||||
local endTime = XFunctionManager.GetEndTimeByTimeId(groupCfg.TimeId)
|
||||
|
||||
local nowTime = XTime.GetServerNowTimestamp()
|
||||
if nowTime >= endTime then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
--获取group处于哪个时期
|
||||
function XChessPursuitConfig.GetStageTypeByGroupId(groupId)
|
||||
local mapsCfg = XChessPursuitConfig.GetChessPursuitMapsByGroupId(groupId)
|
||||
|
||||
local cfg = mapsCfg[1]
|
||||
if cfg.Stage == 1 then
|
||||
return XChessPursuitCtrl.MAIN_UI_TYPE.STABLE
|
||||
elseif cfg.Stage == 2 then
|
||||
return XChessPursuitCtrl.MAIN_UI_TYPE.FIGHT_DEFAULT
|
||||
elseif cfg.Stage == 3 then
|
||||
return XChessPursuitCtrl.MAIN_UI_TYPE.FIGHT_HARD
|
||||
end
|
||||
end
|
||||
|
||||
----------地图组 begin---------
|
||||
function XChessPursuitConfig.GetChessPursuitMapGroupRank(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapGroupTemplate(id)
|
||||
return config.Rank
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitActivityNameByMapId(mapId)
|
||||
local mapGroupId = XChessPursuitConfig.GetChessPursuitMapGroupId(mapId)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapGroupTemplate(mapGroupId)
|
||||
return config.ActivityName
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCurrentMapId()
|
||||
local currGroupId = XChessPursuitConfig.GetCurrentGroupId()
|
||||
local groupId, isOpen, mapId
|
||||
for i = #ChessPursuitMapTemplate, 1, -1 do
|
||||
groupId = ChessPursuitMapTemplate[i].GroupId
|
||||
mapId = ChessPursuitMapTemplate[i].Id
|
||||
isOpen = XChessPursuitConfig.CheckChessPursuitMapIsOpen(mapId)
|
||||
if currGroupId == groupId and isOpen then
|
||||
return mapId
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetMapIdListByGroupId(groupId)
|
||||
local mapIdList = {}
|
||||
for _, v in ipairs(ChessPursuitMapTemplate) do
|
||||
if v.GroupId == groupId then
|
||||
table.insert(mapIdList, v.Id)
|
||||
end
|
||||
end
|
||||
return mapIdList
|
||||
end
|
||||
----------地图组 end---------
|
||||
|
||||
----------地图 begin---------
|
||||
function XChessPursuitConfig.GetChessPursuitMapShopCardId(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.ShopCardId
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapAddCoin(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.AddCoin
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapCardMaxCount(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.CardMaxCount
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapCoinId(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.CoinId
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapGroupId(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.GroupId
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.IsChessPursuitMapCanAutoClear(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.IsCanAutoClear == 1
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapBossId(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.BossId
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapInitFuncList(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.InitFunc
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitMapFinishAddCoin(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapTemplate(id)
|
||||
return config.FinishAddCoin
|
||||
end
|
||||
----------地图 end---------
|
||||
|
||||
-------商店 begin---------
|
||||
function XChessPursuitConfig.GetShopCardIdList(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapCardShopTemplate(id)
|
||||
local cardIdList = {}
|
||||
for _, cardId in ipairs(config.CardId) do
|
||||
if cardId > 0 then
|
||||
table.insert(cardIdList, cardId)
|
||||
end
|
||||
end
|
||||
return cardIdList
|
||||
end
|
||||
-------商店 end-----------
|
||||
|
||||
-------卡牌 begin----------
|
||||
function XChessPursuitConfig.GetCardName(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardDescribe(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return string.gsub(config.Describe, "\\n", "\n")
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardIcon(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.Icon
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardQualityIcon(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.QualityIcon
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetShopBgQualityIcon(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.ShopBgQualityIcon
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardSubCoin(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.SubCoin
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardQuality(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.Quality
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardEffect(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.Effect
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetCardTipsQualityIconBg(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitCardTemplate(id)
|
||||
return config.TipsQualityIconBg
|
||||
end
|
||||
-------卡牌 end----------
|
||||
|
||||
-------奖励 begin---------
|
||||
function XChessPursuitConfig.GetMapGroupRewardByGroupIdToIdDic(groupId)
|
||||
return MapGroupRewardByGroupIdToIdDic[groupId]
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetMapGroupRewardStartRange(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapGroupRewardTemplate(id)
|
||||
return config.StartRange
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetMapGroupRewardEndRange(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapGroupRewardTemplate(id)
|
||||
return config.EndRange
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetMapGroupRewardRewardShowId(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapGroupRewardTemplate(id)
|
||||
return config.RewardShowId
|
||||
end
|
||||
-------奖励 end-----------
|
||||
|
||||
-------Boss begin---------
|
||||
function XChessPursuitConfig.GetChessPursuitBossStageIdByMapId(mapId)
|
||||
local bossId = XChessPursuitConfig.GetChessPursuitMapBossId(mapId)
|
||||
local config = XChessPursuitConfig.GetChessPursuitBossTemplate(bossId)
|
||||
return config.StageId
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetChessPursuitBossHeadIconByMapId(mapId)
|
||||
local bossId = XChessPursuitConfig.GetChessPursuitMapBossId(mapId)
|
||||
local config = XChessPursuitConfig.GetChessPursuitBossTemplate(bossId)
|
||||
return config.HeadIcon
|
||||
end
|
||||
-------Boss end-----------
|
||||
|
||||
------ChessPursuitMapInitFunc begin-------
|
||||
function XChessPursuitConfig.GetMapInitFuncMapId(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapInitFuncTemplate(id)
|
||||
return config.Param[1]
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.GetMapInitFuncType(id)
|
||||
local config = XChessPursuitConfig.GetChessPursuitMapInitFuncTemplate(id)
|
||||
return config.Type
|
||||
end
|
||||
|
||||
function XChessPursuitConfig.IsMapInitFuncAddCoinType(id)
|
||||
local initFuncType = XChessPursuitConfig.GetMapInitFuncType(id)
|
||||
return initFuncType == XChessPursuitConfig.InitFuncType.InitAddCoin
|
||||
end
|
||||
------ChessPursuitMapInitFunc end-------
|
||||
|
||||
function XChessPursuitConfig.GetBabelRankIcon(num)
|
||||
return CS.XGame.ClientConfig:GetString("BabelTowerRankIcon" .. num)
|
||||
end
|
||||
--@endregion
|
91
Script/matrix/xconfig/XChristmasTreeConfig.lua
Normal file
91
Script/matrix/xconfig/XChristmasTreeConfig.lua
Normal file
|
@ -0,0 +1,91 @@
|
|||
local tableInsert = table.insert
|
||||
|
||||
XChristmasTreeConfig = XChristmasTreeConfig or {}
|
||||
|
||||
local CHRISTMAS_TREE_ACTIVITY_PATH = "Share/MiniActivity/ChristmasTree/ChristmasTree.tab"
|
||||
local CHRISTMAS_TREE_ACTIVITY_ORNAMENT_PATH = "Share/MiniActivity/ChristmasTree/ChristmasTreeOrnaments.tab"
|
||||
local CHRISTMAS_TREE_ACTIVITY_PART_PATH = "Share/MiniActivity/ChristmasTree/ChristmasTreePart.tab"
|
||||
|
||||
local ActivityTemplates = {}
|
||||
local ChristmasTreeOrnament = {}
|
||||
local ChristmasTreeOrnamentGroup = {}
|
||||
local ChristmasTreePart = {}
|
||||
local ChristmasTreePartGroup = {}
|
||||
local OrnamentAttrCount = {}
|
||||
local PartCount, PartGrpCount
|
||||
|
||||
function XChristmasTreeConfig.Init()
|
||||
ActivityTemplates = XTableManager.ReadByIntKey(CHRISTMAS_TREE_ACTIVITY_PATH, XTable.XTableChristmasTreeActivity, "Id")
|
||||
|
||||
ChristmasTreePart = XTableManager.ReadByIntKey(CHRISTMAS_TREE_ACTIVITY_PART_PATH, XTable.XTableChristmasTreeActivityPart, "Id")
|
||||
PartCount, PartGrpCount = 0, 0
|
||||
for _, item in ipairs(ChristmasTreePart) do
|
||||
if not ChristmasTreePartGroup[item.GroupId] then
|
||||
PartGrpCount = PartGrpCount + 1
|
||||
ChristmasTreePartGroup[item.GroupId] = {}
|
||||
end
|
||||
tableInsert(ChristmasTreePartGroup[item.GroupId], item)
|
||||
PartCount = PartCount + 1
|
||||
end
|
||||
|
||||
ChristmasTreeOrnament = XTableManager.ReadByIntKey(CHRISTMAS_TREE_ACTIVITY_ORNAMENT_PATH, XTable.XTableChristmasTreeActivityOrnament, "Id")
|
||||
for _, item in ipairs(ChristmasTreeOrnament) do
|
||||
OrnamentAttrCount[item.Id] = 0
|
||||
for _, value in ipairs(item.Attr) do
|
||||
OrnamentAttrCount[item.Id] = OrnamentAttrCount[item.Id] + value
|
||||
end
|
||||
for _, partId in ipairs(item.PartId) do
|
||||
local groupId = XChristmasTreeConfig.GetGrpIdByTreePart(partId)
|
||||
if not ChristmasTreeOrnamentGroup[groupId] then
|
||||
ChristmasTreeOrnamentGroup[groupId] = {}
|
||||
end
|
||||
if not ChristmasTreeOrnamentGroup[groupId][item.Id] then
|
||||
ChristmasTreeOrnamentGroup[groupId][item.Id] = item
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetActivityTemplates()
|
||||
return ActivityTemplates
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetActivityTemplateById(Id)
|
||||
if not ActivityTemplates then
|
||||
return nil
|
||||
end
|
||||
|
||||
return ActivityTemplates[Id]
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetOrnamentCfg()
|
||||
return ChristmasTreeOrnament
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetOrnamentById(id)
|
||||
return ChristmasTreeOrnament[id]
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetOrnamentByGroup(grpId)
|
||||
return ChristmasTreeOrnamentGroup[grpId]
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetTreePartCount()
|
||||
return PartCount, PartGrpCount
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetAttrCount(id)
|
||||
return OrnamentAttrCount[id]
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetTreePartById(id)
|
||||
return ChristmasTreePart[id]
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetGrpIdByTreePart(id)
|
||||
return ChristmasTreePart[id].GroupId
|
||||
end
|
||||
|
||||
function XChristmasTreeConfig.GetTreePartByGroup(grpId)
|
||||
return ChristmasTreePartGroup[grpId]
|
||||
end
|
81
Script/matrix/xconfig/XClickClearGameConfigs.lua
Normal file
81
Script/matrix/xconfig/XClickClearGameConfigs.lua
Normal file
|
@ -0,0 +1,81 @@
|
|||
local tableInsert = table.insert
|
||||
|
||||
local TABLE_CLICKCLEAR_GAME_PATH = "Share/ClickClearGame/ClickClearGame.tab"
|
||||
local TABLE_CLICKCLEAR_GAME_STAGE_PATH = "Share/ClickClearGame/ClickClearGameStage.tab"
|
||||
local TABLE_CLICKCLEAR_PAGE_PATH = "Client/ClickClearGame/ClickClearPage.tab"
|
||||
local TABLE_CLICKCLEAR_ROW_PATH = "Client/ClickClearGame/ClickClearRow.tab"
|
||||
local TABLE_CLICKCLEAR_HEAD_PATH = "Client/ClickClearGame/ClickClearHead.tab"
|
||||
|
||||
local GameTemplates = {}
|
||||
local GameStageTemplates = {}
|
||||
local PageTemplates = {}
|
||||
local RowTemplates = {}
|
||||
local HeadTemplates = {}
|
||||
local HeadTypeList = {}
|
||||
|
||||
XClickClearGameConfigs = XClickClearGameConfigs or {}
|
||||
|
||||
function XClickClearGameConfigs.Init()
|
||||
GameTemplates = XTableManager.ReadByIntKey(TABLE_CLICKCLEAR_GAME_PATH, XTable.XTableClickClearGame, "Id")
|
||||
GameStageTemplates = XTableManager.ReadByIntKey(TABLE_CLICKCLEAR_GAME_STAGE_PATH, XTable.XTableClickClearGameStage, "Id")
|
||||
PageTemplates = XTableManager.ReadByIntKey(TABLE_CLICKCLEAR_PAGE_PATH, XTable.XTableClickClearPage, "Id")
|
||||
RowTemplates = XTableManager.ReadByIntKey(TABLE_CLICKCLEAR_ROW_PATH, XTable.XTableClickClearRow, "Id")
|
||||
HeadTemplates = XTableManager.ReadByIntKey(TABLE_CLICKCLEAR_HEAD_PATH, XTable.XTableClickClearHead, "Id")
|
||||
|
||||
for i,v in pairs(HeadTemplates) do
|
||||
local type = v.Type
|
||||
if not HeadTypeList[type] then
|
||||
HeadTypeList[type] = {}
|
||||
end
|
||||
|
||||
tableInsert(HeadTypeList[type], i)
|
||||
end
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetGameTemplates()
|
||||
return GameTemplates
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetGameStageTemplates()
|
||||
return GameStageTemplates
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetGameStageTemplateById(id)
|
||||
if not GameStageTemplates or #GameStageTemplates <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
return GameStageTemplates[id]
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetPageTemplateById(id)
|
||||
if not PageTemplates or #PageTemplates <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
return PageTemplates[id]
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetRowTemplateById(id)
|
||||
if not RowTemplates or #RowTemplates <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
return RowTemplates[id]
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetHeadTemplateById(id)
|
||||
if not HeadTemplates or #HeadTemplates <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
return HeadTemplates[id]
|
||||
end
|
||||
|
||||
function XClickClearGameConfigs.GetHeadTypeListByType(type)
|
||||
if not HeadTypeList or #HeadTypeList <= 0 or not HeadTypeList[type] then
|
||||
return nil
|
||||
end
|
||||
|
||||
return HeadTypeList[type]
|
||||
end
|
236
Script/matrix/xconfig/XCollectionWallConfigs.lua
Normal file
236
Script/matrix/xconfig/XCollectionWallConfigs.lua
Normal file
|
@ -0,0 +1,236 @@
|
|||
XCollectionWallConfigs = XCollectionWallConfigs or {}
|
||||
|
||||
local TABLE_COLLECTION_WALL = "Share/ScoreTitle/CollectionWall.tab"
|
||||
local TABLE_COLLECTION_WALL_DECORATION = "Share/ScoreTitle/CollectionWallDecoration.tab"
|
||||
local TABLE_COLLECTION_SIZE = "Client/CollectionWall/CollectionSize.tab"
|
||||
|
||||
-- 装饰品种类
|
||||
XCollectionWallConfigs.EnumDecorationType = {
|
||||
Background = 1, -- 背景
|
||||
Pedestal = 2, -- 底座
|
||||
}
|
||||
|
||||
-- 收藏品墙的状态
|
||||
XCollectionWallConfigs.EnumWallState = {
|
||||
Lock = 1, -- 未解锁
|
||||
None = 2, -- 空白
|
||||
Normal = 3, -- 正常
|
||||
}
|
||||
|
||||
-- 收藏品墙格子的使用的种类
|
||||
XCollectionWallConfigs.EnumWallGridOpenType = {
|
||||
Overview = 1, -- 管理界面
|
||||
Setting = 2, -- 设置界面
|
||||
}
|
||||
|
||||
-- 收藏品墙装饰品的解锁类型
|
||||
XCollectionWallConfigs.EnumDecorationUnlockType = {
|
||||
Condition = 1, -- 条件解锁
|
||||
Reward = 2, -- 奖励解锁
|
||||
}
|
||||
|
||||
-- 编辑模式选择的种类
|
||||
XCollectionWallConfigs.EnumSelectType = {
|
||||
BACKGROUND = 1, -- 墙面
|
||||
PEDESTAL = 2, -- 底座
|
||||
LITTL = 3, -- 模型小
|
||||
MIDDLE = 4, -- 模型中
|
||||
BIG = 5, -- 模型大
|
||||
}
|
||||
|
||||
-- 墙面单元格尺寸为90*90
|
||||
XCollectionWallConfigs.CellSize = 90
|
||||
|
||||
local CollectionWallCfg = {}
|
||||
local CollectionWallDecorationCfg = {}
|
||||
local CollectionSizeCfg = {}
|
||||
|
||||
function XCollectionWallConfigs.Init()
|
||||
CollectionWallCfg = XTableManager.ReadByIntKey(TABLE_COLLECTION_WALL, XTable.XTableCollectionWall, "Id")
|
||||
CollectionWallDecorationCfg = XTableManager.ReadByIntKey(TABLE_COLLECTION_WALL_DECORATION, XTable.XTableCollectionWallDecoration, "Id")
|
||||
CollectionSizeCfg = XTableManager.ReadByIntKey(TABLE_COLLECTION_SIZE, XTable.XTableCollectionSize, "Id")
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------ CollectionWall.tab数据读取 -------------------------------------------------------
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙的配置
|
||||
--- 建议使用XCollectionWall.lua的接口来获取需要的数据
|
||||
---@param id number
|
||||
---@return table
|
||||
function XCollectionWallConfigs.GetCollectionWallCfg(id)
|
||||
local config = CollectionWallCfg[id]
|
||||
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XCollectionWallConfigs.GetCollectionWallCfg",
|
||||
"收藏品墙配置", TABLE_COLLECTION_WALL, "Id", tostring(id))
|
||||
return {}
|
||||
end
|
||||
|
||||
return config
|
||||
end
|
||||
|
||||
---
|
||||
--- 获取所有收藏品墙的Id数组
|
||||
---@return table
|
||||
function XCollectionWallConfigs.GetCollectionWallIdList()
|
||||
local idList = {}
|
||||
for id, _ in pairs(CollectionWallCfg) do
|
||||
table.insert(idList, id)
|
||||
end
|
||||
return idList
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------ CollectionWallDecoration.tab数据读取 -------------------------------------------------------
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品配置
|
||||
---@param id number
|
||||
---@return table
|
||||
local function GetColDecCfgList(id)
|
||||
local config = CollectionWallDecorationCfg[id]
|
||||
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XCollectionWallConfigs.GetColDecCfgList",
|
||||
"收藏品墙饰品配置", TABLE_COLLECTION_WALL_DECORATION, "Id", tostring(id))
|
||||
return {}
|
||||
end
|
||||
|
||||
return config
|
||||
end
|
||||
|
||||
---
|
||||
--- 获取全部‘type’种类的收藏品墙饰品配置数组
|
||||
---@param type number
|
||||
---@return table
|
||||
function XCollectionWallConfigs.GetColDecCfgListByType(type)
|
||||
local result = {}
|
||||
|
||||
for _,data in pairs(CollectionWallDecorationCfg) do
|
||||
if data.Type == type then
|
||||
table.insert(result,data)
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的种类
|
||||
---@param id number
|
||||
---@return number
|
||||
function XCollectionWallConfigs.GetColDecType(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.Type
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的名称
|
||||
---@param id number
|
||||
---@return string
|
||||
function XCollectionWallConfigs.GetColDecName(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.Name
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的图标
|
||||
---@param id number
|
||||
---@return string
|
||||
function XCollectionWallConfigs.GetColDecIcon(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.Icon
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的路径
|
||||
---@param id number
|
||||
---@return string
|
||||
function XCollectionWallConfigs.GetColDecPath(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.Path
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的解锁类型
|
||||
---@param id number
|
||||
---@return number
|
||||
function XCollectionWallConfigs.GetColDecUnlockType(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.UnlockType
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的解锁条件
|
||||
---@param id number
|
||||
---@return number
|
||||
function XCollectionWallConfigs.GetColDecCondition(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.Condition
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的解锁描述
|
||||
---@param id number
|
||||
---@return string
|
||||
function XCollectionWallConfigs.GetColDecLockDesc(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.LockDesc
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品墙饰品的排序值
|
||||
---@param id number
|
||||
---@return string
|
||||
function XCollectionWallConfigs.GetColDecRank(id)
|
||||
local cfg = GetColDecCfgList(id)
|
||||
return cfg.Rank
|
||||
end
|
||||
|
||||
|
||||
------------------------------------------------------------------ CollectionSize.tab数据读取 -------------------------------------------------------
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品尺寸数据
|
||||
---@param id number
|
||||
---@return number
|
||||
local function GetCollectionSizeCfg(id)
|
||||
local config = CollectionSizeCfg[id]
|
||||
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XCollectionWallConfigs.GetColDecCfgList",
|
||||
"收藏品尺寸配置", TABLE_COLLECTION_SIZE, "Id", tostring(id))
|
||||
return {}
|
||||
end
|
||||
|
||||
return config
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品尺寸
|
||||
---@param id number
|
||||
---@return number
|
||||
function XCollectionWallConfigs.GetCollectionSize(id)
|
||||
local cfg = GetCollectionSizeCfg(id)
|
||||
return cfg.Size
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品缩放系数
|
||||
---@param id number
|
||||
---@return number
|
||||
function XCollectionWallConfigs.GetCollectionScale(id)
|
||||
local cfg = GetCollectionSizeCfg(id)
|
||||
return cfg.Scale
|
||||
end
|
||||
|
||||
---
|
||||
--- 根据'id'获取收藏品占用的格子
|
||||
---@param id number
|
||||
---@return number
|
||||
function XCollectionWallConfigs.GetCollectionGridNum(id)
|
||||
local cfg = GetCollectionSizeCfg(id)
|
||||
return cfg.GridNum
|
||||
end
|
184
Script/matrix/xconfig/XComeAcrossConfig.lua
Normal file
184
Script/matrix/xconfig/XComeAcrossConfig.lua
Normal file
|
@ -0,0 +1,184 @@
|
|||
XComeAcrossConfig = XComeAcrossConfig or {}
|
||||
|
||||
ComeAcrossGameType = {
|
||||
GAME_CLICK = 1,
|
||||
GAME_ELIMINATE = 2,
|
||||
}
|
||||
|
||||
local TABLE_COMEACROSS = "Share/Trust/TrustGameConfig.tab";
|
||||
local TABLE_COMEACROSS_CLICK_POOL = "Share/Trust/TrustGameClickPool.tab";
|
||||
local TABLE_COMEACROSS_ELIMINATE_POOL = "Share/Trust/TrustGameEliminatePool.tab";
|
||||
local TABLE_COMEACROSS_REWARD = "Share/Trust/TrustGameReward.tab";
|
||||
local TABLE_COMEACROSS_POSITION = "Share/Trust/TrustGamePosition.tab";
|
||||
local TABLE_COMEACROSS_GRID = "Share/Trust/TrustGameGrid.tab";
|
||||
local TABLE_COMEACROSS_GAMETYPE = "Share/Trust/TrustGameTypeConfig.tab";
|
||||
|
||||
local ComeAcrossConfig = {}
|
||||
local ComeAcrossClickPoolConfig = {}
|
||||
local ComeAcrossEliminatePoolConfig = {}
|
||||
local ComeAcrossRewardConfig = {}
|
||||
local ComeAcrossPositionConfig = {}
|
||||
local ComeAcrossGridConfig = {}
|
||||
local ComeAcrossGameTypeConfig = {}
|
||||
|
||||
local GameTypePools = {}
|
||||
|
||||
function XComeAcrossConfig.Init()
|
||||
ComeAcrossConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS, XTable.XTableTrustGameConfig, "Id")
|
||||
ComeAcrossRewardConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS_REWARD, XTable.XTableTrustGameReward, "Id")
|
||||
ComeAcrossClickPoolConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS_CLICK_POOL, XTable.XTableTrustGameClickPool, "Id")
|
||||
ComeAcrossEliminatePoolConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS_ELIMINATE_POOL, XTable.XTableTrustGameEliminatePool, "Id")
|
||||
ComeAcrossPositionConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS_POSITION, XTable.XTableTrustGamePosition, "Id")
|
||||
ComeAcrossGridConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS_GRID, XTable.XTableTrustGameGrid, "Id")
|
||||
ComeAcrossGameTypeConfig = XTableManager.ReadByIntKey(TABLE_COMEACROSS_GAMETYPE, XTable.XTableTrustGameTypeConfig, "Id")
|
||||
|
||||
GameTypePools[ComeAcrossGameType.GAME_CLICK] = ComeAcrossClickPoolConfig
|
||||
GameTypePools[ComeAcrossGameType.GAME_ELIMINATE] = ComeAcrossEliminatePoolConfig
|
||||
end
|
||||
|
||||
--获取小游戏关卡表
|
||||
function XComeAcrossConfig.GetComeAcrossConfig()
|
||||
return ComeAcrossConfig
|
||||
end
|
||||
|
||||
--获取小游戏关卡
|
||||
function XComeAcrossConfig.GetComeAcrossConfigById(id)
|
||||
if not ComeAcrossConfig then
|
||||
return
|
||||
end
|
||||
|
||||
return ComeAcrossConfig[id]
|
||||
end
|
||||
|
||||
--获取小游戏内容
|
||||
function XComeAcrossConfig.GetComeAcrossTypeConfigById(id)
|
||||
if not ComeAcrossGameTypeConfig then
|
||||
return
|
||||
end
|
||||
|
||||
return ComeAcrossGameTypeConfig[id]
|
||||
end
|
||||
|
||||
--获取小游戏位置
|
||||
function XComeAcrossConfig.GetComeAcrossPositionConfigById(id)
|
||||
if not ComeAcrossPositionConfig then
|
||||
return
|
||||
end
|
||||
|
||||
return ComeAcrossPositionConfig[id]
|
||||
end
|
||||
|
||||
|
||||
--获得奖励
|
||||
function XComeAcrossConfig.GetComeAcrossRewardConfigById(id)
|
||||
if not ComeAcrossRewardConfig then
|
||||
return
|
||||
end
|
||||
|
||||
return ComeAcrossRewardConfig[id]
|
||||
end
|
||||
|
||||
--根据类型获取小游戏消除元素
|
||||
function XComeAcrossConfig.GetComeAcrossGridConfigById(gridType)
|
||||
if not ComeAcrossGridConfig then
|
||||
return
|
||||
end
|
||||
|
||||
for _,v in ipairs(ComeAcrossGridConfig) do
|
||||
if v.Type == gridType then
|
||||
return v
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
--随机获取N个小游戏
|
||||
function XComeAcrossConfig.RandomNumberGetGameConfig(count)
|
||||
if not ComeAcrossConfig then
|
||||
return
|
||||
end
|
||||
|
||||
local length = #ComeAcrossConfig
|
||||
if length <= count then
|
||||
return ComeAcrossConfig
|
||||
end
|
||||
|
||||
local temp = {}
|
||||
|
||||
for _, v in ipairs(ComeAcrossConfig) do
|
||||
table.insert(temp, v)
|
||||
end
|
||||
|
||||
local games = {}
|
||||
|
||||
for i = 1, count, 1 do
|
||||
local sum = #temp
|
||||
local rand = math.random(1, sum)
|
||||
local gameTable = {}
|
||||
gameTable.GameConfig = table.remove(temp, rand)
|
||||
gameTable.TypeOfGames = XComeAcrossConfig.RandomNumberGetGameConfigFormPoolByType(gameTable.GameConfig.Count, gameTable.GameConfig.Type,gameTable.GameConfig.Difficult)
|
||||
gameTable.Position = ComeAcrossPositionConfig[i]
|
||||
table.insert(games, gameTable)
|
||||
end
|
||||
|
||||
return games
|
||||
end
|
||||
|
||||
--从游戏类型池随出特定类型和数量的游戏关卡
|
||||
function XComeAcrossConfig.RandomNumberGetGameConfigFormPoolByType(count, gameType,difficult)
|
||||
local pools = GameTypePools[gameType]
|
||||
|
||||
if not pools or #pools <= count then
|
||||
return pools
|
||||
end
|
||||
|
||||
--筛选难度
|
||||
local pool = {}
|
||||
for _,v in ipairs(pools) do
|
||||
if v.Difficult == difficult then
|
||||
table.insert(pool,v)
|
||||
end
|
||||
end
|
||||
|
||||
if not pool or #pool <= count then
|
||||
return pool
|
||||
end
|
||||
|
||||
--获取权重总和
|
||||
local sum = 0
|
||||
for _, v in ipairs(pool) do
|
||||
sum = sum + v.Weight
|
||||
end
|
||||
|
||||
--设置随机数种子
|
||||
math.randomseed(os.time())
|
||||
|
||||
--随机数加上权重,越大的权重,数值越大
|
||||
local weightList = {}
|
||||
for i, v in ipairs(pool) do
|
||||
local rand = math.random(0, sum)
|
||||
local seed = {}
|
||||
seed.Index = i
|
||||
seed.Weight = rand + v.Weight
|
||||
table.insert(weightList, seed)
|
||||
end
|
||||
|
||||
--排序
|
||||
table.sort(weightList, function(x, y)
|
||||
return x.Weight > y.Weight
|
||||
end)
|
||||
|
||||
--返回最大的权重值的前几个
|
||||
local typeOfGames = {}
|
||||
|
||||
for i = 1, count, 1 do
|
||||
local index = weightList[i].Index
|
||||
if pool[index] then
|
||||
table.insert(typeOfGames,pool[index] )
|
||||
end
|
||||
end
|
||||
|
||||
return typeOfGames
|
||||
end
|
||||
|
97
Script/matrix/xconfig/XCommunicationConfig.lua
Normal file
97
Script/matrix/xconfig/XCommunicationConfig.lua
Normal file
|
@ -0,0 +1,97 @@
|
|||
XCommunicationConfig = XCommunicationConfig or {}
|
||||
|
||||
local TABLE_FUNCTION_COMMUNICATION_PATH = "Share/Functional/FunctionalCommunication.tab"
|
||||
local TABLE_FUNCTION_FESTIVAL_COMMUNICATION_PATH = "Share/Functional/FunctionalFestivalCommunication.tab"
|
||||
local TABLE_FUNCTION_INITIATIVE_COMMUNICATION_PATH = "Share/Functional/FunctionalInitiativeCommunication.tab"
|
||||
local TABLE_FUNCTION_INITIATIVE_CONTENTS_PATH = "Client/Functional/FunctionalContents.tab"
|
||||
|
||||
local FunctionCommunicationConfig = {}
|
||||
local FunctionFestivalCommunicationConfig = {}
|
||||
local FunctionInitiativeCommunicationConfig = {}
|
||||
local FunctionFestivalCommunicationDic = {}
|
||||
|
||||
local FunctionalContentsConfig = {}
|
||||
local FunctionalContentsGroupIdDic = {}
|
||||
|
||||
XCommunicationConfig.ComminictionType = {
|
||||
NormalType = 1,
|
||||
OptionType = 2,
|
||||
}
|
||||
|
||||
function XCommunicationConfig.Init()
|
||||
FunctionCommunicationConfig = XTableManager.ReadByIntKey(TABLE_FUNCTION_COMMUNICATION_PATH, XTable.XTableFunctionalCommunication, "Id")
|
||||
FunctionFestivalCommunicationConfig = XTableManager.ReadByIntKey(TABLE_FUNCTION_FESTIVAL_COMMUNICATION_PATH, XTable.XTableFunctionalFestivalCommunication, "Id")
|
||||
FunctionInitiativeCommunicationConfig = XTableManager.ReadByIntKey(TABLE_FUNCTION_INITIATIVE_COMMUNICATION_PATH, XTable.XTableFunctionalCommunication, "Id")
|
||||
FunctionalContentsConfig = XTableManager.ReadByIntKey(TABLE_FUNCTION_INITIATIVE_CONTENTS_PATH, XTable.XTableFunctionalContents, "Id")
|
||||
XCommunicationConfig.SetFunctionFestivalCommunicationDic()
|
||||
XCommunicationConfig.InitFunctionalContentsGroup()
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionCommunicationConfig()
|
||||
return FunctionCommunicationConfig
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionFestivalCommunicationConfig()
|
||||
return FunctionFestivalCommunicationConfig
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionFestivalCommunicationDicByType(type)
|
||||
return FunctionFestivalCommunicationDic[type]
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionInitiativeCommunicationConfig()
|
||||
return FunctionInitiativeCommunicationConfig
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionInitiativeCommunicationConfigById(commuId)
|
||||
return FunctionInitiativeCommunicationConfig[commuId]
|
||||
end
|
||||
|
||||
function XCommunicationConfig.SetFunctionFestivalCommunicationDic()
|
||||
for _, communication in pairs(FunctionFestivalCommunicationConfig) do
|
||||
local functionFestivalCommunicationType = FunctionFestivalCommunicationDic[communication.Type]
|
||||
if not functionFestivalCommunicationType then
|
||||
functionFestivalCommunicationType = {}
|
||||
FunctionFestivalCommunicationDic[communication.Type] = functionFestivalCommunicationType
|
||||
end
|
||||
table.insert(functionFestivalCommunicationType, communication)
|
||||
end
|
||||
end
|
||||
|
||||
function XCommunicationConfig.InitFunctionalContentsGroup()
|
||||
for _, communication in pairs(FunctionalContentsConfig) do
|
||||
local functionalComList = FunctionalContentsGroupIdDic[communication.GroupId]
|
||||
if not functionalComList then
|
||||
functionalComList = {}
|
||||
FunctionalContentsGroupIdDic[communication.GroupId] = functionalComList
|
||||
end
|
||||
|
||||
if communication.Type == XCommunicationConfig.ComminictionType.NormalType and #communication.OptionTitle > 0 then
|
||||
XLog.Error("XCommunicationConfig.InitFunctionalContentsGroup".."配置表项"..TABLE_FUNCTION_INITIATIVE_CONTENTS_PATH.."不应该配置按钮,ID:"..tostring(communication.Id))
|
||||
end
|
||||
|
||||
table.insert(functionalComList, communication)
|
||||
end
|
||||
for _, communicationList in pairs(FunctionalContentsGroupIdDic) do
|
||||
table.sort(communicationList,function(a, b)
|
||||
return a.Id < b.Id
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionalContentsInfoById(id)
|
||||
if not FunctionalContentsConfig[id] then
|
||||
XLog.ErrorTableDataNotFound("XCommunicationConfig.GetFunctionalContentsInfoById", "配置表项", TABLE_FUNCTION_INITIATIVE_CONTENTS_PATH, "Id", tostring(id))
|
||||
end
|
||||
return FunctionalContentsConfig[id]
|
||||
end
|
||||
|
||||
function XCommunicationConfig.GetFunctionalContentsGroupFirstInfoByGroupId(groupId)
|
||||
if not FunctionalContentsGroupIdDic[groupId] or not FunctionalContentsGroupIdDic[groupId][1] then
|
||||
XLog.ErrorTableDataNotFound("XCommunicationConfig.GetFunctionalContentsGroupListByGroupId", "配置表项", TABLE_FUNCTION_INITIATIVE_CONTENTS_PATH, "GroupId", tostring(groupId))
|
||||
end
|
||||
return FunctionalContentsGroupIdDic[groupId][1]
|
||||
end
|
||||
|
||||
|
||||
|
145
Script/matrix/xconfig/XComposeGameConfig.lua
Normal file
145
Script/matrix/xconfig/XComposeGameConfig.lua
Normal file
|
@ -0,0 +1,145 @@
|
|||
-- 组合小游戏Config
|
||||
XComposeGameConfig = XComposeGameConfig or {}
|
||||
|
||||
-- ===================表地址====================
|
||||
local SHARE_TABLE_PATH = "Share/MiniActivity/ComposeGame/"
|
||||
local CLIENT_TABLE_PATH = "Client/MiniActivity/ComposeGame/"
|
||||
|
||||
local TABLE_GAMECONFIGS = SHARE_TABLE_PATH .. "ComposeGame.tab"
|
||||
local TABLE_GOODS = SHARE_TABLE_PATH .. "ComposeGoods.tab"
|
||||
local TABLE_CLIENT_CONFIG = CLIENT_TABLE_PATH .. "ComposeClientConfig.tab"
|
||||
--=================================================
|
||||
-- ===================原表数据===================
|
||||
local GameConfigs = {}
|
||||
local GoodsConfigs = {}
|
||||
local ClientConfig = {}
|
||||
--=================================================
|
||||
|
||||
-- ================构建搜索用字典================
|
||||
local GameId2GoodsDic = {}
|
||||
local GameId2ClientConfigDic = {}
|
||||
--=================================================
|
||||
|
||||
--==================初始化方法======================
|
||||
--===============
|
||||
--构建活动ID<-->活动道具列表字典
|
||||
--===============
|
||||
local CreateGameId2GoodsDic = function()
|
||||
for _, good in pairs(GoodsConfigs) do
|
||||
if not GameId2GoodsDic[good.ActId] then GameId2GoodsDic[good.ActId] = {} end
|
||||
table.insert(GameId2GoodsDic[good.ActId], good)
|
||||
end
|
||||
end
|
||||
--===============
|
||||
--构建活动ID<-->活动客户端配置字典
|
||||
--===============
|
||||
local CreateGameId2ClientConfigDic = function()
|
||||
for id, config in pairs(ClientConfig) do
|
||||
-- 通用配置不进入构建字典
|
||||
if id > 0 then GameId2ClientConfigDic[config.ActId] = config end
|
||||
end
|
||||
end
|
||||
--===============
|
||||
--初始化表配置
|
||||
--===============
|
||||
function XComposeGameConfig.Init()
|
||||
GameConfigs = XTableManager.ReadByIntKey(TABLE_GAMECONFIGS, XTable.XTableComposeGame, "Id")
|
||||
GoodsConfigs = XTableManager.ReadByIntKey(TABLE_GOODS, XTable.XTableComposeGoods, "Id")
|
||||
ClientConfig = XTableManager.ReadByIntKey(TABLE_CLIENT_CONFIG, XTable.XTableComposeClientConfig, "Id")
|
||||
CreateGameId2GoodsDic()
|
||||
CreateGameId2ClientConfigDic()
|
||||
end
|
||||
--==================================================
|
||||
--==================读表方法======================
|
||||
|
||||
--===============
|
||||
--获取所有组合小游戏活动基础配置
|
||||
--===============
|
||||
function XComposeGameConfig.GetGameConfigs()
|
||||
return GameConfigs
|
||||
end
|
||||
--===============
|
||||
--根据Id获取组合小游戏活动基础配置
|
||||
--@param gameId:活动ID
|
||||
--===============
|
||||
function XComposeGameConfig.GetGameConfigsByGameId(gameId)
|
||||
local config = GameConfigs[gameId]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XComposeGameConfig.GetGameConfigsByGameId",
|
||||
"组合小游戏活动基础配置数据",
|
||||
TABLE_GAMECONFIGS,
|
||||
"Id",
|
||||
tostring(gameId)
|
||||
)
|
||||
return nil
|
||||
end
|
||||
return config
|
||||
end
|
||||
--===============
|
||||
--获取所有组合小游戏物品配置
|
||||
--===============
|
||||
function XComposeGameConfig.GetGoodsConfigs()
|
||||
return GoodsConfigs
|
||||
end
|
||||
--===============
|
||||
--根据Id获取组合小游戏物品配置
|
||||
--@param itemId:物品ID
|
||||
--===============
|
||||
function XComposeGameConfig.GetItemConfigByItemId(itemId)
|
||||
local config = GoodsConfigs[itemId]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XComposeGameConfig.GetItemConfigByItemId",
|
||||
"组合小游戏物品配置数据",
|
||||
TABLE_GOODS,
|
||||
"Id",
|
||||
tostring(itemId)
|
||||
)
|
||||
return nil
|
||||
end
|
||||
return config
|
||||
end
|
||||
--===============
|
||||
--根据活动Id获取活动对应的所有物品配置
|
||||
--@param gameId:活动ID
|
||||
--===============
|
||||
function XComposeGameConfig.GetItemListConfigByGameId(gameId)
|
||||
local itemCfgsList = GameId2GoodsDic[gameId]
|
||||
if not itemCfgsList then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XComposeGameConfig.GetItemListConfigByGameId",
|
||||
"组合小游戏物品配置数据",
|
||||
TABLE_GOODS,
|
||||
"ActId",
|
||||
tostring(gameId)
|
||||
)
|
||||
return nil
|
||||
end
|
||||
return itemCfgsList
|
||||
end
|
||||
--===============
|
||||
--根据活动ID获取组合小游戏客户端配置(对个别组合小游戏的客户端配置)
|
||||
--@param gameId:活动ID
|
||||
--===============
|
||||
function XComposeGameConfig.GetClientConfigByGameId(gameId)
|
||||
local config = GameId2ClientConfigDic[gameId]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XComposeGameConfig.GetClientConfigByGameId",
|
||||
"组合小游戏活动客户端配置",
|
||||
TABLE_CLIENT_CONFIG,
|
||||
"ActId",
|
||||
tostring(gameId)
|
||||
)
|
||||
return nil
|
||||
end
|
||||
return config
|
||||
end
|
||||
--===============
|
||||
--获取组合小游戏默认客户端配置(全组合小游戏通用配置)
|
||||
--===============
|
||||
function XComposeGameConfig.GetDefaultConfig()
|
||||
return ClientConfig[0]
|
||||
end
|
||||
--==================================================
|
23
Script/matrix/xconfig/XComposeMiniGameConfig.lua
Normal file
23
Script/matrix/xconfig/XComposeMiniGameConfig.lua
Normal file
|
@ -0,0 +1,23 @@
|
|||
XComposeMiniGameConfig = XComposeMiniGameConfig or {}
|
||||
|
||||
-- ===================表地址
|
||||
local SHARE_TABLE_PATH = "Share/MiniActivity/ComposeGame/"
|
||||
local CLIENT_TABLE_PATH = "Client/MiniActivity/ComposeGame/"
|
||||
|
||||
local TABLE_COMPOSE_GAME = SHARE_TABLE_PATH .. "ComposeGame.tab"
|
||||
local TABLE_COMPOSE_GOODS = SHARE_TABLE_PATH .. "ComposeGoods.tab"
|
||||
|
||||
-- ===================原表数据
|
||||
local ComposeGameConfig = {}
|
||||
local ComposeGoodsConfig = {}
|
||||
|
||||
--================
|
||||
--初始化Config
|
||||
--================
|
||||
function XComposeMiniGameConfig.Init()
|
||||
XComposeMiniGameConfig.InitConfig()
|
||||
end
|
||||
|
||||
function XComposeMiniGameConfig.InitConfig()
|
||||
|
||||
end
|
38
Script/matrix/xconfig/XConfig.lua
Normal file
38
Script/matrix/xconfig/XConfig.lua
Normal file
|
@ -0,0 +1,38 @@
|
|||
local type = type
|
||||
|
||||
--配置基类(存储通用方法)
|
||||
XConfig = XClass(nil, "XConfig")
|
||||
|
||||
function XConfig:Ctor(path, xTable, primaryKey)
|
||||
primaryKey = primaryKey or "Id"
|
||||
self.Path = path
|
||||
self.XTable = xTable
|
||||
self.Configs = XTableManager.ReadByIntKey(path, xTable, primaryKey)
|
||||
end
|
||||
|
||||
function XConfig:GetPath()
|
||||
return self.Path or ""
|
||||
end
|
||||
|
||||
function XConfig:GetConfigs()
|
||||
return self.Configs
|
||||
end
|
||||
|
||||
function XConfig:GetConfig(key)
|
||||
local config = self.Configs[key]
|
||||
if not config then
|
||||
XLog.Error(string.format("配置不存在, Id: %s, 配置路径:%s ", key, self.Path))
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XConfig:GetProperty(key, name)
|
||||
local config = self:GetConfig(key)
|
||||
local property = config[name]
|
||||
if nil == property and XTableManager.GetTypeDefaultValue(self.XTable[name].ValueType) ~= property then
|
||||
XLog.Error(string.format("配置字段未定义, 配置路径: %s, 配置Id:%s, 字段名称: %s", self.Path, key, name))
|
||||
return
|
||||
end
|
||||
return property
|
||||
end
|
306
Script/matrix/xconfig/XConfigCenter.lua
Normal file
306
Script/matrix/xconfig/XConfigCenter.lua
Normal file
|
@ -0,0 +1,306 @@
|
|||
XConfigCenter = XConfigCenter or {}
|
||||
|
||||
XConfigCenter.DirectoryType = {
|
||||
Share = 1,
|
||||
Client = 2,
|
||||
}
|
||||
|
||||
local IsWindowsEditor = XMain.IsWindowsEditor
|
||||
local ConfigCenterProfiler = nil
|
||||
|
||||
local function InitConfig(config, key)
|
||||
if IsWindowsEditor then
|
||||
local profiler = ConfigCenterProfiler:CreateChild(key)
|
||||
profiler:Start()
|
||||
-- XPerformance.RecordLuaMemData(key, function()
|
||||
config.Init()
|
||||
-- end)
|
||||
profiler:Stop()
|
||||
else
|
||||
config.Init()
|
||||
end
|
||||
end
|
||||
|
||||
function XConfigCenter.Init()
|
||||
ConfigCenterProfiler = XGame.Profiler:CreateChild("XConfigCenter")
|
||||
ConfigCenterProfiler:Start()
|
||||
|
||||
InitConfig(XDlcConfig,"XDlcConfig")
|
||||
|
||||
-- 新拆分出的Config
|
||||
InitConfig(XAssistConfig, "XAssistConfig")
|
||||
InitConfig(XAutoFightConfig, "XAutoFightConfig")
|
||||
InitConfig(XFubenBossOnlineConfig, "XFubenBossOnlineConfig")
|
||||
InitConfig(XFubenUrgentEventConfig, "XFubenUrgentEventConfig")
|
||||
InitConfig(XLoadingConfig, "XLoadingConfig")
|
||||
InitConfig(XTeamConfig, "XTeamConfig")
|
||||
InitConfig(XFunctionConfig, "XFunctionConfig")
|
||||
|
||||
InitConfig(XAttribConfigs, "XAttribConfigs")
|
||||
InitConfig(XUiConfigs, "XUiConfigs")
|
||||
InitConfig(XGuideConfig, "XGuideConfig")
|
||||
InitConfig(XItemConfigs, "XItemConfigs")
|
||||
InitConfig(XCharacterConfigs, "XCharacterConfigs")
|
||||
InitConfig(XSignBoardConfigs, "XSignBoardConfigs")
|
||||
InitConfig(XEquipConfig, "XEquipConfig")
|
||||
InitConfig(XComeAcrossConfig, "XComeAcrossConfig")
|
||||
InitConfig(XFavorabilityConfigs, "XFavorabilityConfigs")
|
||||
InitConfig(XArenaConfigs, "XArenaConfigs")
|
||||
InitConfig(XArenaOnlineConfigs, "XArenaOnlineConfigs")
|
||||
InitConfig(XTrialConfigs, "XTrialConfigs")
|
||||
InitConfig(XCommunicationConfig, "XCommunicationConfig")
|
||||
InitConfig(XPrequelConfigs, "XPrequelConfigs")
|
||||
InitConfig(XTaskConfig, "XTaskConfig")
|
||||
InitConfig(XFubenConfigs, "XFubenConfigs")
|
||||
InitConfig(XTaskForceConfigs, "XTaskForceConfigs")
|
||||
InitConfig(XDrawConfigs, "XDrawConfigs")
|
||||
InitConfig(XGachaConfigs, "XGachaConfigs")
|
||||
InitConfig(XFubenMainLineConfigs, "XFubenMainLineConfigs")
|
||||
InitConfig(XFubenBossSingleConfigs, "XFubenBossSingleConfigs")
|
||||
InitConfig(XFubenExperimentConfigs, "XFubenExperimentConfigs")
|
||||
InitConfig(XMailConfigs, "XMailConfigs")
|
||||
InitConfig(XBfrtConfigs, "XBfrtConfigs")
|
||||
InitConfig(XBountyTaskConfigs, "XBountyTaskConfigs")
|
||||
--InitConfig(XHostelConfigs, "XHostelConfigs")
|
||||
InitConfig(XBaseEquipConfigs, "XBaseEquipConfigs")
|
||||
InitConfig(XFurnitureConfigs, "XFurnitureConfigs")
|
||||
InitConfig(XPayConfigs, "XPayConfigs")
|
||||
InitConfig(XFubenExploreConfigs, "XFubenExploreConfigs")
|
||||
InitConfig(XFubenActivityBranchConfigs, "XFubenActivityBranchConfigs")
|
||||
InitConfig(XFubenActivityBossSingleConfigs, "XFubenActivityBossSingleConfigs")
|
||||
InitConfig(XFubenRepeatChallengeConfigs, "XFubenRepeatChallengeConfigs")
|
||||
InitConfig(XDormConfig, "XDormConfig")
|
||||
InitConfig(XMovieConfigs, "XMovieConfigs")
|
||||
InitConfig(XExhibitionConfigs, "XExhibitionConfigs")
|
||||
InitConfig(XAutoWindowConfigs, "XAutoWindowConfigs")
|
||||
InitConfig(XPlayerInfoConfigs, "XPlayerInfoConfigs")
|
||||
InitConfig(XSignInConfigs, "XSignInConfigs")
|
||||
InitConfig(XReportConfigs, "XReportConfigs")
|
||||
|
||||
InitConfig(XPracticeConfigs, "XPracticeConfigs")
|
||||
InitConfig(XFubenUnionKillConfigs, "XFubenUnionKillConfigs")
|
||||
InitConfig(XFubenSpecialTrainConfig, "XFubenSpecialTrainConfig")
|
||||
InitConfig(XShopConfigs, "XShopConfigs")
|
||||
InitConfig(XHelpCourseConfig, "XHelpCourseConfig")
|
||||
InitConfig(XMedalConfigs, "XMedalConfigs")
|
||||
InitConfig(XArchiveConfigs, "XArchiveConfigs")
|
||||
InitConfig(XGuildConfig, "XGuildConfig")
|
||||
InitConfig(XFestivalActivityConfig, "XFestivalActivityConfig")
|
||||
InitConfig(XFubenBabelTowerConfigs, "XFubenBabelTowerConfigs")
|
||||
InitConfig(XFubenRogueLikeConfig, "XFubenRogueLikeConfig")
|
||||
InitConfig(XMarketingActivityConfigs, "XMarketingActivityConfigs")
|
||||
InitConfig(XFubenAssignConfigs, "XFubenAssignConfigs")
|
||||
InitConfig(XRegressionConfigs, "XRegressionConfigs")
|
||||
InitConfig(XPlatformShareConfigs, "XPlatformShareConfigs")
|
||||
InitConfig(XRewardConfigs, "XRewardConfigs")
|
||||
InitConfig(XMusicPlayerConfigs, "XMusicPlayerConfigs")
|
||||
InitConfig(XFubenExtraChapterConfigs, "XFubenExtraChapterConfigs")
|
||||
InitConfig(XFubenShortStoryChapterConfigs, "XFubenShortStoryChapterConfigs")
|
||||
InitConfig(XDailyDungeonConfigs, "XDailyDungeonConfigs")
|
||||
InitConfig(XCharacterUiEffectConfig, "XCharacterUiEffectConfig")
|
||||
InitConfig(XHeadPortraitConfigs, "XHeadPortraitConfigs")
|
||||
InitConfig(XGuildBossConfig, "XGuildBossConfig")
|
||||
InitConfig(XEliminateGameConfig, "XEliminateGameConfig")
|
||||
InitConfig(XWorldBossConfigs, "XWorldBossConfigs")
|
||||
InitConfig(XMaintainerActionConfigs, "XMaintainerActionConfigs")
|
||||
|
||||
InitConfig(XExpeditionConfig, "XExpeditionConfig")
|
||||
InitConfig(XRpgTowerConfig, "XRpgTowerConfig")
|
||||
InitConfig(XClickClearGameConfigs, "XClickClearGameConfigs")
|
||||
InitConfig(XFubenZhouMuConfigs, "XFubenZhouMuConfigs")
|
||||
InitConfig(XNieRConfigs, "XNieRConfigs")
|
||||
InitConfig(XMentorSystemConfigs, "XMentorSystemConfigs")
|
||||
InitConfig(XCollectionWallConfigs, "XCollectionWallConfigs")
|
||||
InitConfig(XActivityConfigs, "XActivityConfigs")
|
||||
InitConfig(XPurchaseConfigs, "XPurchaseConfigs")
|
||||
InitConfig(XActivityBriefConfigs, "XActivityBriefConfigs")
|
||||
InitConfig(XSetConfigs, "XSetConfigs")
|
||||
InitConfig(XRedEnvelopeConfigs, "XRedEnvelopeConfigs")
|
||||
InitConfig(XVideoConfig, "XVideoConfig")
|
||||
InitConfig(XWeaponFashionConfigs, "XWeaponFashionConfigs")
|
||||
InitConfig(XFubenInfestorExploreConfigs, "XFubenInfestorExploreConfigs")
|
||||
InitConfig(XPuzzleActivityConfigs, "XPuzzleActivityConfigs")
|
||||
InitConfig(XChatConfigs, "XChatConfigs")
|
||||
InitConfig(XPhotographConfigs, "XPhotographConfigs")
|
||||
InitConfig(XTRPGConfigs, "XTRPGConfigs")
|
||||
InitConfig(XPokemonConfigs, "XPokemonConfigs")
|
||||
InitConfig(XSpringFestivalActivityConfigs, "XSpringFestivalActivityConfigs")
|
||||
InitConfig(XFubenActivityPuzzleConfigs, "XFubenActivityPuzzleConfigs")
|
||||
InitConfig(XFubenNewCharConfig, "XFubenNewCharConfig")
|
||||
InitConfig(XSceneModelConfigs, "XSceneModelConfigs")
|
||||
InitConfig(XRoomCharFilterTipsConfigs, "XRoomCharFilterTipsConfigs")
|
||||
InitConfig(XChessPursuitConfig, "XChessPursuitConfig")
|
||||
InitConfig(XComposeGameConfig, "XComposeGameConfig")
|
||||
InitConfig(XLottoConfigs, "XLottoConfigs")
|
||||
InitConfig(XPartnerConfigs, "XPartnerConfigs")
|
||||
InitConfig(XWhiteValentineConfig, "XWhiteValentineConfig")
|
||||
InitConfig(XSpecialShopConfigs, "XSpecialShopConfigs")
|
||||
InitConfig(XFashionConfigs, "XFashionConfigs")
|
||||
InitConfig(XFingerGuessingConfig, "XFingerGuessingConfig")
|
||||
InitConfig(XReformConfigs, "XReformConfigs")
|
||||
InitConfig(XPartnerTeachingConfigs, "XPartnerTeachingConfigs")
|
||||
InitConfig(XScratchTicketConfig, "XScratchTicketConfig")
|
||||
InitConfig(XRpgMakerGameConfigs, "XRpgMakerGameConfigs")
|
||||
InitConfig(XInvertCardGameConfig, "XInvertCardGameConfig")
|
||||
InitConfig(XMineSweepingConfigs, "XMineSweepingConfigs")
|
||||
InitConfig(XSuperTowerConfigs, "XSuperTowerConfigs")
|
||||
InitConfig(XFashionStoryConfigs, "XFashionStoryConfigs")
|
||||
InitConfig(XPassportConfigs, "XPassportConfigs")
|
||||
InitConfig(XGuardCampConfig, "XGuardCampConfig")
|
||||
InitConfig(XFubenSimulatedCombatConfig, "XFubenSimulatedCombatConfig")
|
||||
InitConfig(XChristmasTreeConfig, "XChristmasTreeConfig")
|
||||
InitConfig(XCoupletGameConfigs, "XCoupletGameConfigs")
|
||||
InitConfig(XStrongholdConfigs, "XStrongholdConfigs")
|
||||
InitConfig(XMoeWarConfig, "XMoeWarConfig")
|
||||
InitConfig(XMovieAssembleConfig, "XMovieAssembleConfig")
|
||||
InitConfig(XFubenHackConfig, "XFubenHackConfig")
|
||||
InitConfig(XFubenCoupleCombatConfig, "XFubenCoupleCombatConfig")
|
||||
InitConfig(XPokerGuessingConfig, "XPokerGuessingConfig")
|
||||
InitConfig(XKillZoneConfigs, "XKillZoneConfigs")
|
||||
InitConfig(XAreaWarConfigs, "XAreaWarConfigs")
|
||||
InitConfig(XSameColorGameConfigs, "XSameColorGameConfigs")
|
||||
InitConfig(XActivityCalendarConfigs, "XActivityCalendarConfigs")
|
||||
InitConfig(XMouthAnimeConfigs, "XMouthAnimeConfigs")
|
||||
InitConfig(XLivWarmActivityConfigs, "XLivWarmActivityConfigs")
|
||||
InitConfig(XLivWarmSoundsActivityConfig, "XLivWarmSoundsActivityConfig")
|
||||
InitConfig(XLivWarmExtActivityConfig, "XLivWarmSoundsActivityConfig")
|
||||
InitConfig(XLivWarmRaceConfigs, "XLivWarmRaceConfigs")
|
||||
InitConfig(XSuperSmashBrosConfig, "XSuperSmashBrosConfig")
|
||||
InitConfig(XPickFlipConfigs, "XPickFlipConfigs")
|
||||
InitConfig(XNewRegressionConfigs, "XNewRegressionConfigs")
|
||||
InitConfig(XMemorySaveConfig, "XMemorySaveConfig")
|
||||
InitConfig(XDiceGameConfigs, "XDiceGameConfigs")
|
||||
InitConfig(XTheatreConfigs, "XTheatreConfigs")
|
||||
InitConfig(XMaverickConfigs, "XMaverickConfigs")
|
||||
InitConfig(XAchievementConfigs, "XAchievementConfigs")
|
||||
InitConfig(XReviewActivityConfigs, "XReviewActivityConfigs")
|
||||
InitConfig(XDoomsdayConfigs, "XDoomsdayConfigs")
|
||||
InitConfig(XPivotCombatConfigs, "XPivotCombatConfigs")
|
||||
InitConfig(XNewYearLuckConfigs, "XNewYearLuckConfigs")
|
||||
InitConfig(XHitMouseConfigs, "XHitMouseConfigs")
|
||||
InitConfig(XEscapeConfigs, "XEscapeConfigs")
|
||||
InitConfig(XBodyCombineGameConfigs, "XBodyCombineGameConfigs")
|
||||
InitConfig(XGuildWarConfig, "XGuildWarConfig")
|
||||
InitConfig(XGoldenMinerConfigs, "XGoldenMinerConfigs")
|
||||
InitConfig(XDoubleTowersConfigs, "XDoubleTowersConfigs")
|
||||
InitConfig(XAccumulatedConsumeConfig, "XAccumulatedConsumeConfig")
|
||||
InitConfig(XMultiDimConfig, "XMultiDimConfig")
|
||||
InitConfig(XTaikoMasterConfigs, "XTaikoMasterConfigs")
|
||||
InitConfig(XGuildDormConfig, "XGuildDormConfig")
|
||||
InitConfig(XSlotMachineConfigs, "XSlotMachineConfigs")
|
||||
ConfigCenterProfiler:Stop()
|
||||
end
|
||||
|
||||
-- 创建配置表属性,主要是为了封装方法延时调用加载表
|
||||
function XConfigCenter.CreateGetPropertyByFunc(config, name, readFunc)
|
||||
config["Get" .. name] = function(key, showTip)
|
||||
if config[name] == nil then
|
||||
config[name] = readFunc()
|
||||
end
|
||||
if key then
|
||||
return XConfigCenter.GetValueByKey(key, showTip, config, name)
|
||||
end
|
||||
return config[name]
|
||||
end
|
||||
end
|
||||
|
||||
function XConfigCenter.CreateGetPropertyByArgs(config, name, funcName, path, tableConfig, readId)
|
||||
config[name] = nil
|
||||
config["Get" .. name] = function(key, showTip)
|
||||
if config[name] == nil then
|
||||
config[name] = XTableManager[funcName](path, tableConfig, readId)
|
||||
end
|
||||
if key then
|
||||
return XConfigCenter.GetValueByKey(key, showTip, config, name, path, readId)
|
||||
end
|
||||
return config[name]
|
||||
end
|
||||
end
|
||||
|
||||
function XConfigCenter.GetValueByKey(key, showTip, config, name, path, readId)
|
||||
local result = config[name][key]
|
||||
if not result and showTip then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
string.format("XConfigCenter.Get%s", name) ,
|
||||
string.format("配置%s_%s", name, readId),
|
||||
path or "",
|
||||
readId or "",
|
||||
tostring(key))
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function XConfigCenter.CreateGetProperties(config, names, args)
|
||||
local beginIndex = 1
|
||||
for i, name in ipairs(names) do
|
||||
beginIndex = i + 3 * (i - 1)
|
||||
XConfigCenter.CreateGetPropertyByArgs(config, name, args[beginIndex], args[beginIndex + 1], args[beginIndex + 2], args[beginIndex + 3])
|
||||
end
|
||||
end
|
||||
|
||||
function XConfigCenter.ReadTableByTableConfig(tableConfig, directoryName, tableName)
|
||||
local readFuncName = tableConfig.ReadFuncName or "ReadByIntKey"
|
||||
local readKeyName = tableConfig.ReadKeyName or "Id"
|
||||
local tablePath = "Share"
|
||||
if tableConfig.DirType == XConfigCenter.DirectoryType.Client then
|
||||
tablePath = "Client"
|
||||
end
|
||||
tablePath = string.format("%s/%s/%s.tab", tablePath, directoryName, tableName)
|
||||
return XTableManager[readFuncName](tablePath, XTable["XTable" .. tableName], readKeyName)
|
||||
end
|
||||
|
||||
function XConfigCenter.CreateTableConfig(value, name)
|
||||
if value then return value end
|
||||
local config = {}
|
||||
setmetatable(config, {
|
||||
__index = {
|
||||
--=============
|
||||
--给定配置表Key,获取该配置表全部配置
|
||||
--=============
|
||||
GetAllConfigs = function(tableKey)
|
||||
if not tableKey then
|
||||
XLog.Error("The tableKey given is not exist. tableKey : " .. tostring(tableKey))
|
||||
return {}
|
||||
end
|
||||
config.__Configs = config.__Configs or {}
|
||||
local result = config.__Configs[tableKey]
|
||||
if result == nil then
|
||||
result = XConfigCenter.ReadTableByTableConfig(tableKey, config.DirectoryName
|
||||
, tableKey.TableName or config.TableKey[tableKey])
|
||||
config.__Configs[tableKey] = result
|
||||
end
|
||||
return result
|
||||
end,
|
||||
--=============
|
||||
--给定配置表Key和Id,获取该配置表指定Id的配置
|
||||
--tableKey : 配置表的Key
|
||||
--idKey : 该配置表的主键Id或Key
|
||||
--noTips : 若没有查找到对应项,是否要打印错误日志
|
||||
--=============
|
||||
GetCfgByIdKey = function(tableKey, idKey, noTips)
|
||||
if not tableKey or not idKey then
|
||||
XLog.Error(string.format("%s.GetCfgByIdKey error: tableKey or idKey is null!", name))
|
||||
return {}
|
||||
end
|
||||
local allCfgs = config.GetAllConfigs(tableKey)
|
||||
if not allCfgs then
|
||||
return {}
|
||||
end
|
||||
local cfg = allCfgs[idKey]
|
||||
if not cfg then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
string.format( "%s.GetCfgByIdKey", name),
|
||||
tableKey.LogKey or "唯一Id",
|
||||
tableKey.TableName or config.TableKey[tableKey],
|
||||
tableKey.LogKey or "唯一Id",
|
||||
tostring(idKey))
|
||||
end
|
||||
return {}
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
}
|
||||
})
|
||||
return config
|
||||
end
|
148
Script/matrix/xconfig/XCoupletGameConfigs.lua
Normal file
148
Script/matrix/xconfig/XCoupletGameConfigs.lua
Normal file
|
@ -0,0 +1,148 @@
|
|||
local tableInsert = table.insert
|
||||
|
||||
XCoupletGameConfigs = XCoupletGameConfigs or {}
|
||||
|
||||
XCoupletGameConfigs.CouPletStatus = {
|
||||
Incomplete = 0,
|
||||
Complete = 1,
|
||||
}
|
||||
|
||||
XCoupletGameConfigs.PlayVideoState = {
|
||||
UnPlay = 0,
|
||||
Played = 1,
|
||||
}
|
||||
|
||||
XCoupletGameConfigs.HitFaceHelpState = {
|
||||
NotHit = 0,
|
||||
Hited = 1,
|
||||
}
|
||||
|
||||
XCoupletGameConfigs.HitFaceVideoState = {
|
||||
UnPlay = 0,
|
||||
Played = 1,
|
||||
}
|
||||
|
||||
-- XCoupletGameConfigs.COUPLET_GAME_DATA_KEY = "COUPLET_GAME_DATA_KEY" -- 对联游戏本地数据键
|
||||
XCoupletGameConfigs.COUPLET_GAME_HELP_HIT_KEY = "COUPLET_GAME_HELP_HIT_KEY" -- 对联游戏帮助打脸键
|
||||
XCoupletGameConfigs.COUPLET_GAME_VIDEO_HIT_KEY = "COUPLET_GAME_VIDEO_HIT_KEY" -- 对联游戏打脸剧情键
|
||||
XCoupletGameConfigs.PLAY_VIDEO_STATE_KEY = "COUPLET_PLAY_VIDEO_STATE_KEY" -- 剧情播放信息键
|
||||
|
||||
local COUPLET_ACTIVITY_BASE_PATH = "Share/MiniActivity/CoupletGame/CoupletActivityBase.tab"
|
||||
local COUPLET_PATH = "Share/MiniActivity/CoupletGame/Couplet.tab"
|
||||
local COUPLET_WORD_PATH = "Share/MiniActivity/CoupletGame/CoupletWord.tab"
|
||||
|
||||
local ActivityBaseTemplates = {}
|
||||
local CoupletTemplates = {}
|
||||
local CoupletTemplatesWithAct = {}
|
||||
local CoupletWordTemplates = {}
|
||||
local DownWordArrList = {}
|
||||
|
||||
function XCoupletGameConfigs.Init()
|
||||
ActivityBaseTemplates = XTableManager.ReadByIntKey(COUPLET_ACTIVITY_BASE_PATH, XTable.XTableCoupletActivityBase, "Id")
|
||||
CoupletTemplates = XTableManager.ReadByIntKey(COUPLET_PATH, XTable.XTableCouplet, "Id")
|
||||
CoupletWordTemplates = XTableManager.ReadByIntKey(COUPLET_WORD_PATH, XTable.XTabelCoupletWord, "Id")
|
||||
for _, coupletTemplet in ipairs(CoupletTemplates) do
|
||||
if coupletTemplet.ActivityId then
|
||||
if not CoupletTemplatesWithAct[coupletTemplet.ActivityId] then
|
||||
CoupletTemplatesWithAct[coupletTemplet.ActivityId] = {}
|
||||
end
|
||||
end
|
||||
|
||||
if CoupletTemplatesWithAct[coupletTemplet.ActivityId] then
|
||||
tableInsert(CoupletTemplatesWithAct[coupletTemplet.ActivityId], coupletTemplet)
|
||||
end
|
||||
end
|
||||
for _, coupletTemplate in pairs(CoupletTemplates) do
|
||||
if DownWordArrList[coupletTemplate.Id] == nil then
|
||||
DownWordArrList[coupletTemplate.Id] = {}
|
||||
end
|
||||
local downWordIdStrList = coupletTemplate.DownWordId
|
||||
for _, downWordIdStr in ipairs(downWordIdStrList) do
|
||||
local downWordIdArr = string.ToIntArray(downWordIdStr)
|
||||
tableInsert(DownWordArrList[coupletTemplate.Id], downWordIdArr)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletBaseActivityById(id)
|
||||
if not ActivityBaseTemplates or not next(ActivityBaseTemplates) or not ActivityBaseTemplates[id] then
|
||||
return
|
||||
end
|
||||
|
||||
return ActivityBaseTemplates[id]
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletTemplatesByActId(actId)
|
||||
if not CoupletTemplatesWithAct or not next(CoupletTemplatesWithAct) or not CoupletTemplatesWithAct[actId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplatesWithAct[actId]
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletTemplateById(id)
|
||||
if not CoupletTemplates or not next(CoupletTemplates) or not CoupletTemplates[id] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplates[id]
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletWordImageById(wordId)
|
||||
if not CoupletWordTemplates or not next(CoupletWordTemplates) or not CoupletWordTemplates[wordId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletWordTemplates[wordId].WordImageUrl
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletUpWordsId(coupletId)
|
||||
if not CoupletTemplates or not next(CoupletTemplates) or not CoupletTemplates[coupletId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplates[coupletId].UpWordId
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletBatch(coupletId)
|
||||
if not CoupletTemplates or not CoupletTemplates[coupletId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplates[coupletId].BatchUrl
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletDefaultBatch(coupletId)
|
||||
if not CoupletTemplates or not CoupletTemplates[coupletId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplates[coupletId].DefaultBatchUrl
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletUpImgUrl(coupletId)
|
||||
if not CoupletTemplates or not CoupletTemplates[coupletId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplates[coupletId].UpImgUrl
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletDownImgUrl(coupletId)
|
||||
if not CoupletTemplates or not CoupletTemplates[coupletId] then
|
||||
return
|
||||
end
|
||||
|
||||
return CoupletTemplates[coupletId].DownImgUrl
|
||||
end
|
||||
|
||||
function XCoupletGameConfigs.GetCoupletDownIdArr(coupletId, Index)
|
||||
if not DownWordArrList or not DownWordArrList[coupletId] then
|
||||
return
|
||||
end
|
||||
|
||||
local coupletDownWordArr = DownWordArrList[coupletId]
|
||||
if coupletDownWordArr and next(coupletDownWordArr) then
|
||||
return coupletDownWordArr[Index]
|
||||
end
|
||||
end
|
66
Script/matrix/xconfig/XDailyDungeonConfigs.lua
Normal file
66
Script/matrix/xconfig/XDailyDungeonConfigs.lua
Normal file
|
@ -0,0 +1,66 @@
|
|||
XDailyDungeonConfigs = {}
|
||||
|
||||
local TABLE_DAILY_DROP_GROUP = "Client/Fuben/Daily/DailyDropGroup.tab"
|
||||
local TABLE_DAILT_DUNGEON_RULES = "Share/Fuben/Daily/DailyDungeonRules.tab"
|
||||
local TABLE_DAILY_DUNGEON_DATA = "Share/Fuben/Daily/DailyDungeonData.tab"
|
||||
local TABLE_DAILY_SPECOAL_CONDITION = "Share/Fuben/Daily/DailySpecialCondition.tab"
|
||||
|
||||
local DailyDungeonRulesTemplates = {}
|
||||
local DailyDungeonDataTemplates = {}
|
||||
local DailySpecialConditionTemplates = {}
|
||||
local DailyDropGroupTemplates = {}
|
||||
|
||||
function XDailyDungeonConfigs.Init()
|
||||
DailyDungeonRulesTemplates = XTableManager.ReadByIntKey(TABLE_DAILT_DUNGEON_RULES, XTable.XTableDailyDungeonRules, "Id")
|
||||
DailyDungeonDataTemplates = XTableManager.ReadByIntKey(TABLE_DAILY_DUNGEON_DATA, XTable.XTableDailyDungeonData, "Id")
|
||||
DailySpecialConditionTemplates = XTableManager.ReadByIntKey(TABLE_DAILY_SPECOAL_CONDITION, XTable.XTableDailySpecialCondition, "Id")
|
||||
DailyDropGroupTemplates = XTableManager.ReadByIntKey(TABLE_DAILY_DROP_GROUP, XTable.XTableDailyDropGroup, "Id")
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDungeonRulesList()
|
||||
return DailyDungeonRulesTemplates
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDungeonRulesById(id)
|
||||
return DailyDungeonRulesTemplates[id]
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDungeonDayOfWeek(Id)
|
||||
local tmpTab = {}
|
||||
for _, v in pairs(DailyDungeonRulesTemplates[Id].OpenDayOfWeek) do
|
||||
table.insert(tmpTab, v)
|
||||
end
|
||||
return tmpTab
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDungeonDataList()
|
||||
return DailyDungeonDataTemplates
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDungeonData(Id)
|
||||
return DailyDungeonDataTemplates[Id]
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailySpecialConditionList()
|
||||
return DailySpecialConditionTemplates
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDungeonIdByStageId(stageId)
|
||||
for _, v in pairs(DailyDungeonDataTemplates) do
|
||||
for _, v2 in pairs(v.StageId) do
|
||||
if v2 == stageId then
|
||||
return v.Id
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetDailyDropGroupList()
|
||||
return DailyDropGroupTemplates
|
||||
end
|
||||
|
||||
function XDailyDungeonConfigs.GetFubenDailyShopId(id)
|
||||
local data = DailyDungeonDataTemplates[id]
|
||||
return data and data.ShopId
|
||||
end
|
103
Script/matrix/xconfig/XDiceGameConfigs.lua
Normal file
103
Script/matrix/xconfig/XDiceGameConfigs.lua
Normal file
|
@ -0,0 +1,103 @@
|
|||
XDiceGameConfigs = XDiceGameConfigs or {}
|
||||
|
||||
local TABLE_DICEGAME_ACTIVITY = "Share/MiniActivity/DiceGameActivity/DiceGameActivity.tab"
|
||||
local TABLE_DICEGAME_OPERATION = "Share/MiniActivity/DiceGameActivity/DiceGameOperation.tab"
|
||||
local TABLE_DICEGAME_REWARD = "Share/MiniActivity/DiceGameActivity/DiceGameReward.tab"
|
||||
local TABLE_DICEGAME_EASTEREGG = "Share/MiniActivity/DiceGameActivity/DiceGameEasterEgg.tab"
|
||||
local TABLE_DICEGAME_POINT = "Share/MiniActivity/DiceGameActivity/DiceGamePoint.tab"
|
||||
local TABLE_DICE_ANIMATION = "Client/MiniActivity/DiceGameActivity/DiceAnimation.tab"
|
||||
|
||||
local DiceGameActivityCfgs = {}
|
||||
local DiceGameOperationCfgs = {}
|
||||
local DiceGameRewardCfgs = {}
|
||||
local DiceGameEasterEggCfgs = {}
|
||||
local DiceGamePointCfgs = {}
|
||||
local DiceAnimationCfgs = {}
|
||||
|
||||
XDiceGameConfigs.OperationType = {
|
||||
None = 0,
|
||||
A = 1,
|
||||
B = 2,
|
||||
C = 3,
|
||||
}
|
||||
|
||||
function XDiceGameConfigs.Init()
|
||||
DiceGameActivityCfgs = XTableManager.ReadByIntKey(TABLE_DICEGAME_ACTIVITY, XTable.XTableDiceGameActivity, "Id")
|
||||
DiceGameOperationCfgs = XTableManager.ReadByIntKey(TABLE_DICEGAME_OPERATION, XTable.XTableDiceGameOperation, "Id")
|
||||
DiceGameRewardCfgs = XTableManager.ReadByIntKey(TABLE_DICEGAME_REWARD, XTable.XTableDiceGameReward, "Id")
|
||||
DiceGameEasterEggCfgs = XTableManager.ReadByIntKey(TABLE_DICEGAME_EASTEREGG, XTable.XTableDiceGameEasterEgg, "Id")
|
||||
DiceGamePointCfgs = XTableManager.ReadByIntKey(TABLE_DICEGAME_POINT, XTable.XTableDiceGamePoint, "Id")
|
||||
DiceAnimationCfgs = XTableManager.ReadByIntKey(TABLE_DICE_ANIMATION, XTable.XTableDiceAnimation, "Id")
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetDiceGameActivityById(id)
|
||||
local cfg = DiceGameActivityCfgs[id]
|
||||
if not cfg then
|
||||
XLog.Error("GetDiceGameActivityById error: no cfg of id:" .. id)
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetDiceGameOperationById(id)
|
||||
local cfg = DiceGameOperationCfgs[id]
|
||||
if not cfg then
|
||||
XLog.Error("GetDiceGameOperationById error: no cfg of id:" .. id)
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetDiceGameRewardById(id)
|
||||
local cfg = DiceGameRewardCfgs[id]
|
||||
if not cfg then
|
||||
XLog.Error("GetDiceGameRewardById error: no cfg of id:" .. id)
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetDiceGameEasterEggById(id)
|
||||
local cfg = DiceGameEasterEggCfgs[id]
|
||||
if not cfg then
|
||||
XLog.Error("GetDiceGameEasterEggById error: no cfg of id:" .. id)
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetDiceGamePointById(id)
|
||||
local cfg = DiceGamePointCfgs[id]
|
||||
if not cfg then
|
||||
XLog.Error("GetDiceGamePointById error: no cfg of id:" .. id)
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetDiceAnimationById(id)
|
||||
local cfg = DiceAnimationCfgs[id]
|
||||
if not cfg then
|
||||
XLog.Error("GetDiceAnimationById error: no cfg of id:" .. id)
|
||||
end
|
||||
return cfg
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetActivityCfgs()
|
||||
return DiceGameActivityCfgs
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetOperationCfgs()
|
||||
return DiceGameOperationCfgs
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetRewardCfgs()
|
||||
return DiceGameRewardCfgs
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetEasterEggCfgs()
|
||||
return DiceGameEasterEggCfgs
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetPointCfgs()
|
||||
return DiceGamePointCfgs
|
||||
end
|
||||
|
||||
function XDiceGameConfigs.GetRewardCount()
|
||||
return #DiceGameRewardCfgs
|
||||
end
|
40
Script/matrix/xconfig/XDisplayConfigs.lua
Normal file
40
Script/matrix/xconfig/XDisplayConfigs.lua
Normal file
|
@ -0,0 +1,40 @@
|
|||
XDisplayConfigs = XDisplayConfigs or {}
|
||||
|
||||
local tableInsert = table.insert
|
||||
|
||||
local TABLE_DISPLAY_PATH = "Client/Display/Display.tab"
|
||||
local TABLE_CONTENT_PATH = "Client/Display/DisplayContent.tab"
|
||||
|
||||
local DisplayTable = {}
|
||||
local ContentTable = {}
|
||||
local Groups = {}
|
||||
|
||||
function XDisplayConfigs.Init()
|
||||
DisplayTable = XTableManager.ReadByIntKey(TABLE_DISPLAY_PATH, XTable.XTableDisplay, "Id")
|
||||
if not DisplayTable then
|
||||
XLog.Error("XDisplayConfigs.Init 函数错误, 根据键值Id读取表 " .. TABLE_DISPLAY_PATH .. " 的时候出错")
|
||||
end
|
||||
|
||||
ContentTable = XTableManager.ReadByIntKey(TABLE_CONTENT_PATH, XTable.XTableDisplayContent, "Id")
|
||||
for _, tab in pairs(DisplayTable) do
|
||||
local group = Groups[tab.Model]
|
||||
if not group then
|
||||
group = { Ids = {}, Weights = {} }
|
||||
Groups[tab.Model] = group
|
||||
end
|
||||
tableInsert(group.Ids, tab.Id)
|
||||
tableInsert(group.Weights, tab.Weight)
|
||||
end
|
||||
end
|
||||
|
||||
function XDisplayConfigs.GetDisplayTable()
|
||||
return DisplayTable
|
||||
end
|
||||
|
||||
function XDisplayConfigs.GetContentTable()
|
||||
return ContentTable
|
||||
end
|
||||
|
||||
function XDisplayConfigs.GetGroups()
|
||||
return Groups
|
||||
end
|
85
Script/matrix/xconfig/XDlcConfig.lua
Normal file
85
Script/matrix/xconfig/XDlcConfig.lua
Normal file
|
@ -0,0 +1,85 @@
|
|||
XDlcConfig = XDlcConfig or {}
|
||||
|
||||
local TABLE_DLC_LIST_PATH = "Client/DlcRes/DlcList.tab"
|
||||
local TABLE_PATHC_CONFIG_PATH = "Client/DlcRes/PatchConfig.tab"
|
||||
local TABLE_UNPATCH_CONFIG_PATH = "Client/DlcRes/UnPatchConfig.tab"
|
||||
|
||||
local DlcListConfig = nil
|
||||
local PatchConfig = nil
|
||||
local UnPatchConfig = nil
|
||||
|
||||
local EntryDlcIdMap = nil
|
||||
local StageIdMap = nil
|
||||
|
||||
local EntryType = {
|
||||
MainChapter = 1, -- 主线,参数:章节id(chapterMain.Id),配置在 Share/Fuben/MainLine/ChapterMain.tab
|
||||
ExtraChapter = 2, -- 外篇,参数:章节id(chapterId),配置在 Share/Fuben/ExtraChapter/ChapterExtra.tab
|
||||
Chanllenge = 3, -- 挑战,参数:挑战类型(XFubenManager.ChapterType),定义在 Share/Fuben/FubenChallengeBanner.tab
|
||||
Bfrt = 4, -- 据点,参数:章节id(chapterId),配置在 Share/Fuben/Bfrt/BfrtChapter.tab
|
||||
}
|
||||
XDlcConfig.EntryType = EntryType
|
||||
|
||||
function XDlcConfig.Init()
|
||||
DlcListConfig = XTableManager.ReadByIntKey(TABLE_DLC_LIST_PATH, XTable.XTableDlcList, "Id")
|
||||
PatchConfig = XTableManager.ReadByIntKey(TABLE_PATHC_CONFIG_PATH, XTable.XTablePatchConfig, "Id")
|
||||
UnPatchConfig = XTableManager.ReadByIntKey(TABLE_UNPATCH_CONFIG_PATH, XTable.XTableUnPatchConfig, "Id")
|
||||
|
||||
EntryDlcIdMap = {}
|
||||
for id, config in pairs(DlcListConfig) do
|
||||
if not EntryDlcIdMap[config.EntryType] then
|
||||
EntryDlcIdMap[config.EntryType] = {}
|
||||
end
|
||||
EntryDlcIdMap[config.EntryType][config.EntryParam] = id
|
||||
end
|
||||
StageIdMap = {}
|
||||
end
|
||||
|
||||
function XDlcConfig.GetDlcListConfig()
|
||||
return DlcListConfig
|
||||
end
|
||||
|
||||
function XDlcConfig.GetPatchConfig()
|
||||
return PatchConfig
|
||||
end
|
||||
|
||||
function XDlcConfig.GetUnPatchConfig()
|
||||
return UnPatchConfig
|
||||
end
|
||||
|
||||
function XDlcConfig.GetListConfigById(id)
|
||||
local config = DlcListConfig[id]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XDlcConfig.GetListConfigById",
|
||||
"DlcList", TABLE_DLC_LIST_PATH, "Id", tostring(id))
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
-- 根据功能入口获取分包id
|
||||
function XDlcConfig.GetDlcIdsByEntry(entryType, entryParam)
|
||||
if EntryDlcIdMap[entryType] then
|
||||
local dlcId = EntryDlcIdMap[entryType][entryParam]
|
||||
if dlcId then
|
||||
return DlcListConfig[dlcId].PatchConfigIds
|
||||
end
|
||||
end
|
||||
XLog.Debug("尝试根据[功能入口]或取分包id, 失败: entryType:" .. tostring(entryType) .. ", entryParam:" .. tostring(entryParam))
|
||||
end
|
||||
|
||||
-- 根据关卡id获取分包id
|
||||
function XDlcConfig.GetDlcIdsByStageId(stageId)
|
||||
local dlcId = StageIdMap[stageId]
|
||||
if not StageIdMap[stageId] then
|
||||
for id, config in pairs(DlcListConfig) do
|
||||
-- 主线和外篇入口参数使用stageId
|
||||
if config.EntryType == EntryType.MainChapter or config.EntryType == EntryType.ExtraChapter and stageId == config.EntryParam then
|
||||
dlcId = id
|
||||
StageIdMap[stageId] = id
|
||||
end
|
||||
end
|
||||
end
|
||||
if dlcId then
|
||||
return DlcListConfig[dlcId].PatchConfigIds
|
||||
end
|
||||
XLog.Debug("尝试根据[stageId]获取分包id, 失败: stageId:" .. tostring(stageId))
|
||||
end
|
368
Script/matrix/xconfig/XDoomsdayConfigs.lua
Normal file
368
Script/matrix/xconfig/XDoomsdayConfigs.lua
Normal file
|
@ -0,0 +1,368 @@
|
|||
local tonumber = tonumber
|
||||
local tableInsert = table.insert
|
||||
local tableSort = table.sort
|
||||
local ipairs = ipairs
|
||||
local pairs = pairs
|
||||
|
||||
XDoomsdayConfigs = XDoomsdayConfigs or {}
|
||||
|
||||
function XDoomsdayConfigs.Init()
|
||||
XDoomsdayConfigs.ActivityConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayActivity.tab", XTable.XTableDoomsdayActivity) --活动配置
|
||||
XDoomsdayConfigs.StageConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayStage.tab", XTable.XTableDoomsdayStage) --关卡配置
|
||||
XDoomsdayConfigs.PlaceConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayStagePlace.tab", XTable.XTableDoomsdayStagePlace) --探索地点配置
|
||||
XDoomsdayConfigs.ResourceConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayResource.tab", XTable.XTableDoomsdayResource) --资源配置
|
||||
XDoomsdayConfigs.EventConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayEvent.tab", XTable.XTableDoomsdayEvent) --关卡事件配置
|
||||
XDoomsdayConfigs.CreatTeamConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayCreateTeam.tab", XTable.XTableDoomsdayCreateTeam) --探索队伍创建消耗配置
|
||||
XDoomsdayConfigs.BuildingConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayBuilding.tab", XTable.XTableDoomsdayBuilding) --建筑配置
|
||||
XDoomsdayConfigs.AttributeConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayAttribute.tab", XTable.XTableDoomsdayAttribute) --属性配置
|
||||
XDoomsdayConfigs.TargetConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayTask.tab", XTable.XTableDoomsdayTask) --关卡目标配置
|
||||
XDoomsdayConfigs.AttributeTypeConfig =
|
||||
XConfig.New("Share/MiniActivity/Doomsday/DoomsdayAttributeType.tab", XTable.XTableDoomsdayAttributeType) --属性类型配置
|
||||
XDoomsdayConfigs.ReportConfig =
|
||||
XConfig.New("Client/MiniActivity/Doomsday/DoomsdayReportText.tab", XTable.XTableDoomsdayReportText) --报告内容随机文本库配置
|
||||
XDoomsdayConfigs.ResourceAllotConfig =
|
||||
XConfig.New("Client/MiniActivity/Doomsday/DoomsdayResourceAllot.tab", XTable.XTableDoomsdayResourceAllot) --资源分配方式配置
|
||||
XDoomsdayConfigs.InitText()
|
||||
end
|
||||
|
||||
-----------------活动相关 begin-----------------
|
||||
function XDoomsdayConfigs.GetDefaultActivityId()
|
||||
local defaultActivityId = 0
|
||||
for activityId, config in pairs(XDoomsdayConfigs.ActivityConfig:GetConfigs()) do
|
||||
defaultActivityId = activityId
|
||||
if XTool.IsNumberValid(config.TimeId) and XFunctionManager.CheckInTimeByTimeId(config.TimeId) then
|
||||
break
|
||||
end
|
||||
end
|
||||
return defaultActivityId
|
||||
end
|
||||
|
||||
--获取后置关卡Id
|
||||
function XDoomsdayConfigs.GetAfterStageId(activityId, stageId)
|
||||
for _, inStageId in pairs(XDoomsdayConfigs.ActivityConfig:GetProperty(activityId, "StageId") or {}) do
|
||||
if XDoomsdayConfigs.StageConfig:GetProperty(inStageId, "PreStage") == stageId then
|
||||
return inStageId
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
---------------活动相关 end-------------------
|
||||
--居民属性类型
|
||||
XDoomsdayConfigs.ATTRUBUTE_TYPE = {
|
||||
HEALTH = 1, --健康值
|
||||
HUNGER = 2, --饱腹值
|
||||
SAN = 3 --精神值
|
||||
}
|
||||
|
||||
XDoomsdayConfigs.HOMELESS_ATTR_TYPE = 4 --无家可归属性类型(策划要放到其他居民属性一起展示)
|
||||
|
||||
function XDoomsdayConfigs.GetSortedAttrTypes()
|
||||
return {
|
||||
XDoomsdayConfigs.ATTRUBUTE_TYPE.HEALTH,
|
||||
XDoomsdayConfigs.ATTRUBUTE_TYPE.HUNGER,
|
||||
XDoomsdayConfigs.ATTRUBUTE_TYPE.SAN
|
||||
}
|
||||
end
|
||||
|
||||
--获取关卡每日单居民需求资源数量(仅分配资源使用)
|
||||
function XDoomsdayConfigs.GetStageDailyRequireResourceCount(stageId, resourceId)
|
||||
for index, inResourceId in pairs(XDoomsdayConfigs.StageConfig:GetProperty(stageId, "DailyConsumeResouceId")) do
|
||||
if inResourceId == resourceId then
|
||||
return XDoomsdayConfigs.StageConfig:GetProperty(stageId, "DailyConsumeResouceCount")[index] or 0
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--根据资源Id获取关联的居民属性Type
|
||||
function XDoomsdayConfigs.GetRelatedAttrIdByResourceId(stageId, resourceId)
|
||||
for _, attrId in pairs(XDoomsdayConfigs.StageConfig:GetProperty(stageId, "AttributeId")) do
|
||||
if XDoomsdayConfigs.AttributeConfig:GetProperty(attrId, "ResourceId") == resourceId then
|
||||
return attrId
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--关卡事件类型
|
||||
XDoomsdayConfigs.EVENT_TYPE = {
|
||||
MAIN = 1, --主要事件
|
||||
NORMAL = 2, --普通事件
|
||||
EXPLORE = 3 --探索事件
|
||||
}
|
||||
|
||||
function XDoomsdayConfigs.GetEventTypeRemindDesc(eventType)
|
||||
if eventType == XDoomsdayConfigs.EVENT_TYPE.MAIN then
|
||||
return CsXTextManagerGetText("DoomsdayEventTypeRemindDescMain")
|
||||
elseif eventType == XDoomsdayConfigs.EVENT_TYPE.EXPLORE then
|
||||
return CsXTextManagerGetText("DoomsdayEventTypeRemindDescExplore")
|
||||
end
|
||||
return CsXTextManagerGetText("DoomsdayEventTypeRemindDescNormal")
|
||||
end
|
||||
|
||||
--获取资源Id列表(brief:简明模式,只显示前两种资源)
|
||||
function XDoomsdayConfigs.GetResourceIds(brief)
|
||||
local ids = {}
|
||||
local limitCount = brief and 2 or XMath.IntMax()
|
||||
for id in ipairs(XDoomsdayConfigs.ResourceConfig:GetConfigs()) do
|
||||
if id > limitCount then
|
||||
break
|
||||
end
|
||||
tableInsert(ids, id)
|
||||
end
|
||||
return ids
|
||||
end
|
||||
|
||||
local function CreateReourceList(ids, counts, daily)
|
||||
local resources = {}
|
||||
for index, id in ipairs(ids) do
|
||||
if XTool.IsNumberValid(id) then
|
||||
tableInsert(
|
||||
resources,
|
||||
{
|
||||
Id = id,
|
||||
Count = counts[index],
|
||||
Daily = daily
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
return resources
|
||||
end
|
||||
|
||||
--获取建筑建造消耗资源列表
|
||||
function XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingId)
|
||||
return CreateReourceList(
|
||||
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "SpendResourceType"),
|
||||
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "SpendResourceCount")
|
||||
)
|
||||
end
|
||||
|
||||
--获取建筑工作中每日消耗资源列表
|
||||
function XDoomsdayConfigs.GetBuildingDailyConsumeResourceInfos(buildingId)
|
||||
return CreateReourceList(
|
||||
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "WorkingDailyConsumeResourceId"),
|
||||
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "WorkingDailyConsumeResourceCount"),
|
||||
true
|
||||
)
|
||||
end
|
||||
|
||||
--获取建筑工作中每日获得资源列表
|
||||
function XDoomsdayConfigs.GetBuildingDailyGainResourceInfos(buildingId)
|
||||
return CreateReourceList(
|
||||
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "WorkingDailyGainResourceId"),
|
||||
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "WorkingDailyGainResourceCount"),
|
||||
true
|
||||
)
|
||||
end
|
||||
|
||||
--建筑类型(一期只区分简单建筑类型)
|
||||
XDoomsdayConfigs.BUILDING_TYPE = {
|
||||
NORMAL = 0, --普通
|
||||
RUINS = 1, --废墟
|
||||
INOPERABLE = 2, --不可操作类型
|
||||
TEAM = 3 --哨站(用于解锁探索小队)
|
||||
}
|
||||
|
||||
function XDoomsdayConfigs.IsBuildingRuins(buildingId)
|
||||
return XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "Type") == XDoomsdayConfigs.BUILDING_TYPE.RUINS
|
||||
end
|
||||
|
||||
function XDoomsdayConfigs.IsBuildingInOperable(buildingId)
|
||||
if not XTool.IsNumberValid(buildingId) then
|
||||
return false
|
||||
end
|
||||
return XDoomsdayConfigs.BuildingConfig:GetProperty(buildingId, "Type") == XDoomsdayConfigs.BUILDING_TYPE.INOPERABLE
|
||||
end
|
||||
|
||||
--建筑状态
|
||||
XDoomsdayConfigs.BUILDING_STATE = {
|
||||
EMPTY = 0, --空
|
||||
WAITING = 1, --等待分配
|
||||
WORKING = 2, --工作中
|
||||
PENDING = 3 --工作中断
|
||||
}
|
||||
|
||||
--不同建筑状态的图标
|
||||
local CSXGameClientConfig = CS.XGame.ClientConfig
|
||||
XDoomsdayConfigs.BuildingTypeIcon = {
|
||||
[XDoomsdayConfigs.BUILDING_STATE.EMPTY] = CSXGameClientConfig:GetString("DoomsdayBuildingStateIconEmpty"),
|
||||
[XDoomsdayConfigs.BUILDING_STATE.WAITING] = CSXGameClientConfig:GetString("DoomsdayBuildingStateIconWaiting"),
|
||||
[XDoomsdayConfigs.BUILDING_STATE.WORKING] = CSXGameClientConfig:GetString("DoomsdayBuildingStateIconWorking"),
|
||||
[XDoomsdayConfigs.BUILDING_STATE.PENDING] = CSXGameClientConfig:GetString("DoomsdayBuildingStateIconPending")
|
||||
}
|
||||
XDoomsdayConfigs.EmptyBuildingIcon = CSXGameClientConfig:GetString("DoomsdayBuildingIconEmpty")
|
||||
--资源类型
|
||||
XDoomsdayConfigs.RESOURCE_TYPE = {
|
||||
WOOD = 1, --木材
|
||||
STEEL = 2, --钢材
|
||||
MEDICINE = 3, --血清
|
||||
FOOD = 4 --食物
|
||||
}
|
||||
XDoomsdayConfigs.SPECIAL_RESOURCE_TYPE_INHANBITANT = -1 --特殊资源类型:居民
|
||||
|
||||
--资源分配方式
|
||||
XDoomsdayConfigs.RESOURCE_ALLOCTION_FUNC_NAME = {
|
||||
ALL = "GetResourceAllocationByAllocateToAll", --给所有人分配
|
||||
HALF = "GetResourceAllocationByAllocateToHalf", --给一半人分配
|
||||
MOST = "GetResourceAllocationByAllocateToMost", --给尽可能多的人分配
|
||||
NONE = "GetResourceAllocationByAllocateToNone" --不分配
|
||||
}
|
||||
|
||||
--获取加减不同颜色的数字文本 (+50)(-50)
|
||||
function XDoomsdayConfigs.GetNumerText(num)
|
||||
if num > 0 then
|
||||
return CsXTextManagerGetText("DoomsdayNumberUp", math.abs(num))
|
||||
end
|
||||
|
||||
if num < 0 then
|
||||
return CsXTextManagerGetText("DoomsdayNumberDown", math.abs(num))
|
||||
end
|
||||
|
||||
return ""
|
||||
end
|
||||
|
||||
--获取加减不同颜色的数字文本 (50/100 红色)(100/100 蓝色)
|
||||
function XDoomsdayConfigs.GetRequireNumerText(cur, max)
|
||||
if cur < max then
|
||||
return CsXTextManagerGetText("DoomsdayRequireNumberDown", cur, max)
|
||||
else
|
||||
return CsXTextManagerGetText("DoomsdayRequireNumberUp", cur, max)
|
||||
end
|
||||
end
|
||||
|
||||
--每日结算报告
|
||||
XDoomsdayConfigs.REPORT_ID = {
|
||||
BUILDING_ADD = 1, --营地增加资源
|
||||
TEAM_ADD = 2, --探索小队增加资源/居民数量
|
||||
DEAD = 3, --死去居民文本显示
|
||||
HOMELESS = 4, --不良状态随机文本(无家可归)
|
||||
UNHEALTHY = 5, --不良状态随机文本(不健康)
|
||||
HUNGER = 6, --不良状态随机文本(饥饿)
|
||||
LOW_SAN = 7, --不良状态随机文本(精神值过低)
|
||||
HOMELESS_RT = 8, --不良状态随机文本(无家可归)【反向判断】
|
||||
UNHEALTHY_RT = 9, --不良状态随机文本(不健康)【反向判断】
|
||||
HUNGER_RT = 10, --不良状态随机文本(饥饿)【反向判断】
|
||||
LOW_SAN_RT = 11, --不良状态随机文本(精神值过低)【反向判断】
|
||||
BUILDING_ADD_RT = 12 --营地增加资源【反向判断】
|
||||
}
|
||||
|
||||
--获取随机文本报告
|
||||
local function GetRandomReportText(reportId)
|
||||
local descs = XDoomsdayConfigs.ReportConfig:GetProperty(reportId, "Desc")
|
||||
return descs[XTool.GetRandomNumbers(#descs, 1)[1]]
|
||||
end
|
||||
|
||||
--获取异常状态/死亡居民随机文本报告
|
||||
function XDoomsdayConfigs.GetRandomReportTextBad(reportId, addInhabitantCount)
|
||||
local desc, addText = GetRandomReportText(reportId), ""
|
||||
|
||||
if XTool.IsNumberValid(addInhabitantCount) then
|
||||
addText =
|
||||
CsXTextManagerGetText(
|
||||
"DoomsdayReportResource",
|
||||
addInhabitantCount,
|
||||
CsXTextManagerGetText("DoomsdayInhabitantName")
|
||||
)
|
||||
end
|
||||
|
||||
if not string.IsNilOrEmpty(addText) then
|
||||
desc = string.gsub(desc, "{0}", addText)
|
||||
end
|
||||
|
||||
return desc
|
||||
end
|
||||
|
||||
--获取获得资源随机文本报告
|
||||
function XDoomsdayConfigs.GetRandomReportTextFix(reportId, addResourceDic, addInhabitantCount)
|
||||
local desc, addText = "", ""
|
||||
|
||||
if XTool.IsNumberValid(addInhabitantCount) then
|
||||
addText =
|
||||
CsXTextManagerGetText(
|
||||
"DoomsdayReportResource",
|
||||
addInhabitantCount,
|
||||
CsXTextManagerGetText("DoomsdayInhabitantName")
|
||||
)
|
||||
end
|
||||
|
||||
if not XTool.IsTableEmpty(addResourceDic) then
|
||||
for resourceId, resource in pairs(addResourceDic) do
|
||||
local count = resource:GetProperty("_Count")
|
||||
if XTool.IsNumberValid(count) then
|
||||
local newText =
|
||||
CsXTextManagerGetText(
|
||||
"DoomsdayReportResource",
|
||||
count,
|
||||
XDoomsdayConfigs.ResourceConfig:GetProperty(resourceId, "Name")
|
||||
)
|
||||
addText = string.IsNilOrEmpty(addText) and newText or addText .. "、" .. newText
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not string.IsNilOrEmpty(addText) then
|
||||
desc = GetRandomReportText(reportId)
|
||||
desc = string.gsub(desc, "{0}", addText)
|
||||
else
|
||||
if reportId == XDoomsdayConfigs.REPORT_ID.BUILDING_ADD then
|
||||
desc = GetRandomReportText(XDoomsdayConfigs.REPORT_ID.BUILDING_ADD_RT)
|
||||
end
|
||||
end
|
||||
|
||||
return desc
|
||||
end
|
||||
|
||||
--检查指定地点Id是否为大本营
|
||||
function XDoomsdayConfigs.CheckPlaceIsCamp(stageId, placeId)
|
||||
return XDoomsdayConfigs.StageConfig:GetProperty(stageId, "FirstPlace") == placeId
|
||||
end
|
||||
|
||||
function XDoomsdayConfigs.GetCreateTeamCostResourceList(teamId)
|
||||
local infoList = {}
|
||||
|
||||
local countList = XDoomsdayConfigs.CreatTeamConfig:GetProperty(teamId, "SpendResourceCount")
|
||||
for index, resourceId in pairs(XDoomsdayConfigs.CreatTeamConfig:GetProperty(teamId, "SpendResourceType")) do
|
||||
tableInsert(
|
||||
infoList,
|
||||
{
|
||||
ResourceId = resourceId,
|
||||
Count = countList[index] or 0
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
return infoList
|
||||
end
|
||||
|
||||
--关卡失败原因
|
||||
XDoomsdayConfigs.SETTLE_LOSE_REASON = {
|
||||
INHABITANT_DIE_OUT = 1, --居民死光
|
||||
INHABITANT_CRAZY = 2, --居民SAN值全部降为0
|
||||
INHABITANT_TIME_OUT = 3 --时间用尽未达成主目标
|
||||
}
|
||||
|
||||
--关卡失败描述文本
|
||||
function XDoomsdayConfigs.InitText()
|
||||
XDoomsdayConfigs.LOSE_REASON_TEXT = {
|
||||
[XDoomsdayConfigs.SETTLE_LOSE_REASON.INHABITANT_DIE_OUT] = CsXTextManagerGetText("DoomsdayLoseReasonDieOut"), --居民死光
|
||||
[XDoomsdayConfigs.SETTLE_LOSE_REASON.INHABITANT_CRAZY] = CsXTextManagerGetText("DoomsdayLoseReasonCrazy"), --居民SAN值全部降为0
|
||||
[XDoomsdayConfigs.SETTLE_LOSE_REASON.INHABITANT_TIME_OUT] = CsXTextManagerGetText("DoomsdayLoseReasonTimeOut") --时间用尽未达成主目标
|
||||
}
|
||||
end
|
||||
|
||||
--探索小队状态
|
||||
XDoomsdayConfigs.TEAM_STATE = {
|
||||
WAITING = 1, --待命
|
||||
MOVING = 2, --行进中
|
||||
BUSY = 3 --事件中
|
||||
}
|
1038
Script/matrix/xconfig/XDormConfig.lua
Normal file
1038
Script/matrix/xconfig/XDormConfig.lua
Normal file
File diff suppressed because it is too large
Load diff
751
Script/matrix/xconfig/XDoubleTowersConfigs.lua
Normal file
751
Script/matrix/xconfig/XDoubleTowersConfigs.lua
Normal file
|
@ -0,0 +1,751 @@
|
|||
XDoubleTowersConfigs = XDoubleTowersConfigs or {}
|
||||
|
||||
XDoubleTowersConfigs.StageState = {
|
||||
-- 通关
|
||||
Clear = 1,
|
||||
-- 未通关
|
||||
NotClear = 2,
|
||||
-- 未解锁
|
||||
Lock = 3
|
||||
}
|
||||
XDoubleTowersConfigs.ReasonOfLockGroup = {
|
||||
-- 已解锁
|
||||
None = 0,
|
||||
-- 前置关卡未通关
|
||||
PreconditionStageNotClear = 1,
|
||||
-- 未到开放时间
|
||||
TimeLimit = 2
|
||||
}
|
||||
|
||||
--模块类型
|
||||
XDoubleTowersConfigs.ModuleType = {
|
||||
Role = 1, --角色
|
||||
Guard = 2 --守卫
|
||||
}
|
||||
|
||||
-- 每组最多关卡数量
|
||||
XDoubleTowersConfigs.MaxStageAmountPerGroup = 3
|
||||
|
||||
-- teamId 一支队伍就一个人,没必要保存服务端
|
||||
XDoubleTowersConfigs.TeamId = 19
|
||||
XDoubleTowersConfigs.TeamTypeId = 130
|
||||
|
||||
-- 活动总控表
|
||||
local ACTIVITY_TAB = "Share/Fuben/DoubleTower/DoubleTowerActivity.tab"
|
||||
-- 关卡组表
|
||||
local GROUP_TAB = "Share/Fuben/DoubleTower/DoubleTowerStageGroup.tab"
|
||||
-- 关卡表
|
||||
local STAGE_TAB = "Share/Fuben/DoubleTower/DoubleTowerStage.tab"
|
||||
-- 情报表
|
||||
local INFORMATION_TAB = "Client/Fuben/DoubleTower/DoubleTowerInformation.tab"
|
||||
-- 角色(帮手)配置表
|
||||
local ROLE_TAB = "Share/Fuben/DoubleTower/DoubleTowerRole.tab"
|
||||
-- 守卫配置表
|
||||
local GUARD_TAB = "Share/Fuben/DoubleTower/DoubleTowerGuard.tab"
|
||||
-- 插件表
|
||||
local PLUGIN_TAB = "Share/Fuben/DoubleTower/DoubleTowerPlugin.tab"
|
||||
-- 插件详情表
|
||||
local PLUGIN_LEVEL_TAB = "Share/Fuben/DoubleTower/DoubleTowerPluginLevel.tab"
|
||||
|
||||
--region 无脑get配置
|
||||
local ActivityConfigs = nil
|
||||
local GroupConfigs = nil
|
||||
local StageConfigs = nil
|
||||
local InformationConfigs = nil
|
||||
local RoleConfigs = nil
|
||||
local GuardConfigs = nil
|
||||
local PluginConfigs = nil
|
||||
local PluginLevelConfigs = nil
|
||||
|
||||
function XDoubleTowersConfigs.Init()
|
||||
end
|
||||
|
||||
local function GetActivityConfigs()
|
||||
if not ActivityConfigs then
|
||||
ActivityConfigs = XTableManager.ReadByIntKey(ACTIVITY_TAB, XTable.XTableDoubleTowerActivity, "Id")
|
||||
end
|
||||
return ActivityConfigs
|
||||
end
|
||||
|
||||
local function GetGroupConfigs()
|
||||
if not GroupConfigs then
|
||||
GroupConfigs = XTableManager.ReadByIntKey(GROUP_TAB, XTable.XTableDoubleTowerStageGroup, "Id")
|
||||
end
|
||||
return GroupConfigs
|
||||
end
|
||||
|
||||
local function GetStageConfigs()
|
||||
if not StageConfigs then
|
||||
StageConfigs = XTableManager.ReadByIntKey(STAGE_TAB, XTable.XTableDoubleTowerStage, "Id")
|
||||
end
|
||||
return StageConfigs
|
||||
end
|
||||
|
||||
local function GetInformationConfigs()
|
||||
if not InformationConfigs then
|
||||
InformationConfigs = XTableManager.ReadByIntKey(INFORMATION_TAB, XTable.XTableDoubleTowerInformation, "Id")
|
||||
end
|
||||
return InformationConfigs
|
||||
end
|
||||
|
||||
local function GetRoleConfigs()
|
||||
if not RoleConfigs then
|
||||
RoleConfigs = XTableManager.ReadByIntKey(ROLE_TAB, XTable.XTableDoubleTowerRole, "Id")
|
||||
end
|
||||
return RoleConfigs
|
||||
end
|
||||
|
||||
local function GetGuardConfigs()
|
||||
if not GuardConfigs then
|
||||
GuardConfigs = XTableManager.ReadByIntKey(GUARD_TAB, XTable.XTableDoubleTowerGuard, "Id")
|
||||
end
|
||||
return GuardConfigs
|
||||
end
|
||||
|
||||
local function GetPluginConfigs()
|
||||
if not PluginConfigs then
|
||||
PluginConfigs = XTableManager.ReadByIntKey(PLUGIN_TAB, XTable.XTableDoubleTowerPlugin, "Id")
|
||||
end
|
||||
return PluginConfigs
|
||||
end
|
||||
|
||||
local function GetPluginLevelConfigs()
|
||||
if not PluginLevelConfigs then
|
||||
PluginLevelConfigs = XTableManager.ReadByIntKey(PLUGIN_LEVEL_TAB, XTable.XTableDoubleTowerPluginLevel, "Id")
|
||||
end
|
||||
return PluginLevelConfigs
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetActivityCfg(activityId)
|
||||
local config = GetActivityConfigs()[activityId]
|
||||
if not config then
|
||||
XLog.Error(
|
||||
"XDoubleTowersConfigs GetActivityCfg error:配置不存在,Id:" .. (activityId or "nil") .. " ,Path:" .. ACTIVITY_TAB
|
||||
)
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetDefaultActivityId()
|
||||
local cfg = GetActivityConfigs()
|
||||
for key, value in pairs(cfg) do
|
||||
return key
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGroupConfigs()
|
||||
return GetGroupConfigs()
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetStageGroupCfg(groupId)
|
||||
return GetGroupConfigs()[groupId] or {}
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetAllStageConfigs()
|
||||
return GetStageConfigs()
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetStageCfg(id)
|
||||
return GetStageConfigs()[id] or {}
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetInfoCfg(id)
|
||||
return GetInformationConfigs()[id]
|
||||
end
|
||||
|
||||
local function GetRoleCfg(id)
|
||||
local config = GetRoleConfigs()[id]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XDoubleTowersConfigs.GetRoleCfg", "RoleConfigs", ROLE_TAB, "Id", id)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetGuardCfg(id)
|
||||
local config = GetGuardConfigs()[id]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XDoubleTowersConfigs.GetGuardCfg", "GuardConfigs", GUARD_TAB, "Id", id)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetPluginCfg(id)
|
||||
local config = GetPluginConfigs()[id]
|
||||
if not config then
|
||||
XLog.ErrorTableDataNotFound("XDoubleTowersConfigs.GetPluginCfg", "PluginCfgs", PLUGIN_TAB, "Id", id)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
local function GetPluginLevelCfg(id)
|
||||
return GetPluginLevelConfigs()[id]
|
||||
end
|
||||
--endregion
|
||||
-------------------------------------------------------------------------------------------
|
||||
|
||||
function XDoubleTowersConfigs.GetTimeLimitId(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).OpenTimeId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetActivityBackground(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).BannerBg
|
||||
end
|
||||
|
||||
---@return string@活动名/标题
|
||||
function XDoubleTowersConfigs.GetTitleName(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).Name
|
||||
end
|
||||
|
||||
---@return number@收菜货币的id
|
||||
function XDoubleTowersConfigs.GetCoinItemId(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).RewardItemId
|
||||
end
|
||||
|
||||
---@return number@收菜间隔
|
||||
function XDoubleTowersConfigs.GetGatherInterval(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).RewardTimer
|
||||
end
|
||||
|
||||
---@return number@一次收菜多少代币
|
||||
function XDoubleTowersConfigs.GetGatherCoins(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).RewardItemCount
|
||||
end
|
||||
|
||||
---@return number@图文教学界面,对应helpCourse.tab
|
||||
function XDoubleTowersConfigs.GetHelpKey(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).HelpKey
|
||||
end
|
||||
|
||||
local _StageGroupAmount = nil
|
||||
---@return number@关卡组数量,从一之门到n之门,不算特殊关卡
|
||||
function XDoubleTowersConfigs.GetStageGroupAmount()
|
||||
if not _StageGroupAmount then
|
||||
_StageGroupAmount = 0
|
||||
local groupConfigs = GetGroupConfigs()
|
||||
for groupId, cfg in pairs(groupConfigs) do
|
||||
if not cfg.IsSpecial then
|
||||
_StageGroupAmount = _StageGroupAmount + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
return _StageGroupAmount
|
||||
end
|
||||
|
||||
local function SortId(id1, id2)
|
||||
return id1 < id2
|
||||
end
|
||||
local _GroupIndex2Id = nil
|
||||
local function InitGroupIndex2Id()
|
||||
if not _GroupIndex2Id then
|
||||
_GroupIndex2Id = {}
|
||||
local groupConfigs = GetGroupConfigs()
|
||||
for groupId, cfg in pairs(groupConfigs) do
|
||||
if not _GroupIndex2Id[cfg.ActivityId] then
|
||||
_GroupIndex2Id[cfg.ActivityId] = {}
|
||||
end
|
||||
local t = _GroupIndex2Id[cfg.ActivityId]
|
||||
t[#t + 1] = groupId
|
||||
end
|
||||
for activity, group2Id in pairs(_GroupIndex2Id) do
|
||||
table.sort(group2Id, SortId)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@return number@ groupId
|
||||
function XDoubleTowersConfigs.GetGroupId(activityId, groupIndex)
|
||||
InitGroupIndex2Id()
|
||||
return _GroupIndex2Id[activityId] and _GroupIndex2Id[activityId][groupIndex]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetActivityIdByStageId(stageId)
|
||||
local groupId = XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
|
||||
local groupCfg = XDoubleTowersConfigs.GetStageGroupCfg(groupId)
|
||||
return groupCfg and groupCfg.ActivityId
|
||||
end
|
||||
|
||||
local _GroupId2Stage = nil
|
||||
---@return table@ {stageId1,stageId2,stageId3}
|
||||
local function GetGroup(activityId, groupId)
|
||||
if not _GroupId2Stage then
|
||||
local stageConfigs = GetStageConfigs()
|
||||
_GroupId2Stage = {}
|
||||
for id, cfg in pairs(stageConfigs) do
|
||||
local groupActivityId = XDoubleTowersConfigs.GetActivityIdByStageId(cfg.Id)
|
||||
if groupActivityId then
|
||||
if not _GroupId2Stage[groupActivityId] then
|
||||
_GroupId2Stage[groupActivityId] = {}
|
||||
end
|
||||
local groupId2Stage = _GroupId2Stage[groupActivityId]
|
||||
groupId2Stage[cfg.GroupId] = groupId2Stage[cfg.GroupId] or {}
|
||||
local groupIdArray = groupId2Stage[cfg.GroupId]
|
||||
groupIdArray[#groupIdArray + 1] = cfg.Id
|
||||
end
|
||||
end
|
||||
for activity, groupId2Stage in pairs(_GroupId2Stage) do
|
||||
for groupId, group in pairs(groupId2Stage) do
|
||||
table.sort(group, SortId)
|
||||
end
|
||||
end
|
||||
end
|
||||
return _GroupId2Stage[activityId][groupId] or {}
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGroup(activityId, groupId)
|
||||
return GetGroup(activityId, groupId)
|
||||
end
|
||||
|
||||
local function GetGroupCfg(groupId)
|
||||
return GetGroupConfigs()[groupId] or {}
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetStageId(activityId, groupId, stageIndex)
|
||||
return GetGroup(activityId, groupId)[stageIndex]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetStageName(stageId)
|
||||
return XDoubleTowersConfigs.GetStageCfg(stageId).Name
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetStageTip(stageId)
|
||||
return XDoubleTowersConfigs.GetStageCfg(stageId).BuffDesc
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPreconditionStage(stageId)
|
||||
return XDoubleTowersConfigs.GetStageCfg(stageId).PreStageId
|
||||
end
|
||||
|
||||
-- 关卡组 按时间开放
|
||||
function XDoubleTowersConfigs.GetGroupTimeLimitId(groupId)
|
||||
return GetGroupCfg(groupId).OpenTimeId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGroupName(groupId)
|
||||
return GetGroupCfg(groupId).Name
|
||||
end
|
||||
|
||||
local _StageAmount = {}
|
||||
function XDoubleTowersConfigs.GetTotalNormalStageAmount(activityId)
|
||||
if _StageAmount[activityId] then
|
||||
return _StageAmount[activityId]
|
||||
end
|
||||
local stageAmount = 0
|
||||
local allGroup = GetGroupConfigs()
|
||||
for groupId, groupCfg in pairs(allGroup) do
|
||||
if groupCfg.ActivityId == activityId and not groupCfg.IsSpecial then
|
||||
local group = GetGroup(activityId, groupId)
|
||||
stageAmount = stageAmount + #group
|
||||
end
|
||||
end
|
||||
_StageAmount[activityId] = stageAmount
|
||||
return stageAmount
|
||||
end
|
||||
|
||||
local _SpecialGroupId = {}
|
||||
function XDoubleTowersConfigs.GetSpecialGroupId(activityId)
|
||||
if _SpecialGroupId[activityId] ~= nil then
|
||||
return _SpecialGroupId[activityId]
|
||||
end
|
||||
local groupConfigs = GetGroupConfigs()
|
||||
for groupId, cfg in pairs(groupConfigs) do
|
||||
if cfg.IsSpecial and activityId == cfg.ActivityId then
|
||||
_SpecialGroupId[activityId] = groupId
|
||||
return groupId
|
||||
end
|
||||
end
|
||||
_SpecialGroupId[activityId] = false
|
||||
return false
|
||||
end
|
||||
|
||||
local _Stage2InfoGroup = nil
|
||||
function XDoubleTowersConfigs.GetInfoIdGroup(stageId)
|
||||
if not _Stage2InfoGroup then
|
||||
_Stage2InfoGroup = {}
|
||||
for infoId, info in pairs(GetInformationConfigs()) do
|
||||
_Stage2InfoGroup[info.StageId] = _Stage2InfoGroup[info.StageId] or {}
|
||||
local group = _Stage2InfoGroup[info.StageId]
|
||||
group[#group + 1] = info.Id
|
||||
end
|
||||
end
|
||||
return _Stage2InfoGroup[stageId] or {}
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
|
||||
return XDoubleTowersConfigs.GetStageCfg(stageId).GroupId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGroupPreconditionStage(groupId)
|
||||
return XDoubleTowersConfigs.GetStageGroupCfg(groupId).PreStageId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetEnemyInfoImg(infoId)
|
||||
return XDoubleTowersConfigs.GetInfoCfg(infoId).BossImage
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetEnemyInfoRoundDesc(infoId)
|
||||
return XDoubleTowersConfigs.GetInfoCfg(infoId).RoundDesc
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetEnemyInfoTypeDesc(infoId)
|
||||
return XDoubleTowersConfigs.GetInfoCfg(infoId).TypeDesc
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGroupIndexByStageId(stageId)
|
||||
local groupId = XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
|
||||
InitGroupIndex2Id()
|
||||
local activityId = XDoubleTowersConfigs.GetActivityIdByStageId(stageId)
|
||||
local groupIndex2Id = _GroupIndex2Id[activityId]
|
||||
if not groupIndex2Id then
|
||||
return false
|
||||
end
|
||||
for groupIndex = 1, #groupIndex2Id do
|
||||
if groupIndex2Id[groupIndex] == groupId then
|
||||
return groupIndex
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetMaxCoins(activityId)
|
||||
return XDoubleTowersConfigs.GetActivityCfg(activityId).RewardMaxCount
|
||||
end
|
||||
function XDoubleTowersConfigs.GetRolePluginMaxCount()
|
||||
local activityId = XDataCenter.DoubleTowersManager.GetActivityId()
|
||||
local config = XDoubleTowersConfigs.GetActivityCfg(activityId)
|
||||
return config and config.RolePluginMaxCount
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardPluginMaxCount()
|
||||
local activityId = XDataCenter.DoubleTowersManager.GetActivityId()
|
||||
local config = XDoubleTowersConfigs.GetActivityCfg(activityId)
|
||||
return config and config.GuardPluginMaxCount
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetActivityRewardItemId()
|
||||
local activityId = XDataCenter.DoubleTowersManager.GetActivityId()
|
||||
local config = XDoubleTowersConfigs.GetActivityCfg(activityId)
|
||||
return config and config.RewardItemId
|
||||
end
|
||||
|
||||
---------------DoubleTowerRole being-----------------
|
||||
local IsInitDoubleTowerRole = false
|
||||
local ActivityIdToRoleId = 0
|
||||
local InitDoubleTowerRoleDic = function(activityId)
|
||||
if IsInitDoubleTowerRole then
|
||||
return
|
||||
end
|
||||
|
||||
-- local configs = GetRoleConfigs()
|
||||
-- for id, v in pairs(configs) do
|
||||
-- if not ActivityIdToRoleId[v.ActivityId] then
|
||||
-- ActivityIdToRoleId[v.ActivityId] = id
|
||||
-- end
|
||||
-- end
|
||||
ActivityIdToRoleId = activityId
|
||||
IsInitDoubleTowerRole = true
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
local activityId = XDataCenter.DoubleTowersManager.GetActivityId()
|
||||
InitDoubleTowerRoleDic(activityId)
|
||||
return ActivityIdToRoleId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRoleBasePluginIdList()
|
||||
local selectPluginType = XDoubleTowersConfigs.GetRoleSelectPluginType()
|
||||
if XTool.IsNumberValid(selectPluginType) then
|
||||
return XDoubleTowersConfigs.GetRolePluginLevelIdList()
|
||||
end
|
||||
return XDoubleTowersConfigs.GetDoubleTowerPluginIdList(selectPluginType)
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRoleSelectPluginType()
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
return GetRoleCfg(id).SlotPluginType
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRolePluginLevelIdList()
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
return GetRoleCfg(id).PluginLevelId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetDefaultRoleBaseId()
|
||||
local idList = XDoubleTowersConfigs.GetRolePluginLevelIdList()
|
||||
for idx, id in ipairs(idList or {}) do
|
||||
local preStage = XDoubleTowersConfigs.GetRolePreStageId(idx)
|
||||
--默认为不需要前置关卡的pluginevelId
|
||||
if not XTool.IsNumberValid(preStage) then
|
||||
return id
|
||||
end
|
||||
end
|
||||
return idList[1]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRoleDefaultPluginId()
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
return GetRoleCfg(id).DefaultPlugin
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRolePluginLevelId(index)
|
||||
local idList = XDoubleTowersConfigs.GetRolePluginLevelIdList()
|
||||
return idList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRolePreStageId(index)
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
local preStageIdList = GetRoleCfg(id).PreStage
|
||||
return preStageIdList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRoleIcon(index)
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
local iconList = GetRoleCfg(id).Icon
|
||||
return iconList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetRoleIconByPluginLevelId(pluginLevelId)
|
||||
local idList = XDoubleTowersConfigs.GetRolePluginLevelIdList()
|
||||
for index, id in ipairs(idList) do
|
||||
if pluginLevelId == id then
|
||||
return XDoubleTowersConfigs.GetRoleIcon(index)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetSlotPreStageId(index, type)
|
||||
local preStageIdList = {}
|
||||
if type == XDoubleTowersConfigs.ModuleType.Role then
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerRoleId()
|
||||
preStageIdList = GetRoleCfg(id).SlotPreStageId
|
||||
elseif type == XDoubleTowersConfigs.ModuleType.Guard then
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
preStageIdList = GetGuardCfg(id).SlotPreStageId
|
||||
end
|
||||
return preStageIdList[index]
|
||||
end
|
||||
|
||||
---------------DoubleTowerRole end-------------------
|
||||
|
||||
---------------DoubleTowerGuard being-------------------
|
||||
local IsInitDoubleTowerGuard = false
|
||||
local ActivityIdToGuardId = 0
|
||||
local InitDoubleTowerGuardDic = function(activityId)
|
||||
if IsInitDoubleTowerGuard then
|
||||
return
|
||||
end
|
||||
|
||||
-- local configs = GetGuardConfigs()
|
||||
-- for id, v in pairs(configs) do
|
||||
-- if not ActivityIdToGuardIdList[v.ActivityId] then
|
||||
-- ActivityIdToGuardIdList[v.ActivityId] = id
|
||||
-- end
|
||||
-- end
|
||||
ActivityIdToGuardId = activityId
|
||||
IsInitDoubleTowerGuard = true
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
local activityId = XDataCenter.DoubleTowersManager.GetActivityId()
|
||||
InitDoubleTowerGuardDic(activityId)
|
||||
return ActivityIdToGuardId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardBasePluginIdList()
|
||||
local selectPluginType = XDoubleTowersConfigs.GetGuardSelectPluginType()
|
||||
if XTool.IsNumberValid(selectPluginType) then
|
||||
return XDoubleTowersConfigs.GetGuardPluginLevelIdList()
|
||||
end
|
||||
return XDoubleTowersConfigs.GetDoubleTowerPluginIdList(selectPluginType)
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetDefaultGuardIndex()
|
||||
local idList = XDoubleTowersConfigs.GetGuardPluginLevelIdList()
|
||||
for idx, _ in ipairs(idList or {}) do
|
||||
local preStage = XDoubleTowersConfigs.GetGuardPreStageId(idx)
|
||||
--默认为不需要前置关卡的pluginevelId
|
||||
if not XTool.IsNumberValid(preStage) then
|
||||
return idx
|
||||
end
|
||||
end
|
||||
return 1
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardPluginLevelId(index)
|
||||
local idList = XDoubleTowersConfigs.GetGuardPluginLevelIdList()
|
||||
return idList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardSelectPluginType()
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
return GetGuardCfg(id).SlotPluginType
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardNpcIdList(index)
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
local npcIdList = GetGuardCfg(id).NPCId
|
||||
return npcIdList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardPluginLevelIdList()
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
return GetGuardCfg(id).PluginLevelId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardPreStageId(index)
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
local preStageIdList = GetGuardCfg(id).PreStageId
|
||||
return preStageIdList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardIcon(index)
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
local iconList = GetGuardCfg(id).Icon
|
||||
return iconList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardSmallIcon(index)
|
||||
local id = XDoubleTowersConfigs.GetDoubleTowerGuardId()
|
||||
local iconList = GetGuardCfg(id).SmallIcon
|
||||
return iconList[index]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetGuardIconByPluginLevelId(pluginLevelId, useSmallIcon)
|
||||
local idList = XDoubleTowersConfigs.GetGuardPluginLevelIdList()
|
||||
for index, id in ipairs(idList) do
|
||||
if pluginLevelId == id then
|
||||
return useSmallIcon and XDoubleTowersConfigs.GetGuardSmallIcon(index) or
|
||||
XDoubleTowersConfigs.GetGuardIcon(index)
|
||||
end
|
||||
end
|
||||
end
|
||||
---------------DoubleTowerGuard end---------------------
|
||||
|
||||
---------------DoubleTowerPlugin begin-------------------
|
||||
local IsInitDoubleTowerPlugin = false
|
||||
local ActivityIdToPluginIdList = {} --key:活动Id, value:插件组Id列表
|
||||
local PluginIdToLevelIdDic = {} --key1:插件Id, key2:等级, value:插件等级Id
|
||||
local PluginIdToMaxLevelDic = {} --key:插件Id, value:插件最高等级
|
||||
local PluginIdToLevelIdList = {}
|
||||
local InitDoubleTowerPluginDic = function()
|
||||
if IsInitDoubleTowerPlugin then
|
||||
return
|
||||
end
|
||||
|
||||
local configs = GetPluginConfigs()
|
||||
for id, v in pairs(configs) do
|
||||
if not ActivityIdToPluginIdList[v.ActivityId] then
|
||||
ActivityIdToPluginIdList[v.ActivityId] = {}
|
||||
end
|
||||
table.insert(ActivityIdToPluginIdList[v.ActivityId], id)
|
||||
end
|
||||
|
||||
configs = GetPluginLevelConfigs()
|
||||
for id, v in pairs(configs) do
|
||||
if not PluginIdToLevelIdDic[v.PluginId] then
|
||||
PluginIdToLevelIdDic[v.PluginId] = {}
|
||||
end
|
||||
PluginIdToLevelIdDic[v.PluginId][v.Level] = id
|
||||
|
||||
if not PluginIdToLevelIdList[v.PluginId] then
|
||||
PluginIdToLevelIdList[v.PluginId] = {}
|
||||
end
|
||||
table.insert(PluginIdToLevelIdList[v.PluginId], v.Id)
|
||||
|
||||
local curMaxLevel = PluginIdToMaxLevelDic[v.PluginId]
|
||||
if not curMaxLevel or curMaxLevel < v.Level then
|
||||
PluginIdToMaxLevelDic[v.PluginId] = v.Level
|
||||
end
|
||||
end
|
||||
|
||||
for _, levelIdList in pairs(PluginIdToLevelIdList) do
|
||||
table.sort(
|
||||
levelIdList,
|
||||
function(levelIdA, levelIdB)
|
||||
local levelA = XDoubleTowersConfigs.GetPluginLevel(levelIdA)
|
||||
local levelB = XDoubleTowersConfigs.GetPluginLevel(levelIdB)
|
||||
if levelA ~= levelB then
|
||||
return levelA < levelB
|
||||
end
|
||||
return levelIdA < levelIdB
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
IsInitDoubleTowerPlugin = true
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetDoubleTowerPluginIdList(type)
|
||||
InitDoubleTowerPluginDic()
|
||||
local activityId = XDataCenter.DoubleTowersManager.GetActivityId()
|
||||
local pluginIdList = ActivityIdToPluginIdList[activityId] or {}
|
||||
if not type then
|
||||
return pluginIdList
|
||||
end
|
||||
|
||||
local sameTypePluginIdList = {}
|
||||
for _, pluginId in ipairs(pluginIdList) do
|
||||
if XDoubleTowersConfigs.GetPluginType(pluginId) == type then
|
||||
table.insert(sameTypePluginIdList, pluginId)
|
||||
end
|
||||
end
|
||||
return sameTypePluginIdList
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginType(id)
|
||||
return GetPluginCfg(id).Type
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginIcon(id)
|
||||
return GetPluginCfg(id).Icon
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginDesc(id)
|
||||
return GetPluginCfg(id).Desc
|
||||
end
|
||||
---------------DoubleTowerPlugin end---------------------
|
||||
|
||||
---------------DoubleTowerPluginLevel begin-------------------
|
||||
function XDoubleTowersConfigs.GetPluginLevelId(pluginId, level)
|
||||
InitDoubleTowerPluginDic()
|
||||
level = XTool.IsNumberValid(level) and level or 1
|
||||
return PluginIdToLevelIdDic[pluginId] and PluginIdToLevelIdDic[pluginId][level]
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginLevelIdList(pluginId)
|
||||
InitDoubleTowerPluginDic()
|
||||
return PluginIdToLevelIdList[pluginId] or {}
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginMaxLevel(pluginId)
|
||||
InitDoubleTowerPluginDic()
|
||||
return PluginIdToMaxLevelDic[pluginId] or 0
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginLevelName(id)
|
||||
return GetPluginLevelCfg(id).Name
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetLevelPluginId(id)
|
||||
return GetPluginLevelCfg(id).PluginId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginLevel(id)
|
||||
return GetPluginLevelCfg(id).Level
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginLevelFightEventId(id)
|
||||
return GetPluginLevelCfg(id).FightEventId
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginLevelUpgradeSpend(id)
|
||||
return GetPluginLevelCfg(id).UpgradeSpend
|
||||
end
|
||||
|
||||
function XDoubleTowersConfigs.GetPluginLevelDesc(id)
|
||||
return GetPluginLevelCfg(id).Desc
|
||||
end
|
||||
---------------DoubleTowerPluginLevel end---------------------
|
271
Script/matrix/xconfig/XDrawConfigs.lua
Normal file
271
Script/matrix/xconfig/XDrawConfigs.lua
Normal file
|
@ -0,0 +1,271 @@
|
|||
local table = table
|
||||
local tableInsert = table.insert
|
||||
|
||||
XDrawConfigs = XDrawConfigs or {}
|
||||
|
||||
XDrawConfigs.ModelType = {
|
||||
Role = 1,
|
||||
Weapon = 2,
|
||||
Partner = 3
|
||||
}
|
||||
|
||||
XDrawConfigs.CombinationsTypes = {
|
||||
Normal = 1,
|
||||
Aim = 2,
|
||||
NewUp = 3,
|
||||
Furniture = 4,
|
||||
CharacterUp = 5,
|
||||
EquipSuit = 6,
|
||||
}
|
||||
|
||||
XDrawConfigs.DrawSetType = {
|
||||
Normal = 1,
|
||||
Destiny = 2,
|
||||
}
|
||||
|
||||
XDrawConfigs.RareRank = {
|
||||
A = 1,
|
||||
S = 2,
|
||||
}
|
||||
|
||||
XDrawConfigs.RuleType = {
|
||||
Tab = 0,
|
||||
Normal = 1,
|
||||
Lotto = 2,
|
||||
}
|
||||
|
||||
XDrawConfigs.GroupType = {
|
||||
Normal = 1,
|
||||
Destiny = 2,
|
||||
}
|
||||
|
||||
---
|
||||
--- 卡池可掉落的奖励类型
|
||||
XDrawConfigs.DrawCapacityCheckType = {
|
||||
Partner = 1 -- 伙伴
|
||||
}
|
||||
|
||||
local TABLE_DRAW_PREVIEW = "Client/Draw/DrawPreview.tab"
|
||||
local TABLE_DRAW_PREVIEW_GOODS = "Client/Draw/DrawPreviewGoods.tab"
|
||||
local TABLE_DRAW_COMBINATIONS = "Client/Draw/DrawCombinations.tab"
|
||||
local TABLE_DRAW_PROB = "Client/Draw/DrawProbShow.tab"
|
||||
local TABLE_GROUP_RULE = "Client/Draw/DrawGroupRule.tab"
|
||||
local TABLE_AIMPROBABILITY = "Client/Draw/DrawAimProbability.tab"
|
||||
local TABLE_DRAW_SHOW = "Client/Draw/DrawShow.tab"
|
||||
local TABLE_DRAW_CAMERA = "Client/Draw/DrawCamera.tab"
|
||||
local TABLE_DRAW_TABS = "Client/Draw/DrawTabs.tab"
|
||||
local TABLE_DRAW_SHOW_CHARACTER = "Client/Draw/DrawShowCharacter.tab"
|
||||
local TABLE_DRAW_TYPE_CHANGE = "Client/Draw/DrawTypeChange.tab"
|
||||
local TABLE_DRAW_SHOW_EFFECT = "Client/Draw/DrawShowEffect.tab"
|
||||
local TABLE_DRAW_GROUP_RELATION = "Client/Draw/DrawGroupRelation.tab"
|
||||
local TABLE_DRAW_SKIP = "Client/Draw/DrawSkip.tab"
|
||||
local TABLE_DRAW_SCENE = "Client/Draw/DrawScene.tab"
|
||||
local TABLE_DRAW_NEWYEARSHOW = "Client/Draw/JPDrawNewYearShow.tab"
|
||||
|
||||
local DrawPreviews = {}
|
||||
local DrawCombinations = {}
|
||||
local DrawProbs = {}
|
||||
local DrawGroupRule = {}
|
||||
local DrawAimProbability = {}
|
||||
local DrawShow = {}
|
||||
local DrawShowEffect = {}
|
||||
local DrawCamera = {}
|
||||
local DrawTabs = {}
|
||||
local DrawShowCharacter = {}
|
||||
local DrawTypeChangeCfg = {}
|
||||
local DrawSubGroupDic = {}
|
||||
local DrawGroupRelationCfg = {}
|
||||
local DrawGroupRelationDic = {}
|
||||
local DrawSkipCfg = {}
|
||||
local DrawSceneCfg = {}
|
||||
local DrawNewYearShow = {}
|
||||
|
||||
function XDrawConfigs.Init()
|
||||
DrawCombinations = XTableManager.ReadByIntKey(TABLE_DRAW_COMBINATIONS, XTable.XTableDrawCombinations, "Id")
|
||||
DrawGroupRule = XTableManager.ReadByIntKey(TABLE_GROUP_RULE, XTable.XTableDrawGroupRule, "Id")
|
||||
DrawShow = XTableManager.ReadByIntKey(TABLE_DRAW_SHOW, XTable.XTableDrawShow, "Type")
|
||||
DrawCamera = XTableManager.ReadByIntKey(TABLE_DRAW_CAMERA, XTable.XTableDrawCamera, "Id")
|
||||
DrawTabs = XTableManager.ReadByIntKey(TABLE_DRAW_TABS, XTable.XTableDrawTabs, "Id")
|
||||
DrawShowCharacter = XTableManager.ReadByIntKey(TABLE_DRAW_SHOW_CHARACTER, XTable.XTableDrawShowCharacter, "Id")
|
||||
DrawAimProbability = XTableManager.ReadByIntKey(TABLE_AIMPROBABILITY, XTable.XTableDrawAimProbability, "Id")
|
||||
DrawTypeChangeCfg = XTableManager.ReadByIntKey(TABLE_DRAW_TYPE_CHANGE, XTable.XTableDrawTypeChange, "MainGroupId")
|
||||
DrawShowEffect = XTableManager.ReadByIntKey(TABLE_DRAW_SHOW_EFFECT, XTable.XTableDrawShowEffect, "EffectGroupId")
|
||||
DrawGroupRelationCfg = XTableManager.ReadByIntKey(TABLE_DRAW_GROUP_RELATION, XTable.XTableDrawGroupRelation, "NormalGroupId")
|
||||
DrawSkipCfg = XTableManager.ReadByIntKey(TABLE_DRAW_SKIP, XTable.XTableDrawSkip, "DrawGroupId")
|
||||
DrawSceneCfg = XTableManager.ReadByIntKey(TABLE_DRAW_SCENE, XTable.XTableDrawScene, "Id")
|
||||
DrawNewYearShow = XTableManager.ReadByIntKey(TABLE_DRAW_NEWYEARSHOW, XTable.XTableDrawNewYearActivityShow, "Type")
|
||||
|
||||
local previews = XTableManager.ReadAllByIntKey(TABLE_DRAW_PREVIEW, XTable.XTableDrawPreview, "Id")
|
||||
local previewGoods = XTableManager.ReadAllByIntKey(TABLE_DRAW_PREVIEW_GOODS, XTable.XTableRewardGoods, "Id")
|
||||
|
||||
for drawId, preview in pairs(previews) do
|
||||
local upGoodsIds = preview.UpGoodsId
|
||||
local upGoods = {}
|
||||
for i = 1, #upGoodsIds do
|
||||
tableInsert(upGoods, XRewardManager.CreateRewardGoodsByTemplate(previewGoods[upGoodsIds[i]]))
|
||||
end
|
||||
|
||||
local goodsIds = preview.GoodsId
|
||||
local goods = {}
|
||||
for i = 1, #goodsIds do
|
||||
tableInsert(goods, XRewardManager.CreateRewardGoodsByTemplate(previewGoods[goodsIds[i]]))
|
||||
end
|
||||
|
||||
local drawPreview = {}
|
||||
drawPreview.UpGoods = upGoods
|
||||
drawPreview.Goods = goods
|
||||
DrawPreviews[drawId] = drawPreview
|
||||
end
|
||||
|
||||
local drawProbList = XTableManager.ReadByIntKey(TABLE_DRAW_PROB, XTable.XTableDrawProbShow, "Id")
|
||||
for _, v in pairs(drawProbList) do
|
||||
if not DrawProbs[v.DrawId] then
|
||||
DrawProbs[v.DrawId] = {}
|
||||
end
|
||||
tableInsert(DrawProbs[v.DrawId], v)
|
||||
end
|
||||
|
||||
XDrawConfigs.SetDrawSubGroupDic()
|
||||
XDrawConfigs.SetGroupRelationDic()
|
||||
end
|
||||
|
||||
function XDrawConfigs.SetDrawSubGroupDic()
|
||||
for _, typeChangeGroup in pairs(DrawTypeChangeCfg or {}) do
|
||||
for _, subGroupId in pairs(typeChangeGroup.SubGroupId or {}) do
|
||||
if not DrawSubGroupDic[subGroupId] then
|
||||
DrawSubGroupDic[subGroupId] = typeChangeGroup.MainGroupId
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XDrawConfigs.SetGroupRelationDic()
|
||||
DrawGroupRelationDic = {}
|
||||
for _, data in pairs(DrawGroupRelationCfg) do
|
||||
if not DrawGroupRelationDic[data.NormalGroupId] then
|
||||
DrawGroupRelationDic[data.NormalGroupId] = data.DestinyGroupId
|
||||
else
|
||||
XLog.Error("Can Not Use Same GroupId for NormalGroupId .GroupId:" .. data.NormalGroupId)
|
||||
end
|
||||
|
||||
if not DrawGroupRelationDic[data.DestinyGroupId] then
|
||||
DrawGroupRelationDic[data.DestinyGroupId] = data.NormalGroupId
|
||||
else
|
||||
XLog.Error("Can Not Use Same GroupId for DestinyGroupId .GroupId:" .. data.DestinyGroupId)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawGroupRelationDic()
|
||||
return DrawGroupRelationDic
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawCombinations()
|
||||
return DrawCombinations
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawGroupRule()
|
||||
return DrawGroupRule
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawAimProbability()
|
||||
return DrawAimProbability
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawShow()
|
||||
return DrawShow
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawNewYearShow()
|
||||
return DrawNewYearShow
|
||||
end
|
||||
|
||||
---
|
||||
--- 获取'drawGroupId'卡组的跳转ID数组
|
||||
function XDrawConfigs.GetDrawSkipList(drawGroupId)
|
||||
if DrawSkipCfg[drawGroupId] then
|
||||
return DrawSkipCfg[drawGroupId].SkipId
|
||||
end
|
||||
return {}
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawShowCharacter()
|
||||
return DrawShowCharacter
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawCamera()
|
||||
return DrawCamera
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawTabs()
|
||||
return DrawTabs
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawPreviews()
|
||||
return DrawPreviews
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawProbs()
|
||||
return DrawProbs
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawTypeChangeCfg()
|
||||
return DrawTypeChangeCfg
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawGroupRelationCfg()
|
||||
return DrawGroupRelationCfg
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawTypeChangeCfgById(id)
|
||||
return DrawTypeChangeCfg[id]
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawSubGroupDic()
|
||||
return DrawSubGroupDic
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawTabById(id)
|
||||
if not DrawTabs[id] then
|
||||
XLog.Error("Client/Draw/DrawTabs.tab Id = " .. id .. " Is Null")
|
||||
end
|
||||
return DrawTabs[id]
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawGroupRuleById(id)
|
||||
if not DrawGroupRule[id] then
|
||||
XLog.Error("Client/Draw/DrawGroupRule.tab Id = " .. id .. " Is Null")
|
||||
end
|
||||
return DrawGroupRule[id]
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawShowEffectById(id)
|
||||
if not DrawShowEffect[id] then
|
||||
XLog.Error("Client/Draw/DrawShowEffect.tab Id = " .. id .. " Is Null")
|
||||
end
|
||||
return DrawShowEffect[id]
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetOpenUpEffect(id)
|
||||
return XDrawConfigs.GetDrawShowEffectById(id).PanelOpenUp
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetOpenDownEffect(id)
|
||||
return XDrawConfigs.GetDrawShowEffectById(id).PanelOpenDown
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetCardShowOffEffect(id)
|
||||
return XDrawConfigs.GetDrawShowEffectById(id).PanelCardShowOff
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetOpenBoxEffect(id)
|
||||
return XDrawConfigs.GetDrawShowEffectById(id).EffectOpenBox
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetSkipEffect(id)
|
||||
return XDrawConfigs.GetDrawShowEffectById(id).SkipEffect
|
||||
end
|
||||
|
||||
function XDrawConfigs.GetDrawSceneCfg(id)
|
||||
return DrawSceneCfg[id]
|
||||
end
|
90
Script/matrix/xconfig/XEliminateGameConfig.lua
Normal file
90
Script/matrix/xconfig/XEliminateGameConfig.lua
Normal file
|
@ -0,0 +1,90 @@
|
|||
XEliminateGameConfig = XEliminateGameConfig or {}
|
||||
|
||||
|
||||
local TABLE_ELIMINATEGAME_GAME = "Share/EliminateGame/EliminateGame.tab"
|
||||
local TABLE_ELIMINATEGAME_GRID = "Share/EliminateGame/EliminateGrid.tab"
|
||||
local TABLE_ELIMINATEGAME_REWARD = "Share/EliminateGame/EliminateReward.tab"
|
||||
local TABLE_ELIMINATEGAME_GRID_TYPE = "Share/EliminateGame/EliminateGridType.tab"
|
||||
|
||||
local EliminateGameConfig = {}
|
||||
local EliminateGridConfig = {}
|
||||
local EliminateRewardConfig = {}
|
||||
local EliminateGridTypeConfig = {}
|
||||
|
||||
function XEliminateGameConfig.Init()
|
||||
EliminateGameConfig = XTableManager.ReadByIntKey(TABLE_ELIMINATEGAME_GAME, XTable.XTableEliminateGame, "Id")
|
||||
EliminateGridConfig = XTableManager.ReadByIntKey(TABLE_ELIMINATEGAME_GRID, XTable.XTableEliminateGrid, "Id")
|
||||
EliminateRewardConfig = XTableManager.ReadByIntKey(TABLE_ELIMINATEGAME_REWARD, XTable.XTableEliminateReward, "Id")
|
||||
EliminateGridTypeConfig = XTableManager.ReadByIntKey(TABLE_ELIMINATEGAME_GRID_TYPE, XTable.XTableEliminateGridType, "Id")
|
||||
end
|
||||
|
||||
|
||||
--获取消除游戏
|
||||
function XEliminateGameConfig.GetEliminateGame(id)
|
||||
if not EliminateGameConfig or not EliminateGameConfig[id] then
|
||||
XLog.ErrorTableDataNotFound("XEliminateGameConfig.GetEliminateGame", "Id", TABLE_ELIMINATEGAME_GAME, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return EliminateGameConfig[id]
|
||||
end
|
||||
|
||||
|
||||
--获取消除游戏格子
|
||||
function XEliminateGameConfig.GetEliminateGameGrid(id)
|
||||
if not EliminateGridConfig or not EliminateGridConfig[id] then
|
||||
XLog.ErrorTableDataNotFound("XEliminateGameConfig.GetEliminateGameGrid", "Id", TABLE_ELIMINATEGAME_GRID, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return EliminateGridConfig[id]
|
||||
end
|
||||
|
||||
|
||||
--获取消除游戏奖励
|
||||
function XEliminateGameConfig.GetEliminateGameReward(id)
|
||||
if not EliminateRewardConfig or not EliminateRewardConfig[id] then
|
||||
XLog.ErrorTableDataNotFound("XEliminateGameConfig.GetEliminateGameReward", "Id", TABLE_ELIMINATEGAME_REWARD, "id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
|
||||
return EliminateRewardConfig[id]
|
||||
end
|
||||
|
||||
|
||||
--获取格子
|
||||
function XEliminateGameConfig.GetEliminateGameGridByType(typeId)
|
||||
if not EliminateGridTypeConfig then
|
||||
XLog.ErrorTableDataNotFound("XEliminateGameConfig.GetEliminateGameGridByType", "Id", TABLE_ELIMINATEGAME_GRID_TYPE, "typeId", tostring(typeId))
|
||||
return nil
|
||||
end
|
||||
|
||||
for i, v in pairs(EliminateGridTypeConfig) do
|
||||
if v.Type == typeId then
|
||||
return v
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
|
||||
-- --获取格子
|
||||
-- function XEliminateGameConfig.GetEliminateGameGridById(id)
|
||||
-- if not EliminateGridTypeConfig or not EliminateGridTypeConfig[id] then
|
||||
-- XLog.ErrorTableDataNotFound("XEliminateGameConfig.GetEliminateGameGridById", "Id", TABLE_ELIMINATEGAME_GRID_TYPE, "id", tostring(id))
|
||||
-- return nil
|
||||
-- end
|
||||
-- return EliminateGridTypeConfig[id]
|
||||
-- end
|
||||
--获取消除游戏奖励
|
||||
function XEliminateGameConfig.GetEliminateGameRewardByGameId(id)
|
||||
local rewards = {}
|
||||
for _, v in pairs(EliminateRewardConfig) do
|
||||
if v.GameId == id then
|
||||
table.insert(rewards, v)
|
||||
end
|
||||
end
|
||||
|
||||
return rewards
|
||||
end
|
994
Script/matrix/xconfig/XEquipConfig.lua
Normal file
994
Script/matrix/xconfig/XEquipConfig.lua
Normal file
|
@ -0,0 +1,994 @@
|
|||
local tableInsert = table.insert
|
||||
|
||||
XEquipConfig = XEquipConfig or {}
|
||||
|
||||
XEquipConfig.MAX_STAR_COUNT = 6 -- 最大星星数
|
||||
XEquipConfig.MAX_SUIT_SKILL_COUNT = 3 -- 最大套装激活技能个数
|
||||
XEquipConfig.MAX_RESONANCE_SKILL_COUNT = 3 -- 最大共鸣属性/技能个数
|
||||
XEquipConfig.MIN_RESONANCE_EQUIP_STAR_COUNT = 5 -- 装备共鸣最低星级
|
||||
XEquipConfig.MAX_SUIT_COUNT = 6 -- 套装最大数量
|
||||
XEquipConfig.DEFAULT_SUIT_ID = { -- 用来显示全部套装数量的默认套装Id
|
||||
Normal = 1, --构造体
|
||||
Isomer = 2, --感染体
|
||||
}
|
||||
XEquipConfig.CAN_NOT_AUTO_EAT_STAR = 5 -- 大于等于该星级的装备不会被当做默认狗粮选中
|
||||
XEquipConfig.AWAKE_SKILL_COUNT = 2 -- 觉醒技能数量
|
||||
|
||||
--武器类型
|
||||
XEquipConfig.EquipType = {
|
||||
Universal = 0, -- 通用
|
||||
Suncha = 1, -- 双枪
|
||||
Sickle = 2, -- 太刀
|
||||
Mount = 3, -- 挂载
|
||||
Arrow = 4, -- 弓箭
|
||||
Chainsaw = 5, -- 电锯
|
||||
Sword = 6, -- 大剑
|
||||
Hcan = 7, -- 巨炮
|
||||
DoubleSwords = 8, -- 双短刀
|
||||
sickle = 9, --镰刀
|
||||
IsomerSword = 10, -- 感染者专用大剑
|
||||
Food = 99, -- 狗粮
|
||||
}
|
||||
|
||||
XEquipConfig.UserType = {
|
||||
All = 0, --通用
|
||||
Normal = 1, --构造体
|
||||
Isomer = 2, --异构体/感染体
|
||||
}
|
||||
|
||||
XEquipConfig.AddAttrType = {
|
||||
Numeric = 1, -- 数值
|
||||
Rate = 2, -- 基础属性的百分比
|
||||
Promoted = 3, -- 等级加成
|
||||
}
|
||||
|
||||
XEquipConfig.UserType = {
|
||||
All = 0, --通用
|
||||
Normal = 1, --构造体
|
||||
Isomer = 2, --异构体/感染体
|
||||
}
|
||||
|
||||
--要显示的属性排序
|
||||
XEquipConfig.AttrSortType = {
|
||||
XNpcAttribType.Life,
|
||||
XNpcAttribType.AttackNormal,
|
||||
XNpcAttribType.DefenseNormal,
|
||||
XNpcAttribType.Crit,
|
||||
}
|
||||
|
||||
XEquipConfig.EquipSite = {
|
||||
Weapon = 0, -- 武器
|
||||
Awareness = { -- 意识
|
||||
One = 1, -- 1号位
|
||||
Two = 2, -- 2号位
|
||||
Three = 3, -- 3号位
|
||||
Four = 4, -- 4号位
|
||||
Five = 5, -- 5号位
|
||||
Six = 6, -- 6号位
|
||||
},
|
||||
}
|
||||
|
||||
XEquipConfig.AwarenessSiteToStr = {
|
||||
[XEquipConfig.EquipSite.Awareness.One] = CS.XTextManager.GetText("AwarenessSiteOne"),
|
||||
[XEquipConfig.EquipSite.Awareness.Two] = CS.XTextManager.GetText("AwarenessSiteTwo"),
|
||||
[XEquipConfig.EquipSite.Awareness.Three] = CS.XTextManager.GetText("AwarenessSiteThree"),
|
||||
[XEquipConfig.EquipSite.Awareness.Four] = CS.XTextManager.GetText("AwarenessSiteFour"),
|
||||
[XEquipConfig.EquipSite.Awareness.Five] = CS.XTextManager.GetText("AwarenessSiteFive"),
|
||||
[XEquipConfig.EquipSite.Awareness.Six] = CS.XTextManager.GetText("AwarenessSiteSix"),
|
||||
}
|
||||
|
||||
XEquipConfig.Classify = {
|
||||
Weapon = 1, -- 武器
|
||||
Awareness = 2, -- 意识
|
||||
}
|
||||
|
||||
XEquipConfig.EquipResonanceType = {
|
||||
Attrib = 1, -- 属性共鸣
|
||||
CharacterSkill = 2, -- 角色技能共鸣
|
||||
WeaponSkill = 3, -- 武器技能共鸣
|
||||
}
|
||||
|
||||
--排序优先级选项
|
||||
XEquipConfig.PriorSortType = {
|
||||
Star = 0, -- 星级
|
||||
Breakthrough = 1, -- 突破次数
|
||||
Level = 2, -- 等级
|
||||
Proceed = 3, -- 入手顺序
|
||||
}
|
||||
|
||||
-- 武器部位
|
||||
XEquipConfig.WeaponCase = {
|
||||
Case1 = 1,
|
||||
Case2 = 2,
|
||||
Case3 = 3,
|
||||
--[[支持继续扩展
|
||||
Case4 = 4,
|
||||
...
|
||||
]]
|
||||
}
|
||||
|
||||
-- 狗粮类型
|
||||
XEquipConfig.EatType = {
|
||||
Equip = 0,
|
||||
Item = 1,
|
||||
}
|
||||
|
||||
-- 武器模型用途
|
||||
XEquipConfig.WeaponUsage = {
|
||||
Role = 1, -- ui角色身上
|
||||
Battle = 2, -- 战斗
|
||||
Show = 3, -- ui单独展示
|
||||
}
|
||||
|
||||
-- 装备详情UI页签
|
||||
XEquipConfig.EquipDetailBtnTabIndex = {
|
||||
Detail = 1,
|
||||
Strengthen = 2,
|
||||
Resonance = 3,
|
||||
}
|
||||
|
||||
--武器超频界面页签状态
|
||||
XEquipConfig.EquipAwakeTabIndex = {
|
||||
Material = 1,
|
||||
CrystalMoney = 2,
|
||||
}
|
||||
|
||||
-- 共鸣后武器显示延时时间
|
||||
XEquipConfig.WeaponResonanceShowDelay = CS.XGame.ClientConfig:GetInt("WeaponResonanceShowDelay")
|
||||
|
||||
-- 分解数量溢出提示文本
|
||||
XEquipConfig.DecomposeRewardOverLimitTip = {
|
||||
[XEquipConfig.Classify.Weapon] = CS.XTextManager.GetText("WeaponBoxWillBeFull"),
|
||||
[XEquipConfig.Classify.Awareness] = CS.XTextManager.GetText("WaferBoxWillBeFull"),
|
||||
}
|
||||
|
||||
local EquipBreakThroughIcon = {
|
||||
[0] = CS.XGame.ClientConfig:GetString("EquipBreakThrough0"),
|
||||
[1] = CS.XGame.ClientConfig:GetString("EquipBreakThrough1"),
|
||||
[2] = CS.XGame.ClientConfig:GetString("EquipBreakThrough2"),
|
||||
[3] = CS.XGame.ClientConfig:GetString("EquipBreakThrough3"),
|
||||
[4] = CS.XGame.ClientConfig:GetString("EquipBreakThrough4"),
|
||||
}
|
||||
|
||||
local EquipBreakThroughSmallIcon = {
|
||||
[1] = CS.XGame.ClientConfig:GetString("EquipBreakThroughSmall1"),
|
||||
[2] = CS.XGame.ClientConfig:GetString("EquipBreakThroughSmall2"),
|
||||
[3] = CS.XGame.ClientConfig:GetString("EquipBreakThroughSmall3"),
|
||||
[4] = CS.XGame.ClientConfig:GetString("EquipBreakThroughSmall4"),
|
||||
}
|
||||
|
||||
local EquipBreakThroughBigIcon = {
|
||||
[0] = CS.XGame.ClientConfig:GetString("EquipBreakThroughBig0"),
|
||||
[1] = CS.XGame.ClientConfig:GetString("EquipBreakThroughBig1"),
|
||||
[2] = CS.XGame.ClientConfig:GetString("EquipBreakThroughBig2"),
|
||||
[3] = CS.XGame.ClientConfig:GetString("EquipBreakThroughBig3"),
|
||||
[4] = CS.XGame.ClientConfig:GetString("EquipBreakThroughBig4"),
|
||||
}
|
||||
|
||||
-- 共鸣图标(觉醒后图标变更)
|
||||
local EquipResonanceIconPath = {
|
||||
[true] = CS.XGame.ClientConfig:GetString("EquipAwakenIcon"),
|
||||
[false] = CS.XGame.ClientConfig:GetString("EquipResonanceIcon"),
|
||||
}
|
||||
|
||||
local TABLE_EQUIP_PATH = "Share/Equip/Equip.tab"
|
||||
local TABLE_EQUIP_BREAKTHROUGH_PATH = "Share/Equip/EquipBreakThrough.tab"
|
||||
local TABLE_EQUIP_SUIT_PATH = "Share/Equip/EquipSuit.tab"
|
||||
local TABLE_EQUIP_SUIT_EFFECT_PATH = "Share/Equip/EquipSuitEffect.tab"
|
||||
local TABLE_LEVEL_UP_TEMPLATE_PATH = "Share/Equip/LevelUpTemplate/"
|
||||
local TABLE_EQUIP_DECOMPOSE_PATH = "Share/Equip/EquipDecompose.tab"
|
||||
local TABLE_EAT_EQUIP_COST_PATH = "Share/Equip/EatEquipCost.tab"
|
||||
local TABLE_EQUIP_RESONANCE_PATH = "Share/Equip/EquipResonance.tab"
|
||||
local TABLE_EQUIP_RESONANCE_CONSUME_ITEM_PATH = "Share/Equip/EquipResonanceUseItem.tab"
|
||||
local TABLE_WEAPON_SKILL_PATH = "Share/Equip/WeaponSkill.tab"
|
||||
local TABLE_WEAPON_SKILL_POOL_PATH = "Share/Equip/WeaponSkillPool.tab"
|
||||
local TABLE_EQUIP_AWAKE_PATH = "Share/Equip/EquipAwake.tab"
|
||||
local TABLE_EQUIP_RES_PATH = "Client/Equip/EquipRes.tab"
|
||||
local TABLE_EQUIP_MODEL_PATH = "Client/Equip/EquipModel.tab"
|
||||
local TABLE_EQUIP_MODEL_TRANSFORM_PATH = "Client/Equip/EquipModelTransform.tab"
|
||||
local TABLE_EQUIP_SKIPID_PATH = "Client/Equip/EquipSkipId.tab"
|
||||
local TABLE_EQUIP_ANIM_PATH = "Client/Equip/EquipAnim.tab"
|
||||
local TABLE_EQUIP_MODEL_SHOW_PATH = "Client/Equip/EquipModelShow.tab"
|
||||
local TABLE_EQUIP_RES_BY_FOOL_PATH = "Client/Equip/EquipResByFool.tab"
|
||||
|
||||
local MAX_WEAPON_COUNT -- 武器拥有最大数量
|
||||
local MAX_AWARENESS_COUNT -- 意识拥有最大数量
|
||||
local EQUIP_EXP_INHERIT_PRECENT -- 强化时的经验继承百分比
|
||||
local EQUIP_RECYCLE_ITEM_PERCENT -- 回收获得道具数量百分比
|
||||
local MIN_RESONANCE_BIND_STAR -- 只有6星以上的意识才可以共鸣出绑定角色的技能
|
||||
local MIN_AWAKE_STAR -- 最低可觉醒星数
|
||||
|
||||
local EquipTemplates = {} -- 装备配置
|
||||
local EquipBreakthroughTemplate = {} -- 突破配置
|
||||
local EquipResonanceTemplate = {} -- 共鸣配置
|
||||
local EquipResonanceConsumeItemTemplates = {} -- 共鸣消耗物品配置
|
||||
local LevelUpTemplates = {} -- 升级模板
|
||||
local EquipSuitTemplate = {} -- 套装技能表
|
||||
local EquipSuitEffectTemplate = {} -- 套装效果表
|
||||
local WeaponSkillTemplate = {} -- 武器技能配置
|
||||
local WeaponSkillPoolTemplate = {} -- 武器技能池(共鸣用)配置
|
||||
local EatEquipCostTemplate = {} -- 装备强化消耗配置
|
||||
local EquipResTemplates = {} -- 装备资源配置
|
||||
local EquipModelTemplates = {} -- 武器模型配置
|
||||
local EquipModelTransformTemplates = {} -- 武器模型UI偏移配置
|
||||
local EquipSkipIdTemplates = {} -- 装备来源跳转ID配置
|
||||
local EquipAwakeTemplate = {} -- 觉醒配置
|
||||
local EquipAnimTemplates = {} -- 动画配置
|
||||
local EquipModelShowTemplate = {} -- 控制武器模型显示
|
||||
local EquipResByFoolTemplate = {} -- 愚人节装备资源替换配置
|
||||
|
||||
local EquipBorderDic = {} -- 装备边界属性构造字典
|
||||
local EquipDecomposeDic = {}
|
||||
local SuitIdToEquipTemplateIdsDic = {} -- 套装Id索引的装备Id字典
|
||||
local SuitSitesDic = {} -- 套装产出部位字典
|
||||
|
||||
--记录超频界面的页签状态
|
||||
local EquipAwakeTabIndex = XEquipConfig.EquipAwakeTabIndex.Material
|
||||
|
||||
local CompareBreakthrough = function(templateId, breakthrough)
|
||||
local template = EquipBorderDic[templateId]
|
||||
if not template then
|
||||
return
|
||||
end
|
||||
|
||||
if not template.MaxBreakthrough or template.MaxBreakthrough < breakthrough then
|
||||
template.MaxBreakthrough = breakthrough
|
||||
end
|
||||
end
|
||||
|
||||
local CheckEquipBorderConfig = function()
|
||||
for k, v in pairs(EquipBorderDic) do
|
||||
local template = EquipBorderDic[k]
|
||||
template.MinLevel = 1
|
||||
local equipBreakthroughCfg = XEquipConfig.GetEquipBreakthroughCfg(k, v.MaxBreakthrough)
|
||||
template.MaxLevel = equipBreakthroughCfg.LevelLimit
|
||||
template.MinBreakthrough = 0
|
||||
end
|
||||
end
|
||||
|
||||
local InitEquipBreakthroughConfig = function()
|
||||
local tab = XTableManager.ReadByIntKey(TABLE_EQUIP_BREAKTHROUGH_PATH, XTable.XTableEquipBreakthrough, "Id")
|
||||
for _, config in pairs(tab) do
|
||||
if not EquipBreakthroughTemplate[config.EquipId] then
|
||||
EquipBreakthroughTemplate[config.EquipId] = {}
|
||||
end
|
||||
|
||||
if config.AttribPromotedId == 0 then
|
||||
XLog.ErrorTableDataNotFound("InitEquipBreakthroughConfig", "EquipBreakthroughTemplate",
|
||||
TABLE_EQUIP_BREAKTHROUGH_PATH, "config.EquipId", tostring(config.EquipId))
|
||||
end
|
||||
|
||||
EquipBreakthroughTemplate[config.EquipId][config.Times] = config
|
||||
CompareBreakthrough(config.EquipId, config.Times)
|
||||
end
|
||||
end
|
||||
|
||||
local InitEquipLevelConfig = function()
|
||||
local paths = CS.XTableManager.GetPaths(TABLE_LEVEL_UP_TEMPLATE_PATH)
|
||||
XTool.LoopCollection(paths, function(path)
|
||||
local key = tonumber(XTool.GetFileNameWithoutExtension(path))
|
||||
LevelUpTemplates[key] = XTableManager.ReadByIntKey(path, XTable.XTableEquipLevelUp, "Level")
|
||||
end)
|
||||
end
|
||||
|
||||
local InitWeaponSkillPoolConfig = function()
|
||||
local tab = XTableManager.ReadByIntKey(TABLE_WEAPON_SKILL_POOL_PATH, XTable.XTableWeaponSkillPool, "Id")
|
||||
for _, config in pairs(tab) do
|
||||
WeaponSkillPoolTemplate[config.PoolId] = WeaponSkillPoolTemplate[config.PoolId] or {}
|
||||
WeaponSkillPoolTemplate[config.PoolId][config.CharacterId] = WeaponSkillPoolTemplate[config.PoolId][config.CharacterId] or {}
|
||||
|
||||
for i, skillId in ipairs(config.SkillId) do
|
||||
tableInsert(WeaponSkillPoolTemplate[config.PoolId][config.CharacterId], skillId)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local InitEquipModelTransformConfig = function()
|
||||
local tab = XTableManager.ReadByIntKey(TABLE_EQUIP_MODEL_TRANSFORM_PATH, XTable.XTableEquipModelTransform, "Id")
|
||||
for id, config in pairs(tab) do
|
||||
local indexId = config.IndexId
|
||||
if not indexId then
|
||||
XLog.ErrorTableDataNotFound("InitEquipModelTransformConfig", "tab", TABLE_EQUIP_MODEL_TRANSFORM_PATH, "id", tostring(id))
|
||||
end
|
||||
EquipModelTransformTemplates[indexId] = EquipModelTransformTemplates[indexId] or {}
|
||||
|
||||
local uiName = config.UiName
|
||||
if not uiName then
|
||||
XLog.ErrorTableDataNotFound("InitEquipModelTransformConfig", "配置表中UiName字段", TABLE_EQUIP_MODEL_TRANSFORM_PATH, "id", tostring(id))
|
||||
end
|
||||
EquipModelTransformTemplates[indexId][uiName] = config
|
||||
end
|
||||
end
|
||||
|
||||
local InitEquipSkipIdConfig = function()
|
||||
local tab = XTableManager.ReadByIntKey(TABLE_EQUIP_SKIPID_PATH, XTable.XTableEquipSkipId, "Id")
|
||||
for id, config in pairs(tab) do
|
||||
local eatType = config.EatType
|
||||
EquipSkipIdTemplates[eatType] = EquipSkipIdTemplates[eatType] or {}
|
||||
|
||||
local site = config.Site
|
||||
if not site then
|
||||
XLog.ErrorTableDataNotFound("InitEquipSkipIdConfig", "配置表中Site字段", TABLE_EQUIP_SKIPID_PATH, "id", tostring(id))
|
||||
end
|
||||
EquipSkipIdTemplates[eatType][site] = config
|
||||
end
|
||||
end
|
||||
|
||||
local InitEquipSuitConfig = function()
|
||||
EquipSuitTemplate = XTableManager.ReadByIntKey(TABLE_EQUIP_SUIT_PATH, XTable.XTableEquipSuit, "Id")
|
||||
EquipSuitEffectTemplate = XTableManager.ReadByIntKey(TABLE_EQUIP_SUIT_EFFECT_PATH, XTable.XTableEquipSuitEffect, "Id")
|
||||
end
|
||||
|
||||
function XEquipConfig.Init()
|
||||
MAX_WEAPON_COUNT = CS.XGame.Config:GetInt("EquipWeaponMaxCount")
|
||||
MAX_AWARENESS_COUNT = CS.XGame.Config:GetInt("EquipChipMaxCount")
|
||||
EQUIP_EXP_INHERIT_PRECENT = CS.XGame.Config:GetInt("EquipExpInheritPercent")
|
||||
EQUIP_RECYCLE_ITEM_PERCENT = CS.XGame.Config:GetInt("EquipRecycleItemPercent")
|
||||
MIN_RESONANCE_BIND_STAR = CS.XGame.Config:GetInt("MinResonanceBindStar")
|
||||
MIN_AWAKE_STAR = CS.XGame.Config:GetInt("MinEquipAwakeStar")
|
||||
|
||||
EquipTemplates = CS.XNpcManager.EquipTemplateTable
|
||||
EquipResTemplates = XTableManager.ReadByIntKey(TABLE_EQUIP_RES_PATH, XTable.XTableEquipRes, "Id")
|
||||
EquipAwakeTemplate = XTableManager.ReadByIntKey(TABLE_EQUIP_AWAKE_PATH, XTable.XTableEquipAwake, "Id")
|
||||
XTool.LoopMap(EquipTemplates, function(id, equipCfg)
|
||||
EquipBorderDic[id] = {}
|
||||
local suitId = equipCfg.SuitId
|
||||
if suitId and suitId > 0 then
|
||||
SuitIdToEquipTemplateIdsDic[suitId] = SuitIdToEquipTemplateIdsDic[suitId] or {}
|
||||
tableInsert(SuitIdToEquipTemplateIdsDic[suitId], id)
|
||||
|
||||
SuitSitesDic[suitId] = SuitSitesDic[suitId] or {}
|
||||
SuitSitesDic[suitId][equipCfg.Site] = true
|
||||
end
|
||||
end)
|
||||
|
||||
InitEquipSuitConfig()
|
||||
InitEquipBreakthroughConfig()
|
||||
InitEquipLevelConfig()
|
||||
InitWeaponSkillPoolConfig()
|
||||
InitEquipModelTransformConfig()
|
||||
InitEquipSkipIdConfig()
|
||||
|
||||
CheckEquipBorderConfig()
|
||||
|
||||
--EquipBorderDic = XReadOnlyTable.Create(EquipBorderDic)
|
||||
WeaponSkillTemplate = XTableManager.ReadByIntKey(TABLE_WEAPON_SKILL_PATH, XTable.XTableWeaponSkill, "Id")
|
||||
EquipResonanceTemplate = XTableManager.ReadByIntKey(TABLE_EQUIP_RESONANCE_PATH, XTable.XTableEquipResonance, "Id")
|
||||
EquipResonanceConsumeItemTemplates = XTableManager.ReadByIntKey(TABLE_EQUIP_RESONANCE_CONSUME_ITEM_PATH, XTable.XTableEquipResonanceUseItem, "Id")
|
||||
EquipModelTemplates = XTableManager.ReadByIntKey(TABLE_EQUIP_MODEL_PATH, XTable.XTableEquipModel, "Id")
|
||||
EquipAnimTemplates = XTableManager.ReadByStringKey(TABLE_EQUIP_ANIM_PATH, XTable.XTableEquipAnim, "ModelId")
|
||||
EquipModelShowTemplate = XTableManager.ReadByStringKey(TABLE_EQUIP_MODEL_SHOW_PATH, XTable.XTableEquipModelShow, "Id")
|
||||
EquipResByFoolTemplate = XTableManager.ReadByIntKey(TABLE_EQUIP_RES_BY_FOOL_PATH, XTable.XTableEquipResByFool, "Id")
|
||||
|
||||
local decomposetab = XTableManager.ReadByIntKey(TABLE_EQUIP_DECOMPOSE_PATH, XTable.XTableEquipDecompose, "Id")
|
||||
for _, v in pairs(decomposetab) do
|
||||
EquipDecomposeDic[v.Site .. v.Star .. v.Breakthrough] = v
|
||||
end
|
||||
|
||||
local eatCostTab = XTableManager.ReadByIntKey(TABLE_EAT_EQUIP_COST_PATH, XTable.XTableEatEquipCost, "Id")
|
||||
for _, v in pairs(eatCostTab) do
|
||||
EatEquipCostTemplate[v.Site .. v.Star] = v.UseMoney
|
||||
end
|
||||
end
|
||||
|
||||
function XEquipConfig.GetMaxWeaponCount()
|
||||
return MAX_WEAPON_COUNT
|
||||
end
|
||||
|
||||
function XEquipConfig.GetMaxAwarenessCount()
|
||||
return MAX_AWARENESS_COUNT
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipExpInheritPercent()
|
||||
return EQUIP_EXP_INHERIT_PRECENT
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipRecycleItemId()
|
||||
return XDataCenter.ItemManager.ItemId.EquipRecycleItemId
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipRecycleItemPercent()
|
||||
return EQUIP_RECYCLE_ITEM_PERCENT / 100
|
||||
end
|
||||
|
||||
function XEquipConfig.GetMinResonanceBindStar()
|
||||
return MIN_RESONANCE_BIND_STAR
|
||||
end
|
||||
|
||||
function XEquipConfig.GetMinAwakeStar()
|
||||
return MIN_AWAKE_STAR
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipCfg(templateId)
|
||||
local equipCfg = nil
|
||||
|
||||
if EquipTemplates:ContainsKey(templateId) then
|
||||
equipCfg = EquipTemplates[templateId]
|
||||
end
|
||||
|
||||
if not equipCfg then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipCfg", "equipCfg", TABLE_EQUIP_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
return equipCfg
|
||||
end
|
||||
|
||||
--todo 道具很多地方没有检查ID类型就调用了,临时处理下
|
||||
function XEquipConfig.CheckTemplateIdIsEquip(templateId)
|
||||
local equipCfg = nil
|
||||
|
||||
if EquipTemplates:ContainsKey(templateId) then
|
||||
equipCfg = EquipTemplates[templateId]
|
||||
end
|
||||
|
||||
return templateId and equipCfg
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEatEquipCostMoney(site, star)
|
||||
if not site then
|
||||
XLog.Error("XEquipConfig.GetEatEquipCostMoney函数参数错误,site不能为空")
|
||||
return
|
||||
end
|
||||
if not star then
|
||||
XLog.Error("XEquipConfig.GetEatEquipCostMoney函数参数错误,star不能为空")
|
||||
return
|
||||
end
|
||||
|
||||
return EatEquipCostTemplate[site .. star]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipBorderCfg(templateId)
|
||||
local template = EquipBorderDic[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipBorderCfg", "template", TABLE_EQUIP_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipBreakthroughCfg(templateId, times)
|
||||
local template = EquipBreakthroughTemplate[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipBreakthroughCfg", "template",
|
||||
TABLE_EQUIP_BREAKTHROUGH_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
template = template[times]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipBreakthroughCfg", "template",
|
||||
TABLE_EQUIP_BREAKTHROUGH_PATH, "templateId : times", tostring(templateId) .. " : " .. tostring(times))
|
||||
return
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipResCfg(templateId, breakthroughTimes)
|
||||
breakthroughTimes = breakthroughTimes or 0
|
||||
local breakthroughCfg = XEquipConfig.GetEquipBreakthroughCfg(templateId, breakthroughTimes)
|
||||
|
||||
local resId = breakthroughCfg.ResId
|
||||
if not resId then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipResCfg", "resId",
|
||||
TABLE_EQUIP_BREAKTHROUGH_PATH, "templateId : times", tostring(templateId) .. " : " .. tostring(breakthroughTimes))
|
||||
return
|
||||
end
|
||||
|
||||
local template = EquipResTemplates[resId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipResCfg", "template", TABLE_EQUIP_RES_PATH, "resId", tostring(resId))
|
||||
return
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
--=========== EquipModel接口(begin) ===========
|
||||
function XEquipConfig.GetEquipModelName(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipModelName", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Role
|
||||
return template.ModelName[usage] or template.ModelName[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipAnimController(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipAnimController", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Role
|
||||
|
||||
local controller = template.AnimController[usage]
|
||||
if not controller and usage ~= XEquipConfig.WeaponUsage.Show then -- 单独展示不需默认值
|
||||
controller = template.AnimController[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
return controller
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipUiAnimStateName(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipUiAnimStateName", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Role
|
||||
return template.UiAnimStateName[usage] or template.UiAnimStateName[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipUiAnimCueId(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipUiAnimCueId", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Role
|
||||
return template.UiAnimCueId[usage] or template.UiAnimCueId[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipUiAnimDelay(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipUiAnimDelay", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Role
|
||||
return template.UiAnimDelay[usage] or template.UiAnimDelay[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipUiAutoRotateDelay(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipUiAutoRotateDelay", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Show -- 默认ui展示
|
||||
return template.UiAutoRotateDelay[usage] or template.UiAutoRotateDelay[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipModelEffectPath(modelTransId, usage)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipModelEffectPath", "template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
usage = usage or XEquipConfig.WeaponUsage.Role
|
||||
return template.ResonanceEffectPath[usage] or template.ResonanceEffectPath[XEquipConfig.WeaponUsage.Role]
|
||||
end
|
||||
--=========== EquipModel接口(end) ===========
|
||||
function XEquipConfig.GetEquipAnimParams(roleModelId)
|
||||
local template = EquipAnimTemplates[roleModelId]
|
||||
if not template then
|
||||
return 0
|
||||
end
|
||||
return template.Params or 0
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponResonanceModelId(case, templateId, resonanceCount)
|
||||
local modelId
|
||||
local template = EquipResTemplates[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponResonanceModelId", "template", TABLE_EQUIP_RES_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
if resonanceCount == 1 then
|
||||
modelId = template.ResonanceModelTransId1[case]
|
||||
elseif resonanceCount == 2 then
|
||||
modelId = template.ResonanceModelTransId2[case]
|
||||
elseif resonanceCount == 3 then
|
||||
modelId = template.ResonanceModelTransId3[case]
|
||||
end
|
||||
return modelId or template.ModelTransId[case]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponResonanceEffectDelay(modelTransId)
|
||||
local template = EquipModelTemplates[modelTransId]
|
||||
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponResonanceEffectDelay",
|
||||
"template", TABLE_EQUIP_MODEL_PATH, "modelTransId", tostring(modelTransId))
|
||||
return
|
||||
end
|
||||
|
||||
return template.ResonanceEffectShowDelay[XEquipConfig.WeaponUsage.Show] or 0
|
||||
end
|
||||
|
||||
--返回武器模型和位置配置(双枪只返回一把)
|
||||
function XEquipConfig.GetEquipModelTransformCfg(templateId, uiName, resonanceCount, modelTransId, equipType)
|
||||
local modelCfg, template
|
||||
|
||||
--尝试用ModelTransId索引
|
||||
if not modelTransId then
|
||||
modelTransId = XEquipConfig.GetWeaponResonanceModelId(XEquipConfig.WeaponCase.Case1, templateId, resonanceCount)
|
||||
if not modelTransId then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponResonanceModelId",
|
||||
"template", TABLE_EQUIP_RES_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
template = EquipModelTransformTemplates[modelTransId]
|
||||
if template then
|
||||
modelCfg = template[uiName]
|
||||
end
|
||||
|
||||
--读不到配置时用equipType索引
|
||||
if not modelCfg then
|
||||
if not equipType then
|
||||
local equipCfg = XEquipConfig.GetEquipCfg(templateId)
|
||||
equipType = equipCfg.Type
|
||||
end
|
||||
|
||||
template = EquipModelTransformTemplates[equipType]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipModelTransformCfg",
|
||||
"template", TABLE_EQUIP_MODEL_TRANSFORM_PATH, "equipType", tostring(equipType))
|
||||
return
|
||||
end
|
||||
|
||||
modelCfg = template[uiName]
|
||||
if not modelCfg then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipModelTransformCfg",
|
||||
"uiName", TABLE_EQUIP_MODEL_TRANSFORM_PATH, "equipType", tostring(equipType))
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
return modelCfg
|
||||
end
|
||||
|
||||
|
||||
-- 获取一个武器所有的不同的模型列表
|
||||
function XEquipConfig.GetWeaponModelCfgList(templateId, uiName, breakthroughTimes)
|
||||
local modelCfgList = {}
|
||||
|
||||
if not templateId then
|
||||
XLog.Error("XEquipManager.GetWeaponModelCfgList函数参数错误, templateId不能为空")
|
||||
return modelCfgList
|
||||
end
|
||||
|
||||
local template = XEquipConfig.GetEquipResCfg(templateId, breakthroughTimes)
|
||||
-- 目前只有共鸣改变形态,有可能有相同的模型,所以需要区别是否有相同的id,以左手id为准
|
||||
local resonanceCountList = {}
|
||||
local resonanceDic = {}
|
||||
local modelId
|
||||
for i = 0, XEquipConfig.MAX_RESONANCE_SKILL_COUNT do
|
||||
modelId = XEquipConfig.GetWeaponResonanceModelId(XEquipConfig.WeaponCase.Case1, template.Id, i)
|
||||
if modelId and not resonanceDic[modelId] then
|
||||
resonanceDic[modelId] = true
|
||||
table.insert(resonanceCountList, i)
|
||||
end
|
||||
end
|
||||
|
||||
local modelCfg
|
||||
for _, resonanceCount in ipairs(resonanceCountList) do
|
||||
modelCfg = {}
|
||||
modelCfg.ModelId = XEquipConfig.GetWeaponResonanceModelId(XEquipConfig.WeaponCase.Case1, template.Id, resonanceCount)
|
||||
modelCfg.TransformConfig = XEquipConfig.GetEquipModelTransformCfg(templateId, uiName, resonanceCount)
|
||||
table.insert(modelCfgList, modelCfg)
|
||||
end
|
||||
|
||||
return modelCfgList
|
||||
end
|
||||
|
||||
function XEquipConfig.GetLevelUpCfg(templateId, times, level)
|
||||
local breakthroughCfg = XEquipConfig.GetEquipBreakthroughCfg(templateId, times)
|
||||
if not breakthroughCfg then
|
||||
return
|
||||
end
|
||||
|
||||
templateId = breakthroughCfg.LevelUpTemplateId
|
||||
|
||||
local template = LevelUpTemplates[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetLevelUpCfg", "template", TABLE_LEVEL_UP_TEMPLATE_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
template = template[level]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetLevelUpCfg", "level", TABLE_LEVEL_UP_TEMPLATE_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipSuitCfg(templateId)
|
||||
local template = EquipSuitTemplate[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipSuitCfg", "template", TABLE_EQUIP_SUIT_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipSuitEffectCfg(templateId)
|
||||
local template = EquipSuitEffectTemplate[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipSuitEffectCfg", "template",
|
||||
TABLE_EQUIP_SUIT_EFFECT_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipTemplateIdsBySuitId(suitId)
|
||||
return SuitIdToEquipTemplateIdsDic[suitId] or {}
|
||||
end
|
||||
|
||||
function XEquipConfig.GetSuitSites(suitId)
|
||||
return SuitSitesDic[suitId] or {}
|
||||
end
|
||||
|
||||
function XEquipConfig.GetMaxSuitCount()
|
||||
return XTool.GetTableCount(SuitSitesDic)
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipBgPath(templateId)
|
||||
if not XEquipConfig.CheckTemplateIdIsEquip(templateId) then return end
|
||||
local template = XEquipConfig.GetEquipCfg(templateId)
|
||||
local quality = template.Quality
|
||||
return XArrangeConfigs.GeQualityBgPath(quality)
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipQualityPath(templateId)
|
||||
local template = XEquipConfig.GetEquipCfg(templateId)
|
||||
local quality = template.Quality
|
||||
if not quality then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipQualityPath", "Quality", TABLE_EQUIP_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
return XArrangeConfigs.GeQualityPath(quality)
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipResoanceIconPath(isAwaken)
|
||||
return EquipResonanceIconPath[isAwaken]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipDecomposeCfg(templateId, breakthroughTimes)
|
||||
if not XEquipConfig.CheckTemplateIdIsEquip(templateId) then return end
|
||||
breakthroughTimes = breakthroughTimes or 0
|
||||
|
||||
local template = XEquipConfig.GetEquipCfg(templateId)
|
||||
local site = template.Site
|
||||
if not site then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipDecomposeCfg", "Site", TABLE_EQUIP_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
local star = template.Star
|
||||
if not star then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipDecomposeCfg", "Star", TABLE_EQUIP_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
return EquipDecomposeDic[site .. star .. breakthroughTimes]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponTypeIconPath(templateId)
|
||||
return XGoodsCommonManager.GetGoodsShowParamsByTemplateId(templateId).Icon
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipBreakThroughIcon(breakthroughTimes)
|
||||
local icon = EquipBreakThroughIcon[breakthroughTimes]
|
||||
if not icon then
|
||||
XLog.Error("XEquipConfig.EquipBreakThroughIcon调用错误,得到的icon为空,原因:检查breakthroughTimes:" .. breakthroughTimes .. "和EquipBreakThroughIcon")
|
||||
return
|
||||
end
|
||||
return icon
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipBreakThroughSmallIcon(breakthroughTimes)
|
||||
local icon = EquipBreakThroughSmallIcon[breakthroughTimes]
|
||||
if not icon then
|
||||
XLog.Error("XEquipConfig.GetEquipBreakThroughSmallIcon调用错误,得到的icon为空,原因:检查breakthroughTimes:" .. breakthroughTimes .. "和EquipBreakThroughSmallIcon")
|
||||
return
|
||||
end
|
||||
return icon
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipBreakThroughBigIcon(breakthroughTimes)
|
||||
local icon = EquipBreakThroughBigIcon[breakthroughTimes]
|
||||
if not icon then
|
||||
XLog.Error("XEquipConfig.GetEquipBreakThroughBigIcon调用错误,得到的icon为空,原因:检查breakthroughTimes:" .. breakthroughTimes .. "和EquipBreakThroughBigIcon")
|
||||
return
|
||||
end
|
||||
return icon
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponSkillTemplate(templateId)
|
||||
local template = WeaponSkillTemplate[templateId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponSkillTemplate", "template", TABLE_WEAPON_SKILL_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponSkillInfo(weaponSkillId)
|
||||
local template = WeaponSkillTemplate[weaponSkillId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponSkillInfo", "template", TABLE_WEAPON_SKILL_PATH, "weaponSkillId", tostring(weaponSkillId))
|
||||
return
|
||||
end
|
||||
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponSkillAbility(weaponSkillId)
|
||||
local template = WeaponSkillTemplate[weaponSkillId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponSkillAbility", "template",
|
||||
TABLE_WEAPON_SKILL_PATH, "weaponSkillId", tostring(weaponSkillId))
|
||||
return
|
||||
end
|
||||
|
||||
return template.Ability
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponSkillPoolSkillIds(poolId, characterId)
|
||||
local template = WeaponSkillPoolTemplate[poolId]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponSkillPoolSkillIds", "template", TABLE_WEAPON_SKILL_POOL_PATH, "poolId", tostring(poolId))
|
||||
return
|
||||
end
|
||||
|
||||
local skillIds = template[characterId]
|
||||
if not skillIds then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetWeaponSkillPoolSkillIds",
|
||||
"characterId", TABLE_WEAPON_SKILL_POOL_PATH, "poolId", tostring(poolId))
|
||||
return
|
||||
end
|
||||
|
||||
return skillIds
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipSkipIdTemplate(eatType, site)
|
||||
local template = EquipSkipIdTemplates[eatType][site]
|
||||
if not template then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipSkipIdTemplate", "site", TABLE_WEAPON_SKILL_POOL_PATH, "eatType", tostring(eatType))
|
||||
return
|
||||
end
|
||||
return template
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipResonanceCfg(templateId)
|
||||
local equipResonanceCfg = EquipResonanceTemplate[templateId]
|
||||
|
||||
if not equipResonanceCfg then
|
||||
return
|
||||
end
|
||||
|
||||
return equipResonanceCfg
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipCharacterType(templateId)
|
||||
local config = XEquipConfig.GetEquipCfg(templateId)
|
||||
return config.CharacterType
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipResonanceConsumeItemCfg(templateId)
|
||||
local equipResonanceItemCfg = EquipResonanceConsumeItemTemplates[templateId]
|
||||
|
||||
if not equipResonanceItemCfg then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipResonanceConsumeItemCfg",
|
||||
"equipResonanceItemCfg", TABLE_EQUIP_RESONANCE_CONSUME_ITEM_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
|
||||
return equipResonanceItemCfg
|
||||
end
|
||||
|
||||
function XEquipConfig.GetNeedFirstShow(templateId)
|
||||
local template = XEquipConfig.GetEquipCfg(templateId)
|
||||
return template.NeedFirstShow
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipTemplates()
|
||||
return EquipTemplates
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipAwakeCfg(templateId)
|
||||
local equipAwakeCfg = EquipAwakeTemplate[templateId]
|
||||
if not equipAwakeCfg then
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipAwakeCfg", "equipAwakeCfg", TABLE_EQUIP_AWAKE_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
return equipAwakeCfg
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipAwakeCfgs()
|
||||
return EquipAwakeTemplate
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipAwakeSkillDesList(templateId, pos)
|
||||
local equipAwakeCfg = XEquipConfig.GetEquipAwakeCfg(templateId)
|
||||
local desList = equipAwakeCfg["AttribDes" .. pos]
|
||||
if not desList then
|
||||
local tempStr = "AttribDes" .. pos
|
||||
XLog.ErrorTableDataNotFound("XEquipConfig.GetEquipAwakeSkillDesList", tempStr, TABLE_EQUIP_AWAKE_PATH, "templateId", tostring(templateId))
|
||||
return
|
||||
end
|
||||
return desList
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipSuitPath()
|
||||
return TABLE_EQUIP_SUIT_PATH
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipPath()
|
||||
return TABLE_EQUIP_PATH
|
||||
end
|
||||
|
||||
function XEquipConfig.GetWeaponSkillPath()
|
||||
return TABLE_WEAPON_SKILL_PATH
|
||||
end
|
||||
|
||||
function XEquipConfig.IsDefaultSuitId(suitId)
|
||||
return suitId == XEquipConfig.DEFAULT_SUIT_ID.Normal or suitId == XEquipConfig.DEFAULT_SUIT_ID.Isomer
|
||||
end
|
||||
|
||||
function XEquipConfig.GetDefaultSuitIdCount()
|
||||
local count = 0
|
||||
for _, _ in pairs(XEquipConfig.DEFAULT_SUIT_ID) do
|
||||
count = count + 1
|
||||
end
|
||||
return count
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipAwakeTabIndex()
|
||||
return EquipAwakeTabIndex
|
||||
end
|
||||
|
||||
function XEquipConfig.SetEquipAwakeTabIndex(equipAwakeTabIndex)
|
||||
EquipAwakeTabIndex = equipAwakeTabIndex
|
||||
end
|
||||
|
||||
function XEquipConfig.GetEquipModelShowHideNodeName(modelId, UiName)
|
||||
for _, cfg in pairs(EquipModelShowTemplate) do
|
||||
if cfg.ModelId == modelId and cfg.UiName == UiName then
|
||||
return cfg.HideNodeName or {}
|
||||
end
|
||||
end
|
||||
return {}
|
||||
end
|
||||
|
||||
------------愚人节装备替换相关 begin----------------
|
||||
function XEquipConfig.GetFoolEquipResCfg(templateId)
|
||||
return EquipResByFoolTemplate[templateId]
|
||||
end
|
||||
|
||||
function XEquipConfig.GetFoolWeaponResonanceModelId(case, templateId, resonanceCount)
|
||||
local modelId
|
||||
local template = XEquipConfig.GetFoolEquipResCfg(templateId)
|
||||
if not template then
|
||||
return
|
||||
end
|
||||
if resonanceCount == 1 then
|
||||
modelId = template.ResonanceModelTransId1[case]
|
||||
elseif resonanceCount == 2 then
|
||||
modelId = template.ResonanceModelTransId2[case]
|
||||
elseif resonanceCount == 3 then
|
||||
modelId = template.ResonanceModelTransId3[case]
|
||||
end
|
||||
return modelId or template.ModelTransId[case]
|
||||
end
|
||||
------------愚人节装备替换相关 end----------------
|
301
Script/matrix/xconfig/XEscapeConfigs.lua
Normal file
301
Script/matrix/xconfig/XEscapeConfigs.lua
Normal file
|
@ -0,0 +1,301 @@
|
|||
XEscapeConfigs = XEscapeConfigs or {}
|
||||
|
||||
local SHARE_TABLE_PATH = "Share/Fuben/Escape/"
|
||||
local CLIENT_TABLE_PATH = "Client/Fuben/Escape/"
|
||||
|
||||
--章节难度
|
||||
XEscapeConfigs.Difficulty = {
|
||||
Normal = 1,
|
||||
Hard = 2,
|
||||
}
|
||||
|
||||
--关卡层状态
|
||||
XEscapeConfigs.LayerState = {
|
||||
Lock = 1, --未开启
|
||||
Now = 2, --当前可挑战
|
||||
Pass = 3, --已通关
|
||||
}
|
||||
|
||||
--结算显示的界面布局
|
||||
XEscapeConfigs.ShowSettlePanel = {
|
||||
SelfWinInfo = 1, --战后结算
|
||||
AllWinInfo = 2, --阶段结算
|
||||
}
|
||||
|
||||
--章节结算显示的参数类型
|
||||
XEscapeConfigs.ChapterSettleCondType = {
|
||||
RemainTime = 1, --剩余时间
|
||||
HitTimes = 2, --受击
|
||||
TrapedTimes = 3, --陷阱受击
|
||||
}
|
||||
|
||||
--战后结算显示的参数类型
|
||||
XEscapeConfigs.FightSettleCondType = {
|
||||
StageName = 1, --关卡名
|
||||
Score = 2, --积分
|
||||
}
|
||||
|
||||
function XEscapeConfigs.Init()
|
||||
XConfigCenter.CreateGetProperties(XEscapeConfigs, {
|
||||
"EscapeActivity",
|
||||
"EscapeChapter",
|
||||
"EscapeLayer",
|
||||
"EscapeStage",
|
||||
"EscapeTask",
|
||||
"EscapeClientConfig",
|
||||
"EscapeStageColorPrefab",
|
||||
}, {
|
||||
"ReadByIntKey", SHARE_TABLE_PATH .. "EscapeActivity.tab", XTable.XTableEscapeActivity, "Id",
|
||||
"ReadByIntKey", SHARE_TABLE_PATH .. "EscapeChapter.tab", XTable.XTableEscapeChapter, "Id",
|
||||
"ReadByIntKey", SHARE_TABLE_PATH .. "EscapeLayer.tab", XTable.XTableEscapeLayer, "Id",
|
||||
"ReadByIntKey", SHARE_TABLE_PATH .. "EscapeStage.tab", XTable.XTableEscapeStage, "StageId",
|
||||
"ReadByIntKey", CLIENT_TABLE_PATH .. "EscapeTask.tab", XTable.XTableEscapeTask, "Id",
|
||||
"ReadByStringKey", CLIENT_TABLE_PATH .. "EscapeClientConfig.tab", XTable.XTableEscapeClientConfig, "Key",
|
||||
"ReadByIntKey", CLIENT_TABLE_PATH .. "EscapeStageColorPrefab.tab", XTable.XTableEscapeStageColorPrefab, "Id",
|
||||
})
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetEscapeStageIdList()
|
||||
local configs = XEscapeConfigs.GetEscapeStage()
|
||||
local stageIdList = {}
|
||||
for stageId in pairs(configs) do
|
||||
table.insert(stageIdList, stageId)
|
||||
end
|
||||
return stageIdList
|
||||
end
|
||||
|
||||
--机器人Id是否在关卡类型表中
|
||||
function XEscapeConfigs.IsStageTypeRobot(robotId)
|
||||
local robotIdList = XFubenConfigs.GetStageTypeRobot(XDataCenter.FubenManager.StageType.Escape)
|
||||
for _, robotIdCfg in ipairs(robotIdList) do
|
||||
if robotId == robotIdCfg then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------EscapeActivity 活动表 begin------------------------
|
||||
function XEscapeConfigs.GetActivityTimeId(id)
|
||||
local config = XEscapeConfigs.GetEscapeActivity(id, true)
|
||||
return config.TimeId
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetActivityName(id)
|
||||
local config = XEscapeConfigs.GetEscapeActivity(id, true)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetActivityBackground(id)
|
||||
local config = XEscapeConfigs.GetEscapeActivity(id, true)
|
||||
return config.Background
|
||||
end
|
||||
--------------------------EscapeActivity 活动表 end------------------------
|
||||
|
||||
--------------------------EscapeChapter 章节表 begin------------------------
|
||||
local IsInitEscapeChapterDic = false
|
||||
local EscapeGroupIdToChapterIdsDic = {} --组Id对应的章节Id列表
|
||||
local InitTheatreDecorationDic = function()
|
||||
if IsInitEscapeChapterDic then
|
||||
return
|
||||
end
|
||||
|
||||
local configs = XEscapeConfigs.GetEscapeChapter()
|
||||
for chapterId, v in pairs(configs) do
|
||||
if not EscapeGroupIdToChapterIdsDic[v.GroupId] then
|
||||
EscapeGroupIdToChapterIdsDic[v.GroupId] = {}
|
||||
end
|
||||
table.insert(EscapeGroupIdToChapterIdsDic[v.GroupId], chapterId)
|
||||
end
|
||||
for _, chapterIdList in pairs(EscapeGroupIdToChapterIdsDic) do
|
||||
table.sort(chapterIdList, function(a, b)
|
||||
local difficultyA = XEscapeConfigs.GetChapterDifficulty(a)
|
||||
local difficultyB = XEscapeConfigs.GetChapterDifficulty(b)
|
||||
if difficultyA ~= difficultyB then
|
||||
return difficultyA < difficultyB
|
||||
end
|
||||
return a < b
|
||||
end)
|
||||
end
|
||||
|
||||
IsInitEscapeChapterDic = true
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetEscapeChapterGroupIdList()
|
||||
InitTheatreDecorationDic()
|
||||
local groupIdList = {}
|
||||
for groupId in pairs(EscapeGroupIdToChapterIdsDic) do
|
||||
table.insert(groupIdList, groupId)
|
||||
end
|
||||
table.sort(groupIdList, function(a, b)
|
||||
return a < b
|
||||
end)
|
||||
return groupIdList
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetEscapeChapterIdListByGroupId(groupId)
|
||||
InitTheatreDecorationDic()
|
||||
return EscapeGroupIdToChapterIdsDic[groupId]
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterName(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.Name
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterEnvironmentDesc(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.EnvironmentDesc
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterOpenCondition(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.OpenCondition
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterTimeId(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.TimeId
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterDifficulty(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.Difficulty
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterLayerIds(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.LayerIds
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterBuffDesc(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.BuffDesc
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterShowFightEventIds(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.ShowFightEventIds
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterInitialTime(id)
|
||||
local config = XEscapeConfigs.GetEscapeChapter(id, true)
|
||||
return config.InitialTime
|
||||
end
|
||||
--------------------------EscapeChapter 章节表 end--------------------------
|
||||
|
||||
--------------------------EscapeLayer 区域表 begin--------------------------
|
||||
function XEscapeConfigs.GetLayerClearStageCount(id)
|
||||
local config = XEscapeConfigs.GetEscapeLayer(id, true)
|
||||
return config.ClearStageCount
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetLayerStageIds(id)
|
||||
local config = XEscapeConfigs.GetEscapeLayer(id, true)
|
||||
return config.StageIds
|
||||
end
|
||||
--------------------------EscapeLayer 区域表 end----------------------------
|
||||
|
||||
--------------------------EscapeStage 关卡表 begin--------------------------
|
||||
function XEscapeConfigs.GetStageColor(id)
|
||||
local config = XEscapeConfigs.GetEscapeStage(id, true)
|
||||
return config.Color
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetStageAwardTime(id)
|
||||
local config = XEscapeConfigs.GetEscapeStage(id, true)
|
||||
return config.AwardTime
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetStageGridDesc(id)
|
||||
local config = XEscapeConfigs.GetEscapeStage(id, true)
|
||||
return config.GridDesc
|
||||
end
|
||||
--------------------------EscapeStage 关卡表 end----------------------------
|
||||
|
||||
--------------------------EscapeTask 任务表 begin------------------------
|
||||
function XEscapeConfigs.GetTaskGroupIdList()
|
||||
local configs = XEscapeConfigs.GetEscapeTask()
|
||||
local taskGroupIdList = {}
|
||||
for id in pairs(configs) do
|
||||
table.insert(taskGroupIdList, id)
|
||||
end
|
||||
return taskGroupIdList
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetTaskIdList(id)
|
||||
local config = XEscapeConfigs.GetEscapeTask(id, true)
|
||||
return config.TaskId
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetTaskName(id)
|
||||
local config = XEscapeConfigs.GetEscapeTask(id, true)
|
||||
return config.Name
|
||||
end
|
||||
--------------------------EscapeTask 任务表 end---------------------------
|
||||
|
||||
--------------------------EscapeClientConfig begin------------------------
|
||||
function XEscapeConfigs.GetHelpKey()
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("HelpKey", true)
|
||||
return config.Values[1]
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetRemainTimeColor()
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("RemainTimeColor", true)
|
||||
return config.Values
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetRemainTimeShowColor()
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("RemainTimeShowColor", true)
|
||||
return config.Values
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterSettleCondDesc()
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("ChapterSettleCondDesc", true)
|
||||
return config.Values
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterSettleRemainTimeGradeImgPath(score)
|
||||
local gradeIndex = XEscapeConfigs.GetGradeIndexByScore(score)
|
||||
local gradeConfig = XEscapeConfigs.GetEscapeClientConfig("ChapterSettleRemainTimeGradeImgPath", true)
|
||||
return gradeConfig.Values[gradeIndex or #gradeConfig.Values]
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetChapterSettleRemainTimeGrade(score)
|
||||
local gradeIndex = XEscapeConfigs.GetGradeIndexByScore(score)
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("ChapterSettleRemainTimeGrade", true)
|
||||
return config.Values[gradeIndex or #config.Values]
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetGradeIndexByScore(score)
|
||||
local scoreConfig = XEscapeConfigs.GetEscapeClientConfig("ChapterSettleRemainTimeScore", true)
|
||||
for i, value in ipairs(scoreConfig.Values) do
|
||||
local scoreCfg = tonumber(value)
|
||||
if scoreCfg and score >= scoreCfg then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetDifficultyName(difficulty)
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("DifficultyName", true)
|
||||
return config.Values[difficulty] or ""
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetMainBg(index)
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("MainBg", true)
|
||||
return config.Values[index]
|
||||
end
|
||||
|
||||
function XEscapeConfigs.GetFightSettleCondDesc(index)
|
||||
local config = XEscapeConfigs.GetEscapeClientConfig("FightSettleCondDesc", true)
|
||||
return config.Values[index] or config.Values
|
||||
end
|
||||
--------------------------EscapeClientConfig end--------------------------
|
||||
|
||||
--------------------------EscapeStageColorPrefab 关卡颜色对应的预制 begin------------------------
|
||||
function XEscapeConfigs.GetEscapeStageColorPrefabById(id)
|
||||
local config = XEscapeConfigs.GetEscapeStageColorPrefab(id, true)
|
||||
return config.Prefab
|
||||
end
|
||||
--------------------------EscapeStageColorPrefab end--------------------------
|
182
Script/matrix/xconfig/XExhibitionConfigs.lua
Normal file
182
Script/matrix/xconfig/XExhibitionConfigs.lua
Normal file
|
@ -0,0 +1,182 @@
|
|||
XExhibitionConfigs = XExhibitionConfigs or {}
|
||||
|
||||
local TABLE_CHARACTER_EXHIBITION = "Client/Exhibition/Exhibition.tab"
|
||||
local TABLE_CHARACTER_EXHIBITION_LEVEL = "Client/Exhibition/ExhibitionLevel.tab"
|
||||
local TABLE_CHARACTER_GROW_TASK_INFO = "Share/Exhibition/ExhibitionReward.tab"
|
||||
|
||||
local DefaultPortraitImagePath = CS.XGame.ClientConfig:GetString("DefaultPortraitImagePath")
|
||||
local ExhibitionLevelPoint = {}
|
||||
local ExhibitionConfig = {}
|
||||
local ExhibitionGroupNameConfig = {}
|
||||
local ExhibitionGroupLogoConfig = {}
|
||||
local ExhibitionGroupDescConfig = {}
|
||||
local CharacterExhibitionLevelConfig = {}
|
||||
local GrowUpTasksConfig = {}
|
||||
local CharacterGrowUpTasksConfig = {}
|
||||
local CharacterGrowUpTasksConfigByType = {}
|
||||
local CharacterHeadPortrait = {}
|
||||
local CharacterGraduationPortrait = {}
|
||||
local ExhibitionConfigByTypeAndPort = {}
|
||||
local ExhibitionConfigByTypeAndGroup = {}
|
||||
local CharacterToExhibitionTypeTable = {}
|
||||
local InVisibleGroupTable = {}
|
||||
function XExhibitionConfigs.Init()
|
||||
CharacterExhibitionLevelConfig = XTableManager.ReadByIntKey(TABLE_CHARACTER_EXHIBITION_LEVEL, XTable.XTableExhibitionLevel, "LevelId")
|
||||
ExhibitionConfig = XTableManager.ReadByIntKey(TABLE_CHARACTER_EXHIBITION, XTable.XTableCharacterExhibition, "Id")
|
||||
for _, v in pairs(ExhibitionConfig) do
|
||||
if v.Port ~= nil then
|
||||
CharacterHeadPortrait[v.CharacterId] = v.HeadPortrait
|
||||
CharacterGraduationPortrait[v.CharacterId] = v.GraduationPortrait
|
||||
ExhibitionGroupNameConfig[v.GroupId] = v.GroupName
|
||||
ExhibitionGroupLogoConfig[v.GroupId] = v.GroupLogo
|
||||
ExhibitionGroupDescConfig[v.GroupId] = v.GroupDescription
|
||||
if v.Type and not ExhibitionConfigByTypeAndPort[v.Type] then
|
||||
ExhibitionConfigByTypeAndPort[v.Type] = {}
|
||||
ExhibitionConfigByTypeAndGroup[v.Type] = {}
|
||||
end
|
||||
ExhibitionConfigByTypeAndPort[v.Type][v.Port] = v
|
||||
ExhibitionConfigByTypeAndGroup[v.Type][v.GroupId] = v
|
||||
if v.Type then
|
||||
if not InVisibleGroupTable[v.Type] then InVisibleGroupTable[v.Type] = {} end
|
||||
if InVisibleGroupTable[v.Type][v.GroupId] == nil then InVisibleGroupTable[v.Type][v.GroupId] = true end
|
||||
if v.InVisible == 1 then InVisibleGroupTable[v.Type][v.GroupId] = false end
|
||||
end
|
||||
end
|
||||
if v.CharacterId and v.CharacterId ~= 0 and not CharacterToExhibitionTypeTable[v.CharacterId] then
|
||||
CharacterToExhibitionTypeTable[v.CharacterId] = v.Type
|
||||
end
|
||||
end
|
||||
GrowUpTasksConfig = XTableManager.ReadByIntKey(TABLE_CHARACTER_GROW_TASK_INFO, XTable.XTableExhibitionReward, "Id")
|
||||
for task, v in pairs(GrowUpTasksConfig) do
|
||||
if CharacterGrowUpTasksConfig[v.CharacterId] == nil then
|
||||
CharacterGrowUpTasksConfig[v.CharacterId] = {}
|
||||
end
|
||||
CharacterGrowUpTasksConfig[v.CharacterId][task] = v
|
||||
local type = CharacterToExhibitionTypeTable[v.CharacterId] or 1
|
||||
if not CharacterGrowUpTasksConfigByType[type] then CharacterGrowUpTasksConfigByType[type] = {} end
|
||||
if not CharacterGrowUpTasksConfigByType[type][v.Id] then
|
||||
CharacterGrowUpTasksConfigByType[type][v.Id] = v
|
||||
end
|
||||
end
|
||||
ExhibitionLevelPoint[1] = CS.XGame.ClientConfig:GetInt("ExhibitionLevelPoint_01")
|
||||
ExhibitionLevelPoint[2] = CS.XGame.ClientConfig:GetInt("ExhibitionLevelPoint_02")
|
||||
ExhibitionLevelPoint[3] = CS.XGame.ClientConfig:GetInt("ExhibitionLevelPoint_03")
|
||||
ExhibitionLevelPoint[4] = CS.XGame.ClientConfig:GetInt("ExhibitionLevelPoint_04")
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetDefaultPortraitImagePath()
|
||||
return DefaultPortraitImagePath
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionLevelPoints()
|
||||
return ExhibitionLevelPoint
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetGrowUpLevelMax()
|
||||
local maxPoint = 0
|
||||
for i = 1, 4 do
|
||||
maxPoint = maxPoint + ExhibitionLevelPoint[i]
|
||||
end
|
||||
return maxPoint
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionConfig()
|
||||
return ExhibitionConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionPortConfigByType(showType)
|
||||
if not showType then return ExhibitionConfig end
|
||||
return ExhibitionConfigByTypeAndPort[showType] or {}
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionGroupNameConfig()
|
||||
return ExhibitionGroupNameConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionGroupConfigByType(showType)
|
||||
if not showType then return ExhibitionConfig end
|
||||
return ExhibitionConfigByTypeAndGroup[showType] or {}
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionConfigByTypeAndGroup(showType, groupId)
|
||||
return ExhibitionConfigByTypeAndGroup[showType][groupId]
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionTypeByCharacterId(characterId)
|
||||
return CharacterToExhibitionTypeTable[characterId]
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionGroupLogoConfig()
|
||||
return ExhibitionGroupLogoConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionGroupDescConfig()
|
||||
return ExhibitionGroupDescConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionInVisbleGroupTable(exhibitionType)
|
||||
return InVisibleGroupTable[exhibitionType] or {}
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetIsExhibitionInVisbleGroup(exhibitionType, groupId)
|
||||
return InVisibleGroupTable[exhibitionType] and InVisibleGroupTable[exhibitionType][groupId] or false
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionLevelConfig()
|
||||
return CharacterExhibitionLevelConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetCharacterGrowUpTasks(characterId)
|
||||
local config = CharacterGrowUpTasksConfig[characterId]
|
||||
if not config then
|
||||
XLog.Error("XExhibitionConfigs.GetCharacterGrowUpTasks error: 角色解放配置错误:characterId: " .. characterId .. " ,path: " .. TABLE_CHARACTER_GROW_TASK_INFO)
|
||||
return
|
||||
end
|
||||
return config
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetCharacterGrowUpTask(characterId, level)
|
||||
local levelTasks = XExhibitionConfigs.GetCharacterGrowUpTasks(characterId)
|
||||
for _, config in pairs(levelTasks) do
|
||||
if config.LevelId == level then
|
||||
return config
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetCharacterGrowUpTasksConfig()
|
||||
return CharacterGrowUpTasksConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionGrowUpLevelConfig(level)
|
||||
return CharacterExhibitionLevelConfig[level]
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionLevelNameByLevel(level)
|
||||
return CharacterExhibitionLevelConfig[level].Name or ""
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionLevelDescByLevel(level)
|
||||
return CharacterExhibitionLevelConfig[level].Desc or ""
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetExhibitionLevelIconByLevel(level)
|
||||
return CharacterExhibitionLevelConfig[level].LevelIcon or ""
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetCharacterHeadPortrait(characterId)
|
||||
return CharacterHeadPortrait[characterId]
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetCharacterGraduationPortrait(characterId)
|
||||
return CharacterGraduationPortrait[characterId]
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetGrowUpTasksConfig()
|
||||
return GrowUpTasksConfig
|
||||
end
|
||||
|
||||
function XExhibitionConfigs.GetGrowUpTasksConfigByType(exhibitionType)
|
||||
if not exhibitionType then return GrowUpTasksConfig end
|
||||
return CharacterGrowUpTasksConfigByType[exhibitionType] or {}
|
||||
end
|
609
Script/matrix/xconfig/XExpeditionConfig.lua
Normal file
609
Script/matrix/xconfig/XExpeditionConfig.lua
Normal file
|
@ -0,0 +1,609 @@
|
|||
XExpeditionConfig = XExpeditionConfig or {}
|
||||
--基础角色表
|
||||
local TABLE_EXPEDITION_BASE_CHARACTER = "Share/Fuben/Expedition/ExpeditionBaseCharacter.tab"
|
||||
--角色表
|
||||
local TABLE_EXPEDITION_CHARACTER = "Share/Fuben/Expedition/ExpeditionCharacter.tab"
|
||||
--远征章节表
|
||||
local TABLE_EXPEDITION_CHAPTER = "Share/Fuben/Expedition/ExpeditionChapter.tab"
|
||||
--远征关卡表
|
||||
local TABLE_EXPEDITION_STAGE = "Share/Fuben/Expedition/ExpeditionStage.tab"
|
||||
--玩法配置
|
||||
local TABLE_EXPEDITION_CONFIG = "Share/Fuben/Expedition/ExpeditionConfig.tab"
|
||||
--角色基础组合羁绊表
|
||||
local TABLE_EXPEDITION_COMBO = "Share/Fuben/Expedition/ExpeditionCombo.tab"
|
||||
--角色组合羁绊子分类表
|
||||
local TABLE_EXPEDITION_CHILDCOMBO = "Share/Fuben/Expedition/ExpeditionChildCombo.tab"
|
||||
--角色分类展示表
|
||||
local TABLE_EXPEDITION_CHARACTER_TYPE = "Share/Fuben/Expedition/ExpeditionCharacterType.tab"
|
||||
--角色阶级升级表
|
||||
local TABLE_EXPEDITION_CHARACTER_ELEMENTS = "Client/Fuben/Expedition/ExpeditionCharacterElements.tab"
|
||||
--羁绊大类表
|
||||
local TABLE_EXPEDITION_COMBO_TYPENAME = "Client/Fuben/Expedition/ExpeditionComboTypeName.tab"
|
||||
--螺母购买刷新次数表
|
||||
local TABLE_EXPEDITION_DRAW_CONSUME = "Share/Fuben/Expedition/ExpeditionDrawConsume.tab"
|
||||
--全局增益羁绊
|
||||
local TABLE_EXPEDITION_GLOBAL_COMBO = "Share/Fuben/Expedition/ExpeditionGlobalCombo.tab"
|
||||
--队伍位置表
|
||||
local TABLE_EXPEDITION_TEAMPOS = "Share/Fuben/Expedition/ExpeditionTeamPos.tab"
|
||||
--招募概率表
|
||||
local TABLE_EXPEDITION_DRAWPR = "Share/Fuben/Expedition/ExpeditionDrawPR.tab"
|
||||
--招募概率星数对照表
|
||||
local TABLE_EXPEDITION_DRAWRANK = "Share/Fuben/Expedition/ExpeditionDrawRank.tab"
|
||||
--关卡层对照表
|
||||
local TABLE_EXPEDITION_STAGETIER = "Client/Fuben/Expedition/ExpeditionStageTier.tab"
|
||||
--关卡层对照表
|
||||
local TABLE_EXPEDITION_DEFAULT_TEAM = "Share/Fuben/Expedition/ExpeditionDefaultTeam.tab"
|
||||
local BaseConfig = {}
|
||||
local ChildComboConfig = {}
|
||||
local ComboConfig = {}
|
||||
local CharacterTypeConfig = {}
|
||||
local CharacterConfig = {}
|
||||
local CharacterElements = {}
|
||||
local BaseCharacterConfig = {}
|
||||
local ChapterConfig = {}
|
||||
local EStageConfig = {}
|
||||
local ComboTypeNameConfig = {}
|
||||
local DrawConsumeConfig = {}
|
||||
local GlobalComboConfig = {}
|
||||
local TeamPosConfig = {}
|
||||
local DrawPRConfig = {}
|
||||
local DrawRankConfig = {}
|
||||
local StageTierConfig = {}
|
||||
local DefaultTeamConfig = {}
|
||||
|
||||
local Type2CharacterDic = {}
|
||||
local Rank2CharacterDic = {}
|
||||
local Chapter2StageDic = {}
|
||||
local Chapter2StageTierDic = {}
|
||||
local Chapter2ConfigDic = {}
|
||||
local Chapter2TeamPosDic = {}
|
||||
local Chapter2DefaultTeamDic = {}
|
||||
local Order2ComboTypeDic = {}
|
||||
local DefaultTeamId2ChildComboDic = {}
|
||||
local TierId2StageIdDic = {}
|
||||
local Chapter2StageIdDic = {}
|
||||
|
||||
local NewBaseConfigIndex = 0
|
||||
|
||||
--local BaseComboStatus = {} 废弃
|
||||
local BaseComboDic = {}
|
||||
local StageToEStageDic = {}
|
||||
local ComboConditionList = {
|
||||
[1] = "MemberNum", -- 检查合计数量
|
||||
[2] = "TotalRank", -- 检查合计等级
|
||||
[3] = "TargetMember", -- 检查对应角色等级
|
||||
[4] = "TargetTypeAndRank", -- 检查指定特征的高于指定等级的人
|
||||
}
|
||||
|
||||
--=====================
|
||||
--关卡难度枚举
|
||||
--=====================
|
||||
XExpeditionConfig.StageDifficulty = {
|
||||
Normal = 1, --普通难度
|
||||
NightMare = 2, --噩梦难度
|
||||
}
|
||||
|
||||
XExpeditionConfig.DifficultyName = {
|
||||
[1] = "Normal",
|
||||
[2] = "NightMare",
|
||||
}
|
||||
|
||||
XExpeditionConfig.TierType = {
|
||||
Normal = 1, --普通层(包含剧情关卡与普通战斗关卡)
|
||||
Infinity = 2, --无尽层
|
||||
}
|
||||
|
||||
XExpeditionConfig.StageType = {
|
||||
Story = 1, -- 1 剧情关
|
||||
Battle = 2, -- 2 战斗关
|
||||
Infinity = 3, -- 3 无尽关
|
||||
AfterBrush = 4, -- 4 复刷关
|
||||
}
|
||||
-- 关卡前置条件类型
|
||||
XExpeditionConfig.PreStageCheckType = {
|
||||
And = 1,
|
||||
Or = 2,
|
||||
}
|
||||
|
||||
XExpeditionConfig.MemberDetailsType = {
|
||||
RecruitMember = 1,
|
||||
FireMember = 2
|
||||
}
|
||||
|
||||
local InitConfig = function()
|
||||
BaseConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_CONFIG, XTable.XTableExpeditionConfig, "Id")
|
||||
ComboConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_COMBO, XTable.XTableExpeditionCombo, "Id")
|
||||
ChildComboConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_CHILDCOMBO, XTable.XTableExpeditionChildCombo, "Id")
|
||||
ChapterConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_CHAPTER, XTable.XTableExpeditionChapter, "Id")
|
||||
EStageConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_STAGE, XTable.XTableExpeditionStage, "Id")
|
||||
BaseCharacterConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_BASE_CHARACTER, XTable.XTableExpeditionBaseCharacter, "Id")
|
||||
CharacterConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_CHARACTER, XTable.XTableExpeditionCharacter, "Id")
|
||||
CharacterTypeConfig = XTableManager.ReadByStringKey(TABLE_EXPEDITION_CHARACTER_TYPE, XTable.XTableExpeditionCharacterType, "Id")
|
||||
ComboTypeNameConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_COMBO_TYPENAME, XTable.XTableExpeditionComboTypeName, "Id")
|
||||
DrawConsumeConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_DRAW_CONSUME, XTable.XTableExpeditionDrawConsume, "Id")
|
||||
GlobalComboConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_GLOBAL_COMBO, XTable.XTableExpeditionGlobalCombo, "Id")
|
||||
CharacterElements = XTableManager.ReadByIntKey(TABLE_EXPEDITION_CHARACTER_ELEMENTS, XTable.XTableExpeditionCharacterElements, "Id")
|
||||
TeamPosConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_TEAMPOS, XTable.XTableExpeditionTeamPos, "Id")
|
||||
DrawPRConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_DRAWPR, XTable.XTableExpeditionDrawPR, "Level")
|
||||
DrawRankConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_DRAWRANK, XTable.XTableExpeditionDrawRank, "Id")
|
||||
StageTierConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_STAGETIER, XTable.XTableExpeditionStageTier, "Id")
|
||||
DefaultTeamConfig = XTableManager.ReadByIntKey(TABLE_EXPEDITION_DEFAULT_TEAM, XTable.XTableExpeditionDefaultTeam, "TeamId")
|
||||
end
|
||||
|
||||
local GetNewBaseConfigId = function()
|
||||
for id, cfg in pairs(BaseConfig) do
|
||||
if cfg.TimeId and cfg.TimeId > 0 then
|
||||
NewBaseConfigIndex = id
|
||||
return
|
||||
end
|
||||
end
|
||||
XLog.Error("XExpeditionConfig:没有任何一项配置了TimeId!请检查表格:" .. TABLE_EXPEDITION_CONFIG)
|
||||
end
|
||||
|
||||
local InitComboConfig = function()
|
||||
for _, comboCfg in pairs(ComboConfig) do
|
||||
if not BaseComboDic[comboCfg.ChildComboId] then
|
||||
BaseComboDic[comboCfg.ChildComboId] = {}
|
||||
end
|
||||
table.insert(BaseComboDic[comboCfg.ChildComboId], comboCfg)
|
||||
end
|
||||
for _, comboTypeCfg in pairs(ComboTypeNameConfig) do
|
||||
Order2ComboTypeDic[comboTypeCfg.OrderId] = comboTypeCfg
|
||||
end
|
||||
end
|
||||
|
||||
local InitStages = function()
|
||||
for _, tier in pairs(StageTierConfig) do
|
||||
if not Chapter2StageTierDic[tier.ChapterId] then Chapter2StageTierDic[tier.ChapterId] = {} end
|
||||
Chapter2StageTierDic[tier.ChapterId][tier.OrderId] = tier
|
||||
if not Chapter2StageDic[tier.ChapterId] then Chapter2StageDic[tier.ChapterId] = {} end
|
||||
if not Chapter2StageDic[tier.ChapterId][tier.Difficulty] then
|
||||
Chapter2StageDic[tier.ChapterId][tier.Difficulty] = {}
|
||||
end
|
||||
--if not Chapter2StageTierDic[eStage.ChapterId] then Chapter2StageTierDic[eStage.ChapterId] = {} end
|
||||
--if not Chapter2StageTierDic[eStage.ChapterId][eStage.TierId] then Chapter2StageTierDic[eStage.ChapterId][eStage.TierId] = {} end
|
||||
Chapter2StageDic[tier.ChapterId][tier.Difficulty][tier.OrderId] = tier
|
||||
end
|
||||
for id, eStage in pairs(EStageConfig) do
|
||||
--Chapter2StageTierDic[eStage.ChapterId][eStage.TierId][eStage.OrderId] = eStage
|
||||
if not StageToEStageDic[eStage.StageId] then
|
||||
StageToEStageDic[eStage.StageId] = eStage
|
||||
end
|
||||
if not TierId2StageIdDic[eStage.TierId] then
|
||||
TierId2StageIdDic[eStage.TierId] = {}
|
||||
end
|
||||
TierId2StageIdDic[eStage.TierId][eStage.OrderId] = id
|
||||
|
||||
if not Chapter2StageIdDic[eStage.ChapterId] then
|
||||
Chapter2StageIdDic[eStage.ChapterId] = {}
|
||||
end
|
||||
table.insert(Chapter2StageIdDic[eStage.ChapterId] , id)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local InitCharacter = function()
|
||||
for _, v in pairs(BaseCharacterConfig) do
|
||||
for _, type in pairs(v.Type) do
|
||||
if not Type2CharacterDic[type] then Type2CharacterDic[type] = {} end
|
||||
if not Type2CharacterDic[type][v.Id] then Type2CharacterDic[type][v.Id] = 1 end
|
||||
end
|
||||
Rank2CharacterDic[v.Id] = {}
|
||||
end
|
||||
end
|
||||
|
||||
local InitRank2CharacterDic = function()
|
||||
for _, v in pairs(CharacterConfig) do
|
||||
Rank2CharacterDic[v.BaseId][v.Rank] = v
|
||||
if not Rank2CharacterDic[v.BaseId].MaxRank or Rank2CharacterDic[v.BaseId].MaxRank < v.Rank then
|
||||
Rank2CharacterDic[v.BaseId].MaxRank = v.Rank
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local InitTeam = function()
|
||||
for _, v in pairs(TeamPosConfig) do
|
||||
if not Chapter2TeamPosDic[v.ChapterId] then Chapter2TeamPosDic[v.ChapterId] = {} end
|
||||
table.insert(Chapter2TeamPosDic[v.ChapterId], v)
|
||||
end
|
||||
for id, chapter in pairs(ChapterConfig) do
|
||||
if not Chapter2DefaultTeamDic[id] then Chapter2DefaultTeamDic[id] = {} end
|
||||
for order, defaultTeamId in pairs(chapter.DefaultTeamIds) do
|
||||
Chapter2DefaultTeamDic[id][order] = XExpeditionConfig.GetDefaultTeamCfgByTeamId(defaultTeamId)
|
||||
end
|
||||
end
|
||||
for id, childCombo in pairs(ChildComboConfig) do
|
||||
if childCombo.DefaultTeamId > 0 then
|
||||
DefaultTeamId2ChildComboDic[childCombo.DefaultTeamId] = childCombo
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function XExpeditionConfig.Init()
|
||||
InitConfig()
|
||||
GetNewBaseConfigId()
|
||||
InitStages()
|
||||
InitCharacter()
|
||||
InitRank2CharacterDic()
|
||||
InitComboConfig()
|
||||
InitTeam()
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetExpeditionConfig()
|
||||
return BaseConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetExpeditionConfigById(Id)
|
||||
return BaseConfig[Id] or BaseConfig[NewBaseConfigIndex]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetLastestExpeditionConfig()
|
||||
if NewBaseConfigIndex == 0 then
|
||||
return BaseConfig[1]
|
||||
end
|
||||
return BaseConfig[NewBaseConfigIndex]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetEChapterCfg()
|
||||
return ChapterConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetChapterCfgById(chapterId)
|
||||
if not ChapterConfig[chapterId] then
|
||||
XLog.ErrorTableDataNotFound("XExpeditionConfig.GetChapterCfgById", "虚像地平线章节数据",
|
||||
TABLE_EXPEDITION_CHAPTER, "Id", tostring(chapterId))
|
||||
return nil
|
||||
end
|
||||
return ChapterConfig[chapterId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetChapterRewardIdById(chapterId)
|
||||
return ChapterConfig[chapterId] and ChapterConfig[chapterId].RewardId or 0
|
||||
end
|
||||
--==============
|
||||
--根据章节返回【【关卡层】】列表
|
||||
--返回的是关卡层列表,不是关卡
|
||||
--==============
|
||||
function XExpeditionConfig.GetEStageListByChapterId(chapterId)
|
||||
return Chapter2StageDic[chapterId] or {}
|
||||
end
|
||||
--==============
|
||||
--根据关卡层Id返回该层所有关卡Id列表
|
||||
--返回的是关卡
|
||||
--==============
|
||||
function XExpeditionConfig.GetEStageIdsByTierId(tierId)
|
||||
if not TierId2StageIdDic[tierId] then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetEStageIdsByTierId",
|
||||
"虚像地平线关卡数据",
|
||||
TABLE_EXPEDITION_STAGE,
|
||||
"TierId",
|
||||
tostring(tierId))
|
||||
return nil
|
||||
end
|
||||
return TierId2StageIdDic[tierId]
|
||||
end
|
||||
|
||||
--==============
|
||||
--根据章节Id返回该章节所有关卡Id列表
|
||||
--返回的是关卡
|
||||
--==============
|
||||
function XExpeditionConfig.GetEStageIdsByChapterId(chapterId)
|
||||
if not Chapter2StageIdDic[chapterId] then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetEStageIdsByChapterId",
|
||||
"虚像地平线关卡数据",
|
||||
TABLE_EXPEDITION_STAGE,
|
||||
"chapterId",
|
||||
tostring(chapterId))
|
||||
return nil
|
||||
end
|
||||
return Chapter2StageIdDic[chapterId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetStageList()
|
||||
return StageToEStageDic
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetEStageByStageId(stageId)
|
||||
return StageToEStageDic[stageId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetEStageIdByStageId(stageId)
|
||||
return StageToEStageDic[stageId] and StageToEStageDic[stageId].Id
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetOrderIdByStageId(stageId)
|
||||
return StageToEStageDic[stageId].OrderId
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBaseCharacterCfg()
|
||||
return BaseCharacterConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBaseCharacterCfgById(baseId)
|
||||
return BaseCharacterConfig[baseId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBaseIdByECharId(eCharacterId)
|
||||
return CharacterConfig[eCharacterId].BaseId
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterIdByBaseId(baseId)
|
||||
return BaseCharacterConfig[baseId] and BaseCharacterConfig[baseId].CharacterId or 0
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterElementByBaseId(baseId)
|
||||
return BaseCharacterConfig[baseId] and BaseCharacterConfig[baseId].Elements or {}
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterMaxRankByBaseId(baseId)
|
||||
return Rank2CharacterDic[baseId].MaxRank
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterCfgByBaseIdAndRank(baseId, rank)
|
||||
local base = Rank2CharacterDic[baseId]
|
||||
if not base then
|
||||
return nil
|
||||
end
|
||||
if base.MaxRank < rank then
|
||||
return base[base.MaxRank]
|
||||
else
|
||||
return base[rank]
|
||||
end
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterCfgs()
|
||||
return CharacterConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterCfgById(Id)
|
||||
if not CharacterConfig[Id] then
|
||||
XLog.ErrorTableDataNotFound("XExpeditionConfig.GetCharacterById", "虚像地平线角色", TABLE_EXPEDITION_CHARACTER, "Id", tostring(Id))
|
||||
end
|
||||
return CharacterConfig[Id]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetEStageCfg(EStageId)
|
||||
if not EStageConfig[EStageId] then
|
||||
XLog.ErrorTableDataNotFound("XExpeditionConfig.GetEStageCfg", "虚像地平线关卡", TABLE_EXPEDITION_STAGE, "Id", tostring(EStageId))
|
||||
return nil
|
||||
end
|
||||
return EStageConfig[EStageId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharacterElementById(elementId)
|
||||
return CharacterElements[elementId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetComboTable()
|
||||
return ComboConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetChildComboTable()
|
||||
return ChildComboConfig
|
||||
end
|
||||
--================
|
||||
--根据子羁绊类型Id获取具体羁绊列表
|
||||
--================
|
||||
function XExpeditionConfig.GetComboByChildComboId(childComboId)
|
||||
if not BaseComboDic[childComboId] then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetComboByChildComboId",
|
||||
"虚像地平线成员组合数据",
|
||||
TABLE_EXPEDITION_COMBO,
|
||||
"ChildComboId",
|
||||
tostring(childComboId))
|
||||
return nil
|
||||
end
|
||||
return BaseComboDic[childComboId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetChildComboById(id)
|
||||
if not ChildComboConfig[id] then
|
||||
XLog.ErrorTableDataNotFound("XExpeditionConfig.GetEStageCfg",
|
||||
"虚像地平线羁绊子分类数据", TABLE_EXPEDITION_CHILDCOMBO, "Id", tostring(id))
|
||||
return nil
|
||||
end
|
||||
return ChildComboConfig[id]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetComboById(comboId)
|
||||
if not ComboConfig[comboId] then
|
||||
XLog.ErrorTableDataNotFound("XExpeditionConfig.GetComboById", "虚像地平线阵容", TABLE_EXPEDITION_COMBO, "Id", tostring(comboId))
|
||||
return nil
|
||||
end
|
||||
return ComboConfig[comboId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetCharactersByCharacterType(typeId)
|
||||
if not Type2CharacterDic[typeId] then
|
||||
XLog.ErrorTableDataNotFound("XExpeditionConfig.GetCharactersByCharacterType", "虚像地平线角色词条", TABLE_EXPEDITION_CHARACTER_TYPE, "Id", tostring(typeId))
|
||||
return nil
|
||||
end
|
||||
return Type2CharacterDic[typeId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.IsCharacterHasTypes(characterId, typeIds)
|
||||
for _, typeId in pairs(typeIds) do
|
||||
local id = tonumber(typeId)
|
||||
if not Type2CharacterDic[id] or not Type2CharacterDic[id][characterId] then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBaseComboTypeConfig()
|
||||
return ComboTypeNameConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBaseComboTypeCfgByOrderId(orderId)
|
||||
return Order2ComboTypeDic[orderId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBaseComboTypeNameById(id)
|
||||
return ComboTypeNameConfig[id].Name or ""
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetBuyDrawMaxTime()
|
||||
return #DrawConsumeConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetDrawPriceByCount(count)
|
||||
return DrawConsumeConfig[count] and DrawConsumeConfig[count].ConsumeCount or 0
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetGlobalConfigs()
|
||||
return GlobalComboConfig
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetGlobalConfigById(comboId)
|
||||
return GlobalComboConfig[comboId]
|
||||
end
|
||||
|
||||
function XExpeditionConfig.GetRankByRankWeightId(index)
|
||||
return DrawRankConfig[index] and DrawRankConfig[index].Rank or 1
|
||||
end
|
||||
--================
|
||||
--获取队伍位置数据
|
||||
--@param teamPosId:位置ID
|
||||
--================
|
||||
function XExpeditionConfig.GetTeamPosCfgById(teamPosId)
|
||||
if not TeamPosConfig[teamPosId] then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetTeamPosCfgById",
|
||||
"虚像地平线队伍位置数据",
|
||||
TABLE_EXPEDITION_TEAMPOS,
|
||||
"Id",
|
||||
tostring(teamPosId))
|
||||
return nil
|
||||
end
|
||||
return TeamPosConfig[teamPosId]
|
||||
end
|
||||
--================
|
||||
--获取队伍位置数量
|
||||
--================
|
||||
function XExpeditionConfig.GetTeamPosListByChapterId(currentChapterId)
|
||||
if not TeamPosConfig or not Chapter2TeamPosDic or not Chapter2TeamPosDic[currentChapterId] then return 0 end
|
||||
return Chapter2TeamPosDic[currentChapterId]
|
||||
end
|
||||
--================
|
||||
--获取招募概率配置表
|
||||
--================
|
||||
function XExpeditionConfig.GetDrawPRConfig()
|
||||
return DrawPRConfig
|
||||
end
|
||||
--================
|
||||
--获取招募星数对照表配置
|
||||
--================
|
||||
function XExpeditionConfig.GetDrawRankConfig()
|
||||
return DrawRankConfig
|
||||
end
|
||||
--================
|
||||
--获取所有关卡层配置
|
||||
--================
|
||||
function XExpeditionConfig.GetAllStageTierConfig()
|
||||
return StageTierConfig
|
||||
end
|
||||
--================
|
||||
--根据章节ID获取关卡层列表(按OrderId排列)配置
|
||||
--@param chapterId:章节ID
|
||||
--@param noTips:是否要打印错误日志信息
|
||||
--================
|
||||
function XExpeditionConfig.GetStageTierListByChapterId(chapterId, noTips)
|
||||
if not Chapter2StageTierDic[chapterId] then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetStageTierListByChapterId",
|
||||
"虚像地平线关卡层数据",
|
||||
TABLE_EXPEDITION_STAGETIER,
|
||||
"ChapterId",
|
||||
tostring(chapterId))
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return Chapter2StageTierDic[chapterId]
|
||||
end
|
||||
--================
|
||||
--根据关卡层ID获取关卡层配置
|
||||
--@param tierId:关卡层ID
|
||||
--@param noTips:是否要打印错误日志信息
|
||||
--================
|
||||
function XExpeditionConfig.GetStageTierConfigByTierId(tierId, noTips)
|
||||
if not StageTierConfig[tierId] then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetStageTierConfigByTierId",
|
||||
"虚像地平线关卡层数据",
|
||||
TABLE_EXPEDITION_STAGETIER,
|
||||
"Id",
|
||||
tostring(tierId))
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return StageTierConfig[tierId]
|
||||
end
|
||||
--================
|
||||
--获取所有预设队伍配置
|
||||
--================
|
||||
function XExpeditionConfig.GetAllDefaultTeamCfgs()
|
||||
return DefaultTeamConfig
|
||||
end
|
||||
--================
|
||||
--根据章节ID获取预设队伍配置列表
|
||||
--@param chapterId:章节ID
|
||||
--@param noTips:是否要打印错误日志信息
|
||||
--================
|
||||
function XExpeditionConfig.GetDefaultTeamCfgsByChapterId(chapterId, noTips)
|
||||
if not Chapter2DefaultTeamDic[chapterId] then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetDefaultTeamCfgsByChapterId",
|
||||
"虚像地平线关卡层数据",
|
||||
TABLE_EXPEDITION_CHAPTER,
|
||||
"Id",
|
||||
tostring(chapterId))
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return Chapter2DefaultTeamDic[chapterId]
|
||||
end
|
||||
--================
|
||||
--根据预设队伍ID获取预设队伍配置
|
||||
--@param teamId:队伍Id
|
||||
--@param noTips:是否要打印错误日志信息
|
||||
--================
|
||||
function XExpeditionConfig.GetDefaultTeamCfgByTeamId(teamId, noTips)
|
||||
if not DefaultTeamConfig[teamId] then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetDefaultTeamCfgByTeamId",
|
||||
"虚像地平线关卡层数据",
|
||||
TABLE_EXPEDITION_DEFAULT_TEAM,
|
||||
"TeamId",
|
||||
tostring(teamId))
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return DefaultTeamConfig[teamId]
|
||||
end
|
||||
--================
|
||||
--根据预设队伍ID获取对应队伍羁绊配置
|
||||
--@param teamId:队伍Id
|
||||
--@param noTips:是否要打印错误日志信息
|
||||
--================
|
||||
function XExpeditionConfig.GetChildComboByDefaultTeamId(teamId, noTips)
|
||||
if not DefaultTeamId2ChildComboDic[teamId] then
|
||||
if not noTips then
|
||||
XLog.ErrorTableDataNotFound(
|
||||
"XExpeditionConfig.GetChildComboByDefaultTeamId",
|
||||
"虚像地平线基础羁绊数据",
|
||||
TABLE_EXPEDITION_CHILDCOMBO,
|
||||
"DefaultTeamId",
|
||||
tostring(teamId))
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return DefaultTeamId2ChildComboDic[teamId]
|
||||
end
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue