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} }