„Chris.MultiNPC.lsl“ ändern

This commit is contained in:
Christopher 2021-01-30 18:07:56 +00:00
parent d3c849410b
commit 0c3bba4ed9
1 changed files with 57 additions and 3 deletions

View File

@ -14,18 +14,37 @@ yoptions;
// Read the readme at https://clatza.dev/Christopher/OpenSim.Script.Chris.MultiNPC/src/branch/master/README.md // Read the readme at https://clatza.dev/Christopher/OpenSim.Script.Chris.MultiNPC/src/branch/master/README.md
//=================== //===================
list m_npcdata = []; list m_npcdata = [];
integer m_lastTimeCheck = 0;
default default
{ {
state_entry() state_entry()
{ {
m_lastTimeCheck = llGetUnixTime();
checkOSPermissions(); checkOSPermissions();
readAllNPCPathNC(); readAllNPCPathNC();
state running; state waitingForPlayers;
} }
} }
state waitingForPlayers
{
state_entry()
{
llSetTimerEvent(0.1);
}
timer()
{
llSetTimerEvent(2);
m_lastTimeCheck = llGetUnixTime();
llOwnerSay(getRealAgentCount());
if(getRealAgentCount() != 0)
state running;
}
}
state running state running
{ {
state_entry() state_entry()
@ -35,6 +54,14 @@ state running
timer() timer()
{ {
if((m_lastTimeCheck + 2) <= llGetUnixTime())
hardReset();
m_lastTimeCheck = llGetUnixTime();
if(getRealAgentCount() == 0)
hardReset();
doNextScriptStep(); doNextScriptStep();
} }
@ -154,6 +181,23 @@ integer script_appearance(integer slot, key npc, list command)
return TRUE; return TRUE;
} }
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) + "'.");
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;
}
//Internal functions //Internal functions
doNextScriptStep() doNextScriptStep()
@ -234,6 +278,10 @@ doNextScriptStep()
if(!script_walk(currentNPCSlot, currentNPCKey, lineCommandData)) if(!script_walk(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
break; break;
case "include":
if(!script_include(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
break;
case "touch": case "touch":
if(!script_touch(currentNPCSlot, currentNPCKey, lineCommandData)) if(!script_touch(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed."); llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
@ -317,6 +365,12 @@ hardReset()
} }
//Generic Helpers //Generic Helpers
integer getRealAgentCount()
{
list users = llGetAgentList(AGENT_LIST_EXCLUDENPC, []);
return llGetListLength(users);
}
integer checkDataEntryInDataList(list _dataList, string _key) integer checkDataEntryInDataList(list _dataList, string _key)
{ {
integer _inListPosition = llListFindList(_dataList, [_key]); integer _inListPosition = llListFindList(_dataList, [_key]);