登陆与战斗的衔接

前言

这次更新应该是做客户端前的倒数第三次服务端更新了。本次更新的量比较少,主要是因为期中的任务有点多。好了让我们开始把。

战斗链接

我在战斗服务中加入了检测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()

很简单把,因为服务端的初步更新快到结尾了,所以我要放松一些。下期见。

posted @ 2026-11-03 23:11  布里吉斯  阅读(6)  评论(0)    收藏  举报