SourceMODでどうやってプレイヤーの位置にエフェクトを生成するか
TF2を例にして簡単に説明を。まずTF2で使えるParticle一覧はこれ。Particle = Effect
https://developer.valvesoftware.com/wiki/List_of_TF2_Particles
unusual_* 系統はいわゆるアンユージュアルの帽子のエフェクト。
これを世界に出現させるには、info_particle_systemというPointEntityを生成して、プロパティのeffect_nameにこのparticleの名前を設定するだけで良い。
new ent = CreateEntityByName("info_particle_system"); DispatchKeyValue(ent, "targetname", "tf2particle"); DispatchKeyValue(ent, "effect_name", effect_name); DispatchSpawn(ent) ActivateEntity(ent); AcceptEntityInput(ent, "start");
startっていう名前のイベントをこのinfo_particle_systemエンティティに送信するとアニメーションが開始される。
で、これをたとえばプレイヤーの位置に風船を出し続けたいときなんかはどうしたら良いのかというと、基本的にほとんどのエンティティにはSetParentやParentプロパティというのがあって、いわゆる親エンティティを設定できる。これを設定しておくと、親が動いたときにおなじ移動量だけそのエンティティを動かすことが出来るんですね。
だから親エンティティをプレイヤーのエンティティに設定したinfo_particle_systemを作成してあげればプレイヤーの位置に常にParticleを出現させることが出来ます。
以下はentというエンティティを親にもつparticleの設定例です。
decl String:name[128]; Format(name, sizeof(name), "target%i", ent); DispatchKeyValue(ent, "targetname", name); DispatchKeyValue(particle, "parentname", name); SetVariantString(name); AcceptEntityInput(particle, "SetParent", particle, particle, 0); AcceptEntityInput(particle, "SetParentAttachment", particle, particle, 0);
最後に、風船をたくさん出現させる方法です。エフェクトはstartイベントが発火されたタイミングでアニメーションが始まり、これは非同期に出現するっぽいので、startイベントを送っただけアニメーションを生成することが出来ます。(それだけ風船を出現させられる) で、startイベントを大量に送れば良いのですが、startしているときにstartイベント送っても無視される仕様になっているため、start, stop, start, stopと短い間隔で送信するようにします。以下はそれを実現したコードです
// Particleを生成したときに、CreateTimer(0.1, Timer_Sequence1, particle); を実行する public Action:Timer_Sequence1(Handle:timer, any:particle) { AcceptEntityInput(particle, "start"); CreateTimer(0.3, Timer_Sequence2, particle); } public Action:Timer_Sequence2(Handle:timer, any:particle) { AcceptEntityInput(particle, "stop"); CreateTimer(0.3, Timer_Sequence1, client); }
こんな感じでTimerを数珠つなぎにして、Timer_Sequence1でstart、Timer_Sequence2でstop発呼するときれいなコードになるんじゃないでしょうか。上記コードでどうやってエフェクト停止すんじゃぼけってなるかもしれませんが、俺のコード見れば参考になるかも?
https://github.com/kimoto/sourcemod-plugins/blob/master/scripting/sushi_effects.sp