Mon second robot...

Répondre
Partager Rechercher
~70 mètres je crois me rappeler

j'ai écris un routine de détection de no script zone mais je ne peux pas la tester complètement , suis entouré de terrains no entry!


Code PHP:

integer No_Script_Zonevector pos )
{
    
integer SCRIPT;
    
integer ENTRY;
    
integer GROUP_SCRIPT;
    
integer GROUP_ENTRY;
    
    list    
details      llGetParcelDetails(pos,[PARCEL_DETAILS_OWNERPARCEL_DETAILS_GROUP]);
    
key     object_group llList2Key(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0);
    
key     owner_land   =  llList2Key(details ,0);
    
key     group_land   =  llList2Key(details ,1);
    
    
integer Parcel_Flags llGetParcelFlags(pos);
            
    if (
PARCEL_FLAG_ALLOW_SCRIPTS Parcel_Flags)
        
SCRIPT TRUE;
    if (
PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY Parcel_Flags)
        
ENTRY TRUE;
    if (
PARCEL_FLAG_ALLOW_GROUP_SCRIPTS Parcel_Flags)
        
GROUP_SCRIPT TRUE;
    if (
PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY Parcel_Flags)
        
GROUP_SCRIPT TRUE;
        
    if ( ( 
llGetOwner()  == owner_land) || SCRIPT || (!SCRIPT && !ENTRY ) || 
         ( 
object_group == group_land &&  (GROUP_SCRIPT || !GROUP_ENTRY )))          
        return 
FALSE;
    else
        return 
TRUE;
}

default
{
 
    
touch_start(integer total_number)
    {
        list 
Pos_Rot     llGetObjectDetails(llGetOwner(), [ OBJECT_POS]); // Get Positions & Rotations
 
        
vector pos llList2Vector (Pos_Rot,0);    // Get where is the owner in the region

        
if ( No_Script_Zone(pos) )
            
llOwnerSay "NO SCRIPT");
        else
            
llOwnerSay ("OK");
    }

Citation :
Publié par Seb_01
Par contre blacklisted functions contient quoi ? lol
A ma connaissance seule la fonction llPushObject est concernée par cette fameuse liste.
Citation :
Publié par bestmomo
A ma connaissance seule la fonction llPushObject est concernée par cette fameuse liste.
Ok je vais intégrer le llTakeControl et la routine ( que je peux enfin tester...) qui signalera que l'on est rentré dans une zone de no script et cela devrait être suffisant je pense.
Bon j'ai intégré le llTakeControl permettant d'aller sur un terrain "no script" et aussi la routine (modifiée) pour alerter le owner que le robot est entré dans un terrain no script.

Code PHP:


 
// _________ Globales Variables __________//

// Constants //
string      Object_Name   =    "RoboT";
string      Version       =    "v1.1";
key         Texture       =    "fbe9f069-9696-6b3f-e58c-beaf3ce0f1ed";
integer     Sleeping      =  0;
integer     Following     =  1;
float       Timer_Default =  0.4;


// Build Constants & variables //
float       Alpha       =   0.0;
vector      Repeats     =   <0.4,1.0,0.0>;
vector      Offset      =   <1.0,1.0,0.0>; 
vector      Size_RoboT  =   <.25,.25,.25>;
vector      Home        =   ZERO_VECTOR;
integer     N_Before_Sleep;
integer     Status_Robot;    


// Common Variables //
key         Owner;
float       Timer 0.4;
integer     On_Off FALSE;

// Follow me variables//
vector      Pos;
vector      Good_Pos;
rotation    Rot;
list        
Pos_Rot;
integer     Attempts;


Build_Robot() // Used once at creation...
{
    
llSetScale(Size_RoboT);
    
llSetPrimitiveParams([  PRIM_TEXTURE,ALL_SIDES,TextureRepeatsOffsetAlpha
                            
PRIM_MATERIAL,PRIM_MATERIAL_WOOD
                            
PRIM_FULLBRIGHT,ALL_SIDES,TRUE]); 
}

