今日は新製品。。。じゃなくて改良品ですかね^^; 発表します。期間限定のフリマでフリー配布した♥のピアス をその後Monemaシティ店でL$10で売ってたんですが、ハートの部分に色がチカチカ変わるスクリプトを組み込んで販売し直すことにしました^^

普通にタイマーだけだと左右の色がずれてくるんですが、そこは何とか同期させてます^^;
価格はL$20にしました。宜しくお願いします。
// お金オブジェクト
integer amount=1; // お金の金額
default
{
state_entry()
{
llSetColor(<0,0,0>,ALL_SIDES); // 最初は黒
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT); // 口座引き落としリクエスト
}
touch_start(integer total_number)
{
key agent=llDetectedKey(0); // タッチしたアバターのキー
if (llGetColor(0) == <1,1,1>) { // 色が白なら
string name=llDetectedName(0); // アバター名取得
llGiveMoney(agent, amount); // お金渡す
llSay(0,name+" got L$"+(string)amount+"."); // チャットでアナウンス
llDie(); // 消滅
}
else if (agent == llGetOwner()) { // 色が白でなくてオーナーがタッチしたとき
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT); // 口座引き落としリクエスト
}
}
on_rez(integer start_param)
{ // rezのときリセット
llResetScript();
}
run_time_permissions(integer perm)
{ // 口座引き落とし許可されると色を白にする
if (perm & PERMISSION_DEBIT)
llSetColor(<1,1,1>,ALL_SIDES);
}
}
default
{
state_entry()
{
llSitTarget(<0.0,-0.375,0.53>,llEuler2Rot(<0.0,0.0,-90.0>*DEG_TO_RAD));
}
}
string anim="sitting chair f04"; // アニメーション名
default
{
state_entry()
{
// 座る位置調整
llSitTarget(<0,0.1,0.4>, llEuler2Rot(<0,0,-90>*DEG_TO_RAD));
}
changed(integer change)
{
if (change & CHANGED_LINK)
{
key agent=llAvatarOnSitTarget();
if (agent)
{
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
}
else
{
llStopAnimation(anim);
}
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
{
llStopAnimation("sit");
llStartAnimation(anim);
}
}
}
// ノートカードを読み出す
string text; // 読み出した文字列格納用
string note;
integer line; // 読み出す行のカウント用
key queryhandle;
key note_id; // コンテンツ内のノートのキー
init()
{
note=llGetInventoryName(INVENTORY_NOTECARD,0); // コンテンツ内のノート
text=""; // 文字列初期化
line=0; // カウント初期化
queryhandle=llGetNotecardLine(note, line); // ノートの行読み出し開始
note_id=llGetInventoryKey(note); // ノートのキーを変数に入れとく
}
default
{
state_entry()
{ // 最初はinit実行
init();
}
changed(integer change)
{
if (change & CHANGED_INVENTORY) {
if (note_id != llGetInventoryKey(note))
{ // ノートのキーが変わったら
init(); // initへ
}
}
}
dataserver(key query_id, string data)
{
if (query_id == queryhandle) {
if (data != EOF) { // ノートが終わってなければ
text+=data+"\n"; // 読み出した行に改行つけてtextに追加
line++; // カウンタを次の行にして
queryhandle=llGetNotecardLine(note,line); // 読み出し続行
}
else { // そうでないとき(ノートが終わりに達したら)
llSay(0,text); // チャットで表示
llSetText(text,<1,1,1>,1.0); // フローティングテキストに表示
}
}
}
}
// 透明・不透明切り替え
float alpha=1.0; // 不透明度
default
{
touch_start(integer total_number)
{
if (llDetectedKey(0) == llGetOwner())
{ // オーナーがタッチしたら
if (alpha < 0.5) alpha=1.0; // alphaが0.5以下なら1.0に
else alpha=0.2; // そうでないときは0.2に
llSetAlpha(alpha,ALL_SIDES); // アルファを設定
}
}
}
// 親プリムのスクリプト
float alpha=1.0; // 不透明度
default
{
touch_start(integer total_number)
{
if (llDetectedKey(0) == llGetOwner())
{ // オーナーがタッチしたら
if (alpha < 0.5) alpha=1.0; // alphaが0.5以下なら1.0に
else alpha=0.2; // そうでないときは0.2に
// リンクした子プリムにメッセージ送る
llMessageLinked(LINK_ALL_CHILDREN,0,"alpha"+(string)alpha,"");
}
}
}
// 透明にする子プリムのスクリプト
default
{
link_message(integer sender_num, integer num, string msg, key id)
{
if (llGetSubString(msg,0,4) == "alpha")
{ // alphaのメッセージ受信すると
float alpha=(float)llGetSubString(msg,5,-1); // 数値を得る
llSetAlpha(alpha,ALL_SIDES); // アルファを設定
}
}
}
// 座っても脚の隠れるスカート(改)
integer stand=FALSE;
// 座ってないときの特徴パラメータリスト [ 柔軟性, 重力, ドラッグ, 風, 緊張, X、Y、Z方向のフォース ]
list unsit=[3,2.0,1.0,1.0,8.0,<0,0,0>];
list sit;
float gravity=0.5;
float force=3;
default
{
state_entry()
{
unsit=[PRIM_FLEXIBLE,TRUE]+unsit;
sit=llListReplaceList(unsit,[gravity],3,3);
llSetTimerEvent(0.25);
}
touch_start(integer total_number)
{
if (llDetectedKey(0) != llGetOwner()) return;
stand=!stand;
}
timer()
{
integer i=llGetAgentInfo(llGetOwner());
string str=llGetAnimation(llGetOwner());
if ((i & AGENT_SITTING) || str == "Sitting")
{
if (!stand) {
list l=llGetObjectDetails(llGetOwner(),[OBJECT_ROT]);
vector v=llRot2Euler(llList2Rot(l,0));
float x=llCos(v.z)*force;
float y=llSin(v.z)*force;
sit=llListReplaceList(sit,[<x,y,0>],-1,-1);
llSetLinkPrimitiveParams(LINK_SET,sit);
}
else llSetLinkPrimitiveParams(LINK_SET,unsit);
}
else {
stand=FALSE;
llSetLinkPrimitiveParams(LINK_SET,unsit);
}
}
}
// タッチすると輝きが変わる
integer shiny=0; // 輝きの強さ
default
{
state_entry()
{ // 最初は輝きなし
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, PRIM_SHINY_NONE, PRIM_BUMP_NONE]);
}
touch_start(integer total_number)
{ // タッチすると
shiny++; // 輝きの数値加算
if (shiny > 3) shiny=0; // 3を超えたら0
// 輝きを設定
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, shiny, PRIM_BUMP_NONE]);
}
}
// 短針用
default
{
state_entry()
{
llSetTimerEvent(0.1); // タイマー0.1秒
}
timer()
{
integer t=(integer)llGetWallclock(); // PST/PDT
integer h=t/3600; // 時
integer m=(t%3600)/60; // 分
// 短針の角度を計算して設定
llSetLocalRot(llEuler2Rot(<0,0,360-(h*30+m/2)>*DEG_TO_RAD));
}
}
// 長針用
default
{
state_entry()
{
llSetTimerEvent(0.1); // タイマー0.1秒
}
timer()
{
integer t=(integer)llGetWallclock(); // PST/PDT
integer m=(t%3600)/60; // 分
// 長針の角度を計算して設定
llSetLocalRot(llEuler2Rot(<0,0,360-m*6>*DEG_TO_RAD));
}
}
// 約10分間のプリムセーバー本体
integer int=0; // カウンタ
integer ch=0; // チャット用チャンネル
default
{
touch_start(integer total_number)
{
if (llDetectedKey(0) == llGetOwner())
{ // オーナーがタッチすると
int=0; // カウンタ初期化
llSetTimerEvent(0.1); // 0.1秒後にタイマー
}
}
timer()
{
llSetTimerEvent(55); // タイマー55秒毎
if (llGetInventoryNumber(INVENTORY_OBJECT) < 1)
{ // コンテンツ内にオブジェクトがないと
llSetTimerEvent(0); // タイマー停止
return; // 実行中断
}
int++; // カウンタ加算
if (int > 10) llSetTimerEvent(0); // カウント11でタイマー停止
if (ch != 0) llSay(ch,"氏ねばいいと思うよ"); // 臨時オブジェクト削除用メッセージ
ch=llCeil(llFrand(2147483646)); // 乱数でチャンネル設定
string str=llGetInventoryName(INVENTORY_OBJECT,0); // コンテンツ内のオブジェクト名取得
// 本体の1.5m上にオブジェクトをRez
llRezObject(str,llGetPos()+<0,0,1.5>,ZERO_VECTOR,ZERO_ROTATION,ch);
}
}
// Rezするオブジェクト用
integer listen_handle;
integer CHANNEL;
default
{
state_entry()
{ // オブジェクトを臨時に設定
llSetPrimitiveParams([PRIM_TEMP_ON_REZ,TRUE]);
}
on_rez(integer start_param)
{ // Rezされると本体からチャンネル番号を取得
CHANNEL=start_param; // チャットチャンネル設定
listen_handle=llListen(CHANNEL, "",NULL_KEY , ""); // リッスン開始
}
listen(integer channel, string name, key id, string msg)
{
llListenRemove(listen_handle);
if (channel == CHANNEL) {
if (msg == "氏ねばいいと思うよ") { // メッセージ受信したら
llDie(); // 逝ってきます
}
}
}
}
// オンライン表示
key query;
key av;
string name;
default
{
state_entry()
{
av=llGetOwner(); // オーナーのキー
name=llKey2Name(av); // オーナーがいる間にアバター名に変換しとく
llSetTimerEvent(1); // 最初は1秒後にチェック
}
on_rez(integer start_param)
{ // Rezのときリセット
llResetScript();
}
timer()
{
llSetTimerEvent(30); // 30秒毎にタイマー動かしてチェック
query=llRequestAgentData(av,DATA_ONLINE); // データ問い合わせ
}
dataserver(key id, string data)
{
if (id == query) {
string str=name+" は";
if ((integer)data) { // データがTRUEなら
str+="オンラインです";
}
else { // そうでないとき
str+="オフラインです";
}
llSetText(str,<1,1,1>,1.0); // フローティングテキストで表示
}
}
}
// アバターのキーから名前をゲット
key av="00000000-0000-0000-0000-000000000000"; // アバターのキー
string url="http://world.secondlife.com/resident/";
key http_request_id;
default
{
state_entry()
{
url+=(string)av; // プロフのURL
http_request_id=llHTTPRequest(url,[],""); // HTTPリクエスト送信
}
http_response(key request_id, integer status, list metadata, string body)
{
if (request_id == http_request_id)
{
integer i=llSubStringIndex(body,"<title>"); // プロフページ<title>の位置
integer j=llSubStringIndex(body,"</title>"); // プロフページ</title>の位置
string name=llGetSubString(body,i+7,j-1); // タイトルは名前
llSay(0,name); // アバター名をチャットで表示
}
}
}
key av="00000000-0000-0000-0000-000000000000"; // アバターのキー
key query;
default
{
state_entry()
{ // データサーバーに問い合わせ
query=llRequestAgentData(av,DATA_NAME);
}
dataserver(key queryid, string data)
{
if (query == queryid) {
llSay(0,data); // アバター名をチャットで表示
}
}
}
// ガチャガチャ
integer price=10; // 値段
integer len;
init()
{
llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]); // 一時的に支払いを不可に設定
len=llGetInventoryNumber(INVENTORY_OBJECT); // コンテンツ内のオブジェクト数
if (len > 0) { // オブジェクトが1個以上入ってたら支払いボタンに値段を設定
llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
}
}
default
{
state_entry()
{
init(); // 最初にinit実行
}
changed(integer change)
{
if (change & CHANGED_INVENTORY) {
init(); // コンテンツ内が変わったらinit
}
}
money(key id, integer amount)
{ // 支払いがあったら
if (amount == price) { // 金額チェック
integer i=llFloor(llFrand(len)); // 乱数発生して
string str=llGetInventoryName(INVENTORY_OBJECT,i); // オブジェクト名を決め
llGiveInventory(id,str); // 購入者に渡す
}
else llWhisper(0,"Error - illegal amount"); // 金額がおかしかったらエラー表示
}
}
default
{
attach(key on)
{
if (on) { // 装着したとき
float f=llGetMass()*9.8; // 質量×重力加速度
llSetForce(<0,0,f>,TRUE); // Z方向に力を加える
}
else { // そうでないとき
llSetForce(<0,0,0>,TRUE); // 力をリセット
}
}
}
// 空高く飛べる
float gravity=9.8; // 重力加速度
default
{
attach(key on)
{
if (on) { // 装着したらコントロールのパーミッションをリクエスト
llRequestPermissions(on, PERMISSION_TAKE_CONTROLS);
}
else { // そうでないときは
llReleaseControls(); // コントロール解除
llSetForce(<0,0,0>,TRUE); // 力をリセット
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TAKE_CONTROLS)
{ // コントロールが許可されたら
llTakeControls(CONTROL_UP|CONTROL_DOWN, TRUE, TRUE); // UP/DOWNキー受付
}
}
control(key id, integer level, integer edge)
{
integer i=llGetAgentInfo(llGetOwner()); // アバターの状態を調べて
if (i & AGENT_FLYING) { // 飛んでるとき
float f; // Z方向の力の計算用
if (level & CONTROL_UP) f=llGetMass()*gravity*2; // UPキーが押されると加速度を増やす
else if (edge & (CONTROL_UP|CONTROL_DOWN)) f=llGetMass()*gravity; // UP/DOWNキーが戻ると加速度を戻す
llSetForce(<0,0,f>,TRUE); // 力を設定
}
else llSetForce(<0,0,0>,TRUE); // 飛んでないとき力を0にする
}
}
// 座っても脚の隠れるスカート
// 座ってないときの特徴パラメータリスト [ 柔軟性, 重力, ドラッグ, 風, 緊張, X、Y、Z方向のフォース ]
list unsit=[3, 2.0, 1.0, 1.0, 8.0, <0,0,0>];
list sit; // 座ったときの特徴パラメータリスト
float gravity=0.5; // 座ったときの重力(調整してね)
float force=3; // 座ったときに加えるフォース(調整してね)
default
{
state_entry()
{
unsit=[PRIM_FLEXIBLE,TRUE]+unsit; // llSetLinkPrimitiveParams用にパラメータを追加
sit=llListReplaceList(unsit,[gravity],3,3); // 座ったときの特徴の重力を設定
llSetTimerEvent(0.5); // 0.5秒間隔でタイマー
}
timer()
{
integer i=llGetAgentInfo(llGetOwner()); // アバターの状態
string str=llGetAnimation(llGetOwner()); // アバターのアニメーション
if ((i & AGENT_SITTING) || str == "Sitting")
{ // 座ってるか座るアニメーションだったら
list l=llGetObjectDetails(llGetOwner(),[OBJECT_ROT]); // アバターのローテーションを調べる
vector v=llRot2Euler(llList2Rot(l,0)); // リストのローテーションをベクトルに変換
float x=llCos(v.z)*force; // z方向の角度から
float y=llSin(v.z)*force; // x,yに加える数値を計算
sit=llListReplaceList(sit,[<x,y,0>],-1,-1); // リストの値に入れて
llSetLinkPrimitiveParams(LINK_SET,sit); // それをプリムに反映
}
else { // 座ってないとき
llSetLinkPrimitiveParams(LINK_SET,unsit); // プリムに座ってない状態を設定
}
}
}
// 接触するとチャットで喋る
default
{
collision_start(integer total_number)
{ // オブジェクトに接触すると
string name=llDetectedName(0); // 名前を調べて
llSay(0, name+"さん、いらっしゃい!!"); // いらっさい♪
}
}
// ウェルカムマット
string tmp; // 名前の記憶用
default
{
collision_end(integer total_number)
{ // マットから離れると
string name=llDetectedName(0); // アバター名を調べて
if (name != tmp) { // 前のアバター名と違ったら
tmp=name; // 名前を記憶しといて
llSay(0, name+"さん、ようこそ♪"); // メッセージ喋る
}
llSetTimerEvent(30); // 30秒後にタイマー
}
timer()
{
llSetTimerEvent(0); // タイマークリア
tmp=""; // 記憶を消去
}
}