【GAME】ARMA3 EXILE MODサーバの旅その49

2018年3月31日プライベートarma3,dayz,exile,mod,server

sc20180331121721追記:アドオン改修完了と公開

追記:今度こそマジで最終デバッグ

追記:{}地獄から這い出た

追記:動作確認の旅

まだ、Arma3スクリプトの闇に紛れ込んでおります。。

(;´Д`)

ただ、体感的に分かってきました。

公開するので、汚いコードは見せたくありません。出来るだけ綺麗に書き上げたい。もうちょいだけ頑張る。

されど配列、めっさ使いまくる配列について備忘録。公式(Array)

参照するッ

_array select 0; 0番(最初)を参照

_array select [1,2]; 1番から2個までの配列

_array select {_x isEqualTo 2}; trueを返した要素だけの配列

要素数を得る!

count _array

ループするッ

{ }forEach _array; _xに入ります

削除するッ

_array deleteAt 0; 0番を削除

_array deleteRange [0,2]; 0番から2個削除

_array1 = _array1 – _array2; 構造が合ったものを削除できちゃうが、これは怖いね。

_array resize 5; 先頭から5要素だけ残し削除

要素に入れてまう

_array set [0,”test”]; 0番に”test”を入れてまう

_array = _array apply {_x = _x * 2;}; 各要素に対して計算結果を格納してまう

_array pushBack 1; 最後に追加する

_array pushbackUnique 1; 配列内に1が無かったら追加される。有ったらエラーとして-1になる(戻り値は追加場所)

合体する!!

_array1 append _array2 (怪しい?)

_array1 = _array1 + _array2; 同じ:これなら安心

_array1 = +_array2; ヘルプにはこれでも良いようだが、動作が怪しい。

_array1 = _array1 arrayIntersect _array2; 両方の配列双方に、同じ値が入ってるものだけを抽出(論理式のANDみたいな感じ)

検索したい

_array find x; 要素番号が戻る。-1は見つからない

ソートする?(比較用コードは書けない)

sort _array trueかfalse; 単純な昇順降順ソートだけ

これはあくまで1次元配列のためのモノ。インデックスが2番目だったり、複雑な構造体のソートはゼロからこさえないといけない。

要素を反転しちゃう?

reverse _array; 全ての要素を反転する

シャッフルいてまう

有りそうで無かったので、こさえました。厳密には綺麗にシャッフルされませんけども、改造してください(reverseを見て察して)

private [“_vl”,”_cnt”,”_rst”];
for “_j" from 1 to floor((count _array) / 2) do
{
    _vl = floor(random (count _array)) + 1;
    _cnt = floor(random ((count _array) – _vl)) + 1;
    _rst = _array select [_vl,_cnt];
    _array deleteRange [_vl,_cnt];
    _array = _rst + array;
    if(random 1 >= 0.5)then{
        reverse _array;
    };
};

※見ての通り、配列の先頭と後ろが確率的に低い

余:重複しないランダム数字配列(0-9)

_cnt = 10;
_rst = [];
for “_j" from 1 to _cnt do
{
    _val = floor(random (_cnt));
    while{(_rst pushBackUnique _val) isEqualTo -1}do
    {
        _val = (_val + 1) mod (_cnt);
    };
};

追記:動作確認の旅

20180328205920_1うむ。

大丈夫だ。動いてる。

(;´∀`)

自転車も、このアドオンで出せば、街中に、それっぽく置かれてるので雰囲気壊さずに良いかもです。

ちなみに、設定で、車両をエンジンオン状態ライトon状態で湧かせられるかなぁ・・と思っていた時期もありましたが。

Arma3の仕様でダメなようです。

こういった類は、ローカル側でしか制御できないようでした。Exileサーバ側で用意されてるかも?と思ったけど、これ以上の深追いはやめよう。。

修正:

コードが間違ってた。サーバ側からも出来ます。とても簡単。

_vehicle engineOn true;

_vehicle setPilotLight true;

(;´∀`)

20180331153822_1AIも湧いてます。

突如撃たれるので、アイテム漁りにも緊張感が出ます。

「居るかも・・?」

と思わせれば良いので、設定で町に0~1体だけでも十分な印象です。

追記:{}地獄から這い出た

sc20180401174437いままでスクリプトを書いていて、どーしても理解できない不思議な挙動がありました。

・・が、分からないので、適当にゴリ押しで書いてたんですが。

や・・や、やっと。。

カラクリが分かった。。。

。゚(゚´Д`゚)゚。

まぁ・・どこぞに、こんな単純な比較文があったとしましょう。

_OK変数にフラグを入れて、いくつかの条件をチェックするような感じです。よくあるシチュエーションです。

if (_val isEqualTo 2)then
{
 _OK = true;
};

んで、最後にこのフラグを見て、色々やりましょうと意気込む訳です。

if(_OK) then
{
 いろいろ
};

ね?凄い単純なコードです。だがしかし、これはエラーで弾かれるんです。エラーで弾かれるんです。。弾かれるんです。。ヒロシです。

でもね。一番最初のif文に、これを追加すると。。

_OK = false; < これ
if (_val isEqualTo 2)then
{
 _OK = true;
};

ちゃんと動作するんですよね。もう、これが謎過ぎて、今まで分からなかった。。

sc20180401175719前の記事で書いてた言葉がありました。

旅48/追記:スコープの不思議と戯言

例外なく{}の中はスコープ

これは、if文も例外じゃねぇぞ、と。

(;´Д`)

もう、なんでしょう、心が晴れ晴れしております。モヤモヤが無くなりました。

まるで、1週間ぶりにお風呂に入ったような気分です。

(;^ω^)

sc20180401180143今後、Arma3のスクリプトを書く機会があるかどうか分かりませんが、流用できるようにコードを分けてます。

getBuildingPosなんて、自分的には傑作です。

建物オブジェクトを渡すと、建物内の様々な場所を返してくれます。

入口/入口に近い場所/入口から遠い場所/低い場所/高い場所/道路に近い場所

これを使って、アイテムボックスやAIを配置してます。

追記:今度こそマジで最終デバッグ

sc20180402154414趣味とはいえ、いつまでもやってられないので、そろそろ見切りを付け、最終的かつ完全な最終デバッグをしております。

自分なりには、欲しい機能は全て入れ込んだつもりです。

やるだけやった。

町に特化してるので、他アドオンに影響も与えないでしょう。どうぞ、使ってくださいまし。

今日夜か、明日には、Version1.1として公開致します。

Version1.0から、かなりの量(ほぼ全部)、改変しました。

デバッグ作業ですが、ランダムだらけで動作してるので、時と場所によってエラーが出たりするんですよ。

だから、何度も実行しては、確認してます。。

つ・・疲れた。。(;´Д`)

追記:アドオン改修完了と公開

たった今、Version1.1を公開しました。

2018年3月31日プライベートarma3,dayz,exile,mod,server

Posted by nabe