alchemistarkの日記

やったことのメモ

Entityについて解説したい 2

InputとOutputについて解説すると言ったな?
あれは嘘だ

InputとOutputするにはまずInputOutputしたいEntityを見つける必要がありますね
InputOutputについてはそれから

ここでは例として"team_control_point"エンティティを探してみるよ
これはキャプチャーポイントのEntityで、A/Dや5CPやKOTHに設置してあるアレね。
なお、画面に表示されてるCPのHUDやキャプチャー可能なエリアを設定してるのは別のエンティティだよややこしいNE

team_control_point - Valve Developer Community
Entityの詳細ページはこちら。

Entityを探す関数はFindEntityByClassname関数

FindEntityByClassname · sdktools_functions · SourceMod Scripting API Reference
関数の説明はこちら。

この関数は、指定したEntity番号以降のEntityの名前を順番に検索していって、最初に指定の名称のEntityを見つけたらそのEntity番号を返します。
なので検索して出てきたEntityが、自分の求めているEntityかどうかはまた色々しないと分かりません。

使い方。はいこれテストに出まーす。

new ent = -1;
while((ent = FindEntityByClassname(ent, "team_control_point")) != -1){	//名前からエンティティを探す
	PrintToServer("Entity %d はteam_control_pointです",ent);
}

まず、初期値が-1なので、存在する一番若番のEntityから検索を開始します。
Entityのクラス名が"team_control_point"のEntityを発見したら、そのEntity番号を返してくるので、entの値が更新されます。
見つかったEntity番号に対して処理を行った後、そのEntity番号を引数に再度検索します。
Entityが見つからなかったら-1が返されるので、ループを抜けます。

つまり、Entity番号が0から9の10個のEntityがあったとして、そのうち2と5がteam_control_pointだったとすると、

Entity 2 はteam_control_pointです
Entity 5 はteam_control_pointです

となるわけ。
例えば、kothとかだとCPは1つですが、5CPだと5つあるので上記の例だとPrintToServerが5回実行されるはず。

何故ループを回す必要があるかは単純に同じ種類のEntityが複数あった場合、探しているEntityが検索した1件目とは限らないため。
Entity番号がどう振られているかは決まっていないので、上記の場合探しているteam_control_pointが2か5かは分からない。今回2だったからって次も2とは限らないし、4になってるかもしれない

では中央CPだけ取得したい場合はどうすれば良いか、なのですが
GetEntPropでm_iDefaultOwnerが0のCP探せばいいんじゃないかな多分
これの說明はまた後でします。
基本的には総当りして、条件に合致するEntity見つけたら抜ければOK

とにかくこれでteam_control_pointのEntity番号が分かりました。

次こそInputとOutputやるよ 多分