忍者ブログ
This is an official blog of Orange Forest who is the aircraft developer in the Secondlife virtual world.

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

「何でこんなに空きプリム少ないの?」な人向けスクリプト

ごぶさたしております。ミューズです。
みなさまお元気ですか?

photo01
::: Ahaaaaa... Where is my object? :::

オレンジフォレストは最近プリム不足病で、いつの間にか空きプリムが無くなっていて「何でこんなに空きプリム少ないのー?」な叫びが頻繁にコダマシテマスw
そんなこんなで今日は区画内に存在するオブジェクトをリストアップするスクリプトを作成したので、同じ悩みを抱える方々にそっと公開します。

使用方法は下記で紹介するスクリプトを入れたプリムを体の適当な場所にアタッチします。するとプリムを着用した場所と同じ土地区画の中のオブジェクトの検索とカウントアップを開始してチャットメッセージで表示します。

LSLのセンサーの仕様上、探知範囲と、1回で検出できるオブジェクトの総数に限りがあるため、このスクリプトでは探知範囲を半径40mにしています。このカウンター着用後、自分の土地の中をくまなく飛び回ってオブジェクトをセンサーに引っ掛けて行きます。


::: List objects in the current parcel :::

チャットメッセージのフォーマットは、
検出番号, プリム数, オブジェクト名, 位置, トータルプリム数
です。

ここで、"show 検出番号" とチャットすると、その検出番号のオブジェクトに向けて矢印パーティクルが一定時間飛んで場所を特定できます。


::: Point the detected object :::

ここからはスクリプトです。
いつも通り御利用は改変自由&自己責任でお願い致します。
バグ指摘、もっと楽な方法ありましたらやんわり教えて下さいね~w


//==================================================================
// Parcel prim counter
// $Id: primcount.lsl 701 2010-08-09 06:33:29Z myuse $
//==================================================================
list gObjIds;
integer gTotalPrims;
key gTgtParcelId;
integer gTimerCount;
float gTimerInterval = 0.97;
float gBeamTimeout = 30.0;
float gBeamRest;
integer gListenHndl = -1;

// 位置情報の簡略表示
string makePosString (vector pos) {
return "<" + (string)((integer)pos.x) + ", " +
(string)((integer)pos.y) + ", " +
(string)((integer)pos.z) + ">";
}

