Gold said: I am Following to see what resolves this... As a DM myself I periodically encounter Player(s) who get logged Out-and-Back-In repeatedly throughout the gaming session. I'm in the habit of advising them to "wait it out" and "power through" the drop-out, NOT to refresh their browser or restart their computer, as it usually comes back after a few seconds. I run an API script that reports it in Chat, when someone drops out & when someone comes in. The API is called Joiner or something like that, got it from Roll20 forum snippits long ago. DXWarlock wrote this script called Simple Join/Part Greeter a few years ago. Simple and effective! I've tweaked it a bit to use the D&D 5E by Roll20 template, and it allows me to add my Dummy Account and GM account with slightly different login messages, as well as making those messages 'no archive' so they don't clutter up my chat history. I also removed the timestamps (as I have timestamps turned on in my chat log already). If anyone else is interested, here's my modified version of the script. You can change the titles that are used for players, test account, and GM account by swapping out those vars at the top of the script. /* global on _ playerIsGM sendChat ---CLOUD9 ERROR CLEARING--- */ // By: DXWarlock //Script: Simple Join/Part Greeter //Roll20 Thread: <a href="https://app.roll20.net/forum/post/2184135/script-" rel="nofollow">https://app.roll20.net/forum/post/2184135/script-</a>... //Roll20 Contact: <a href="https://app.roll20.net/users/262130" rel="nofollow">https://app.roll20.net/users/262130</a> var DXGREET = DXGREET || (function() { 'use strict'; var Greet = function(obj) { var name = obj.get("_displayname"); var dummyAccountName = "Tester"; var dummyAccountTitle = "Test Account"; var gmTitle = "Dungeon Master"; var playerTitle = "Adventurer"; // Login After here if(obj.get("_online") == true && playerIsGM(obj.id) === false && name !== dummyAccountName) { setTimeout(function() { sendChat('Login Script', "&{template:npcaction} {{rname=Welcome " + playerTitle + "}} {{name=}} {{description=" + name + " has entered the game}}"); }, 3000); } if(obj.get("_online") == true && playerIsGM(obj.id) === false && name === dummyAccountName) { setTimeout(function() { sendChat('Login Script', "&{template:npcaction} {{rname=Welcome " + dummyAccountTitle + "}} {{name=}} {{description=" + name + " has entered the game}}",null,{noarchive:true}); }, 3000); } if(obj.get("_online") == true && playerIsGM(obj.id) === true) { setTimeout(function() { sendChat('Login Script', "&{template:npcaction} {{rname=Welcome " + gmTitle + "}} {{name=}} {{description=" + name + " has entered the game}}",null,{noarchive:true}); }, 3000); } // Logout After here if(obj.get("_online") == false && playerIsGM(obj.id) === false && name !== dummyAccountName) { setTimeout(function() { sendChat('Logout Script', "&{template:npcaction} {{rname=Farewell " + playerTitle + "}} {{name=}} {{description=" + name + " has exited the game}}"); }, 500); } if(obj.get("_online") == false && playerIsGM(obj.id) === false && name === dummyAccountName) { setTimeout(function() { sendChat('Logout Script', "&{template:npcaction} {{rname=Farewell " + dummyAccountTitle + "}} {{name=}} {{description=" + name + " has exited the game}}",null,{noarchive:true}); }, 500); } if(obj.get("_online") == false && playerIsGM(obj.id) === true) { setTimeout(function() { sendChat('Logout Script', "&{template:npcaction} {{rname=Farewell " + gmTitle + "}} {{name=}} {{description=" + name + " has exited the game}}",null,{noarchive:true}); }, 500); } }, registerEventHandlers = function() { on('change:player:_online', Greet); }; return { RegisterEventHandlers: registerEventHandlers }; }()); on('ready', function() { 'use strict'; DXGREET.RegisterEventHandlers(); });