„Chris.MultiNPC.lsl“ ändern
This commit is contained in:
parent
50f2df716b
commit
5a3cb6c115
|
@ -16,68 +16,213 @@ yoptions;
|
||||||
list m_npcdata = [];
|
list m_npcdata = [];
|
||||||
integer m_lastTimeCheck = 0;
|
integer m_lastTimeCheck = 0;
|
||||||
|
|
||||||
default
|
readNPCPathNC(string ncName)
|
||||||
{
|
{
|
||||||
state_entry()
|
string nc = osStringReplace(osGetNotecard(ncName), "\n", "");
|
||||||
{
|
integer npcslot = getNextFreeNPCSlot();
|
||||||
removeOldNPC();
|
|
||||||
|
|
||||||
m_lastTimeCheck = llGetUnixTime();
|
|
||||||
checkOSPermissions();
|
|
||||||
readAllNPCPathNC();
|
|
||||||
|
|
||||||
state waitingForPlayers;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
integer getNextFreeNPCSlot()
|
||||||
|
{
|
||||||
|
integer currentNPCSlot = 0;
|
||||||
|
|
||||||
|
for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++)
|
||||||
|
{
|
||||||
|
if(!checkDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot))
|
||||||
|
return currentNPCSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
readAllNPCPathNC()
|
||||||
|
{
|
||||||
|
list fullInventoryItemList = osGetInventoryList();
|
||||||
|
integer fullInventoryItemListCount = llGetListLength(fullInventoryItemList);
|
||||||
|
|
||||||
|
while(fullInventoryItemListCount--)
|
||||||
|
{
|
||||||
|
string itemElementName = llList2String(fullInventoryItemList, fullInventoryItemListCount);
|
||||||
|
|
||||||
|
if(osStringEndsWith(llToLower(itemElementName), ".path", 1))
|
||||||
|
readNPCPathNC(itemElementName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state waitingForPlayers
|
createNPCTempStorage()
|
||||||
{
|
{
|
||||||
state_entry()
|
list npcKeys = [];
|
||||||
|
|
||||||
|
integer currentNPCSlot = 0;
|
||||||
|
for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++)
|
||||||
{
|
{
|
||||||
llSetTimerEvent(0.1);
|
key currentNPCKey = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot);
|
||||||
|
npcKeys += [currentNPCKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
timer()
|
osSetPrivateDataValue("tmpNPCList." + llGetKey(), llList2CSV(npcKeys));
|
||||||
{
|
|
||||||
llSetTimerEvent(2);
|
|
||||||
m_lastTimeCheck = llGetUnixTime();
|
|
||||||
if(getRealAgentCount() != 0)
|
|
||||||
state running;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
state running
|
removeOldNPC()
|
||||||
{
|
{
|
||||||
state_entry()
|
list npcdata = llCSV2List(osGetPrivateDataValue("tmpNPCList." + llGetKey()));
|
||||||
{
|
integer count = llGetListLength(npcdata);
|
||||||
llSetTimerEvent(0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
timer()
|
while(count--)osNpcRemove(llList2Key(npcdata, count));
|
||||||
{
|
}
|
||||||
if((m_lastTimeCheck + 2) <= llGetUnixTime())
|
|
||||||
hardReset("script timeout");
|
|
||||||
|
|
||||||
m_lastTimeCheck = llGetUnixTime();
|
hardReset(string message)
|
||||||
|
{
|
||||||
if(getRealAgentCount() == 0)
|
if(message != "")
|
||||||
hardReset("region empty");
|
llSay(0, "Hard reset: " + message);
|
||||||
|
|
||||||
doNextScriptStep();
|
|
||||||
}
|
|
||||||
|
|
||||||
changed(integer change)
|
|
||||||
{
|
|
||||||
if (change & CHANGED_INVENTORY)
|
|
||||||
hardReset("");
|
|
||||||
|
|
||||||
if (change & CHANGED_REGION_START)
|
|
||||||
hardReset("");
|
|
||||||
}
|
|
||||||
|
|
||||||
on_rez(integer start_param)
|
llSetTimerEvent(0);
|
||||||
|
integer dataListCount = llGetListLength(m_npcdata);
|
||||||
|
while(dataListCount--)
|
||||||
|
if(checkDataEntryInDataList(m_npcdata, "npc." + dataListCount))
|
||||||
|
osNpcRemove((key)getDataEntryFromDataList(m_npcdata, "npc." + dataListCount));
|
||||||
|
|
||||||
|
llResetScript();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Script Engine
|
||||||
|
doNextScriptStep()
|
||||||
|
{
|
||||||
|
integer currentNPCSlot = 0;
|
||||||
|
|
||||||
|
for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++)
|
||||||
{
|
{
|
||||||
hardReset("");
|
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");
|
||||||
|
string currentState = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".state");
|
||||||
|
string currentncname = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".ncname");
|
||||||
|
|
||||||
|
list pathLineData = llParseString2List(currentPath, [";"], []);
|
||||||
|
string currentCommand = llList2String(pathLineData, currentLine);
|
||||||
|
list lineCommandData = llParseString2List(currentCommand, ["=", "|"], []);
|
||||||
|
|
||||||
|
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("NPC not found");
|
||||||
|
|
||||||
|
if(llVecDist(currentNPCPosition, targetPosition) >= 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".state", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
currentLine = currentLine + 1;
|
||||||
|
if(currentLine >= llGetListLength(pathLineData))
|
||||||
|
{
|
||||||
|
currentLine = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".line", currentLine);
|
||||||
|
|
||||||
|
if(llGetSubString(llList2String(lineCommandData, 0), 0, 0) == "%")
|
||||||
|
{
|
||||||
|
string storageKey = llMD5String(llList2String(lineCommandData, 0), 0);
|
||||||
|
string data = lineCommandData;
|
||||||
|
|
||||||
|
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".data." + storageKey, data);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.");
|
||||||
|
break;
|
||||||
|
case "remove":
|
||||||
|
if(!script_remove(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "say":
|
||||||
|
if(!script_say(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "sit":
|
||||||
|
if(!script_sit(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "wait":
|
||||||
|
if(!script_wait(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "stand":
|
||||||
|
if(!script_stand(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "walk":
|
||||||
|
if(!script_walk(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "fly":
|
||||||
|
if(!script_fly(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
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":
|
||||||
|
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":
|
||||||
|
if(script_goto(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
currentNPCSlot--;
|
||||||
|
break;
|
||||||
|
case "appearance":
|
||||||
|
if(script_appearance(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
currentNPCSlot--;
|
||||||
|
break;
|
||||||
|
case "animation":
|
||||||
|
if(!script_animation(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "stopAnimation":
|
||||||
|
if(!script_StopAnimation(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "profileImage":
|
||||||
|
if(!script_profileImage(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
case "profileText":
|
||||||
|
if(!script_profileText(currentNPCSlot, currentNPCKey, lineCommandData))
|
||||||
|
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
llSay(0, "Unknown command '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,230 +435,6 @@ integer script_include(integer slot, key npc, list command)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Internal functions
|
|
||||||
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");
|
|
||||||
string currentState = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".state");
|
|
||||||
string currentncname = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".ncname");
|
|
||||||
|
|
||||||
list pathLineData = llParseString2List(currentPath, [";"], []);
|
|
||||||
string currentCommand = llList2String(pathLineData, currentLine);
|
|
||||||
list lineCommandData = llParseString2List(currentCommand, ["=", "|"], []);
|
|
||||||
|
|
||||||
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("NPC not found");
|
|
||||||
|
|
||||||
if(llVecDist(currentNPCPosition, targetPosition) >= 1)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".state", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
currentLine = currentLine + 1;
|
|
||||||
if(currentLine >= llGetListLength(pathLineData))
|
|
||||||
{
|
|
||||||
currentLine = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".line", currentLine);
|
|
||||||
|
|
||||||
if(llGetSubString(llList2String(lineCommandData, 0), 0, 0) == "%")
|
|
||||||
{
|
|
||||||
string storageKey = llMD5String(llList2String(lineCommandData, 0), 0);
|
|
||||||
string data = lineCommandData;
|
|
||||||
|
|
||||||
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".data." + storageKey, data);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.");
|
|
||||||
break;
|
|
||||||
case "remove":
|
|
||||||
if(!script_remove(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "say":
|
|
||||||
if(!script_say(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "sit":
|
|
||||||
if(!script_sit(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "wait":
|
|
||||||
if(!script_wait(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "stand":
|
|
||||||
if(!script_stand(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "walk":
|
|
||||||
if(!script_walk(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "fly":
|
|
||||||
if(!script_fly(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
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":
|
|
||||||
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":
|
|
||||||
if(script_goto(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
currentNPCSlot--;
|
|
||||||
break;
|
|
||||||
case "appearance":
|
|
||||||
if(script_appearance(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
currentNPCSlot--;
|
|
||||||
break;
|
|
||||||
case "animation":
|
|
||||||
if(!script_animation(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "stopAnimation":
|
|
||||||
if(!script_StopAnimation(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "profileImage":
|
|
||||||
if(!script_profileImage(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
case "profileText":
|
|
||||||
if(!script_profileText(currentNPCSlot, currentNPCKey, lineCommandData))
|
|
||||||
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
llSay(0, "Unknown command '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
integer getNextFreeNPCSlot()
|
|
||||||
{
|
|
||||||
integer currentNPCSlot = 0;
|
|
||||||
|
|
||||||
for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++)
|
|
||||||
{
|
|
||||||
if(!checkDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot))
|
|
||||||
return currentNPCSlot;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
readAllNPCPathNC()
|
|
||||||
{
|
|
||||||
list fullInventoryItemList = osGetInventoryList();
|
|
||||||
integer fullInventoryItemListCount = llGetListLength(fullInventoryItemList);
|
|
||||||
|
|
||||||
while(fullInventoryItemListCount--)
|
|
||||||
{
|
|
||||||
string itemElementName = llList2String(fullInventoryItemList, fullInventoryItemListCount);
|
|
||||||
|
|
||||||
if(osStringEndsWith(llToLower(itemElementName), ".path", 1))
|
|
||||||
readNPCPathNC(itemElementName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
hardReset(string message)
|
|
||||||
{
|
|
||||||
if(message != "")
|
|
||||||
llSay(0, "Hard reset: " + message);
|
|
||||||
|
|
||||||
llSetTimerEvent(0);
|
|
||||||
integer dataListCount = llGetListLength(m_npcdata);
|
|
||||||
while(dataListCount--)
|
|
||||||
if(checkDataEntryInDataList(m_npcdata, "npc." + dataListCount))
|
|
||||||
osNpcRemove((key)getDataEntryFromDataList(m_npcdata, "npc." + dataListCount));
|
|
||||||
|
|
||||||
llResetScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
createNPCTempStorage()
|
|
||||||
{
|
|
||||||
list npcKeys = [];
|
|
||||||
|
|
||||||
integer currentNPCSlot = 0;
|
|
||||||
for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++)
|
|
||||||
{
|
|
||||||
key currentNPCKey = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot);
|
|
||||||
npcKeys += [currentNPCKey];
|
|
||||||
}
|
|
||||||
|
|
||||||
osSetPrivateDataValue("tmpNPCList." + llGetKey(), llList2CSV(npcKeys));
|
|
||||||
}
|
|
||||||
|
|
||||||
removeOldNPC()
|
|
||||||
{
|
|
||||||
list npcdata = llCSV2List(osGetPrivateDataValue("tmpNPCList." + llGetKey()));
|
|
||||||
integer count = llGetListLength(npcdata);
|
|
||||||
|
|
||||||
while(count--)osNpcRemove(llList2Key(npcdata, count));
|
|
||||||
}
|
|
||||||
|
|
||||||
//Generic Helpers
|
//Generic Helpers
|
||||||
integer getRealAgentCount()
|
integer getRealAgentCount()
|
||||||
{
|
{
|
||||||
|
@ -543,4 +464,95 @@ list setDataEntryInDataList(list _dataList, string _key, string _value)
|
||||||
return _dataList;
|
return _dataList;
|
||||||
}
|
}
|
||||||
return llListReplaceList(_dataList, [_value], _inListPosition + 1, _inListPosition + 1);
|
return llListReplaceList(_dataList, [_value], _inListPosition + 1, _inListPosition + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
default
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
removeOldNPC();
|
||||||
|
|
||||||
|
m_lastTimeCheck = llGetUnixTime();
|
||||||
|
readAllNPCPathNC();
|
||||||
|
|
||||||
|
state waitingForPlayers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state waitingForPlayers
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
llSetTimerEvent(0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
timer()
|
||||||
|
{
|
||||||
|
llSetTimerEvent(2);
|
||||||
|
m_lastTimeCheck = llGetUnixTime();
|
||||||
|
if(getRealAgentCount() != 0)
|
||||||
|
state running;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state running
|
||||||
|
{
|
||||||
|
state_entry()
|
||||||
|
{
|
||||||
|
llSetTimerEvent(0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
touch_start(integer i)
|
||||||
|
{
|
||||||
|
if(llDetectedKey(0) != llGetOwner())
|
||||||
|
return;
|
||||||
|
|
||||||
|
osEasyDialog(llDetectedKey(0), "", ["Stop all", "Restart", "Start all"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
listen( integer channel, string name, key id, string message)
|
||||||
|
{
|
||||||
|
if(message == "Stop all")
|
||||||
|
{
|
||||||
|
llSetTimerEvent(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message == "Start all")
|
||||||
|
{
|
||||||
|
m_lastTimeCheck = llGetUnixTime();
|
||||||
|
llSetTimerEvent(0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message == "Restart")
|
||||||
|
{
|
||||||
|
hardReset("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
timer()
|
||||||
|
{
|
||||||
|
if((m_lastTimeCheck + 2) <= llGetUnixTime())
|
||||||
|
hardReset("script timeout");
|
||||||
|
|
||||||
|
m_lastTimeCheck = llGetUnixTime();
|
||||||
|
|
||||||
|
if(getRealAgentCount() == 0)
|
||||||
|
hardReset("region empty");
|
||||||
|
|
||||||
|
doNextScriptStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
changed(integer change)
|
||||||
|
{
|
||||||
|
if (change & CHANGED_INVENTORY)
|
||||||
|
hardReset("");
|
||||||
|
|
||||||
|
if (change & CHANGED_REGION_START)
|
||||||
|
hardReset("");
|
||||||
|
}
|
||||||
|
|
||||||
|
on_rez(integer start_param)
|
||||||
|
{
|
||||||
|
hardReset("");
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue