Advertisement
Guest User

Untitled

a guest
Sep 4th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Area Codes:
  2. integer AREA_SPAWN                  = -1;
  3. integer AREA_SCHL_ISLAND            = -2;
  4. integer AREA_SHRINE_ISLAND          = -3;
  5. integer AREA_SCHL_ISLAND_TEMP       = -4;
  6.  
  7. integer AREA_CAMPUS_SPORTSHALL      = -10;
  8. integer AREA_CAMPUS_SWIMHALL        = -11;
  9. integer AREA_CAMPUS_BEHIND_SWIMHALL = -12;
  10. integer AREA_CAMPUS_BEHIND_SCHOOL   = -13;
  11. integer AREA_CAMPUS_SCHL_ROOF       = -14;
  12. integer AREA_CAMPUS_SCHL_FRONT      = -15;
  13. integer AREA_CAMPUS_PLAYINGFIELDS   = -16;
  14. integer AREA_CAMPUS_PATH_WATERFALL  = -17;
  15. integer AREA_CAMPUS_PATH_UPPER      = -18;
  16.  
  17. integer AREA_SCHL_G_HALL            = 0;
  18. integer AREA_SCHL_G_CLASS_1_A       = 1;
  19. integer AREA_SCHL_G_NURSE           = 2;
  20. integer AREA_SCHL_G_CLASS_1_B       = 3;
  21. integer AREA_SCHL_G_LAB             = 4;
  22. integer AREA_SCHL_G_BOYS_LAV        = 5;
  23. integer AREA_SCHL_G_GIRLS_LAV       = 6;
  24. integer AREA_SCHL_G_TEACHOFFICE     = 7;
  25.  
  26. integer AREA_SCHL_1_HALL            = 10;
  27. integer AREA_SCHL_1_ARTROOM         = 11;
  28.  
  29. integer AREA_SCHL_2_HALL            = 21;
  30. integer AREA_SCHL_2_CLUBROOM        = 22;
  31. integer AREA_SCHL_2_TATAMI          = 23;
  32.  
  33. integer AREA_SCHL_U_HALL            = 30;
  34. integer AREA_SCHL_U_CHANGE_F        = 31;
  35. integer AREA_SCHL_U_CHANGE_M        = 32;
  36. integer AREA_SCHL_U_SWIMHALL        = 33;
  37. integer AREA_SCHL_U_SPORTSHALL      = 34;
  38. integer AREA_SCHL_U_BEACH           = 35;
  39. integer AREA_SCHL_U_LIBRARY         = 36;
  40. integer AREA_SCHL_U_RUNNINGTRACK    = 37;
  41.  
  42. integer AREA_SCHL_ROOF              = 40;
  43. integer AREA_TOWN                   = 50;
  44.  
  45. integer AREA_OOB                 = 100;
  46. integer AREA_NEXT_TO_QUERY       = 101;
  47.  
  48. string getFirstName(key agent)
  49. {
  50.     string firstName =  llList2String(llParseString2List(llGetDisplayName(agent),[" "], []), 0);
  51.     string link = "[secondlife:///app/agent/" + (string)agent + "/about " + firstName +"]";
  52.     return link;
  53. }
  54.  
  55. // Returns TRUE if the Specified key of an inworld object or agent is within specified distance
  56. // of the other specified object/agent.
  57. integer keyIsInRangeOfKey(key x, key y, float max_distance)
  58. {
  59.     vector posX = llList2Vector(llGetObjectDetails(x, [OBJECT_POS]), 0);
  60.     vector posY = llList2Vector(llGetObjectDetails(y, [OBJECT_POS]), 0);
  61.     float  distance = llVecDist(posX, posY);
  62.     return (distance < max_distance);
  63. }
  64.  
  65. integer getAreaCodeOfInworldKey(key object)
  66. {
  67.    
  68.    
  69.     list objectDetails = llGetObjectDetails(object, [OBJECT_POS]);
  70.     vector objectPos = llList2Vector(objectDetails, 0);
  71.  
  72.     if (vectorsWithinBoundaries(objectPos,  <89, 111, 3485>,<123, 143, 3500>))      return AREA_SPAWN;
  73.     if (vectorsWithinBoundaries(objectPos, <43, 49, 3512>,<177, 161, 3520>))        return AREA_SCHL_ISLAND;
  74.     if (vectorsWithinBoundaries(objectPos, <49, 124, 3514>, <118, 188, 3554>))      return AREA_SHRINE_ISLAND;
  75.     if (vectorsWithinBoundaries(objectPos, <74, 66, 2738>, <202, 198, 2803>))       return AREA_SCHL_G_HALL;
  76.     if (vectorsWithinBoundaries(objectPos, <189, 9, 2637>, <255, 75, 2699>))        return AREA_SCHL_G_CLASS_1_A;
  77.     if (vectorsWithinBoundaries(objectPos,<17, 220, 2870>,<27, 242, 2875>))         return AREA_SCHL_G_CLASS_1_B;
  78.     if (vectorsWithinBoundaries(objectPos, <0, 9, 2636>, <64, 75, 2702>))           return AREA_SCHL_G_NURSE;
  79.     if (vectorsWithinBoundaries(objectPos,<16, 219, 2462>,<27, 242, 2470>))         return AREA_SCHL_G_LAB;
  80.     if (vectorsWithinBoundaries(objectPos,<215, 41, 2868>,<229, 53, 2875>))         return AREA_SCHL_G_BOYS_LAV;
  81.     if (vectorsWithinBoundaries(objectPos,<216, 212, 2869>,<231, 227, 2875>))       return AREA_SCHL_G_GIRLS_LAV;
  82.     if (vectorsWithinBoundaries(objectPos,<30, 47, 2879>,<44, 61, 2886>))           return AREA_SCHL_G_TEACHOFFICE;
  83.     if (vectorsWithinBoundaries(objectPos, <127, 1, 3134>, <255, 131, 3203>))       return AREA_SCHL_1_HALL;
  84.     if (vectorsWithinBoundaries(objectPos,<73, 197, 2244>,<88, 221, 2252>))         return AREA_SCHL_1_ARTROOM;
  85.     if (vectorsWithinBoundaries(objectPos, <88, 29, 2435>, <152, 97, 2498>))        return AREA_SCHL_2_HALL;
  86.     if (vectorsWithinBoundaries(objectPos, <0, 197, 2637>, <70, 249, 2701>))        return AREA_SCHL_2_CLUBROOM;
  87.     if (vectorsWithinBoundaries(objectPos, <180, 194, 2632>, <244, 254, 2699>))     return AREA_SCHL_2_TATAMI;
  88.     if (vectorsWithinBoundaries(objectPos, <110, 94, 2545>, <160, 165, 2557>))      return AREA_SCHL_U_HALL;
  89.     if (vectorsWithinBoundaries(objectPos, <75, 67, 2319>, <202, 195, 2383>))       return AREA_SCHL_U_SPORTSHALL;
  90.     if (vectorsWithinBoundaries(objectPos, <111, 20, 250>, <176, 88, 312>))         return AREA_SCHL_U_CHANGE_M;
  91.     if (vectorsWithinBoundaries(objectPos, <102, 196, 244>, <174, 255, 314>))       return AREA_SCHL_U_CHANGE_F;
  92.     if (vectorsWithinBoundaries(objectPos, <24, 62, 78>, <156, 190, 144>))          return AREA_SCHL_U_SWIMHALL;
  93.     if (vectorsWithinBoundaries(objectPos, <164, 87, 90>,<256,256, 144>))           return AREA_SCHL_U_BEACH;
  94.     if (vectorsWithinBoundaries(objectPos, <111,94,1997>,<127,112,2006>))           return AREA_SCHL_U_LIBRARY;
  95.     if (vectorsWithinBoundaries(objectPos, <83, 45, 3504>,<185, 95, 3512>))         return AREA_SCHL_U_RUNNINGTRACK;
  96.     if (vectorsWithinBoundaries(objectPos,<94, 52, 3522>,<167, 73, 3531>))          return AREA_SCHL_ROOF;
  97.     if (vectorsWithinBoundaries(objectPos,<144, 49, 3522>,<168, 126, 3529>))        return AREA_SCHL_ROOF;
  98.     if (vectorsWithinBoundaries(objectPos,<62, 10, 188>,<255, 195, 238> ))          return AREA_SCHL_ISLAND_TEMP;
  99.     if (objectPos.z > 3702.46851 && objectPos.z < 3800.88062)
  100.     {
  101.         // school island elevation
  102.         if (pointInPolygon2D(
  103.             [   <126.68137, 163.59354, 3725.47144>,
  104.                 <164.68138, 199.59355, 3725.47144>,
  105.                 <213.68140, 168.59354, 3725.47144>,
  106.                 <198.94476, 154.28842, 3725.47144>,
  107.                 <166.86684, 120.03532, 3725.47144>],objectPos))
  108.         {
  109.             return AREA_CAMPUS_SPORTSHALL;
  110.         }
  111.  
  112.         if (pointInPolygon2D(
  113.             [   <166.86684, 120.03532, 3725.47144>,
  114.                 <198.94476, 154.28842, 3725.47144>,
  115.                 <244.04672, 112.50847, 3725.47144>,
  116.                 <230.45094, 98.22456, 3725.47144>,
  117.                 <221.81561, 90.20335, 3725.47144>,
  118.                 <197.33490, 89.07121, 3725.47144>,
  119.                 <181.33490, 105.07121, 3725.47144>],objectPos))
  120.         {
  121.             return AREA_CAMPUS_SWIMHALL;
  122.         }
  123.  
  124.         if (pointInPolygon2D(
  125.             [   <198.94476, 154.28842, 3725.47144>,
  126.                 <213.68140, 168.59354, 3725.47144>,
  127.                 <246.65353, 142.59352, 3725.47144>,
  128.                 <255.99989, 120.08074, 3725.47144>,
  129.                 <244.04672, 112.50847, 3725.47144>],objectPos))
  130.         {
  131.             return AREA_CAMPUS_BEHIND_SWIMHALL;
  132.         }
  133.         if (pointInPolygon2D(
  134.             [   <221.81561, 90.20335, 3725.47144>,
  135.                 <230.45094, 98.22456, 3725.47144>,
  136.                 <244.04672, 112.50847, 3725.47144>,
  137.                 <255.99989, 120.08074, 3725.47144>,
  138.                 <255.99989, 1.24182, 3725.47144>,
  139.                 <156.50966, 1.24182, 3725.47144>,
  140.                 <157.74673, 27.73151, 3725.47144>,
  141.                 <234.27251, 15.24077, 3737.43677>,
  142.                 <234.27251, 85.24081, 3737.43677>,
  143.                 <222.35016, 85.24081, 3737.43677>],objectPos))
  144.         {
  145.             return AREA_CAMPUS_BEHIND_SCHOOL;
  146.         }
  147.         if (pointInPolygon2D(
  148.             [   <223.00177, 87.65993, 3737.43677>,
  149.                 <234.92412, 87.65993, 3737.43677>,
  150.                 <234.27251, 15.24077, 3737.43677>,
  151.                 <163.27249, 15.24077, 3740.26807>,
  152.                 <163.27249, 27.34009, 3740.26807>,
  153.                 <207.11124, 27.73151, 3725.47144>,
  154.                 <221.81561, 43.24079, 3725.47144>],objectPos))
  155.         {
  156.             return AREA_CAMPUS_SCHL_ROOF;
  157.         }
  158.  
  159.         if (pointInPolygon2D(
  160.             [   <197.33490, 89.07121, 3725.47144>,
  161.                 <221.81561, 90.20335, 3725.47144>,
  162.                 <221.81561, 43.24079, 3725.47144>,
  163.                 <207.11124, 27.73151, 3725.47144>,
  164.                 <157.74673, 27.73151, 3725.47144>,
  165.                 <160.71823, 47.95562, 3725.47144>,
  166.                 <176.35391, 47.17129, 3725.47144>,
  167.                 <202.77271, 72.99124, 3725.47144>],objectPos))
  168.         {
  169.             return AREA_CAMPUS_SCHL_FRONT;
  170.         }
  171.  
  172.         if (pointInPolygon2D(
  173.             [   <160.71823, 47.95562, 3725.47144>,
  174.                 <157.74673, 27.73151, 3725.47144>,
  175.                 <156.50966, 1.24182, 3725.47144>,
  176.                 <111.97806, 17.47293, 3725.47144>,
  177.                 <45.97804, 77.47295, 3725.47144>,
  178.                 <83.74670, 132.17133, 3725.47144>,
  179.                 <130.74672, 90.17131, 3725.47144>,
  180.                 <152.74673, 72.17130, 3725.47144>],objectPos))
  181.         {
  182.             return AREA_CAMPUS_PLAYINGFIELDS;
  183.         }
  184.  
  185.         if (pointInPolygon2D(
  186.             [<83.74670, 132.17133, 3725.47144>,
  187.             <126.68137, 163.59354, 3725.47144>,
  188.             <166.86684, 120.03532, 3725.47144>,
  189.             <181.33490, 105.07121, 3725.47144>,
  190.             <152.74673, 72.17130, 3725.47144>,
  191.             <130.74672, 90.17131, 3725.47144>],objectPos))
  192.         {
  193.             return AREA_CAMPUS_PATH_WATERFALL;
  194.         }
  195.  
  196.         if (pointInPolygon2D(
  197.             [   <181.33490, 105.07121, 3725.47144>,
  198.                 <197.33490, 89.07121, 3725.47144>,
  199.                 <202.77271, 72.99124, 3725.47144>,
  200.                 <176.35391, 47.17129, 3725.47144>,
  201.                 <160.71823, 47.95562, 3725.47144>,
  202.                 <152.74673, 72.17130, 3725.47144>],objectPos))
  203.         {
  204.             return AREA_CAMPUS_PATH_UPPER;
  205.         }
  206.  
  207.         if(pointInPolygon2D(
  208.             [   <83.74670, 132.17133, 3720.72314>,
  209.                 <47.50000, 98.00000, 3720.72314>,
  210.                 <0.00000, 101.00000, 3720.72314>,
  211.                 <0.00000, 255.99989, 3762.38184>,
  212.                 <155.06046, 255.99989, 3762.38184>,
  213.                 <155.06046, 201.90329, 3762.38184>,
  214.                 <126.68137, 163.59354, 3720.72314>],objectPos))
  215.         {
  216.             return AREA_TOWN;
  217.         }
  218.     }
  219.  
  220.  
  221.  
  222.     return AREA_OOB; // 100
  223. }
  224.  
  225. integer vectorsWithinBoundaries(vector vec, vector lowest, vector highest)
  226. {
  227.     // Checks the vector is within the boundaries assuming that
  228.     // lowest vector has lowest x, y z values, and highest vector
  229.     // has highest x, y z values
  230.     //
  231.     // Checks Z first for faster execution as Z is most likely to be
  232.     // out of range
  233.  
  234.     // lower checks
  235.     if (vec.z < lowest.z) return FALSE;
  236.     if (vec.x < lowest.x) return FALSE;
  237.     if (vec.y < lowest.y) return FALSE;
  238.  
  239.     // higher checks
  240.     if (vec.z > highest.z) return FALSE;
  241.     if (vec.x > highest.x) return FALSE;
  242.     if (vec.y > highest.y) return FALSE;
  243.    
  244.     return TRUE;
  245. }
  246.  
  247.  
  248. // Returns TRUE if Vector is within boundaries ignoring z axis
  249. integer pointInPolygon2D( list polygon, vector point ){
  250.     integer vBooInPlygn;
  251.     integer vIntCounter = [] != polygon;
  252.     vector  vPosVertexA = llList2Vector( polygon, vIntCounter );
  253.     vector  vPosVertexB;
  254.  
  255.     while (vIntCounter){
  256.         vPosVertexB = vPosVertexA;
  257.         vPosVertexA = llList2Vector( polygon, ++vIntCounter );
  258.  
  259.         if ((vPosVertexA.y > point.y) ^ (vPosVertexB.y > point.y)){
  260.             if (point.x < (vPosVertexB.x - vPosVertexA.x) * (point.y - vPosVertexA.y) /
  261.                                  (vPosVertexB.y - vPosVertexA.y) +  vPosVertexA.x ){
  262.                 vBooInPlygn = !vBooInPlygn;
  263.             }
  264.         }
  265.     }
  266.     return vBooInPlygn;
  267. }
  268.  
  269. string isLocationString(integer code)
  270. {
  271.     // EG:
  272.     // "Reisen, Jinx and Ishiko are " + isLocationString(AREA_SCHL_U_SWIMHALL);
  273.     // returns Reisen, Jinx and Ishiko are in the Swimmingpool.
  274.     if (code == AREA_SPAWN) return "at the Spawn";
  275.     if (code == AREA_SCHL_ISLAND) return "on the School Island";
  276.     // TODO: Running Track, School Roof
  277.     if (code == AREA_SHRINE_ISLAND)         return "on the Shrine Island";
  278.     if (code == AREA_SCHL_G_HALL)           return "in the Ground Floor Corridor";
  279.     if (code == AREA_SCHL_G_CLASS_1_A)      return "in Classroom 1-A";
  280.     if (code == AREA_SCHL_G_NURSE)          return "in the Nurse's Office";
  281.     if (code == AREA_SCHL_G_CLASS_1_B)      return "in Classroom 1-B";
  282.     if (code == AREA_SCHL_G_LAB)            return "in the Lab";
  283.     if (code == AREA_SCHL_G_BOYS_LAV)       return "in the Boys Toilets";
  284.     if (code == AREA_SCHL_G_GIRLS_LAV)      return "in the Girls Toilets";
  285.     if (code == AREA_SCHL_G_TEACHOFFICE)    return "in the Teacher's Office";
  286.     if (code == AREA_SCHL_1_HALL)           return "in the 1st Floor Corridor";
  287.     if (code == AREA_SCHL_1_ARTROOM)        return "in the Art room";
  288.     if (code == AREA_SCHL_2_HALL)           return "in the 2nd Floor Corridor";
  289.     if (code == AREA_SCHL_2_CLUBROOM)       return "in the Clubroom";
  290.     if (code == AREA_SCHL_2_TATAMI)         return "in the Tatami room";
  291.     if (code == AREA_SCHL_U_HALL)           return "in the Underground Corridor";
  292.     if (code == AREA_SCHL_U_SPORTSHALL)     return "in the Sports hall";
  293.     if (code == AREA_SCHL_U_CHANGE_M)       return "in the Male changing room";
  294.     if (code == AREA_SCHL_U_CHANGE_F)       return "in the Female changing room";
  295.     if (code == AREA_SCHL_U_SWIMHALL)       return "at the Swimming Pool";
  296.     if (code == AREA_SCHL_U_BEACH)          return "at the Beach";
  297.     if (code == AREA_SCHL_U_LIBRARY)        return "in the Library";
  298.     if (code == AREA_SCHL_U_RUNNINGTRACK)   return "on the Athletics Track";
  299.     if (code == AREA_SCHL_ROOF)             return "on the School Roof";
  300.     if (code == AREA_SCHL_ISLAND_TEMP)      return "on the WIP School Island (See sign at spawn)";
  301.     if (code == AREA_NEXT_TO_QUERY)         return "next to you";
  302.     if (code == AREA_CAMPUS_SPORTSHALL)     return "outside the Sports Hall";
  303.     if (code == AREA_CAMPUS_SWIMHALL)       return "outside the Swimming Hall";
  304.     if (code == AREA_CAMPUS_BEHIND_SWIMHALL)return "on the field behind the Swimming Hall";
  305.     if (code == AREA_CAMPUS_BEHIND_SCHOOL)  return "behind the School";
  306.     if (code == AREA_CAMPUS_SCHL_ROOF)      return "on the School Roof";
  307.     if (code == AREA_CAMPUS_SCHL_FRONT)     return "outside the School";
  308.     if (code == AREA_CAMPUS_PLAYINGFIELDS)  return "on the Playing Fields";
  309.     if (code == AREA_CAMPUS_PATH_WATERFALL) return "by the Stream";
  310.     if (code == AREA_CAMPUS_PATH_UPPER)     return "towards the top of the main path";
  311.     if (code == AREA_TOWN)                  return "on the WIP Town Island";
  312.     return "in an Unknown location";
  313. }
  314.  
  315. // isAre is true if we are to use is or are on the end
  316. string nameList2HumanFriendly(list names, integer isAre)
  317. {
  318.     //llSay(0,"(debug) " + llList2CSV(names));
  319.    
  320.     if (llGetListLength(names) == 1 && isAre)
  321.     {
  322.         if (isAre)
  323.         {
  324.             return llList2String(names, 0) + " is ";
  325.         }
  326.         else
  327.         {
  328.             return llList2String(names, 0);
  329.         }
  330.        
  331.     }
  332.     integer n;
  333.     string returnStr;
  334.     for (n = 0; n < llGetListLength(names); n++)
  335.     {
  336.         string name = llList2String(names, n);
  337.         if (n > 0 && n < (llGetListLength(names) - 1))
  338.         {
  339.             returnStr = returnStr + ", " + name;
  340.         }
  341.         if (n == llGetListLength(names) - 1)
  342.         {
  343.             // last element
  344.             if (isAre)
  345.             {
  346.                 returnStr = returnStr + " and " + name + " are ";
  347.             }
  348.             else
  349.             {
  350.                 returnStr = returnStr + " and " + name;
  351.             }
  352.            
  353.         }
  354.         if (n == 0)
  355.         {
  356.             returnStr = name;
  357.         }
  358.     }
  359.     return returnStr;
  360.  
  361. }
  362.  
  363. list getGroupedLocationsForKeys(list keys, key agentOfRequest)
  364. {
  365.     list groupedLocations;
  366.     integer a;
  367.     for (a = 0; a < llGetListLength(keys); a++)
  368.     {
  369.         key agent             = llList2Key(keys, a);
  370.         if (agent != agentOfRequest)
  371.         {
  372.             integer areaCode    = getAreaCodeOfInworldKey(agent);
  373.             if (keyIsInRangeOfKey(agentOfRequest,agent,19.9))
  374.             {
  375.                 areaCode = AREA_NEXT_TO_QUERY;
  376.             }
  377.  
  378.             integer listFind    = llListFindList(groupedLocations, [areaCode]);
  379.             if (~listFind)
  380.             {
  381.                 // Areacode already in list
  382.  
  383.                 list agentsAlreadyInAreaCode = llParseString2List(llList2String(groupedLocations, (listFind + 1)), ["|"], []);
  384.  
  385.                 agentsAlreadyInAreaCode = agentsAlreadyInAreaCode + [(string)agent];
  386.  
  387.                 string replace = llDumpList2String(agentsAlreadyInAreaCode, "|");
  388.                 groupedLocations = llListReplaceList(groupedLocations, [replace], (listFind + 1), (listFind + 1));
  389.             }
  390.             else
  391.             {
  392.                 // Areacode not already in list
  393.                 groupedLocations = groupedLocations + [areaCode,(string)agent];
  394.             }
  395.         }
  396.     }
  397.     return groupedLocations;
  398. }
  399.  
  400. respond(string message, key id)
  401. {
  402.     llRegionSay(-8705036, llList2Json(JSON_ARRAY, [(string)llGetOwnerKey(id),message]));
  403. }
  404.  
  405. default
  406. {
  407.     state_entry()
  408.     {
  409.         llListen(-8705036, "", NULL_KEY, "REQUEST_LOCATIONS");
  410.         llListen(-8305621, "Kokoro Academy", NULL_KEY, "");
  411.     }
  412.  
  413.     listen(integer channel, string name, key id, string message)
  414.     {
  415.         if (channel == -8305621)
  416.         {
  417.             // It's likely new player joined request
  418.             list details = llCSV2List(message);
  419.             if (llList2String(details, 0) != "REQUEST_LOCATIONS_NEW-AGENT") return;
  420.            
  421.             list newAgents;
  422.  
  423.             integer a;
  424.             for (a = 1; a < llGetListLength(details); a++)
  425.             {
  426.                 key agent = (key)llList2String(details, a);
  427.                 newAgents = newAgents + [agent];
  428.             }
  429.  
  430.             list groupedLocations = getGroupedLocationsForKeys(newAgents,llGetOwnerKey(id));
  431.             string response;
  432.             integer l;
  433.             for (l = 0; l < (llGetListLength(groupedLocations)); l = l + 2)
  434.             {
  435.                 integer areaCode = llList2Integer(groupedLocations, l);
  436.                 list    agents   = llParseString2List(llList2String(groupedLocations, (l + 1)), ["|"], []);
  437.  
  438.                 list firstNames;
  439.                 for (a = 0; a < llGetListLength(agents); a++)
  440.                 {
  441.                     firstNames = firstNames + [getFirstName((key)llList2String(agents, a))];
  442.  
  443.                 }
  444.  
  445.                 response = response + "\n" + nameList2HumanFriendly(firstNames,FALSE) + " joined " +  isLocationString(areaCode);
  446.             }
  447.            
  448.             respond(response,id);
  449.             return;
  450.         }
  451.  
  452.         if (message != "REQUEST_LOCATIONS") return;
  453.         list agentsInSim = llGetAgentList(AGENT_LIST_REGION, []);
  454.         if (llGetListLength(agentsInSim) == 1)
  455.         {
  456.             respond("You are the only person in the sim right now. Seems everyone must be sleeping!",id);
  457.             return;
  458.         }
  459.        
  460.  
  461.         list groupedLocations = getGroupedLocationsForKeys(agentsInSim,llGetOwnerKey(id));
  462.         key    agentOfRequest = llGetOwnerKey(id);
  463.         // List of grouped locations built
  464.         integer l;
  465.         string response;
  466.         integer otherAgents = llGetListLength(agentsInSim) - 1;
  467.  
  468.         if (otherAgents > 1)
  469.         {
  470.             response = "There are " +  (string)(llGetListLength(agentsInSim) - 1) + " other people here right now:";
  471.         }
  472.         else
  473.         {
  474.             string agentFirstName = getFirstName((key)llList2String(groupedLocations, 1));
  475.             integer areaCode      = llList2Integer(groupedLocations, 0);
  476.             if (keyIsInRangeOfKey(agentOfRequest,llList2String(groupedLocations, 1),19.9))
  477.             {
  478.                 areaCode = AREA_NEXT_TO_QUERY;
  479.             }
  480.             response = agentFirstName + " is here " + isLocationString(areaCode);
  481.             respond(response,id);
  482.             return;
  483.         }
  484.  
  485.        // llSay(0,"(debug) l " + (string)(llGetListLength(groupedLocations) / 2));
  486.         for (l = 0; l < (llGetListLength(groupedLocations)); l = l + 2)
  487.         {
  488.             integer areaCode = llList2Integer(groupedLocations, l);
  489.            
  490.             list    agents   = llParseString2List(llList2String(groupedLocations, (l + 1)), ["|"], []);
  491.  
  492.             list firstNames;
  493.             integer a;
  494.             for (a = 0; a < llGetListLength(agents); a++)
  495.             {
  496.                 firstNames = firstNames + [getFirstName((key)llList2String(agents, a))];
  497.  
  498.             }
  499.  
  500.             response = response + "\n" + nameList2HumanFriendly(firstNames,TRUE) + isLocationString(areaCode);
  501.  
  502.         }
  503.  
  504.         respond(response,id);
  505.  
  506.     }
  507. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement