CWDG论坛-专业魔兽插件's Archiver

bluelunace 发表于 2008-8-9 17:06

请教个数组的问题

[quote]local buffs = {};
table.insert(buffs, { BuffIndex = buffIndex, Name = name, TimeLeft = timeLeft, MaxTime = maxtime, OwnOrder = buffSettings.DisplayOrder, Settings = buffSettings});[/quote]

RoguePowerBars中定义了这么一个数组,后面有调用是

[quote]rogePowerBarFrame.id = buff.BuffIndex;
rogePowerBarFrame.timeleft = buff.TimeLeft;
rogePowerBarFrame.maxtime = buff.MaxTime;[/quote]

我又在其中新定义了个数组
[quote]local debuffs = {};
table.insert(debuffs, { BuffIndex = buffIndex, Name = name, TimeLeft = timeLeft, MaxTime = maxtime, OwnOrder = buffSettings.DisplayOrder, Settings = buffSettings});[/quote]

调用照葫芦画瓢是
[quote]rogePowerBarFrame.id = debuff.BuffIndex;
rogePowerBarFrame.timeleft = debuff.TimeLeft;
rogePowerBarFrame.maxtime = debuff.MaxTime;[/quote]

怎么就报错了attempt to index global 'debuff' (a nil value),出错行就是rogePowerBarFrame.id = debuff.BuffIndex;

还有,插件原本定义的数组明明是buffs,  怎么后面就变成buff.BuffIndex之类的呢?
不是应该buffs.BuffIndex才对么

如果buff.BuffIndex不是代表buffs这个数组的话我真找不出这个是什么意思了

bluelunace 发表于 2008-8-9 17:09

相关的完整代码应该就是这两端
[quote]function UpdateBuffs()

  local maxtimes = {};
  local buffs = {};
  local debuffs = {};

  for i = 1, _numBuffsShown do
    local bar = getglobal(ROGUEPOWERBAR_NAME..i)
    if not maxtimes[bar.name] or maxtimes[bar.name] < bar.maxtime then
      maxtimes[bar.name] = bar.maxtime;
    end
  end

  local numBuffs = 0;
  local buffIndex, untilCancelled;

  local i = 1;

  for i = 1, 16 do

    buffIndex = i;

    local name, rank = GetPlayerBuffNameImp(buffIndex)

    if name then

      local buffSettings = GetBuffInSettings(name);

        if buffSettings ~= nil then

          local timeLeft = GetPlayerBuffTimeLeftImp(buffIndex)
          local maxtime = timeLeft


          if name then
            if maxtimes[name] and maxtime and maxtime < maxtimes[name] then
              maxtime = maxtimes[name];
            end
          end

          table.insert(buffs, { BuffIndex = buffIndex, Name = name, TimeLeft = timeLeft, MaxTime = maxtime, OwnOrder = buffSettings.DisplayOrder, Settings = buffSettings});

        end

      end

    end

    local i = 1;

    for i = 1, 40 do

      buffIndex = i;

      local name, rank = GetPlayerDeBuffNameImp(buffIndex)

      if name then

        local buffSettings = GetBuffInSettings(name);

        if buffSettings ~= nil then

          local timeLeft = GetPlayerDeBuffTimeLeftImp(buffIndex)
          local maxtime = timeLeft


            if name then
              if maxtimes[name] and maxtime and maxtime < maxtimes[name] then
                 maxtime = maxtimes[name];
              end
            end

            table.insert(debuffs, { BuffIndex = buffIndex, Name = name, TimeLeft = timeLeft, MaxTime = maxtime, OwnOrder = buffSettings.DisplayOrder, Settings = buffSettings});

          end

        end

      end


  mos_buffIndex_returned = false;
  pre_buffIndex_returned = false;
  rip_buffIndex_returned = false;

  for x = 1, #debuffs do
    numBuffs = numBuffs + 1
    SetStatusBarBuff(numBuffs, debuffs[x], "debuff");
  end

  local numBuffs = #debuffs;

  for x = 1, #buffs do
    numBuffs = numBuffs + 1
    SetStatusBarBuff(numBuffs, buffs[x], "buff");
  end


  CleanUp(numBuffs);
  _numBuffsShown = numBuffs;
  UpdateRoguePowerBarPositions();

end[/quote]



[quote]function SetStatusBarBuff(buffId, buff, type)

if type=="buff" then

CreateStatusBar(buffId);

local rogePowerBarFrame = getglobal(ROGUEPOWERBAR_NAME..buffId);
local bar = getglobal(ROGUEPOWERBAR_NAME..buffId.."_StatusBar");
local icon = getglobal(ROGUEPOWERBAR_NAME..buffId.."_Icon");
local name = getglobal(ROGUEPOWERBAR_NAME..buffId.."_DescribeText");
local duration = getglobal(ROGUEPOWERBAR_NAME..buffId.."_DurationText");

rogePowerBarFrame.id = buff.BuffIndex;
rogePowerBarFrame.timeleft = buff.TimeLeft;
rogePowerBarFrame.maxtime = buff.MaxTime;
rogePowerBarFrame.name = buff.Name or "Uknown "..buff.BuffIndex;
rogePowerBarFrame.type = "buff";

local backDropColor = buff.Settings.BackDropColor;
local statusBarColor = buff.Settings.StatusBarColor;

local backGround = getglobal(ROGUEPOWERBAR_NAME..buffId.."_BarBackGround");

bar:SetStatusBarTexture(RoguePowerBarsOptions.barTexture);

local backDropTable = backGround:GetBackdrop();
backDropTable.bgFile = RoguePowerBarsOptions.barTexture;

backGround:SetBackdrop(backDropTable);
backGround:SetBackdropColor(backDropColor.r, backDropColor.g, backDropColor.b, backDropColor.a);