default {
// ユーザーがプリムカウンターを脱着した
attach (key id) {
list parcelParams;

// システム初期化
llParticleSystem([]);
llSetTimerEvent(0.0);
if (gListenHndl >= 0) {
llListenRemove(gListenHndl);
}

if (id == llGetOwner()) {
   // ユーザーがプリムカウンターを着用
// 計測開始
gObjIds = [];
gTotalPrims = 0;
gTimerCount = 0;
parcelParams = llGetParcelDetails(llGetPos(),
[PARCEL_DETAILS_ID, PARCEL_DETAILS_NAME]);
gTgtParcelId = llList2Key(parcelParams, 0);
llOwnerSay("Start counting object for this parcel (" +
llList2String(parcelParams, 1) + ").");
llListen(0, "", llGetOwner(), "");
llSetTimerEvent(gTimerInterval);
}
else {
// 計測終了
llSetTimerEvent(0.0);
}
}

// センサーでオブジェクトを探索
// 1イベント毎に scripted, non-scripted を交互に検索
timer() {
if (gBeamRest > 0.0) {
gBeamRest -= gTimerInterval;
if (gBeamRest <= 0.0) {
llParticleSystem([]);
}
}

gTimerCount = 1 - gTimerCount;
if (gTimerCount) {
llSensor("", NULL_KEY, PASSIVE, 40.0, PI);
}
else {
llSensor("", NULL_KEY, PASSIVE | SCRIPTED, 40.0, PI);
}
}

// ユーザーが指定したオブジェクトに矢印パーティクルを指し示す
listen (integer ch, string name, key id, string mes) {
list words = llParseString2List(mes, [" "], []);
key tgt;

if ((llList2String(words, 0) == "show") && (llGetListLength(words) == 2)) {
tgt = llList2Key(gObjIds, (integer) llList2String(words, 1));

if (tgt == NULL_KEY) {
llOwnerSay("ERROR : Unknown object number.");
return;
}

gBeamRest = gBeamTimeout;
llParticleSystem([PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP,
PSYS_SRC_TARGET_KEY, tgt,
PSYS_PART_START_COLOR, <1.0, 1.0, 1.0>,
PSYS_PART_START_ALPHA, 1.0,
PSYS_PART_START_SCALE, <0.5, 1.0, 0.0>,
PSYS_PART_MAX_AGE, 9.0,
PSYS_SRC_BURST_RATE, 0.6,
PSYS_SRC_TEXTURE, "a990f9a1-ab01-5071-444e-552b0f3f4983",
PSYS_SRC_BURST_PART_COUNT, 1,
PSYS_PART_FLAGS,
PSYS_PART_TARGET_POS_MASK |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_FOLLOW_VELOCITY_MASK ]);
}
}

// センサー、検出したオブジェクトの判定
// 一度検出したオブジェクトはスキップ
sensor (integer numDetected) {
integer n;
key id;
vector pos;
string name;
integer prim;

for (n=0; n<numDetected; n+=1) {
id = llDetectedKey(n);
pos = llDetectedPos(n);
if (llList2Key(llGetParcelDetails(pos, [PARCEL_DETAILS_ID]), 0)==gTgtParcelId) {
if (llListFindList(gObjIds, [id]) < 0) {
gObjIds += [id];
prim = llGetObjectPrimCount(id);
name = llDetectedName(n);
gTotalPrims += prim;
if (llGetOwnerKey(id) == llGetOwner()) {
// Your object
llOwnerSay("@ No." + (string) llGetListLength(gObjIds) +
", " + (string) prim + "prim, " +
name + " " + makePosString(pos) +
", total " + (string) gTotalPrims + "prims");
}
else {
// Not your's
llOwnerSay(" No." + (string) llGetListLength(gObjIds) +
", " + (string) prim + "prim, " +
name + " " + makePosString(pos) +
", total " + (string) gTotalPrims + "prims");
}
}
}
}
}
}

で、結局、空きプリムが少ない原因は未知の巨大オブジェクトじゃなくてミューズのプリム浪費癖が悪かっただけってことが判明しましたとさ
orz 超ガックシ

ではでは
おそまつでした~
PR

SPEEDER 204 プロトタイプを銀座に展示いたしました。


::: SPEEDER model- 204 :::

みなさまこんにちは!暑い日が続きますね
ブログではお久しぶりのオビワンです。

ここのところ、flickr か Twitpic に画像をアップしてTwitter で呟くことが多く、こちらの執筆はおさぼり気味でした。すみません。

そもそもTwitterを始めたのは「ミニ・ブログサービス」とありブログに書く程でもない小ネタをお手軽に投稿できるではないか!!と、思ったのがきっかけでした。
いざ始めてみると「ん、これーブログじゃないよね!SNS?」と直に気がつくのですが仮想世界の住人として登録した為、今でこそ現実も仮想(SL)もごっちゃまぜの気ままな呟きをポストしていますが、最初は四方八方に絡む勇気もなく多少肩身が狭く感じながら呟いていました。

セカンドライフ関連の呟きは【仮想のお話】と題目をつけて呟いています。興味の無いフォロワーさんに無駄なクリックをさせない為です(笑)あとは気の向くままに、映画から音楽、好きな車やデザインそしてスイーツ(すんごい重要事案w)STAR WARS(からめるツイッター探さないと...)
などなど呟いて楽しんでいます。

一つ二つ良くわからないことは時々流れてくる「ツイッター講習」の類いでしょうか、ブログの開設講習とか昔ありましたがそんな感じなのでしょうか?何か特別に教えていただくことってあるのかなと?
そしてフォロワーさんとフォローさんが一度に減る現象です!ブロックされたのでしょうがコレは凄い!と思ってしまったのです。自分の呟きでブロックするという行動をフォロワーさんに起こさせたと思うと、落胆どころか「凄いーw」と!まぁ、毒は吐いてないと思うのでイイですよね(笑)

Twitter はツイート(呟き)してなんぼだと思いますが、眺めていても楽しいものです。好きなアーティストさんからデザイナー、クリエーター、カージャーナリストさんたちの呟きを眺めるのも日課的な楽しみになっています。リスト機能を上手く使えばフォローまでしなくともリストでくくって束にして眺めることもできるので重宝です。


 それではいいかげん本題にいきます(^^;)

記事冒頭の画像はオレンジの主力製品であるスピーダーシリーズの新型飛行機です。
4人乗りでエンゼルチビーダの様にRezスタンドを装備し、スタイルのチェンジなど新たな機能も加わります。

製作中のプロトタイプを銀座オレンジファクトリーに展示いたしました。ボディとインテリア・テクスチャは仮の張り合わせですが、6人乗りスピーダより2回り程小柄なボディがご覧いただけます。


::: Airship Factory *Ginza* 銀座にて :::  Ginza/38/25/31

スピーダーシリーズは

SPEEDER M-106 - 6人乗り
TIBIEEDER M-103,203 - 3人乗り

と来て、センターセグメントの4人乗りをやっと発売しようとしています。搭乗人数からしてクルマで言うところのスポーティセダンとでも言いましょうか、これなら、カップル×2、ご夫婦にお子様2人、はてはお嬢様二人でくりだしてイケメンアバターのお兄さんを2人拉致ってことも可能な4人乗りです・・・!

REZボタンで出現するスタンドには、エンゼル・チビーダとは異なるメカニカルな脚をあしらいました。後部ハッチ内には空想満天なエンジンオブジェクトがギッシリと詰め込んであります。


::: Rez Stand 204 type :::

ハリボテエンジンなどプリム浪費の産物ですが、半重力浮遊装置とロケットエンジンの回転駆動部をごちゃごちゃとメカニカルに表現してみました。ラジエターぽい物も引っ付いてますけど、たぶんラジエターですw 配管や配線もスカルプパーツで作れたので盛ってみました!でも、なに冷却してんですかね・・・


::: SPEEDER model- 204 :::

例えて言うと、モデルカーを飾って楽しむ感覚でしょうか
ボンネットを開けるとエンジンがキラーン!のあの感じです。

そうそう、オレンジの飛行船でも装備したRezキットのあの感じです。追加のエンジンパーツや座席が出現するあの感じです。

Rez Stand 204 type はビシッ!バビョーン♪と出現サウンドを鳴り響かせ脚とエンジンが出現します。各所に座れたり整備ポーズをとります。そしてオーナーが搭乗すると自動で消えるシステムになっています。

今回は飾る方向メインで書き綴りましたが、スピーダは乗って飛行を楽しむ仮想世界の乗り物です。そちらがメインです!オリジナルの飛行スクリプトエンジンは更なる進化をとげリリースする予定ですので、お楽しみに!

 飛行して楽しむ
 ディスプレイして楽しむ
   そしてそしては・・・Devil Tibieeder M-213の発売の後にComing!です!

by Obione.




【砂袋な椅子】銀座エアシップファクトリーに置いてみました。


こんばんわ、オビワンです。

前回の記事でお知らせした様に、銀座エアシップファクトリーに「砂袋な椅子」を展示してみました。

なんと、ポーズは作ってるうちに8個も出来てしまいました。家具もポーズも専門分野ではないので、粗があるのはお許しいただくとして、一応男女兼用ぽく作ったつもりです。

