RoleAction.go 5.81 KB
// 游戏服角色相关操作
package action

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	"go.mongodb.org/mongo-driver/bson"
	"pro2d/common"
	"pro2d/common/components"
	"pro2d/common/db/mongoproxy"
	"pro2d/common/db/redisproxy"
	"pro2d/common/logger"
	"pro2d/csvdata"
	"pro2d/models"
	"pro2d/pb"
)

// HeartRpc 心跳请求
func HeartRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	//msg.Conn.SetLastHeartCheckTime()
	return 0, nil
}

// getRandomName 随机名字
func getRandomName() string {
	name := ""
	for {
		name = common.RandomName(common.DefaultName)
		if name == "" {
			continue
		}

		relay, err := redisproxy.SETNX(fmt.Sprintf(common.NickNames, name), "1")
		if err != nil {
			continue
		}
		if relay.(int64) == 1 {
			break
		}
	}
	return name
}

/*
CreateRpc 创建角色请求
 1: proto解析错误
 2: 角色不存在
*/
func CreateRpc(role1 *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.CreateReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("CreateRpc err: %v", err)
		return 1, err
	}
	role := models.RoleExistByUid(req.Token)
	if role != nil {
		return 2, "role exists"
	}

	roleId, err := common.GetNextRoleId()
	if err != nil {
		return 3, err
	}

	role = models.NewRole(roleId)
	role.Role.Uid = req.Token
	role.Role.Level = 1
	role.Role.Nick = getRandomName()
	if err := role.Create(); err != nil {
		logger.Error("CreateRpc role create err: %v", err)
		return 4, nil
	}
	role.InitRole()
	return 0, nil
}

// ChangeTeamRpc 阵容变换
func ChangeTeamRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.ChangeTeamReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("loginRpc err: %v", err)
		return 1, nil
	}

	role.UpdateTeam(req.Team)
	return 0, nil
}

/*
HeroEquipReferRpc 穿戴/脱 装备
 2: 装备不存在
*/
func HeroEquipReferRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.HeroEquipReferReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("loginRpc err: %v", err)
		return 1, nil
	}

	e, ok := role.Equipments[req.EquipId]
	if !ok {
		return 2, nil
	}

	equip := e.(*models.EquipModel)

	// 装备未被穿戴
	if equip.Equip.HeroId == "" {

		h, ok := role.Heros[req.HeroId]
		if ok {
			hero := h.(*models.HeroModel)
			hero.UpdateEquipment(equip.Equip.Id, equip.Equip.Type)
		}
		equip.SetProperty("heroid", req.HeroId)
	} else {
		//装备已经被穿戴
		if req.HeroId != equip.Equip.HeroId {
			h, ok := role.Heros[equip.Equip.HeroId]
			if ok {
				hero := h.(*models.HeroModel)
				hero.UpdateEquipment(equip.Equip.Id, "")
			}

			h, ok = role.Heros[req.HeroId]
			if ok {
				hero := h.(*models.HeroModel)
				hero.UpdateEquipment(equip.Equip.Id, equip.Equip.Type)
			}

			equip.SetProperty("heroid", req.HeroId)
		}
	}
	return 0, nil
}

/*
RoleClearItemsRpc 删除物品
 2 删除失败
*/
func RoleClearItemsRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.RoleClearItemsReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("proto rpc err: %v", err)
		return 1, nil
	}

	bkup := make(common.IMapStringNum)
	for _, item := range req.Items {
		for k, v := range common.StringToMapNum(item) {
			tmp, ok := bkup[k]
			if !ok {
				tmp = 0
			}
			bkup[k] = v + tmp
		}
	}

	if !role.CostItems(bkup) {
		logger.Error("cost err: %s", common.MapNumToString(bkup))
		return 2, nil
	}
	return 0, nil
}

/*
EquipmentDelRpc 删除装备
 2 删除失败
*/
func EquipmentDelRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.EquipmentDelReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("loginRpc err: %v", err)
		return 1, nil
	}
	filter := make(bson.D, 5)
	for _, id := range req.Id {
		filter = append(filter, bson.E{Key: "id", Value: id})
	}
	if err := mongoproxy.DelMany("equipment", filter); err != nil {
		logger.Error(err.Error())
		return 2, nil
	}

	for _, id := range req.Id {
		delete(role.Equipments, id)
	}

	return 0, nil
}

/*
RoleStartBattleRpc 开始战斗
*/
func RoleStartBattleRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.RoleStartBattleReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("loginRpc err: %v", err)
		return 1, nil
	}

	//TODO 消耗体力

	return 0, nil
}

/*
RoleEndBattleRpc 结束战斗
 2 关卡不存在

 RoleEndBattleRsp 返回值
*/
func RoleEndBattleRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
	req := pb.RoleEndBattleReq{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("loginRpc err: %v", err)
		return 1, nil
	}
	chapterInfo := csvdata.Get().TbRogueChapter.Get(req.ChapterId)
	chapterCount, first := role.Role.PassChapters[req.ChapterId]
	carbonInfo, ok := chapterInfo.Carbons[req.CarbonId]
	if !ok {
		logger.Error("carbonInfo not exists")
		return 2, nil
	}

	reward := make(common.IMapStringNum)
	if !first {
		role.Role.PassChapters[req.ChapterId] = 1
		for k, v := range common.StringToMapNum(carbonInfo.FirstAward) {
			reward[k] = v
		}
	} else {
		role.Role.PassChapters[req.ChapterId] = chapterCount + 1
	}

	for k, v := range common.StringToMapNum(carbonInfo.NormalAward) {
		rv, ok := reward[k]
		if !ok {
			reward[k] = v
		} else {
			reward[k] = rv + v
		}
	}
	//award
	reward = role.Award(reward)

	//exp
	var amount int32
	if req.Pass {
		amount = carbonInfo.CarbonExp
	} else {
		amount = carbonInfo.CarbonFailExp
	}
	level, exp := role.UpLevel(amount)
	role.UpdateProperties(map[string]interface{}{"level": level, "exp": exp}, true)

	rsp := &pb.RoleEndBattleRsp{
		RoleLevel:     level,
		RoleExp:       exp,
		RoleExpamount: amount,
		Pass:          req.Pass,
		Reward:        common.MapNumToString(reward),
	}
	return 0, rsp
}