package models import ( "fmt" "github.com/golang/protobuf/proto" "pro2d/common" "pro2d/common/logger" "pro2d/csvdata" "pro2d/pb" ) //背包系统 func (m *RoleModel) GetItemCount(key string) int32 { c, ok := m.Items[key] if !ok { c = int32(0) } return c } func (m *RoleModel) CostItem(key string, count int32) bool { if count > m.GetItemCount(key) { return false } return m.AddItem(key, -count) } func (m *RoleModel) CostItems(params common.IMapStringNum) bool { for k, v := range params { if v > m.GetItemCount(k) { return false } params[k] = -v } return m.AddItems(params) } func (m *RoleModel) AddItem(key string, count int32) bool { c := m.GetItemCount(key) num := c + count if num > 0 { m.Items[key] = num } else { delete(m.Items, key) } m.SetProperty("items", common.MapNumToString(m.Items)) rsp, err := proto.Marshal(&pb.RoleUpdateItemsRsp{Items: fmt.Sprintf("%s=%d", key, num)}) if err != nil { logger.Error(err.Error()) return true } if m.GetConn() != nil { m.GetConn().Send(0, uint32(pb.ProtoCode_RoleUpdateItemsRsp), rsp) } return true } func (m *RoleModel) AddItems(params common.IMapStringNum) bool { tmp := make(common.IMapString) for k, v := range params { c := m.GetItemCount(k) num := c + v if num > 0 { m.Items[k] = num } else { num = 0 delete(m.Items, k) } tmp[k] = num } m.SetProperty("items", common.MapNumToString(m.Items)) rsp, err := proto.Marshal(&pb.RoleUpdateItemsRsp{Items: common.MapToString(tmp)}) if err != nil { logger.Error(err.Error()) return true } if m.GetConn() != nil { m.GetConn().Send(0, uint32(pb.ProtoCode_RoleUpdateItemsRsp), rsp) } return true } func (m *RoleModel) AddHero(hero *pb.Hero) { h := NewHero(hero) h.Create() m.Heros[hero.Id] = h } func (m *RoleModel) AddTeam(team *pb.Team) { t := NewTeam(team) t.Create() m.Teams[team.Id] = t } func (m *RoleModel) UpdateTeam(teams []*pb.Team) { for _, team := range teams { team.RoleId = m.Role.Id t := m.Teams[team.Id] if t != nil { t.UpdateSchema(team) } } } func (m *RoleModel) AddEquip(equip *pb.Equipment) *EquipModel { e := NewEquip(equip) e.Create() m.Equipments[equip.Id] = e m.EquipmentAddNotify(equip) return e } func (m *RoleModel) EquipmentAddNotify(equip *pb.Equipment) { update := &pb.EquipmentAddRsp{Equip: equip} if rsp, err := proto.Marshal(update); err != nil { logger.Error(" EquipmentAddNotify err:", err.Error()) return } else { if m.GetConn() != nil { m.GetConn().SendSuccess(uint32(pb.ProtoCode_EquipmentAddRsp), rsp) } } } func (m *RoleModel) UpLevel(exp int32) (int32, int32) { level := m.Role.Level oldLevelExp := csvdata.Get().TbAccountLevelExp.Get(level) if oldLevelExp == nil { return level, m.Role.Level } if exp >= oldLevelExp.NeedExp-m.Role.Exp { exp = exp - (oldLevelExp.NeedExp - m.Role.Exp) level++ for exp > 0 { oldLevelExp = csvdata.Get().TbAccountLevelExp.Get(level) if oldLevelExp == nil { return level, exp } if exp >= oldLevelExp.NeedExp { exp = exp - oldLevelExp.NeedExp level++ } else { exp = exp + m.Role.Exp break } } } else { exp = exp + m.Role.Exp } return level, exp } func (m *RoleModel) Award(award common.IMapStringNum) common.IMapStringNum { m.AddItems(award) return award } func (m *RoleModel) EquipmentRefer(equipId, heroId string, refer bool, left bool) int32 { e, ok := m.Equipments[equipId] if !ok { return 2 } equip := e.(*EquipModel) // 1 脱 // 1.1 装备直接脱掉 // 2 戴 // 2.0.1 如果是戒指,特殊处理, 未被其他英雄穿戴直接穿,同位置装备是否穿戴, 已经被穿戴,则脱了再穿 // 2.0.2 如果是戒指,特殊处理, 如果其他英雄已经被穿戴,则脱了再穿, 同位置装备是否穿戴, 已经被穿戴,则脱了再穿 // 2.1.1 如果不是戒指,未被其他英雄穿戴直接穿,同位置装备是否穿戴, 已经被穿戴,则脱了再穿 // 2.1.2 如果不是戒指,如果其他英雄已经被穿戴,则脱了再穿, 同位置装备是否穿戴, 已经被穿戴,则脱了再穿 // 可以合并。不用判断是否是戒指。 h1 := m.Heros[heroId] h2 := m.Heros[equip.Equip.HeroId] var outHero, inHero *HeroModel inEquip := csvdata.Get().TbEquipmentData.Get(equip.Equip.GetTbId()) if !refer { if h1 != nil { outHero = h1.(*HeroModel) outHero.DelEquipment(equip.Equip.Id) } if h2 != nil { outHero = h2.(*HeroModel) outHero.DelEquipment(equip.Equip.Id) } equip.SetProperty("heroid", "") } else { if h1 == nil { return 3 } inHero = h1.(*HeroModel) pos := common.EquipmentTypToPos(inEquip.EquipType) posT := common.EquipmentPosToT(pos, left) // 2.1.1 if equip.Equip.HeroId == "" { var outEquipID string for id, typ := range inHero.Equipments { if typ == posT { outEquipID = id break } } if outEquipID != "" { tmpEuqip, ok := m.Equipments[outEquipID] if ok { outEquip := tmpEuqip.(*EquipModel) outEquip.SetProperty("heroid", "") inHero.DelEquipment(outEquipID) } } inHero.AddEquipment(equip.Equip.Id, posT) equip.SetProperty("heroid", inHero.Hero.Id) equip.SetProperty("left", left) } else { if h2 == nil { return 4 } // 2.1.2 outHero = h2.(*HeroModel) var outEquipID string for id, tpos := range inHero.Equipments { if tpos == posT { outEquipID = id break } } if outEquipID != "" { tmpEquip, ok := m.Equipments[outEquipID] if ok { outEquip := tmpEquip.(*EquipModel) outEquip.SetProperty("heroid", "") inHero.DelEquipment(outEquipID) } } outHero.DelEquipment(equip.Equip.Id) inHero.AddEquipment(equip.Equip.Id, posT) equip.SetProperty("heroid", inHero.Hero.Id) equip.SetProperty("left", left) } } return 0 }