要完整实现装备锻造等级功能,需要从以下几个部分进行:
## 一、数据结构与存储
1. **装备数据扩展**:在装备数据中增加锻造等级字段
```lua
-- 在装备Values数组中添加锻造等级记录
-- Id=2 表示铸阶等级(参考武勋铸阶),可以沿用或定义新的ID
itemData.Values = {
{Id = 0, Value = 强化等级},
{Id = 2, Value = 锻造等级}, -- 使用Id=2存储锻造等级
-- 其他属性...
}
```
2. **锻造配置表**:定义每级锻造的属性加成
```lua
-- 类似武勋铸阶配置结构
duanzao_data = {
[装备ID] = {
[1] = { -- 锻造等级1
attrlist = {{属性ID, 属性值}, ...}, -- 属性加成列表
xhitemlist = {消耗物品ID, 消耗数量}, -- 消耗材料
needLevel = 所需玩家等级 -- 可选
},
[2] = { -- 锻造等级2
attrlist = {{属性ID, 属性值}, ...},
xhitemlist = {消耗物品ID, 消耗数量},
needLevel = 所需玩家等级
},
-- 更多等级...
}
}
```
## 二、前端界面实现
1. **UI控制器设置**:
```lua
-- 类似武勋铸阶界面结构
self.back = FGUI:ui_delegate(self._ui.panl_duanzao)
self.duanzao_mjContro = FGUI:getController(self._ui.panl_duanzao, "ismj") -- 满级控制器
self.duanzao_iswearContro = FGUI:getController(self._ui.panl_duanzao, "iswear") -- 穿戴控制器
-- 锻造按钮事件
FGUI:setOnClickEvent(self.back.btn_duanzao, function()
ssrMessage:sendmsgEx("equip", "EquipDuanZao", {self.SelectEquipMakeindex})
end)
```
2. **装备选择列表**:
```lua
FGUI:GList_itemRenderer(self.back.equipList, handler(self, self.ListDuanZaoEquipRenderer))
FGUI:GList_setNumItems(self.back.equipList, #equipPositions)
FGUI:GList_addOnClickItemEvent(self.back.equipList, function(context)
local index = FGUI:GetIntData(context.data)
self:SelectDuanZaoEquip(index)
end)
```
3. **属性展示**:
```lua
-- 当前锻造等级属性
function DuanZaoPanel:ListDZAttr1Renderer(idx, item)
local name = attrConfigs[属性ID]['Name']
local value = 基础属性值
local dzLv = self.currentDuanZaoLevel
-- 计算锻造加成
if dzLv > 0 then
for i=1,#duanzao_data[装备ID][dzLv]['attrlist'] do
local attr = duanzao_data[装备ID][dzLv]['attrlist'][i]
if attr[1] == 属性ID then
value = value + attr[2]
end
end
end
-- 百分比属性处理
local type = attrConfigs[属性ID]['Type'] or 0
if type == 1 then
value = string.format("%.1f", value / 100) * 10 / 10 .. "%"
end
FGUI:GTextField_setText(FGUI:GetChild(item, "n0"), name)
FGUI:GTextField_setText(FGUI:GetChild(item, "n4"), value)
end
-- 下一级锻造属性
function DuanZaoPanel:ListDZAttr2Renderer(idx, item)
local nextLv = (self.currentDuanZaoLevel + 1) > maxLv and maxLv or (self.currentDuanZaoLevel + 1)
-- 类似计算下一级加成
end
```
4. **消耗材料显示**:
```lua
local itemid = duanzao_data[装备ID][nextLv]['xhitemlist'][1]
local neednum = duanzao_data[装备ID][nextLv]['xhitemlist'][2]
local itemnum = SL:GetValue("ITEMCOUNT", itemid)
-- 创建物品显示
ItemUtil:ItemShow_Create(itemData, itemRoot, extData)
FGUI:GTextField_setText(num, itemnum.."/"..neednum)
FGUI:GTextField_setColor(num, itemnum >= neednum and "#00FF00" or "#FF0000")
```
## 三、数据更新逻辑
1. **装备选择更新**:
```lua
function DuanZaoPanel:SelectDuanZaoEquip(index)
local equipData = SL:GetValue("EQUIP_DATA_BY_POS", equipPositions[index])
self.SelectEquipItemID = equipData and equipData.ID or 0
self.SelectEquipMakeindex = equipData and equipData.MakeIndex or 0
self.SelectEquipData = equipData or 0
-- 获取当前锻造等级
local dzLv = 0
if equipData then
for j = 1, #equipData.Values do
if equipData.Values[j]['Id'] == 2 then
dzLv = equipData.Values[j]['Value']
break
end
end
end
self.currentDuanZaoLevel = dzLv
self:UpdateDuanZaoPanel()
end
```
2. **面板更新**:
```lua
function DuanZaoPanel:UpdateDuanZaoPanel()
local maxLv = duanzao_data[self.SelectEquipItemID] and #duanzao_data[self.SelectEquipItemID] or 0
local nextLv = (self.currentDuanZaoLevel + 1) > maxLv and maxLv or (self.currentDuanZaoLevel + 1)
local isMaxLevel = self.currentDuanZaoLevel >= maxLv
-- 更新属性列表
FGUI:GList_setNumItems(self.back.attrlist1, #duanzao_data[装备ID][1]['attrlist'])
FGUI:GList_setNumItems(self.back.attrlist2, #duanzao_data[装备ID][1]['attrlist'])
-- 更新装备显示
if self.SelectEquipData ~= 0 then
ItemUtil:ItemShow_Create(self.SelectEquipData, itemRoot, extData)
end
-- 控制按钮状态
FGUI:Controller_setSelectedIndex(self.duanzao_mjContro, isMaxLevel and 1 or 0)
FGUI:Controller_setSelectedIndex(self.duanzao_iswearContro, self.SelectEquipData ~= 0 and 1 or 0)
end
```
## 四、后端处理
1. **服务端接口**:
```lua
-- 使用类似武勋铸阶的消息处理
ssrMessage:sendmsgEx("equip", "EquipDuanZao", {装备MakeIndex})
```
2. **属性修改**:
```lua
-- 使用changecustomitemabil接口设置自定义属性
changecustomitemabil(actor, itemKey, group, attrPos, attrID, attrValue)
```
3. **数据同步**:
```lua
-- 更新后刷新到前端
updateitemtoclient(actor, itemKey)
```
## 五、属性计算整合
在属性获取函数中添加锻造等级加成:
```lua
function FGUIFunction:GetEquipCombineAttList(item, job, needAllAttr)
local attList = {}
-- ... 基础属性计算
-- 添加锻造属性加成
local dzLv = 0
for j = 1, #item.Values do
if item.Values[j]['Id'] == 2 then
dzLv = item.Values[j]['Value']
break
end
end
if dzLv > 0 and duanzao_data[item.ID] and duanzao_data[item.ID][dzLv] then
for i=1,#duanzao_data[item.ID][dzLv]['attrlist'] do
local attr = duanzao_data[item.ID][dzLv]['attrlist'][i]
local attId, value = attr[1], attr[2]
-- 合并到属性列表
end
end
return attList
end
```
## 六、物品图标显示
在物品图标上显示锻造等级:
```lua
function SetItemIconByItemID(commonItem, itemData)
-- ... 其他等级显示
local dzLv = 0
for i=1,#itemData.Values do
if itemData.Values[i]['Id'] == 2 then
dzLv = itemData.Values[i]['Value']
end
end
if dzLv > 0 then
FGUI:setVisible(Text_star, true)
FGUI:GTextField_setText(Text_star, "锻"..dzLv)
end
end
```
这个实现方案基于现有的武勋铸阶系统架构,确保了与现有代码的兼容性,同时提供了完整的锻造等级功能。