📄 ct_raidassist.lua
字号:
local uName = UnitName("raid" .. i);
if ( uName and uName == v ) then
CT_RA_UpdateUnitStatus(getglobal("CT_RAMember" .. i));
break;
end
end
end
end
end
end
elseif ( event == "CHAT_MSG_PARTY" ) then
if ( frame ) then
if ( arg6 and not unitStats[arg6] and ( arg6 == "AFK" or arg6 == "DND" ) ) then
unitStats[arg6] = { 1, 0 };
CT_RA_UpdateUnitDead(frame);
elseif ( ( not arg6 or arg6 == "" ) and ( unitStats["DND"] or unitStats["AFK"] ) ) then
unitStats["DND"] = nil;
unitStats["AFK"] = nil;
CT_RA_UpdateUnitDead(frame);
end
end
end
end
CT_RA_oldChatFrame_OnEvent = ChatFrame_OnEvent;
function CT_RA_newChatFrame_OnEvent(event)
if ( strsub(event, 1, 13) == "CHAT_MSG_RAID" ) then
local tempOptions = CT_RAMenu_Options["temp"];
local name, rank;
for i = 1, GetNumRaidMembers(), 1 do
name, rank = GetRaidRosterInfo(i);
if ( name == arg2 ) then
if ( rank and rank < 1 and CT_RA_Squelch > 0 ) then
return;
end
break;
end
end
if ( not rank ) then
rank = 0;
end
if ( rank >= 1 and ( arg1 == "<团队助手> 禁言模式,禁止发言。" or arg1 == "<团队助手> 禁言模式结束。" ) ) then
return;
end
if ( rank == 2 and ( not tempOptions["leaderColor"] or tempOptions["leaderColor"].enabled ) ) then
CT_RA_oldAddMessage = this.AddMessage;
this.AddMessage = CT_RA_newAddMessage;
CT_RA_oldChatFrame_OnEvent(event);
this.AddMessage = CT_RA_oldAddMessage;
return;
end
elseif ( event == "CHAT_MSG_WHISPER" ) then
local tempOptions = CT_RAMenu_Options["temp"];
if ( ( tempOptions["KeyWord"] and strlower(arg1) == strlower(tempOptions["KeyWord"]) ) or arg1 == "<团队助手> 禁言模式启用,请保持安静。" ) then
return;
end
elseif ( event == "CHAT_MSG_SYSTEM" ) then
local iStart, iEnd, sName, iID, iDays, iHours, iMins, iSecs = string.find(arg1, "(.+) %(ID=(%w+)%):(%d+)d (%d+)h (%d+)m (%d+)s");
if ( sName ) then
local table = date("*t");
table["sec"] = table["sec"] + (tonumber(iDays) * 86400) + (tonumber(iHours) * 3600) + (tonumber(iMins) * 60) + iSecs;
arg1 = arg1 .. " ("..date("%A %b %d, %I:%M%p", time(table)) .. ")";
end
elseif ( event == "CHAT_MSG_WHISPER_INFORM" ) then
if ( arg1 == "<团队助手> 你已经有组了。" or string.find(arg1, "^<团队助手> 禁言模式启用,请保持安静。剩余%d+秒。$") ) then
return;
end
end
CT_RA_oldChatFrame_OnEvent(event);
end
ChatFrame_OnEvent = CT_RA_newChatFrame_OnEvent;
function CT_RA_newAddMessage(obj, msg, r, g, b)
local tempOptions = CT_RAMenu_Options["temp"];
local newR, newG, newB = 1, 1, 0;
if ( tempOptions["leaderColor"] ) then
newR, newG, newB = tempOptions["leaderColor"].r, tempOptions["leaderColor"].g, tempOptions["leaderColor"].b;
end
return CT_RA_oldAddMessage(obj, string.gsub(msg, "(|Hplayer:.-|h%[)(.-)(%])", "%1|c00" .. CT_RA_RGBToHex(newR, newG, newB) .. "%2|r%3"), r, g, b);
end
function CT_RA_ParseMessage(nick, msg)
local tempOptions = CT_RAMenu_Options["temp"];
local useless, val1, val2, val3, val4, frame, raidid, rank, update;
local numRaidMembers = GetNumRaidMembers();
local playerName = UnitName("player");
for i = 1, numRaidMembers, 1 do
if ( UnitName("raid" .. i) == nick ) then
raidid = i;
useless, rank = GetRaidRosterInfo(i);
frame = getglobal("CT_RAMember"..i);
break;
end
end
if ( not raidid or not frame ) then
return;
end
local unitStats = CT_RA_Stats[nick];
if ( not unitStats ) then
if ( not update ) then
update = { };
end
CT_RA_Stats[nick] = {
["Buffs"] = { },
["Debuffs"] = { },
["Position"] = { }
};
unitStats = CT_RA_Stats[nick];
tinsert(update, raidid);
end
unitStats["Reporting"] = 1;
-- Check buff renewal
useless, useless, val1, val2, val3 = string.find(msg, "^RN ([^%s]+) ([^%s]+) ([^%s]+)$"); -- timeleft(1), id(2), num(3)
if ( tonumber(val1) and tonumber(val2) and tonumber(val3) ) then
-- Buffs
local buff;
for k, v in tempOptions["BuffArray"] do
if ( tonumber(val2) == v["index"] ) then
buff = v;
break;
end
end
if ( not buff and tonumber(val2) == -1 ) then
buff = { ["show"] = 1, ["name"] = CT_RA_FEIGNDEATH[CT_RA_GetLocale()] };
elseif ( not buff ) then
return update;
end
local name = buff["name"];
if ( type(name) == "table" ) then
if ( tonumber(val3) ) then
name = name[tonumber(val3)];
else
return update;
end
end
local text = CT_RA_BuffTextures[name];
if ( not name or not text ) then
return update;
end
unitStats["Buffs"][name] = { text[1], tonumber(val1) };
return update;
end
-- Check status requests
if ( msg == "SR" ) then
if ( unitStats ) then
unitStats["Buffs"] = { };
unitStats["Debuffs"] = { };
table.setn(unitStats["Buffs"], 0);
table.setn(unitStats["Debuffs"], 0);
end
CT_RA_ScanPartyAuras("raid" .. raidid);
CT_RA_UpdateFrame.scheduleUpdate = 8;
CT_RA_UpdateFrame.scheduleMTUpdate = 8;
return update;
end
if ( strsub(msg, 1, 2) == "S " ) then
for str in string.gfind(msg, " B [^%s]+ [^%s]+ [^#]+ #") do
useless, useless, val1, val3, val2 = string.find(str, "B ([^%s]+) ([^%s]+) (.+) #");
if ( val1 and val2 and val3 ) then
unitStats["Buffs"][val2] = { val1, tonumber(val3) };
CT_RA_UpdateUnitBuffs(unitStats["Buffs"], frame, nick);
end
end
return update;
end
if ( strsub(msg, 1, 3) == "MS " ) then
if ( rank >= 1 ) then
if ( tempOptions["PlayRSSound"] ) then
PlaySoundFile("Sound\\Doodad\\BellTollNightElf.wav");
end
CT_RAMessageFrame:AddMessage(nick .. ": " .. strsub(msg, 3), tempOptions["DefaultAlertColor"].r, tempOptions["DefaultAlertColor"].g, tempOptions["DefaultAlertColor"].b, 1.0, UIERRORS_HOLD_TIME);
end
return update;
end
useless, useless, val1 = string.find(msg, "^V ([%d%.]+)$");
if ( tonumber(val1) ) then
unitStats["Version"] = tonumber(val1);
return update;
end
if ( strsub(msg, 1, 4) == "SET " ) then
local useless, useless, num, name = string.find(msg, "^SET (%d+) (.+)$");
if ( num and name ) then
if ( rank >= 1 ) then
for k, v in CT_RA_MainTanks do
if ( v == name ) then
CT_RA_MainTanks[k] = nil;
CT_RATarget.MainTanks[k] = nil;
end
end
local mtID = 0;
for i = 1, numRaidMembers, 1 do
if ( UnitName("raid" .. i) == name ) then
mtID = i;
break;
end
end
CT_RA_MainTanks[tonumber(num)] = name;
CT_RATarget.MainTanks[tonumber(num)] = { mtID, name };
CT_RATarget_UpdateInfoBox();
CT_RATarget_UpdateStats();
CT_RAOptions_Update();
CT_RA_UpdateMTs();
end
end
return update;
end
if ( strsub(msg, 1, 2) == "R " ) then
local useless, useless, name = string.find(msg, "^R (.+)$");
if ( name ) then
for k, v in CT_RA_MainTanks do
if ( v == name ) then
for i = 1, GetNumRaidMembers(), 1 do
local user, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i);
if ( rank >= 1 and user == nick ) then
CT_RA_MainTanks[k] = nil;
CT_RATarget.MainTanks[k] = nil;
CT_RA_UpdateMTs();
CT_RAOptions_Update();
return update;
end
end
end
end
end
return update;
end
if ( msg == "DB" ) then
if ( rank >= 1 ) then
CT_RA_Print("<团队助手> 解散团队请求,发送人'|c00FFFFFF" .. nick .. "|r'。", 1, 0.5, 0);
LeaveParty();
end
return update;
end
if ( msg == "RESSED" ) then
unitStats["Ressed"] = 1;
CT_RA_UpdateUnitDead(frame);
return update;
end
if ( msg == "NORESSED" ) then
unitStats["Ressed"] = nil;
CT_RA_UpdateUnitDead(frame);
return update;
end
if ( msg == "CANRES" ) then
unitStats["Ressed"] = 2;
CT_RA_UpdateUnitDead(frame);
return update;
end
if ( strsub(msg, 1, 3) == "RES" ) then
if ( msg == "RESNO" ) then
CT_RA_Ressers[nick] = nil;
else
local _, _, player = string.find(msg, "^RES (.+)$");
if ( player ) then
CT_RA_Ressers[nick] = player;
end
end
CT_RA_UpdateResFrame();
return update;
end
-- Check ready
if ( msg == "CHECKREADY" ) then
if ( rank >= 1 ) then
CT_RA_CheckReady_Person = nick;
if ( nick ~= playerName ) then
PlaySoundFile("Sound\\interface\\levelup2.wav");
CT_RA_ReadyFrame:Show();
end
end
return update;
elseif ( ( msg == "READY" or msg == "NOTREADY" ) and CT_RA_CheckReady_Person == playerName ) then
if ( msg == "READY" ) then
unitStats["notready"] = nil;
else
unitStats["notready"] = 2;
end
local all_ready = true;
local nobody_ready = true;
for k, v in CT_RA_Stats do
if ( v["notready"] ) then
all_ready = false;
if ( v["notready"] == 1 ) then
nobody_ready = false;
end
end
end
if ( all_ready ) then
CT_RA_Print("<团队助手> 准备就绪检查。", 1, 1, 0);
elseif ( not all_ready and nobody_ready ) then
CT_RA_UpdateFrame.readyTimer = 0.1;
end
CT_RA_UpdateUnitDead(frame);
return update;
end
-- Check Rly
if ( msg == "CHECKRLY" ) then
if ( rank >= 1 ) then
CT_RA_CheckRly_Person = nick;
if ( nick ~= UnitName("player") ) then
PlaySoundFile("Sound\\interface\\levelup2.wav");
CT_RA_RlyFrame:Show();
end
end
return update;
elseif ( ( msg == "YARLY" or msg == "NORLY" ) and CT_RA_CheckRly_Person == playerName ) then
if ( msg == "YARLY" ) then
unitStats["rly"] = nil;
else
unitStats["rly"] = 1;
end
local all_ready = true;
local nobody_ready = true;
for k, v in CT_RA_Stats do
if ( v["rly"] ) then
all_ready = false;
if ( v["rly"] == 1 ) then
nobody_ready = false;
end
end
end
if ( all_ready ) then
CT_RA_Print("<团队助手>你准备好了吗?", 1, 1, 0);
elseif ( not all_ready and nobody_ready ) then
CT_RA_UpdateFrame.rlyTimer = 0.1;
end
CT_RA_UpdateUnitDead(frame);
return update;
end
-- Check AFK
if ( msg == "AFK" ) then
unitStats["AFK"] = { 1, 0 };
CT_RA_UpdateUnitDead(frame);
return update;
elseif ( msg == "UNAFK" ) then
unitStats["AFK"] = nil;
CT_RA_UpdateUnitDead(frame);
return update;
elseif ( msg == "DND" ) then
unitStats["DND"] = { 1, 0 };
CT_RA_UpdateUnitDead(frame);
return update;
elseif ( msg == "UNDND" ) then
unitStats["DND"] = nil;
CT_RA_UpdateUnitDead(frame);
return update;
elseif ( strsub(msg, 1, 3) == "AFK" ) then
-- With reason
unitStats["AFK"] = { strsub(msg, 5), 0 };
CT_RA_UpdateUnitDead(frame);
return update;
elseif ( strsub(msg, 1, 3) == "DND" ) then
-- With reason
unitStats["DND"] = { strsub(msg, 5), 0 };
CT_RA_UpdateUnitDead(frame);
return update;
end
-- Check duration
if ( msg == "DURC" ) then
if ( rank == 0 ) then
return;
end
local currDur, maxDur, brokenItems = CT_RADurability_GetDurability();
CT_RA_AddMessage("DUR " .. currDur .. " " .. maxDur .. " " .. brokenItems .. " " .. nick);
return update;
elseif ( string.find(msg, "^DUR ") ) then
local _, _, currDur, maxDur, brokenItems, callPerson = string.find(msg, "^DUR (%d+) (%d+) (%d+) ([^%s]+)$");
if ( currDur and maxDur and brokenItems and callPerson == playerName ) then
currDur, maxDur = tonumber(currDur), tonumber(maxDur);
local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(raidid);
CT_RADurability_Add(nick, "|c00FFFFFF" .. floor((currDur/maxDur)*100+0.5) .. "%|r (|c00FFFFFF" .. brokenItems .. "破损物品|r)", fileName, floor((currDur/maxDur)*100+0.5));
end
return update;
end
-- Check resists (Thanks Sudo!)
if ( msg == "RSTC" ) then
if ( rank == 0 ) then
return update;
end
if ( tempOptions["DisableQuery"] ) then
CT_RA_AddMessage("RST -1 " .. nick);
else
local resistStr = "";
for i = 2, 6, 1 do
local _, res, _, _ = UnitResistance("player", i);
resistStr = resistStr .. " " .. res;
end
CT_RA_AddMessage("RST" .. resistStr .. " " .. nick);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -