删除物品和物品容器,设计不合理
This commit is contained in:
parent
40b90ddd20
commit
c8b75b5a74
|
@ -1,48 +0,0 @@
|
||||||
package builtin
|
|
||||||
|
|
||||||
import (
|
|
||||||
"minotaur/utils/huge"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewItem[ID comparable](id ID, count *huge.Int) *Item[ID] {
|
|
||||||
if count == nil || count.LessThan(huge.IntZero) {
|
|
||||||
panic(ErrItemCountException)
|
|
||||||
}
|
|
||||||
return &Item[ID]{
|
|
||||||
id: id,
|
|
||||||
count: count,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Item[ID comparable] struct {
|
|
||||||
id ID
|
|
||||||
guid int64
|
|
||||||
count *huge.Int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (slf *Item[ID]) GetID() ID {
|
|
||||||
return slf.id
|
|
||||||
}
|
|
||||||
|
|
||||||
func (slf *Item[ID]) GetGuid() int64 {
|
|
||||||
return slf.guid
|
|
||||||
}
|
|
||||||
|
|
||||||
func (slf *Item[ID]) SetGuid(guid int64) {
|
|
||||||
slf.guid = guid
|
|
||||||
}
|
|
||||||
|
|
||||||
func (slf *Item[ID]) ChangeStackCount(count *huge.Int) *huge.Int {
|
|
||||||
if count.IsZero() {
|
|
||||||
return slf.count.Copy()
|
|
||||||
}
|
|
||||||
newCount := slf.count.Add(count)
|
|
||||||
if newCount.LessThan(huge.IntZero) {
|
|
||||||
slf.count = newCount.Set(huge.IntZero)
|
|
||||||
}
|
|
||||||
return slf.count
|
|
||||||
}
|
|
||||||
|
|
||||||
func (slf *Item[ID]) GetStackCount() *huge.Int {
|
|
||||||
return slf.count.Copy()
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
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)
|
|
||||||
}
|
|
17
game/item.go
17
game/item.go
|
@ -1,17 +0,0 @@
|
||||||
package game
|
|
||||||
|
|
||||||
import "minotaur/utils/huge"
|
|
||||||
|
|
||||||
// Item 物品接口定义
|
|
||||||
type Item[ID comparable] interface {
|
|
||||||
// GetID 获取物品id
|
|
||||||
GetID() ID
|
|
||||||
// GetGuid 获取物品guid
|
|
||||||
GetGuid() int64
|
|
||||||
// SetGuid 设置物品guid
|
|
||||||
SetGuid(guid int64)
|
|
||||||
// ChangeStackCount 改变物品堆叠数量,返回新数量
|
|
||||||
ChangeStackCount(count *huge.Int) *huge.Int
|
|
||||||
// GetStackCount 获取物品堆叠数量
|
|
||||||
GetStackCount() *huge.Int
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
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)
|
|
||||||
}
|
|
Loading…
Reference in New Issue