前面搞定了模板或者说封装后,然后看到队友目标是酱紫 队友目标是个简单模式,看能不能升级下改成完整模式,找下队友目标的代码,看到UXX0.5版本的代码,还好,队友目标就一个lua文件,不太喜欢XML文件的我比较适合,就拿他开刀了,先看下lua文件的代码
ToPFrame = CreateFrame("Button", "PartyTarget"..id, getglobal("PartyMemberFrame"..id), "SecureUnitButtonTemplate"); ... ToPFrame.Name = ToPFrame:CreateFontString("ToPName", "ARTWORK", "GameTooltipTextSmall"); ... ToPFrame.Border = ToPFrame:CreateTexture("ToPBorder", "BORDER"); ... ToPFrame.HealthBar = CreateFrame("StatusBar", "ToPHealthBar", getglobal("PartyTarget"..id)); ... ToPFrame.HealthBar.Text = ToPFrame.HealthBar:CreateFontString("ToPHealthBarText", "ARTWORK", "GameTooltipTextSmall"); ... getglobal("PartyTarget"..id):Show(); getglobal("PartyTarget"..id):SetAlpha(0);
和上面图片一样,建一个单位的框体,然后在刚才的框体里建立名字、背景、生命条、生命值数值。也只有这么多元素。按照之前模板的代码添加头像的样式,头像,魔法值,级别等基本元素。为了之前和一样可以使用模板(封装函数)改下代码如下:
1 local frameTmp 2 for id = 1, MAX_PARTY_MEMBERS do 3 frameTmp = CreateFrame("Button", "Party"..id.."Target", getglobal("PartyMemberFrame"..id), "SecureUnitButtonTemplate"); 4 frameTmp:SetFrameStrata("LOW"); 5 frameTmp:SetFrameLevel(8); 6 frameTmp:SetWidth(80); 7 frameTmp:SetHeight(16); 8 frameTmp:ClearAllPoints(); 9 frameTmp:SetPoint("TOPLEFT", getglobal("PartyMemberFrame"..id), "TOPLEFT", 151, -8); 10 frameTmp:SetAttribute("unit", "party"..id.."target"); 11 frameTmp:SetAttribute("*type1", "target"); 12 frameTmp:SetHitRectInsets(0, 0, -8, -6); 13 frameTmp:SetScale(1.3); 14 15 frameTmp.Name = frameTmp:CreateFontString(getglobal("Party"..id.."TargetName"), "ARTWORK", "GameTooltipTextSmall"); 16 frameTmp.Name:ClearAllPoints(); 17 frameTmp.Name:SetPoint("BOTTOMLEFT", frameTmp, "TOPLEFT", 8, -7); 18 frameTmp.Name:SetFont(GameFontNormal:GetFont(), 11, "OUTLINE"); 19 20 frameTmp.Portrait = frameTmp:CreateTexture("Party"..id.."TargetPortrait", "BORDER"); 21 frameTmp.Portrait:SetWidth(27); 22 frameTmp.Portrait:SetHeight(27); 23 frameTmp.Portrait:ClearAllPoints(); 24 frameTmp.Portrait:SetTexCoord(1, 0, 0, 1) 25 -- frameTmp.Portrait:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 6, -5); --1 26 frameTmp.Portrait:SetPoint("TOPRIGHT", frameTmp, "TOPRIGHT", 10, -5); --2 27 28 frameTmp.Texture = frameTmp:CreateTexture("Party"..id.."TargetTexture", "ARTWORK"); 29 frameTmp.Texture:SetTexture("Interface\\TargetingFrame\\UI-PartyFrame"); 30 frameTmp.Texture:SetTexCoord(1, 0, 0, 1) 31 frameTmp.Texture:SetWidth(96); 32 frameTmp.Texture:SetHeight(48); 33 frameTmp.Texture:ClearAllPoints(); 34 frameTmp.Texture:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 0, -2); 35 36 --[[ frameTmp.Border = frameTmp:CreateTexture("ToPBorder", "BORDER"); 37 frameTmp.Border:SetTexture("Interface\\Tooltips\\UI-StatusBar-Border"); 38 frameTmp.Border:SetWidth(80); 39 frameTmp.Border:SetHeight(16); 40 frameTmp.Border:ClearAllPoints(); 41 frameTmp.Border:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 1, -6); 42 ]] 43 frameTmp.HealthBar = CreateFrame("StatusBar", "Party"..id.."TargetHealthBar", getglobal("Party"..id.."Target")); 44 frameTmp.HealthBar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar"); 45 frameTmp.HealthBar:SetFrameLevel(2); 46 frameTmp.HealthBar:SetMinMaxValues(0, 100); 47 frameTmp.HealthBar:SetValue(0); 48 frameTmp.HealthBar:SetWidth(53); 49 frameTmp.HealthBar:SetHeight(6); 50 frameTmp.HealthBar:ClearAllPoints(); 51 -- frameTmp.HealthBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 35, -9); --1 52 frameTmp.HealthBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 10, -9); --2 53 frameTmp.HealthBar:SetStatusBarColor(0, 1, 0); 54 55 frameTmp.PowerBar = CreateFrame("StatusBar", "Party"..id.."TargetManaBar", getglobal("Party"..id.."Target")); 56 frameTmp.PowerBar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar"); 57 frameTmp.PowerBar:SetFrameLevel(2); 58 frameTmp.PowerBar:SetMinMaxValues(0, 100); 59 frameTmp.PowerBar:SetValue(0); 60 frameTmp.PowerBar:SetWidth(53); 61 frameTmp.PowerBar:SetHeight(6); 62 frameTmp.PowerBar:ClearAllPoints(); 63 -- frameTmp.PowerBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 35, -16); --1 64 frameTmp.PowerBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 10, -16); --2 65 frameTmp.PowerBar:SetStatusBarColor(0, 0, 1); 66 67 frameTmp.HealthBar.Text = frameTmp:CreateFontString("ToPHealthBarText", "ARTWORK", "GameTooltipTextSmall"); 68 frameTmp.HealthBar.Text:ClearAllPoints(); 69 frameTmp.HealthBar.Text:SetPoint("CENTER", frameTmp.HealthBar, "CENTER", 3, -1); 70 frameTmp.HealthBar.Text:SetFont(GameFontNormal:GetFont(), 10, "OUTLINE"); 71 72 frameTmp.Level = frameTmp:CreateFontString("Party"..id.."TargetLevel", "OVERLAY", "GameTooltipText"); 73 frameTmp.Level:ClearAllPoints(); 74 -- frameTmp.Level:SetPoint("TOPLEFT", frameTmp.Texture, "BOTTOMLEFT", 0, 18); --1 75 frameTmp.Level:SetPoint("TOPLEFT", frameTmp.Texture, "BOTTOMRIGHT", 0, 25); --2 76 --frameTmp.Level:SetFont(GameFontNormal:GetFont(), 10, "OUTLINE"); 77 frameTmp.Level:SetFont("fonts\\1.ttf", 10, "OUTLINE"); 78 frameTmp.Level:SetTextColor(1, 0.82, 0); 79 frameTmp.Level:SetJustifyH("LEFT"); 80 81 getglobal("Party"..id.."Target"):Show(); 82 getglobal("Party"..id.."Target"):SetAlpha(0); 83 84 getglobal("Party1Target"):SetMovable(1); 85 getglobal("Party1Target"):SetScript("OnMouseDown", function(self, elapsed) 86 if IsShiftKeyDown() then 87 getglobal("Party1Target"):StartMoving(); 88 end 89 end) 90 91 getglobal("Party1Target"):SetScript("OnMouseUp", function(self, elapsed) 92 getglobal("Party1Target"):StopMovingOrSizing(); 93 end) 94 getglobal("Party1Target"):SetClampedToScreen(1); 95 96 frameTmp:SetScript("OnEnter", function() 97 GameTooltip:SetOwner(frameTmp, "ANCHOR_PRESERVE") 98 GameTooltip:SetUnit("party" .. id .."target") 99 GameTooltip:Show() 100 end) 101 frameTmp:SetScript("OnLeave", function() 102 GameTooltip:Hide() 103 end) 104 end
然后在触发函数里加入新加元素代码,然后出现这样的图片,已经把基本的功能都加上了,然后又试了下用之前的模板(封装),代码如下:
1 function TargetTarget_CreateButton(frameTmp, anchor, parent, relativeTo, x, y, w, h, a, s) 2 for id = 1, MAX_PARTY_MEMBERS do 3 local str = "" 4 str = frameTmp; 5 local frameTmp = CreateFrame("Button", frameTmp, parent, "SecureUnitButtonTemplate"); 6 frameTmp:SetFrameLevel(8); 7 frameTmp:SetWidth(w); 8 frameTmp:SetHeight(h); 9 frameTmp:ClearAllPoints(); 10 frameTmp:SetPoint(anchor, parent, relativeTo, x, y); 11 frameTmp:SetAttribute("unit", "party"..id.."target"); 12 frameTmp:SetAttribute("*type1", "target"); 13 frameTmp:SetAlpha(a); 14 frameTmp:SetMovable(1); 15 frameTmp:SetScale(s); 16 17 frameTmp.Portrait = frameTmp:CreateTexture(str..".Portrait", "BORDER"); 18 frameTmp.Portrait:SetWidth(27); 19 frameTmp.Portrait:SetHeight(27); 20 frameTmp.Portrait:ClearAllPoints(); 21 frameTmp.Portrait:SetTexCoord(1, 0, 0, 1) 22 -- frameTmp.Portrait:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 6, -5); --1 23 frameTmp.Portrait:SetPoint("TOPRIGHT", frameTmp, "TOPRIGHT", -5, -5); --2 24 25 frameTmp.Texture = frameTmp:CreateTexture(str..".Texture", "ARTWORK"); 26 frameTmp.Texture:SetTexture("Interface\\TargetingFrame\\UI-PartyFrame"); 27 frameTmp.Texture:SetTexCoord(1, 0, 0, 1) 28 frameTmp.Texture:SetWidth(w); 29 frameTmp.Texture:SetHeight(h); 30 frameTmp.Texture:ClearAllPoints(); 31 frameTmp.Texture:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 0, -2); 32 33 frameTmp.Name = frameTmp:CreateFontString(str..".Name", "ARTWORK", "GameFontNormalSmall"); 34 frameTmp.Name:ClearAllPoints(); 35 -- frameTmp.Name:SetPoint("BOTTOMLEFT", frameTmp, "BOTTOMLEFT", 40, 39); --1 36 frameTmp.Name:SetPoint("BOTTOMLEFT", frameTmp, "BOTTOMLEFT", 10, 39); --2 37 38 frameTmp.HealthBar = CreateFrame("StatusBar", str..".HealthBar", TargetFrame); 39 frameTmp.HealthBar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar"); 40 frameTmp.HealthBar:SetFrameLevel(2); 41 frameTmp.HealthBar:SetMinMaxValues(0, 100); 42 frameTmp.HealthBar:SetValue(0); 43 frameTmp.HealthBar:SetWidth(53); 44 frameTmp.HealthBar:SetHeight(6); 45 frameTmp.HealthBar:ClearAllPoints(); 46 -- frameTmp.HealthBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 35, -9); --1 47 frameTmp.HealthBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 10, -9); --2 48 frameTmp.HealthBar:SetStatusBarColor(0, 1, 0); 49 50 frameTmp.PowerBar = CreateFrame("StatusBar", str..".ManaBar", TargetFrame); 51 frameTmp.PowerBar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar"); 52 frameTmp.PowerBar:SetFrameLevel(2); 53 frameTmp.PowerBar:SetMinMaxValues(0, 100); 54 frameTmp.PowerBar:SetValue(0); 55 frameTmp.PowerBar:SetWidth(53); 56 frameTmp.PowerBar:SetHeight(6); 57 frameTmp.PowerBar:ClearAllPoints(); 58 -- frameTmp.PowerBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 35, -16); --1 59 frameTmp.PowerBar:SetPoint("TOPLEFT", frameTmp, "TOPLEFT", 10, -16); --2 60 frameTmp.PowerBar:SetStatusBarColor(0, 0, 1); 61 62 frameTmp.HPPct = frameTmp:CreateFontString(str..".HPPct", "ARTWORK", "TextStatusBarText"); 63 frameTmp.HPPct:SetFont(GameFontNormal:GetFont(), 10, "OUTLINE"); 64 frameTmp.HPPct:SetTextColor(1, 0.75, 0); 65 frameTmp.HPPct:SetJustifyH("LEFT"); 66 frameTmp.HPPct:ClearAllPoints(); 67 frameTmp.HPPct:SetPoint("CENTER", frameTmp.HealthBar, "CENTER", 0, 0); 68 69 frameTmp.Level = frameTmp:CreateFontString(str..".Level", "OVERLAY", "GameTooltipText"); 70 frameTmp.Level:ClearAllPoints(); 71 -- frameTmp.Level:SetPoint("TOPLEFT", frameTmp.Texture, "BOTTOMLEFT", 0, 18); --1 72 frameTmp.Level:SetPoint("TOPLEFT", frameTmp.Texture, "BOTTOMRIGHT", 0, 25); --2 73 --frameTmp.Level:SetFont(GameFontNormal:GetFont(), 10, "OUTLINE"); 74 frameTmp.Level:SetFont("fonts\\1.ttf", 10, "OUTLINE"); 75 frameTmp.Level:SetTextColor(1, 0.82, 0); 76 frameTmp.Level:SetJustifyH("LEFT"); 77 end 78 return frameTmp 79 end 80 81 TargetTarget_CreateButton(getglobal("PartyTarget1"), "LEFT", getglobal("PartyMemberFrame1"), "RIGHT", -20, 0, 96, 48, 0, 1)
功能基本上和上面一样,上面的 --1,--2是头像翻转的代码,以后加个头像翻转的开关,现在用了两天,有点发现队友目标上面光秃秃的,原来是少了队友Buff和Debuff显示,于是再看原作者后面版本的代码,在V1.21找到有队友Debuff的代码,将这些代
码移植过来,中间的代码发生一点小问题,就是意思是尝试调用全局 CooldownFrame_Set 是一个无效的值,查找wowapi,发现 CooldownFrame_Set 这个api 不适合3.35的版本,3.35版本要用上CooldownFrame_SetTimer 这个api,换个这个就OK了,不仅能显示Debuff,而且还能显示冷却时间。
发觉只能显示Debuff,而不显示Buff,然后将加上Buff的代码,于是问题又来了,
看了下代码,有一段是设置坐标的的。如下
1 function UnitFramesPlus_PartyTargetBuffPositionSet() 2 for id = 1, 4, 1 do 3 _G["Party"..id.."Target".."Buff1"]:ClearAllPoints(); 4 _G["Party"..id.."Target".."Buff1"]:SetPoint("TOPLEFT", _G["Party"..id.."Target"], "BOTTOMLEFT", 8, -8); 5 6 _G["Party"..id.."Target".."DeBuff1"]:ClearAllPoints(); 7 _G["Party"..id.."Target".."DeBuff1"]:SetPoint("LEFT", _G["Party"..id.."Target"], "RIGHT", 20, 0); 8 end 9 end
这一段是没有加判断的,加一个判断应该可以实际在队友目标下方显示,这样,如果队友目标是友方,Buff显示在队友目标的下面,Debuff显示在队友目标右上方,其余情况则Deuff显示
在队友目标的下面,Buff显示在队友目标右上方,那么修改上面的代码:
1 function UnitFramesPlus_PartyTargetBuffPositionSet() 2 for id = 1, 4, 1 do 3 if UnitIsFriend("player", "Party"..id.."Target") then -- 判断队友目标是否友好 4 _G["Party"..id.."Target".."Buff1"]:ClearAllPoints(); 5 _G["Party"..id.."Target".."Buff1"]:SetPoint("TOPLEFT", _G["Party"..id.."Target"], "BOTTOMLEFT", 8, -8); -- Buff 在队友目标下面, 6 7 _G["Party"..id.."Target".."DeBuff1"]:ClearAllPoints(); 8 _G["Party"..id.."Target".."DeBuff1"]:SetPoint("LEFT", _G["Party"..id.."Target"], "RIGHT", 20, 0); -- Debuff 在队友目标右上方 9 10 else -- 否则非友好其它情况, 11 _G["Party"..id.."Target".."Buff1"]:ClearAllPoints(); 12 _G["Party"..id.."Target".."Buff1"]:SetPoint("LEFT", _G["Party"..id.."Target"], "RIGHT", 20, 0); -- Debuff 在队友目标右上方 13 14 _G["Party"..id.."Target".."DeBuff1"]:ClearAllPoints(); 15 _G["Party"..id.."Target".."DeBuff1"]:SetPoint("TOPLEFT", _G["Party"..id.."Target"], "BOTTOMLEFT", 8, -8);-- BUff 在队友目标下面 16 end 17 end 18 end
看下效果: 队友目标友好的时候显示没错,不过在副本多队友情况下貌似是酱紫
出副本后,单人
重载插件后又恢复正常了
将
if UnitIsFriend("player", "Party"..id.."Target") then
改成
if UnitIsEnemy("player", "Party"..id.."Target") then
情况一样,反复测试,故障依旧,还去 wowpedia.fandom.com,找下有关unit的api,我还猜想是不是我的这个判断函数不对,或者还是单独的unit api直接判断队友目标是敌对还是友好,找半天除了以上的两个api,还找到一个 UnitCanAttack 的api,不过换上
这后又反复测试,问题还是没有解决,我还怀疑是不是 我的判断函数用法不对,于是按想法将判断函数的坐标改大点效果是改了后图标改了位置了,看来判断函数还是有用,但为何图标位置会变动呢?查了下原插件,发现其它函数都是
event == "ADDON_LOADED" 时加载,除了,上面的布局函数是单独的 event == "VARIABLES_LOADED" 时加载,会不会是这加载的位置不对,把 PartyTargetBuffPositionSet() 改成event == "ADDON_LOADED" 或者改成 event == "VARIABLES_LOADED"
加载,但问题仍旧没有得到解决,于是我想PartyTargetBuffPositionSet() 这个函数倒底有没有起作用,也就是判断队友目标是敌对还是友好的用法上,于是进游戏,先做个宏
/run if (UnitCanAttack("Party1Target", "player")) then print ("1") else print("0") end
先队友的目标是友好,也就是 not UnitCanAttack 的时候,返回值是如下
队友目标的怪物即能够 UnitCanAttack 的时候,返回值也如下
看来这个api有作用的,可以正确判断队友目标的阵营,那就再看看是不是函数被执行的地方不对,将函数加两句
1 function UnitFramesPlus_PartyTargetBuffPositionSet() 2 for id = 1, 4, 1 do 3 if UnitCanAttack("player", "Party"..id.."Target") then 4 _G["Party"..id.."Target".."Buff1"]:ClearAllPoints(); 5 _G["Party"..id.."Target".."Buff1"]:SetPoint("TOPLEFT", _G["Party"..id.."Target"], "BOTTOMLEFT", 8, -8); 6 7 _G["Party"..id.."Target".."DeBuff1"]:ClearAllPoints(); 8 _G["Party"..id.."Target".."DeBuff1"]:SetPoint("LEFT", _G["Party"..id.."Target"], "RIGHT", 20, 0); 9 print("1") -- 队友目标能被功能时函数判断时候输出1 10 else 11 _G["Party"..id.."Target".."Buff1"]:ClearAllPoints(); 12 _G["Party"..id.."Target".."Buff1"]:SetPoint("LEFT", _G["Party"..id.."Target"], "RIGHT", 20, 0); 13 14 _G["Party"..id.."Target".."DeBuff1"]:ClearAllPoints(); 15 _G["Party"..id.."Target".."DeBuff1"]:SetPoint("TOPLEFT", _G["Party"..id.."Target"], "BOTTOMLEFT", 8, -8); 16 print("2") -- 队友目标不能被功能时函数判断时候输出2
17 end
18 end
19 end
队友目标是可攻击(怪物)效果如下:
队友目标是不可攻击(友好)效果如下:
问题发现了,就是游戏或者说是插件加载成功之前图标布局的函数就被加载了,说明布局函数是成功加载并成功判断了队友目标的友好状态,但是加载成功后,队友换目标函数却不再执行了,除非重启游戏或者重载插件时布局函数才会再次加载。是不是问题出了这里呢,如果在一个时时监控的函数里加载这个图标布局函数,于是就有了如下:
敌对的队友目标Debuff和友好的队友目标的Buff都显示在其下方,而友好的队友目标的Debuff显示在其右上角,已经算是解决问题了
标签:留个,Target,..,--,代码,id,Party,脚印,frameTmp From: https://www.cnblogs.com/hsoftk/p/16758411.html