Xuander Posted May 23, 2018 Share Posted May 23, 2018 Hello all, i have this script what i can place in a object and then when i wear it and someone els also wear it we can chat and only the people who wear the script can see the message. Now it gives a message in local chat but i want that it gives the message big on the screen for a couple seconds and then fade away and also that i can give the message a color. Here is the script and i hope someone can help me with it.. integer transmit_channel = 66; integer listen_handle; say_message(string message) { llOwnerSay(message); llSetColor(<0, 1, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } transmit(string message) { llRegionSay(transmit_channel, message); llSetColor(<1, 0, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } show_help() { llOwnerSay("Bird Call Directions:"); llOwnerSay("/bc on: Turn on."); llOwnerSay("/bc off : Turn off."); llOwnerSay("/bc reset: Reset."); llOwnerSay("/bc scan: Scan channels."); } default { state_entry() { llOwnerSay("Bird Call enabled (To sent a message to your team, type in local for example /5 bandage me). Type \"/bc help \" for directions."); llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); state on; } } state on { state_entry() { llListen(0, "", llGetOwner(), ""); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call on."); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } attach(key attached) { if (attached != NULL_KEY) { llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); llOwnerSay("Bird Call enabled (To sent a message to your team, type in local for example /5 bandage me). Type \"/bc help \" for directions."); llOwnerSay("Bird Call on."); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } } changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } } listen(integer channel, string name, key id, string message) { if (channel == 0 && id == llGetOwner() && llStringLength(message) > 4 && llGetSubString(llToLower(message), 0, 3) == "/bc ") { message = llDeleteSubString(message, 0, 3); if (llGetSubString(llToLower(message), 0, llStringLength("channel ") - 1) == "channel " && llStringLength(message) > llStringLength("channel ")) { message = llDeleteSubString(message, 0, llStringLength("channel ") - 1); if ((integer) message != 0) { transmit_channel = (integer) message; llListenRemove(listen_handle); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } } else if (llGetSubString(llToLower(message), 0, llStringLength("off") - 1) == "off") { state off; } else if (llGetSubString(llToLower(message), 0, llStringLength("help") - 1) == "help") { show_help(); } else if (llGetSubString(llToLower(message), 0, llStringLength("scan") - 1) == "scan") { state scan; } else if (llGetSubString(llToLower(message), 0, llStringLength("reset") - 1) == "reset") { llResetScript(); } else { transmit(message); } } else if (channel != 0) { if (id == llGetOwner()) { say_message(message); } else { say_message(name + ": " + message); } } } } state off { state_entry() { llListen(0, "", llGetOwner(), ""); llOwnerSay("Bird Call off."); } attach(key attached) { if (attached != NULL_KEY) { llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); llOwnerSay("Bird Call enabled (status: OFF). Type \"/bc help\" for directions."); } } changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } } listen(integer channel, string name, key id, string message) { if (channel == 0 && id == llGetOwner() && llStringLength(message) > 4 && llGetSubString(llToLower(message), 0, 3) == "/bc ") { message = llDeleteSubString(message, 0, 3); if (llGetSubString(llToLower(message), 0, llStringLength("on") - 1) == "on") { state on; } else if (llGetSubString(llToLower(message), 0, llStringLength("help") - 1) == "help") { show_help(); } else if (llGetSubString(llToLower(message), 0, llStringLength("scan") - 1) == "scan") { state scan; } else if (llGetSubString(llToLower(message), 0, llStringLength("reset") - 1) == "reset") { llResetScript(); } } } } state scan { state_entry() { llListen(0, "", llGetOwner(), ""); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llSetTimerEvent(5); llOwnerSay("Channel Scanning...say \"bc stop\" to stop."); } attach(key attached) { if (attached != NULL_KEY) { llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); llOwnerSay("Bird Call enabled (status: SCANNING). Type \"/bc help\" for directions."); } } changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } } timer() { transmit_channel++; llListenRemove(listen_handle); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } listen(integer channel, string name, key id, string message) { if (channel == 0 && id == llGetOwner() && llStringLength(message) > 4 && llGetSubString(llToLower(message), 0, 3) == "/bc ") { message = llDeleteSubString(message, 0, 3); if (llGetSubString(llToLower(message), 0, llStringLength("channel ") - 1) == "channel " && llStringLength(message) > llStringLength("channel ")) { message = llDeleteSubString(message, 0, llStringLength("channel ") - 1); if ((integer) message != 0) { transmit_channel = (integer) message; llListenRemove(listen_handle); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } } else if (llGetSubString(llToLower(message), 0, llStringLength("on") - 1) == "on") { state on; } else if (llGetSubString(llToLower(message), 0, llStringLength("stop") - 1) == "stop") { state on; } else if (llGetSubString(llToLower(message), 0, llStringLength("off") - 1) == "off") { state off; } else if (llGetSubString(llToLower(message), 0, llStringLength("help") - 1) == "help") { show_help(); } else if (llGetSubString(llToLower(message), 0, llStringLength("reset") - 1) == "reset") { llResetScript(); } else { transmit(message); } } else if (channel != 0) { if (id == llGetOwner()) { say_message(message); } else { say_message(name + ": " + message); } state on; } } } Thanks in advantage 1 Link to comment Share on other sites More sharing options...
Coffee Pancake Posted May 23, 2018 Share Posted May 23, 2018 There is no built in LSL function to present a message on a users screen. You need the other person to be wearing a HUD and then use that to present the message as a texture, perhaps using some variant of XyText (see the LSL wiki). Link to comment Share on other sites More sharing options...
Ruthven Ravenhurst Posted May 23, 2018 Share Posted May 23, 2018 Maybe as a dialog/text box? The problem with that is, they can get lost in the notifications Link to comment Share on other sites More sharing options...
Kyrah Abattoir Posted May 23, 2018 Share Posted May 23, 2018 XYtext hud would be pretty slow rezzing anyway unless you buffer the textures on a hidden face but then you are still carrying around a lot of vram. Link to comment Share on other sites More sharing options...
Coffee Pancake Posted May 23, 2018 Share Posted May 23, 2018 Oh yes.. it would be horrible. Link to comment Share on other sites More sharing options...
ellestones Posted May 23, 2018 Share Posted May 23, 2018 if "bandage me" is typical of the type and length of message being communicated then the simplist way would be to wear attached to HUD and use llSetText to display the message on the receivers' screen. You will able to set the text color and script a fade out effect. You won't be able to change the font or fontsize. Link to comment Share on other sites More sharing options...
Xuander Posted May 24, 2018 Author Share Posted May 24, 2018 thanks all, ellestones that what you say is what i wanted, both people wear it as a hud and when they type in local ''/5 bandage'' then they see that message. Now i am very new in scripting but can you explain how to do that llSetText and where in the script i have to put it and how to change the color of the text? Thanks Link to comment Share on other sites More sharing options...
Xuander Posted May 24, 2018 Author Share Posted May 24, 2018 13 hours ago, ellestones said: if "bandage me" is typical of the type and length of message being communicated then the simplist way would be to wear attached to HUD and use llSetText to display the message on the receivers' screen. You will able to set the text color and script a fade out effect. You won't be able to change the font or fontsize. thanks all, ellestones that what you say is what i wanted, both people wear it as a hud and when they type in local ''/5 bandage'' then they see that message. Now i am very new in scripting but can you explain how to do that llSetText and where in the script i have to put it and how to change the color of the text? Thanks Link to comment Share on other sites More sharing options...
ellestones Posted May 25, 2018 Share Posted May 25, 2018 a place to start would be to change say_message(...) to display the message as text on the HUD rather than send the message to the owner's chat this is what you currently have: say_message(string message) { llOwnerSay(message); llSetColor(<0, 1, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } to get you started change to: say_message(string message) { // llOwnerSay(message); llSetText(message, <1.0, 1.0, 1.0>, 1.0>; llSetColor(<0, 1, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } Link to comment Share on other sites More sharing options...
Xuander Posted May 28, 2018 Author Share Posted May 28, 2018 On 26-5-2018 at 1:05 AM, ellestones said: a place to start would be to change say_message(...) to display the message as text on the HUD rather than send the message to the owner's chat this is what you currently have: say_message(string message) { llOwnerSay(message); llSetColor(<0, 1, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } to get you started change to: say_message(string message) { // llOwnerSay(message); llSetText(message, <1.0, 1.0, 1.0>, 1.0>; llSetColor(<0, 1, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } Thanks so much this is what i wanted....now i did try to figure out how the text can fade away after a couple seconds but cant get that to work...maybe you have a idea to get that work? Link to comment Share on other sites More sharing options...
ellestones Posted May 28, 2018 Share Posted May 28, 2018 2 hours ago, Xuander said: ...i did try to figure out how the text can fade away after a couple seconds but cant get that to work...maybe you have a idea to get that work? i do, but is going to be messy, as a timer is needed to do this, and the script uses states, and say_message(...) is called in 2 of the states, state on and state scan which complicates matters. so before we start hacking a fix for this, can you post your current script formatted please so I can see anything else you might have done since. On the edit toolbar is the Code toolbutton, the button symbol is <>. Press it and paste your script into the popup dialog. do this and I will have current info, enough to post the bare necessary hacks to let you carry on without having to do a major rewrite Link to comment Share on other sites More sharing options...
Xuander Posted May 28, 2018 Author Share Posted May 28, 2018 9 minutes ago, ellestones said: i do, but is going to be messy, as a timer is needed to do this, and the script uses states, and say_message(...) is called in 2 of the states, state on and state scan which complicates matters. so before we start hacking a fix for this, can you post your current script formatted please so I can see anything else you might have done since. On the edit toolbar is the Code toolbutton, the button symbol is <>. Press it and paste your script into the popup dialog. do this and I will have current info, enough to post the bare necessary hacks to let you carry on without having to do a major rewrite integer transmit_channel = 66; integer listen_handle; ////////////////////////////// say_message(string message) { // llOwnerSay(message); llSetText(message, <1.0, 0.0, 0.0>,1.0); llSetColor(<0, 1, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } ////////////////////////////// transmit(string message) { llRegionSay(transmit_channel, message); llSetColor(<1, 0, 0>, ALL_SIDES); llSleep(0.5); llSetColor(<1, 1, 1>, ALL_SIDES); } ////////////////////////////// show_help() { llOwnerSay("Bird Call Directions:"); llOwnerSay("/bc on: Turn on."); llOwnerSay("/bc off : Turn off."); llOwnerSay("/bc reset: Reset."); } ////////////////////////////// default { state_entry() { llOwnerSay("Bird Call enabled (To sent a message to your team, type in local for example /5 bandage me). Type \"/bc help \" for directions."); llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); state on; } } ////////////////////////////// state on { state_entry() { llListen(0, "", llGetOwner(), ""); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call on."); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } ////////////////////////////// attach(key attached) { if (attached != NULL_KEY) { llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); llOwnerSay("Bird Call enabled (To sent a message to your team, type in local for example /5 bandage me). Type \"/bc help \" for directions."); llOwnerSay("Bird Call on."); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } } ////////////////////////////// changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } } ////////////////////////////// listen(integer channel, string name, key id, string message) { if (channel == 0 && id == llGetOwner() && llStringLength(message) > 4 && llGetSubString(llToLower(message), 0, 3) == "/bc ") { message = llDeleteSubString(message, 0, 3); if (llGetSubString(llToLower(message), 0, llStringLength("channel ") - 1) == "channel " && llStringLength(message) > llStringLength("channel ")) { message = llDeleteSubString(message, 0, llStringLength("channel ") - 1); if ((integer) message != 0) { transmit_channel = (integer) message; llListenRemove(listen_handle); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } } ////////////////////////////// else if (llGetSubString(llToLower(message), 0, llStringLength("off") - 1) == "off") { state off; } else if (llGetSubString(llToLower(message), 0, llStringLength("help") - 1) == "help") { show_help(); } else if (llGetSubString(llToLower(message), 0, llStringLength("scan") - 1) == "scan") { state scan; } else if (llGetSubString(llToLower(message), 0, llStringLength("reset") - 1) == "reset") { llResetScript(); } else { transmit(message); } } ////////////////////////////// else if (channel != 0) { if (id == llGetOwner()) { say_message(message); } else { say_message(name + ": " + message); } } } } ////////////////////////////// state off { state_entry() { llListen(0, "", llGetOwner(), ""); llOwnerSay("Bird Call off."); } attach(key attached) { if (attached != NULL_KEY) { llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); llOwnerSay("Bird Call enabled (status: OFF). Type \"/bc help\" for directions."); } } ////////////////////////////// changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } } ////////////////////////////// listen(integer channel, string name, key id, string message) { if (channel == 0 && id == llGetOwner() && llStringLength(message) > 4 && llGetSubString(llToLower(message), 0, 3) == "/bc ") { message = llDeleteSubString(message, 0, 3); if (llGetSubString(llToLower(message), 0, llStringLength("on") - 1) == "on") { state on; } else if (llGetSubString(llToLower(message), 0, llStringLength("help") - 1) == "help") { show_help(); } else if (llGetSubString(llToLower(message), 0, llStringLength("scan") - 1) == "scan") { state scan; } else if (llGetSubString(llToLower(message), 0, llStringLength("reset") - 1) == "reset") { llResetScript(); } } } } ////////////////////////////// state scan { state_entry() { llListen(0, "", llGetOwner(), ""); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llSetTimerEvent(5); llOwnerSay("Channel Scanning...say \"bc stop\" to stop."); } attach(key attached) { if (attached != NULL_KEY) { llSetObjectName(llKey2Name(llGetOwner()) + " (BC)"); llOwnerSay("Bird Call enabled (status: SCANNING). Type \"/bc help\" for directions."); } } ////////////////////////////// changed(integer change) { if (change & CHANGED_OWNER) { llResetScript(); } } ////////////////////////////// timer() { transmit_channel++; llListenRemove(listen_handle); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } listen(integer channel, string name, key id, string message) { if (channel == 0 && id == llGetOwner() && llStringLength(message) > 4 && llGetSubString(llToLower(message), 0, 3) == "/bc ") { message = llDeleteSubString(message, 0, 3); if (llGetSubString(llToLower(message), 0, llStringLength("channel ") - 1) == "channel " && llStringLength(message) > llStringLength("channel ")) { message = llDeleteSubString(message, 0, llStringLength("channel ") - 1); if ((integer) message != 0) { transmit_channel = (integer) message; llListenRemove(listen_handle); listen_handle = llListen(transmit_channel, "", NULL_KEY, ""); llOwnerSay("Bird Call listening on channel " + (string) transmit_channel); } } ////////////////////////////// else if (llGetSubString(llToLower(message), 0, llStringLength("on") - 1) == "on") { state on; } else if (llGetSubString(llToLower(message), 0, llStringLength("stop") - 1) == "stop") { state on; } else if (llGetSubString(llToLower(message), 0, llStringLength("off") - 1) == "off") { state off; } else if (llGetSubString(llToLower(message), 0, llStringLength("help") - 1) == "help") { show_help(); } else if (llGetSubString(llToLower(message), 0, llStringLength("reset") - 1) == "reset") { llResetScript(); } else { transmit(message); } } ////////////////////////////// else if (channel != 0) { if (id == llGetOwner()) { say_message(message); } else { say_message(name + ": " + message); } state on; } } } Thanks a lot you wanna look at it...here is what i have so far Link to comment Share on other sites More sharing options...
ellestones Posted May 28, 2018 Share Posted May 28, 2018 2 minutes ago, Xuander said: Thanks a lot you wanna look at it...here is what i have so far when you pasted it, it would have been useful if you had of indented the lines of code with tabs and spaces. Formatted it. Nevermind, is ok but next time ok First 2 hacks. I am doing this off the top of my head here. So the outcome might be variable. Anyways, here goes: Hack #1: at top of the script replace say_message(...) with this float MyFade; string MyMessage; say_message(string message) { llSetTimerEvent(0.0); llSetText(message, <1.0,1.0,1.0>, 1.0); llSetColor(<0.0, 1.0, 0.0>, ALL_SIDES); llSleep(0.5); llSetColor(1.0,1.0,1.0, ALL_SIDES); MyFade = 1.0; MyMessage = message; llSetTimerEvent(2.0); // tick every 2 seconds. } Hack #2: in state on, insert the following timer event code timer() { MyFade -= 0.2; // reduce by 1/5th each time llSetText(MyMessage, <1.0, 1.0, 1.0>, MyFade); if (MyFade == 0.0) llSetTimerEvent(0.0); } Hack #3 has to handle what happens in state scan when say_message(...) is called. State scan already uses a timer event, so we have to hack around that somehow. And is further complicated as say_message(...) is also called in state scan immediately before returning to state on tricky and I will have to think a bit more about how best to do that Hacks #1 and #2 do though do give you something to work on in the meantime ok Link to comment Share on other sites More sharing options...
Xuander Posted May 29, 2018 Author Share Posted May 29, 2018 17 hours ago, ellestones said: when you pasted it, it would have been useful if you had of indented the lines of code with tabs and spaces. Formatted it. Nevermind, is ok but next time ok First 2 hacks. I am doing this off the top of my head here. So the outcome might be variable. Anyways, here goes: Hack #1: at top of the script replace say_message(...) with this float MyFade; string MyMessage; say_message(string message) { llSetTimerEvent(0.0); llSetText(message, <1.0,1.0,1.0>, 1.0); llSetColor(<0.0, 1.0, 0.0>, ALL_SIDES); llSleep(0.5); llSetColor(1.0,1.0,1.0, ALL_SIDES); MyFade = 1.0; MyMessage = message; llSetTimerEvent(2.0); // tick every 2 seconds. } Hack #2: in state on, insert the following timer event code timer() { MyFade -= 0.2; // reduce by 1/5th each time llSetText(MyMessage, <1.0, 1.0, 1.0>, MyFade); if (MyFade == 0.0) llSetTimerEvent(0.0); } Hack #3 has to handle what happens in state scan when say_message(...) is called. State scan already uses a timer event, so we have to hack around that somehow. And is further complicated as say_message(...) is also called in state scan immediately before returning to state on tricky and I will have to think a bit more about how best to do that Hacks #1 and #2 do though do give you something to work on in the meantime ok Thanks so much for helping me, i did what you said above and it works really good....i get the message i type in local with /66 on the screen and also on the screen from the other person who wear the hud and it fade away in a couple seconds so that works perfect.....Now there is one thing what not works and that is that the other person only get the message on the screen when they are in chat range so in 20 meter from each other, if they are 21 meter from each other the receiver don't get the message on the screen...ill hope you can help me with that......again thanks so much for all you do Link to comment Share on other sites More sharing options...
ellestones Posted May 30, 2018 Share Posted May 30, 2018 19 hours ago, Xuander said: ... the other person only get the message on the screen when they are in chat range so in 20 meter from each other, if they are 21 meter from each other the receiver don't get the message on the screen ... try pressing Ctrl+Enter keys (Shout) instead of Enter key (Say) Link to comment Share on other sites More sharing options...
Callum Meriman Posted May 30, 2018 Share Posted May 30, 2018 (edited) One alternate possibility, to get past messy hacks with timers fighting states and thus make debugging and changes in 6 or 12 months time easier... is to have a second script to do the display, and simply talk to it with a link message. ((All the below is untested, and vastly unoptimised)) So, the SayMessage in the original script now becomes: say_message(string message) { llMessageLinked(LINK_THIS, 9000, message, ""); } The new display script in the same hud can get the link message and start it's own timer to fade the text away. string FadeText; integer Delay; default { state_entry() { } link_message(integer Sender, integer Number, string Message, key UUID) { if (Message == 9000) { FadeText = Message; Delay = 0; llSetText(FadeText,<0,1,0>,1); llSetTimerEvent(0.5); } } timer() { Delay += 1; if (delay < 5) return; // Display the text at full brightness for 5 ticks float Alpha = 1.0 - ((Delay - 5) / 10.0); // fade .1 each tick llSetText(FadeText,<0,1,0>,Alpha); } } As for the shouting, that will only work to 100 meters... maybe instead of llSay, use llRegionSay which will work as long as it's not on channel 0. Edited May 30, 2018 by Callum Meriman 1 Link to comment Share on other sites More sharing options...
ellestones Posted May 30, 2018 Share Posted May 30, 2018 @Xuander - go with what Callum recommends. Its a far better basis to go forward on. Link to comment Share on other sites More sharing options...
Xuander Posted May 30, 2018 Author Share Posted May 30, 2018 (edited) 4 hours ago, Callum Meriman said: One alternate possibility, to get past messy hacks with timers fighting states and thus make debugging and changes in 6 or 12 months time easier... is to have a second script to do the display, and simply talk to it with a link message. ((All the below is untested, and vastly unoptimised)) So, the SayMessage in the original script now becomes: say_message(string message) { llMessageLinked(LINK_THIS, 9000, message, ""); } The new display script in the same hud can get the link message and start it's own timer to fade the text away. string FadeText; integer Delay; default { state_entry() { } link_message(integer Sender, integer Number, string Message, key UUID) { if (Message == 9000) { FadeText = Message; Delay = 0; llSetText(FadeText,<0,1,0>,1); llSetTimerEvent(0.5); } } timer() { Delay += 1; if (delay < 5) return; // Display the text at full brightness for 5 ticks float Alpha = 1.0 - ((Delay - 5) / 10.0); // fade .1 each tick llSetText(FadeText,<0,1,0>,Alpha); } } As for the shouting, that will only work to 100 meters... maybe instead of llSay, use llRegionSay which will work as long as it's not on channel 0. Thank Callum i did what you said but now if i type /66 (message) in local i not get the message on the screen and also not on the screen of the receiver Edited May 30, 2018 by Xuander Link to comment Share on other sites More sharing options...
Ron Khondji Posted May 30, 2018 Share Posted May 30, 2018 (edited) It's a typo. Check the line above the one that gives the error. Hint: variable names are case sensitive. Edited May 30, 2018 by Ron Khondji Link to comment Share on other sites More sharing options...
Envy Yuhara Posted June 5, 2018 Share Posted June 5, 2018 Now that's pretty nifty to have!! Keep up the good work ❣️ Link to comment Share on other sites More sharing options...
Recommended Posts
Please take a moment to consider if this thread is worth bumping.
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now