長椅子は3人がけで3ポーズ、一人がけは5ポーズ、テーブルは4人がけ・・・ええ、かけちゃいます!で4ポーズ。座るとジャク♪と砂袋にお尻がめり込む音が出て、カメラ視点がグググっと視界方向に回り込んで来ます。テーブルは少々癖があるかもしれません、地震だ!のガクガクぶるぶるなポーズをとり地響きサウンドが鳴り響きます。そしてランダムに時にはお行儀の悪いポーズで座ります。

テーブルのトップは紋様ガラスをあしらってみました。中の2段棚が見えるので雑誌やミニカーとかアレンジフラワーなんぞを飾ってみるとお洒落だと思います。
と言うか、そのつもりで作りましたが残りプリムがかつかつで、本一冊しか置けませんでした(笑)

この夏、オレンジ・フォレストも創業4年目、やっと少しは作り込んだ自家製の椅子を店先に置くことができました。近日中には パインウッドとオールドウッドの2色を販売する予定です。


::: Airship Factory *Ginza* 銀座 :::

場所はメタワールド 銀座SIM コンシェルジュ・カフェの目の前です。お気軽にジャク♪と、ご休憩 待ち合わせにご活用ください。

こちらです
・http://slurl.com/secondlife/Ginza/61/86/31

Demonstration airplane
::: Demonstration airplane ::: TIBIEEDER M-203 - Angel Edition

おしゃべりに疲れたら頭上にあるデモの飛行機にタッチ!エンゼル・チビーダに乗って3分間の遊覧飛行をどうぞー銀座の町を空からお楽しみくださいませ。


by obione.

砂袋な椅子を作っています。

Sandbag table set
::: O.F Sandbag chair set :::

こんにちは、オビワンです。
今年も梅雨がやってきましたね。一年で一番苦手なシーズンの到来です。今日も日差しが戻るとともに気温と湿度が上がり、いつにも増して製作ペースが落ちて来そうなところですが、久しぶりにペンを取って製作日記を書いてみようと思います。

で、上のスナップだと なにしてるん!?と言われそうですが...

ごらんのとおり「地震だ!」のポーズです。

手足をガタブルとさせ机の下に潜ってるところです。


って、なんでまた・・・ですよね(笑)

オビワンの中の人は、唯一予測が可能で警戒警報が発令されると言われる「東海地震」の想定地域で暮らしています。そのため小学生の頃からノストラダムスの大予言より目前の巨大地震に備える、という慣例的にさえ感じる毎月の訓練を受けて育ちました。

結果、人類の滅亡も巨大地震も来てはいませんが、そのうちだとなると気にはなります。

避難訓練の当日は防犯ベルのケタタマしい音ともに 地震だ!と先生が叫び、生徒は一斉に机の下に潜りこみます! ただし、背丈の大きかった私は高学年にもなるとチッさなスチール製の机に潜り込むのは至難なうえ体も硬かったので頭や手足が飛び出てしまうのが常でした。

Sandbag Desk pose Sandbag Desk pose

リアルに揺れてる分けでもなく、警報ベルと先生の雄叫び・・・数十回とこなしてくると子供なだけに警戒心も机潜りも適当になります。

そんな子に対して、先生と言う職業の人は容赦ありませんでした。

○○さん!「お尻かくして頭かくさず!」と、言い放ち
持ってた1m級の竹製物差しでペンペンと叩きます。

痛くはなくとも、はずかしいったらありません。

 はぁ〜先生はおっきな教員机じゃん!いいよなぁ潜りやすいしー

