2014年2月25日火曜日

銃関係のお話

SLでの銃に関して
まず禁止事項としましてはこんなもんがあります

・許可されていない一般エリアでの(ホルスター状態も含む)装着および発砲の禁止
・人に向かって撃つことの禁止
・ケージガン、push弾及び核兵器の全面禁止

よくお馬鹿なnoob君がBANされる原因としまして

そのフィールドなりSIMのルールも碌に読まずに
セイフティーエリアでもお構いなく
適当に入手した無料の銃で人を撃って
しかもスタッフやオーナーの警告も”英語わかりません”って無視して

それで数回TPHOMEにあったり返り討ちにあったりして
勝てないからってぶちきれて
無限増殖系のテロアイテムや核兵器を使う

とまーここまでテンプレ

んでまぁこういうお馬鹿なnoob君が凸してる時に
たまたま善良なnoob君が居合わせてケージガン食らったり爆発物の巻き添え食らって
わけも分からずホームに戻って二度と行かなくなる 的なことも
割とよくあります

ちゅわけでSLで銃を持ったり
銃を扱う場所へ行くときの心構えというかそんな感じのもの

・マニュアルをちゃんと読む
 米国内の実銃には大抵”マニュアルを読め”の刻印が有ります
 そのくらいマニュアルは大切なモノです ちゃんと読みませう

・Homeは銃を持ってても大丈夫な場所にする
 SLで死ぬとホームに戻されます
 戻された先が銃禁止のエリアだった場合
 BANされる可能性が大変高いので
 そういう危険の無い場所をホームにしませう

・自分に銃口を向けられない限りは銃が好きな人にあんまり悪い人は居ません
 基本的な使い方とかおすすめの銃とか教えてくれたりします

・銃は基本的に買うものです
 出処不明な無料の銃はトラップ入りだったりまともに撃てなかったりと
 大抵の場合ろくな事になりません
 しょぼい見た目の銃はテロリストと疑われるリスクもありますので気をつけませう

 価格帯としては
 ライフルだと1000L$~2500L$
 ハンドガンでは500L$~1200L$
 くらいのが一番ハズレが少ないです

 同じメーカーの銃で見た目で安い銃があって VICEとかMCEとか書いてあるやつは
 専用CS(勝敗判定装置)のフィールドでしか使えない銃です

・おもちゃの銃 なんてもんはこの世界にはありません
 銃の形をしていればとりあえず全て銃です
 逆にどう見ても銃の形をしていなくてもタマが出るなら銃です
 ガンアレルギーの人口はむしろSLの方が多いくらいかもしれませぬ

・違法な銃に気をつける
 具体的な実在メーカー名や市販銃をそのままの名前で売ってる奴は全部アウト
 第二次大戦以前のものや
 軍用銃を軍の制式名で出してる奴は大体大丈夫ですが
 極端な安値や高値がついてる場合アウト品の場合があります
 よくわかんない時は銃が好きな人に聞きましょう


てなところかねぇ
以上

新型リサイズ命令関係のお話

実装されたものの時代はmeshに移行してる上に


リサイズの所謂"強制執行"が出来ないっチューことで
いまいち不人気の新型リサイズ命令ですが

平面マップも対応してないっちゅーやる気の無さっぷりなわけですよ


まぁそれだけ書くのもアレなので
誰得なソースを適当に置いときます

//どのプリムが縮小出来ない原因なのかを教えてくれるだけのスクリプト
default
{
    state_entry()
    {
        llSetLinkPrimitiveParamsFast(LINK_SET,[PRIM_TEXT,"",<1,1,1>,1.0]);
        integer nop=llGetNumberOfPrims();
        vector scale;
        do{
            scale=llList2Vector(llGetLinkPrimitiveParams(nop,[PRIM_SIZE]),0);
            if(scale.x<0.015||scale.y<0.015||scale.z<0.015){
                llOwnerSay((string)nop+","+(string)scale+","+llGetLinkName(nop));
                llSetLinkPrimitiveParamsFast(nop,[PRIM_TEXT,"FOUND\n",<1,1,1>,1>]);
//                llSetLinkPrimitiveParamsFast(nop,[PRIM_TEXT,"FOUND\n",<1,1,1>,1.0,PRIM_SIZE,<0.015,0.015,0.015>]);
            }
            --nop;
        }while(nop>0);
        llRemoveInventory(llGetScriptName());
    }
}
//[EOF}

