今日は、お遊びグッズを作ってみました。
指定した相手に対してハートのパーティクルを飛ばすスティックです。
飛ばすパーティクルには、以前Tipsで紹介した、ハートスクリプトを流用しています。
スティックはこんな感じ
しかし、いかついおやじがもつとキモイ・・・
このスティックをクリックすると半径10m以内にいるアバターを検出して、
名前をダイアログに表示します。
名前を選択すると、相手に対してハートのパーティクルが飛びます。
(OFFを押すとパーティクルをストップします。)
実行するとこんな感じw
(特別協力: 島娘のMewblue Luschさん。ご協力ありがとうw)
以下が、このスティックに仕込んだスクリプト内容です。
「スクリプト内容」
// INPUT CHANNEL
integer input_ch = -1;
// SENSOR RANGE(m)
float range = 10;
// SENSOR ARC FOR X
float arc = PI;
string texname;
integer handle;
integer i;
integer counter;
list idlist;
list namelist;
key uid;
HeartOut (string msg) {
if (msg=="ON") {
llParticleSystem([
PSYS_SRC_TEXTURE , texname
,PSYS_PART_START_ALPHA ,1.0
,PSYS_PART_END_ALPHA , 1.0
,PSYS_PART_START_SCALE ,<0.08,0.08,0.0>
,PSYS_PART_END_SCALE ,<0.08,0.08,0.0>
,PSYS_SRC_BURST_SPEED_MIN ,0.2
,PSYS_SRC_BURST_SPEED_MAX ,0.2
,PSYS_PART_MAX_AGE ,3.0
,PSYS_SRC_MAX_AGE,0.0
,PSYS_SRC_ACCEL ,<0,0,0>
,PSYS_SRC_PATTERN , PSYS_SRC_PATTERN_EXPLODE
,PSYS_SRC_ANGLE_BEGIN , PI_BY_TWO
,PSYS_SRC_ANGLE_END , PI_BY_TWO
,PSYS_SRC_BURST_PART_COUNT , 1
,PSYS_SRC_BURST_RADIUS , 0.0
,PSYS_SRC_BURST_RATE , 0.9
,PSYS_SRC_TARGET_KEY, uid
,PSYS_PART_FLAGS , (0
| PSYS_PART_EMISSIVE_MASK
| PSYS_PART_INTERP_SCALE_MASK
| PSYS_PART_TARGET_POS_MASK
)
]);
} else if (msg=="OFF") {
llParticleSystem([]);
}
}
default {
state_entry(){
llSetTimerEvent(0.0);
HeartOut("OFF");
}
on_rez(integer param){
llResetScript();
}
touch_start(integer t) {
if (llDetectedKey(0)==llGetOwner()) {
idlist=[];
namelist=[];
handle = llListen(input_ch, "", llGetOwner(), "");
llSensor("","",AGENT,range,arc);
}
}
// Sensor handler
sensor(integer total_number) {
for (i = 0; i < total_number; i++) {
if (i<11) {
idlist+=llDetectedKey(i);
namelist+=llDetectedName(i);
}
}
namelist+="OFF";
llDialog(llGetOwner(), "PLEASE SELECT AVATORS", namelist, input_ch);
llSensorRemove();
}
// listen handler
listen(integer ch, string name, key id, string message) {
if (message=="OFF") {
llSetTimerEvent(0.0);
HeartOut("OFF");
} else {
integer findIndex = llListFindList(namelist, [message]);
if (findIndex != -1) {
uid = llList2Key(idlist,findIndex);
// particle start
llSetTimerEvent(0.5);
}
}
llListenRemove(handle);
}
// timer Event
timer(){
counter ++;
if (counter == 2){
counter = 0;
texname="a1d48734-bb17-4fb3-4e5c-131bb2b73ada";
} else if (counter == 1){
texname="3e887ba1-8bc6-e3e2-6d5b-8d39a03a5690";
}
HeartOut("ON");
}
}
「スクリプトの説明」
1. llListenを使用して、チャットチャンネル-1でオーナーからの発言を待ちます。
2. llSensorを使用して、半径10m範囲に存在するアバターを検出します。
3. 検出したアバターのリストを作成し、ダイアログとして表示します。
4. ダイアログ上のアバター名をクリックすると、チャットチャンネル-1を通して
アバター名を発信します。
5. アバター名の発言をlistenイベントで検出すると、llParticleSystemの
PSYS_SRC_TARGET_KEYを使用して、アバターに対してパーティクルを
飛ばします。
リンデンスクリプト Tips Intexへ