goodgames
追加機能一覧
最終更新:
goodgames
-
view
BC2サーバ用に実装した追加モジュール群について
相変わらず文字ばっかりで読む気がしないでしょうが...
| 項番 | 機能名 | 概要 | BF3への移植について |
| 1 | チームバランサー (ラウンド終了後のプレイヤー一括交換機能) | いわゆるシャッフル機能の拡張版です。シャッフル機能はラウンド終了時に単純なルールか乱数によってプレイヤーを振り分けますが、この機能は直前のラウンドのSPMを用いて両チームの平均SPMが出来るだけ乖離しないよう、チームバランスを考慮して振り分けを行っています。 | まずは単純なシャッフルで十分でしょう。これなら短時間で移植可能です。 |
| 2 | アンイーブン解消機能 (ラウンド中のプレイヤー交換機能) | ラウンド開始後にプレイヤーの途中切断が発生し、チーム間のプレイヤー数に大きな差が生じた場合、やむを得ずプレイヤーのチーム変更を余儀なくされるケースがあります。出来る限りラウンド中のチーム移動を最小化しつつ、アンイーブン(換言すればチームバランスが保たれていない状態)を最短にすることを目的に色々とアルゴリズムについて検討いたしました。 尚、優位な状況にあるチームの方がプレイヤー数が少ない場合、意図的にアンイーブンな状態を放置することがあります。 これについては反対意見も多く頂きましたが、移動対象となってしまったプレイヤーのことを考慮すると、出来るだけ強制チーム移動を最小化したいとの方針によるものです。 ですが「有利なチームへの移動ならイヤじゃないでしょ」とのツッコミもありましたが。(笑) |
汎用化することを考慮すると広範な要件に対応出来る機能仕様とする必要がある。しかし長い開発期間を確保することは現実的でないため、まずは容易な実装にします。 |
| 3 | チーム移動禁止機能 | 技術的な意味ではなく仕様的に最も苦しんだのがこの機能。何よりもFrostbiteの仕様が謎に包まれているため、システムにより自動的にプレイヤーが移動するタイミングとその根拠が不明でした。これらのケースを正常な移動と識別し、その他のケースはプレイヤーによる意図的なチーム移動であると判別する必要があるため、かなり多くの例外的な処理を実装する必要があり、ソースコードはかなり複雑なものになりました。 | 既に完成し本稼働中 |
| 4 | 強制不利Join機能 | プレイヤーが接続した際、どちらのチームに所属することになるかを決定するためのFrostbiteの仕様は次の通りです。 フレンド機能による接続が行われ場合、一部の極稀な例外を除きフレンドを呼び出したプレイヤーと必ず同じチームに所属する。 フレンド機能以外の接続で、プレイヤー数に差がある(アンイーブンになっている)場合、プレイヤー数の少ないチームに所属する。 フレンド機能以外の接続で、プレイヤー数が同数なら必ずUS所属となる。 しかし、強制不利Join機能はこれらのルールを完全に破壊し、新たに接続したプレイヤーを不利な状況にあると判断されるチームに所属させます。 例外として32人目のプレイヤーだけは満員になっていないチームの所属となります。 これは当然ですが。 |
これも要件検討に時間を要するため、当初は単純な実装にて対応。 |
| 5 | 消極的プレイヤーお断り機能 (通称、芋キッカー) | 「積極的な行動によりチームの勝利に貢献しようとするプレイヤーは自ずとスコアも伸びるはず」との考えからラウンド内SPMをチーム平均と比較し、一定の割合に満たないプレイヤーを消極的プレイヤーと判断し、数回の警告を行ったうえで改善しない場合にはKickする機能。 但し、積極的に行動はしたものの成果に結びつかずスコアが伸びなかったプレイヤーへの救済措置として、Kill数とDeath数の合計をチーム平均と比較し、一定割合を超えていればKick対象から除外するルールも実装。 この機能により、やる気はあるけどNOOBなプレイヤーはKickされにくくなります。 |
BF3では高ポイントが得られる蘇生が多用されることから、SPMのみで判断することは少々乱暴なところがある。 BattleLogの内容を使用するとさらに実現できる機能が広がる。 どちらにせよ機能要件の確定に多大な時間を要する。 比較的短時間で完成させるためにはBattleLogの内容をもとに、ラウンド中の判断ではなく、接続と同時にプレイヤーとサーバとの適応性を判断することが望ましい。つまりラウンド中の戦績ではなく過去の戦績を用いる方式。 |
| 5 | DBロギングエンジン | これはプレイヤーさんに直接の影響を与えるものではありませんが、ゲームサーバおよびEAマスタサーバから送信される膨大な情報を、リアルタイムで蓄積し状況に応じて再利用するためのカラクリです。 ほぼ全ての機能はこのデータベースと接続され、過去の情報を参照することにより状況判断を行います。 |
既に稼働中 |
| 6 | 早期終了機能 | プレイヤーさんより頂いた案を元に実装した機能。 全拠点喪失状態に陥った場合、一定時間内にひとつでも拠点を奪還出来なければゲーム終了とする機能。 いわゆるベースレイプがさっさと終わる効果もあります。 この案を頂いたとき「拠点状態が取得できないから実現不能」と言ってしまったにもかかわらず、色々と迂回手段を連発して実現できてしまった個人的傑作です。たぶん世界中探しても他にこの機能が実装されたサーバは無いと思います。 |
BF3ではBC2以上に拠点状態の取得が困難と考えられるため実質的に実装不可能だと思います |
| 7 | ベースアタックプロテクション | 文字通りの機能ですが、敵ベース内に進入し戦闘行為を行うことを規制するための機能。 敵ベース内でKillすると自分もKillされてしまいます。これを何度か行うとKickされます。 Frostbiteの座標検出精度と謎のバグに阻まれて、機能の割には苦労しました。 |
10秒ルールの適用範囲に各チームのベースが含まれるため、本機能は不要だと思います。 |
| 8 | ベース内からの狙撃禁止 | これはベースアタックプロテクションと正反対の機能です。 ベース内でキャンプするプレイヤーには何度か強制Killと警告メッセージの表示を行い、改善しない場合にはKickされてしまう機能です。 |
現状ではゲームサーバが鯖缶端末にプレイヤーの位置情報を送ってくれないため実装不可能です |
| 9 | リージョンフィルター | 特定国からの接続を拒否する道具です。 あまりにもチーターが多い特定の国からの接続を遮断していました。 |
恐らく誰かが既にProconのPluginとして提供していると思います。 |
| 10 | ランクリミッター | いわゆるNOOBサーバってありますね。 でもBC2では規定ランクを超えているプレイヤーがなぜか接続できます。 不思議に思っていましたが、鯖缶ごっこを始めてすぐに理解しました。 Frostbiteに純正搭載されているランクリミッターには致命的なバグがあり、結局最後まで修正されませんでした。 そこで自分で作ってしまおうかと。 でもランク情報はゲームサーバから取得できないため、EAマスタサーバに接続する必要があり、マスタサーバはレスポンスが悪く接続エラーを頻発してくれたため、技術的に色々と苦労しました。 この機能を流用すれば、正反対の仕様になるNOOB様お断りサーバも簡単に作れます。 |
BF3のプロトコル仕様書からはランクリミッターの表記が無くなりましたので、純正搭載されることは無いと思います。しかしBattleLogからプレイヤー情報を取得できますので、寧ろBC2より簡単かつさまざまな形で実装可能だと思います。 |
| 11 | チーター自動撃退機能 | PunkBusterのようにシステム的な検知機能を追加で実装することは不可能ですので、戦績をリアルタイムで統計的に評価し、おかしなことになっているプレイヤーをチーターとしてKick/Banしてしまう機能。 五万五千人のプレイヤーと数百万のKill情報、これだけ色々と蓄積されていると異常値が連発するプレイヤーをすぐに発見することが出来ます。200mからPKMでヘッドショット8連発とか... インフラの問題でリアルタイム化するのに時間がかかり、機能として完成してから一ヶ月足らずでサーバ閉鎖となりました。 |
プレイヤーの位置情報が取得できないところが痛いですね。まずは多数の戦績を収集しないと何も出来ませんが。 |
| 12 | 可変アイドルタイムアウト | いわゆるAFKキッカーですが、状況に応じタイムアウト値を変更できます。実はこれプレイヤーさんのことを考えると結構重要なんです。 無人サーバになってしまった場合、次に接続するひとは当然ながら1人ぼっち。2人目が接続するまで暇なんですね。 その間、部屋の掃除をしながら待っていたらいきなりAFKでキックされたんじゃ悲しいですよね。こんなことにならないよう、人数によって機能の使用有無やキックの閾値を変更できるようにしていました。 |
必要なら容易に実装可能です。 |
| 13 | グローバルBANコントロール | どこがグローバルなんだ。(笑) 一時期は5台ほどBC2サーバを稼動させていました。それぞれのサーバに分散してBAN情報が存在するのはメンテナンス作業に手間がかかるため、DBに登録された情報を元に全てのサーバで同一のBAN情報を参照するような方式を使用していました。 |
BF3の場合はいわゆる和鯖全体で情報共有することが望ましいと考えられますが... |
| 14 | HighPingキッカーR2 | HighPingキックなんて似たようなものがどこにでもあるのですが... 一般的な機能と大きく異なるところは2点。 接続者数によって動的にキックの閾値が変化すること。 これはプレイヤー数が少ないときにキックしてしまうと、さらに人が減ってしまい一気に無人サーバになってしまう恐れがあるため。 もう一つは日本国内からの接続はPingの値を問わずキックの対象外とする機能。 山間部や離島などからの接続は狭い日本国内でもPingが300に達することがあります。過去に何度か説明していますが、現代のゲームエンジンではHighPingさんが他のプレイヤーに悪影響を及ぼすことはまずありません。それでもHighPingキックが横行するのは、未だにラグの原因がHighPingプレイヤーにあるとの都市伝説(笑)が横行していることと、地元優先設定にするための口実でしょう。と言う訳で私も後者を理由にHighPingキックを稼動させていましたが、前述の通り国内でもインフラの整っていない地域からの接続ではキックされてしまうことがあることが判明致しました。 そのため接続元が日本国内の場合にはHighPingキックの対象外としていました。 |
BF3では一転して状況が変わりました。ゲームサーバから各プレイヤーや鯖缶端末にPing値を送信しなくっています。そのため単純にHighPingキックを実現することはできません。鯖缶端末側では各プレイヤーのIPアドレスが取得できるため、そのアドレスに対してPingを送信し応答時間を測定するような機能を実装する必要があるでしょう。但し、HighPingさんがラグの原因であるとの「説」は現代では通用しませんので、この機能自体が不要だと思います。日本国内優先接続にしたければリージョンフィルターを使うほうが適切です。 |
| 15 | 射撃距離表示 | Killするごとにチャット欄に距離が表示される機能。Frostbiteの問題で10m程度の誤差があったことが難点。 | BF3ではプレイヤーの位置情報が取得できないため実装不可能 |
| 16 | 倒した敵のランク表示機能 | BC2標準の機能では、こちらが倒された場合は敵の名前や装備とともにランクも表示されます。 しかし、こちらが倒した場合だと敵の名前しか表示されません。 そこで敵のランクも表示されるような機能を実装しました。 これはNOOB様が「元帥様倒したぜ」と楽しむための機能です。(笑) |
いらないでしょう。どこに表示するかも問題ですし。 |
| 17 | 可変マップコントローラ | プレイヤーさんから寄せられたアンケート回答に「いつも同じ順番でマップが回ってくると次のマップが何だか分かってしまう」との指摘が。 私自身がローテーション順序なんて全く覚えていないのに、そんなことまで記憶していてくれるほどの常連さんがいたとは... 期待にお応えし作りました。マップの種類は事前選択式ですが、ローテーションの順序はランダムになる機能です。 |
マップローテーションの機能にバグがあると聞いていますが、それが足枷になることが無ければ簡単に実装可能です |
| 18 | "PLEASE SPOT"表示 | 数分毎にチャット欄にこのような文言が表示される機能。 「あれ、しつこいよ」と職場の同僚に指摘され、一定の条件を満たすプレイヤーの場合には、表示されなくなるよう機能を追加。 |
BF3でも簡単に実装できますが、チャット欄に表示しても目立たないのが問題。さらにサーバから自動送信されるチャットは全てのプレイヤーに一斉送信する機能しか存在しないため(*1)、特定のプレイヤーのみにチャット送信することは出来ません。 (*1)この点はいずれ改善されるそうです。 |
| 19 | "PLEASE JOIN SQUAD"表示 | これはチャット欄ではなく画面中央に大きな文字でメッセージを表示する機能。 チャット欄だと見落とす可能性がありますが、こちらなら見落とす心配はありません。分隊に所属していない状態でSpawn/Respawnすると毎回大きな文字が画面中央で点滅します。 尚、この大きな文字を回避するために「1人鍵付き分隊」が作られたことが何度もありました。まぁそこまでして1人が良ければこれ以上言うことはありませんが。(笑) |
画面中央の大きな文字表示はYellコマンドにて実現していますが、この機能自体が廃止されてしまいました。仮にこの機能を実装するならばチャット欄を使用することになりますが、上記18.と同様の問題におちいります。 |
| 20 | 兵科別プレイヤー数表示 | 所属チーム内のプレイヤーを兵科別にカウントし、Death直後にチャット欄に表示する機能。 Death直後とはRespawn直前を意味するので、次の兵科選びの参考になるはずです。 と言いたいところですが、「芋だらけじゃーん」と絶望するための機能だったかもしれません。(笑) |
BF3では実装不能です。理由はSpawn/Respawn時の兵科が取得できなくなったため。 |
| 21 | 下手な蘇生お断り機能 | BC2の微妙な仕様として「蘇生されてもDeathは消えない」点が挙げられます。 これはこれで良いのかもしれませんが、蘇生した側には大きなポイントが与えられるため、周囲を敵に囲まれた状態での無理な蘇生などが横行するケースもありました。 そのような状況下で蘇生されても、もう一度倒されてさらにDeathが増えるだけですので、蘇生されたプレイヤーやチームにメリットはありません。 そのため、蘇生されたプレイヤーが蘇生直後に倒された場合にはペナルティとして、蘇生したプレイヤーもKillさせていただく機能です。 これが何度か続くとKickの対象となります。 |
BF3では蘇生されればDeathが増えませんのでこの機能は不要でしょう。 |
| 22 | 切断直後の再接続禁止機能 | 一度切断すると数分間は再接続を禁止する機能。 これは極一部のプレイヤーがチーム移動が出来ないことを知り、一度切断して再接続することにより別のチームに所属されることを期待するプレイヤーがいることが判明したため実装された機能です。 また各種Kick機能により強制退場となったプレイヤーがすぐに戻ってくることを防止する機能でもあります。 |
実装は簡単ですが必要性を検討してから実装します。 |
| 23 | 常連さん優遇機能 | 前述の機能のうち一部において、100ラウンド以上の戦績がある常連さんに限り、制限を解除する追加機能です。&()一例を挙げると、切断直後の再接続禁止機能などがその対象となっています。切断直後の再接続が発生する「意図的ではない」要因としてPCの不調が挙げられますが、これを鯖缶側でシステム的に判断することは困難です。 切断直後の再接続を制限する目的はチーム移動ですが、常連さんは当然そのようなことはしませんし、常連さんであればKickされるようなプレイをすることはありません。 従って、不慮の事故によって切断されてしまったようなケースなどにおいて、既に多くの実績のあるプレイヤーに限り制限条項から除外するようになっています。 |
当面は必要ないでしょうし、過去の戦績情報を記録できる環境でなければ使えない機能ですので当面は見送ります。 |
| 24 | 強者キッカー (番外編) | この機能だけはうちのサーバにて本稼動した実績はありません。 NOOB専用サーバの鯖管さんより純正RankLimiterの不具合について相談を受け、急遽代替品をつくりました。 当該ラウンド中の戦績によりNOOBとはみなせないと判断された場合、該当のプレイヤーはKickされます。 本当はNOOBなのに偶然調子が良かった場合など、必ずしも適切に判定されていたとは言えないところもありますが、無双する元帥様に退場願う道具としては使えたと思います。 尚、この機能だけは他の鯖管さんが使用することを前提としていたため、ProconのPluginとして実装しています。 |
ランクリミッターまたはそれに順ずる機能を実装予定。 |
| 25 | ランキング機能(さらに番外編) | これはもはや機能といえる範疇のものではありませんが、こちらのようなことを実現するものです。 | 諸般の事情により当面は予定無し |