コメントアウトしてる行を入れ替えると
縮小限界をちょい上げる程度にリサイズします






あとは各命令に関する適当な解説

Functioninteger llScaleByFactorfloat scaling_factor );
こいつがメインとなるリサイズ命令

記述の仕方が現在のスケールからの相対なので
従来型の基準スケールから〇〇%プラスて感じのを
そのまま入れ替えるとかはちょい無理っすな



Functionfloat llGetMinScaleFactor( );
Functionfloat llGetMaxScaleFactor( );

この2つがリサイズの限界を見るための命令
こいつの戻り値も現在スケールからの相対値なので
一気に限界までリサイズかけたいって場合を除き
あんまり使い道がありませぬ

llScaleByFactor(llGetMinScaleFactor( ));

petitteさんとかだと割とこいつ多用する感じになるんじゃないかのぉ
ただこれ使ってもサイズ合わないなら
従来型の強制執行が可能なリサイザーになりますな


ってなところかねー
以上

2014年2月20日木曜日

タイピングAOのスクリプト

//適当にコメント付きソースを貼っつけとく
//まぁやってることは単純明快です
//コピペすりゃ動くようにしてあるけどインデントとかは各自なんとかしてください

//タイピングアニメーションスクリプト mod v1.0 20140219 by UEPONYA

//******基本的な使い方****************
//スクリプトとアニメを一緒にいれればおk
//スクリプトが先ならアニメが入った時点でリロードがかかりますし
//アニメが先ならスクリプトの初期化時にロードされます
//複数アニメ対応とかは面倒なので無し

//---------以下解説とソース------------------

//*****装着物スクリプトの基本*******
//装着物は基本的に 装着をon_rez 取り外しをattachイベントで検出します
//タイマーはよっぽどの用途でも無い限りは0.2秒レートがええです
//AO系でタイマーを起動する場合 パーミッション取得出来た時のみにしたほうがうけがよろしいです

//*****負荷コントロール周り*********
//あとLSLの基本としてスクリプト外への出力は最低限のレートに留めるべきとされています
//データ取得に関しては関数一個で完結するものはいくらやってもok
//内部での変数書き換えはリスト以外なら気にせずじゃんじゃんやっちまっていい


key     owner_key;
string  anim_name;

integer Cur_status;
integer Lst_status;

default
{
    state_entry()
    {
         owner_key  = llGetOwner();
         anim_name  = llGetInventoryName(INVENTORY_ANIMATION,0);//アニメーション取得は一回でおk
         llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
    }
    run_time_permissions(integer perm){
        //ホントはちゃんと取得されたパーミッションフラグを確認せんとあかんのだけど
       //こんくらいのスクリプトなら無くても割と問題なく動くのでやらない

        llSetTimerEvent(0.2);//ハイレートすぎると重いのでこの程度にしておく
    }
    timer()
    {
        Cur_status = llGetAgentInfo(owner_key) & AGENT_TYPING;
        // 同じ情報の参照が二箇所以上ある場合はグローバル変数にぶっこむ方がトータルでは軽い

        if(Cur_status!=Lst_status){//切り替わった時だけアニメ再生を制御するほうが軽い
            if (Cur_status){//このへんのif elseの書き方は全体の書かれ方とかを見て決める
                //タイピング開始時の処理
                llStartAnimation(anim_name);
            }else{
                //タイピング終了時の処理
                llStopAnimation(anim_name);
            }            

            Lst_status=Cur_status;
        }
    }
    changed(integer change){
        if(change&CHANGED_INVENTORY)llResetScript();//プリムの中身変わったらスクリプトリセットしてしまう
        //これだけでよっぽどのバグが無い限り回復するのでメンテナンスフリーになる
    }
    attach(key id)
    {
        if(id==NULL_KEY){//デタッチ時はアニメーションのパーミッションを取得してる前提で止めちゃう
            llSetTimerEvent(0.0);//別にタイマー止める必要は全くないんだがテンプレみたいなもんなので
            llStopAnimation(anim_name);
        }
    }
    on_rez(integer t){
        llResetScript();//装着時はアタッチよりonrezが先にくるのでここでリセットしてしまう
    }
}