From 15f204e2ff1bbeebbf34e28122f95bbf85c34326 Mon Sep 17 00:00:00 2001 From: vietdungdev Date: Mon, 25 May 2026 11:53:08 +0700 Subject: [PATCH] improve item.go 1 --- pkg/memory/item.go | 59 ++++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/pkg/memory/item.go b/pkg/memory/item.go index bc36a1b..dd11422 100644 --- a/pkg/memory/item.go +++ b/pkg/memory/item.go @@ -68,8 +68,12 @@ func (gd *GameReader) Inventory(rawPlayerUnits RawPlayerUnits, hover data.HoverD item *data.Item position int // Store X position } + type baseItemInfo struct { + item *data.Item + numSockets int + } 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 + baseItemsMap := make(map[data.UnitID]baseItemInfo, 120) // Same number of potential base items 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 @@ -444,7 +448,7 @@ func (gd *GameReader) Inventory(rawPlayerUnits RawPlayerUnits, hover data.HoverD } else { // Check if item has sockets if numSockets, _ := itm.Stats.FindStat(stat.NumSockets, 0); numSockets.Value > 0 { - baseItemsMap[itm.UnitID] = itm + baseItemsMap[itm.UnitID] = baseItemInfo{item: itm, numSockets: numSockets.Value} } } @@ -460,18 +464,13 @@ func (gd *GameReader) Inventory(rawPlayerUnits RawPlayerUnits, hover data.HoverD } // Link sockets to base items - for baseUnitID, baseItem := range baseItemsMap { - numSockets, _ := baseItem.Stats.FindStat(stat.NumSockets, 0) - if numSockets.Value == 0 { - continue - } - + for baseUnitID, baseInfo := range baseItemsMap { // Get socket list for this base item sockets := socketedItemsMap[baseUnitID] if len(sockets) == 0 { continue } - if len(sockets) > numSockets.Value { + if len(sockets) > baseInfo.numSockets { continue } @@ -483,6 +482,7 @@ func (gd *GameReader) Inventory(rawPlayerUnits RawPlayerUnits, hover data.HoverD } // Validate socket positions and build final list in one pass (allow partial sockets) + baseItem := baseInfo.item baseItem.Sockets = make([]data.Item, 0, len(sockets)) for i, socket := range sockets { if socket.position != i { @@ -695,18 +695,10 @@ func updateMaxReqFromAffixes(currentMax int, affixes data.ItemAffixes) int { } func staffModLevelRequirement(itm *data.Item, baseDesc item.Description) int { - eligibleTypes := map[string]bool{ - item.TypeScepter: true, - item.TypeWand: true, - item.TypeStaff: true, - item.TypeOrb: true, - item.TypeHandtoHand: true, - item.TypeHandtoHand2: true, - item.TypePelt: true, - item.TypePrimalHelm: true, - } - - if !eligibleTypes[baseDesc.Type] { + switch baseDesc.Type { + case item.TypeScepter, item.TypeWand, item.TypeStaff, item.TypeOrb, + item.TypeHandtoHand, item.TypeHandtoHand2, item.TypePelt, item.TypePrimalHelm: + default: return 0 } @@ -776,10 +768,12 @@ func calculateItemLevelReq(itm *data.Item, baseDesc item.Description) int { // Find the original item tier by looking up the unique/set item var originalCode string + specificLevelReq := 0 if itm.Quality == item.QualityUnique { for _, uniqueInfo := range item.UniqueItems { if uniqueInfo.ID == int(itm.UniqueSetID) { originalCode = uniqueInfo.Code + specificLevelReq = uniqueInfo.LevelReq break } } @@ -787,6 +781,7 @@ func calculateItemLevelReq(itm *data.Item, baseDesc item.Description) int { for _, setItemInfo := range item.SetItems { if setItemInfo.ID == int(itm.UniqueSetID) { originalCode = setItemInfo.Code + specificLevelReq = setItemInfo.LevelReq break } } @@ -807,26 +802,8 @@ func calculateItemLevelReq(itm *data.Item, baseDesc item.Description) int { } // Check unique/set specific level requirement - if itm.Identified { - if itm.Quality == item.QualityUnique { - for _, uniqueInfo := range item.UniqueItems { - if uniqueInfo.ID == int(itm.UniqueSetID) { - if uniqueInfo.LevelReq > maxReq { - maxReq = uniqueInfo.LevelReq - } - break - } - } - } else if itm.Quality == item.QualitySet { - for _, setItemInfo := range item.SetItems { - if setItemInfo.ID == int(itm.UniqueSetID) { - if setItemInfo.LevelReq > maxReq { - maxReq = setItemInfo.LevelReq - } - break - } - } - } + if itm.Identified && specificLevelReq > maxReq { + maxReq = specificLevelReq } }