arz Nitelyってシステム屋どうよ?

SecondLifeとWebとの融合を模索するセミプロWeb屋の挑戦

汎用アバターレーダースクリプト

2008年08月05日 – 13:28

フォントカラー、センサー周期、レーダーのオン/オフを
ダイアログからいつでも変更できる汎用アバターレーダーです
(ダイアログはタッチで出ます)

アバターレーダーは、スクリプトを書くときのエッセンスがぎっしりつまったものですので
お勉強用ということでw ソースを公開します。

 

もちろん、このスクリプトをそのまま商品として販売するとか
ちょっと修正したものを販売するとか
そういう姑息なことはご遠慮くださいましw

えと、適当なプリムにこのスクリプトをコピーし
HUDとしてご利用ください^^

センサーはSIMに負荷をかけますのでご利用はほどほどに^^
(なるべくセンサー周期を長めに設定しつつ、afk時はオフにしましょう!!)

// Avatar Radar :: 2008-08-04

// Setup
string my_name = "LB System :: Avatar Radar";
string ver = "ver.1.00.42";

uuSetup(){
    llSetObjectName(my_name);
    llSetObjectDesc(ver);
    llOwnerSay(my_name + "  " + ver);
}

// Sensor
integer switch;
vector my_pos;
vector av_pos;
integer max_read;
string agent_info;
string dist;
string n_s;
string e_w;
string h_l;
vector font_color = <1.0, 1.0, 1.0>;

uuSensor(integer flug){
    switch = flug;
    if (flug){
        llSensorRepeat("", NULL_KEY, AGENT, 96.0, PI, sensor_arc);
        llSetText("Searching", font_color, 1.0);
    }else{
        llSensorRemove();
        llSetText(":: OFF ::", font_color, 1.0);
    }
}

uuPos(){
    if (av_pos.y - my_pos.y > 1){
        n_s = "N";
    }else if (av_pos.y - my_pos.y < -1){
        n_s = "S";
    }else{
        n_s = "";
    }
    if (av_pos.x - my_pos.x > 1){
        e_w = "E";
    }else if (av_pos.x - my_pos.x < -1){
        e_w = "W";
    }else{
        e_w = "";
    }
    if (av_pos.z - my_pos.z > 2){
        h_l = "↑";
    }else if (av_pos.z - my_pos.z < -2){
        h_l = "↓";
    }else{
        h_l = "●";
    }
}

// Interface
integer d_ch = -11111;
float listen_remove = 60.0;
integer handle;
float sensor_arc = 5.0;
list menu_off = ["オン", "文字色", "時間"];
list menu_on = ["オフ", "文字色", "時間"];
list colors = ["白", "黒", "赤", "青", "黄", "緑"];
list color_vector = [<1.0, 1.0, 1.0>, <0.0, 0.0, 0.0>, <1.0, 0.0, 0.0>, <0.0, 0.0, 1.0>, <1.0, 1.0, 0.0>, <0.0, 1.0, 0.0>];
list seconds = ["10", "20", "30", "1", "3", "5"];
integer color_change = FALSE;

uuListen(integer flug){
    if (flug){
        handle = llListen(d_ch, "", llGetOwner(), "");
        llSetTimerEvent(listen_remove);
    }else{
        llSetTimerEvent(0.0);
        llListenRemove(handle);
    }
}

uuMainDialog(){
    uuListen(TRUE);
    if (switch){
        llDialog(llGetOwner(), "メインメニュー", menu_on, d_ch);
    }else{
        llDialog(llGetOwner(), "メインメニュー", menu_off, d_ch);
    }
}

uuColorDialog(){
    color_change = TRUE;
    uuListen(TRUE);
    llDialog(llGetOwner(), "文字色を選択してください", colors, d_ch);
}

uuArcDialog(){
    uuListen(TRUE);
    llDialog(llGetOwner(), "センサー周期を選択してください \n推奨5秒以上 \n \n現在の設定:" + (string)((integer)sensor_arc) + "(秒)", seconds, d_ch);
}

// Color Change
uuChangeColor(string str){
    font_color = llList2Vector(color_vector, llListFindList(colors, [str]));
    if (switch){
        llSetText(agent_info, font_color, 1.0);
    }else{
        llSetText(":: OFF ::", font_color, 1.0);
    }
}

// Flow
default{
    state_entry(){
        uuSetup();
        uuSensor(TRUE);
    }

    sensor(integer num_detected){
        my_pos = llGetPos();
        agent_info = "";
        if (num_detected < 8){
            max_read = num_detected;
        }else{
            max_read = 8;
        }
        integer i;
        for (i = 0; i < max_read; i++){
            av_pos = llDetectedPos(i);
            uuPos();
            dist = " @ " + n_s + e_w + " " + (string)llRound(llVecDist(llGetPos(),av_pos)) + "m " + h_l;
            agent_info += " \n" + llDetectedName(i) + dist;
        }
        llSetText(agent_info, font_color, 1.0);
    }

    no_sensor(){
        llSetText("No PPL around here.", font_color, 1.0);
    }

    touch_start(integer total_number){
        if (llDetectedKey(0) == llGetOwner()){
            uuMainDialog();
        }
    }

    timer(){
        uuListen(FALSE);
    }

    listen(integer channel, string name, key id, string message){
        uuListen(FALSE);
        if (message == "オン"){
            uuSensor(TRUE);
        }else if (message == "オフ"){
            uuSensor(FALSE);
        }else if (message == "時間"){
            uuArcDialog();
        }else if (message == "文字色"){
            uuColorDialog();
        }else if (color_change){
            color_change = FALSE;
            uuChangeColor(message);
        }else{
            sensor_arc = (float)message;
            llOwnerSay(message + "秒に設定しました");
        }
    }
}

余談ですがw

あたしはリスンイベントを使うときは
次のようなユーザ関数をつくっておいて、コールすることにしています^^

uuListen(integer flug){
    if (flug){
        handle = llListen(d_ch, "", llGetOwner(), "");
        llSetTimerEvent(listen_remove);
    }else{
        llSetTimerEvent(0.0);
        llListenRemove(handle);
    }
}

リスンするときは

uuListen(TRUE);

リスンを閉じるときは

uuListen(FALSE);

とコールします^^

これ、便利ですよw

小枝ということで^^

  1. One Response to “汎用アバターレーダースクリプト”

  2. Спасибо, люблю читать ваши посты очень интересно

    http://stroim-domik-sami.ru/ | 2009年05月10日

Comment

TB: http://arznitely.com/wp-trackback.php?p=135