New quest offset and structure

Credits to gogigogi1
This commit is contained in:
elb
2024-12-09 21:32:24 -05:00
committed by Héctor Giménez
parent 889fa020f2
commit 77bf135bf8
4 changed files with 59 additions and 53 deletions

View File

@@ -5,7 +5,7 @@ type Status int16
type States []Status type States []Status
func (s States) Completed() bool { func (s States) Completed() bool {
return s.HasStatus(StatusUpdateQuestLogCompleted) return s.HasStatus(StatusUpdateQuestLogCompleted) || s.HasStatus(StatusPrimaryGoalCompleted) || s.HasStatus(StatusUnknown1) || s.HasStatus(StatusUnknown2)
} }
func (s States) HasStatus(st Status) bool { func (s States) HasStatus(st Status) bool {
@@ -18,6 +18,7 @@ func (s States) HasStatus(st Status) bool {
return false return false
} }
// Note that quest order isnt what is represented visually in game
const ( const (
Act1DenOfEvil Quest = iota Act1DenOfEvil Quest = iota
Act1SistersBurialGrounds Act1SistersBurialGrounds

View File

@@ -1,18 +1,16 @@
package quest package quest
const ( const (
StatusRewardGranted Status = iota StatusQuestNotStarted Status = iota
StatusRewardPending
StatusQuestInitiated
StatusLeaveTown
StatusEnterFirstArea
StatusInProgress1 StatusInProgress1
StatusInProgress2 StatusInProgress2
StatusInProgress3 StatusInProgress3
StatusInProgress4 StatusInProgress4
StatusInProgress5 StatusInProgress5
StatusInProgress6 StatusInProgress6
StatusInProgress7 StatusInProgress8
StatusInProgress9
StatusInProgress10
StatusUpdateQuestLogCompleted StatusUpdateQuestLogCompleted
StatusPrimaryGoalCompleted StatusPrimaryGoalCompleted
StatusUnknown1 StatusUnknown1

View File

@@ -32,11 +32,12 @@ func (gd *GameReader) GetData() data.Data {
hover := gd.hoveredData() hover := gd.hoveredData()
// Quests // Quests
q1 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22E2978, Uint64)) // q1 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22E2978, Uint64))
q2 := uintptr(gd.Process.ReadUInt(q1, Uint64)) // q2 := uintptr(gd.Process.ReadUInt(q1, Uint64))
gameQuestsBytes := gd.Process.ReadBytesFromMemory(q2, 85) // q2 := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+0x22F1E79, Uint64))
gameQuestsBytes := gd.Process.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x22F1E79, 85)
gameQuestsBytes = gameQuestsBytes[3:] // gameQuestsBytes = gameQuestsBytes[3:]
corpseUnit := rawPlayerUnits.GetCorpse() corpseUnit := rawPlayerUnits.GetCorpse()
d := data.Data{ d := data.Data{

View File

@@ -1,60 +1,66 @@
package memory package memory
import ( import (
"fmt"
"github.com/hectorgimenez/d2go/pkg/data/quest" "github.com/hectorgimenez/d2go/pkg/data/quest"
) )
func (gd *GameReader) getQuests(questBytes []byte) quest.Quests { func (gd *GameReader) getQuests(questBytes []byte) quest.Quests {
return quest.Quests{ return quest.Quests{
// Act 1 // Act 1
quest.Act1DenOfEvil: gd.getQuestStatus([2]byte(questBytes[0:2])), quest.Act1DenOfEvil: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 0, 1)),
quest.Act1SistersBurialGrounds: gd.getQuestStatus([2]byte(questBytes[2:4])), quest.Act1SistersBurialGrounds: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 1, 1)),
quest.Act1ToolsOfTheTrade: gd.getQuestStatus([2]byte(questBytes[4:6])), quest.Act1ToolsOfTheTrade: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 2, 1)),
quest.Act1TheSearchForCain: gd.getQuestStatus([2]byte(questBytes[6:8])), quest.Act1TheSearchForCain: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 3, 1)),
quest.Act1TheForgottenTower: gd.getQuestStatus([2]byte(questBytes[8:10])), quest.Act1TheForgottenTower: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 4, 1)),
quest.Act1SistersToTheSlaughter: gd.getQuestStatus([2]byte(questBytes[10:12])), quest.Act1SistersToTheSlaughter: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 5, 1)),
// Act 2 // Act 2
quest.Act2RadamentsLair: gd.getQuestStatus([2]byte(questBytes[16:18])), quest.Act2RadamentsLair: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 8, 1)),
quest.Act2TheHoradricStaff: gd.getQuestStatus([2]byte(questBytes[18:20])), quest.Act2TheHoradricStaff: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 9, 1)),
quest.Act2TaintedSun: gd.getQuestStatus([2]byte(questBytes[20:22])), quest.Act2TaintedSun: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 10, 1)),
quest.Act2ArcaneSanctuary: gd.getQuestStatus([2]byte(questBytes[22:24])), quest.Act2ArcaneSanctuary: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 11, 1)),
quest.Act2TheSummoner: gd.getQuestStatus([2]byte(questBytes[24:26])), quest.Act2TheSummoner: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 12, 1)),
quest.Act2TheSevenTombs: gd.getQuestStatus([2]byte(questBytes[26:28])), quest.Act2TheSevenTombs: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 13, 1)),
// Act 3 // Act 3
quest.Act3LamEsensTome: gd.getQuestStatus([2]byte(questBytes[32:34])), quest.Act3LamEsensTome: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 16, 1)),
quest.Act3KhalimsWill: gd.getQuestStatus([2]byte(questBytes[34:36])), quest.Act3KhalimsWill: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 17, 1)),
quest.Act3BladeOfTheOldReligion: gd.getQuestStatus([2]byte(questBytes[36:38])), quest.Act3BladeOfTheOldReligion: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 18, 1)),
quest.Act3TheGoldenBird: gd.getQuestStatus([2]byte(questBytes[38:40])), quest.Act3TheGoldenBird: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 19, 1)),
quest.Act3TheBlackenedTemple: gd.getQuestStatus([2]byte(questBytes[40:42])), quest.Act3TheBlackenedTemple: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 20, 1)),
quest.Act3TheGuardian: gd.getQuestStatus([2]byte(questBytes[42:44])), quest.Act3TheGuardian: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 21, 1)),
// Act 4 // Act 4
quest.Act4TheFallenAngel: gd.getQuestStatus([2]byte(questBytes[48:50])), quest.Act4TheFallenAngel: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 24, 1)),
quest.Act4TerrorsEnd: gd.getQuestStatus([2]byte(questBytes[50:52])), quest.Act4TerrorsEnd: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 25, 1)),
quest.Act4HellForge: gd.getQuestStatus([2]byte(questBytes[52:54])), quest.Act4HellForge: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 26, 1)),
// Act 5 // Act 5
quest.Act5SiegeOnHarrogath: gd.getQuestStatus([2]byte(questBytes[68:70])), quest.Act5SiegeOnHarrogath: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 34, 1)),
quest.Act5RescueOnMountArreat: gd.getQuestStatus([2]byte(questBytes[70:72])), quest.Act5RescueOnMountArreat: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 35, 1)),
quest.Act5PrisonOfIce: gd.getQuestStatus([2]byte(questBytes[72:74])), quest.Act5PrisonOfIce: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 36, 1)),
quest.Act5BetrayalOfHarrogath: gd.getQuestStatus([2]byte(questBytes[74:76])), quest.Act5BetrayalOfHarrogath: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 37, 1)),
quest.Act5RiteOfPassage: gd.getQuestStatus([2]byte(questBytes[76:78])), quest.Act5RiteOfPassage: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 38, 1)),
quest.Act5EveOfDestruction: gd.getQuestStatus([2]byte(questBytes[78:80])), quest.Act5EveOfDestruction: gd.getQuestStatus(ReadUIntFromBuffer(questBytes, 39, 1)),
} }
} }
func (gd *GameReader) getQuestStatus(questStatusInt uint) []quest.Status {
func (gd *GameReader) getQuestStatus(questBytes [2]byte) []quest.Status {
combinedValue := uint16(questBytes[0])<<8 | uint16(questBytes[1])
binaryRepresentation := fmt.Sprintf("%016b", combinedValue)
var activeStates []quest.Status var activeStates []quest.Status
for i, char := range binaryRepresentation { activeStates = append(activeStates, quest.Status(questStatusInt))
if char == '1' {
if 15-i >= 0 && i < 16 {
activeStates = append(activeStates, quest.Status(15-i))
}
}
}
return activeStates return activeStates
} }
//outdated
/* func (gd *GameReader) getQuestStatus(questBytes []byte) []quest.Status {
combinedValue := uint16(questBytes[0])<<8 | uint16(questBytes[1])
binaryRepresentation := fmt.Sprintf("%016b", combinedValue)
var activeStates []quest.Status
for i, char := range binaryRepresentation {
if char == '1' {
if 15-i >= 0 && i < 16 {
activeStates = append(activeStates, quest.Status(15-i))
}
}
}
return activeStates
}*/