|  |  | @@ -4289,4 +4289,48 @@ function toastRateLimit(msg, key, delay) { | 
		
	
		
			
			|  |  |  | delete rateLimits[key] | 
		
	
		
			
			|  |  |  | }, delay); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | let lastTime = undefined; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function pan(fromX, fromY, fromHeight, toX, toY, toHeight, duration) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | Object.keys(entities).forEach(key => { | 
		
	
		
			
			|  |  |  | document.querySelector("#entity-" + key).classList.add("no-transition"); | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | config.x = fromX; | 
		
	
		
			
			|  |  |  | config.y = fromY; | 
		
	
		
			
			|  |  |  | config.height = math.unit(fromHeight, "meters") | 
		
	
		
			
			|  |  |  | updateSizes(); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | lastTime = undefined; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | requestAnimationFrame((timestamp) => panTo(toX, toY, toHeight, (toX - fromX) / duration, (toY - fromY) / duration, (toHeight - fromHeight) / duration, timestamp, duration)); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function panTo(x, y, height, xSpeed, ySpeed, heightSpeed, timestamp, remaining) { | 
		
	
		
			
			|  |  |  | if (lastTime === undefined) { | 
		
	
		
			
			|  |  |  | lastTime = timestamp; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | dt = timestamp - lastTime; | 
		
	
		
			
			|  |  |  | remaining -= dt; | 
		
	
		
			
			|  |  |  | console.log(lastTime, remaining, dt) | 
		
	
		
			
			|  |  |  | if (remaining < 0) { | 
		
	
		
			
			|  |  |  | dt += remaining | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | let newX = config.x + xSpeed * dt; | 
		
	
		
			
			|  |  |  | let newY = config.y + ySpeed * dt; | 
		
	
		
			
			|  |  |  | let newHeight = config.height.toNumber("meters") + heightSpeed * dt; | 
		
	
		
			
			|  |  |  | console.log(newX); | 
		
	
		
			
			|  |  |  | if (remaining > 0) { | 
		
	
		
			
			|  |  |  | requestAnimationFrame((timestamp) => panTo(x, y, height, xSpeed, ySpeed, heightSpeed, timestamp, remaining)) | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | Object.keys(entities).forEach(key => { | 
		
	
		
			
			|  |  |  | document.querySelector("#entity-" + key).classList.remove("no-transition"); | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | config.x = newX; | 
		
	
		
			
			|  |  |  | config.y = newY; | 
		
	
		
			
			|  |  |  | config.height = math.unit(newHeight, "meters"); | 
		
	
		
			
			|  |  |  | updateSizes(); | 
		
	
		
			
			|  |  |  | } |