登陆与战斗的衔接
前言
这次更新应该是做客户端前的倒数第三次服务端更新了。本次更新的量比较少,主要是因为期中的任务有点多。好了让我们开始把。
战斗链接
我在战斗服务中加入了检测Uid的段落,以便后面进房扣除体力。
if req.Uid == 0 {
return &api.EnterRoomResp{Code: codeBadParam, Msg: "uid 不能为 0,请先登录"}
}
进房扣 1 点体力;体力不足或玩家不存在时禁止进房
if code, msg := deductStamina(req.Uid); code != codeOK {
logger.Printf("玩家 uid=%d 进房失败:扣体力 code=%d msg=%s", req.Uid, code, msg)
return &api.EnterRoomResp{Code: code, Msg: msg}
}
账号链接
我在登陆账号时增加了检查角色是否缺失的函数,如果存在则扫描角色信息
// 角色信息:注册时已建 player 行;老账号缺失时按零值返回,不阻断登录
var role api.LoginResp
roleErr := db.QueryRow(
"SELECT level, stamina, exp, gold FROM player WHERE uid = ?", uid,
).Scan(&role.Level, &role.Stamina, &role.Exp, &role.Gold)
if roleErr != nil && !errors.Is(roleErr, sql.ErrNoRows) {
logger.Println("查询角色失败:", roleErr)
return &api.LoginResp{Code: codeServerError, Msg: "服务器繁忙"}
}
logger.Printf("登录成功:account=%s uid=%d", req.Account, uid)
return &api.LoginResp{
Code: codeOK,
Msg: "ok",
Uid: int64(uid),
Token: token,
SessionId: token,
Level: role.Level,
Stamina: role.Stamina,
Exp: role.Exp,
Gold: role.Gold,
}
在注册方面我使用了在前一篇文章中用过的“事务”方法,让账号与角色在同一事务中创建,避免只有账号,没有角色的情况出现。万一出现,事务就会退出回滚数据。
// 账号与角色行必须在同一事务里创建,避免只有账号没有角色
tx, err := db.Begin()
if err != nil {
logger.Println("开启事务失败:", err)
return &api.RegisterResp{Code: codeServerError, Msg: "服务器繁忙"}
}
defer tx.Rollback()
很简单把,因为服务端的初步更新快到结尾了,所以我要放松一些。下期见。
我是Strandingwhale,也可以叫我bridges,计算机专业,专注游戏后端与Unreal引擎开发。在git pages和博客园上发布文章,其他网站上的都不是本人。
目前还在上大学,希望能做出很牛逼的项目,然后去到我喜欢的岗位。
本人是冯·诺伊曼派,不是图灵学派。
古法编程,AI提供一点思路,少用AI。
喜欢玩明日方舟
喜欢的游戏还有 死亡搁浅 灵魂摆渡人 异星工厂 等
浙公网安备 33010602011771号