From 40b90ddd20cd3d43aa186c6ba12260240de257bb Mon Sep 17 00:00:00 2001 From: kercylan <61743331+kercylan98@users.noreply.github.com> Date: Sat, 29 Apr 2023 21:06:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E5=93=81=E5=AE=B9=E5=99=A8=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/builtin/item_container.go | 73 ++++++++++++++++++++++++++++++++++ game/container.go | 5 --- game/item_container.go | 21 ++++++++++ 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 game/builtin/item_container.go delete mode 100644 game/container.go create mode 100644 game/item_container.go diff --git a/game/builtin/item_container.go b/game/builtin/item_container.go new file mode 100644 index 0000000..122a781 --- /dev/null +++ b/game/builtin/item_container.go @@ -0,0 +1,73 @@ +package builtin + +import ( + "minotaur/game" + "minotaur/utils/huge" + "minotaur/utils/synchronization" +) + +func NewItemContainer[ItemID comparable, I game.Item[ItemID]]() *ItemContainer[ItemID, I] { + return &ItemContainer[ItemID, I]{ + items: synchronization.NewMap[ItemID, *synchronization.Map[int64, I]](), + itemRef: synchronization.NewMap[int64, ItemID](), + } +} + +type ItemContainer[ItemID comparable, I game.Item[ItemID]] struct { + guid int64 + items *synchronization.Map[ItemID, *synchronization.Map[int64, I]] + itemRef *synchronization.Map[int64, ItemID] +} + +func (slf *ItemContainer[ItemID, I]) GetItem(guid int64) I { + id := slf.itemRef.Get(guid) + return slf.items.Get(id).Get(guid) +} + +func (slf *ItemContainer[ItemID, I]) GetItems() map[int64]I { + items := make(map[int64]I) + slf.items.Range(func(id ItemID, value *synchronization.Map[int64, I]) { + if value != nil { + value.Range(func(guid int64, value I) { + items[guid] = value + }) + } + }) + return items +} + +func (slf *ItemContainer[ItemID, I]) GetItemsWithId(id ItemID) map[int64]I { + return slf.items.Get(id).Map() +} + +func (slf *ItemContainer[ItemID, I]) AddItem(item I) error { + id := item.GetID() + items, exist := slf.items.GetExist(id) + if !exist { + items = synchronization.NewMap[int64, I]() + slf.items.Set(id, items) + } + slf.guid++ + items.Set(slf.guid, item) + slf.itemRef.Set(slf.guid, id) + return nil +} + +func (slf *ItemContainer[ItemID, I]) ChangeItemCount(guid int64, count *huge.Int) error { + item := slf.GetItem(guid) + item.ChangeStackCount(count) + return nil +} + +func (slf *ItemContainer[ItemID, I]) DeleteItem(guid int64) { + id := slf.GetItem(guid).GetID() + slf.items.Get(id).Delete(guid) + slf.itemRef.Delete(guid) +} + +func (slf *ItemContainer[ItemID, I]) DeleteItemsWithId(id ItemID) { + for guid := range slf.items.Get(id).Map() { + slf.itemRef.Delete(guid) + } + slf.items.Delete(id) +} diff --git a/game/container.go b/game/container.go deleted file mode 100644 index 40f6390..0000000 --- a/game/container.go +++ /dev/null @@ -1,5 +0,0 @@ -package game - -// Container 容器 -type Container[T any] interface { -} diff --git a/game/item_container.go b/game/item_container.go new file mode 100644 index 0000000..1039629 --- /dev/null +++ b/game/item_container.go @@ -0,0 +1,21 @@ +package game + +import "minotaur/utils/huge" + +// ItemContainer 物品容器 +type ItemContainer[ItemID comparable, I Item[ItemID]] interface { + // GetItem 根据guid获取物品 + GetItem(guid int64) I + // GetItems 获取容器中的所有物品 + GetItems() map[int64]I + // GetItemsWithId 根据id获取容器中所有物品 + GetItemsWithId(id ItemID) map[int64]I + // AddItem 添加物品到容器中 + AddItem(item I) error + // ChangeItemCount 改变容器中特定数量的物品(扣除时当数量不足时会尝试扣除相同ID的物品) + ChangeItemCount(guid int64, count *huge.Int) error + // DeleteItem 删除容器中的物品 + DeleteItem(guid int64) + // DeleteItemsWithId 删除容器中所有特定id的物品 + DeleteItemsWithId(id ItemID) +}