Hooks.on("updateToken", (token, updates) => { if(!token?.object?.controlled) return; if("elevation" in updates) CONFIG.Levels.handlers.RefreshHandler.refreshPlaceables(); }) Hooks.on("controlToken", (token, controlled)=>{ if(controlled){ CONFIG.Levels.currentToken = canvas.tokens.controlled.find(t => t.document.sight.enabled) ?? canvas.tokens.controlled[0]; }else{ if(game.user.isGM && !canvas.tokens.controlled.length) CONFIG.Levels.currentToken = null; } CONFIG.Levels.handlers.RefreshHandler.refreshPlaceables(); }) Hooks.on("preUpdateToken", (token,updates) => { if(token?.object?.controlled) CONFIG.Levels.handlers.DrawingHandler.executeStairs(updates, token); if(token.object && "elevation" in updates && !CONFIG.Levels?.useCollision3D){ const elevDiff = token.object.document.elevation - updates.elevation; const p0 = {x:token.object.x,y:token.object.y,z:updates.elevation} const p1 = {x:token.object.x,y:token.object.y,z:token.object.losHeight-elevDiff+0.1} const collision = CONFIG.Levels.handlers.SightHandler.testCollision(p0, p1, "collision") if(collision){ ui.notifications.error(game.i18n.localize("levels.err.collision")) if(!game.user.isGM) delete updates.elevation } } })