„Chris.MultiNPC.XEngine.lsl“ löschen

This commit is contained in:
Christopher 2021-07-31 17:49:15 +00:00
parent c588d320df
commit fc9a22ad96
1 changed files with 0 additions and 482 deletions

View File

@ -1,482 +0,0 @@
//===================
//Version: 0.1.6
//Datum: 29.07.2021
//UpdateRAW: https://clatza.dev/Christopher/OpenSim.Script.Chris.MultiNPC/raw/branch/master/Chris.MultiNPC.lsl
//Made by: Chris Resident @ inc.li:8002
//Dependencies:
// - https://github.com/Sahrea/Chris.OS.Additions
//Bescheibung:
// Create and controll a hord of npc at once.
// Read the readme at https://clatza.dev/Christopher/OpenSim.Script.Chris.MultiNPC/src/branch/master/README.md
//===================
list m_npcdata = [];
integer m_lastTimeCheck = 0;
//Internal functions
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);
}
}
hardReset(string debugMessage)
{
llSay(0, debugMessage);
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];
}
osSetDataValue("tmpNPCList." + llGetKey(), llList2CSV(npcKeys));
}
removeOldNPC()
{
list npcdata = llCSV2List(osGetDataValue("tmpNPCList." + llGetKey()));
integer count = llGetListLength(npcdata);
while(count--)osNpcRemove(llList2Key(npcdata, count));
}
doNextScriptStep()
{
integer currentNPCSlot = 0;
for (currentNPCSlot = 0; currentNPCSlot < llGetListLength(m_npcdata); currentNPCSlot++)
{
if(checkDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot))
{
key currentNPCKey = getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot);
integer currentLine = (integer)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 = (integer)getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".waittime");
if(llGetUnixTime() > waitTime)
{
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".state", "");
currentNPCSlot--;
}
}else if(currentState == "walk")
{
vector targetPosition = (vector)getDataEntryFromDataList(m_npcdata, "npc." + currentNPCSlot + ".targetPosition");
if(llGetListLength(currentNPCDataList) == 0)
hardReset("ERROR: Calling HardReset(): NPC not found");
if(llVecDist(currentNPCPosition, targetPosition) <= 1)
{
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".state", "");
currentNPCSlot--;
}
}else{
currentLine = currentLine + 1;
if(currentLine >= llGetListLength(pathLineData))
{
currentLine = 0;
}
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + currentNPCSlot + ".line", (string)currentLine);
if(llList2String(lineCommandData, 0) == "goto")
if(script_goto(currentNPCSlot, currentNPCKey, lineCommandData))
currentNPCSlot--;
if(llList2String(lineCommandData, 0) == "create")
if(!script_create(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "remove")
if(!script_remove(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "say")
if(!script_say(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "sit")
if(!script_sit(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "wait")
if(!script_wait(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "stand")
if(!script_stand(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "walk")
if(!script_walk(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "include")
if(!script_include(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "touch")
if(!script_touch(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "appearance")
if(!script_appearance(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "animation")
if(!script_animation(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "stopAnimation")
if(!script_StopAnimation(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "profileImage")
if(!script_profileImage(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
if(llList2String(lineCommandData, 0) == "profileText")
if(!script_profileText(currentNPCSlot, currentNPCKey, lineCommandData))
llSay(0, "Script execution in '" + llList2String(lineCommandData, 0) + "' in nc '"+ currentncname +"' on line '" + currentLine + "' failed.");
}
}
}
}
//Generic Helpers
integer getRealAgentCount()
{
list users = llGetAgentList(AGENT_LIST_EXCLUDENPC, []);
return llGetListLength(users);
}
integer checkDataEntryInDataList(list _dataList, string _key)
{
integer _inListPosition = llListFindList(_dataList, [_key]);
if(_inListPosition == -1)return FALSE;
return TRUE;
}
string getDataEntryFromDataList(list _dataList, string _key)
{
integer _inListPosition = llListFindList(_dataList, [_key]);
if(_inListPosition == -1)return "";
return llList2String(_dataList, _inListPosition + 1);
}
list setDataEntryInDataList(list _dataList, string _key, string _value)
{
integer _inListPosition = llListFindList(_dataList, [_key]);
if(_inListPosition == -1){
_dataList += [_key, _value];
return _dataList;
}
return llListReplaceList(_dataList, [_value], _inListPosition + 1, _inListPosition + 1);
}
//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) + "'.");
return FALSE;
}
if(llGetInventoryType(llList2String(command, 3) + ".appearance") != INVENTORY_NOTECARD)
{
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);
createNPCTempStorage();
return TRUE;
}
integer script_remove(integer slot, key npc, list command)
{
if(npc != NULL_KEY)
osNpcRemove(npc);
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) + "'.");
return FALSE;
}
osNpcSit(npc, llList2Key(objects, 0), OS_NPC_SIT_NOW);
return TRUE;
}
integer script_stand(integer slot, key npc, list command)
{
osNpcStand(npc);
return TRUE;
}
integer script_wait(integer slot, key npc, list command)
{
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".state", "wait");
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".waittime", (string)(llGetUnixTime() + (integer)llList2String(command, 1)));
return TRUE;
}
integer script_walk(integer slot, key npc, list command)
{
vector targetPosition = <0, 0, 0>;
if(llList2Vector(command, 1) == <0, 0, 0>)
{
list objects = osGetSearchableObjectList(llList2String(command, 1));
if(llGetListLength(objects) == 0)
{
llSay(0, "Cant find the walk target '" + llList2String(command, 1) + "'.");
return FALSE;
}
list targetDataList = llGetObjectDetails(llList2Key(objects, 0), [OBJECT_POS]);
targetPosition = llList2Vector(targetDataList, 0);
}else{
targetPosition = llList2Vector(command, 1);
}
osNpcMoveToTarget(npc, targetPosition, OS_NPC_NO_FLY);
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".state", "walk");
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".targetPosition", (string)targetPosition);
return TRUE;
}
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) + "'.");
return FALSE;
}
osNpcTouch(npc, llList2Key(objects, 0), LINK_THIS);
return TRUE;
}
integer script_goto(integer slot, key npc, list command)
{
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".line", (string)((integer)llList2String(command, 1) - 1));
return TRUE;
}
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) + "'.");
return FALSE;
}
osNpcLoadAppearance(npc, llList2String(command, 1) + ".appearance");
return TRUE;
}
integer script_animation(integer slot, key npc, list command)
{
if(llGetInventoryType(llList2String(command, 1)) != INVENTORY_ANIMATION)
{
llSay(0, "Cant find animation '" + llList2String(command, 1) + "'.");
return FALSE;
}
osNpcPlayAnimation(npc, llList2String(command, 1));
return TRUE;
}
integer script_StopAnimation(integer slot, key npc, list command)
{
if(llGetInventoryType(llList2String(command, 1)) != INVENTORY_ANIMATION)
{
llSay(0, "Cant find animation '" + llList2String(command, 1) + "'.");
return FALSE;
}
osNpcStopAnimation(npc, llList2String(command, 1));
return TRUE;
}
integer script_profileImage(integer slot, key npc, list command)
{
if(llGetInventoryType(llList2String(command, 1)) != INVENTORY_TEXTURE)
{
llSay(0, "Cant find image '" + llList2String(command, 1) + "'.");
return FALSE;
}
osNpcSetProfileImage(npc, llList2String(command, 1));
return TRUE;
}
integer script_profileText(integer slot, key npc, list command)
{
osNpcSetProfileAbout(npc, llList2String(command, 1));
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", (string)newLine);
m_npcdata = setDataEntryInDataList(m_npcdata, "npc." + slot + ".ncname", llList2String(command, 1) + ".path");
return TRUE;
}
//States
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);
}
timer()
{
if((m_lastTimeCheck + 2) <= llGetUnixTime())
hardReset("ERROR: Calling HardReset(): Script timeout");
m_lastTimeCheck = llGetUnixTime();
if(getRealAgentCount() == 0)
hardReset("ERROR: Calling HardReset(): No real agents found");
doNextScriptStep();
}
changed(integer change)
{
if (change & CHANGED_INVENTORY)
hardReset("CHANGED_INVENTORY");
if (change & CHANGED_REGION_START)
hardReset("CHANGED_REGION_START");
}
on_rez(integer start_param)
{
hardReset("on_rez");
}
}