|
Bonjour
Il manques
default
{
state_entry()
{
llCollisionSound("", 0.0);
}
}
4 Scripts pour 4 Niveau
integer floor = 1; //Etages 1 2 ou 3 ou 4
default
{
state_entry()
{
}
touch_start(integer total_number)
{
llWhisper(0, "going to #" + (string)floor);
llMessageLinked(LINK_SET, -1, "goto floor " + (string)floor, NULL_KEY);
}
}
integer floor = 2; //Etages 1 2 ou 3 ou 4
default
{
state_entry()
{
}
touch_start(integer total_number)
{
llWhisper(0, "going to #" + (string)floor);
llMessageLinked(LINK_SET, -1, "goto floor " + (string)floor, NULL_KEY);
}
}
integer floor = 3; //Etages 1 2 ou 3 ou 4
default
{
state_entry()
{
}
touch_start(integer total_number)
{
llWhisper(0, "going to #" + (string)floor);
llMessageLinked(LINK_SET, -1, "goto floor " + (string)floor, NULL_KEY);
}
}
integer floor = 4; //Etages 1 2 ou 3 ou 4
default
{
state_entry()
{
}
touch_start(integer total_number)
{
llWhisper(0, "going to #" + (string)floor);
llMessageLinked(LINK_SET, -1, "goto floor " + (string)floor, NULL_KEY);
}
}
et une notes
Etape1:
--------
Tout d'abord creer un prim de n'importe quelle forme qui vous servira d'ascenseur.
Ce prim servira de monter l'individu (genre de monte charge)
Etape2:
--------
Inserez les scripts " Script ascenseur" , "Script reseau" ou le Script "Pas de son "si vous ne voulez pas de son.
Inserez aussi le son "ElevatorNoises"
Etape3:
--------
Ouvrez le script "Script ascenseur" pour le configurer , le reste des explications concernant cette configuration se trouve dans le script !
Etape4:
--------
Creez ici les boutons pour commander les ascenseurs vers le niveau ou vous voulez aller , ce prim peut etre dans la forme que vous souhaitez.
Etape5:
--------
Dans chaque bouton creer inserez un des quatre scripts selon le nombre de niveau que vous souhaitez
Etape6:
Vous pouvez creer ici les contours de l ascenseur (la cage)
Recommandations
*****************************************
Si votre cage d'ascenseur touche votre prim "monte charge" (Etape1) , mettez alors cette cage en fantome (ou phantom)
car le prim cree dans l'etape1 pour elever des avatars va se mettre en mode physic !
Meme procedure si vous mettez les bouton (commande de niveau) dans la cage !
Si il y a interaction entre le prim qui va monter et le reste de votre construction celui ci ne montera pas et restera bloquer car il est physique (physic) !!
De meme si le prim touche le sol !
Script ascenseur
vector alignment;
vector targetVector;
integer travelDistance;
integer numListen;
integer targetFloor = -1;
list floorHeights = [601.402, 610.067, 618.488, 626.888, 635.208];
float fixedFloorHeight = -1;
float speed = 1.00;
float maxSpeed = 30;
float precision = 0.1;
integer autoSpeed = TRUE;
integer initialDistance;
integer counter = 0;
elevate (vector end)
{
vector current = llGetPos();
travelDistance = llRound(current.z-end.z);
travelDistance = llAbs(travelDistance);
if (autoSpeed)
{
if (travelDistance < (initialDistance / 2))
{
speed -= (precision * 2 / 25);
if (speed < 1.00)
speed = 1.00;
}
else
{
speed += (precision / 20);
if (speed > 1)
speed = 1;
}
}
if (travelDistance > 30)
{
travelDistance = 30;
if (end.z > current.z)
{
end.z = current.z + 30;
}
else
{
end.z = current.z - 30;
}
}
float i = travelDistance/(maxSpeed*speed);
llMoveToTarget(end,i);
}
GotoFloor (integer floor)
{
if (targetFloor != floor)
{
llSetStatus(STATUS_PHYSICS, TRUE);
targetFloor = floor;
if (fixedFloorHeight > 0)
{
targetVector = alignment;
targetVector.z = alignment.z + (fixedFloorHeight * floor);
}
else
{
targetVector = alignment;
targetVector.z = llList2Float(floorHeights, floor);
}
vector current = llGetPos();
initialDistance = llRound(current.z-targetVector.z);
initialDistance = llAbs(initialDistance);
if (autoSpeed)
{
speed = 1.00;
}
llSay(0, "Niveau #" + (string)(targetFloor+1) + " [" + (string)((integer)targetVector.z) + "m]");
elevate(targetVector);
llSetTimerEvent(precision);
}
}
reset()
{
llSay(0, "Reinitialisation de l'ascenseur.....");
llSetStatus(STATUS_ROTATE_X| STATUS_ROTATE_Y| STATUS_ROTATE_Z, FALSE);
alignment = llGetPos();
llSetStatus(STATUS_PHYSICS, FALSE);
llStopSound();
llListenRemove(numListen);
numListen = llListen( 0, "", NULL_KEY, "");
llSay(0, "Ascenseur Reinitialise");
}
checkM(key id, string m)
{
vector pos;
integer Floor;
float tempFloat;
m = llToLower(m);
if (m == "kill keep")
{
llSleep(5);
llDie();
}
if (llSubStringIndex(m, "goto floor") == 0)
{
Floor = (integer)llGetSubString(m, 10, llStringLength(m)) - 1;
GotoFloor(Floor);
}
if (llSubStringIndex(m, "go to floor") == 0)
{
Floor = (integer)llGetSubString(m, 11, llStringLength(m)) - 1;
GotoFloor(Floor);
}
if (llSubStringIndex(m, "floor") == 0)
{
Floor = (integer)llGetSubString(m, 5, llStringLength(m)) - 1;
GotoFloor(Floor);
}
if (llSubStringIndex(m, "speed") == 0)
{
tempFloat = (float)llGetSubString(m, 5, llStringLength(m));
if ((tempFloat > 16) && (tempFloat <= 128))
{
maxSpeed = tempFloat;
}
}
}
default
{
state_entry()
{
reset();
}
on_rez(integer start_param)
{
llResetScript();
}
listen(integer a, string n, key id, string m)
{
if ((m=="elevator reset") && (id==llGetOwner()))
{
reset();
}
}
link_message(integer sender_num, integer num, string str, key id)
{
checkM(id, str);
}
timer()
{
vector CurrentPos;
float tempfloat;
CurrentPos = llGetPos();
tempfloat = (CurrentPos.z - targetVector.z);
counter++;
if (counter > (2/precision))
{
llMessageLinked(LINK_SET, -1, "dis", (string)llGetTimeOfDay() + ",Elevator at " + (string)((integer)CurrentPos.z) + "m");
counter = 0;
}
if (llFabs(tempfloat) < 2)
{
if (llFabs(tempfloat) < 0.05)
{
//Arrived at Floor
llWhisper(0, "Arrive au niveau #" + (string)(targetFloor+1));
llPlaySound("ElevatorNoises", 1);
llSetTimerEvent(0);
llSetStatus(STATUS_PHYSICS, FALSE);
llStopSound();
}
else
{
llMoveToTarget(targetVector,1.0);
}
}
else
{
if (fixedFloorHeight > 0)
{
targetVector = alignment;
targetVector.z = alignment.z + (fixedFloorHeight * targetFloor);
}
else
{
targetVector = alignment;
targetVector.z = llList2Float(floorHeights, targetFloor);
}
elevate(targetVector);
}
}
}
Script reseau
integer ID = -1;
float TTL = 20;
integer size = 32;
integer commCH = 5524741;
list buffer;
integer numPriv;
key myKey;
setupCH(integer ch)
{
if (ch != 0)
{
commCH = ch;
llListenRemove(numPriv);
numPriv = llListen(commCH, "", NULL_KEY, "");
}
}
default
{
state_entry()
{
myKey = llGetKey();
setupCH(commCH);
}
on_rez(integer s)
{
setupCH(s);
}
listen(integer ch, string n, key id, string m)
{
//Separate out incoming data
list L = llCSV2List(m);
float time = llList2Float(L, 0);
//Only Process Data if under TTL
if ((llGetTimeOfDay() - time) < TTL)
{
key skey = llList2Key (L, 1);
integer idn = llList2Integer(L, 2);
string command = llList2String (L, 3);
string data = llList2String (L, 4);
string packetID = (string)((integer)(time*10000)) + (string)skey;
if (command == "idn")
{
//Receiving ID number for this prim
ID = idn;
setupCH((integer)data);
}
//Only repeat data that we haven't repeated before
else if(llListFindList(buffer, [packetID]) < 0)
{
if ((idn == ID) || (idn == -1))
{
//Send Message to Scripts in this Object
llMessageLinked(LINK_SET, -2, command, data);
}
if ((idn != ID) || (idn == -1))
{
//Reduce Buffer Size if too large
integer listLength = llGetListLength(buffer);
if (listLength >= (size*2))
buffer = llList2List(buffer, size, listLength);
//Add data to buffer
buffer += packetID;
//Repeat Data
llShout(commCH, m);
}
}
}
}
link_message(integer s, integer n, string m, key id)
{
//Don't process messages we sent ourselves using llMessageLinked
if (n != -2)
{
if (m == "sch")
{
setupCH(n);
}
else if (m == "sid")
{
ID = n;
}
else if (commCH != 0)
{
llShout(commCH, (string)llGetTimeOfDay() + "," + (string)myKey + "," + (string)n + "," + m + "," + (string)id);
}
}
}
}
|