alchemistarkの日記

やったことのメモ

Entityについて解説したい 3

InputとOutputについて解説すると言ったな

します


まずEntityのInputとOutputとは何か、なのですが
単純にEntityに何かを入力する、Entityが何かを出力するという認識でOKです。

僕はオブジェクト指向プログラミングというのがよく分かっていない人間なのでこういう說明をするのもなんなのですが
EntityClassnameはそのままクラス、Entityの実体はインスタンス、InputとOutputはメソッドと返り値みたいな感じです。
また別に解説するとは思いますが、インスタンスのようにポンポンEntityを作成する事も可能です。

ブン投げるようでアレですが、InputとOutputに関してはHammerを起動した方が早く分かります。
Hammer講座でドアを作っている部分の解説がそれに当たります。

Valve ハンマーエディタ講座 4.1

Hammerだと、設置したEntityがプレイヤーの動きやゲームの進行によってOutputを発信するように設定し、
そのOutputを別のEntityのInputに送り込むようになっています。*1

SourcePawnからInputを行う場合とは流れが少し違うのですが、まずEntityのInputとOutputがどう設定されているかを上記ページでおおまかに理解しておいてください。

では、SourcePawnからInputとOutputを操作するにはどうするか

とりあえずはInputから。
例としてやはり"team_control_point"を使いますよ
Entityのページを復習しておいてね
team_control_point - Valve Developer Community

new ent = -1;
while((ent = FindEntityByClassname(ent, "team_control_point")) != -1){	//名前からエンティティを探す
	AcceptEntityInput(ent, "Disable");
}

関数のリファレンスはこちら
AcceptEntityInput · sdktools_entinput · SourceMod Scripting API Reference

これでDisableというInputを叩いたので、CPが無効化されます。個別のチェックしてないから見つかったCP全部無効になるね

activator、caller、outputidは省略可能です。
ただし必要とするInputもあるので、上手く動かなかったら指定してやってください。outputidが必要なのは今のところ見たことがないです。
具体的には本来Outputを送るはずだったEntityや、起動したプレイヤーを入れてやると良いです。特になければ0でも。

使えるInputはEntityによって違うので、Entityのページは良く見るようにしましょう。
HammerからもInput名は見えますが、說明は無いので…

なお、KeyValueのところは違います。
HammerでEntityのプロパティを開いた時、最初に表示されているプロパティ一覧がKeyValueです。
Flagは隣のタブだよ

次は、引数を必要とするInputの場合。
例えばSetOwnerというInputは、チーム番号を受け取ってCPをそのチームに取得させます。

	SetVariantInt(TFTeam_Blue);
	AcceptEntityInput(ent, "SetOwner", client, client);

TFTeam_Blueは定数です 3が入ってます。 TFTeam_Redは2 要tf2.inc
今更だけどこの記事で説明してる関数はほぼ全部sdktools.incが必要です*2

SetVariantInt関数の説明はこちら。
SetVariantInt · sdktools_entinput · SourceMod Scripting API Reference

Sets an integer value in the global variant object.

グローバルバリアントオブジェクトに整数値を設定します。

なんだよグローバルバリアントオブジェクトって。

…またよく分かってなくて申し訳ないのですが
僕は専用のバッファかなんかあるんかなぁという認識です。

SetVariant~関数でバッファに値を入れて、AcceptEntityInputでInputを送信する時にバッファの値も一緒に送信しているんだと思います
確かAcceptEntityInputした時に中身消えたと思うから次同じ値使う場合も再度SevVariant~した方がいい…はず した方が無難

SetVariantうんたらという関数が幾つかあるのですが、
これらはInputの引数の型に対応していて
与える値の型に対応した関数を使う必要があります。

んで

	AcceptEntityInput(ent, "SetOwner", client, client);

ここでactivatorとcallerにclient番号入れてますが、SetOwnerはactivator渡さないと動きません…
ポイント取得者を表示するために必要な情報なのだと思います。*3

とりあえずこれでInputは送信できるはず
次はどうしようかな OutputにするかKeyValuleにするかSpawnにするか
EntPropは最後にしようと思ってる*4

*1:HammerだとInput側(受ける側)にもどのEntityからOutputが送られているか表示されるので便利 Input(受ける)側では設定できないのに注意

*2:これは酷い

*3:0でも動くかなどうかな

*4:これが一番有益じゃねーの何で最後やねん