| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- // :SHOW:1
- // :CATEGORY:Gaming
- // :NAME:Sequencer and Collider for All in One NPC Controller
- // :AUTHOR:Ferd Frederix
- // :KEYWORDS:Game, Collider
- // :REV:1.0
- // :WORLD:Opensim
- // :DESCRIPTION:
- // Sequencer script for NPC animator for HyperGrid Story nine sim. It sequences multiple NPCs in order thru a scenarios
- // each 'things' entry is the NPC number, a (float) time to take between sending commands ( 0 is not allowed, but a small number is()
- ///and a @command that is sent to the NPC.
- // :CODE:
- // Notes: Link messages arte as follows
- // Rev: 2 fixes the Linux bug for collisions.
- //
- integer debug = 1; // set to TRUE or FALSE for debug chat on various actions
- // list of NPCs and their linked prim numbers
- list npcName = ["namaka",2,"dylan",3,"npc1",4,"npc2",5,"npc3",6,"npc4",7,"npc5",8,"npc6",9];
- integer CommandChannel = 23;
- // DEBUG(string) will chat a string or display it as hovertext if debug == TRUE
- DEBUG(string str) {
- if (debug ==1 )
- llSay(0, llGetScriptName() + ":" + str);
- if (debug ==2 )
- llSetText(str,<1,1,1>,1.0);
- }
- integer osIsNpc(key id){
- return FALSE;
- }
- string osGetNotecard(string name) {
- // sample notecard for testing
- string str = "NPC #| seconds | Command\n"
- +"npc1|0|@pause=1\n"
- +"sylan|0|@animate=avatar_jumpforjoy|5\n"
- +"namaka|0|@say=Hello! What happened to you two?\n"
- +"Derf|0|@say=error\n"
- +"dylan|2|@animate=avatar_type|2\n"
- +"dylan|8|@say=I think we can transform back to our original selves, at last.\n";
- return str;
- }
- integer SENSE = FALSE; // sensor for an avatar
- float RATE = 5; // every 5 seconds
- integer COLLIDE = TRUE; // if they collide, trigger the sequence
- float RANGE = 96; // a very short range as this goes into a ring around the avatar
- integer Rezzed;
- list things ;
- // CODE follows
- Send(string who, string cmd)
- {
- DEBUG("Sending to " + who + "(" + (string) lookup(who) + ") the command " + cmd);
- llMessageLinked(lookup(who),0,cmd,"");
- }
- integer lookup(string Name)
- {
- integer i = llListFindList(npcName,[Name]);
- if (i != -1)
- return llList2Integer(npcName,i+1);
- return 0;
- }
- // For rezzing in
- RezIn()
- {
- DEBUG("Rezz In = @reset");
- llMessageLinked(LINK_SET,0,"@reset","");
- }
- DoIt()
- {
- string note = osGetNotecard("Sequence");
- list stuff= llParseString2List(note,["\n"],[]);
- DEBUG("stuff:" + llDumpList2String(stuff,":"));
- integer i;
- integer j = llGetListLength(stuff);
- for (i=0; i < j; i++)
- {
- string noteline = llList2String(stuff,i);
- DEBUG("noteline:" + noteline);
-
- list line = llParseString2List(noteline,["|"],[]);
- string primName = llList2String(line,0);
- float sleepTime = llList2Integer(line,1);
- string atCmd = llList2String(line,2);
- string param1= llList2String(line,3);
- string param2= llList2String(line,4);
- DEBUG("prim:" + primName);
- DEBUG("num:" + (string) lookup(primName));
- DEBUG("time:" + (string) sleepTime);
- DEBUG("atCmd:" +atCmd);
- if (lookup(primName) && llSubStringIndex(atCmd,"@") == 0)
- {
- things += lookup(primName);
- things += sleepTime;
- things += atCmd+"|" + param1 + "|" + param2;
- }
- }
- DEBUG("Things:" + llDumpList2String(things,":"));
- }
- Speak() {
-
- integer prim = llList2Integer(things,0);
- float time = llList2Float(things,1);
- string msg = llList2String(things,2);
- DEBUG("Prim:" + (string) prim + " time:" + (string) time + " Msg:" + msg);
- if (llStringLength(msg)) {
- things = llDeleteSubList(things,0,2);
- DEBUG("LINK:" +(string) prim + ":" + msg);
- llMessageLinked(prim,0, msg,"");
- if (time > 0) {
- llSetTimerEvent(time);
- } else {
- llSetTimerEvent(0.1);
- }
- } else {
- DEBUG("Done");
-
- Rezzed = 0;
- llSetTimerEvent(0);
- if (SENSE)
- llSensorRepeat("","",AGENT,RANGE,PI,RATE);
- }
- }
-
- default
- {
- state_entry()
- {
- llSetText("",<1,1,1>,1.0);
-
- RezIn();
-
- llSetTimerEvent(0);
- if (SENSE)
- llSensorRepeat("","",AGENT,RANGE,PI,RATE);
- llListen(CommandChannel,"","","");
- }
- touch_start(integer p) {
- DEBUG("touched");
- if (llGetOwner() == llDetectedKey(0))
- {
- Send("Claire","@say=touched");
- }
- }
- listen(integer channel, string name, key id, string message)
- {
- DEBUG(message);
- list vars = llParseString2List(message,["|"],[]);
- string num = llList2String(vars,0);
- string cmd = llList2String(vars,1);
-
- Send(num, cmd);
-
- }
-
- sensor(integer n) {
- DEBUG("Sensed");
-
- if (! osIsNpc(llDetectedKey(0))) {
- DEBUG("Sensed avatar");
- llSensorRemove();
- RezIn();
- }
- }
-
- timer()
- {
- Speak();
- }
-
- collision_start(integer n) {
- DEBUG("Collided with " + llKey2Name(llDetectedKey(0)));
- if (! osIsNpc(llDetectedKey(0)))
- {
- DoIt();
- Speak();
- }
-
- }
-
- on_rez(integer p)
- {
- llResetScript();
- }
-
- changed(integer what)
- {
- if (what & CHANGED_REGION_START)
- {
- llResetScript();
- }
- }
- }
|