角色突破奖励获取功能

This commit is contained in:
UnKownOwO
2023-02-05 19:00:27 +08:00
parent 482a1f7af4
commit 98c35380b1
11 changed files with 306 additions and 37 deletions

View File

@@ -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
} }

View File

@@ -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
View 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))
}

View File

@@ -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数量"
}
]
} }
] ]

View File

@@ -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
} }

View File

@@ -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)
} }
// 将给予的材料列表 // 将给予的材料列表

View File

@@ -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) {

View File

@@ -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)
} }

View File

@@ -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)
} }
} }

View File

@@ -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
} }
} }

View File

@@ -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{}) // 玩家背包数据通知