【GAME】ARMA3 EXILE MODサーバの旅その55
追記:マップマーカー
追記:無名関数つぶやき
追記:グループリーダーのお話
追記:備忘録チャット方法
追記:車両トラップ
追記:過激なバグ
AIさんと戯れております。
やっぱ、前回諦めた「無敵AI」の実現です。
イベントハンドラの動作の理解が少なかったようでした。
一応、ちゃんと動作してるようです。
足や胴体に、何発打ち込んでも、死んでくれません。
(゚∀゚)!!
悲鳴は上げるし、血しぶきもありますが、死にませぇん。
(゚∀゚)!!
おおっ、やっぱ死なないぞ。
(゚∀゚)!
うちのサーバでは、ゾンビの一発で瀕死ダメージまでいっちゃうんですが、2体ゾンビ攻撃にも耐えてます。
このAI、相当のMです。
昇天してしまった。
テストは出来たので、「アイアンマン」機能を追加する予定です。
_unit addEventHandler [“Fired“, {[format[“FIRED %1",_this]] call LB_fnc_log}];
_unit addEventHandler [“Dammaged“, {(_this select 0) setDammage 0}];
コードは、これ、とてもシンプルでした。
Dammagedイベントが発生したら、ベホマしてあげるだけです(つまり、1発ヘッショだと、Dammagedイベントが発生しないから、死んじゃう)
ヘッショか爆発物かロードキルでしか倒せない、伝説の漢として、要所の防御、拠点を作らせないなどに使えるかと思います。固定位置湧き設定で考えてます。
マシンガンなんか持たせたら、もう素敵(鹵獲防止も必要でしょうね)
ムフフ・・(●´ω`●)
PvPサーバでは一番恐怖の機能を思いついたのです。
バンディットAIに見つかったら(≒発砲されたら)、マップにマークされてしまうというモノ。
もともと、定期的なバッドイベントして、GPS信号をハックされたというテイで、マップマークを考えてた。
アイテムボックスを開いたと同時に、爆発するトラップ。
(;´Д`)
それも、出来ちゃうじゃまいか!!
this addEventHandler [“ContainerOpened", {
params [“_container", “_unit"];
}];
誰が開けたか?も分かるので、バンビちゃんだったら、回避できるとかあっても良いかも。
this addEventHandler [“Engine", {
params [“_vehicle", “_engineState"];
}];
車両のエンジンをONにしたら、爆発するやつも出来るやん。
:(;゙゚’ω゚’):鬼畜や。。
追記:過激なバグ
インしたら、バンディット12体から銃撃を。。。
(;´∀`)
1体のつもりだったんで、超焦ったw
しかし、ながらここで分かった事がひとつ。
この時、AIスポーンは同じ場所に指定してるんですが、こんな感じに列になるんですね(しかも、AI同士に結構距離がある)
_pos = _pos findEmptyPosition [0,50];
一応、安全にスポーンできるように、これを噛ましてるんですが、これによるものなのでしょう。
※以前、フュージョン状態(参考:DragonBall)でスポーンしてるの見たことあるので
_unit addEventHandler [“Fired","_this call LB_eh_Fired;"];
コード部分の所がキモだったらしく。
{コード} と "コード" で、それぞれ動作が違うようだった。何故かは調べてませんけども。。
1行で書けるコードなら{}でOK(そもそも”;”が許されてない)で、大きめなコードなら””で書く必要があるようです。(公式では普通に書いてあったので勘違いです)
Firedイベントは問題なかったんですが、ContainerOpenedイベントはローカルで発生するようで、サーバとローカル間での通信が必要になるようです。。
うむむ面倒(;´Д`)どーしようか。
ContainerOpenedイベントは、オーバーライド出来ないと公式に書いてるんですよね。他アドオンと競合するかもしれないし。。諦めるか。。
バンディットに発見されたら、マップにマーキングされちゃうのは、テスト終了ぉ~。
((((;゚Д゚))))
こんな格好してます。
最上級のマシンガン持ってるので、それは、それは恐ろしいです。
ちゃんと狙えば倒せるが、美味しくないので、逃げたほうがええ。
追記:車両トラップ
グレネードトラップ
湧き車両で、エンジンを掛けると、確立で2秒後、グレネードが炸裂します。
ヽ(;゚д゚)ノ
但し、スモークグレネードがほとんど、25%の確立で、ミニグレネードに当たっちゃいます。誰が仕掛けたんでしょうかね。怖い
GPSトラップ
湧き車両(エンジンONで確立)とバンディットに発見された際に発動するもので、マップ上にマーキングされてしまいます。
AIのFiredイベントに引っ掛けてるので、発砲相手まで情報を取ることができない。なので、対ゾンビでも発動しちゃいますが、プレーヤーが居ないとゾンビも沸かないので大丈夫かなと。
上記の理由から、仕様上、おおよその場所としてます。コード上では、AIの向いてる方向の100m先にマークしてます。
PvPでも過疎サーバなら、怖くないトラップですけどねぇ。
PvPなら、場所バレは怖いでしょう。名前は出ないけど、予測できちゃう。
追記:備忘録チャット方法
チャット(公式)
Example3に全てのチャット方法が書かれてます。
サイドチャット系は、所持アイテムにラジオが無いと受信できないとあります(今まで意識した事がなかった)
たまに、システム側から定期的に宣伝めいたチャットが入ることがありますが、多分、以下のように書けば実現できるでしょう。
[10,{コード},[],false,false]call ExileServer_system_thread_addTask;
最後の引数3つは何なのか、未調査ですが。
(;´∀`)
追記:
_delay = _this select 0; 間隔(多分、秒)
_function = _this select 1; コード
_params = _this select 2; コードへの引数
_persistance = _this select 3; 持続性(1回限り、連続?)
_pushBackThreadID = param [4, false];
引数はこうなってました。
追記:
チャット関連は、ローカルで実行しないといけないらしく、remoteExecで全ローカルに飛ばして、チャットをする。
まだ、テストしてませんが、これで10秒毎に、歌い出すかも、しれない。負荷気にして、spawn入れたけど、無くてもええか。
[10,{[]spawn{
remoteExec[“systemChat“"ララララ~"";",-2];
};},[],true,false]call ExileServer_system_thread_addTask;
追記:グループリーダーのお話
(;^ω^)
彼を本当の漢にするべく、完全無敵化をしております。
死んでしまったら、即座に沸き直しをするのですが。
んで、ここでグループリーダーに引っかかりました。備忘録です。
グループ内のAIが全て無くなったら、グループが自動的に消えてしまいます。
つまり、この状態でAIだけ生成しても、リーダー不在、グループに所属してない事になり、完全棒立ちになってしまいました(そこに存在してるけど、Arma3側から処理の対象外のようになってる)
グループがまだ存在してれば、そこに参加して、消滅してれば、再度グループを生成しなければならない。
・・が、公式ドキュメントを見る限り、グループが自動的に消えるのは、数分掛かるとの事。
グループが存在してるかどうかのチェックがキモとなりそう。リーダーに関しては、勝手にやってくれそうな印象(最初に登録されたAIが自動でリーダーになるようです。変更も可能)
追記:
ユニット生成時に、グループを保存しておいて。
_unit setVariable [“LB_Group",_group];
死んだら、それを元に、現グループ内のユニット数を調べて、ゼロやったら、グループ作成をしました。
_group = _unit getVariable [“LB_Group",_group];
if(count(units _group) < 1)then
オブジェクト変数に格納しなくても・・イベント内なら”group”で取れるんじゃね?とも思いましたが、Armaの事なので、より安全にこうやった方が確実かなと。
追記:無名関数つぶやき
いくつかの場所で書いてたので、無名関数にしました。
単純ですけど、これが、Generic errorが出て、何が原因か分からなかった。
上写真の、fn_isMilitaryの部分。
_name = toLower(str(_this select 0));
原因はこれ、”str”の部分でした、明示的にstringにするとエラーが出ないようでした。(いや、勘違いやった)
また、やらかしそうなので、書いておきます。
(;^ω^)
ロケーションのtypeとnameそれぞれで、”airfield”、”airport”、”military”のいずれかの文字があれば・・としていますが、統一されてないので、こんな回りくどい感じでチェックしてます。
倒す事はできますが、速攻で起き上がります。
しかも、忍者のように、雲隠れの状態で立ち上がります。
※ただの白スモークを炊いただけ
ポップタブやアイテム、リスペクトもゼロで、倒しても何もウマミはありません。
_unit setVariable [“DMS_AI_Money",0]; // no poptabs
_unit setVariable [“DMS_AI_Respect",0]; // no respects
この様に書けば、DMS側で無処理になります。
湧き座標を設定できますが、無指定([])だと、自動的にミリタリー施設から、ランダムで選ばれます。
これは、便利ッ m9( ゚д゚)!
追記:マップマーカー
一度置いたマップマーカーを移動させたい場合、どーすんの?
と。
setMarkerPosで簡単に移動できるんですが、マーカーの識別子って、単純な文字列なの?・・と今更気付きました。
_Marker = createMarker [_name,_pos];
※_name と _Markerは丸っと同じって事です
マップ上では、色々なマーカーや図形を置けますが、自由に書けるわけでなく、全てに識別子が付いて管理されてます。
なので、置けば置くだけ、重くなります(公式に書いてある)
んで、困ったのが、既に作成したかどうか?を調べる方法です。
isMarker~、getMarker~やら、ありそうなものを検索してみましたが、これが見つからない(全マーカー取得コマンドはある)
if((getMarkerType _name) isEqualTo “")then
ヒントはgetMarkerTypeのヘルプにありました。””が帰ったら、存在しないんだよ・・と。つまり、それ専用のコマンドは無いようでした。
追記:ぼそぼそ
公式ドキュメントも、毎日翻訳しながら読み漁ってます。
今思うところ。
公式にも散見されるんですが、歴史あるArmaだからこそ、設計ミスとも取れるバグ?というか、奇妙な仕様があるようです。
Arma4になれば、再設計も出来るんでしょうけども。あまりに複雑なこのシステムを維持管理できるのか、ボヘミアさんの苦悩が見て取れます。
ユニットをチョコチョコと弄るにしても、ローカル側、サーバ側できちんと動作するのか、いちいち調べないといけない。
戦車出したいなぁ・・・。と思ったら、TANK DLC買ってない事に気付いたわたくしでした。