・えへくと ゲーム中に武器を発砲すると銃口が光りますね(MUZZLE FLASH)、マシンガンを発砲 したら弾道が描かれ(TRACER)、着弾点には火花や水飛沫が上がります。 実際にエフェクトの発生&描画処理を行うのはクライアント側だけの処理ですが、 エフェクト発生を指示するのは主にサーバ側です。 これらエフェクト処理のしくみについて調べてみましょう。 でも、このドキュメントはサラっと読むだけでいいし、あんま分かんなくてもいいでしょう。 どうせ次で実際に作成してみるんですし。 |
||||||
・コールバック関数登録 エフェクトを発生させる方法の一つにコールバック関数登録の方法があります。 クライアント側であらかじめエフェクト名称に対するコールバック関数の登録を行っておき、 サーバ側からそのエフェクト名称指定でエフェクト発生を指示する方法です。 例えば下記の例のようにクライアント側でコールバック関数の定義を書き、DECLARE_CLIENT_EFFECTを 使ってエフェクト名称"MyEffect"とコールバック関数名を指定しておくと、client.dllがロードされた際に "MyEffect"へのコールバック関数割り当てを勝手にやってくれます。
そんでもってサーバ側でDispatchEffectを呼び出す際に"MyEffect"を指定やりゃあいいんです (クライアント側の処理で必要な値をdataにはセットしとかないといけません)。 また、武器の発砲等、プレイヤー自らのアクションでエフェクトの発生が明白な物は サーバ、クライアント側両方でDispatchEffectを呼んでしまっていいようです。 自分の起こしたアクションなのにサーバからのDispatchを待ってると 「銃撃ってるとすげえラグいモタついた反応だぜ、氏ねやボケェ!」といった苦情がプレイヤーから出てしまうので、 事後承諾の形で先にクライアント側で処理しちゃえってことなんでしょう。
上の例ではコールバック関数内の処理は空っぽですからDispatchEffectされたって 当然何にも起こりません。 |
||||||
・フラグ変化検出 サーバ→クライアントへ更新のかかる変数の変更を検出して、エフェクトを発生させる方法です。 例としては、サーバ側でCBaseAnimating、クライアント側でC_BaseAnimatingから派生したクラスの エンティティで使用しているモデルが1個以上のアタッチメントを持っている物(qcファイルに"$attachment"指定を書いてコンパイルされてる)。 そのクラスに対してメンバ関数DoMuzzleFlash()を呼び出すとアタッチメントの示す相対座標と方向へこの色を0.5秒間発光させてくれます。 これはメンバ変数m_nMuzzleFlashParityのフラグ値をサーバ側、もしくはクライアント側で変更された ことをclient.dllで検出してエフェクトを発生させてます。 |
||||||
・アニメーションのイベント アニメーションのイベントからエフェクトを発生させる方法です。 武器ビューモデルのMUZZLE FLASHを例に挙げると、仮にモデルのQCファイル中にこんな記述が あったとします。
$sequenceのイベント記述で指定されている"AE_MUZZLEFLASH"はMUZZLE FLASHのイベント指定です。 その後にディレイ指定があって、その後に"SMG1 MUZZLE"の記述があります。 クライアント側ソースでc_baseanimating.cppの2975行目を見ると AE_MUZZLEFLASHのイベントを検出してから2638行目のDispatchMuzzleEffectメンバ関数に飛んでます。 で、その飛んだ先では"SMG1 MUZZLE"の記述を"SMG1"と"MUZZLE"に分け、前者をMUZZLE FLASHのエフェクト種、 後者をアタッチメントの指定として扱います。 処理を見る限り、$attachmentの記述で"muzzle"と記述しているからイベントの方で"SMG1 MUZZLE"と書いてある だけで、仮に
|
||||||
・どうやって画面に出すんよ? 上記どの手段を取ろうが最終的にはクライアント側のエフェクト発生&描画処理に行き着くわけですが、 銃口が光るのもエフェクト、銃口が火を噴くのもエフェクト、弾道が光るのもエフェクト、 着弾点で破片や火花が散るのもエフェクト、爆発もエフェクト・・・。色々あって腹立ってきます。 一番お手軽なのはFX関数を呼ぶことですかね。いくつか紹介しましょう。これらの関数を使用する場合にはclientsideeffects.hやfx_quad.hをインクルードすんのを忘れずに。 ・FX_AddCube/FX_AddCenteredCube
でもそれ以前にこれって使い道がねーよ。 例:
なんだかパっとしねえな、どうでもいいや ・FX_AddDiscreetLine
例:
ひゅ〜ん! ・FX_AddQuad
vmtに$nocull 1が指定されているスプライトじゃないと裏側から見えないので注意 (分かりやすく言うと、プレイヤー視点からoriginを見た方向とnormalの指す方向の角度差が90度未満なら裏側から見てるんだと思ってください、90度ピッタシなら真横から見てることになるから$nocull 1に指定されてても描画面は見えねえ・・・たぶん)。 例:
くるくる回りながらちっちゃくなって消えてっちゃう♪ |