Fix combat loop: blacklist entities for 30s after engagement
The core problem: attacks don't deal damage (protocol issue), so mobs never die. entityGone fires spuriously, combat "ends", then the 2-second scan finds the same mob and re-engages endlessly. Fix: after combat ends for ANY reason, the entity ID is blacklisted for 30 seconds. The scan loop skips blacklisted entities. This prevents the infinite re-engage loop. The underlying damage issue still needs investigation, but at least Doug won't get stuck in an endless combat loop anymore. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9869181071
commit
7363e8589f
1 changed files with 15 additions and 1 deletions
|
|
@ -262,6 +262,8 @@ let combatActive = false;
|
|||
let combatTargetId = null;
|
||||
let combatInterval = null;
|
||||
let lastEquipCheck = 0;
|
||||
const combatBlacklist = new Map(); // entityId → timestamp (don't re-engage)
|
||||
const COMBAT_BLACKLIST_DURATION = 30000; // 30 seconds
|
||||
|
||||
function startCombat(target) {
|
||||
if (combatActive) return;
|
||||
|
|
@ -321,7 +323,11 @@ function endCombat(reason) {
|
|||
if (combatInterval) clearInterval(combatInterval);
|
||||
combatInterval = null;
|
||||
combatActive = false;
|
||||
log('client', 'INFO', `⚔ Combat ended: ${reason}`);
|
||||
// Blacklist this entity so we don't re-engage immediately
|
||||
if (combatTargetId != null) {
|
||||
combatBlacklist.set(combatTargetId, Date.now());
|
||||
}
|
||||
log('client', 'INFO', `Combat ended: ${reason} (blacklisted for 30s)`);
|
||||
sendEvent('combat_ended', { reason });
|
||||
combatTargetId = null;
|
||||
}
|
||||
|
|
@ -330,6 +336,12 @@ function endCombat(reason) {
|
|||
setInterval(() => {
|
||||
if (!spawned || combatActive) return;
|
||||
|
||||
// Clean expired blacklist entries
|
||||
const now = Date.now();
|
||||
for (const [id, time] of combatBlacklist) {
|
||||
if (now - time > COMBAT_BLACKLIST_DURATION) combatBlacklist.delete(id);
|
||||
}
|
||||
|
||||
const pos = bot.entity.position;
|
||||
let closestHostile = null;
|
||||
let closestDist = 8; // Aggro range
|
||||
|
|
@ -337,6 +349,8 @@ setInterval(() => {
|
|||
for (const entity of Object.values(bot.entities)) {
|
||||
if (entity === bot.entity || !entity.position) continue;
|
||||
if (!isHostile(entity)) continue;
|
||||
// Skip blacklisted entities (already fought, didn't die)
|
||||
if (combatBlacklist.has(entity.id)) continue;
|
||||
const dist = entity.position.distanceTo(pos);
|
||||
if (dist < closestDist) {
|
||||
closestDist = dist;
|
||||
|
|
|
|||
Loading…
Reference in a new issue