mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-03-01 00:35:36 +08:00
圣遗物主词条加权随机
This commit is contained in:
@@ -48,6 +48,7 @@ type GameDataConfig struct {
|
|||||||
RewardDataMap map[int32]*RewardData // 奖励
|
RewardDataMap map[int32]*RewardData // 奖励
|
||||||
AvatarCostumeDataMap map[int32]*AvatarCostumeData // 角色时装
|
AvatarCostumeDataMap map[int32]*AvatarCostumeData // 角色时装
|
||||||
AvatarFlycloakDataMap map[int32]*AvatarFlycloakData // 角色风之翼
|
AvatarFlycloakDataMap map[int32]*AvatarFlycloakData // 角色风之翼
|
||||||
|
ReliquaryMainDataMap map[int32]map[int32]*ReliquaryMainData // 圣遗物主属性
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitGameDataConfig() {
|
func InitGameDataConfig() {
|
||||||
@@ -71,7 +72,7 @@ func ReplaceGameDataConfig() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *GameDataConfig) loadAll() {
|
func (g *GameDataConfig) loadAll() {
|
||||||
pathPrefix := config.GetConfig().Hk4e.GameDataConfigPath
|
pathPrefix := config.CONF.Hk4e.GameDataConfigPath
|
||||||
|
|
||||||
dirInfo, err := os.Stat(pathPrefix)
|
dirInfo, err := os.Stat(pathPrefix)
|
||||||
if err != nil || !dirInfo.IsDir() {
|
if err != nil || !dirInfo.IsDir() {
|
||||||
@@ -131,6 +132,7 @@ func (g *GameDataConfig) load() {
|
|||||||
g.loadRewardData() // 奖励
|
g.loadRewardData() // 奖励
|
||||||
g.loadAvatarCostumeData() // 角色时装
|
g.loadAvatarCostumeData() // 角色时装
|
||||||
g.loadAvatarFlycloakData() // 角色风之翼
|
g.loadAvatarFlycloakData() // 角色风之翼
|
||||||
|
g.loadReliquaryMainData() // 圣遗物主属性
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
|
func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ type ItemData struct {
|
|||||||
AwakenCoinCostList []uint32
|
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() {
|
func (g *GameDataConfig) loadItemData() {
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -591,6 +591,16 @@
|
|||||||
"field_name": "ReliquaryType",
|
"field_name": "ReliquaryType",
|
||||||
"field_type": "int32",
|
"field_type": "int32",
|
||||||
"origin_name": "圣遗物类别"
|
"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"
|
"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": "随机权重"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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/FlourishingWorld/dpdk-go v0.0.0-20230213165129-6c5bc55b1f63
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/mroth/weightedrand v1.0.0
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2
|
||||||
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec
|
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec
|
||||||
|
|||||||
@@ -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 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
|
||||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
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/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/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 h1:VBlfq7xvv/72v0mzGZ2rgsDzUoVyX2Xhssl9XpKDue0=
|
||||||
github.com/nats-io/nats-server/v2 v2.9.7/go.mod h1:AB6hAnGZDlYfqb7CTAm66ZKMZy9DpfierY1/PbpvI2g=
|
github.com/nats-io/nats-server/v2 v2.9.7/go.mod h1:AB6hAnGZDlYfqb7CTAm66ZKMZy9DpfierY1/PbpvI2g=
|
||||||
|
|||||||
@@ -124,8 +124,7 @@ func (g *GameManager) WearEquipReq(player *model.Player, payloadMsg pb.Message)
|
|||||||
g.WearUserAvatarWeapon(player.PlayerID, avatar.AvatarId, weapon.WeaponId)
|
g.WearUserAvatarWeapon(player.PlayerID, avatar.AvatarId, weapon.WeaponId)
|
||||||
case *model.Reliquary:
|
case *model.Reliquary:
|
||||||
reliquary := equipGameObj.(*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:
|
default:
|
||||||
logger.Error("equip type error, equipGuid: %v", req.EquipGuid)
|
logger.Error("equip type error, equipGuid: %v", req.EquipGuid)
|
||||||
g.SendError(cmd.WearEquipRsp, player, &proto.WearEquipRsp{})
|
g.SendError(cmd.WearEquipRsp, player, &proto.WearEquipRsp{})
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ func (g *GameManager) GetAllReliquaryDataConfig() map[int32]*gdconf.ItemData {
|
|||||||
if (itemId >= 20002 && itemId <= 20004) ||
|
if (itemId >= 20002 && itemId <= 20004) ||
|
||||||
itemId == 23334 ||
|
itemId == 23334 ||
|
||||||
(itemId >= 23300 && itemId <= 23340) {
|
(itemId >= 23300 && itemId <= 23340) {
|
||||||
// 跳过无效圣遗物
|
|
||||||
continue
|
continue
|
||||||
|
// 跳过无效圣遗物
|
||||||
}
|
}
|
||||||
allReliquaryDataConfig[itemId] = itemData
|
allReliquaryDataConfig[itemId] = itemData
|
||||||
}
|
}
|
||||||
@@ -37,9 +37,14 @@ func (g *GameManager) AddUserReliquary(userId uint32, itemId uint32) uint64 {
|
|||||||
logger.Error("reliquary config error, itemId: %v", itemId)
|
logger.Error("reliquary config error, itemId: %v", itemId)
|
||||||
return 0
|
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())
|
reliquaryId := uint64(g.snowflake.GenId())
|
||||||
// player.AddReliquary(24825, uint64(g.snowflake.GenId()), 15007)
|
// 根据圣遗物类型给予主属性Id
|
||||||
player.AddReliquary(itemId, reliquaryId, 15007) // TODO 随机主属性库
|
player.AddReliquary(itemId, reliquaryId, uint32(reliquaryMainConfig.MainPropId))
|
||||||
reliquary := player.GetReliquary(reliquaryId)
|
reliquary := player.GetReliquary(reliquaryId)
|
||||||
if reliquary == nil {
|
if reliquary == nil {
|
||||||
logger.Error("reliquary is nil, itemId: %v, reliquaryId: %v", itemId, reliquaryId)
|
logger.Error("reliquary is nil, itemId: %v, reliquaryId: %v", itemId, reliquaryId)
|
||||||
|
|||||||
Reference in New Issue
Block a user