それにさ、手足ぎゅうぎゅう引っ込めてる暇あるなら、わたしゃ真っ先に窓から飛び出して運動場に逃げますよー

 \(´・o・` )ノスタコラサッサ と、心の中で思ったものでした。。

と言うのも、今では耐震補強を施して頑丈そうにも見える鉄筋3.4階建ての校舎ですが、当時は至る所にヒビが入っていて廊下には段差ができ本当に巨大地震が来たら、ウルトラマンに出てきた海獣に粉々にされるビルのごとく絶対に崩れる!と子供心に思えたからです。


Sandbag chair poseさて、前置きが長くなりましたが、ただいま気まぐれに製作しているものの一つ「砂袋な椅子」の机には その "お尻かくして・・・" なポーズを幼少時代へのマイ・オマージュ?として付けてみました。
 そもそも、なぜメカニカル好きな私が急にこんな木製の椅子を作り始めたかと言うと、横に載せた "この" ポーズをやりたかったのが本当のところです(笑)

みなさん、こんな風に学校の椅子に座った覚えがありませんか?背もたれに脚を通して後ろの席のお友達とおしゃべり!お行儀の悪い休み時間の過ごし方なのですが....こうして過ごす時間が好きだったのです(笑) 

砂袋と名乗る様に、砂入り麻袋を座面にあしらってあります。まぁ土嚢にも見えます。座るとお尻が少し潜り ジャク♪ と良い音をだします!
このサウンドも砂利道を歩く音を Logic で切り刻み変調し、砂袋ぽく聴こえるように作ってみました♪


 ジャク ジャク ジャックジャク♪ と無意味な立ち座りが楽しい椅子だと思います☆


Sandbag chair pose

ちなみに5ポーズ仕込んであります。タッチで座る時にランダムでポジション&ポーズが変わる様にミューズさんが設定してくれましたーお友達と仲良くジャク♪ってみて下さい。




本当は、バックオーダーの飛行機作んなさいよ!な状況なのですが、店頭にはゆっくりしていただける椅子もあまり置いてないのでひとまず作ってみました。

一脚 3Primsで土地に優しい椅子です。低価格で近日中にリリース予定です。
そのうち銀座のエアシップ・ファクトリーにぽつんと置かれてると思います。


 お気軽に、ジャク♪とどうぞ。


*避難訓練を揶揄する記事ではありません。被害想定などを見ると警戒警報は是非とも正確な発令をと心から思っています。

by obione

LSL 実践講座 - HUD編

こんにちわ、ミューズです。
みなさん Viewer2.x は使ってますでしょうか? 巷ではさんざんな評判のようですがw ウチは営業&サポートの都合上、なるべく標準準拠させなくてはなので、Viewer2.x を使うようにしています。 今日は Viewer2.x でちょっと欲しい情報を表示するHUDを作成したので、それを久しぶりなLSL講座のネタにします。


::: Addtional Informaton HUD for Vewer2.x :::

今回作成するのはコレ↑
現在位置と対地高度(地面からの高さ)とかを表示します。
それではこのHUDの作成方法とスクリプトの解説を始めます。

2010/06/13 Myuse 追記
現在位置のみであれば、 メニューバーから World > Show > Coordinates のチェックを入れることで上のURLバーみたいなエリアの表示でも取得が可能です。また、土地の属性は World > Show > Parcel Properties でアイコンみたいなのが出ます。 本記事はあくまでもLSLの題材として参照下さい。


- 注意 -
お決まりの話しですが、ココに記載の情報利用に伴う一切の不利益についてOrange Forestは責任を負いません。本記事の内容は自己責任で参照下さい。バグ指摘、質問は歓迎です。


::: Create a new box prim :::

 まずはHUDになるプリムを準備します。
Ctrl+B でBuild用のダイアログを出し、図のようにしてBoxプリムを1個、地面に生成します。


::: Edit the created prim and resize :::

続いてそのプリムを編集してサイズを小さくします。
2cm~5cmの立方体にするとよさそうです。


::: Create a new Script in HUD prim's content :::

次にプリムのコンテンツTabに移動して空っぽのスクリプトファイルを生成します。
あ、いい忘れましたが作業する土地はオブジェクト生成OK&スクリプト実行OKな所でお願いします。


::: Paste script code from the below of this blog article :::

スクリプトの中身をこのブログ記事の下にあるコードと入れ替えます。
スクリプトの機能はスクリプトのコメントを参照下さい。
書き換えたら保存して下さい。スクリプトのコンパイル処理が始まります。


::: Attach the object as HUD :::

HUDを"Right Click">"Take"してInventoryに取り込みます。
取り込んだHUDを図のようにHUDとしてアバターに装着します。


::: Locate HUD :::

装着したHUDは、"Right Click">"Edit" で位置やサイズを調整可能です。


::: Detach HUD if you want :::

HUDが不要になった場合は図のようにインベントリから選択して"Detach"することが出来ます。

それでは中身のスクリプトです。
改変、再販はユーザーの責任において御自由にどうぞ。

//---------------------------------------------------------------------------------
// showcurpos - Show current position
// $Id: showcurpos.lsl 682 2010-06-12 15:54:53Z myuse $
//---------------------------------------------------------------------------------

vector gPrevPos = ZERO_VECTOR;

default {
  state_entry () {
    // Show object after build
    llSetAlpha(1.0, ALL_SIDES);
    llSetText("", ZERO_VECTOR, 0.0);

    // HUDを装着したままスクリプトを編集した場合の初期化処理
    if (llGetAttached()) {
      llSetAlpha(0.3, ALL_SIDES);
      llSetTimerEvent(1.0);
    }
  }

  // HUDを装着した場合、on_rez → attach の順番でイベントが発生する。
  // HUDを地面に置いた場合は on_rez のみ発生
  // HUDを不透明にして動作停止
  on_rez (integer rezParam) {
    // Show object after rez
    llSetAlpha(1.0, ALL_SIDES);
    llSetText("", ZERO_VECTOR, 0.0);
    llSetTimerEvent(0.0);
  }

  attach (key id) {
    if (id == llGetOwner()) {
      // HUD をオーナーが装着した
      // → 半透明にして1秒毎に動作開始
      llSetAlpha(0.3, ALL_SIDES);
      llSetTimerEvent(1.0);
      gPrevPos = ZERO_VECTOR;
    }
    else {
      // HUDを取り外した
      // → 不透明にして動作停止
      llSetAlpha(1.0, ALL_SIDES);
      llSetText("", ZERO_VECTOR, 0.0);
      llSetTimerEvent(0.0);
    }
  }

 // 1秒毎に呼び出されるHUD表示更新処理
  timer () {
    vector  pos    = llGetPos();
    integer ground = (integer)llGround(ZERO_VECTOR);
    integer water  = (integer)llWater(ZERO_VECTOR);
    integer parcel = llGetParcelFlags(pos);
    string  out;
    integer abs;
    vector  col    = <0.0, 0.5, 1.0>;  // blue

    // Check if moved ?
    if (gPrevPos == pos) {
      // アバターが移動していない場合は何もしないで終了
      return;
    }
    else {
      gPrevPos = pos;
    }

    // Get absolute altitude
    if (ground > water) {
      abs = ground;
    }
    else {
      abs = water;
    }
    abs = ((integer)pos.z) - abs;

    out = llGetRegionName() + "/" +
          (string)((integer)pos.x) + "/" +
          (string)((integer)pos.y) + "/" +
          (string)((integer)pos.z) + "\nAbsAlt: " + (string)abs + "m";

    // HUDの文字の色の設定
    // 赤 : 進入禁止区域
    // 橙 : Rez不可
    // 青 : Rez, 進入OK
    // イマイチ正しく機能しない場合あり

    if (parcel & (PARCEL_FLAG_USE_ACCESS_GROUP |
                  PARCEL_FLAG_USE_ACCESS_LIST |
                  PARCEL_FLAG_USE_LAND_PASS_LIST)) {
      col = <1.0, 0.0, 0.0>;  // red
    }
    else if ((parcel & PARCEL_FLAG_ALLOW_CREATE_OBJECTS) == 0) {
      col = <1.0, 0.5, 0.0>;  // orange
    }

    // HUD表示
    llSetText(out, col, 1.0);
  }
}