Zepp Zaftig
Unregistered Abuser
Join date: 20 Mar 2005
Posts: 470
|
01-28-2006 14:49
This is a script for moving while sitting on an object, it can be used for things like walking upside down, on or through walls, or other stuff that requires control over the avatar's rotation and position(with a few modifications). Usage: To use it rez a cylinder or something and put the script inside. By default it's using built-in SL animations. To rotate it to walk at funny angles, just click it, this can be disabled in the settings. Settings: To use other animations, put them inside the object together with the script, and type in their names in the settings section in the script. Example configuration: If you want to run at 5 times the default speed instead of flying when you are in the air, you can change FLYANIM to a running animation and FLYSPEED to 5. Use on prim ground, floors etc. is not currently supported. //Copyright 2006 Zepp Zaftig - GNU Lesser General Public License http://www.gnu.org/copyleft/lesser.html //This script or any modified versions of it may not be distributed without source code.
//Settings //Edit these to configure the script string WALKANIM = "female_walk"; //Name of the walk animation to use string FLYANIM = "fly"; //Flying animation string HOVERANIM = "hover"; //Hover animation string UPANIM = "hover_up"; //Flying up animation string DOWNANIM = "hover_down"; //Flying down animation integer WALKSPEED = 1; //Change to an integer higher than 1 to walk faster integer FLYSPEED = 10; //How many times faster the flying speed should be compared to default speed integer PHANTOM = TRUE; //Set to TRUE for walking through solid objects, FALSE to disable integer TOUCHABLE = TRUE; //Rotate 90 degrees on touch when set to TRUE //End settings
float zoffset; integer flying = FALSE;
default { state_entry() { llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE); llCollisionFilter(llKey2Name(llGetOwner()), llGetOwner(), FALSE); vector avatarsize = llGetAgentSize(llGetOwner()); zoffset = avatarsize.z / 1.3; llSitTarget(<0, 0, -0.5>, ZERO_ROTATION); llCollisionSound("", 0); }
changed(integer change) { if(change & CHANGED_LINK) { key agent = llAvatarOnSitTarget(); if(agent) { if(agent != llGetOwner()) { llUnSit(agent); } else { llSetAlpha(0, ALL_SIDES); llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS); } } else { llSetAlpha(1, ALL_SIDES); llSetStatus(STATUS_PHYSICS, FALSE); llReleaseControls(); llResetScript(); } } }
run_time_permissions(integer perm) { if(perm) { llStopAnimation("sit"); llStartAnimation("stand"); llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_UP | CONTROL_DOWN | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE); } } control(key id, integer level, integer edge) { //Any button pressed if(edge & level) { llSetStatus(STATUS_PHYSICS, TRUE); llStopAnimation(HOVERANIM); } //Forward or backwards pressed if(edge & level & (CONTROL_FWD|CONTROL_BACK)) { if(flying == TRUE) { llStartAnimation(FLYANIM); } else { llStartAnimation(WALKANIM); //Start the walk animation } } //All buttons released if((~level & CONTROL_FWD) && (~level & CONTROL_BACK) && (~level & CONTROL_RIGHT) && (~level & CONTROL_LEFT) && (~level & CONTROL_ROT_RIGHT) && (~level & CONTROL_ROT_LEFT) && (~level & CONTROL_UP) && (~level & CONTROL_DOWN) ) { llTargetOmega(<0,0,0>, 0, 1); llSetStatus(STATUS_PHYSICS, FALSE); llSetPos(llGetPos()); //Workaround for weird prim movement behavior llSetRot(llGetRot()); llStopAnimation(WALKANIM); llStopAnimation(UPANIM); llStopAnimation(DOWNANIM); llStopAnimation(FLYANIM); if(flying == TRUE) { llStartAnimation(HOVERANIM); } else { llStartAnimation("stand"); } } //Turning key released if((~level & edge & CONTROL_RIGHT) || (~level & edge & CONTROL_LEFT) || (~level & edge & CONTROL_ROT_RIGHT) || (~level & edge & CONTROL_ROT_LEFT)) { llTargetOmega(<0,0,1>, 0, 1); llTargetOmega(<0,0,-1>, 0, 1); } //Turn right if(level & edge & (CONTROL_RIGHT|CONTROL_ROT_RIGHT)) { llTargetOmega(<0,0,-1>, PI / 3.5, 1); //Turn left } else if(level & edge & (CONTROL_LEFT|CONTROL_ROT_LEFT)) { llTargetOmega(<0,0,1>, PI / 3.5, 1); } //Forward if(level & CONTROL_FWD) { vector pos; if(flying == FALSE) { pos = llGetPos() + WALKSPEED*llRot2Fwd(llGetRot()); pos.z = zoffset + llGround(ZERO_VECTOR); } else { pos = llGetPos() + FLYSPEED*llRot2Fwd(llGetRot()); } llMoveToTarget(pos, 0.1); //Backwards } else if(level & CONTROL_BACK) { vector pos; if(flying == FALSE) { pos = llGetPos() - WALKSPEED*llRot2Fwd(llGetRot()); pos.z = zoffset + llGround(ZERO_VECTOR); } else { pos = llGetPos() - FLYSPEED*llRot2Fwd(llGetRot()); } llMoveToTarget(pos, 0.1); } //Flying if(level & CONTROL_UP) { flying = TRUE; llStartAnimation(UPANIM); llMoveToTarget(llGetPos() + <0,0,3.5>, 0.1); } else if(level & CONTROL_DOWN) { llStartAnimation(DOWNANIM); vector pos = llGetPos(); if( (pos.z - llGround(ZERO_VECTOR)) < 2.5 ) { flying = FALSE; } llMoveToTarget(llGetPos() - <0,0,3.5>, 0.1); } } //Move through solid objects collision(integer det_num) { if(PHANTOM == TRUE) { llSetStatus(STATUS_PHYSICS, FALSE); llSetPos(llGetPos() + llRot2Fwd(llGetRot())); llSetStatus(STATUS_PHYSICS, TRUE); } } touch_start(integer det_num) { if(TOUCHABLE == TRUE) { llSetRot(llGetRot() * llEuler2Rot(<90*DEG_TO_RAD,0,0>)); } } }
|
Nada Epoch
The Librarian
Join date: 4 Nov 2002
Posts: 1,423
|
Original Thread
02-02-2006 15:03
_____________________
i've got nothing. 
|
Simmy Amos
Registered User
Join date: 27 May 2005
Posts: 22
|
02-26-2006 00:15
Nice script zepp,
|
Ryoku Itoku
Registered User
Join date: 19 Jan 2006
Posts: 59
|
08-11-2007 20:00
wow this seems to be the best solution to a problem i'm having short of animating it myself, though it isnt nearly as stable as the normal movement and I keep veering to the left for some reason... I've been slightly confused ^^;
|
Clintok Meyer
Registered User
Join date: 28 Apr 2006
Posts: 17
|
10-30-2007 20:42
Hi, The script below when put into a prim, sat on, and after pressing the forward arrow key, does not make me move. Am I incorrect that I should be able to walk by pushing forward after sitting on a prim with this code in it? Thank you From: Zepp Zaftig This is a script for moving while sitting on an object, it can be used for things like walking upside down, on or through walls, or other stuff that requires control over the avatar's rotation and position(with a few modifications). Usage: To use it rez a cylinder or something and put the script inside. By default it's using built-in SL animations. To rotate it to walk at funny angles, just click it, this can be disabled in the settings. Settings: To use other animations, put them inside the object together with the script, and type in their names in the settings section in the script. Example configuration: If you want to run at 5 times the default speed instead of flying when you are in the air, you can change FLYANIM to a running animation and FLYSPEED to 5. Use on prim ground, floors etc. is not currently supported. //Copyright 2006 Zepp Zaftig - GNU Lesser General Public License http://www.gnu.org/copyleft/lesser.html //This script or any modified versions of it may not be distributed without source code.
//Settings //Edit these to configure the script string WALKANIM = "female_walk"; //Name of the walk animation to use string FLYANIM = "fly"; //Flying animation string HOVERANIM = "hover"; //Hover animation string UPANIM = "hover_up"; //Flying up animation string DOWNANIM = "hover_down"; //Flying down animation integer WALKSPEED = 1; //Change to an integer higher than 1 to walk faster integer FLYSPEED = 10; //How many times faster the flying speed should be compared to default speed integer PHANTOM = TRUE; //Set to TRUE for walking through solid objects, FALSE to disable integer TOUCHABLE = TRUE; //Rotate 90 degrees on touch when set to TRUE //End settings
float zoffset; integer flying = FALSE;
default { state_entry() { llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE); llCollisionFilter(llKey2Name(llGetOwner()), llGetOwner(), FALSE); vector avatarsize = llGetAgentSize(llGetOwner()); zoffset = avatarsize.z / 1.3; llSitTarget(<0, 0, -0.5>, ZERO_ROTATION); llCollisionSound("", 0); }
changed(integer change) { if(change & CHANGED_LINK) { key agent = llAvatarOnSitTarget(); if(agent) { if(agent != llGetOwner()) { llUnSit(agent); } else { llSetAlpha(0, ALL_SIDES); llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS); } } else { llSetAlpha(1, ALL_SIDES); llSetStatus(STATUS_PHYSICS, FALSE); llReleaseControls(); llResetScript(); } } }
run_time_permissions(integer perm) { if(perm) { llStopAnimation("sit"); llStartAnimation("stand"); llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_UP | CONTROL_DOWN | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE); } } control(key id, integer level, integer edge) { //Any button pressed if(edge & level) { llSetStatus(STATUS_PHYSICS, TRUE); llStopAnimation(HOVERANIM); } //Forward or backwards pressed if(edge & level & (CONTROL_FWD|CONTROL_BACK)) { if(flying == TRUE) { llStartAnimation(FLYANIM); } else { llStartAnimation(WALKANIM); //Start the walk animation } } //All buttons released if((~level & CONTROL_FWD) && (~level & CONTROL_BACK) && (~level & CONTROL_RIGHT) && (~level & CONTROL_LEFT) && (~level & CONTROL_ROT_RIGHT) && (~level & CONTROL_ROT_LEFT) && (~level & CONTROL_UP) && (~level & CONTROL_DOWN) ) { llTargetOmega(<0,0,0>, 0, 1); llSetStatus(STATUS_PHYSICS, FALSE); llSetPos(llGetPos()); //Workaround for weird prim movement behavior llSetRot(llGetRot()); llStopAnimation(WALKANIM); llStopAnimation(UPANIM); llStopAnimation(DOWNANIM); llStopAnimation(FLYANIM); if(flying == TRUE) { llStartAnimation(HOVERANIM); } else { llStartAnimation("stand"); } } //Turning key released if((~level & edge & CONTROL_RIGHT) || (~level & edge & CONTROL_LEFT) || (~level & edge & CONTROL_ROT_RIGHT) || (~level & edge & CONTROL_ROT_LEFT)) { llTargetOmega(<0,0,1>, 0, 1); llTargetOmega(<0,0,-1>, 0, 1); } //Turn right if(level & edge & (CONTROL_RIGHT|CONTROL_ROT_RIGHT)) { llTargetOmega(<0,0,-1>, PI / 3.5, 1); //Turn left } else if(level & edge & (CONTROL_LEFT|CONTROL_ROT_LEFT)) { llTargetOmega(<0,0,1>, PI / 3.5, 1); } //Forward if(level & CONTROL_FWD) { vector pos; if(flying == FALSE) { pos = llGetPos() + WALKSPEED*llRot2Fwd(llGetRot()); pos.z = zoffset + llGround(ZERO_VECTOR); } else { pos = llGetPos() + FLYSPEED*llRot2Fwd(llGetRot()); } llMoveToTarget(pos, 0.1); //Backwards } else if(level & CONTROL_BACK) { vector pos; if(flying == FALSE) { pos = llGetPos() - WALKSPEED*llRot2Fwd(llGetRot()); pos.z = zoffset + llGround(ZERO_VECTOR); } else { pos = llGetPos() - FLYSPEED*llRot2Fwd(llGetRot()); } llMoveToTarget(pos, 0.1); } //Flying if(level & CONTROL_UP) { flying = TRUE; llStartAnimation(UPANIM); llMoveToTarget(llGetPos() + <0,0,3.5>, 0.1); } else if(level & CONTROL_DOWN) { llStartAnimation(DOWNANIM); vector pos = llGetPos(); if( (pos.z - llGround(ZERO_VECTOR)) < 2.5 ) { flying = FALSE; } llMoveToTarget(llGetPos() - <0,0,3.5>, 0.1); } } //Move through solid objects collision(integer det_num) { if(PHANTOM == TRUE) { llSetStatus(STATUS_PHYSICS, FALSE); llSetPos(llGetPos() + llRot2Fwd(llGetRot())); llSetStatus(STATUS_PHYSICS, TRUE); } } touch_start(integer det_num) { if(TOUCHABLE == TRUE) { llSetRot(llGetRot() * llEuler2Rot(<90*DEG_TO_RAD,0,0>)); } } }
|