alchemistarkの日記

やったことのメモ

CoreDefenseプラグイン

各チームリスポン前に設置されたCoreブロックを
ブロックを設置したり破壊したりして防衛・破壊するゲームモード。


リロードで設置モードの切り替え、ATTACK2で設置。
マップ設置の各種弾薬箱からブロックを取得 ロッカーやキル時に落ちる箱からは不可
ゲーム開始からCP開放まではロッカーからブロックを一度に1つまで取得可

大人数でゴリゴリブロック置いてCore周りだけじゃなくて戦場にもゴリゴリ置いて欲しい

Int型、Float型のキャストについて

厳密にはPawnは型を持ってないので、Floatで変数を宣言しても普通にInt値が入る
ていうか数値丸め系の関数の戻り値がIntなので元の変数に戻すと型が変わってしまう
Format関数とかで%fすると型が違うので思った値が得られない。%dするとちゃんと出る。

正確には「変数が」型を持っているのではなくて、「値が」型を持っているように思える。この場合Intの値が入った時点で、その変数はIntになってしまう。
Floatで宣言してるから%fで値を読み取ろうとしても、中身がIntになってしまっているので読み取るには%dする必要があるということ。


健忘録として。びっくりするからやめて欲しい。

WaitingDeathMatch プラグイン


続きを読む

デバッグ用リロード関数

愛用のリロード関数を手直ししたので置いておきます
便利。

//デバッグ用 プラグインのリロード
public Action:Cmd_reload(client, args){
	
	new String:strName[255];
	
	GetPluginFilename(INVALID_HANDLE, strName, sizeof(strName));
	ServerCommand("sm plugins reload %s", strName);
	GetPluginInfo(INVALID_HANDLE, PlInfo_Name, strName, sizeof(strName));
	ReplyToCommand(client,"reload plugin '%s'", strName);
}

TraceRayについて

ついてもクソもないんですけどね
今必死で調べてる 健忘録残す

まぁまずはリファレンスから

Handle TR_TraceRayEX(const float pos[3], const float vec[3], int flags, RayType rtype)

開始地点posから終了地点またはサーチ方向vecにRayを発射
flagsはサーチ対象の属性
rtypeは衝突判定探すならRayType_Infiniteで、射撃範囲とかサーチ範囲とかで距離が有限ならRayType_EndPoint
このRayTypeでvecの値が座標ベクトルを使うか方角ベクトル使うか変わるので注意な

とりあえず基本的にはこのイメージ

で、Rayをプレイヤーの座標から開始した場合、プレイヤー自身に当たってそこでトレースが終わってしまう
なのでこの場合TR_TraceRayFilterを使う

Handle TR_TraceRayFilterEX(const float pos[3], const float vec[3], int flags, RayType rtype, TraceEntityFilter filter, any data)

最後にTraceEntityFilterが追加されてるけど、これはコールバック関数
Rayが何かに衝突する度に呼び出されて、コールバックがtrueを返したらそこで終了
falseを返したら無視して次になにかに衝突するまでトレースを継続する

つまりコールバックでプレイヤーEntityだったらfalseしてやればいい
データを1つコールバックに送ることができるので、clientindexでも送ればいいんじゃないの


関数のEXって何って話
EXある関数はトレース結果をhandleで返す
無い関数はglobal trace resultとやらに保存されている らしい よく分からない
トレースしたらすぐ結果を使うように運用すれば多分globalでいいんだと思う
複数のトレース結果を使用するとか、他の関数からも結果を参照するとか、そういう時に使うのかとは思う
けど明示的に結果がこのhandleに入ってますよの方が気分がいいので使うようにした方がいいかも。

Hullについては自分でもうちょっと試したら追記する
終わったら閉じましょうNE


追記
思ってたので間違いない感じ

f:id:alchemistark:20180407025109p:plain

追記

Entity0には必ず当たるんだろうか
フィルターかけてもダメというかフィルターを通過していない感がしている
特にTraceHullの時に範囲内に壁とか床とかあった場合、他に何かがあるかどうかは関係なくEntity0にヒットしてしまう

追記

マスクタイプでCONTENTS_MOVEABLEだとかCONTENTS_MONSTERCLIPだとか指定した時に、TR_GetEntityIndexが-1を返しているのにフィルター関数を通過しているのを発見
でもtrueを返しても-1になる
ハラ立ったのでグローバル変数で検出したEntityIndex保存したよね

	//Hit条件でフラグを建てておく
	if(entity <= MaxClients && entity > 0){
		g_Hit = entity;
	}

ほんでTR_GetEntityIndexの代わりにg_Hitで条件式書いたよね
動いたよね
暴れるよね
なんでや。

特定プレイヤーしか見えないオブジェクトは作れるのか

個人的にこれが無いのはどうなのかと思わなくもない

決闘や強敵アイコン、スポーン時のグローなどエンジン的には可能なはず。

以前どこかでRenderFXを各プレイヤーごとに適用というコードを見た気がするが動くのかそれは

VMTでチームごとに見え方変えるという方法もあるっぽい(キモトさん記事参照、ただしL4D2の話)

ただしこれはコードで後から出現させることができるのか怪しいような

 

せめてグローだけでも細かい設定したい

KOTHマップの判定

tf_gameruleからtf_logic_kothやらteam_control_pointなんやら置いたりプロパティ弄ったりアレコレしたけど

最終的にマップ名で判定している(koth_から始まるファイル名ならなんでもいい)事が判明した
暴れたい