Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Area Codes:
- integer AREA_SPAWN = -1;
- integer AREA_SCHL_ISLAND = -2;
- integer AREA_SHRINE_ISLAND = -3;
- integer AREA_SCHL_ISLAND_TEMP = -4;
- integer AREA_CAMPUS_SPORTSHALL = -10;
- integer AREA_CAMPUS_SWIMHALL = -11;
- integer AREA_CAMPUS_BEHIND_SWIMHALL = -12;
- integer AREA_CAMPUS_BEHIND_SCHOOL = -13;
- integer AREA_CAMPUS_SCHL_ROOF = -14;
- integer AREA_CAMPUS_SCHL_FRONT = -15;
- integer AREA_CAMPUS_PLAYINGFIELDS = -16;
- integer AREA_CAMPUS_PATH_WATERFALL = -17;
- integer AREA_CAMPUS_PATH_UPPER = -18;
- integer AREA_SCHL_G_HALL = 0;
- integer AREA_SCHL_G_CLASS_1_A = 1;
- integer AREA_SCHL_G_NURSE = 2;
- integer AREA_SCHL_G_CLASS_1_B = 3;
- integer AREA_SCHL_G_LAB = 4;
- integer AREA_SCHL_G_BOYS_LAV = 5;
- integer AREA_SCHL_G_GIRLS_LAV = 6;
- integer AREA_SCHL_G_TEACHOFFICE = 7;
- integer AREA_SCHL_1_HALL = 10;
- integer AREA_SCHL_1_ARTROOM = 11;
- integer AREA_SCHL_2_HALL = 21;
- integer AREA_SCHL_2_CLUBROOM = 22;
- integer AREA_SCHL_2_TATAMI = 23;
- integer AREA_SCHL_U_HALL = 30;
- integer AREA_SCHL_U_CHANGE_F = 31;
- integer AREA_SCHL_U_CHANGE_M = 32;
- integer AREA_SCHL_U_SWIMHALL = 33;
- integer AREA_SCHL_U_SPORTSHALL = 34;
- integer AREA_SCHL_U_BEACH = 35;
- integer AREA_SCHL_U_LIBRARY = 36;
- integer AREA_SCHL_U_RUNNINGTRACK = 37;
- integer AREA_SCHL_ROOF = 40;
- integer AREA_TOWN = 50;
- integer AREA_OOB = 100;
- integer AREA_NEXT_TO_QUERY = 101;
- string getFirstName(key agent)
- {
- string firstName = llList2String(llParseString2List(llGetDisplayName(agent),[" "], []), 0);
- string link = "[secondlife:///app/agent/" + (string)agent + "/about " + firstName +"]";
- return link;
- }
- // Returns TRUE if the Specified key of an inworld object or agent is within specified distance
- // of the other specified object/agent.
- integer keyIsInRangeOfKey(key x, key y, float max_distance)
- {
- vector posX = llList2Vector(llGetObjectDetails(x, [OBJECT_POS]), 0);
- vector posY = llList2Vector(llGetObjectDetails(y, [OBJECT_POS]), 0);
- float distance = llVecDist(posX, posY);
- return (distance < max_distance);
- }
- integer getAreaCodeOfInworldKey(key object)
- {
- list objectDetails = llGetObjectDetails(object, [OBJECT_POS]);
- vector objectPos = llList2Vector(objectDetails, 0);
- if (vectorsWithinBoundaries(objectPos, <89, 111, 3485>,<123, 143, 3500>)) return AREA_SPAWN;
- if (vectorsWithinBoundaries(objectPos, <43, 49, 3512>,<177, 161, 3520>)) return AREA_SCHL_ISLAND;
- if (vectorsWithinBoundaries(objectPos, <49, 124, 3514>, <118, 188, 3554>)) return AREA_SHRINE_ISLAND;
- if (vectorsWithinBoundaries(objectPos, <74, 66, 2738>, <202, 198, 2803>)) return AREA_SCHL_G_HALL;
- if (vectorsWithinBoundaries(objectPos, <189, 9, 2637>, <255, 75, 2699>)) return AREA_SCHL_G_CLASS_1_A;
- if (vectorsWithinBoundaries(objectPos,<17, 220, 2870>,<27, 242, 2875>)) return AREA_SCHL_G_CLASS_1_B;
- if (vectorsWithinBoundaries(objectPos, <0, 9, 2636>, <64, 75, 2702>)) return AREA_SCHL_G_NURSE;
- if (vectorsWithinBoundaries(objectPos,<16, 219, 2462>,<27, 242, 2470>)) return AREA_SCHL_G_LAB;
- if (vectorsWithinBoundaries(objectPos,<215, 41, 2868>,<229, 53, 2875>)) return AREA_SCHL_G_BOYS_LAV;
- if (vectorsWithinBoundaries(objectPos,<216, 212, 2869>,<231, 227, 2875>)) return AREA_SCHL_G_GIRLS_LAV;
- if (vectorsWithinBoundaries(objectPos,<30, 47, 2879>,<44, 61, 2886>)) return AREA_SCHL_G_TEACHOFFICE;
- if (vectorsWithinBoundaries(objectPos, <127, 1, 3134>, <255, 131, 3203>)) return AREA_SCHL_1_HALL;
- if (vectorsWithinBoundaries(objectPos,<73, 197, 2244>,<88, 221, 2252>)) return AREA_SCHL_1_ARTROOM;
- if (vectorsWithinBoundaries(objectPos, <88, 29, 2435>, <152, 97, 2498>)) return AREA_SCHL_2_HALL;
- if (vectorsWithinBoundaries(objectPos, <0, 197, 2637>, <70, 249, 2701>)) return AREA_SCHL_2_CLUBROOM;
- if (vectorsWithinBoundaries(objectPos, <180, 194, 2632>, <244, 254, 2699>)) return AREA_SCHL_2_TATAMI;
- if (vectorsWithinBoundaries(objectPos, <110, 94, 2545>, <160, 165, 2557>)) return AREA_SCHL_U_HALL;
- if (vectorsWithinBoundaries(objectPos, <75, 67, 2319>, <202, 195, 2383>)) return AREA_SCHL_U_SPORTSHALL;
- if (vectorsWithinBoundaries(objectPos, <111, 20, 250>, <176, 88, 312>)) return AREA_SCHL_U_CHANGE_M;
- if (vectorsWithinBoundaries(objectPos, <102, 196, 244>, <174, 255, 314>)) return AREA_SCHL_U_CHANGE_F;
- if (vectorsWithinBoundaries(objectPos, <24, 62, 78>, <156, 190, 144>)) return AREA_SCHL_U_SWIMHALL;
- if (vectorsWithinBoundaries(objectPos, <164, 87, 90>,<256,256, 144>)) return AREA_SCHL_U_BEACH;
- if (vectorsWithinBoundaries(objectPos, <111,94,1997>,<127,112,2006>)) return AREA_SCHL_U_LIBRARY;
- if (vectorsWithinBoundaries(objectPos, <83, 45, 3504>,<185, 95, 3512>)) return AREA_SCHL_U_RUNNINGTRACK;
- if (vectorsWithinBoundaries(objectPos,<94, 52, 3522>,<167, 73, 3531>)) return AREA_SCHL_ROOF;
- if (vectorsWithinBoundaries(objectPos,<144, 49, 3522>,<168, 126, 3529>)) return AREA_SCHL_ROOF;
- if (vectorsWithinBoundaries(objectPos,<62, 10, 188>,<255, 195, 238> )) return AREA_SCHL_ISLAND_TEMP;
- if (objectPos.z > 3702.46851 && objectPos.z < 3800.88062)
- {
- // school island elevation
- if (pointInPolygon2D(
- [ <126.68137, 163.59354, 3725.47144>,
- <164.68138, 199.59355, 3725.47144>,
- <213.68140, 168.59354, 3725.47144>,
- <198.94476, 154.28842, 3725.47144>,
- <166.86684, 120.03532, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_SPORTSHALL;
- }
- if (pointInPolygon2D(
- [ <166.86684, 120.03532, 3725.47144>,
- <198.94476, 154.28842, 3725.47144>,
- <244.04672, 112.50847, 3725.47144>,
- <230.45094, 98.22456, 3725.47144>,
- <221.81561, 90.20335, 3725.47144>,
- <197.33490, 89.07121, 3725.47144>,
- <181.33490, 105.07121, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_SWIMHALL;
- }
- if (pointInPolygon2D(
- [ <198.94476, 154.28842, 3725.47144>,
- <213.68140, 168.59354, 3725.47144>,
- <246.65353, 142.59352, 3725.47144>,
- <255.99989, 120.08074, 3725.47144>,
- <244.04672, 112.50847, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_BEHIND_SWIMHALL;
- }
- if (pointInPolygon2D(
- [ <221.81561, 90.20335, 3725.47144>,
- <230.45094, 98.22456, 3725.47144>,
- <244.04672, 112.50847, 3725.47144>,
- <255.99989, 120.08074, 3725.47144>,
- <255.99989, 1.24182, 3725.47144>,
- <156.50966, 1.24182, 3725.47144>,
- <157.74673, 27.73151, 3725.47144>,
- <234.27251, 15.24077, 3737.43677>,
- <234.27251, 85.24081, 3737.43677>,
- <222.35016, 85.24081, 3737.43677>],objectPos))
- {
- return AREA_CAMPUS_BEHIND_SCHOOL;
- }
- if (pointInPolygon2D(
- [ <223.00177, 87.65993, 3737.43677>,
- <234.92412, 87.65993, 3737.43677>,
- <234.27251, 15.24077, 3737.43677>,
- <163.27249, 15.24077, 3740.26807>,
- <163.27249, 27.34009, 3740.26807>,
- <207.11124, 27.73151, 3725.47144>,
- <221.81561, 43.24079, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_SCHL_ROOF;
- }
- if (pointInPolygon2D(
- [ <197.33490, 89.07121, 3725.47144>,
- <221.81561, 90.20335, 3725.47144>,
- <221.81561, 43.24079, 3725.47144>,
- <207.11124, 27.73151, 3725.47144>,
- <157.74673, 27.73151, 3725.47144>,
- <160.71823, 47.95562, 3725.47144>,
- <176.35391, 47.17129, 3725.47144>,
- <202.77271, 72.99124, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_SCHL_FRONT;
- }
- if (pointInPolygon2D(
- [ <160.71823, 47.95562, 3725.47144>,
- <157.74673, 27.73151, 3725.47144>,
- <156.50966, 1.24182, 3725.47144>,
- <111.97806, 17.47293, 3725.47144>,
- <45.97804, 77.47295, 3725.47144>,
- <83.74670, 132.17133, 3725.47144>,
- <130.74672, 90.17131, 3725.47144>,
- <152.74673, 72.17130, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_PLAYINGFIELDS;
- }
- if (pointInPolygon2D(
- [<83.74670, 132.17133, 3725.47144>,
- <126.68137, 163.59354, 3725.47144>,
- <166.86684, 120.03532, 3725.47144>,
- <181.33490, 105.07121, 3725.47144>,
- <152.74673, 72.17130, 3725.47144>,
- <130.74672, 90.17131, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_PATH_WATERFALL;
- }
- if (pointInPolygon2D(
- [ <181.33490, 105.07121, 3725.47144>,
- <197.33490, 89.07121, 3725.47144>,
- <202.77271, 72.99124, 3725.47144>,
- <176.35391, 47.17129, 3725.47144>,
- <160.71823, 47.95562, 3725.47144>,
- <152.74673, 72.17130, 3725.47144>],objectPos))
- {
- return AREA_CAMPUS_PATH_UPPER;
- }
- if(pointInPolygon2D(
- [ <83.74670, 132.17133, 3720.72314>,
- <47.50000, 98.00000, 3720.72314>,
- <0.00000, 101.00000, 3720.72314>,
- <0.00000, 255.99989, 3762.38184>,
- <155.06046, 255.99989, 3762.38184>,
- <155.06046, 201.90329, 3762.38184>,
- <126.68137, 163.59354, 3720.72314>],objectPos))
- {
- return AREA_TOWN;
- }
- }
- return AREA_OOB; // 100
- }
- integer vectorsWithinBoundaries(vector vec, vector lowest, vector highest)
- {
- // Checks the vector is within the boundaries assuming that
- // lowest vector has lowest x, y z values, and highest vector
- // has highest x, y z values
- //
- // Checks Z first for faster execution as Z is most likely to be
- // out of range
- // lower checks
- if (vec.z < lowest.z) return FALSE;
- if (vec.x < lowest.x) return FALSE;
- if (vec.y < lowest.y) return FALSE;
- // higher checks
- if (vec.z > highest.z) return FALSE;
- if (vec.x > highest.x) return FALSE;
- if (vec.y > highest.y) return FALSE;
- return TRUE;
- }
- // Returns TRUE if Vector is within boundaries ignoring z axis
- integer pointInPolygon2D( list polygon, vector point ){
- integer vBooInPlygn;
- integer vIntCounter = [] != polygon;
- vector vPosVertexA = llList2Vector( polygon, vIntCounter );
- vector vPosVertexB;
- while (vIntCounter){
- vPosVertexB = vPosVertexA;
- vPosVertexA = llList2Vector( polygon, ++vIntCounter );
- if ((vPosVertexA.y > point.y) ^ (vPosVertexB.y > point.y)){
- if (point.x < (vPosVertexB.x - vPosVertexA.x) * (point.y - vPosVertexA.y) /
- (vPosVertexB.y - vPosVertexA.y) + vPosVertexA.x ){
- vBooInPlygn = !vBooInPlygn;
- }
- }
- }
- return vBooInPlygn;
- }
- string isLocationString(integer code)
- {
- // EG:
- // "Reisen, Jinx and Ishiko are " + isLocationString(AREA_SCHL_U_SWIMHALL);
- // returns Reisen, Jinx and Ishiko are in the Swimmingpool.
- if (code == AREA_SPAWN) return "at the Spawn";
- if (code == AREA_SCHL_ISLAND) return "on the School Island";
- // TODO: Running Track, School Roof
- if (code == AREA_SHRINE_ISLAND) return "on the Shrine Island";
- if (code == AREA_SCHL_G_HALL) return "in the Ground Floor Corridor";
- if (code == AREA_SCHL_G_CLASS_1_A) return "in Classroom 1-A";
- if (code == AREA_SCHL_G_NURSE) return "in the Nurse's Office";
- if (code == AREA_SCHL_G_CLASS_1_B) return "in Classroom 1-B";
- if (code == AREA_SCHL_G_LAB) return "in the Lab";
- if (code == AREA_SCHL_G_BOYS_LAV) return "in the Boys Toilets";
- if (code == AREA_SCHL_G_GIRLS_LAV) return "in the Girls Toilets";
- if (code == AREA_SCHL_G_TEACHOFFICE) return "in the Teacher's Office";
- if (code == AREA_SCHL_1_HALL) return "in the 1st Floor Corridor";
- if (code == AREA_SCHL_1_ARTROOM) return "in the Art room";
- if (code == AREA_SCHL_2_HALL) return "in the 2nd Floor Corridor";
- if (code == AREA_SCHL_2_CLUBROOM) return "in the Clubroom";
- if (code == AREA_SCHL_2_TATAMI) return "in the Tatami room";
- if (code == AREA_SCHL_U_HALL) return "in the Underground Corridor";
- if (code == AREA_SCHL_U_SPORTSHALL) return "in the Sports hall";
- if (code == AREA_SCHL_U_CHANGE_M) return "in the Male changing room";
- if (code == AREA_SCHL_U_CHANGE_F) return "in the Female changing room";
- if (code == AREA_SCHL_U_SWIMHALL) return "at the Swimming Pool";
- if (code == AREA_SCHL_U_BEACH) return "at the Beach";
- if (code == AREA_SCHL_U_LIBRARY) return "in the Library";
- if (code == AREA_SCHL_U_RUNNINGTRACK) return "on the Athletics Track";
- if (code == AREA_SCHL_ROOF) return "on the School Roof";
- if (code == AREA_SCHL_ISLAND_TEMP) return "on the WIP School Island (See sign at spawn)";
- if (code == AREA_NEXT_TO_QUERY) return "next to you";
- if (code == AREA_CAMPUS_SPORTSHALL) return "outside the Sports Hall";
- if (code == AREA_CAMPUS_SWIMHALL) return "outside the Swimming Hall";
- if (code == AREA_CAMPUS_BEHIND_SWIMHALL)return "on the field behind the Swimming Hall";
- if (code == AREA_CAMPUS_BEHIND_SCHOOL) return "behind the School";
- if (code == AREA_CAMPUS_SCHL_ROOF) return "on the School Roof";
- if (code == AREA_CAMPUS_SCHL_FRONT) return "outside the School";
- if (code == AREA_CAMPUS_PLAYINGFIELDS) return "on the Playing Fields";
- if (code == AREA_CAMPUS_PATH_WATERFALL) return "by the Stream";
- if (code == AREA_CAMPUS_PATH_UPPER) return "towards the top of the main path";
- if (code == AREA_TOWN) return "on the WIP Town Island";
- return "in an Unknown location";
- }
- // isAre is true if we are to use is or are on the end
- string nameList2HumanFriendly(list names, integer isAre)
- {
- //llSay(0,"(debug) " + llList2CSV(names));
- if (llGetListLength(names) == 1 && isAre)
- {
- if (isAre)
- {
- return llList2String(names, 0) + " is ";
- }
- else
- {
- return llList2String(names, 0);
- }
- }
- integer n;
- string returnStr;
- for (n = 0; n < llGetListLength(names); n++)
- {
- string name = llList2String(names, n);
- if (n > 0 && n < (llGetListLength(names) - 1))
- {
- returnStr = returnStr + ", " + name;
- }
- if (n == llGetListLength(names) - 1)
- {
- // last element
- if (isAre)
- {
- returnStr = returnStr + " and " + name + " are ";
- }
- else
- {
- returnStr = returnStr + " and " + name;
- }
- }
- if (n == 0)
- {
- returnStr = name;
- }
- }
- return returnStr;
- }
- list getGroupedLocationsForKeys(list keys, key agentOfRequest)
- {
- list groupedLocations;
- integer a;
- for (a = 0; a < llGetListLength(keys); a++)
- {
- key agent = llList2Key(keys, a);
- if (agent != agentOfRequest)
- {
- integer areaCode = getAreaCodeOfInworldKey(agent);
- if (keyIsInRangeOfKey(agentOfRequest,agent,19.9))
- {
- areaCode = AREA_NEXT_TO_QUERY;
- }
- integer listFind = llListFindList(groupedLocations, [areaCode]);
- if (~listFind)
- {
- // Areacode already in list
- list agentsAlreadyInAreaCode = llParseString2List(llList2String(groupedLocations, (listFind + 1)), ["|"], []);
- agentsAlreadyInAreaCode = agentsAlreadyInAreaCode + [(string)agent];
- string replace = llDumpList2String(agentsAlreadyInAreaCode, "|");
- groupedLocations = llListReplaceList(groupedLocations, [replace], (listFind + 1), (listFind + 1));
- }
- else
- {
- // Areacode not already in list
- groupedLocations = groupedLocations + [areaCode,(string)agent];
- }
- }
- }
- return groupedLocations;
- }
- respond(string message, key id)
- {
- llRegionSay(-8705036, llList2Json(JSON_ARRAY, [(string)llGetOwnerKey(id),message]));
- }
- default
- {
- state_entry()
- {
- llListen(-8705036, "", NULL_KEY, "REQUEST_LOCATIONS");
- llListen(-8305621, "Kokoro Academy", NULL_KEY, "");
- }
- listen(integer channel, string name, key id, string message)
- {
- if (channel == -8305621)
- {
- // It's likely new player joined request
- list details = llCSV2List(message);
- if (llList2String(details, 0) != "REQUEST_LOCATIONS_NEW-AGENT") return;
- list newAgents;
- integer a;
- for (a = 1; a < llGetListLength(details); a++)
- {
- key agent = (key)llList2String(details, a);
- newAgents = newAgents + [agent];
- }
- list groupedLocations = getGroupedLocationsForKeys(newAgents,llGetOwnerKey(id));
- string response;
- integer l;
- for (l = 0; l < (llGetListLength(groupedLocations)); l = l + 2)
- {
- integer areaCode = llList2Integer(groupedLocations, l);
- list agents = llParseString2List(llList2String(groupedLocations, (l + 1)), ["|"], []);
- list firstNames;
- for (a = 0; a < llGetListLength(agents); a++)
- {
- firstNames = firstNames + [getFirstName((key)llList2String(agents, a))];
- }
- response = response + "\n" + nameList2HumanFriendly(firstNames,FALSE) + " joined " + isLocationString(areaCode);
- }
- respond(response,id);
- return;
- }
- if (message != "REQUEST_LOCATIONS") return;
- list agentsInSim = llGetAgentList(AGENT_LIST_REGION, []);
- if (llGetListLength(agentsInSim) == 1)
- {
- respond("You are the only person in the sim right now. Seems everyone must be sleeping!",id);
- return;
- }
- list groupedLocations = getGroupedLocationsForKeys(agentsInSim,llGetOwnerKey(id));
- key agentOfRequest = llGetOwnerKey(id);
- // List of grouped locations built
- integer l;
- string response;
- integer otherAgents = llGetListLength(agentsInSim) - 1;
- if (otherAgents > 1)
- {
- response = "There are " + (string)(llGetListLength(agentsInSim) - 1) + " other people here right now:";
- }
- else
- {
- string agentFirstName = getFirstName((key)llList2String(groupedLocations, 1));
- integer areaCode = llList2Integer(groupedLocations, 0);
- if (keyIsInRangeOfKey(agentOfRequest,llList2String(groupedLocations, 1),19.9))
- {
- areaCode = AREA_NEXT_TO_QUERY;
- }
- response = agentFirstName + " is here " + isLocationString(areaCode);
- respond(response,id);
- return;
- }
- // llSay(0,"(debug) l " + (string)(llGetListLength(groupedLocations) / 2));
- for (l = 0; l < (llGetListLength(groupedLocations)); l = l + 2)
- {
- integer areaCode = llList2Integer(groupedLocations, l);
- list agents = llParseString2List(llList2String(groupedLocations, (l + 1)), ["|"], []);
- list firstNames;
- integer a;
- for (a = 0; a < llGetListLength(agents); a++)
- {
- firstNames = firstNames + [getFirstName((key)llList2String(agents, a))];
- }
- response = response + "\n" + nameList2HumanFriendly(firstNames,TRUE) + isLocationString(areaCode);
- }
- respond(response,id);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement