bayuMIR/client/dev/GUILayout/player_look/LookPlayerSuperEquip.lua
2026-06-12 02:32:15 +08:00

455 lines
16 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

LookPlayerSuperEquip = {}
local EquipPosCfg = GUIDefine.EquipPosUI
LookPlayerSuperEquip._feature = {
clothID = nil, -- 衣服
clothEffectID = nil,
weaponID = nil, -- 武器
weaponEffectID = nil,
headID = nil, -- 头盔
headEffectID = nil,
hairID = nil, -- 头发
capID = nil, -- 斗笠
capEffectID = nil,
veilID = nil, -- 面纱
veilEffectID = nil,
shieldID = nil, -- 盾牌
shieldEffectID = nil,
wingsID = nil, -- 翅膀
showNodeModel = true, -- 裸模
showHair = true -- 头发
}
local Typefunc = {
[EquipPosCfg.Equip_Type_Super_Dress] = function(data)
LookPlayerSuperEquip._feature.clothID = data.ID
LookPlayerSuperEquip._feature.clothEffectID = data.effectID
end,
[EquipPosCfg.Equip_Type_Super_Weapon] = function(data)
LookPlayerSuperEquip._feature.weaponID = data.ID
LookPlayerSuperEquip._feature.weaponEffectID = data.effectID
end,
[EquipPosCfg.Equip_Type_Super_Helmet] = function(data)
LookPlayerSuperEquip._feature.headID = data.ID
LookPlayerSuperEquip._feature.headEffectID = data.effectID
end,
[EquipPosCfg.Equip_Type_Super_Cap] = function(data)
LookPlayerSuperEquip._feature.capID = data.ID
LookPlayerSuperEquip._feature.capEffectID = data.effectID
end,
[EquipPosCfg.Equip_Type_Super_Shield] = function(data)
LookPlayerSuperEquip._feature.shieldID = data.ID
LookPlayerSuperEquip._feature.shieldEffectID = data.effectID
end,
[EquipPosCfg.Equip_Type_Super_Veil] = function(data)
LookPlayerSuperEquip._feature.veilID = data.ID
LookPlayerSuperEquip._feature.veilEffectID = data.effectID
end
}
local SetFeature = function(pos, data)
if Typefunc[pos] then Typefunc[pos](data) end
end
local EquipPosSet = { 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 43, 45 }
-- 斗笠和头盔是否在相同的位置
LookPlayerSuperEquip._SamePos = true
-- 装备数据类型
local EDType = GUIDefine.EquipDataType.OTHER_EQUIP
local isPC = SL:GetValue("IS_PC_OPER_MODE")
function LookPlayerSuperEquip.main()
local parent = GUI:GetLayerOpenParam()
GUI:SetLayerOpenParam(nil)
GUI:LoadExport(parent, isPC and "player_look/player_super_equip_node_win32" or "player_look/player_super_equip_node")
LookPlayerSuperEquip._ui = GUI:ui_delegate(parent)
if not LookPlayerSuperEquip._ui then
return false
end
GUI:RefPosByParent(parent)
LookPlayerSuperEquip._EquipPosSet = EquipPosSet
-- 发型
LookPlayerSuperEquip._hairID = GUIFunction:GetRoleHair(GUIDefine.RoleUIType.PLAYER_OTHER)
-- 性别
LookPlayerSuperEquip._sex = GUIFunction:GetRoleSex(GUIDefine.RoleUIType.PLAYER_OTHER)
-- 额外装备位
LookPlayerSuperEquip.InitEquipCells()
-- 初始化装备框装备
LookPlayerSuperEquip.InitEquipLayer()
-- 初始化装备事件
LookPlayerSuperEquip.InitEquipLayerEvent()
LookPlayerSuperEquip.UpdateModelFeatureData()
-- 初始化装备内观
LookPlayerSuperEquip.CreateUIModel()
-- 自定义组件挂接
SL:AttachTXTSUI({ root = LookPlayerSuperEquip._ui["EquipUI"], index = SLDefine.SUIComponentTable.PlayerSuperEquipO })
SL:AttachTXTSUI({ root = LookPlayerSuperEquip._ui["BG"], index = SLDefine.SUIComponentTable.PlayerSuperEquipBO })
--* 自定义按钮组件
GUI:setVisible(LookPlayerSuperEquip._ui.Shenshou_node, false)
GUI:setVisible(LookPlayerSuperEquip._ui.equip_node, true)
GUI:addOnClickEvent(LookPlayerSuperEquip._ui.Equip_Btn, function()
GUI:setVisible(LookPlayerSuperEquip._ui.Shenshou_node, false)
GUI:setVisible(LookPlayerSuperEquip._ui.equip_node, true)
end)
GUI:addOnClickEvent(LookPlayerSuperEquip._ui.ShenShou_Btn, function()
GUI:setVisible(LookPlayerSuperEquip._ui.Shenshou_node, true)
GUI:setVisible(LookPlayerSuperEquip._ui.equip_node, false)
LookPlayerSuperEquip.id = 75
LookPlayerSuperEquip.shenshou(PlayerSuperEquip)
end)
end
---* 神兽界面
function LookPlayerSuperEquip:shenshou()
LookPlayerSuperEquip.id = LookPlayerSuperEquip.id or 75
local cfg = ShenShouCuiTiOBJ.cfg.att[LookPlayerSuperEquip.id - 74]
if GUI:Win_IsNotNull(LookPlayerSuperEquip._ui.shenhou_effect) then
GUI:removeFromParent(LookPlayerSuperEquip._ui.shenhou_effect)
end
local current_look_item_data
for i = 75, 78, 1 do
local equipData = SL:Get_L_M_EQUIP_DATA(i)
if equipData then
local parent = LookPlayerSuperEquip._ui[string.format("ItemShow_%d", i)]
hk.reloadItemShow(parent, equipData.index, 1, equipData)
GUI:ItemShow_addDoubleEvent(parent, function()
LookPlayerSuperEquip.id = i
LookPlayerSuperEquip:shenshou()
end)
end
if LookPlayerSuperEquip.id == i then
current_look_item_data = equipData
LookPlayerSuperEquip._ui.shenhou_effect = GUI:Effect_Create(
LookPlayerSuperEquip._ui[string.format("equip_bg_%d", i)], "shenhou_effect", 32,
8, 0, 5111, 0, 0, 0, 1)
GUI:setScale(LookPlayerSuperEquip._ui.shenhou_effect, 1.1)
end
end
--* 神兽特效
if GUI:Win_IsNotNull(LookPlayerSuperEquip._ui.Shenshou_effect) then
GUI:removeFromParent(LookPlayerSuperEquip._ui.Shenshou_effect)
end
LookPlayerSuperEquip._ui.Shenshou_effect = GUI:Effect_Create(LookPlayerSuperEquip._ui.Effect_Node, "Shenshou_effect",
cfg.effectpos[1],
cfg.effectpos[2], 0, cfg.effectid, 0, 0, 0, 1)
local item_name = SL:Get_ITEM_NAME(current_look_item_data.Index)
local level = tonumber(SL:Split(item_name, ".")[2])
if level < 1 then
GUI:setGrey(LookPlayerSuperEquip._ui.Shenshou_effect, true)
end
GUI:Image_loadTexture(LookPlayerSuperEquip._ui.Shenshou_name,
string.format("res/custom/35/%d.png", LookPlayerSuperEquip.id - 74))
GUI:TextAtlas_setString(LookPlayerSuperEquip._ui.TextAtlas_1, level)
end
-- 剑甲分离
function LookPlayerSuperEquip.InitJJSplit()
for pos, show in pairs(GUIDefine.EquipAllShow) do
local p1 = LookPlayerSuperEquip.GetEquipPosExPanel(pos)
local p2 = LookPlayerSuperEquip.GetEquipPosPanel(pos)
if p1 and p2 then
if show then
GUI:setVisible(p1, false)
GUI:setVisible(p2, true)
else
GUI:setVisible(p1, true)
GUI:setVisible(p2, false)
end
end
end
end
-- 初始化装备框装备
function LookPlayerSuperEquip.InitEquipLayer()
local equipPosData = GUIFunction:GetEquipPosData(EDType)
for pos, MakeIndex in pairs(equipPosData) do
local itemNode = LookPlayerSuperEquip.GetEquipPosNode(pos)
if itemNode then
GUI:removeAllChildren(itemNode)
end
local isShowAll = LookPlayerSuperEquip.IsShowAll(pos)
local isNaikan = LookPlayerSuperEquip.IsNaikan(pos)
if itemNode and (not isNaikan or isShowAll) then
-- 加载外观
local equipData = GUIFunction:GetEquipDataByMakeIndex(MakeIndex, EDType)
if equipData then
LookPlayerSuperEquip.CreateEquipItem(itemNode, equipData)
end
end
end
end
-- 创建装备item
function LookPlayerSuperEquip.CreateEquipItem(parent, data)
local info = {}
info.showModelEffect = not LookPlayerSuperEquip.IsShowAll(data.Where)
info.from = GUIDefine.ItemFrom.PLAYER_EQUIP
info.itemData = data
info.index = data.Index
info.lookPlayer = true
info.noMouseTips = true -- 此处不在注册鼠标经过事件
local itemShow = GUI:ItemShow_Create(parent, "item", 0, 0, info)
GUI:setAnchorPoint(itemShow, 0.5, 0.5)
return itemShow
end
function LookPlayerSuperEquip.OnClickEvent(widget, pos)
if GUI:Win_IsNull(widget) then
return false
end
if widget._movingState then
return false
end
LookPlayerSuperEquip.OnOpenItemTips(widget, pos)
end
-- 初始化点击(包含鼠标)事件
function LookPlayerSuperEquip.InitEquipLayerEvent()
for _, pos in ipairs(LookPlayerSuperEquip._EquipPosSet) do
local widget = LookPlayerSuperEquip.GetEquipPosPanel(pos)
if type(GUIDefine.EquipAllShow[pos]) == "boolean" then
widget = GUIDefine.EquipAllShow[pos] and LookPlayerSuperEquip.GetEquipPosPanel(pos) or
LookPlayerSuperEquip.GetEquipPosExPanel(pos)
end
if widget and GUI:getVisible(widget) then
GUI:setTouchEnabled(widget, true)
GUI:addOnTouchEvent(widget, function() LookPlayerSuperEquip.OnClickEvent(widget, pos) end)
if isPC then
GUIFunction:InitItemTipsScrollEvent(widget, "LookPlayerSuperEquip")
GUIFunction:InitMouseMoveToEquipEvent(widget, pos, LookPlayerSuperEquip.OnOpenItemTips)
end
end
end
LookPlayerSuperEquip.SetSamePosEquip()
end
function LookPlayerSuperEquip.SetSamePosEquip()
-- 相同部位存在显示一个
if not LookPlayerSuperEquip._SamePos then
return false
end
for belongPos, v in pairs(GUIDefine.EquipPosMappingEx or {}) do
for k, pos in ipairs(v) do
local equipPanel = LookPlayerSuperEquip.GetEquipPosPanel(pos)
if equipPanel then
if GUIFunction:GetEquipDataByPos(pos, nil, EDType) then
GUI:setVisible(equipPanel, true)
GUI:setTouchEnabled(equipPanel, true)
else
GUI:setVisible(equipPanel, false)
end
end
end
end
end
-----------------------------------------------------------------------------------------------------------------
-- 装备位置框
function LookPlayerSuperEquip.GetEquipPosPanel(pos)
return LookPlayerSuperEquip._ui["Panel_pos" .. pos]
end
function LookPlayerSuperEquip.GetEquipPosExPanel(pos)
return LookPlayerSuperEquip._ui["Panel_posEx" .. pos]
end
-- 装备位置节点
function LookPlayerSuperEquip.GetEquipPosNode(pos)
return LookPlayerSuperEquip._ui["Node_" .. pos]
end
-- 该部位是否展示内观
function LookPlayerSuperEquip.IsNaikan(pos)
return GUIDefine.IsNaikanEquip(pos)
end
-- 是否显示内观和装备框
function LookPlayerSuperEquip.IsShowAll(pos)
return GUIDefine.EquipAllShow and GUIDefine.EquipAllShow[pos]
end
-----------------------------------------------------------------------------------------------------------------
function LookPlayerSuperEquip.GetLooks(pos)
-- 通过唯一ID MakeIndex 获取装备数据
local equipData = GUIFunction:GetEquipDataByPos(pos, nil, EDType)
if not equipData then
return {}
end
-- 是否是内观
local isNaikan = LookPlayerSuperEquip.IsNaikan(pos)
if not isNaikan then
return {}
end
local data = {}
-- 通过唯一ID MakeIndex 获取装备数据
if pos == EquipPosCfg.Equip_Type_Super_Dress and equipData and LookPlayerSuperEquip._feature.showNodeModel and equipData.zblmtkz and tonumber(equipData.zblmtkz) == 1 then -- zblmtkz == 1 不显示裸模, 表配置字段
LookPlayerSuperEquip._feature.showNodeModel = false
LookPlayerSuperEquip._feature.showHair = false
end
if equipData then
data.ID = equipData.Looks
data.effectID = equipData.sEffect
end
return data
end
-- 更新装备内观数据
function LookPlayerSuperEquip.UpdateModelFeatureData()
LookPlayerSuperEquip._feature = {
clothID = nil, -- 衣服
clothEffectID = nil,
weaponID = nil, -- 武器
weaponEffectID = nil,
headID = nil, -- 头盔
headEffectID = nil,
hairID = nil, -- 头发
capID = nil, -- 斗笠
capEffectID = nil,
veilID = nil, -- 面纱
veilEffectID = nil,
shieldID = nil, -- 盾牌
shieldEffectID = nil,
wingsID = nil, -- 翅膀
showNodeModel = true, -- 裸模
showHair = true -- 头发
}
LookPlayerSuperEquip._feature.showNodeModel = tonumber(SL:GetValue("GAME_DATA", "Fashionfx") or 0) ~= 1
LookPlayerSuperEquip._feature.showHair = LookPlayerSuperEquip._feature.showNodeModel
SetFeature(EquipPosCfg.Equip_Type_Super_Dress, LookPlayerSuperEquip.GetLooks(EquipPosCfg.Equip_Type_Super_Dress))
SetFeature(EquipPosCfg.Equip_Type_Super_Helmet, LookPlayerSuperEquip.GetLooks(EquipPosCfg.Equip_Type_Super_Helmet))
SetFeature(EquipPosCfg.Equip_Type_Super_Weapon, LookPlayerSuperEquip.GetLooks(EquipPosCfg.Equip_Type_Super_Weapon))
SetFeature(EquipPosCfg.Equip_Type_Super_Cap, LookPlayerSuperEquip.GetLooks(EquipPosCfg.Equip_Type_Super_Cap))
SetFeature(EquipPosCfg.Equip_Type_Super_Shield, LookPlayerSuperEquip.GetLooks(EquipPosCfg.Equip_Type_Super_Shield))
SetFeature(EquipPosCfg.Equip_Type_Super_Veil, LookPlayerSuperEquip.GetLooks(EquipPosCfg.Equip_Type_Super_Veil))
LookPlayerSuperEquip._feature.hairID = LookPlayerSuperEquip._hairID
end
-- 额外的装备位置
function LookPlayerSuperEquip.InitEquipCells()
-- 服务器开关 时装是否开启首饰
local openFEquip = SL:GetValue("SERVER_OPTION", SW_KEY_OPEN_F_EQUIP)
if openFEquip and openFEquip == 0 then
table.insert(LookPlayerSuperEquip._EquipPosSet, 42)
table.insert(LookPlayerSuperEquip._EquipPosSet, 44)
for i, pos in ipairs(LookPlayerSuperEquip._EquipPosSet) do
local equipPanel = LookPlayerSuperEquip._ui["Panel_pos" .. pos]
if equipPanel then
GUI:setVisible(equipPanel, false)
end
end
LookPlayerSuperEquip._EquipPosSet = { 17, 18 }
else
-- 额外的装备位置 1是6格 0是4格
local showExtra = SL:GetValue("SERVER_OPTION", SW_KEY_EQUIP_EXTRA_POS) == 1
if showExtra then
table.insert(LookPlayerSuperEquip._EquipPosSet, 42)
table.insert(LookPlayerSuperEquip._EquipPosSet, 44)
else
GUI:setVisible(LookPlayerSuperEquip._ui["Panel_pos42"], false)
GUI:setVisible(LookPlayerSuperEquip._ui["Panel_pos44"], false)
end
end
LookPlayerSuperEquip.InitJJSplit()
if SL:GetValue("GAME_DATA", "isSeparateSuperHelmetAndCap") == 1 then
LookPlayerSuperEquip._SamePos = false
else
LookPlayerSuperEquip._SamePos = true
end
end
-- 装备为内观且使用相同位置时显示同部位多件装备tips否则显示单件
function LookPlayerSuperEquip.OnOpenItemTips(widget, pos)
if GUI:Win_IsNull(widget) then
return false
end
local itemData = (LookPlayerSuperEquip.IsNaikan(pos) and LookPlayerSuperEquip._SamePos) and
GUIFunction:GetEquipDataListByPos(pos, EDType) or { GUIFunction:GetEquipDataByPos(pos, nil, EDType) }
if not (itemData and next(itemData)) then
return false
end
local data = {}
data.itemData = itemData[1]
data.pos = GUI:getWorldPosition(widget)
if #itemData == 2 then
data.itemData = itemData[2]
data.itemData2 = itemData[1]
elseif #itemData == 3 then
data.itemData = itemData[3]
data.itemData2 = itemData[2]
data.itemData3 = itemData[1]
end
data.lookPlayer = true
data.from = GUIDefine.ItemFrom.PLAYER_EQUIP
UIOperator:OpenItemTips(data)
end
-- 界面关闭回调
function LookPlayerSuperEquip.OnClose()
-- 自定义组件卸载
SL:UnAttachTXTSUI({
index = SLDefine.SUIComponentTable.PlayerSuperEquipO
})
SL:UnAttachTXTSUI({
index = SLDefine.SUIComponentTable.PlayerSuperEquipBO
})
end
function LookPlayerSuperEquip.CreateUIModel()
local NodeModel = LookPlayerSuperEquip._ui["Node_playerModel"]
GUI:removeAllChildren(NodeModel)
GUI:UIModel_Create(NodeModel, "Model", 0, 0, LookPlayerSuperEquip._sex, LookPlayerSuperEquip._feature, nil, true,
SL:GetValue("L.M.JOB"))
end
LookPlayerSuperEquip.main()