Init() // on reset or rez
{
    
Owner llGetOwner();
    
llSetObjectName (Object_Name " " Version);
    
llSetObjectDesc ("");
    
llSetStatus STATUS_PHYSICS,TRUE);     // Put the robot in physical mode
    
if (Home == ZERO_VECTOR)
        
Home llGetPos();                  // If no home set it!
    
Status_Robot Following;               // First status
    
llSetText "", <1.01.01.0 >, 0.0); // clear Hover Text
    
llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
}


Infos(float distance)
{
    if ( 
On_Off)  // on click on robot  we can show these infos
        
llOwnerSay "Vitesse => " + (string) llVecMag(llGetVel()) + " Distance => " + (string)distance +  " Timer => " + (string) Timer);
}

float Distance(vector pos1vector pos2// get the distance btw 2 positions
{
    return 
llVecMagpos1pos2);
}


warpPos(vector target)
{    
// for looong trips... // http://wiki.secondlife.com/wiki/WarpPos //
    
integer jumps = (integer) (llVecDist(targetllGetPos()) / 10.0) + 1;
    if (
jumps 411)
        
jumps 411;
    list 
rules =[PRIM_POSITIONtarget];    //The start for the rules list
    
integer count 1;
    while ((
count count << 1) < jumps)
        
rules += rules;
    
llSetPrimitiveParams(rules llList2List(rules, (count jumps) << 1count));
}

integer Check_Trap() // if the robot is stopped by a parcel where objects cant move...
{
    return (
llVecMag(Pos llGetPos() ) > && llVecMag(llGetVel()) == 0.0 );
}

integer No_Script_Zonevector pos // detection  land script not allowed
{
    
integer SCRIPT;
    
integer ENTRY;
    
integer GROUP_SCRIPT;
    
integer GROUP_ENTRY;
    
    list    
details      llGetParcelDetails(pos,[PARCEL_DETAILS_OWNERPARCEL_DETAILS_GROUP]);
    
key     object_group llList2Key(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0);
    
key     owner_land   =  llList2Key(details ,0);
    
key     group_land   =  llList2Key(details ,1);
    
    
integer Parcel_Flags llGetParcelFlags(pos);
            
    if (
PARCEL_FLAG_ALLOW_SCRIPTS Parcel_Flags)
        
SCRIPT TRUE;
    if (
PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY Parcel_Flags)
        
ENTRY TRUE;
    if (
PARCEL_FLAG_ALLOW_GROUP_SCRIPTS Parcel_Flags)
        
GROUP_SCRIPT TRUE;
    if (
PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY Parcel_Flags)
        
GROUP_ENTRY TRUE;
           
                                             
    if  ( ( 
llGetOwner()  == owner_land) || (object_group == group_land &&  
          ((
GROUP_SCRIPT &&  GROUP_ENTRY) || (!GROUP_SCRIPT &&  !GROUP_ENTRY) || (GROUP_SCRIPT &&  !GROUP_ENTRY) )))
        return 
FALSE;
    else if  ( (
object_group != group_land) && (SCRIPT || (!SCRIPT && !ENTRY)) )   
        return 
FALSE;
    else    
        return 
TRUE;
     
}

Follow_Me() // Move the robot...
{
@
Turbo_Mode// Label //
    
    
Pos_Rot     llGetObjectDetails(Owner, [ OBJECT_POSOBJECT_ROT]); // Get Positions & Rotations
    
vector size llGetAgentSize(Owner);// get the agent size
    
    
if ( size ==  ZERO_VECTOR || llGetListLength(Pos_Rot) == // the owner seems be not here..
    
{
        
llSetTimerEvent (5);            // control only each 5 seconds 
        
if (++N_Before_Sleep 5)
            return;
        else
        {
            
llSetTimerEvent(0);   // Stop timer
            
N_Before_Sleep 0;
            
Status_Robot Sleeping;
            
llSetText "zzzZZZZ", <1.01.01.0 >, 1.0);
            
warpPos Home  );    // ... and go Sleep
             
        
}
    }  
    else
      
