ecs/servers/game/logic/player_item.go
2025-06-04 18:17:39 +08:00

259 lines
7.2 KiB
Go

package logic
import (
"ecs/proto"
"ecs/proto/pb"
"ecs/servers/game/data"
)
type PlayerItem struct {
Id uint32 `bson:"id" key:"1"`
Num uint32 `bson:"num"`
}
func (this *PlayerItem) BuildMsgItem() *pb.Item {
return &pb.Item{ItemId: this.Id, ItemNum: this.Num}
}
func (this *Player) addItem(itemTable *data.Item, itemNum uint32, logType LogType) *pb.ItemChange {
var changeType = pb.ChangeType_Changed
var item = this.Item[uint32(itemTable.Id)]
if item == nil {
item = &PlayerItem{Id: uint32(itemTable.Id)}
this.Item[item.Id] = item
changeType = pb.ChangeType_Add
}
item.Num += itemNum
this.SaveModel(item)
//this.CheckTask(proto.TaskSection1CollectSpecificItem, itemTable.Id, int(itemNum))
//if logType > 0 {
// this.manager.eventManager.PlayerItemObtain(this, logType, uint32(itemTable.Id), itemNum)
//}
return &pb.ItemChange{Item: item.BuildMsgItem(), ChangeType: changeType}
}
func (this *Player) useItem(itemTable *data.Item, itemNum uint32, logType LogType) {
switch pb.ItemType(itemTable.Type) {
case pb.ItemType_ItemMoney:
this.AddMoney(pb.MoneyType(itemTable.SubType), uint32(itemTable.Value)*itemNum, logType)
case pb.ItemType_ItemProp:
case pb.ItemType_ItemEquip:
case pb.ItemType_ItemTreasure:
case pb.ItemType_ItemArtifacts:
case pb.ItemType_ItemTips:
}
}
//
//func (this *Player) addEquip(itemTable *data.Item, itemNum uint32, logType LogType) (*proto.ItemChange, error) {
// var itemChange *proto.ItemChange
// switch proto.EquipType(itemTable.Subtype) {
// case proto.EquipTypeHead, proto.EquipTypeBody, proto.EquipTypeTail:
// itemChange = this.addItem(itemTable, itemNum, logType)
// case proto.EquipTypeEquip:
// var equipTable = this.manager.tables.RigEquipExtend.Get(itemTable.Id, 1)
// if equipTable == nil {
// return nil, proto.ErrDataTablesError
// }
//
// itemChange = this.addItem(itemTable, itemNum, logType)
// this.addRigEquip(equipTable)
// case proto.EquipTypeRemains:
// var remainsTable = this.manager.tables.RigRemainsExtend.Get(itemTable.Id, 1)
// if remainsTable == nil {
// return nil, proto.ErrDataTablesError
// }
//
// itemChange = this.addItem(itemTable, itemNum, logType)
// this.addRigRemains(remainsTable)
// case proto.EquipTypePendant:
// var pendantTable = this.manager.tables.RigPendantExtend.Get(itemTable.Id, 1)
// if pendantTable == nil {
// return nil, proto.ErrDataTablesError
// }
//
// itemChange = this.addItem(itemTable, itemNum, logType)
// this.addRigPendant(pendantTable)
// case proto.EquipTypeCore:
// var coreTable = this.manager.tables.RigCoreExtend.Get(itemTable.Id, 1)
// if coreTable == nil {
// return nil, proto.ErrDataTablesError
// }
//
// itemChange = this.addItem(itemTable, itemNum, logType)
// this.addRigCore(coreTable)
// case proto.EquipTypeCharacter:
// itemChange = this.addItem(itemTable, itemNum, logType)
// case proto.EquipTypeWarship:
// var warshipTable = this.manager.tables.Warship.Get(itemTable.Value)
// if warshipTable == nil {
// return nil, proto.ErrDataTablesError
// }
// var err = this.addRigWarship(warshipTable)
// if err != nil {
// return nil, err
// }
// }
//
// return itemChange, nil
//}
func (this *Player) AddItem(itemId, itemNum uint32, logType LogType) error {
var itemTable = this.manager.tables.Item.Get(int(itemId))
if itemTable == nil {
return proto.ErrDataTablesError
}
if itemTable.UseDirect {
this.useItem(itemTable, itemNum, logType)
return nil
}
var itemChange *pb.ItemChange
switch pb.ItemType(itemTable.Type) {
case pb.ItemType_ItemProp:
itemChange = this.addItem(itemTable, itemNum, logType)
case pb.ItemType_ItemMoney:
this.AddMoney(pb.MoneyType(itemTable.SubType), itemNum, logType)
case pb.ItemType_ItemEquip:
for range itemNum {
var err = this.AddEquip(itemTable, logType)
if err != nil {
return err
}
}
}
if itemChange != nil {
_ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemChange), &pb.ItemChangeListAck{ChangeList: []*pb.ItemChange{itemChange}})
}
return nil
}
func (this *Player) AddItems(itemMap map[uint32]uint32, logType LogType) {
var changeList []*pb.ItemChange
for itemId, itemNum := range itemMap {
var itemTable = this.manager.tables.Item.Get(int(itemId))
if itemTable == nil {
continue
}
if itemTable.UseDirect {
this.useItem(itemTable, itemNum, logType)
} else {
var itemChange *pb.ItemChange
switch pb.ItemType(itemTable.Type) {
case pb.ItemType_ItemProp:
itemChange = this.addItem(itemTable, itemNum, logType)
case pb.ItemType_ItemEquip:
//var err error
//itemChange, err = this.addEquip(itemTable, itemNum, logType)
//if err != nil {
// continue
//}
case pb.ItemType_ItemMoney:
this.AddMoney(pb.MoneyType(itemTable.SubType), itemNum, logType)
}
if itemChange != nil {
changeList = append(changeList, itemChange)
}
}
}
if len(changeList) > 0 {
_ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemChange), &pb.ItemChangeListAck{ChangeList: changeList})
}
}
func (this *Player) checkItem(itemId, itemNum uint32) bool {
var item = this.Item[itemId]
return item != nil && item.Num >= itemNum
}
func (this *Player) CheckItem(itemId, itemNum uint32) error {
if itemId == 0 || itemNum == 0 {
return nil
}
var itemTable = this.manager.tables.Item.Get(int(itemId))
if itemTable == nil {
return proto.ErrDataTablesError
}
switch pb.ItemType(itemTable.Type) {
case pb.ItemType_ItemProp:
if this.checkItem(itemId, itemNum) {
return nil
}
return proto.ErrItemNotEnough
case pb.ItemType_ItemMoney:
return this.CheckMoney(pb.MoneyType(itemTable.SubType), itemNum)
case pb.ItemType_ItemEquip, pb.ItemType_ItemTreasure, pb.ItemType_ItemArtifacts, pb.ItemType_ItemTips:
return proto.ErrUnknownItemType
default:
return proto.ErrUnknownItemType
}
}
func (this *Player) reduceItem(itemId, itemNum uint32, logType LogType) {
var item = this.Item[itemId]
if item == nil || item.Num < itemNum {
this.manager.logger.Error("Reduce item out of range, does not check before deducting?")
return
}
item.Num -= itemNum
var changeType pb.ChangeType
if item.Num == 0 {
delete(this.Item, item.Id)
this.WipeModel(item)
changeType = pb.ChangeType_Delete
} else {
this.SaveModel(item)
changeType = pb.ChangeType_Changed
}
_ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemChange), &pb.ItemChangeListAck{ChangeList: []*pb.ItemChange{{Item: item.BuildMsgItem(), ChangeType: changeType}}})
//if logType > 0 {
// this.manager.eventManager.PlayerItemConsume(this, logType, itemId, itemNum)
//}
}
func (this *Player) ReduceItem(itemId, itemNum uint32, logType LogType) {
if itemId == 0 || itemNum == 0 {
return
}
var itemTable = this.manager.tables.Item.Get(int(itemId))
if itemTable == nil {
return
}
switch pb.ItemType(itemTable.Type) {
case pb.ItemType_ItemMoney:
this.ReduceMoney(pb.MoneyType(itemTable.SubType), itemNum, logType)
case pb.ItemType_ItemProp:
this.reduceItem(itemId, itemNum, logType)
case pb.ItemType_ItemEquip, pb.ItemType_ItemTreasure, pb.ItemType_ItemArtifacts, pb.ItemType_ItemTips:
}
}
func (this *Player) BuildMsgItemListAck() *pb.ItemListAck {
var list []*pb.Item
for _, item := range this.Item {
if item.Id > 0 {
list = append(list, item.BuildMsgItem())
}
}
return &pb.ItemListAck{ItemList: list}
}