* Update data.go

Added corpses check

* Update game_reader.go

Added corpse finder function

* Update monsters.go

added corpse finder function
This commit is contained in:
TDL
2024-08-10 13:02:36 +02:00
committed by GitHub
parent 938bfeb753
commit 8e67284940
3 changed files with 67 additions and 0 deletions

View File

@@ -27,6 +27,7 @@ type Data struct {
AreaOrigin Position AreaOrigin Position
Corpse Corpse Corpse Corpse
Monsters Monsters Monsters Monsters
Corpses Monsters
// First slice represents X and second Y // First slice represents X and second Y
CollisionGrid [][]bool CollisionGrid [][]bool
PlayerUnit PlayerUnit PlayerUnit PlayerUnit

View File

@@ -49,6 +49,7 @@ func (gd *GameReader) GetData() data.Data {
Position: corpseUnit.Position, Position: corpseUnit.Position,
}, },
Monsters: gd.Monsters(pu.Position, hover), Monsters: gd.Monsters(pu.Position, hover),
Corpses: gd.Corpses(pu.Position, hover),
PlayerUnit: pu, PlayerUnit: pu,
Inventory: gd.Inventory(rawPlayerUnits, hover), Inventory: gd.Inventory(rawPlayerUnits, hover),
Objects: gd.Objects(pu.Position, hover), Objects: gd.Objects(pu.Position, hover),

View File

@@ -113,6 +113,71 @@ func (gd *GameReader) getMonsterStats(statCount uint, statPtr uintptr) map[stat.
return stats return stats
} }
func (gd *GameReader) Corpses(playerPosition data.Position, hover data.HoverData) data.Monsters {
baseAddr := gd.Process.moduleBaseAddressPtr + gd.offset.UnitTable + 1024
unitTableBuffer := gd.Process.ReadBytesFromMemory(baseAddr, 128*8)
corpses := data.Monsters{}
for i := 0; i < 128; i++ {
monsterOffset := 8 * i
monsterUnitPtr := uintptr(ReadUIntFromBuffer(unitTableBuffer, uint(monsterOffset), Uint64))
for monsterUnitPtr > 0 {
monsterDataBuffer := gd.Process.ReadBytesFromMemory(monsterUnitPtr, 144)
txtFileNo := ReadUIntFromBuffer(monsterDataBuffer, 0x04, Uint32)
unitID := ReadUIntFromBuffer(monsterDataBuffer, 0x08, Uint32)
unitDataPtr := uintptr(ReadUIntFromBuffer(monsterDataBuffer, 0x10, Uint64))
flag := gd.Process.ReadBytesFromMemory(unitDataPtr+0x1A, Uint8)[0]
isCorpse := gd.Process.ReadUInt(monsterUnitPtr+0x1A6, Uint8)
if isCorpse == 0 {
monsterUnitPtr = uintptr(gd.Process.ReadUInt(monsterUnitPtr+0x150, Uint64))
continue
}
pathPtr := uintptr(gd.Process.ReadUInt(monsterUnitPtr+0x38, Uint64))
posX := gd.Process.ReadUInt(pathPtr+0x02, Uint16)
posY := gd.Process.ReadUInt(pathPtr+0x06, Uint16)
statsListExPtr := uintptr(ReadUIntFromBuffer(monsterDataBuffer, 0x88, Uint64))
statPtr := uintptr(gd.Process.ReadUInt(statsListExPtr+0x30, Uint64))
statCount := gd.Process.ReadUInt(statsListExPtr+0x38, Uint64)
stats := gd.getMonsterStats(statCount, statPtr)
hovered := hover.IsHovered && hover.UnitType == 1 && hover.UnitID == data.UnitID(unitID)
if (!gd.shouldBeIgnored(txtFileNo) || stats[stat.Experience] > 0) && isCorpse != 0 {
m := data.Monster{
UnitID: data.UnitID(unitID),
Name: npc.ID(int(txtFileNo)),
IsHovered: hovered,
Position: data.Position{
X: int(posX),
Y: int(posY),
},
Stats: stats,
Type: getMonsterType(flag),
}
corpses = append(corpses, m)
}
monsterUnitPtr = uintptr(gd.Process.ReadUInt(monsterUnitPtr+0x150, Uint64))
}
}
sort.SliceStable(corpses, func(i, j int) bool {
distanceI := utils.DistanceFromPoint(playerPosition, corpses[i].Position)
distanceJ := utils.DistanceFromPoint(playerPosition, corpses[j].Position)
return distanceI < distanceJ
})
return corpses
}
func (gd *GameReader) shouldBeIgnored(txtNo uint) bool { func (gd *GameReader) shouldBeIgnored(txtNo uint) bool {
switch npc.ID(txtNo) { switch npc.ID(txtNo) {
case npc.Chicken, case npc.Chicken,