N_Before_Sleep =0;   

    
Pos llList2Vector (Pos_Rot,0);    // Get where is the owner in the region
    
Rot llList2Rot (Pos_Rot,1);       // position & rotation 
            
    
Pos Pos + <1,1,size.y/2> * Rot;   // correction offset
    
    
if (No_Script_Zone(Pos))
    {
        
llOwnerSay "Entering in a No Script Land...");
    }
    
    
vector direction llVecNorm(Pos llGetPos());
    
llApplyImpulse(direction 1000); // Impulse Once ... instead llSetForce (see wiki) 
    
    
float dist =  Distance(Pos,llGetPos()); // calculate the distance btw owner & robot
    
    
if ( Attempts == // Dont must be trapped to get a best timer...
    
{
        if (
dist 50)
        {    
            
llSetStatus STATUS_PHYSICS,FALSE);    // doesnt work with physical objects
            
warpPos(Pos);                           //  famous and knew hack of LSL
            
llSetStatus STATUS_PHYSICS,TRUE);
            return; 
        }
        if (
dist <= )                   //  [(1.445) is the distance btw robot and owner in quiet state... 
            
Timer 1
        else  if (
dist && dist <= )    // if the distance > 1 & < 5 then reduce the timing to move faster
            
Timer .2;                     
        else 
        {                                   
// Entering in Turbo Mode!!
            
if ( Check_Trap() )             //  Trapped in turbo mode?
                
++Attempts;                 //  if yes then  record it
                
            
llSetTimerEvent (0); 
            
llMoveToTarget(Pos0.1);  // move only without rotate & damp...
            
if (On_Off)
                
llOwnerSay "Vitesse => " + (string) llVecMag(llGetVel()) + " Distance => " + (string)llVecMag(Pos llGetPos()));
            
jump Turbo_Mode;   //           // shunt the timer!
        
}
    }
    
    
llSetTimerEvent (Timer); // .. and set it!
    
    
Infos(dist); // show infos if autorized...
    
    
llMoveToTarget(Pos0.6);              // move ...
    
llRotLookAt(Rot llEuler2Rot(<PI,0.0PI>)  ,0.4,0.6);   // ... & rotate
    
    //llOwnerSay( (string) llVecMag(Pos - llGetPos()) + " " +  (string) llGetVel());
    
    
    
if ( Check_Trap() ) // verify if the robot can move
    
{        
        if (++
Attempts )  // +1 and test...
        
{     
            
llSetStatus STATUS_PHYSICS,FALSE);
            
warpPos(Good_Pos);              // move to the last "good" position knew...
            
Timer 1;
            
llSetTimerEventTimer);
            
llSetStatus STATUS_PHYSICS,TRUE);
            
Attempts 1
        }
    }
    else
    {
        
Good_Pos llGetPos(); // if robot moved  then keep trace...
        
Attempts 0;
        
llSetTimerEventTimer_Default); 
    }
}

default
{
    
on_rez (integer start_param)
    {
        
Init();    
    }
    
state_entry()
    {
        if ( 
llGetObjectName() == "Object")
            
Build_Robot(); // At the creation only...
        
Init();
    }

    
touch_start(integer num)
    {
        if (
Status_Robot == Sleeping)
        {
            
llSetTimerEvent (Timer_Default);    
            
llSetText "", <1.01.01.0 >, 0.0);
        }
        else
        {
            
On_Off =!On_Off;
            
llOwnerSay "Aie!");
        }
    }
    
