|  |  |  | @ -17,6 +17,8 @@ import engine.objects.PlayerCharacter;@@ -17,6 +17,8 @@ import engine.objects.PlayerCharacter; | 
			
		
	
		
			
				
					|  |  |  |  | import engine.objects.PlayerCombatStats; | 
			
		
	
		
			
				
					|  |  |  |  | import org.pmw.tinylog.Logger; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.concurrent.*; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | public class UpdateThread implements Runnable { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private volatile Long lastRun; | 
			
		
	
	
		
			
				
					|  |  |  | @ -27,36 +29,45 @@ public class UpdateThread implements Runnable {@@ -27,36 +29,45 @@ public class UpdateThread implements Runnable { | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private static final long INSTANCE_DELAY = 1500; // Adjust as needed
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void processPlayerUpdate() { | 
			
		
	
		
			
				
					|  |  |  |  |         ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         try { | 
			
		
	
		
			
				
					|  |  |  |  |             for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()){ | 
			
		
	
		
			
				
					|  |  |  |  |             for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 if (player != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                     player.update(true); | 
			
		
	
		
			
				
					|  |  |  |  |                     Future<?> future = executor.submit(() -> { | 
			
		
	
		
			
				
					|  |  |  |  |                         try { | 
			
		
	
		
			
				
					|  |  |  |  |                             player.update(true); | 
			
		
	
		
			
				
					|  |  |  |  |                         } catch (Exception e) { | 
			
		
	
		
			
				
					|  |  |  |  |                             Logger.error(e); | 
			
		
	
		
			
				
					|  |  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |  |                     }); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     try { | 
			
		
	
		
			
				
					|  |  |  |  |                         future.get(10, TimeUnit.SECONDS); // Enforce max execution time
 | 
			
		
	
		
			
				
					|  |  |  |  |                     } catch (TimeoutException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                         Logger.error("Player update timed out for: " + player.getName()); | 
			
		
	
		
			
				
					|  |  |  |  |                         future.cancel(true); // Attempt to cancel the task
 | 
			
		
	
		
			
				
					|  |  |  |  |                     } catch (Exception e) { | 
			
		
	
		
			
				
					|  |  |  |  |                         Logger.error(e); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } catch (Exception e) { | 
			
		
	
		
			
				
					|  |  |  |  |             Logger.error("UPDATE ERROR",e); | 
			
		
	
		
			
				
					|  |  |  |  |             Logger.error("UPDATE ERROR", e); | 
			
		
	
		
			
				
					|  |  |  |  |         } finally { | 
			
		
	
		
			
				
					|  |  |  |  |             executor.shutdown(); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     @Override | 
			
		
	
		
			
				
					|  |  |  |  |     public void run() { | 
			
		
	
		
			
				
					|  |  |  |  |         lastRun = System.currentTimeMillis(); | 
			
		
	
		
			
				
					|  |  |  |  |         while (true) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition
 | 
			
		
	
		
			
				
					|  |  |  |  |                 this.processPlayerUpdate(); | 
			
		
	
		
			
				
					|  |  |  |  |                 lastRun = System.currentTimeMillis(); // Update lastRun after processing
 | 
			
		
	
		
			
				
					|  |  |  |  |             }else { | 
			
		
	
		
			
				
					|  |  |  |  |                 try { | 
			
		
	
		
			
				
					|  |  |  |  |                     Thread.sleep(1500); // Pause for 1500ms to reduce CPU usage
 | 
			
		
	
		
			
				
					|  |  |  |  |                 } catch (InterruptedException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                     Logger.error("Thread interrupted", e); | 
			
		
	
		
			
				
					|  |  |  |  |                     Thread.currentThread().interrupt(); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             Thread.yield(); | 
			
		
	
		
			
				
					|  |  |  |  |         try { | 
			
		
	
		
			
				
					|  |  |  |  |             processPlayerUpdate(); | 
			
		
	
		
			
				
					|  |  |  |  |         } catch (Exception e) { | 
			
		
	
		
			
				
					|  |  |  |  |             Logger.error("Thread Execution Error", e); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |