Lua で WoW Addon 作るあ

12 April 2010
#lua

さて、楽しい WoW なのですが、クライアントアプリがおそろしくカスタマイズ性がよく、もともと設定が細かくできることに加え、マクロというものでいろいろやることができます。右図は WoW ブログにマクロの記事書いたときにがんばってつくった絵。さらに Addon の仕組みが用意されていて、UI を変更したり各種イベントをフックしたりできる。Firefox の拡張作成と似てる。Lua で簡単に書けるようなので、ちょっくら作ってみることにしました。

まずは簡単そうな /translate Hello とかで翻訳してくれるチャットコマンドを組み込もうかと、まったくさわったことなかった Lua を勉強開始。わりと素直な syntax。オヤジギャク的な意味でも尊敬しているエンジニア mattn さんのブログがわかりやすい。この記事のタイトルは mattn 先生にささげます。

lua メモ:

  • 0 が 真。
  • 関数は定義した位置の後でないと呼び出せない。
  • リスト(table)のインデックスは 1 から始まる。
  • function のとちゅうで return できない(ブロックの最後でないと return 使えない)。なので do return end とか書くらしい。
  • : 構文 が perl の -> と似てる。自動で 1個目の引数が self という local 変数に入るのがやさしい。table の要素をドットでアクセスできるので foo["bar"]foo.bar と書けるのだが、まちがって関数を foo.bar() とかやってしまうと self にオブジェクトが来ないのでハマる。正しくは foo:bar()

で、こちらが始めて書いた lua。Google 翻訳するあ。LuaSocket を使ってます。

ただ、書きながらたぶんだめだろうなーとは思ってたのだが、WoW では require や module が実装されていないし外部の URL を叩くとか NG。セキュリティ的にヤバいもんね。。つうわけで翻訳はヤメて、いろんな角度からバシバシスクリーンショット撮るいっぱい写真撮りたい人用 Addon を書いてみることに。

完成したのはこちら。手元では Windows/Mac ともに期待通りに動いていて、マトリックスみたく、ぐるーっとまわって写真とりまくれるようになって楽しい。

WoW Addon 書いてみた時の tips:

  • WoW Wiki がやたら充実しているので何も困らない。
  • ゲームメニュー → Interface → Help → Display Lua Errors を ON にしておくと syntax エラーその他エラー時にこんな感じで dump してくれます。これはライブラリのロードの順番がいけない
    WoWScrnShot_041110_201034
  • 開発用クライアントはないが、ここから Blizzard のグラフィック素材が落とせる。
  • /run ReloadUI() を実行すると、すでに読み込んでる Addon については再起動してくれる。これをマクロに登録しすぐ呼べるようにキーバインドしておくといい。これでコードを書き換えた後いちいち WoW を再起動しなくてもいい。あとこのタイミングで SavedVariables も保存される。
  • 何かおかしいな、と思ったら SavedVariables を消して再起動してみると良いかも。
    アプリ/WTF/Account/(ID)/SavedVariables/(Addon名).lua
    アプリ/Account/(ID)/(サーバー名)/SavedVariables/(Addon名).lua
    
  • 設定画面とか GUI は普通に書くとめんどう。そのへんは Ace3 っていう、WoW Addon 界では標準とされているぽい Utility ライブラリを使い楽をするとよいです。
  • Ace3 は全部ドキュメントされてないのでソースを呼んだ方がいいときもある。あと有名なアドオンのソースを見ると勉強になる。Ace2 は古く Ace3 がいいらしい。移行についてはこちら

Addon サイトが curse とか wowinterface とかあるのだけど、とりあえず curse にアカウント作って UP してみた。承認が通れば この辺から 落とせるようになると思う。curse は git レポジトリとかもあったぽい。

早く WoW 界のチョコボに乗りたいのんで Silvermoon City の評判値かせがないといけなく忙しい。Silvermoon 周辺のエルフのごきげんはもう十分に取りつくしたので、今は世界にちらばった Silvermoon 出身エルフを求めて旅をしている最中です。なので今日はこの辺で!