run_time_permissions(integer perms)
    {
        if (
perms PERMISSION_TAKE_CONTROLS
            
llTakeControls(CONTROL_FWD,TRUE,TRUE); // Only for using robot in No Script Zone
        
llSetTimerEvent (Timer);                // start following        
    
}    
    
    
    
timer()
    {
       
Follow_Me();
    }

Un p'tit merci aux intervenants
Il y a 3 "droits" principaux pour les objets concernant 1 terrain:

1 Create object

Comprendre que l'on a pas le droit de rezzed un objet venant d'un inventaire ou qu'un objet lui même ne peut donner naissance à un autre ( par script)

2. No entry

Comprendre qu'un objet ne peut venir sur ce terrain en provenance d'un autre terrain.

3. Les scripts se trouvent désactiver.

Ces droits s'établissent par rapport aux propriétaires de ces objets et leur appartenance à un groupe ou pas définit ou pas pour le terrain.

Toutes ces infos sont accessibles par le menu About Land.

Pour le robot dans la dernière version on doit avoir au minimum pour le terrain où on le rez les droits de création, de run script. Il aura donc la possibilité de se déplacer sur ce terrain.

Pour franchir une frontière avec un autre terrain, cet autre terrain doit permettre l'entrée des objets "Entry Object" c'est tout.
Le no script a été solutionné dans le script.

Effectivement si il reste à la frontière d'un terrain c'est parce qu'il n'a pas les droits pour pénétrer ce terrain. C'est typiquement le cas que tu cites, et il n'y a pas de passe droit à cela...

Seb,
Bonjour,

Je me doutais bien qu'il n'y aurait pas de solution.

A moins qu'il soit "porté" et non "pausé", mais la encore est-ce possible de garder l'autonomie du robot ?????

Il faut toujours dans un projet un "candide" pour poser des questions bêtes. LOL
Citation :
Publié par Dominique DEBEVEC
Bonjour,

Je me doutais bien qu'il n'y aurait pas de solution.

A moins qu'il soit "porté" et non "pausé", mais la encore est-ce possible de garder l'autonomie du robot ?????

Il faut toujours dans un projet un "candide" pour poser des questions bêtes. LOL
Il y a PAS de question bête, surtout venant d'un utilisateur..

Le porter nan!

Monter dessus ... si tu veux faire du rodéo! ( Mais reste envisageable pour qu'il se transforme en Master of the Carpet..)

Bon j'ai mis le zin zin sur Xstreet version 1.4..
Version RoboT 1.4
Sur xstreet :

RoboT 1.4



Il intègre des corrections et des nouveautés... sympathiques.

Il dispose de 3 scripts (3 modules) :

Robot Engine ( v1.4)

Robot Message ( v1.0 beta)

Robot Commands ( v1.0 beta)


Intégrant la gestion de Hover Text ( messages au dessus du robot) qui lui permet de "parler" en public

Intégrant les premières commandes:

Citation :
  • xstop Stop l'activité du robot
  • xsleep Ordonne qu'il aille dormir
  • xcome Ordonne qu'il reprenne son activité
  • xreset Reset du script
  • xstart Restart après pause ou stop
  • xpause Il attent ...
sur le canal 0 ( general chat) ou 99 ==> ex: /99 xpause
Le module Robot Commands est un script très simple mais son architecture permet d'ajouter un commande très simplement (et de lui affecter une action)
Code PHP:

 list    Commands    = ["xstop","xsleep","xcome","xreset","xstart","xpause"];
integer Listen_Handle_0;
integer Listen_Handle_99;
 
Set_Text string messagestring colorinteger  time )
{
//  Set_Text ( "Hover text","Blue", Time )   
//
//  Time =   0  permanent message 
//  Time =   X  keep Xs and get back the old message
//  Time =  -X  keep Xs and clear message
//  Time = -99  clear message
    
llMessageLinked LINK_THIS100message "%" color "%" + (string) time"RoboT Messages" );
}


default
{
    
state_entry()
    {   
        
Listen_Handle_0  llListen(0""llGetOwner(), "");
        
Listen_Handle_99 llListen(99""llGetOwner(), "");
    }
    
    
listeninteger channelstring namekey idstring message )
    {
        
integer index llListFindList Commands, [message] );
        if (
index != -1)
        {
            
string order llList2StringCommandsindex);
            if ( 
order == "xreset" )
                
