D2Data and Quest data (#9)
This commit is contained in:
@@ -30,6 +30,11 @@ func (gd *GameReader) GetData() data.Data {
|
||||
pu := gd.GetPlayerUnit(playerUnitPtr)
|
||||
hover := gd.hoveredData()
|
||||
|
||||
// Quests
|
||||
pUnitData := playerUnitPtr + 0x10
|
||||
playerNameAddr := uintptr(gd.Process.ReadUInt(pUnitData, Uint64))
|
||||
gameQuestsBytes := gd.Process.ReadBytesFromMemory(playerNameAddr-0x28D, 82)
|
||||
|
||||
d := data.Data{
|
||||
Corpse: corpse,
|
||||
Monsters: gd.Monsters(pu.Position, hover),
|
||||
@@ -40,6 +45,7 @@ func (gd *GameReader) GetData() data.Data {
|
||||
Roster: roster,
|
||||
HoverData: hover,
|
||||
TerrorZones: gd.TerrorZones(),
|
||||
Quests: gd.getQuests(gameQuestsBytes),
|
||||
}
|
||||
|
||||
if playerUnitPtr == 0 {
|
||||
|
||||
@@ -160,23 +160,29 @@ func (gd *GameReader) GetPlayerUnit(playerUnit uintptr) data.PlayerUnit {
|
||||
Skills: skills,
|
||||
States: states,
|
||||
Class: class,
|
||||
LeftSkill: skill.Skill(leftSkillId),
|
||||
RightSkill: skill.Skill(rightSkillId),
|
||||
LeftSkill: skill.ID(leftSkillId),
|
||||
RightSkill: skill.ID(rightSkillId),
|
||||
AvailableWaypoints: availableWPs,
|
||||
}
|
||||
}
|
||||
|
||||
func (gd *GameReader) getSkills(skillListPtr uintptr) map[skill.Skill]int {
|
||||
skills := make(map[skill.Skill]int)
|
||||
func (gd *GameReader) getSkills(skillListPtr uintptr) map[skill.ID]skill.Points {
|
||||
skills := make(map[skill.ID]skill.Points)
|
||||
|
||||
skillPtr := uintptr(gd.Process.ReadUInt(skillListPtr, Uint64))
|
||||
|
||||
for skillPtr != 0 {
|
||||
skillTxtPtr := uintptr(gd.Process.ReadUInt(skillPtr, Uint64))
|
||||
skillTxt := uintptr(gd.Process.ReadUInt(skillTxtPtr, Uint16))
|
||||
skillLvl := gd.Process.ReadUInt(skillPtr+0x38, Uint16)
|
||||
lvl := gd.Process.ReadUInt(skillPtr+0x38, Uint16)
|
||||
quantity := gd.Process.ReadUInt(skillPtr+0x40, Uint16)
|
||||
charges := gd.Process.ReadUInt(skillPtr+0x48, Uint16)
|
||||
|
||||
skills[skill.Skill(skillTxt)] = int(skillLvl)
|
||||
skills[skill.ID(skillTxt)] = skill.Points{
|
||||
Level: lvl,
|
||||
Quantity: quantity,
|
||||
Charges: charges,
|
||||
}
|
||||
|
||||
skillPtr = uintptr(gd.Process.ReadUInt(skillPtr+0x08, Uint64))
|
||||
}
|
||||
|
||||
60
pkg/memory/quests.go
Normal file
60
pkg/memory/quests.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package memory
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/hectorgimenez/d2go/pkg/data/quest"
|
||||
)
|
||||
|
||||
func (gd *GameReader) getQuests(questBytes []byte) quest.Quests {
|
||||
return quest.Quests{
|
||||
// Act 1
|
||||
quest.Act1DenOfEvil: gd.getQuestStatus([2]byte(questBytes[0:2])),
|
||||
quest.Act1SistersBurialGrounds: gd.getQuestStatus([2]byte(questBytes[2:4])),
|
||||
quest.Act1ToolsOfTheTrade: gd.getQuestStatus([2]byte(questBytes[4:6])),
|
||||
quest.Act1TheSearchForCain: gd.getQuestStatus([2]byte(questBytes[6:8])),
|
||||
quest.Act1TheForgottenTower: gd.getQuestStatus([2]byte(questBytes[8:10])),
|
||||
quest.Act1SistersToTheSlaughter: gd.getQuestStatus([2]byte(questBytes[10:12])),
|
||||
// Act 2
|
||||
quest.Act2RadamentsLair: gd.getQuestStatus([2]byte(questBytes[16:18])),
|
||||
quest.Act2TheHoradricStaff: gd.getQuestStatus([2]byte(questBytes[18:20])),
|
||||
quest.Act2TaintedSun: gd.getQuestStatus([2]byte(questBytes[20:22])),
|
||||
quest.Act2ArcaneSanctuary: gd.getQuestStatus([2]byte(questBytes[22:24])),
|
||||
quest.Act2TheSummoner: gd.getQuestStatus([2]byte(questBytes[24:26])),
|
||||
quest.Act2TheSevenTombs: gd.getQuestStatus([2]byte(questBytes[26:28])),
|
||||
// Act 3
|
||||
quest.Act3LamEsensTome: gd.getQuestStatus([2]byte(questBytes[32:34])),
|
||||
quest.Act3KhalimsWill: gd.getQuestStatus([2]byte(questBytes[34:36])),
|
||||
quest.Act3BladeOfTheOldReligion: gd.getQuestStatus([2]byte(questBytes[36:38])),
|
||||
quest.Act3TheGoldenBird: gd.getQuestStatus([2]byte(questBytes[38:40])),
|
||||
quest.Act3TheBlackenedTemple: gd.getQuestStatus([2]byte(questBytes[40:42])),
|
||||
quest.Act3TheGuardian: gd.getQuestStatus([2]byte(questBytes[42:44])),
|
||||
// Act 4
|
||||
quest.Act4TheFallenAngel: gd.getQuestStatus([2]byte(questBytes[48:50])),
|
||||
quest.Act4TerrorsEnd: gd.getQuestStatus([2]byte(questBytes[50:52])),
|
||||
quest.Act4HellForge: gd.getQuestStatus([2]byte(questBytes[52:54])),
|
||||
// Act 5
|
||||
quest.Act5SiegeOnHarrogath: gd.getQuestStatus([2]byte(questBytes[68:70])),
|
||||
quest.Act5RescueOnMountArreat: gd.getQuestStatus([2]byte(questBytes[70:72])),
|
||||
quest.Act5PrisonOfIce: gd.getQuestStatus([2]byte(questBytes[72:74])),
|
||||
quest.Act5BetrayalOfHarrogath: gd.getQuestStatus([2]byte(questBytes[74:76])),
|
||||
quest.Act5RiteOfPassage: gd.getQuestStatus([2]byte(questBytes[76:78])),
|
||||
quest.Act5EveOfDestruction: gd.getQuestStatus([2]byte(questBytes[78:80])),
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
for i, char := range binaryRepresentation {
|
||||
if char == '1' {
|
||||
if 15-i >= 0 && i < 16 {
|
||||
activeStates = append(activeStates, quest.Status(15-i))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return activeStates
|
||||
}
|
||||
Reference in New Issue
Block a user