diff --git a/pkg/data/data.go b/pkg/data/data.go index 939f4dc..dcbb68a 100644 --- a/pkg/data/data.go +++ b/pkg/data/data.go @@ -139,6 +139,7 @@ type Corpse struct { Found bool IsHovered bool Position Position + States state.States } type Position struct { @@ -290,3 +291,23 @@ type OpenMenus struct { func (om OpenMenus) IsMenuOpen() bool { return om.Inventory || om.NPCInteract || om.NPCShop || om.Stash || om.Waypoint || om.SkillTree || om.Character || om.QuitMenu || om.Cube || om.SkillSelect || om.Anvil } +func (c Corpse) StateNotInteractable() bool { + CorpseStates := []state.State{ + state.CorpseNoselect, + state.CorpseNodraw, + state.Revive, + state.Redeemed, + state.Shatter, + state.Freeze, + } + + for _, s := range c.States { + for _, d := range CorpseStates { + if s == d { + return true + } + } + } + + return false +} diff --git a/pkg/data/npc.go b/pkg/data/npc.go index 192a649..227b84e 100644 --- a/pkg/data/npc.go +++ b/pkg/data/npc.go @@ -3,6 +3,7 @@ package data import ( "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/stat" + "github.com/hectorgimenez/d2go/pkg/data/state" ) type NPC struct { @@ -20,6 +21,7 @@ type Monster struct { Position Position Stats map[stat.ID]int Type MonsterType + States state.States } type Monsters []Monster diff --git a/pkg/memory/game_reader.go b/pkg/memory/game_reader.go index c97aca9..d292958 100644 --- a/pkg/memory/game_reader.go +++ b/pkg/memory/game_reader.go @@ -44,6 +44,7 @@ func (gd *GameReader) GetData() data.Data { Found: corpseUnit.Address != 0, IsHovered: corpseUnit.IsHovered, Position: corpseUnit.Position, + States: corpseUnit.States, }, Game: data.OnlineGame{ LastGameName: gd.LastGameName(), diff --git a/pkg/memory/monsters.go b/pkg/memory/monsters.go index 71e505b..14e5fda 100644 --- a/pkg/memory/monsters.go +++ b/pkg/memory/monsters.go @@ -48,6 +48,7 @@ func (gd *GameReader) Monsters(playerPosition data.Position, hover data.HoverDat statCount := gd.Process.ReadUInt(statsListExPtr+0x38, Uint64) stats := gd.getMonsterStats(statCount, statPtr) + states := gd.GetStates(statsListExPtr) // This excludes good NPCs but includes Mercs if !gd.shouldBeIgnored(txtFileNo) || stats[stat.Experience] > 0 { @@ -59,8 +60,9 @@ func (gd *GameReader) Monsters(playerPosition data.Position, hover data.HoverDat X: int(posX), Y: int(posY), }, - Stats: stats, - Type: getMonsterType(flag), + Stats: stats, + Type: getMonsterType(flag), + States: states, } if isCorpse == 0 { @@ -146,6 +148,7 @@ func (gd *GameReader) Corpses(playerPosition data.Position, hover data.HoverData statCount := gd.Process.ReadUInt(statsListExPtr+0x38, Uint64) stats := gd.getMonsterStats(statCount, statPtr) + states := gd.GetStates(statsListExPtr) hovered := hover.IsHovered && hover.UnitType == 1 && hover.UnitID == data.UnitID(unitID) @@ -158,8 +161,9 @@ func (gd *GameReader) Corpses(playerPosition data.Position, hover data.HoverData X: int(posX), Y: int(posY), }, - Stats: stats, - Type: getMonsterType(flag), + Stats: stats, + Type: getMonsterType(flag), + States: states, } corpses = append(corpses, m) diff --git a/pkg/memory/player.go b/pkg/memory/player.go index 68a3e07..8ba9514 100644 --- a/pkg/memory/player.go +++ b/pkg/memory/player.go @@ -45,7 +45,7 @@ func (gd *GameReader) GetRawPlayerUnits() RawPlayerUnits { statsListExPtr := uintptr(gd.Process.ReadUInt(playerUnit+0x88, Uint64)) baseStats := gd.getStatsList(statsListExPtr + 0x30) stats := gd.getStatsList(statsListExPtr + 0x88) - states := gd.getStates(statsListExPtr) + states := gd.GetStates(statsListExPtr) rawPlayerUnits = append(rawPlayerUnits, RawPlayerUnit{ UnitID: data.UnitID(unitID), @@ -140,8 +140,8 @@ func (gd *GameReader) getSkills(skillListPtr uintptr) map[skill.ID]skill.Points return skills } -func (gd *GameReader) getStates(statsListExPtr uintptr) []state.State { - var states []state.State +func (gd *GameReader) GetStates(statsListExPtr uintptr) state.States { + var states state.States for i := 0; i < 6; i++ { offset := i * 4 stateByte := gd.Process.ReadUInt(statsListExPtr+0xAD0+uintptr(offset), Uint32)