llResetOtherScript "Robot Engine" );
            else if ( 
order == "xstop" )
            {
                
Set_Text "Stopped" ,"Red",0); 
                
llSetScriptState "Robot Engine",FALSE );
            }
            else if ( 
order == "xstart"
            {
                
Set_Text "Restarted" ,"Blue",-2); 
                
llSetScriptState "Robot Engine",TRUE );
            }
            else
                
llMessageLinked LINK_THIS1000"Repeat"order); 
        }
    }

Il est en version Beta et sera mis en forme et commenté plus tard..

Le principe est des plus basique: Il écoute , vérifie et ordonne (ou réalise) les commandes.

On peut voir la présence de l'accès à Hover Text messages qui s'affiche au dessus de la tête de RoboT

son fonctionnement est simple et gère les messages (et leur couleur) de la façon suivante:

Citation :
message permanent ( jusqu'au prochain..
message temporisé x s et ré affichage du message précédent
message temporisé x s et pas rappel du message précédent ( = permanent)
effacer le message précédent

Le module Robot Messages version Beta gère les messages précédents
Son script a peu d'intérêt.

Le RoboT 1.4 est full perms évidement.


Seb,
Nouvelles commandes

Citation :
  1. xsay + message ( demande au robot de dire le message )..
  2. xlist ( affiche les commandes possibles)
exemple:
xsay RoboT is the best robot of SL! ou ( /99 xsay RoboT is the best robot of SL! )
Important: Quand cette liste est mise à jour l'article xstreet intègre la version adéquate...
Salut Seb

Merci . Très instructif de suivre le développement de RoboT. Je me suis bien amusé hier soir.

J'ai essayé ce matin la version que tu as mise sur Xstreet et, comme je suis très novice en script, j'ai une question concernant une fonction de RoboT qui m'a vraiment fait rire : après déconnexion, comment rassurer un robot angoissé par l'absence de son maître ? Oui, parce que là, il beugle "Are you gone Master?" au quatre coins du metaverse et inonde de messages mouillés de larmes la boîte mail de son propriétaire, héhé
Oups j'ai oublié de viré cela ..

Code PHP:

        llInstantMessage llGetOwner(), "Are you gone Master?"); 

devient

Code PHP:

    //    llInstantMessage ( llGetOwner(), "Are you gone Master?"); 

ou


tu vires la ligne

Je profite de ta remarque pour le coté fun...

Code PHP:

llSetTimerEvent (5);            // control only each 5 seconds 
        
if (++N_Before_Sleep 5)
            return;
        else
        {
            
Go_Home();
             
        } 
Peut être changé pour une version plus fun...

Code PHP:

        llSetTimerEvent (5);            // control only each 5 seconds 
        
if (++N_Before_Sleep 5)
            return;
        else
        {
            
Go_Home();
            
Set_Text "Don't worry Master will be come back soon!" ,"Green",10);             
        } 
Affichera ce message 10 secondes avant les zzzZZZ

Ce qui devrait rassurer le/la partner présente en cas de crash...

J'ai pas testé mais bon l'idée est là à titre d'exemple...
Je n'arrive pas à tester la bête
j'ai beau taper les commandes cela ne marche pas.

par exemple j'ai essayé :

/99 xsay Coucou
xsay coucou

mais rien...
Nouvelles commandes dispos:

List of commands:
xstop
xsleep
xcome
xreset
xstart
xpause
xsay
xlist
List of commands with parameters:
xsay message
xsearch Object recherché ( nom exact)


Exemple d'utilisation:

xsearch Xstreet SL Magic Box v3.0.11

Xstreet SL Magic Box v3.0.11 ___ Click to view my item listings ___ 7 m ___ <172.22840, 228.77020, 20.34463>

donne le nom / la description / la distance (robot-objet) / position.

Xsearch est en cours d'amélioration...
Un Bug a été identifié et fixed ( merci Doux Reveur ) Pas de commandes entendu par le RoboT

