Compare commits

...

15 Commits

Author SHA1 Message Date
crazywh1t3
28062d1c04 Merge pull request #78 from crazywh1t3b0y/main
Some checks failed
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
Manage Stale PRs / stale (push) Successful in 15s
Update offsets
2026-03-17 21:44:52 +02:00
crazywh1t3b0y
dba427c2f6 Update offsets 2026-03-17 21:42:38 +02:00
crazywh1t3
796d2f8805 Merge pull request #77 from crazywh1t3b0y/main
offsets
2026-03-11 01:34:15 +02:00
crazywh1t3b0y
2fa07f772c Add files via upload 2026-03-11 01:30:20 +02:00
Neo-Silver
6c3b135688 Merge pull request #70 from CarlPoppa1/friendly-mon-fix
Amend monster categorisation
2026-03-03 19:31:19 +01:00
CarlPoppa
1059ee7d3c Add BindDemonUnderling to IsPet check 2026-02-23 09:10:02 +00:00
CarlPoppa
e1805d76ab Increase GetStates to 8 iterations 2026-02-23 09:09:26 +00:00
CarlPoppa
831d004c33 Revert alignment check in Enemies() (doesn't work) 2026-02-21 12:58:18 +00:00
CarlPoppa
ffbc3dc39a Add warlock summons to IsPet 2026-02-21 12:56:35 +00:00
CarlPoppa
619d125378 Amend monster categorisation
Ignore monsters with alignment != 0 (non-hostile)
2026-02-20 22:57:54 +00:00
guiyomu-dev
a49f6eff4f add GetExpChar function 2026-02-20 01:03:40 +01:00
guiyomu-dev
b3f2b06a9f update offsets 2026-02-20 01:03:40 +01:00
mihabolil
fa9626f45c Add Tamoe Highland 2026-02-18 21:36:14 +01:00
mihabolil
2325270cb8 Add new terrorized locations
Maggot Lair, Canyon of the Magi, Swampy Pit, Frozen Tundra, Infernal Pit.
2026-02-18 21:36:14 +01:00
crazywh1t3
ce709bf617 Increase max capacity for item storage in inventory 2026-02-18 21:27:45 +01:00
6 changed files with 39 additions and 23 deletions

View File

@@ -17,6 +17,7 @@ var CanBeTerrorized = map[ID]bool{
HoleLevel1: true,
HoleLevel2: true,
ForgottenTower: true,
TamoeHighland: true,
Barracks: true,
JailLevel1: true,
JailLevel2: true,
@@ -38,11 +39,15 @@ var CanBeTerrorized = map[ID]bool{
HallsOfTheDeadLevel2: true,
HallsOfTheDeadLevel3: true,
FarOasis: true,
MaggotLairLevel1: true,
MaggotLairLevel2: true,
MaggotLairLevel3: true,
LostCity: true,
ValleyOfSnakes: true,
ClawViperTempleLevel1: true,
ClawViperTempleLevel2: true,
AncientTunnels: true,
CanyonOfTheMagi: true,
TalRashasTomb1: true,
TalRashasTomb2: true,
TalRashasTomb3: true,
@@ -59,6 +64,9 @@ var CanBeTerrorized = map[ID]bool{
FlayerDungeonLevel1: true,
FlayerDungeonLevel2: true,
FlayerDungeonLevel3: true,
SwampyPitLevel1: true,
SwampyPitLevel2: true,
SwampyPitLevel3: true,
KurastBazaar: true,
RuinedTemple: true,
DisusedFane: true,
@@ -75,6 +83,8 @@ var CanBeTerrorized = map[ID]bool{
Abaddon: true,
GlacialTrail: true,
DrifterCavern: true,
FrozenTundra: true,
InfernalPit: true,
CrystallinePassage: true,
FrozenRiver: true,
ArreatPlateau: true,

View File

@@ -162,7 +162,7 @@ func (m Monster) IsMerc() bool {
func (m Monster) IsPet() bool {
// Necromancer revive.
if m.States.HasState(state.Revive) {
if m.States.HasState(state.Revive) || m.States.HasState(state.BindDemon) || m.States.HasState(state.BindDemonUnderling) {
return true
}
@@ -171,7 +171,7 @@ func (m Monster) IsPet() bool {
npc.OakSage, npc.DruBear, npc.DruPlaguePoppy, npc.VineCreature,
npc.DruCycleOfLife, npc.ClayGolem, npc.BloodGolem, npc.IronGolem,
npc.FireGolem, npc.NecroSkeleton, npc.NecroMage, npc.Valkyrie, npc.Decoy,
npc.ShadowWarrior, npc.ShadowMaster:
npc.ShadowWarrior, npc.ShadowMaster, npc.Tainted3, npc.WarGoatman, npc.WarDefiler:
return true
}

View File

@@ -325,6 +325,12 @@ func (gd *GameReader) GetSelectedCharacterName() string {
return gd.Process.ReadStringFromMemory(gd.Process.moduleBaseAddressPtr+gd.offset.SelectedCharName, 0)
}
func (gd *GameReader) GetExpChar() uint {
expCharPtr := uintptr(gd.Process.ReadUInt(gd.moduleBaseAddressPtr+gd.offset.Expansion, Uint64))
expChar := gd.Process.ReadUInt(expCharPtr+0x5C, Uint16)
return expChar
}
func (gd *GameReader) LegacyGraphics() bool {
return gd.ReadUInt(gd.Process.moduleBaseAddressPtr+gd.offset.LegacyGraphics, Uint8) != 0
}

View File

@@ -69,7 +69,7 @@ func (gd *GameReader) Inventory(rawPlayerUnits RawPlayerUnits, hover data.HoverD
}
socketedItemsMap := make(map[data.UnitID][]socketInfo, 120) // Up to ~120 items could be socketable
baseItemsMap := make(map[data.UnitID]*data.Item, 120) // Same number of potential base items
allItems := make([]*data.Item, 0, 480) // max capacity: 400 (stashes) + 40 (inv) + 12 (cube) + 12 (equipped) + 16 (belt)
allItems := make([]*data.Item, 0, 800) // max capacity: 600 (stashes) + 91 (DLC tabs) + 40 (inv) + 12 (cube) + 12 (equipped) + 16 (belt) + headroom
// Pre-allocate buffers for repeated use
var itemDataBuffer = make([]byte, 144)

View File

@@ -26,61 +26,61 @@ type Offset struct {
func calculateOffsets(_ *Process) Offset {
// UnitTable
unitTableOffset := uintptr(0x1E9B350)
unitTableOffset := uintptr(0x1EAA350)
// UI
uiOffsetPtr := uintptr(0x1EAB042)
uiOffsetPtr := uintptr(0x1EBA042)
// Hover
hoverOffset := uintptr(0x1DEF000)
hoverOffset := uintptr(0x1DFE010)
// Expansion
expOffset := uintptr(0x1DEE468)
expOffset := uintptr(0x1DFD460)
// Party members offset
rosterOffset := uintptr(0x1EB1660)
rosterOffset := uintptr(0x1EC0660)
// PanelManagerContainer
panelManagerContainerOffset := uintptr(0x1E05DC0)
panelManagerContainerOffset := uintptr(0x1E14DB8)
// WidgetStates
WidgetStatesOffset := uintptr(0x1ED3678)
WidgetStatesOffset := uintptr(0x1EE2678)
// Waypoints
WaypointTableOffset := uintptr(0x1D4D3C0)
WaypointTableOffset := uintptr(0x1D5C3C0)
// FPS
fpsOffset := uintptr(0x1D4D394)
fpsOffset := uintptr(0x1D5C394)
// KeyBindings
keyBindingsOffset := uintptr(0x19C65B4)
keyBindingsOffset := uintptr(0x19D5594)
// KeyBindings Skills
keyBindingsSkillsOffset := uintptr(0x1DEF110)
keyBindingsSkillsOffset := uintptr(0x1DFE100)
// QuestInfo
questInfoOffset := uintptr(0x1EB7CD8)
questInfoOffset := uintptr(0x1EC6CD8)
// Terror Zones
tzOffset := uintptr(0x25A5AB0)
tzOffset := uintptr(0x25B4990)
// Ping
pingOffset := uintptr(0x1DEE468)
pingOffset := uintptr(0x1DFD460)
// LegacyGraphics
legacyGfxOffset := uintptr(0x1EB7E7E)
legacyGfxOffset := uintptr(0x1EC6E7E)
// CharData
charDataOffset := uintptr(0x1DF25F8)
charDataOffset := uintptr(0x1E01710)
// Selected Char Name
selectedCharNameOffset := uintptr(0x1D44195)
selectedCharNameOffset := uintptr(0x1D53195)
// Last Game Name
lastGameNameOffset := uintptr(0x25EE370)
lastGameNameOffset := uintptr(0x25FD2F0)
// Last Game Password
lastGamePasswordOffset := uintptr(0x25EE3C8)
lastGamePasswordOffset := uintptr(0x25FD348)
return Offset{
UnitTable: unitTableOffset,

View File

@@ -212,7 +212,7 @@ func (gd *GameReader) getSkills(skillListPtr uintptr) map[skill.ID]skill.Points
func (gd *GameReader) GetStates(statsListExPtr uintptr) state.States {
var states state.States
for i := 0; i < 6; i++ {
for i := 0; i < 8; i++ {
offset := i * 4
stateByte := gd.Process.ReadUInt(statsListExPtr+0xAF0+uintptr(offset), Uint32)