diff --git a/MY_Cataclysm/src/MY_CataclysmMain.lua b/MY_Cataclysm/src/MY_CataclysmMain.lua index bde8d005c..e022e7f10 100644 --- a/MY_Cataclysm/src/MY_CataclysmMain.lua +++ b/MY_Cataclysm/src/MY_CataclysmMain.lua @@ -107,6 +107,8 @@ local function UpdateTeamMonData() if data.bCheckLevel then v.nLevel = data.nLevel end + v.szDisplayName = v.szDisplayName or data.szDisplayName + v.szDisplayName = v.szDisplayName and X.RenderTemplateString(v.szDisplayName, nil, -1, false, false) v.nIcon = data.nIcon table.insert(aBuff, v) end diff --git a/MY_Cataclysm/src/MY_CataclysmParty.lua b/MY_Cataclysm/src/MY_CataclysmParty.lua index 0fa7bdb8d..cab2a99d6 100644 --- a/MY_Cataclysm/src/MY_CataclysmParty.lua +++ b/MY_Cataclysm/src/MY_CataclysmParty.lua @@ -1699,7 +1699,7 @@ function D.UpdateCharaterBuff(p, handle, tKeep) local szCountdownKey = 'MY_CATACLYSM_' .. tBuff.dwID .. '_' .. tRule.szKey FireUIEvent('MY_LIFEBAR_COUNTDOWN', dwCharID, 'BUFF', szCountdownKey, { dwBuffID = tBuff.dwID, - szText = tBuff.szName, + szText = tRule.szDisplayName or tBuff.szName, nLogicFrame = tBuff.nEndFrame, col = tRule.colScreenHead or tRule.col, nPriority = tItem.nPriority, diff --git a/MY_TeamMon/src/MY_TeamMon.lua b/MY_TeamMon/src/MY_TeamMon.lua index 526f41f02..a18c2bee6 100644 --- a/MY_TeamMon/src/MY_TeamMon.lua +++ b/MY_TeamMon/src/MY_TeamMon.lua @@ -868,7 +868,7 @@ function D.CreateData(szEvent) if v.szContent then if v.szContent:find('{$me}') or v.szContent:find('{$team}') or v.bSearch or v.bReg then -- 具有通配符和搜索标记的数据不作 HIT 高速匹配策略考虑 table.insert(cache.OTHER, v) - elseif not cache.HIT[v.szContent] then -- 按照数据优先级顺序(地图>地图组>通用),同级按照下标先后顺序,只取第一个匹配结果 + elseif not (cache.HIT[v.szContent] and cache.HIT[v.szContent][v.szTarget or 'sys']) then -- 按照数据优先级顺序(地图>地图组>通用),同级按照下标先后顺序,只取第一个匹配结果 cache.HIT[v.szContent] = cache.HIT[v.szContent] or {} cache.HIT[v.szContent][v.szTarget or 'sys'] = v end @@ -1064,7 +1064,7 @@ function D.OnBuff(dwOwner, bDelete, bCanCancel, dwBuffID, nCount, nBuffLevel, dw if MY_TEAM_MON_SHIELDED_TOTAL then return end - if MY_TEAM_MON_SHIELDED_OTHER_PLAYER and X.IsPlayer(dwSkillSrcID) and dwSkillSrcID ~= MY_TEAM_MON_CORE_PLAYERID then + if MY_TEAM_MON_SHIELDED_OTHER_PLAYER and X.IsPlayer(dwSkillSrcID) and dwSkillSrcID ~= MY_TEAM_MON_CORE_PLAYERID and not X.IsTeammate(dwSkillSrcID) then return end local szType = bCanCancel and 'BUFF' or 'DEBUFF' @@ -1730,18 +1730,52 @@ function D.OnCallMessage(szEvent, szContent, dwNpcID, szNpcName) dwReceiverID, szReceiver = nil end if bInParty and content:find('{$team}', nil, true) then - local c = content - for _, vv in ipairs(team.GetTeamMemberList()) do - if string.find(szContent, c:gsub('{$team}', team.GetClientTeamMemberName(vv)), nil, true) and (v.szTarget == szNpcName or v.szTarget == '%') then -- hit - data = v - dwReceiverID = vv - szReceiver = team.GetClientTeamMemberName(vv) + if v.bReg then + -- 正则模式(带{$team}):逆向排除,先遍历成员名,替换为空,若替换成功,说明命中,再将正则规则{$team}替换为空,匹配剩余的内容,如此只用一次正则,节约性能 + local nHitMemberID, szHitMemberName, szProcessedContent + local tMembers = {} + -- 按名字长度降序排序,避免名字包含关系导致误判替换 + for _, vv in ipairs(team.GetTeamMemberList()) do + tMembers[#tMembers + 1] = { dwID = vv, szName = team.GetClientTeamMemberName(vv) } + end + table.sort(tMembers, function(a, b) return #a.szName > #b.szName end) + -- 替换正则规则{$team}为空,并获取{$team}数量,决定后续成员名替换为空次数 + local szPattern, nTeamCount = content:gsub('{$team}', '') + for _, member in ipairs(tMembers) do + local szReplaced = string.gsub(szContent, member.szName, '', nTeamCount) + if #szReplaced < #szContent then + nHitMemberID = member.dwID + szHitMemberName = member.szName + szProcessedContent = szReplaced + break + end + end + if nHitMemberID and szHitMemberName then + local res = {string.find(szProcessedContent, szPattern)} + if res[1] then + table.remove(res, 1) + table.remove(res, 1) + data = v + aBackreferences = res + dwReceiverID = nHitMemberID + szReceiver = szHitMemberName + break + end + end + else + local c = content + for _, vv in ipairs(team.GetTeamMemberList()) do + if string.find(szContent, c:gsub('{$team}', team.GetClientTeamMemberName(vv)), nil, true) and (v.szTarget == szNpcName or v.szTarget == '%') then -- hit + data = v + dwReceiverID = vv + szReceiver = team.GetClientTeamMemberName(vv) + break + end + end + if dwReceiverID and szReceiver then break end end - if dwReceiverID and szReceiver then - break - end elseif v.szTarget == szNpcName or v.szTarget == '%' then if v.bReg then local res = {string.find(szContent, content)}