From 5670da8d96c56ea1929ff0716ebc9d1476b65a40 Mon Sep 17 00:00:00 2001
From: FatBoy-DOTC <justin.chucksinsulating@gmail.com>
Date: Sun, 16 Feb 2025 17:52:34 -0600
Subject: [PATCH] player update optimized

---
 src/engine/mobileAI/MobAI.java            |  1 -
 src/engine/workthreads/ProcessUpdate.java | 42 +++++++++++++++++++++++
 src/engine/workthreads/UpdateThread.java  | 42 +++++++++--------------
 3 files changed, 58 insertions(+), 27 deletions(-)
 create mode 100644 src/engine/workthreads/ProcessUpdate.java

diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java
index 2b8fa877..ea764d7d 100644
--- a/src/engine/mobileAI/MobAI.java
+++ b/src/engine/mobileAI/MobAI.java
@@ -1204,7 +1204,6 @@ public class MobAI {
         try {
 
             //check for players that can be aggroed if mob is agressive and has no target
-            Enum.GameObjectType targetType = mob.getCombatTarget().getObjectType();
             if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false && !mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.Mob))
                 mob.setCombatTarget(null);
 
diff --git a/src/engine/workthreads/ProcessUpdate.java b/src/engine/workthreads/ProcessUpdate.java
new file mode 100644
index 00000000..7c4ab1d6
--- /dev/null
+++ b/src/engine/workthreads/ProcessUpdate.java
@@ -0,0 +1,42 @@
+package engine.workthreads;
+
+import engine.job.AbstractJob;
+import engine.job.JobThread;
+import engine.objects.PlayerCharacter;
+import org.pmw.tinylog.Logger;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class ProcessUpdate implements Runnable{
+    private final ReentrantLock lock = new ReentrantLock();
+    private PlayerCharacter playerCharacter;
+    public ProcessUpdate(PlayerCharacter pc){
+        this.playerCharacter = pc;
+    }
+
+    public void run() {
+        try {
+            if (this.playerCharacter != null) {
+                if (lock.tryLock(10, TimeUnit.SECONDS)) { // Timeout to prevent deadlock
+                    try {
+                        this.playerCharacter.update(true);
+                    } finally {
+                        lock.unlock();
+                    }
+                } else {
+                    Logger.warn("JobThread could not acquire lock in time, skipping job.");
+                }
+            }
+        } catch (Exception e) {
+            Logger.error(e);
+        }
+    }
+
+    public static void startUpdate(PlayerCharacter pc) {
+        ProcessUpdate updateThread = new ProcessUpdate(pc);
+        Thread thread = new Thread(updateThread);
+        thread.setName(pc.getObjectUUID() + " UPDATE");
+        thread.start();
+    }
+}
diff --git a/src/engine/workthreads/UpdateThread.java b/src/engine/workthreads/UpdateThread.java
index 411fd3cd..7f2dc10c 100644
--- a/src/engine/workthreads/UpdateThread.java
+++ b/src/engine/workthreads/UpdateThread.java
@@ -32,33 +32,22 @@ 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()) {
+        //        if (player != null) {
+        //            try {
+        //                player.update(true);
+        //            } catch (Exception e) {
+        //                Logger.error(e);
+        //            }
+        //        }
+         //   }
+        //}catch(Exception e){
+        //    Logger.error(e);
+        //}
 
-        try {
-            for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
-                if (player != null) {
-                    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);
-        } finally {
-            executor.shutdown();
+        for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
+            ProcessUpdate.startUpdate(player);
         }
     }
 
@@ -66,6 +55,7 @@ public class UpdateThread implements Runnable {
     public void run() {
         try {
             processPlayerUpdate();
+            Thread.sleep(1000);
         } catch (Exception e) {
             Logger.error("Thread Execution Error", e);
         }