mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-04 16:02:26 +08:00
角色突破奖励获取功能
This commit is contained in:
@@ -2,10 +2,11 @@ package gdconf
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
|
|
||||||
"hk4e/pkg/endec"
|
"hk4e/pkg/endec"
|
||||||
"hk4e/pkg/logger"
|
"hk4e/pkg/logger"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/hjson/hjson-go/v4"
|
"github.com/hjson/hjson-go/v4"
|
||||||
"github.com/jszwec/csvutil"
|
"github.com/jszwec/csvutil"
|
||||||
@@ -14,20 +15,23 @@ import (
|
|||||||
// 角色配置表
|
// 角色配置表
|
||||||
|
|
||||||
type AvatarData struct {
|
type AvatarData struct {
|
||||||
AvatarId int32 `csv:"AvatarId"` // ID
|
AvatarId int32 `csv:"AvatarId"` // ID
|
||||||
HpBase float64 `csv:"HpBase,omitempty"` // 基础生命值
|
HpBase float64 `csv:"HpBase,omitempty"` // 基础生命值
|
||||||
AttackBase float64 `csv:"AttackBase,omitempty"` // 基础攻击力
|
AttackBase float64 `csv:"AttackBase,omitempty"` // 基础攻击力
|
||||||
DefenseBase float64 `csv:"DefenseBase,omitempty"` // 基础防御力
|
DefenseBase float64 `csv:"DefenseBase,omitempty"` // 基础防御力
|
||||||
Critical float64 `csv:"Critical,omitempty"` // 暴击率
|
Critical float64 `csv:"Critical,omitempty"` // 暴击率
|
||||||
CriticalHurt float64 `csv:"CriticalHurt,omitempty"` // 暴击伤害
|
CriticalHurt float64 `csv:"CriticalHurt,omitempty"` // 暴击伤害
|
||||||
QualityType int32 `csv:"QualityType,omitempty"` // 角色品质
|
QualityType int32 `csv:"QualityType,omitempty"` // 角色品质
|
||||||
ConfigJson string `csv:"ConfigJson,omitempty"` // 战斗config
|
ConfigJson string `csv:"ConfigJson,omitempty"` // 战斗config
|
||||||
InitialWeapon int32 `csv:"InitialWeapon,omitempty"` // 初始武器
|
InitialWeapon int32 `csv:"InitialWeapon,omitempty"` // 初始武器
|
||||||
WeaponType int32 `csv:"WeaponType,omitempty"` // 武器种类
|
WeaponType int32 `csv:"WeaponType,omitempty"` // 武器种类
|
||||||
SkillDepotId int32 `csv:"SkillDepotId,omitempty"` // 技能库ID
|
SkillDepotId int32 `csv:"SkillDepotId,omitempty"` // 技能库ID
|
||||||
PromoteId int32 `csv:"PromoteId,omitempty"` // 角色突破ID
|
PromoteId int32 `csv:"PromoteId,omitempty"` // 角色突破ID
|
||||||
|
PromoteRewardLevelStr string `csv:"PromoteRewardLevelStr,omitempty"` // 角色突破奖励获取等阶
|
||||||
|
PromoteRewardStr string `csv:"PromoteRewardStr,omitempty"` // 角色突破奖励
|
||||||
|
|
||||||
AbilityHashCodeList []int32
|
AbilityHashCodeList []int32
|
||||||
|
PromoteRewardMap map[uint32]uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigAvatar struct {
|
type ConfigAvatar struct {
|
||||||
@@ -68,6 +72,25 @@ func (g *GameDataConfig) loadAvatarData() {
|
|||||||
abilityHashCode := endec.Hk4eAbilityHashCode(configAvatarAbility.AbilityName)
|
abilityHashCode := endec.Hk4eAbilityHashCode(configAvatarAbility.AbilityName)
|
||||||
avatarData.AbilityHashCodeList = append(avatarData.AbilityHashCodeList, abilityHashCode)
|
avatarData.AbilityHashCodeList = append(avatarData.AbilityHashCodeList, abilityHashCode)
|
||||||
}
|
}
|
||||||
|
// 突破奖励转换列表
|
||||||
|
if avatarData.PromoteRewardLevelStr != "" && avatarData.PromoteRewardStr != "" {
|
||||||
|
tempRewardLevelList := strings.Split(strings.ReplaceAll(avatarData.PromoteRewardLevelStr, " ", ""), "#")
|
||||||
|
tempRewardList := strings.Split(strings.ReplaceAll(avatarData.PromoteRewardStr, " ", ""), "#")
|
||||||
|
avatarData.PromoteRewardMap = make(map[uint32]uint32, len(tempRewardList))
|
||||||
|
for i, s := range tempRewardList {
|
||||||
|
promoteLevel, err := strconv.Atoi(tempRewardLevelList[i])
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("level to i err, %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
rewardId, err := strconv.Atoi(s)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("reward id to i err, %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
avatarData.PromoteRewardMap[uint32(promoteLevel)] = uint32(rewardId)
|
||||||
|
}
|
||||||
|
}
|
||||||
// list -> map
|
// list -> map
|
||||||
g.AvatarDataMap[avatarData.AvatarId] = avatarData
|
g.AvatarDataMap[avatarData.AvatarId] = avatarData
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ type GameDataConfig struct {
|
|||||||
PlayerLevelDataMap map[int32]*PlayerLevelData // 玩家等级
|
PlayerLevelDataMap map[int32]*PlayerLevelData // 玩家等级
|
||||||
WeaponLevelDataMap map[int32]*WeaponLevelData // 武器等级
|
WeaponLevelDataMap map[int32]*WeaponLevelData // 武器等级
|
||||||
WeaponPromoteDataMap map[int32]map[int32]*WeaponPromoteData // 角色突破
|
WeaponPromoteDataMap map[int32]map[int32]*WeaponPromoteData // 角色突破
|
||||||
|
RewardDataMap map[int32]*RewardData // 奖励
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitGameDataConfig() {
|
func InitGameDataConfig() {
|
||||||
@@ -123,6 +124,7 @@ func (g *GameDataConfig) load() {
|
|||||||
g.loadPlayerLevelData() // 玩家等级
|
g.loadPlayerLevelData() // 玩家等级
|
||||||
g.loadWeaponLevelData() // 武器等级
|
g.loadWeaponLevelData() // 武器等级
|
||||||
g.loadWeaponPromoteData() // 武器突破
|
g.loadWeaponPromoteData() // 武器突破
|
||||||
|
g.loadRewardData() // 奖励
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
|
func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
|
||||||
|
|||||||
68
gdconf/reward_data.go
Normal file
68
gdconf/reward_data.go
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
package gdconf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"hk4e/pkg/logger"
|
||||||
|
|
||||||
|
"github.com/jszwec/csvutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 奖励配置表
|
||||||
|
|
||||||
|
type RewardData struct {
|
||||||
|
RewardID int32 `csv:"RewardID"` // 奖励ID
|
||||||
|
RewardItem1ID int32 `csv:"RewardItem1ID,omitempty"` // Reward道具1ID
|
||||||
|
RewardItem1Count int32 `csv:"RewardItem1Count,omitempty"` // Reward道具1数量
|
||||||
|
RewardItem2ID int32 `csv:"RewardItem2ID,omitempty"` // Reward道具2ID
|
||||||
|
RewardItem2Count int32 `csv:"RewardItem2Count,omitempty"` // Reward道具2数量
|
||||||
|
RewardItem3ID int32 `csv:"RewardItem3ID,omitempty"` // Reward道具3ID
|
||||||
|
RewardItem3Count int32 `csv:"RewardItem3Count,omitempty"` // Reward道具3数量
|
||||||
|
RewardItem4ID int32 `csv:"RewardItem4ID,omitempty"` // Reward道具4ID
|
||||||
|
RewardItem4Count int32 `csv:"RewardItem4Count,omitempty"` // Reward道具4数量
|
||||||
|
RewardItem5ID int32 `csv:"RewardItem5ID,omitempty"` // Reward道具5ID
|
||||||
|
RewardItem5Count int32 `csv:"RewardItem5Count,omitempty"` // Reward道具5数量
|
||||||
|
RewardItem6ID int32 `csv:"RewardItem6ID,omitempty"` // Reward道具6ID
|
||||||
|
RewardItem6Count int32 `csv:"RewardItem6Count,omitempty"` // Reward道具6数量
|
||||||
|
RewardItem7ID int32 `csv:"RewardItem7ID,omitempty"` // Reward道具7ID
|
||||||
|
RewardItem7Count int32 `csv:"RewardItem7Count,omitempty"` // Reward道具7数量
|
||||||
|
RewardItem8ID int32 `csv:"RewardItem8ID,omitempty"` // Reward道具8ID
|
||||||
|
RewardItem8Count int32 `csv:"RewardItem8Count,omitempty"` // Reward道具8数量
|
||||||
|
RewardItem9ID int32 `csv:"RewardItem9ID,omitempty"` // Reward道具9ID
|
||||||
|
RewardItem9Count int32 `csv:"RewardItem9Count,omitempty"` // Reward道具9数量
|
||||||
|
|
||||||
|
RewardItemMap map[uint32]uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GameDataConfig) loadRewardData() {
|
||||||
|
g.RewardDataMap = make(map[int32]*RewardData)
|
||||||
|
data := g.readCsvFileData("RewardData.csv")
|
||||||
|
var rewardDataList []*RewardData
|
||||||
|
err := csvutil.Unmarshal(data, &rewardDataList)
|
||||||
|
if err != nil {
|
||||||
|
info := fmt.Sprintf("parse file error: %v", err)
|
||||||
|
panic(info)
|
||||||
|
}
|
||||||
|
for _, rewardData := range rewardDataList {
|
||||||
|
// list -> map
|
||||||
|
// 奖励物品整合
|
||||||
|
rewardData.RewardItemMap = map[uint32]uint32{
|
||||||
|
uint32(rewardData.RewardItem1ID): uint32(rewardData.RewardItem1Count),
|
||||||
|
uint32(rewardData.RewardItem2ID): uint32(rewardData.RewardItem2Count),
|
||||||
|
uint32(rewardData.RewardItem3ID): uint32(rewardData.RewardItem3Count),
|
||||||
|
uint32(rewardData.RewardItem4ID): uint32(rewardData.RewardItem4Count),
|
||||||
|
uint32(rewardData.RewardItem5ID): uint32(rewardData.RewardItem5Count),
|
||||||
|
uint32(rewardData.RewardItem6ID): uint32(rewardData.RewardItem6Count),
|
||||||
|
uint32(rewardData.RewardItem7ID): uint32(rewardData.RewardItem7Count),
|
||||||
|
uint32(rewardData.RewardItem8ID): uint32(rewardData.RewardItem8Count),
|
||||||
|
uint32(rewardData.RewardItem9ID): uint32(rewardData.RewardItem9Count),
|
||||||
|
}
|
||||||
|
for itemId, count := range rewardData.RewardItemMap {
|
||||||
|
// 两个值都不能为0
|
||||||
|
if itemId == 0 || count == 0 {
|
||||||
|
delete(rewardData.RewardItemMap, itemId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g.RewardDataMap[rewardData.RewardID] = rewardData
|
||||||
|
}
|
||||||
|
logger.Info("RewardData count: %v", len(g.RewardDataMap))
|
||||||
|
}
|
||||||
@@ -61,6 +61,16 @@
|
|||||||
"field_name": "PromoteId",
|
"field_name": "PromoteId",
|
||||||
"field_type": "int32",
|
"field_type": "int32",
|
||||||
"origin_name": "角色突破ID"
|
"origin_name": "角色突破ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "PromoteRewardLevelStr",
|
||||||
|
"field_type": "string",
|
||||||
|
"origin_name": "角色突破奖励获取等阶"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "PromoteRewardStr",
|
||||||
|
"field_type": "string",
|
||||||
|
"origin_name": "角色突破奖励"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -813,5 +823,105 @@
|
|||||||
"origin_name": "冒险等级要求"
|
"origin_name": "冒险等级要求"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"table_name": "RewardData",
|
||||||
|
"field_list": [
|
||||||
|
{
|
||||||
|
"field_name": "RewardID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "RewardID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem1ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具1ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem1Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具1数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem2ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具2ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem2Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具2数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem3ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具3ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem3Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具3数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem4ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具4ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem4Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具4数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem5ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具5ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem5Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具5数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem6ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具6ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem6Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具6数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem7ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具7ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem7Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具7数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem8ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具8ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem8Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具8数量"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem9ID",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具8ID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "RewardItem9Count",
|
||||||
|
"field_type": "int32",
|
||||||
|
"origin_name": "Reward道具8数量"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -68,6 +68,57 @@ func (g *GameManager) AddUserAvatar(userId uint32, avatarId uint32) {
|
|||||||
g.SendMsg(cmd.AvatarAddNotify, userId, player.ClientSeq, avatarAddNotify)
|
g.SendMsg(cmd.AvatarAddNotify, userId, player.ClientSeq, avatarAddNotify)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AvatarPromoteGetRewardReq 角色突破获取奖励请求
|
||||||
|
func (g *GameManager) AvatarPromoteGetRewardReq(player *model.Player, payloadMsg pb.Message) {
|
||||||
|
logger.Debug("user promote get reward, uid: %v", player.PlayerID)
|
||||||
|
req := payloadMsg.(*proto.AvatarPromoteGetRewardReq)
|
||||||
|
// 是否拥有角色
|
||||||
|
avatar, ok := player.AvatarMap[player.GetAvatarIdByGuid(req.AvatarGuid)]
|
||||||
|
if !ok {
|
||||||
|
logger.Error("avatar error, avatarGuid: %v", req.AvatarGuid)
|
||||||
|
g.CommonRetError(cmd.AvatarPromoteGetRewardRsp, player, &proto.AvatarPromoteGetRewardRsp{}, proto.Retcode_RET_CAN_NOT_FIND_AVATAR)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 获取角色配置表
|
||||||
|
avatarDataConfig, ok := gdconf.CONF.AvatarDataMap[int32(avatar.AvatarId)]
|
||||||
|
if !ok {
|
||||||
|
logger.Error("avatar config error, avatarId: %v", avatar.AvatarId)
|
||||||
|
g.CommonRetError(cmd.AvatarPromoteGetRewardRsp, player, &proto.AvatarPromoteGetRewardRsp{})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 角色是否获取过该突破等级的奖励
|
||||||
|
if avatar.PromoteRewardMap[req.PromoteLevel] {
|
||||||
|
logger.Error("avatar config error, avatarId: %v", avatar.AvatarId)
|
||||||
|
g.CommonRetError(cmd.AvatarPromoteGetRewardRsp, player, &proto.AvatarPromoteGetRewardRsp{}, proto.Retcode_RET_REWARD_HAS_TAKEN)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 获取奖励配置表
|
||||||
|
rewardConfig, ok := gdconf.CONF.RewardDataMap[int32(avatarDataConfig.PromoteRewardMap[req.PromoteLevel])]
|
||||||
|
if !ok {
|
||||||
|
logger.Error("reward config error, rewardId: %v", avatarDataConfig.PromoteRewardMap[req.PromoteLevel])
|
||||||
|
g.CommonRetError(cmd.AvatarPromoteGetRewardRsp, player, &proto.AvatarPromoteGetRewardRsp{})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 设置该奖励为已被获取状态
|
||||||
|
avatar.PromoteRewardMap[req.PromoteLevel] = true
|
||||||
|
// 给予突破奖励
|
||||||
|
rewardItemList := make([]*UserItem, 0, len(rewardConfig.RewardItemMap))
|
||||||
|
for itemId, count := range rewardConfig.RewardItemMap {
|
||||||
|
rewardItemList = append(rewardItemList, &UserItem{
|
||||||
|
ItemId: itemId,
|
||||||
|
ChangeCount: count,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
g.AddUserItem(player.PlayerID, rewardItemList, false, 0)
|
||||||
|
|
||||||
|
avatarPromoteGetRewardRsp := &proto.AvatarPromoteGetRewardRsp{
|
||||||
|
RewardId: uint32(rewardConfig.RewardID),
|
||||||
|
AvatarGuid: req.AvatarGuid,
|
||||||
|
PromoteLevel: req.PromoteLevel,
|
||||||
|
}
|
||||||
|
g.SendMsg(cmd.AvatarPromoteGetRewardRsp, player.PlayerID, player.ClientSeq, avatarPromoteGetRewardRsp)
|
||||||
|
}
|
||||||
|
|
||||||
// AvatarPromoteReq 角色突破请求
|
// AvatarPromoteReq 角色突破请求
|
||||||
func (g *GameManager) AvatarPromoteReq(player *model.Player, payloadMsg pb.Message) {
|
func (g *GameManager) AvatarPromoteReq(player *model.Player, payloadMsg pb.Message) {
|
||||||
logger.Debug("user promote, uid: %v", player.PlayerID)
|
logger.Debug("user promote, uid: %v", player.PlayerID)
|
||||||
@@ -151,7 +202,7 @@ func (g *GameManager) AvatarPromoteReq(player *model.Player, payloadMsg pb.Messa
|
|||||||
// 角色突破等级+1
|
// 角色突破等级+1
|
||||||
avatar.Promote++
|
avatar.Promote++
|
||||||
// 角色更新面板
|
// 角色更新面板
|
||||||
player.InitAvatarFightProp(avatar)
|
g.UpdateUserAvatarFightProp(player.PlayerID, avatar.AvatarId)
|
||||||
// 角色属性表更新通知
|
// 角色属性表更新通知
|
||||||
g.SendMsg(cmd.AvatarPropNotify, player.PlayerID, player.ClientSeq, g.PacketAvatarPropNotify(avatar))
|
g.SendMsg(cmd.AvatarPropNotify, player.PlayerID, player.ClientSeq, g.PacketAvatarPropNotify(avatar))
|
||||||
|
|
||||||
@@ -303,7 +354,7 @@ func (g *GameManager) UpgradePlayerAvatar(player *model.Player, avatar *model.Av
|
|||||||
avatar.Level++
|
avatar.Level++
|
||||||
}
|
}
|
||||||
// 角色更新面板
|
// 角色更新面板
|
||||||
player.InitAvatarFightProp(avatar)
|
g.UpdateUserAvatarFightProp(player.PlayerID, avatar.AvatarId)
|
||||||
// 角色属性表更新通知
|
// 角色属性表更新通知
|
||||||
g.SendMsg(cmd.AvatarPropNotify, player.PlayerID, player.ClientSeq, g.PacketAvatarPropNotify(avatar))
|
g.SendMsg(cmd.AvatarPropNotify, player.PlayerID, player.ClientSeq, g.PacketAvatarPropNotify(avatar))
|
||||||
}
|
}
|
||||||
@@ -534,6 +585,9 @@ func (g *GameManager) UpdateUserAvatarFightProp(userId uint32, avatarId uint32)
|
|||||||
logger.Error("avatar is nil, avatarId: %v", avatar)
|
logger.Error("avatar is nil, avatarId: %v", avatar)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 角色初始化面板
|
||||||
|
player.InitAvatarFightProp(avatar)
|
||||||
|
|
||||||
avatarFightPropNotify := &proto.AvatarFightPropNotify{
|
avatarFightPropNotify := &proto.AvatarFightPropNotify{
|
||||||
AvatarGuid: avatar.Guid,
|
AvatarGuid: avatar.Guid,
|
||||||
FightPropMap: avatar.FightPropMap,
|
FightPropMap: avatar.FightPropMap,
|
||||||
@@ -578,8 +632,8 @@ func (g *GameManager) PacketAvatarInfo(avatar *model.Avatar) *proto.AvatarInfo {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
LifeState: uint32(avatar.LifeState),
|
LifeState: uint32(avatar.LifeState),
|
||||||
EquipGuidList: object.ConvMapToList(avatar.EquipGuidList),
|
EquipGuidList: object.ConvMapToList(avatar.EquipGuidMap),
|
||||||
FightPropMap: nil,
|
FightPropMap: avatar.FightPropMap,
|
||||||
SkillDepotId: avatar.SkillDepotId,
|
SkillDepotId: avatar.SkillDepotId,
|
||||||
FetterInfo: &proto.AvatarFetterInfo{
|
FetterInfo: &proto.AvatarFetterInfo{
|
||||||
ExpLevel: uint32(avatar.FetterLevel),
|
ExpLevel: uint32(avatar.FetterLevel),
|
||||||
@@ -587,13 +641,13 @@ func (g *GameManager) PacketAvatarInfo(avatar *model.Avatar) *proto.AvatarInfo {
|
|||||||
FetterList: nil,
|
FetterList: nil,
|
||||||
RewardedFetterLevelList: []uint32{10},
|
RewardedFetterLevelList: []uint32{10},
|
||||||
},
|
},
|
||||||
SkillLevelMap: nil,
|
SkillLevelMap: avatar.SkillLevelMap,
|
||||||
AvatarType: 1,
|
AvatarType: 1,
|
||||||
WearingFlycloakId: avatar.FlyCloak,
|
WearingFlycloakId: avatar.FlyCloak,
|
||||||
CostumeId: avatar.Costume,
|
CostumeId: avatar.Costume,
|
||||||
BornTime: uint32(avatar.BornTime),
|
BornTime: uint32(avatar.BornTime),
|
||||||
|
PendingPromoteRewardList: make([]uint32, 0, len(avatar.PromoteRewardMap)),
|
||||||
}
|
}
|
||||||
pbAvatar.FightPropMap = avatar.FightPropMap
|
|
||||||
for _, v := range avatar.FetterList {
|
for _, v := range avatar.FetterList {
|
||||||
pbAvatar.FetterInfo.FetterList = append(pbAvatar.FetterInfo.FetterList, &proto.FetterData{
|
pbAvatar.FetterInfo.FetterList = append(pbAvatar.FetterInfo.FetterList, &proto.FetterData{
|
||||||
FetterId: v,
|
FetterId: v,
|
||||||
@@ -607,9 +661,11 @@ func (g *GameManager) PacketAvatarInfo(avatar *model.Avatar) *proto.AvatarInfo {
|
|||||||
FetterState: uint32(constant.FetterStateConst.FINISH),
|
FetterState: uint32(constant.FetterStateConst.FINISH),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
pbAvatar.SkillLevelMap = make(map[uint32]uint32)
|
// 突破等级奖励
|
||||||
for k, v := range avatar.SkillLevelMap {
|
for promoteLevel, isTaken := range avatar.PromoteRewardMap {
|
||||||
pbAvatar.SkillLevelMap[k] = v
|
if !isTaken {
|
||||||
|
pbAvatar.PendingPromoteRewardList = append(pbAvatar.PendingPromoteRewardList, promoteLevel)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return pbAvatar
|
return pbAvatar
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ func (g *GameManager) WeaponAwakenReq(player *model.Player, payloadMsg pb.Messag
|
|||||||
if ok {
|
if ok {
|
||||||
weaponAwakenRsp.AvatarGuid = avatar.Guid
|
weaponAwakenRsp.AvatarGuid = avatar.Guid
|
||||||
// 角色更新面板
|
// 角色更新面板
|
||||||
player.InitAvatarFightProp(avatar)
|
g.UpdateUserAvatarFightProp(player.PlayerID, avatar.AvatarId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 武器精炼后的信息
|
// 武器精炼后的信息
|
||||||
@@ -336,7 +336,7 @@ func (g *GameManager) WeaponPromoteReq(player *model.Player, payloadMsg pb.Messa
|
|||||||
// 武器可能没被任何角色装备 仅在被装备时更新面板
|
// 武器可能没被任何角色装备 仅在被装备时更新面板
|
||||||
if ok {
|
if ok {
|
||||||
// 角色更新面板
|
// 角色更新面板
|
||||||
player.InitAvatarFightProp(avatar)
|
g.UpdateUserAvatarFightProp(player.PlayerID, avatar.AvatarId)
|
||||||
}
|
}
|
||||||
|
|
||||||
weaponPromoteRsp := &proto.WeaponPromoteRsp{
|
weaponPromoteRsp := &proto.WeaponPromoteRsp{
|
||||||
@@ -632,7 +632,7 @@ func (g *GameManager) WeaponUpgradeReq(player *model.Player, payloadMsg pb.Messa
|
|||||||
// 武器可能没被任何角色装备 仅在被装备时更新面板
|
// 武器可能没被任何角色装备 仅在被装备时更新面板
|
||||||
if ok {
|
if ok {
|
||||||
// 角色更新面板
|
// 角色更新面板
|
||||||
player.InitAvatarFightProp(avatar)
|
g.UpdateUserAvatarFightProp(player.PlayerID, avatar.AvatarId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将给予的材料列表
|
// 将给予的材料列表
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ func (r *RouteManager) initRoute() {
|
|||||||
r.registerRouter(cmd.WeaponUpgradeReq, GAME_MANAGER.WeaponUpgradeReq)
|
r.registerRouter(cmd.WeaponUpgradeReq, GAME_MANAGER.WeaponUpgradeReq)
|
||||||
r.registerRouter(cmd.WeaponPromoteReq, GAME_MANAGER.WeaponPromoteReq)
|
r.registerRouter(cmd.WeaponPromoteReq, GAME_MANAGER.WeaponPromoteReq)
|
||||||
r.registerRouter(cmd.WeaponAwakenReq, GAME_MANAGER.WeaponAwakenReq)
|
r.registerRouter(cmd.WeaponAwakenReq, GAME_MANAGER.WeaponAwakenReq)
|
||||||
|
r.registerRouter(cmd.AvatarPromoteGetRewardReq, GAME_MANAGER.AvatarPromoteGetRewardReq)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RouteManager) RouteHandle(netMsg *mq.NetMsg) {
|
func (r *RouteManager) RouteHandle(netMsg *mq.NetMsg) {
|
||||||
|
|||||||
@@ -26,8 +26,9 @@ type Avatar struct {
|
|||||||
BornTime int64 `bson:"bornTime"` // 获得时间
|
BornTime int64 `bson:"bornTime"` // 获得时间
|
||||||
FetterLevel uint8 `bson:"fetterLevel"` // 好感度等级
|
FetterLevel uint8 `bson:"fetterLevel"` // 好感度等级
|
||||||
FetterExp uint32 `bson:"fetterExp"` // 好感度经验
|
FetterExp uint32 `bson:"fetterExp"` // 好感度经验
|
||||||
|
PromoteRewardMap map[uint32]bool `bson:"promoteRewardMap"` // 突破奖励 map[突破等级]是否已被领取
|
||||||
Guid uint64 `bson:"-"`
|
Guid uint64 `bson:"-"`
|
||||||
EquipGuidList map[uint64]uint64 `bson:"-"`
|
EquipGuidMap map[uint64]uint64 `bson:"-"`
|
||||||
EquipWeapon *Weapon `bson:"-"`
|
EquipWeapon *Weapon `bson:"-"`
|
||||||
EquipReliquaryList []*Reliquary `bson:"-"`
|
EquipReliquaryList []*Reliquary `bson:"-"`
|
||||||
FightPropMap map[uint32]float32 `bson:"-"`
|
FightPropMap map[uint32]float32 `bson:"-"`
|
||||||
@@ -46,7 +47,7 @@ func (p *Player) InitAvatar(avatar *Avatar) {
|
|||||||
// guid
|
// guid
|
||||||
avatar.Guid = p.GetNextGameObjectGuid()
|
avatar.Guid = p.GetNextGameObjectGuid()
|
||||||
p.GameObjectGuidMap[avatar.Guid] = GameObject(avatar)
|
p.GameObjectGuidMap[avatar.Guid] = GameObject(avatar)
|
||||||
avatar.EquipGuidList = make(map[uint64]uint64)
|
avatar.EquipGuidMap = make(map[uint64]uint64)
|
||||||
p.AvatarMap[avatar.AvatarId] = avatar
|
p.AvatarMap[avatar.AvatarId] = avatar
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -126,11 +127,12 @@ func (p *Player) AddAvatar(avatarId uint32) {
|
|||||||
FetterLevel: 1,
|
FetterLevel: 1,
|
||||||
FetterExp: 0,
|
FetterExp: 0,
|
||||||
Guid: 0,
|
Guid: 0,
|
||||||
EquipGuidList: nil,
|
EquipGuidMap: nil,
|
||||||
EquipWeapon: nil,
|
EquipWeapon: nil,
|
||||||
EquipReliquaryList: nil,
|
EquipReliquaryList: nil,
|
||||||
FightPropMap: nil,
|
FightPropMap: nil,
|
||||||
ExtraAbilityEmbryos: make(map[string]bool),
|
ExtraAbilityEmbryos: make(map[string]bool),
|
||||||
|
PromoteRewardMap: make(map[uint32]bool, len(avatarDataConfig.PromoteRewardMap)),
|
||||||
}
|
}
|
||||||
|
|
||||||
// 元素爆发1级
|
// 元素爆发1级
|
||||||
@@ -141,6 +143,11 @@ func (p *Player) AddAvatar(avatarId uint32) {
|
|||||||
}
|
}
|
||||||
avatar.CurrHP = avatarDataConfig.GetBaseHpByLevel(avatar.Level)
|
avatar.CurrHP = avatarDataConfig.GetBaseHpByLevel(avatar.Level)
|
||||||
|
|
||||||
|
// 角色突破奖励领取状态
|
||||||
|
for promoteLevel := range avatarDataConfig.PromoteRewardMap {
|
||||||
|
avatar.PromoteRewardMap[promoteLevel] = false
|
||||||
|
}
|
||||||
|
|
||||||
p.InitAvatar(avatar)
|
p.InitAvatar(avatar)
|
||||||
p.AvatarMap[avatarId] = avatar
|
p.AvatarMap[avatarId] = avatar
|
||||||
}
|
}
|
||||||
@@ -181,7 +188,7 @@ func (p *Player) WearWeapon(avatarId uint32, weaponId uint64) {
|
|||||||
weapon := p.WeaponMap[weaponId]
|
weapon := p.WeaponMap[weaponId]
|
||||||
avatar.EquipWeapon = weapon
|
avatar.EquipWeapon = weapon
|
||||||
weapon.AvatarId = avatarId
|
weapon.AvatarId = avatarId
|
||||||
avatar.EquipGuidList[weapon.Guid] = weapon.Guid
|
avatar.EquipGuidMap[weapon.Guid] = weapon.Guid
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Player) TakeOffWeapon(avatarId uint32, weaponId uint64) {
|
func (p *Player) TakeOffWeapon(avatarId uint32, weaponId uint64) {
|
||||||
@@ -189,5 +196,5 @@ func (p *Player) TakeOffWeapon(avatarId uint32, weaponId uint64) {
|
|||||||
weapon := p.WeaponMap[weaponId]
|
weapon := p.WeaponMap[weaponId]
|
||||||
avatar.EquipWeapon = nil
|
avatar.EquipWeapon = nil
|
||||||
weapon.AvatarId = 0
|
weapon.AvatarId = 0
|
||||||
delete(avatar.EquipGuidList, weapon.Guid)
|
delete(avatar.EquipGuidMap, weapon.Guid)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ func (p *Player) InitReliquary(reliquary *Reliquary) {
|
|||||||
p.ReliquaryMap[reliquary.ReliquaryId] = reliquary
|
p.ReliquaryMap[reliquary.ReliquaryId] = reliquary
|
||||||
if reliquary.AvatarId != 0 {
|
if reliquary.AvatarId != 0 {
|
||||||
avatar := p.AvatarMap[reliquary.AvatarId]
|
avatar := p.AvatarMap[reliquary.AvatarId]
|
||||||
avatar.EquipGuidList[reliquary.Guid] = reliquary.Guid
|
avatar.EquipGuidMap[reliquary.Guid] = reliquary.Guid
|
||||||
avatar.EquipReliquaryList = append(avatar.EquipReliquaryList, reliquary)
|
avatar.EquipReliquaryList = append(avatar.EquipReliquaryList, reliquary)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ func (p *Player) InitWeapon(weapon *Weapon) {
|
|||||||
p.WeaponMap[weapon.WeaponId] = weapon
|
p.WeaponMap[weapon.WeaponId] = weapon
|
||||||
if weapon.AvatarId != 0 {
|
if weapon.AvatarId != 0 {
|
||||||
avatar := p.AvatarMap[weapon.AvatarId]
|
avatar := p.AvatarMap[weapon.AvatarId]
|
||||||
avatar.EquipGuidList[weapon.Guid] = weapon.Guid
|
avatar.EquipGuidMap[weapon.Guid] = weapon.Guid
|
||||||
avatar.EquipWeapon = weapon
|
avatar.EquipWeapon = weapon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,6 +226,8 @@ func (c *CmdProtoMap) registerAllMessage() {
|
|||||||
c.registerMessage(AvatarPropNotify, &proto.AvatarPropNotify{}) // 角色属性表更新通知
|
c.registerMessage(AvatarPropNotify, &proto.AvatarPropNotify{}) // 角色属性表更新通知
|
||||||
c.registerMessage(AvatarPromoteReq, &proto.AvatarPromoteReq{}) // 角色突破请求
|
c.registerMessage(AvatarPromoteReq, &proto.AvatarPromoteReq{}) // 角色突破请求
|
||||||
c.registerMessage(AvatarPromoteRsp, &proto.AvatarPromoteRsp{}) // 角色突破响应
|
c.registerMessage(AvatarPromoteRsp, &proto.AvatarPromoteRsp{}) // 角色突破响应
|
||||||
|
c.registerMessage(AvatarPromoteGetRewardReq, &proto.AvatarPromoteGetRewardReq{}) // 角色突破获取奖励请求
|
||||||
|
c.registerMessage(AvatarPromoteGetRewardRsp, &proto.AvatarPromoteGetRewardRsp{}) // 角色突破获取奖励响应
|
||||||
|
|
||||||
// 背包与道具
|
// 背包与道具
|
||||||
c.registerMessage(PlayerStoreNotify, &proto.PlayerStoreNotify{}) // 玩家背包数据通知
|
c.registerMessage(PlayerStoreNotify, &proto.PlayerStoreNotify{}) // 玩家背包数据通知
|
||||||
|
|||||||
Reference in New Issue
Block a user