1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

私はLoLが好きです。
特に、友だちを集めてみんなでLoLをするのが大好きです。

ドラフトで練習したり、メイヘムで殴り合ったり、スイフトでオフメタしたり。

夕飯後に、Discordでボイスチャットしながら、みんなでワイワイ数戦やって、
「じゃあ今日はこのへんで」と解散する。

ここまでは平和です。

でも、問題はそのあと。

最後の試合で負けたり、自分の思うようなプレイができなかったりすると、

「いや、さすがにこのまま寝られない」
「ラスト1回だけ」
「勝って終わろう」

みたいな気持ちになって、気づいたらソロキューを入れてしまう。

そして、気づけば深夜3時。まじかよ。
やばい、今日も寝不足。

作ったもの

そんな自分を止めるために、ソロキューだけマッチングを自動キャンセルするプログラムを作りました。

やることはシンプルです。

  • LoLクライアントの状態を監視する
  • 1人ロビー、つまりソロ状態か確認する
  • ソロ状態でマッチング検索が始まったらキャンセルする
  • 検索キャンセル前にマッチングしてもReadyCheckを辞退する
  • 2人以上のパーティでは何もしない
  • 対戦中の操作には関与しない

今回止めたいのは、解散後に始まる「納得できないからもう1戦」だけです。
他には影響が出ないように、ソロキューだけ阻止する仕組みを作りました。

Snapshot_396.PNG
↑この状態になると、すぐにキャンセルされる。

※この記事では、細かい実装よりも「なぜ作ったか」と「どういう仕組みにしたか」を中心に記載しています。
 LCU APIの詳しい呼び出し方やWindowsサービス化の話は、別記事でまとめる予定です。

仕組み

LoLクライアントには、ローカルで動いているAPIがあります。
いわゆるLCU APIです。

このAPIを使って、現在のロビー人数やマッチング検索状態を確認します。

ざっくりした流れはこんな感じです。

LoLクライアント起動
↓
ロビー人数を確認
↓
1人ロビーか判定
↓
マッチング検索中か確認
↓
ソロ検索中ならキャンセル

使っている主なAPIは以下です。

目的 メソッド パス
ロビー取得 GET /lol-lobby/v2/lobby
ロビー人数取得の補助 GET /lol-lobby/v2/lobby/members
検索状態取得 GET /lol-lobby/v2/lobby/matchmaking/search-state
検索キャンセル DELETE /lol-lobby/v2/lobby/matchmaking/search
Ready Check取得 GET /lol-matchmaking/v1/ready-check
Ready Check辞退 POST /lol-matchmaking/v1/ready-check/decline

大事にした判定

一番大事にしたのは、ソロのときだけ動くことです。

2人以上で遊んでいるときに勝手にマッチングを止めたら、ただの迷惑ツールになってしまいます。

なので、ロビー人数が確認できて、かつ1人だと分かった場合だけ動くようにしました。

lolsq_guard/controller.py
is_solo_lobby = member_count is not None and member_count < 2

if is_solo_lobby and searching:
    cancel_matchmaking(lcu)

if is_solo_lobby and should_decline_ready_check(ready_check):
    decline_ready_check(lcu)

ポイントは、member_count is not None を入れているところです。

ロビー人数が分からないときは、ソロだと決めつけません。
分からないなら何もしない。
こういう自動化では、動くことよりも「動かないべき場面で動かないこと」のほうが大事だと思っています。

Windowsで常駐させる

毎回手動でスクリプトを起動していたら、そのうち面倒になって使わなくなります。

なので、Windowsサービスとして常駐させました。

構成はこんな感じです。

名前 役割
LoLSQGWorkerSvc 実際にLCUを監視するサービス
LoLSQGuardianSvc workerの監視と復旧を行うサービス
LoLSoloQueueGuard_Bootstrap OS起動時やログオン時の復旧用タスク

意識したのは以下です。

  • PC再起動後も動く
  • スリープ復帰後も復旧する
  • 余計なウィンドウを出さない(バックグラウンドで完結する)
  • 落ちても復旧できる
  • 必要なときは状態確認や緊急停止ができる

