diff --git a/Chris.MultiNPC.lsl b/Chris.MultiNPC.lsl index 140d968..38ff890 100644 --- a/Chris.MultiNPC.lsl +++ b/Chris.MultiNPC.lsl @@ -14,22 +14,22 @@ yoptions; //=================== list m_npcdata = []; -integer m_lastTimeCheck = 0; - +integer m_lastTimeCheck = 0; + default { state_entry() { - + m_npcdata = llCSV2List(osGetPrivateDataValue("tmp." + llGetKey())); hardReset(); - + m_lastTimeCheck = llGetUnixTime(); checkOSPermissions(); readAllNPCPathNC(); state waitingForPlayers; - } + } } state waitingForPlayers @@ -37,8 +37,8 @@ state waitingForPlayers state_entry() { llSetTimerEvent(0.1); - } - + } + timer() { llSetTimerEvent(2); @@ -47,60 +47,60 @@ state waitingForPlayers state running; } } - + state running { state_entry() { llSetTimerEvent(0.3); } - + timer() { if((m_lastTimeCheck + 2) <= llGetUnixTime()) hardReset(); - + m_lastTimeCheck = llGetUnixTime(); - + if(getRealAgentCount() == 0) hardReset(); - + doNextScriptStep(); } - + changed(integer change) { if (change & CHANGED_INVENTORY) hardReset(); - + if (change & CHANGED_REGION_START) hardReset(); - } -} + } +} //Script commands integer script_create(integer slot, key npc, list command) { if(npc != NULL_KEY) osNpcRemove(npc); - + list objects = osGetSearchableObjectList(llList2String(command, 4)); if(llGetListLength(objects) == 0) { - llSay(0, "Cant find the position for an object with the name '" + llList2String(command, 4) + "'."); + llSay(0, "Cant find the position for an object with the name '" + llList2String(command, 4) + "'."); return FALSE; } - + if(llGetInventoryType(llList2String(command, 3) + ".appearance") != INVENTORY_NOTECARD) { - llSay(0, "Cant find appearance '" + llList2String(command, 3) + "'."); + llSay(0, "Cant find appearance '" + llList2String(command, 3) + "'."); return FALSE; } npc = osNpcCreate(llList2String(command, 1), llList2String(command, 2), llList2Vector(llGetObjectDetails(llList2Key(objects, 0), [OBJECT_POS]), 0), llList2String(command, 3) + ".appearance"); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot, npc); return TRUE; -} +} integer script_remove(integer slot, key npc, list command) { @@ -109,23 +109,23 @@ integer script_remove(integer slot, key npc, list command) m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot, NULL_KEY); return TRUE; -} +} integer script_say(integer slot, key npc, list command) { osNpcSay(npc, 0, llList2String(command, 1)); return TRUE; } - + integer script_sit(integer slot, key npc, list command) { list objects = osGetSearchableObjectList(llList2String(command, 1)); if(llGetListLength(objects) == 0) { - llSay(0, "Cant find the sit target '" + llList2String(command, 1) + "'."); + llSay(0, "Cant find the sit target '" + llList2String(command, 1) + "'."); return FALSE; } - + osNpcSit(npc, llList2Key(objects, 0), OS_NPC_SIT_NOW); return TRUE; } @@ -148,15 +148,15 @@ integer script_walk(integer slot, key npc, list command) list objects = osGetSearchableObjectList(llList2String(command, 1)); if(llGetListLength(objects) == 0) { - llSay(0, "Cant find the walk target '" + llList2String(command, 1) + "'."); + llSay(0, "Cant find the walk target '" + llList2String(command, 1) + "'."); return FALSE; - } - + } + list targetDataList = llGetObjectDetails(llList2Key(objects, 0), [OBJECT_POS]); vector targetPosition = llList2Vector(targetDataList, 0); - + osNpcMoveToTarget(npc, targetPosition, OS_NPC_NO_FLY); - + m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".state", "walk"); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".targetPosition", targetPosition); return TRUE; @@ -167,10 +167,10 @@ integer script_touch(integer slot, key npc, list command) list objects = osGetSearchableObjectList(llList2String(command, 1)); if(llGetListLength(objects) == 0) { - llSay(0, "Cant find the touch target '" + llList2String(command, 1) + "'."); + llSay(0, "Cant find the touch target '" + llList2String(command, 1) + "'."); return FALSE; - } - + } + osNpcTouch(npc, llList2Key(objects, 0), LINK_THIS); return TRUE; } @@ -185,10 +185,10 @@ integer script_appearance(integer slot, key npc, list command) { if(llGetInventoryType(llList2String(command, 1) + ".appearance") != INVENTORY_NOTECARD) { - llSay(0, "Cant find appearance '" + llList2String(command, 1) + "'."); + llSay(0, "Cant find appearance '" + llList2String(command, 1) + "'."); return FALSE; } - + osNpcLoadAppearance(npc, llList2String(command, 1) + ".appearance"); return TRUE; } @@ -197,17 +197,17 @@ integer script_include(integer slot, key npc, list command) { if(llGetInventoryType(llList2String(command, 1) + ".path") != INVENTORY_NOTECARD) { - llSay(0, "Cant find path '" + llList2String(command, 1) + "'."); + llSay(0, "Cant find path '" + llList2String(command, 1) + "'."); return FALSE; } - + integer newLine = llList2Integer(command, 2); - + string newnc = osStringReplace(osGetNotecard(llList2String(command, 1) + ".path"), "\n", ""); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".path", newnc); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".line", newLine); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".ncname", llList2String(command, 1) + ".path"); - + return TRUE; } @@ -215,12 +215,12 @@ integer script_include(integer slot, key npc, list command) doNextScriptStep() { integer currentNPCSlot = 0; - + for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++) { if(!checkDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot)) continue; - + key currentNPCKey = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot); integer currentLine = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".line"); string currentPath = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".path"); @@ -235,33 +235,33 @@ doNextScriptStep() list currentNPCDataList = llGetObjectDetails(currentNPCKey, [OBJECT_POS]); vector currentNPCPosition = llList2Vector(currentNPCDataList, 0); - + if(currentState == "wait") { integer waitTime = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".waittime"); - + if(llGetUnixTime() < waitTime) continue; - + m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".state", ""); } - + if(currentState == "walk") { vector targetPosition = (vector)getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".targetPosition"); - + if(llGetListLength(currentNPCDataList) == 0) hardReset(); if(llVecDist(lastKnownPos, currentNPCPosition) <= 0.5) hardReset(); - + if(llVecDist(currentNPCPosition, targetPosition) >= 1) continue; m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".state", ""); } - + currentLine = currentLine + 1; if(currentLine >= llGetListLength(pathLineData)) { @@ -272,7 +272,7 @@ doNextScriptStep() m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".position", currentNPCPosition); switch(llList2String(lineCommandData, 0)) - { + { case "create": if(!script_create(currentNPCSlot, currentNPCKey, lineCommandData)) llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); @@ -288,7 +288,7 @@ doNextScriptStep() case "sit": if(!script_sit(currentNPCSlot, currentNPCKey, lineCommandData)) llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); - break; + break; case "wait": if(!script_wait(currentNPCSlot, currentNPCKey, lineCommandData)) llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); @@ -308,7 +308,7 @@ doNextScriptStep() case "touch": if(!script_touch(currentNPCSlot, currentNPCKey, lineCommandData)) llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); - + currentNPCSlot--; break; case "goto": @@ -319,7 +319,7 @@ doNextScriptStep() if(script_appearance(currentNPCSlot, currentNPCKey, lineCommandData)) currentNPCSlot--; break; - default: + default: llSay(0, "Unknown command '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); } } @@ -331,7 +331,7 @@ readNPCPathNC(string ncName) { string nc = osStringReplace(osGetNotecard(ncName), "\n", ""); integer npcslot = getNextFreeNPCSlot(); - + m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + npcslot, NULL_KEY); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + npcslot + ".path", nc); m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + npcslot + ".ncname", ncName); @@ -340,13 +340,13 @@ readNPCPathNC(string ncName) integer getNextFreeNPCSlot() { integer currentNPCSlot = 0; - + for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++) { if(!checkDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot)) return currentNPCSlot; } - + return 0; } @@ -358,9 +358,9 @@ readAllNPCPathNC() while(fullInventoryItemListCount--) { string itemElementName = llList2String(fullInventoryItemList, fullInventoryItemListCount); - + if(osStringEndsWith(llToLower(itemElementName), ".path", 1)) - readNPCPathNC(itemElementName); + readNPCPathNC(itemElementName); } } @@ -369,11 +369,11 @@ checkOSPermissions() key tempnpc = NULL_KEY; try{ tempnpc = osNpcCreate("Testi", "Test", llGetPos(), llGetOwner()); }catch(exception ex) { llOwnerSay("You need to enable osNpcCreate in your ossl configuration."); } try{ osNpcRemove(tempnpc); }catch(exception ex) { llOwnerSay("You need to enable osNpcRemove in your ossl configuration."); } - + try{ osMakeNotecard("Test" + llGetKey(), "Test"); }catch(exception ex) { llOwnerSay("You need to enable osMakeNotecard in your ossl configuration."); } try{ osGetNotecard("Test" + llGetKey()); }catch(exception ex) { llOwnerSay("You need to enable osGetNotecard in your ossl configuration."); } try{ osOwnerSaveAppearance("OwnerAppearance" + llGetKey()); }catch(exception ex) { llOwnerSay("You need to enable osOwnerSaveAppearance in your ossl configuration."); } - + llRemoveInventory("Test" + llGetKey()); llRemoveInventory("OwnerAppearance" + llGetKey()); } @@ -385,12 +385,10 @@ hardReset() while(dataListCount--) if(checkDataEntryInDataList(m_npcdata, "npc." + dataListCount)) osNpcRemove((key)getDataEntryFromDataList(m_npcdata, "npc." + dataListCount)); - + m_lastTimeCheck = 0; m_npcdata = []; osDeletePrivateDataValue("tmp." + llGetKey()); - - //llResetScript(); } //Generic Helpers