Les commandes sont possibles sur la version en cours sur Xstreet ou vous pouvez reseter le script Robot Commands pour le fixer aussi.
lol normal mon ami ... la version 1.5 est arrivée..

RoboT v1.5

La commande xsearch est désormais plus mieux bien


tappez:

xsearch Object
xsearch Objt
xsearch ject
etc

pour trouver les objets nommés Object

Placer RoboT au milieu de votre land lancer la commande xsearch et vous verrez de visu comment ce foutu Robot opère... si vous arrivez à suivre ses déplacements ... ce qui n'est pas sûr la 1 ere fois
Une version V1.51 est dispo pour tests.

j'ai ajouté une commande xd comme xd(efense) qui transforme petit Robot en GROS robot rouge qui pousse/poursuit/entoure un indésirable pendant 15 secondes avant de vous proposez de le satelliser hors de votre terrain.
A tester...
Bonsoir SEB,

Fonction xsearch testée, elle marche à merveille (au moins sur mon terrain)
Fonction xd : pas trouvé comment la faire fonctionner.
Toutes les autres fonctions "x" fonctionnent parfaitement.
La portée des fonctions, même en fonction "crier" ne traverse pas une sim (mais c'est surement normal)

Il me reste le test du gros robot rouge avec xd à tester, mais toujours pas trouver comment l'employer.
A moins que... je vais tenter de récup la v1.51 qui peut être n'est pas arrivée dans mon inventaire.

Tests de déplacement :
Du niveau de la mer à 1180m, la deuxième fois que je me suis TP j'ai perdu le ti robot, il a du rester sur le terrain en bas.

J'ai trouvé le robot perdu, il était passé dans mon Lost and Found. Pourquoi, je ne sais pas, mais j'ai eu le message :
Second Life: Your object 'RoboT v1.5' has been returned to your inventory lost and found folder from parcel 'MOUSHOU ISLAND' at Green River 212, -1 because it went off-world.
Oui prend la version 1.51

Faut que je mette un sorte de balise argos, j'ai complétement zappé cette indispensable fonctionnalité. Merci Domi!

Pour la fonction xd il te faut au moins un intrus... ou une personne qui joue ce rôle.
Elle doit être à < 60 mètres.

xd te donne de suite un menu dont les touches sont le nom des avatars présents dans les 60 mètres au moment de la commande. Le fait de valider transforme le robot en gros robot rouge qui prend pour cible celui désigné comme target. Il est difficile pour l'intrus de se dépêtrer du robot il finit souvent par avoir le dessus.

Après 15 s un autre menu apparait te permettant d'éjecter cet intrus ou pas.

Je rajouterai une autre petite défense soon. entre le funny et le sérieux histoire de...

Le module recherche à l'air de bien fonctionner et peut servir à retrouver facilement un objet perdu , je rajouterai un laser pour pointer l'objet histoire de faire fun et utile..
because it went off-world. veut dire que le robot est entré dans une partie ou il n'existe plus rien.

Cela ne devrait arriver qu'en mode recherche normalement, dans des conditions très précise... Je vais rajouter cette protection aussi. (tester la fin du monde..pas banal!).

Merci Dom de tes tests cela permet de mettre les derniers coups de tournevis à l'engine motor 1.5
De rien SEB, c'est bien normal et en plus ça ne me change pas du bureau, LOL

Effectivement c'est la fonction recherche, qui perd le robot dans les limites de la sim.

J'allais justement venir au pointage des objets recherchés, c'est vraiment une bonne idée que de mettre un marqueur dessus.
On peu aussi peut-être lister les objets du terrain ce qui fait que l'on pourrait retrouver des objets avec un nom oublié et qui font perdre des prims (il m'arrive de perdre des objets et ce n'est pas terrible pour les retrouver surtout sur mon terrain qui est un sous-bois avec un tas de branchages et autres trucs.

PS : je suis dans l'annuaire, si tu veux passer...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés