123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- ---@class UnionArmbands.ArmbandsData
- ---@field level number -- 等级
- ---@field reallevel number -- 真实等级
- ---@field strong number -- 强化等级
- UnionArmbands = {}
- local this = {}
- local UnionArmbandsKey = PlayerDefKey.UNION.UnionArmbandsKey
- local UnionArmbandsLevelupLimitCacheKey = PlayerDefKey.UNION.UnionArmbandsLevelUpLimitCacheKey
- function UnionArmbands.serverStart()
- local success, result = xpcall(this.startCacheUnionLevelUpLimit, debug.traceback)
- gameDebug.assertPrint(success, "启动时缓存战盟臂章升级限制异常!", result)
- end
- function UnionArmbands.sendArmbandInfo(actor)
- this.sendArmbandInfo(actor)
- end
- function UnionArmbands.levelupUnionArmband(actor)
- this.levelupUnionArmband(actor)
- end
- function UnionArmbands.strongArmband(actor)
- this.strongArmband(actor)
- end
- function UnionArmbands.onEnterUnion(actor)
- this.onEnterUnion(actor)
- end
- function UnionArmbands.onQuitUnion(actor)
- this.onQuitUnion(actor)
- end
- function this.startCacheUnionLevelUpLimit()
- local cache_map = {}
- local config_arr = ConfigDataManager.getList("cfg_gard_armbands")
- gameDebug.print("------ config_arr ------", config_arr)
- if table.isEmpty(config_arr) then
- return
- end
- for _, config in ipairs(config_arr) do
- local limit_arr = string.split(config.guildrank, "#")
- cache_map[tonumber(limit_arr[1])] = tonumber(limit_arr[2])
- end
- gameDebug.print("------ cache_map ------", cache_map)
- setsysvar(UnionArmbandsLevelupLimitCacheKey, cache_map)
- end
- function this.cacheStrongAttr(cache_map)
- local attr_cache = {}
- local config_arr = ConfigDataManager.getList("cfg_gard_bandsStrength")
- if table.isEmpty(table.isEmpty) then
- return
- end
- for _, config in pairs(config_arr) do
- local level = config.level
- local attr_str = config.strengthenattribute
- local attr_map = string.toIntIntMap(attr_str, "#", "|")
- attr_cache[tonumber(level)] = attr_map
- end
- cache_map.strong = attr_cache
- end
- function this.sendArmbandInfo(actor)
- ---@type UnionArmbands.ArmbandsData
- local armband_data = this.getArmbandData(actor)
- if table.isEmpty(armband_data) then
- this.jprint("--- 获取战盟臂章数据为空, 开始初始化臂章数据 ---")
- armband_data = this.initArmbandData(actor)
- end
- -- 初始化失败的功能尝试重新初始化
- if armband_data.reallevel < 1 then
- this.levelupUnionArmband(actor)
- end
- if armband_data.strong < 0 then
- this.strongArmband(actor)
- end
- sendluamsg(actor, LuaMessageIdToClient.RES_SEND_UNION_ARMBAND_INFO, armband_data)
- end
- function this.getArmbandData(actor)
- return getplaydef(actor, UnionArmbandsKey)
- end
- function this.setArmbandData(actor, data)
- setplaydef(actor, UnionArmbandsKey, data)
- end
- function this.levelupUnionArmband(actor)
- local union_data = getunioninfo(actor)
- if table.isEmpty(union_data) then
- this.jprint("获取战盟信息异常1")
- return
- end
- ---@type UnionArmbands.ArmbandsData
- local armband_data = this.getArmbandData(actor)
- local level = armband_data.level
- local next_level = level + 1
- local config_arr = ConfigDataManager.getTable("cfg_gard_armbands", "level", next_level)
- if table.isEmpty(config_arr) then
- this.jprint("未获取到配置信息")
- return
- end
- local config = config_arr[1]
- local union_level = tostring(union_data.unionlevel)
- local max_level = this.getLevelupMaxLevel(union_level)
- if tonumber(level) >= tonumber(max_level) then
- this.jprint("战盟等级达到上限")
- return
- end
- if armband_data.reallevel < next_level then
- -- 消耗道具
- local cost_str = config.levelupcost
- local cost_ret = this.unionCostItem(actor, cost_str, 1)
- if not cost_ret then
- this.jprint("消耗道具失败! 资源不足")
- return
- end
- end
- this.setArmbandLevel(actor, armband_data, next_level)
- sendluamsg(actor, LuaMessageIdToClient.RES_UNION_ARMBAND_LEVEL_UP, next_level)
- end
- function this.getLevelupMaxLevel(union_level)
- local data = getsysvar(UnionArmbandsLevelupLimitCacheKey)
- gameDebug.print("----- 臂章等级缓存 ------", data)
- -- 获取所有等级的键并排序
- local levels = {}
- for k in pairs(data) do
- table.insert(levels, k)
- end
- table.sort(levels)
- -- 查找最接近的较小等级
- local closestLevel = nil
- for _, l in ipairs(levels) do
- if l <= tonumber(union_level) then
- closestLevel = l
- else
- break
- end
- end
- -- 返回最接近的较小等级的可用最大值
- if closestLevel ~= nil then
- return data[closestLevel]
- else
- return 9999999999
- end
- end
- function this.initArmbandData(actor)
- local armband_data = {
- level = 0,
- reallevel = 0,
- strong = -1
- }
- this.setArmbandData(actor, armband_data)
- this.levelupUnionArmband(actor)
- this.strongArmband(actor)
- return armband_data
- end
- function this.setArmbandLevel(actor, armband_data, level)
- armband_data.level = level
- if level > armband_data.reallevel then
- armband_data.reallevel = level
- end
- this.setArmbandData(actor, armband_data)
- -- 计算属性
- this.calculateArmbandAttr(actor, level, RoleAttrKey.UNION_ARMBAND_LEVEL)
- end
- function this.strongArmband(actor)
- local union_data = getunioninfo(actor)
- if table.isEmpty(union_data) then
- this.jprint("获取战盟信息异常2")
- return
- end
- ---@type UnionArmbands.ArmbandsData
- local armband_data = this.getArmbandData(actor)
- local strong = armband_data.strong or 0
- local next_strong = strong + 1
- local config_arr = ConfigDataManager.getTable("cfg_gard_bandsStrength", "level", next_strong)
- if table.isEmpty(config_arr) then
- this.jprint("未获取到配置信息")
- return
- end
- local config = config_arr[1]
- local limit = tonumber(config.playerlevellimit)
- if limit then
- local level = tonumber(getbaseinfo(actor, "level"))
- if level < limit then
- this.jprint("玩家等级不足!")
- return
- end
- end
- local cost_str = config.strengthcost
- local cost_ret = this.unionCostItem(actor, cost_str, 1)
- if not cost_ret then
- this.jprint("消耗道具失败! 资源不足")
- return
- end
- local rate = tonumber(config.strengthenprobability)
- local ret = this.strongResult(rate)
- if not ret then
- -- 强化失败 获取本级失败退回的等级
- local old_config = ConfigDataManager.getTable("cfg_gard_bandsStrength", "level", strong)
- local fall_level = ConfigDataManager.getTableValue("cfg_gard_bandsStrength", "levelFailure1", "level", strong)
- fall_level = tonumber(fall_level) or -1
- if tonumber(fall_level) < 0 then
- sendluamsg(actor, LuaMessageIdToClient.RES_UNION_ARMBAND_STRONG, strong)
- return
- end
- next_strong = tonumber(fall_level)
- end
- armband_data.strong = next_strong
- this.setArmbandData(actor, armband_data)
- -- 计算属性
- this.calculateArmbandAttr(actor, next_strong, RoleAttrKey.UNION_ARMBAND_STRONG)
- sendluamsg(actor, LuaMessageIdToClient.RES_UNION_ARMBAND_STRONG, next_strong)
- end
- function this.calculateArmbandAttr(actor, cfg_id, key)
- local attr_str
- if key == RoleAttrKey.UNION_ARMBAND_LEVEL then
- attr_str = ConfigDataManager.getTableValue("cfg_gard_armbands", "levelupattribute", "level", cfg_id)
- else
- attr_str = ConfigDataManager.getTableValue("cfg_gard_bandsStrength", "strengthenattribute", "level", cfg_id)
- end
- local attr_map = string.toIntIntMap(attr_str, "#", "|")
- if not table.isEmpty(attr_map) then
- this.jprint("添加属性")
- addrolekmlattributes(actor, key, attr_map)
- end
- end
- function this.strongResult(probability)
- local value = math.random(0, 9999)
- return value < probability
- end
- function this.combineTable(tbl, n)
- if type(n) ~= 'number' or n < 1 or n > table.count(tbl) then
- return {}
- end
- local combinedTable = {}
- for i = 1, n do
- local currentTable = tbl[i]
- for key, value in pairs(currentTable) do
- if combinedTable[key] then
- combinedTable[key] = combinedTable[key] + value
- else
- combinedTable[key] = value
- end
- end
- end
- return combinedTable
- end
- function this.onEnterUnion(actor)
- jprint(actor:toString())
- ---@type UnionArmbands.ArmbandsData
- local armband_data = this.getArmbandData(actor)
- if table.isEmpty(armband_data) then
- armband_data = this.initArmbandData(actor)
- return
- end
- local union_data = getunioninfo(actor)
- local union_level = union_data.unionlevel
- local max_level = this.getLevelupMaxLevel(union_level)
- if max_level == armband_data.level then
- return
- end
- local level = math.min(armband_data.reallevel, max_level)
- armband_data.level = union_level
- this.setArmbandLevel(actor, armband_data, level)
- this.calculateArmbandAttr(actor, armband_data.strong, RoleAttrKey.UNION_ARMBAND_STRONG)
- end
- function this.onQuitUnion(actor)
- ---@type UnionArmbands.ArmbandsData
- local armband_data = this.getArmbandData(actor)
- armband_data.level = 0
- this.setArmbandLevel(actor, armband_data, 0)
- this.calculateArmbandAttr(actor, 0, RoleAttrKey.UNION_ARMBAND_STRONG)
- end
- function this.unionCostItem(actor, cost_str, rate)
- rate = rate or 1
- if not cost_str or cost_str == "" then
- return true
- end
- local cost_item = string.split(cost_str, "#")
- local item_id = cost_item[1]
- local item_count = cost_item[2]
- item_count = math.floor(item_count * rate)
- local cost_ret = removeitemfrombag(actor, item_id, item_count, 0, 9999, '战盟臂章')
- if not cost_ret then
- this.debug("消耗道具失败!无法参与竞选/取代!", "cost_str ", tostring(cost_str), "rate ", tostring(rate))
- return false
- end
- return true
- end
- ----------------------------------------
- this.log_open = false
- function this.debug(...)
- if not this.log_open then
- return
- end
- gameDebug.print(...)
- end
- function this.jprint(param)
- if not this.log_open then
- return
- end
- if param == nil then
- param = "error! 输出内容为空. nil"
- end
- jprint(param)
- end
|