===== Create morsecode in LSL =====
🛠️ How It Works
Listens on public chat (channel 0).
* Converts each character to Morse using a lookup list.
* Outputs Morse code with spaces between letters and slashes between words.
// Morse code mapping
list morseMap = [
"A", ".-", "B", "-...", "C", "-.-.", "D", "-..", "E", ".",
"F", "..-.", "G", "--.", "H", "....", "I", "..", "J", ".---",
"K", "-.-", "L", ".-..", "M", "--", "N", "-.", "O", "---",
"P", ".--.", "Q", "--.-", "R", ".-.", "S", "...", "T", "-",
"U", "..-", "V", "...-", "W", ".--", "X", "-..-", "Y", "-.--",
"Z", "--..",
"0", "-----", "1", ".----", "2", "..---", "3", "...--", "4", "....-",
"5", ".....", "6", "-....", "7", "--...", "8", "---..", "9", "----."
];
// Convert a string to Morse code
string toMorse(string input) {
input = llToUpper(input);
string result = "";
integer i;
for (i = 0; i < llStringLength(input); ++i) {
string ch = llGetSubString(input, i, i);
integer idx = llListFindList(morseMap, [ch]);
if (idx != -1) {
result += llList2String(morseMap, idx + 1) + " ";
} else if (ch == " ") {
result += "/ "; // Slash for space between words
}
}
return result;
}
// Listen for chat and convert to Morse
default {
state_entry() {
llListen(0, "", NULL_KEY, "");
}
listen(integer channel, string name, key id, string message) {
string morse = toMorse(message);
llSay(0, "Morse: " + morse);
}
}
===== SL to Telegram =====
string TELEGRAM_API_URL = "https://api.telegram.org/bot/sendMessage";
string chat_id = "";
string message = "Hello from Second Life!";
default
{
state_entry()
{
// Construct the HTTP request payload
string payload = "{\"chat_id\":\"" + chat_id + "\", \"text\":\"" + message + "\"}";
// Send HTTP POST request to Telegram API
llHTTPRequest(TELEGRAM_API_URL, [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], payload);
}
http_response(key request_id, integer status, list metadata, string body)
{
// Handle the HTTP response
if (status == 200)
{
llOwnerSay("Message sent successfully!");
}
else
{
llOwnerSay("Failed to send message. Status: " + (string)status + ", Response: " + body);
}
}
}
===== SL2Discord =====
string discord_web_hook = "wehhookURL"; // this is where your web hook url from discord goes
key http_send;
Send_Message(string message) // this is where the magic happens.
{
string json_encode = llList2Json(JSON_OBJECT,["username",username,"content",message]);
http_send = llHTTPRequest(discord_web_hook, [HTTP_METHOD,"POST",HTTP_MIMETYPE,"application/json",HTTP_VERIFY_CERT,FALSE],json_encode);
}
string username = "Test User"; //var to set the name in your message
default
{
state_entry()
{
}
touch_start(integer total_number)
{
Send_Message(llGetDisplayName(llDetectedKey(0)) + " clicked me");
}
}
===== Rezz at feet ====
integer canRezAt(vector pos) //can I rez at this place?
{
integer parcelFlags = llGetParcelFlags(pos);
list parcelDetails = llGetParcelDetails(pos, [PARCEL_DETAILS_OWNER, PARCEL_DETAILS_GROUP]);
key parcelOwner = llList2Key(parcelDetails, 0);
key parcelGroup = llList2Key(parcelDetails, 1);
if (parcelFlags & PARCEL_FLAG_ALLOW_CREATE_OBJECTS) return TRUE;
if (parcelOwner == llGetOwner()) return TRUE;
if (!llSameGroup(parcelGroup)) return FALSE;
if (parcelFlags & PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS) return TRUE;
return FALSE;
}
/// rez the stuff to my feet
vector size;
float Zpos;
vector rot = <90.00000, 0.00000, 0.00000>;
positioner() //get my size and locate my feet
{
size = llGetAgentSize(llGetOwner());
vector pos = llGetPos();Zpos = pos.z - (size.z / 2);
}
rezzer(string object) // do the rez!
{
if(canRezAt(llGetPos())) //can I rez at this place?
{
positioner();
vector pos = llGetPos()+(<2,0,-2>*llGetRot());
rotation rot1 = llEuler2Rot(rot);
pos.z = Zpos;llRezObject(object, pos, <0,0,0>,ZERO_ROTATION, 1);
}
else
{
llOwnerSay("Cant rez at current position!");
}
}
===== Random giver =====
//gimme random
integer random_integer(integer min, integer max)
{
return min + (integer)(llFrand(max - min + 1));
}
===== Find in List =====
// find stuff in my list or not
integer findinList(list src,list item){
if(~llListFindList(src, (list)item))
return TRUE;
else
return FALSE;
}
===== Find an avatar key on region =====
string getKey(string req)
{
if(llStringLength(req) < 3)
{
return NULL_KEY;
}
req = llToLower(req);
list keyNames;
list temp;
list agents = llGetAgentList(AGENT_LIST_REGION , []);
integer x = 0;
integer y = llGetListLength(agents);
while(x
===== Check if object is original =====
integer checkOriginal(key id) {
// Check if we have the original number of primitives.
if(llGetNumberOfPrims() != 15) return FALSE;
// Check if the creator of the object is Morgan LeFay.
if(llGetCreator() != "1ad33407-a792-476d-a5e3-06007c0802bf") return FALSE;
// Check the sizes and positions of all primitives.
list size = [ <.032813, .015186, .022779>,<.018223, .015186, .015186>,<.015186, .075929, .015186>,<.018223, .015186, .015186>,<.015186, .015186, .015186>,<.016704, .076547, .046667>,<.046755, .010000, .010000>,<.018223, .030371, .030371>,<.020000, .013000, .010000>,<.010000, .010000, .046230>,<.030000, .030000, .030000>,<.030000, .030000, .030000>,<.010000, .014000, .010000>,<.012000, .016000, .010000>,<.016840, .076546, .073333> ];
integer itra = 14;
do {
if((string)llList2Vector(llGetLinkPrimitiveParams(14-itra+1, [PRIM_SIZE]),0) != (string)llList2Vector(size, itra)) return FALSE;
i += llList2Vector(llGetLinkPrimitiveParams(14-itra+1, [PRIM_SIZE]),0);
} while(--itra>0);
return llAbs((integer)((integer)(i.x*((integer)("0x"+llGetSubString((string)id,-8,-1)))) & (integer)(i.y*((integer)("0x"+llGetSubString((string)llGetCreator(),-8,-1)))) ^ (integer)(i.z*((integer)("0x"+llGetSubString("2358cb5c-578a-4b90-932f-54d01e36cfc8",-8,-1))))));
}
===== Shield effect =====
ShieldFade(integer link_num, float alpha_start, float alpha_end, float glow_start, float glow_end, float speed)
{
integer complete = FALSE;
do
{
if((alpha_start < alpha_end && alpha_start != alpha_end)||(alpha_start > alpha_end && alpha_start != alpha_end))
{
if(alpha_start < alpha_end && (alpha_start + speed) < alpha_end)
{
alpha_start += speed;
}
else if(alpha_start > alpha_end && (alpha_start - speed) > alpha_end)
{
alpha_start -= speed;
}
else
{
alpha_start = alpha_end;
}
}
if((glow_start < glow_end && glow_start != glow_end)||(glow_start > glow_end && glow_start != glow_end))
{
if(glow_start < glow_end && (glow_start + speed) < glow_end)
{
glow_start += speed;
}
else if(glow_start > glow_end && (glow_start - speed) > glow_end)
{
glow_start -= speed;
}
else
{
glow_start = glow_end;
}
}
vector color = <1,1,1>;
llSetLinkPrimitiveParamsFast(link_num, [PRIM_GLOW, ALL_SIDES, glow_start, PRIM_COLOR, ALL_SIDES, color, alpha_start]);
if(glow_start == glow_end && alpha_start == alpha_end)
{
complete = TRUE;
}
}while(complete == FALSE);
}
===== WarpPos =====
warpPos(vector destpos) {
integer jumps = (integer)(llVecDist(destpos, llGetPos()) / 10.0) + 1;
if (jumps > 411) jumps = 411;
list rules = [PRIM_POSITION, destpos];
integer count = 1;
while ((count = count << 1) < jumps) {
rules = (rules = []) + rules + rules;
}
llSetPrimitiveParams(rules + llList2List(rules, (count - jumps) << 1, count));
if (llVecDist(llGetPos(), destpos) > 0.001) {
while (--jumps) llSetPos(destpos);
}
}
===== Binary converter =====
// Function to encode a string into a binary form using integers
list encodeToBinary(string data) {
list binaryList = [];
integer len = llStringLength(data);
for (integer i = 0; i < len; ++i) {
integer ch = llString2Key(llGetSubString(data, i, i));
list bits = [];
for (integer j = 0; j < 8; ++j) {
bits += (ch & (1 << j)) ? 1 : 0;
}
binaryList += llList2String(bits, 0);
}
return binaryList;
}
// Function to decode a binary list back to a string
string decodeFromBinary(list binaryList) {
string data = "";
integer len = llGetListLength(binaryList);
for (integer i = 0; i < len; ++i) {
integer ch = 0;
list bits = llParseString2List(llList2String(binaryList, i), [" "], []);
for (integer j = 0; j < 8; ++j) {
ch += (llList2Integer(bits, j) ? 1 : 0) << j;
}
data += (string)ch;
}
return data;
}
// Example usage
default {
state_entry() {
string originalData = "Hello";
list binaryData = encodeToBinary(originalData);
string decodedData = decodeFromBinary(binaryData);
llSay(0, "Original Data: " + originalData);
llSay(0, "Binary Data: " + llDumpList2String(binaryData, " "));
llSay(0, "Decoded Data: " + decodedData);
}
}
=====ENDLESS DIALOG=====
// Dynamisches Dialogskript in LSL mit Seiten
integer dialogChannel = -123456;
key user;
list options = ["Option 1", "Option 2", "Option 3", "Option 4", "Option 5",
"Option 6", "Option 7", "Option 8", "Option 9", "Option 10",
"Option 11", "Option 12"];
integer itemsPerPage = 5;
integer currentPage = 0;
// Funktion zum Anzeigen des Dialogs mit Seiten
showDialog(key userId, integer page) {
integer start = page * itemsPerPage;
integer end = start + itemsPerPage;
list pageOptions = llList2List(options, start, end - 1);
if (start > 0) {
pageOptions += ["Vorherige"];
}
if (end < llGetListLength(options)) {
pageOptions += ["Nächste"];
}
llDialog(userId, "Wähle eine Option:", pageOptions, dialogChannel);
}
// Ereignis, wenn das Skript zurückgesetzt wird
default {
state_entry() {
llListen(dialogChannel, "", NULL_KEY, "");
llSay(0, "Dialogskript ist aktiv. Tippe '/100 menü' zum Starten.");
}
listen(integer channel, string name, key id, string message) {
if (llToLower(message) == "menü") {
user = id;
currentPage = 0;
showDialog(user, currentPage);
} else {
llListenRemove(channel);
}
if (channel == dialogChannel) {
if (message == "Vorherige") {
currentPage--;
} else if (message == "Nächste") {
currentPage++;
} else {
llSay(0, "Du hast " + message + " gewählt.");
}
showDialog(user, currentPage);
}
}
on_rez(integer start_param) {
llResetScript();
}
touch_start(integer num) {
user = llDetectedKey(0);
currentPage = 0;
showDialog(user, currentPage);
}
}
===== Turn Avatar to Target / RLV =====
vector pointTo = targetpos - llGetPos();
float angleTo = llAtan2(pointTo.x, pointTo.y);
llOwnerSay("@setrot:" + (string)angleTo + "=force");
===== Key2Number =====
integer Key2Number(key objKey) {
return -(integer)("0x8" + llGetSubString(llGetKey(), 0, 6));
}
~~DISCUSSION~~