bayuMIR/client/dev/GUILayout/main/MainProperty_win32.lua
2026-06-18 01:11:06 +08:00

2349 lines
88 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.

MainProperty = {}
MainProperty._path = "res/private/main-win32/"
-- 斗转星移技能ID
local DZXY_SkillID = 118
-- 醉酒相关是否显示
local ON_OFF_zuijiu = false
local DROP_TOTAL_TYPE_ID = 99
local FAKE_DROP_TYPE_ID = 77
local PCShowSelectChannels = SL:GetValue("GAME_DATA", "PCShowSelectChannels")
local CHANNEL = GUIDefine.ChatChannel
-- 对应选择频道名
local CHANNEL_NAME = {
[CHANNEL.SHOUT] = "喊 话",
[CHANNEL.GUILD] = "行 会",
[CHANNEL.TEAM] = "组 队",
[CHANNEL.NEAR] = "附 近",
[CHANNEL.WORLD] = "世 界",
[CHANNEL.NATION] = "国 家",
[CHANNEL.UNION] = "联 盟",
[CHANNEL.CROSS] = "跨 服",
}
local PKType = GUIDefine.PKModeType
MainProperty._showPKTab = { PKType.HAM_ALL, PKType.HAM_PEACE, PKType.HAM_GROUP, PKType.HAM_GUILD, PKType
.HAM_SHANE, PKType.HAM_NATION, PKType.HAM_CAMP }
MainProperty._pkModeStrList = {
[PKType.HAM_ALL] = "[全体攻击模式]",
[PKType.HAM_PEACE] = "[和平攻击模式]",
[PKType.HAM_GROUP] = "[编组攻击模式]",
[PKType.HAM_GUILD] = "[行会攻击模式]",
[PKType.HAM_SHANE] = "[善恶攻击模式]",
[PKType.HAM_NATION] = "[国家攻击模式]",
[PKType.HAM_CAMP] = "[阵营攻击模式]",
[PKType.HAM_SERVER] = "[区服攻击模式]"
}
MainProperty._channelBtnTipList = {
[0] = { "综合", CHANNEL.COMMON },
[1] = { "系统", CHANNEL.SYSTEM },
[2] = { "喊话", CHANNEL.SHOUT },
[3] = { "私聊", CHANNEL.PRIVATE },
[4] = { "行会", CHANNEL.GUILD },
[5] = { "组队", CHANNEL.TEAM },
[6] = { "附近", CHANNEL.NEAR },
[7] = { "世界", CHANNEL.WORLD },
[8] = { "国家", CHANNEL.NATION }
}
local DarkState = GUIDefine.DarkState or {}
MainProperty._darkImgList = {
[DarkState.DAYTIME or 0] = "00000044.png", -- 白天
[DarkState.NIGHT or 1] = "00000046.png", -- 晚上
[DarkState.SUNRISE or 2] = "00000045.png", -- 日出
[DarkState.EVENING or 3] = "00000047.png" -- 傍晚
}
MainProperty._mhpPrefixList = { "hp_", "mp_", "fhp_" }
MainProperty._mhpTagList = { "HPSFX", "MPSFX", "FHPSFX" }
MainProperty._quitTimeTips = {
[1] = "<outline size='1'><font color = '#00ff00'>%s秒后将返回选角界面</font></outline>",
[2] = "<outline size='1'><font color = '#ff0000'>%s秒后将退出游戏</font></outline>",
}
local reinAddIcons = { "1900011003.png", "1900011007.png" }
local comboShowIcons = { "01121.png", "01122.png" }
MainProperty._ChatItemWidth = 500
function MainProperty.Init()
MainProperty._bubbleTipsDatas = {} -- 气泡数据
MainProperty._bubbleTipsCells = {}
MainProperty._quickUseCells = {}
MainProperty._chatCellCache = {}
MainProperty._isScrolling = false
MainProperty._pSize = {}
MainProperty._drawHWay = {} -- 绘制方式
MainProperty._dropTypeList = {}
MainProperty._dropTypeCells = {}
MainProperty._inputIndex = 0
MainProperty._inputCache = {}
MainProperty._channelCells = {}
MainProperty._channelSelect = nil
MainProperty._exCellHei = 12
-- 聊天间隔
local values = GUIDefineEx.ChatContentInterval
MainProperty._listInterval, MainProperty._richVspace = values.listInterval, values.richVspace or 0
MainProperty._NGShow = tonumber(SL:GetValue("GAME_DATA", "OpenNGUI")) == 1 and
SL:GetValue("IS_LEARNED_INTERNAL")
MainProperty._angerHei = GUI:getContentSize(MainProperty._ui["Panel_loadBar"]).height
end
function MainProperty.main()
local parent = GUI:Attach_Center()
GUI:LoadExport(parent, "main/main_property_win32")
MainProperty._root = GUI:getChildByName(parent, "Main_Property")
MainProperty._ui = GUI:ui_delegate(MainProperty._root)
if not MainProperty._ui then
return false
end
MainProperty.Init()
MainProperty.InitDropData()
MainProperty.InitCustomPKMode()
MainProperty.InitHPPanel()
MainProperty.InitAutoShout()
MainProperty.InitActPanel()
MainProperty.InitChatPanel()
MainProperty.InitKeyBoardEvent()
MainProperty.InitChatInputHandler()
MainProperty.InitAutoSFXTips()
MainProperty.InitPickButton()
MainProperty.InitQuickUseShow()
-- 转生属性点分配页
GUI:addOnClickEvent(MainProperty._ui["btn_rein_add"], function()
if not GUI:GetWindow(nil, UIConst.LAYERID.ReinAttrGUI) then
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.ReinAttrPoint)
else
SL:JumpTo(SLDefine.HyperLinkID.ReinAttrPoint)
end
SL:PlayBtnClickAudio()
end
end)
-- BOSS查询
GUI:addOnClickEvent(MainProperty._ui["bossquery"], function()
ssrMessage:SubLink("BOSSqueryOBJ_main")
SL:PlayBtnClickAudio()
end)
MainProperty.OnRefreshPropertyShow()
MainProperty.OnUpdatePlayerPosition()
MainProperty.OnDarkStateChange()
MainProperty.InitAdapet()
MainProperty.InitQuickUseItems()
MainProperty.RegisterEvent()
MainProperty.TargetData = nil --电脑PC端私聊数据
GUI:RefPosByParent(MainProperty._root)
SL:AttachTXTSUI({
root = MainProperty._ui["Panel_chat_funcs"],
index = SLDefine.SUIComponentTable
.PCMainPropertyFuncs
})
end
function MainProperty.InitDropData()
local dropTotalData = {
id = DROP_TOTAL_TYPE_ID,
name = "全部",
}
table.insert(MainProperty._dropTypeList, dropTotalData)
local fakeDrop = SL:GetMetaValue("GAME_DATA", "ShowFakeDropType")
if fakeDrop and string.len(fakeDrop) > 0 then
local param = string.split(fakeDrop, "#")
if param[2] and tonumber(param[2]) == 1 and not ChatData.IsCloseFakeDrop() then
table.insert(MainProperty._dropTypeList, { id = FAKE_DROP_TYPE_ID, name = param[1] })
end
end
local data = SL:GetValue("GAME_DATA", "DropTypeShow")
if data and string.len(data) > 0 then
local list = string.split(data, "|")
for i, v in ipairs(list) do
local param1 = string.split(v, "#")
if param1[1] and tonumber(param1[1]) == 1 then
table.insert(MainProperty._dropTypeList, { id = tonumber(param1[2]), name = param1[3] })
end
end
end
end
function MainProperty.InitCustomPKMode()
local typeList = SL:GetValue("RELATION_TYPE_LIST")
if typeList and next(typeList) then
for _, modeId in ipairs(typeList) do
local config = SL:GetValue("RELATION_TYPE_CONFIG", modeId)
table.insert(MainProperty._showPKTab, modeId)
MainProperty._pkModeStrList[modeId] = string.format("[%s攻击模式]", config and config.mode_name or "")
end
end
end
function MainProperty.InitAdapet()
local screenW = SL:GetValue("SCREEN_WIDTH")
local screenH = SL:GetValue("SCREEN_HEIGHT")
GUI:setPositionX(MainProperty._root, screenW / 2)
local notAdapet = tonumber(SL:GetValue("GAME_DATA", "PCPropertyNotAdapet")) == 1
local contentWidth = GUI:getContentSize(MainProperty._ui["Panel_chat"]).width
if notAdapet then
MainProperty._ChatItemWidth = GUI:getContentSize(MainProperty._ui["ListView_chat"]).width
local sizeW = PCShowSelectChannels and GUI:getContentSize(MainProperty._ui["Button_channel"]).width or 0
local TextField_input = MainProperty._ui["TextField_input"]
GUI:setPositionX(TextField_input, 14 + sizeW)
GUI:setContentSize(TextField_input, MainProperty._ChatItemWidth - sizeW,
GUI:getContentSize(TextField_input).height)
return
end
GUI:setContentSize(MainProperty._ui["Panel_bg"], screenW, screenH)
GUI:setContentSize(MainProperty._ui["Panel_hide_drop"], screenW, screenH)
GUI:setPosition(MainProperty._ui["Panel_hp"], 0, 0)
GUI:setPosition(MainProperty._ui["Panel_act"], screenW, 0)
local hpPanelWid = GUI:getContentSize(MainProperty._ui["Panel_hp"]).width
local actPanelWid = GUI:getContentSize(MainProperty._ui["Panel_act"]).width
contentWidth = screenW - hpPanelWid - actPanelWid
local offsetX = math.floor((hpPanelWid - actPanelWid) / 2)
local Panel_chat = MainProperty._ui["Panel_chat"]
GUI:setPositionX(Panel_chat, screenW / 2 + offsetX)
GUI:setContentSize(Panel_chat, contentWidth, GUI:getContentSize(Panel_chat).height)
local Image_chat_bg = MainProperty._ui["Image_chat_bg"]
GUI:setPositionX(Image_chat_bg, contentWidth / 2)
GUI:setContentSize(Image_chat_bg, contentWidth, GUI:getContentSize(Image_chat_bg).height)
local Panel_chat_touch = MainProperty._ui["Panel_chat_touch"]
GUI:setPositionX(Panel_chat_touch, contentWidth / 2)
GUI:setContentSize(Panel_chat_touch, contentWidth, GUI:getContentSize(Panel_chat_touch).height)
local ListView_chat = MainProperty._ui["ListView_chat"]
local chatListWid = contentWidth - 28
GUI:setPositionX(ListView_chat, contentWidth / 2)
GUI:setContentSize(ListView_chat, chatListWid, GUI:getContentSize(ListView_chat).height)
local ListView_chat_ex = MainProperty._ui["ListView_chat_ex"]
GUI:setPositionX(ListView_chat_ex, contentWidth / 2)
GUI:setContentSize(ListView_chat_ex, chatListWid, GUI:getContentSize(ListView_chat_ex).height)
local sizeW = PCShowSelectChannels and GUI:getContentSize(MainProperty._ui["Button_channel"]).width or 0
local TextField_input = MainProperty._ui["TextField_input"]
GUI:setPositionX(TextField_input, 14 + sizeW)
GUI:setContentSize(TextField_input, chatListWid - sizeW, GUI:getContentSize(TextField_input).height)
GUI:setPositionX(MainProperty._ui["Panel_exit_funcs"], contentWidth - 8)
MainProperty._ChatItemWidth = chatListWid
end
function MainProperty.InitHPPanel()
local iconPaths = {
[CHANNEL.SYSTEM] = { "190001100.png", "190001101.png" }, -- 系统频道
[CHANNEL.SHOUT] = { "190001108.png", "190001109.png" }, -- 喊话
[CHANNEL.PRIVATE] = { "190001104.png", "190001105.png" }, -- 私聊
[CHANNEL.GUILD] = { "190001106.png", "190001107.png" }, -- 行会
[CHANNEL.WORLD] = { "190001102.png", "190001103.png" }, -- 世界
}
local function mainSetReceiving(channel, sender)
if not channel or not sender then
return
end
local isReceiving = ChatData.IsReceiving(channel)
ChatData.SetReceiving(channel, not isReceiving)
local path = ChatData.IsReceiving(channel) and iconPaths[channel][1] or iconPaths[channel][2]
GUI:Button_loadTextureNormal(sender, MainProperty._path .. path)
GUI:Button_loadTexturePressed(sender, MainProperty._path .. path)
SL:PlayBtnClickAudio()
end
-- 频道接收开关
-- 系统
GUI:addOnClickEvent(MainProperty._ui["Button_chat_1"], function(sender)
mainSetReceiving(CHANNEL.SYSTEM, sender)
end)
-- 世界
GUI:addOnClickEvent(MainProperty._ui["Button_chat_2"], function(sender)
mainSetReceiving(CHANNEL.WORLD, sender)
end)
-- 私聊
GUI:addOnClickEvent(MainProperty._ui["Button_chat_3"], function(sender)
mainSetReceiving(CHANNEL.PRIVATE, sender)
end)
-- 行会
GUI:addOnClickEvent(MainProperty._ui["Button_chat_4"], function(sender)
mainSetReceiving(CHANNEL.GUILD, sender)
end)
-- 喊话
GUI:addOnClickEvent(MainProperty._ui["Button_chat_5"], function(sender)
mainSetReceiving(CHANNEL.SHOUT, sender)
end)
-- 自动喊话开关
-- 鼠标移入Tips
GUI:addMouseOverTips(MainProperty._ui["Button_chat_1"], "允许所有系统信息", { x = -10, y = -20 }, { x = 1, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Button_chat_2"], "允许所有传音信息", { x = -10, y = -20 }, { x = 1, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Button_chat_3"], "允许所有私聊信息", { x = -10, y = -20 }, { x = 1, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Button_chat_4"], "允许行会聊天信息", { x = -10, y = -20 }, { x = 1, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Button_chat_5"], "允许所有喊话消息", { x = -10, y = -20 }, { x = 1, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Button_chat_6"], "特殊命令", { x = -10, y = -20 }, { x = 1, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Button_chat_7"], "自动喊话开关", { x = -10, y = -20 }, { x = 1, y = 0.5 })
if tonumber(SL:GetValue("GAME_DATA", "OpenNGUI")) == 1 then
GUI:addMouseOverTips(MainProperty._ui["Panel_dz"], function()
local curDZValue = SL:GetValue("CUR_ABIL_BY_ID", GUIDefine.AttTypeTable.Internal_DZValue) or 0
local maxDZValue = SL:GetValue("MAX_ABIL_BY_ID", GUIDefine.AttTypeTable.Internal_DZValue) or 0
return string.format("斗转星移值: %s/%s", curDZValue, maxDZValue)
end, { x = 0, y = 0 }, { x = 0.5, y = 0.5 })
GUI:addMouseOverTips(MainProperty._ui["Panel_zj"], string.format("醉酒值: %s%%", 0), { x = 0, y = 0 },
{ x = 0.5, y = 0.5 })
end
MainProperty.InitNGShow()
end
function MainProperty.InitAutoShout()
local btnAutoShout = MainProperty._ui["Button_chat_7"]
if not btnAutoShout then
return false
end
local function checkInputContent(inputStr)
local channel = CHANNEL.SHOUT
SL:RequestCheckSensitiveWord(inputStr, 2, function(state, str, risk_param, ex_param)
-- 检测,不通过
if not state then
SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
return
end
if risk_param and risk_param ~= 0 then
SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
return
end
if ex_param then
if ex_param.status and ex_param.status ~= 0 then
SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
return
end
end
ChatData.SetAutoShoutSwitch(not ChatData.GetAutoShoutSwitch())
-- 记录自动喊话内容
ChatData.SetLocalChatDataByChannel(channel, inputStr or "")
-- 发送提示
local isOpen = ChatData.GetAutoShoutSwitch()
local msg = isOpen and "启动了自动喊话功能,聊天框中内容已记录为喊话内容" or "关闭了自动喊话功能"
SL:ShowSystemChat(msg, 0, 255)
SL:PlayBtnClickAudio()
MainProperty.OnRefreshAutoShout()
end, { channel_id = channel })
end
GUI:addOnClickEvent(btnAutoShout, function(sender)
local input = GUI:Text_getString(MainProperty._ui["TextField_input"])
checkInputContent(input)
end)
MainProperty.OnRefreshAutoShout()
end
function MainProperty.OnRefreshAutoShout()
local btnAutoShout = MainProperty._ui["Button_chat_7"]
if not btnAutoShout then
return false
end
local isAutoShout = ChatData.GetAutoShoutSwitch()
local picPath = string.format("%s/%s", MainProperty._path, isAutoShout and "190001112.png" or "190001113.png")
GUI:Button_loadTextureNormal(btnAutoShout, picPath)
GUI:Button_loadTexturePressed(btnAutoShout, picPath)
if not isAutoShout then
return GUI:stopActionByTag(btnAutoShout, 888)
end
local shoutInput = ChatData.GetLocalChatDataByChannel(CHANNEL.SHOUT)
if not shoutInput or shoutInput == "" then
return false
end
-- 自动喊话开关
local function sendAutoShoutMsg(input, channel)
if not channel or not GUIFunction:CheckAbleToSayByChannel(channel) then
return
end
local sendData = {
textType = GUIDefine.ChatTextType.NORMAL,
msg = input,
channel = channel,
risk = 0,
oriMsg =
input,
status = 0
}
GUIFunction:SendChatMsg(sendData)
end
local autoShoutCallback = function(shoutInput)
GUI:stopActionByTag(btnAutoShout, 888)
if not shoutInput or shoutInput == "" then
return false
end
if not ChatData.GetAutoShoutSwitch() then
return false
end
local action = SL:schedule(btnAutoShout, function()
-- 发送
sendAutoShoutMsg(shoutInput, CHANNEL.SHOUT)
end, ChatData.GetAutoShoutDelay())
GUI:setTag(action, 888)
sendAutoShoutMsg(shoutInput, CHANNEL.SHOUT)
end
autoShoutCallback(shoutInput)
end
function MainProperty.InitNGShow()
if SL:GetValue("GAME_DATA", "OpenNGUI") ~= 1 then
return
end
MainProperty.OnRefreshDZShow()
GUI:setVisible(MainProperty._ui["Panel_zj"], ON_OFF_zuijiu)
GUI:setVisible(MainProperty._ui["Panel_ng_show"], MainProperty._NGShow)
if MainProperty._NGShow then
local pSize = GUI:getContentSize(MainProperty._ui["Panel_loadBar"])
local curHeiPer = pSize.height / MainProperty._angerHei
MainProperty._angerHei = 136
GUI:setContentSize(MainProperty._ui["Image_laodBarbg"],
GUI:getContentSize(MainProperty._ui["Image_laodBarbg"]).width, MainProperty._angerHei)
GUI:setContentSize(MainProperty._ui["Panel_loadBar"], pSize.width, math.floor(MainProperty._angerHei * curHeiPer))
GUI:setContentSize(MainProperty._ui["Image_loadbar1"],
GUI:getContentSize(MainProperty._ui["Image_loadbar1"]).width, MainProperty._angerHei)
GUI:setContentSize(MainProperty._ui["Image_loadbar2"],
GUI:getContentSize(MainProperty._ui["Image_loadbar2"]).width, MainProperty._angerHei)
end
end
function MainProperty.InitActPanel()
-- 英雄相关
if SL:GetValue("USEHERO") then
GUI:setVisible(MainProperty._ui["Image_loadbar2"], false)
MainProperty.RefAnger(0)
GUI:delayTouchEnabled(MainProperty._ui["Button_herostate"], 0.5)
GUI:addOnClickEvent(MainProperty._ui["Button_herostate"], function(sender)
GUI:delayTouchEnabled(sender)
SL:RequestCallOrOutHero()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_herostate"], "召唤英雄", { x = -20, y = 0 }, { x = 0.5, y = 0.5 })
GUI:addOnClickEvent(MainProperty._ui["Button_heroinfo"], function()
if SL:GetValue("HERO_IS_ALIVE") then
-- 打开英雄角色面板
if HeroFrame and GUI:GetWindow(nil, UIConst.LAYERID.HeroMainGUI) then
UIOperator:CloseMyHeroUI()
else
UIOperator:OpenMyHeroUI()
end
end
end)
GUI:addMouseOverTips(MainProperty._ui["Button_heroinfo"], "英雄状态", { x = 0, y = 0 }, { x = 0.5, y = 0.5 })
GUI:delayTouchEnabled(MainProperty._ui["Button_herobag"], 0.5)
GUI:addOnClickEvent(MainProperty._ui["Button_herobag"], function()
if SL:GetValue("HERO_IS_ALIVE") then
-- 打开英雄背包
if HeroBag and GUI:GetWindow(nil, UIConst.LAYERID.HeroBagLayerGUI) then
UIOperator:CloseHeroBagUI()
else
UIOperator:OpenHeroBagUI()
end
end
end)
GUI:addMouseOverTips(MainProperty._ui["Button_herobag"], "英雄包裹", { x = 20, y = 0 }, { x = 0.5, y = 0.5 })
else
GUI:setVisible(MainProperty._ui["Image_laodBarbg"], false)
GUI:setVisible(MainProperty._ui["Button_herostate"], false)
GUI:setVisible(MainProperty._ui["Button_heroinfo"], false)
GUI:setVisible(MainProperty._ui["Button_herobag"], false)
GUI:setPositionY(MainProperty._ui["Text_pkmode"], GUI:getPositionY(MainProperty._ui["Text_pkmode"]) + 10)
end
-- 功能按钮
-- 角色
GUI:addOnClickEvent(MainProperty._ui["Button_role"], function()
local isOpen = (PlayerFrame and PlayerFrame.IsReOpen) and PlayerFrame:IsReOpen(UIConst.LayerTable.PlayerEquip)
if isOpen and GUI:GetWindow(nil, UIConst.LAYERID.PlayerMainGUI) then
UIOperator:CloseMyPlayerUI()
else
UIOperator:OpenMyPlayerUI({ page = UIConst.LayerTable.PlayerEquip })
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_role"], "状态信息(F10)", { x = 0, y = 0 }, { x = 0.7, y = 0.5 })
-- 背包
GUI:addOnClickEvent(MainProperty._ui["Button_bag"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.Bag)
else
SL:JumpTo(SLDefine.HyperLinkID.Bag)
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_bag"], "包裹物品(F9)", { x = 0, y = 0 }, { x = 0.7, y = 0.5 })
-- 技能
GUI:addOnClickEvent(MainProperty._ui["Button_skill"], function()
local isOpen = (PlayerFrame and PlayerFrame.IsReOpen) and PlayerFrame:IsReOpen(UIConst.LayerTable.PlayerSkill)
if isOpen and GUI:GetWindow(nil, UIConst.LAYERID.PlayerMainGUI) then
UIOperator:CloseMyPlayerUI()
else
UIOperator:OpenMyPlayerUI({ page = UIConst.LayerTable.PlayerSkill })
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_skill"], "技能信息(F11)", { x = 0, y = 0 }, { x = 0.7, y = 0.5 })
-- 音效
GUI:addOnClickEvent(MainProperty._ui["Button_voice"], function()
local value27 = SL:GetValue("SETTING_ENABLED", SLDefine.SETTINGID.SETTING_IDX_BGMUSIC) or 0
local value52 = SL:GetValue("SETTING_ENABLED", SLDefine.SETTINGID.SETTING_IDX_EFFECTMUSIC) or 0
local enable = value27 > 0 and value52 > 0
SL:SetValue("SETTING_VALUE", SLDefine.SETTINGID.SETTING_IDX_BGMUSIC, { enable and 0 or 100 })
SL:SetValue("SETTING_VALUE", SLDefine.SETTINGID.SETTING_IDX_EFFECTMUSIC, { enable and 0 or 100 })
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_voice"], "音效开关", { x = 0, y = 0 }, { x = 0.7, y = 0.5 })
-- 商店
GUI:addOnClickEvent(MainProperty._ui["Button_store"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.StoreHot)
else
SL:JumpTo(SLDefine.HyperLinkID.StoreHot)
end
SL:PlayBtnClickAudio()
end)
-- pk模式切换
local function changePKMode()
GUI:delayTouchEnabled(MainProperty._ui["Text_pkmode"])
local canMode = {}
for _, v in ipairs(MainProperty._showPKTab) do
if SL:GetValue("PKMODE_CAN_USE", v) then
table.insert(canMode, v)
end
end
local function getPKModeIndex(pkm)
for k, v in ipairs(canMode) do
if pkm == v then
return k
end
end
return 1
end
local curPKMode = SL:GetValue("PKMODE")
local index = getPKModeIndex(curPKMode)
local nextPKMode = canMode[(index >= #canMode and 1 or index + 1)]
SL:RequestChangePKMode(nextPKMode)
end
GUI:addOnClickEvent(MainProperty._ui["Text_pkmode"], changePKMode)
GUI:addMouseOverTips(MainProperty._ui["Text_pkmode"], "点击切换", { x = 0, y = 0 }, { x = 0.7, y = 0.5 })
-- 时钟
local function callback()
local date = os.date("*t", SL:GetValue("SERVER_TIME"))
GUI:Text_setString(MainProperty._ui["Text_time"], string.format("%02d:%02d:%02d", date.hour, date.min, date.sec))
end
local timeID = SL:Schedule(callback, 1)
callback()
-- FPS 帧率
local sumFps = 0
local count = 0
SL:Schedule(
function()
sumFps = sumFps + SL:GetValue("FPS")
count = count + 1
end,
0
)
SL:Schedule(
function()
local fps = math.min(math.ceil(sumFps / count), 60)
GUI:Text_setString(MainProperty._ui["Text_FPS"], string.format("FPS:%s", fps))
sumFps = 0
count = 0
end,
0.5
)
GUI:addMouseOverTips(
MainProperty._ui["Text_level"],
function()
return string.format("当前等级:%s", SL:GetValue("LEVEL"))
end,
{ x = 0, y = -20 },
{ x = 0.1, y = 0.5 }
)
GUI:addMouseOverTips(
MainProperty._ui["LoadingBar_exp"],
function()
local curExp = SL:GetValue("EXP")
local maxExp = math.max(SL:GetValue("MAXEXP"), 1)
local per = math.min(curExp / maxExp * 100, 100)
return string.format("当前经验:%.2f%%", per)
end,
{ x = 0, y = 0 },
{ x = 0.3, y = 0.5 }
)
GUI:addMouseOverTips(
MainProperty._ui["LoadingBar_weight"],
function()
local curWeight = SL:GetValue("BW")
local maxWeight = SL:GetValue("MAXBW")
return string.format("包裹负重:%s/%s", curWeight, maxWeight)
end,
{ x = 0, y = 0 },
{ x = 0.3, y = 0.5 }
)
end
-- 监听聊天输入框
function MainProperty.InitChatInputHandler()
local TextField_input = MainProperty._ui["TextField_input"]
TextField_input._lastInput = ""
local touchEvent = function(sender, eventype)
if eventype == 2 then
GUI:TextInput_touchDownAction(TextField_input, 2)
end
end
GUI:addOnTouchEvent(TextField_input, touchEvent)
local inputEvent = function(sender, eventType)
if eventType == GUIDefine.TextInputEventType.SEND then
if string.len(GUI:Text_getString(MainProperty._ui["TextField_input"])) > 0 then
MainProperty.SendChatMsg()
end
elseif eventType == GUIDefine.TextInputEventType.BEGAN or eventType == GUIDefine.TextInputEventType.CHANGE then
local str = GUI:Text_getString(sender)
local target = ChatData.GetTargets()[1]
if sender._lastInput == "" and str == "/" and target then
MainProperty.OnPrivateChatWithTarget(target)
end
sender._lastInput = str
end
end
GUI:TextInput_addOnEvent(TextField_input, inputEvent)
end
function MainProperty.InitKeyBoardEvent()
GUI:addKeyboardEvent({ "KEY_SHIFT", "KEY_1" }, function()
GUI:Text_setString(MainProperty._ui["TextField_input"], "!")
GUI:TextInput_touchDownAction(MainProperty._ui["TextField_input"], 2)
end)
GUI:addKeyboardEvent({ "KEY_SHIFT", "KEY_2" }, function()
GUI:Text_setString(MainProperty._ui["TextField_input"], "@")
GUI:TextInput_touchDownAction(MainProperty._ui["TextField_input"], 2)
end)
GUI:addKeyboardEvent({ "KEY_SHIFT", "KEY_3" }, function()
GUI:Text_setString(MainProperty._ui["TextField_input"], "#")
GUI:TextInput_touchDownAction(MainProperty._ui["TextField_input"], 2)
end)
GUI:addKeyboardEvent("KEY_SLASH", function()
GUI:Text_setString(MainProperty._ui["TextField_input"], "/")
GUI:TextInput_touchDownAction(MainProperty._ui["TextField_input"], 2)
end)
-- control ↑
local function callback()
MainProperty._inputIndex = MainProperty._inputIndex > 1 and MainProperty._inputIndex - 1 or
MainProperty._inputIndex
local input = MainProperty._inputCache[MainProperty._inputIndex]
if not input then
return false
end
GUI:Text_setString(MainProperty._ui["TextField_input"], input)
end
GUI:addKeyboardEvent({ "KEY_CTRL", "KEY_UP_ARROW" }, callback)
GUI:addKeyboardEvent({ "KEY_RIGHT_CTRL", "KEY_UP_ARROW" }, callback)
-- control ↓
local function callback()
MainProperty._inputIndex = MainProperty._inputIndex < #MainProperty._inputCache and MainProperty._inputIndex + 1 or
MainProperty._inputIndex
local input = MainProperty._inputCache[MainProperty._inputIndex]
if not input then
return false
end
GUI:Text_setString(MainProperty._ui["TextField_input"], input)
end
GUI:addKeyboardEvent({ "KEY_CTRL", "KEY_DOWN_ARROW" }, callback)
GUI:addKeyboardEvent({ "KEY_RIGHT_CTRL", "KEY_DOWN_ARROW" }, callback)
end
----------------------------- 聊天相关 -------------------------------------------------------
-- 聊天框的宽
function MainProperty.GetChatWidth()
return MainProperty._ChatItemWidth
end
function MainProperty.InitChatPanel()
if MainProperty._listInterval then
GUI:ListView_setItemsMargin(MainProperty._ui["ListView_chat"], MainProperty._listInterval)
GUI:ListView_setItemsMargin(MainProperty._ui["ListView_chat_ex"], MainProperty._listInterval)
end
-- 拖动
local function listCallback(sender, eventType)
if eventType == 9 or eventType == 10 then
local innerPos = GUI:ListView_getInnerContainerPosition(MainProperty._ui["ListView_chat"])
if innerPos.y == 0 and MainProperty._isScrolling then
MainProperty._isScrolling = false
MainProperty.ShowChatCache()
end
end
end
GUI:ListView_addOnScrollEvent(MainProperty._ui["ListView_chat"], listCallback)
GUI:ListView_addMouseScrollPercent(MainProperty._ui["ListView_chat"])
-- 频道切换开关开启
local isOpen = SL:GetValue("GAME_DATA", "PCSwitchChannelShow") and
SL:GetValue("GAME_DATA", "PCSwitchChannelShow") == 1
GUI:setVisible(MainProperty._ui["Panel_channel"], isOpen)
local receiveChannel = ChatData.GetReceiveChannel()
for i = 0, 8 do
local btnChannel = MainProperty._ui["Button_channel_" .. i]
if btnChannel then
local channel = MainProperty._channelBtnTipList[i][2]
GUI:Button_setBright(btnChannel, channel ~= receiveChannel)
GUI:setTouchEnabled(btnChannel, channel ~= receiveChannel)
GUI:addOnClickEvent(btnChannel, function()
ChatData.SetReceiveChannel(channel)
MainProperty.UpdateReceiving()
end)
if isOpen then
GUI:addMouseOverTips(btnChannel, MainProperty._channelBtnTipList[i][1], { x = -10, y = -20 },
{ x = 1, y = 0.5 })
end
end
end
GUI:setVisible(MainProperty._ui["Button_channel"], PCShowSelectChannels and true or false)
GUI:addOnClickEvent(MainProperty._ui["Button_channel"], function()
if GUI:getVisible(MainProperty._ui["Panel_channel_s"]) then
MainProperty.HideChannels()
else
MainProperty.ShowChannels()
end
end)
if PCShowSelectChannels then
MainProperty._channelSelect = ChatData.GetCurChannel()
local name = MainProperty._channelSelect and CHANNEL_NAME[MainProperty._channelSelect]
if name and MainProperty._ui["Text_channel"] then
GUI:Text_setString(MainProperty._ui["Text_channel"], name)
end
end
MainProperty.HideChannels()
-- 地图
GUI:addOnClickEvent(MainProperty._ui["Button_map"], function()
if MainMiniMap.OnTabKeyExchange then
MainMiniMap.OnTabKeyExchange()
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_map"], "小地图(Tab)", { x = 0, y = 0 })
-- 交易
GUI:addOnClickEvent(MainProperty._ui["Button_trade"], function(sender)
GUI:delayTouchEnabled(sender)
SL:RequestTrade()
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_trade"], "交易(T)", { x = 0, y = 0 })
-- 服务端交易开关
local tradeAble = SL:GetValue("SERVER_OPTION", SW_KEY_TRADE_DEAL) == true
GUI:setVisible(MainProperty._ui["Button_trade"], tradeAble)
if not tradeAble then
GUI:setPositionX(MainProperty._ui["Button_guild"], 41)
GUI:setPositionX(MainProperty._ui["Button_near"], 68)
GUI:setPositionX(MainProperty._ui["Button_rank"], 95)
GUI:setPositionX(MainProperty._ui["Button_private"], 122)
GUI:setPositionX(MainProperty._ui["Button_drop"], 149)
GUI:setPositionX(MainProperty._ui["btn_rein_add"], 176)
end
-- 行会
GUI:addOnClickEvent(MainProperty._ui["Button_guild"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.Guild)
else
SL:JumpTo(SLDefine.HyperLinkID.Guild)
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_guild"], "行会(G)", { x = 0, y = 0 })
-- 附近
GUI:addOnClickEvent(MainProperty._ui["Button_near"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.NearPlayer)
else
SL:JumpTo(SLDefine.HyperLinkID.NearPlayer)
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_near"], "附近的人", { x = 0, y = 0 })
-- 排行榜
GUI:addOnClickEvent(MainProperty._ui["Button_rank"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.Rank)
else
SL:JumpTo(SLDefine.HyperLinkID.Rank)
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_rank"], "排行榜", { x = 0, y = 0 })
-- 私聊
GUI:addOnClickEvent(MainProperty._ui["Button_private"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.PCPrivate)
else
SL:JumpTo(SLDefine.HyperLinkID.PCPrivate)
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_private"], "私聊记录", { x = 0, y = 0 })
-- 掉落
GUI:delayTouchEnabled(MainProperty._ui["Button_drop"])
GUI:addOnClickEvent(MainProperty._ui["Button_drop"], function()
MainProperty.ShowDropSwitchPanel()
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_drop"], "掉落分类开关", { x = 0, y = 0 })
GUI:addOnClickEvent(MainProperty._ui["Panel_hide_drop"], function()
MainProperty.HideDropSwitchPanel()
end)
-- 小退
GUI:addOnClickEvent(MainProperty._ui["Button_out"], function()
if tonumber(SL:GetValue("GAME_DATA", "UIOpenMethod")) == 1 then
SL:CheckOpenLayer(SLDefine.HyperLinkID.ExitToRole)
else
SL:JumpTo(SLDefine.HyperLinkID.ExitToRole)
end
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_out"], "退出角色(Alt-X)", { x = 0, y = 0 })
-- 大退
GUI:addOnClickEvent(MainProperty._ui["Button_end"], function()
local function callback(bType, custom)
if bType == 1 then
SL:ExitGame()
end
end
local data = {}
data.str = "是否确定退出游戏"
data.btnType = 2
data.callback = callback
UIOperator:OpenCommonTipsUI(data)
SL:PlayBtnClickAudio()
end)
GUI:addMouseOverTips(MainProperty._ui["Button_end"], "退出游戏(Alt-Q)", { x = 0, y = 0 })
GUI:TextInput_setReturnType(MainProperty._ui["TextField_input"], 2)
GUI:TextInput_setInputMode(MainProperty._ui["TextField_input"], 6)
GUI:TextInput_setMaxLength(MainProperty._ui["TextField_input"], 60)
-- auto size
local minHeight = 155
local function touchCallback(sender, eventType)
local maxHeight = SL:GetValue("SCREEN_HEIGHT") - 100
if eventType == 1 then
local touchMovedPos = GUI:getTouchMovePosition(sender)
local height = touchMovedPos.y
height = math.min(maxHeight, height)
height = math.max(minHeight, height)
height = math.round(height)
GUI:setContentSize(MainProperty._ui["Panel_chat"], GUI:getContentSize(MainProperty._ui["Panel_chat"]).width,
height)
GUI:setContentSize(MainProperty._ui["Image_chat_bg"],
GUI:getContentSize(MainProperty._ui["Image_chat_bg"]).width, height)
GUI:setPositionY(MainProperty._ui["Panel_chat_touch"], height)
GUI:setPositionY(MainProperty._ui["Panel_chat_funcs"], height - 9)
GUI:setPositionY(MainProperty._ui["Panel_exit_funcs"], height - 9)
local exContentSize = GUI:getContentSize(MainProperty._ui["ListView_chat_ex"])
local exItems = GUI:ListView_getItems(MainProperty._ui["ListView_chat_ex"])
local exHei = #exItems == 0 and 1 or exContentSize.height
local contentSize = GUI:getContentSize(MainProperty._ui["ListView_chat"])
local chatHei = height - 50 - exHei
GUI:setContentSize(MainProperty._ui["ListView_chat"], contentSize.width, chatHei)
GUI:ListView_jumpToBottom(MainProperty._ui["ListView_chat"])
GUI:setPositionY(MainProperty._ui["Panel_quick"], height - 5)
GUI:setPositionY(MainProperty._ui["ListView_chat_ex"], height - 25)
GUI:setPositionY(MainProperty._ui["Panel_auto_tips"], height + 55)
end
end
GUI:addOnTouchEvent(MainProperty._ui["Panel_chat_touch"], touchCallback)
end
-- 发送聊天数据 input聊天内容
function MainProperty.SendChatMsg(msg, channelID)
local TextField_input = MainProperty._ui["TextField_input"]
msg = msg or GUI:Text_getString(TextField_input)
channelID = channelID or MainProperty._channelSelect
-- 换掉空格
msg = string.trim(msg)
msg = string.gsub(msg, "[\t\n\r]", "")
GUI:Text_setString(TextField_input, "")
-- 没有输入
if string.len(msg) <= 0 then
return SL:ShowSystemTips("您还未输入任何信息!")
end
local function toSendMsg(input, risk_param, ext_param)
-- 存储到输入缓存
ChatData.AddInputCache(input)
MainProperty._inputCache = SL:CopyData(ChatData.GetInputCache())
MainProperty._inputIndex = #MainProperty._inputCache + 1
-- 发送 PC端根据消息内容决定频道
local oriMsg = ext_param and ext_param.originStr
local sensitiveWords = ext_param and ext_param.replacedWords
local status = ext_param and ext_param.status
local uid = MainProperty.TargetData and MainProperty.TargetData.uid
local sendData = {
textType = GUIDefine.ChatTextType.NORMAL,
msg = input,
channel = channelID,
risk =
risk_param,
oriMsg = oriMsg,
sensitiveWords = sensitiveWords,
status = status,
uid = uid
}
GUIFunction:SendChatMsg(sendData)
end
local channel, content, targetName = GUIFunction:GetChannelByChatMsg(msg)
if channel then
channelID = channel
msg = content
end
-- 敏感词
if not string.find(msg, "^@.-") then
-- 后台控制不可聊天
if SL:GetValue("M2_FORBID_SAY", true) then
return false
end
local function handle_Func(state, str, risk_param, ext_param)
if not str then
return SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
end
if SL:GetValue("GAME_DATA", "OpenChatSensitiveTips") == 1 then
if not state then
SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
return
end
if risk_param and risk_param ~= 0 then
SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
return
end
if ext_param and ext_param.status and ext_param.status ~= 0 then
SL:ShowSystemTips("请不要包含敏感字或者特殊字符!")
return
end
end
if targetName then
str = string.format("/%s %s", targetName, str)
end
toSendMsg(str, risk_param, ext_param)
end
local data = { channel_id = channel }
if channel == CHANNEL.PRIVATE then
local target = ChatData.GetTargets()[1]
if target then
local actorID = target.uid
data.to_role_level = SL:GetValue("ACTOR_LEVEL", actorID)
data.to_role_id = actorID
data.to_role_name = target.name
end
msg = content
end
if SL:GetValue("GAME_DATA", "OpenChatSensitiveTips") == 1 then
SL:RequestCheckChatIsHaveSensitive(msg, handle_Func, data)
else
SL:RequestCheckSensitiveWord(msg, 2, handle_Func, data)
end
else
toSendMsg(msg)
end
end
function MainProperty.UpdateReceiving()
local receiveChannel = ChatData.GetReceiveChannel()
-- 选中
for i = 0, 8 do
local btnChannel = MainProperty._ui["Button_channel_" .. i]
if btnChannel then
local channel = MainProperty._channelBtnTipList[i][2]
GUI:Button_setBright(btnChannel, channel ~= receiveChannel)
GUI:setTouchEnabled(btnChannel, channel ~= receiveChannel)
end
end
-- 清理
MainProperty._cache = {}
MainProperty._isScrolling = false
GUI:ListView_removeAllItems(MainProperty._ui["ListView_chat"])
-- 消息
local receiveCache = ChatData.GetPCCache()
for _, v in ipairs(receiveCache) do
MainProperty.PushChatCell(v)
end
GUI:ListView_jumpToBottom(MainProperty._ui["ListView_chat"])
end
function MainProperty.PushChatCell(cell)
-- 超出限制,移除先放入的
local ListView_chat = MainProperty._ui["ListView_chat"]
GUI:ListView_pushBackCustomItem(ListView_chat, cell)
if #GUI:ListView_getItems(ListView_chat) > GUIDefine.ChatConfig.LIMIT_COUNT_PC then
GUI:ListView_removeItemByIndex(ListView_chat, 0)
end
end
function MainProperty.ShowChatCache()
-- 缓存填充
while #MainProperty._chatCellCache > 0 do
local cell = table.remove(MainProperty._chatCellCache, 1)
GUI:autoDecRef(cell)
MainProperty.PushChatCell(cell)
end
GUI:ListView_jumpToBottom(MainProperty._ui["ListView_chat"])
end
function MainProperty.SelectChannel(channel)
ChatData.SetCurChannel(channel)
MainProperty._channelSelect = channel
local target = ChatData.GetTargets()[1]
if target and ChatData.GetCurChannel() == CHANNEL.PRIVATE then
MainProperty.OnPrivateChatWithTarget(target)
end
end
function MainProperty.CreateChannelCell(id)
local widget = GUI:Widget_Create(-1, "Widget_" .. id, 0, 0, 0, 0)
GUI:LoadExport(widget, "main/main_channel_cell_win32")
local cell = GUI:getChildByName(widget, "channel_cell")
GUI:removeFromParent(cell)
return cell
end
function MainProperty.ShowChannels()
local Panel_channel_s = MainProperty._ui["Panel_channel_s"]
local p = GUI:getPosition(MainProperty._ui["Button_channel"])
GUI:setPosition(Panel_channel_s, p.x, p.y + GUI:getContentSize(MainProperty._ui["Button_channel"]).height / 2)
GUI:setVisible(Panel_channel_s, true)
local ListView_channel = MainProperty._ui["ListView_channel"]
local childs = GUI:getChildren(ListView_channel)
if #childs > 0 then
return false
end
MainProperty._channelCells = {}
local channels = { CHANNEL.NEAR }
if PCShowSelectChannels and string.len(PCShowSelectChannels) > 0 then
local list = string.split(PCShowSelectChannels, "#")
for _, index in ipairs(list) do
if index and tonumber(index) then
if tonumber(index) == CHANNEL.NEAR then
table.remove(channels, 1)
end
table.insert(channels, tonumber(index))
end
end
end
for _, id in ipairs(channels) do
while true do
if not CHANNEL_NAME[id] then
break
end
local name = CHANNEL_NAME[id]
local cell = MainProperty.CreateChannelCell(id)
GUI:Text_setString(GUI:getChildByName(cell, "Text_title"), name)
GUI:setVisible(GUI:getChildByName(cell, "Image_selected"), id == ChatData.GetCurChannel())
GUI:setTouchEnabled(cell, true)
GUI:addOnClickEvent(cell, function()
MainProperty.HideChannels()
MainProperty.SelectChannel(id)
MainProperty.OnRefreshChannelSelect()
end)
GUI:ListView_pushBackCustomItem(ListView_channel, cell)
MainProperty._channelCells[id] = cell
break
end
end
local count = #GUI:getChildren(ListView_channel)
local cellHei = count > 0 and GUI:getContentSize(GUI:getChildren(ListView_channel)[1]).height or 0
local listWid = GUI:getContentSize(ListView_channel).width
local listHei = cellHei * count
GUI:setContentSize(ListView_channel, listWid, listHei)
GUI:setContentSize(Panel_channel_s, listWid + 4, listHei + 6)
GUI:setContentSize(MainProperty._ui["Image_channel_bg"], listWid + 4, listHei + 6)
GUI:setPositionY(MainProperty._ui["Image_channel_bg"], (listHei + 6) / 2)
end
function MainProperty.HideChannels()
GUI:setVisible(MainProperty._ui["Panel_channel_s"], false)
GUI:setPositionY(MainProperty._ui["Panel_channel_s"], -300)
end
function MainProperty.OnRefreshChannelSelect()
local curChannel = ChatData.GetCurChannel()
for id, cell in pairs(MainProperty._channelCells or {}) do
GUI:setVisible(GUI:getChildByName(cell, "Image_selected"), id == curChannel)
end
local channelname = CHANNEL_NAME[curChannel]
GUI:Text_setString(MainProperty._ui["Text_channel"], channelname)
end
function MainProperty.RefreshListView(byData)
local cellSize = { width = MainProperty._ChatItemWidth, height = MainProperty._exCellHei }
local count = byData and #ChatData.GetChatExItemsData() or
#GUI:ListView_getItems(MainProperty._ui["ListView_chat_ex"])
local margin = GUI:ListView_getItemsMargin(MainProperty._ui["ListView_chat_ex"])
local exHei = (cellSize.height * count) + (count - 1) * margin
GUI:setContentSize(MainProperty._ui["ListView_chat_ex"], MainProperty._ChatItemWidth, exHei)
local panelHei = GUI:getContentSize(MainProperty._ui["Panel_chat"]).height
local chatHei = panelHei - 50 - exHei
GUI:setContentSize(MainProperty._ui["ListView_chat"], MainProperty._ChatItemWidth, chatHei)
GUI:ListView_jumpToBottom(MainProperty._ui["ListView_chat"])
end
function MainProperty.OnAddChatItem(cell)
-- 是否正在拖动
local listviewCells = MainProperty._ui["ListView_chat"]
if next(GUI:ListView_getItems(listviewCells)) then
local lastIdx = #GUI:ListView_getItems(listviewCells) - 1
local lastItem = GUI:ListView_getItemByIndex(listviewCells, lastIdx)
local size = GUI:getContentSize(lastItem)
local aPoint = GUI:getAnchorPoint(lastItem)
local worldPosY = GUI:getWorldPosition(lastItem).y - (size.height * aPoint.y)
local listviewY = GUI:getWorldPosition(listviewCells).y
-- 是否屏幕外
if worldPosY < listviewY then
MainProperty._isScrolling = true
end
end
if MainProperty._isScrolling then
-- 正在拖动,消息缓存
GUI:addRef(cell)
table.insert(MainProperty._chatCellCache, cell)
while #MainProperty._chatCellCache > GUIDefine.ChatConfig.LIMIT_COUNT_PC do
local cell = table.remove(MainProperty._chatCellCache, 1)
GUI:autoDecRef(cell)
end
else
MainProperty.PushChatCell(cell)
GUI:ListView_jumpToBottom(listviewCells)
end
end
function MainProperty.OnFillChatInput(str)
if str and string.len(str) > 0 then
GUI:Text_setString(MainProperty._ui["TextField_input"], str)
end
end
function MainProperty.OnPrivateChatWithTarget(data)
MainProperty.TargetData = data
GUI:Text_setString(MainProperty._ui["TextField_input"], string.format("/%s ", data.name))
end
function MainProperty.OnShowChatExNotice()
MainProperty.CheckChatExNotice()
end
function MainProperty.CheckChatExNotice()
local exList = MainProperty._ui["ListView_chat_ex"]
if not exList then
return false
end
if #GUI:ListView_getItems(exList) >= GUIDefine.ChatConfig.LIMIT_COUNT_EX then
return false
end
local chatExItems = SL:CopyData(ChatData.GetChatExItemsData())
if #chatExItems == 0 then
local oriWidth = GUI:getContentSize(exList).width
GUI:setContentSize(exList, oriWidth, 0)
return false
end
local data = chatExItems[#chatExItems]
if not data then
return false
end
data.Time = data.Time or 5
if data.Time <= 0 then
ChatData.RemoveChatExItemsData(data)
MainProperty.RefreshListView(true)
return false
end
data.Label = data.Label or ""
data.Y = data.Y or 0
data.Count = data.Count or 1
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
data.SendNameTemp = data.SendName or ""
local FColorHex = SL:GetHexColorByStyleId(data.FColor)
local BColorHex = SL:GetHexColorByStyleId(data.BColor)
local BColorEnable = data.BColor ~= -1
local capacitySize = { width = MainProperty._ChatItemWidth, height = MainProperty._exCellHei }
local layout = GUI:Layout_Create(-1, "layout", 0, 0, capacitySize.width, capacitySize.height)
if BColorEnable then
GUI:Layout_setBackGroundColor(layout, FColorHex)
GUI:Layout_setBackGroundColorType(layout, 0)
end
GUI:ListView_pushBackCustomItem(exList, layout)
MainProperty.RefreshListView()
local scrollWidget = GUI:Widget_Create(layout, "scrollWidget", 0, 0, capacitySize.width, capacitySize.height)
local scrollAble = nil
local scrollSize = { width = 0, height = 0 }
local remaining = data.Time
local Msg = SL:FixStringFormatCharacter(data.Msg)
local hasFormat = string.find(Msg, "%%")
local showName = data.SendName and (data.SendName .. ": ") or ""
local function callback()
remaining = math.min(remaining, data.Time)
ChatData.SyncChatExItemsTime(data, remaining)
local name = showName or ""
local str = name .. (hasFormat and string.format(Msg, remaining) or Msg)
local fontSize = SL:GetValue("GAME_DATA", "DEFAULT_FONT_SIZE")
GUI:removeAllChildren(scrollWidget)
local richText = GUI:RichTextFCOLOR_Create(scrollWidget, "richText", 0, capacitySize.height / 2, str, 1000,
fontSize, FColorHex, MainProperty._richVspace, nil, nil, { outlineSize = 0 })
GUI:setTouchEnabled(richText, true)
GUI:setAnchorPoint(richText, 0, 0.5)
GUI:RefPosByParent(richText)
if BColorEnable then
GUI:RichTextFCOLOR_setBackgroundColor(richText, BColorHex)
end
GUI:addOnClickEvent(richText, function()
if data.SendId and data.SendName and data.SendId ~= SL:GetValue("USER_ID") then
SL:onLUAEvent(LUA_EVENT_CHAT_PRIVATE_TARGET, { name = data.SendNameTemp, uid = data.SendId })
else
MainProperty.OnFillChatInput(string.format(data.Msg, remaining))
end
end)
if not scrollAble then
scrollSize = GUI:getContentSize(richText)
scrollAble = scrollSize.width > capacitySize.width
end
if remaining < 0 then
GUI:ListView_removeItemByIndex(exList, GUI:ListView_getItemIndex(exList, layout))
MainProperty.RefreshListView()
ChatData.RemoveChatExItemsData(data)
end
remaining = remaining - 1
end
SL:schedule(layout, callback, 1)
callback()
-- 滚动
if scrollAble then
local time = (scrollSize.width - capacitySize.width) / 50
GUI:runAction(scrollWidget,
GUI:ActionRepeatForever(GUI:ActionSequence(GUI:ActionMoveTo(time, capacitySize.width - scrollSize.width, 0),
GUI:DelayTime(3), GUI:ActionMoveTo(0, 0, 0))))
end
end
function MainProperty.OnChatExClear()
if not MainProperty._ui or not MainProperty._ui["ListView_chat_ex"] then
return false
end
GUI:stopAllActions(MainProperty._ui["ListView_chat_ex"])
GUI:removeAllChildren(MainProperty._ui["ListView_chat_ex"])
end
function MainProperty.OnDarkStateChange()
-- 0-白天1-黑夜2-日出3-傍晚
local darkState = SL:GetValue("DARK_STATE")
GUI:Image_loadTexture(MainProperty._ui["Image_time"], MainProperty._path .. MainProperty._darkImgList[darkState])
end
function MainProperty.OnRefreshPropertyShow()
--Level
local roleLevel = SL:GetValue("LEVEL")
GUI:Text_setString(MainProperty._ui["Text_level"], roleLevel)
--EXP
local curExp = SL:GetValue("EXP")
local maxExp = SL:GetValue("MAXEXP")
local expPer = curExp / maxExp * 100
GUI:LoadingBar_setPercent(MainProperty._ui["LoadingBar_exp"], expPer)
--HPMP
local curHP = SL:GetValue("HP")
local maxHP = SL:GetValue("MAXHP")
local curMP = SL:GetValue("MP")
local maxMP = SL:GetValue("MAXMP")
local hpPer = curHP / maxHP * 100
local mpPer = curMP / maxMP * 100
GUI:Text_setString(MainProperty._ui["Text_hp"], string.format("%s/%s", SL:HPUnit(curHP), SL:HPUnit(maxHP)))
GUI:Text_setString(MainProperty._ui["Text_mp"], string.format("%s/%s", SL:HPUnit(curMP), SL:HPUnit(maxMP)))
local roleJob = SL:GetValue("JOB")
if roleLevel < 28 and roleJob == 0 then -- 战士等级小于28 显示全血
GUI:setVisible(MainProperty._ui["LoadingBar_hp"], false)
GUI:setVisible(MainProperty._ui["LoadingBar_mp"], false)
GUI:setVisible(MainProperty._ui["Image_fhp_bg"], true)
GUI:setVisible(MainProperty._ui["LoadingBar_fhp"], true)
GUI:LoadingBar_setPercent(MainProperty._ui["LoadingBar_fhp"], hpPer)
else
GUI:setVisible(MainProperty._ui["LoadingBar_hp"], true)
GUI:setVisible(MainProperty._ui["LoadingBar_mp"], true)
GUI:setVisible(MainProperty._ui["Image_fhp_bg"], false)
GUI:setVisible(MainProperty._ui["LoadingBar_fhp"], false)
GUI:LoadingBar_setPercent(MainProperty._ui["LoadingBar_hp"], hpPer)
GUI:LoadingBar_setPercent(MainProperty._ui["LoadingBar_mp"], mpPer)
end
-- weight
local curWeight = SL:GetValue("BW")
local maxWeight = SL:GetValue("MAXBW")
GUI:LoadingBar_setPercent(MainProperty._ui["LoadingBar_weight"], curWeight / maxWeight * 100)
-- 刷新魔血球动画
MainProperty.RefreshSfxShowPercent()
-- 刷新内功相关显示
MainProperty.OnRefreshNGShow()
end
function MainProperty.OnChangeScene()
MainProperty.OnUpdatePlayerPosition()
MainProperty.OnDarkStateChange()
end
function MainProperty.OnUpdatePlayerPosition()
local mapName = SL:GetValue("MAP_NAME")
local mapX = SL:GetValue("X")
local mapY = SL:GetValue("Y")
if tonumber(mapX) and tonumber(mapY) then
mapX = math.ceil(mapX)
mapY = math.ceil(mapY)
GUI:Text_setString(MainProperty._ui["Text_position"], string.format("%s %s:%s", mapName, mapX, mapY))
end
end
function MainProperty.OnRefreshBubbleTips(data)
if data.status then
MainProperty.AddBubbleTips(data)
else
MainProperty.RmvBubbleTips(data)
end
end
function MainProperty.OnPlayerPKStateChange()
local pkMode = SL:GetValue("PKMODE")
GUI:Text_setString(MainProperty._ui["Text_pkmode"], MainProperty._pkModeStrList[pkMode] or "")
end
function MainProperty.OnShowOrHideAutoFightTips(status)
if status then
GUI:setVisible(MainProperty._nodeAutoMove, false)
GUI:setVisible(MainProperty._nodeAutoFight, true)
else
GUI:setVisible(MainProperty._nodeAutoFight, false)
end
end
function MainProperty.OnShowOrHideAutoMoveTips(status)
if status then
GUI:setVisible(MainProperty._nodeAutoFight, false)
GUI:setVisible(MainProperty._nodeAutoMove, true)
else
GUI:setVisible(MainProperty._nodeAutoMove, false)
end
end
function MainProperty.OnReinAttrChange()
local btnReinAdd = MainProperty._ui["btn_rein_add"]
local point = SL:GetValue("BONUS_POINT")
local isshow = point and tonumber(point) > 0 or false
GUI:setVisible(btnReinAdd, isshow)
GUI:stopAllActions(btnReinAdd)
if isshow then
local blink = false
local function playBlink()
blink = not blink
GUI:Button_loadTextureNormal(btnReinAdd, MainProperty._path .. reinAddIcons[blink and 2 or 1])
end
SL:schedule(btnReinAdd, playBlink, 0.2)
end
end
---------------------------------------------------------------------------------------------
------------------------------ 气泡栏 --------------------------------------------------------
-- 气泡cell
function MainProperty.CreateBubbleTipsCell(data)
local id = data.id
local path = data.path
local node = GUI:Node_Create(-1, "node", 0, 0)
local Panel_cell = GUI:Layout_Create(node, "Panel_cell", 0, 0, 50, 50)
GUI:setTouchEnabled(Panel_cell, true)
GUI:setAnchorPoint(Panel_cell, 0.5, 0.5)
-- 图标
local iconBtn = GUI:Button_Create(Panel_cell, "iconBtn", 25, 25, "Default/Button_Normal.png")
GUI:setAnchorPoint(iconBtn, 0.5, 0.5)
GUI:setContentSize(iconBtn, 46, 46)
-- 倒计时
local timeText = GUI:Text_Create(Panel_cell, "timeText", 25, 7, 16, "#FF0000", "10")
GUI:setAnchorPoint(timeText, 0.5, 0.5)
GUI:removeFromParent(Panel_cell)
if path and string.len(path) > 0 then
GUI:Button_loadTextureNormal(iconBtn, path)
end
GUI:setIgnoreContentAdaptWithSize(iconBtn, true)
GUI:addOnClickEvent(iconBtn, function()
if data.callback then
data.callback(Panel_cell)
end
end)
-- 时间
local function callback()
if data.endTime then
local remaining = data.endTime - SL:GetValue("SERVER_TIME")
GUI:Text_setString(timeText, remaining)
if remaining <= 0 then
GUI:stopAllActions(timeText)
GUI:Text_setString(timeText, "")
if data.timeOverCB then
data.timeOverCB()
end
end
else
GUI:Text_setString(timeText, "")
end
end
SL:schedule(timeText, callback, 1)
callback()
GUI:Timeline_Waggle(Panel_cell, 0.05, 20)
local cell = {
id = id,
layout = Panel_cell,
button = iconBtn
}
return cell
end
function MainProperty.AddBubbleTips(data)
data.endTime = data.time and data.time + SL:GetValue("SERVER_TIME")
if MainProperty._bubbleTipsDatas[data.id] then
MainProperty._bubbleTipsDatas[data.id] = data
return false
end
MainProperty._bubbleTipsDatas[data.id] = data
local tipsCell = MainProperty.CreateBubbleTipsCell(data)
MainProperty._bubbleTipsCells[data.id] = tipsCell
GUI:ListView_pushBackCustomItem(MainProperty._ui["ListView_bubble_tips"], tipsCell.layout)
SL:PlaySound(50004)
end
function MainProperty.RmvBubbleTips(data)
if not MainProperty._bubbleTipsDatas[data.id] then
return false
end
MainProperty._bubbleTipsDatas[data.id] = nil
GUI:ListView_removeChild(MainProperty._ui["ListView_bubble_tips"], MainProperty._bubbleTipsCells[data.id].layout)
MainProperty._bubbleTipsCells[data.id] = nil
end
-- 获取气泡按钮方法
function MainProperty.GetBubbleButtonByID(id)
for i, cell in pairs(MainProperty._bubbleTipsCells) do
if cell.id == id then
return cell.button
end
end
return nil
end
---------------------------------------------------------------------------------------------
------------------------------ 自动提示 ------------------------------------------------------
function MainProperty.InitAutoSFXTips()
local contentSize = GUI:getContentSize(MainProperty._ui["Panel_auto_tips"])
local posX = contentSize.width / 2
local posY = 10
-- 自动战斗
MainProperty._nodeAutoFight = GUI:Node_Create(MainProperty._ui["Panel_auto_tips"], "nodeAutoFight", posX, posY)
GUI:setVisible(MainProperty._nodeAutoFight, false)
GUI:Effect_Create(MainProperty._nodeAutoFight, "autoFightSfx", 0, 0, 0, 4009)
-- 自动寻路
MainProperty._nodeAutoMove = GUI:Node_Create(MainProperty._ui["Panel_auto_tips"], "nodeAutoMove", posX, posY)
GUI:setVisible(MainProperty._nodeAutoMove, false)
GUI:Effect_Create(MainProperty._nodeAutoMove, "autoMoveSfx", 0, 0, 0, 4010)
end
------------------------------ 自动捡物 ------------------------------------------------------
function MainProperty.InitPickButton()
GUI:setVisible(MainProperty._ui["Button_pick"], false)
GUI:addOnClickEvent(MainProperty._ui["Button_pick"], function()
if SL:GetValue("BATTLE_IS_AUTO_PICK") then
SL:SetValue("BATTLE_PICK_END")
else
SL:SetValue("BATTLE_PICK_BEGIN")
end
end)
end
function MainProperty.OnUpdatePickState()
local name = string.format("btn_zhijiemian_%02d.png", SL:GetValue("BATTLE_IS_AUTO_PICK") and 6 or 5)
GUI:Button_loadTextureNormal(MainProperty._ui["Button_pick"], MainProperty._path .. name)
end
function MainProperty.UpdatePickupVisible(visible)
GUI:setVisible(MainProperty._ui["Button_pick"], visible)
end
------------------------------ 英雄相关 -------------------------------------------------------
function MainProperty.RefAnger(value)
local size = GUI:getContentSize(MainProperty._ui["Panel_loadBar"])
GUI:setContentSize(MainProperty._ui["Panel_loadBar"], size.width, 5 + value * (MainProperty._angerHei - 5))
end
function MainProperty.OnHeroAngerChange()
if SL:GetValue("USEHERO") then
local curAnger = SL:GetValue("H.ANGER")
local maxAnger = SL:GetValue("H.MAXANGER")
if maxAnger ~= 0 then
MainProperty.RefAnger(curAnger / maxAnger)
end
local bar = MainProperty._ui["Image_loadbar2"]
if SL:GetValue("H.SHAN") then
GUI:setVisible(bar, not GUI:getVisible(bar))
else
GUI:stopAllActions(bar)
GUI:setVisible(bar, false)
end
end
end
-- 脚本添加魔血球动画
function MainProperty.OnPlayMagicBallEffect(data)
if data.type < 0 or data.type > 2 or data.count < 0 or data.interval < 0 then
return
end
local scale = data.scale == 0 and 1 or (data.scale / 100)
local timeval = data.interval / 1000
local prefix = MainProperty._mhpPrefixList[data.type + 1] or ""
local ani = GUI:Animation_Create()
local pSize = { width = 0, height = 0 }
for i = data.beginNum, data.beginNum + data.count - 1 do
local path = string.format("res/private/mhp_ui_win32/%s%s.png", prefix, i)
if SL:IsFileExist(path) then
local sp = GUI:Sprite_Create(-1, "sp", 0, 0, path)
pSize = GUI:getContentSize(sp)
GUI:Animation_addSpriteFrame(ani, GUI:Sprite_getSpriteFrame(sp))
end
end
GUI:Animation_setDelayPerUnit(ani, timeval)
GUI:Animation_setLoops(ani, 1)
GUI:Animation_setRestoreOriginalFrame(ani, true)
pSize.width = pSize.width * scale
pSize.height = pSize.height * scale
local tag = MainProperty._mhpTagList[data.type + 1]
local widget = MainProperty._ui[string.format("Panel_%ssfx", prefix)]
local sprite
if tag and widget then
MainProperty._pSize[tag] = pSize
GUI:setContentSize(widget, pSize.width, pSize.height)
if not GUI:getChildByName(widget, tag) then
sprite = GUI:Sprite_Create(widget, tag, 0, 0)
GUI:setScale(sprite, scale)
GUI:runAction(sprite, GUI:ActionRepeatForever(GUI:ActionAnimate(ani)))
end
end
if data.time ~= -1 and data.time > 0 then
SL:ScheduleOnce(
function()
if sprite and not GUI:Widget_IsNull(sprite) then
GUI:stopAllActions(sprite)
GUI:removeFromParent(sprite)
end
end,
data.time
)
end
GUI:setVisible(MainProperty._ui["Panel_hp_sfx"], data.type ~= 2)
GUI:setVisible(MainProperty._ui["Panel_mp_sfx"], data.type ~= 2)
GUI:setVisible(MainProperty._ui["Panel_fhp_sfx"], true)
if data.type == 0 then -- HP
GUI:setPosition(widget, 38 + data.offsetX, 65 + data.offsetY)
elseif data.type == 1 then -- MP
local hpPosX = GUI:getPositionX(MainProperty._ui["Panel_hp_sfx"])
local hpWidth = GUI:getContentSize(MainProperty._ui["Panel_hp_sfx"]).width
GUI:setPosition(widget, hpPosX + hpWidth + 4 + data.offsetX, 65 + data.offsetY)
elseif data.type == 2 then -- FHP
GUI:setPosition(widget, 38 + data.offsetX, 65 + data.offsetY)
end
MainProperty._drawHWay[tag] = data.drawHWay
if data.drawHWay and data.drawHWay == 1 then --按HP/MP真实高度绘制
MainProperty.RefreshSfxShowPercent()
end
end
function MainProperty.RefreshSfxShowPercent()
--HPMP
local curHP = SL:GetValue("HP")
local maxHP = SL:GetValue("MAXHP")
local curMP = SL:GetValue("MP")
local maxMP = SL:GetValue("MAXMP")
local hpPer = curHP / maxHP
local mpPer = curMP / maxMP
local roleJob = SL:GetValue("JOB")
local roleLevel = SL:GetValue("LEVEL")
if roleLevel < 28 and roleJob == 0 then -- 战士等级小于28 显示全血
if MainProperty._ui["Panel_hp_sfx"] and MainProperty._ui["Panel_mp_sfx"] then
GUI:setVisible(MainProperty._ui["Panel_hp_sfx"], false)
GUI:setVisible(MainProperty._ui["Panel_mp_sfx"], false)
GUI:setVisible(MainProperty._ui["Panel_fhp_sfx"], true)
end
else
if MainProperty._ui["Panel_hp_sfx"] and MainProperty._ui["Panel_mp_sfx"] then
GUI:setVisible(MainProperty._ui["Panel_hp_sfx"], true)
GUI:setVisible(MainProperty._ui["Panel_mp_sfx"], true)
GUI:setVisible(MainProperty._ui["Panel_fhp_sfx"], false)
end
end
for i, tag in ipairs(MainProperty._mhpTagList) do
local widget = MainProperty._ui[string.format("Panel_%ssfx", MainProperty._mhpPrefixList[i])]
if widget and GUI:getChildByName(widget, tag) then
local pSize = MainProperty._pSize[tag]
local drawHWay = MainProperty._drawHWay[tag]
if not pSize or (not drawHWay) or drawHWay ~= 1 then
return
end
local percent = tag == "MPSFX" and mpPer or hpPer
GUI:setContentSize(widget, pSize.width, pSize.height * percent)
end
end
end
---------------------------------------------------------------------------------------------
------------------------------ 内功相关 ------------------------------------------------------
function MainProperty.OnRefreshNGShow()
if SL:GetValue("GAME_DATA", "OpenNGUI") ~= 1 then
return
end
-- 斗转星移值
if not MainProperty._dzPanelHei then
MainProperty._dzPanelHei = GUI:getContentSize(MainProperty._ui["Panel_bar_dz"]).height
end
local wid = GUI:getContentSize(MainProperty._ui["Panel_bar_dz"]).width
local curDZValue = SL:GetValue("CUR_ABIL_BY_ID", GUIDefine.AttTypeTable.Internal_DZValue)
local maxDZValue = SL:GetValue("MAX_ABIL_BY_ID", GUIDefine.AttTypeTable.Internal_DZValue)
local per = 0
if curDZValue and maxDZValue and maxDZValue > 0 then
per = curDZValue / maxDZValue
end
GUI:setContentSize(MainProperty._ui["Panel_bar_dz"], wid, MainProperty._dzPanelHei * per)
-- 醉酒值
if not MainProperty._zjPanelHei then
MainProperty._zjPanelHei = GUI:getContentSize(MainProperty._ui["Panel_bar_zj"]).height
end
local wid = GUI:getContentSize(MainProperty._ui["Panel_bar_zj"]).width
local per = 0
GUI:setContentSize(MainProperty._ui["Panel_bar_zj"], wid, MainProperty._zjPanelHei * per)
MainProperty._NGShow = tonumber(SL:GetValue("GAME_DATA", "OpenNGUI")) == 1 and SL:GetValue("IS_LEARNED_INTERNAL")
MainProperty.InitNGShow()
MainProperty.OnUpdateSetComboSkill()
end
function MainProperty.OnRefreshDZShow()
local dzPanel = MainProperty._ui["Panel_dz"]
if dzPanel then
if SL:GetValue("SKILL_DATA", DZXY_SkillID) then
GUI:setVisible(dzPanel, MainProperty._NGShow and true)
else
GUI:setVisible(dzPanel, false)
end
end
end
-- 连击可释放
function MainProperty.OnRefreshComboShow(state)
GUI:stopAllActions(MainProperty._ui["Image_ng_shan"])
GUI:setVisible(MainProperty._ui["Image_ng_shan"], state)
if state then
local blink = false
local function playBlink()
blink = not blink
GUI:Image_loadTexture(MainProperty._ui["Image_ng_shan"],
MainProperty._path .. comboShowIcons[blink and 2 or 1])
end
SL:schedule(MainProperty._ui["Image_ng_shan"], playBlink, 0.2)
end
end
function MainProperty.OnActiveComboSkill(state)
if MainProperty._NGShow then
local selectSkills = SL:GetValue("SET_COMBO_SKILLS")
if selectSkills[1] then
MainProperty.OnRefreshComboShow(state)
end
end
end
function MainProperty.OnComboSkillCDChange()
local skills = SL:GetValue("SET_COMBO_SKILLS")
local state = true
for i = 1, #skills do
local skillID = skills[i]
if skillID and skillID ~= 0 then
if SL:GetValue("SKILL_IS_CDING", skillID) then
state = false
end
end
end
SL:SetValue("COMBO_SKILL_STATE", state)
MainProperty.OnActiveComboSkill(state)
end
function MainProperty.OnUpdateSetComboSkill()
if MainProperty._NGShow then
local selectSkills = SL:GetValue("SET_COMBO_SKILLS")
if selectSkills[1] then
MainProperty.OnRefreshComboShow(true)
else
GUI:stopAllActions(MainProperty._ui["Image_ng_shan"])
GUI:setVisible(MainProperty._ui["Image_ng_shan"], false)
end
end
end
------------------------------ 掉落分类 ------------------------------------------------------
function MainProperty.CreateDropSwitchCell(id)
local widget = GUI:Widget_Create(-1, "Widget_" .. id, 0, 0, 0, 0)
GUI:LoadExport(widget, "main/drop_switch_cell_win32")
local cell = GUI:getChildByName(widget, "Panel_cell")
local checkBox = GUI:getChildByName(cell, "CheckBox_drop")
local nameText = GUI:getChildByName(cell, "Text_drop_name")
GUI:CheckBox_setZoomScale(checkBox, -0.05)
local data = {
layout = cell,
nameText = nameText,
checkBox = checkBox
}
GUI:removeFromParent(cell)
return data
end
function MainProperty.ShowDropSwitchPanel()
local num = #MainProperty._dropTypeList
if num == 0 then
return
end
local worldPos = GUI:getWorldPosition(MainProperty._ui["Button_drop"])
local nodePos = GUI:convertToNodeSpace(MainProperty._root, worldPos.x, worldPos.y)
GUI:setPosition(MainProperty._ui["Panel_drop"], nodePos.x, nodePos.y + 10)
GUI:setVisible(MainProperty._ui["Panel_drop"], true)
GUI:setVisible(MainProperty._ui["Panel_hide_drop"], true)
GUI:setTouchEnabled(MainProperty._ui["Panel_hide_drop"], true)
GUI:ListView_removeAllItems(MainProperty._ui["ListView_drop"])
local cellWid = nil
local cellHei = nil
for _, data in ipairs(MainProperty._dropTypeList) do
local id = data.id
local defaultName = nil
if string.len(data.name) == 0 then
defaultName = id == FAKE_DROP_TYPE_ID and "分类0" or ("分类" .. id)
end
local name = defaultName or data.name
local cell = MainProperty.CreateDropSwitchCell(id)
local isReceiving = ChatData.GetDropTypeSwitch(id)
GUI:CheckBox_setSelected(cell.checkBox, isReceiving == true)
GUI:Text_setString(cell.nameText, name)
local nameWid = GUI:getContentSize(cell.nameText).width
local posX = GUI:getPositionX(cell.nameText)
-- 接收开关
GUI:CheckBox_addOnEvent(cell.checkBox, function()
local isSelected = GUI:CheckBox_isSelected(cell.checkBox)
if id == DROP_TOTAL_TYPE_ID then
for channel, cell in pairs(MainProperty._dropTypeCells) do
ChatData.SetDropTypeSwitch(channel, isSelected)
end
else
ChatData.SetDropTypeSwitch(id, isSelected)
end
for channel, cell in pairs(MainProperty._dropTypeCells) do
local isReceiving = ChatData.GetDropTypeSwitch(channel)
GUI:CheckBox_setSelected(cell.checkBox, isReceiving == true)
if channel == DROP_TOTAL_TYPE_ID then
ChatData.SetReceiving(CHANNEL.DROP, isReceiving)
end
end
end)
local tempWid = posX + nameWid + 8
if not cellWid or not cellHei then
cellWid = math.max(tempWid, GUI:getContentSize(cell.layout).width)
cellHei = GUI:getContentSize(cell.layout).height
else
cellWid = math.max(tempWid, cellWid)
end
MainProperty._dropTypeCells[id] = cell
GUI:ListView_pushBackCustomItem(MainProperty._ui["ListView_drop"], cell.layout)
end
local listWid = cellWid
local listHei = cellHei * num
GUI:setContentSize(MainProperty._ui["ListView_drop"], listWid, listHei)
GUI:setContentSize(MainProperty._ui["Panel_drop"], listWid + 2, listHei + 6)
GUI:setContentSize(MainProperty._ui["Image_drop_bg"], listWid + 2, listHei + 6)
GUI:setPosition(MainProperty._ui["Image_drop_bg"], (listWid + 2) / 2, (listHei + 6) / 2)
end
function MainProperty.HideDropSwitchPanel()
GUI:setVisible(MainProperty._ui["Panel_drop"], false)
GUI:setVisible(MainProperty._ui["Panel_hide_drop"], false)
GUI:setTouchEnabled(MainProperty._ui["Panel_hide_drop"], false)
end
function MainProperty.RefreshFakeDropType()
local needRefresh = false
local hasFake = false
for i, v in ipairs(MainProperty._dropTypeList) do
if v.id == FAKE_DROP_TYPE_ID then
if ChatData.IsCloseFakeDrop() then
table.remove(MainProperty._dropTypeList, i)
needRefresh = true
end
hasFake = true
break
end
end
if not ChatData.IsCloseFakeDrop() and not hasFake then
local fakeDrop = SL:GetMetaValue("GAME_DATA", "ShowFakeDropType")
if fakeDrop and string.len(fakeDrop) > 0 then
local param = string.split(fakeDrop, "#")
if param[2] and tonumber(param[2]) == 1 then
table.insert(MainProperty._dropTypeList, 2, { id = FAKE_DROP_TYPE_ID, name = param[1] })
needRefresh = true
end
end
end
if needRefresh then
MainProperty.HideDropSwitchPanel()
end
end
---------------------------------------------------------------------------------------------
------------------------------ 快捷栏 --------------------------------------------------------
-- 初始化显示的快捷栏
function MainProperty.InitQuickUseShow()
local showNum = 0
-- 默认个数
if MainProperty._ui["Panel_quick"] and GUI:getVisible(MainProperty._ui["Panel_quick"]) then
for i = 1, 6 do
local layout = MainProperty._ui[string.format("Panel_quick_use_%s", i)]
if layout and GUI:getVisible(layout) then
showNum = showNum + 1
end
end
end
-- 设置快捷框个数 (最大6)
QuickUseData.SetQuickUseSize(showNum)
end
-- 初始化显示的快捷栏
function MainProperty.InitQuickUseItems()
local regstetMouseEvent = function(widget, item, i)
local function addItemIntoBag(touchPos)
local state = SL:GetValue("ITEM_MOVE_STATE")
local canMove = item and GUI:getVisible(item)
if state and canMove then
local data = {}
data.target = GUIDefine.ItemGoTo.QUICK_USE
data.pos = touchPos
data.posInQuickUse = i
SL:ItemMoveCheck(data)
else
return -1
end
end
local function setNoSwallowMouse()
return -1
end
GUI:addMouseButtonEvent(widget, {
onRightDownFunc = setNoSwallowMouse,
onSpecialRFunc = addItemIntoBag
})
end
local showNum = 0
local Panel_quick = MainProperty._ui["Panel_quick"]
if Panel_quick and GUI:getVisible(Panel_quick) then
for i = 1, 6 do
local item = MainProperty._ui[string.format("Panel_quick_use_%s", i)]
if item and GUI:getVisible(item) then
showNum = showNum + 1
local size = GUI:getContentSize(item)
local nodeItem = GUI:Node_Create(item, "nodeItem", size.width / 2, size.height / 2)
MainProperty._quickUseCells[i] = { layout = item, nodeItem = nodeItem }
local Panel_touch = GUI:Layout_Create(item, "Panel_touch", 0, 0, size.width, size.height)
GUI:setTouchEnabled(Panel_touch, true)
GUI:setSwallowTouches(Panel_touch, false)
Panel_touch._noAutoRegisterMouseSwollow = true
regstetMouseEvent(Panel_touch, item, i)
end
end
end
QuickUseData.SetQuickUseSize(showNum)
MainProperty.UpdateQuickUseItem()
end
-- 快捷栏更新
function MainProperty.OnQuickUseRefresh(data)
local cell = MainProperty._quickUseCells[data.pos]
if not cell then
return false
end
GUI:ItemShow_resetMoveState(cell.item, data.state == 0)
end
-- 快捷栏变化通知
function MainProperty.OnQuickUseChange(data)
local opera = data.opera
if opera == GUIDefine.OperateType.INIT then
MainProperty.UpdateQuickUseItem()
elseif opera == GUIDefine.OperateType.ADD then
MainProperty.AddQuickUseItem(data.param)
elseif opera == GUIDefine.OperateType.DEL then
MainProperty.DelQuickUseItem(data.param)
elseif opera == GUIDefine.OperateType.CHANGE then
MainProperty.ChangeQuickUseItem(data.param)
end
end
--初始化item
function MainProperty.UpdateQuickUseItem()
for k, v in pairs(MainProperty._quickUseCells) do
GUI:removeAllChildren(v.nodeItem)
end
local quickUseData = QuickUseData.GetQuickUseData()
for k, v in pairs(quickUseData) do
MainProperty.AddQuickUseItem({ index = k, itemData = v })
end
end
-- 添加 item
function MainProperty.AddQuickUseItem(data)
local cell = MainProperty._quickUseCells[data.index]
local function dealSpecialQuickUse()
local index = data.index
local size = QuickUseData.GetQuickUseSize()
local quickUseData = QuickUseData.GetQuickUseData()
local quickUseList = QuickUseData.GetQuickUseLocalList()
local replaceCell = nil
for i = 1, size do
if not quickUseData[i] and MainProperty._quickUseCells[i] and i ~= index then
replaceCell = MainProperty._quickUseCells[i]
cell = replaceCell
quickUseData[i] = quickUseData[index]
quickUseData[index] = nil
quickUseList[i] = quickUseList[index]
quickUseList[index] = 0
break
end
end
-- 无替代则放回背包
if not replaceCell then
local item = data.itemData
BagData.AddItemData(item)
--清数据
quickUseList[index] = 0
return true
end
end
if not cell then
if dealSpecialQuickUse() then
return
end
end
local nodeItem = cell.nodeItem
GUI:removeAllChildren(nodeItem)
local function getCount(item)
if item.OverLap > 1 then
return item.OverLap
end
if item.StdMode == 2 and item.Dura > 0 then --使用次数
return item.Dura < 1000 and 1 or math.floor(item.Dura / 1000) --小于1000都为1大于1000向下取整
end
return 0
end
local itemData = data.itemData
local data = {
index = itemData.Index,
itemData = itemData,
count = getCount(itemData),
from = GUIDefine.ItemFrom
.QUICK_USE,
movable = true
}
local item = GUI:ItemShow_Create(nodeItem, "quickCell", 0, 0, data)
GUI:setAnchorPoint(item, 0.5, 0.5)
GUI:addMouseButtonEvent(item, {
onRightUpFunc = function() SL:RequestUseItem(itemData) end,
onDoubleLFunc = function() SL:RequestUseItem(itemData) end,
})
-- 延迟0.15s显示goodsitem
GUI:setVisible(item, false)
GUI:stopAllActions(item)
SL:scheduleOnce(item, function(sender) GUI:setVisible(item, true) end, 0.15)
cell.item = item
end
-- 删除 item
function MainProperty.DelQuickUseItem(data)
local cell = MainProperty._quickUseCells[data.index]
if not cell then
return false
end
GUI:removeAllChildren(cell.nodeItem)
end
-- 修改 item
function MainProperty.ChangeQuickUseItem(data)
local cell = MainProperty._quickUseCells[data.index]
if not cell then
return false
end
local function getCount(item)
if item.OverLap > 1 then
return item.OverLap
end
if item.StdMode == 2 and item.Dura > 0 then --使用次数
return item.Dura < 1000 and 1 or math.floor(item.Dura / 1000) --小于1000都为1大于1000向下取整
end
return 0
end
GUI:ItemShow_UpdateItemCountShow(cell.item, data.itemData, getCount(data.itemData))
end
---------------------------------------------------------------------------------------------
----------------------------- 倒计时提示 -----------------------------------------------------
function MainProperty.OnAddQuitTimeTips(data)
if not data or not data.time or not data.type then
return false
end
local time
local type = data.type -- 1 小退 2 大退
local Node_quit_tip = MainProperty._ui["Node_quit_tip"]
if not Node_quit_tip then
return false
end
local function refreshTime()
time = time and time - 1 or data.time
local str = string.format(MainProperty._quitTimeTips[type], time)
GUI:removeAllChildren(Node_quit_tip)
local width = SL:GetValue("SCREEN_WIDTH")
local richText = GUI:RichText_Create(Node_quit_tip, "richtips", 0, 0, str, width,
(SL:GetValue("GAME_DATA", "DEFAULT_FONT_SIZE") or 16) + 1, "#ffffff")
GUI:setAnchorPoint(richText, 0.5, 0)
end
GUI:stopAllActions(Node_quit_tip)
SL:schedule(Node_quit_tip, refreshTime, 1)
refreshTime()
end
function MainProperty.OnDelQuitTimeTips()
local Node_quit_tip = MainProperty._ui["Node_quit_tip"]
if not Node_quit_tip then
return false
end
GUI:stopAllActions(Node_quit_tip)
GUI:removeAllChildren(Node_quit_tip)
end
---------------------------------------------------------------------------------------------
---------------------------- 窗体尺寸改变 ----------------------------------------------------
function MainProperty.OnWindowChange()
MainProperty.InitAdapet()
end
---------------------------------------------------------------------------------------------
-- 更新恢复聊天框未聚焦状态: 关闭Keyboard
function MainProperty.OnCloseKeyBoard()
GUI:TextInput_closeInput(MainProperty._ui["TextField_input"])
end
---------------------------------------------------------------------------------------------
function MainProperty.handlePressedEnter()
GUI:TextInput_touchDownAction(MainProperty._ui["TextField_input"], 2)
return true
end
------------------------------ 注册事件 ------------------------------------------------------
function MainProperty.RegisterEvent()
-- 注册事件
SL:RegisterLUAEvent(LUA_EVENT_HPMP_CHANGE, "MainProperty", MainProperty.OnRefreshPropertyShow)
SL:RegisterLUAEvent(LUA_EVENT_LEVEL_CHANGE, "MainProperty", MainProperty.OnRefreshPropertyShow)
SL:RegisterLUAEvent(LUA_EVENT_EXP_CHANGE, "MainProperty", MainProperty.OnRefreshPropertyShow)
SL:RegisterLUAEvent(LUA_EVENT_ROLE_PROPERTY_CHANGE, "MainProperty", MainProperty.OnRefreshPropertyShow)
SL:RegisterLUAEvent(LUA_EVENT_WEIGHT_CHANGE, "MainProperty", MainProperty.OnRefreshPropertyShow)
-- 主玩家位置刷新
SL:RegisterLUAEvent(LUA_EVENT_BIND_MAINPLAYER, "MainProperty", MainProperty.OnUpdatePlayerPosition)
SL:RegisterLUAEvent(LUA_EVENT_CHANGESCENE, "MainProperty", MainProperty.OnChangeScene)
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_MAPPOS_CHANGE, "MainProperty", MainProperty.OnUpdatePlayerPosition)
-- 脚本展示魔血球动画
SL:RegisterLUAEvent(LUA_EVENT_PLAY_MAGICBALL_EFFECT, "MainProperty", MainProperty.OnPlayMagicBallEffect)
-- 气泡相关
SL:RegisterLUAEvent(LUA_EVENT_BUBBLETIPS_STATUS_CHANGE, "MainProperty", MainProperty.OnRefreshBubbleTips)
-- 自动提示相关
SL:RegisterLUAEvent(LUA_EVENT_AUTOFIGHT_TIPS_SHOW, "MainProperty", MainProperty.OnShowOrHideAutoFightTips)
SL:RegisterLUAEvent(LUA_EVENT_AUTOMOVE_TIPS_SHOW, "MainProperty", MainProperty.OnShowOrHideAutoMoveTips)
SL:RegisterLUAEvent(LUA_EVENT_AUTOPICKBEGIN, "MainProperty", MainProperty.OnUpdatePickState)
SL:RegisterLUAEvent(LUA_EVENT_AUTOPICKEND, "MainProperty", MainProperty.OnUpdatePickState)
-- 脚本命令AutoPickItemByBtn、StopAutoPickItemByBtn触发
SL:RegisterLUAEvent(LUA_EVENT_MAIN_PICKUP_SHOW, "MainProperty", MainProperty.UpdatePickupVisible)
-- -- 英雄相关
SL:RegisterLUAEvent(LUA_EVENT_HERO_ANGER_CHANGE, "MainProperty", MainProperty.OnHeroAngerChange)
-- 转生点改变
SL:RegisterLUAEvent(LUA_EVENT_REIN_ATTR_CHANGE, "MainProperty", MainProperty.OnReinAttrChange)
-- PK模式改变
SL:RegisterLUAEvent(LUA_EVENT_PKMODE_CHANGE, "MainProperty", MainProperty.OnPlayerPKStateChange)
--黑夜状态改变
SL:RegisterLUAEvent(LUA_EVENT_DARK_STATE_CHANGE, "MainProperty", MainProperty.OnDarkStateChange)
--学习内功
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_LEARNED_INTERNAL, "MainProperty", MainProperty.OnRefreshNGShow)
-- 斗转值改变
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_INTERNAL_DZVALUE_CHANGE, "MainProperty", MainProperty.OnRefreshNGShow)
-- 技能初始化/增加/删除
SL:RegisterLUAEvent(LUA_EVENT_SKILL_INIT, "MainProperty", MainProperty.OnRefreshDZShow)
SL:RegisterLUAEvent(LUA_EVENT_SKILL_ADD, "MainProperty", MainProperty.OnRefreshDZShow)
SL:RegisterLUAEvent(LUA_EVENT_SKILL_DEL, "MainProperty", MainProperty.OnRefreshDZShow)
-- 设置连击技能刷新
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_SET_COMBO_REFRESH, "MainProperty", MainProperty.OnUpdateSetComboSkill)
-- 连击技能CD状态
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_COMBO_SKILLCD_STATE, "MainProperty", MainProperty.OnActiveComboSkill)
SL:RegisterLUAEvent(LUA_EVENT_COMBO_SKILL_CD_CHANGE, "MainProperty", MainProperty.OnComboSkillCDChange)
SL:RegisterLUAEvent(LUA_EVENT_CHATMINI_ITEM_ADD, "MainProperty", MainProperty.OnAddChatItem)
SL:RegisterLUAEvent(LUA_EVENT_CHAT_EX_NOTICE_ADD, "MainProperty", MainProperty.OnShowChatExNotice)
SL:RegisterLUAEvent(LUA_EVENT_PC_FILL_CHAT_INPUT, "MainProperty", MainProperty.OnFillChatInput)
SL:RegisterLUAEvent(LUA_EVENT_CHAT_PUSH_INPUT, "MainProperty", MainProperty.OnFillChatInput)
SL:RegisterLUAEvent(LUA_EVENT_CHAT_PRIVATE_TARGET, "MainProperty", MainProperty.OnPrivateChatWithTarget)
SL:RegisterLUAEvent(LUA_EVENT_MAIN_CHAT_EX_CLEAR, "MainProperty", MainProperty.OnChatExClear)
SL:RegisterLUAEvent(LUA_EVENT_QUICKUSE_DATA_OPER, "MainProperty", MainProperty.OnQuickUseChange)
SL:RegisterLUAEvent(LUA_EVENT_QUICKUSE_ITEM_REFRESH, "MainProperty", MainProperty.OnQuickUseRefresh)
SL:RegisterLUAEvent(LUA_EVENT_MAIN_ADD_QUIT_TIME_TIPS, "MainProperty", MainProperty.OnAddQuitTimeTips)
SL:RegisterLUAEvent(LUA_EVENT_MAIN_DEL_QUIT_TIME_TIPS, "MainProperty", MainProperty.OnDelQuitTimeTips)
SL:RegisterLUAEvent(LUA_EVENT_WINDOW_CHANGE, "MainProperty", MainProperty.OnWindowChange)
SL:RegisterLUAEvent(LUA_EVENT_MAIN_CLOSE_KEYBOARD, "MainProperty", MainProperty.OnCloseKeyBoard)
SL:RegisterLUAEvent(LUA_EVENT_MAIN_PROPERTY_ON_KEY_ENTER, "MainProperty", MainProperty.handlePressedEnter)
SL:RegisterLUAEvent(LUA_EVENT_CHAT_PC_AUTO_SHOUT, "MainProperty", MainProperty.OnRefreshAutoShout)
end
----------------------------------------------------------------------------------------------
MainProperty.main()