Compare commits

...

14 Commits

Author SHA1 Message Date
FatBoy 0b18afc211 player update optimized 2025-02-16 17:57:34 -06:00
FatBoy 5670da8d96 player update optimized 2025-02-16 17:52:34 -06:00
FatBoy d2d236aa93 player update optimized 2025-02-16 17:40:08 -06:00
FatBoy 9b5d32b70b mob AI aggro 2025-02-16 17:32:24 -06:00
FatBoy 8e158e1d27 mob AI aggro 2025-02-16 17:21:52 -06:00
FatBoy 8c166c8d4b mob AI aggro 2025-02-16 17:20:23 -06:00
FatBoy 3b12faee9e mob AI aggro 2025-02-16 17:17:04 -06:00
FatBoy 243403782d Revert "mob AI aggro"
This reverts commit 9e1e12b177.
2025-02-16 17:16:25 -06:00
FatBoy 9e1e12b177 mob AI aggro 2025-02-16 17:12:17 -06:00
FatBoy 1c1578595f mob AI aggro 2025-02-16 17:08:48 -06:00
FatBoy e5f47a7d73 mob AI aggro 2025-02-16 17:03:38 -06:00
FatBoy 7d80363d65 mob AI aggro 2025-02-16 16:55:15 -06:00
FatBoy 1a95bc8e27 dead players dont get XP 2025-02-16 16:45:49 -06:00
FatBoy 473003ed44 hot fix for regen 2025-02-16 16:44:31 -06:00
5 changed files with 99 additions and 48 deletions
+31 -26
View File
@@ -109,7 +109,6 @@ public class MobAI {
if(target.getPet() != null && target.getPet().isAlive()){ if(target.getPet() != null && target.getPet().isAlive()){
mob.setCombatTarget(target.getPet()); mob.setCombatTarget(target.getPet());
return;
} }
if (mob.BehaviourType.callsForHelp) if (mob.BehaviourType.callsForHelp)
@@ -265,6 +264,9 @@ public class MobAI {
target.setCombatTarget(mob); target.setCombatTarget(mob);
} }
} }
if(target.combatTarget == null)
target.setCombatTarget(mob);
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
} }
@@ -724,8 +726,8 @@ public class MobAI {
DefaultLogic(mob); DefaultLogic(mob);
break; break;
} }
if(mob.isAlive()) //if(mob.isAlive())
RecoverHealth(mob); // RecoverHealth(mob);
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage());
} }
@@ -735,6 +737,10 @@ public class MobAI {
try { try {
//do not switch target if you already have one, dropping out of range is handled elsewhere
if(aiAgent.combatTarget != null)
return;
//looks for and sets mobs combatTarget //looks for and sets mobs combatTarget
if (!aiAgent.isAlive()) if (!aiAgent.isAlive())
@@ -1102,17 +1108,17 @@ public class MobAI {
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob); //AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
if (newTarget != null) { //if (newTarget != null) {
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) { // if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
if (GuardCanAggro(mob, (PlayerCharacter) newTarget)) // if (GuardCanAggro(mob, (PlayerCharacter) newTarget))
mob.setCombatTarget(newTarget); // mob.setCombatTarget(newTarget);
} else // } else
mob.setCombatTarget(newTarget); // mob.setCombatTarget(newTarget);
} //}
CheckMobMovement(mob); CheckMobMovement(mob);
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
@@ -1198,25 +1204,24 @@ public class MobAI {
try { try {
//check for players that can be aggroed if mob is agressive and has no target //check for players that can be aggroed if mob is agressive and has no target
if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false && !mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.Mob))
if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false)
mob.setCombatTarget(null); mob.setCombatTarget(null);
if (mob.BehaviourType.isAgressive) { //if (mob.BehaviourType.isAgressive) {
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob); // AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
if (newTarget != null) // if (newTarget != null)
mob.setCombatTarget(newTarget); // mob.setCombatTarget(newTarget);
else { // else {
if (mob.getCombatTarget() == null) { // if (mob.getCombatTarget() == null) {
if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard) // if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard)
SafeGuardAggro(mob); //safehold guard // SafeGuardAggro(mob); //safehold guard
else // else
CheckForAggro(mob); //normal aggro // CheckForAggro(mob); //normal aggro
} // }
} // }
} //}
//check if mob can move for patrol or moving to target //check if mob can move for patrol or moving to target
+3
View File
@@ -367,6 +367,9 @@ public class Experience {
if (member.getLevel() >= MBServerStatics.LEVELCAP) if (member.getLevel() >= MBServerStatics.LEVELCAP)
continue; continue;
if(!member.isAlive())
continue;
if(member.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) if(member.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
continue; // cannot PVE higher than level 75 continue; // cannot PVE higher than level 75
+2 -2
View File
@@ -5177,8 +5177,8 @@ public class PlayerCharacter extends AbstractCharacter {
} else { } else {
this.combatStats.update(); this.combatStats.update();
} }
//this.doRegen(); this.doRegen();
this.combatStats.regenerate(); //this.combatStats.regenerate();
} }
if (this.getStamina() < 10) { if (this.getStamina() < 10) {
+42
View File
@@ -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();
}
}
+21 -20
View File
@@ -17,6 +17,8 @@ import engine.objects.PlayerCharacter;
import engine.objects.PlayerCombatStats; import engine.objects.PlayerCombatStats;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.concurrent.*;
public class UpdateThread implements Runnable { public class UpdateThread implements Runnable {
private volatile Long lastRun; private volatile Long lastRun;
@@ -27,36 +29,35 @@ public class UpdateThread implements Runnable {
} }
public void processPlayerUpdate() { private static final long INSTANCE_DELAY = 1500; // Adjust as needed
public void processPlayerUpdate() {
try { try {
for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()){ for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
if (player != null) { if (player != null) {
player.update(true); try {
player.update(true);
} catch (Exception e) {
Logger.error(e);
}
} }
} }
} catch (Exception e) { }catch(Exception e){
Logger.error("UPDATE ERROR",e); Logger.error(e);
} }
//for (PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) {
// ProcessUpdate.startUpdate(player);
//}
} }
@Override
public void run() { public void run() {
lastRun = System.currentTimeMillis(); try {
while (true) { processPlayerUpdate();
if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition Thread.sleep(100);
this.processPlayerUpdate(); } catch (Exception e) {
lastRun = System.currentTimeMillis(); // Update lastRun after processing Logger.error("Thread Execution Error", e);
}else {
try {
Thread.sleep(100); // Pause for 100ms to reduce CPU usage
} catch (InterruptedException e) {
Logger.error("Thread interrupted", e);
Thread.currentThread().interrupt();
}
}
Thread.yield();
} }
} }