ギルド[ラダの谷間にて]ギルドメンバー用の情報共有wiki

アドオン作成初心者用

ここはアドオンを少しイジリ始めたいって人用のページです。
少しでもTOS生活が便利になればと思っています。
自分も初心者なので初心者目線で書いていこうと思ってます。

作り始めて数日の自分が言うのはなんですが、パズル好きな人とかだと
向いている気がします。思ったピースがはまると脳汁出ます。
何言ってるか分からないとは思いますが逆コンパイルして色々な人の
コードを見るところから始めると世界が変わります。



準備編

取り敢えずの環境づくりですが自分は下記を参照して始めました。
https://seesaawiki.jp/tosgrowup/d/%a5%a2%a5%c9%a5%...
入門はかどるーありがとう!!

初心者にはとっつきにくいかもですが
上記のURLの場所で
「TOSAddon_Tools-main」
という神ツールをダウンロードできるので
解凍してデスクトップに置きます。

プログラミングガチ勢はGITHUBってWEBアプリ?を使って
バージョン管理とか公開とかするみたいですが、よく分からないのでスルーしてます。
でもGITHUB TOS addonとかで検索すると色々と人のプログラムが読めるので
仕事中暇つぶしが出来ます。勉強になります。



20230324追記
GitHubデビューしました
アドオンマネージャーとかになんちゃらするのは怖いのでとりあえず公開だけ。
https://github.com/ajinorisan/TOSAddon-public
ここに行ってもろたら拙作をダウンロード出来ちゃうよ
TOSでの使い方はreadmeを読んでもろて

20230401追記(嘘じゃないよほんとだよ)
アドオンマネージャーデビューしました。

酔っていたのとプログラマーじゃないので色々な専門用語?業界用語が分からず
大分苦労しました。
プログラマーじゃない人用に更にかみくだいた追加方法を
あとで書こうと思います。



エディタとはプログラムを書くアプリです。
メモ帳アプリでも書けるけど
Visual Studio Code
とか
サクラエディタ
とかの方が便利です。自分はサクラエディタ派です。
https://onl.tw/VVTxRk9
あと、なんかプログラムを書いて保存するときに文字コードを
「UTF-8」っていうので保存しないと動かないです。
なんでかは知らんけど。



作業編

まず、初心者の心構えとして最初から大それたものは作れないと思っています。
なので自分は先人達が作ってくれたアドオンをちょっとだけ変更したりして
慣れて行っています。そもそも自分がアドオンをイジリだしたのも、未知の聖域でレリックを自動で
補充してくれる神アドオン
dungeonrpcharger
がガビヤコインで買える方のエクトナイトに対応してなかったためです。
つまり2種類のエクトナイトを出してきたimcちゃんのおかげです。

変更する方法ですが
C:\Program Files (x86)\Steam\steamapps\common\Tree of Savior (Japanese Ver.)\data
ここにある環境依存文字(本のマークとか顔のマークとか)のついたipfファイルをコピーして
適当な場所に置きましょう。
※TOSが起動しているとコピー出来ないので一度TOSを落としてコピーしよ
コピーしたファイルから環境依存文字を削除します。(これをアッチ界隈ではリネームというらしい)
\TOSAddon_Tools-main\TOSAddon_Tools-main\workspace
内にある
extract.bat
にドラッグ&ドロップします。
\TOSAddon_Tools-main\TOSAddon_Tools-main\workspace\extract\addon_d.ipf
フォルダー内にアドオン名と同じフォルダーが出来ていたら成功です。
おめでとう!!

アドオン名のフォルダの中に
なんちゃら.lua
なんちゃら.xml
があると思いますが基本的にイジる場合はluaファイルの方を
イジリます。
xmlファイルの方はフレームの基本構造などが書いてあります。
フレームっていうのはゲーム内でいうとインベントリとかのことだと思っています。
違ったらごめんなさい。

luaファイルをエディターで開くと英語で色々と書いてあります。
それがLuaっていうプログラミング言語です。
グーグルで調べるとLuaの参考サイトは少ないです。マイナーなんかな?
でもファイファン14とかでも使われているらしいことは分かります。
それを色々変えたり書き加えることでアドオンの挙動が変更出来ます。

