2019年12月19日木曜日

GearSwapのユーザーファイルとsetfenv


GearSwap を利用する場合、あらかじめWAR.lua などのユーザーファイルを利用者が作成しておくことになるが、作成したファイルは自動的にGearSwapによって読み込まれて自動着替えの際に内容が参照される。
このユーザーファイルの読み込み処理は refresh.lua の load_user_files() にて行われる。
function load_user_files(job_id,user_file)

  local path,base_dir,filename
  path,base_dir,filename = pathsearch({user_file})
  if not path then
    local long_job = res.jobs[job_id].english
    local short_job = res.jobs[job_id].english_short
    local tab = {player.name..'_'..short_job..'.lua',player.name..'-'..short_job..'.lua',
      player.name..'_'..long_job..'.lua',player.name..'-'..long_job..'.lua',
      player.name..'.lua',short_job..'.lua',long_job..'.lua','default.lua'
}
    path,base_dir,filename = pathsearch(tab)
  end

  -- Try to load data/<name>_<main job>.lua
  local funct, err = loadfile(path)

  setfenv(funct, user_env)

上記のコードにて loadfile によってユーザーファイルが読み込まれるが、その後、読み込んだ内容(funct)を setfenv している。これによりユーザーファイルに記述されたユーザー関数を実行するときの環境が user_env にセットされる。下記は user_env の内容である。ユーザー関数内ではこの user_env の中に含まれている変数や関数を利用できる。逆に言うと、グローバル変数であっても user_env に含まれていなければ利用することができない。
user_env = {gearswap = _G, _global = _global, _settings = _settings,_addon=_addon,
  -- Player functions
  equip = equip, cancel_spell=cancel_spell, change_target=change_target, 
  cast_delay=cast_delay,
  print_set=print_set,set_combine=set_combine,disable=disable,enable=user_enable,
  send_command=send_cmd_user,windower=user_windower,include=include_user,

  midaction=user_midaction,pet_midaction=user_pet_midaction,
  set_language=set_language,
  show_swaps = show_swaps,debug_mode=debug_mode,
  include_path=user_include_path,
  register_unhandled_command=user_unhandled_command,
  move_spell_target=move_spell_target,
  language=language,

  -- Library functions
  string=string,math=math,table=table,set=set,list=list,T=T,S=S,L=L,
  pack=pack,functions=functions,
  os=os,texts=texts,bit=bit,type=type,tostring=tostring,tonumber=tonumber,pairs=pairs,
  ipairs=ipairs, print=print, add_to_chat=add_to_chat_user,unpack=unpack,next=next,
  select=select,lua_base_path=windower.addon_path,empty=empty,file=file,
  loadstring=loadstring,assert=assert,error=error,pcall=pcall,io=io,dofile=dofile,

  debug=debug,coroutine=coroutine,setmetatable=setmetatable,
  getmetatable=getmetatable,
  rawset=rawset,rawget=rawget,require=include_user,
  _libs=_libs,

  -- Player environment things
  buffactive=buffactive,
  player=player,
  world=world,
  pet=pet,
  fellow=fellow,
  alliance=alliance,
  party=alliance[1],
  sets={naked = {main=empty,sub=empty,range=empty,ammo=empty,
    head=empty,neck=empty,ear1=empty,ear2=empty,
    body=empty,hands=empty,ring1=empty,ring2=empty,
    back=empty,waist=empty,legs=empty,feet=empty}}
  }

user_env['_G'] = user_env
requireはinclude_userに置き換えられている。inlcude_user() 関数は user_functions.lua で定義された関数であり、引数で指定されたファイルを loadfile() で読み込み、その環境を user_env に setfenv する処理になっている。

Mote-inlcude を使う場合、”決まり文句”として include('Mote-Include.lua') をするが、この include は user_env に定義されている通り、include_user() 関数のことである。
-- Initialization function for this job file.
function get_sets()
    mote_include_version = 2

    -- Load and initialize the include file.
    include('Mote-Include.lua')
end


0 件のコメント:

コメントを投稿