モノを投げるscriptはイロイロあるけど、ちょっと違った味付けが出来たかなぁって思います
甘くてちょっときちゃないパイ投げを、召し上がれ
pie-puff
pie-scratch
持つパイscriptここから
//臨時objectを打ち出すscriptです
//最初はゆっくり、時間が経つにつれてどんどん早く力が
float pow = 0; //投げる力の初期値
float charge = 0.1; //投げる力の現在値
float CHARGEINIT = 0.02; //溜める基本値の初期値(時間毎に増えます)
float POWMAX = 30; //投げる力の最大値
float REZPOS = 0.5; //Rezする地点の自分からの距離
rotation getPieRot(){
//パイのクリーム地を前にして投げるために、回転角度を調整します
//回転値を返します
rotation rot = llEuler2Rot(<90,0,0> * DEG_TO_RAD);
rot = rot * llEuler2Rot(<0,0,90> * DEG_TO_RAD);
rot = rot * llGetRot();
return rot;
}
throw(float power){
//投げる部分をまとめて、コメントしやすいようにしてます
vector relVec = llGetPos(); //投げ始める位置(方向含みます)
rotation relRot = llGetRot(); //投げる方向(向いてる方向)
vector fceVec = llRot2Fwd(relRot); //投げる力の方向・大きさ
llStartAnimation("pie-throw");
llSleep(0.1);
llSetTexture(TEXTURE_TRANSPARENT,0);
relVec += fceVec;
relVec.z += 0.7; //投げ始める位置をちょこっと高くします
fceVec *= power; //溜めた力を合成します
llRezObject("throwing chocolate pie",relVec,fceVec,getPieRot(),0);
llSleep(1);
llStopAnimation("pie-throw");
llSetTexture("pie-texture",0);
}
default
{
state_entry()
{
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION
| PERMISSION_TAKE_CONTROLS);
}
//装着した時の処理:パーミッションの取得
attach(key uuid_av)
{
if(uuid_av != NULL_KEY){
llOwnerSay("get mouselook & throwing pie!");
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION
| PERMISSION_TAKE_CONTROLS);
} else {
llOwnerSay("CU~.");
}
}
//パーミッション取得処理
run_time_permissions(integer perm)
{
if(perm & PERMISSION_TRIGGER_ANIMATION){
llStartAnimation("pie-hold");
}
if(perm & PERMISSION_TAKE_CONTROLS){
llTakeControls(CONTROL_ML_LBUTTON,TRUE,FALSE);
}
}
//コントロール処理
control(key uuid2, integer held, integer edge)
{
if (held & CONTROL_ML_LBUTTON){
//左ボタンを押し続けてる間の処理
//ぐるぐるアニメスタート
if(pow==0){
llStartAnimation("pie-charge");
llLoopSound("cartoon185SL",1);
}
//ちからを溜めるよ
pow += charge;
charge += CHARGEINIT; //次に溜めるちからの値は、少しだけ多く
if(pow > POWMAX){ pow = POWMAX;} //最大値以上は溜めません
} else if (edge & CONTROL_ML_LBUTTON){
//左ボタンを離した時の処理
//ぐるぐるアニメストップ
llStopAnimation("pie-charge");
llStopSound();
throw(pow); //投げる処理と投げアニメ
pow = 0;
charge = CHARGEINIT;
}
}
}
ここまで
臨時objectの投げるパイscriptは、ここから
// クリーム跡をしっかり表示します。
// 30秒間テクスチャをその場所に表示
put_cream(){
string texture = "pie-scratch";//テクスチャ名
llParticleSystem(
[PSYS_PART_FLAGS , ( 0 |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_INTERP_COLOR_MASK |
PSYS_PART_INTERP_SCALE_MASK
)
,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
,PSYS_PART_START_ALPHA, 1.0
,PSYS_PART_END_ALPHA, 1.0
,PSYS_PART_START_COLOR, <1,1,1>//色
,PSYS_PART_END_COLOR, <1,1,1>//色
,PSYS_PART_START_SCALE, <0.7,1.4,0.7>//大きさ 最大4x4x4
,PSYS_PART_END_SCALE, <0.7,1.4,0.7>//大きさ 最大4x4x4
,PSYS_SRC_MAX_AGE, 0.5
,PSYS_PART_MAX_AGE, 30.0
,PSYS_SRC_ACCEL, <0.0, 0.0, 0.0>
,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
,PSYS_SRC_ANGLE_BEGIN, PI
,PSYS_SRC_ANGLE_END, 0*DEG_TO_RAD
,PSYS_SRC_BURST_PART_COUNT, 1
,PSYS_SRC_BURST_RATE, 1.0
,PSYS_SRC_BURST_SPEED_MIN, 0.0
,PSYS_SRC_BURST_SPEED_MAX, 0.0
,PSYS_SRC_TEXTURE,texture
]);
}
// クリーム跡をちょっと表示します。
// べちゃっとした感じに
scatter_cream(){
string texture = "pie-puff";//テクスチャ名
llParticleSystem(
[PSYS_PART_FLAGS , ( 0 |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_INTERP_COLOR_MASK |
PSYS_PART_INTERP_SCALE_MASK
)
,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
,PSYS_PART_START_ALPHA, 1.0
,PSYS_PART_END_ALPHA, 1.0
,PSYS_PART_START_COLOR, <1,1,1>//色
,PSYS_PART_END_COLOR, <1,1,1>//色
,PSYS_PART_START_SCALE, <0.4,0.4,0.4>//大きさ 最大4x4x4
,PSYS_PART_END_SCALE, <0.7,0.7,0.7>//大きさ 最大4x4x4
,PSYS_SRC_MAX_AGE, 0.5
,PSYS_PART_MAX_AGE, 3.0
,PSYS_SRC_ACCEL, <0.0, 0.0, 0.0>
,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
,PSYS_SRC_ANGLE_BEGIN, PI
,PSYS_SRC_ANGLE_END, 0*DEG_TO_RAD
,PSYS_SRC_BURST_PART_COUNT, 1
,PSYS_SRC_BURST_RATE, 1.0
,PSYS_SRC_BURST_SPEED_MIN, 0.0
,PSYS_SRC_BURST_SPEED_MAX, 0.0
,PSYS_SRC_TEXTURE,texture
]);
}
default
{
state_entry()
{
float force = llVecMag(llGetAccel());
if(630 < force){
llPlaySound("Rico02SL",1);
} else {
llPlaySound("ZipIn+",1);
}
}
on_rez(integer param){
llResetScript();
}
collision_start(integer col_num)
{
//まず一度非物理にして勢いをなくして、もう1度物理にします
llSetStatus(STATUS_PHYSICS,FALSE);
//衝突した時にavatarかobjectか判別します。
//今回は地面との衝突は判定しません
if(llDetectedType(0) & PASSIVE){
//止まってるモノに当たった場合
//べちょ
put_cream();
llPlaySound("ZipFart",1);
} else {
//人、動いてるモノ、動きそうなモノに当たった場合
//べちょ
scatter_cream();
llPlaySound("ZipFart",1);
}
//重力にまかせて落っこちます
llSetStatus(STATUS_PHYSICS,TRUE);
//script自体を停止させます
llSetScriptState("collision script",FALSE);
}
}
ここまで
甘くてちょっときちゃないパイ投げを、召し上がれ
pie-puff
pie-scratch
持つパイscriptここから
//臨時objectを打ち出すscriptです
//最初はゆっくり、時間が経つにつれてどんどん早く力が
float pow = 0; //投げる力の初期値
float charge = 0.1; //投げる力の現在値
float CHARGEINIT = 0.02; //溜める基本値の初期値(時間毎に増えます)
float POWMAX = 30; //投げる力の最大値
float REZPOS = 0.5; //Rezする地点の自分からの距離
rotation getPieRot(){
//パイのクリーム地を前にして投げるために、回転角度を調整します
//回転値を返します
rotation rot = llEuler2Rot(<90,0,0> * DEG_TO_RAD);
rot = rot * llEuler2Rot(<0,0,90> * DEG_TO_RAD);
rot = rot * llGetRot();
return rot;
}
throw(float power){
//投げる部分をまとめて、コメントしやすいようにしてます
vector relVec = llGetPos(); //投げ始める位置(方向含みます)
rotation relRot = llGetRot(); //投げる方向(向いてる方向)
vector fceVec = llRot2Fwd(relRot); //投げる力の方向・大きさ
llStartAnimation("pie-throw");
llSleep(0.1);
llSetTexture(TEXTURE_TRANSPARENT,0);
relVec += fceVec;
relVec.z += 0.7; //投げ始める位置をちょこっと高くします
fceVec *= power; //溜めた力を合成します
llRezObject("throwing chocolate pie",relVec,fceVec,getPieRot(),0);
llSleep(1);
llStopAnimation("pie-throw");
llSetTexture("pie-texture",0);
}
default
{
state_entry()
{
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION
| PERMISSION_TAKE_CONTROLS);
}
//装着した時の処理:パーミッションの取得
attach(key uuid_av)
{
if(uuid_av != NULL_KEY){
llOwnerSay("get mouselook & throwing pie!");
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION
| PERMISSION_TAKE_CONTROLS);
} else {
llOwnerSay("CU~.");
}
}
//パーミッション取得処理
run_time_permissions(integer perm)
{
if(perm & PERMISSION_TRIGGER_ANIMATION){
llStartAnimation("pie-hold");
}
if(perm & PERMISSION_TAKE_CONTROLS){
llTakeControls(CONTROL_ML_LBUTTON,TRUE,FALSE);
}
}
//コントロール処理
control(key uuid2, integer held, integer edge)
{
if (held & CONTROL_ML_LBUTTON){
//左ボタンを押し続けてる間の処理
//ぐるぐるアニメスタート
if(pow==0){
llStartAnimation("pie-charge");
llLoopSound("cartoon185SL",1);
}
//ちからを溜めるよ
pow += charge;
charge += CHARGEINIT; //次に溜めるちからの値は、少しだけ多く
if(pow > POWMAX){ pow = POWMAX;} //最大値以上は溜めません
} else if (edge & CONTROL_ML_LBUTTON){
//左ボタンを離した時の処理
//ぐるぐるアニメストップ
llStopAnimation("pie-charge");
llStopSound();
throw(pow); //投げる処理と投げアニメ
pow = 0;
charge = CHARGEINIT;
}
}
}
ここまで
臨時objectの投げるパイscriptは、ここから
// クリーム跡をしっかり表示します。
// 30秒間テクスチャをその場所に表示
put_cream(){
string texture = "pie-scratch";//テクスチャ名
llParticleSystem(
[PSYS_PART_FLAGS , ( 0 |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_INTERP_COLOR_MASK |
PSYS_PART_INTERP_SCALE_MASK
)
,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
,PSYS_PART_START_ALPHA, 1.0
,PSYS_PART_END_ALPHA, 1.0
,PSYS_PART_START_COLOR, <1,1,1>//色
,PSYS_PART_END_COLOR, <1,1,1>//色
,PSYS_PART_START_SCALE, <0.7,1.4,0.7>//大きさ 最大4x4x4
,PSYS_PART_END_SCALE, <0.7,1.4,0.7>//大きさ 最大4x4x4
,PSYS_SRC_MAX_AGE, 0.5
,PSYS_PART_MAX_AGE, 30.0
,PSYS_SRC_ACCEL, <0.0, 0.0, 0.0>
,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
,PSYS_SRC_ANGLE_BEGIN, PI
,PSYS_SRC_ANGLE_END, 0*DEG_TO_RAD
,PSYS_SRC_BURST_PART_COUNT, 1
,PSYS_SRC_BURST_RATE, 1.0
,PSYS_SRC_BURST_SPEED_MIN, 0.0
,PSYS_SRC_BURST_SPEED_MAX, 0.0
,PSYS_SRC_TEXTURE,texture
]);
}
// クリーム跡をちょっと表示します。
// べちゃっとした感じに
scatter_cream(){
string texture = "pie-puff";//テクスチャ名
llParticleSystem(
[PSYS_PART_FLAGS , ( 0 |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_INTERP_COLOR_MASK |
PSYS_PART_INTERP_SCALE_MASK
)
,PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE
,PSYS_PART_START_ALPHA, 1.0
,PSYS_PART_END_ALPHA, 1.0
,PSYS_PART_START_COLOR, <1,1,1>//色
,PSYS_PART_END_COLOR, <1,1,1>//色
,PSYS_PART_START_SCALE, <0.4,0.4,0.4>//大きさ 最大4x4x4
,PSYS_PART_END_SCALE, <0.7,0.7,0.7>//大きさ 最大4x4x4
,PSYS_SRC_MAX_AGE, 0.5
,PSYS_PART_MAX_AGE, 3.0
,PSYS_SRC_ACCEL, <0.0, 0.0, 0.0>
,PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>
,PSYS_SRC_ANGLE_BEGIN, PI
,PSYS_SRC_ANGLE_END, 0*DEG_TO_RAD
,PSYS_SRC_BURST_PART_COUNT, 1
,PSYS_SRC_BURST_RATE, 1.0
,PSYS_SRC_BURST_SPEED_MIN, 0.0
,PSYS_SRC_BURST_SPEED_MAX, 0.0
,PSYS_SRC_TEXTURE,texture
]);
}
default
{
state_entry()
{
float force = llVecMag(llGetAccel());
if(630 < force){
llPlaySound("Rico02SL",1);
} else {
llPlaySound("ZipIn+",1);
}
}
on_rez(integer param){
llResetScript();
}
collision_start(integer col_num)
{
//まず一度非物理にして勢いをなくして、もう1度物理にします
llSetStatus(STATUS_PHYSICS,FALSE);
//衝突した時にavatarかobjectか判別します。
//今回は地面との衝突は判定しません
if(llDetectedType(0) & PASSIVE){
//止まってるモノに当たった場合
//べちょ
put_cream();
llPlaySound("ZipFart",1);
} else {
//人、動いてるモノ、動きそうなモノに当たった場合
//べちょ
scatter_cream();
llPlaySound("ZipFart",1);
}
//重力にまかせて落っこちます
llSetStatus(STATUS_PHYSICS,TRUE);
//script自体を停止させます
llSetScriptState("collision script",FALSE);
}
}
ここまで