例として上記の
dungeonrpcharger
をイジった時に変更したのは
luaファイル内の
DungeonRPCharger.EctoniteClassName = 'misc_Ectonite'
local mat_item = session.GetInvItemByName('misc_Ectonite')

DungeonRPCharger.EctoniteClassName = 'misc_Ectonite_Care'
local mat_item = session.GetInvItemByName('misc_Ectonite_Care')
に書き換えただけです。

アイテム名やIDは下記で探しましょう。
https://gihyeonofsoul.com/
帰ってきてTavernofSoul



コンパイル編

イキってコンパイルとか言っていますがいまいちコンパイルが
分かっていません。

まずはluaファイルを書き換えたら文字コードを
「UTF-8」
形式になってるか確認して保存しましょう。
その際
dungeonrpcharger.lua
とかの名前に
dungeonrpchargernori.lua
とかつけて個性出していっても問題ないです。
その代わり元のオリジナルファイルはアドオン名フォルダからどっかに移動させておいてください。
※dungeonrpcharger.luaとdungeonrpchargernori.luaが同じフォルダにいてコンパイルしても
 動かないです。多分知らんけど

次からややこしいのでちゃんと付いてきてください。
\TOSAddon_Tools-main\TOSAddon_Tools-main\workspace
内にある
IPFSuite.exe
をダブルクリックで開きます。
左上の
New
をクリック
その下に
New IPF
という文字が出てくるので
New IPFにカーソルを合わせたまま(背景青色に字が白抜き状態)
上の
New Container
をクリックすると
コンテナネームを入れるテキストボックスが出てくるのでそこに
addon_d.ipf
と入力
すると左側のNew IPFの文字の左横に+が現れるのでそこをクリック。なんでこんなにわかりにくいんや。
addon_d.ipf
という文字が出てくるので
addon_d.ipfにカーソルを合わせたまま(背景青色に字が白抜き状態)
右側のName Size Typeとか書いてある枠の中に
アドオン名フォルダをドラッグ&ドロップ
すると左側のaddon_d.ipfの文字の左横に+が現れるのでそこをクリック。なんでこんなにわかりにくいんや。
luaファイルとxmlファイルが表示されたら成功
上のSaveボタンで
\TOSAddon_Tools-main\TOSAddon_Tools-main\workspace
ここに保存しましょう。
名前はなんでも良いけど環境依存文字は入れたらダメです。

文面でアプリの使い方説明するのシンドイ

保存したファイルを
\TOSAddon_Tools-main\TOSAddon_Tools-main\workspace
内にある
encrypt.bat
にドラッグ&ドロップ
※ファイル名がチカッとするだけで特になにも起きた感じないので2回とかやると
 ファイル壊れるらしいので注意。知らんけど

出来たipfファイルに環境依存文字を入れたらアドオン完成
_meshinuki--v1.0.0.ipf
これを
_meshinuki-⛄-v1.0.0.ipf
こうする感じ

_meshinuki-⛄-v1.0.0nori.ipf
とかで個性付けてイキっても問題ないです。

出来たipfファイルをコピーして下記の場所に置いてTOSを再起動すればアドオンが読み込まれます。
C:\Program Files (x86)\Steam\steamapps\common\Tree of Savior (Japanese Ver.)\data
尚、workspaceフォルダにショートカットがあります。こういうのを気遣いと言うのだと思います。
「TOSAddon_Tools-main」を作った人はモテると思います。



デバッグ編

デバッグっていうのはちゃんと動くかを確認する作業らしいです。
ちょっと変えて試すのに上の作業を繰り返すのはストレスやばいです。多分ハゲます。
先人達はデバッグ方法も編み出していました。スゴイですねぇ

まずはアドオンマネージャーにある
developerconsole
という神アドオンを入れましょう。
入れてからTOSの一般チャットで
/dev
と入れるとなんか凄いのが現れます。仕組みは知りません。
たまに /でv って入力してイラっとします。
デブちゃうし。

