I have been trying to help Andrew debug a couple of problems, but there is a problem that I am not sure there is a good solution for. Scripts in use: GroupInitiative, TurnMarker1, Face2Face. Problem - When starting combat via GroupInitiative, Face2Face isn't setting vision (controlledby property) until the turn order is changed. I thought to use the "change:campaign:initiativepage" event to detect when the turn order is opened, however it doesn't seem like this event fires when you run !group-init (and Auto Open Init is enabled). What I can't seem to wrap my head around is that there is a similar event in TurnMarker1 that seems to work properly when this is started from !group-init. The only other way I can think to address this is to make an !api command that simply calls Face2Face's handleTurnOrderChange() function and include that in a macro after !group-init is executed, but if feels like I am missing something. Here is what I tried to do: on('ready',()=>{ const CharacterIDs = ["-Kh-HGX4C5QAdR_IeraB", "-Kh-HKDRKZwH04QnavTT", "-Knjvt1i1JLQWTcKjWHg", "-Kh-HRm_1KNDjbK-rS1j", "-KnjvtQp13JnpfNnq4q8"]; // Save F2F data... if (!state.f2f) state.f2f = {}; if (_.isEmpty(state.f2f)) { _.each(CharacterIDs, function(charid) { let Character = getObj("character", charid); state.f2f[charid] = { CharacterID: charid, ControlledBy: Character.get("controlledby") }; }); state.f2f.prev=''; } const restoreCharacterControlledby = ()=>{ _.each(state.f2f, function(b) { if (b.CharacterID) { getObj("character", b["CharacterID"]).set("controlledby", b["ControlledBy"]); } }); }; const handleTurnOrderChange = _.debounce(() => { var CurrentTO = JSON.parse(Campaign().get("turnorder")); var Token = getObj('graphic',CurrentTO[0].id); var prevToken = getObj('graphic',state.f2f.prev); var Character; log(CurrentTO); //temporarily to confirm handleTurnOrderChange fires // Process the turn order... if (CurrentTO.length > 0) { _.each(state.f2f, function(a) { if (a.CharacterID) { getObj("character", a["CharacterID"]).set("controlledby", ""); } }); if(Token){ if(prevToken){ prevToken.set('status_green',false); } Token.set('status_green',false); state.f2f.prev=Token.id; } if (Token && Token.get("represents") !== "") { Character = getObj("character", Token.get("represents")); } if (Character && Character.id in state.f2f) { Character.set("controlledby", state.f2f[Character.id]["ControlledBy"]); } else { // Return control to all players during npc and custom item turns... restoreCharacterControlledby(); } } else { // Turn order tracker is empty. Return control to all players... restoreCharacterControlledby(); if(prevToken){ prevToken.set('status_green',false); } state.f2f = {}; } }); on('chat:message',(msg)=>{ if('api'===msg.type){ if(/^!eot/.test(msg.content)){ handleTurnOrderChange(); } else if(/^!f2f-restore/.test(msg.content) && playerIsGM(msg.playerid)){ restoreCharacterControlledby(); } } }); on("change:campaign:turnorder", handleTurnOrderChange ); on("change:campaign:initiativepage", ()=>{ if (Campaign().get('initiativepage')) { handleTurnOrderChange(); }; }); });