Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

AO with no listen/owneronly

Thili Playfair
Registered User
Join date: 18 Aug 2004
Posts: 2,417
10-27-2005 21:35
Ok i have no idea how to do this , but do anyone want to make the flipmod script out there to touch to enable/disable , with the current Hud we could easy make the AO listen thing of the past by now, and make it touch like a button instead,

<.< i cant script but id really like it if someone would help make this, i already made a hud button to show if AO is on/off, small texture set on a prim that you can move around.

Since now we can use hud, id love to see more and more things we use end up on that instead of avatar so anyone can click it :p

Tried to replace the listeners with - touch_start(integer total_number) , but the
if( _message == "ao on" ) {
else if ( _message == "ao off" ) {

is where i totally fail eh, script is something i dont touch much :/

(cant stand open commands <.<;)
Seagel Neville
Far East User
Join date: 2 Jan 2005
Posts: 1,476
10-28-2005 04:46
What about setting a toggle switch? For example
CODE
integer AO_ON_SWITCH = FALSE;

default
{
touch_start(integer total_number)
{
if(AO_ON_SWITCH == FALSE)
{
//AO ON Command
AO_ON_SWITCH = TRUE;
}
else if(AO_ON_SWITCH == TRUE)
{
//AO OFF Command
AO_ON_SWITCH = FALSE;
}
}
}
_____________________
:) Seagel Neville :)
Ben Bacon
Registered User
Join date: 14 Jul 2005
Posts: 809
10-28-2005 05:29
as a base:
CODE
default
{
touch_start(integer total_number)
{
state active;
}
}

