diff --git a/game/builtin/item_container.go b/game/builtin/item_container.go index 0d8284b..38a697a 100644 --- a/game/builtin/item_container.go +++ b/game/builtin/item_container.go @@ -71,6 +71,10 @@ func (slf *ItemContainer[ItemID, Item]) GetItemsFull() []game.ItemContainerMembe result[i] = slf.items[*guid] } } + sizeLimit := slf.GetSizeLimit() + for sizeLimit > 0 && len(result) > sizeLimit { + result = append(result, nil) + } return result } @@ -263,3 +267,47 @@ func (slf *ItemContainer[ItemID, Item]) CheckDeductItem(guid int64, count *huge. return nil } } + +func (slf *ItemContainer[ItemID, Item]) Remove(guid int64) { + member, exist := slf.items[guid] + if !exist { + return + } + delete(slf.items, guid) + delete(slf.itemIdGuidRef[member.GetID()], guid) + slf.sort[member.sort] = nil + slf.vacancy = append(slf.vacancy, member.sort) + + sizeLimit := slf.GetSizeLimit() + for slf.sort[slf.maxSort] == nil && slf.maxSort > sizeLimit { + slf.sort = append(slf.sort[0:slf.maxSort], slf.sort[slf.maxSort+1:]...) + slf.maxSort-- + } +} + +func (slf *ItemContainer[ItemID, Item]) RemoveWithID(id ItemID) { + for guid := range slf.itemIdGuidRef[id] { + member, exist := slf.items[guid] + if !exist { + continue + } + delete(slf.items, guid) + slf.sort[member.sort] = nil + slf.vacancy = append(slf.vacancy, member.sort) + } + delete(slf.itemIdGuidRef, id) + + sizeLimit := slf.GetSizeLimit() + for slf.sort[slf.maxSort] == nil && slf.maxSort > sizeLimit { + slf.sort = append(slf.sort[0:slf.maxSort], slf.sort[slf.maxSort+1:]...) + slf.maxSort-- + } +} + +func (slf *ItemContainer[ItemID, Item]) Clear() { + slf.items = map[int64]*ItemContainerMember[ItemID, Item]{} + slf.itemIdGuidRef = map[ItemID]map[int64]bool{} + slf.sort = nil + slf.maxSort = 0 + slf.vacancy = nil +} diff --git a/game/item_container.go b/game/item_container.go index af7da5a..a708bb3 100644 --- a/game/item_container.go +++ b/game/item_container.go @@ -38,4 +38,10 @@ type ItemContainer[ItemID comparable, I Item[ItemID]] interface { CheckAllowAdd(item I, count *huge.Int) error // CheckDeductItem 检查是否允许扣除特定物品 CheckDeductItem(guid int64, count *huge.Int) error + // Remove 移除特定guid的物品 + Remove(guid int64) + // RemoveWithID 移除所有物品ID匹配的物品 + RemoveWithID(id ItemID) + // Clear 清空物品容器 + Clear() }