更に
C:\Program Files (x86)\Steam\steamapps\common\Tree of Savior (Japanese Ver.)\data

addon_d
というフォルダを作成します。
そのフォルダの中にコンパイル前のアドオンフォルダを入れます。
自分の自信作のmeshinukiアドオンでいうと
C:\Program Files (x86)\Steam\steamapps\common\Tree of Savior (Japanese Ver.)\data\addon_d\meshinuki
フォルダの中に
meshinuki.lua
meshinuki.xml
がある状態にします。

TOSの一般チャットで
/dev
を呼び出して下側のテキストボックスに
dofile("../data/addon_d/meshinuki/meshinuki.lua")
と入力すると
今読み込んでいるアドオンのluaファイルを
addon_d
ファイル内のluaファイルに変更してくれます。
それからTOS内で思っている様な挙動をするかを試してデバッグしてみてください。

dofile("../data/addon_d/meshinuki/meshinuki.lua")
これをいちいち打つのは面倒だと思うので
メモ帳などに書いておいてコピペすると捗ります。


20230318追記
上記のデバッグ作業をする前にdofileするアドオンと同じ名前の
ipfファイルを
C:\Program Files (x86)\Steam\steamapps\common\Tree of Savior (Japanese Ver.)\data
ここに入れておかないとON_INIT関数が動かない疑惑があります。
具体的には
_meshinuki-⛄-v1.0.0.ipf
これがデータフォルダにないとゲーム起動時に読み込まれないかも?
data→_meshinuki.ipf
↓→addon_d
   ↓→meshinuki
     ↓→meshinuki.lua meshinuki.xml
みたいな構造です。


あと、chatGPTに聞きながらプログラムを書いていくと捗ると思います。
luaファイルの内容などを貼りつけて、エラー無いかな?とか聞くと
綴り間違いとか参照間違いとかを指摘してくれます。
元のコードを貼りつけて、解説してって言うと引数の解説などもしてくれます。
メッチャ賢いやん。
https://onl.tw/MahTUUh
でも、言う通りやっても大体動かないのでイラっとしたりもします。



実践編

今回はずっとお世話になっている神アドオン
easybuff
を少しいじってみました。食事バフを付ける時に自分がバフを付けている状態の場合
「すでに食べた料理です」的なメッセージ出てバフが上書きされないので少し使いづらさを感じていました。
そこを直していこうと思います。
勉強で色々とイジっていたのですが、食事バフを持っていたらバフを削除して上書きする処理を
メシ屋を左クリックした時に実行しようと思ったのですが、時間的なラグがある様で上手に出来なかったので
メシバフを削除するボタンを実装することにしました。

まずはxmlファイルにボタンをつけるフレームを作るところから
<?xml version="1.0" encoding="UTF-8"?>
<uiframe name="easybuff" x="0" y="0" width="10" height="10" create="open">
※まずはフレームのwidth値height値を0から10にしてフレームが物理的に見えるフレームにしました
    <controls>
<button name="myButton" rect="0 0 10 10" caption="FoodClear" LBtnDownScp="EASYBUFF_MYBUTTON_DOWN" font="8"/>
    </controls>
</uiframe>
※フレームにボタンを付けました。captionがボタンに表示されるテキスト、
LBtnDownScp="EASYBUFF_MYBUTTON_DOWN"ここはマウスの左クリックしたら関数を呼びだす
font="8"ここはフォントサイズの指定です。

あとはluaファイルを少し書き加えました。
function EASYBUFF_ON_INIT(addon, frame)
    CHAT_SYSTEM("EASYBUFF_ON_INIT")
    local frame = ui.GetFrame("easybuff")
    frame:Resize(100, 30)→フレームをボタンより少し大きめにリサイズ
    frame:ShowWindow(1)→フレームを表示するように設定
    frame:SetAlpha(0)→フレームの透明度を0に設定して見えない様に(なんか呼び出したフレームがダサかったので)
    local button = GET_CHILD(frame, "myButton", "ui::CButton");
    button:ShowWindow(1) →フレームの中に設定したボタンを表示する
    button:Resize(100, 30)→ボタンをいい感じのサイズに変える
    frame:SetOffset(10,200)→ボタンの表示位置をいい感じの場所に設定

    addon:RegisterMsg('GAME_START_3SEC', 'EASYBUFF_BUFFSELLER_TARGET_INIT')→元々のeasybuffのアドオンに書かれていたコード
    acutil.setupHook(EASYBUFF_HOOK_CLICK, 'TARGET_BUFF_AUTOSELL_LIST')→元々のeasybuffのアドオンに書かれていたコード
    acutil.setupHook(EASYBUFF_HOOK_CLICK_FOOD, 'OPEN_FOOD_TABLE_UI')→元々のeasybuffのアドオンに書かれていたコード
    acutil.setupHook(EASYBUFF_HOOK_CLICK_REPAIR, 'ITEMBUFF_REPAIR_UI_COMMON')→元々のeasybuffのアドオンに書かれていたコード
    acutil.slashCommand("/easybuff",EASYBUFF_CMD);→元々のeasybuffのアドオンに書かれていたコード

    button:SetEventScript(ui.LBUTTONDOWN, "EASYBUFF_MYBUTTON_DOWN");→表示された新しいボタンを左クリックした時に呼び出される関数を定義

    EASYBUFF_LOADSETTINGS();→元々のeasybuffのアドオンに書かれていたコード
end

function EASYBUFF_MYBUTTON_DOWN()
    EASYBUFF_FOODCLEAR();
end
※button:SetEventScript(ui.LBUTTONDOWN, "EASYBUFF_MYBUTTON_DOWN")で呼び出される関数、直接 EASYBUFF_FOODCLEAR関数を呼び出せば良いんだけど
xmlファイル設定し終わってたから邪魔くさかった(
--フードバフが付いてるか付いてないかを判断して消していく関数
function EASYBUFF_FOODCLEAR()
    local bufftable = {
        [1] = 4022,
        [2] = 4023,
        [3] = 4024,
        [4] = 4021,
        [5] = 4087,
        [6] = 4136
    }
--↑これはフードバフのbaffidらしいで    
    local handle = session.GetMyHandle()→自分が持っているバフたちを handle に格納してるんやろなぁ

    for _, buffID in pairs(bufftable) do→繰り返す感じ、chatGPTが書いてきたんや
        local buff = info.GetBuff(handle, buffID)→持ってるバフをbuff変数に格納してるんやろなぁ
        if buff ~= nil then→持ってるバフがテーブル内のバフやったらって感じ
            packet.ReqRemoveBuff(buffID)→持ってるメシバフ削除
            ReserveScript(string.format("EASYBUFF_FOODCLEAR()"),0.3)→繰り返す処理、0.3秒の間を空けてます。早すぎると処理しきれないっぽい
        end
    end
end        

上のコードを書いてコンパイルしたら思った通りに動きました。
気持ちいいね。
chatGPT
にちょっとずつ聞いて書いていきました。
マジで賢すぎる。
easybuff program code©Kiicchan
問題あれば連絡ください。



20230324追記

チャット関連のアドオンを作っていたんですが
スゴイこと発見しました。
acutil.setupHook(GTSYSMSG_ON_MSG←ここは任意の関数に変換, "NOTICE_ON_MSG")
を書いてから
NICO_CHAT(string.format("{@st55_a}%s", argStr←ここは出したい文字))
ってすればデッカメの金ぴか文字が流れるチャットが作れます。
やばない?



アドオンマネージャー登録編

アドオンマネージャーに登録出来たので記念カキコ
色々なGitHubの機能があるみたいですが全く右も左もわからないため躓いたのが
まずは専門用語です。

プルリクエスト・・・コードを書き換えて上書きして良いですか?みたいな感じで理解してます。
マージ・・・書き換えたコードをレビューして了承すること。って感じ。違ったらごめんなさい。

「プルリクエスト送ったのでマージしてもらっていいですか?」
みたいな感じで使うとかっこ良いと思います。

リポジトリ・・・ウインドウズで言うところのフォルダみたいなイメージ。GitHub始めたら大体わかります。

あとは下記のページを読んで進めました。

https://github.com/JTosAddon/JTosAddonWiki/wiki/ad...

噛み砕いて行きましょう。

1.あなたのリポジトリにアドオン毎にリリースを公開する  releaseページに移動する
この当たり前の様に書いてあるところですでに心折れそうになります。



ここをクリック



でかっ
1と2はアドオンの名前を
3には「IPFSuite.exe」でSAVEして「encrypt.bat」に保存した
コンパイルされた状態のファイルをドラッグアンドドロップします。
ファイルの名前は前方の _ 無しで環境依存文字も無し - も1個の状態でアップロードします。
詳しくは画像を見てネ
何故かは知りませんけど、多分マネージャー側のアプリで勝手につけてくれるんじゃない?

上記が終わったら4の緑のボタンをポチるだけです。

続けて「addons.json」ファイルを自分のリポジトリに作ります。




いわゆるリポジトリの最初の場所(画像左上参照)に画像の様に「addons.json」を作成します。

klcount アドオンの内容はこんな感じ

[{

"name" : "klcount",

"file" : "klcount",

"extension" : "ipf",

"fileVersion" : "v1.0.2",

"releaseTag" : "klcount",

"unicode" : "⛄",

"description" : "EP14.15地域で倒したモンスターをカウント",

"tags" : []

}

]

注意点は [] とか {} をミスるとアドオンマネージャーで読み込んでもらえないみたいです。
色々な作者さんのGitHubリポジトリに「addons.json」があると思うので見てパクろ参考にしよう

本家でも解説あるのでコピペ
name: アドオンマネージャーで表示される名前。何でもいい。(日本語可だが、英語の方が望ましい)


releaseTag: あなたのリポジトリで管理されているリリースタグ


fileVersion: あなたのアドオンのバージョン。バージョンは semantic versions に則り記入する


file: あなたのIPFファイルの名前。(拡張子は除く)


extension: ipfと書けばよい


unicode: ファイル名に追加する機種依存文字。☃など


updateInfo: アドオンの一言更新メモ。アドオンマネージャーに表示される。(日本語可)


description: アドオンの詳細。アドオンマネージャーに表示される。(日本語可)


tags: アドオンマネージャに表示されるタグ。ui,chatなど

上記の作業で公開の準備は出来たと思います。後はアドオンマネージャーの管理者の「weizlogy」さんに
承認(マージ多分?)される必要があります。

https://github.com/JTosAddon/Addons/blob/master/ma...

上記のURLの先にあるファイルに先人達の書き方を真似して
自分のGitHubの名前とリポジトリを書き込みます。
本当は書き換えてプルリクエスト出来たらカッコイイんでしょうけど
自分はわからんから直で書き込みました。

これであとは「weizlogy」さんが気づいて(ここはおそらく手作業なので時間差があります)OKしてくれたら
アドオンマネージャーに載るようになります。

注意点としては酒飲んで酔ってやるとミスるので出来るだけシラフの時に行いましょう。
自分は綴りとか間違いまくってました。



作りたい編

追従者出現のワールドメッセージを通常のチャット欄に表示させて時間管理したい
※出来たらモテそう

どこで制御してるか知ってる人教えて

出来ちゃった。。。
デバッグのため谷間内で限定公開中です。(人柱一杯で助かる)
ラダの谷間ではギルドメンバーを絶賛募集中です。

昔のアドオンを参考にさせていただきました。
special thanks torahamuさん



最後に
参考にさせていただいているサイトや先人たちのプログラムに感謝します。
あと、見ての通りなんちゃって初心者なので難しい質問とかこれ直してとか言われても
おそらく対応出来ないと思います。
でも、TOSの世界をもっと便利に快適に出来る一助になればと思います。
また、1人でもアドオン作成に興味を持ってもらって今後のTOSが便利になればウレシイです。
谷間勢はよ



追記
https://github.com/ajinorisan/TOSAddon-public
ここに改変したものや自作したものを置いてます。
良かったら使ってみてください。
野良アドオンの入れ方は
リンク先で見てください。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

外部サイト

メンバーのみ編集できます