From 4ebf0badf5a14508f6c313fc083d16b2b7ea8296 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 5 Jun 2025 17:48:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=B1=E9=9B=84=E5=92=8C=E8=8B=B1=E9=9B=84?= =?UTF-8?q?=E5=90=8D=E5=B0=86=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proto/idl/mod_battle.proto | 52 +++---- proto/idl/mod_common.proto | 10 +- proto/idl/mod_counter.proto | 14 +- proto/idl/mod_hero.proto | 83 +++++++---- proto/idl/mod_item.proto | 42 +++--- proto/idl/mod_login.proto | 30 ++-- proto/idl/mod_role.proto | 64 ++++---- .../data/{hero_general.go => hero_book.go} | 22 +-- servers/game/handler/player_hero.go | 140 +++++++++--------- servers/game/logic/manager_player.go | 34 +++-- servers/game/logic/player_equip.go | 30 ++-- servers/game/logic/player_hero.go | 70 +++++---- servers/game/logic/player_hero_book.go | 52 +++++++ 13 files changed, 367 insertions(+), 276 deletions(-) rename servers/game/data/{hero_general.go => hero_book.go} (61%) create mode 100644 servers/game/logic/player_hero_book.go diff --git a/proto/idl/mod_battle.proto b/proto/idl/mod_battle.proto index 871f1b8..d61e0f9 100644 --- a/proto/idl/mod_battle.proto +++ b/proto/idl/mod_battle.proto @@ -4,36 +4,36 @@ option go_package = "pb/"; import "mod_item.proto"; -message BattleEnterReq { - uint32 SceneId = 1; //战斗场景ID -} - -message EntityProperty { - -} - -message ActionTarget { - uint32 Type = 1; //目标类型, 1.英雄(自己人),2.怪物(敌人) - uint32 TargetId = 2; //目标ID - uint32 Status = 3; //目标状态(待定,如被击飞) - uint64 Value = 4; //数值,可以是伤害,回血等 +//战斗单位 +message BattleEntity { + uint32 Type = 1; //目标类型, 1.英雄(自己人),2.怪物(敌人) + uint32 Id = 2; //目标ID + uint64 Hp = 3; //当前血量 + uint32 Rage = 4; //当前怒气 + uint32 Status = 5; //目标状态(待定,如眩晕、击飞等) + uint64 Value = 6; //数值,可以是伤害,回血等 } +//战斗动作 message BattleAction { - uint32 BattleRound = 5; //战斗回合 - uint32 Caster = 1; //投手(动作发出者) - uint32 Type = 2; //类型 - uint32 SkillId = 3; //技能ID - repeated ActionTarget TargetList = 4; //动作目标 + BattleEntity Caster = 1; //投手(动作发出者) + uint32 Type = 2; //类型 + uint32 SkillId = 3; //技能ID + repeated BattleEntity TargetList = 4; //动作目标 +} + +message BattleRound { + uint32 BattleRound = 1; //战斗回合 + repeated BattleAction ActionList = 2; //动作列表 } message BattleEnterAck { - uint32 SceneId = 1; //战斗场景ID - uint32 Result = 2; //战斗结果, 1.表示挑战成功, 0.表示挑战失败 - uint32 Starts = 3; //战斗星数 - repeated int32 Heroes = 4; //英雄阵容 - repeated int32 Enemies = 5; //敌人阵容 - uint32 BattleRounds = 6; //战斗回合数 - repeated BattleAction ActionList = 7; //动作列表 - repeated Item RewardList = 8; //奖励列表(掉落物品列表) + uint32 SceneId = 1; //战斗场景ID + bool Result = 2; //战斗结果, 1.表示挑战成功, 0.表示挑战失败 + int32 Score = 3; //战斗分数(星数) + repeated int32 Heroes = 4; //英雄阵容 + repeated int32 Enemies = 5; //敌人阵容 + uint32 BattleRounds = 6; //战斗回合数 + repeated BattleRound RoundList = 7; + repeated Item RewardList = 8; //奖励列表(掉落物品列表) } \ No newline at end of file diff --git a/proto/idl/mod_common.proto b/proto/idl/mod_common.proto index 2ce374e..02e16a6 100644 --- a/proto/idl/mod_common.proto +++ b/proto/idl/mod_common.proto @@ -9,24 +9,24 @@ option go_package = "pb/"; // MsgId.ModCommonHeartbeat: 1 // 心跳请求 message HeartbeatReq { - uint32 Index = 1; //序号 + uint32 Index = 1; //序号 } // MsgId.ModCommonHeartbeat: 1 // 心跳返回 message HeartbeatAck { - uint32 Index = 1; //序号 - int64 ServerTime = 2; //服务器时间 + uint32 Index = 1; //序号 + int64 ServerTime = 2; //服务器时间 } // MsgId.ModCommonTipNotice: 2 // 提示消息 message TipNoticeAck { - string Message = 1; //提示消息 + string Message = 1; //提示消息 } // MsgId.ModCommonGmCommand: 3 // Gm命令请求 message GmCommandReq { - string Command = 1;//命令 + string Command = 1;//命令 } \ No newline at end of file diff --git a/proto/idl/mod_counter.proto b/proto/idl/mod_counter.proto index 1381e1f..fdef3c2 100644 --- a/proto/idl/mod_counter.proto +++ b/proto/idl/mod_counter.proto @@ -7,21 +7,21 @@ option go_package = "pb/"; // 如果定义的消息内没有字段或者消息被注释掉了,说明该请求不需要参数,发送消息时仅发送包头即可,包体可为空, 返回的消息亦是如此。 message Counter { - uint32 Type = 1; - uint64 Key = 2; - int64 Time = 3; - uint32 Daily = 4; - uint32 Total = 5; + uint32 Type = 1; + uint64 Key = 2; + int64 Time = 3; + uint32 Daily = 4; + uint32 Total = 5; } // MsgId.ModCounterList: 7001 // 计数器列表返回 message CounterListAck { - repeated Counter CounterList = 1; + repeated Counter CounterList = 1; } // MsgId.ModCounterChange: 7002 // 计数器变更返回 message CounterChangeAck { - Counter Counter = 1; + Counter Counter = 1; } \ No newline at end of file diff --git a/proto/idl/mod_hero.proto b/proto/idl/mod_hero.proto index 69e976c..536bb6c 100644 --- a/proto/idl/mod_hero.proto +++ b/proto/idl/mod_hero.proto @@ -9,56 +9,83 @@ import "enums.proto"; // 如果定义的消息内没有字段或者消息被注释掉了,说明该请求不需要参数,发送消息时仅发送包头即可,包体可为空, 返回的消息亦是如此。 message Hero { - uint32 HeroId = 1; - uint64 Exp = 2; - uint32 Level = 3; - uint32 BreakLevel = 4; - uint32 SoulLevel = 5; - repeated uint32 SoulList = 6; - uint32 Awaken = 7; - repeated uint32 General = 8; - repeated uint64 Equips = 9; - repeated uint64 Treasures = 10; - repeated uint64 Mounts = 11; - repeated uint64 Artifact = 12; - repeated uint64 Attrs = 13; + uint64 Uid = 1; + uint32 Id = 2; + uint64 Exp = 3; + uint32 Level = 4; + uint32 BreakLevel = 5; + uint32 SoulLevel = 6; + repeated uint32 SoulList = 7; + uint32 Awaken = 8; + repeated uint64 Equips = 10; + repeated uint64 Treasures = 11; + repeated uint64 Mounts = 12; + repeated uint64 Artifact = 13; + repeated uint64 Attrs = 14; } // ModItemChange: 6002 // 英雄列表返回 message HeroListAck { - repeated Hero HeroList = 1; + repeated Hero HeroList = 1; } message HeroChange { - ChangeType ChangeType = 1; - Hero Hero = 2; + ChangeType ChangeType = 1; + Hero Hero = 2; } // ModHeroChang: 5002 // 英雄变更返回 message HeroChangeListAck { - repeated HeroChange ChangeList = 1; + repeated HeroChange ChangeList = 1; } // ModHeroUpgrade: 5003 // 英雄升级请求 message HeroUpgradeReq { - uint32 HeroId = 1; - uint32 Levels = 2; // 1/5级 + uint64 HeroUid = 1; + uint32 Levels = 2; // 1/5级 } message HeroBreakReq { - uint32 HeroId = 1; - uint32 OptItemId = 2; //选择的可选消耗物品ID -} - -message HeroGeneralActivateReq { - uint32 HeroId = 1; - uint32 Index = 2; + uint64 HeroUid = 1; + uint32 OptItemId = 2; //选择的可选消耗物品ID } message HeroEquipReq { - uint32 HeroId = 1; - uint64 EquipUid = 2; + uint64 HeroUid = 1; + uint64 EquipUid = 2; +} + +// 英雄名将册状态 +message HeroBookItem { + uint32 BookId = 1; + bool Active = 2; +} + +// 英雄名将册 +message HeroBook { + uint32 HeroId = 1; + repeated HeroBookItem ItemList = 8; +} + +// ModHeroBookList: 5013 +// 英雄名将册列表返回 +message HeroBookListAck { + repeated HeroBook BookList = 1; +} + +// ModHeroBookActivate: 5014 +// 英雄名将册激活请求 +message HeroBookActivateReq { + uint32 HeroId = 1; + uint32 Index = 2; +} + +// ModHeroBookChange: 5015 +// 英雄名将册变更 +message HeroBookChangeAck { + ChangeType ChangeType = 1; + HeroBook HeroBook = 2; } \ No newline at end of file diff --git a/proto/idl/mod_item.proto b/proto/idl/mod_item.proto index 9fd24b7..cc494b5 100644 --- a/proto/idl/mod_item.proto +++ b/proto/idl/mod_item.proto @@ -9,64 +9,64 @@ import "enums.proto"; // 如果定义的消息内没有字段或者消息被注释掉了,说明该请求不需要参数,发送消息时仅发送包头即可,包体可为空, 返回的消息亦是如此。 message Item { - uint32 ItemId = 1; //物品ID - uint32 ItemNum = 2; //物品数量 + uint32 ItemId = 1; //物品ID + uint32 ItemNum = 2; //物品数量 } // ModItemList: 6001 // 物品列表返回 message ItemListAck { - repeated Item ItemList = 1; + repeated Item ItemList = 1; } message ItemChange { - Item Item = 1; - ChangeType ChangeType = 2; + Item Item = 1; + ChangeType ChangeType = 2; } // ModItemChange: 6002 // 物品变更列表返回 message ItemChangeListAck { - repeated ItemChange ChangeList = 1; + repeated ItemChange ChangeList = 1; } // ModItemUse: 6003 // 物品使用请求 message ItemUseReq { - uint32 ItemId = 1; //物品ID - uint32 ItemNum = 2; //物品数量 + uint32 ItemId = 1; //物品ID + uint32 ItemNum = 2; //物品数量 } message Equip { - uint64 Uid = 1; - uint32 EquipId = 2; - uint64 Exp = 3; - uint32 Level = 4; - uint32 Refine = 5; - repeated uint32 Holes = 6; - uint32 HeroId = 7; + uint64 Uid = 1; + uint32 EquipId = 2; + uint64 Exp = 3; + uint32 Level = 4; + uint32 Refine = 5; + repeated uint32 Holes = 6; + uint64 HeroUid = 7; } // ModEquipList: 6011 // 装备列表返回 message EquipListAck { - repeated Equip EquipList = 1; + repeated Equip EquipList = 1; } message EquipChange { - ChangeType ChangeType = 1; - Equip Equip = 2; + ChangeType ChangeType = 1; + Equip Equip = 2; } // ModEquipChange: 6012 // 装备变更列表返回 message EquipChangeListAck { - repeated EquipChange ChangeList = 1; + repeated EquipChange ChangeList = 1; } // ModEquipUpgrade: 6013 // 装备升级请求 message EquipUpgradeReq { - uint64 EquipUid = 1; - uint32 Levels = 2; // 1/5级 + uint64 EquipUid = 1; + uint32 Levels = 2; // 1/5级 } \ No newline at end of file diff --git a/proto/idl/mod_login.proto b/proto/idl/mod_login.proto index ff6312a..6ccc954 100644 --- a/proto/idl/mod_login.proto +++ b/proto/idl/mod_login.proto @@ -9,41 +9,41 @@ option go_package = "pb/"; // MsgId.ModLoginUserAuth: 1001 // 进入游戏用户认证请求 message UserAuthReq { - string Machine = 1; - string Version = 2; - string Token = 3; + string Machine = 1; + string Version = 2; + string Token = 3; } message Role { - uint64 Id = 1; //ID - string Name = 2; //名称 - uint32 Gender = 3; //角色性别 + uint64 Id = 1; //ID + string Name = 2; //名称 + uint32 Gender = 3; //角色性别 } // MsgId.ModLoginUserAuth: 1001 // 进入游戏用户认证返回 message UserAuthAck { - uint64 UserId = 1; //用户ID - repeated Role RoleList = 2; //角色列表 + uint64 UserId = 1; //用户ID + repeated Role RoleList = 2; //角色列表 } // MsgId.ModLoginRoleCreate: 1002 // 角色创建请求 message RoleCreateReq { - string Name = 1; //角色名称 - uint32 Gender = 2; //角色性别 + string Name = 1; //角色名称 + uint32 Gender = 2; //角色性别 } // MsgId.ModLoginRoleCreate: 1002 // 角色创建返回 message RoleCreateAck { - Role Role = 1; + Role Role = 1; } // MsgId.ModLoginRoleLogin: 1003 // 角色登录请求 message RoleLoginReq { - uint64 RoleId = 1;//角色ID + uint64 RoleId = 1;//角色ID } // MsgId.ModLoginRoleLogout: 1004 @@ -54,8 +54,8 @@ message RoleLoginReq { // MsgId.ModLoginReconnect: 1005 // 角色重连请求 message ReconnectReq { - uint64 UserId = 1;//用户ID - uint64 RoleId = 2;//角色ID + uint64 UserId = 1;//用户ID + uint64 RoleId = 2;//角色ID } // MsgId.ModLoginReconnect: 1005 @@ -66,5 +66,5 @@ message ReconnectReq { // MsgId.ModLoginKickOut: 1006 // 强制下线 message KickOutAck { - string Message = 1; + string Message = 1; } \ No newline at end of file diff --git a/proto/idl/mod_role.proto b/proto/idl/mod_role.proto index 7dbe595..396cb52 100644 --- a/proto/idl/mod_role.proto +++ b/proto/idl/mod_role.proto @@ -11,80 +11,84 @@ import "enums.proto"; // MsgId.ModRoleProperty: 2001 // 角色属性返回 message RolePropertyAck { - //unchangeable - uint64 UserId = 1; - uint32 Platform = 2; - uint32 Channel = 3; - uint32 ServerId = 4; - string Username = 5; - int64 CreateTime = 6; + //unchangeable + uint64 UserId = 1; + uint32 Platform = 2; + uint32 Channel = 3; + uint32 ServerId = 4; + string Username = 5; + int64 CreateTime = 6; - //Fields - uint32 Language = 7; - string RoleName = 8; - uint32 RoleGender = 9; - uint32 AvatarFrame = 10; - uint32 ChatBubble = 11; - uint32 NamePrefix = 12; - uint32 NameTitle = 13; - uint32 RoleTitle = 14; - uint32 RoleLevel = 15; - uint32 LoginDays = 16; - int64 PowerNextTime = 17; + //Fields + uint32 Language = 7; + string RoleName = 8; + uint32 RoleGender = 9; + uint32 AvatarFrame = 10; + uint32 ChatBubble = 11; + uint32 NamePrefix = 12; + uint32 NameTitle = 13; + uint32 RoleTitle = 14; + uint32 RoleLevel = 15; + uint32 LoginDays = 16; + int64 PowerNextTime = 17; } // MsgId.ModRoleProperty: 2001 // 角色属性对 message RoleProperty { - RolePropertyType Type = 1; - int64 Value = 2; + RolePropertyType Type = 1; + int64 Value = 2; } // MsgId.ModRolePropertyChange: 2002; // 角色属性变更请求 message RolePropertyChangeReq { - RoleProperty Property = 1; + RoleProperty Property = 1; } // MsgId.ModRolePropertyChange: 2002; // 角色属性变更返回 message RolePropertyChangeAck { - repeated RoleProperty PropertyList = 1; + repeated RoleProperty PropertyList = 1; } // MsgId.ModRoleChangeLanguage: 2003; // 角色更改语言请求 message RoleChangeLanguageReq { - uint32 Language = 1; + uint32 Language = 1; } // MsgId.ModRoleChangeLanguage: 2003; // 角色变更语言返回 message RoleChangeLanguageAck { - uint32 Language = 1; + uint32 Language = 1; } // MsgId.ModRoleChangeRoleName: 2004; // 角色更改语言请求 message RoleChangeRoleNameReq { - string RoleName = 1; + string RoleName = 1; } // MsgId.ModRoleChangeRoleName: 2004; // 角色变更语言返回 message RoleChangeRoleNameAck { - string RoleName = 1; + string RoleName = 1; } // 角色货币 message Money { - MoneyType Type = 1; - uint32 Value = 2; + MoneyType Type = 1; + uint32 Value = 2; } // MsgId.ModRoleMoneyList: 2003 // MsgId.ModRoleMoneyChange: 2004 // 角色货币列表返回 message MoneyListAck { - repeated Money MoneyList = 1; + repeated Money MoneyList = 1; +} + +message TeamAck { + } \ No newline at end of file diff --git a/servers/game/data/hero_general.go b/servers/game/data/hero_book.go similarity index 61% rename from servers/game/data/hero_general.go rename to servers/game/data/hero_book.go index 5ec6625..61e648d 100644 --- a/servers/game/data/hero_general.go +++ b/servers/game/data/hero_book.go @@ -2,7 +2,7 @@ package data import json "github.com/json-iterator/go" -type HeroGeneral struct { +type HeroBook struct { Id int `json:"id"` HeroId int `json:"hero_id"` NeedHeroes []int `json:"need_heroes"` @@ -14,20 +14,20 @@ type HeroGeneral struct { AttrValue3 int `json:"attr_value3"` } -type HeroGeneralTable struct { - l []*HeroGeneral - m1 map[int]*HeroGeneral - m2 map[int][]*HeroGeneral +type HeroBookTable struct { + l []*HeroBook + m1 map[int]*HeroBook + m2 map[int][]*HeroBook } -func (this *HeroGeneralTable) load(buf []byte) error { +func (this *HeroBookTable) load(buf []byte) error { var err = json.Unmarshal(buf, &this.l) if err != nil { return err } - this.m1 = make(map[int]*HeroGeneral) - this.m2 = make(map[int][]*HeroGeneral) + this.m1 = make(map[int]*HeroBook) + this.m2 = make(map[int][]*HeroBook) for i := range this.l { this.m1[this.l[i].Id] = this.l[i] this.m2[this.l[i].HeroId] = append(this.m2[this.l[i].HeroId], this.l[i]) @@ -36,10 +36,10 @@ func (this *HeroGeneralTable) load(buf []byte) error { return nil } -func (this *HeroGeneralTable) Find1(heroId int) *HeroGeneral { - return this.m1[heroId] +func (this *HeroBookTable) Find1(id int) *HeroBook { + return this.m1[id] } -func (this *HeroGeneralTable) Find2(heroId int) []*HeroGeneral { +func (this *HeroBookTable) Find2(heroId int) []*HeroBook { return this.m2[heroId] } diff --git a/servers/game/handler/player_hero.go b/servers/game/handler/player_hero.go index bc6793f..a464c16 100644 --- a/servers/game/handler/player_hero.go +++ b/servers/game/handler/player_hero.go @@ -16,7 +16,7 @@ func (this *PlayerHandler) HeroUpgrade(player *logic.Player, msg *net.Message) { return } - if req.HeroId == 0 { + if req.HeroUid == 0 { _ = player.TipNotice(proto.ErrParameterError) return } @@ -26,7 +26,7 @@ func (this *PlayerHandler) HeroUpgrade(player *logic.Player, msg *net.Message) { return } - var hero = player.Hero[req.HeroId] + var hero = player.Hero[req.HeroUid] if hero == nil { _ = player.TipNotice(proto.ErrHeroNotFound) return @@ -144,12 +144,12 @@ func (this *PlayerHandler) HeroBreak(player *logic.Player, msg *net.Message) { return } - if req.HeroId == 0 || req.OptItemId == 0 { + if req.HeroUid == 0 || req.OptItemId == 0 { _ = player.TipNotice(proto.ErrParameterError) return } - var hero = player.Hero[req.HeroId] + var hero = player.Hero[req.HeroUid] if hero == nil { _ = player.TipNotice(proto.ErrHeroNotFound) return @@ -208,70 +208,6 @@ func (this *PlayerHandler) HeroBreak(player *logic.Player, msg *net.Message) { player.ReduceItem(optItemId, optItemNum, logic.LogTypeItemConsumeByHeroBreak) } -func (this *PlayerHandler) HeroGeneralActivate(player *logic.Player, msg *net.Message) { - var req = new(pb.HeroGeneralActivateReq) - var err = msg.Read(req) - if err != nil { - this.logger.Error("Read message failed, ", err) - _ = player.TipNotice(proto.ErrMessageError) - return - } - - if req.HeroId == 0 { - _ = player.TipNotice(proto.ErrParameterError) - return - } - - var hero = player.Hero[req.HeroId] - if hero == nil { - _ = player.TipNotice(proto.ErrHeroNotFound) - return - } - - var heroGeneralTables = this.tables.HeroGeneral.Find2(int(hero.Id)) - if len(heroGeneralTables) == 0 { - _ = player.TipNotice(proto.ErrDataTablesError) - return - } - - if req.Index >= uint32(len(heroGeneralTables)) { - _ = player.TipNotice(proto.ErrParameterError) - return - } - - if req.Index >= uint32(len(hero.General)) { - _ = player.TipNotice(proto.ErrParameterError) - return - } - - if len(hero.General) != len(heroGeneralTables) { - var general = make([]uint32, len(heroGeneralTables)) - copy(general, hero.General) - hero.General = general - } - - if hero.General[req.Index] != 0 { - _ = player.TipNotice(proto.ErrHeroGeneralActivated) - return - } - - for _, needId := range heroGeneralTables[req.Index].NeedHeroes { - if _, ok := player.Hero[uint32(needId)]; !ok { - _ = player.TipNotice(proto.ErrHeroGeneralCanNotActivate) - return - } - } - - hero.General[req.Index] = uint32(heroGeneralTables[req.Index].HeroId) - - player.SaveModel(hero) - player.UpdateHeroAttrs(hero) - - _ = player.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), &pb.HeroChangeListAck{ - ChangeList: []*pb.HeroChange{{ChangeType: pb.ChangeType_Changed, Hero: hero.BuildMsgHero()}}, - }) -} - func (this *PlayerHandler) HeroAwaken(player *logic.Player, msg *net.Message) { } @@ -297,7 +233,7 @@ func (this *PlayerHandler) HeroEquip(player *logic.Player, msg *net.Message) { return } - var hero = player.Hero[req.HeroId] + var hero = player.Hero[req.HeroUid] if hero == nil { _ = player.TipNotice(proto.ErrHeroNotFound) return @@ -335,7 +271,7 @@ func (this *PlayerHandler) HeroEquip(player *logic.Player, msg *net.Message) { if hero.Equips[equipIndex] != 0 { var setup = player.Equip[hero.Equips[equipIndex]] - if setup != nil && setup.HeroId != 0 { + if setup != nil && setup.HeroUid != 0 { setup.Id = 0 player.SaveModel(setup) equipChangeList = append(equipChangeList, &pb.EquipChange{ @@ -352,8 +288,8 @@ func (this *PlayerHandler) HeroEquip(player *logic.Player, msg *net.Message) { Hero: hero.BuildMsgHero(), }) - if equip.HeroId != 0 { - var setup = player.Hero[equip.HeroId] + if equip.HeroUid != 0 { + var setup = player.Hero[equip.HeroUid] if setup != nil && setup.Equips[equipIndex] != 0 { setup.Equips[equipIndex] = 0 player.SaveModel(setup) @@ -364,7 +300,7 @@ func (this *PlayerHandler) HeroEquip(player *logic.Player, msg *net.Message) { } } - equip.HeroId = hero.Id + equip.HeroUid = hero.Uid player.SaveModel(equip) equipChangeList = append(equipChangeList, &pb.EquipChange{ ChangeType: pb.ChangeType_Changed, @@ -387,3 +323,61 @@ func (this *PlayerHandler) HeroArtifacts(player *logic.Player, msg *net.Message) func (this *PlayerHandler) HeroTips(player *logic.Player, msg *net.Message) { } + +func (this *PlayerHandler) HeroBookActivate(player *logic.Player, msg *net.Message) { + var req = new(pb.HeroBookActivateReq) + var err = msg.Read(req) + if err != nil { + this.logger.Error("Read message failed, ", err) + _ = player.TipNotice(proto.ErrMessageError) + return + } + + if req.HeroId == 0 { + _ = player.TipNotice(proto.ErrParameterError) + return + } + + var heroBook = player.HeroBook[req.HeroId] + if heroBook == nil { + _ = player.TipNotice(proto.ErrHeroNotFound) + return + } + + if req.Index >= uint32(len(heroBook.Items)) { + _ = player.TipNotice(proto.ErrParameterError) + return + } + + var heroBookTables = this.tables.HeroBook.Find2(int(heroBook.HeroId)) + if len(heroBookTables) != len(heroBook.Items) { + _ = player.TipNotice(proto.ErrDataTablesError) + return + } + + if heroBook.Items[req.Index].Value { + _ = player.TipNotice(proto.ErrHeroBookActivated) + return + } + + for _, needId := range heroBookTables[req.Index].NeedHeroes { + if _, ok := player.HeroBook[uint32(needId)]; !ok { + _ = player.TipNotice(proto.ErrHeroBookCanNotActivate) + return + } + } + + heroBook.Items[req.Index].Value = true + + player.SaveModel(heroBook) + for _, hero := range player.Hero { + if hero.Id == heroBook.HeroId { + player.UpdateHeroAttrs(hero) + } + } + + _ = player.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroBookChange), &pb.HeroBookChangeAck{ + ChangeType: pb.ChangeType_Changed, + HeroBook: heroBook.BuildMsgHeroBook(), + }) +} diff --git a/servers/game/logic/manager_player.go b/servers/game/logic/manager_player.go index 44b8b99..25d7b34 100644 --- a/servers/game/logic/manager_player.go +++ b/servers/game/logic/manager_player.go @@ -119,8 +119,8 @@ func (this *PlayerManager) SetTables(tables *data.Tables) { func (this *PlayerManager) PutPlayer(player *Player) { this.locker.Lock() + defer this.locker.Unlock() this.players[player.UserId] = player - this.locker.Unlock() } func (this *PlayerManager) GetPlayer(userId uint64) *Player { @@ -164,8 +164,8 @@ func (this *PlayerManager) storeChanges(player *Player) { } if this.logger.IsDebugEnabled() { - this.logger.Debug("Save: ", util.ToJsonString(player.save)) - this.logger.Debug("Wipe: ", util.ToJsonString(player.wipe)) + this.logger.Debugf("[%s:%d] Save: %s", player.Temp.Address, player.RoleId, util.ToJsonString(player.save)) + this.logger.Debugf("[%s:%d] Wipe: %s", player.Temp.Address, player.RoleId, util.ToJsonString(player.wipe)) } _, err := this.mongoClient.Collection(TablePlayer).UpdateByID(this.mongoClient.Context(), player.RoleId, m) @@ -205,7 +205,12 @@ func (this *PlayerManager) run(player *Player) { player.unlock() // unlock if e-b >= 1000 { - this.logger.Warnf("The executing time of the player loop function is too long, Time: %dms, userId: %d, roleId: %d", e-b, player.UserId, player.RoleId) + this.logger.Warnf("[%s:%d] The executing time of the player loop function is too long, Time: %dms, userId: %d, roleId: %d", + player.Temp.Address, + player.RoleId, + e-b, + player.UserId, + player.RoleId) } } }(player) @@ -230,10 +235,11 @@ func (this *PlayerManager) NewPlayer() *Player { //CopyPassed: map[uint32]*PlayerCopyPassed{}, //CopySpeed: map[uint32]*PlayerCopySpeed{}, //CopyStatus: map[uint64]*PlayerCopyStatus{}, - Counter: map[uint32]map[uint64]*PlayerCounter{}, - Hero: map[uint32]*PlayerHero{}, - Item: map[uint32]*PlayerItem{}, - Equip: map[uint64]*PlayerEquip{}, + Counter: map[uint32]map[uint64]*PlayerCounter{}, + Hero: map[uint64]*PlayerHero{}, + HeroBook: map[uint32]*PlayerHeroBook{}, + Item: map[uint32]*PlayerItem{}, + Equip: map[uint64]*PlayerEquip{}, //GiftPack: map[uint32]*PlayerGiftPack{}, //Mail: map[uint64]*PlayerMail{}, Money: map[uint32]*PlayerMoney{}, @@ -404,7 +410,7 @@ func (this *PlayerManager) ExistsRoleName(name string) (bool, error) { //} func (this *PlayerManager) Enter(player *Player, conn *net.Conn) { - this.logger.Infof("The player enter game_1, userId: %d, roleId: %d", player.UserId, player.RoleId) + this.logger.Infof("[%s] The player enter game_1, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) this.PutPlayer(player) @@ -420,7 +426,7 @@ func (this *PlayerManager) Enter(player *Player, conn *net.Conn) { } func (this *PlayerManager) Reenter(player *Player, conn *net.Conn) { - this.logger.Infof("The player reenter game, userId: %d, roleId: %d", player.UserId, player.RoleId) + this.logger.Infof("[%s] The player reenter game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) player.lock() player.reenter(conn) @@ -430,7 +436,7 @@ func (this *PlayerManager) Reenter(player *Player, conn *net.Conn) { } func (this *PlayerManager) Exit(player *Player) { - this.logger.Infof("The player exit game, userId: %d, roleId: %d", player.UserId, player.RoleId) + this.logger.Infof("[%s] The player exit game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) this.RemovePlayer(player.UserId) @@ -442,7 +448,7 @@ func (this *PlayerManager) Exit(player *Player) { } func (this *PlayerManager) Lost(player *Player) { - this.logger.Infof("The player lost, userId: %d, roleId: %d", player.UserId, player.RoleId) + this.logger.Infof("[%s] The player lost, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) player.lock() player.lost(func() { @@ -454,7 +460,7 @@ func (this *PlayerManager) Lost(player *Player) { } func (this *PlayerManager) Kick(player *Player, message string) { - this.logger.Infof("The player kicked, userId: %d, roleId: %d", player.UserId, player.RoleId) + this.logger.Infof("[%s] The player kicked, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId) this.RemovePlayer(player.UserId) @@ -514,7 +520,7 @@ func (this *PlayerManager) Handler(modId, msgId uint16, handler MessageHandler) func (this *PlayerManager) Handle(player *Player, msg *net.Message) { handler, ok := this.messageHandlers[util.Compose2uint16(msg.ModId, msg.MsgId)] if !ok { - this.logger.Warnf("Could not find the message handler, modId: %d, msgId: %d ", msg.ModId, msg.MsgId) + this.logger.Warnf("[%s] Could not find the message handler, modId: %d, msgId: %d ", player.Temp.Address, msg.ModId, msg.MsgId) return } diff --git a/servers/game/logic/player_equip.go b/servers/game/logic/player_equip.go index c242c38..dc77e16 100644 --- a/servers/game/logic/player_equip.go +++ b/servers/game/logic/player_equip.go @@ -8,13 +8,13 @@ import ( ) type PlayerEquip struct { - Uid uint64 `bson:"uid" key:"1"` - Id uint32 `bson:"id"` - Exp uint64 `bson:"exp"` - Level uint32 `bson:"level"` - Refine uint32 `bson:"refine"` - Holes []uint32 `bson:"holes"` - HeroId uint32 `bson:"hero_id"` + Uid uint64 `bson:"uid" key:"1"` + Id uint32 `bson:"id"` + Exp uint64 `bson:"exp"` + Level uint32 `bson:"level"` + Refine uint32 `bson:"refine"` + Holes []uint32 `bson:"holes"` + HeroUid uint64 `bson:"hero_id"` } func (this *PlayerEquip) BuildMsgEquip() *pb.Equip { @@ -25,7 +25,7 @@ func (this *PlayerEquip) BuildMsgEquip() *pb.Equip { Level: this.Level, Refine: this.Refine, Holes: this.Holes, - HeroId: this.HeroId, + HeroUid: this.HeroUid, } } @@ -39,13 +39,13 @@ func (this *Player) addEquip(equipTable *data.Equip, logType LogType) error { this.manager.mongoClient.Counter("equip_id", 1) var equip = &PlayerEquip{ - Uid: util.RandomUid(), - Id: uint32(equipTable.Id), - Exp: 0, - Level: uint32(equipLevelTable.Level), - Refine: 0, - Holes: make([]uint32, equipTable.Holes), - HeroId: 0, + Uid: util.RandomUid(), + Id: uint32(equipTable.Id), + Exp: 0, + Level: uint32(equipLevelTable.Level), + Refine: 0, + Holes: make([]uint32, equipTable.Holes), + HeroUid: 0, } this.Equip[equip.Uid] = equip diff --git a/servers/game/logic/player_hero.go b/servers/game/logic/player_hero.go index bfc6be6..148d763 100644 --- a/servers/game/logic/player_hero.go +++ b/servers/game/logic/player_hero.go @@ -4,20 +4,21 @@ import ( "ecs/proto" "ecs/proto/pb" "ecs/servers/game/data" + "github.com/oylshe1314/framework/util" "slices" ) type Attrs [pb.AttrType_Nums]uint64 type PlayerHero struct { - Id uint32 `bson:"id" key:"1"` + Uid uint64 `json:"uid" key:"1"` + Id uint32 `bson:"id"` Exp uint64 `bson:"exp"` Level uint32 `bson:"level"` BreakLevel uint32 `bson:"break_level"` SoulLevel uint32 `bson:"soul_level"` SoulList []uint32 `bson:"soul_list"` Awaken uint32 `bson:"awaken"` - General []uint32 `bson:"general"` Equips [4]uint64 `bson:"equips"` Treasures [2]uint64 `bson:"treasures"` Mounts [1]uint64 `bson:"mounts"` @@ -28,14 +29,14 @@ type PlayerHero struct { func (this *PlayerHero) BuildMsgHero() *pb.Hero { return &pb.Hero{ - HeroId: this.Id, + Uid: this.Uid, + Id: this.Id, Exp: this.Exp, Level: this.Level, BreakLevel: this.BreakLevel, SoulLevel: this.SoulLevel, SoulList: this.SoulList, Awaken: this.Awaken, - General: this.General, Equips: this.Equips[:], Treasures: this.Treasures[:], Mounts: this.Mounts[:], @@ -49,7 +50,10 @@ func (this *PlayerHero) Attrs() Attrs { } func (this *Player) addHero(heroTable *data.Hero) error { - var hero = &PlayerHero{Id: uint32(heroTable.Id)} + var hero = &PlayerHero{ + Uid: util.RandomUid(), + Id: uint32(heroTable.Id), + } var heroLevelTable *data.HeroLevel if heroTable.Level > 0 { @@ -75,20 +79,14 @@ func (this *Player) addHero(heroTable *data.Hero) error { //Awaken - var heroGeneralBookTables = this.manager.tables.HeroGeneral.Find2(heroTable.Id) - hero.General = make([]uint32, len(heroGeneralBookTables)) - - this.Hero[hero.Id] = hero + this.Hero[hero.Uid] = hero this.SaveModel(hero) + + this.addHeroBook(hero.Id) return nil } func (this *Player) AddHero(heroId uint32) error { - var hero = this.Hero[heroId] - if hero != nil { - return nil - } - var heroTable = this.manager.tables.Hero.Find(int(heroId)) if heroTable == nil { this.manager.logger.Error("find hero table failed, heroId: ", heroId) @@ -132,23 +130,6 @@ func (this *Player) calcHeroBreakAttrs(hero *PlayerHero) (attrs Attrs) { return } -func (this *Player) calcHeroGeneralAttrs(hero *PlayerHero) (attrs Attrs) { - for i := range hero.General { - if hero.General[i] == 0 { - continue - } - var heroGeneralTable = this.manager.tables.HeroGeneral.Find1(int(hero.General[i])) - if heroGeneralTable == nil { - continue - } - - attrs[heroGeneralTable.AttrType1] += uint64(heroGeneralTable.AttrValue1) - attrs[heroGeneralTable.AttrType2] += uint64(heroGeneralTable.AttrValue2) - attrs[heroGeneralTable.AttrType3] += uint64(heroGeneralTable.AttrValue3) - } - return -} - func (this *Player) calcHeroBondAttrs(hero *PlayerHero) (attrs Attrs) { var heroBondTables = this.manager.tables.HeroBond.Find(int(hero.Id)) for i := range heroBondTables { @@ -184,6 +165,8 @@ func (this *Player) calcHeroBondAttrs(hero *PlayerHero) (attrs Attrs) { break } } + case 4: //英雄 + } if yes { attrs[heroBondTables[i].AttrType1] += uint64(heroBondTables[i].AttrValue1) @@ -225,6 +208,29 @@ func (this *Player) calcHeroArtifactAttrs(hero *PlayerHero) (attrs Attrs) { return } +func (this *Player) calcHeroBookAttrs(hero *PlayerHero) (attrs Attrs) { + var heroBook = this.HeroBook[hero.Id] + if heroBook == nil { + return + } + + for _, item := range heroBook.Items { + if !item.Value { + continue + } + + var heroGeneralTable = this.manager.tables.HeroBook.Find1(int(item.Key)) + if heroGeneralTable == nil { + continue + } + + attrs[heroGeneralTable.AttrType1] += uint64(heroGeneralTable.AttrValue1) + attrs[heroGeneralTable.AttrType2] += uint64(heroGeneralTable.AttrValue2) + attrs[heroGeneralTable.AttrType3] += uint64(heroGeneralTable.AttrValue3) + } + return +} + func (this *Player) calcHeroAttrs(hero *PlayerHero, attrsList ...Attrs) bool { var newAttrs Attrs for _, attrs := range attrsList { @@ -247,11 +253,13 @@ func (this *Player) updateHeroAttrs(hero *PlayerHero) bool { return this.calcHeroAttrs(hero, this.calcHeroLevelAttrs(hero), this.calcHeroBreakAttrs(hero), + this.calcHeroBondAttrs(hero), this.calcHeroAwakenAttrs(hero), this.calcHeroEquipsAttrs(hero), this.calcHeroTreasuresAttrs(hero), this.calcHeroMountsAttrs(hero), this.calcHeroArtifactAttrs(hero), + this.calcHeroBookAttrs(hero), ) } diff --git a/servers/game/logic/player_hero_book.go b/servers/game/logic/player_hero_book.go new file mode 100644 index 0000000..78aee36 --- /dev/null +++ b/servers/game/logic/player_hero_book.go @@ -0,0 +1,52 @@ +package logic + +import ( + "ecs/proto/pb" + "github.com/oylshe1314/framework/util" +) + +type PlayerHeroBook struct { + HeroId uint32 `json:"hero_id" key:"1"` + Items []*util.Pair[uint32, bool] `bson:"items"` +} + +func (this *PlayerHeroBook) BuildMsgHeroBook() *pb.HeroBook { + var list []*pb.HeroBookItem + for _, item := range this.Items { + list = append(list, &pb.HeroBookItem{BookId: item.Key, Active: item.Value}) + } + return &pb.HeroBook{HeroId: this.HeroId, ItemList: list} +} + +func (this *Player) addHeroBook(heroId uint32) { + if _, ok := this.HeroBook[heroId]; ok { + return + } + + var items []*util.Pair[uint32, bool] + var heroBookTables = this.manager.tables.HeroBook.Find2(int(heroId)) + for _, heroBookTable := range heroBookTables { + items = append(items, util.NewPair(uint32(heroBookTable.Id), false)) + } + + var heroBook = &PlayerHeroBook{ + HeroId: heroId, + Items: items, + } + + this.HeroBook[heroBook.HeroId] = heroBook + this.SaveModel(heroBook) + + _ = this.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroBookChange), &pb.HeroBookChangeAck{ + ChangeType: pb.ChangeType_Changed, + HeroBook: heroBook.BuildMsgHeroBook(), + }) +} + +func (this *Player) BuildMsgHeroBookListAck() *pb.HeroBookListAck { + var list []*pb.HeroBook + for _, heroBook := range this.HeroBook { + list = append(list, heroBook.BuildMsgHeroBook()) + } + return &pb.HeroBookListAck{BookList: list} +}