image.png
↑LoLの起動有無に依らず、常駐サービスとして稼働中。

タスクスケジューラ.png
↑タスクスケジューラはスタートアップ時、ログオン時、定期実行で設定。

動作確認

確認した内容は以下です。

  • 1人ロビーで検索を開始すると、すぐに検索がキャンセルされる
  • 1人ロビーでReady Checkが出ると、すぐに辞退される
  • 2人以上のパーティでは検索キャンセルもReady Check辞退も行われない
  • ロビー人数が取得できない場合は何もしない
  • 対戦中の状態には干渉しない
  • サービス停止後に復旧できる

ステータス確認と緊急停止

常駐系のツールなので、動いているか確認できるようにしています。

cd <project-root>
.\Check-LoLSoloQueueGuardStatus.ps1

止めたいとき用に、緊急停止スクリプトも用意しました。

cd <project-root>
.\Emergency-Stop-LoLSoloQueueGuard.ps1

それでも止めようと思えば止められる

もちろん、自分のPCなので、自分には管理者権限があります。

やろうと思えば、サービスを止めることはできてしまいます。
別に完全な強制力があるわけではありません。
というか、しっかり自制心を働かせていれば、こんなものはそもそも必要ありません。

でも、今回実装してみて書き残したかったのは、そういう身も蓋もない話ではありません。

自分で仕様を考えて、LCU APIを調べて、サービス化して、復旧処理も入れて、動作確認までしました。

そこまで時間と工数をかけると、

「せっかく作ったんだから、ちゃんと機能させたい」

という気持ちが出てきます。

結果として、深夜に勢いでソロキューを始めることはなくなりました。

技術的にはただの自動キャンセルですが、実際には自分の行動にワンクッション置くための仕組みでした。

作ってみて思ったこと

今回のプログラムは、ものすごく高度なことをしているわけではありません。

でも、自分の悪い習慣に対して、コードで物理的な摩擦を作れたのがよかったです。

「やめたい」と思っているだけだと、欲望に負けてしまうこともあると思います。
(特に休日前だと、言い訳できてしまいますからね…。)

でも、仕組みを作っておくと、一歩踏みとどまることができるかもしれません。

これは、何もゲームのやりすぎだけに効く話ではないと思います。
SNSやYoutubeでの時間浪費を防ぎたいなら、Wiresharkとか使ってトラフィックログでも取って、閾値を超えたら制限してしまうとか。

逆に、継続したい習慣に対しても利用できる考え方です。
筋トレ管理アプリを自分で作ってしまえば、そのアプリを使うために筋トレの習慣が付くかもしれません。

そして、それでQiitaの記事を書いてしまえば、一石二鳥ではないですか。

遠回りに見えることが、実は効率的で省エネな制御法になることも、覚えておこうと思える開発体験でした。

まとめ

LoLがやめられないので、ソロキューだけマッチングを自動キャンセルする常駐ガードを作りました。

技術的には、LCU APIを監視して、ソロロビーでのマッチング検索とReady Checkを止めるだけのシンプルな仕組みです。

ただ、自分にとって大事だったのは、完全にゲームを禁止することではありませんでした。

友だちと遊ぶLoLは残しつつ、
解散後に始まる「納得できないからもう1戦」だけを止める。

そのために、以下を意識しました。

  • ソロロビーのときだけ動作する
  • 2人以上のパーティでは何もしない
  • ロビー人数が分からないときも何もしない
  • Windowsサービスとして常駐させる
  • 自分の行動にワンクッション置く

意思の力だけで毎回勝てるなら、それが一番です。

でも、深夜の自分はだいたい強いですからね。
正面から欲求と戦うのではなく、コードで少しだけ摩擦を作ることにしました。

ゲームを完全に禁止するのではなく、
「やりすぎる瞬間」だけをターゲットにして、仕組みで止める。

自分には、これくらいのゆるい制御がちょうどよかったです。

実装の詳細、LCU APIの扱い、Windowsサービスとして常駐させる構成については、長くなってしまうので、別記事であらためて整理しようと思います。

ここまで読んでいただき、ありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?