ecs/servers/game/handler/player_item.go

512 lines
15 KiB
Go
Raw Normal View History

2025-06-04 18:17:39 +08:00
package handler
import (
"ecs/proto"
"ecs/proto/pb"
"ecs/servers/game/logic"
"github.com/oylshe1314/framework/net"
)
func (this *PlayerHandler) ItemUse(player *logic.Player, msg *net.Message) {
var req = new(pb.ItemUseReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
2025-06-04 18:17:39 +08:00
return
}
if req.ItemId == 0 || req.ItemNum == 0 {
this.logger.Errorf("Parameter error, req.ItemId: %d, req.ItemNum: %d", req.ItemId, req.ItemNum)
_ = player.TipNotice(proto.TipParameterError)
2025-06-04 18:17:39 +08:00
return
}
var item = player.Item[req.ItemId]
if item == nil {
_ = player.TipNotice(proto.TipItemNotFound)
2025-06-04 18:17:39 +08:00
return
}
}
func (this *PlayerHandler) ItemSale(player *logic.Player, msg *net.Message) {
var req = new(pb.ItemSaleReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
return
}
if len(req.ItemList) == 0 {
this.logger.Error("Parameter error, len(req.ItemList) == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
var itemMap map[uint32]uint32
var reduceMap map[uint32]uint32
for _, item := range req.ItemList {
if item.ItemId == 0 || item.ItemNum == 0 {
this.logger.Error("Parameter error, item.ItemId == 0 || item.ItemNum == 0")
_ = player.TipNotice(proto.TipDataTablesError)
return
}
var itemTable = this.tables.Item.Find1(int(item.ItemId))
if itemTable == nil {
this.logger.Error("Parameter error, item table was not found, item.Id: ", item.ItemId)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
if !itemTable.SaleAllow {
this.logger.Error("Parameter error, item can not sale, item.Id: ", item.ItemId)
_ = player.TipNotice(proto.TipItemCanNotSale)
return
}
if itemTable.SaleItemId == 0 || itemTable.SaleItemNum == 0 {
this.logger.Error("Data table error, itemTable.SaleItemId == 0 || itemTable.SaleItemNum == 0, item.Id: ", item.ItemId)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
ok, tip := player.CheckItem(item.ItemId, item.ItemNum)
if !ok {
_ = player.TipNotice(tip)
return
}
reduceMap[item.ItemId] = item.ItemNum
itemMap[uint32(itemTable.SaleItemId)] = uint32(itemTable.SaleItemNum) * item.ItemNum
}
player.ReduceItems(reduceMap, logic.LogTypeItemConsumeBySale)
player.AddItems(itemMap, logic.LogTypeItemObtainBySale)
}
2025-06-04 18:17:39 +08:00
func (this *PlayerHandler) EquipUpgrade(player *logic.Player, msg *net.Message) {
var req = new(pb.EquipUpgradeReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
2025-06-04 18:17:39 +08:00
return
}
if req.EquipUid == 0 {
this.logger.Error("Parameter error, req.EquipUid == 0")
_ = player.TipNotice(proto.TipParameterError)
2025-06-04 18:17:39 +08:00
return
}
var equip = player.Equip[req.EquipUid]
if equip == nil {
this.logger.Error("Parameter error, equip was not found, req.EquipUid: ", req.EquipUid)
_ = player.TipNotice(proto.TipEquipNotFound)
return
}
var equipTable = this.tables.Equip.Get(int(equip.Id))
if equipTable == nil {
this.logger.Error("Parameter or data error, table 'Equip' was not found, equip.Id: ", equip.Id)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
if equip.Level >= uint32(equipTable.Levels) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
if player.CheckFunctionOpen(pb.ModId_ModuleItem, pb.FuncType_FuncEquipUpgrade, int(equip.Level+1)) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
var levelTable = this.tables.EquipLevel.Find3(int(equip.Id), int(equip.Level))
if levelTable == nil {
_ = player.TipNotice(proto.TipDataTablesError)
return
}
for i := range levelTable.ConsumeItems {
if ok, tip := player.CheckItem(uint32(levelTable.ConsumeItems[i]), uint32(levelTable.ConsumeNums[i])); !ok {
_ = player.TipNotice(tip)
return
}
}
var nextLevelTable = this.tables.EquipLevel.Find3(int(equip.Id), int(equip.Level+1))
if nextLevelTable == nil {
_ = player.TipNotice(proto.TipDataTablesError)
return
}
var preLevel = equip.Level
equip.Level = uint32(nextLevelTable.Level)
for i := range levelTable.ConsumeItems {
player.ReduceItem(uint32(levelTable.ConsumeItems[i]), uint32(levelTable.ConsumeNums[i]), logic.LogTypeItemConsumeByEquipUpgrade)
}
player.SaveModel(equip)
_ = player.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemEquipChange), pb.EquipChangeListAck{
ChangeList: []*pb.EquipChange{{Equip: equip.BuildMsgEquip(), ChangeType: pb.ChangeType_Add}},
})
player.SendUpgradeMaster(pb.UpgradeMasterType_MasterEquipUpgrade, preLevel, equip.Level, equip.HeroUid)
return
}
func (this *PlayerHandler) EquipRefine(player *logic.Player, msg *net.Message) {
var req = new(pb.EquipRefineReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
return
}
if req.EquipUid == 0 {
this.logger.Error("Parameter error, req.EquipUid == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
switch req.Type {
case 1:
if req.Value != 1 {
this.logger.Error("Parameter error, req.Value != 1")
_ = player.TipNotice(proto.TipParameterError)
return
}
case 2:
if req.Value == 0 {
this.logger.Error("Parameter error, req.Value == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
default:
this.logger.Error("Parameter error, req.Type: ", req.Type)
_ = player.TipNotice(proto.TipParameterError)
2025-06-04 18:17:39 +08:00
return
}
var equip = player.Equip[req.EquipUid]
if equip == nil {
this.logger.Error("Parameter error, equip was not found, req.EquipUid: ", req.EquipUid)
_ = player.TipNotice(proto.TipEquipNotFound)
2025-06-04 18:17:39 +08:00
return
}
var equipTable = this.tables.Equip.Get(int(equip.Id))
if equipTable == nil {
this.logger.Error("Parameter or data error, table 'Equip' was not found, equip.Id: ", equip.Id)
_ = player.TipNotice(proto.TipDataTablesError)
2025-06-04 18:17:39 +08:00
return
}
if equip.RefineLevel >= uint32(equipTable.RefineLevels) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
2025-06-04 18:17:39 +08:00
return
}
if player.CheckFunctionOpen(pb.ModId_ModuleItem, pb.FuncType_FuncEquipUpgrade, int(equip.RefineLevel+1)) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
var refineTable = this.tables.EquipRefine.Find3(int(equip.Id), int(equip.Level))
if refineTable == nil {
this.logger.Error("Parameter or data error, table 'EquipRefine' was not found, equip.Id: ", equip.Id)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
2025-06-04 18:17:39 +08:00
var preLevel = equip.Level
switch req.Type {
case 1:
var itemTables = this.tables.Item.Find2(int(pb.ItemType_ItemProp), int(pb.PropType_EquipRefineExp))
if len(itemTables) == 0 {
this.logger.Error("Data error, the item list is empty, type: %d, subType: %d", pb.ItemType_ItemProp, pb.PropType_EquipRefineExp)
_ = player.TipNotice(proto.TipDataTablesError)
2025-06-04 18:17:39 +08:00
return
}
var exp = equip.RefineExp
var level = equip.RefineLevel
var consumeItems = map[uint32]uint32{}
for _, itemTable := range itemTables {
var item = player.Item[uint32(itemTable.Id)]
if item == nil {
continue
}
var needExp = uint32(refineTable.NeedExp) - exp
var needNum = needExp / uint32(itemTable.Value)
if needExp%uint32(itemTable.Value) > 0 {
needNum += 1
2025-06-04 18:17:39 +08:00
}
if needNum <= item.Num {
consumeItems[item.Id] = needNum
exp = uint32(itemTable.Value)*needNum - exp
level += 1
break
} else {
consumeItems[item.Id] = item.Num
exp += uint32(itemTable.Value) * item.Num
}
}
equip.RefineExp = exp
equip.RefineLevel = level
player.ReduceItems(consumeItems, logic.LogTypeItemConsumeByEquipRefine)
case 2:
var itemTable = this.tables.Item.Find1(int(req.Value))
if itemTable == nil {
this.logger.Error("Parameter or data error, table 'Item' was not found, itemId: ", req.Value)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
if ok, tip := player.CheckItem(req.Value, 1); !ok {
_ = player.TipNotice(tip)
return
2025-06-04 18:17:39 +08:00
}
equip.RefineExp += uint32(itemTable.Value)
if equip.RefineExp >= uint32(refineTable.NeedExp) {
equip.RefineLevel += 1
equip.RefineExp -= uint32(refineTable.NeedExp)
}
player.ReduceItem(req.Value, 1, logic.LogTypeItemConsumeByEquipRefine)
}
player.SaveModel(equip)
_ = player.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemEquipChange), &pb.EquipChangeListAck{
ChangeList: []*pb.EquipChange{{ChangeType: pb.ChangeType_Changed, Equip: equip.BuildMsgEquip()}},
})
if equip.RefineLevel != preLevel {
player.SendUpgradeMaster(pb.UpgradeMasterType_MasterEquipRefine, preLevel, equip.RefineLevel, equip.HeroUid)
}
}
func (this *PlayerHandler) TreasureUpgrade(player *logic.Player, msg *net.Message) {
var req = new(pb.TreasureUpgradeReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
return
2025-06-04 18:17:39 +08:00
}
if req.TreasureUid == 0 {
this.logger.Error("Parameter error, req.TreasureUid == 0")
_ = player.TipNotice(proto.TipParameterError)
2025-06-04 18:17:39 +08:00
return
}
switch req.Type {
case 1:
if req.Value != 1 {
this.logger.Error("Parameter error, req.Value != 1")
_ = player.TipNotice(proto.TipParameterError)
return
}
case 2:
if req.Value == 0 {
this.logger.Error("Parameter error, req.Value == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
default:
this.logger.Error("Parameter error, req.Type: ", req.Type)
_ = player.TipNotice(proto.TipParameterError)
return
}
2025-06-04 18:17:39 +08:00
var treasure = player.Treasure[req.TreasureUid]
if treasure == nil {
this.logger.Error("Parameter error, treasure was not found, req.TreasureUid: ", req.TreasureUid)
_ = player.TipNotice(proto.TipTreasureNotFound)
return
2025-06-04 18:17:39 +08:00
}
var treasureTable = this.tables.Treasure.Get(int(treasure.Id))
if treasureTable == nil {
this.logger.Error("Parameter or data error, table 'Treasure' was not found, treasure.Id: ", treasure.Id)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
if treasure.Level >= uint32(treasureTable.Levels) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
if player.CheckFunctionOpen(pb.ModId_ModuleItem, pb.FuncType_FuncTreasureUpgrade, int(treasure.Level+1)) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
var levelTable = this.tables.TreasureLevel.Find3(int(treasure.Id), int(treasure.Level))
if levelTable == nil {
this.logger.Error("Parameter or data error, table 'TreasureLevel' was not found, treasure.Id: ", treasure.Id)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
var preLevel = treasure.Level
switch req.Type {
case 1:
var itemTables = this.tables.Item.Find2(int(pb.ItemType_ItemProp), int(pb.PropType_TreasureExp))
if len(itemTables) == 0 {
this.logger.Error("Data error, the item list is empty, type: %d, subType: %d", pb.ItemType_ItemProp, pb.PropType_TreasureExp)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
var exp = treasure.Exp
var level = treasure.Level
var consumeItems = map[uint32]uint32{}
for _, itemTable := range itemTables {
var item = player.Item[uint32(itemTable.Id)]
if item == nil {
continue
}
var needExp = uint32(levelTable.NeedExp) - exp
var needNum = needExp / uint32(itemTable.Value)
if needExp%uint32(itemTable.Value) > 0 {
needNum += 1
}
if needNum <= item.Num {
consumeItems[item.Id] = needNum
exp = uint32(itemTable.Value)*needNum - exp
level += 1
break
} else {
consumeItems[item.Id] = item.Num
exp += uint32(itemTable.Value) * item.Num
}
}
treasure.Exp = exp
treasure.Level = level
player.ReduceItems(consumeItems, logic.LogTypeItemConsumeByTreasureUpgrade)
case 2:
var itemTable = this.tables.Item.Find1(int(req.Value))
if itemTable == nil {
this.logger.Error("Parameter or data error, table 'Item' was not found, itemId: ", req.Value)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
if ok, tip := player.CheckItem(req.Value, 1); !ok {
_ = player.TipNotice(tip)
return
}
treasure.Exp += uint32(itemTable.Value)
if treasure.Exp >= uint32(levelTable.NeedExp) {
treasure.Level += 1
treasure.Exp -= uint32(levelTable.NeedExp)
}
player.ReduceItem(req.Value, 1, logic.LogTypeItemConsumeByTreasureUpgrade)
}
player.SaveModel(treasure)
_ = player.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemTreasureChange), &pb.TreasureChangeListAck{
ChangeList: []*pb.TreasureChange{{ChangeType: pb.ChangeType_Changed, Treasure: treasure.BuildMsgTreasure()}},
2025-06-04 18:17:39 +08:00
})
if treasure.Level != preLevel {
player.SendUpgradeMaster(pb.UpgradeMasterType_MasterTreasureUpgrade, preLevel, treasure.Level, treasure.HeroUid)
}
2025-06-04 18:17:39 +08:00
}
func (this *PlayerHandler) TreasureRefine(player *logic.Player, msg *net.Message) {
var req = new(pb.TreasureRefineReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
return
}
if req.TreasureUid == 0 {
this.logger.Error("Parameter error, req.TreasureUid == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
var equip = player.Treasure[req.TreasureUid]
if equip == nil {
this.logger.Error("Parameter error, equip was not found, req.TreasureUid: ", req.TreasureUid)
_ = player.TipNotice(proto.TipTreasureNotFound)
return
}
var equipTable = this.tables.Treasure.Get(int(equip.Id))
if equipTable == nil {
this.logger.Error("Parameter or data error, table 'Treasure' was not found, equip.Id: ", equip.Id)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
if equip.Level >= uint32(equipTable.Levels) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
if player.CheckFunctionOpen(pb.ModId_ModuleItem, pb.FuncType_FuncTreasureUpgrade, int(equip.Level+1)) {
_ = player.TipNotice(proto.TipLevelAlreadyMax)
return
}
var levelTable = this.tables.TreasureRefine.Find3(int(equip.Id), int(equip.Level))
if levelTable == nil {
_ = player.TipNotice(proto.TipDataTablesError)
return
}
for i := range levelTable.ConsumeItems {
if ok, tip := player.CheckItem(uint32(levelTable.ConsumeItems[i]), uint32(levelTable.ConsumeNums[i])); !ok {
_ = player.TipNotice(tip)
return
}
}
var nextLevelTable = this.tables.TreasureLevel.Find3(int(equip.Id), int(equip.Level+1))
if nextLevelTable == nil {
_ = player.TipNotice(proto.TipDataTablesError)
return
}
var preLevel = equip.Level
equip.Level = uint32(nextLevelTable.Level)
for i := range levelTable.ConsumeItems {
player.ReduceItem(uint32(levelTable.ConsumeItems[i]), uint32(levelTable.ConsumeNums[i]), logic.LogTypeItemConsumeByTreasureUpgrade)
}
player.SaveModel(equip)
_ = player.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemTreasureChange), pb.TreasureChangeListAck{
ChangeList: []*pb.TreasureChange{{Treasure: equip.BuildMsgTreasure(), ChangeType: pb.ChangeType_Add}},
})
player.SendUpgradeMaster(pb.UpgradeMasterType_MasterTreasureRefine, preLevel, equip.Level, equip.HeroUid)
return
}