state active
{
touch_start(integer total_number)
{
state default;
}

//all the AO code goes in here
}
but ideally we would need to see what your existing code has in the if (_message.... bits, and what its state_entry function looks like to see what it needs to do to start up - and how to cleanly stop it.
Thili Playfair
Registered User
Join date: 18 Aug 2004
Posts: 2,417
10-28-2005 09:19
This is the ao i been using awhile, since it was free and i like to see scripts , eh quite long isnt it :p



CODE
// Francis wuz here
//
// modded by FliperPA to cut down on lag by 1000% without cutting much performance
// also set to listen on alternate channel to stop server parsing everything wearer says in chat
// GREAT WORK FRANCIS! :-)
//
// MOD THE NEXT LINE TO CHOOSE WHICH CHANNEL TO RUN ON
integer LISTEN_CHANNEL = 63;
// Default notecard we read on script_entry
string defaultNoteCard = "anims";
//
// Don't ask me for tech support. I won't give it.
// Copyright (C) 2004 Francis Chung
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 U
// List of all the animation states
list animState = ["Sitting on Ground", "Sitting", "Striding", "Crouching", "CrouchWalking",
"Soft Landing", "Standing Up", "Falling Down", "Hovering Down", "Hovering Up",
"FlyingSlow", "Flying", "Hovering", "Jumping", "PreJumping", "Running",
"Turning Right", "Turning Left", "Walking", "Landing", "Standing" ];

// Index of interesting animations
integer standIndex = 20;
integer sittingIndex = 1;
integer sitgroundIndex = 0;
integer hoverIndex = 12;
integer flyingIndex = 11;
integer flyingslowIndex = 10;
integer hoverupIndex = 9;
integer hoverdownIndex = 8;
integer waterTreadIndex = 25;
integer swimmingIndex = 26;
integer swimupIndex = 27;
integer swimdownIndex = 28;
integer standingupIndex = 6;
// list of animations that have a different value when underwater
list underwaterAnim = [ hoverIndex, flyingIndex, flyingslowIndex, hoverupIndex, hoverdownIndex ];
// corresponding list of animations that we override the overrider with when underwater
list underwaterOverride = [ waterTreadIndex, swimmingIndex, swimmingIndex, swimupIndex, swimdownIndex];
// list of animation states that we need to stop the default animations for
list stopAnimState = [ "Sitting", "Sitting on Ground" ];
// corresponding list of animations to stop when entering that state
list stopAnimName = [ "sit", "sit_ground" ];
// Lines in the notecards where to grab animation names
// This list is indexed the same as list overrides
list lineNums = [ 45, // 0 Sitting on Ground
33, // 1 Sitting
1, // 2 Striding
17, // 3 Crouching
5, // 4 CrouchWalking
39, // 5 Soft Landing
41, // 6 Standing Up
37, // 7 Falling Down
19, // 8 Hovering Down
15, // 9 Hovering Up
43, // 10 FlyingSlow
7, // 11 Flying
31, // 12 Hovering
13, // 13 Jumping
35, // 14 PreJumping
3, // 15 Running
11, // 16 Turning Right
9, // 17 Turning Left
1, // 18 Walking
39, // 19 Landing
21, // 20 Standing 1
23, // 21 Standing 2
25, // 22 Standing 3
27, // 23 Standing 4
29, // 24 Standing 5
47, // 25 Treading Water
49, // 26 Swimming
51, // 27 Swim up
43 // 28 Swim Down
];
// This is an ugly hack, because the standing up animation doesn't work quite right
// (SL is borked, this has been bug reported)
// If you play a pose overtop the standing up animation, your avatar tends to get
// stuck in place.
// This is a list of anims that we'll stop automatically
list autoStop = [ 5, 6, 19 ];
// Amount of time we'll wait before autostopping the animation
float autoStopTime = 1.5;
// List of stands
list standIndexes = [ 20, 21, 22, 23, 24 ];
// How long before flipping stand animations
float standTime = 40.0;
// How fast we should poll for changed anims, changed by FlipperPA to cut lag
// Changed from 0.001 to 0.25
// running at 0.001 doesn't have much benefit; it causes the server to process 1000 times a second
// 0.25 causes server to process only 4 times a second, which in a streaming environment
// should be just fine, with almost no affect noticed by the end user. The cost to the server versus
// benefit to the user is a good chance, IMHO. :-)
float timerEventLength = 0.25;
// Send a message if we encounter a state we've never seen before
integer DEBUG = TRUE;
// GLOBALS
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
list stands = [ "", "", "", "", "" ]; // List of stand animations
integer curStandIndex = 0; // Current stand we're on (indexed [0, numStands])
string curStandAnim = ""; // Current Stand animation
integer numStands; // # of stand anims we use (constant: ListLength(stands))
integer curStandAnimIndex = 0; // Current stand we're on (indexed [0, numOverrides] )
list overrides = []; // List of animations we override
list notecardLineKey = []; // notecard reading keys
integer notecardLinesRead; // number of notecard lines read
integer numOverrides; // # of overrides (a constant - llGetListLength(lineNums))
string lastAnim = ""; // last Animation we ever played
integer lastAnimIndex = 0; // index of the last animation we ever played
string lastAnimState = ""; // last thing llGetAnimation() returned

integer animOverrideOn = TRUE; // Is the animation override on?
integer gotPermission = FALSE; // Do we have animation permissions?
integer listenHandler0; // Listen handlers
// CODE
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
list listReplace ( list _source, list _newEntry, integer _index ) {
return llListInsertList( llDeleteSubList(_source,_index,_index), _newEntry, _index );
}
startNewAnimation( string _anim, integer _animIndex, string _state ) {
if ( _anim != lastAnim ) {
if ( _anim != "" ) { // Time to play a new animation
llStartAnimation( _anim );

if ( _state != lastAnimState && llListFindList(stopAnimName, [_state]) != -1 ) {
// Stop the default sit/sit ground animation
llStopAnimation( llList2String(stopAnimName, llListFindList(stopAnimName, [_state])) );
}
else if ( llListFindList( autoStop, [_animIndex] ) != -1 ) {
// This is an ugly hack, because the standing up animation doesn't work quite right
// (SL is borked, this has been bug reported)
// If you play a pose overtop the standing up animation, your avatar tends to get
// stuck in place.
if ( lastAnim != "" ) {
llStopAnimation( lastAnim );
lastAnim = "";
}
llSleep( autoStopTime );
llStopAnimation( _anim );
}
}
if ( lastAnim != "" )
llStopAnimation( lastAnim );
lastAnim = _anim;
}
lastAnimIndex = _animIndex;
lastAnimState = _state;
}
// Load all the animation names from a notecard
loadNoteCard( string _notecard ) {
integer i;

if ( llGetInventoryKey(_notecard) == NULL_KEY ) {
llSay( 0, "Notecard '" + _notecard + "' does not exist." );
return;
}
llInstantMessage( llGetOwner(), "Loading notecard '" + _notecard + "'..." );
// Start reading the data
notecardLinesRead = 0;
notecardLineKey = [];
for ( i=0; i<numOverrides; i++ )
notecardLineKey += [ llGetNotecardLine( _notecard, llList2Integer(lineNums,i) ) ];
}
// Figure out what animation we should be playing right now
animOverride() {
string curAnimState = llGetAnimation(llGetOwner());
integer curAnimIndex = llListFindList( animState, [curAnimState] );
integer underwaterAnimIndex = llListFindList( underwaterAnim, [curAnimIndex] );
vector curPos = llGetPos();
if ( curAnimState == lastAnimState ) {
// Do nothing
// This conditional not absolutely necessary (In fact it's better if it's not here)
// But it's good for increasing performance.
} else if ( curAnimIndex == -1 ) {
if ( DEBUG )
llInstantMessage( llGetOwner(), "Unknown animation state '" + curAnimState + "'" );
}
else if ( curAnimIndex == standIndex ) {
startNewAnimation( curStandAnim, curStandAnimIndex, curAnimState );
}
else {
if ( underwaterAnimIndex != -1 && llWater(ZERO_VECTOR) > curPos.z )
curAnimIndex = llList2Integer( underwaterOverride, underwaterAnimIndex );
startNewAnimation( llList2String(overrides,curAnimIndex), curAnimIndex, curAnimState );
}
}
// Initialize listeners, and reset some status variables
initialize() {
if ( animOverrideOn )
llSetTimerEvent( timerEventLength );
else
llSetTimerEvent( 0 );
lastAnim = "";
lastAnimIndex = -1;
lastAnimState = "";
gotPermission = FALSE;
if ( listenHandler0 )
llListenRemove( listenHandler0 );
listenHandler0 = llListen( LISTEN_CHANNEL, "", llGetOwner(), "" );
}
// STATE
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
default {
state_entry() {
integer i;

if ( llGetAttached() )
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION|PERMISSION_TAKE_CONTROLS);

// Initialize!
numStands = llGetListLength( stands );
numOverrides = llGetListLength(lineNums);
curStandAnimIndex = llList2Integer(standIndexes,curStandIndex);
// populate override list with blanks
for ( i=0; i<numOverrides; i++ ) {
overrides += [ "" ];
}
initialize();
loadNoteCard( defaultNoteCard );
llResetTime();
}

run_time_permissions(integer parm) {
if( parm == (PERMISSION_TRIGGER_ANIMATION|PERMISSION_TAKE_CONTROLS) ) {
llTakeControls( CONTROL_DOWN|CONTROL_UP|CONTROL_FWD|CONTROL_BACK|CONTROL_LEFT|CONTROL_RIGHT
|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT, TRUE, TRUE);
gotPermission = TRUE;
}
}

attach( key k ) {
if ( k != NULL_KEY )
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION|PERMISSION_TAKE_CONTROLS);
}

