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

1129 lines
41 KiB
Lua

Notice = {}
Notice.isPC = SL:GetMetaValue("WINPLAYMODE")
-- 全服消息
Notice._serverNotice = {}
Notice._serverNoticeStatus = false
Notice._serverNotice_11 = {}
Notice._serverNoticeStatus_11 = false
Notice._serverIndex = 0
Notice._serverIndex11 = 0
-- 消息 系统 跑马灯 和 顶端弹窗
Notice._systemNotice = {}
Notice._systemNoticeFlag = {}
Notice._systemIndex = 0
Notice._sysScaleIndex = 0
-- 系统 提示弹窗 警告
Notice._systemTips = {}
Notice._sysTipsIndex = 0
-- 系统 设置XY 跑马灯
Notice._systemXYCells = {}
Notice._sysXYIndex = 0
-- 提示 警告
Notice._timerIndex = 0
Notice._timerXYIndex = 0
-- 飘字 物品拾取获得消耗
Notice._itemTipsData = {}
Notice._itemTipsCells = {}
Notice._itemTimer = nil
Notice._itemIndex = 0
-- 飘字 属性变化
Notice._attributeData = {}
Notice._attributeCDing = nil
Notice._attrIndex = 0
-- 飘字 经验值变化
Notice._expNode = nil
Notice._expCells = {}
Notice._expIndex = 0
-- 掉落物品提示
Notice._dropTipsCells = {}
Notice._dropIndex = 0
-- 内功经验值提示
Notice._ngExpNode = nil
Notice._ngExpCells = {}
Notice._ngExpIndex = 0
Notice._ngExpParam = {}
function Notice.main()
local parent = GUI:Attach_Parent()
GUI:LoadExport(parent, "notice/notice")
Notice._ui = GUI:ui_delegate(parent)
Notice._root = Notice._ui["Node_notice"]
Notice._rootServerTips = Notice._ui["Node_server_tips"]
Notice._rootSystem = Notice._ui["Node_system"]
Notice._rootSystemXY = Notice._ui["Node_system_xy"]
Notice._rootSystemTips = Notice._ui["Node_system_tips"]
Notice._rootTimerTipsXY = Notice._ui["Node_timer_xy_tips"]
Notice._rootTimerTips = Notice._ui["Node_timer_tips"]
Notice._listviewTimerTips = Notice._ui["ListView_timer_tips"]
Notice._rootAttribute = Notice._ui["Node_attribute"]
Notice._rootItemTips = Notice._ui["Node_item_tips"]
Notice._rootDropTips = Notice._ui["Node_drop_tips"]
Notice._rootNormalTips = Notice._ui["Node_normal_tips"]
Notice.OnAdapet()
Notice.InitNGEXPSetParam()
Notice.RegisterEvent()
end
function Notice.close(isRemovedEvent)
Notice._ui = nil
-- 全服消息
Notice._serverNotice = {}
Notice._serverNoticeStatus = false
Notice._serverNotice_11 = {}
Notice._serverNoticeStatus_11 = false
Notice._serverIndex = 0
Notice._serverIndex11 = 0
-- 消息 系统 跑马灯 和 顶端弹窗
Notice._systemNotice = {}
Notice._systemNoticeFlag = {}
Notice._systemIndex = 0
Notice._sysScaleIndex = 0
-- 系统 提示弹窗 警告
Notice._systemTips = {}
Notice._sysTipsIndex = 0
-- 系统 设置XY 跑马灯
Notice._systemXYCells = {}
Notice._sysXYIndex = 0
-- 提示 警告
Notice._timerIndex = 0
Notice._timerXYIndex = 0
-- 飘字 物品拾取获得消耗
Notice._itemTipsData = {}
Notice._itemTipsCells = {}
Notice._itemTimer = nil
Notice._itemIndex = 0
-- 飘字 属性变化
Notice._attributeData = {}
Notice._attributeCDing = nil
Notice._attrIndex = 0
-- 飘字 经验值变化
Notice._expNode = nil
Notice._expCells = {}
Notice._expIndex = 0
-- 掉落物品提示
Notice._dropTipsCells = {}
Notice._dropIndex = 0
-- 内功经验值提示
Notice._ngExpNode = nil
Notice._ngExpCells = {}
Notice._ngExpIndex = 0
Notice._ngExpParam = {}
if isRemovedEvent then
return
end
Notice.RemoveEvent()
end
function Notice.OnAdapet()
local screenW = SL:GetMetaValue("SCREEN_WIDTH")
local screenH = SL:GetMetaValue("SCREEN_HEIGHT")
GUI:setPosition(Notice._rootTimerTipsXY, screenW / 2, 200)
GUI:setPosition(Notice._rootTimerTips, screenW / 2, 200)
GUI:setPosition(Notice._rootSystemTips, screenW / 2, screenH / 2)
GUI:setPositionX(Notice._rootAttribute, screenW - 300)
GUI:setPositionY(Notice._rootServerTips, screenH)
GUI:setPosition(Notice._rootSystem, screenW / 2, screenH)
GUI:setPositionX(Notice._rootItemTips, 50)
GUI:setPositionX(Notice._rootNormalTips, screenW / 2)
end
function Notice.createAttribute(parent)
GUI:LoadExport(parent, "notice/attribute_cell")
local ui = ui_delegate(parent)
local cell = ui["cell"]
return cell
end
function Notice.OnShowServerNotice(data)
table.insert(Notice._serverNotice, data)
Notice.CheckServerNotice()
end
function Notice.CheckServerNotice()
if Notice._serverNoticeStatus then
return
end
if not next(Notice._serverNotice) then
return
end
Notice._serverNoticeStatus = true
GUI:setVisible(Notice._rootServerTips, true)
local data = table.remove(Notice._serverNotice, 1)
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
local FColorRGB = SL:GetColorByStyleId(data.FColor)
local BColorRGB = SL:GetColorByStyleId(data.BColor)
-- richText
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
Notice._serverIndex = Notice._serverIndex + 1
-- local richText = GUI:RichTextFCOLOR_Create(Notice._rootServerTips, "richTextServer"..Notice._serverIndex, 0, 0, data.Msg, 10000, 18, FColorRGB, nil, nil, nil, outlineParam)
-- #type = 4[顶部跑马灯公告]
local richText = GUI:RichText_Create(Notice._rootServerTips, "richTextServer"..Notice._serverIndex, 0, 0, data.Msg, 10000, 18, FColorRGB)
GUI:setAnchorPoint(richText, 0, 1)
-- action
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local textContent = GUI:getContentSize(richText)
local actionTime = 15 + (textContent.width / visibleSize.width * 15)
local function callback()
GUI:removeFromParent(richText)
Notice._serverNoticeStatus = false
GUI:setVisible(Notice._rootServerTips, false)
Notice:CheckServerNotice()
end
local move1 = GUI:ActionMoveTo(0, visibleSize.width, 0)
local move2 = GUI:ActionMoveTo(actionTime, 0 - textContent.width, 0)
local sequence = GUI:ActionSequence(move1, move2, GUI:CallFunc(callback))
GUI:runAction(richText, sequence)
end
function Notice.OnShowServerEventNotice(data)
if data.Type == 11 then
Notice.ShowServerEventNotice_11(data)
end
end
function Notice.ShowServerEventNotice_11(data)
table.insert(Notice._serverNotice_11, data)
local function showServerEvent()
if Notice._serverNoticeStatus_11 then
return
end
if not next(Notice._serverNotice_11) then
return
end
Notice._serverNoticeStatus_11 = true
GUI:setVisible(Notice._rootServerTips, true)
local item = table.remove(Notice._serverNotice_11, 1)
item.FColor = item.FColor or 255
item.BColor = item.BColor or 255
local FColorRGB = SL:GetColorByStyleId(item.FColor)
local BColorRGB = SL:GetColorByStyleId(item.BColor)
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local capacitySize = {width = visibleSize.width * 0.5, height = 30}
-- layout
Notice._serverIndex11 = Notice._serverIndex11 + 1
local layout = GUI:Layout_Create(Notice._rootServerTips, "layout11"..Notice._serverIndex11, visibleSize.width/2, -30, capacitySize.width, capacitySize.height, false)
GUI:Layout_setBackGroundColor(layout, "#000000")
GUI:Layout_setBackGroundColorType(layout, 1)
GUI:Layout_setBackGroundColorOpacity(layout, 80)
GUI:Layout_setClippingEnabled(layout, true)
GUI:setAnchorPoint(layout, 0.5, 1)
-- richText
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE_NOTICE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
-- local richText = GUI:RichTextFCOLOR_Create(layout, "richText", 0, 0, item.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
-- #type = 11[屏幕跑马灯公告,系统公告]
local richText = GUI:RichText_Create(layout, "richText", 0, 0, item.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
GUI:setAnchorPoint(richText, 0, 0.5)
-- action
local contentSize = GUI:getContentSize(richText)
local actionTime = 10 + (contentSize.width / capacitySize.width * 10)
local function callback()
Notice._serverNoticeStatus_11 = false
GUI:removeFromParent(layout)
GUI:setVisible(Notice._rootServerTips, false)
showServerEvent()
end
local move1 = GUI:ActionMoveTo(0, capacitySize.width, capacitySize.height/2)
local move2 = GUI:ActionMoveTo(actionTime, 0 - capacitySize.width, capacitySize.height/2)
local sequence = GUI:ActionSequence(move1, move2, GUI:CallFunc(callback))
GUI:runAction(richText, sequence)
end
showServerEvent()
end
function Notice.OnShowSystemNotice(data)
data.Y = data.Y or 0
data.Count = data.Count or 1
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
local posY = data.Y
Notice._systemNotice[posY] = Notice._systemNotice[posY] or {}
table.insert(Notice._systemNotice[posY], data)
local function showSystemNotice()
if Notice._systemNoticeFlag[posY] then
return
end
local items = Notice._systemNotice[posY]
local item = table.remove(items, 1)
if not item then
return
end
Notice._systemNoticeFlag[posY] = true
local FColorRGB = SL:GetColorByStyleId(item.FColor)
local BColorRGB = SL:GetColorByStyleId(item.BColor)
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local capacitySize = {width = math.floor(visibleSize.width * 0.6), height = 30}
-- layout
Notice._systemIndex = Notice._systemIndex + 1
local layout = GUI:Layout_Create(Notice._rootSystem, "layout"..Notice._systemIndex, 0, 0 - item.Y, capacitySize.width, capacitySize.height, true)
GUI:Layout_setBackGroundColor(layout, "#000000")
GUI:Layout_setBackGroundColorType(layout, 1)
GUI:Layout_setBackGroundColorOpacity(layout, 80)
GUI:setAnchorPoint(layout, 0.5, 1)
-- richText
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE_NOTICE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
-- local richText = GUI:RichTextFCOLOR_Create(layout, "richText", capacitySize.width, capacitySize.height / 2, item.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
-- #type = 5[屏幕跑马灯公告,可控制Y轴]
local richText = GUI:RichText_Create(layout, "richText", capacitySize.width, capacitySize.height / 2, item.Msg, 10000, fontSize, FColorRGB)
GUI:setAnchorPoint(richText, 0, 0.5)
-- action
local contentSize = GUI:getContentSize(richText)
local actionTime = math.ceil(10 + (contentSize.width / capacitySize.width * 10))
local function callback()
Notice._systemNoticeFlag[posY] = false
GUI:removeFromParent(layout)
showSystemNotice()
end
local move1 = GUI:ActionMoveTo(0, capacitySize.width, capacitySize.height/2)
local move2 = GUI:ActionMoveTo(actionTime, 0 - contentSize.width, capacitySize.height/2)
local sequence = GUI:ActionSequence(move1, move2)
local acRepeat = GUI:ActionRepeat(sequence, item.Count)
local action = GUI:ActionSequence(acRepeat, GUI:CallFunc(callback))
GUI:runAction(richText, action)
end
showSystemNotice()
end
function Notice.OnShowSystemScaleNotice(data)
data.Y = data.Y or 125
data.Count = data.Count or 1
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
data.ShowTime = data.ShowTime or 1.4
local posY = data.Y
Notice._systemNotice[posY] = Notice._systemNotice[posY] or {}
table.insert(Notice._systemNotice[posY], data)
local function showSystemScaleNotice()
if Notice._systemNoticeFlag[posY] then
return
end
local items = Notice._systemNotice[posY]
local item = table.remove(items, 1)
if not item then
return
end
Notice._systemNoticeFlag[posY] = true
local FColorRGB = SL:GetColorByStyleId(item.FColor)
local BColorRGB = SL:GetColorByStyleId(item.BColor)
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local capacitySize = {visibleSize.width * 0.6, 30}
-- bg
Notice._sysScaleIndex = Notice._sysScaleIndex + 1
local imageBG = GUI:Image_Create(Notice._rootSystem, "imageBg"..Notice._sysScaleIndex, 0, 0 - item.Y, "res/public/bg_hhzy_01_2.png")
GUI:setCascadeOpacityEnabled(imageBG, true)
GUI:setAnchorPoint(imageBG, 0.5, 1)
-- richText
local contentSize = GUI:getContentSize(imageBG)
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE_NOTICE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
-- local richText = GUI:RichTextFCOLOR_Create(imageBG, "richText", contentSize.width/2, contentSize.height/2, item.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
-- #type = 13[系统公告缩放]
local richText = GUI:RichText_Create(imageBG, "richText", contentSize.width/2, contentSize.height/2, item.Msg, 10000, fontSize, FColorRGB)
GUI:setAnchorPoint(richText, 0.5, 0.5)
GUI:setCascadeOpacityEnabled(richText, true)
-- action
local function callback()
GUI:removeFromParent(imageBG)
Notice._systemNoticeFlag[posY] = nil
showSystemScaleNotice()
end
local sequence = GUI:ActionSequence(
GUI:ActionScaleTo(0, 1.5),
GUI:ActionEaseBackOut(GUI:ActionScaleTo(0.3, 1)),
GUI:DelayTime(item.ShowTime),
GUI:ActionFadeOut(0.5)
)
local acRepeat = GUI:ActionRepeat(sequence, item.Count)
local action = GUI:ActionSequence(acRepeat, GUI:CallFunc(callback))
GUI:runAction(imageBG, action)
end
showSystemScaleNotice()
end
function Notice.OnShowSystemXYNotice(data)
local X = tonumber(data.X)
local Y = tonumber(data.Y)
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
local FColorRGB = GET_COLOR_BYID_C3B(data.FColor)
local BColorRGB = GET_COLOR_BYID_C3B(data.BColor)
if not X or not Y then
return
end
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
Y = visibleSize.height - Y
GUI:setPosition(Notice._rootSystemXY, X, Y)
-- node
Notice._sysXYIndex = Notice._sysXYIndex + 1
local node = GUI:Node_Create(Notice._rootSystemXY, "nodeSysXYTip"..Notice._sysXYIndex, 0, 0)
GUI:setAnchorPoint(node, 0.5, 0)
GUI:setCascadeOpacityEnabled(node, true)
table.insert(Notice._systemXYCells, node)
-- action
local function callback()
table.remove(Notice._systemXYCells, 1)
end
local sequence = GUI:ActionSequence(GUI:DelayTime(2.5), GUI:ActionFadeOut(0.5), GUI:ActionRemoveSelf(), GUI:CallFunc(callback))
GUI:runAction(node, sequence)
-- richText
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE_NOTICE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
local richText = GUI:RichTextFCOLOR_Create(node, "richText", 0, 0, data.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
GUI:setCascadeOpacityEnabled(richText, true)
GUI:setAnchorPoint(richText, 0, 1)
local height = 30
local count = #Notice._systemXYCells
for key, cell in pairs(Notice._systemXYCells) do
GUI:setPositionY(cell, (count-key) * height)
end
end
function Notice.OnShowSystemTips(str)
-- node
Notice._sysTipsIndex = Notice._sysTipsIndex + 1
local node = GUI:Node_Create(Notice._rootNormalTips, "nodeSysTip"..Notice._sysTipsIndex, 0, 0)
GUI:setAnchorPoint(node, 0.5, 0.5)
GUI:setCascadeOpacityEnabled(node, true)
-- bg
local imageBG = GUI:Image_Create(node, "imageBG", 0, 0, "res/public/bg_hhzy_01_2.png")
GUI:Image_setScale9Slice(imageBG, 184, 184, 11, 11)
GUI:setAnchorPoint(imageBG, 0.5, 0.5)
-- text
local text = GUI:RichText_Create(node, "text", 0, 0, str, 0xffffff, 16, "#ffffff")
GUI:setCascadeOpacityEnabled(text, true)
GUI:setAnchorPoint(text, 0.5, 0.5)
local size = {width = GUI:getContentSize(text).width, height = 30}
GUI:setContentSize(imageBG, size.width + 20, size.height)
table.insert(Notice._systemTips, node)
-- 最多7条
if #Notice._systemTips > 7 then
GUI:removeFromParent(Notice._systemTips[1])
table.remove(Notice._systemTips, 1)
end
-- action
local function callback()
GUI:removeFromParent(node)
table.remove(Notice._systemTips, 1)
end
local sequence = GUI:ActionSequence(GUI:DelayTime(2), GUI:ActionFadeOut(0.8), GUI:CallFunc(callback))
GUI:runAction(node, sequence)
local actionTag = 999
for i = 1, #Notice._systemTips do
local cell = Notice._systemTips[i]
if cell then
GUI:setPositionY(cell, size.height * (#Notice._systemTips - i - 0.5))
local action = GUI:ActionMoveTo(0.15, 0, size.height * (#Notice._systemTips - i + 0.5))
GUI:setTag(action, actionTag)
GUI:stopActionByTag(cell, actionTag)
GUI:runAction(cell, action)
end
end
end
function Notice.OnShowTimerNotice(data)
data.Time = data.Time or 5
data.Label = data.Label or ""
data.X = data.X or 0
data.Y = data.Y or 0
data.Count = data.Count or 1
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
local FColorRGB = SL:GetColorByStyleId(data.FColor)
local BColorRGB = SL:GetColorByStyleId(data.BColor)
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local capacitySize = {width = math.floor(visibleSize.width), height = (Notice.isPC and 20 or 30) + data.Y}
-- layout
local function resetListview()
local count = GUI:ListView_getItemCount(Notice._listviewTimerTips)
local height = count * capacitySize.height
GUI:setContentSize(Notice._listviewTimerTips, capacitySize.width, height)
end
Notice._timerIndex = Notice._timerIndex + 1
local layout = GUI:Layout_Create(Notice._listviewTimerTips, "layoutTimer"..Notice._timerIndex, 0, 0, capacitySize.width, capacitySize.height, false)
resetListview()
local remaining = data.Time
local Msg = Msg_formatPercent(data.Msg)
local hasFormat = string.find(Msg, "%%")
local function callback()
local str = Msg
local formatMsg = function()
str = hasFormat and string.format(Msg, remaining) or Msg
end
if not pcall(formatMsg) then
SL:release_print("ERROR :TimerNotice "..Msg.." 格式错误")
GUI:ListView_removeChild(Notice._listviewTimerTips, layout)
resetListview()
return
end
GUI:removeAllChildren(layout)
-- richText
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE_NOTICE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
-- local richText = GUI:RichTextFCOLOR_Create(layout, "richText", 0, 0, str, 1000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
-- #type = 6[聊天上方公告]
local richText = GUI:RichText_Create(layout, "richText", 0, 0, str, 1000, fontSize, FColorRGB)
GUI:setAnchorPoint(richText, 0.5, 0.5)
GUI:setPosition(richText, capacitySize.width/2 + data.X, capacitySize.height/2 + data.Y)
if remaining < 0 then
if data.Label and string.len(data.Label) > 0 then
SL:SubmitAct({Act = data.Label})
end
GUI:ListView_removeChild(Notice._listviewTimerTips, layout)
resetListview()
end
remaining = remaining - 1
end
GUI:schedule(layout, callback, 1)
callback()
end
function Notice.OnDeleteTimerNotice()
GUI:ListView_removeAllItems(Notice._listviewTimerTips)
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local capacitySize = {width = visibleSize.width * 0.6, height = Notice.isPC and 20 or 30}
local count = GUI:ListView_getItemCount(Notice._listviewTimerTips)
local height = count * capacitySize.height
GUI:setContentSize(Notice._listviewTimerTips, capacitySize.width, height)
end
function Notice.OnShowTimerXYNotice(data)
data.Time = data.Time or 5
data.Y = data.Y or 0
data.X = data.X or 0
data.Count = data.Count or 1
data.FColor = data.FColor or 255
data.BColor = data.BColor or 0
local FColorRGB = SL:GetColorByStyleId(data.FColor)
local BColorRGB = SL:GetColorByStyleId(data.BColor)
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
local capacitySize = {width = visibleSize.width * 0.6, height = Notice.isPC and 20 or 30}
GUI:removeAllChildren(Notice._rootTimerTipsXY)
if data.X == 0 then
GUI:setPositionX(Notice._rootTimerTipsXY, visibleSize.width/2)
else
GUI:setPositionX(Notice._rootTimerTipsXY, data.X)
end
Notice._timerXYIndex = Notice._timerXYIndex + 1
local layout = GUI:Layout_Create(Notice._rootTimerTipsXY, "layoutXYTimer"..Notice._timerXYIndex, 0, 0, capacitySize.width, capacitySize.height, false)
if data.X == 0 then
GUI:setAnchorPoint(layout, 0.5, 0)
else
GUI:setAnchorPoint(layout, 0, 0)
end
local remaining = data.Time - 1
local Msg = Msg_formatPercent(data.Msg)
local hasFormat = string.find(Msg, "%%")
local function callback()
local str = Msg
local formatMsg = function()
str = hasFormat and string.format(Msg, SL:SecondToHMS(remaining, true)) or Msg
end
if not pcall(formatMsg) then
SL:release_print("ERROR :TimerNoticeXY "..Msg.." 格式错误")
GUI:removeAllChildren(Notice._rootTimerTipsXY)
return
end
GUI:removeAllChildren(layout)
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
local richText = GUI:RichTextFCOLOR_Create(layout, "richText", capacitySize.width/2, capacitySize.height/2, str, 1000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
GUI:setAnchorPoint(richText, 0.5, 0.5)
local text = GUI:Text_Create(layout, "text", 0, 0, fontSize, "#ffffff", str)
GUI:setVisible(text, false)
local textWidth = GUI:getContentSize(text).width
if data.X ~= 0 then
GUI:setPositionX(Notice._rootTimerTipsXY, data.X - (capacitySize.width/2 - textWidth/2))
end
if remaining < 0 then
if data.Label and string.len(data.Label) > 0 then
SL:SubmitAct({Act = data.Label})
end
GUI:removeAllChildren(Notice._rootTimerTipsXY)
end
remaining = remaining - 1
end
GUI:schedule(layout, callback, 1)
callback()
end
function Notice.OnDeleteTimerXYNotice()
GUI:removeAllChildren(Notice._rootTimerTipsXY)
end
function Notice.OnShowItemTips(info)
local size = {width = 170, height = 20}
table.insert(Notice._itemTipsData, info)
if #Notice._itemTipsData > 4 then
table.remove(Notice._itemTipsData, #Notice._itemTipsData)
end
local function showTips()
if #Notice._itemTipsData == 0 then
SL:UnSchedule(Notice._itemTimer)
Notice._itemTimer = nil
return
end
local tipsData = table.remove(Notice._itemTipsData, #Notice._itemTipsData)
local data = tipsData.data
local str = tipsData.str
-- node
Notice._itemIndex = Notice._itemIndex + 1
local node = GUI:Node_Create(Notice._rootItemTips, "nodeItem"..Notice._itemIndex, 0, 0)
table.insert(Notice._itemTipsCells, node)
-- richText
if Notice.isPC then
local text = GUI:BmpText_Create(node, "text", 0, 0, SL:ConvertColorFromHexString(data.color), str)
if data.heroStr then
local text2 = GUI:BmpText_Create(node, "text2", -4, 0, SL:ConvertColorFromHexString(data.heroColor), data.heroStr)
GUI:setAnchorPoint(text2, 1, 0)
end
else
local text = GUI:RichText_Create(node, "text", 0, 0, str, 1136)
GUI:setAnchorPoint(text, 0, 0.5)
GUI:setCascadeOpacityEnabled(text, true)
end
-- 最多4条
while #Notice._itemTipsCells > 4 do
GUI:removeFromParent(Notice._itemTipsCells[1])
table.remove(Notice._itemTipsCells, 1)
end
-- action
local function callback()
GUI:removeFromParent(node)
table.remove(Notice._itemTipsCells, 1)
end
GUI:setCascadeOpacityEnabled(node, true)
local sequence = GUI:ActionSequence(GUI:DelayTime(2), GUI:ActionFadeTo(0.8,50), GUI:CallFunc(callback))
GUI:runAction(node, sequence)
local actionTag = 999
for i = 1, #Notice._itemTipsCells do
if Notice._itemTipsCells[i] then
GUI:setPositionY(Notice._itemTipsCells[i], size.height * (#Notice._itemTipsCells - i - 0.5))
local action = GUI:ActionMoveTo(0.15, 0, size.height * (#Notice._itemTipsCells - i + 0.5))
GUI:setTag(action, actionTag)
GUI:stopActionByTag(Notice._itemTipsCells[i], actionTag)
GUI:runAction(Notice._itemTipsCells[i], action)
end
end
end
if not Notice._itemTimer then
Notice._itemTimer = SL:Schedule(showTips, 1/60)
end
end
function Notice.OnShowAttributeTips(data)
-- 空消息
if not next(data) then
return
end
-- 最多七条
table.insert(Notice._attributeData, data)
if #Notice._attributeData > 1 then
table.remove(Notice._attributeData, 1)
end
Notice.CheckNoticeAttribute()
end
function Notice.CheckNoticeAttribute()
-- 解析cd中
if Notice._attributeCDing then
return false
end
-- 没有消息
if #Notice._attributeData == 0 then
return false
end
-- 解析下一个
local function nextEvent()
Notice._attributeCDing = false
Notice.CheckNoticeAttribute()
end
SL:scheduleOnce(Notice._rootAttribute, nextEvent, 2.5)
Notice._attributeCDing = true
local data = Notice._attributeData[1]
table.remove(Notice._attributeData, 1)
local attributes = data.attributes
local attr_type = data.attr_type or 0
local attr_data = {}
local showAttrs = GUIFunction:GetAttShowOrder(attributes)
for i, v in ipairs(showAttrs) do
-- 最多显示7条
if i > 7 then
break
end
local data = {}
data.name = v.name
data.attr = v.value
table.insert(attr_data, data)
end
if SL.Triggers[LUA_TRIGGER_NOTICE_SHOW_ATTRIBUTES] and SL.Triggers[LUA_TRIGGER_NOTICE_SHOW_ATTRIBUTES](attr_data) then
return false
end
Notice.ShowAttributes(attr_data)
end
function Notice.ShowAttributes(attrs)
local attributeCells = {}
for i, v in ipairs(attrs) do
-- cell
Notice._attrIndex = Notice._attrIndex + 1
local widget = GUI:Widget_Create(Notice._rootAttribute, "widget"..Notice._attrIndex, 0, 0)
local cell = Notice.createAttribute(widget)
GUI:setVisible(cell, true)
table.insert(attributeCells, cell)
local textName = GUI:getChildByName(cell, "Text_name")
local textAttr = GUI:getChildByName(cell, "Text_attr")
-- name
GUI:Text_setFontSize(textName, SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE") or 16)
GUI:Text_setTextColor(textName, "#28ef01")
GUI:Text_enableOutline(textName, "#111111", 1)
GUI:Text_setString(textName, v.name)
GUI:setPositionX(textName, 0)
-- attribute
GUI:Text_setFontSize(textAttr, SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE") or 16)
GUI:Text_setTextColor(textAttr, "#28ef01")
GUI:Text_enableOutline(textAttr, "#111111", 1)
GUI:Text_setString(textAttr, "+ " .. v.attr)
local posX = GUI:getPositionX(textName) + GUI:getContentSize(textName).width + 0
GUI:setPositionX(textAttr, posX)
-- action
local attrPos = 0 - (i - 1) * 30
GUI:setPositionY(cell, attrPos - 100)
GUI:setOpacity(cell, 0)
local function delayEvent()
if next(attributeCells) then
table.remove(attributeCells, 1)
end
for _, vNode in ipairs(attributeCells) do
GUI:runAction(vNode, GUI:ActionMoveBy(0.15, 0, 40))
end
end
local delay = (i - 1) * 0.15
local spawn1 = GUI:ActionSpawn(GUI:ActionFadeIn(0.2), GUI:ActionMoveBy(0.2, 0, 100))
local spawn2 = GUI:ActionSpawn(GUI:CallFunc(delayEvent),
GUI:ActionFadeOut(0.2),
GUI:ActionScaleTo(0.2, 0.8),
GUI:ActionMoveBy(0.2, 100, 20)
)
local sequence = GUI:ActionSequence(GUI:DelayTime(delay), spawn1, GUI:DelayTime(1.5), spawn2, GUI:ActionRemoveSelf())
GUI:runAction(cell, sequence)
end
end
function Notice.OnShowPlayerEXPNotice(data)
local X = tonumber(data.X)
local Y = tonumber(data.Y)
data.FColor = data.FColor or 255
data.BColor = data.BColor or 255
local FColorRGB = SL:GetColorByStyleId(data.FColor)
local BColorRGB = SL:GetColorByStyleId(data.BColor)
if not X or not Y then
return
end
if not Notice._expNode then
Notice._expNode = GUI:Node_Create(Notice._root, "_expNode", 0, 0)
GUI:setAnchorPoint(Notice._expNode, 0, 0)
end
local notch, rect = SL:GetMetaValue("NOTCH_PHONE_INFO")
local bangsX = rect and rect.x or 0
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
Y = visibleSize.height - Y
GUI:setPosition(Notice._expNode, X + bangsX, Y)
-- node
Notice._expIndex = Notice._expIndex + 1
local node = GUI:Node_Create(Notice._expNode, "nodeEXP"..Notice._expIndex, 0, 0)
GUI:setAnchorPoint(node, 0, 0)
GUI:setCascadeOpacityEnabled(node, true)
-- richText
local fontSize = SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
local richText = GUI:RichTextFCOLOR_Create(node, "richText", 0, 0, data.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
GUI:setCascadeOpacityEnabled(richText, true)
GUI:setAnchorPoint(richText, 0, 1)
GUI:setIgnoreContentAdaptWithSize(richText, false)
-- action
Notice._expCells[#Notice._expCells + 1] = node
while #Notice._expCells > 4 do
GUI:removeFromParent(Notice._expCells[1])
table.remove(Notice._expCells, 1)
end
local function callback()
GUI:removeFromParent(node)
table.remove(Notice._expCells, 1)
end
local sequence = GUI:ActionSequence(GUI:DelayTime(2), GUI:ActionFadeOut(0.5), GUI:CallFunc(callback))
GUI:runAction(node,sequence)
local tag = 999
for index, cell in pairs(Notice._expCells) do
cell:setPositionY(30 * (#Notice._expCells - index - 1))
local action = GUI:ActionMoveTo(0.15, 0, 30 * (#Notice._expCells - index))
GUI:setTag(action, tag)
GUI:stopActionByTag(cell, tag)
GUI:runAction(cell, action)
end
end
function Notice.OnShowItemDropNotice(data)
local paramList = SL:GetMetaValue("GAME_DATA","ShowDropNotice") and string.split(SL:GetMetaValue("GAME_DATA","ShowDropNotice"), "|")
local setList = {}
if paramList and paramList[1] and string.len(paramList[1]) > 0 then
local set = paramList[1]
setList = string.split(set, "#")
end
local X = setList[1] and tonumber(setList[1]) or 0
local Y = setList[2] and tonumber(setList[2]) or 0
local interval = setList[3] and tonumber(setList[3]) or 0
local setFontSize = setList[4] and tonumber(setList[4])
local maxCount = setList[5] and tonumber(setList[5]) or 4
local delayTime = setList[6] and tonumber(setList[6]) or 2
local opacity = setList[7] and tonumber(setList[7]) or 0
data.FColor = data.FColor or 255
local FColorHEX = SL:GetHexColorByStyleId(data.FColor)
local BColorRGB = data.BColor and SL:GetHexColorByStyleId(data.BColor)
-- node
local viewSize = SL:GetMetaValue("SCREEN_SIZE")
Notice._rootDropTips:setPositionX(viewSize.width/2 + X)
local originY = viewSize.height - 50
Notice._rootDropTips:setPositionY(originY + Y)
Notice._dropIndex = Notice._dropIndex + 1
local node = GUI:Node_Create(Notice._rootDropTips, "nodeDrop"..Notice._dropIndex, 0, 0)
GUI:setAnchorPoint(node, 0.5, 0)
GUI:setCascadeOpacityEnabled(node, true)
-- layout
local layout = nil
if BColorRGB and (data.BColor and data.BColor ~= -1) then
layout = GUI:Layout_Create(node, "layout", 0, 0, 200, 30, true)
GUI:Layout_setBackGroundColor(layout, BColorRGB)
GUI:Layout_setBackGroundColorType(layout, 1)
GUI:Layout_setBackGroundColorOpacity(layout, opacity)
GUI:setAnchorPoint(layout, 0.5, 0)
end
-- richText
local fontSize = setFontSize or SL:GetMetaValue("GAME_DATA","DEFAULT_FONT_SIZE") or 16
local richText = GUI:RichText_Create(node, "richText", 0, 0, data.Msg, 10000, fontSize, FColorHEX)
GUI:setCascadeOpacityEnabled(richText, true)
GUI:setAnchorPoint(richText, 0.5, 0)
-- size
local sizeW = GUI:getContentSize(richText).width
local sizeH = GUI:getContentSize(richText).height
if layout then
GUI:setContentSize(layout, sizeW, sizeH)
end
-- action
table.insert(Notice._dropTipsCells, node)
if #Notice._dropTipsCells > maxCount then
GUI:removeFromParent(Notice._dropTipsCells[1])
table.remove(Notice._dropTipsCells, 1)
end
local function callback()
GUI:removeFromParent(node)
table.remove(Notice._dropTipsCells, 1)
end
local sequence = GUI:ActionSequence(GUI:DelayTime(delayTime), GUI:ActionFadeOut(0.8), GUI:CallFunc(callback))
GUI:runAction(node, sequence)
local tag = 999
for i = 1, #Notice._dropTipsCells do
local node = Notice._dropTipsCells[i]
if node then
local action = GUI:ActionMoveTo(0.15, 0, (sizeH + interval) * (#Notice._dropTipsCells - i ) - interval)
GUI:setTag(action, tag)
GUI:stopActionByTag(node, tag)
GUI:setPositionY(node, (sizeH + interval) * (#Notice._dropTipsCells - i - 1) - interval)
GUI:runAction(node, action)
end
end
end
function Notice.InitNGEXPSetParam()
-- 解析配置
if SL:GetMetaValue("GAME_DATA", "NGEXPcoordinate") then
local slicesP = string.split(SL:GetMetaValue("GAME_DATA", "NGEXPcoordinate"), "|")
-- 下标: 1 移动端位置XY 2 PC端位置XY 3 颜色FColor#BColor 4 需满足的经验值
for i = 1, 4 do
local pointXY = string.split(slicesP[i] or "0#0","#")
local param1 = tonumber(pointXY[1]) or (i == 3 and 255 or 0)
local param2 = tonumber(pointXY[2]) or 0
if i == 4 then
Notice._ngExpParam[i] = param1
elseif i == 3 then
Notice._ngExpParam[i] = {FColor = param1, BColor = param2}
else
Notice._ngExpParam[i] = {X = param1, Y = param2}
end
end
end
end
function Notice.OnShowNGEXPNotice(data)
if not Notice._ngExpParam or not next(Notice._ngExpParam) then
return
end
local needExp = Notice._ngExpParam[4]
if not data.changed or data.changed < needExp then
return
end
local type = Notice.isPC and 2 or 1
local X = Notice._ngExpParam[type].X
local Y = Notice._ngExpParam[type].Y
data.FColor = Notice._ngExpParam[3].FColor or 255
data.BColor = Notice._ngExpParam[3].BColor or 255
local FColorRGB = SL:GetColorByStyleId(data.FColor)
local BColorRGB = SL:GetColorByStyleId(data.BColor)
if not X or not Y then
return
end
if not Notice._ngExpNode then
Notice._ngExpNode = GUI:Node_Create(Notice._root, "_ngExpNode", 0, 0)
GUI:setAnchorPoint(Notice._ngExpNode, 0, 0)
end
local visibleSize = SL:GetMetaValue("SCREEN_SIZE")
Y = visibleSize.height - Y
GUI:setPosition(Notice._ngExpNode, X, Y)
-- node
Notice._ngExpIndex = Notice._ngExpIndex + 1
local node = GUI:Node_Create(Notice._ngExpNode, "nodeNGEXP" .. Notice._ngExpIndex, 0, 0)
GUI:setAnchorPoint(node, 0, 0)
GUI:setCascadeOpacityEnabled(node, true)
-- richText
local fontSize = SL:GetMetaValue("GAME_DATA", "DEFAULT_FONT_SIZE") or 16
local outlineParam = {
outlineSize = 1,
outlineColor = BColorRGB
}
if string.find(data.Msg, "%%s") then
data.Msg = string.format(data.Msg, data.changed)
end
local richText = GUI:RichTextFCOLOR_Create(node, "richText", 0, 0, data.Msg, 10000, fontSize, FColorRGB, nil, nil, nil, outlineParam)
GUI:setCascadeOpacityEnabled(richText, true)
GUI:setAnchorPoint(richText, 0, 1)
GUI:setIgnoreContentAdaptWithSize(richText, false)
-- action
Notice._ngExpCells[#Notice._ngExpCells + 1] = node
while #Notice._ngExpCells > 4 do
GUI:removeFromParent(Notice._ngExpCells[1])
table.remove(Notice._ngExpCells, 1)
end
local function callback()
GUI:removeFromParent(node)
table.remove(Notice._ngExpCells, 1)
end
local sequence = GUI:ActionSequence(GUI:DelayTime(2), GUI:ActionFadeOut(0.5), GUI:CallFunc(callback))
GUI:runAction(node,sequence)
local tag = 999
for index, cell in pairs(Notice._ngExpCells) do
cell:setPositionY(30 * (#Notice._ngExpCells - index - 1))
local action = GUI:ActionMoveTo(0.15, 0, 30 * (#Notice._ngExpCells - index))
GUI:setTag(action, tag)
GUI:stopActionByTag(cell, tag)
GUI:runAction(cell, action)
end
end
function Notice.OnShowHeroNGEXPNotice(data)
local msg = "%s <英雄/FCOLOR=22>内功经验值增加."
data.Msg = msg
Notice.OnShowNGEXPNotice(data)
end
function Notice.OnShowPlayerNGEXPNotice(data)
local msg = "%s 内功经验值增加."
data.Msg = msg
Notice.OnShowNGEXPNotice(data)
end
-----------------------------------注册事件--------------------------------------
function Notice.RegisterEvent()
SL:RegisterLUAEvent(LUA_EVENT_WINDOW_CHANGE, "Notice", Notice.OnAdapet)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_SERVER, "Notice", Notice.OnShowServerNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_SERVER_EVENT, "Notice", Notice.OnShowServerEventNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM, "Notice", Notice.OnShowSystemNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM_TIPS, "Notice", Notice.OnShowSystemTips)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM_SCALE, "Notice", Notice.OnShowSystemScaleNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM_XY, "Notice", Notice.OnShowSystemXYNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_TIMER, "Notice", Notice.OnShowTimerNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_DELETE_TIMER, "Notice", Notice.OnDeleteTimerNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_TIMER_XY, "Notice", Notice.OnShowTimerXYNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_DELETE_TIMER_XY, "Notice", Notice.OnDeleteTimerXYNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_ITEM_TIPS, "Notice", Notice.OnShowItemTips)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_ATTRIBUTE, "Notice", Notice.OnShowAttributeTips)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_EXP, "Notice", Notice.OnShowPlayerEXPNotice)
SL:RegisterLUAEvent(LUA_EVENT_NOTICE_DROP, "Notice", Notice.OnShowItemDropNotice)
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_INTERNAL_EXP_CHANGE, "Notice", Notice.OnShowPlayerNGEXPNotice)
SL:RegisterLUAEvent(LUA_EVENT_HERO_INTERNAL_EXP_CHANGE, "Notice", Notice.OnShowHeroNGEXPNotice)
end
function Notice.RemoveEvent()
SL:UnRegisterLUAEvent(LUA_EVENT_WINDOW_CHANGE, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_SERVER, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_SERVER_EVENT, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM_TIPS, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM_SCALE, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_SYSYTEM_XY, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_TIMER, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_DELETE_TIMER, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_TIMER_XY, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_DELETE_TIMER_XY, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_ITEM_TIPS, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_ATTRIBUTE, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_EXP, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_NOTICE_DROP, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_PLAYER_INTERNAL_EXP_CHANGE, "Notice")
SL:UnRegisterLUAEvent(LUA_EVENT_HERO_INTERNAL_EXP_CHANGE, "Notice")
end