Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b18afc211 | |||
| 5670da8d96 | |||
| d2d236aa93 | |||
| 9b5d32b70b | |||
| 8e158e1d27 | |||
| 8c166c8d4b | |||
| 3b12faee9e | |||
| 243403782d | |||
| 9e1e12b177 | |||
| 1c1578595f | |||
| e5f47a7d73 | |||
| 7d80363d65 | |||
| 1a95bc8e27 | |||
| 473003ed44 |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user