diff --git a/gdconf/game_data_config.go b/gdconf/game_data_config.go index f3a85eff..25787a42 100644 --- a/gdconf/game_data_config.go +++ b/gdconf/game_data_config.go @@ -48,6 +48,7 @@ type GameDataConfig struct { RewardDataMap map[int32]*RewardData // 奖励 AvatarCostumeDataMap map[int32]*AvatarCostumeData // 角色时装 AvatarFlycloakDataMap map[int32]*AvatarFlycloakData // 角色风之翼 + ReliquaryMainDataMap map[int32]map[int32]*ReliquaryMainData // 圣遗物主属性 } func InitGameDataConfig() { @@ -71,7 +72,7 @@ func ReplaceGameDataConfig() { } func (g *GameDataConfig) loadAll() { - pathPrefix := config.GetConfig().Hk4e.GameDataConfigPath + pathPrefix := config.CONF.Hk4e.GameDataConfigPath dirInfo, err := os.Stat(pathPrefix) if err != nil || !dirInfo.IsDir() { @@ -131,6 +132,7 @@ func (g *GameDataConfig) load() { g.loadRewardData() // 奖励 g.loadAvatarCostumeData() // 角色时装 g.loadAvatarFlycloakData() // 角色风之翼 + g.loadReliquaryMainData() // 圣遗物主属性 } func (g *GameDataConfig) readCsvFileData(fileName string) []byte { diff --git a/gdconf/item_data.go b/gdconf/item_data.go index 1d60d7b9..6cd8d26c 100644 --- a/gdconf/item_data.go +++ b/gdconf/item_data.go @@ -35,7 +35,9 @@ type ItemData struct { SkillAffix []int32 AwakenCoinCostList []uint32 // 圣遗物 - ReliquaryType int32 `csv:"ReliquaryType,omitempty"` // 圣遗物类别 + ReliquaryType int32 `csv:"ReliquaryType,omitempty"` // 圣遗物类别 + MainPropDepotId int32 `csv:"MainPropDepotId,omitempty"` // 主属性库ID + AppendPropDepotId int32 `csv:"AppendPropDepotId,omitempty"` // 追加属性库ID } func (g *GameDataConfig) loadItemData() { diff --git a/gdconf/reliquary_main_data.go b/gdconf/reliquary_main_data.go new file mode 100644 index 00000000..3a3b0539 --- /dev/null +++ b/gdconf/reliquary_main_data.go @@ -0,0 +1,69 @@ +package gdconf + +import ( + "fmt" + + "hk4e/pkg/logger" + + "github.com/jszwec/csvutil" + "github.com/mroth/weightedrand" +) + +// ReliquaryMainData 圣遗物主属性配置表 +type ReliquaryMainData struct { + MainPropId int32 `csv:"MainPropId"` // 主属性ID + MainPropDepotId int32 `csv:"MainPropDepotId,omitempty"` // 主属性库ID + PropType int32 `csv:"PropType,omitempty"` // 属性类别 + Weight int32 `csv:"Weight,omitempty"` // 随机权重 +} + +func (g *GameDataConfig) loadReliquaryMainData() { + g.ReliquaryMainDataMap = make(map[int32]map[int32]*ReliquaryMainData) + data := g.readCsvFileData("ReliquaryMainData.csv") + var reliquaryMainDataList []*ReliquaryMainData + err := csvutil.Unmarshal(data, &reliquaryMainDataList) + if err != nil { + info := fmt.Sprintf("parse file error: %v", err) + panic(info) + } + for _, reliquaryMainData := range reliquaryMainDataList { + // 通过主属性库ID找到 + _, ok := g.ReliquaryMainDataMap[reliquaryMainData.MainPropDepotId] + if !ok { + g.ReliquaryMainDataMap[reliquaryMainData.MainPropDepotId] = make(map[int32]*ReliquaryMainData) + } + // list -> map + g.ReliquaryMainDataMap[reliquaryMainData.MainPropDepotId][reliquaryMainData.MainPropId] = reliquaryMainData + } + logger.Info("ReliquaryMainData count: %v", len(g.ReliquaryMainDataMap)) +} + +func GetReliquaryMainDataByDepotIdAndPropId(mainPropDepotId int32, mainPropId int32) *ReliquaryMainData { + value, exist := CONF.ReliquaryMainDataMap[mainPropDepotId] + if !exist { + return nil + } + return value[mainPropId] +} + +func GetReliquaryMainDataRandomByDepotId(mainPropDepotId int32) *ReliquaryMainData { + mainPropMap, exist := CONF.ReliquaryMainDataMap[mainPropDepotId] + if !exist { + return nil + } + choices := make([]weightedrand.Choice, 0, len(mainPropMap)) + for _, data := range mainPropMap { + choices = append(choices, weightedrand.NewChoice(data, uint(data.Weight))) + } + chooser, err := weightedrand.NewChooser(choices...) + if err != nil { + logger.Error("reliquary main error: %v", err) + return nil + } + result := chooser.Pick() + return result.(*ReliquaryMainData) +} + +func GetReliquaryMainDataMap() map[int32]map[int32]*ReliquaryMainData { + return CONF.ReliquaryMainDataMap +} diff --git a/gdconf/table_struct_mapping.json b/gdconf/table_struct_mapping.json index ef3c5c06..d874e25f 100644 --- a/gdconf/table_struct_mapping.json +++ b/gdconf/table_struct_mapping.json @@ -591,6 +591,16 @@ "field_name": "ReliquaryType", "field_type": "int32", "origin_name": "圣遗物类别" + }, + { + "field_name": "MainPropDepotId", + "field_type": "int32", + "origin_name": "主属性库ID" + }, + { + "field_name": "AppendPropDepotId", + "field_type": "int32", + "origin_name": "追加属性库ID" } ] }, @@ -953,5 +963,30 @@ "origin_name": "道具ID" } ] + }, + { + "table_name": "ReliquaryMainData", + "field_list": [ + { + "field_name": "MainPropId", + "field_type": "int32", + "origin_name": "主属性ID" + }, + { + "field_name": "MainPropDepotId", + "field_type": "int32", + "origin_name": "主属性库ID" + }, + { + "field_name": "PropType", + "field_type": "int32", + "origin_name": "属性类别" + }, + { + "field_name": "Weight", + "field_type": "int32", + "origin_name": "随机权重" + } + ] } ] diff --git a/go.mod b/go.mod index 0ed6b171..ead95797 100644 --- a/go.mod +++ b/go.mod @@ -54,6 +54,7 @@ require github.com/pierrec/lz4/v4 v4.1.17 require github.com/FlourishingWorld/dpdk-go v0.0.0-20230213165129-6c5bc55b1f63 require ( + github.com/mroth/weightedrand v1.0.0 github.com/pkg/errors v0.9.1 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec diff --git a/go.sum b/go.sum index ea0d6579..0753d742 100644 --- a/go.sum +++ b/go.sum @@ -71,6 +71,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mroth/weightedrand v1.0.0 h1:V8JeHChvl2MP1sAoXq4brElOcza+jxLkRuwvtQu8L3E= +github.com/mroth/weightedrand v1.0.0/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE= github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= github.com/nats-io/nats-server/v2 v2.9.7 h1:VBlfq7xvv/72v0mzGZ2rgsDzUoVyX2Xhssl9XpKDue0= github.com/nats-io/nats-server/v2 v2.9.7/go.mod h1:AB6hAnGZDlYfqb7CTAm66ZKMZy9DpfierY1/PbpvI2g= diff --git a/gs/game/player_equip.go b/gs/game/player_equip.go index b63ec735..ecc862fd 100644 --- a/gs/game/player_equip.go +++ b/gs/game/player_equip.go @@ -124,8 +124,7 @@ func (g *GameManager) WearEquipReq(player *model.Player, payloadMsg pb.Message) g.WearUserAvatarWeapon(player.PlayerID, avatar.AvatarId, weapon.WeaponId) case *model.Reliquary: reliquary := equipGameObj.(*model.Reliquary) - logger.Error("itemId: %v", reliquary.ItemId) - // g.WearUserAvatarReliquary(player.PlayerID, avatar.AvatarId, reliquary.ReliquaryId) + g.WearUserAvatarReliquary(player.PlayerID, avatar.AvatarId, reliquary.ReliquaryId) default: logger.Error("equip type error, equipGuid: %v", req.EquipGuid) g.SendError(cmd.WearEquipRsp, player, &proto.WearEquipRsp{}) diff --git a/gs/game/player_reliquary.go b/gs/game/player_reliquary.go index 1c071e69..8afde9c1 100644 --- a/gs/game/player_reliquary.go +++ b/gs/game/player_reliquary.go @@ -18,8 +18,8 @@ func (g *GameManager) GetAllReliquaryDataConfig() map[int32]*gdconf.ItemData { if (itemId >= 20002 && itemId <= 20004) || itemId == 23334 || (itemId >= 23300 && itemId <= 23340) { - // 跳过无效圣遗物 continue + // 跳过无效圣遗物 } allReliquaryDataConfig[itemId] = itemData } @@ -37,9 +37,14 @@ func (g *GameManager) AddUserReliquary(userId uint32, itemId uint32) uint64 { logger.Error("reliquary config error, itemId: %v", itemId) return 0 } + reliquaryMainConfig := gdconf.GetReliquaryMainDataRandomByDepotId(reliquaryConfig.MainPropDepotId) + if reliquaryMainConfig == nil { + logger.Error("reliquary main config error, mainPropDepotId: %v", reliquaryConfig.MainPropDepotId) + return 0 + } reliquaryId := uint64(g.snowflake.GenId()) - // player.AddReliquary(24825, uint64(g.snowflake.GenId()), 15007) - player.AddReliquary(itemId, reliquaryId, 15007) // TODO 随机主属性库 + // 根据圣遗物类型给予主属性Id + player.AddReliquary(itemId, reliquaryId, uint32(reliquaryMainConfig.MainPropId)) reliquary := player.GetReliquary(reliquaryId) if reliquary == nil { logger.Error("reliquary is nil, itemId: %v, reliquaryId: %v", itemId, reliquaryId)