ItemRecycling = {} local this = {} local ItemRecyclingType = { PIN_JIE = 1, ZHUO_YUE = 2, ZHI_YE = 3 } ITEM_RECYCLING_TYPE = "R$itemRecyclingTYPE" -- 合服时取消所有选择的回收类型 function ItemRecycling.combineglobalvar(varName) local allWorldGoods = getsysvar(ITEM_RECYCLING_TYPE) if table.isEmpty(allWorldGoods) then return end setsysvar(SYS_TRADE_WORLD_GOODS, {}) end -- 分解 function ItemRecycling.decompositionlua(actor,msgID,msgData) local decompositionItemList = msgData[1] local allItemInfo = getallbagiteminfo(actor) if table.isEmpty(allItemInfo) then return end if table.isEmpty(decompositionItemList) then return end local allequip = getplaydef(actor, "T$luaitemextdata") local allNeedMaterial = {} local allObtainList = {} for bagIndex, count in pairs(decompositionItemList) do for _, itemInfo in pairs(allItemInfo) do if itemInfo.bagindex == tonumber(bagIndex) then local itemCfgId = itemInfo.cfgid local decomposeGroup = ConfigDataManager.getTableValue("cfg_item","decomposeGroup","id",itemCfgId) if string.isNullOrEmpty(decomposeGroup) then tipinfo(actor,"选择的道具中拥有不能分解的道具,请重新选择") return end local decomposeTable = ConfigDataManager.getTable("cfg_recovery_out","id",decomposeGroup) if table.isEmpty(decomposeTable) then -- error(actor,"分解类型配置错误") return end if not table.isNullOrEmpty(allequip) then local equipext = allequip[tonumber(itemInfo.id)] if not table.isNullOrEmpty(equipext) then allequip[tonumber(itemInfo.id)] = nil end end local decomposeInfo = decomposeTable[1] -- 计算分解需要的东西 local needMaterial = decomposeInfo.needmaterial if not string.isNullOrEmpty(needMaterial) then local needMaterialInfo = string.split(needMaterial,"#") local needMaterialCount = allNeedMaterial[needMaterialInfo[1]] if not needMaterialCount then needMaterialCount = 0 end allNeedMaterial[needMaterialInfo[1]] = needMaterialCount + (tonumber(needMaterialInfo[2]) * count) end -- 计算分解获得的东西 local material = decomposeInfo.material local group = decomposeInfo.group if tonumber(group) == 2 then if not string.isNullOrEmpty(material) then local allObtainTable = string.split(material,"|") if not table.isEmpty(allObtainTable) then if table.count(allObtainTable) == 1 then -- 分解只会获得一种物品 local obtainInfo = string.split(allObtainTable[1],"#") local obtainCount = allObtainList[obtainInfo[1]] if obtainCount == nil then obtainCount = 0 end local total = obtainCount + (tonumber(obtainInfo[2]) * count) allObtainList[obtainInfo[1]] = total else -- 分解获得物品配置权重 local allWeight = 0 local newAllObtainTable = {} for _, obtainInfo in pairs(allObtainTable) do local obtainWeight = string.split(obtainInfo,"#") allWeight = allWeight + tonumber(obtainWeight[3]) obtainWeight[3] = allWeight table.insert(newAllObtainTable,obtainWeight) end for i = 1, count do local successIndex = math.random(1, allWeight) local lastWeight = 0 for _, newObtainInfo in pairs(newAllObtainTable) do if lastWeight < successIndex and newObtainInfo[3] >= successIndex then local obtainCount = allObtainList[newObtainInfo[1]] if obtainCount == nil then obtainCount = 0 end allObtainList[newObtainInfo[1]] = obtainCount + (tonumber(newObtainInfo[2])) end lastWeight = newObtainInfo[3] end end end end end else if not string.isNullOrEmpty(material) then local allObtainTable = string.split(material,"|") for _, obtainInfo in pairs(allObtainTable) do local obtainItemInfo = string.split(obtainInfo,"#") local obtainCount = allObtainList[obtainItemInfo[1]] if obtainCount == nil then obtainCount = 0 end local total = obtainCount + (tonumber(obtainItemInfo[2]) * count) allObtainList[obtainItemInfo[1]] = total end end end end end end itemdecomposition(actor,decompositionItemList,allObtainList,allNeedMaterial) sendluamsg(actor,LuaMessageIdToClient.RES_ITEM_DECOMPOSITION,allObtainList) setplaydef(actor, "T$luaitemextdata",allequip) end function ItemRecycling.recyclingRateReward(actor, reward) this.recyclingRateReward(actor, reward) end function this.recyclingRateReward(actor, reward) local rate = 0 -- 月卡特权 local is_open, count = PrivilegeMonth.hasPrivilege(actor, PrivilegeMonth.PrivilegeType.RECYCLING_INCOME_UP) if is_open then rate = rate + count; end -- VIP特权 local vip_open, vip_rate = VipGiftPack.hasPrivilege(actor, VipPrivilege.Type.recycle) if vip_open and string.tonumber(vip_rate) > 0 then rate = rate + tonumber(vip_rate) end if rate < 1 then return end for key, value in pairs(reward) do local final_value = value * rate / 100 if final_value >= 1 then reward[key] = final_value end end additemmaptobag(actor, reward, 0, 9999, '回收') GameTips.sendGetRewardMsg(actor, reward) this.debug("加成过的回收奖励", reward) end -- 回收 function ItemRecycling.recovery(actor,msgData) local allItemInfo = getallbagiteminfo(actor) if table.isEmpty(allItemInfo) then return end if table.isEmpty(msgData) then return end local allObtainList = {} local allequip = getplaydef(actor, "T$luaitemextdata") for bagIndex, count in pairs(msgData) do for _, itemInfo in pairs(allItemInfo) do if itemInfo.bagindex == tonumber(bagIndex) then local itemCfgId = itemInfo.cfgid local recoveryGroup = ConfigDataManager.getTableValue("cfg_item","recoveryGroup","id",itemCfgId) local recoveryUp = ConfigDataManager.getTableValue("cfg_item","recoveryUp","id",itemCfgId) if string.isNullOrEmpty(recoveryGroup) then tipinfo(actor,"选择的道具中拥有不能分解的道具,请重新选择") return end local recoveryTable = ConfigDataManager.getTable("cfg_recovery","id",recoveryGroup) if table.isEmpty(recoveryTable) then -- error(actor,"回收类型配置错误") return end if not table.isNullOrEmpty(allequip) then local equipext = allequip[tonumber(itemInfo.id)] if not table.isNullOrEmpty(equipext) then allequip[tonumber(itemInfo.id)] = nil end end local recoveryInfo = recoveryTable[1] local materialString = recoveryInfo.material local material = string.split(materialString,"#") local addCount = math.random(tonumber(material[2]), tonumber(material[3])) addCount = addCount * count if not string.isNullOrEmpty(recoveryUp) then addCount = addCount * ( 1 + math.floor(tonumber(recoveryUp) / 100)) end local obtainCount = allObtainList[material[1]] if obtainCount == nil then obtainCount = 0 end allObtainList[material[1]] = obtainCount + addCount end end end itemrecovery(actor,msgData,allObtainList) sendluamsg(actor, LuaMessageIdToClient.RES_RECOVERY_REWARD, allObtainList) sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, allObtainList) setplaydef(actor, "T$luaitemextdata",allequip) -- sendluamsg(actor,LuaMessageIdToClient.RES_ITEM_RECOVERY,allObtainList) end -- 设置玩家回收类型 function ItemRecycling.setItemRecyclingType(ownActor,msgData) local itemRecoveryType = getsysvar(ownActor,ITEM_RECYCLING_TYPE) if table.isNullOrEmpty(itemRecoveryType) then itemRecoveryType = {} end itemRecoveryType[ownActor:toString()] = msgData setsysvar(ownActor,ITEM_RECYCLING_TYPE,itemRecoveryType) sendluamsg(ownActor, LuaMessageIdToClient.RES_GET_RECYCLING_TYPE, msgData) end -- 获取当前玩家回收设置信息 function ItemRecycling.getItemRecyclingType(ownActor) local itemRecoveryType = getsysvar(ownActor,ITEM_RECYCLING_TYPE) if table.isNullOrEmpty(itemRecoveryType) then sendluamsg(ownActor, LuaMessageIdToClient.RES_GET_RECYCLING_TYPE, nil) return end for actor, recyclingType in pairs(itemRecoveryType) do if actor == ownActor:toString() then sendluamsg(ownActor, LuaMessageIdToClient.RES_GET_RECYCLING_TYPE, recyclingType) return end end sendluamsg(ownActor, LuaMessageIdToClient.RES_GET_RECYCLING_TYPE, nil) end -- 自动回收道具 function ItemRecycling.autoRecycling(actor) jprint("开启自动回收") local allItemRecoveryType = getsysvar(actor,ITEM_RECYCLING_TYPE) local bagIndex = {} if table.isNullOrEmpty(allItemRecoveryType) then table.insert(bagIndex,0) return bagIndex end local itemRecoveryType = allItemRecoveryType[actor:toString()] if table.isNullOrEmpty(itemRecoveryType) then table.insert(bagIndex,0) return bagIndex end local allItemInfo = getallbagiteminfo(actor) if table.isEmpty(allItemInfo) then table.insert(bagIndex,0) return bagIndex end local alldata = EquipAndAppear.getLuaItemExtData(actor) for _, itemInfo in pairs(allItemInfo) do if this.getItemInfo(alldata,itemInfo.id) then local itemCfgId = itemInfo.cfgid local recoveryGroup = ConfigDataManager.getTableValue("cfg_item","recoveryGroup","id",itemCfgId) if not string.isNullOrEmpty(recoveryGroup) then local secondType = itemRecoveryType[recoveryGroup] if secondType ~= nil then if not secondType["1"] then table.insert(bagIndex,itemInfo.bagindex) else for _, type in pairs(secondType) do local recoveryScreen = ConfigDataManager.getTable("cfg_recovery_screen","id",type) if not table.isNullOrEmpty(recoveryScreen) then local recoveryScreenInfo = recoveryScreen[1] local recoveryScreenType = tonumber(recoveryScreenInfo.type) if recoveryScreenType == ItemRecyclingType.PIN_JIE then local rank = recoveryScreenInfo.rank local cfgRank = ConfigDataManager.getTableValue("cfg_item","rank","id",itemCfgId) if not string.isNullOrEmpty(rank) and not string.isNullOrEmpty(cfgRank) and tonumber(rank) == tonumber(cfgRank)then table.insert(bagIndex,itemInfo.bagindex) break end elseif recoveryScreenType == ItemRecyclingType.ZHUO_YUE then local cfgCount = recoveryScreenInfo.count local entries = itemInfo.entries if not string.isNullOrEmpty(cfgCount) and not table.isNullOrEmpty(entries) and tonumber(cfgCount) == table.count(entries) then table.insert(bagIndex,itemInfo.bagindex) break end elseif recoveryScreenType == ItemRecyclingType.ZHI_YE then local cfgCareer = recoveryScreenInfo.career local job = ConfigDataManager.getTableValue("cfg_item","job","id",itemCfgId) if not string.isNullOrEmpty(cfgCareer) and not string.isNullOrEmpty(job) then local recoveryCareer = string.split(cfgCareer,"|") local itemCareer = string.split(job,"|") for _, career in pairs(itemCareer) do if table.contains(recoveryCareer,career) then table.insert(bagIndex,itemInfo.bagindex) break end end end end end end end end end end end table.insert(bagIndex,0) return bagIndex end -- 判断当前道具有没有锻造 function this.getItemInfo(alldata,itemId) local equipdata = alldata[tonumber(itemId)] if equipdata == nil then return true end if equipdata.strengthlv == nil and equipdata.appendlv == nil then return true end if equipdata.strengthlv ~= 0 or equipdata.appendlv ~= 0 then 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 function this.loginfo(actor, param) if not this.log_open then return end if param == nil then param = "error! 日志输出内容为空. nil" end jprint(param) info(actor, param) end