首页 > 其他分享 >看到一段代码,留个脚印_3

看到一段代码,留个脚印_3

时间:2022-10-07 17:33:42浏览次数:51  
标签:留个 Target .. -- 代码 id Party 脚印 frameTmp

前面搞定了模板或者说封装后,然后看到队友目标是酱紫 队友目标是个简单模式,看能不能升级下改成完整模式,找下队友目标的代码,看到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

相关文章