2009年01月14日
飛行制限 スクリプト
今日は
飛行制限を解除するアイテムを作ろうとおもうのですが
それを実現するスクリプトを教えてくださいm(_ _)m
もしくはそれがのってるサイトでもかまいません
よろしくおねがいします
飛行制限を解除するアイテムを作ろうとおもうのですが
それを実現するスクリプトを教えてくださいm(_ _)m
もしくはそれがのってるサイトでもかまいません
よろしくおねがいします
テクスチェンジのHUDについて
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
float last_alt;
float last_time;
float last_move;
float boost;
integer controls;
float MIN_SPEED = 2.0;
float WANT_SPEED = 20.0;
float MAX_SPEED = 25.0;
float MIN_TIME = 1.0;
float DEFAULT_BOOST = 0.5;
float FAST_TICK = 0.1;
float SLOW_TICK = 1.0;
float LONG_TIME = 5.0;
float MIN_BOOST_HEIGHT = 72.0;
float MIN_BOOST_CLEARANCE = 36.0;
integer flying = -1;
integer falling = -1;
integer hovering = -1;
integer dimmed = -1;
integer STATE = 0;
set_hover(integer active)
{
if(active == hovering) return;
hovering = active;
if(hovering)
llSetForce(<0,0,9.8> * llGetMass(), FALSE);
else
llSetForce(<0,0,0>, FALSE);
}
float last_tick = -1;
set_tick(float tick)
{
if(tick == last_tick) return;
last_tick = tick;
llSetTimerEvent(tick);
}
float last_boost_height;
float average_boost;
check_boost()
{
flying = 1;
falling = 0;
integer info = llGetAgentInfo(llGetOwner());
if((info & AGENT_FLYING) == 0)
{
set_hover(FALSE);
falling = (info & AGENT_IN_AIR) != 0;
flying = 0;
boost = 0;
set_tick(SLOW_TICK);
return;
}
vector pos = llGetPos();
if(pos.z < last_boost_height / 2)
average_boost = average_boost * (pos.z / last_boost_height)
+ DEFAULT_BOOST * (1.0 - pos.z / last_boost_height);
if(pos.z < MIN_BOOST_HEIGHT || pos.z - llGround(<0,0,0>) < MIN_BOOST_CLEARANCE)
{
set_hover(FALSE);
set_tick(SLOW_TICK);
boost = 0;
return;
}
set_hover(TRUE);
if(controls <= 0) return;
vector vel = llGetVel();
float time = llGetTime();
float speed = vel.z;
float target = WANT_SPEED;
float window = WANT_SPEED / 20;
if(speed > 0)
last_move = time;
if(time - last_time >= LONG_TIME)
boost = 0;
else
{
if(speed < target - window)
{
if(boost == 0)
boost = average_boost;
if(time - last_move > MIN_TIME) boost += 0.4;
else if(speed < target * 0.25) boost += 0.2;
else if(speed < target * 0.5 ) boost += 0.1;
else if(speed < target * 0.75) boost += 0.05;
else if(speed < target - window * 4) boost += 0.02;
else boost += 0.01;
}
else if(speed > MAX_SPEED) boost -= 0.5;
else if(speed > target + window * 4) boost -= 0.1;
else if(speed > target + window * 2) boost -= 0.03;
else if(speed > target + window) boost -= 0.01;
if(boost <= 0)
boost = 0;
if(boost > 0) {
llApplyImpulse(<0,0,boost> * llGetMass(), FALSE);
average_boost = average_boost * 0.9 + boost * 0.1;
last_boost_height = pos.z;
}
}
if(boost) set_tick(FAST_TICK);
else set_tick(SLOW_TICK);
last_alt = pos.z;
last_time = time;
}
take_controls()
{
llTakeControls(CONTROL_UP|CONTROL_DOWN,TRUE,TRUE);
}
request_perms()
{
if(llGetPermissions() & PERMISSION_TAKE_CONTROLS)
take_controls();
else
llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
}
init()
{
boost = 0;
flying = -1;
falling = -1;
hovering = -1;
dimmed = -1;
set_tick(SLOW_TICK);
if(llGetAttached()) request_perms();
STATE = 0;
llMessageLinked (LINK_ALL_CHILDREN, STATE, "state", NULL_KEY);
}
default
{
state_entry()
{
init();
}
on_rez(integer param)
{
init();
}
run_time_permissions(integer mask)
{
if(mask & PERMISSION_TAKE_CONTROLS) take_controls();
}
control(key id, integer level, integer edge)
{
controls = 0;
if(level & CONTROL_UP) controls++;
if(level & CONTROL_DOWN) controls--;
check_boost();
}
timer()
{
integer newstate = 0;
check_boost();
if (flying)
{
if (boost > 0.0)
newstate = 2;
else
newstate = 1;
}
else
{
newstate = 0;
}
if (STATE != newstate)
{
STATE = newstate;
llMessageLinked (LINK_ALL_CHILDREN, STATE, "state", NULL_KEY);
}
}
}
早速、ためしてみますぅ