2009年01月14日

飛行制限 スクリプト

今日は

飛行制限を解除するアイテムを作ろうとおもうのですが
それを実現するスクリプトを教えてくださいm(_ _)m
もしくはそれがのってるサイトでもかまいません
よろしくおねがいします



同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジのHUDについて (2015-07-01 04:51)
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)

Posted by Philotes  at 15:26 │Comments(2)スクリプト関連

この記事へのコメント
所持しているフルパの飛行アイテムに使用されていたスクリプト



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);
}
}
}
Posted by ドン・フライ at 2009年01月14日 18:19
レスありがとうございます
早速、ためしてみますぅ
Posted by Philotes at 2009年01月14日 18:57
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。