listen(integer _channel, string _name, key _id,string _message) {
if( _message == "ao on" ) {
llSetTexture("aon", ALL_SIDES);
llSetTimerEvent( timerEventLength );
animOverrideOn = TRUE;
if ( gotPermission )
animOverride();
llInstantMessage( llGetOwner(), "Franimation override on." );
}
else if ( _message == "ao off" ) {
llSetTexture("aoff", ALL_SIDES);
llSetTimerEvent( 0 );
animOverrideOn = FALSE;
startNewAnimation( "", -1, lastAnimState );
llInstantMessage( llGetOwner(), "Franimation override off." );
}
else if ( _message == "ao hide" ) {
llSetLinkAlpha( LINK_SET, 0, ALL_SIDES );
llInstantMessage( llGetOwner(), "Franimation override set invisible." );
}
else if ( _message == "ao show" ) {
llSetLinkAlpha( LINK_SET, 1, ALL_SIDES );
llInstantMessage( llGetOwner(), "Franimation override set visible." );
}
else if ( _message == "ao reset" ) {
llResetScript();
}
}

dataserver(key _query_id, string _data) {
integer index = llListFindList( notecardLineKey, [_query_id] );
if ( _data != EOF && index != -1 ) { // not at the end of the notecard and not random crap
if ( index == curStandAnimIndex ) // Pull in the current stand animation
curStandAnim = _data;
if ( index == lastAnimIndex ) // Whoops, we're replacing the currently playing anim
startNewAnimation( _data, lastAnimIndex, lastAnimState ); // Better play the new one :)
// Store the name of the new animation
overrides = listReplace( overrides, [_data], index );

// See if we're done loading the notecard. Users like status messages.
if ( ++notecardLinesRead == numOverrides )
llInstantMessage( llGetOwner(), "Finished reading notecard. (" +
(string) llGetFreeMemory() + " bytes free)" );
}
}

on_rez( integer _code ) {
initialize();
}
touch_start(integer _total_number) {
}

control( key _id, integer _level, integer _edge ) {
if ( animOverrideOn && gotPermission )
animOverride();
}

timer() {
if ( animOverrideOn && gotPermission ) {
animOverride();
if ( llGetTime() > standTime ) {
curStandIndex = (curStandIndex+1) % numStands;
curStandAnimIndex = llList2Integer(standIndexes,curStandIndex);
curStandAnim = llList2String(overrides, curStandAnimIndex);
if ( lastAnimState == "Standing" )
startNewAnimation( curStandAnim, curStandAnimIndex, lastAnimState );
llResetTime();
}
}
}
}