diff --git a/config/template/config.yaml b/config/template/config.yaml index 823782b0e..11db19054 100644 --- a/config/template/config.yaml +++ b/config/template/config.yaml @@ -83,6 +83,7 @@ game: killDiablo: true # Should bot kill Diablo after seals clearArea: true # Should bot clear Chaos Sanctuary onlyElites: true # Should bot target only elites + sealPop: false # seal pop traverse CS baal: killBaal: false dollQuit: false diff --git a/internal/config/config.go b/internal/config/config.go index 2bf0a66ed..478183891 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -191,6 +191,7 @@ type CharacterCfg struct { FocusOnElitePacks bool `yaml:"focusOnElitePacks"` DisableItemPickupDuringBosses bool `yaml:"disableItemPickupDuringBosses"` AttackFromDistance int `yaml:"attackFromDistance"` + SealPop bool `yaml:"sealPop"` } `yaml:"diablo"` Baal struct { KillBaal bool `yaml:"killBaal"` diff --git a/internal/run/diablo.go b/internal/run/diablo.go index f7d9a3404..f8ea7af73 100644 --- a/internal/run/diablo.go +++ b/internal/run/diablo.go @@ -14,6 +14,7 @@ import ( var diabloSpawnPosition = data.Position{X: 7792, Y: 5294} var chaosNavToPosition = data.Position{X: 7732, Y: 5292} //into path towards vizier +var sealPopChaosEntrace = data.Position{X: 7794, Y: 5558} type Diablo struct { ctx *context.Status @@ -95,6 +96,30 @@ func (d *Diablo) Run() error { } } + // Check for seal pop config and if this is the last seal + if d.ctx.CharacterCfg.Game.Diablo.SealPop && sealID == object.DiabloSeal2 { + + // Buff so bot doesnt buff before opening last seal + action.Buff() + + // Extra clear so bot doesnt target when coming back + action.ClearAreaAroundPlayer(30, data.MonsterAnyFilter()) + + // Disable item pickup before traversing since we will be going back after seal pop + d.ctx.DisableItemPickup() + + // Traverse the sanctuary to reactivate monsters + if err = d.traverseSanctuary(d.ctx.Data.PlayerUnit.Position); err != nil { + // Enable item pickup if traverse fails + d.ctx.EnableItemPickup() + return err + } + + // Re enable item pickup on success + d.ctx.EnableItemPickup() + + } + // Clear everything around the seal action.ClearAreaAroundPlayer(10, d.ctx.Data.MonsterFilterAnyReachable()) @@ -107,7 +132,26 @@ func (d *Diablo) Run() error { seal, _ = d.ctx.Data.Objects.FindOne(sealID) return !seal.Selectable }); err != nil { - return fmt.Errorf("failed to interact with seal: %w", err) + // Rerunning seal attempt with a random movement first before erroring out, seems to resolve most failed to interact + d.ctx.PathFinder.RandomMovement() + if err = action.InteractObject(seal, func() bool { + seal, _ = d.ctx.Data.Objects.FindOne(sealID) + return !seal.Selectable + }); err != nil { + return fmt.Errorf("failed to interact with seal: %w", err) + } + } + + // Traverse sanctuary to check for items that may have dropped from activated monsters + if d.ctx.CharacterCfg.Game.Diablo.SealPop && sealID == object.DiabloSeal2 { + + // Make sure item pickup is enabled + d.ctx.EnableItemPickup() + + // Traverse the sanctuary to loot reactivate monsters, end at Diablo + if err = d.traverseSanctuary(diabloSpawnPosition); err != nil { + return err + } } // Infector spawns when first seal is enabled @@ -130,7 +174,10 @@ func (d *Diablo) Run() error { } if d.ctx.CharacterCfg.Game.Diablo.KillDiablo { - action.Buff() + // Bot will buff while seal popping, no need to force it if popping + if !d.ctx.CharacterCfg.Game.Diablo.SealPop { + action.Buff() + } action.MoveToCoords(diabloSpawnPosition) @@ -184,3 +231,18 @@ func (d *Diablo) getMonsterFilter() data.MonsterFilter { return filteredMonsters } } + +func (d *Diablo) traverseSanctuary(lastCoords data.Position) error { + d.ctx.Logger.Debug("Traversing Chaos Sanctuary for Seal POP") + + // Move to sanctuary entrance + if err := action.MoveToCoords(sealPopChaosEntrace); err != nil { + return err + } + //Move back to last coords + if err := action.MoveToCoords(lastCoords); err != nil { + return err + } + + return nil +} diff --git a/internal/server/http_server.go b/internal/server/http_server.go index dc49c60fb..c3c600f5f 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -921,6 +921,7 @@ func (s *HttpServer) characterSettings(w http.ResponseWriter, r *http.Request) { } cfg.Game.Diablo.AttackFromDistance = attackFromDistance } + cfg.Game.Diablo.SealPop = r.Form.Has("gameDiabloSealPop") cfg.Game.Leveling.EnsurePointsAllocation = r.Form.Has("gameLevelingEnsurePointsAllocation") cfg.Game.Leveling.EnsureKeyBinding = r.Form.Has("gameLevelingEnsureKeyBinding") diff --git a/internal/server/templates/run_settings_components.gohtml b/internal/server/templates/run_settings_components.gohtml index 9ff0836ce..0140f6c85 100644 --- a/internal/server/templates/run_settings_components.gohtml +++ b/internal/server/templates/run_settings_components.gohtml @@ -131,6 +131,7 @@ Clear Options + {{ end }}