2015-02-15 5 views
1

Я работаю над списком Addon rewrite, в основном превращая старый аддон Wtacher для WildStar в более новую версию, которую проще поддерживать благодаря новой модульной структуре. Оригинальный автор дал мне разрешение на это, но сказал мне переписать аддон, чтобы понять его лучше, поскольку я совершенно новичок в этом.Инициировать не устанавливать поля

Так оригинальный аддон можно найти здесь: http://www.curse.com/ws-addons/wildstar/221782-watcher

Мой исходный код можно найти здесь: https://github.com/NekoNova/WatcherEx

Сообщение об ошибке я получаю в игре заключается в следующем:

.. .aming \ NCSOFT \ WildStar \ Addons \ WatcherEx \ WatcherEx.lua: 1433: плохой аргумент # 1 в 'ipairs' (таблица ожидаемая, полученная нуль) трассировка стека: [C]: в функции 'ipairs' ... Aming \ NCSOFT \ WildStar \ Addons \ WatcherEx \ WatcherEx.lua: 1433: in Функция 'FillFiltersList' ... aming \ NCSOFT \ WildStar \ Addons \ WatcherEx \ WatcherEx.lua: 886: в функция < ... aming \ NCSOFT \ WildStar \ Addons \ WatcherEx \ WatcherEx.lua: 867>

Так что я посмотрел на мой исходный код на указанных линиях, и в основном этот кусок кода вызывает проблемы:

-- Fills the list of Filters available to be used in the Addon. 
function WatcherEx:FillFiltersList() 
    if self.wndMain == nil then 
     return 
    end 

    local filtersList = self.wndMain:FindChild("filters_list") 
    filtersList:DestroyChildren() 

    for i, filterClass in ipairs(self.tFilters) do 
     local filterItem = Apollo.LoadForm(self.xmlDoc, "filter_item", filtersList, self) 
     filterItem:SetData({ filter = filterClass }) 
     filterItem:FindChild("name"):SetText(filterClass.name) 
    end 

    return filtersList:ArrangeChildrenVert() 
end 

Поэтому в основном я пытаюсь использовать свою внутреннюю tFilters, но она равна нулю и должна быть вкладкой ле. Как я уже сказал, я совершенно новичок в программировании Lua для игр, но, насколько я понимаю, у меня, вероятно, есть что-то неправильно настроенное в моем метаданном __init, поскольку я скопировал это из оригинала и попытался немного почистить его. Этот код может меняться кодом:

function WatcherEx:new(tObject) 
    tObject = tObject or {} 
    setmetatable(tObject, self) 
    self.__index = self 

    -- Initialization 
    self.tSettings = {} 
    self.tDefaults = {} 
    self.tAbilities = {} 
    self.tInnates = {} 
    self.tEngineerSpells = {} 
    self.tActiveRules = {} 

    local tClass = setmetatable({ 
     __init = function(self)   
      self.tActiveRules = { } 
      self.bUnlockAll = false 
      self.eventsHidden = nil 
      self.tFilters = { 
       AvailabilityFilter, 
       TimeFilter, 
       CombatFilter, 
       ActionSetFilter, 
       SpecialFilter, 
       HPFilter, 
       MPFilter, 
       ShieldFilter, 
       ChargeFilter, 
       ResourcesFilter, 
       BuffFilter, 
       LuaFilter} 
     end, 
     __base = self, 
     __name = "WatcherEx" 
    }, { 
     __index = self, 
     __call = function(cls, ...) 
      local tTable = setmetatable({}, self) 
      cls.__init(tTable, ...) 
      return tTable 
     end}) 

    self.__class = tClass 
    return tObject 
end 

Может кто-нибудь сказать мне, что я сделал не так, и объяснить проблему? Я пытаюсь узнать больше о Lua, но эта часть о наследовании и метаклассах немного запутанна.

EDIT: Когда я смотрю на это сейчас, я на самом деле думаю, что я могу вырезать метатаблицы структуру и просто установить переменные непосредственно в качестве членов моей WatcherEx таблицы ....

+1

Моя догадка '__init' никогда не был призван и так 'tFilter' никогда не устанавливается. Прикрепите 'print', чтобы посмотреть, так ли это. Вторая догадка заключается в том, что внешний «самость» отличается от внутреннего «я». – greatwolf

+0

Я попробую функцию печати и посмотрю, не делает ли она что-либо –

ответ

0

Хорошо, , наконец, понял это ....

Вот отрывок из моего AvailabilityFilter класса, который наследует от BaseFilter и теперь мои поля правильно установлены через мои метатаблицы:

local AvailabilityFilter = {} 
local AvailabilityFilterClass = { 
    __init = function(self, ...) return BaseFilter.__init(self, ...) end, 
    __base = AvailabilityFilter, 
    __name = "AvailabilityFilter", 
    __parent = BaseFilter 
} 
local AvailabilityFilterClassMt = { 
    __index = function(cls, strName) 
       local val = rawget(AvailabilityFilter, strName) 

       if val == nil then 
        return BaseFilter[strName] 
       else 
        return val 
       end 
      end, 
    __call = function(cls, ...) 
       local _self = setmetatable({}, AvailabilityFilter) 
       cls.__init(_self, ...) 
       return _self 
      end 
} 
AvailabilityFilter.mt = {} 
AvailabilityFilter.tDefaults = { 
    strName = "Availability", 
    strWindowName = "AvailabilityFilter", 
    bInActionSet = true, 
    tParent = BaseFilter 
} 
AvailabilityFilter.mt.__index = AvailabilityFilter.tDefaults 
----------------------------------------------------------------------------------------------- 
-- Constructor 
----------------------------------------------------------------------------------------------- 
function AvailabilityFilter:new() 
    local tInstance = {} 

    setmetatable(AvailabilityFilter.mt, BaseFilter.__base) 
    setmetatable(tInstance, AvailabilityFilter.mt) 
    setmetatable(AvailabilityFilterClass, AvailabilityFilterClassMt) 

    tInstance.__class = AvailabilityFilterClass 

    if BaseFilter.__inherited then 
     BaseFilter.__inherited(BaseFilter, AvailabilityFilterClass) 
    end 

    return tInstance 
end 

В основном то, что я сделал:

  • Создать BaseFilter
  • Создайте метаданные
  • Создайте таблицу значений по умолчанию для нее
  • Создать новый объект + метатаблицы
  • связать их: Object -> объект метатаблицу -> basefilter мета стол

И теперь он работает:

> a = _G["WatcherExLibs"]["ActionSetFilter"].new() 
inspect a.strName 
"Action Set" 
Смежные вопросы