Beiträge: 76
Themen: 16
Thanks Received: 0 in 0 posts
Thanks Given: 0
Registriert seit: Nov 2018
Hallo ich habe hier ein FollowMe Script...
Code: default
{
state_entry()
{
vector pos = llGetPos();
llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);
llSetStatus(STATUS_PHYSICS, TRUE);
llSleep(0.1);
llMoveToTarget(pos,0.1);
key id = llGetOwner();
llSensorRepeat("",id,AGENT,20,2*PI,.4);
llOwnerSay(" i will Follow you ...");
}
on_rez(integer bla)
{
vector pos = llGetPos();
llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);
llSetStatus(STATUS_PHYSICS, TRUE);
llSleep(0.1);
llMoveToTarget(pos,0.1);
key id = llGetOwner();
llSensorRepeat("",id,AGENT,20,2*PI,.4);
llOwnerSay(" i will Follow you ...");
}
sensor(integer total_number)
{
//llOwnerSay("Move to you...");
vector pos = llDetectedPos(0);
vector offset =<-1,1,-.8>;
pos+=offset;
llMoveToTarget(pos,.3);
}
}
Aber es folgt mir nicht....
Vlt ist es wieder ein Bug ( Es ist aus der 0.8.x Zeit) oder ich muss da was in der OpenSim.ini Aktivieren...
Beiträge: 403
Themen: 16
Thanks Received: 224 in 115 posts
Thanks Given: 808
Registriert seit: Sep 2017
Das Problem liegt im Befehl llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE). Ich habe mal kurz auf Metropolis unter Linux mit OpenSim 0.8.3 mit Bulletsim und ODE getestet.
Unter ODE funktioniert das Script mit llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE), aber unter Bulletsim funktioniert es nicht. Mit OpenSim 0.9.x oder mit ubODE habe ich nicht getestet. Aus meiner Sicht handelt es sich um einen Bug.
Hinweis um meine Aussage zu verifizieren: Das setzen des Status im Objekt ist permanent. Entweder du erstellst ein neues Objekt mit einem Script das den Befehl nicht enthält, oder du änderst FALSE auf TRUE.
Code: llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, TRUE);
Der Befehl bewirkt in seiner ursprünglichen Form, dass sich das Objekt nur um die Z-Achse drehen kann.
Unter ODE finde ich das Verhalten des Scripts aber extrem ruckelnd. Ganz allgemein würde ich nach einer Methode suchen, die weniger Lag verursacht. Es kommt natürlich darauf an, was du genau machen willst.
Beiträge: 76
Themen: 16
Thanks Received: 0 in 0 posts
Thanks Given: 0
Registriert seit: Nov 2018
(26.11.2018, 11:48)Pius Noel schrieb: Das Problem liegt im Befehl llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE). Ich habe mal kurz auf Metropolis unter Linux mit OpenSim 0.8.3 mit Bulletsim und ODE getestet.
Unter ODE funktioniert das Script mit llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE), aber unter Bulletsim funktioniert es nicht. Mit OpenSim 0.9.x oder mit ubODE habe ich nicht getestet. Aus meiner Sicht handelt es sich um einen Bug.
Hinweis um meine Aussage zu verifizieren: Das setzen des Status im Objekt ist permanent. Entweder du erstellst ein neues Objekt mit einem Script das den Befehl nicht enthält, oder du änderst FALSE auf TRUE.
Code: llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, TRUE);
Der Befehl bewirkt in seiner ursprünglichen Form, dass sich das Objekt nur um die Z-Achse drehen kann.
Unter ODE finde ich das Verhalten des Scripts aber extrem ruckelnd. Ganz allgemein würde ich nach einer Methode suchen, die weniger Lag verursacht. Es kommt natürlich darauf an, was du genau machen willst.
Also mit llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, TRUE) folgt mir das Prim.... ob es ruckelt oder nicht ist ja erst mal egal.. aber kommt wohl auch auf den Server an oder Simbelastung...
Dies sollen Dekorative Follow Fees werden oder mal Fliegende Herzen die einem folgen ... :-)
Aber ich weiss das das mit FALSE damals auch ging ! Wieder mal ein Bug mehr :-)
lg
Beiträge: 916
Themen: 135
Thanks Received: 539 in 292 posts
Thanks Given: 69
Registriert seit: Feb 2015
29.11.2018, 23:05
(Dieser Beitrag wurde zuletzt bearbeitet: 30.11.2018, 00:05 von Manfred Aabye.)
Code: // :CATEGORY:OpenSim NPC
// :NAME: NPC_Follower.lsl
// :AUTHOR:Ferd Frederix
// :REV:1.0
// :WORLD:OpenSim
// :DESCRIPTION:
// This is a NPC follower.
// License: http://creativecommons.org/licenses/by-nc
// :CODE:
// tunables
float max_distance = 70; //distance for sensoring a real avatar
string fName = "Max";
string lName = "Muster";
float gTimer;
// stuff
integer iWaitCounter = 60;
integer channel; // dialog channel
integer listener; // holds the listener handle;
key npc; // npc key
integer npc_on = FALSE;
vector Dest;
string lastAnim;
Play(string anima)
{
if (anima == lastAnim)
return;
if (anima == "Stehen9" && llFrand(5) < 1)
{
anima = "Redeanimation";
gTimer = llFrand(5) + 4;
}
else
{
gTimer = llFrand(5) + 1;
}
osNpcPlayAnimation(npc,anima);
osNpcStopAnimation(npc,lastAnim);
lastAnim = anima;
}
Sound()
{
if (llFrand(2) > 0.5)
return;
integer n = llGetInventoryNumber(INVENTORY_SOUND);
integer n2 = llCeil(llFrand(n));
string name = llGetInventoryName(INVENTORY_SOUND,n2);
llTriggerSound(name,1.0);
}
walk_to_master(vector myPos)
{
vector myVector = <randBetween(-2,2),randBetween(-2,2),myPos.z> ;
myPos.z = 0;
iWaitCounter = 60;
Play("gehenauswaehlen");
osNpcMoveToTarget(npc, myPos + myVector, OS_NPC_NO_FLY );
llSetTimerEvent(0.5);
Sound();
}
float randBetween(float min, float max)
{
return llFrand(max - min) + min ;
}
dialog(key avi)
{
channel = llCeil(llFrand(5000) + 5000);
listener = llListen(channel,"","","");
llDialog(avi, "Choose:",["Start","Entfernen","Aussehen"],channel);
}
Start()
{
vector npcPos = llGetPos() + <1.0,1.0,1.0>;
npc = osNpcCreate(fName,lName, npcPos, "Aussehen");
llSetObjectDesc(npc);
npc_on = TRUE;
llSensor("", NULL_KEY, AGENT_BY_LEGACY_NAME, max_distance, PI);
}
default
{
state_entry()
{
llSay(0,"NPC Bereit");
gTimer = llFrand(2) + 1;
osNpcRemove(llGetObjectDesc());
}
changed (integer what)
{
if (what & CHANGED_REGION_START)
{
if (npc_on)
{
Start();
}
}
}
on_rez(integer p)
{
llResetScript();
}
touch_start(integer x)
{
//if (llDetectedKey(0) == llGetOwner()) {
dialog(llDetectedKey(0));
//}
}
listen(integer channel, string name, key id, string msg) {
llListenRemove (listener);
if (msg == "Start")
{
if( !npc_on ) {
Start();
} else {
llOwnerSay("Bereits gestartet!");
}
} else if (msg == "Entfernen") {
npc_on = FALSE;
osNpcRemove(llGetObjectDesc());
llSetTimerEvent(0);
} else if (msg == "Aussehen") {
osAgentSaveAppearance(llGetOwner(), "Aussehen");
llOwnerSay("Aussehen wurde gespeichert!");
}
}
sensor(integer num)
{
Dest = llDetectedPos( 0 );
walk_to_master(Dest);
}
no_sensor()
{
Play("Redeanimation");
llSleep(10);
llSensor("", NULL_KEY, AGENT_BY_LEGACY_NAME, max_distance, PI);
}
timer()
{
vector pos;
if (--iWaitCounter) {
list Poses = llGetObjectDetails(npc,[OBJECT_POS]);
pos = llList2Vector(Poses, 0);
if (llVecDist(pos, Dest ) > 4) {
return;
}
}
if (llFrand(5) < 0.5) {
if (llVecDist(pos, Dest ) <1) {
Play("Victory");
llTriggerSound("kitten4",1.0);
llSleep(1.5);
} else {
Play("Redeanimation");
llTriggerSound("kitten3",1.0);
llSleep(1.5);
}
}
Play("Stehen9");
llSleep(gTimer);
llSetTimerEvent(0);
llSensor("", NULL_KEY, AGENT_BY_LEGACY_NAME, max_distance, PI);
}
}
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.
|