├── kaywadequeer
├── docimage1.png
├── README.md
└── addon_d.ipf
│ └── kaywadequeer
│ ├── kaywadequeer.xml
│ └── kaywadequeer.lua
├── multiplequickslot
├── usage.png
├── addon_d.ipf
│ └── multiplequickslot
│ │ └── multiplequickslot.xml
└── README.md
├── distance
├── README.md
├── distance.xml
└── distance.lua
├── .gitignore
├── itemdrops
├── itemdrops.xml
└── settings.txt
├── summoncounter
├── ui.ipf
│ ├── skin
│ │ └── necro-icon-rev0.01.tga
│ └── baseskinset
│ │ └── summoncounter_addon.xml
├── addon_d.ipf
│ └── summoncounter
│ │ ├── summoncounter.xml
│ │ ├── summoncounter_icon1.lua
│ │ ├── summoncounter_icon2.lua
│ │ ├── summoncounter_talk.lua
│ │ ├── summoncounter_hpbar.lua
│ │ ├── summoncounter_party.lua
│ │ └── summoncounter_extend.lua
├── settings-v1.txt
├── settings.txt
├── README.md
└── list_dicid.txt
├── guildnotifyinchat
├── README.md
├── guildnotifyinchat.xml
└── guildnotifyinchat.lua
├── minigaugetext
├── settings.txt
├── addon_d.ipf
│ └── minigaugetext
│ │ ├── minigaugetext.xml
│ │ └── minigaugetext.lua
└── README.md
├── fixbookread
├── README.md
├── fixbookread.xml
└── fixbookread.lua
├── removetipsfe
├── README.md
├── removetipsfe.xml
└── removetipsfe.lua
├── stealthymaster
├── README.md
├── stealthymaster.xml
└── stealthymaster.lua
├── warehousesorter
├── README.md
├── warehousesorter.xml
└── warehousesorter.lua
├── rmnewcollectionmark
├── README.md
├── rmnewcollectionmark.xml
└── rmnewcollectionmark.lua
├── README.md
├── masterplace
├── README.md
├── masterplace.xml
└── masterplace.lua
├── partyinfoex
├── README.md
└── addon_d.ipf
│ └── partyinfoex
│ ├── partyinfoex.xml
│ └── partyinfoex.lua
├── summonskilltooltip
├── README.md
├── summonskilltooltip.xml
└── summonskilltooltip.lua
├── fixlostchatwindow
├── README.md
└── addon_d.ipf
│ └── fixlostchatwindow
│ ├── fixlostchatwindow.xml
│ └── fixlostchatwindow.lua
├── slotmac
├── slotmac.xml
└── README.md
├── compactheadsupdisplay
├── README.md
└── addon_d.ipf
│ └── compactheadsupdisplay
│ ├── compactheadsupdisplay.xml
│ └── compactheadsupdisplay.lua
├── pickiteminfo
├── pickiteminfo.xml
├── README.md
└── pickiteminfo.lua
├── hidename
├── README.md
└── addon_d.ipf
│ └── hidename
│ ├── hidename.xml
│ └── hidename.lua
├── worldmapquest
├── worldmapquest.xml
├── README.md
└── worldmapquest.lua
├── showhiddenmap
├── showhiddenmap.xml
├── README.md
└── showhiddenmap.lua
├── showbuffsellertype
├── showbuffsellertype.xml
├── README.md
└── showbuffsellertype.lua
├── repairendur
├── repairendur.xml
├── settings.txt
├── README.md
└── repairendur.lua
├── staminigauge
├── staminigauge.xml
├── README.md
└── staminigauge.lua
├── skillitemcounter
├── addon_d.ipf
│ └── skillitemcounter
│ │ ├── skillitemcounter.xml
│ │ └── skillitemcounter.lua
└── README.md
├── dpsmeter
├── addon_d.ipf
│ └── dpsmeter
│ │ └── dpsmeter.xml
└── README.md
├── repeaterypuzzlecraft
├── README.md
└── addon_d.ipf
│ └── repeaterypuzzlecraft
│ ├── repeaterypuzzlecraft.xml
│ └── repeaterypuzzlecraft.lua
├── dice
├── README.md
└── addon_d.ipf
│ └── dice
│ ├── dice.xml
│ └── dice.lua
├── objectdetector
├── addon_d.ipf
│ └── objectdetector
│ │ └── objectdetector.xml
├── settings.txt
└── README.md
├── savequest
├── addon_d.ipf
│ └── savequest
│ │ └── savequest.xml
└── README.md
├── subquickslot
├── addon_d.ipf
│ └── subquickslot
│ │ └── subquickslot.xml
└── README.md
├── previewguildemblem
├── README.md
├── previewguildemblem.xml
└── previewguildemblem.lua
├── console
├── addon_d.ipf
│ └── console
│ │ ├── console.xml
│ │ └── console.lua
└── README.md
├── fixinventorysort
├── addon_d.ipf
│ └── fixinventorysort
│ │ └── fixinventorysort.xml
└── README.md
├── monsterstatus
├── addon_d.ipf
│ └── monsterstatus
│ │ └── monsterstatus.xml
└── README.md
├── costumeplay
├── addon_d.ipf
│ └── costumeplay
│ │ └── costumeplay.xml
└── README.md
├── hpmonitor
├── addon_d.ipf
│ └── hpmonitor
│ │ └── hpmonitor.xml
└── README.md
├── index.md
└── addons.json
/kaywadequeer/docimage1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/weizlogy/tos/HEAD/kaywadequeer/docimage1.png
--------------------------------------------------------------------------------
/multiplequickslot/usage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/weizlogy/tos/HEAD/multiplequickslot/usage.png
--------------------------------------------------------------------------------
/distance/README.md:
--------------------------------------------------------------------------------
1 | see [http://www.weizlogy.gq/tos/addon/distance/](http://www.weizlogy.gq/tos/addon/distance/)
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # ipfは無視するけどaddon_d.ipfは無視しない
2 | *.ipf
3 | !addon_d.ipf/
4 | !ui.ipf/
5 |
6 | untracked/
7 | _endoflife/
8 | npc.txt
9 |
--------------------------------------------------------------------------------
/itemdrops/itemdrops.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/summoncounter/ui.ipf/skin/necro-icon-rev0.01.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/weizlogy/tos/HEAD/summoncounter/ui.ipf/skin/necro-icon-rev0.01.tga
--------------------------------------------------------------------------------
/guildnotifyinchat/README.md:
--------------------------------------------------------------------------------
1 | ## Latest Release Note.
2 |
3 | ### v1.0.0
4 |
5 | #### 新規作成
6 |
7 | ギルドのお知らせをログイン時に、システムチャットで表示します。
8 |
9 | [<ギルド名>]<お知らせ文>
10 |
--------------------------------------------------------------------------------
/minigaugetext/settings.txt:
--------------------------------------------------------------------------------
1 | local s = {}
2 | ---
3 | s['size'] = 13
4 | s['color'] = '#CC3333'
5 | s['spcolor'] = '#3333CC'
6 | s['ptsize'] = 11
7 | s['ptcolor'] = '#CCCCCC'
8 | s['ptspcolor'] = '#CCCCCC'
9 | ---
10 | return s
--------------------------------------------------------------------------------
/fixbookread/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#fixbookread](https://blog.weizlogy.com/pages/tos-addon/#fixbookread)
2 |
3 | ### v1.0.0
4 |
5 | #### 新規作成。
6 |
7 | アドオンがロードされると、本アイテムのテキスト表示処理を自動修正し、改行を正常化させます。
8 |
--------------------------------------------------------------------------------
/removetipsfe/README.md:
--------------------------------------------------------------------------------
1 | ## Latest Release Note.
2 |
3 | ### v1.0.0
4 |
5 | #### 新規作成
6 |
7 | 邪魔なtipsを非表示にしつつチャットウィンドウにシステムメッセージとして表示します。
8 |
9 | see [http://www.weizlogy.gq/tos/addon/removetipsfe/](http://www.weizlogy.gq/tos/addon/removetipsfe/)
--------------------------------------------------------------------------------
/stealthymaster/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#stealthymaster](https://blog.weizlogy.com/pages/tos-addon/#stealthymaster)
2 |
3 | ### v1.0.0
4 |
5 | #### 新規作成
6 |
7 | アドオンがロードされると、キャラ情報を表示する既存処理を上書きして、いいねがされないようにします。
8 |
--------------------------------------------------------------------------------
/warehousesorter/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.0.0
4 |
5 | ### 何をするもの?
6 |
7 | 個人倉庫にソートボタンを追加します。
8 |
9 | ### どうすれば?
10 |
11 | ipfファイルをインストールするだけです。
12 |
13 | ### いつ動くの?
14 |
15 | - 個人倉庫を開いたとき
16 |
17 | ### 注意事項
18 |
19 | ないよ!
20 |
--------------------------------------------------------------------------------
/rmnewcollectionmark/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#rmnewcollectionmark](https://blog.weizlogy.com/pages/tos-addon/#rmnewcollectionmark)
2 |
3 | ### v1.0.0
4 |
5 | #### 新規作成
6 |
7 | アドオンがロードされると、コレクション画面で[N]マークが表示されなくなります。
8 |
9 | サブキャラ育成時にコレクション画面を開くと[N]マークがビッシリで消すのが大変だったので。。。
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # tree of savior addons development.
2 |
3 | ## available addons description.
4 |
5 | ## common installation.
6 |
7 | ### for jtos.
8 |
9 | ファイル名の先頭に📖を付けて、Nexon\TreeofSaviorJP\patchフォルダにおきます。
10 |
11 | ### for itos.
12 |
13 | added 📖 to filename, then put into steamapps\common\TreeOfSavior\patch .
14 |
--------------------------------------------------------------------------------
/masterplace/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.0.0
4 |
5 | ### 何をするもの?
6 |
7 | クラスマスターの所在地を教えてくれます。
8 |
9 | スキル情報画面のクラスアイコンを右クリックすると、チャット上に表示します。
10 |
11 | ### どうすれば?
12 |
13 | ipfファイルをインストールするだけです。
14 |
15 | ### いつ動くの?
16 |
17 | - スキル情報画面のクラスアイコンが描画されたとき。
18 | - スキル情報画面のクラスアイコンを右クリックしたとき。
19 |
20 | ### 注意事項
21 |
22 | ないよ!
23 |
--------------------------------------------------------------------------------
/partyinfoex/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#partyinfoex](https://blog.weizlogy.com/pages/tos-addon/#partyinfoex)
2 |
3 | ### v1.1.0
4 |
5 | #### 所在地追加
6 |
7 | 所在地(マップ名-チャンネル)を表示します。
8 |
9 | ### v1.0.0
10 |
11 | #### 新規作成
12 |
13 | アドオンがロードされると、パーティーメンバー一覧にSPゲージを表示します。
14 |
15 | 他に表示したい情報ありますか?
16 | リクエストは適宜受け付けています。
17 |
--------------------------------------------------------------------------------
/summonskilltooltip/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#summonskilltooltip](https://blog.weizlogy.com/pages/tos-addon/#summonskilltooltip)
2 |
3 | ### v1.0.0
4 |
5 | #### 新規作成
6 |
7 | アドオンがロードされると、召喚獣にオベイした際に使えるクイックスロットのスキル(降りるを除く)にツールチップを表示できるようにします。
8 |
9 | 通常のスキル同様、マウスホバーで表示されます。
10 |
11 | ツールチップでは、該当スキルのクラスタイプ、攻撃タイプ、スキル威力、クールダウンタイムを表示します。
12 |
--------------------------------------------------------------------------------
/fixlostchatwindow/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.0.1
4 |
5 | ### 何をするもの?
6 |
7 | 追加チャットウィンドウが消えてしまう問題が発生しても、自動的に以前の状態に復元します。
8 |
9 | ### 使い方
10 |
11 | 事前に addons\fixlostchatwindow フォルダを作成しておきます。(マネージャー経由なら自動生成されます。
12 |
13 | アドオンを入れた状態で追加チャットウィンドウを作成すると、上記フォルダに情報がサーバー毎に保存されます。
14 | すでに追加チャットウィンドウが存在する場合は、ちょっと移動させるとかチャットフィルターの種類を変更すると保存されます。
15 |
16 | 保存を確認できればあとは何とかしてくれると思います。
17 |
--------------------------------------------------------------------------------
/summoncounter/ui.ipf/baseskinset/summoncounter_addon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/slotmac/slotmac.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/compactheadsupdisplay/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#compactheadsupdisplay](https://blog.weizlogy.com/pages/tos-addon/#compactheadsupdisplay)
2 |
3 | ## Latest Release Note.
4 |
5 | ### v1.0.1
6 |
7 | #### 動かなかったのを修正!
8 |
9 | ### v1.0.0
10 |
11 | #### 新規作成
12 |
13 | アドオンがロードされると、Heads Up Display(自ジョブアイコン、HPなどがあるフレーム)からHPバーを取り去り、コンパクトにします。
14 | (ジョブアイコンとレベルだけにします)
15 |
16 | レベル部分を掴めばドラッグできます
17 |
--------------------------------------------------------------------------------
/fixbookread/fixbookread.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/pickiteminfo/pickiteminfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/hidename/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#hidename](https://blog.weizlogy.com/pages/tos-addon/#hidename)
2 |
3 | ### v1.0.3
4 |
5 | ギルドエンブレムも非表示にします。
6 |
7 | ### v1.0.2
8 |
9 | ギルド名も非表示にします。
10 |
11 | ### v1.0.1
12 |
13 | ふとした拍子に[自キャラ体力バー下]の名前が見えてしまう問題を修正しました。
14 |
15 | ### v1.0.0
16 |
17 | #### 新規作成
18 |
19 | アドオンがロードされると[画面左上]と[自キャラ体力バー下]のチーム名、キャラ名を非表示にします。
20 |
21 | 動画を撮るときに設定では非表示にできなかったので。。。
22 |
--------------------------------------------------------------------------------
/worldmapquest/worldmapquest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/masterplace/masterplace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/showhiddenmap/showhiddenmap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/stealthymaster/stealthymaster.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/warehousesorter/warehousesorter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/minigaugetext/addon_d.ipf/minigaugetext/minigaugetext.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/partyinfoex/addon_d.ipf/partyinfoex/partyinfoex.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/showbuffsellertype/showbuffsellertype.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/repairendur/repairendur.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/staminigauge/staminigauge.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/hidename/addon_d.ipf/hidename/hidename.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/skillitemcounter/addon_d.ipf/skillitemcounter/skillitemcounter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/skillitemcounter/README.md:
--------------------------------------------------------------------------------
1 | ### v1.1.2
2 |
3 | #### 6/27アップデート対応
4 |
5 | ### v1.1.1
6 |
7 | #### 使用回数が表示されない問題の修正
8 |
9 | 詳細は[#19](https://github.com/weizlogy/tos/issues/19)を参照してください。
10 |
11 | #### joypad対応
12 |
13 | joypadのquickslotに対応しました。(遅
14 |
15 | ### v1.1.0
16 |
17 | #### ポイズンポット使用スキル対応
18 |
19 | ポイズンポット消費のあるスキルスロットにも使用回数を表示します。
20 |
21 | ### v1.0.0
22 |
23 | #### 新規作成
24 |
25 | アドオンがロードされると、クイックスロットにセットしている、消費アイテムのあるスキルスロット右上に、消費アイテムの個数に応じたスキルの使用回数を追加で表示します。
26 |
--------------------------------------------------------------------------------
/dpsmeter/addon_d.ipf/dpsmeter/dpsmeter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/repeaterypuzzlecraft/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.0.0
4 |
5 | ### 修正内容
6 |
7 | ### 何をするもの?
8 |
9 | マグナムオーパスを指定した回数、自動実行します。
10 |
11 | ### 使い方
12 |
13 | 0. 普段どおりマグナムオーパスUIでアイテムを配置したあと 調合ボタン →開始する まで押します。
14 |
15 | 1. 数値入力ダイアログが表示されるので好きな回数(上限999)を入力します。
16 |
17 | 2. 確認ボタンを押すと調合が開始されます。
18 |
19 | 3. 終わるのを待ちます。
20 |
21 | ### どうすれば?
22 |
23 | ipfファイルをインストールします。
24 |
25 | ### いつ動くの?
26 |
27 | - マグナムオーパスの調合を開始する前
28 | - マグナムオーパスの調合が終了した後
29 |
30 | ### 注意事項
31 |
--------------------------------------------------------------------------------
/showhiddenmap/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#showhiddenmap](https://blog.weizlogy.com/pages/tos-addon/#showhiddenmap)
2 |
3 | ### v1.0.1
4 |
5 | #### マップ更新ロジック修正
6 |
7 | FPS_UPDATE->RunUpdateScript(0.2)に変更することでスムーズ具合が向上しました。(ぬるぬるとは言ってない)
8 |
9 | ### v1.0.0
10 |
11 | #### 新規作成
12 |
13 | アドオンがロードされると、(ミニ)マップが表示されないマップで(ミニ)マップが表示されるようになります。
14 | とある事情で、通常マップに比べるとちょっとマップ位置更新がスムーズではありませんが...
15 |
16 | というのも、MAP_CHARACTER_UPDATEのイベントが発生しないっぽいので、FPS_UPDATEで代用しているためだったり。
17 |
--------------------------------------------------------------------------------
/compactheadsupdisplay/addon_d.ipf/compactheadsupdisplay/compactheadsupdisplay.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/dice/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#dice](https://blog.weizlogy.com/pages/tos-addon/#dice)
2 |
3 | ### v1.1.0
4 |
5 | #### カスタムレンジ対応
6 |
7 | チャットコマンドで /random set <最小> <最大> と打つと、ランダムの範囲を変更できます。
8 |
9 | ```lua
10 | /random set 1 6 -- 6面ダイス状態
11 | /random set 1 10 -- 10面ダイス状態
12 | /random set -- デフォルトに戻ります
13 | ```
14 |
15 | ### v1.0.1
16 |
17 | #### itos対応
18 |
19 | ### v1.0.0
20 |
21 | #### 新規作成
22 |
23 | アドオンがロードされると、チャットコマンドで /random と打つと、
24 | 0~999の値をランダムに決定し、一般チャット範囲に結果を送信します。
25 |
--------------------------------------------------------------------------------
/objectdetector/addon_d.ipf/objectdetector/objectdetector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/staminigauge/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#staminigauge](https://blog.weizlogy.com/pages/tos-addon/#staminigauge)
2 |
3 | ### v1.0.3
4 |
5 | #### ゲージ位置調整
6 |
7 | 10/25 UPDATEに対応してゲージを調整しました。
8 |
9 | ### v1.0.2
10 |
11 | #### ゲージ位置調整
12 |
13 | 8/23 UPDATEに対応してゲージを調整しました。
14 |
15 | ### v1.0.1
16 |
17 | #### ゲージ位置調整
18 |
19 | スタミナゲージと名前が被らないよう調整しました。
20 |
21 | ### v1.0.0
22 |
23 | #### 新規作成
24 |
25 | アドオンがロードされると、キャラの足元に黄色のスタミナゲージが追加されます。
26 |
27 | 若干キャラ名と被りますが、気にしないように。
28 |
--------------------------------------------------------------------------------
/showbuffsellertype/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#showbuffsellertype](https://blog.weizlogy.com/pages/tos-addon/#showbuffsellertype)
2 |
3 | # Release Note.
4 |
5 | ## v1.1.0
6 |
7 | ### 何をするもの?
8 |
9 | 商店のフキダシに商店名を付けて紛らわしさを回避します。(主に装備メンテ、修理の区別)
10 |
11 | ### どうすれば?
12 |
13 | ipfファイルをインストールするだけです。
14 |
15 | ### いつ動くの?
16 |
17 | - バフ屋バルーンフレーム処理発生時
18 |
19 | ### 注意事項
20 |
21 | ないよ!
22 |
23 | ### v1.0.0
24 |
25 | #### 新規作成
26 |
27 | アドオンがロードされると、商店のフキダシに商店名を付けて紛らわしさを回避します。(主に武器メンテ、防具メンテ、修理の区別)
28 |
29 |
--------------------------------------------------------------------------------
/dice/addon_d.ipf/dice/dice.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/savequest/addon_d.ipf/savequest/savequest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/subquickslot/addon_d.ipf/subquickslot/subquickslot.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/previewguildemblem/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#previewguildemblem](https://blog.weizlogy.com/pages/tos-addon/#previewguildemblem)
2 |
3 | ### v1.1.0
4 |
5 | #### キャラ名横エンブレムプレビュー対応
6 |
7 | エンブレムの一覧(画像登録)画面でファイル名左にあるエンブレムアイコンをキャラ名横に表示されるサイズに合わせることでプレビュー可能としています。
8 |
9 | プレビュー画面の確認ボタンはギルドマスター以外非表示にしたので、ギルドマスターの人も入れられるよ!
10 |
11 | ### v1.0.0
12 |
13 | #### 新規作成
14 |
15 | アドオンがロードされると、ギルドマスター以外でもギルドエンブレムのプレビューができるようになります。
16 |
17 | プレビュー画面の確認ボタンは非表示にしているので誤登録の心配はありません。(そもそも登録処理が成功するかどうかは怪しいところですが)
18 |
19 | ギルドマスターの人は入れないでね!!!
20 |
--------------------------------------------------------------------------------
/console/addon_d.ipf/console/console.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/fixinventorysort/addon_d.ipf/fixinventorysort/fixinventorysort.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/multiplequickslot/addon_d.ipf/multiplequickslot/multiplequickslot.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/removetipsfe/removetipsfe.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/kaywadequeer/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.0.1
4 |
5 | ### 修正内容
6 |
7 | #### 副作用軽減措置
8 |
9 | - 武器スワップスロットは自動消去します。
10 | - チャット入力できないっぽいのができるように?
11 |
12 | ### 何をするもの?
13 |
14 | NPCに話しかけられない状態を解消してくれるかもしれないです。
15 |
16 | ### 使い方
17 |
18 | 
19 |
20 | クラスアイコン下のレベル表記の左側に DE ボタンが追加されます。ボタンを押すと一瞬画面が固まりますがすぐに戻ります。するとNPCに話しかけることができます。
21 |
22 | 副作用が少々あります。
23 |
24 | - ~~なぜか武器スワップスロットが出てきて消えません。(別マップに移動すると消えます)~~
25 | - ボタン押下前に付与されているバフアイコンは復元しません。
26 |
--------------------------------------------------------------------------------
/guildnotifyinchat/guildnotifyinchat.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/kaywadequeer/addon_d.ipf/kaywadequeer/kaywadequeer.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/previewguildemblem/previewguildemblem.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/summonskilltooltip/summonskilltooltip.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/monsterstatus/addon_d.ipf/monsterstatus/monsterstatus.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/rmnewcollectionmark/rmnewcollectionmark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/repeaterypuzzlecraft/addon_d.ipf/repeaterypuzzlecraft/repeaterypuzzlecraft.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/costumeplay/addon_d.ipf/costumeplay/costumeplay.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/fixlostchatwindow/addon_d.ipf/fixlostchatwindow/fixlostchatwindow.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/repairendur/settings.txt:
--------------------------------------------------------------------------------
1 | -- repairendur.ipf settings.
2 |
3 | -- L:Low, M:Middle, H:High.
4 | -- p:Parcent, c:Color.
5 |
6 | -- === START === --
7 |
8 | -- for weapon endurarance parcentage.
9 | reen.Weapon = {
10 | Lp = 30,
11 | Mp = 5,
12 | Hp = 1
13 | };
14 | -- for armour endurarance parcentage.
15 | reen.Armor = {
16 | Lp = 35,
17 | Mp = 10,
18 | Hp = 5
19 | };
20 | -- for subweapon endurarance parcentage.
21 | reen.SubWeapon = reen.Weapon;
22 |
23 | -- text color by endurarance parcentage.
24 | reen.EndurColor = {
25 | Lc = "FFFF00",
26 | Mc = "FF0000",
27 | Hc = "000000"
28 | };
29 |
30 | -- === END === --
31 |
--------------------------------------------------------------------------------
/distance/distance.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/pickiteminfo/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#pickiteminfo](https://blog.weizlogy.com/pages/tos-addon/#pickiteminfo)
2 |
3 | ### v1.0.4
4 |
5 | #### アイテム名途切れ修正
6 |
7 | アイテム名が途切れる問題を修正しました。
8 |
9 | ### v1.0.3
10 |
11 | #### リーク対応
12 |
13 | アイテム名を表示しているフレームが破棄されない問題を修正しました。
14 |
15 | ### v1.0.2
16 |
17 | #### 名称表示位置調整
18 |
19 | v1.0.1のずれが治ったのに合わせて再調整しました。
20 |
21 | ### v1.0.1
22 |
23 | #### 名称表示位置調整
24 |
25 | 8/23 UPDATEにより、ALTキーでアイテム名称表示がずれるようになった影響で同じようにずれる問題に対応しました。
26 |
27 | 名称の動きが若干不穏ですが、ALTキーでアイテム名称表示がずれる問題が解決するまでの暫定対処となります。
28 |
29 |
30 | ### v1.0.0
31 |
32 | #### 新規作成
33 |
34 | アドオンがロードされると、ALTキーを押さなくとも、ドロップアイテムの名称が表示されるようになります。
35 |
36 | アイテム名称はレアリティで色が変わります。
37 | 色の変化はColored Item Namesをパク...参考にしています。
38 |
--------------------------------------------------------------------------------
/console/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#console](https://blog.weizlogy.com/pages/tos-addon/#console)
2 |
3 | ### v1.2.0
4 |
5 | #### GUI除去
6 |
7 | GUIがなくなり、settings.txtは無効化されました。
8 |
9 | #### チャットコマンド追加
10 |
11 | GUIに代わり、チャットコマンド[/console]で処理を実行できます。
12 |
13 | #### 抽出フォーマット変更
14 |
15 | lua定義関数は引数を表示するようにしました。
16 |
17 | c定義関数はcfunc.txtに定義することで引数を表示できます。
18 |
19 | ### v1.1.0
20 |
21 | 設定[ボタン表示状態]を追加しました。
22 |
23 | アドオンがロードされるとボタン表示状態が1の場合のみ、[Console]ボタンが表示されます。
24 | ボタンを押すと抽出を開始します。
25 | ボタン表示状態はエリアチェンジの度に読み込まれるため、ゲーム起動中にボタン表示を切り替えることも可能です。
26 |
27 | ### v1.0.0
28 |
29 | 新規作成。
30 |
31 | アドオンがロードされると[Console]ボタンが表示されます。ボタンを押すと抽出を開始します。 Nexon\TreeofSaviorJP\data\console.txt に抽出結果が出力されます。
32 | 実際の抽出結果は[別記事]({% post_url 2016-12-31-ies-format %})にあります。
33 |
34 |
--------------------------------------------------------------------------------
/summoncounter/settings-v1.txt:
--------------------------------------------------------------------------------
1 | suco.config = {
2 | Bokor_Zombify = {
3 | mode = "hpbar",
4 | loc_frame = { x = 450, y = 80 },
5 | loc_bar = { x = 0, y = 0 }
6 | },
7 | Necromancer_RaiseDead = {
8 | mode = "icon1",
9 | loc = "left",
10 | loc1 = { x = 0, y = 30 },
11 | loc2 = { x = 0, y = 70 },
12 | loc3 = { x = 0, y = 110 },
13 | loc4 = { x = -40, y = 50 },
14 | loc5 = { x = -40, y = 90 }
15 | },
16 | Necromancer_RaiseSkullarcher = {
17 | mode = "icon1",
18 | loc = "right",
19 | loc1 = { x = 0, y = 30 },
20 | loc2 = { x = 0, y = 70 },
21 | loc3 = { x = 0, y = 110 },
22 | loc4 = { x = 40, y = 50 },
23 | loc5 = { x = 40, y = 90 }
24 | },
25 | Necromancer_CreateShoggoth = {
26 | mode = "icon2",
27 | loc = "down",
28 | loc1 = { x = 0, y = 0 }
29 | }
30 | };
--------------------------------------------------------------------------------
/hpmonitor/addon_d.ipf/hpmonitor/hpmonitor.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/worldmapquest/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#worldmapquest](https://blog.weizlogy.com/pages/tos-addon/#worldmapquest)
2 |
3 | ### v1.2.0
4 |
5 | #### クエストワープマップモード追加
6 |
7 | 左ALTを押しながらワールドマップを開くと、クエストワープ可能なマップのみワールドマップ上に表示し、
8 | ワールドマップからクエストワープを実行できます。
9 |
10 | ### v1.1.2
11 |
12 | #### ワープ用ワールドマップに残クエストオブジェクトが残る問題修正
13 |
14 | ワープスクロールやワープ像で表示するワープ用ワールドマップに
15 | 残クエストオブジェクトが残らないよう修正しました。
16 |
17 | ### v1.1.1
18 |
19 | #### パッチ対応
20 |
21 | 157576_001001 パッチ適用で使用不可になったので回避対応しました。
22 |
23 | #### 反復クエストの非表示設定
24 |
25 | 反復クエストの表示非表示を切り替えるには、
26 | ワールドマップのクエスト数を右クリック > [toggleRepeatQuest]を選択します。
27 |
28 | 選択後、ワールドマップを再表示すると反映されます。
29 |
30 | 選択する度に反復クエストの表示非表示を切り替えます。
31 |
32 | ### v1.0.0
33 |
34 | #### 新規作成
35 |
36 | アドオンがロードされると、ワールドマップの各エリア名上部に受注可能なクエスト数が表示されます。
37 |
38 | introductionの画像では碑石路、いにしえの女神の庭、ドバシア峠、古旗の森、大王の関門、カーライルの霊廟、ガルエット平野に[n]の形式で表示されています。
39 |
--------------------------------------------------------------------------------
/itemdrops/settings.txt:
--------------------------------------------------------------------------------
1 | local g = _G['ADDONS']['MIEI']["ITEMDROPS"];
2 | g.settings = {
3 | showGrade = false;
4 | showGroupName = false;
5 | msgFilterGrade = "rare";
6 | effectFilterGrade = "common";
7 | nameTagFilterGrade = "common";
8 | alwaysShowXPCards = false;
9 | alwaysShowMonGems = true;
10 | alwaysShowCubes = true;
11 | showSilverNameTag = false;
12 | onlyMeOrParty = true;
13 | showPartyDrops = true;
14 | }
15 | g.settings.effects ={
16 | ["common"] = {
17 | name = "F_magic_prison_line_white";
18 | scale = 6;
19 | };
20 |
21 | ["rare"] = {
22 | name = "F_magic_prison_line_blue";
23 | scale = 6;
24 | };
25 |
26 | ["epic"] = {
27 | name = "F_magic_prison_line_dark";
28 | scale = 6;
29 | };
30 |
31 | ["legendary"] = {
32 | name = "F_magic_prison_line_red";
33 | scale = 6;
34 | };
35 | ["set"] = {
36 | name = "F_magic_prison_line_green";
37 | scale = 6;
38 | };
39 | }
40 |
--------------------------------------------------------------------------------
/minigaugetext/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#minigaugetext](https://blog.weizlogy.com/pages/tos-addon/#minigaugetext)
2 |
3 | ## Release Note.
4 |
5 | ## v1.1.1
6 |
7 | ### 変更内容
8 |
9 | - HP/SPでカラーを個別設定可能に
10 |
11 | ### 何をするもの?
12 |
13 | キャラクター下のHP/SPバー上下に現在値と最大値を表示します。
14 |
15 | ### どうすれば?
16 |
17 | ipfファイルをインストールして、addons/minigaugetext/settings.txt を用意します。
18 |
19 | settings.txt
20 | ```lua
21 | local s = {}
22 | ---
23 | s['size'] = 13 -- 自キャラフォントサイズ
24 | s['color'] = '#FFFFFF' -- 自キャラHPフォントカラー
25 | s['spcolor'] = '#FFFFFF' -- 自キャラSPフォントカラー
26 | s['ptsize'] = 12 -- PTメンバーフォントサイズ
27 | s['ptcolor'] = '#CCCCCC' -- PTメンバーHPフォントカラー
28 | s['ptspcolor'] = '#CCCCCC' -- PTメンバーSPフォントカラー
29 | ---
30 | return s
31 | ```
32 |
33 | - size / ptsize
34 |
35 | フォントサイズを変更します。最大値はだいたい20くらいで見切れてくると思います。
36 | デフォルトは11です。
37 |
38 | - color / ptcolor / spcolor / ptspcolor
39 |
40 | フォントカラーを変更します。「# + RGB」の形式です。
41 | デフォルトは #FFFFFF です。(白)
42 |
43 | ### いつ動くの?
44 |
45 | - HP/SPに変化があったとき。
46 |
47 | ### 注意事項
48 |
49 | ないよ!
50 |
51 | ###
52 |
--------------------------------------------------------------------------------
/rmnewcollectionmark/rmnewcollectionmark.lua:
--------------------------------------------------------------------------------
1 | RmNewCollectionMark = {};
2 |
3 | -- constructor.
4 | function RmNewCollectionMark.new(self)
5 | -- initialize members.
6 | local members = {};
7 |
8 | members.RemoveNewMark = function(self, type)
9 | local cls = GetClassByType("Collection", type);
10 | local etcObj = GetMyEtcObject();
11 | etcObj["CollectionRead_"..cls.ClassID] = 1;
12 | end
13 |
14 | -- destroy.
15 | members.Destroy = function(self)
16 | SET_COLLECTION_SET = rncm.SET_COLLECTION_SET;
17 | end
18 | return setmetatable(members, {__index = self});
19 | end
20 | -- set call.
21 | setmetatable(RmNewCollectionMark, {__call = RmNewCollectionMark.new});
22 |
23 | -- frame initialize.
24 | function RMNEWCOLLECTIONMARK_ON_INIT(addon, frame)
25 | if (rncm.SET_COLLECTION_SET == nil) then
26 | rncm.SET_COLLECTION_SET = SET_COLLECTION_SET;
27 | end
28 | SET_COLLECTION_SET = function(frame, ctrlSet, type, coll, posY)
29 | rncm:RemoveNewMark(type);
30 | return rncm.SET_COLLECTION_SET(frame, ctrlSet, type, coll, posY);
31 | end
32 | end
33 |
34 | -- create instance.
35 | if (rncm ~= nil) then
36 | rncm:Destroy();
37 | end
38 | rncm = RmNewCollectionMark();
39 |
--------------------------------------------------------------------------------
/multiplequickslot/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | クイックスロットの保存、復元できるようになります。
4 |
5 | # 使い方
6 |
7 | ## 準備
8 |
9 | ipfファイルをインストールします。
10 |
11 | addons/multiplequickslotフォルダを作成します。
12 |
13 | ## 概要
14 |
15 | 
16 |
17 | ## ◆メニュー
18 |
19 | - AddNew
20 |
21 | 指定した名前のクイックスロットセットを登録します。(メニュー選択後、入力ダイアログがでます。
22 |
23 | - Delete
24 |
25 | 指定した名前のクイックスロットセットを削除します。(メニュー選択後、入力ダイアログがでます。
26 |
27 | - Reload (v1.0.2)
28 |
29 | 各種設定を再読み込みします。
30 |
31 | - ClearAll
32 |
33 | 現在のクイックスロットを空にします。(メニュー選択後、確認ダイアログがでます。
34 |
35 | - Cancel
36 |
37 | メニューを閉じます。
38 |
39 | ## クイックスロットセット名ラベル
40 |
41 | 最後に選択したクイックスロットセット名を表示します。
42 | 右クリックで表示するメニューから別のセットに切り替えることができます。
43 |
44 | ### ラベル表示位置調整
45 |
46 | Settings.txtをダウンロードしてaddons/multiplequickslot下に置きます。
47 |
48 | [Settings.txt](https://github.com/weizlogy/tos/releases/download/multiplequickslot/Settings.txt)
49 |
50 | labelX、labelY の数値を変えつつ、◆メニューのReloadで反映させて確認してください。(これはキャラ共通です
51 |
52 | ```lua
53 | local s = {
54 | ['labelX'] = '0', -- (PADモード以外の)ラベルのX座標を調整する
55 | ['labelY'] = '0', -- (PADモード以外の)ラベルのY座標を調整する
56 | ['PadLabelX'] = '0', -- (PADモードの)ラベルのX座標を調整する
57 | ['PadLabelY'] = '0', -- (PADモードの)ラベルのY座標を調整する
58 | }
59 | return s
60 | ```
61 |
--------------------------------------------------------------------------------
/stealthymaster/stealthymaster.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'stealthymaster'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {}
14 |
15 | -- デストラクター
16 | members.Destroy = function(self)
17 | PROPERTY_COMPARE = g.instance.PROPERTY_COMPARE
18 | end
19 | -- おまじない
20 | return setmetatable(members, {__index = self})
21 | end
22 | -- .newなしでコンストラクターを呼ぶエイリアス登録
23 | setmetatable(g, {__call = g.new})
24 |
25 | -- 自フレーム初期化処理
26 | function STEALTHYMASTER_ON_INIT(addon, frame)
27 | if (g.instance.PROPERTY_COMPARE == nil) then
28 | g.instance.PROPERTY_COMPARE = PROPERTY_COMPARE
29 | end
30 | PROPERTY_COMPARE = function(handle)
31 | -- ui.PropertyCompare(handle, 1) -- キャラ情報表示+いいね
32 | -- ui.PropertyCompare(handle, 1, 1) -- キャラ情報表示+いいね
33 | -- ui.PropertyCompare(handle, 0, 1) -- いいね
34 | -- ui.PropertyCompare(handle, 1, 0) -- キャラ情報表示
35 | ui.PropertyCompare(handle, 1, 0)
36 | end
37 | end
38 |
39 | -- インスタンス作成
40 | if (g.instance ~= nil) then
41 | g.instance:Destroy()
42 | end
43 | g.instance = g()
44 |
--------------------------------------------------------------------------------
/objectdetector/settings.txt:
--------------------------------------------------------------------------------
1 | -- for monster and npcs.
2 | obde.config.mon = {
3 | color = "FF000000",
4 | isVisible = 1
5 | };
6 | obde.config.mon.Monster = {
7 | color = "FF660000",
8 | isVisible = 1
9 | };
10 | obde.config.mon.Monster_Chaos1 = obde.config.mon.Monster;
11 | obde.config.mon.Monster_Chaos2 = obde.config.mon.Monster;
12 |
13 | obde.config.mon.Pet = {
14 | isVisible = 0
15 | };
16 | obde.config.mon.RootCrystal = {
17 | color = "FF330033",
18 | isVisible = 1
19 | };
20 | obde.config.mon.Neutral = {
21 | color = "FFFF9900",
22 | isVisible = 1,
23 | };
24 | obde.config.mon.Peaceful = obde.config.mon.Neutral;
25 | obde.config.mon.Our_Forces = obde.config.mon.Neutral;
26 | obde.config.mon.Hidden_tgt = obde.config.mon.Neutral;
27 |
28 | -- for players.
29 | obde.config.pc = {
30 | color = "FF0000FF",
31 | isVisible = 1
32 | };
33 |
34 | -- for dropitems.
35 | obde.config.item = {
36 | color = "FF999999",
37 | isVisible = 1
38 | };
39 |
40 | -- for treasures.
41 | obde.config.treasure = {
42 | color = "FFFF9900",
43 | isVisible = 1,
44 | isBlink = 1
45 | };
46 |
47 | -- for clover buffs.
48 | obde.config.clover = {
49 | color = "FF330000",
50 | isVisible = 1,
51 | isBlink = 1
52 | };
53 |
54 | obde.config.clover.EliteMonsterBuff = {
55 | color = "FFFF3333",
56 | isVisible = 1
57 | };
58 |
--------------------------------------------------------------------------------
/repairendur/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#repairendur](https://blog.weizlogy.com/pages/tos-addon/#repairendur)
2 |
3 | ## settings.
4 |
5 | Nexon\TreeofSaviorJP\addons\repairendur\settings.txt を作成します。
6 |
7 | 以下の初期設定を[settings.txt](https://github.com/weizlogy/tos/blob/master/repairendur/settings.txt)コピペします。
8 |
9 | ```lua
10 | reen.Weapon = {
11 | Lp = 30,
12 | Mp = 5,
13 | Hp = 1
14 | };
15 | reen.Armor = {
16 | Lp = 35,
17 | Mp = 10,
18 | Hp = 5
19 | };
20 | reen.SubWeapon = reen.Weapon; -- added v1.1.0
21 | reen.EndurColor = {
22 | Lc = "FFFF00",
23 | Mc = "FF0000",
24 | Hc = "000000"
25 | };
26 | ```
27 |
28 | ### explanation.
29 |
30 | この設定は装備の耐久度と割合に応じた文字色の設定です。
31 |
32 | [Weapon]、[Armor]は装備の耐久度の色分け用閾値で、Low, Middle, Highの3段階を、武器用と防具用で用意しています。
33 |
34 | [EndurColor]は装備の耐久度閾値に対応する色をRGBで指定します。
35 |
36 | ### explanation of initial parameters.
37 |
38 | 武器
39 |
40 | - 耐久度[30]%以下で[黄]色
41 | - 耐久度[5]%以下で[赤]色
42 | - 耐久度[1]%以下で[黒]色
43 |
44 | 防具
45 |
46 | - 耐久度[35]%以下で[黄]色
47 | - 耐久度[10]%以下で[赤]色
48 | - 耐久度[5]%以下で[黒]色
49 |
50 | サブウェポン
51 |
52 | - 武器と同様
53 |
54 | ## descriptions.
55 |
56 | ### v1.1.0
57 |
58 | サブウェポン用の設定を追加しました。
59 |
60 | [issue #2](https://github.com/weizlogy/tos/issues/2)
61 |
62 | 初期値は武器の設定値を見るようにしています。
63 |
64 | ### v1.0.1
65 |
66 | 修理後に以前の耐久度表示が残る問題を修正しました。
67 |
68 | ### v1.0.0
69 |
70 | 新規作成。
71 |
72 | アドオンがロードされると、NPC修理、露天修理の装備アイコンに耐久度を設定の閾値に応じた文字色で表示します。
73 |
--------------------------------------------------------------------------------
/dpsmeter/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#dpsmeter](https://blog.weizlogy.com/pages/tos-addon/#dpsmeter)
2 |
3 | ### v1.3.1
4 |
5 | #### DPS計測ON/OFF追加
6 |
7 | 初期状態をOFFとしました。
8 |
9 | チャットコマンドにてON/OFFを切り替えます。
10 |
11 | ```lua
12 | /dpsm on -- 計測開始
13 | /dpsm off -- 計測停止
14 | ```
15 |
16 | ### v1.3.0
17 |
18 | #### DPS平均値表示を追加
19 |
20 | #### DPS平均値表示に伴い、フォーマットを変更
21 |
22 | ```
23 | 現在のDPS[{淡青}平均DPS][{淡赤}最大DPS] dps
24 | ```
25 |
26 | #### モンスター死亡時のsystemメッセージによる通知をデフォルトOFFに変更
27 |
28 | 表示するには、DPSのUIを右クリック > [toggleChat]を選択します。
29 |
30 | 選択する度に通知のON/OFFを切り替えます。
31 |
32 | #### DPS計測対象を調整
33 |
34 | - ボコルのゾンビフィーで召喚するゾンビを除外
35 |
36 | ### v1.2.0
37 |
38 | #### DPS計測方法を調整
39 |
40 | ターゲットアイコン表示が可能な距離まで近づいて、初撃時(を含む。初撃はdamage/1sec換算)からDPS計測を開始します。
41 |
42 | ターゲットが死ぬかフレームアウトするまで計測は止まりません。
43 |
44 | #### DPS計測対象を調整
45 |
46 | 旧バージョンではfaction = "Monster"を計測対象としていましたが不十分でしたので、
47 | 計測対象を拡大し、ペット以外(faction ~= "Pet")としました。
48 |
49 | IWやルーツクリスタルも対象となってしまいますが、計測されないよりは良いかと。。。
50 |
51 | ### v1.1.0
52 |
53 | #### UI表示を追加
54 |
55 | 現在のDPS、最大DPSをモンスターUI近辺に、以下のフォーマット表示します。
56 |
57 | ```
58 | [現在のDPS]([最大DPS]) dps
59 | ```
60 |
61 | #### モンスター死亡時のsystemメッセージによる通知を追加
62 |
63 | モンスター死亡時、最大DPSをsystemメッセージで表示します。
64 |
65 | ターゲットアイコン表示が可能な距離まで近づくとDPS計測を開始、離れると停止します。
66 |
67 | ### v1.0.0
68 |
69 | #### 新規作成。
70 |
71 | アドオンがロードされるとDPS計測が有効になり、計測結果はsystemメッセージで通知します。
72 |
73 | 現時点ではコンバットログが取れないので、正確な測定は実現できていません。
74 |
75 | 少しでも測定精度を上げたい場合は、以下の点に注意してください。
76 |
77 | - ソロで戦う。(コンパニオンも出さない)
78 | - 混戦しない。
79 | - 回復持ちの敵は避ける。
80 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter_icon1.lua:
--------------------------------------------------------------------------------
1 | -- アイコン表示モード1
2 | -- 召喚物をアイコンで、キャラクターの左右に表示する
3 | ModeIcon1 = {}
4 |
5 | -- コンストラクター
6 | function ModeIcon1.new(self)
7 | local members = {}
8 |
9 | members.Key = ''
10 | members.Handles = {}
11 |
12 | -- モード処理を実行する
13 | -- frame UI生成先フレーム
14 | -- config モード用設定
15 | members.Execute = function(self ,frame, config)
16 | for i, handle in ipairs(self.Handles) do
17 | self:CreateSummonIcon(frame, handle, config, i)
18 | end
19 | end
20 |
21 | -- 召喚物アイコンを作成する
22 | -- frame UI生成先フレーム
23 | -- handle 召喚物のハンドル
24 | -- config モード用設定
25 | -- index 表示位置
26 | members.CreateSummonIcon = function(self, frame, handle, config, index)
27 | local iconName = 'vw_'..self.Key..'_'..handle
28 |
29 | local iconSize = 35
30 | local iconPos = config.loc
31 | local iconXBase = 0
32 |
33 | if (iconPos == 'left') then
34 | iconXBase = 3
35 | elseif (iconPos == 'right') then
36 | iconXBase = 1.6
37 | end
38 |
39 | local pic = frame:CreateOrGetControl('picture', iconName, 0, 0, iconSize, iconSize)
40 | tolua.cast(pic, 'ui::CPicture')
41 |
42 | local loc = config['loc'..index]
43 | local x = frame:GetWidth() / iconXBase + loc.x
44 | local y = 90 + loc.y
45 |
46 | pic:SetImage('summoncounter_necro_skull')
47 | pic:SetEnableStretch(1)
48 | pic:SetOffset(x, y)
49 | pic:EnableHitTest(0)
50 | end
51 |
52 | return setmetatable(members, {__index = self})
53 | end
54 | setmetatable(ModeIcon1, {__call = ModeIcon1.new})
55 |
--------------------------------------------------------------------------------
/guildnotifyinchat/guildnotifyinchat.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'guildnotifyinchat'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {}
14 |
15 | -- ギルド名
16 | members.GetGuildName = function(self, guild)
17 | return guild.info.name
18 | end
19 |
20 | -- 例のテキスト
21 | members.GetNotifyText = function(self, guild)
22 | return guild.info:GetNotice()
23 | end
24 |
25 | -- デストラクター
26 | members.Destroy = function(self)
27 | end
28 | -- おまじない
29 | return setmetatable(members, {__index = self})
30 | end
31 | -- .newなしでコンストラクターを呼ぶエイリアス登録
32 | setmetatable(g, {__call = g.new});
33 |
34 | -- 自フレーム初期化処理
35 | function GUILDNOTIFYINCHAT_ON_INIT(addon, frame)
36 | addon:RegisterMsg("GAME_START_3SEC", "GUILDNOTIFYINCHAT_GAME_START_3SEC");
37 | end
38 |
39 | -- 3秒後の処理(ギルド情報初期化待ち的な)
40 | function GUILDNOTIFYINCHAT_GAME_START_3SEC()
41 | -- ギルドに加入しているか?
42 | local guild = session.party.GetPartyInfo(PARTY_GUILD)
43 | if (guild == nil) then
44 | return
45 | end
46 | local text = g.instance:GetNotifyText(guild)
47 | if (text == nil or text == '') then
48 | return
49 | end
50 | CHAT_SYSTEM('['..g.instance:GetGuildName(guild)..']'..text)
51 | end
52 |
53 | -- インスタンス作成
54 | if (g.instance ~= nil) then
55 | g.instance:Destroy()
56 | end
57 | g.instance = g()
58 |
--------------------------------------------------------------------------------
/removetipsfe/removetipsfe.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'removetipsfe'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {}
14 |
15 | -- デストラクター
16 | members.Destroy = function(self)
17 | if (self.LEVEL_LINFORM_MESSAGE_CLIENT ~= nil) then
18 | LEVEL_LINFORM_MESSAGE_CLIENT = self.LEVEL_LINFORM_MESSAGE_CLIENT
19 | end
20 | end
21 | -- おまじない
22 | return setmetatable(members, {__index = self})
23 | end
24 | -- .newなしでコンストラクターを呼ぶエイリアス登録
25 | setmetatable(g, {__call = g.new});
26 |
27 | -- 自フレーム初期化処理
28 | function REMOVETIPSFE_ON_INIT(addon, frame)
29 | -- 関数退避
30 | if (g.instance.LEVEL_LINFORM_MESSAGE_CLIENT == nil) then
31 | g.instance.LEVEL_LINFORM_MESSAGE_CLIENT = LEVEL_LINFORM_MESSAGE_CLIENT
32 | end
33 | -- フックして...
34 | LEVEL_LINFORM_MESSAGE_CLIENT = function(idList)
35 | -- pc_client.lua # LEVEL_LINFORM_MESSAGE_CLIENT からコピペ注意
36 | local idList = SCR_STRING_CUT(idList)
37 | local msg = '[TIPS] '
38 | for i = 1, #idList do
39 | local ies = GetClassByType('levelinformmessage', idList[i])
40 | msg = msg..'{nl} {nl}'..i..'. '..string.gsub(dictionary.ReplaceDicIDInCompStr(ies.Message), '%{.-%}', '')
41 | end
42 | CHAT_SYSTEM(msg)
43 | end
44 | end
45 |
46 | -- インスタンス作成
47 | if (g.instance ~= nil) then
48 | g.instance:Destroy()
49 | end
50 | g.instance = g()
51 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter_icon2.lua:
--------------------------------------------------------------------------------
1 | -- アイコン表示モード2
2 | -- 召喚物をアイコンで、キャラクターの上下に表示する
3 | ModeIcon2 = {}
4 |
5 | function ModeIcon2.new(self)
6 | local members = {}
7 |
8 | members.Key = ''
9 | members.Handles = {}
10 |
11 | -- モード処理を実行する
12 | -- frame UI生成先フレーム
13 | -- config モード用設定
14 | members.Execute = function(self, frame, config)
15 | for i, handle in ipairs(self.Handles) do
16 | self:CreateSummonIcon(frame, handle, config, i)
17 | end
18 | end
19 |
20 | -- 召喚物アイコンを作成する
21 | -- frame UI生成先フレーム
22 | -- handle 召喚物のハンドル
23 | -- config モード用設定
24 | -- index 表示位置
25 | members.CreateSummonIcon = function(self, frame, handle, config, index)
26 | local iconName = 'vw_'..self.Key..'_'..handle
27 |
28 | local iconSize = 60
29 | local iconPos = config.loc
30 | local iconYBase = 0
31 | local iconCenterMarginX = -27
32 |
33 | if (iconPos == 'up') then
34 | iconYBase = 0.4
35 | elseif (iconPos == 'down') then
36 | iconYBase = 3.6
37 | end
38 |
39 | local pic = frame:CreateOrGetControl('picture', iconName, 0, 0, iconSize, iconSize)
40 | tolua.cast(pic, 'ui::CPicture')
41 |
42 | local loc = config['loc'..index]
43 | local x = (frame:GetWidth() / 2) + loc.x + iconCenterMarginX
44 | local y = (90 + loc.y) * iconYBase
45 |
46 | pic:SetImage('summoncounter_necro_circle')
47 | pic:SetEnableStretch(1)
48 | pic:SetOffset(x, y)
49 | pic:EnableHitTest(0)
50 | end
51 |
52 | return setmetatable(members, {__index = self})
53 | end
54 | setmetatable(ModeIcon2, {__call = ModeIcon2.new})
55 |
--------------------------------------------------------------------------------
/showhiddenmap/showhiddenmap.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'showhiddenmap'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {}
14 |
15 | -- デストラクター
16 | members.Destroy = function(self)
17 | end
18 | -- おまじない
19 | return setmetatable(members, {__index = self})
20 | end
21 | -- .newなしでコンストラクターを呼ぶエイリアス登録
22 | setmetatable(g, {__call = g.new});
23 |
24 | -- 自フレーム初期化処理
25 | function SHOWHIDDENMAP_ON_INIT(addon, frame)
26 | -- 関数退避
27 | if (g.instance.DontUseMinimap == nil) then
28 | g.instance.DontUseMinimap = session.DontUseMinimap
29 | end
30 | -- ミニマップ不使用チェックのサニタイジング
31 | session.DontUseMinimap = function()
32 | return false
33 | end
34 | -- 旧関数でミニマップ不使用だったマップに居るときはイベントハンドラーを設置する
35 | if (g.instance.DontUseMinimap() == true) then
36 | ui.GetFrame('minimap'):RunUpdateScript("SHOWHIDDENMAP_UPDATE_MINIMAP", 0.2)
37 | ui.GetFrame('map'):RunUpdateScript("SHOWHIDDENMAP_UPDATE_MAP", 0.2)
38 | end
39 | end
40 |
41 | -- ミニマップ更新イベントハンドラー
42 | function SHOWHIDDENMAP_UPDATE_MINIMAP(frame)
43 | MINIMAP_CHAR_UDT(frame, '', '', session.GetMyHandle())
44 | return 1
45 | end
46 |
47 | -- マップ更新イベントハンドラー
48 | function SHOWHIDDENMAP_UPDATE_MAP(frame)
49 | MAP_CHAR_UPDATE(frame, '', '', session.GetMyHandle())
50 | return 1
51 | end
52 |
53 | -- インスタンス作成
54 | if (g.instance ~= nil) then
55 | g.instance:Destroy()
56 | end
57 | g.instance = g()
58 |
--------------------------------------------------------------------------------
/summoncounter/settings.txt:
--------------------------------------------------------------------------------
1 | suco.config = {
2 | Cryomancer_FrostPillar = {
3 | mode = "None",
4 | },
5 |
6 | Bokor_Zombify = {
7 | mode = "party",
8 | },
9 |
10 | Necromancer_RaiseDead = {
11 | mode = "party",
12 | talk = {
13 | data = "list_dicid.txt",
14 | format = 'dicid',
15 | freq = 10
16 | }
17 | },
18 | Necromancer_RaiseSkullarcher = {
19 | mode = "party",
20 | },
21 | Necromancer_RaiseSkullwizard = {
22 | mode = "party",
23 | },
24 | Necromancer_CreateShoggoth = {
25 | mode = "party"
26 | },
27 | Necromancer_CorpseTower = {
28 | mode = "party"
29 | },
30 |
31 | Sorcerer_Summoning = {
32 | mode = "party" -- できません
33 | },
34 | Sorcerer_SummonSalamion = {
35 | mode = "party",
36 | title = "サラミオン",
37 | talk = {
38 | data = "waganeko.txt",
39 | format = 'custom',
40 | freq = 5
41 | }
42 | },
43 | Sorcerer_SummonServant = {
44 | mode = "None",
45 | title = "ロシアンブルー"
46 | },
47 |
48 | Featherfoot_BonePointing = {
49 | mode = "hpbar",
50 | loc_frame = { x = 450, y = 80 },
51 | move = 0
52 | },
53 |
54 | Onmyoji_FireFoxShikigami = {
55 | mode = "hpbar",
56 | },
57 |
58 | Dievdirbys_CarveZemina = {
59 | mode = "hpbar",
60 | },
61 | Dievdirbys_CarveLaima = {
62 | mode = "hpbar"
63 | },
64 | Dievdirbys_CarveOwl = {
65 | mode = "hpbar"
66 | },
67 | Dievdirbys_CarveAustrasKoks = {
68 | mode = "hpbar"
69 | },
70 | Dievdirbys_CarveAusirine = {
71 | mode = "hpbar"
72 | },
73 |
74 | Druid_Carnivory = {
75 | mode = "None" -- オーナーを特定できないので表示できない
76 | },
77 | };
--------------------------------------------------------------------------------
/distance/distance.lua:
--------------------------------------------------------------------------------
1 | local _config = {};
2 |
3 | function UPDATE_DISTANCE(frame)
4 | local handle = frame:GetUserIValue("_AT_OFFSET_HANDLE"); -- Setting by FRAME_AUTO_POS_TO_OBJ
5 | --local distFromActor = imcMath.Vec3Dist(world.GetActor(handle):GetPos(), _config.actor:GetPos());
6 | local distFromActor = info.GetTargetInfo(handle).distance;
7 | if (distFromActor > 300) then
8 | frame:ShowWindow(0);
9 | return 0;
10 | end
11 | local textObject = frame:GetChild('disttext');
12 | local distRichText = tolua.cast(textObject, "ui::CRichText");
13 | --local text = '{#ff9900}{s16}{ol}' .. distFromActor;
14 | local text = '{#ff9900}{s16}{ol}' .. string.format("%0.2f m", distFromActor / 25);
15 | distRichText:SetText(text);
16 | return 1;
17 | end
18 |
19 | function UPDATE_DISTANCE_FRAME()
20 | local list, cnt = SelectObjectByFaction(_config.self, 700, 'Monster');
21 | for i = 1, cnt do
22 | local target = list[i];
23 | local targetHandle = GetHandle(target);
24 | --CHAT_SYSTEM(enemy:GetName() .. "/" .. distFromActor);
25 | local dFrame = ui.GetFrame("distance" .. targetHandle);
26 | if (dFrame == nil) then
27 | dFrame = ui.CreateNewFrame("distance", "distance"..targetHandle, 0);
28 | end
29 | dFrame:ShowWindow(1);
30 | --FRAME_AUTO_POS_TO_OBJ(dFrame, targetHandle, -dFrame:GetWidth() / 2, 30, 3, 1);
31 | FRAME_AUTO_POS_TO_OBJ(dFrame, targetHandle, -dFrame:GetWidth() / 2 - 13, 40, 3, 1);
32 | dFrame:RunUpdateScript("UPDATE_DISTANCE", 0, 0, 0, 1);
33 | end
34 | end
35 |
36 | function DISTANCE_ON_INIT(addon, frame)
37 | _config.actor = world.GetActor(session.GetMyHandle());
38 | _config.self = GetMyPCObject();
39 | addon:RegisterMsg('FPS_UPDATE', 'UPDATE_DISTANCE_FRAME');
40 | end
41 |
--------------------------------------------------------------------------------
/dice/addon_d.ipf/dice/dice.lua:
--------------------------------------------------------------------------------
1 | Dice = {};
2 |
3 | -- constructor.
4 | function Dice.new(self)
5 | -- initialize members.
6 | local members = {};
7 | members.min = 0;
8 | members.max = 999;
9 |
10 | -- throw dice.
11 | members.Throw = function(self)
12 | local server = GetServerNation();
13 | local name = GETMYFAMILYNAME();
14 | local dice = IMCRandom(self.min, self.max);
15 | if (server ~= "JP") then
16 | return string.format("Dice(%d-%d)!%s got %d on it!", self.min, self.max, name, dice);
17 | end
18 | return string.format("ダイス(%d-%d)!%sは、%dを出した!", self.min, self.max, name, dice);
19 | end
20 |
21 | members.ChangeRange = function(self, min, max)
22 | if (min == nil) then
23 | min = 0;
24 | end
25 | if (max == nil) then
26 | max = 999;
27 | end
28 | self.min = min;
29 | self.max = max;
30 | CHAT_SYSTEM(string.format("[dice] set dice range %d - %d", min, max));
31 | end
32 |
33 | -- destroy.
34 | members.Destroy = function(self)
35 | if (dice.UI_CHAT ~= nil) then
36 | UI_CHAT = dice.UI_CHAT;
37 | dice.UI_CHAT = nil
38 | end
39 | end
40 | return setmetatable(members, {__index = self});
41 | end
42 | -- set call.
43 | setmetatable(Dice, {__call = Dice.new});
44 |
45 | -- frame initialize.
46 | function DICE_ON_INIT(addon, frame)
47 | if (dice.UI_CHAT == nil) then
48 | dice.UI_CHAT = UI_CHAT;
49 | end
50 | UI_CHAT = function(msg)
51 | if (msg == "/random") then
52 | msg = dice:Throw();
53 | elseif (string.find(msg, "/random set", 1, true) == 1) then
54 | local min, max = string.match(msg, "^/random set (%d+) (%d+)$");
55 | dice:ChangeRange(min, max);
56 | end
57 | dice.UI_CHAT(msg);
58 | end
59 | end
60 |
61 | -- create instance.
62 | if (dice ~= nil) then
63 | dice:Destroy();
64 | end
65 | dice = Dice();
66 |
--------------------------------------------------------------------------------
/hpmonitor/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.1.3
4 |
5 | ### 動かなくなってたのを修正 その2
6 |
7 | ## v1.1.2
8 |
9 | ### 動かなくなってたのを修正
10 |
11 | ## v1.1.1
12 |
13 | ### コメント機能追加
14 |
15 | チャットで"/hpm comment on"または"/hpm comment off"で、コメント表示UIのON/OFFができます。
16 |
17 | settings.txtにおいても、"comment='on'"または"comment='off'"で表示状態をHPで切り替えられます。
18 | "comment='任意の文字列'"をHPに応じて表示できます。
19 |
20 | 改行( {nl} )、色付け( {#FF0000} )なども対応できます。
21 |
22 | ## v1.0.2
23 |
24 | ### 一時的なON/OFF機能の追加
25 |
26 | チャットで"/hpm on"または"/hpm off"で、通知のON/OFFができます。
27 | マップ切り替えなどが発生すると、初期状態(ON)に戻ります。
28 |
29 | ## v1.0.1
30 |
31 | ### テストプレイ結果反映
32 |
33 | ## v1.0.0
34 |
35 | ### テストプレイ版作成
36 |
37 | ### 何をするもの?
38 |
39 | ボスのHPを監視して、指定パーセント付近で音とチャットを流します。
40 | 特殊行動の対処等に使う想定です。
41 |
42 | それとは別に、常時モンスターのHPバーにパーセンテージ表示を追加します。
43 |
44 | ### どうすれば?
45 |
46 | ipfファイルをインストールします。
47 |
48 | addons/hpmonitor/settings.txtを用意します。
49 |
50 | #### 初期設定
51 |
52 | 下記テンプレートをコピペします。
53 | ```
54 | local s = {}
55 | ---
56 | s['boss_AmissDog'] = {
57 | [1] = { limit = 70, msg = '/p 70%です' },
58 | [2] = { limit = 50, msg = '/p 50%です' },
59 | }
60 | s['ID_boss_Rambandgad_red'] = {
61 | [1] = { limit = 80, msg = '/p 89', sound = 'button_click_stats_up', comment='on' },
62 | [2] = { limit = 79, msg = '/p 87%です' },
63 | [3] = { limit = 78, msg = '/p 86%です', comment='test{nl}test2{#FF0000}color?' },
64 | [4] = { limit = 77, msg = '/p 85%です', comment='off' },
65 | }
66 | ---
67 | return s
68 | ```
69 |
70 | #### 設定方法
71 |
72 | "--"で囲まれた部分が変更可能な範囲です。
73 |
74 | ##### 設定内容の説明
75 |
76 | s['boss_AmissDog'] = ...
77 |
78 | 監視対象のClassNameを設定します。
79 | ClassNameはtosjbase等で調べてください。
80 |
81 | [1] = { limit = 80, msg = '/p 89', sound = 'button_click_stats_up' },
82 |
83 | - limit
84 |
85 | アドオンが動作するHPのパーセンテージです。80なら81%~80%の範囲内で動作します。
86 |
87 | - msg
88 |
89 | アドオン動作時にチャットで発言する内容です。/p 始まりだとPTチャットとなります。
90 |
91 | - sound
92 |
93 | アドオン動作時に鳴らす効果音です。
94 |
95 | ### いつ動くの?
96 |
97 | - ターゲットのHPが変化した場合
98 |
99 | ### 注意事項
100 |
101 | なし
--------------------------------------------------------------------------------
/staminigauge/staminigauge.lua:
--------------------------------------------------------------------------------
1 | local _config = {};
2 |
3 | function STAMINIGAUGE_UPDATE(frame, msg, argStr, argNum)
4 | -- get stamina info.
5 | session.UpdateMaxStamina();
6 | local stat = info.GetStat(session.GetMyHandle());
7 | -- update.
8 | local baseFrame = ui.GetFrame("charbaseinfo1_my");
9 | local staGauge = GET_CHILD(baseFrame, "pcStaGauge", "ui::CGauge");
10 | -- msg == nil => for test call.
11 | if (staGauge == nil or msg == nil) then
12 | -- create stamina gauge.
13 | local staGaugeObject = baseFrame:CreateOrGetControl("gauge", "pcStaGauge", 0, 0, 104, 15);
14 | staGauge = tolua.cast(staGaugeObject, "ui::CGauge");
15 | staGauge:SetGravity(ui.CENTER_HORZ, ui.TOP);
16 | staGauge:SetMargin(0, 32, 0, 0);
17 | staGauge:SetSkinName("pcinfo_gauge_sta2");
18 | staGauge:ShowWindow(1);
19 | -- adjust hp/sp gauge.
20 | local hp = baseFrame:GetChild("pcHpGauge");
21 | local hpm = hp:GetMargin();
22 | hp:SetMargin(hpm.left, 17, hpm.right, hpm.bottom);
23 | local sp = baseFrame:GetChild("pcSpGauge");
24 | local spm = sp:GetMargin();
25 | sp:SetMargin(spm.left, 25, spm.right, spm.bottom);
26 | -- adjust left side image.
27 | local bgL = GET_CHILD(baseFrame, "pcinfo_bg_L", "ui::CPicture");
28 | bgL:SetEnableStretch(1);
29 | bgL:Resize(10, 26);
30 | local bgLm = bgL:GetMargin();
31 | bgL:SetMargin(-57, -42, bgLm.right, bgLm.bottom);
32 | -- adjust right side image.
33 | local bgR = GET_CHILD(baseFrame, "pcinfo_bg_R", "ui::CPicture");
34 | bgR:SetEnableStretch(1);
35 | bgR:Resize(10, 26);
36 | local bgRm = bgR:GetMargin();
37 | bgR:SetMargin(57, -42, bgRm.right, bgRm.bottom);
38 | -- adjust shield gauge.
39 | local shieldGauge = GET_CHILD(baseFrame, "pcShieldGauge", "ui::CGauge");
40 | shieldGauge:SetOffset(0, 0);
41 | -- shieldGauge:ShowWindow(0);
42 | end
43 | staGauge:SetPoint(stat.Stamina, stat.MaxStamina);
44 | end
45 |
46 | function STAMINIGAUGE_ON_INIT(addon, frame)
47 | -- regist stamina update event handler.
48 | addon:RegisterMsg('STA_UPDATE', 'STAMINIGAUGE_UPDATE');
49 | --STAMINIGAUGE_UPDATE(frame, "None", nil, nil);
50 | end
51 |
--------------------------------------------------------------------------------
/summonskilltooltip/summonskilltooltip.lua:
--------------------------------------------------------------------------------
1 | SummonSkillTooltip = {};
2 |
3 | -- constructor.
4 | function SummonSkillTooltip.new(self)
5 | -- initialize members.
6 | local members = {};
7 |
8 | members.SetTooltip = function(self, monName)
9 | local frame = ui.GetFrame("monsterquickslot");
10 | --CHAT_SYSTEM(monName);
11 | local monCls = GetClass("Monster", monName);
12 | local list = GetMonsterSkillList(monCls.ClassID);
13 | for i = 0, list:Count() - 1 do
14 | local sklName = list:Get(i);
15 | local sklCls = GetClass("Skill", sklName);
16 | if (sklCls == nil or sklCls.EngName ~= "plzInputEngName") then
17 | -- skip.
18 | else
19 | sklCls.Name = sklCls.ClassType.."-"..sklCls.AttackType;
20 | sklCls.EngName = sklCls.ClassName;
21 | sklCls.Caption = ClMsg("SkillPower").."="..sklCls.SklFactor.."%";
22 | sklCls.Caption2 = " ";
23 | local slot = GET_CHILD_RECURSIVELY(frame, "slot"..i+1, "ui::CSlot");
24 | tolua.cast(slot, "ui::CSlot");
25 | local icon = slot:GetIcon();
26 | icon:SetTooltipType('skill');
27 | icon:SetTooltipStrArg(sklCls.ClassName);
28 | icon:SetTooltipNumArg(sklCls.ClassID);
29 | --CHAT_SYSTEM(sklName.." - "..sklCls.ClassID)
30 | end
31 | end
32 | end
33 |
34 | -- destroy.
35 | members.Destroy = function(self)
36 | MONSTER_QUICKSLOT = sstp.MONSTER_QUICKSLOT;
37 | end
38 | return setmetatable(members, {__index = self});
39 | end
40 | -- set call.
41 | setmetatable(SummonSkillTooltip, {__call = SummonSkillTooltip.new});
42 |
43 | -- frame initialize.
44 | function SUMMONSKILLTOOLTIP_ON_INIT(addon, frame)
45 | if (sstp.MONSTER_QUICKSLOT == nil) then
46 | sstp.MONSTER_QUICKSLOT = MONSTER_QUICKSLOT;
47 | end
48 | MONSTER_QUICKSLOT = function(isOn, monName, buffType, ableToUseSkill)
49 | sstp.MONSTER_QUICKSLOT(isOn, monName, buffType, ableToUseSkill);
50 | if (isOn ~= 1) then
51 | return;
52 | end
53 | sstp:SetTooltip(monName);
54 | end
55 | end
56 |
57 | -- create instance.
58 | if (sstp ~= nil) then
59 | sstp:Destroy();
60 | end
61 | sstp = SummonSkillTooltip();
62 |
--------------------------------------------------------------------------------
/monsterstatus/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#monsterstatus](https://blog.weizlogy.com/pages/tos-addon/#monsterstatus)
2 |
3 | ## settings.
4 |
5 | Nexon\TreeofSaviorJP\addons\monsterstatus\location.txt を作成します。
6 |
7 | ## descriptions.
8 |
9 | ### v3.0.3
10 |
11 | #### ドロップアイテム表示制限対応
12 |
13 | 未鑑定アイテムは表示されないように修正しました。
14 |
15 | #### フレーム位置保存対応
16 |
17 | フレーム位置の保存/復元に対応しました。
18 |
19 | ### v3.0.2
20 |
21 | #### 冒険日誌改変対応
22 |
23 | [jtos] 冒険日誌改変に対応しました。
24 |
25 | ### v3.0.1
26 |
27 | #### 冒険日誌改変対応
28 |
29 | [itos] 冒険日誌改変に対応しました。
30 |
31 | ### v3.0.0
32 |
33 | #### ダメージ表示対応
34 |
35 | ステータスの代わりにダメージの期待値を表示します。
36 |
37 | ダメージの期待値表示は物理、クリティカル、魔法の三種類です。
38 | クリティカルの期待値には確率を表示します。
39 |
40 | #### 経験値表示追加
41 |
42 | キャラクター経験値とクラス経験値の表示を追加しました。
43 |
44 | #### フレーム背景透過対応
45 |
46 | フレームの透過率を上げて、表示を改善しました。
47 |
48 | ### v2.2.0
49 |
50 | #### 移動種別表示追加
51 |
52 | 移動種別の表示を追加し、飛行しているか分かるようにしました。
53 |
54 | #### 種族、属性表示追加
55 |
56 | 種族、属性の表示を追加しました。
57 |
58 |
59 | ### v2.1.3
60 |
61 | #### ドロップアイテム表示制限対応
62 |
63 | 未鑑定アイテムは表示されないように修正しました。
64 |
65 | #### フレーム位置保存対応
66 |
67 | フレーム位置の保存/復元に対応しました。
68 |
69 | ### v2.1.2
70 |
71 | #### 冒険日誌改変対応
72 |
73 | [jtos] 冒険日誌改変に対応しました。
74 |
75 | ### v2.1.1
76 |
77 | #### 冒険日誌改変対応
78 |
79 | [itos] 冒険日誌改変に対応しました。
80 |
81 | ### v2.1.0
82 |
83 | コンパクトなv2系のサポートを始めました。
84 |
85 | ### v2.0.0
86 |
87 | #### 討伐数、ドロップアイテム名、アイテム収集率表示追加
88 |
89 | 冒険日誌から討伐数、ドロップアイテム名、アイテム収集率を取得、
90 | 表示する機能を追加しました。
91 | また、ドロップアイテム名からアイテムツールチップが開けます。
92 |
93 | #### 表示ステータス 、フォーマット調整
94 |
95 | 表示するステータスは現在のところ以下の通りです。
96 |
97 | | 表示名 | 内容 |
98 | |:---|:---|
99 | |ATK|物理攻撃力(最大)
100 | |MATK|魔法攻撃力(最大)
101 | |DEF|物理防御力
102 | |MDEF|魔法防御力
103 |
104 | UIウィンドウをドラッグで移動できるようになりました。
105 |
106 | 設定はログイン中のみ有効です。
107 |
108 | ### v1.0.0
109 |
110 | #### 新規作成
111 |
112 | アドオンがロードされると、ターゲットしたモンスターのステータス(*1)が画面上部に表示されます。
113 |
114 | [*1] 表示するステータスは現在のところ以下の通りです。
115 |
116 | | 表示名 | 内容 |
117 | |:---|:---|
118 | |ATK|物理攻撃力(最大)
119 | |MATK|魔法攻撃力(最大)
120 | |DEF|物理防御力
121 | |MDEF|魔法防御力
122 | |DR|回避率
123 | |CDR|クリティカル回避率
124 | |CATK|クリティカル攻撃力
125 | |CDEF|クリティカル防御力
126 |
--------------------------------------------------------------------------------
/kaywadequeer/addon_d.ipf/kaywadequeer/kaywadequeer.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'kaywadequeer'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | members.CreateUI = function(self)
16 | local frame = ui.GetFrame(addonName)
17 | frame:ShowWindow(0)
18 | local base = ui.GetFrame('headsupdisplay')
19 | local exec = base:CreateOrGetControl('button', 'exec', 0, 0, 25, 25)
20 | exec:SetText('DE')
21 | exec:SetOffset(5, base:GetHeight() - 23)
22 |
23 | KAYWADEQUEER_ON_EXEC_LBU = function(parent, ctrl, str, num)
24 | debug.ReloadAddOnScp()
25 | debug.ReloadUIEvent()
26 |
27 | KAYWADEQUEER_HIDE_SWAP = function()
28 | local swap = ui.GetFrame('weaponswap_tempimage')
29 | if (swap ~= nil) then
30 | swap:ShowWindow(0)
31 | end
32 | end
33 | DebounceScript('KAYWADEQUEER_HIDE_SWAP', 1.0)
34 |
35 | KAYWADEQUEER_RECOVER_CHAT = function()
36 | -- chat.lua より
37 | UI_CHAT = function(msg)
38 | ui.Chat(msg);
39 | if g_uiChatHandler ~= nil then
40 | local func = _G[g_uiChatHandler];
41 | if func ~= nil then
42 | func(msg);
43 | end
44 | end
45 | end
46 | end
47 | DebounceScript('KAYWADEQUEER_RECOVER_CHAT', 1.0)
48 |
49 | end
50 | exec:SetEventScript(ui.LBUTTONUP, 'KAYWADEQUEER_ON_EXEC_LBU')
51 | end
52 |
53 | -- ログ出力
54 | members.Dbg = function(self, msg)
55 | -- CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
56 | end
57 | members.Log = function(self, msg)
58 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
59 | end
60 | members.Err = function(self, msg)
61 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
62 | end
63 |
64 | -- デストラクター
65 | members.Destroy = function(self)
66 | end
67 | -- おまじない
68 | return setmetatable(members, {__index = self});
69 | end
70 | -- .newなしでコンストラクターを呼ぶエイリアス登録
71 | setmetatable(g, {__call = g.new});
72 |
73 | -- 自フレーム初期化処理
74 | function KAYWADEQUEER_ON_INIT(addon, frame)
75 | g.instance:CreateUI()
76 | end
77 |
78 | -- インスタンス作成
79 | if (g.instance ~= nil) then
80 | g.instance:Destroy();
81 | end
82 | g.instance = g();
83 |
--------------------------------------------------------------------------------
/compactheadsupdisplay/addon_d.ipf/compactheadsupdisplay/compactheadsupdisplay.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'compactheadsupdisplay'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | -- initialize members.
14 | local members = {};
15 |
16 | members.HideGauge = function(self, frame)
17 | local stamina = GET_CHILD_RECURSIVELY(frame, 'sta1', 'ui::CGauge')
18 | stamina:Resize(0, 0)
19 | local hp = GET_CHILD_RECURSIVELY(frame, 'hp', 'ui::CGauge')
20 | hp:Resize(0, 0)
21 | local sp = GET_CHILD_RECURSIVELY(frame, 'sp', 'ui::CGauge')
22 | sp:Resize(0, 0)
23 | local myhpspleft = GET_CHILD_RECURSIVELY(frame, 'myhpspleft', 'ui::CGauge')
24 | myhpspleft:SetAlpha(0)
25 | local myhpspright = GET_CHILD_RECURSIVELY(frame, 'myhpspright', 'ui::CGauge')
26 | myhpspright:SetAlpha(0)
27 | local gaugelight1 = GET_CHILD_RECURSIVELY(frame, 'gaugelight1', 'ui::CGauge')
28 | gaugelight1:SetAlpha(0)
29 | local gaugelight2 = GET_CHILD_RECURSIVELY(frame, 'gaugelight2', 'ui::CGauge')
30 | gaugelight2:SetAlpha(0)
31 | frame:Resize(100, frame:GetHeight())
32 | end
33 |
34 | -- ログ出力
35 | members.Dbg = function(self, msg)
36 | CHAT_SYSTEM(string.format('{#666666}[%s] %s', addonName, msg))
37 | end
38 | members.Log = function(self, msg)
39 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
40 | end
41 | members.Err = function(self, msg)
42 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
43 | end
44 |
45 | -- destroy.
46 | members.Destroy = function(self)
47 | HEADSUPDISPLAY_ON_MSG = g.instance.HEADSUPDISPLAY_ON_MSG;
48 | g.instance.HEADSUPDISPLAY_ON_MSG = nil;
49 | end
50 | -- おまじない
51 | return setmetatable(members, {__index = self});
52 | end
53 | -- .newなしでコンストラクターを呼ぶエイリアス登録
54 | setmetatable(g, {__call = g.new});
55 |
56 | -- frame initialize.
57 | function COMPACTHEADSUPDISPLAY_ON_INIT(addon, frame)
58 | if (g.instance.HEADSUPDISPLAY_ON_MSG == nil) then
59 | g.instance.HEADSUPDISPLAY_ON_MSG = HEADSUPDISPLAY_ON_MSG;
60 | end
61 | HEADSUPDISPLAY_ON_MSG = function(frame, msg, argStr, argNum)
62 | g.instance.HEADSUPDISPLAY_ON_MSG(frame, msg, argStr, argNum);
63 | g.instance:HideGauge(frame);
64 | end
65 | end
66 |
67 | -- インスタンス作成
68 | if (g.instance ~= nil) then
69 | g.instance:Destroy();
70 | end
71 | g.instance = g();
72 |
--------------------------------------------------------------------------------
/costumeplay/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#costumeplay](https://blog.weizlogy.com/pages/tos-addon/#costumeplay)
2 |
3 | # Release Note.
4 |
5 | ### v1.1.2
6 |
7 | #### 動かなかったのを修正!
8 |
9 | ### v1.1.1
10 |
11 | #### 同一名称ブレスレットが正常に装備できない問題の修正
12 |
13 | #### 装備名クリック時の動作修正
14 |
15 | 旧:一時的に復元状態を変更
16 |
17 | 新:永続的に復元状態を変更
18 |
19 | ### v1.1.0
20 |
21 | #### ヘアカラー、称号追加
22 |
23 | 本バージョン以降に作成したデータは、ヘアカラーと称号を保存/復元できるようになります。
24 |
25 | #### フレーム表示方法修正
26 |
27 | インベントリを開くと追従して開かなくなりました。
28 | 閉じる場合は依然としてインベントリに追従します。
29 |
30 | 代わりに、インベントリアイコン右クリックメニューに[Open]が追加され、そこから開けます。
31 | アドオンフレームが表示されるとインベントリが追従して開きます。
32 |
33 | ## settings.
34 |
35 | Nexon\TreeofSaviorJP\addons\costumeplay フォルダーを作成します。
36 |
37 | ## descriptions.
38 |
39 | costumeplayフォルダーには下記ファイルが自動的に生成され、
40 | キャラクター毎にアドオンで使用する情報をログアウト後も保持するために使用します。
41 |
42 | - [cid]
43 |
44 | ### v1.1.1
45 |
46 | #### 同一名称ブレスレットが正常に装備できない問題の修正
47 |
48 | #### 装備名クリック時の動作修正
49 |
50 | 旧:一時的に復元状態を変更
51 |
52 | 新:永続的に復元状態を変更
53 |
54 | ### v1.1.0
55 |
56 | #### ヘアカラー、称号追加
57 |
58 | 本バージョン以降に作成したデータは、ヘアカラーと称号を保存/復元できるようになります。
59 |
60 | #### フレーム表示方法修正
61 |
62 | インベントリを開くと追従して開かなくなりました。
63 | 閉じる場合は依然としてインベントリに追従します。
64 |
65 | 代わりに、インベントリアイコン右クリックメニューに[Open]が追加され、そこから開けます。
66 | アドオンフレームが表示されるとインベントリが追従して開きます。
67 |
68 | ### v1.0.0
69 |
70 | #### 新規作成
71 |
72 | GUI操作で装備を保存/復元します。
73 |
74 | ## usage.
75 |
76 | ### 保存方法
77 |
78 | - インベントリの左側にアドオンのフレームが表示されます。
79 | - 名前を入力して[save]を押すと現在の装備を保存します。
80 |
81 | ### 復元方法
82 |
83 | - 画面右下のインベントリアイコンを右クリックするとメニューが出現します。
84 | - メニューには保存時に入力した名前がリストアップされるので任意のものを選択します。
85 |
86 | ### その他
87 |
88 | - 見た目に影響しない防具やリングなどは初期状態で復元しない状態です。(装備名が灰色)
89 | - アドオンフレームの装備名をクリックすると、永続的に復元状態を変更します。
90 |
91 | GUI操作で装備を保存/復元します。
92 |
93 | ### 何をするもの?
94 |
95 | GUI操作で装備を保存/復元します。
96 |
97 | ### 使い方
98 |
99 | 事前に addons\costumeplay フォルダを作成しておきます。(マネージャー経由なら自動生成されます。
100 |
101 | #### 装備保存方法
102 |
103 | インベントリアイコン右クリックメニュー > Open で、インベントリとその左側にアドオンのフレームが表示されます。
104 |
105 | 名前を入力して[save]ボタンを押すと現在の装備を保存します。
106 |
107 | #### 装備復元方法
108 |
109 | 画面右下のインベントリアイコンを右クリックするとメニューが出現します。
110 |
111 | メニューには保存時に入力した名前がリストアップされるので任意のものを選択します。
112 |
113 | ### どうすれば?
114 |
115 | ipfファイルをインストールして、addonsフォルダに同名フォルダを用意します。
116 |
117 | costumeplayフォルダーはキャラクター毎にアドオンで使用する情報をログアウト後も保持するために使用します。
118 |
119 | ### いつ動くの?
120 |
121 | - インベントリの開閉時
122 |
123 | ### 注意事項
124 |
125 | 見た目に影響しない装備は初期状態で復元しない状態です。(アドオンGUI上で装備名が灰色)
126 |
127 | 灰色になっている装備名をクリックすると、復元対象に加えたり外したりできます。
128 |
129 | ただし、装備処理がインベントリのインデックスを参照するので適切な間隔で順次処理する必要があり、
130 | 装備更新処理中は画面が固まります。(現在の装備項目数では4秒弱)
131 |
--------------------------------------------------------------------------------
/warehousesorter/warehousesorter.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'warehousesorter'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | -- ソートボタン挿入
16 | members.InjectSortButton = function(self, frame)
17 | DESTROY_CHILD_BYNAME(frame, 'WAREHOUSESORTER_')
18 | local sortButton = frame:CreateOrGetControl('button', 'WAREHOUSESORTER_SORT', 0, 0, 45, 45)
19 | tolua.cast(sortButton, "ui::CButton")
20 | sortButton:SetImage('inven_piece_btn')
21 | sortButton:SetTextTooltip('{@st59}インベントリを整理する{/}')
22 | sortButton:SetClickSound('button_click_big')
23 | sortButton:SetAnimation("MouseOnAnim", "btn_mouseover")
24 | sortButton:SetAnimation("MouseOffAnim", "btn_mouseoff")
25 | sortButton:SetEventScript(ui.LBUTTONUP, "WAREHOUSESORTER_SELECT_SORT_TYPE")
26 | sortButton:SetGravity(ui.RIGHT, ui.TOP)
27 | sortButton:SetMargin(0, 110, 160, 0)
28 | end
29 |
30 | -- デストラクター
31 | members.Destroy = function(self)
32 | if (self.WAREHOUSE_OPEN ~= nil) then
33 | WAREHOUSE_OPEN = self.WAREHOUSE_OPEN
34 | end
35 | end
36 | -- おまじない
37 | return setmetatable(members, {__index = self});
38 | end
39 | -- .newなしでコンストラクターを呼ぶエイリアス登録
40 | setmetatable(g, {__call = g.new});
41 |
42 | -- 自フレーム初期化処理
43 | function WAREHOUSESORTER_ON_INIT(addon, frame)
44 | -- 個人倉庫を開いたときにソートボタンを挿入する
45 | if (g.instance.WAREHOUSE_OPEN == nil) then
46 | g.instance.WAREHOUSE_OPEN = WAREHOUSE_OPEN
47 | end
48 | WAREHOUSE_OPEN = function(frame)
49 | g.instance:InjectSortButton(frame)
50 | g.instance.WAREHOUSE_OPEN(frame)
51 | end
52 | end
53 |
54 | -- ソートメニュー生成
55 | -- inventory.lua SORT_ITEM_INVENTORY() をベースに REQ_INV_SORT() に渡すパラメータを変更
56 | function WAREHOUSESORTER_SELECT_SORT_TYPE()
57 | local context = ui.CreateContextMenu("WAREHOUSESORTER_CONTEXT_INV_SORT", "", 0, 0, 170, 100);
58 | local scpScp = "";
59 | scpScp = string.format("REQ_INV_SORT(%d, %d)",IT_WAREHOUSE, BY_LEVEL);
60 | ui.AddContextMenuItem(context, ScpArgMsg("SortByLevel"), scpScp);
61 | scpScp = string.format("REQ_INV_SORT(%d, %d)",IT_WAREHOUSE, BY_WEIGHT);
62 | ui.AddContextMenuItem(context, ScpArgMsg("SortByWeight"), scpScp);
63 | scpScp = string.format("REQ_INV_SORT(%d, %d)",IT_WAREHOUSE, BY_NAME);
64 | ui.AddContextMenuItem(context, ScpArgMsg("SortByName"), scpScp);
65 | ui.OpenContextMenu(context);
66 | end
67 |
68 | -- インスタンス作成
69 | if (g.instance ~= nil) then
70 | g.instance:Destroy();
71 | end
72 | g.instance = g();
73 |
--------------------------------------------------------------------------------
/previewguildemblem/previewguildemblem.lua:
--------------------------------------------------------------------------------
1 | PreviewGuildEmblem = {};
2 |
3 | -- constructor.
4 | function PreviewGuildEmblem.new(self)
5 | -- initialize members.
6 | local members = {};
7 |
8 | -- destroy.
9 | members.Destroy = function(self)
10 | GUILDINFO_OPTION_INIT_EMBLEM = self.GUILDINFO_OPTION_INIT_EMBLEM;
11 | self.GUILDINFO_OPTION_INIT_EMBLEM = nil;
12 | GUILDEMBLEM_CHANGE_INIT = self.GUILDEMBLEM_CHANGE_INIT;
13 | self.GUILDEMBLEM_CHANGE_INIT = nil;
14 | SET_PRIVIEW_ITEM = self.SET_PRIVIEW_ITEM;
15 | self.SET_PRIVIEW_ITEM = nil;
16 | end
17 | return setmetatable(members, {__index = self});
18 | end
19 | -- set call.
20 | setmetatable(PreviewGuildEmblem, {__call = PreviewGuildEmblem.new});
21 |
22 | -- frame initialize.
23 | function PREVIEWGUILDEMBLEM_ON_INIT(addon, frame)
24 | if (pgem.GUILDINFO_OPTION_INIT_EMBLEM == nil) then
25 | pgem.GUILDINFO_OPTION_INIT_EMBLEM = GUILDINFO_OPTION_INIT_EMBLEM;
26 | end
27 | if (pgem.AM_I_LEADER == nil) then
28 | pgem.AM_I_LEADER = AM_I_LEADER;
29 | end
30 | GUILDINFO_OPTION_INIT_EMBLEM = function(optionBox)
31 | AM_I_LEADER = function(mode)
32 | return 1;
33 | end
34 | pgem.GUILDINFO_OPTION_INIT_EMBLEM(optionBox);
35 | AM_I_LEADER = pgem.AM_I_LEADER;
36 | end
37 |
38 | if (pgem.GUILDEMBLEM_CHANGE_INIT == nil) then
39 | pgem.GUILDEMBLEM_CHANGE_INIT = GUILDEMBLEM_CHANGE_INIT;
40 | end
41 | GUILDEMBLEM_CHANGE_INIT = function(frame)
42 | pgem.GUILDEMBLEM_CHANGE_INIT(frame);
43 | local frame = ui.GetFrame('guildemblem_change')
44 | if frame ~= nil and AM_I_LEADER(PARTY_GUILD) == 0 then
45 | local acceptBtn = GET_CHILD_RECURSIVELY(frame, 'acceptBtn');
46 | acceptBtn:ShowWindow(0);
47 | end
48 | end
49 |
50 | if (pgem.SET_PRIVIEW_ITEM == nil) then
51 | pgem.SET_PRIVIEW_ITEM = SET_PRIVIEW_ITEM;
52 | end
53 | SET_PRIVIEW_ITEM = function(frame, ctrlSet, fileName, posY)
54 | local gb_items = GET_CHILD(ctrlSet, "gb_items", "ui::CGroupBox");
55 | local pic_icon = GET_CHILD(gb_items, "preview_icon", "ui::CPicture");
56 | local pic_icon_edge = GET_CHILD(gb_items, "preview_icon_edge", "ui::CPicture");
57 |
58 | local my = ui.GetFrame("charbaseinfo1_my");
59 | local my_pic_icon = GET_CHILD(my, "guildEmblem", "ui::CPicture");
60 | local my_pic_icon_edge = GET_CHILD(my, "guildEmblem_edge", "ui::CPicture");
61 |
62 | pic_icon:Resize(my_pic_icon:GetWidth(), my_pic_icon:GetHeight());
63 | pic_icon_edge:Resize(my_pic_icon_edge:GetWidth(), my_pic_icon_edge:GetHeight());
64 |
65 | return pgem.SET_PRIVIEW_ITEM(frame, ctrlSet, fileName, posY);
66 | end
67 |
68 | end
69 |
70 | -- create instance.
71 | if (pgem ~= nil) then
72 | pgem:Destroy();
73 | end
74 | pgem = PreviewGuildEmblem();
75 |
--------------------------------------------------------------------------------
/partyinfoex/addon_d.ipf/partyinfoex/partyinfoex.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'partyinfoex'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {}
14 |
15 | members.nameY = 0
16 | members.lvboxY = 0
17 |
18 | -- SPゲージを見える化
19 | -- 4/17VUで必要なくなったけど...
20 | -- members.AddSpGauge = function(self, partyInfoCtrlSet)
21 | -- local spGauge = GET_CHILD(partyInfoCtrlSet, "sp", "ui::CGauge");
22 | -- spGauge:SetMargin(79,47,0,0)
23 | -- spGauge:SetSkinName('pcinfo_gauge_sp')
24 | -- end
25 |
26 | -- 所在地を見える化
27 | members.AddLocation = function(self, partyInfoCtrlSet, partyMemberInfo)
28 | local mapCls = GetClassByType("Map", partyMemberInfo:GetMapID())
29 | if mapCls == nil then
30 | return
31 | end
32 | local location = partyInfoCtrlSet:CreateOrGetControl('richtext', "partyinfoex_location", 0, 0, 0, 0)
33 | location:SetText(string.format("{s12}{ol}[%s-%d]", mapCls.Name, partyMemberInfo:GetChannel() + 1))
34 | location:Resize(100, 20)
35 | location:SetOffset(10, 0)
36 | location:ShowWindow(1)
37 |
38 | -- レベルと名前をちょっと下げないと被ってしまう
39 | local nameObj = partyInfoCtrlSet:GetChild('name_text')
40 | if (self.nameY == 0) then
41 | self.nameY = nameObj:GetY()
42 | end
43 | nameObj:SetOffset(nameObj:GetX(), self.nameY + 2)
44 |
45 | local lvbox = partyInfoCtrlSet:GetChild('lvbox')
46 | if (self.lvboxY == 0) then
47 | self.lvboxY = lvbox:GetY()
48 | end
49 | lvbox:SetOffset(lvbox:GetX(), self.lvboxY + 2)
50 | end
51 |
52 | -- デストラクター
53 | members.Destroy = function(self)
54 | if (g.instance.UPDATE_PARTYINFO_HP ~= nil) then
55 | UPDATE_PARTYINFO_HP = g.instance.UPDATE_PARTYINFO_HP
56 | end
57 | end
58 | -- おまじない
59 | return setmetatable(members, {__index = self})
60 | end
61 | -- .newなしでコンストラクターを呼ぶエイリアス登録
62 | setmetatable(g, {__call = g.new});
63 |
64 | -- 自フレーム初期化処理
65 | function PARTYINFOEX_ON_INIT(addon, frame)
66 | -- 関数退避
67 | if (g.instance.UPDATE_PARTYINFO_HP == nil) then
68 | g.instance.UPDATE_PARTYINFO_HP = UPDATE_PARTYINFO_HP
69 | end
70 | -- PT情報更新関数をフックして...
71 | UPDATE_PARTYINFO_HP = function(partyInfoCtrlSet, partyMemberInfo)
72 | g.instance.UPDATE_PARTYINFO_HP(partyInfoCtrlSet, partyMemberInfo)
73 | -- g.instance:AddSpGauge(partyInfoCtrlSet)
74 | if partyMemberInfo:GetMapID() > 0 then
75 | g.instance:AddLocation(partyInfoCtrlSet, partyMemberInfo)
76 | end
77 | end
78 | end
79 |
80 | -- インスタンス作成
81 | if (g.instance ~= nil) then
82 | g.instance:Destroy()
83 | end
84 | g.instance = g()
85 |
--------------------------------------------------------------------------------
/subquickslot/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v2.0.0
4 |
5 | - 共通スロット対応
6 | - 非表示対応
7 |
8 | ## v1.5.5
9 |
10 | - 絵文字アカウント共通化対応 v2
11 |
12 | ## v1.5.4
13 |
14 | - モーション絵文字を右クリックしたときにモーションしない問題を修正
15 |
16 | ## v1.5.3
17 |
18 | - 絵文字アカウント共通化対応
19 |
20 | ## v1.5.2
21 |
22 | - 絵文字連携に関連する不具合の修正
23 |
24 | ## v1.5.1
25 |
26 | - 絵文字連携用UIの実装
27 |
28 | ## v1.5.0
29 |
30 | ### 修正内容
31 |
32 | - 絵文字連携機能追加(下記参照)
33 |
34 | ### 何をするもの?
35 |
36 | 任意のサイズのクイックスロットを任意の数だけ追加し、アイテムやスキル、ジェスチャーを登録できます。
37 |
38 | ### 使い方
39 |
40 | ### メニュー表示
41 |
42 | フレーム(周りの枠らへん)を右クリック
43 |
44 | - Option
45 |
46 | オプション設定画面を開きます
47 |
48 | - CreateNew(最初に表示されるスロットのみ)
49 |
50 | 新しいスロットを追加できます
51 |
52 | - Redraw
53 |
54 | 全スロットを再描画します
55 |
56 | - CommonConfig
57 |
58 | 共通設定メニューを表示します
59 |
60 | - Delete(追加スロットのみ)
61 |
62 | 該当スロットを削除します
63 |
64 | - Hide(追加スロットのみ)
65 |
66 | 該当スロットを非表示にします
67 |
68 | - ShowAll(最初に表示されるスロットのみ)
69 |
70 | 非表示にしたスロットを表示状態にします
71 |
72 | - EmoticonList
73 |
74 | 絵文字連携用UIを表示します
75 |
76 | #### 共通設定メニュー
77 |
78 | - Mark as a Common
79 |
80 | 今操作中のキャラクターのスロットを共通としてマークします
81 |
82 | マーク後は Menu > Redraw することで表示できます(自動表示がうまくいかなくて...
83 |
84 | 共通になったスロットは上部に「★」がつきます
85 |
86 | - Unmark from Common
87 |
88 | 共通としてマークしているスロットを解除し、今操作中のキャラクター用にします
89 |
90 | マーク解除後は Menu > Redraw することで表示できます(自動表示がうまくいかなくて...
91 |
92 | ### スロット操作
93 |
94 | - スロットをLALT+左クリック
95 |
96 | スロットを削除できます
97 |
98 | - スロットを右クリック
99 |
100 | スロットにセットしたものを使えます
101 |
102 | ### オプション設定
103 |
104 | - VxH
105 |
106 | 縦x横のフォーマットでスロットサイズを変更できます
107 |
108 | - Alpha
109 |
110 | 入力欄が2つあります。どちらも10 - 100の間で入力します
111 |
112 | 左:背景の不透明度
113 |
114 | 右:スロットの不透明度
115 |
116 | - Magni
117 |
118 | スロットの表示倍率(%表記)を変更できます。50 - 100の間で入力します
119 |
120 | 縦横比を表示倍率掛けするので、71%でほぼ半分の面積、50%で1/4の大きさとなります
121 |
122 | - Lock
123 |
124 | チェックを入れるとスロットがロックされ、スロットの右クリック以外の操作はできなくなります
125 |
126 | - Notify ClassID
127 |
128 | チェックを入れるとスロットセット時に名称とクラスIDをシステムチャットに表示します
129 |
130 | - Direct Warp
131 |
132 | チェックを入れるとワープ時に確認が出ません
133 |
134 | ### savequestアドオン連携機能
135 |
136 | savequestアドオンでワープスロットを生成 > D&Dでスロットに入れることができます。(以下ワープアイコン)
137 |
138 | ワープアイコンは右クリックで実行せずメニュー表示します。(誤操作防止の為)
139 |
140 | ### 絵文字連携機能
141 |
142 | チャット用絵文字アイコンを格納できます。
143 |
144 | 右クリックメニュー -> EmoticonList で、絵文字連携用UIを表示します。追加したい絵文字をD&Dでスロットに格納できます。
145 |
146 | - これはsubquickslotのスロットのみで、既存のquickslotには入りません
147 | - チャット入力欄の絵文字一覧からはD&Dできません(どうして...
148 |
149 | 格納した絵文字は右クリックでチャット入力欄に追加されます。(即時発言ではありません
150 |
151 | #### ワープアイコンメニュー
152 |
153 | - Warp
154 |
155 | クエワープを実行します。
156 |
157 | - Share
158 |
159 | クエストをPT共有します。正常に共有できればシステムログが表示されます。
160 |
161 | ### どうすれば?
162 |
163 | ipfファイルをインストールして、addonsフォルダに同名フォルダを用意します。
164 |
165 | ### いつ動くの?
166 |
167 | - アイテム増減
168 | - スキル使用
169 | - 特性ON/OFF
170 |
171 | ### 注意事項
172 |
--------------------------------------------------------------------------------
/showbuffsellertype/showbuffsellertype.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'showbuffsellertype'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | -- バフ屋の名前を決める
16 | members.ToSellTypeName = function(self, sellType, skillID)
17 | local sellerTypeName = 'None'
18 | if AUTO_SELL_BUFF == sellType then
19 | sellerTypeName = 'バフ'
20 | elseif sellType == AUTO_SELL_GEM_ROASTING then
21 | sellerTypeName = 'ジェムロースト'
22 | elseif sellType == AUTO_SELL_SQUIRE_BUFF then
23 | local skillName = GetClassByType("Skill", skillID).ClassName
24 | if "Squire_EquipmentTouchUp" == skillName then
25 | sellerTypeName = '装備メンテ'
26 | elseif "Squire_Repair" == skillName then
27 | sellerTypeName = '修理'
28 | end
29 | elseif sellType == AUTO_SELL_OBLATION then
30 | sellerTypeName = '寄付'
31 | elseif sellType == AUTO_SELL_ORACLE_SWITCHGENDER then
32 | sellerTypeName = '性転換'
33 | elseif sellType == AUTO_SELL_ENCHANTERARMOR then
34 | sellerTypeName = 'エンチャント'
35 | elseif sellType == AUTO_SELL_APPRAISE then
36 | sellerTypeName = '鑑定'
37 | elseif sellType == AUTO_SELL_PORTAL then
38 | sellerTypeName = 'ポータル'
39 | elseif sellType == AUTO_SELL_AWAKENING then
40 | sellerTypeName = '覚醒'
41 | end
42 | return sellerTypeName
43 | end
44 |
45 | -- バフ屋バルーンフレームに名前を挿入する
46 | members.Inject = function(self, sellerTypeName, handle)
47 | -- フレーム取得
48 | local frame = ui.GetFrame('SELL_BALLOON_'..handle)
49 | if (frame == nil) then
50 | return
51 | end
52 | local typeName = frame:CreateOrGetControl('richtext', 'typeName', 0, 0, frame:GetWidth(), 50)
53 | tolua.cast(typeName, "ui::CRichText")
54 | typeName:SetText('{ol}{s16}'..sellerTypeName)
55 | end
56 |
57 | -- デストラクター
58 | members.Destroy = function(self)
59 | AUTOSELLER_BALLOON = g.instance.AUTOSELLER_BALLOON
60 | end
61 | -- おまじない
62 | return setmetatable(members, {__index = self});
63 | end
64 | -- .newなしでコンストラクターを呼ぶエイリアス登録
65 | setmetatable(g, {__call = g.new});
66 |
67 | -- 自フレーム初期化処理
68 | function SHOWBUFFSELLERTYPE_ON_INIT(addon, frame)
69 | -- バフ屋バルーンフレーム処理をフックする from buffseller_balloon.lua
70 | if (g.instance.AUTOSELLER_BALLOON == nil) then
71 | g.instance.AUTOSELLER_BALLOON = AUTOSELLER_BALLOON
72 | end
73 | AUTOSELLER_BALLOON = function(title, sellType, handle, skillID, skillLv)
74 | g.instance.AUTOSELLER_BALLOON(title, sellType, handle, skillID, skillLv)
75 | -- 名称に変換してー
76 | local sellerTypeName = g.instance:ToSellTypeName(sellType, skillID)
77 | -- インジェクト!
78 | g.instance:Inject(sellerTypeName, handle)
79 | end
80 | end
81 |
82 | -- インスタンス作成
83 | if (g.instance ~= nil) then
84 | g.instance:Destroy();
85 | end
86 | g.instance = g();
87 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter_talk.lua:
--------------------------------------------------------------------------------
1 | -- トークモード
2 | -- 召喚物を喋らせる
3 |
4 | ModeTalk = {}
5 |
6 | -- コンストラクター
7 | function ModeTalk.new(self)
8 | local contents = {}
9 |
10 | local members = {}
11 |
12 | members.Handles = {}
13 |
14 | -- モード処理を実行する
15 | members.Execute = function(self, addonDir, config)
16 | -- 生死判定
17 | if (#self.Handles == 0) then
18 | return
19 | end
20 | -- シード再設定(意味があるのか?)
21 | math.randomseed(os.time())
22 | -- 実行確率判定
23 | if (IMCRandom(1, 100) >= tonumber(config.freq)) then
24 | return
25 | end
26 | -- データロード
27 | if (#contents == 0) then
28 | local f, e = io.open(string.format('%s/%s', addonDir, config.data), 'r')
29 | if (e) then
30 | CHAT_SYSTEM(tostring(e))
31 | return
32 | end
33 | for line in f:lines() do
34 | contents[#contents + 1] = line
35 | end
36 | f:close()
37 | end
38 | -- 選択
39 | local talktext = ''
40 | math.randomseed(os.time() + 1)
41 | if (config.format == 'dicid') then
42 | talktext = self:CreateTalkWithDICID()
43 | elseif (config.format == 'custom') then
44 | -- なぜか乱数生成するとものすごいループ回数になるのでもう一回制限をかける。なぜ...
45 | math.randomseed(os.time() + 2)
46 | if (IMCRandom(1, 100) >= tonumber(config.freq)) then
47 | return
48 | end
49 | talktext = self:CreateTalkWithCustom()
50 | end
51 |
52 | if (talktext == '') then
53 | return
54 | end
55 | math.randomseed(os.time() + 3)
56 | world.GetActor(self.Handles[IMCRandom(1, #self.Handles)]):GetTitle():Say(talktext, 3.0)
57 | end
58 |
59 | members.CreateTalkWithDICID = function(self)
60 | local dicidprefix = contents[IMCRandom(1, #contents)]
61 | local dictype = string.gsub(dicidprefix, '%_%d+', '')
62 | local sequence = 0
63 | if (dictype == 'QUEST') then
64 | sequence = IMCRandom(1, 10541)
65 | elseif (dictype == 'QUEST_JOBSTEP') then
66 | sequence = IMCRandom(1, 3140)
67 | elseif (dictype == 'QUEST_LV_0100') then
68 | sequence = IMCRandom(1, 17236)
69 | elseif (dictype == 'QUEST_LV_0200') then
70 | sequence = IMCRandom(1, 11370)
71 | elseif (dictype == 'QUEST_LV_0300') then
72 | sequence = IMCRandom(1, 8482)
73 | elseif (dictype == 'QUEST_LV_0400') then
74 | sequence = IMCRandom(1, 4687)
75 | elseif (dictype == 'QUEST_UNUSED') then
76 | sequence = IMCRandom(1, 3216)
77 | end
78 | if (sequence == 0) then
79 | return ''
80 | end
81 | local dicid = string.format('@dicID_^*$%s_%06d$*^', dicidprefix, sequence)
82 | if (string.find(dictionary.ReplaceDicIDInCompStr(dicid), '%$NoData%$') ~= nil) then
83 | return ''
84 | end
85 | return dicid
86 | end
87 |
88 | members.CreateTalkWithCustom = function(self)
89 | return contents[IMCRandom(1, #contents)]
90 | end
91 |
92 | -- おまじない
93 | return setmetatable(members, {__index = self})
94 | end
95 | setmetatable(ModeTalk, {__call = ModeTalk.new})
96 |
97 | function SUMMONCOUNTER_TALK_ON_INIT(addon, frame) end
98 |
--------------------------------------------------------------------------------
/hidename/addon_d.ipf/hidename/hidename.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'fixlostchatwindow'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | -- hide name.
16 | members.Hide = function(self)
17 | self.Dbg('Hide called.');
18 | -- invisible name at head.
19 | local headsup = ui.GetFrame("headsupdisplay");
20 | local headsupName = GET_CHILD(headsup, "name_text", "ui::CRichText");
21 | headsupName:SetText("");
22 | headsupName:SetAlpha(1);
23 | -- invisible name below a character.
24 | local my = ui.GetFrame("charbaseinfo1_my");
25 | local givenName = GET_CHILD(my, "givenName", "ui::CRichText");
26 | givenName:SetAlpha(1);
27 | local familyName = GET_CHILD(my, "familyName", "ui::CRichText");
28 | familyName:SetAlpha(1);
29 | local name = GET_CHILD(my, "name", "ui::CRichText");
30 | name:SetAlpha(1);
31 | -- invisible guild name below a character.
32 | local guildName = GET_CHILD(my, "guildName", "ui::CRichText");
33 | guildName:SetAlpha(1);
34 | local guildEmblemEdge = GET_CHILD(my, "guildEmblem_edge", "ui::CPicture");
35 | guildEmblemEdge:SetAlpha(1)
36 | local guildEmblem = GET_CHILD(my, "guildEmblem", "ui::CPicture");
37 | guildEmblem:SetAlpha(1)
38 | end
39 |
40 | --* ログ出力
41 | members.Dbg = function(self, msg)
42 | -- CHAT_SYSTEM(string.format('{#666666}[%s] %s', addonName, msg))
43 | end
44 | members.Log = function(self, msg)
45 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
46 | end
47 | members.Err = function(self, msg)
48 | CHAT_SYSTEM(string.format('{#FF0000}[%s] %s', addonName, msg))
49 | end
50 |
51 | -- destroy.
52 | members.Destroy = function(self)
53 | HEADSUPDISPLAY_ON_MSG = g.instance.HEADSUPDISPLAY_ON_MSG;
54 | g.instance.HEADSUPDISPLAY_ON_MSG = nil;
55 | end
56 | return setmetatable(members, {__index = self});
57 | end
58 | -- .newなしでコンストラクターを呼ぶエイリアス登録
59 | setmetatable(g, {__call = g.new});
60 |
61 | -- frame initialize.
62 | function HIDENAME_ON_INIT(addon, frame)
63 | if (g.instance.HEADSUPDISPLAY_ON_MSG == nil) then
64 | g.instance.HEADSUPDISPLAY_ON_MSG = HEADSUPDISPLAY_ON_MSG;
65 | end
66 | HEADSUPDISPLAY_ON_MSG = function(frame, msg, argStr, argNum)
67 | g.instance.HEADSUPDISPLAY_ON_MSG(frame, msg, argStr, argNum);
68 | g.instance:Hide();
69 | end
70 | -- addon:RegisterMsg("GAME_START_3SEC", "HIDENAME_GAME_START_3SEC");
71 | end
72 |
73 | function HIDENAME_GAME_START_3SEC(frame)
74 | local my = ui.GetFrame("charbaseinfo1_my");
75 | my:SetOpenScript("HIDENAME_CHARBASEINFO1_MY_OPEN");
76 | g.instance:Hide();
77 | end
78 |
79 | -- charbaseinfo1_my open script.
80 | function HIDENAME_CHARBASEINFO1_MY_OPEN()
81 | g.instance:Hide();
82 | end
83 |
84 | -- インスタンス作成
85 | if (g.instance ~= nil) then
86 | g.instance:Destroy();
87 | end
88 | g.instance = g();
89 |
--------------------------------------------------------------------------------
/repeaterypuzzlecraft/addon_d.ipf/repeaterypuzzlecraft/repeaterypuzzlecraft.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'repeaterypuzzlecraft'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- 個別フレームのコンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | -- === 公開定数 === --
16 |
17 | -- === 定数 === --
18 | local __ADDON_DIR = '../addons/'..addonName
19 |
20 | -- === 内部データ === --
21 | local __recipe = {}
22 |
23 | -- === 内部関数 === --
24 |
25 | -- === 公開データ === --
26 | members.RepeatCount = 0
27 |
28 | -- === 公開関数 === --
29 | members.SaveRecipe = function(self)
30 | end
31 |
32 | members.ShowRemainCount = function(self)
33 | self:Log('Remaining : '..self.RepeatCount)
34 | end
35 |
36 | members.ExecCombination = function()
37 | if false == geItemPuzzle.ExecCombination(true) then
38 | ui.SysMsg(ClMsg("NotEnoughRecipe"))
39 | end
40 | end
41 |
42 | -- ログ出力
43 | members.Dbg = function(self, msg)
44 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
45 | end
46 | members.Log = function(self, msg)
47 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
48 | end
49 | members.Err = function(self, msg)
50 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
51 | end
52 |
53 | -- デストラクター
54 | members.Destroy = function(self)
55 | if (g.i._PUZZLECRAFT_EXEC ~= nil) then
56 | _PUZZLECRAFT_EXEC = g.i._PUZZLECRAFT_EXEC
57 | end
58 | if (g.i.PUZZLE_COMPLETE ~= nil) then
59 | PUZZLE_COMPLETE = g.i.PUZZLE_COMPLETE
60 | end
61 | end
62 | -- おまじない
63 | return setmetatable(members, {__index = self});
64 | end
65 | -- .newなしでコンストラクターを呼ぶエイリアス登録
66 | setmetatable(g, {__call = g.new})
67 |
68 | -- 自フレーム初期化処理
69 | function REPEATERYPUZZLECRAFT_ON_INIT(addon, frame)
70 | -- 調合前に回数指定
71 | -- 調合開始後に画面を閉じない
72 | if (g.i._PUZZLECRAFT_EXEC == nil) then
73 | g.i._PUZZLECRAFT_EXEC = _PUZZLECRAFT_EXEC
74 | end
75 | _PUZZLECRAFT_EXEC = function(frame)
76 | local default = 1
77 | local min = 1
78 | local max = 999
79 | INPUT_NUMBER_BOX(nil, ScpArgMsg('InputCount'), 'REPEATERYPUZZLECRAFT_EXEC_TRUELY', default, min, max, nil, 1)
80 | end
81 |
82 | -- 調合後に再実行
83 | -- 1調合後に状態をリセットしない
84 | if (g.i.PUZZLE_COMPLETE == nil) then
85 | g.i.PUZZLE_COMPLETE = PUZZLE_COMPLETE
86 | end
87 | PUZZLE_COMPLETE = function()
88 | g.i.RepeatCount = g.i.RepeatCount - 1
89 | if (g.i.RepeatCount <= 0) then
90 | g.i.PUZZLE_COMPLETE()
91 | return
92 | end
93 | g.i:ShowRemainCount()
94 | g.i:ExecCombination()
95 | end
96 | end
97 |
98 | -- === イベントハンドラー === --
99 | function REPEATERYPUZZLECRAFT_EXEC_TRUELY(count, inputframe)
100 | g.i.RepeatCount = tonumber(count)
101 | g.i:ExecCombination()
102 | end
103 |
104 | -- インスタンス作成
105 | if (g.i ~= nil) then
106 | g.i:Destroy();
107 | end
108 | g.i = g();
109 |
--------------------------------------------------------------------------------
/summoncounter/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#summoncounter](https://blog.weizlogy.com/pages/tos-addon/#summoncounter)
2 |
3 | ## settings.
4 |
5 | Nexon\TreeofSaviorJP\addons\summoncounter\settings.txt を作成します。
6 |
7 | 以下の初期設定を[settings.txt](https://github.com/weizlogy/tos/blob/master/summoncounter/settings.txt)コピペします。
8 |
9 | ```lua
10 | suco.config = {
11 | Bokor_Zombify = {
12 | mode = "hpbar",
13 | loc_frame = { x = 450, y = 80 },
14 | loc_bar = { x = 0, y = 0 }
15 | },
16 | Necromancer_RaiseDead = {
17 | mode = "icon1",
18 | loc = "left",
19 | loc1 = { x = 0, y = 30 },
20 | loc2 = { x = 0, y = 70 },
21 | loc3 = { x = 0, y = 110 },
22 | loc4 = { x = -40, y = 50 },
23 | loc5 = { x = -40, y = 90 }
24 | },
25 | Necromancer_RaiseSkullarcher = {
26 | mode = "icon1",
27 | loc = "right",
28 | loc1 = { x = 0, y = 30 },
29 | loc2 = { x = 0, y = 70 },
30 | loc3 = { x = 0, y = 110 },
31 | loc4 = { x = 40, y = 50 },
32 | loc5 = { x = 40, y = 90 }
33 | },
34 | Necromancer_CreateShoggoth = {
35 | mode = "icon2",
36 | loc = "down",
37 | loc1 = { x = 0, y = 0 }
38 | }
39 | };
40 | ```
41 |
42 | ### explanation.
43 |
44 | この設定は召喚物発生スキルごとのアイコン表示設定です。
45 |
46 | #### mode
47 |
48 | ##### icon1
49 |
50 | 髑髏アイコン(小)を表示します。
51 |
52 | locはleft(キャラ左),right(キャラ右)が指定できます。
53 |
54 | loc+数字は召喚物ごとの相対的なアイコン表示位置を指定します。
55 |
56 | ##### icon2
57 |
58 | 魔法陣アイコン(大)を表示します。
59 |
60 | locはup(キャラ上),down(キャラ下)が指定できます。
61 |
62 | loc+数字は召喚物ごとの相対的なアイコン表示位置を指定します。
63 |
64 | ##### hpbar
65 |
66 | 紫色のHPバーを表示します。
67 |
68 | HPバーは召喚物のHP合計とMaxHPの合計で構成されます。
69 | つまり、HPが0になると召喚物は全て消滅したということになります。
70 |
71 | loc_frameはHPバーを表示するフレームの表示位置です。
72 | HPバーを複数用意する場合はすべて同じ位置で統一してください。
73 |
74 | loc_barはHPバーの表示位置をloc_frameからの相対位置で示します。
75 |
76 | ### explanation of initial parameters.
77 |
78 | #### Bokor_Zombify
79 |
80 | ボコルのゾンビフィーはHPバーで画面左上のスタミナゲージ右近辺に表示します。
81 | ゾンビがいない場合はHPバーは消えます。
82 |
83 | #### Necromancer_RaiseDead
84 |
85 | ネクロマンサーの骸骨兵は髑髏アイコンでキャラ左に表示します。
86 |
87 | #### Necromancer_RaiseSkullarcher
88 |
89 | ネクロマンサーの骸骨弓兵は髑髏アイコンでキャラ右に表示します。
90 |
91 | #### Necromancer_CreateShoggoth
92 |
93 | ネクロマンサーのショゴスは魔法陣アイコンでキャラ下に表示します。
94 |
95 | ## descriptions.
96 |
97 | ### v1.0.4
98 |
99 | #### 6/27アップデート対応
100 |
101 | ### v1.0.3
102 |
103 | #### ジョイスティック対応
104 |
105 | ジョイスティック使用時に動かない問題を修正しました。
106 |
107 | ### v1.0.2
108 |
109 | #### オブジェクトクリック阻害修正
110 |
111 | マウスモード時、召喚アイコン周辺にあるオブジェクトがクリックできない問題を修正しました。
112 |
113 | ### v1.0.1
114 |
115 | #### ショゴス召喚最大値修正
116 |
117 | ショゴスの召喚最大値がスキルレベルになっていたのを1固定に修正しました。
118 |
119 | #### 設定ファイルリロード機能追加
120 |
121 | チャットコマンドで設定ファイルをリロードできるようになります。
122 |
123 | ```lua
124 | /summonc reload
125 | ```
126 |
127 | ### v1.0.0
128 |
129 | #### 新規作成
130 |
131 | アドオンがロードされると、クイックスロットにセットしている召喚系スキルスロット右上に、召喚数/最大値を追加で表示します。
132 |
133 | さらに設定をすることで召喚物の状態をGUIで表示します。
134 | GUI表示が不要な場合は、各設定のmodeを空文字にしてください。
135 |
136 | ## cautions.
137 |
138 | - エリアチェンジ、ログイン直後で既に存在する召喚物はカウントできません。
139 | - ゾンビカプセル産のゾンビはカウントできません。
140 | - コープスタワー特性産の骸骨兵士はカウントできません。
141 |
--------------------------------------------------------------------------------
/index.md:
--------------------------------------------------------------------------------
1 | # Tree of fSavior アドオン索引
2 |
3 | ## [Archive Filter](./achievefilter/README.md/)
4 |
5 | 業績一覧をコレクション一覧みたいにフィルタリングできるようにします。
6 |
7 | ## [Compact Heads Up Display](./compactheadsupdisplay/README.md/)
8 |
9 | Heads Up Display(自ジョブアイコン、HPなどがあるフレーム)からHPバーを取り去り、コンパクトにします。(ジョブアイコンとレベルだけにします)
10 |
11 | ## [Costume Play](./costumeplay/README.md/)
12 |
13 | GUI操作で装備/ヘアカラー/称号を保存/復元します。
14 |
15 | ## [Dice](./dice/README.md/)
16 |
17 | 一般チャットでダイスロールができます。
18 |
19 | ## [DPS Meter](./dpsmeter/README.md/)
20 |
21 | DPS計測します。
22 |
23 | ## [Fix Book Read](./fixbookread/README.md/)
24 |
25 | 本アイテムの改行崩れを正常化します。
26 |
27 | ## [Fix Inventory Sort](./fixinventorysort/README.md/)
28 |
29 | 名前でのソートを正常化します。おまけ機能で好きなソート順を独自に作ることができます。
30 |
31 | ## [Fix Lost Chat Window](./fixlostchatwindow/README.md/)
32 |
33 | 追加チャットウィンドウが消えてしまう問題が発生しても、自動的に以前の状態に復元します。
34 |
35 | ## [Guild Notify In Chat](./guildnotifyinchat/README.md/)
36 |
37 | ギルドのお知らせをログイン時に、システムチャットで表示します。
38 |
39 | ## [Hide Name](./hidename/README.md/)
40 |
41 | 画面にある自キャラ名とギルド名、エンブレムを消します。
42 |
43 | ## [HP Monitor](./hpmonitor/README.md/)
44 |
45 | ボスのHPを監視して、指定パーセント付近で音とチャットを流します。常時モンスターのHPバーにパーセンテージ表示を追加します。
46 |
47 | ## [Master Place](./masterplace/README.md/)
48 |
49 | クラスマスターの所在地を教えてくれます。
50 |
51 | ## [Mini Gauge Text](./minigaugetext/README.md/)
52 |
53 | キャラクター下のHP/SPバーに現在値と最大値を表示します。
54 |
55 | ## [Multiple Quickslot](./multiplequickslot/README.md/)
56 |
57 | クイックスロットの保存、復元ができるようになります。
58 |
59 | ## [Monster Status](./monsterstatus/README.md/)
60 |
61 | ターゲット中のモンスターのステータスを表示します。シンプルなv2系もあります。
62 |
63 | ## [PartyInfoEx](./partyinfoex/README.md/)
64 |
65 | PTメンバーの所在地を表示します。
66 |
67 | ## [Pick-Item Info](./pickiteminfo/README.md/)
68 |
69 | ドロップアイテム名を常時表示+レアリティで色分けします。
70 |
71 | ## [Preview Guild Emblem](./previewguildemblem/README.md/)
72 |
73 | ギルドマスター以外でもギルドエンブレムのプレビューができます。
74 |
75 | ## [Remove New Collection Mark](./rmnewcollectionmark/README.md/)
76 |
77 | コレクション画面に表示される[N]マークを消します。サブキャラ育成時にどうぞ。
78 |
79 | ## [Remove Tips Forever](./removetipsfe/README.md/)
80 |
81 | 邪魔なtipsを非表示にしつつチャットウィンドウにシステムメッセージとして表示します。
82 |
83 | ## [Repair Endurance](./repairendur/README.md/)
84 |
85 | 装備修理時、装備アイコンに耐久度(%)を色分け表示します。
86 |
87 | ## [Repeatery PuzzleCraft](./repeaterypuzzlecraft/README.md/)
88 |
89 | マグナムオーパスを指定した回数、自動実行します。
90 |
91 | ## [Save Quest](./savequest/README.md/)
92 |
93 | ワープ用クエストの誤完了を防止します。ついでにクエストワープを使いやすくします。
94 |
95 | ## [Show Buff-Seller Type](./showbuffsellertype/README.md/)
96 |
97 | 商店のフキダシに商店名を付けて紛らわしさを回避します。(主に装備メンテ、修理の区別)
98 |
99 | ## [Show Hiddden Map](./showhiddenmap/README.md/)
100 |
101 | (ミニ)マップが表示されないマップで(ミニ)マップが表示されるようになります。
102 |
103 | ## [Skill-Item Counter](./skillitemcounter/README.md/)
104 |
105 | 消費アイテムありスキルの使用回数を表示します。
106 |
107 | ## [Summon Counter](./summoncounter/README.md/)
108 |
109 | クイックスロットに召喚物の個体数を表示します。召喚物の個体数やHPをUI上に表示します。召喚物がしゃべります――!?
110 |
111 | ## [Stealthy Master](./stealthymaster/README.md/)
112 |
113 | いいねせずキャラ情報を見れます。
114 |
115 | ## [SubQuickSlot](./subquickslot/README.md/)
116 |
117 | 任意のサイズのクイックスロットを任意の数だけ追加します。
118 |
119 | ## [Stamina Mini Gauge](./staminigauge/README.md/)
120 |
121 | キャラの足元にスタミナゲージを追加します。
122 |
123 | ## [Worldmap Quest](./worldmapquest/README.md/)
124 |
125 | ワールドマップ上に各エリアの受注可能なクエスト数を表示します。
126 |
127 | ## [Warehouse Sorter](./warehousesorter/README.md/)
128 |
129 | 個人倉庫にソートボタンを追加します。
130 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter_hpbar.lua:
--------------------------------------------------------------------------------
1 | -- HPバー表示モード
2 | -- 召喚物のHP合計をMAXとしたHPバーを生成する
3 | ModeHPBar = {}
4 |
5 | -- コンストラクター
6 | function ModeHPBar.new(self)
7 |
8 | local members = {}
9 |
10 | members.Key = ''
11 | members.Handles = {}
12 |
13 | -- モード処理を実行する
14 | -- frame UI生成先フレーム
15 | -- config モード用設定
16 | members.Execute = function(self, __frame, config, skillConfig)
17 | local frameName = 'summoncounter_hpbar_'..self.Key
18 | local frame = ui.GetFrame(frameName) or ui.CreateNewFrame('summoncounter', frameName)
19 | frame:EnableMove(tonumber(config['move'] or '1'))
20 | frame:EnableHitTest(1)
21 | frame:EnableHittestFrame(1)
22 | frame:SetLayerLevel(32) -- クエスト一覧より高く
23 |
24 | if (#self.Handles == 0) then
25 | frame:ShowWindow(0)
26 | return
27 | end
28 |
29 | local locframe = config['loc_frame']
30 | if (locframe) then
31 | frame:SetOffset(locframe.x, locframe.y)
32 | end
33 |
34 | if (skillConfig and skillConfig['loc_frame']) then
35 | frame:SetOffset(skillConfig['loc_frame'].x, skillConfig['loc_frame'].y)
36 | else
37 | frame:SetOffset(450, 300)
38 | end
39 |
40 | local totalHP, totalMHP = self:CalculateHP()
41 | if (totalHP <= 0) then
42 | DESTROY_CHILD_BYNAME(frame, 'summonsHPGauge_'..self.Key)
43 | DESTROY_CHILD_BYNAME(frame, 'summonsHPGaugeName_'..self.Key)
44 | return
45 | end
46 |
47 | -- local locbar = config['loc_bar']
48 | local title = config['title'] or self.Key
49 |
50 | local summonsHPGauge = frame:CreateOrGetControl(
51 | 'gauge', 'summonsHPGauge_'..self.Key, 0, 0, 188 - 10, 0)
52 | tolua.cast(summonsHPGauge, 'ui::CGauge')
53 | -- summonsHPGauge:SetMargin(20, 20, 20, 20)
54 | summonsHPGauge:Resize(summonsHPGauge:GetWidth(), 30)
55 | -- summonsHPGauge:SetOffset(locbar.x, locbar.y)
56 | summonsHPGauge:SetPoint(totalHP, totalMHP)
57 |
58 | summonsHPGauge:SetSkinName('necronomicon_amount')
59 | summonsHPGauge:SetColorTone('FFCCCCCC')
60 |
61 | if summonsHPGauge:GetStat() == 0 then
62 | summonsHPGauge:AddStat('%v/%m - '..string.gsub(title, '.-%_', ''))
63 | summonsHPGauge:SetStatFont(0, 'white_14_ol')
64 | summonsHPGauge:SetStatOffset(0, 3, 0)
65 | summonsHPGauge:SetStatAlign(0, 'center', 'center')
66 | end
67 |
68 | summonsHPGauge:EnableHitTest(0)
69 | summonsHPGauge:ShowWindow(1)
70 |
71 | frame:ShowWindow(1)
72 | frame:SetEventScript(ui.LBUTTONUP, 'SUMMONCOUNTER_ON_END_DRAG')
73 | frame:SetEventScriptArgString(ui.LBUTTONUP, self.Key)
74 | frame:SetEventScript(ui.RBUTTONUP, 'SUMMONCOUNTER_ON_RBUTTONUP')
75 | end
76 |
77 | -- 召喚物のHP、MAXHPの合計を取得する
78 | members.CalculateHP = function(self)
79 | local totalHP = 0
80 | local totalMHP = 0
81 | for i, handle in ipairs(self.Handles) do
82 | local stat = info.GetStat(handle)
83 | totalHP = totalHP + stat.HP
84 | totalMHP = totalMHP + stat.maxHP
85 | end
86 | -- for create empty gauge.
87 | if (totalMHP == 0) then
88 | totalHP = -1
89 | totalMHP = 1
90 | end
91 | return totalHP, totalMHP
92 | end
93 |
94 | -- おまじない
95 | return setmetatable(members, {__index = self})
96 | end
97 | setmetatable(ModeHPBar, {__call = ModeHPBar.new})
98 |
99 | function SUMMONCOUNTER_HPBAR_ON_INIT(addon, frame) end
100 |
--------------------------------------------------------------------------------
/savequest/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#savequest](https://blog.weizlogy.com/pages/tos-addon/#savequest)
2 |
3 | ## settings.
4 |
5 | Nexon\TreeofSaviorJP\addons\savequest フォルダーを作成します。
6 |
7 | ### explanation.
8 |
9 | savequestフォルダーには下記ファイルが自動的に生成され、
10 | キャラクター毎にアドオンで使用する情報をログアウト後も保持するために使用します。
11 |
12 | - quests_[cid].txt
13 | - quests\_scl_[cid].txt
14 |
15 | ## descriptions.
16 |
17 | ### v1.2.5
18 |
19 | #### 保存済みクエストを破棄しても保存状態が残る問題を修正
20 |
21 | 保存済みクエストを破棄しても保存状態が残るため、再受注してもNPCが消えたままでした。
22 | 保存済みクエストを破棄すると保存状態も破棄するように修正しました。
23 |
24 | ### v1.2.4
25 |
26 | #### ショートカットフレームレイヤーレベル一括変更機能追加
27 |
28 | ショートカットフレームの(ワープマーカー)右クリックメニューに「FlattenLayerLv」コマンドを追加しました。
29 |
30 | ### v1.2.3
31 |
32 | #### ショートカットフレームレイヤーレベル動的調整機能追加
33 |
34 | ショートカットフレーム上でマウスホイールをくるくるするとレイヤーレベルが動的に変わります。
35 | 現在値はチャット上に表示(ちょっと邪魔...)します。
36 |
37 | レイヤーレベルはショートカットフレームを移動させた時に保存します(くるくるしただけでは保存しない!)ので、お忘れなきよう...
38 |
39 | ### v1.2.2
40 |
41 | #### パーティー共有機能追加
42 |
43 | クエストワープのショートカットフレームから右クリックメニューでパーティー共有/共有解除できるようになります。
44 |
45 | #### ショートカットフレームレイヤーレベル調整
46 |
47 | ショートカットフレームのレイヤーレベルを999 -> 199に変更しました。
48 |
49 | worldmapのレイヤーレベルが200なので、それの下という感じです。
50 |
51 | ### v1.2.1
52 |
53 | #### クエストワープショートカット位置固定機能追加
54 |
55 | クエストワープのショートカットフレームを位置固定できるようにしました。
56 |
57 | ### v1.2.0
58 |
59 | #### クエストワープショートカット作成機能追加
60 |
61 | 右クリックメニューにshortcutが追加されました。
62 | 本機能によりクエストワープのショートカットフレームを任意の場所に追加、削除できます。
63 |
64 | ### v1.1.1
65 |
66 | #### 一部クエストが保存できない不具合の修正
67 |
68 | おそらくメインクエはほとんど保存できなかったと思いますが、保存できるようになります。
69 |
70 | ### v1.1.0
71 |
72 | #### クエスト欄操作機能追加
73 |
74 | F5キーで表示するクエスト欄でも本アドオンの機能(右クリックメニュー)が使えるようになります。
75 |
76 | #### ダイレクトクエストワープ機能追加
77 |
78 | F5キーで表示するクエスト欄から直接クエストワープできるようになります。
79 |
80 | ワープ可能なクエストの左上にワープアイコンが表示されるので、クリックしてください。
81 |
82 | ### v1.0.2
83 |
84 | #### バグ対応
85 |
86 | 保存したクエスト情報がチーム毎に共有される問題を修正しました。
87 |
88 | [issue #3](https://github.com/weizlogy/tos/issues/3)
89 |
90 | 本修正により、情報保存形式が変更され、クエスト保存状態が初期化されます。
91 |
92 | お手数ですが、再チェックまたは、旧仕様情報(quests.txt)の内容をquests_[cid].txtにコピペしてください。
93 |
94 | ### v1.0.1
95 |
96 | #### バグ対応
97 |
98 | 再ログイン時に前回の状態が保存されない問題を修正しました。
99 |
100 | [issue #1](https://github.com/weizlogy/tos/issues/1)
101 |
102 | ### v1.0.0
103 |
104 | #### 新規作成
105 |
106 | アドオンがロードされると、任意の完了済みかつワープ可能なクエストのNPCを一時消去し、
107 | ワープ直後の誤完了を防止できます。
108 |
109 | ## usage.
110 |
111 | UI右のクエスト一覧にある条件を満たしたクエストのタイトルを右クリックすると、
112 | メニュー(Save, Release, Shortcut, Cancel)が開きます。
113 |
114 | ### save & release.
115 |
116 | saveを選択すると該当クエストのNPCは非表示となります。
117 | また、save済みのクエストのワープアイコン直下に[saved.]の文字を表示します。
118 |
119 | 元に戻すにはreleaseを選択します。
120 |
121 | ### shortcut.
122 |
123 | shortcutを選択すると画面右上近辺にワープアイコン+マップ名の小さなフレームが出現します。
124 |
125 | フレームはドラッグで好きな位置に移動できます。移動位置は自動保存され再ログイン時に復元します。
126 |
127 | ワープアイコンにマウスカーソルを当てるとクエスト名をツールチップ表示します。
128 |
129 | ワープアイコンを右クリックするとメニュー((Un)Lock, (Un)Share, FlattenLayerLv, Remove, Cancel)が表示されます。
130 |
131 | #### (Un)Lock
132 |
133 | ショートカットフレームを位置固定、または固定解除します。
134 |
135 | 現在の位置固定状態に応じてトグル表示します。
136 |
137 | #### (Un)Share
138 |
139 | 対象クエストをパーティー共有/解除します。
140 |
141 | 共有時はショートカットフレーム右端に共有アイコンが表示されます。
142 | (クエスト一覧と同じやつです)
143 |
144 | 現在の共有状態に応じてトグル表示します。
145 |
146 | #### FlattenLayerLv
147 |
148 | メニューを出したショートカットフレームのレイヤーレベルを、すべてのショートカットフレームに展開します。
149 |
150 | #### Remove
151 |
152 | ショートカットフレームを削除します。
153 |
154 | **クエスト完了、破棄に連動していないため、不要になったショートカットは手動で削除してください。**
155 |
156 | ## cautions.
157 |
158 | 念のため、アドオンは補助的な位置づけとし、
159 | ワープ直後はNPCを選択しないよう留意してください。
160 |
161 | 一時消去したNPCは、release後、エリアチェンジで表示できます。
162 |
--------------------------------------------------------------------------------
/repairendur/repairendur.lua:
--------------------------------------------------------------------------------
1 | RepairEndur = {};
2 | -- constructor.
3 | function RepairEndur.new(self)
4 | -- initialize members.
5 | local members = {};
6 | -- L:Low, M:Middle, H:High.
7 | members.Weapon = {
8 | Lp = 30,
9 | Mp = 5,
10 | Hp = 1
11 | };
12 | members.Armor = {
13 | Lp = 35,
14 | Mp = 10,
15 | Hp = 5
16 | };
17 | members.SubWeapon = members.Weapon;
18 | members.EndurColor = {
19 | Lc = "FFFF00",
20 | Mc = "FF0000",
21 | Hc = "000000"
22 | };
23 | -- main logic.
24 | members.InsertEndur = function(self, frame)
25 | -- get slotset recursively.
26 | local slotSet = GET_CHILD_RECURSIVELY_AT_TOP(frame, "slotlist", "ui::CSlotSet");
27 | -- loop number of slot.
28 | local slotCount = slotSet:GetSlotCount();
29 | for i = 0, slotCount - 1 do
30 | local slot = slotSet:GetSlotByIndex(i);
31 | local icon = slot:GetIcon();
32 | if (icon ~= nil) then
33 | local iconInfo = icon:GetInfo();
34 | local invitem = GET_ITEM_BY_GUID(iconInfo:GetIESID());
35 | local itemobj = GetIES(invitem:GetObject());
36 | -- get item endurance parcentage.
37 | local durPc = itemobj.Dur * 100 / itemobj.MaxDur;
38 | -- create text.
39 | local durText = "{s14}{ol}"..string.format("%2.2f", durPc).."%";
40 | local durByColor = self:getDurColorByItemGroup(durPc, itemobj);
41 | -- display text.
42 | local durObj = slot:CreateOrGetControl("richtext", "dur_"..i, 0, 0, 10, 10);
43 | durObj:EnableHitTest(0);
44 | durObj:SetText("{#"..durByColor.."}"..durText);
45 | durObj:Resize(47, 14);
46 | durObj:Move(slot:GetWidth() - durObj:GetWidth(), slot:GetHeight() - durObj:GetHeight());
47 | else
48 | slot:RemoveChild("dur_"..i);
49 | end
50 | end
51 | end
52 | members.getDurColorByItemGroup = function(self, durPc, itemobj)
53 | -- default value.
54 | local durByColor = "FFFFFF";
55 | local threshold = self.Weapon;
56 | -- check item group.
57 | local group = itemobj.GroupName;
58 | local equipGroup = itemobj.EquipGroup;
59 | if (group == "Armor") then
60 | threshold = self.Armor;
61 | end
62 | if (equipGroup == "SubWeapon") then
63 | -- exists combination in item.ies =>
64 | -- (GroupName x EquipGroup) Armor x SW, SW x SW, Weapon x SW
65 | threshold = self.SubWeapon;
66 | end
67 | -- select color.
68 | if (durPc <= threshold.Hp) then
69 | durByColor = self.EndurColor.Hc;
70 | elseif (durPc <= threshold.Mp) then
71 | durByColor = self.EndurColor.Mc;
72 | elseif (durPc <= threshold.Lp) then
73 | durByColor = self.EndurColor.Lc;
74 | end
75 | return durByColor;
76 | end
77 | members.Destroy = function(self)
78 | UPDATE_REPAIR140731_LIST = self.UPDATE_REPAIR140731_LIST;
79 | end
80 | return setmetatable(members, {__index = self});
81 | end
82 | -- set call.
83 | setmetatable(RepairEndur, {__call = RepairEndur.new});
84 | -- frame initialize.
85 | function REPAIRENDUR_ON_INIT(addon, frame)
86 | -- load settings.
87 | dofile("../addons/repairendur/settings.txt");
88 | -- override system function.
89 | if (reen.UPDATE_REPAIR140731_LIST == nil) then
90 | reen.UPDATE_REPAIR140731_LIST = UPDATE_REPAIR140731_LIST;
91 | end
92 | UPDATE_REPAIR140731_LIST = function(frame)
93 | reen.UPDATE_REPAIR140731_LIST(frame);
94 | reen:InsertEndur(frame);
95 | end
96 | end
97 | -- create instance.
98 | if (reen ~= nil) then
99 | reen:Destroy();
100 | end
101 | reen = RepairEndur();
102 |
--------------------------------------------------------------------------------
/objectdetector/README.md:
--------------------------------------------------------------------------------
1 | ## settings.
2 |
3 | Nexon\TreeofSaviorJP\addons\objectdetector\settings.txt を作成します。
4 |
5 | 以下の初期設定を[settings.txt](https://github.com/weizlogy/tos/blob/master/objectdetector/settings.txt)にコピペします。
6 |
7 | ```lua
8 | -- for monster and npcs.
9 | obde.config.mon = {
10 | color = "FF000000",
11 | isVisible = 1
12 | };
13 | obde.config.mon.Monster = {
14 | color = "FF660000",
15 | isVisible = 1
16 | };
17 | obde.config.mon.Monster_Chaos1 = obde.config.mon.Monster;
18 | obde.config.mon.Monster_Chaos2 = obde.config.mon.Monster;
19 |
20 | obde.config.mon.Pet = {
21 | isVisible = 0
22 | };
23 | obde.config.mon.RootCrystal = {
24 | color = "FF330033",
25 | isVisible = 1
26 | };
27 | obde.config.mon.Neutral = {
28 | color = "FFFF9900",
29 | isVisible = 1,
30 | };
31 | obde.config.mon.Peaceful = obde.config.mon.Neutral;
32 | obde.config.mon.Our_Forces = obde.config.mon.Neutral;
33 | obde.config.mon.Hidden_tgt = obde.config.mon.Neutral;
34 |
35 | -- for players.
36 | obde.config.pc = {
37 | color = "FF0000FF",
38 | isVisible = 1
39 | };
40 |
41 | -- for dropitems.
42 | obde.config.item = {
43 | color = "FF999999",
44 | isVisible = 1
45 | };
46 |
47 | -- for treasures.
48 | obde.config.treasure = {
49 | color = "FFFF9900",
50 | isVisible = 1,
51 | isBlink = 1
52 | };
53 |
54 | -- for clover buffs.
55 | obde.config.clover = {
56 | color = "FF330000",
57 | isVisible = 1,
58 | isBlink = 1
59 | };
60 |
61 | obde.config.clover.EliteMonsterBuff = {
62 | color = "FFFF3333",
63 | isVisible = 1
64 | };
65 | ```
66 |
67 | ### explanation.
68 |
69 | #### params
70 |
71 | ##### color
72 |
73 | アイコン色をARGBで指定します。
74 |
75 | Aは(実装の関係上)FF推奨です。
76 | 透明に近づけると黒くなっていきます。
77 |
78 | ##### isVisible
79 |
80 | アイコンの表示を制御します。
81 | 1を指定した場合のみ表示します。
82 |
83 | ##### isBlink
84 |
85 | アイコンの点滅を制御します。
86 | 1を指定した場合のみ点滅します。
87 |
88 | 本設定は[obde.config.mon]以下のみ有効です。
89 |
90 | #### obde.config.mon
91 |
92 | モンスターやNPCなどほぼ全てのオブジェクトの基本設定です。
93 |
94 | 後述のfaction指定設定にない場合、本設定が有効となります。
95 |
96 | ##### obde.config.mon.[faction]
97 |
98 | オブジェクトのfaction属性毎に用意する設定です。
99 | factionはアイコンのツールチップ[f=]で確認できます。
100 |
101 | #### obde.config.pc
102 |
103 | 他PCの基本設定です。
104 |
105 | #### obde.config.item
106 |
107 | ドロップアイテムの基本設定です。
108 |
109 | #### obde.config.treasure
110 |
111 | 宝箱の基本設定です。
112 |
113 | #### obde.config.clover
114 |
115 | クローバーバフ持ちの基本設定です。
116 |
117 | 後述のclassname指定設定にない場合、本設定が有効となります。
118 |
119 | ##### obde.config.clover.[classname]
120 |
121 | クローバーバフのclassname毎に用意する設定です。
122 | classnameはアイコンのツールチップ[b=]で確認できます。
123 |
124 | ### explanation of initial parameters.
125 |
126 | | 色 | オブジェクト |
127 | |:---|:---|
128 | |赤|モンスター|
129 | |赤点滅|クローバーバフモンスター(エリートは除く)|
130 | |桃|エリートクローバーバフモンスター|
131 | |青|PC|
132 | |橙|NPC|
133 | |橙点滅|宝箱|
134 | |紫|ルーツクリスタル|
135 | |白|ドロップアイテム|
136 | |黒|その他|
137 | |非表示|ペット|
138 |
139 | ## descriptions.
140 |
141 | ### v1.3.1
142 |
143 | #### PVPマップ動作停止対応
144 |
145 | PVPマップでは動きません。
146 |
147 | ### v1.3.0
148 |
149 | #### ボス系サイズ拡大対応
150 |
151 | ボス系のドットが通常より大きく表示されます。
152 |
153 | ### v1.2.0
154 |
155 | #### 検索機能追加
156 |
157 | チャットコマンドにて、「/detector search xxx」とすると、xxxに完全一致する名前を持つオブジェクトを探して点滅させます。
158 |
159 | #### オブジェクトサイズ反映対応
160 |
161 | マップに表示するドットがオブジェクトのサイズに応じて変化します。
162 |
163 | ### v1.1.0
164 |
165 | #### アイコン表示処理の設定ファイル化
166 |
167 | アイコンの表示、配色、点滅を設定ファイルでカスタマイズできるようにしました。
168 |
169 | 設定ファイルがないと動かないので注意してください。
170 |
171 | ### v1.0.1
172 |
173 | #### 性能改善
174 |
175 | ### v1.0.0
176 |
177 | #### 新規作成
178 |
179 | アドオンがロードされると、マップとミニマップに四角形のアイコン[*1]が表示されます。
180 |
181 | [*1] アイコン配色とオブジェクトの関係は以下の通りです。
182 |
183 | | 色 | オブジェクト |
184 | |:---|:---|
185 | |赤|モンスター|
186 | |赤点滅|クローバーバフモンスター|
187 | |青|PC|
188 | |橙|NPC|
189 | |橙点滅|宝箱|
190 | |紫|ルーツクリスタル|
191 | |白|ドロップアイテム|
192 | |黒|その他|
193 | |非表示|ペット|
194 |
195 | 某レーダーと違いマップにオーバーレイせず直接描画しているため、既存UIの邪魔をしません。
196 |
--------------------------------------------------------------------------------
/fixinventorysort/README.md:
--------------------------------------------------------------------------------
1 | # Release Note.
2 |
3 | ## v1.3.0
4 |
5 | ### ソート対象文字列の一時改変機能を削除(内部の固定値とした
6 |
7 | ### 設定画面追加
8 |
9 | ソートアイコンのメニュー最下部に [config] が追加されます。
10 |
11 | - CLOSEボタン
12 |
13 | 保存せず画面を閉じます。
14 |
15 | - SAVEボタン
16 |
17 | 現在の状態を保存します。
18 |
19 | - Main
20 |
21 | 現在定義されているソートです。
22 |
23 | [-]ボタン:該当行を削除します。
24 |
25 | [+]ボタン:行を追加します。
26 |
27 | [⇔]ボタン:オリジナルソートと拡張ソートを切り替えます。
28 |
29 | [>]ボタン:(拡張ソートのみ)拡張ソートの定義表示をトグルします。
30 |
31 | - Affect
32 |
33 | サブグループ指定ソート機能の定義です。
34 |
35 | [-]ボタン:該当行を削除します。
36 | [+]ボタン:行を追加します。
37 |
38 | ## v1.2.0
39 |
40 | ### サブグループ指定ソート機能追加
41 |
42 | アイテムのサブグループを指定して全体のソートとは別のソート順を指定できます。
43 |
44 | #### 設定方法
45 |
46 | 機能を有効にするには以下の記述が設定ファイルに必要です。
47 | (つまり、該当機能を使用しないのであれば書かないほうがソート処理速度に有利です。
48 | ```
49 | s['affect'] = {}
50 | ```
51 |
52 | ##### 設定内容の説明
53 |
54 | フォーマットは以下の通りで、カンマ区切りにより複数個指定可能です。
55 | ```
56 | ['サブグループ名'] = ソート順 , ...
57 | ```
58 |
59 | サブグループ名は、インベントリの中項目の分類です。
60 | 例えば、ジェム(大項目:アイテム > 中項目:ジェム
61 |
62 | ソート順は、そのサブグループ名に該当するアイテムのソート順を指定します。(そのままやん...
63 | 既存ソートを指定する場合は、'weight'など文字列で記載できます。
64 | 拡張ソートを指定する場合は、定義部分(s[])に記載した数字を記載します。(s[2]なら、2
65 |
66 | 具体例を一つ。
67 | 材料は重さ順、消費は名前順、ジェムはアイコン順にする場合は
68 | 以下のようにします。
69 | ```
70 | local s = {}
71 | --
72 | s[0] = 'weight'
73 | s[1] = 'name'
74 | s[2] = {
75 | Desc = 'アイコン順',
76 | Sort = {
77 | [0] = 'Icon',
78 | [1] = 'Name'
79 | }
80 | }
81 | s['affect'] = {
82 | ['材料'] = 'weight',
83 | ['消費'] = 'name',
84 | ['ジェム'] = 2,
85 | }
86 | --
87 | return s
88 | ```
89 |
90 | ## v1.1.0
91 |
92 | ### 重さ順の処理修正
93 |
94 | - 重さ順
95 | 重さ(昇順) > 個数(降順) > 名前(昇順)
96 |
97 | ### 拡張メニュー対応
98 |
99 | 設定ファイルで自分の好きなソートを定義できます。
100 |
101 | #### 用意するもの
102 |
103 | addons/fixinventorysort/settings.txt
104 |
105 | #### 初期設定
106 |
107 | 下記テンプレートをコピペします。
108 | ```
109 | local s = {}
110 | --
111 | s[0] = 'weight'
112 | s[1] = 'name'
113 | s[2] = {
114 | Desc = 'アイコン順',
115 | Sort = {
116 | [0] = 'Icon',
117 | [1] = 'Name'
118 | }
119 | }
120 | --
121 | return s
122 | ```
123 |
124 | #### 設定方法
125 |
126 | "--"で囲まれた部分が変更可能な範囲です。
127 |
128 | ##### 設定内容の説明
129 |
130 | これは既存のソート順である「重さ順」を使えるようにします。
131 | この書き方で、'name'(名前順), 'level'(等級順)の定義ができます。
132 | ```
133 | s[0] = 'weight'
134 | ```
135 |
136 | これは独自に拡張したソート順の定義で、ソートメニュー上では「アイコン順」と表示されます。
137 | 並び方は、アイコン(昇順) > 名前(昇順)の順序です。
138 | ```
139 | s[2] = {
140 | Desc = 'アイコン順',
141 | Sort = {
142 | [0] = 'Icon',
143 | [1] = 'Name'
144 | }
145 | }
146 | ```
147 |
148 | sの後に続く数字はソートメニュー上の表示順序です。
149 | テンプレートでは、「重さ順」「名前順」「アイコン順」と表示されます。
150 | **数字が重複しないように気をつけてください。**
151 | ```
152 | s[0]...
153 | s[1]...
154 | s[2]...
155 | ```
156 |
157 | ##### 拡張ソート順で使える項目
158 |
159 | item.ies(とマージしているies)に定義された以下の項目が使えます。
160 | どんな値が入っているかは書くと大変なので名称で察してください。
161 |
162 | とまあ作ってみたものの実際そんな使えそうなものがないという...
163 |
164 | ```
165 | ClassID,Weight,ItemStar,UseLv,MaterialPrice,Price,PriceRatio,SellPrice,RepairPriceRatio,MaxStack,Scale,DropSoundTime,DeadBreakRatio,NumberArg1,NumberArg2,ItemCoolDown,BelongingCount,LifeTime,ItemLifeTimeOver,ReopenDiscountRatio,CardLevel,PackageTradeCount,ItemExp,SkillType,SkillLevel,ClassName,Name,ItemType,Journal,GroupName,EquipXpGroup,MergeTable1,MergeClass1,MergeTable2,MergeClass2,MergeTable3,MergeClass3,ToolTipScp,ItemGrade,TooltipImage,Icon,ReqToolTip,TooltipValue,Desc,DropSound,EquipSound,InOutScp,Script,Destroyable,TeamTrade,ShopTrade,MarketTrade,UserTrade,RefreshScp,DropStyle,StringArg,Usable,PreCheckScp,Consumable,UseAnim,ClientScp,ParticleName,UseTx,CoolDown,CoolDownGroup,AllowDuplicate,NotExist,LogoutSave,PVPMap,ItemLifeTime,SpineTooltipImage,AllowReopen,Reinforce_Type,CubeDuplicate,MarketCategory,Desc_Sub,CardGroupName,FileName,CustomToolTip,ClassType2,LifeTime_Limitcheck,PVP,PackageTradeAble,Package,ClassType
166 | ```
167 |
168 | ## v1.0.0
169 |
170 | ### 何をするもの?
171 |
172 | ロケーションに応じた名前でのソートが上手く動かない問題を修正します。
173 | また、以下の通り、既存ソートを変更します。
174 |
175 | - 等級順
176 | 既存踏襲
177 |
178 | - 重さ順
179 | 重さ(昇順) > 名前(昇順)
180 |
181 | - 等級順
182 | 名前(昇順)
183 |
184 | ### どうすれば?
185 |
186 | ipfファイルをインストールするだけです。
187 |
188 | ### いつ動くの?
189 |
190 | - ソートを実行したとき。
191 |
192 | ### 注意事項
193 |
194 | ないよ!
195 |
--------------------------------------------------------------------------------
/pickiteminfo/pickiteminfo.lua:
--------------------------------------------------------------------------------
1 | PickItemInfo = {};
2 |
3 | -- constructor.
4 | function PickItemInfo.new(self)
5 | -- initialize members.
6 | local members = {};
7 | -- update.
8 | members.Update = function(self, frame, msg, str, handle)
9 | local list, count = SelectBaseObject(GetMyPCObject(), 300, "ALL");
10 | for i = 1 , count do
11 | local obj = list[i];
12 | local iesObj = GetBaseObjectIES(obj);
13 | local actor = tolua.cast(obj, "CFSMActor");
14 | local handle = actor:GetHandleVal();
15 | local objType = actor:GetObjType();
16 | if (objType == GT_ITEM) then
17 | self:ShowUI(handle, iesObj);
18 | end
19 | end
20 | end
21 | -- show pick item info.
22 | members.ShowUI = function(self, handle, iesObj)
23 | local itemframe = ui.GetFrame("monb_"..handle);
24 | if (itemframe == nil) then
25 | return;
26 | end
27 |
28 | local frameName = "pickiteminfo_" .. handle;
29 | local frame = ui.GetFrame(frameName);
30 | if (frame == nil) then
31 | frame = ui.CreateNewFrame("pickiteminfo", frameName, 0);
32 | --CHAT_SYSTEM(frameName);
33 | end
34 | frame:Resize(itemframe:GetWidth(), itemframe:GetHeight())
35 | frame:SetLayerLevel(1);
36 |
37 | local baseItemName = itemframe:GetChild('name')
38 |
39 | local itemNameText = frame:CreateOrGetControl(
40 | 'richtext', "itemNameText", 0, 0, baseItemName:GetWidth(), baseItemName:GetHeight());
41 | itemNameText:SetText(string.format("{ol}{s14}{#%s}%s", self:GetItemRarityColor(iesObj), iesObj.Name));
42 | itemNameText:ShowWindow(1);
43 |
44 | frame:SetUserValue("_AT_OFFSET_HANDLE", handle);
45 | frame:SetUserValue("_AT_OFFSET_X", -20);
46 | frame:SetUserValue("_AT_OFFSET_Y", 30);
47 | frame:SetUserValue("_AT_OFFSET_TYPE", 1);
48 | frame:SetUserValue("_AT_AUTODESTROY", 1);
49 |
50 | _FRAME_AUTOPOS(frame);
51 | frame:RunUpdateScript("PICKITEMINFO_FRAME_AUTOPOS");
52 |
53 | frame:ShowWindow(1);
54 | end
55 | -- get item name color. by coloreditemnames.
56 | members.GetItemRarityColor = function(self, iesObj)
57 | if (iesObj.ItemClassName == "Vis") then
58 | return "FFFFFF";
59 | end
60 | local itemObj = GetClass("Item", iesObj.ClassName);
61 | local grade = itemObj.ItemGrade;
62 | if (itemObj.ItemType == "Recipe") then
63 | local recipeGrade = string.match(itemObj.Icon, "misc(%d)");
64 | if recipeGrade ~= nil then
65 | grade = tonumber(recipeGrade) - 1;
66 | end
67 | end
68 | local color = "FFFFFF";
69 | if (grade == 0) then
70 | color = "FFBF33";
71 | elseif (grade == 1) then
72 | color = "FFFFFF";
73 | elseif (grade == 2) then
74 | color = "108CFF";
75 | elseif (grade == 3) then
76 | color = "9F30FF";
77 | elseif (grade == 4) then
78 | color = "FF4F00";
79 | end
80 | return color;
81 | end
82 | -- destroy.
83 | members.Destroy = function(self)
84 | end
85 | return setmetatable(members, {__index = self});
86 | end
87 | -- set call.
88 | setmetatable(PickItemInfo, {__call = PickItemInfo.new});
89 |
90 | -- frame initialize.
91 | function PICKITEMINFO_ON_INIT(addon, frame)
92 | -- regist check object handler.
93 | addon:RegisterMsg('MAP_CHARACTER_UPDATE', 'PICKITEMINFO_UPDATE');
94 | addon:RegisterMsg('FPS_UPDATE', 'PICKITEMINFO_UPDATE');
95 | end
96 |
97 | function PICKITEMINFO_UPDATE(frame, msg, str, handle)
98 | piin:Update(frame, msg, str, handle);
99 | end
100 |
101 | function PICKITEMINFO_FRAME_AUTOPOS(frame)
102 | local r = _FRAME_AUTOPOS(frame);
103 | local frameName = frame:GetName();
104 | local itemFrameName = string.gsub(frameName, 'pickiteminfo_', 'monb_');
105 | if (ui.GetFrame(itemFrameName) == nil) then
106 | ui.DestroyFrame(frameName);
107 | --CHAT_SYSTEM(frameName..' deleted.');
108 | return 0;
109 | end
110 | return r;
111 | end
112 |
113 | -- create instance.
114 | if (piin ~= nil) then
115 | piin:Destroy();
116 | end
117 | piin = PickItemInfo();
118 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter_party.lua:
--------------------------------------------------------------------------------
1 | -- パーティ表示モード
2 | -- 召喚物をパーティ風に表示する
3 |
4 | ModeParty = {}
5 |
6 | -- コンストラクター
7 | function ModeParty.new(self)
8 |
9 | local members = {}
10 |
11 | members.Key = ''
12 | members.Handles = {}
13 |
14 | -- モード処理を実行する
15 | -- frame UI生成先フレーム
16 | -- config モード用設定
17 | members.Execute = function(self, __frame, config, skillConfig)
18 | local frameName = 'summoncounter_party_'..self.Key
19 | local frame = ui.GetFrame(frameName) or ui.CreateNewFrame('summoncounter', frameName)
20 | frame:EnableMove(tonumber(config['move'] or '1'))
21 | frame:EnableHitTest(1)
22 | frame:EnableHittestFrame(1)
23 | frame:SetLayerLevel(32) -- クエスト一覧より高く
24 |
25 | if (#self.Handles == 0) then
26 | frame:ShowWindow(0)
27 | return
28 | end
29 |
30 | if (skillConfig and skillConfig['loc_frame']) then
31 | frame:SetOffset(skillConfig['loc_frame'].x, skillConfig['loc_frame'].y)
32 | else
33 | frame:SetOffset(450, 300)
34 | end
35 |
36 | DESTROY_CHILD_BYNAME(frame, 'PTINFO_')
37 | for i, handle in ipairs(self.Handles) do
38 | local ctrlName = 'PTINFO_'.. handle
39 | local partyInfoCtrlSet = frame:CreateOrGetControlSet('partyinfo', ctrlName, -40, (i - 1) * 50)
40 | tolua.cast(partyInfoCtrlSet, "ui::CControlSet")
41 | partyInfoCtrlSet:EnableHitTestSet(0)
42 | -- リーダーマーク消し
43 | local leaderMark = GET_CHILD(partyInfoCtrlSet, "leader_img", "ui::CPicture")
44 | leaderMark:SetImage('None_Mark')
45 | leaderMark:ShowWindow(0)
46 | -- 名前
47 | local nameRichText = tolua.cast(partyInfoCtrlSet:GetChild('name_text'), "ui::CRichText")
48 | nameRichText:SetTextByKey("name", config.title or self.Key)
49 | -- レベル
50 | local lvbox = partyInfoCtrlSet:GetChild('lvbox')
51 | local levelRichText = tolua.cast(lvbox, "ui::CRichText")
52 | levelRichText:SetTextByKey("lv", info.GetLevel(handle))
53 | lvbox:Resize(levelRichText:GetWidth(), lvbox:GetHeight())
54 | -- HP
55 | local stat = info.GetStat(handle)
56 | local hpGauge = GET_CHILD(partyInfoCtrlSet, "hp", "ui::CGauge")
57 | hpGauge:SetPoint(stat.HP, stat.maxHP)
58 | -- バフ/デバフ
59 | local buffListSlotSet = GET_CHILD(partyInfoCtrlSet, "buffList", "ui::CSlotSet")
60 | local debuffListSlotSet = GET_CHILD(partyInfoCtrlSet, "debuffList", "ui::CSlotSet")
61 | local buffCount = info.GetBuffCount(handle)
62 | local buffIndex = 0;
63 | local debuffIndex = 0;
64 | for i = 0, buffCount - 1 do
65 | local buff = info.GetBuffIndexed(handle, i)
66 | local cls = GetClassByType("Buff", buff.buffID)
67 | local slot = nil;
68 | if cls.Group1 == 'Buff' then
69 | slot = buffListSlotSet:GetSlotByIndex(buffIndex);
70 | buffIndex = buffIndex + 1;
71 | elseif cls.Group1 == 'Debuff' then
72 | slot = debuffListSlotSet:GetSlotByIndex(debuffIndex);
73 | debuffIndex = debuffIndex + 1;
74 | end
75 | if slot ~= nil then
76 | local icon = slot:GetIcon()
77 | if icon == nil then
78 | icon = CreateIcon(slot)
79 | end
80 | icon:SetDrawCoolTimeText(math.floor(buff.time/1000))
81 | slot:SetText("")
82 | if buff.over > 1 then
83 | slot:SetText('{s13}{ol}{b}'..buff.over, 'count', ui.RIGHT, ui.BOTTOM, 1, 2)
84 | end
85 | icon:SetTooltipType('buff')
86 | icon:SetTooltipArg(handle, cls.ClassID, "")
87 | local imageName = 'icon_' .. cls.Icon
88 | icon:Set(imageName, 'BUFF', cls.ClassID, 0)
89 | slot:ShowWindow(1)
90 | end
91 | end
92 | end
93 | frame:Resize(frame:GetOriginalWidth(), (#self.Handles) * 50 + 10)
94 | frame:ShowWindow(1)
95 | frame:SetEventScript(ui.LBUTTONUP, 'SUMMONCOUNTER_ON_END_DRAG')
96 | frame:SetEventScriptArgString(ui.LBUTTONUP, self.Key)
97 | frame:SetEventScript(ui.RBUTTONUP, 'SUMMONCOUNTER_ON_RBUTTONUP')
98 | end
99 |
100 | -- おまじない
101 | return setmetatable(members, {__index = self})
102 | end
103 | setmetatable(ModeParty, {__call = ModeParty.new})
104 |
105 | function SUMMONCOUNTER_PARTY_ON_INIT(addon, frame) end
106 |
--------------------------------------------------------------------------------
/summoncounter/addon_d.ipf/summoncounter/summoncounter_extend.lua:
--------------------------------------------------------------------------------
1 | -- 公式召喚表示拡張モード
2 | -- 公式召喚表示を拡張する
3 |
4 | ModeExtend = {}
5 |
6 | -- コンストラクター
7 | function ModeExtend.new(self)
8 |
9 | local members = {}
10 |
11 | members.Key = ''
12 | members.Handles = {}
13 |
14 | -- モード処理を実行する
15 | -- frame UI生成先フレーム
16 | -- config モード用設定
17 | members.Execute = function(self, __frame, config, skillConfig)
18 | local frameName = 'summoncounter_party_'..self.Key
19 | local frame = ui.GetFrame(frameName) or ui.CreateNewFrame('summoncounter', frameName)
20 | frame:EnableMove(tonumber(config['move'] or '1'))
21 | frame:EnableHitTest(1)
22 | frame:EnableHittestFrame(1)
23 | frame:SetLayerLevel(32) -- クエスト一覧より高く
24 |
25 | if (#self.Handles == 0) then
26 | frame:ShowWindow(0)
27 | return
28 | end
29 |
30 | if (skillConfig and skillConfig['loc_frame']) then
31 | frame:SetOffset(skillConfig['loc_frame'].x, skillConfig['loc_frame'].y)
32 | else
33 | frame:SetOffset(450, 300)
34 | end
35 |
36 | DESTROY_CHILD_BYNAME(frame, 'PTINFO_')
37 | for i, handle in ipairs(self.Handles) do
38 | local ctrlName = 'PTINFO_'.. handle
39 | local partyInfoCtrlSet = frame:CreateOrGetControlSet('partyinfo', ctrlName, -40, (i - 1) * 50)
40 | tolua.cast(partyInfoCtrlSet, "ui::CControlSet")
41 | partyInfoCtrlSet:EnableHitTestSet(0)
42 | -- リーダーマーク消し
43 | local leaderMark = GET_CHILD(partyInfoCtrlSet, "leader_img", "ui::CPicture")
44 | leaderMark:SetImage('None_Mark')
45 | leaderMark:ShowWindow(0)
46 | -- 名前
47 | local nameRichText = tolua.cast(partyInfoCtrlSet:GetChild('name_text'), "ui::CRichText")
48 | nameRichText:SetTextByKey("name", config.title or targetName)
49 | -- レベル
50 | local lvbox = partyInfoCtrlSet:GetChild('lvbox')
51 | local levelRichText = tolua.cast(lvbox, "ui::CRichText")
52 | levelRichText:SetTextByKey("lv", info.GetLevel(handle))
53 | lvbox:Resize(levelRichText:GetWidth(), lvbox:GetHeight())
54 | -- HP
55 | local stat = info.GetStat(handle)
56 | local hpGauge = GET_CHILD(partyInfoCtrlSet, "hp", "ui::CGauge")
57 | hpGauge:SetPoint(stat.HP, stat.maxHP)
58 | -- バフ/デバフ
59 | local buffListSlotSet = GET_CHILD(partyInfoCtrlSet, "buffList", "ui::CSlotSet")
60 | local debuffListSlotSet = GET_CHILD(partyInfoCtrlSet, "debuffList", "ui::CSlotSet")
61 | local buffCount = info.GetBuffCount(handle)
62 | local buffIndex = 0;
63 | local debuffIndex = 0;
64 | for i = 0, buffCount - 1 do
65 | local buff = info.GetBuffIndexed(handle, i)
66 | local cls = GetClassByType("Buff", buff.buffID)
67 | local slot = nil;
68 | if cls.Group1 == 'Buff' then
69 | slot = buffListSlotSet:GetSlotByIndex(buffIndex);
70 | buffIndex = buffIndex + 1;
71 | elseif cls.Group1 == 'Debuff' then
72 | slot = debuffListSlotSet:GetSlotByIndex(debuffIndex);
73 | debuffIndex = debuffIndex + 1;
74 | end
75 | if slot ~= nil then
76 | local icon = slot:GetIcon()
77 | if icon == nil then
78 | icon = CreateIcon(slot)
79 | end
80 | icon:SetDrawCoolTimeText(math.floor(buff.time/1000))
81 | slot:SetText("")
82 | if buff.over > 1 then
83 | slot:SetText('{s13}{ol}{b}'..buff.over, 'count', ui.RIGHT, ui.BOTTOM, 1, 2)
84 | end
85 | icon:SetTooltipType('buff')
86 | icon:SetTooltipArg(handle, cls.ClassID, "")
87 | local imageName = 'icon_' .. cls.Icon
88 | icon:Set(imageName, 'BUFF', cls.ClassID, 0)
89 | slot:ShowWindow(1)
90 | end
91 | end
92 | end
93 | frame:Resize(frame:GetOriginalWidth(), (#self.Handles) * 50 + 10)
94 | frame:ShowWindow(1)
95 | frame:SetEventScript(ui.LBUTTONUP, 'SUMMONCOUNTER_ON_END_DRAG')
96 | frame:SetEventScriptArgString(ui.LBUTTONUP, self.Key)
97 | frame:SetEventScript(ui.RBUTTONUP, 'SUMMONCOUNTER_ON_RBUTTONUP')
98 | end
99 |
100 | -- おまじない
101 | return setmetatable(members, {__index = self})
102 | end
103 | setmetatable(ModeExtend, {__call = ModeExtend.new})
104 |
105 | function SUMMONCOUNTER_EXTEND_ON_INIT(addon, frame) end
106 |
--------------------------------------------------------------------------------
/fixbookread/fixbookread.lua:
--------------------------------------------------------------------------------
1 | function FIXBOOKREAD_ON_INIT(addon, frame)
2 | -- copy base from bookitemread.lua
3 | VIEW_BOOKITEM_PAGE = function(frame, page)
4 | local textObj = GET_CHILD(frame, "text_left", "ui::CFlowText");
5 | local textObj2 = GET_CHILD(frame, "text_right", "ui::CFlowText");
6 |
7 | textObj:SetText(' ');
8 | textObj:ClearText();
9 | textObj2:SetText(' ');
10 | textObj2:ClearText();
11 |
12 | local dialogTable = GetClass( 'DialogText', g_bookClassName);
13 |
14 | if dialogTable == nil then
15 | COLSE_BOOK_ITEM(frame);
16 | return;
17 | end
18 |
19 | local text = dialogTable.Text;
20 | local textL = '';
21 | local textR = '';
22 | for i = 1, page do
23 |
24 | textL = '';
25 | textR = '';
26 | -- left
27 | local index = BookTextFind(text, "{np}");
28 | if index == -1 then
29 | g_maxBookPage = page;
30 | textL = BookTextSubString(text, 0, string.len(text));
31 | break;
32 | end
33 |
34 | textL = BookTextSubString(text, 0, index +4);
35 | text = BookTextSubString(text, index + 4, string.len(text));
36 |
37 | -- check MAX_BOOK_TEXT_LEN
38 | if string.len(textL) > MAX_BOOK_TEXT_LEN then
39 | local tempStr = '';
40 | local beforeStr = '';
41 | local curStr = '';
42 | for j = 1, 100 do
43 | index = BookTextFind(textL, "{nl}");
44 | if string.len(curStr) > MAX_BOOK_TEXT_LEN then
45 |
46 | text = tempStr .. textL .. text;
47 | textL = beforeStr .. '{np}';
48 | break;
49 | elseif index == -1 then
50 |
51 | text = textL .. text;
52 | textL = curStr .. '{np}';
53 | break;
54 | end
55 |
56 | beforeStr = beforeStr .. tempStr;
57 | tempStr = BookTextSubString(textL, 0, index + 4);
58 | curStr = beforeStr .. tempStr;
59 |
60 | textL = BookTextSubString(textL, index + 4, string.len(textL));
61 | end
62 | end
63 | ----------------
64 |
65 |
66 | -- right
67 | index = BookTextFind(text, "{np}");
68 | if index == -1 then
69 | g_maxBookPage = page;
70 | textR = BookTextSubString(text, 0, string.len(text));
71 | break;
72 | end
73 | textR = BookTextSubString(text, 0, index +4);
74 | text = BookTextSubString(text, index + 4, string.len(text));
75 |
76 | -- check MAX_BOOK_TEXT_LEN
77 | if string.len(textR) > MAX_BOOK_TEXT_LEN then
78 | local tempStr = '';
79 | local beforeStr = '';
80 | local curStr = '';
81 | for j = 1, 100 do
82 | index = BookTextFind(textR, "{nl}");
83 | if string.len(curStr) > MAX_BOOK_TEXT_LEN then
84 |
85 | text = tempStr .. textR .. text;
86 | textR = beforeStr .. '{np}';
87 | break;
88 | elseif index == -1 then
89 |
90 | text = textR .. text;
91 | textR = curStr .. '{np}';
92 | break;
93 | end
94 |
95 | beforeStr = beforeStr .. tempStr;
96 | tempStr = BookTextSubString(textR, 0, index + 4);
97 | curStr = beforeStr .. tempStr;
98 |
99 | textR = BookTextSubString(textR, index + 4, string.len(textR));
100 | end
101 | end
102 | -----------
103 | end
104 |
105 | --TestNotePad(textR)
106 |
107 | -- fix code below.
108 | index = BookTextFind(textL, "{np}");
109 | textL = BookTextSubString(textL, 0, index);
110 | index = BookTextFind(textR, "{np}");
111 | textR = BookTextSubString(textR, 0, index);
112 | -- fix code above.
113 |
114 | textObj:SetText(textL);
115 | textObj:SetFontName('bookfont');
116 | textObj:SetFlowSpeed(200);
117 |
118 | textObj2:SetText(textR);
119 | textObj2:SetFontName('bookfont');
120 | textObj2:SetFlowSpeed(200);
121 |
122 |
123 | local prevBtn = GET_CHILD(frame, "prevBtn", "ui::CButton");
124 | local nextBtn = GET_CHILD(frame, "nextBtn", "ui::CButton");
125 |
126 | if g_bookPage == 1 then
127 | prevBtn:ShowWindow(0);
128 | nextBtn:ShowWindow(1);
129 | elseif g_maxBookPage > 0 and g_bookPage == g_maxBookPage then
130 | prevBtn:ShowWindow(1);
131 | nextBtn:ShowWindow(0);
132 | else
133 | prevBtn:ShowWindow(1);
134 | nextBtn:ShowWindow(1);
135 | end
136 | end
137 | end
--------------------------------------------------------------------------------
/skillitemcounter/addon_d.ipf/skillitemcounter/skillitemcounter.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'skillitemcounter'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 |
14 | -- initialize members.
15 | local members = {};
16 |
17 | members.Refresh = function(self, frame, index, skill, invItem)
18 | local slot = GET_CHILD_RECURSIVELY(frame, "slot"..(index + 1), "ui::CSlot");
19 | local skillUseCount = slot:CreateOrGetControl('richtext', "skillUseCount", 0, 0, 20, 10);
20 | tolua.cast(skillUseCount, "ui::CRichText");
21 | local itemCount = invItem.count;
22 |
23 | local skillCost = SCR_GET_SPENDITEM_COUNT(skill);
24 | local skillName = string.match(skill.ClassName, '^.-%_(.+)')
25 | local skillNameEsp = _G['SCR_GET_SPENDITEM_COUNT_'..skillName]
26 | if (type(skillNameEsp) ~= 'nil') then
27 | skillCost = skillNameEsp(skill)
28 | end
29 |
30 | self:Dbg(skillName..' '..itemCount..' '..skill.SpendItemBaseCount..' '..skill.SpendItemCount)
31 |
32 | skillUseCount:SetText("{ol}{s12}"..math.floor(itemCount / skillCost));
33 | skillUseCount:SetOffset(slot:GetWidth() - skillUseCount:GetWidth(), 0);
34 | end
35 |
36 | members.RefreshPoison = function(self, frame, index, skillCost, itemCount)
37 | local slot = GET_CHILD_RECURSIVELY(frame, "slot"..(index + 1), "ui::CSlot");
38 | local skillUseCount = slot:CreateOrGetControl('richtext', "skillUseCount", 0, 0, 20, 10);
39 | tolua.cast(skillUseCount, "ui::CRichText");
40 | skillUseCount:SetText("{ol}{s12}"..math.floor(itemCount / skillCost));
41 | skillUseCount:SetOffset(slot:GetWidth() - skillUseCount:GetWidth(), 0);
42 | end
43 |
44 | -- ログ出力
45 | members.Dbg = function(self, msg)
46 | -- CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
47 | end
48 | members.Log = function(self, msg)
49 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
50 | end
51 | members.Err = function(self, msg)
52 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
53 | end
54 |
55 | members.Destroy = function(self)
56 | QUICKSLOTNEXPBAR_ON_DROP = g.instance.QUICKSLOTNEXPBAR_ON_DROP;
57 | g.instance.QUICKSLOTNEXPBAR_ON_DROP = nil;
58 | end
59 | return setmetatable(members, {__index = self});
60 | end
61 | -- set call.
62 | setmetatable(g, {__call = g.new})
63 |
64 | -- frame initialize.
65 | function SKILLITEMCOUNTER_ON_INIT(addon, frame)
66 | if (g.instance.QUICKSLOTNEXPBAR_ON_DROP == nil) then
67 | g.instance.QUICKSLOTNEXPBAR_ON_DROP = QUICKSLOTNEXPBAR_ON_DROP;
68 | end
69 | QUICKSLOTNEXPBAR_ON_DROP = function(frame, control, argStr, argNum)
70 | g.instance.QUICKSLOTNEXPBAR_ON_DROP(frame, control, argStr, argNum);
71 | SKILLITEMCOUNTER_REFRESH_KICKER();
72 | end
73 | addon:RegisterMsg('GAME_START_3SEC', 'SKILLITEMCOUNTER_REFRESH');
74 | addon:RegisterMsg('INV_ITEM_CHANGE_COUNT', 'SKILLITEMCOUNTER_REFRESH');
75 | end
76 |
77 | -- refresh.
78 | function SKILLITEMCOUNTER_REFRESH(frame, msg, argStr, argNum)
79 | DebounceScript("SKILLITEMCOUNTER_REFRESH_KICKER", 0.1);
80 | end
81 |
82 | function SKILLITEMCOUNTER_REFRESH_KICKER()
83 | SKILLITEMCOUNTER_REFRESH_COUNTER(ui.GetFrame('quickslotnexpbar'))
84 | SKILLITEMCOUNTER_REFRESH_COUNTER(ui.GetFrame('joystickquickslot'))
85 | end
86 |
87 | --
88 | function SKILLITEMCOUNTER_REFRESH_COUNTER(frame)
89 | for i = 0, MAX_QUICKSLOT_CNT - 1 do
90 | local quickSlotInfo = quickslot.GetInfoByIndex(i)
91 | if (quickSlotInfo.category == 'Skill') then
92 | local skl = GetClassByType("Skill", quickSlotInfo.type);
93 | local skillitem = skl.SpendItem;
94 | if (skillitem ~= "None") then
95 | local invenItemInfo = session.GetInvItemByName(skillitem);
96 | g.instance:Refresh(frame, i, skl, invenItemInfo);
97 | end
98 | local skillPoison = SCR_Get_SpendPoison(skl);
99 | if (skillPoison ~= 0) then
100 | local etc = GetMyEtcObject();
101 | g.instance:RefreshPoison(frame, i, skillPoison, etc.Wugushi_PoisonAmount);
102 | end
103 | else
104 | local slot = GET_CHILD_RECURSIVELY(frame, "slot"..(i + 1), "ui::CSlot");
105 | DESTROY_CHILD_BYNAME(slot, "skillUseCount");
106 | end
107 | end
108 | end
109 |
110 | -- インスタンス作成
111 | if (g.instance ~= nil) then
112 | g.instance:Destroy()
113 | end
114 | g.instance = g()
115 |
--------------------------------------------------------------------------------
/console/addon_d.ipf/console/console.lua:
--------------------------------------------------------------------------------
1 | Console = {};
2 |
3 | -- constructor.
4 | function Console.new(self)
5 | -- initialize members.
6 | local members = {};
7 | members.path = "../addons/console/cfunc.txt";
8 | members.cfunc = {};
9 | -- execute search.
10 | members.Execute = function(self)
11 | CHAT_SYSTEM("Console search start.");
12 |
13 | io.output("console.txt");
14 | self:Out("[_G]", -1);
15 |
16 | -- ordered by key
17 | local tkeys = {}
18 | for k in pairs(_G) do table.insert(tkeys, k) end
19 | table.sort(tkeys)
20 |
21 | for _, k in ipairs(tkeys) do
22 | local v = _G[k]
23 | if (k ~= "_G") and (k ~= "io") and (k ~= "file") and (k ~= "DEVLOADER") then
24 | self:Search(nil, k, v, 0);
25 | io.flush();
26 | end
27 | end
28 | io.output();
29 | io.flush();
30 |
31 | CHAT_SYSTEM("Console search end.");
32 | end
33 |
34 | -- search.
35 | members.Search = function(self, parent, key, value, depth, f)
36 | if type(value) == "function" then
37 | if (string.find(key, "__", 1, true) == 1) then
38 | return;
39 | end
40 | local di = debug.getinfo(value);
41 | local fi = "cfunc(?)";
42 | if (di.what ~= "C") then
43 | --fi = di.short_src;
44 | fi = string.format("function(%s)", table.concat(debug.getparams(value), ", "));
45 | else
46 | local fi2t = cons.cfunc[parent];
47 | if (fi2t ~= nil) then
48 | fi = "function("..fi2t[key]..")";
49 | end
50 | end
51 | self:Out("["..key.."]".." = "..fi, depth);
52 | return;
53 | end
54 | if type(value) == "table" then
55 | if (key == "tolua_ubox") or (key == "jit.opt_inline") or (key == "package") or (key == "jit") then
56 | self:Out("["..key.."]".." = "..type(value).." is skipped.", depth);
57 | return;
58 | end
59 | self:Out("["..key.."]".." = "..type(value).."("..#value..")".." {", depth);
60 |
61 | -- remove duplication
62 | if #value > 1 then
63 | value = { value[1] }
64 | end
65 |
66 | depth = depth + 1;
67 |
68 | -- ordered by key
69 | local tkeys = {}
70 | for k in pairs(value) do table.insert(tkeys, k) end
71 | table.sort(tkeys)
72 |
73 | for _, k in ipairs(tkeys) do
74 | self:Search(key, k, value[k], depth);
75 | end
76 | depth = depth - 1;
77 | self:Out("} //".."["..key.."]", depth);
78 | return;
79 | end
80 | if type(value) == "userdata" then
81 | self:Out("["..key.."]".." = "..type(value).." {", depth);
82 | depth = depth + 1;
83 | for k, v in pairs(getmetatable(value)) do
84 | self:Search(key, k, v, depth);
85 | end
86 | depth = depth - 1;
87 | self:Out("} //".."["..key.."]", depth);
88 | return;
89 | end
90 | self:Out("["..key.."]".." = "..tostring(value), depth);
91 | end
92 |
93 | -- output.
94 | members.Out = function(self, text, depth)
95 | local bk = "";
96 | for i = 0, depth do
97 | bk = bk.."..";
98 | end
99 | --CHAT_SYSTEM(bk..text);
100 | io.write(bk..text.."\n");
101 | end
102 |
103 | -- destroy.
104 | members.Destroy = function(self)
105 | end
106 | return setmetatable(members, {__index = self});
107 | end
108 | -- set call.
109 | setmetatable(Console, {__call = Console.new});
110 |
111 | function CONSOLE_ON_INIT(addon, frame)
112 | if (cons.UI_CHAT == nil) then
113 | cons.UI_CHAT = UI_CHAT;
114 | end
115 | UI_CHAT = function(msg)
116 | if (msg == "/console") then
117 | cons:Execute();
118 | return;
119 | end
120 | cons.UI_CHAT(msg);
121 | end
122 | -- load config.
123 | dofile(cons.path);
124 | end
125 |
126 | -- powered by https://facepunch.com/showthread.php?t=884409
127 | function debug.getparams(f)
128 | local co = coroutine.create(f)
129 | local params = {}
130 | debug.sethook(co, function()
131 | local i, k = 1, debug.getlocal(co, 2, 1)
132 | while k do
133 | if k ~= "(*temporary)" then
134 | table.insert(params, k)
135 | end
136 | i = i+1
137 | k = debug.getlocal(co, 2, i)
138 | end
139 | error("~~end~~")
140 | end, "c")
141 | local res, err = coroutine.resume(co)
142 | if res then
143 | error("The function provided defies the laws of the universe.", 2)
144 | elseif string.sub(tostring(err), -7) ~= "~~end~~" then
145 | error("The function failed with the error: "..tostring(err), 2)
146 | end
147 | return params
148 | end
149 | -- end
150 |
151 | -- create instance.
152 | if (cons ~= nil) then
153 | cons:Destroy();
154 | end
155 | cons = Console();
156 |
--------------------------------------------------------------------------------
/minigaugetext/addon_d.ipf/minigaugetext/minigaugetext.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'minigaugetext'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {}
14 |
15 | local __ADDON_DIR = '../addons/'..addonName
16 | local DEFAULT_SIZE = 11
17 | local DEFAULT_COLOR = '#FFFFFF'
18 |
19 | members.__config = {}
20 |
21 | -- HP/SP情報を更新する
22 | -- 本当はCGauge:AddStatでやりたいが、フォントサイズが12以下だと反映されない
23 | -- かつ、%vが100にしかならない?よくわからないξ・~ ・๑Ҙ
24 | members.Update = function(self, handle)
25 | -- CHAT_SYSTEM('hadle = '..handle)
26 | local frame = ui.GetFrame("charbaseinfo1_"..handle)
27 | if (not frame) then
28 | return
29 | end
30 | local hp = frame:GetChild("pcHpGauge")
31 | tolua.cast(hp, "ui::CGauge")
32 | local sp = frame:GetChild("pcSpGauge")
33 | tolua.cast(sp, "ui::CGauge")
34 |
35 | local size = DEFAULT_SIZE
36 | local color = DEFAULT_COLOR
37 | local spcolor = DEFAULT_COLOR
38 |
39 | if (handle == 'my') then
40 | handle = session.GetMyHandle()
41 | size = self.__config['size'] or DEFAULT_SIZE
42 | color = self.__config['color'] or DEFAULT_COLOR
43 | spcolor = self.__config['spcolor'] or DEFAULT_COLOR
44 | else
45 | size = self.__config['ptsize'] or DEFAULT_SIZE
46 | color = self.__config['ptcolor'] or DEFAULT_COLOR
47 | spcolor = self.__config['ptspcolor'] or DEFAULT_COLOR
48 | end
49 | local stat = info.GetStat(handle)
50 |
51 | local hptext = frame:CreateOrGetControl("richtext", "hptext", 0, 0, hp:GetWidth(), hp:GetHeight())
52 | hptext:SetText(string.format('{s%d}{ol}{%s}%d/%d', size, color, stat.HP, stat.maxHP))
53 | hptext:SetGravity(ui.RIGHT, ui.TOP);
54 | hptext:SetOffset(hp:GetX(), hp:GetY() - 8 - (size - DEFAULT_SIZE))
55 |
56 | local sptext = frame:CreateOrGetControl("richtext", "sptext", 0, 0, sp:GetWidth(), sp:GetHeight())
57 | sptext:SetText(string.format('{s%d}{ol}{%s}%d/%d', size, spcolor, stat.SP, stat.maxSP))
58 | sptext:SetGravity(ui.RIGHT, ui.TOP);
59 | sptext:SetOffset(sp:GetX(), sp:GetY() + 10)
60 |
61 | -- 面倒なのでこれでいいやξ・~ ・๑Ҙ
62 | local checkStaGauge = frame:GetChild('pcStaGauge')
63 | if (checkStaGauge ~= nil) then
64 | sptext:SetOffset(sp:GetX(), sp:GetY() + 19)
65 | end
66 | -- 称号
67 | local achieve = frame:GetChild('achieveName')
68 | if (achieve:GetText() ~= "None") then
69 | achieve:SetMargin(0, 46 + 12, 0, 0)
70 | end
71 | -- ギルド名とちょっとかぶるので...
72 | local guildinfo = frame:GetChild('guildName')
73 | if (guildinfo:GetText() ~= "None") then
74 | MINIGAUGETEXT_ON_UPDATE_GUILDINFO = function(ctrl)
75 | local parent = ctrl:GetTopParentFrame()
76 | local emblem = parent:GetChild('guildEmblem')
77 | emblem:SetOffset(parent:GetChild("pcSpGauge"):GetX() - 30, emblem:GetY())
78 | local edge = parent:GetChild('guildEmblem_edge')
79 | edge:SetOffset(emblem:GetX() - 1, emblem:GetY() - 1)
80 | ctrl:SetOffset(0, emblem:GetY() + emblem:GetHeight() - 20)
81 | return 1
82 | end
83 | guildinfo:RunUpdateScript('MINIGAUGETEXT_ON_UPDATE_GUILDINFO')
84 | end
85 | end
86 |
87 | members.LoadConfig = function(self)
88 | self.__config = self:Deserialize('settings.txt') or {}
89 | end
90 |
91 | -- デシリアライズ
92 | members.Deserialize = function(self, fileName)
93 | local filePath = string.format('%s/%s', __ADDON_DIR, fileName)
94 | local f, e = io.open(filePath, 'r')
95 | if (e) then
96 | return nil
97 | end
98 | f:close()
99 | local s, e = pcall(dofile, filePath)
100 | if (not s) then
101 | CHAT_SYSTEM(e)
102 | end
103 | return e
104 | end
105 |
106 | -- デストラクター
107 | members.Destroy = function(self)
108 | if (self.UPDATE_PARTYINFO_HP ~= nil) then
109 | UPDATE_PARTYINFO_HP = self.UPDATE_PARTYINFO_HP
110 | end
111 | end
112 | -- おまじない
113 | return setmetatable(members, {__index = self})
114 | end
115 | -- .newなしでコンストラクターを呼ぶエイリアス登録
116 | setmetatable(g, {__call = g.new});
117 |
118 | -- 自フレーム初期化処理
119 | function MINIGAUGETEXT_ON_INIT(addon, frame)
120 | g.instance:LoadConfig()
121 |
122 | addon:RegisterMsg('STAT_UPDATE', 'MINIGAUGETEXT_STAT_UPDATE');
123 | addon:RegisterMsg('TAKE_DAMAGE', 'MINIGAUGETEXT_STAT_UPDATE');
124 | addon:RegisterMsg('TAKE_HEAL', 'MINIGAUGETEXT_STAT_UPDATE');
125 | --addon:RegisterMsg('FPS_UPDATE', 'MINIGAUGETEXT_STAT_UPDATE_OTHERS');
126 |
127 | -- PTメンバー表示用
128 | if (g.instance.UPDATE_PARTYINFO_HP == nil) then
129 | g.instance.UPDATE_PARTYINFO_HP = UPDATE_PARTYINFO_HP
130 | end
131 | UPDATE_PARTYINFO_HP = function(partyInfoCtrlSet, partyMemberInfo)
132 | g.instance.UPDATE_PARTYINFO_HP(partyInfoCtrlSet, partyMemberInfo)
133 | g.instance:Update(partyMemberInfo:GetHandle())
134 | end
135 |
136 | MINIGAUGETEXT_STAT_UPDATE()
137 | end
138 |
139 | -- HP/SP変化のイベントハンドラー
140 | function MINIGAUGETEXT_STAT_UPDATE()
141 | g.instance:Update('my')
142 | end
143 |
144 | -- HP/SP変化のイベントハンドラー(他人)
145 | -- (あきらめたやつ
146 | function MINIGAUGETEXT_STAT_UPDATE_OTHERS()
147 | local list, count = SelectBaseObject(GetMyPCObject(), 300, 'ALL')
148 | for i = 1 , count do
149 | local obj = list[i];
150 | local iesObj = GetBaseObjectIES(obj)
151 | if (iesObj.ClassName == 'PC') then
152 | local actor = tolua.cast(obj, "CFSMActor")
153 | local handle = actor:GetHandleVal()
154 | g.instance:Update(handle)
155 | end
156 | end
157 | end
158 |
159 | -- インスタンス作成
160 | if (g.instance ~= nil) then
161 | g.instance:Destroy()
162 | end
163 | g.instance = g()
164 |
--------------------------------------------------------------------------------
/summoncounter/list_dicid.txt:
--------------------------------------------------------------------------------
1 | QUEST_20150317
2 | QUEST_20150323
3 | QUEST_20150401
4 | QUEST_20150406
5 | QUEST_20150414
6 | QUEST_20150428
7 | QUEST_20150511
8 | QUEST_20150714
9 | QUEST_20150715
10 | QUEST_20150717
11 | QUEST_20150729
12 | QUEST_20150730
13 | QUEST_20150803
14 | QUEST_20150804
15 | QUEST_20150811
16 | QUEST_20150904
17 | QUEST_20151014
18 | QUEST_20151028
19 | QUEST_20151112
20 | QUEST_20151223
21 | QUEST_20160128
22 | QUEST_20160225
23 | QUEST_20160512
24 | QUEST_20160622
25 | QUEST_20160906
26 | QUEST_20161010
27 | QUEST_20161012
28 | QUEST_20161021
29 | QUEST_20161104
30 | QUEST_20161110
31 | QUEST_20161209
32 | QUEST_20161215
33 | QUEST_20170201
34 | QUEST_20170203
35 | QUEST_20170228
36 | QUEST_20170309
37 | QUEST_20170323
38 | QUEST_20170418
39 | QUEST_20170425
40 | QUEST_20170515
41 | QUEST_20170719
42 | QUEST_20170721
43 | QUEST_20170808
44 | QUEST_20170816
45 | QUEST_20170913
46 | QUEST_20170919
47 | QUEST_20170921
48 | QUEST_20170925
49 | QUEST_20170928
50 | QUEST_20171012
51 | QUEST_20171019
52 | QUEST_20171023
53 | QUEST_20171024
54 | QUEST_20171110
55 | QUEST_20171120
56 | QUEST_20171130
57 | QUEST_20171206
58 | QUEST_20180118
59 | QUEST_20180122
60 | QUEST_20180131
61 | QUEST_20180205
62 | QUEST_20180207
63 | QUEST_20180220
64 | QUEST_20180323
65 | QUEST_20180404
66 | QUEST_20180517
67 | QUEST_20180614
68 | QUEST_20180706
69 | QUEST_20180814
70 | QUEST_20180906
71 | QUEST_20181026
72 | QUEST_20181115
73 | QUEST_20190117
74 | QUEST_20190130
75 | QUEST_JOBSTEP_20150317
76 | QUEST_JOBSTEP_20150323
77 | QUEST_JOBSTEP_20150401
78 | QUEST_JOBSTEP_20150406
79 | QUEST_JOBSTEP_20150414
80 | QUEST_JOBSTEP_20150428
81 | QUEST_JOBSTEP_20150511
82 | QUEST_JOBSTEP_20150714
83 | QUEST_JOBSTEP_20150717
84 | QUEST_JOBSTEP_20150729
85 | QUEST_JOBSTEP_20150730
86 | QUEST_JOBSTEP_20150803
87 | QUEST_JOBSTEP_20150811
88 | QUEST_LV_0100_20150317
89 | QUEST_LV_0100_20150323
90 | QUEST_LV_0100_20150401
91 | QUEST_LV_0100_20150406
92 | QUEST_LV_0100_20150414
93 | QUEST_LV_0100_20150428
94 | QUEST_LV_0100_20150511
95 | QUEST_LV_0100_20150714
96 | QUEST_LV_0100_20150717
97 | QUEST_LV_0100_20150729
98 | QUEST_LV_0100_20150730
99 | QUEST_LV_0100_20150803
100 | QUEST_LV_0100_20150804
101 | QUEST_LV_0100_20150811
102 | QUEST_LV_0100_20150904
103 | QUEST_LV_0100_20151014
104 | QUEST_LV_0100_20151028
105 | QUEST_LV_0100_20151112
106 | QUEST_LV_0100_20151223
107 | QUEST_LV_0100_20160128
108 | QUEST_LV_0100_20160225
109 | QUEST_LV_0100_20160512
110 | QUEST_LV_0100_20160622
111 | QUEST_LV_0100_20160906
112 | QUEST_LV_0100_20161012
113 | QUEST_LV_0100_20161110
114 | QUEST_LV_0100_20161215
115 | QUEST_LV_0100_20170228
116 | QUEST_LV_0100_20170309
117 | QUEST_LV_0100_20170418
118 | QUEST_LV_0100_20170515
119 | QUEST_LV_0100_20170808
120 | QUEST_LV_0100_20170816
121 | QUEST_LV_0100_20170919
122 | QUEST_LV_0100_20171110
123 | QUEST_LV_0100_20171130
124 | QUEST_LV_0100_20180205
125 | QUEST_LV_0100_20180323
126 | QUEST_LV_0100_20180706
127 | QUEST_LV_0100_20180906
128 | QUEST_LV_0100_20181101
129 | QUEST_LV_0100_20181115
130 | QUEST_LV_0100_20190117
131 | QUEST_LV_0200_20150317
132 | QUEST_LV_0200_20150323
133 | QUEST_LV_0200_20150401
134 | QUEST_LV_0200_20150406
135 | QUEST_LV_0200_20150414
136 | QUEST_LV_0200_20150428
137 | QUEST_LV_0200_20150511
138 | QUEST_LV_0200_20150714
139 | QUEST_LV_0200_20150717
140 | QUEST_LV_0200_20150729
141 | QUEST_LV_0200_20150730
142 | QUEST_LV_0200_20150803
143 | QUEST_LV_0200_20150811
144 | QUEST_LV_0200_20150904
145 | QUEST_LV_0200_20151014
146 | QUEST_LV_0200_20151028
147 | QUEST_LV_0200_20151112
148 | QUEST_LV_0200_20151223
149 | QUEST_LV_0200_20160128
150 | QUEST_LV_0200_20160225
151 | QUEST_LV_0200_20160512
152 | QUEST_LV_0200_20160622
153 | QUEST_LV_0200_20160718
154 | QUEST_LV_0200_20161012
155 | QUEST_LV_0200_20161110
156 | QUEST_LV_0200_20170309
157 | QUEST_LV_0200_20170418
158 | QUEST_LV_0200_20170515
159 | QUEST_LV_0200_20170808
160 | QUEST_LV_0200_20170919
161 | QUEST_LV_0200_20171110
162 | QUEST_LV_0200_20180205
163 | QUEST_LV_0200_20180323
164 | QUEST_LV_0200_20180517
165 | QUEST_LV_0200_20180706
166 | QUEST_LV_0200_20180906
167 | QUEST_LV_0200_20180928
168 | QUEST_LV_0200_20190117
169 | QUEST_LV_0300_20150323
170 | QUEST_LV_0300_20150717
171 | QUEST_LV_0300_20150729
172 | QUEST_LV_0300_20150730
173 | QUEST_LV_0300_20150803
174 | QUEST_LV_0300_20150904
175 | QUEST_LV_0300_20151014
176 | QUEST_LV_0300_20151028
177 | QUEST_LV_0300_20151112
178 | QUEST_LV_0300_20151223
179 | QUEST_LV_0300_20160128
180 | QUEST_LV_0300_20160512
181 | QUEST_LV_0300_20160622
182 | QUEST_LV_0300_20160906
183 | QUEST_LV_0300_20161012
184 | QUEST_LV_0300_20161110
185 | QUEST_LV_0300_20170116
186 | QUEST_LV_0300_20170309
187 | QUEST_LV_0300_20170418
188 | QUEST_LV_0300_20170515
189 | QUEST_LV_0300_20170808
190 | QUEST_LV_0300_20171110
191 | QUEST_LV_0300_20171120
192 | QUEST_LV_0300_20171130
193 | QUEST_LV_0300_20180323
194 | QUEST_LV_0300_20180706
195 | QUEST_LV_0300_20180906
196 | QUEST_LV_0300_20180928
197 | QUEST_LV_0300_20190117
198 | QUEST_LV_0400_20161012
199 | QUEST_LV_0400_20161110
200 | QUEST_LV_0400_20170309
201 | QUEST_LV_0400_20170418
202 | QUEST_LV_0400_20171110
203 | QUEST_LV_0400_20171120
204 | QUEST_LV_0400_20180205
205 | QUEST_LV_0400_20180323
206 | QUEST_LV_0400_20180517
207 | QUEST_LV_0400_20180821
208 | QUEST_LV_0400_20180906
209 | QUEST_LV_0400_20181115
210 | QUEST_LV_0400_20181129
211 | QUEST_LV_0400_20190117
212 | QUEST_UNUSED_20150317
213 | QUEST_UNUSED_20150323
214 | QUEST_UNUSED_20150714
215 | QUEST_UNUSED_20150717
216 | QUEST_UNUSED_20150729
217 | QUEST_UNUSED_20150730
218 | QUEST_UNUSED_20150803
219 | QUEST_UNUSED_20150804
220 | QUEST_UNUSED_20150811
221 | QUEST_UNUSED_20150904
222 | QUEST_UNUSED_20150911
223 | QUEST_UNUSED_20151014
224 | QUEST_UNUSED_20151028
225 | QUEST_UNUSED_20151112
226 | QUEST_UNUSED_20151119
227 | QUEST_UNUSED_20151223
228 | QUEST_UNUSED_20160622
229 | QUEST_UNUSED_20160906
230 | QUEST_UNUSED_20161012
231 | QUEST_UNUSED_20170418
232 | QUEST_UNUSED_20180323
233 | QUEST_UNUSED_20190117
--------------------------------------------------------------------------------
/masterplace/masterplace.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'masterplace'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | -- 収集したマスター情報
16 | members.__masterInfo = {}
17 |
18 | -- マスター情報を収集
19 | -- 全マップの表示されている(Hide == 0)NPCのうち、特定のキーワードに一致するものを集める
20 | members.CollectMasterInfo = function(self)
21 | local clsList, cnt = GetClassList('Map')
22 | if cnt == 0 or clsList == nil then
23 | self:Err('Missing Map class list.')
24 | return
25 | end
26 |
27 | self.__masterInfo = {}
28 |
29 | local __insertMasterInfo = function(self, classAbbr, mapName, Name)
30 | -- self:Dbg(classAbbr..'-'..masterOrSub..' in '..map.Name)
31 | -- self:Dbg(genobj.Name)
32 | if (classAbbr == 'BKR') then
33 | classAbbr = 'BOK'
34 | end
35 | if (classAbbr == 'MIKO') then
36 | classAbbr = 'MKO'
37 | end
38 | if (self.__masterInfo[classAbbr] == nil) then
39 | self.__masterInfo[classAbbr] = {}
40 | end
41 | local info = {}
42 | info['map'] = mapName
43 | info['name'] = Name
44 | table.insert(self.__masterInfo[classAbbr], info)
45 | end
46 |
47 | for i = 0, cnt - 1 do
48 | local map = GetClassByIndexFromList(clsList, i)
49 | local genList = SCR_GET_XML_IES('GenType_'..map.ClassName, 'Hide', 0)
50 | for i = 1, #genList do
51 | local genobj = genList[i]
52 | -- 基本パターンは以下の二種類
53 | -- npc_***_master
54 | -- npc_***_sub_master
55 | local classAbbr, masterOrSub = string.match(genobj.ClassType, '^npc_(%u-)_([master|sub])')
56 | if (masterOrSub ~= nil) then
57 | __insertMasterInfo(self, classAbbr, map.Name, genobj.Name)
58 | end
59 | -- アーチャー以外の基礎クラスはちょっと特殊なんだけどしねばいいとおもうよ
60 | -- クレリック
61 | local classAbbr = string.match(genobj.ClassType, '^npc_(healer)$')
62 | if (classAbbr ~= nil) then
63 | __insertMasterInfo(self, 'CLR', map.Name, genobj.Name)
64 | end
65 | -- ソードマン
66 | local classAbbr = string.match(genobj.ClassType, '^swordmaster$')
67 | if (classAbbr ~= nil) then
68 | __insertMasterInfo(self, 'WAR', map.Name, genobj.Name)
69 | end
70 | -- ウィザード
71 | local classAbbr = string.match(genobj.ClassType, '^wizardmaster$')
72 | if (classAbbr ~= nil) then
73 | __insertMasterInfo(self, 'WIZ', map.Name, genobj.Name)
74 | end
75 | end
76 | end
77 |
78 | -- クラペダ隣接の下記マップはMap.iesから取れないみたい???
79 | -- なのでちょっと調べて直書きこれもしねばいいとおもうよ
80 |
81 | -- ボコルマスターの家
82 | local bokMap = GetClass('Map', 'c_voodoo')
83 | local genList = SCR_GET_XML_IES('GenType_'..bokMap.ClassName, 'Hide', 0)
84 | for i = 1, #genList do
85 | local genobj = genList[i]
86 | if (string.find(genobj.ClassType, 'npc_bocormaster') == 1) then
87 | __insertMasterInfo(self, 'BKR', bokMap.Name, genobj.Name)
88 | end
89 | end
90 |
91 | -- パイロマンサーの研究室
92 | local fimMap = GetClass('Map', 'c_firemage')
93 | local genList = SCR_GET_XML_IES('GenType_'..fimMap.ClassName, 'Hide', 0)
94 | for i = 1, #genList do
95 | local genobj = genList[i]
96 | if (string.find(genobj.ClassType, 'pyromancer') == 1) then
97 | __insertMasterInfo(self, 'FIM', fimMap.Name, genobj.Name)
98 | end
99 | end
100 |
101 | -- ハイランダーの道場
102 | local hldMap = GetClass('Map', 'c_highlander')
103 | local genList = SCR_GET_XML_IES('GenType_'..hldMap.ClassName, 'Hide', 0)
104 | for i = 1, #genList do
105 | local genobj = genList[i]
106 | if (string.find(genobj.ClassType, 'highlander') == 1) then
107 | __insertMasterInfo(self, 'HLD', hldMap.Name, genobj.Name)
108 | end
109 | end
110 |
111 | self:Dbg('Finish collect master info.')
112 | end
113 |
114 | -- 表示処理
115 | members.InfoView = function(self, treeIconName)
116 | local jobClassName = string.match(treeIconName, '^classCtrl_(.-)$')
117 | local job = GetClass('Job', jobClassName)
118 | self:Dbg(treeIconName..' -> '..jobClassName..' ('..job.Initial)
119 |
120 | for index, info in ipairs(self.__masterInfo[job.Initial]) do
121 | local prifix, name = string.match(dictionary.ReplaceDicIDInCompStr(info['name']), '^(.-){nl}(.-)$')
122 | self:Log(string.format('%s %s in %s', string.gsub(prifix, '%s', ''), string.gsub(name, '%s', ''), info['map']))
123 | end
124 | end
125 |
126 | members.InterruptMasterInfo = function(self, frame)
127 | local grid = GET_CHILD_RECURSIVELY(frame, "skill", "ui::CGrid")
128 | local childCount = grid:GetChildCount()
129 |
130 | self:Dbg('Interrupt class count = '..childCount)
131 |
132 | for i = 0, grid:GetChildCount() - 1 do
133 | local treeIcon = grid:GetChildByIndex(i)
134 | treeIcon = tolua.cast(treeIcon, 'ui::CControlSet')
135 | treeIcon:SetEventScript(ui.RBUTTONUP, 'MASTERPLACE_ON_INFOVIEW')
136 | treeIcon:SetEventScriptArgString(ui.RBUTTONUP, treeIcon:GetName())
137 | local arrowPic = GET_CHILD(treeIcon, 'selectedarrow')
138 | if (arrowPic ~= nil) then
139 | arrowPic:SetEventScript(ui.RBUTTONUP, 'MASTERPLACE_ON_INFOVIEW')
140 | arrowPic:SetEventScriptArgString(ui.RBUTTONUP, treeIcon:GetName())
141 | end
142 | self:Dbg(treeIcon:GetName())
143 | end
144 | end
145 |
146 | -- ログ出力
147 | members.Dbg = function(self, msg)
148 | -- CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
149 | end
150 | members.Log = function(self, msg)
151 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
152 | end
153 | members.Err = function(self, msg)
154 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
155 | end
156 |
157 | -- デストラクター
158 | members.Destroy = function(self)
159 | if (self.MAKE_CLASS_INFO_LIST ~= nil) then
160 | MAKE_CLASS_INFO_LIST = self.MAKE_CLASS_INFO_LIST
161 | self.MAKE_CLASS_INFO_LIST = nil
162 | end
163 | end
164 | -- おまじない
165 | return setmetatable(members, {__index = self});
166 | end
167 | -- .newなしでコンストラクターを呼ぶエイリアス登録
168 | setmetatable(g, {__call = g.new});
169 |
170 | -- 自フレーム初期化処理
171 | function MASTERPLACE_ON_INIT(addon, frame)
172 | if (g.instance.MAKE_CLASS_INFO_LIST == nil) then
173 | g.instance.MAKE_CLASS_INFO_LIST = MAKE_CLASS_INFO_LIST
174 | end
175 | MAKE_CLASS_INFO_LIST = function(frame, resetCommonType)
176 | g.instance.MAKE_CLASS_INFO_LIST(frame, resetCommonType)
177 | g.instance:InterruptMasterInfo(frame, resetCommonType)
178 | end
179 | g.instance:CollectMasterInfo()
180 | end
181 |
182 | function MASTERPLACE_ON_INFOVIEW(parent, ctrl, argStr, argNum)
183 | g.instance:InfoView(argStr)
184 | end
185 |
186 | -- インスタンス作成
187 | if (g.instance ~= nil) then
188 | g.instance:Destroy();
189 | end
190 | g.instance = g();
191 |
--------------------------------------------------------------------------------
/fixlostchatwindow/addon_d.ipf/fixlostchatwindow/fixlostchatwindow.lua:
--------------------------------------------------------------------------------
1 | -- 領域定義
2 | local author = 'weizlogy'
3 | local addonName = 'fixlostchatwindow'
4 | _G['ADDONS'] = _G['ADDONS'] or {}
5 | _G['ADDONS'][author] = _G['ADDONS'][author] or {}
6 | _G['ADDONS'][author][addonName] = _G['ADDONS'][author][addonName] or {}
7 |
8 | -- 領域へのポインターを取得
9 | local g = _G['ADDONS'][author][addonName]
10 |
11 | -- コンストラクター
12 | function g.new(self)
13 | local members = {};
14 |
15 | local __ADDON_DIR = '../addons/'..addonName
16 | local __CONFIG_FILENAME = 'chatConfig'
17 |
18 | local __config = {}
19 |
20 | members.AddMainFramePopupConfig = function(self, key, width, height, x, y, value)
21 | self:Dbg('Adding chat window key='..key)
22 | __config[key] = {
23 | width = width, height = height, x = x, y = y, value = value
24 | }
25 |
26 | DebounceScript('FIXLOSTCHATWINDOW_SAVECONFIG', 1.0)
27 | end
28 |
29 | members.UpdateMainFramePopupConfig = function(self, key, width, height, x, y, value)
30 | self:Dbg('Updating chat window key='..key)
31 | if (__config[key] == nil) then
32 | return
33 | end
34 | __config[key]['width'] = width
35 | __config[key]['height'] = height
36 | __config[key]['x'] = x
37 | __config[key]['y'] = y
38 | __config[key]['value'] = value
39 |
40 | DebounceScript('FIXLOSTCHATWINDOW_SAVECONFIG', 1.0)
41 | end
42 |
43 | members.RemoveMainFramePopupConfig = function(self, key)
44 | self:Dbg('Removing chat window key='..key)
45 | __config[key] = nil
46 |
47 | DebounceScript('FIXLOSTCHATWINDOW_SAVECONFIG', 1.0)
48 | end
49 |
50 | members.Serialize = function(self)
51 | self:Dbg('Saving...')
52 | local f, e = io.open(string.format(
53 | '%s/%s%d.txt', __ADDON_DIR, __CONFIG_FILENAME, GetServerGroupID()), 'w')
54 | if (e) then
55 | self:Err(tostring(e))
56 | return
57 | end
58 | f:write('local s = {}\n')
59 | for key, values in pairs(__config) do
60 | f:write(string.format('s[\'%s\'] = {', key))
61 | f:write(string.format(' %s = %s, ', 'width', values['width']))
62 | f:write(string.format(' %s = %s, ', 'height', values['height']))
63 | f:write(string.format(' %s = %s, ', 'x', values['x']))
64 | f:write(string.format(' %s = %s, ', 'y', values['y']))
65 | f:write(string.format(' %s = %s, ', 'value', values['value']))
66 | f:write('}\n')
67 | end
68 | f:write('return s')
69 | f:flush()
70 | f:close()
71 | end
72 |
73 | members.Deserialize = function(self)
74 | self:Dbg('Loading...')
75 | local filePath = string.format(
76 | '%s/%s%d.txt', __ADDON_DIR, __CONFIG_FILENAME, GetServerGroupID())
77 | local f, e = io.open(filePath, 'r')
78 | if (e) then
79 | self:Dbg(tostring(e))
80 | self:Dbg(e)
81 | return
82 | end
83 | f:close()
84 | local s, e = pcall(dofile, filePath)
85 | if (not s) then
86 | self:Err(e)
87 | end
88 | __config = e
89 | end
90 |
91 | members.ChechWindowCount = function(self)
92 | -- 設定上の個数
93 | local configCount = 0
94 | for _ in pairs(__config) do configCount = configCount + 1 end
95 | -- サーバー?上の個数
96 | local serverCount = session.chat.GetMainFramePopupConfigsSize()
97 |
98 | return serverCount == configCount
99 | end
100 |
101 | members.RecoverWindow = function(self)
102 | for key, values in pairs(__config) do
103 | self:Log('Recovering chat window key='..key)
104 | session.chat.AddMainFramePopupConfig(
105 | key, values['width'], values['height'], values['x'], values['y'], values['value'])
106 | CHAT_ADD_MAINCHAT_POPUP_BY_XML(
107 | key, values['width'], values['height'], values['x'], values['y'], values['value'])
108 | end
109 | ui.SaveChatConfig()
110 | end
111 |
112 | -- ログ出力
113 | members.Dbg = function(self, msg)
114 | -- CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
115 | end
116 | members.Log = function(self, msg)
117 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
118 | end
119 | members.Err = function(self, msg)
120 | CHAT_SYSTEM(string.format('[%s] %s', addonName, msg))
121 | end
122 |
123 | -- デストラクター
124 | members.Destroy = function(self)
125 | if (g.instance.session_chat_AddMainFramePopupConfig ~= nil) then
126 | session.chat.AddMainFramePopupConfig = g.instance.session_chat_AddMainFramePopupConfig
127 | end
128 | if (g.instance.session_chat_RemoveMainFramePopupConfig ~= nil) then
129 | session.chat.RemoveMainFramePopupConfig = g.instance.session_chat_RemoveMainFramePopupConfig
130 | end
131 | if (g.instance.session_chat_UpdateMainFramePopupConfig ~= nil) then
132 | session.chat.UpdateMainFramePopupConfig = g.instance.session_chat_UpdateMainFramePopupConfig
133 | end
134 | if (g.instance.DO_CLOSE_MAINCHATPOPUP ~= nil) then
135 | DO_CLOSE_MAINCHATPOPUP = g.instance.DO_CLOSE_MAINCHATPOPUP
136 | end
137 | end
138 | -- おまじない
139 | return setmetatable(members, {__index = self});
140 | end
141 | -- .newなしでコンストラクターを呼ぶエイリアス登録
142 | setmetatable(g, {__call = g.new});
143 |
144 | -- 自フレーム初期化処理
145 | function FIXLOSTCHATWINDOW_ON_INIT(addon, frame)
146 | addon:RegisterMsg('GAME_START_3SEC', 'FIXLOSTCHATWINDOW_GAME_START_3SEC')
147 |
148 | -- 追加
149 | if (g.instance.session_chat_AddMainFramePopupConfig == nil) then
150 | g.instance.session_chat_AddMainFramePopupConfig = session.chat.AddMainFramePopupConfig
151 | end
152 | session.chat.AddMainFramePopupConfig = function(key, width, height, x, y, value)
153 | g.instance.session_chat_AddMainFramePopupConfig(key, width, height, x, y, value)
154 | g.instance:AddMainFramePopupConfig(tostring(key), width, height, x, y, value)
155 | end
156 | -- 削除
157 | if (g.instance.session_chat_RemoveMainFramePopupConfig == nil) then
158 | g.instance.session_chat_RemoveMainFramePopupConfig = session.chat.RemoveMainFramePopupConfig
159 | end
160 | session.chat.RemoveMainFramePopupConfig = function(key)
161 | g.instance.session_chat_RemoveMainFramePopupConfig(key)
162 | -- g.instance:RemoveMainFramePopupConfig(tostring(key))
163 | end
164 | -- 閉じる処理
165 | if (g.instance.DO_CLOSE_MAINCHATPOPUP == nil) then
166 | g.instance.DO_CLOSE_MAINCHATPOPUP = DO_CLOSE_MAINCHATPOPUP
167 | end
168 | DO_CLOSE_MAINCHATPOPUP = function(parent, ctrl)
169 | g.instance.DO_CLOSE_MAINCHATPOPUP(parent, ctrl)
170 | g.instance:RemoveMainFramePopupConfig(string.sub(parent:GetTopParentFrame():GetName(), 11))
171 | end
172 | -- 更新
173 | if (g.instance.session_chat_UpdateMainFramePopupConfig == nil) then
174 | g.instance.session_chat_UpdateMainFramePopupConfig = session.chat.UpdateMainFramePopupConfig
175 | end
176 | session.chat.UpdateMainFramePopupConfig = function(key, width, height, x, y, value)
177 | g.instance.session_chat_UpdateMainFramePopupConfig(key, width, height, x, y, value)
178 | g.instance:UpdateMainFramePopupConfig(tostring(key), width, height, x, y, value)
179 | end
180 | end
181 |
182 | function FIXLOSTCHATWINDOW_GAME_START_3SEC()
183 | g.instance:Deserialize()
184 | local checked = g.instance:ChechWindowCount()
185 | if (checked) then
186 | return
187 | end
188 | g.instance:RecoverWindow()
189 | end
190 |
191 | function FIXLOSTCHATWINDOW_SAVECONFIG()
192 | g.instance:Serialize()
193 | end
194 |
195 | -- インスタンス作成
196 | if (g.instance ~= nil) then
197 | g.instance:Destroy();
198 | end
199 | g.instance = g();
200 |
--------------------------------------------------------------------------------
/worldmapquest/worldmapquest.lua:
--------------------------------------------------------------------------------
1 | -- class definitions.
2 | WorldmapQuest = {};
3 |
4 | -- constructor.
5 | function WorldmapQuest.new(self)
6 | -- initialize members.
7 | local members = {};
8 | members.possibleQuests = {};
9 | members.IgnoreRepeatQuest = 0;
10 | --
11 | members.CreatePossibleQuests = function(self)
12 | self.possibleQuests = {}
13 | local possibleQuestList = GetQuestProgressClassByState("POSSIBLE");
14 | for i = 1, #possibleQuestList do
15 | local questIES = possibleQuestList[i];
16 | if (questIES.StartMap ~= "None") then
17 | local mapCls = GetClass('Map', questIES.StartMap);
18 | local count = self.possibleQuests[mapCls.ClassID];
19 | if (count == nil) then
20 | count = 0;
21 | end
22 | self.possibleQuests[mapCls.ClassID] = count + 1;
23 | if (self.IgnoreRepeatQuest == 1 and questIES.QuestMode == "REPEAT") then
24 | self.possibleQuests[mapCls.ClassID] = count - 1;
25 | end
26 | end
27 | end
28 | end
29 | --
30 | members.InsertPossibleQuestCount = function(self, mapCls, gbox, parentGBox, ctrlSet)
31 | parentGBox:RemoveChild("questText_"..mapCls.ClassID);
32 | local count = self.possibleQuests[mapCls.ClassID];
33 | if (count == nil or count <= 0) then
34 | return;
35 | end
36 | -- calculate height.
37 | local heightBuff = 0;
38 | local mapType = TryGetProp(mapCls, 'MapType');
39 | if mapType == 'Dungeon' then
40 | heightBuff = 30;
41 | end
42 | -- create count text.
43 | local questText = parentGBox:CreateOrGetControl(
44 | "richtext", "questText_"..mapCls.ClassID, gbox:GetX(), gbox:GetY(), 30, 30);
45 | questText:SetText(string.format("{@st66e}[%d]", count));
46 | questText:SetOffset(gbox:GetOffsetX() - questText:GetWidth() + 2, gbox:GetOffsetY() + heightBuff);
47 | questText:EnableHitTest(1);
48 | questText:SetEventScript(ui.RBUTTONUP, 'WORLDMAPQUEST_RBUP_MENU');
49 | end
50 | --
51 | members.InsertQuestWarpIcon = function(self, parentGBox, spaceX, startX, spaceY, startY)
52 | -- get worldmap scale.
53 | local curSize = config.GetConfigInt("WORLDMAP_SCALE", 6);
54 | local sizeRatio = 1 + curSize * 0.25;
55 | -- get warpable quests.
56 | local warpableQuestList = GetQuestProgressClassByState("SUCCESS");
57 | -- create worldmap warp objects.
58 | for i = 1, #warpableQuestList do
59 | local questIES = warpableQuestList[i];
60 | if (SCR_QUEST_CHECK_C(GetMyPCObject(), questIES.ClassName) == "SUCCESS" and questIES.SUCC_WARP == "YES") then
61 | local mapCls = GetClass('Map', questIES.EndMap);
62 | local x, y, dir, index = GET_WORLDMAP_POSITION(mapCls.WorldMap);
63 | local oid = "statepicture_"..mapCls.ClassID;
64 | local picX = startX + x * spaceX * sizeRatio + 120;
65 | local picY = startY - y * spaceY * sizeRatio + 25;
66 | -- create warp icon.
67 | local mapName = parentGBox:CreateOrGetControl('richtext', oid, picX, picY, 24, 100);
68 | tolua.cast(mapName, "ui::CRichText");
69 | mapName:SetText("{ol}"..mapCls.Name);
70 | local picture = parentGBox:CreateOrGetControl('picture', oid.."_p", picX - 24, picY - 2, 24, 24);
71 | tolua.cast(picture, "ui::CPicture");
72 | picture:SetEnableStretch(1);
73 | picture:SetImage("questinfo_return");
74 | picture:SetAngleLoop(-3);
75 | picture:SetUserValue("PC_FID", GET_QUESTINFO_PC_FID());
76 | picture:SetUserValue("RETURN_QUEST_NAME", mapCls.Name.." - "..questIES.Name);
77 | picture:EnableHitTest(1);
78 | picture:SetEventScript(ui.LBUTTONUP, "WORLDMAPQUEST_QUESTION_QUEST_WARP");
79 | picture:SetEventScriptArgNumber(ui.LBUTTONUP, questIES.ClassID);
80 | end
81 | end
82 | end
83 | --
84 | members.ToggleRepeatQuest = function(self)
85 | if (self.IgnoreRepeatQuest == 1) then
86 | self.IgnoreRepeatQuest = 0;
87 | return;
88 | end
89 | self.IgnoreRepeatQuest = 1;
90 | end
91 | -- destroy.
92 | members.Destroy = function(self)
93 | CREATE_WORLDMAP_MAP_CONTROLS = woqu.CREATE_WORLDMAP_MAP_CONTROLS;
94 | woqu.CREATE_WORLDMAP_MAP_CONTROLS = nil;
95 | OPEN_WORLDMAP = woqu.OPEN_WORLDMAP;
96 | woqu.OPEN_WORLDMAP = nil;
97 | CREATE_ALL_WARP_CONTROLS = woqu.CREATE_ALL_WARP_CONTROLS;
98 | woqu.CREATE_ALL_WARP_CONTROLS = nil;
99 | end
100 | return setmetatable(members, {__index = self});
101 | end
102 |
103 | -- set call.
104 | setmetatable(WorldmapQuest, {__call = WorldmapQuest.new});
105 |
106 | -- frame initialize.
107 | function WORLDMAPQUEST_ON_INIT(addon, frame)
108 | -- override worldmap init function.
109 | if (woqu.OPEN_WORLDMAP == nil) then
110 | woqu.OPEN_WORLDMAP = OPEN_WORLDMAP;
111 | end
112 | OPEN_WORLDMAP = function(frame)
113 | -- clear old state.
114 | local pic = frame:GetChild("pic");
115 | local worldMapBox = pic:GetChild("GBOX_WorldMap");
116 | if (worldMapBox ~= nil) then
117 | DESTROY_CHILD_BYNAME(worldMapBox, "questText_");
118 | DESTROY_CHILD_BYNAME(worldMapBox, "statepicture_");
119 | end
120 | if (keyboard.IsKeyPressed("LALT") == 1) then
121 | frame:SetUserValue('Type', "QuestWarp");
122 | end
123 | -- Key "N" => None - None
124 | -- Statue => None - NPC
125 | -- Scroll => Scroll_Warp_quest - None
126 | local warp = frame:GetUserValue("SCROLL_WARP");
127 | local type = frame:GetUserValue('Type');
128 | if (warp == "None" and type == "None") then
129 | woqu:CreatePossibleQuests();
130 | end
131 | woqu.OPEN_WORLDMAP(frame);
132 | end
133 | -- override create worldmap map control function.
134 | if (woqu.CREATE_WORLDMAP_MAP_CONTROLS == nil) then
135 | woqu.CREATE_WORLDMAP_MAP_CONTROLS = CREATE_WORLDMAP_MAP_CONTROLS;
136 | end
137 | CREATE_WORLDMAP_MAP_CONTROLS = function(
138 | parentGBox, makeWorldMapImage, changeDirection, nowMapIES,
139 | mapCls, questPossible, nowMapWorldPos, gBoxName,
140 | x, spaceX, startX, y, spaceY, startY, pictureStartY)
141 | -- call original.
142 | woqu.CREATE_WORLDMAP_MAP_CONTROLS(
143 | parentGBox, makeWorldMapImage, changeDirection, nowMapIES,
144 | mapCls, questPossible, nowMapWorldPos, gBoxName,
145 | x, spaceX, startX, y, spaceY, startY, pictureStartY);
146 | -- create params.
147 | local gbox = GET_CHILD(parentGBox, gBoxName, "ui::CGroupBox");
148 | local ctrlSet = gbox:CreateOrGetControlSet('worldmap_zone', "ZONE_CTRL_" .. mapCls.ClassID, ui.LEFT, ui.TOP, 0, 0, 0, 0);
149 | -- call interrupt function.
150 | woqu:InsertPossibleQuestCount(mapCls, gbox, parentGBox, ctrlSet);
151 | end
152 | -- override create warp worldmap control function.
153 | if (woqu.CREATE_ALL_WARP_CONTROLS == nil) then
154 | woqu.CREATE_ALL_WARP_CONTROLS = CREATE_ALL_WARP_CONTROLS;
155 | end
156 | CREATE_ALL_WARP_CONTROLS = function(
157 | frame, parentGBox, makeWorldMapImage, changeDirection, mapName,
158 | currentDirection, spaceX, startX, spaceY, startY, pictureStartY)
159 | local type = frame:GetUserValue('Type');
160 | if (type == "QuestWarp") then
161 | local pic = frame:GetChild("pic");
162 | local worldMapBox = pic:GetChild("GBOX_WorldMap");
163 | woqu:InsertQuestWarpIcon(worldMapBox, spaceX, startX, spaceY, startY);
164 | return;
165 | end
166 | woqu.CREATE_ALL_WARP_CONTROLS(
167 | frame, parentGBox, makeWorldMapImage, changeDirection, mapName,
168 | currentDirection, spaceX, startX, spaceY, startY, pictureStartY);
169 | end
170 | end
171 | --
172 | function WORLDMAPQUEST_RBUP_MENU(frame, ctrl, str, num)
173 | local menuTitle = "worldmapquest";
174 | local context = ui.CreateContextMenu(
175 | "CONTEXT_WORLDMAPQUEST", menuTitle, 0, 0, string.len(menuTitle) * 10, 100);
176 | ui.AddContextMenuItem(context, "toggleRepeatQuest", "WORLDMAPQUEST_TOGGLE_REPEAT_QUEST()");
177 | ui.AddContextMenuItem(context, "Cancel", "None");
178 | ui.OpenContextMenu(context);
179 | end
180 | --
181 | function WORLDMAPQUEST_TOGGLE_REPEAT_QUEST()
182 | woqu:ToggleRepeatQuest();
183 | end
184 | --
185 | function WORLDMAPQUEST_QUESTION_QUEST_WARP(frame, ctrl, argStr, questID)
186 | local map = ui.GetFrame("worldmap");
187 | if (map:IsVisible() == 1) then
188 | map:ShowWindow(0);
189 | end
190 | QUESTION_QUEST_WARP(frame, ctrl, argStr, questID);
191 | end
192 |
193 | -- create instance.
194 | if (woqu ~= nil) then
195 | woqu:Destroy();
196 | end
197 | woqu = WorldmapQuest();
198 |
--------------------------------------------------------------------------------
/slotmac/README.md:
--------------------------------------------------------------------------------
1 | see [https://blog.weizlogy.com/pages/tos-addon/#slotmac](https://blog.weizlogy.com/pages/tos-addon/#slotmac)
2 |
3 | ## settings.
4 |
5 | Nexon\TreeofSaviorJP\addons\slotmac フォルダーを作成します。
6 |
7 | slotmac フォルダー配下に自キャラの[cid]のフォルダーを作成します。
8 |
9 | 操作中のキャラクターのcidが不明な場合は、F3キーで[スキルと特性]ダイアログを開き、右下の[slmc]Reloadボタンを右クリックしてください。
10 |
11 | slotmac フォルダー配下に操作キャラの[cid]のファイルが作成されますので、コピー > ファイル削除 > 新しいフォルダー作成 > フォルダー名変更 > ペースト としてください。
12 |
13 | ## descriptions.
14 |
15 | ### v1.3.0
16 |
17 | #### ターゲット情報タグ追加
18 |
19 | ターゲット中の敵に関する情報を表示するタグを追加しました。
20 |
21 | 詳細はマクロタグ一覧参照。
22 |
23 | #### 自キャラ情報タグ追加
24 |
25 | 自キャラに関する情報を表示するタグを追加しました。
26 |
27 | 詳細はマクロタグ一覧参照。
28 |
29 | #### スロット情報タグ追加
30 |
31 | マクロを実行したスロットに関する情報を表示するタグを追加しました。
32 |
33 | 詳細はマクロタグ一覧参照。
34 |
35 | ### v1.2.0
36 |
37 | #### オーバーヒート対応
38 |
39 | オーバーヒートのあるスキルでは、通常マクロファイルに加えてオーバーヒート用のマクロファイルを
40 | 用意できるようになりました。
41 |
42 | 例えばオーバーヒート3のスキルでは、以下のようになります。
43 | ```
44 | 初撃 => オーバーヒート用マクロファイル
45 | 二撃 => オーバーヒート用マクロファイル
46 | 三撃 => 通常マクロファイル
47 | ```
48 |
49 | オーバーヒート用マクロファイルがない場合は、
50 | マクロファイルのない通常動作(スキル発動のみ)となります。
51 |
52 | オーバーヒート用マクロファイルの詳細はusage参照。
53 |
54 | ### v1.1.0
55 |
56 | #### equipコマンド追加
57 |
58 | equipコマンドにより、クイックスロット実行に合わせて装備を変更できます。
59 |
60 | 詳細はマクロコマンド一覧参照。
61 |
62 | #### unequipコマンド追加
63 |
64 | unequipコマンドにより、クイックスロット実行に合わせて装備を外せます。
65 |
66 | 詳細はマクロコマンド一覧参照。
67 |
68 | ### v1.0.0
69 |
70 | #### 新規作成
71 |
72 | アドオンがロードされると、クイックスロットにセットしたスキルやアイテムを実行時に指定したマクロを実行できるようになります。
73 |
74 | また、[スキルと特性]ダイアログの右下の[slmc]Reloadボタンが追加されます。左クリックでマクロを再読み込みします。
75 |
76 | ## usage.
77 |
78 | ### マクロファイル作成
79 |
80 | キーボード、マウスモードの場合、クイックスロットは左下が1、右上が40となります。(ジョイスティックは...?)
81 |
82 | cidフォルダー配下に、必要に応じてマクロファイル(slot1.txt ~ slot40.txt)を**UTF8-BOM無**で作成します。
83 | マクロファイルがない場合は、今まで通りスロットにセットされたものを実行します。
84 |
85 | UTF8-BOM無がよく分からない人は、下記テンプレートをダウンロードして使ってください。
86 |
87 | [slotN.txt](https://github.com/weizlogy/tos/releases/download/slotmac-v1.0.0/slotN.txt)
88 |
89 | slot1.txtなら、[A]キーに割り当てのクイックスロットという感じです。
90 |
91 | **マクロは一行に一コマンドとなります。**
92 |
93 | ### オーバーヒート用マクロファイル
94 |
95 | オーバーヒートのあるスキルでは、通常マクロファイルに加えてオーバーヒート用のマクロファイルを
96 | 用意できます。
97 |
98 | オーバーヒート用のマクロファイルの命名規則は以下の通りです。
99 | ```
100 | slot1-oh.txt ~ slot40-oh.txt
101 | ```
102 |
103 | ### マクロコマンド一覧
104 |
105 | #### クイックスロット呼び出し
106 |
107 | 自身または他のクイックスロットを呼び出します。
108 |
109 | ```lua
110 | #skill# 0 -- 操作したクイックスロット自身を実行する。
111 | #skill# 10 -- 10番目のクイックスロット(つまり[;]キー割り当てのもの)を実行する。
112 | ```
113 |
114 | #### チャットコマンド
115 |
116 | [/]から始まるチャットコマンドはすべて使用可能です。
117 |
118 | ```lua
119 | /s test -- 一般チャットで[test]と発言する。
120 | /p test -- PTチャットで[test]と発言する。
121 | /indun -- インスタンスダンジョンダイアログを呼び出す。
122 | e.t.c...
123 | ```
124 |
125 | #### エコー
126 |
127 | systemチャットで自分にしか見えない発言ができます。
128 |
129 | ```lua
130 | #system# test -- systemチャット[test]と発言する。
131 | ```
132 |
133 | #### ポーズ
134 |
135 | 任意のポーズができます。
136 |
137 | ```lua
138 | #pose# LOVE -- [ラブ]のポーズをする。
139 | ```
140 |
141 | ポーズはクラス名を指定します。
142 | data\ies.ipf\pose.ies に載っていますが、以下に抜粋しておきます。
143 |
144 | ```
145 | ClassName
146 | --
147 | LOVE
148 | WIN
149 | BEST
150 | FOLLOW
151 | HELP
152 | HELLO
153 | NO
154 | SORRY
155 | THANKS
156 | YES
157 | BOW1
158 | BOW2
159 | CLENCHFIST
160 | DOUBLEGUNS
161 | HADOUKEN
162 | SURPRISE
163 | CRYING
164 | BIRDPOSE
165 | OUTCAST
166 | QUESTION
167 | CRAP
168 | JUMPING
169 | CUTE
170 | HULAHULA
171 | IDK
172 | NONO
173 | OUCH
174 | POPCORN
175 | JIANGSHI
176 | CHEERS
177 | OTL
178 | POLLEN
179 | THANKS2
180 | DANCE
181 | KICK
182 | ```
183 |
184 | #### タイマー
185 |
186 | クイックスロット実行後一定時間経過で任意のマクロコマンドを呼び出します。
187 |
188 | ```lua
189 | #timer# 3 #pose# LOVE -- クイックスロット実行後3秒経過で[ラブ]のポーズをする。
190 | ```
191 |
192 | タイマーは複数張れますが、全て[クイックスロット実行後一定時間経過]換算で、waitではありません。[#timer# 3 xxx]を二行書いても、xxxが3秒後同時に行われることになります。
193 |
194 | #### 装備
195 |
196 | 指定部位の装備を、指定した装備に変更します。
197 |
198 | ```lua
199 | #equip# RH ターネットソード -- メインウエポンをターネットソードにする。
200 | #timer# 1 #skill# 0 -- クイックスロット実行1秒後、スロットスキルを実行する。
201 | #timer# 2 #equip# RH フィフスハンマー -- クイックスロット実行2秒後、メインウエポンをフィフスハンマーにする。
202 | ```
203 |
204 | 装備変更には少々時間がかかるため、その後のスキル実行はタイマーで調整してください。
205 |
206 | 装備部位は以下の通りです。
207 |
208 | ```
209 | HAT
210 | HAT_L
211 | HAIR
212 | SHIRT
213 | GLOVES
214 | BOOTS
215 | HELMET
216 | ARMBAND
217 | RH
218 | LH
219 | OUTER
220 | OUTERADD1
221 | OUTERADD2
222 | BODY
223 | PANTS
224 | PANTSADD1
225 | PANTSADD2
226 | RING1
227 | RING2
228 | NECK
229 | HAT_T
230 | LENDS
231 | ```
232 |
233 | #### 装備解除
234 |
235 | 指定部位の装備を外します。
236 |
237 | ```lua
238 | #unequip# RH -- メインウエポンを外す。
239 | ```
240 |
241 | ### マクロタグ一覧
242 |
243 | #### エモティコン
244 |
245 | チャットコマンドやエコーでエモティコンを表示できます。
246 |
247 | ```lua
248 | /s -- 一般チャット[脱力エモ]と発言する。
249 | ```
250 |
251 | エモティコンはクラス名で指定します。
252 | data\jp.ipf\xml\chat_emoticons.xml に載っていますが、以下に抜粋しておきます。
253 |
254 | ```xml
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 | ```
302 |
303 | #### ターゲット情報
304 |
305 | ターゲット中の敵の名前やステータスを表示できます。
306 |
307 | ```lua
308 | /s 発見! -- 一般チャットで[ターゲット名称] 発見!と発言する。
309 | /s () -- 一般チャットで[ターゲット残HP(残HP%)]と発言する。
310 | ```
311 |
312 | #### 自キャラ情報
313 |
314 | 自キャラの名前やステータスを表示できます。
315 |
316 | ```lua
317 | /s -- 一般チャットで[自キャラ名 自チーム名]と発言する。
318 | /s -- 一般チャットで[自キャラ名]と発言する。
319 | /s -- 一般チャットで[自チーム名]と発言する。
320 | /s () -- 一般チャットで[自キャラ残HP(残HP%)]と発言する。
321 | /s () -- 一般チャットで[自キャラ残HP(残HP%)]と発言する。
322 | /s -- 一般チャットで[自キャラ座標(x,y,z)]と発言する。
323 | ```
324 |
325 | #### スロット情報
326 |
327 | マクロ実行スロットスキル/アイテムの名前やクールダウンタイムを表示できます。
328 |
329 | ```lua
330 | /s recast in sec. -- 一般チャットで[スロットスキル/アイテム名 recast in [スロットスキル/アイテムクールダウンタイム] sec.]と発言する。
331 | ```
332 |
333 | ## cautions.
334 |
335 | マクロファイルがUTF8-BOM付の場合、BOMが邪魔で一行目のマクロが認識されません。UTF8以外(MS932など)は、全マクロが認識できません。
336 |
337 | 連打するようなクイックスロットにはマクロつけても。。。
338 |
--------------------------------------------------------------------------------
/addons.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name" : "Compact Heads Up Display",
4 | "file" : "compactheadsupdisplay",
5 | "extension" : "ipf",
6 | "fileVersion" : "v1.0.1",
7 | "releaseTag" : "compactheadsupdisplay",
8 | "unicode" : "📖",
9 | "description" : "Heads Up Display(自ジョブアイコン、HPなどがあるフレーム)からHPバーを取り去り、コンパクトにします。(ジョブアイコンとレベルだけにします)",
10 | "tags" : [
11 | "headsupdispplay",
12 | "compact"
13 | ]
14 | },
15 | {
16 | "name" : "Costume Play",
17 | "file" : "costumeplay",
18 | "extension" : "ipf",
19 | "fileVersion" : "v1.1.2",
20 | "releaseTag" : "costumeplay",
21 | "unicode" : "📖",
22 | "description" : "GUI操作で装備/ヘアカラー/称号を保存/復元します。",
23 | "tags" : [
24 | "equip",
25 | "costume"
26 | ]
27 | },
28 | {
29 | "name" : "Dice",
30 | "file" : "dice",
31 | "extension" : "ipf",
32 | "fileVersion" : "v1.1.0",
33 | "releaseTag" : "dice",
34 | "unicode" : "📖",
35 | "description" : "一般チャットでダイスロールができます。",
36 | "tags" : [
37 | "dice",
38 | "random"
39 | ]
40 | },
41 | {
42 | "name" : "DPS Meter",
43 | "file" : "dpsmeter",
44 | "extension" : "ipf",
45 | "fileVersion" : "v2.1.2",
46 | "releaseTag" : "dpsmeter",
47 | "unicode" : "📖",
48 | "description" : "DPS計測します。",
49 | "tags" : [
50 | "dps",
51 | "dpsmeter"
52 | ]
53 | },
54 | {
55 | "name" : "Fix Book Read",
56 | "file" : "fixbookread",
57 | "extension" : "ipf",
58 | "fileVersion" : "v1.0.0",
59 | "releaseTag" : "fixbookread",
60 | "unicode" : "📖",
61 | "description" : "本アイテムの改行崩れを正常化します。",
62 | "tags" : [
63 | "book",
64 | "fix"
65 | ]
66 | },
67 | {
68 | "name" : "Fix Inventory Sort",
69 | "file" : "fixinventorysort",
70 | "extension" : "ipf",
71 | "fileVersion" : "v1.3.1",
72 | "releaseTag" : "fixinventorysort",
73 | "unicode" : "📖",
74 | "description" : "名前でのソートを正常化します。おまけ機能で好きなソート順を独自に作ることができます。",
75 | "tags" : [
76 | "sort",
77 | "fix"
78 | ]
79 | },
80 | {
81 | "name" : "Fix Lost Chat Window",
82 | "file" : "fixlostchatwindow",
83 | "extension" : "ipf",
84 | "fileVersion" : "v1.0.1",
85 | "releaseTag" : "fixlostchatwindow",
86 | "unicode" : "📖",
87 | "description" : "追加チャットウィンドウが消えてしまう問題が発生しても、自動的に以前の状態に復元します。",
88 | "tags" : [
89 | "chat",
90 | "fix"
91 | ]
92 | },
93 | {
94 | "name" : "Guild Notify In Chat",
95 | "file" : "guildnotifyinchat",
96 | "extension" : "ipf",
97 | "fileVersion" : "v1.0.0",
98 | "releaseTag" : "guildnotifyinchat",
99 | "unicode" : "📖",
100 | "description" : "ギルドのお知らせをログイン時に、システムチャットで表示します。",
101 | "tags" : [
102 | "guild"
103 | ]
104 | },
105 | {
106 | "name" : "Hide Name",
107 | "file" : "hidename",
108 | "extension" : "ipf",
109 | "fileVersion" : "v1.0.4",
110 | "releaseTag" : "hidename",
111 | "unicode" : "📖",
112 | "description" : "画面にある自キャラ名とギルド名、エンブレムを消します。",
113 | "tags" : [
114 | "hide",
115 | "headsupdisplay"
116 | ]
117 | },
118 | {
119 | "name" : "HP Monitor",
120 | "file" : "hpmonitor",
121 | "extension" : "ipf",
122 | "fileVersion" : "v1.1.4",
123 | "releaseTag" : "hpmonitor",
124 | "unicode" : "📖",
125 | "description" : "ボスのHPを監視して、指定パーセント付近で音とチャットを流します。常時モンスターのHPバーにパーセンテージ表示を追加します。",
126 | "tags" : [
127 | "hp",
128 | "monitor"
129 | ]
130 | },
131 | {
132 | "name" : "Mini Gauge Text",
133 | "file" : "minigaugetext",
134 | "extension" : "ipf",
135 | "fileVersion" : "v1.1.2",
136 | "releaseTag" : "minigaugetext",
137 | "unicode" : "📖",
138 | "description" : "キャラクター下のHP/SPバーに現在値と最大値を表示します。",
139 | "tags" : [
140 | "gauge"
141 | ]
142 | },
143 | {
144 | "name" : "Multiple Quickslot",
145 | "file" : "multiplequickslot",
146 | "extension" : "ipf",
147 | "fileVersion" : "v1.0.5",
148 | "releaseTag" : "multiplequickslot",
149 | "unicode" : "📖",
150 | "description" : "クイックスロットの保存、復元ができるようになります。",
151 | "tags" : [
152 | "quickslot"
153 | ]
154 | },
155 | {
156 | "name" : "Monster Status",
157 | "file" : "monsterstatus",
158 | "extension" : "ipf",
159 | "fileVersion" : "v3.0.4",
160 | "releaseTag" : "monsterstatus",
161 | "unicode" : "📖",
162 | "description" : "ターゲット中のモンスターのステータスを表示します。シンプルなv2系もあります。",
163 | "tags" : [
164 | "status",
165 | "monster"
166 | ]
167 | },
168 | {
169 | "name" : "PartyInfoEx",
170 | "file" : "partyinfoex",
171 | "extension" : "ipf",
172 | "fileVersion" : "v1.1.1",
173 | "releaseTag" : "partyinfoex",
174 | "unicode" : "📖",
175 | "description" : "PTメンバーの所在地を表示します。",
176 | "tags" : [
177 | "party"
178 | ]
179 | },
180 | {
181 | "name" : "Pick-Item Info",
182 | "file" : "pickiteminfo",
183 | "extension" : "ipf",
184 | "fileVersion" : "v1.0.4",
185 | "releaseTag" : "pickiteminfo",
186 | "unicode" : "📖",
187 | "description" : "ドロップアイテム名を常時表示+レアリティで色分けします。",
188 | "tags" : [
189 | "pickitem"
190 | ]
191 | },
192 | {
193 | "name" : "Preview Guild Emblem",
194 | "file" : "previewguildemblem",
195 | "extension" : "ipf",
196 | "fileVersion" : "v1.1.0",
197 | "releaseTag" : "previewguildemblem",
198 | "unicode" : "📖",
199 | "description" : "ギルドマスター以外でもギルドエンブレムのプレビューができます。",
200 | "tags" : [
201 | "guild",
202 | "emblem"
203 | ]
204 | },
205 | {
206 | "name" : "Remove Tips Forever",
207 | "file" : "removetipsfe",
208 | "extension" : "ipf",
209 | "fileVersion" : "v1.0.0",
210 | "releaseTag" : "removetipsfe",
211 | "unicode" : "📖",
212 | "description" : "邪魔なtipsを非表示にしつつチャットウィンドウにシステムメッセージとして表示します。",
213 | "tags" : [
214 | "tip"
215 | ]
216 | },
217 | {
218 | "name" : "Repair Endurance",
219 | "file" : "repairendur",
220 | "extension" : "ipf",
221 | "fileVersion" : "v1.1.0",
222 | "releaseTag" : "repairendur",
223 | "unicode" : "📖",
224 | "description" : "装備修理時、装備アイコンに耐久度(%)を色分け表示します。",
225 | "tags" : [
226 | "repair"
227 | ]
228 | },
229 | {
230 | "name" : "Repeatery PuzzleCraft",
231 | "file" : "repeaterypuzzlecraft",
232 | "extension" : "ipf",
233 | "fileVersion" : "v1.0.0",
234 | "releaseTag" : "repeaterypuzzlecraft",
235 | "unicode" : "📖",
236 | "description" : "マグナムオーパスを指定した回数、自動実行します。",
237 | "tags" : [
238 | "puzzlecraft"
239 | ]
240 | },
241 | {
242 | "name" : "Save Quest",
243 | "file" : "savequest",
244 | "extension" : "ipf",
245 | "fileVersion" : "v1.2.9",
246 | "releaseTag" : "savequest",
247 | "unicode" : "📖",
248 | "description" : "ワープ用クエストの誤完了を防止します。ついでにクエストワープを使いやすくします。",
249 | "tags" : [
250 | "quest",
251 | "warp"
252 | ]
253 | },
254 | {
255 | "name" : "Show Buff-Seller Type",
256 | "file" : "showbuffsellertype",
257 | "extension" : "ipf",
258 | "fileVersion" : "v1.1.0",
259 | "releaseTag" : "showbuffsellertype",
260 | "unicode" : "📖",
261 | "description" : "商店のフキダシに商店名を付けて紛らわしさを回避します。(主に装備メンテ、修理の区別)",
262 | "tags" : [
263 | "buffseller"
264 | ]
265 | },
266 | {
267 | "name" : "Show Hiddden Map",
268 | "file" : "showhiddenmap",
269 | "extension" : "ipf",
270 | "fileVersion" : "v1.0.1",
271 | "releaseTag" : "showhiddenmap",
272 | "unicode" : "📖",
273 | "description" : "(ミニ)マップが表示されないマップで(ミニ)マップが表示されるようになります。",
274 | "tags" : [
275 | "map",
276 | "minimap"
277 | ]
278 | },
279 | {
280 | "name" : "Skill-Item Counter",
281 | "file" : "skillitemcounter",
282 | "extension" : "ipf",
283 | "fileVersion" : "v1.1.3",
284 | "releaseTag" : "skillitemcounter",
285 | "unicode" : "📖",
286 | "description" : "消費アイテムありスキルの使用回数を表示します。",
287 | "tags" : [
288 | "skill",
289 | "quickslot"
290 | ]
291 | },
292 | {
293 | "name" : "Slot Macro",
294 | "file" : "slotmac",
295 | "extension" : "ipf",
296 | "fileVersion" : "v1.3.0",
297 | "releaseTag" : "slotmac",
298 | "unicode" : "📖",
299 | "description" : "クイックスロットスキル/アイテムをマクロ化します。",
300 | "tags" : [
301 | "macro",
302 | "quickslot"
303 | ]
304 | },
305 | {
306 | "name" : "Summon Counter",
307 | "file" : "summoncounter",
308 | "extension" : "ipf",
309 | "fileVersion" : "v2.0.3",
310 | "releaseTag" : "summoncounter",
311 | "unicode" : "📖",
312 | "description" : "クイックスロットに召喚物の個体数を表示します。召喚物の個体数やHPをUI上に表示します。召喚物がしゃべります――!?",
313 | "tags" : [
314 | "summon",
315 | "quickslot"
316 | ]
317 | },
318 | {
319 | "name" : "Stealthy Master",
320 | "file" : "stealthymaster",
321 | "extension" : "ipf",
322 | "fileVersion" : "v1.0.0",
323 | "releaseTag" : "stealthymaster",
324 | "unicode" : "📖",
325 | "description" : "いいねせずキャラ情報を見れます。",
326 | "tags" : [
327 | ]
328 | },
329 | {
330 | "name" : "SubQuickSlot",
331 | "file" : "subquickslot",
332 | "extension" : "ipf",
333 | "fileVersion" : "v2.0.0",
334 | "releaseTag" : "subquickslot",
335 | "unicode" : "📖",
336 | "description" : "任意のサイズのクイックスロットを任意の数だけ追加します。",
337 | "tags" : [
338 | "quickslot"
339 | ]
340 | },
341 | {
342 | "name" : "Stamina Mini Gauge",
343 | "file" : "staminigauge",
344 | "extension" : "ipf",
345 | "fileVersion" : "v1.0.3",
346 | "releaseTag" : "staminigauge",
347 | "unicode" : "📖",
348 | "description" : "キャラの足元にスタミナゲージを追加します。",
349 | "tags" : [
350 | "stamina"
351 | ]
352 | },
353 | {
354 | "name" : "Worldmap Quest",
355 | "file" : "worldmapquest",
356 | "extension" : "ipf",
357 | "fileVersion" : "v1.2.0",
358 | "releaseTag" : "worldmapquest",
359 | "unicode" : "📖",
360 | "description" : "ワールドマップ上に各エリアの受注可能なクエスト数を表示します。",
361 | "tags" : [
362 | "quest",
363 | "worldmap"
364 | ]
365 | },
366 | {
367 | "name" : "Warehouse Sorter",
368 | "file" : "warehousesorter",
369 | "extension" : "ipf",
370 | "fileVersion" : "v1.0.0",
371 | "releaseTag" : "warehousesorter",
372 | "unicode" : "📖",
373 | "description" : "個人倉庫にソートボタンを追加します。",
374 | "tags" : [
375 | "warehouse",
376 | "sort"
377 | ]
378 | },
379 | {
380 | "name" : "Remove New Collection Mark",
381 | "file" : "rmnewcollectionmark",
382 | "extension" : "ipf",
383 | "fileVersion" : "v1.0.0",
384 | "releaseTag" : "rmnewcollectionmark",
385 | "unicode" : "📖",
386 | "description" : "コレクション画面に表示される[N]マークを消します。サブキャラ育成時にどうぞ。",
387 | "tags" : [
388 | "collection"
389 | ]
390 | },
391 | {
392 | "name" : "Master Place",
393 | "file" : "masterplace",
394 | "extension" : "ipf",
395 | "fileVersion" : "v1.0.0",
396 | "releaseTag" : "masterplace",
397 | "unicode" : "📖",
398 | "description" : "クラスマスターの所在地を教えてくれます。",
399 | "tags" : [
400 | "classmaster"
401 | ]
402 | }
403 |
404 | ]
405 |
--------------------------------------------------------------------------------