bar:SetStatusBarColor(statusBarColor.r, statusBarColor.g, statusBarColor.b, statusBarColor.a);
bar:SetMinMaxValues(0, rogePowerBarFrame.maxtime);

icon:SetTexture(GetPlayerBuffTextureImp(buff.BuffIndex))


if RoguePowerBarsOptions.showtext then
name:SetText(rogePowerBarFrame.name);
end

rogePowerBarFrame:SetAlpha(RoguePowerBarsOptions.alpha);
rogePowerBarFrame:Show();

if RoguePowerBarsOptions.fade and rogePowerBarFrame.timeleft >= rogePowerBarFrame.maxtime then
UIFrameFadeOut(rogePowerBarFrame, 0.5, 0, RoguePowerBarsOptions.alpha);
end

elseif type=="debuff" then

CreateStatusBar(buffId);

local rogePowerBarFrame = getglobal(ROGUEPOWERBAR_NAME..buffId);
local bar = getglobal(ROGUEPOWERBAR_NAME..buffId.."_StatusBar");
local icon = getglobal(ROGUEPOWERBAR_NAME..buffId.."_Icon");
local name = getglobal(ROGUEPOWERBAR_NAME..buffId.."_DescribeText");
local duration = getglobal(ROGUEPOWERBAR_NAME..buffId.."_DurationText");

rogePowerBarFrame.id = debuff.BuffIndex;
rogePowerBarFrame.timeleft = debuff.TimeLeft;
rogePowerBarFrame.maxtime = debuff.MaxTime;
rogePowerBarFrame.name = debuff.Name or "Uknown "..debuff.BuffIndex;
rogePowerBarFrame.type = "debuff";

local backDropColor = debuff.Settings.BackDropColor;
local statusBarColor = debuff.Settings.StatusBarColor;

local backGround = getglobal(ROGUEPOWERBAR_NAME..buffId.."_BarBackGround");

bar:SetStatusBarTexture(RoguePowerBarsOptions.barTexture);

local backDropTable = backGround:GetBackdrop();
backDropTable.bgFile = RoguePowerBarsOptions.barTexture;

backGround:SetBackdrop(backDropTable);
backGround:SetBackdropColor(backDropColor.r, backDropColor.g, backDropColor.b, backDropColor.a);

bar:SetStatusBarColor(statusBarColor.r, statusBarColor.g, statusBarColor.b, statusBarColor.a);
bar:SetMinMaxValues(0, rogePowerBarFrame.maxtime);

icon:SetTexture(GetPlayerDeBuffTextureImp(debuff.BuffIndex))


if RoguePowerBarsOptions.showtext then
name:SetText(rogePowerBarFrame.name);
end

rogePowerBarFrame:SetAlpha(RoguePowerBarsOptions.alpha);
rogePowerBarFrame:Show();

if RoguePowerBarsOptions.fade and rogePowerBarFrame.timeleft >= rogePowerBarFrame.maxtime then
UIFrameFadeOut(rogePowerBarFrame, 0.5, 0, RoguePowerBarsOptions.alpha);
end

end
end[/quote]

bluelunace 发表于 2008-8-9 17:30

我错了,看来buff.BuffIndex和先前定义的buffs的确没关系
那么请问buff.BuffIndex到底是代表什么呢?
是不是wow自带函数?

月色狼影 发表于 2008-8-9 19:39

拼写错误
你前面写了
local debuffs = {}
后面引用 怎么成debuff了...

bluelunace 发表于 2008-8-9 21:52

但是这个插件原本定义的就是local buffs = {}
后面也只见得到buff.BuffIndex之类的
仔细看了下,后面的buff.BuffIndex应该是别的东西
但全部查找了下也没看到对buff的定义
所以搞不明吧了
后来我把我的debuff.BuffIndex也改成buff.BuffIndex
终于生效可以监视debuff了
但还是应该有些错误,有些时候计时条会不刷新或者卡住,我实在想不出来该怎么改了

月大能不能帮忙改改
目的就是为了使RoguePowerBars能显示目标debuff计时条

这个是原版的
[attach]7203[/attach]

这个是我修改过的,在RoguePowerBars_Settings.lua里面加上了割裂和致命毒药的选项
RoguePowerBars.lua文件改了function UpdateBuffs(),   function SetStatusBarBuff,   function UpadateRoguePowerBars()
[attach]7204[/attach]

bluelunace 发表于 2008-8-10 12:26

[quote]function UpdateBuffs()

    local buffs = {};
    local numBuffs = 0;

    table.insert(buffs, { BuffIndex = buffIndex, Name = name, TimeLeft = timeLeft, MaxTime = maxtime, OwnOrder = buffSettings.DisplayOrder, Settings = buffSettings});

    for x = 1, #buffs do
        numBuffs = numBuffs + 1
        SetStatusBarBuff(numBuffs, buffs[x]);
    end

end

function SetStatusBarBuff(buffId, buff)
    rogePowerBarFrame.id = buff.BuffIndex;
    rogePowerBarFrame.timeleft = buff.TimeLeft;
    rogePowerBarFrame.maxtime = buff.MaxTime;
end[/quote]

哦,我明白了, buffs是个2维数组,buff.BuffIndex就是buffs这个数组中buffId行的BuffIndex列,是这样吧?


另再请教下UNIT_AURA这个事件如何使用
[quote]
function RoguePowerBar_OnEvent(event)
RoguePowerBar_EventHandler[event](arg1, arg2, arg3, arg4, arg5);
end

RoguePowerBar_EventHandler = {};

RoguePowerBar_EventHandler["UNIT_AURA"] = function()
UpdateBuffs();
end
[/quote]
这样有问题么?或者直接给我个资料链接也行

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.