///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2011 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
integer failFind = 10;
vector iPos;
integer targetID;
list cmd = [];
 
vector wasCirclePoint(float radius) {
    float x = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2);
    float y = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2);
    if(llPow(x,2) + llPow(y,2) <= llPow(radius,2)) {
        return iPos + <x, y, llFrand(2)>;
    }
    return wasCirclePoint(radius);
}
 
moveTo(vector position) {
    targetID = llTarget(position, .8);
    llLookAt(position, .5, 1);
    float speed = 1+llFrand(10);
    if(llGetAgentInfo(llGetOwner()) & AGENT_WALKING)
        speed = llFrand(1);
    llMoveToTarget(position, 1+llFrand(4));    
}
 
list jumps = [];
// Calculate jump gates
list jumpGates(vector iPos, vector dPos, integer jumpDistance) {
    list gates = [];
    if(jumpDistance == 0) return gates;
    float dist = llVecDist(iPos, dPos);
    if(dist > jumpDistance) {
        iPos = iPos + jumpDistance * (dPos-iPos) / dist;
        gates += iPos;
        return gates + jumpGates(iPos, dPos, jumpDistance);
    }
    return gates + jumpGates(iPos, dPos, --jumpDistance);
}
 
default {
    state_entry() {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llSetStatus(STATUS_BLOCK_GRAB_OBJECT, TRUE);
        llSetStatus(STATUS_ROTATE_X, TRUE);
        llSetStatus(STATUS_ROTATE_Y|STATUS_ROTATE_Z, FALSE);
        llVolumeDetect(TRUE);
        state wander;
    }
    on_rez(integer num) {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llResetScript();
    }
}
 
state wander
{
    state_entry() {
        iPos = llGetPos();
        failFind = 10;
        llSensorRepeat("", llGetOwner(), AGENT, 64.0, TWO_PI, 1);
        llSetStatus(STATUS_PHYSICS, TRUE);
        llSetForce(<0,0,9.81> * llGetMass(), 0);
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        llListen(0, "", llGetOwner(), "");
        llInstantMessage(llGetOwner(), "Roaming freely...");
    }
    sensor(integer num) {
        failFind = 10;
        iPos = llDetectedPos(0);
        moveTo(wasCirclePoint(5));
    }
    listen(integer channel, string name, key id, string message) {
        cmd = llParseString2List(message, [" "], [""]);
        if(llList2String(cmd, 0) != llGetObjectDesc()) return;
        llSensorRemove();
        llStopMoveToTarget();
        llStopLookAt();
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        llSetTimerEvent(0);
        state order;
    }
    no_sensor() {
        --failFind;
        if(failFind >=0) return;
        failFind = 0;
        list odt = llGetObjectDetails(llGetOwner(), [OBJECT_POS]);
        if(odt == []) llDie();
        list pos = llParseString2List(llList2String(odt,0), ["<", ">", ","], [""]);
        iPos.x = llList2Float(pos, 0);
        iPos.y = llList2Float(pos, 1);
        iPos.z = llList2Float(pos, 2);
        llSensorRemove();
        llStopMoveToTarget();
        llStopLookAt();
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        llSetTimerEvent(0);
        state jumpdrive;
    }
    collision_start(integer num) {
        moveTo(wasCirclePoint(5));
    }
    at_target(integer tnum, vector targetpos, vector ourpos) {
        if(tnum != targetID) return;
        integer info = llGetAgentInfo(llGetOwner());
        moveTo(wasCirclePoint(5));
    }
    on_rez(integer num) {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llResetScript();
    }
}
 
state order {
    state_entry() {
        // Match any selected state.
        if(llList2String(cmd,1) == "stay") state stay;
        if(llList2String(cmd,1) == "move") state move;
        if(llList2String(cmd,1) == "free") state wander;
        if(llList2String(cmd,1) == "vanish") llDie();
        // Hook
        llMessageLinked(LINK_THIS, 0, llList2CSV(cmd), NULL_KEY);
        // Alarm
        llSetTimerEvent(1 + (1-llGetRegionTimeDilation()));
        llListen(0, "", llGetOwner(), "");
    }
    link_message(integer sender_num, integer num, string str, key id) {
        if(str == "glow:MAIN:HALT") llSetTimerEvent(0);
        if(str != "glow:MAIN:CONT") return;
        // Any non-matching state makes glow wander.
        if(llList2String(cmd,1)== "stay") state stay;
        if(llList2String(cmd,1) == "move") state move;
        state wander;
    }
    listen(integer channel, string name, key id, string message) {
        cmd = llParseString2List(message, [" "], [""]);
        if(llList2String(cmd, 0) != llGetObjectDesc()) return;
        llMessageLinked(LINK_THIS, 0, "glow:PLUG:HALT", NULL_KEY);
    }
    timer() {
        llSetTimerEvent(0);
        state wander;
    }
    on_rez(integer num) {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llResetScript();
    }
}
 
