WaitingDeathMatch プラグイン
— ArcMage (@Alchemist_Ark) 2018年4月6日
ここホメて欲しいんだけど、最終CPを基準に周囲にランダムスポーンする仕様なんだけど、溶岩とか即死床の上にはスポーンしないんですよ 他のマップでも大丈夫 pic.twitter.com/N1Dn2hBC3s
— ArcMage (@Alchemist_Ark) 2018年4月6日
続きを読むというわけで主に鯖温め中とかにMGEよろしくバトルする人向けプラグインです 400行程度 koth、PL、5CP、A/Dで動作可能です。 ただしマップによってはエリア外にスポーンすること多々。こればかりはどうしようもない。
— ArcMage (@Alchemist_Ark) 2018年4月6日
デバッグ用リロード関数
愛用のリロード関数を手直ししたので置いておきます
便利。
//デバッグ用 プラグインのリロード 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の値が座標ベクトルを使うか方角ベクトル使うか変わるので注意な
とりあえず基本的にはこのイメージ
ページ内のこの画像が分かりやすくて良い ただHullの箱の大きさの決め方が書かれていないのが辛い 始点から相対座標minから座標maxを対角線とする立方体がrayに沿って移動するという認識でいいのか pic.twitter.com/zQtUaqKv4a
— ArcMage (@Alchemist_Ark) 2018年4月3日
で、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
追記
思ってたので間違いない感じ
追記
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_から始まるファイル名ならなんでもいい)事が判明した
暴れたい
PLマップの判定
マップロード時に出る画面やmotdでのルール表示でペイロードと表示するには
team_train_watcherが存在したらPL判定…カートもCPも必要ねぇ…
— ArcMage (@Alchemist_Ark) 2018年3月21日
まぁEntityのページに書いてあるんですけどね。気付くかこんなもん。
srcdsのインストール方法補足
srcds、つまりSourceEngineゲームのサーバーを建てる方法について。
今回はWindows版のtf2のサーバーの話します。
他のゲームの鯖建てもゲームID変えるぐらいでほぼ同じはず
tf2鯖でのみ起きる現象について少しだけ補足します。
まずこちらのサイトをご覧ください。
TF2Wiki サーバーの建て方の基本
http://tfortress2.wikiwiki.jp/?WindowsXPtfortress2.wikiwiki.jp
srcdsのインストール方法全部書いてあります。完。
ダメですかそうですか。
でも一通り読んでください。以降読んでるの前提で、書いてない事補足します。
SteamCMDのバッチファイルはコレだけ書いてれば十分です。
steamcmd +login anonymous +force_install_dir ../tf2 +app_update 232250 validate +quit
steamcmd.exeと同階層にbat置いて、1つ上にtf2フォルダ作ってその中にインストールする用になってるのでインストールパスは適時変えてください。
記事作成現在、tf2のsrcdsはGUIモードで起動できないので、コンソールで起動する必要があります。
普通に起動したら真っ黒のウィンドウが出るだけだし、閉じてもプロセスが残ってCPUゴリゴリ食う
GUIの方もパラメータ渡さないと起動しないとか色々あるんですが考えなくてOK 漢は黙ってコンソール
僕の鯖の起動バッチ置いておきます。
start /affinity 2 srcds.exe -game tf -secure -port 27015 +rcon_password "****" +map koth_king -console -nocrashdialog
以下説明。
・start /affinity 2
srcdsはマルチコアに対応してないらしいので、使用するCPUコアを直接指定している
別にどのコアでもいい 数値はビットマスク16進
speedup-xp.com
・-game tf
ゲームによっては不要だと思うが、TF2の場合明示的にtfを指定しないと起動しない。たしかL4D2だと要らない
・+map
なんでもいいからマップ指定しておかないと起動しない。ていうか起動はするけど接続できない。
・-console
CUIで起動する cmdから起動しようがPowerShellから起動しようが新たにcmd窓生成してウザい。バックグラウンド化して必要な時だけコンソール見たいんだけど。
SSH経由で起動したらどうなるんだろう誰か試して
・-nocrashdialog
メモリエラーとかでクラッシュした時にダイアログを出さずにプロセスを終了する
ダイアログ出ても復帰するわけでもないので… 後プロセス監視するツールとか入れて再起動させる場合必須
ダイアログ出した場合鯖は死ぬのにプロセスだけ生き残る為