在玩家断开连接时,使用 sync.Once 确保只保存一次玩家数据, 防止因并发或多次触发导致的数据异常。 feat(fight): 增加战斗资格判断与邀请取消功能 - 新增 Player.CanFight() 方法用于统一判断是否可以参与战斗 - 在多个战斗相关接口中加入 CanFight 检查 - 添加“取消战斗邀请”指令及处理逻辑(cmd: 2402) - 修复部分错误码不准确的问题,提升提示一致性 refactor(login): 优化登录流程并增强健壮性 - 提前校验 session 合法性 - 增强获取玩家信息后的空指针检查 - 调整挖矿数据重置方式为 defer 执行 - 优化日志输出内容,便于调试追踪 docs(model): 更新部门、菜单等模型字段命名规范 将 orderNum 字段改为 ordernum,保持数据库列名风格一致, 同时更新了 base_sys_role 中 userId 为 userid。 perf(rate-limit): 提高登录接口的限流 Burst 容量 调整限流器配置,将请求 burst 容量从 2 提升至 5, 以应对短时间高频访问场景,改善用户体验。 chore(build): 忽略新增编译产物和临时文件 在 .gitignore 中添加 logic/logic2、login/login 等新生成文件路径, 避免误提交二进制文件到版本控制。
110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
package player
|
|
|
|
import (
|
|
"blazing/logic/service/common"
|
|
"blazing/logic/service/fight/info"
|
|
)
|
|
|
|
// 邀请玩家加入战斗 邀请者,被邀请者,邀请模式
|
|
func (lw *Player) InvitePlayerToBattle(pinfo *info.PVPinfo) {
|
|
lw.PVPinfo = pinfo
|
|
Mainplayer.Range(func(key uint32, value *Player) bool {
|
|
|
|
if key == uint32(pinfo.PlayerID) {
|
|
|
|
value.HavePVPinfo = append([]*Player{lw}, value.HavePVPinfo...)
|
|
t1 := NewTomeeHeader(2501, value.Info.UserID)
|
|
t := info.NoteInviteToFightOutboundInfo{
|
|
UserID: lw.Info.UserID,
|
|
Nick: lw.Info.Nick,
|
|
Mode: pinfo.Mode,
|
|
}
|
|
value.SendPack(t1.Pack(&t))
|
|
return false
|
|
}
|
|
|
|
return true
|
|
})
|
|
|
|
}
|
|
|
|
// 取消对战邀请
|
|
func (lw *Player) CancelBattle() {
|
|
|
|
if lw.PVPinfo == nil {
|
|
return
|
|
}
|
|
Mainplayer.Range(func(key uint32, value *Player) bool {
|
|
|
|
if key == uint32(lw.PVPinfo.PlayerID) {
|
|
for idx, v := range value.HavePVPinfo {
|
|
if v != nil && v.GetInfo().UserID == lw.PVPinfo.PlayerID {
|
|
value.HavePVPinfo = append(value.HavePVPinfo[:idx], value.HavePVPinfo[idx+1:]...)
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
return true
|
|
})
|
|
|
|
lw.PVPinfo = nil
|
|
}
|
|
|
|
func (p *Player) SendLoadPercent(b info.LoadPercentOutboundInfo) {
|
|
t1 := NewTomeeHeader(2441, p.Info.UserID)
|
|
|
|
p.SendPack(t1.Pack(&b)) //准备包由各自发,因为协议不一样
|
|
}
|
|
|
|
// 同意对战
|
|
func (lw *Player) AgreeBattle(userid, flag uint32, mode info.EnumBattleMode) (bool, common.PlayerI) {
|
|
|
|
defer func(p *Player) {
|
|
p.HavePVPinfo = make([]*Player, 0)
|
|
|
|
}(lw) //删除对方的邀请信息
|
|
|
|
for _, v := range lw.HavePVPinfo {
|
|
if v == nil || v.Info.UserID != userid || v.PVPinfo == nil {
|
|
continue
|
|
|
|
}
|
|
t1 := NewTomeeHeader(2502, v.Info.UserID)
|
|
ret := &info.S2C_NOTE_HANDLE_FIGHT_INVITE{
|
|
UserID: lw.Info.UserID,
|
|
Nick: lw.Info.Nick,
|
|
}
|
|
|
|
if flag == 0 { //拒绝对战
|
|
|
|
v.SendPack(t1.Pack(ret))
|
|
return false, nil
|
|
}
|
|
if !lw.IsLogin { //玩家未登录
|
|
ret.Result = 4
|
|
v.SendPack(t1.Pack(ret))
|
|
return false, nil
|
|
}
|
|
if v.Info.UserID == userid && v.PVPinfo.Mode == mode { //成功找到,同意对战
|
|
if lw.CanFight() {
|
|
ret.Result = 1
|
|
|
|
v.SendPack(t1.Pack(ret))
|
|
return true, v
|
|
|
|
} else {
|
|
ret.Result = 3
|
|
v.SendPack(t1.Pack(ret))
|
|
return false, nil
|
|
}
|
|
|
|
}
|
|
|
|
return false, nil
|
|
|
|
} //如果对方掉线
|
|
return false, nil
|
|
}
|