state move {
    state_entry() {
        llSetStatus(STATUS_PHYSICS, TRUE);
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        llSetTimerEvent(1);
        llListen(0, "", llGetOwner(), "");
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
        llInstantMessage(llGetOwner(), "Guide me...");
    }
    control(key id,integer level,integer edge) {
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        vector impulse = ZERO_VECTOR;
        if (level & CONTROL_UP)
        {
            impulse += <-.1,0,0>;
        }
        if (level & CONTROL_DOWN)
        {
            impulse += <.1,0,0>;
        }
        if (level & CONTROL_FWD)
        {
            impulse += <0,0,.1>;
        }
        if (level & CONTROL_BACK)
        {
            impulse += <0,0,-.1>;
        }
        if (level & CONTROL_ROT_RIGHT)
        {
            llApplyRotationalImpulse(<.01,0,0>, TRUE);
        }
        if (level & CONTROL_ROT_LEFT)
        {
            llApplyRotationalImpulse(<-.01,0,0>, TRUE);
        }
        llApplyImpulse(impulse,TRUE);
    }
    run_time_permissions(integer perm) {
        if (perm & PERMISSION_TAKE_CONTROLS) {
            llTakeControls(
                            CONTROL_FWD |
                            CONTROL_BACK |
                            CONTROL_LEFT |
                            CONTROL_RIGHT |
                            CONTROL_ROT_LEFT |
                            CONTROL_ROT_RIGHT |
                            CONTROL_UP |
                            CONTROL_DOWN,
                            TRUE, FALSE);
        }
    }
    listen(integer channel, string name, key id, string message) {
        cmd = llParseString2List(message, [" "], [""]);
        if(llList2String(cmd, 0) != llGetObjectDesc()) return;
        llReleaseControls();
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        llSetTimerEvent(0);
        state order;
    }
    timer() {
        list odt = llGetObjectDetails(llGetOwner(), [OBJECT_POS]);
        if(odt == []) llDie();
        list pos = llParseString2List(llList2String(odt,0), ["<", ">", ","], [""]);
        iPos.x = llList2Float(pos, 0);
        iPos.y = llList2Float(pos, 1);
        iPos.z = llList2Float(pos, 2);
        if(llVecDist(llGetPos(), iPos) < 10) return;
        llReleaseControls();
        llSetVelocity(<0,0,0>, TRUE);
        llSetAngularVelocity(<0,0,0>, TRUE);
        llSetStatus(STATUS_PHYSICS, FALSE);
        llSetTimerEvent(0);
        state wander;
    }
    on_rez(integer num) {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llResetScript();
    }
}
 
state stay {
    state_entry() {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llSetTimerEvent(1);
        llListen(0, "", llGetOwner(), "");
        llInstantMessage(llGetOwner(), "Staying...");
    }
    listen(integer channel, string name, key id, string message) {
        cmd = llParseString2List(message, [" "], [""]);
        if(llList2String(cmd, 0) != llGetObjectDesc()) return;
        llSetTimerEvent(0);
        state order;
    }
    timer() {
        list odt = llGetObjectDetails(llGetOwner(), [OBJECT_POS]);
        if(odt == []) llDie();
        list pos = llParseString2List(llList2String(odt,0), ["<", ">", ","], [""]);
        iPos.x = llList2Float(pos, 0);
        iPos.y = llList2Float(pos, 1);
        iPos.z = llList2Float(pos, 2);
        if(llVecDist(llGetPos(), iPos) < 10) return;
        llSetTimerEvent(0);
        state wander;
    }
    on_rez(integer num) {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llResetScript();
    }
}
 
state jumpdrive
{
    state_entry() {
 
        llSetStatus(STATUS_PHYSICS, FALSE);
        // Calculate list of intermediary jump gates.
        jumps = jumpGates(llGetPos(), iPos, 10);
        llSetTimerEvent(1.175494351E-38);
        llInstantMessage(llGetOwner(), "Juuuuuuuuuuuump!"); 
    }
    timer() {
        if(llGetListLength(jumps) == 0) {
            llSetTimerEvent(0);
            state wander;
        }
        vector nPos = llList2Vector(jumps, 0);
        jumps = llDeleteSubList(jumps, 0, 0);
        llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, nPos]);
    }
    on_rez(integer num) {
        llSetStatus(STATUS_PHYSICS, FALSE);
        llResetScript();
    }
}

secondlife/glow/core/main.txt ยท Last modified: 2022/11/24 07:45 by 127.0.0.1

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.