diff --git a/src/server/conf/activity/activity_cfg.go b/src/server/conf/activity/activity_cfg.go index b6edf150..9625334e 100644 --- a/src/server/conf/activity/activity_cfg.go +++ b/src/server/conf/activity/activity_cfg.go @@ -23,7 +23,8 @@ func init() { func GetActivityGiftId(chargeId int) int { data, err := gamedata.GetData(CFG_ACTIVITY_GIFT) if err != nil { - log.Debug("GetActivityGift err:%v", err) + log.Debug("GetActivityGiftId err:%v", err) + return 0 } for _, v := range data { ChargeId := gamedata.GetIntValue(v, "ChargeId") @@ -34,10 +35,11 @@ func GetActivityGiftId(chargeId int) int { return 0 } -func GetAcitivityGiftItems(chargeId int) []*item.Item { +func GetActivityGiftItems(chargeId int) []*item.Item { data, err := gamedata.GetData(CFG_ACTIVITY_GIFT) if err != nil { - log.Debug("GetAcitivityGiftItems err:%v", err) + log.Debug("GetActivityGiftItems err:%v", err) + return nil } for _, v := range data { ChargeId := gamedata.GetIntValue(v, "ChargeId") @@ -53,9 +55,10 @@ func GetActivityList() []*gamedata.ActivityData { data, err := gamedata.GetData(CFG_ACTIVITY) if err != nil { log.Debug("GetActivityList err:%v", err) + return nil } Now := GoUtil.Now() - var List []*gamedata.ActivityData + List := make([]*gamedata.ActivityData, 0, len(data)) for k, v := range data { StartTimeStr := gamedata.GetStringValue(v, "StartTime") @@ -63,7 +66,11 @@ func GetActivityList() []*gamedata.ActivityData { StartTime := GoUtil.ParseTime(StartTimeStr) EndTime := GoUtil.ParseTime(EndTimeStr) if Now >= StartTime && Now <= EndTime { - Id, _ := strconv.Atoi(k) + Id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetActivityList parse id err:%v, key:%s", err, k) + continue + } Type := gamedata.GetIntValue(v, "Type") Name := gamedata.GetStringValue(v, "Name") Title := gamedata.GetStringValue(v, "Title") @@ -84,10 +91,11 @@ func GetActivityList() []*gamedata.ActivityData { return List } -func GetAcitivityRewardItems(ActId int) []*item.Item { +func GetActivityRewardItems(ActId int) []*item.Item { data, err := gamedata.GetData(CFG_ACTIVITY_GIFT) if err != nil { - log.Debug("GetAcitivityGiftItems err:%v", err) + log.Debug("GetActivityRewardItems err:%v", err) + return nil } for _, v := range data { ChargeId := gamedata.GetIntValue(v, "ChargeId") @@ -104,8 +112,10 @@ func GetActivityTitle(ActId int) (string, string) { data, err := gamedata.GetDataByIntKey(CFG_ACTIVITY, ActId) if err != nil { log.Debug("GetActivityTitle err:%v", err) + return "", "" } - return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title")), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title")) + title := gamedata.GetStringValue(data, "Title") + return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, title), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, title) } func GetActivityRecycleMail(ActId int) (string, string, string) { diff --git a/src/server/conf/avatar/avatar_cfg.go b/src/server/conf/avatar/avatar_cfg.go index c3ec621c..b35231aa 100644 --- a/src/server/conf/avatar/avatar_cfg.go +++ b/src/server/conf/avatar/avatar_cfg.go @@ -20,7 +20,7 @@ func GetInitList() []int { log.Debug("GetInitList err: %v", err) return nil } - r := make([]int, 0) + r := make([]int, 0, len(data)) for k, v := range data { IsInit := gamedata.GetIntValue(v, "Init") if IsInit == 1 { @@ -47,7 +47,7 @@ func GetAllId() []int { log.Debug("GetAllId err: %v", err) return nil } - r := make([]int, 0) + r := make([]int, 0, len(data)) for k := range data { Id, _ := strconv.Atoi(k) r = append(r, Id) diff --git a/src/server/conf/base/base_cfg.go b/src/server/conf/base/base_cfg.go index d3b796bb..b259d14d 100644 --- a/src/server/conf/base/base_cfg.go +++ b/src/server/conf/base/base_cfg.go @@ -12,8 +12,9 @@ const ( ) const ( - ENERGY_SHOP_MUL = "energy_shop_mul" - ENERGY_CFG = "BaseEnergy" + ENERGY_SHOP_MUL = "energy_shop_mul" + ENERGY_CFG = "BaseEnergy" + MAX_ENERGY_LEVEL = 999 // 最大能量等级上限 ) func init() { @@ -27,17 +28,28 @@ func GetEnergyByMul(T int) float64 { log.Debug("GetEnergyByMul err:%v", err) return 0 } - d := data["Value"].(map[string]interface{}) - if len(d) == 0 { + + valueData, ok := data["Value"] + if !ok { + log.Debug("GetEnergyByMul: Value field not found") return 0 } + + d, ok := valueData.(map[string]interface{}) + if !ok || len(d) == 0 { + log.Debug("GetEnergyByMul: Value is not a valid map") + return 0 + } + T = min(T, len(d)) T1 := strconv.Itoa(T) if v, ok := d[T1]; ok { - return v.(float64) - } else { - return 0 + if floatVal, ok := v.(float64); ok { + return floatVal + } + log.Debug("GetEnergyByMul: value is not float64, key=%s", T1) } + return 0 } func GetFriendReplyReward() []*item.Item { @@ -49,15 +61,25 @@ func GetFriendReplyReward() []*item.Item { return gamedata.GetItemList(data, "Value") } +func GetEnergyByADNum() []*item.Item { + data, err := gamedata.GetDataByKey(CFG_BASE, "ad_energy_gift") + if err != nil { + log.Debug("GetEnergyByADNum err:%v", err) + return nil + } + return gamedata.GetItemList(data, "Value") +} + func GetMaxEnergyMul(Lv int, Energy int) int { Mul := 0 - for i := 1; i < 999; i++ { + for i := 1; i <= MAX_ENERGY_LEVEL; i++ { data, err := gamedata.GetDataByIntKey(ENERGY_CFG, i) if err != nil { break } UnlockLv := gamedata.GetIntValue(data, "UnlockLv") - if Lv < UnlockLv || Energy < gamedata.GetIntValue(data, "NeedEnergy") { + needEnergy := gamedata.GetIntValue(data, "NeedEnergy") + if Lv < UnlockLv || Energy < needEnergy { break } Mul = i - 1 @@ -68,6 +90,7 @@ func GetMaxEnergyMul(Lv int, Energy int) int { func GetLimitEnergyMul(Lv int) int { data, err := gamedata.GetDataByIntKey(ENERGY_CFG, Lv+1) if err != nil { + log.Debug("GetLimitEnergyMul err:%v, Lv=%d", err, Lv) return 0 } return gamedata.GetIntValue(data, "Limit") diff --git a/src/server/conf/card/card_cfg.go b/src/server/conf/card/card_cfg.go index a3f221db..661d1ed9 100644 --- a/src/server/conf/card/card_cfg.go +++ b/src/server/conf/card/card_cfg.go @@ -28,14 +28,19 @@ func init() { func GetAllCollectReward() []*item.Item { data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "all_collect_reward") if err != nil { - log.Debug("GetAllCollectReward data not found") + log.Debug("GetAllCollectReward err:%v", err) + return nil } - return item.ParseItem(data["Value"]) + if value, ok := data["Value"]; ok { + return item.ParseItem(value) + } + return nil } func GetStarById(Id int) int { data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id) if err != nil { - log.Debug("GetStarById data not found") + log.Debug("GetStarById err:%v, Id=%d", err, Id) + return 0 } return gamedata.GetIntValue(data, "Star") } @@ -43,7 +48,8 @@ func GetStarById(Id int) int { func GetRoundById(Id int) int { data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id) if err != nil { - log.Debug("GetRoundById data not found") + log.Debug("GetRoundById err:%v, Id=%d", err, Id) + return 0 } return gamedata.GetIntValue(data, "Round") } @@ -51,31 +57,31 @@ func GetRoundById(Id int) int { // 获取开启卡包获得的卡牌数量 func GetPackRewardCnt(Star int) int { data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star) - if err != nil { - log.Debug("GetPackRewardCnt data not found") + log.Debug("GetPackRewardCnt err:%v, Star=%d", err, Star) + return 0 } - return gamedata.GetIntValue(data, "RewardCnt") } -// 获取开启开包比得x星卡 +// 获取开启开包必得x星卡 func GetPackMustHave(Star int) int { data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star) if err != nil { - log.Debug("GetPackMustHave data not found") + log.Debug("GetPackMustHave err:%v, Star=%d", err, Star) + return 0 } - return gamedata.GetIntValue(data, "MustHave") } // 根据星级获取卡牌列表 func GetCardListByStar(Round, Star, IsGold int) []int { - var CardList []int data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME) if err != nil { - log.Debug("GetCardListByStar data not found") + log.Debug("GetCardListByStar err:%v", err) + return nil } + CardList := make([]int, 0, len(data)/10) for k, v := range data { Extra := gamedata.GetIntValue(v, "Round") if Round < Extra { @@ -84,7 +90,11 @@ func GetCardListByStar(Round, Star, IsGold int) []int { vStar := gamedata.GetIntValue(v, "Star") isGold := gamedata.GetIntValue(v, "IsGold") if vStar == Star && IsGold == isGold { - id, _ := strconv.Atoi(k) + id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetCardListByStar parse id err:%v, key=%s", err, k) + continue + } CardList = append(CardList, id) } } @@ -93,15 +103,15 @@ func GetCardListByStar(Round, Star, IsGold int) []int { // 获取随机卡牌 func GetRandListByStar(Star int) map[int]int { - var randList []int data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star) if err != nil { - log.Debug("GetRandListByStar data not found") + log.Debug("GetRandListByStar err:%v, Star=%d", err, Star) + return nil } r1 := gamedata.GetStringValue(data, "RandRate") r2 := strings.Split(r1, ",") - randList = GoUtil.SliceStringToInt(r2) - r := make(map[int]int) + randList := GoUtil.SliceStringToInt(r2) + r := make(map[int]int, len(randList)) for k, v := range randList { r[k+1] = v } @@ -125,7 +135,8 @@ func GetCollectReward(Color int) ([]*item.Item, int) { func GetExchangeCfg(Id int) (int, []*item.Item) { data, err := gamedata.GetDataByIntKey(CARD_EXCHANGE_CFG, Id) if err != nil { - log.Debug("GetExchangeCfg data not found") + log.Debug("GetExchangeCfg err:%v, Id=%d", err, Id) + return 0, nil } CostStar := gamedata.GetIntValue(data, "CostStar") itemList := gamedata.GetItemList(data, "Item") @@ -136,14 +147,18 @@ func GetExchangeCfg(Id int) (int, []*item.Item) { func GetCardListByColor(Id int) []int { data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME) if err != nil { - log.Debug("GetCardListByColor data not found") - return []int{} + log.Debug("GetCardListByColor err:%v, Id=%d", err, Id) + return nil } - var r []int + r := make([]int, 0, len(data)/5) for k, v := range data { color := gamedata.GetIntValue(v, "PictureAlbum") if color == Id { - k1, _ := strconv.Atoi(k) + k1, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetCardListByColor parse id err:%v, key=%s", err, k) + continue + } r = append(r, k1) } } @@ -154,16 +169,20 @@ func GetCardListByColor(Id int) []int { func GetAllCardId(Round int) []int { data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME) if err != nil { - log.Debug("GetCardListByColor data not found") - return []int{} + log.Debug("GetAllCardId err:%v, Round=%d", err, Round) + return nil } - var r []int + r := make([]int, 0, len(data)) for k, v := range data { Extra := gamedata.GetIntValue(v, "Round") if Round < Extra { continue } - k1, _ := strconv.Atoi(k) + k1, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetAllCardId parse id err:%v, key=%s", err, k) + continue + } r = append(r, k1) } return r @@ -172,7 +191,8 @@ func GetAllCardId(Round int) []int { func CheckCardIsGold(Id int) bool { data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id) if err != nil { - log.Debug("CheckCardIsGold data not found") + log.Debug("CheckCardIsGold err:%v, Id=%d", err, Id) + return false } return gamedata.GetIntValue(data, "IsGold") == 1 } @@ -180,7 +200,8 @@ func CheckCardIsGold(Id int) bool { func GetCardDuration() int64 { data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "duration") if err != nil { - log.Debug("GetCardDuration data not found") + log.Debug("GetCardDuration err:%v", err) + return 0 } return int64(gamedata.GetIntValue(data, "Value")) } @@ -188,7 +209,8 @@ func GetCardDuration() int64 { func GetExTimes() int { data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "exchange_times") if err != nil { - log.Debug("GetExTimes data not found") + log.Debug("GetExTimes err:%v", err) + return 0 } return gamedata.GetIntValue(data, "Value") } @@ -196,7 +218,8 @@ func GetExTimes() int { func GetReqTimes() int { data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "request_times") if err != nil { - log.Debug("GetReqTimes data not found") + log.Debug("GetReqTimes err:%v", err) + return 0 } return gamedata.GetIntValue(data, "Value") } @@ -204,7 +227,8 @@ func GetReqTimes() int { func GetItemIdByCardId(CardId int) int { data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, CardId) if err != nil { - log.Debug("GetItemIdByCardId data not found") + log.Debug("GetItemIdByCardId err:%v, CardId=%d", err, CardId) + return 0 } return gamedata.GetIntValue(data, "ItemId") } @@ -212,7 +236,11 @@ func GetItemIdByCardId(CardId int) int { func GetSeasonFirstReward() []*item.Item { data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "season_first") if err != nil { - log.Debug("GetSeasonFirstReward data not found") + log.Debug("GetSeasonFirstReward err:%v", err) + return nil } - return item.ParseItem(data["Value"]) + if value, ok := data["Value"]; ok { + return item.ParseItem(value) + } + return nil } diff --git a/src/server/conf/catnip/catnip_cfg.go b/src/server/conf/catnip/catnip_cfg.go index d60b89d3..05b02770 100644 --- a/src/server/conf/catnip/catnip_cfg.go +++ b/src/server/conf/catnip/catnip_cfg.go @@ -4,6 +4,7 @@ import ( "server/game/mod/item" GoUtil "server/game_util" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" ) const ( @@ -29,6 +30,7 @@ func init() { func GetGameNum(Id int) int { data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id) if err != nil { + log.Debug("GetGameNum err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "PassNum") @@ -38,6 +40,7 @@ func GetGameMaxProgress(Id int) int { TemplateId := GetTemplateId(Id) data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME) if err != nil { + log.Debug("GetGameMaxProgress err:%v, Id=%d", err, Id) return 0 } MaxProgress := 0 @@ -53,10 +56,11 @@ func GetGameMaxProgress(Id int) int { func GetJackpotItem(Mul int) (int, []*item.Item, int, int) { data, err := gamedata.GetData(CATNIP_JACKPOT_CFG_NAME) if err != nil { + log.Debug("GetJackpotItem err:%v, Mul=%d", err, Mul) return 0, nil, 0, 0 } JackpotType := GetJackpotType(Mul) - r := make(map[int]int) + r := make(map[int]int, len(data)) for k, v := range data { if gamedata.GetIntValue(v, "Type") == JackpotType { r[GoUtil.Int(k)] = 1 @@ -68,6 +72,7 @@ func GetJackpotItem(Mul int) (int, []*item.Item, int, int) { } itemData, err := gamedata.GetDataByIntKey(CATNIP_JACKPOT_CFG_NAME, Id) if err != nil { + log.Debug("GetJackpotItem get itemData err:%v, Id=%d", err, Id) return 0, nil, 0, 0 } return Id, gamedata.GetItemList(itemData, "Items"), gamedata.GetIntValue(itemData, "Growth"), gamedata.GetIntValue(itemData, "FriendItems") @@ -76,6 +81,7 @@ func GetJackpotItem(Mul int) (int, []*item.Item, int, int) { func GetJackpotType(Mul int) int { data, err := gamedata.GetDataByIntKey(CATNIP_MULTIPLIER_CFG_NAME, Mul) if err != nil { + log.Debug("GetJackpotType err:%v, Mul=%d", err, Mul) return 0 } R := map[int]int{ @@ -89,6 +95,7 @@ func GetJackpotType(Mul int) int { func GetTemplateId(Id int) int { data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id) if err != nil { + log.Debug("GetTemplateId err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "Template") @@ -98,15 +105,16 @@ func GetProgressReward(Id int, Rewards []int, Progress int) ([]*item.Item, []int TemplateId := GetTemplateId(Id) data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME) if err != nil { + log.Debug("GetProgressReward err:%v, Id=%d", err, Id) return nil, nil } - Items := []*item.Item{} - Ids := []int{} + Items := make([]*item.Item, 0, len(data)) + Ids := make([]int, 0, len(data)) for k, v := range data { - Id := GoUtil.Int(k) - if !GoUtil.InArray(Id, Rewards) && gamedata.GetIntValue(v, "Need") < Progress && gamedata.GetIntValue(v, "Template") == TemplateId { + rewardId := GoUtil.Int(k) + if !GoUtil.InArray(rewardId, Rewards) && gamedata.GetIntValue(v, "Need") < Progress && gamedata.GetIntValue(v, "Template") == TemplateId { Items = append(Items, gamedata.GetItemList(v, "Items")...) - Ids = append(Ids, GoUtil.Int(k)) + Ids = append(Ids, rewardId) } } return Items, Ids @@ -116,6 +124,7 @@ func GetProgressNum(Id int) int { TemplateId := GetTemplateId(Id) data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME) if err != nil { + log.Debug("GetProgressNum err:%v, Id=%d", err, Id) return 0 } Num := 0 @@ -130,6 +139,7 @@ func GetProgressNum(Id int) int { func GetItemCost(Id, Mul int) []*item.Item { data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id) if err != nil { + log.Debug("GetItemCost err:%v, Id=%d", err, Id) return nil } return item.MutilItem(gamedata.GetItemList(data, "ItemCost"), Mul) @@ -138,6 +148,7 @@ func GetItemCost(Id, Mul int) []*item.Item { func GetGrandReward(Id int) []*item.Item { data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id) if err != nil { + log.Debug("GetGrandReward err:%v, Id=%d", err, Id) return nil } return gamedata.GetItemList(data, "Reward") diff --git a/src/server/conf/champship/champship_cfg.go b/src/server/conf/champship/champship_cfg.go index 47211d3f..8e5a8902 100644 --- a/src/server/conf/champship/champship_cfg.go +++ b/src/server/conf/champship/champship_cfg.go @@ -4,6 +4,7 @@ import ( "server/game/mod/item" GoUtil "server/game_util" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" ) const ( @@ -23,6 +24,7 @@ func init() { func GetGroupId(N int) int { data, err := gamedata.GetData(CFG_CHAMPSHIP_GROUP) if err != nil { + log.Debug("GetGroupId err:%v, N=%d", err, N) return 0 } for k, v := range data { @@ -36,6 +38,7 @@ func GetGroupId(N int) int { func GetChessScore(ChessLv int) int { data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv) if err != nil { + log.Debug("GetChessScore err:%v, ChessLv=%d", err, ChessLv) return 0 } return gamedata.GetIntValue(data, "Score") @@ -44,9 +47,10 @@ func GetChessScore(ChessLv int) int { func GetReward(Reward, Score int) (int, []*item.Item) { data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT) if err != nil { + log.Debug("GetReward err:%v, Reward=%d, Score=%d", err, Reward, Score) return Reward, nil } - r := make([]*item.Item, 0) + r := make([]*item.Item, 0, len(data)) NewReward := Reward for k, v := range data { Id := GoUtil.Int(k) @@ -65,6 +69,7 @@ func GetReward(Reward, Score int) (int, []*item.Item) { func GetRewardItems(Reward int) ([]*item.Item, int) { data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward) if err != nil { + log.Debug("GetRewardItems err:%v, Reward=%d", err, Reward) return nil, 0 } return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Score") @@ -73,6 +78,7 @@ func GetRewardItems(Reward int) ([]*item.Item, int) { func GetRewardTotalScore(Reward int) int { data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward) if err != nil { + log.Debug("GetRewardTotalScore err:%v, Reward=%d", err, Reward) return 0 } return gamedata.GetIntValue(data, "Total") @@ -81,6 +87,7 @@ func GetRewardTotalScore(Reward int) int { func GetRankReward(Rank int) []*item.Item { data, err := gamedata.GetData(CFG_CHAMPSHIP_RANK) if err != nil { + log.Debug("GetRankReward err:%v, Rank=%d", err, Rank) return nil } for _, v := range data { @@ -94,6 +101,7 @@ func GetRankReward(Rank int) []*item.Item { func GetMaxRewardId() int { data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT) if err != nil { + log.Debug("GetMaxRewardId err:%v", err) return 0 } MaxId := 0 diff --git a/src/server/conf/charge/charge_cfg.go b/src/server/conf/charge/charge_cfg.go index a86d48c3..d601ff42 100644 --- a/src/server/conf/charge/charge_cfg.go +++ b/src/server/conf/charge/charge_cfg.go @@ -4,6 +4,7 @@ import ( "server/game/mod/item" GoUtil "server/game_util" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" "sort" "strings" ) @@ -37,6 +38,7 @@ func init() { func GetADReward(ChargeId int) ([]*item.Item, int) { data, err := gamedata.GetData(CFG_CHARGE_AD) if err != nil { + log.Debug("GetADReward err:%v, ChargeId=%d", err, ChargeId) return nil, 0 } for _, v := range data { @@ -50,6 +52,7 @@ func GetADReward(ChargeId int) ([]*item.Item, int) { func GetWeeklyDiscountDay() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_day") if err != nil { + log.Debug("GetWeeklyDiscountDay err:%v", err) return -1 } return gamedata.GetIntValue(data, "Value") @@ -58,6 +61,7 @@ func GetWeeklyDiscountDay() int { func GetMoneyCharge(ChargeId int) float64 { data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId) if err != nil { + log.Debug("GetMoneyCharge err:%v, ChargeId=%d", err, ChargeId) return 0 } return gamedata.GetFloatValue(data, "Money") @@ -66,6 +70,7 @@ func GetMoneyCharge(ChargeId int) float64 { func GetDiamondShopReward(ChargeId int) []*item.Item { data, err := gamedata.GetData(CFG_DIAMOND_SHOP) if err != nil { + log.Debug("GetDiamondShopReward err:%v, ChargeId=%d", err, ChargeId) return nil } for _, v := range data { @@ -79,6 +84,7 @@ func GetDiamondShopReward(ChargeId int) []*item.Item { func GetEnergyShopId(ChargeId int) int { data, err := gamedata.GetData(CFG_ENERGY_SHOP) if err != nil { + log.Debug("GetEnergyShopId err:%v, ChargeId=%d", err, ChargeId) return 0 } for k, v := range data { @@ -92,11 +98,24 @@ func GetEnergyShopId(ChargeId int) int { func GetWeeklyInfo(Pos int) (int, int) { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop") if err != nil { + log.Debug("GetWeeklyInfo err:%v, Pos=%d", err, Pos) + return 0, 0 + } + valueData, ok := data["Value"] + if !ok { + log.Debug("GetWeeklyInfo: Value field not found") + return 0, 0 + } + r, ok := valueData.([]interface{}) + if !ok { + log.Debug("GetWeeklyInfo: Value is not []interface{}") return 0, 0 } - r := data["Value"].([]interface{}) for _, v := range r { - v1 := v.(map[string]interface{}) + v1, ok := v.(map[string]interface{}) + if !ok { + continue + } Id := GoUtil.Int(v1["Id"]) if Id == Pos { return GoUtil.Int(v1["Discount"]), GoUtil.Int(v1["Limit"]) @@ -108,12 +127,25 @@ func GetWeeklyInfo(Pos int) (int, int) { func GetWeeklyInfoAll() map[int]gamedata.WeeklyDiscountInfo { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop") if err != nil { + log.Debug("GetWeeklyInfoAll err:%v", err) return nil } - r := data["Value"].([]interface{}) - res := make(map[int]gamedata.WeeklyDiscountInfo) + valueData, ok := data["Value"] + if !ok { + log.Debug("GetWeeklyInfoAll: Value field not found") + return nil + } + r, ok := valueData.([]interface{}) + if !ok { + log.Debug("GetWeeklyInfoAll: Value is not []interface{}") + return nil + } + res := make(map[int]gamedata.WeeklyDiscountInfo, len(r)) for _, v := range r { - v1 := v.(map[string]interface{}) + v1, ok := v.(map[string]interface{}) + if !ok { + continue + } Id := GoUtil.Int(v1["Id"]) res[Id] = gamedata.WeeklyDiscountInfo{ Id: GoUtil.Int(v1["Id"]), @@ -127,6 +159,7 @@ func GetWeeklyInfoAll() map[int]gamedata.WeeklyDiscountInfo { func GetEnergyShopReward(ChargeId int, First bool) []*item.Item { data, err := gamedata.GetData(CFG_ENERGY_SHOP) if err != nil { + log.Debug("GetEnergyShopReward err:%v, ChargeId=%d", err, ChargeId) return nil } for _, v := range data { @@ -144,6 +177,7 @@ func GetEnergyShopReward(ChargeId int, First bool) []*item.Item { func GetSpecialShopReward(ChargeId int) []*item.Item { data, err := gamedata.GetData(CFG_SEPCIAL_SHOP) if err != nil { + log.Debug("GetSpecialShopReward err:%v, ChargeId=%d", err, ChargeId) return nil } for _, v := range data { @@ -157,6 +191,7 @@ func GetSpecialShopReward(ChargeId int) []*item.Item { func GetSpecialShopType(ChargeId int) int { data, err := gamedata.GetData(CFG_SEPCIAL_SHOP) if err != nil { + log.Debug("GetSpecialShopType err:%v, ChargeId=%d", err, ChargeId) return 0 } for _, v := range data { @@ -170,6 +205,7 @@ func GetSpecialShopType(ChargeId int) int { func GetFreeShopReward(ChargeId int) []*item.Item { data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId) if err != nil { + log.Debug("GetFreeShopReward err:%v, ChargeId=%d", err, ChargeId) return nil } Item := gamedata.GetValue(data, "Items") @@ -183,9 +219,10 @@ func GetSpecialShopGrade(Money float64, Type int) int { } data, err := gamedata.GetData(CFG_SEPCIAL_SHOP) if err != nil { + log.Debug("GetSpecialShopGrade err:%v, Money=%.2f, Type=%d", err, Money, Type) return 0 } - l := make([]grade, 0) + l := make([]grade, 0, len(data)) for _, v := range data { if gamedata.GetIntValue(v, "Type") != Type { continue @@ -199,8 +236,17 @@ func GetSpecialShopGrade(Money float64, Type int) int { return l[i].money > l[j].money }) + if len(l) == 0 { + return 0 + } + maxMoney := 0.0 for _, v := range l { - if Money <= v.money { + if Money >= v.money { + maxMoney = max(maxMoney, v.money) + } + } + for _, v := range l { + if v.money == maxMoney { return v.id } } @@ -210,6 +256,7 @@ func GetSpecialShopGrade(Money float64, Type int) int { func GetUnlockShopLv() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv") if err != nil { + log.Debug("GetUnlockShopLv err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -218,6 +265,7 @@ func GetUnlockShopLv() int { func GetSpecialShopCount() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count") if err != nil { + log.Debug("GetSpecialShopCount err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -226,6 +274,7 @@ func GetSpecialShopCount() int { func GetAdChargeId() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id") if err != nil { + log.Debug("GetAdChargeId err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -234,6 +283,7 @@ func GetAdChargeId() int { func GetPiggyDuration() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration") if err != nil { + log.Debug("GetPiggyDuration err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -242,6 +292,7 @@ func GetPiggyDuration() int { func GetPiggyMaxDia() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond") if err != nil { + log.Debug("GetPiggyMaxDia err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -250,6 +301,7 @@ func GetPiggyMaxDia() int { func GetPiggyRandDia() (int, int) { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand") if err != nil { + log.Debug("GetPiggyRandDia err:%v", err) return 0, 0 } str := gamedata.GetStringValue(data, "Value") @@ -263,6 +315,7 @@ func GetPiggyRandDia() (int, int) { func GetPiggyBankChargeId() int { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id") if err != nil { + log.Debug("GetPiggyBankChargeId err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -271,6 +324,7 @@ func GetPiggyBankChargeId() int { func GetGiftReward(ChargeId int) []*item.Item { data, err := gamedata.GetData(CFG_CHARGE_GIFT) if err != nil { + log.Debug("GetGiftReward err:%v, ChargeId=%d", err, ChargeId) return nil } for _, v := range data { @@ -284,6 +338,7 @@ func GetGiftReward(ChargeId int) []*item.Item { func GetGiftLimit(ChargeId int) int { data, err := gamedata.GetData(CFG_CHARGE_GIFT) if err != nil { + log.Debug("GetGiftLimit err:%v, ChargeId=%d", err, ChargeId) return 0 } for _, v := range data { @@ -296,6 +351,7 @@ func GetGiftLimit(ChargeId int) int { func GetGiftId(ChargeId int) int { data, err := gamedata.GetData(CFG_CHARGE_GIFT) if err != nil { + log.Debug("GetGiftId err:%v, ChargeId=%d", err, ChargeId) return 0 } for k, v := range data { @@ -309,6 +365,7 @@ func GetGiftId(ChargeId int) int { func GetChargeInfo(ChargeId int) (float64, string) { data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId) if err != nil { + log.Debug("GetChargeInfo err:%v, ChargeId=%d", err, ChargeId) return 0, "" } return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit") @@ -317,6 +374,7 @@ func GetChargeInfo(ChargeId int) (float64, string) { func GetProduceName(ChargeId int) string { data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId) if err != nil { + log.Debug("GetProduceName err:%v, ChargeId=%d", err, ChargeId) return "" } return gamedata.GetStringValue(data, "Remark") @@ -325,6 +383,7 @@ func GetProduceName(ChargeId int) string { func GetWishCount(ItemId int) int { data, err := gamedata.GetDataByIntKey(CFG_CHARGE_WISH, ItemId) if err != nil { + log.Debug("GetWishCount err:%v, ItemId=%d", err, ItemId) return 0 } return gamedata.GetIntValue(data, "Wish") @@ -333,6 +392,7 @@ func GetWishCount(ItemId int) int { func GetPetCoinShopReward(ChargeId int) []*item.Item { data, err := gamedata.GetData(CFG_CHARGE_PETCOIN) if err != nil { + log.Debug("GetPetCoinShopReward err:%v, ChargeId=%d", err, ChargeId) return nil } for _, v := range data { @@ -346,6 +406,7 @@ func GetPetCoinShopReward(ChargeId int) []*item.Item { func GetWeeklyDiscountStartEnd() (int64, int64) { data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_time") if err != nil { + log.Debug("GetWeeklyDiscountStartEnd err:%v", err) return 0, 0 } str := gamedata.GetStringValue(data, "Value") diff --git a/src/server/conf/collect/collect_cfg.go b/src/server/conf/collect/collect_cfg.go index 22b8dc3a..0394fff4 100644 --- a/src/server/conf/collect/collect_cfg.go +++ b/src/server/conf/collect/collect_cfg.go @@ -4,6 +4,7 @@ import ( "server/game/mod/item" GoUtil "server/game_util" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" ) const ( @@ -19,9 +20,10 @@ func init() { func GetJackpotId() []int { data, err := gamedata.GetData(CFG_COLLECT_JACKPOT) if err != nil { + log.Debug("GetJackpotId err:%v", err) return nil } - ret := make([]int, 0) + ret := make([]int, 0, len(data)) for k := range data { ret = append(ret, GoUtil.Int(k)) } @@ -31,6 +33,7 @@ func GetJackpotId() []int { func GetJackpotItems(Id int) []*item.Item { data, err := gamedata.GetDataByIntKey(CFG_COLLECT_JACKPOT, Id) if err != nil { + log.Debug("GetJackpotItems err:%v, Id=%d", err, Id) return nil } return gamedata.GetItemList(data, "Items") @@ -39,6 +42,7 @@ func GetJackpotItems(Id int) []*item.Item { func GetRewardNeed(Id int) int { data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id) if err != nil { + log.Debug("GetRewardNeed err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "Need") @@ -47,6 +51,7 @@ func GetRewardNeed(Id int) int { func GetRewardType(Id int) int { data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id) if err != nil { + log.Debug("GetRewardType err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "Type") diff --git a/src/server/conf/daily_task/daily_task_cfg.go b/src/server/conf/daily_task/daily_task_cfg.go index e9c44a4f..7348bf67 100644 --- a/src/server/conf/daily_task/daily_task_cfg.go +++ b/src/server/conf/daily_task/daily_task_cfg.go @@ -23,16 +23,20 @@ func init() { // 获取任务列表 func GetTaskList(Lv int) map[int]string { - r := make(map[int]string) data, err := gamedata.GetData(DAILY_TASK) if err != nil { - log.Debug("GetTaskList get data nil") - return r + log.Debug("GetTaskList err:%v, Lv=%d", err, Lv) + return nil } + r := make(map[int]string, len(data)) for k, v := range data { lv := gamedata.GetIntValue(v, "Lv") if Lv >= lv { - k1, _ := strconv.Atoi(k) + k1, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetTaskList parse id err:%v, key=%s", err, k) + continue + } r[k1] = gamedata.GetStringValue(v, "Task") } } @@ -42,12 +46,16 @@ func GetTaskList(Lv int) map[int]string { func GetTaskActiveId() []int { data, err := gamedata.GetData(DAILY_TASK_ACTIVE) if err != nil { - log.Debug("GetTaskActiveId get data nil") - return []int{} + log.Debug("GetTaskActiveId err:%v", err) + return nil } r := make([]int, 0, len(data)) for k := range data { - Id, _ := strconv.Atoi(k) + Id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetTaskActiveId parse id err:%v, key=%s", err, k) + continue + } r = append(r, Id) } return r @@ -56,7 +64,7 @@ func GetTaskActiveId() []int { func GetTaskActiveById(Id int) int { data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id) if err != nil { - log.Debug("GetTaskActiveById get data nil") + log.Debug("GetTaskActiveById err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "Num") @@ -68,16 +76,19 @@ type Jackpot struct { } func GetTaskWeekJackpot() map[int]Jackpot { - r := make(map[int]Jackpot) - data, err := gamedata.GetData(DAILY_TASK_JACKPOT) if err != nil { - log.Debug("GetTaskWeekJackpot get data nil") - return r + log.Debug("GetTaskWeekJackpot err:%v", err) + return nil } + r := make(map[int]Jackpot, len(data)) for k, v := range data { - Id, _ := strconv.Atoi(k) + Id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetTaskWeekJackpot parse id err:%v, key=%s", err, k) + continue + } isCard := gamedata.GetIntValue(v, "CardPack") Item := item.ParseItem(gamedata.GetValue(v, "Items")) r[Id] = Jackpot{ diff --git a/src/server/conf/decorate/decorate_cfg.go b/src/server/conf/decorate/decorate_cfg.go index e4d2bcab..557189f0 100644 --- a/src/server/conf/decorate/decorate_cfg.go +++ b/src/server/conf/decorate/decorate_cfg.go @@ -25,7 +25,7 @@ func init() { func GetStarCost(AreaId, SortId int) int { data, err := gamedata.GetData(DECORATE_COST) if err != nil { - log.Debug("DecorateCost GetStarCost not found") + log.Debug("GetStarCost err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId) return 0 } for _, v := range data { @@ -39,21 +39,25 @@ func GetStarCost(AreaId, SortId int) int { func GetAreaId(id int) int { value, err := gamedata.GetDataByIntKey("DecorateCost", id) if err != nil { - log.Debug("DecorateCost GetAreaId id:%v not found", id) + log.Debug("GetAreaId err:%v, id=%d", err, id) return 0 } - return gamedata.ParseInt(value["AreaId"]) + return gamedata.GetIntValue(value, "AreaId") } func GetNextAreaId(AreaId, SortId int) int { data, err := gamedata.GetData(DECORATE_COST) if err != nil { - log.Debug("DecorateCost GetStarCost not found") + log.Debug("GetNextAreaId err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId) return 0 } for k, v := range data { if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId { - UnionKey, _ := strconv.Atoi(k) + UnionKey, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetNextAreaId parse key err:%v, key=%s", err, k) + return 0 + } nextId := UnionKey + 1 AreaId = GetAreaId(nextId) return AreaId @@ -65,10 +69,10 @@ func GetNextAreaId(AreaId, SortId int) int { func GetAllSortIdByAreaId(AreaId int) []int { data, err := gamedata.GetData(DECORATE_COST) if err != nil { - log.Debug("DecorateCost GetAllSortIdByAreaId not found") + log.Debug("GetAllSortIdByAreaId err:%v, AreaId=%d", err, AreaId) return nil } - var SortIdList []int + SortIdList := make([]int, 0, len(data)/5) for _, v := range data { if gamedata.GetIntValue(v, "AreaId") == AreaId { Sort := gamedata.GetIntValue(v, "SortId") @@ -84,7 +88,7 @@ func GetAllSortIdByAreaId(AreaId int) []int { func GetProgressReward(Scene, Lv int) []*item.Item { value, err := gamedata.GetData(INDOOR_PROGRESS) if err != nil { - log.Debug("IndoorProgress GetProgressReward not found") + log.Debug("GetProgressReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv) return nil } for _, v := range value { @@ -98,7 +102,7 @@ func GetProgressReward(Scene, Lv int) []*item.Item { func GetDecoarteReward(Scene int, Lv int) []*item.Item { value, err := gamedata.GetData(INDOOR_PROGRESS) if err != nil { - log.Debug("IndoorProgress GetDecoarteReward not found") + log.Debug("GetDecoarteReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv) return nil } for _, v := range value { @@ -112,7 +116,7 @@ func GetDecoarteReward(Scene int, Lv int) []*item.Item { func GetAreaReward(AreaId int) []*item.Item { value, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId) if err != nil { - log.Debug("IndoorProgress GetDecoarteReward not found") + log.Debug("GetAreaReward err:%v, AreaId=%d", err, AreaId) return nil } return gamedata.GetItemList(value, "Items") @@ -132,7 +136,7 @@ func GetOneKeyDecorateUnlockLv() int { func GetDecorateAddEnergy() int { data, err := gamedata.GetDataByKey(DECORATE_CONST, "AddEnergy") if err != nil { - log.Debug("GetDecorateAddEnergy not found") + log.Debug("GetDecorateAddEnergy err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -141,7 +145,7 @@ func GetDecorateAddEnergy() int { func GetAreaPerPExp(AreaId int) int { data, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId) if err != nil { - log.Debug("DecorateArea GetAreaPerPExp not found AreaId:%v", AreaId) + log.Debug("GetAreaPerPExp err:%v, AreaId=%d", err, AreaId) return 0 } return gamedata.GetIntValue(data, "PerPExp") @@ -150,7 +154,7 @@ func GetAreaPerPExp(AreaId int) int { func GetDecoratePExp(AreaId, SortId int) int { data, err := gamedata.GetData(DECORATE_COST) if err != nil { - log.Debug("DecorateArea GetDecoratePExp not found") + log.Debug("GetDecoratePExp err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId) return 0 } for _, v := range data { @@ -164,14 +168,18 @@ func GetDecoratePExp(AreaId, SortId int) int { func GetAllPartId() []int { data, err := gamedata.GetDataByKey(DECORATE_CONST, "AllPartId") if err != nil { - log.Debug("DecorateCost GetAllPartId not found") - return []int{1505, 1515, 1525, 1535} + log.Debug("GetAllPartId err:%v", err) + return nil } - var PartIdList []int str := gamedata.GetStringValue(data, "Value") r1 := strings.Split(str, "|") + PartIdList := make([]int, 0, len(r1)) for _, v := range r1 { - id, _ := strconv.Atoi(v) + id, err := strconv.Atoi(v) + if err != nil { + log.Debug("GetAllPartId parse id err:%v, v=%s", err, v) + continue + } PartIdList = append(PartIdList, id) } return PartIdList @@ -180,12 +188,16 @@ func GetAllPartId() []int { func GetIdBySenceAndLv(Sence, Lv int) int { data, err := gamedata.GetData(INDOOR_PROGRESS) if err != nil { - log.Debug("DecorateArea GetIdBySenceAndLv not found") + log.Debug("GetIdBySenceAndLv err:%v, Sence=%d, Lv=%d", err, Sence, Lv) return 0 } for k, v := range data { if gamedata.GetIntValue(v, "Scene") == Sence && gamedata.GetIntValue(v, "Lv") == Lv { - id, _ := strconv.Atoi(k) + id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetIdBySenceAndLv parse id err:%v, key=%s", err, k) + return 0 + } return id } } @@ -195,16 +207,20 @@ func GetIdBySenceAndLv(Sence, Lv int) int { func GetPartNumByAreaId(AreaId int) map[int]int { data, err := gamedata.GetData(INDOOR_PROGRESS) if err != nil { - log.Debug("DecorateArea GetPartNumByAreaId not found AreaId:%v", AreaId) + log.Debug("GetPartNumByAreaId err:%v, AreaId=%d", err, AreaId) return nil } - res := make(map[int]int) + res := make(map[int]int, len(data)) for k, v := range data { Sence := gamedata.GetIntValue(v, "Scene") if Sence != AreaId { continue } - id, _ := strconv.Atoi(k) + id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetPartNumByAreaId parse id err:%v, key=%s", err, k) + continue + } PartNum := gamedata.GetIntValue(v, "Part") if PartNum == 0 { continue @@ -217,6 +233,7 @@ func GetPartNumByAreaId(AreaId int) map[int]int { func GetAreaIdByIndoorId(IndoorId int) int { data, err := gamedata.GetDataByIntKey(INDOOR_PROGRESS, IndoorId) if err != nil { + log.Debug("GetAreaIdByIndoorId err:%v, IndoorId=%d", err, IndoorId) return 0 } return gamedata.GetIntValue(data, "Scene") diff --git a/src/server/conf/emoji/emoji_cfg.go b/src/server/conf/emoji/emoji_cfg.go index f60995cf..9cf06c73 100644 --- a/src/server/conf/emoji/emoji_cfg.go +++ b/src/server/conf/emoji/emoji_cfg.go @@ -3,6 +3,7 @@ package emojiCfg import ( GoUtil "server/game_util" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" ) const ( @@ -16,9 +17,10 @@ func init() { func GetInitList() []int { data, err := gamedata.GetData(CFG_EMOJI) if err != nil { + log.Debug("GetInitList err:%v", err) return nil } - ret := make([]int, 0) + ret := make([]int, 0, len(data)) for k, v := range data { Init := gamedata.GetIntValue(v, "Init") if Init == 1 { @@ -31,9 +33,10 @@ func GetInitList() []int { func GetAllList() []int { data, err := gamedata.GetData(CFG_EMOJI) if err != nil { + log.Debug("GetAllList err:%v", err) return nil } - ret := make([]int, 0) + ret := make([]int, 0, len(data)) for k := range data { ret = append(ret, GoUtil.Int(k)) } @@ -43,6 +46,7 @@ func GetAllList() []int { func GetEmojiName(Id int) string { data, err := gamedata.GetDataByIntKey(CFG_EMOJI, Id) if err != nil { + log.Debug("GetEmojiName err:%v, Id=%d", err, Id) return "" } return gamedata.GetStringValue(data, "Name") diff --git a/src/server/conf/endless/endless_cfg.go b/src/server/conf/endless/endless_cfg.go index 1ab56785..de77c022 100644 --- a/src/server/conf/endless/endless_cfg.go +++ b/src/server/conf/endless/endless_cfg.go @@ -3,6 +3,7 @@ package endlessCfg import ( "server/game/mod/item" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" ) const ( @@ -15,14 +16,15 @@ func init() { gamedata.InitCfg(CFG_ENDLESS_JACKPOT) } -func GetDiamond(Money float64) float64 { +func GetEnergy(Money float64) float64 { data, err := gamedata.GetData(CFG_ENDLESS) if err != nil { + log.Debug("GetEnergy err:%v, Money=%.2f", err, Money) return 0 } for _, v := range data { if Money == gamedata.GetFloatValue(v, "Money") { - return gamedata.GetFloatValue(v, "Diamond") + return gamedata.GetFloatValue(v, "Energy") } } return 0 @@ -31,6 +33,7 @@ func GetDiamond(Money float64) float64 { func NextMoney(Money float64) float64 { data, err := gamedata.GetData(CFG_ENDLESS) if err != nil { + log.Debug("NextMoney err:%v, Money=%.2f", err, Money) return 0 } for _, v := range data { @@ -44,6 +47,7 @@ func NextMoney(Money float64) float64 { func GetChargeId(Money float64) int { data, err := gamedata.GetData(CFG_ENDLESS) if err != nil { + log.Debug("GetChargeId err:%v, Money=%.2f", err, Money) return 0 } for _, v := range data { @@ -54,27 +58,29 @@ func GetChargeId(Money float64) int { return 0 } -func GetPerDiamond(Id int) float64 { +func GetPerEnergy(Id int) float64 { data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT) if err != nil { + log.Debug("GetPerEnergy err:%v, Id=%d", err, Id) return 0 } for _, v := range data { if Id == gamedata.GetIntValue(v, "ItemId") { - return gamedata.GetFloatValue(v, "Diamond") + return gamedata.GetFloatValue(v, "Energy") } } return 0 } -func GetItemId(Diamond float64, Type, Lv int) []int { +func GetItemId(Energy float64, Type, Lv int) []int { data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT) if err != nil { + log.Debug("GetItemId err:%v, Energy=%.2f, Type=%d, Lv=%d", err, Energy, Type, Lv) return nil } - var ItemId []int + ItemId := make([]int, 0, len(data)) for _, v := range data { - if Lv >= gamedata.GetIntValue(v, "Lv") && Diamond >= gamedata.GetFloatValue(v, "Diamond") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID { + if Lv >= gamedata.GetIntValue(v, "Lv") && Energy >= gamedata.GetFloatValue(v, "Energy") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID { ItemId = append(ItemId, gamedata.GetIntValue(v, "ItemId")) } } @@ -84,6 +90,7 @@ func GetItemId(Diamond float64, Type, Lv int) []int { func GetType(ItemId int) int { data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT) if err != nil { + log.Debug("GetType err:%v, ItemId=%d", err, ItemId) return 0 } for _, v := range data { @@ -94,14 +101,15 @@ func GetType(ItemId int) int { return 0 } -func GeDiamondByItemId(ItemId int) float64 { +func GetEnergyByItemId(ItemId int) float64 { data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT) if err != nil { + log.Debug("GetEnergyByItemId err:%v, ItemId=%d", err, ItemId) return 0 } for _, v := range data { if ItemId == gamedata.GetIntValue(v, "ItemId") { - return gamedata.GetFloatValue(v, "Diamond") + return gamedata.GetFloatValue(v, "Energy") } } return 0 diff --git a/src/server/conf/face/face_cfg.go b/src/server/conf/face/face_cfg.go index 04ee72e8..c662a969 100644 --- a/src/server/conf/face/face_cfg.go +++ b/src/server/conf/face/face_cfg.go @@ -17,15 +17,19 @@ func init() { func GetInitList() []int { data, err := gamedata.GetData(CFG_FACE) if err != nil { - log.Debug("GetInitList err: %v", err) + log.Debug("GetInitList err:%v", err) return nil } - r := make([]int, 0) + r := make([]int, 0, len(data)) for k, v := range data { IsInit := gamedata.GetIntValue(v, "Init") if IsInit == 1 { - k, _ := strconv.Atoi(k) - r = append(r, k) + id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetInitList parse id err:%v, key=%s", err, k) + continue + } + r = append(r, id) } } return r @@ -34,7 +38,7 @@ func GetInitList() []int { func CheckExist(Id int) bool { data, err := gamedata.GetData(CFG_FACE) if err != nil { - log.Debug("CheckExist err: %v", err) + log.Debug("CheckExist err:%v, Id=%d", err, Id) return false } _, ok := data[strconv.Itoa(Id)] @@ -44,12 +48,16 @@ func CheckExist(Id int) bool { func GetAllId() []int { data, err := gamedata.GetData(CFG_FACE) if err != nil { - log.Debug("GetAllId err: %v", err) + log.Debug("GetAllId err:%v", err) return nil } - r := make([]int, 0) + r := make([]int, 0, len(data)) for k := range data { - Id, _ := strconv.Atoi(k) + Id, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetAllId parse id err:%v, key=%s", err, k) + continue + } r = append(r, Id) } return r diff --git a/src/server/conf/friend/friend_cfg.go b/src/server/conf/friend/friend_cfg.go index 187ff260..5c7327ae 100644 --- a/src/server/conf/friend/friend_cfg.go +++ b/src/server/conf/friend/friend_cfg.go @@ -1,19 +1,43 @@ package friendCfg -import "server/gamedata" +import ( + "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" +) const ( CFG_NPC_FRIENDS = "NPCFriends" + CFG_CONST = "FriendConst" ) func init() { gamedata.InitCfg(CFG_NPC_FRIENDS) + gamedata.InitCfg(CFG_CONST) } func IsNpcFriend(Id int) bool { _, err := gamedata.GetDataByIntKey(CFG_NPC_FRIENDS, Id) if err != nil { + log.Debug("IsNpcFriend err:%v, Id=%d", err, Id) return false } return true } + +func GetFriendSponsorNum() int { + data, err := gamedata.GetDataByKey(CFG_CONST, "friend_energy_bonus") + if err != nil { + log.Debug("GetFriendSponsorNum err:%v", err) + return 0 + } + return gamedata.GetIntValue(data, "Value") +} + +func GetFriendLimitNum() int { + data, err := gamedata.GetDataByKey(CFG_CONST, "friend_limit") + if err != nil { + log.Debug("GetFriendLimitNum err:%v", err) + return 0 + } + return gamedata.GetIntValue(data, "Value") +} diff --git a/src/server/conf/guess_color/guess_color_cfg.go b/src/server/conf/guess_color/guess_color_cfg.go index 872622a0..5c81464f 100644 --- a/src/server/conf/guess_color/guess_color_cfg.go +++ b/src/server/conf/guess_color/guess_color_cfg.go @@ -4,6 +4,7 @@ import ( "server/game/mod/item" GoUtil "server/game_util" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" "strings" ) @@ -20,11 +21,12 @@ func init() { func GetFirstPass(Id int) map[int]int { data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id) if err != nil { + log.Debug("GetFirstPass err:%v, Id=%d", err, Id) return nil } str := gamedata.GetStringValue(data, "FirstPass") arr := strings.Split(str, "|") - ret := make(map[int]int) + ret := make(map[int]int, len(arr)) for k, v := range arr { ret[k+1] = GoUtil.Int(v) } @@ -34,6 +36,7 @@ func GetFirstPass(Id int) map[int]int { func GetLoseItem(Id int) []*item.Item { data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id) if err != nil { + log.Debug("GetLoseItem err:%v, Id=%d", err, Id) return nil } return gamedata.GetItemList(data, "ItemCost") @@ -42,6 +45,7 @@ func GetLoseItem(Id int) []*item.Item { func GetFirstItem(Id int) []*item.Item { data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id) if err != nil { + log.Debug("GetFirstItem err:%v, Id=%d", err, Id) return nil } return gamedata.GetItemList(data, "FirstItem") @@ -50,6 +54,7 @@ func GetFirstItem(Id int) []*item.Item { func GetActivityItemId(Id int) int { data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id) if err != nil { + log.Debug("GetActivityItemId err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "ItemId") @@ -58,6 +63,7 @@ func GetActivityItemId(Id int) int { func GetRewardItem(Id int, Type int) []*item.Item { data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD) if err != nil { + log.Debug("GetRewardItem err:%v, Id=%d, Type=%d", err, Id, Type) return nil } for k, v := range data { @@ -76,6 +82,7 @@ func GetRewardItem(Id int, Type int) []*item.Item { func GetPassNum(Id int) int { data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD) if err != nil { + log.Debug("GetPassNum err:%v, Id=%d", err, Id) return 0 } for k, v := range data { @@ -91,6 +98,7 @@ func GetPassNum(Id int) int { func GetWinTime(Id int) int { data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD) if err != nil { + log.Debug("GetWinTime err:%v, Id=%d", err, Id) return 0 } for k, v := range data { diff --git a/src/server/conf/guide/guide_cfg.go b/src/server/conf/guide/guide_cfg.go index 3ff8d0ac..94295437 100644 --- a/src/server/conf/guide/guide_cfg.go +++ b/src/server/conf/guide/guide_cfg.go @@ -17,7 +17,7 @@ func init() { func GetGuideReward(Id int) ([]*item.Item, int) { data, err := gamedata.GetDataByIntKey(GUIDE_REWARD, Id) if err != nil { - log.Debug("GuildCfg GetGuildReward Id:%v not found", Id) + log.Debug("GetGuideReward err:%v, Id=%d", err, Id) return nil, 0 } return item.ParseItem(gamedata.GetValue(data, "Items")), gamedata.GetIntValue(data, "Num") diff --git a/src/server/conf/guide_task/guide_task_cfg.go b/src/server/conf/guide_task/guide_task_cfg.go index c0158042..f563d911 100644 --- a/src/server/conf/guide_task/guide_task_cfg.go +++ b/src/server/conf/guide_task/guide_task_cfg.go @@ -23,6 +23,7 @@ func init() { func GetTaskRewardById(Id int) []*item.Item { data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id) if err != nil { + log.Debug("GetTaskRewardById err:%v, Id=%d", err, Id) return nil } return gamedata.GetItemList(data, "Items") @@ -31,6 +32,7 @@ func GetTaskRewardById(Id int) []*item.Item { func GetTaskById(Id int) string { data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id) if err != nil { + log.Debug("GetTaskById err:%v, Id=%d", err, Id) return "" } return gamedata.GetStringValue(data, "Task") @@ -39,6 +41,7 @@ func GetTaskById(Id int) string { func GetTaskActive(Id int) int { data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id) if err != nil { + log.Debug("GetTaskActive err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "Active") @@ -46,6 +49,7 @@ func GetTaskActive(Id int) int { func GetUnlock(Id int) int { data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id) if err != nil { + log.Debug("GetUnlock err:%v, Id=%d", err, Id) return 0 } return gamedata.GetIntValue(data, "Unlock") @@ -54,6 +58,7 @@ func GetUnlock(Id int) int { func GetActiveReward(Id int) ([]*item.Item, int) { data, err := gamedata.GetDataByIntKey(GUIDE_TASK_ACTIVE, Id) if err != nil { + log.Debug("GetActiveReward err:%v, Id=%d", err, Id) return nil, 0 } return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Active") @@ -61,6 +66,7 @@ func GetActiveReward(Id int) ([]*item.Item, int) { func GetActiveReward2(reward []int, Active int) []*item.Item { data, err := gamedata.GetData(GUIDE_TASK_ACTIVE) if err != nil { + log.Debug("GetActiveReward2 err:%v, Active=%d", err, Active) return nil } for k, v := range data { @@ -79,6 +85,7 @@ func GetActiveReward2(reward []int, Active int) []*item.Item { func GetUnlockLv() int { data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "UnlockLv") if err != nil { + log.Debug("GetUnlockLv err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -87,20 +94,25 @@ func GetUnlockLv() int { func GetDays() int { data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "Days") if err != nil { + log.Debug("GetDays err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") } func GetTaskList(Lv int) map[int]string { - r := make(map[int]string) data, err := gamedata.GetData(GUIDE_TASK_TASK) if err != nil { - log.Debug("GetTaskList get data nil") - return r + log.Debug("GetTaskList err:%v, Lv=%d", err, Lv) + return nil } + r := make(map[int]string, len(data)) for k, v := range data { - k1, _ := strconv.Atoi(k) + k1, err := strconv.Atoi(k) + if err != nil { + log.Debug("GetTaskList parse id err:%v, key=%s", err, k) + continue + } r[k1] = gamedata.GetStringValue(v, "Task") } return r diff --git a/src/server/conf/guide_task/guide_task_cfg_test.go b/src/server/conf/guide_task/guide_task_cfg_test.go deleted file mode 100644 index 156e5b60..00000000 --- a/src/server/conf/guide_task/guide_task_cfg_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package GuideTaskCfg - -import ( - "fmt" - "testing" -) - -func TestGuideTaskCfg_NoPanic(t *testing.T) { - ids := []int{-1, 0, 1, 999999} - for _, id := range ids { - t.Run(fmt.Sprintf("Id=%d", id), func(t *testing.T) { - defer func() { - if r := recover(); r != nil { - t.Fatalf("unexpected panic: %v", r) - } - }() - _ = GetTaskRewardById(id) - _ = GetTaskActive(id) - _, _ = GetActiveReward(id) - }) - } - _ = GetUnlockLv() - _ = GetDays() -} - -// 以下 Example 用于文档与编译校验(无固定输出校验) - -func ExampleGetTaskRewardById() { - _ = GetTaskRewardById(1) - // Output: -} - -func ExampleGetTaskActive() { - _ = GetTaskActive(1) - // Output: -} - -func ExampleGetActiveReward() { - _, _ = GetActiveReward(1) - // Output: -} - -func ExampleGetUnlockLv() { - _ = GetUnlockLv() - // Output: -} - -func ExampleGetDays() { - _ = GetDays() - // Output: -} diff --git a/src/server/conf/handbook/handbook_cfg.go b/src/server/conf/handbook/handbook_cfg.go index d60c0819..76ddc5f6 100644 --- a/src/server/conf/handbook/handbook_cfg.go +++ b/src/server/conf/handbook/handbook_cfg.go @@ -19,7 +19,7 @@ func init() { func GetHandbookReward(Type string) []*item.Item { data, err := gamedata.GetDataByKey(CFG_HANDBOOK, Type) if err != nil { - log.Debug("GetHandbookReward err:%v", err) + log.Debug("GetHandbookReward err:%v, Type=%s", err, Type) return nil } return gamedata.GetItemList(data, "Items") diff --git a/src/server/conf/invite/invite_cfg.go b/src/server/conf/invite/invite_cfg.go index 76255d8e..da10eeb0 100644 --- a/src/server/conf/invite/invite_cfg.go +++ b/src/server/conf/invite/invite_cfg.go @@ -3,6 +3,7 @@ package inviteCfg import ( "server/game/mod/item" "server/gamedata" + "server/pkg/github.com/name5566/leaf/log" ) const ( @@ -16,8 +17,8 @@ func init() { func GetInviteReward(index int) (int, []*item.Item) { data, err := gamedata.GetDataByIntKey(CFG_INVITE, index) if err != nil { + log.Debug("GetInviteReward err:%v, index=%d", err, index) return 0, nil } return gamedata.GetIntValue(data, "Need"), gamedata.GetItemList(data, "Items") - } diff --git a/src/server/conf/item/Item_cfg.go b/src/server/conf/item/Item_cfg.go index 4ed5b607..11bf1e03 100644 --- a/src/server/conf/item/Item_cfg.go +++ b/src/server/conf/item/Item_cfg.go @@ -18,32 +18,36 @@ func init() { func GetItemType(Id int) int { data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) if err != nil { - log.Debug("ItemCfg GetItemType Id:%v not found", Id) + log.Debug("GetItemType err:%v, Id=%d", err, Id) return 0 } - return gamedata.ParseInt(data["IType"]) + return gamedata.GetIntValue(data, "IType") } func GetItemEffect(Id int) int { data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) if err != nil { - log.Debug("ItemCfg GetItemEffect Id:%v not found", Id) + log.Debug("GetItemEffect err:%v, Id=%d", err, Id) return 0 } - return gamedata.ParseInt(data["Effect"]) + return gamedata.GetIntValue(data, "Effect") } func GetItemEffectList(Id int) []int { data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) if err != nil { - log.Debug("ItemCfg GetItemEffect Id:%v not found", Id) - return []int{} + log.Debug("GetItemEffectList err:%v, Id=%d", err, Id) + return nil } - var res []int str := gamedata.GetStringValue(data, "Effect") a := strings.Split(str, ",") + res := make([]int, 0, len(a)) for _, v := range a { - b, _ := strconv.Atoi(v) + b, err := strconv.Atoi(v) + if err != nil { + log.Debug("GetItemEffectList parse err:%v, v=%s", err, v) + continue + } res = append(res, b) } return res @@ -52,8 +56,9 @@ func GetItemEffectList(Id int) []int { func GetItemName(Id int) (string, string) { data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) if err != nil { - log.Debug("ItemCfg GetItemName Id:%v not found", Id) + log.Debug("GetItemName err:%v, Id=%d", err, Id) return "", "" } - return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Name")), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Name")) + name := gamedata.GetStringValue(data, "Name") + return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, name), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, name) } diff --git a/src/server/conf/language/language_cfg.go b/src/server/conf/language/language_cfg.go index b67d268a..375526c9 100644 --- a/src/server/conf/language/language_cfg.go +++ b/src/server/conf/language/language_cfg.go @@ -27,6 +27,8 @@ func GetLanguage(lang msg.LANG_TYPE, key string) string { return gamedata.GetStringValue(data, "pt_BR") case msg.LANG_TYPE_LANG_CN: return gamedata.GetStringValue(data, "zh_CN") + case msg.LANG_TYPE_LANG_ES_LATAM: + return gamedata.GetStringValue(data, "es_LATAM") default: return key } diff --git a/src/server/conf/limited_time_event/limited_time_event_cfg.go b/src/server/conf/limited_time_event/limited_time_event_cfg.go index 51a49df7..b410aa4d 100644 --- a/src/server/conf/limited_time_event/limited_time_event_cfg.go +++ b/src/server/conf/limited_time_event/limited_time_event_cfg.go @@ -54,7 +54,7 @@ func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData { func GetEventName(Id int) string { data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT, Id) if err != nil { - log.Debug("GetEventName err:%v", err) + log.Debug("GetEventName err:%v, Id=%d", err, Id) return "" } return gamedata.GetStringValue(data, "Name") @@ -64,7 +64,7 @@ func GetEventName(Id int) string { func GetMeteorAdd(ChessLv int) int { data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv) if err != nil { - log.Debug("GetMeteorAdd err:%v", err) + log.Debug("GetMeteorAdd err:%v, ChessLv=%d", err, ChessLv) return 0 } return gamedata.GetIntValue(data, "Add") @@ -74,7 +74,7 @@ func GetMeteorAdd(ChessLv int) int { func GetChestReward(Star int) []*item.Item { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST) if err != nil { - log.Debug("GetChestReward err:%v", err) + log.Debug("GetChestReward err:%v, Star=%d", err, Star) return nil } @@ -90,16 +90,17 @@ func GetChestReward(Star int) []*item.Item { } // 获取超级订单奖励 -func GetSuperOrderReward(Star int) []*item.Item { +func GetSuperOrderReward(energy int) []*item.Item { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER) if err != nil { - log.Debug("GetSuperOrderReward err:%v", err) + log.Debug("GetSuperOrderReward err:%v, energy=%d", err, energy) return nil } + star := energy for _, v := range data { Min := gamedata.GetIntValue(v, "Min") Max := gamedata.GetIntValue(v, "Max") - if Star >= Min && Star <= Max { + if star >= Min && star <= Max { return gamedata.GetItemList(v, "Items") } } @@ -110,7 +111,7 @@ func GetSuperOrderReward(Star int) []*item.Item { func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE) if err != nil { - log.Debug("GetSceneDashReward err:%v", err) + log.Debug("GetSceneDashReward err:%v, Sence=%d, Progress=%d", err, Sence, Progress) return 0, nil } for k, v := range data { @@ -123,12 +124,12 @@ func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) { // 获取场景冲刺奖池 func GetSenceJackpotProb() map[int]int { - r := make(map[int]int) data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT) if err != nil { - log.Debug("GetSenceJackpotReward err:%v", err) + log.Debug("GetSenceJackpotProb err:%v", err) return nil } + r := make(map[int]int, len(data)) for k, v := range data { Id := GoUtil.Int(k) r[Id] = gamedata.GetIntValue(v, "Prob") @@ -140,7 +141,7 @@ func GetSenceJackpotProb() map[int]int { func GetSenceJackpotReward(Id int) []*item.Item { data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id) if err != nil { - log.Debug("GetSenceJackpotReward err:%v", err) + log.Debug("GetSenceJackpotReward err:%v, Id=%d", err, Id) return nil } return gamedata.GetItemList(data, "Items") @@ -150,7 +151,7 @@ func GetSenceJackpotReward(Id int) []*item.Item { func GetFastProduceReward(Energy int) []*item.Item { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST) if err != nil { - log.Debug("GetSceneDashReward err:%v", err) + log.Debug("GetFastProduceReward err:%v, Energy=%d", err, Energy) return nil } if len(data) == 0 { @@ -161,7 +162,7 @@ func GetFastProduceReward(Energy int) []*item.Item { Id string Energy float64 } - sortedList := make([]sortData, 0) + sortedList := make([]sortData, 0, len(data)) energy := float64(Energy) / 10.0 for k, v := range data { dataEnergy := gamedata.GetFloatValue(v, "EnergyValue") @@ -180,7 +181,7 @@ func GetFastProduceMaxTimes() int { Max := 0 data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST) if err != nil { - log.Debug("GetSceneDashReward err:%v", err) + log.Debug("GetFastProduceMaxTimes err:%v", err) return 0 } for _, v := range data { @@ -193,7 +194,7 @@ func GetFastProduceMaxTimes() int { func GetProgressMax(Lv, Num int) int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS) if err != nil { - log.Debug("GetProgressMax err:%v", err) + log.Debug("GetProgressMax err:%v, Lv=%d, Num=%d", err, Lv, Num) return 0 } for _, v := range data { @@ -215,7 +216,7 @@ func GetProgressMax(Lv, Num int) int { func GetBonusLv(Lv int) int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS) if err != nil { - log.Debug("GetProgressMax err:%v", err) + log.Debug("GetBonusLv err:%v, Lv=%d", err, Lv) return 0 } for k, v := range data { @@ -232,10 +233,10 @@ func GetBonusLv(Lv int) int { func GetProgressRewardRand(Lv int) map[int]int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT) if err != nil { - log.Debug("GetProgressRewardRand err:%v", err) + log.Debug("GetProgressRewardRand err:%v, Lv=%d", err, Lv) return nil } - r := make(map[int]int) + r := make(map[int]int, len(data)) for k, v := range data { if Lv >= gamedata.GetIntValue(v, "BonusLv") { Id := GoUtil.Int(k) @@ -248,7 +249,7 @@ func GetProgressRewardRand(Lv int) map[int]int { func GetJackpotIdByType(Type int) int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT) if err != nil { - log.Debug("GetJackpotIdByType err:%v", err) + log.Debug("GetJackpotIdByType err:%v, Type=%d", err, Type) return 0 } for k, v := range data { @@ -264,7 +265,7 @@ func GetJackpotIdByType(Type int) int { func GetProgressSelectNum(Lv int) int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS) if err != nil { - log.Debug("GetProgressMax err:%v", err) + log.Debug("GetProgressSelectNum err:%v, Lv=%d", err, Lv) return 0 } for _, v := range data { @@ -281,7 +282,7 @@ func GetProgressSelectNum(Lv int) int { func GetProgressReward(RewardId int) []*item.Item { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT) if err != nil { - log.Debug("GetProgressReward err:%v", err) + log.Debug("GetProgressReward err:%v, RewardId=%d", err, RewardId) return nil } for k, v := range data { @@ -297,7 +298,7 @@ func GetProgressReward(RewardId int) []*item.Item { func GetProgressRewardType(RewardId int) int { data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_JACKPOT, RewardId) if err != nil { - log.Debug("GetProgressReward err:%v", err) + log.Debug("GetProgressRewardType err:%v, RewardId=%d", err, RewardId) return 0 } return gamedata.GetIntValue(data, "Type") @@ -312,6 +313,15 @@ func GetUnlockLv() int { return gamedata.GetIntValue(data, "Value") } +func GetCatSaleCD() int64 { + data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Event_Cooldown_7days") + if err != nil { + log.Debug("GetCatSaleCD err:%v", err) + return 0 + } + return int64(gamedata.GetIntValue(data, "Value")) +} + func GetFirstEvent() int { data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "First_Event") if err != nil { @@ -324,7 +334,7 @@ func GetFirstEvent() int { func GetFastCD() int { data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Fast_Cd") if err != nil { - log.Debug("GetFirstEvent err:%v", err) + log.Debug("GetFastCD err:%v", err) return 0 } return gamedata.GetIntValue(data, "Value") @@ -356,7 +366,7 @@ func GetThiefProb() int { } value := gamedata.GetStringValue(data, "Value") a1 := strings.Split(value, "|") - prob := make(map[int]int) + prob := make(map[int]int, len(a1)) for _, v := range a1 { a2 := strings.Split(v, ":") prob[GoUtil.Int(a2[0])] = GoUtil.Int(a2[1]) @@ -369,7 +379,7 @@ func GetThiefProb() int { func GetMoneyCat(Id int) (float64, int) { data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_MONEY, Id) if err != nil { - log.Debug("GetMul err:%v", err) + log.Debug("GetMoneyCat err:%v, Id=%d", err, Id) return 0.0, 0 } return gamedata.GetFloatValue(data, "Mul"), gamedata.GetIntValue(data, "Cd") @@ -378,7 +388,7 @@ func GetMoneyCat(Id int) (float64, int) { func GetMoneyCatMax() int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_MONEY) if err != nil { - log.Debug("GetMul err:%v", err) + log.Debug("GetMoneyCatMax err:%v", err) return 0 } return len(data) @@ -387,14 +397,14 @@ func GetMoneyCatMax() int { func GetLuckyCatMaxEarning(Remain int) int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_LUCKY) if err != nil { - log.Debug("GetMul err:%v", err) + log.Debug("GetLuckyCatMaxEarning err:%v, Remain=%d", err, Remain) return 0 } type d struct { t int e int } - l := make([]d, 0) + l := make([]d, 0, len(data)) for k, v := range data { t := GoUtil.Int(k) e := gamedata.GetIntValue(v, "Earn") @@ -414,7 +424,7 @@ func GetLuckyCatMaxEarning(Remain int) int { func GetCatTrickType(Duartion int) int { data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CAT_TRICK) if err != nil { - log.Debug("GetCatTrick err:%v", err) + log.Debug("GetCatTrickType err:%v, Duartion=%d", err, Duartion) return 1 } for k, v := range data { @@ -429,7 +439,7 @@ func GetCatTrickType(Duartion int) int { func GetCatTrickDiamond(Type int) (int, int) { data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_CAT_TRICK, Type) if err != nil { - log.Debug("GetCatTrickDiamond err:%v", err) + log.Debug("GetCatTrickDiamond err:%v, Type=%d", err, Type) return 0, 0 } return gamedata.GetIntValue(data, "Diamond"), gamedata.GetIntValue(data, "Energy") @@ -438,7 +448,7 @@ func GetCatTrickDiamond(Type int) (int, int) { func GetDecorateOffDiscount(AreaId, StepId int) int { data, err := gamedata.GetData(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF) if err != nil { - log.Debug("GetDecorateOffDiscount err:%v", err) + log.Debug("GetDecorateOffDiscount err:%v, AreaId=%d, StepId=%d", err, AreaId, StepId) return 100 } for _, v := range data { diff --git a/src/server/conf/merge_data/merge_data_cfg.go b/src/server/conf/merge_data/merge_data_cfg.go index fa7c00fe..7b728919 100644 --- a/src/server/conf/merge_data/merge_data_cfg.go +++ b/src/server/conf/merge_data/merge_data_cfg.go @@ -67,18 +67,18 @@ func GetOne(Id int) (*gamedata.MergeDataRecord, error) { return &gamedata.MergeDataRecord{}, errors.New("not found") } return &gamedata.MergeDataRecord{ - Id: gamedata.ParseInt(data["Id"]), - Lv: gamedata.ParseInt(data["Lv"]), - MaxLv: gamedata.ParseInt(data["MaxLv"]), - SellType: gamedata.ParseString(data["SellType"]), - SellNum: gamedata.ParseInt(data["SellNum"]), - SellDiamond: gamedata.ParseInt(data["SellDiamond"]), - Color: gamedata.ParseString(data["Color"]), - Star: gamedata.ParseInt(data["Star"]), - Type: gamedata.ParseString(data["Type"]), - Emit_Product: gamedata.ParseString(data["Emit_Product"]), - CoolTime: gamedata.ParseInt(data["CoolTime"]), - Emit_Type: gamedata.ParseString(data["Emit_Type"]), + Id: gamedata.GetIntValue(data, "Id"), + Lv: gamedata.GetIntValue(data, "Lv"), + MaxLv: gamedata.GetIntValue(data, "MaxLv"), + SellType: gamedata.GetStringValue(data, "SellType"), + SellNum: gamedata.GetIntValue(data, "SellNum"), + SellDiamond: gamedata.GetIntValue(data, "SellDiamond"), + Color: gamedata.GetStringValue(data, "Color"), + Star: gamedata.GetIntValue(data, "Star"), + Type: gamedata.GetStringValue(data, "Type"), + Emit_Product: gamedata.GetStringValue(data, "Emit_Product"), + CoolTime: gamedata.GetIntValue(data, "CoolTime"), + Emit_Type: gamedata.GetStringValue(data, "Emit_Type"), }, nil } @@ -89,7 +89,7 @@ func GetStarById(Id int) int { log.Debug("MergeDataCfg GetOne Id:%v not found", Id) return 0 } - return gamedata.ParseInt(data["Star"]) + return gamedata.GetIntValue(data, "Star") } func GetNameById(Id int) string { @@ -130,7 +130,7 @@ func GetLvById(Id int) int { //log.Debug("GetLvById GetOne Id:%v not found", Id) return 0 } - return gamedata.ParseInt(data["Lv"]) + return gamedata.GetIntValue(data, "Lv") } // 根据Id获取棋子最大等级 @@ -140,7 +140,7 @@ func GetMaxLvById(Id int) int { // log.Debug("GetMaxLvById GetOne Id:%v not found", Id) return 0 } - return gamedata.ParseInt(data["MaxLv"]) + return gamedata.GetIntValue(data, "MaxLv") } // 根据Id获取棋子最大等级 @@ -150,7 +150,7 @@ func GetMaxLvByColor(Color string) int { if err != nil { return 0 } - return gamedata.ParseInt(data["MaxLv"]) + return gamedata.GetIntValue(data, "MaxLv") } // 根据Id获取发射器最小等级 @@ -204,7 +204,7 @@ func GetTypeById(Id int) string { log.Debug("GetTypeById GetOne Id:%v not found", Id) return "" } - return gamedata.ParseString(data["Type"]) + return gamedata.GetStringValue(data, "Type") } // 根据Id获取棋子类型 @@ -214,7 +214,7 @@ func GetColorById(Id int) string { log.Debug("GetColorById GetOne Id:%v not found", Id) return "" } - return gamedata.ParseString(data["Color"]) + return gamedata.GetStringValue(data, "Color") } // 根据Id获取棋子类型 @@ -234,7 +234,8 @@ func GetEmitProduceType(Id int) []string { log.Debug("GetEmitProduceType GetOne Id:%v not found", Id) return []string{} } - return strings.Split(gamedata.ParseString(data["Emit_Product"]), ",") + + return strings.Split(gamedata.GetStringValue(data, "Emit_Product"), ",") } // 根据Id获取发射器产出类型 @@ -244,7 +245,8 @@ func GetEmitProduceChessType(Id int) []string { //log.Debug("GetEmitProduceChessType GetOne Id:%v not found", Id) return []string{} } - value := gamedata.ParseString(data["Product_Type"]) + + value := gamedata.GetStringValue(data, "Product_Type") if value == "" { return []string{} } @@ -258,7 +260,8 @@ func GetEmitId(Id int) string { // log.Debug("GetEmitId GetOne Id:%v not found", Id) return "" } - return gamedata.ParseString(data["Emit_ID"]) + + return gamedata.GetStringValue(data, "Emit_ID") } func GetAllId() []int { @@ -266,7 +269,7 @@ func GetAllId() []int { if err != nil { return []int{} } - key := make([]int, 0) + key := make([]int, 0, len(data)) for k := range data { key = append(key, GoUtil.Int(k)) } @@ -279,7 +282,8 @@ func GetEmitType(Id int) string { log.Debug("GetEmitType GetOne Id:%v not found", Id) return "" } - return gamedata.ParseString(data["Emit_Type"]) + + return gamedata.GetStringValue(data, "Emit_Type") } func GetEmitN(EmitSeries string) int { @@ -298,7 +302,8 @@ func GetConst(Key string) string { log.Debug("GetConst GetOne Id:%s not found", Key) return "" } - return gamedata.ParseString(data["Value"]) + + return gamedata.GetStringValue(data, "Value") } // 获取常量 @@ -308,7 +313,7 @@ func GetConstInt(Key string) int { log.Debug("GetConst GetOne Id:%s not found", Key) return 0 } - return gamedata.ParseInt(data["Value"]) + return gamedata.GetIntValue(data, "Value") } func GetExtraEmitId() map[string]struct{} { @@ -339,7 +344,8 @@ func GetSourceChestItem() []*item.Item { log.Debug("GetSourceChestItem GetOne not found") return nil } - Str := gamedata.ParseString(data["Value"]) + + Str := gamedata.GetStringValue(data, "Value") A1 := strings.Split(Str, "|") var r []*item.Item if len(A1) < 2 { @@ -363,7 +369,7 @@ func GetHighSourceChestItem() []*item.Item { log.Debug("GetHighSourceChestItem GetOne not found") return nil } - Str := gamedata.ParseString(data["Value"]) + Str := gamedata.GetStringValue(data, "Value") A1 := strings.Split(Str, "|") var r []*item.Item if len(A1) < 2 { diff --git a/src/server/conf/mining/mining_cfg.go b/src/server/conf/mining/mining_cfg.go index c1a90bba..3e4d3784 100644 --- a/src/server/conf/mining/mining_cfg.go +++ b/src/server/conf/mining/mining_cfg.go @@ -65,7 +65,7 @@ func GetPassGem(Id int) []int { } Gem := gamedata.GetStringValue(data, "Gem") strArr := strings.Split(Gem, "|") - result := make([]int, 0) + result := make([]int, 0, len(strArr)) for _, v := range strArr { a, _ := strconv.Atoi(v) result = append(result, a) diff --git a/src/server/conf/order/order_cfg.go b/src/server/conf/order/order_cfg.go index 85f90e49..80101af2 100644 --- a/src/server/conf/order/order_cfg.go +++ b/src/server/conf/order/order_cfg.go @@ -103,11 +103,11 @@ func GetStartOrderInfo(Id int) (int, int) { } func GetStartOrderList() []*gamedata.StartOrderData { - ret := make([]*gamedata.StartOrderData, 0) data, err := gamedata.GetData(CFG_START_ORDER) if err != nil { - return ret + return []*gamedata.StartOrderData{} } + ret := make([]*gamedata.StartOrderData, 0, len(data)) for k, v := range data { OrderId, _ := strconv.Atoi(k) ret = append(ret, &gamedata.StartOrderData{ @@ -127,11 +127,11 @@ func GetStartOrderList() []*gamedata.StartOrderData { } func GetStartOrderByStep(id int) []*gamedata.StartOrderData { - ret := make([]*gamedata.StartOrderData, 0) data, err := gamedata.GetData(CFG_START_ORDER) if err != nil { - return ret + return []*gamedata.StartOrderData{} } + ret := make([]*gamedata.StartOrderData, len(data)) for k, v := range data { stepVal := gamedata.GetIntValue(v, "step") if int(stepVal) == id { diff --git a/src/server/conf/pass/pass_cfg.go b/src/server/conf/pass/pass_cfg.go index a57f1252..c09adf34 100644 --- a/src/server/conf/pass/pass_cfg.go +++ b/src/server/conf/pass/pass_cfg.go @@ -53,7 +53,7 @@ func GetNewLevel(Template int, Score int, Reward []int) []int { if err != nil { return nil } - NewReward := make([]int, 0) + NewReward := make([]int, 0, len(data)) for _, v := range data { if gamedata.GetIntValue(v, "Template") != Template { continue @@ -72,7 +72,7 @@ func GetFreeChargeItems(Template int, Reward []int) []*item.Item { if err != nil { return nil } - Items := make([]*item.Item, 0) + Items := make([]*item.Item, 0, len(data)) for _, v := range data { if gamedata.GetIntValue(v, "Template") != Template { continue @@ -90,7 +90,7 @@ func GetLowChargeItems(Template int, Reward []int) []*item.Item { if err != nil { return nil } - Items := make([]*item.Item, 0) + Items := make([]*item.Item, 0, len(data)) for _, v := range data { if gamedata.GetIntValue(v, "Template") != Template { continue @@ -108,7 +108,7 @@ func GetHighChargeItems(Template int, Reward []int) []*item.Item { if err != nil { return nil } - Items := make([]*item.Item, 0) + Items := make([]*item.Item, 0, len(data)) for _, v := range data { if gamedata.GetIntValue(v, "Template") != Template { continue diff --git a/src/server/conf/playroom/playroom_cfg.go b/src/server/conf/playroom/playroom_cfg.go index 89d30a00..257a86bb 100644 --- a/src/server/conf/playroom/playroom_cfg.go +++ b/src/server/conf/playroom/playroom_cfg.go @@ -126,11 +126,11 @@ func GetTriggerCd() int { } func GetFoodItem() []int { - r := make([]int, 0) data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Food") if err != nil { return []int{} } + r := make([]int, 0, len(data)) for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") { if v == "" { continue @@ -142,11 +142,11 @@ func GetFoodItem() []int { } func GetCleanItem() []int { - r := make([]int, 0) data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Clean") if err != nil { return []int{} } + r := make([]int, 0, len(data)) for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") { if v == "" { continue @@ -157,11 +157,11 @@ func GetCleanItem() []int { return r } func GetToyItem() []int { - r := make([]int, 0) data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Toy") if err != nil { return []int{} } + r := make([]int, 0, len(data)) for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") { if v == "" { continue @@ -172,11 +172,11 @@ func GetToyItem() []int { return r } func GetDailyItem() []int { - r := make([]int, 0) data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Daily") if err != nil { return []int{} } + r := make([]int, 0, len(data)) for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") { if v == "" { continue @@ -188,11 +188,11 @@ func GetDailyItem() []int { } func GetPremiumItem() []int { - r := make([]int, 0) data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PremiumItem") if err != nil { return []int{} } + r := make([]int, 0, len(data)) for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") { if v == "" { continue @@ -278,11 +278,11 @@ func GetInteractPExp(Id int) int { } func GetInitDecorate() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k, v := range data { if gamedata.GetIntValue(v, "Init") == 1 { r = append(r, GoUtil.Int(k)) @@ -292,11 +292,11 @@ func GetInitDecorate() []int { } func GetDecorateList() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k := range data { r = append(r, GoUtil.Int(k)) } @@ -339,11 +339,11 @@ func GetPhysiologyDuration(Id int, Num int) int { } func GetPhysiologyTypeList() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k := range data { r = append(r, GoUtil.Int(k)) } @@ -401,11 +401,11 @@ func IsPlayCat(Id int) bool { } func GetInitAirList() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_AIR) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k, v := range data { if gamedata.GetIntValue(v, "Init") == 1 { r = append(r, GoUtil.Int(k)) @@ -415,11 +415,11 @@ func GetInitAirList() []int { } func GetAirList() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_AIR) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k := range data { r = append(r, GoUtil.Int(k)) } @@ -427,11 +427,11 @@ func GetAirList() []int { } func GetInitDressList() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_DRESS) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k, v := range data { if gamedata.GetIntValue(v, "Init") == 1 { r = append(r, GoUtil.Int(k)) @@ -441,11 +441,11 @@ func GetInitDressList() []int { } func GetDressList() []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_DRESS) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k := range data { r = append(r, GoUtil.Int(k)) } @@ -490,7 +490,7 @@ func GetDailyTask(Type int) map[int]string { return nil } r := make(map[int]string) - r1 := make([]int, 0) + r1 := make([]int, 0, len(data)) r2 := make(map[int]string) for k, v := range data { if gamedata.GetIntValue(v, "Type") == Type { @@ -499,7 +499,14 @@ func GetDailyTask(Type int) map[int]string { r1 = append(r1, k1) } } - r3 := GoUtil.RandSliceNum(r1, 6) + daily_group_num := 0 + switch Type { + case 1: + daily_group_num = GetPlayroomTaskDailyNum1() + case 2: + daily_group_num = GetPlayroomTaskDailyNum2() + } + r3 := GoUtil.RandSliceNum(r1, daily_group_num) for _, v := range r3 { r2[v] = r[v] } @@ -548,11 +555,11 @@ func GetTaskJackpotReward(Id int) []*item.Item { } func GetPhysiologyList(MoodType int) []int { - r := make([]int, 0) data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE) if err != nil { return []int{} } + r := make([]int, 0, len(data)) for k, v := range data { if gamedata.GetIntValue(v, "MType") == MoodType { r = append(r, GoUtil.Int(k)) @@ -565,47 +572,6 @@ func GetInteractIdBath() []int { return []int{11, 12, 13} } -func GetOrderItem(Star int) map[int][]gamedata.PetOrderItem { - data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM) - if err != nil { - log.Debug("GetOrderItem err:%v", err) - return nil - } - r := make(map[int][]gamedata.PetOrderItem) - for k, v := range data { - ItemStar := gamedata.GetIntValue(v, "Star") - if ItemStar > 0 && ItemStar > Star { - continue - } - Id := GoUtil.Int(k) - Type := gamedata.GetIntValue(v, "Type") - if Type == 0 { - continue - } - if _, ok := r[Type]; !ok { - r[Type] = make([]gamedata.PetOrderItem, 0) - } - if Id == 0 { - log.Debug("GetOrderItem Id is 0, Type:%v", Type) - continue - } - GradeStr := gamedata.GetStringValue(v, "Grade") - Grade := make([]int, 0) - for _, v1 := range strings.Split(GradeStr, ",") { - v2 := GoUtil.Int(v1) - if v2 > 0 { - Grade = append(Grade, v2) - } - } - r[Type] = append(r[Type], gamedata.PetOrderItem{ - Id: Id, - Star: ItemStar, - Grade: Grade, - }) - } - return r -} - func GetOrderItemByGrade(Grade int) map[int][]int { data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM) if err != nil { @@ -648,7 +614,7 @@ func GetOrderItemList() []int { log.Debug("GetOrderItemList err:%v", err) return nil } - r := make([]int, 0) + r := make([]int, 0, len(data)) for k := range data { Id := GoUtil.Int(k) if Id == 0 { @@ -706,7 +672,7 @@ func GetDailyTaskListById(Id int) []int { return nil } Type := GetDailyTaskType(Id) - r := make([]int, 0) + r := make([]int, 0, len(data)) for k, v := range data { if gamedata.GetIntValue(v, "Type") == Type { r = append(r, GoUtil.Int(k)) @@ -736,3 +702,21 @@ func GetItemAddPhysiology(Item map[int]int) int { } return r } + +func GetPlayroomTaskDailyNum1() int { + data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum1") + if err != nil { + log.Debug("GetPlayroomTaskDailyNum1 err:%v", err) + return 0 + } + return gamedata.GetIntValue(data, "Value") +} + +func GetPlayroomTaskDailyNum2() int { + data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum2") + if err != nil { + log.Debug("GetPlayroomTaskDailyNum2 err:%v", err) + return 0 + } + return gamedata.GetIntValue(data, "Value") +} diff --git a/src/server/conf/start_merge/start_merge_cfg.go b/src/server/conf/start_merge/start_merge_cfg.go index c301f5a3..252f5389 100644 --- a/src/server/conf/start_merge/start_merge_cfg.go +++ b/src/server/conf/start_merge/start_merge_cfg.go @@ -18,7 +18,7 @@ func GetStartChessList() []int { var ChessList []int for _, v := range data { v1 := v.(map[string]interface{}) - ChessList = append(ChessList, gamedata.ParseInt(v1["MergeId"])) + ChessList = append(ChessList, gamedata.GetIntValue(v1, "MergeId")) } return ChessList } diff --git a/src/server/db/Mysql.go b/src/server/db/Mysql.go index 0b870d1d..efe556ae 100644 --- a/src/server/db/Mysql.go +++ b/src/server/db/Mysql.go @@ -151,61 +151,6 @@ func SeriesTransaction(sqlstrs []string, params [][]any) (err error) { return } -// 更新数据 -func FormatUpdateOneAttrRow(u interface{}, tableName string, UpdateAttr string, Exclude string) (err error) { - t := reflect.TypeOf(u) - len1 := t.Elem().NumField() - Fields := make([]string, len1) - Values := make([]interface{}, len1) - pp := reflect.ValueOf(u) - origin := "UPDATE " + tableName + " SET " - index := 0 - var keyValue interface{} - for i := 0; i < len1; i++ { - field := t.Elem().Field(i) - if field.Tag.Get("db") != Exclude { - if field.Tag.Get("db") == UpdateAttr { - Fields[index] = field.Tag.Get("db") + " = ?" - - ufield := pp.Elem().FieldByName(field.Name) - k := ufield.Kind() - if k == reflect.String { - Values[index] = ufield.String() - } - if k == reflect.Int32 { - Values[index] = ufield.Int() - } - index++ - } - - } else { - - ufield := pp.Elem().FieldByName(field.Name) - k := ufield.Kind() - if k == reflect.String { - keyValue = ufield.String() - } - if k == reflect.Int32 { - keyValue = ufield.Int() - } - } - } - Values[index] = keyValue - // Values = append(Values, keyValue) - origin += strings.Join(Fields, ",") - strLen := len(origin) - origin = origin[:strLen-1] - origin = origin + " WHERE " + Exclude + " = ?" - sqlStr := origin - _, err = SqlDb.Exec(sqlStr, Values...) - if err != nil { - log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) - return - } - - return -} - // "UPDATE user SET age = ?, degree = ? WHERE id = ?" func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) { t := reflect.TypeOf(u) @@ -381,52 +326,6 @@ func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) { return } -func FormatAllMemLoadDb(u interface{}, tableName string, Exclude string) (err error) { - t := reflect.TypeOf(u) - len := t.Elem().NumField() - Fields := make([]string, len) - Values := make([]interface{}, len) - pp := reflect.ValueOf(u) - origin := "SELECT * FROM " + tableName + " WHERE " - index := 0 - var keyValue interface{} - for i := 0; i < len; i++ { - field := t.Elem().Field(i) - if field.Tag.Get("db") != Exclude { - Fields[index] = field.Tag.Get("db") + " = ?" - - ufield := pp.Elem().FieldByName(field.Name) - k := ufield.Kind() - if k == reflect.String { - Values[index] = ufield.String() - } - if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { - Values[index] = ufield.Int() - } - index++ - } else { - - ufield := pp.Elem().FieldByName(field.Name) - k := ufield.Kind() - if k == reflect.String { - keyValue = ufield.String() - } - if k == reflect.Int32 { - keyValue = ufield.Int() - } - } - } - Values[index] = keyValue - // Values = append(Values, keyValue) - origin += strings.Join(Fields, " AND ") - sqlStr := origin - if err := SqlDb.Get(u, sqlStr, Values...); err != nil { - log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) - return err - } - return -} - func GetServerData(d interface{}, Key string) (err error) { sqlDb := GetDB() if sqlDb == nil { @@ -487,103 +386,6 @@ func GetPlayerClientData(d interface{}, Key string) (err error) { return } -func InsertData(u interface{}, tableName string) (insertID int64, err error) { - t := reflect.TypeOf(u) - len := t.Elem().NumField() - Fields := make([]string, 0) - Fields1 := make([]string, 0) - Values := make([]interface{}, 0) - pp := reflect.ValueOf(u) - origin := "INSERT INTO " + tableName + "(" - for i := 0; i < len; i++ { - field := t.Elem().Field(i) - if field.Tag.Get("db") == "id" { - continue - } - - ufield := pp.Elem().FieldByName(field.Name) - k := ufield.Kind() - if k == reflect.String && ufield.String() == "" { - continue - } - if (k == reflect.Int32 || k == reflect.Int || k == reflect.Int64) && ufield.Int() == 0 { - continue - } - - if k == reflect.String { - Values = append(Values, ufield.String()) - } - if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { - Values = append(Values, ufield.Int()) - } - Fields = append(Fields, field.Tag.Get("db")) - Fields1 = append(Fields1, "?") - } - for i := range Fields { - Fields[i] = "`" + Fields[i] + "`" - } - origin += strings.Join(Fields, ",") - origin += ") VALUES(" - origin += strings.Join(Fields1, ",") - origin += ")" - sqlStr := origin - result, err := SqlDb.Exec(sqlStr, Values...) - if err != nil { - log.Debug("InsertData exec failed, sql : %s ;err:%v\n", sqlStr, err) - return - } - insertID, err = result.LastInsertId() - if err != nil { - log.Debug("InsertData exec failed, err:%v\n", err) - return - } - return -} - -func UpdateData(u interface{}, tableName string, Exclude string) (err error) { - t := reflect.TypeOf(u) - len1 := t.Elem().NumField() - Fields := make([]string, 0) - Values := make([]interface{}, 0) - pp := reflect.ValueOf(u) - origin := "UPDATE " + tableName + " SET " - var ExcludeValue interface{} - for i := 0; i < len1; i++ { - field := t.Elem().Field(i) - ufield := pp.Elem().FieldByName(field.Name) - k := ufield.Kind() - if field.Tag.Get("db") != Exclude && field.Tag.Get("db") != "id" { - - if k == reflect.String { - Values = append(Values, ufield.String()) - } - if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { - Values = append(Values, ufield.Int()) - } - Fields = append(Fields, "`"+field.Tag.Get("db")+"` = ?") - } - if field.Tag.Get("db") == Exclude { - if k == reflect.String { - ExcludeValue = ufield.String() - } - if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { - ExcludeValue = append(Values, ufield.Int()) - } - } - } - Values = append(Values, ExcludeValue) - origin += strings.Join(Fields, ",") - origin = origin + " WHERE `" + Exclude + "` = ?" - sqlStr := origin - - _, err = SqlDb.Exec(sqlStr, Values...) - if err != nil { - log.Debug("update failed, sql %s err:%v\n", sqlStr, err) - return - } - return -} - func GetServerMailData(data *[]*SqlServerMailStruct) error { sql := "select * from system_mail_info" err := SqlDb.Select(data, sql) @@ -630,3 +432,13 @@ func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) { err := SqlDb.Select(data, sql, "%"+key+"%") return *data, err } + +func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) { + sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? AND logout_time > ? AND level >= ? ORDER BY logout_time DESC LIMIT 1000" + var res []int + if err := SqlDb.Select(&res, sqlStr, uid, login, level); err != nil { + log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err) + return nil, err + } + return res, nil +} diff --git a/src/server/db/SqlStruct.go b/src/server/db/SqlStruct.go index 4d0ece3a..9bd732f7 100644 --- a/src/server/db/SqlStruct.go +++ b/src/server/db/SqlStruct.go @@ -474,24 +474,27 @@ type SqlServerModStruct struct { } type SqlServerMailStruct struct { - Id int `db:"mail_id"` - Title string `db:"title"` - Content string `db:"content"` - SubTitle string `db:"subTitle"` - SubTitleEn string `db:"subTitle_en"` - TitleEn string `db:"title_en"` - ContentEn string `db:"content_en"` - TitlePtBr string `db:"title_ptbr"` - SubTitlePtBr string `db:"subTitle_ptbr"` - ContentPtBr string `db:"content_ptbr"` - Items string `db:"items"` - Start_time int64 `db:"start_time"` - Register_time int64 `db:"register_time"` - End_time int64 `db:"end_time"` - Mail_type int `db:"mail_type"` - Send_type int `db:"send_type"` - To_uids string `db:"to_uids"` - CreateTime int64 `db:"create_time"` + Id int `db:"mail_id"` + Title string `db:"title"` + Content string `db:"content"` + SubTitle string `db:"subTitle"` + SubTitleEn string `db:"subTitle_en"` + TitleEn string `db:"title_en"` + ContentEn string `db:"content_en"` + TitlePtBr string `db:"title_ptbr"` + SubTitlePtBr string `db:"subTitle_ptbr"` + ContentPtBr string `db:"content_ptbr"` + TitleEsLatam string `db:"title_es_latam"` + SubTitleEsLatam string `db:"subTitle_es_latam"` + ContentEsLatam string `db:"content_es_latam"` + Items string `db:"items"` + Start_time int64 `db:"start_time"` + Register_time int64 `db:"register_time"` + End_time int64 `db:"end_time"` + Mail_type int `db:"mail_type"` + Send_type int `db:"send_type"` + To_uids string `db:"to_uids"` + CreateTime int64 `db:"create_time"` } type SqlChargeOrderStruct struct { diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index e9732de5..ecfe93db 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -429,6 +429,14 @@ func (ad *GameLogic) GetResFriendPlayerByUid(Id int) *msg.ResFriendPlayerSimple return nil } } + last := &msg.ActLog{} + if player.ActLog != nil { + last = &msg.ActLog{ + Type: int32(player.ActLog.Type), + Time: player.ActLog.Time, + Param: player.ActLog.Param, + } + } return &msg.ResFriendPlayerSimple{ Uid: int64(player.Uid), Name: player.Name, @@ -444,6 +452,7 @@ func (ad *GameLogic) GetResFriendPlayerByUid(Id int) *msg.ResFriendPlayerSimple DressSet: GoUtil.MapIntToInt32(player.DressSet), Friend: GoUtil.IntToInt32(player.Friend), Physiology: GoUtil.MapIntToInt32(player.Physiology), + Last: last, PetName: player.PetName, } } @@ -463,7 +472,6 @@ func G_getGameLogic() *GameLogic { G_GameLogicPtr.RegisterEvent() // 注册事件 G_GameLogicPtr.RegisterNetWorkFunc() // 注册客户端接口 G_GameLogicPtr.InitActivity() // 初始化活动 - G_GameLogicPtr.GetVersion() // 获取版本号 if conf.Server.ServerType == "center" { G_GameLogicPtr.CreateFriendMgr() //创建好友管理器 G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器 @@ -492,28 +500,6 @@ func (ad *GameLogic) InitServerInfo() { ad.SeverInfo = ServerInfo } -func (ad *GameLogic) GetVersion() { - sqlStr := "SELECT * FROM t_gameserver WHERE id = ?" - sqlStruck := db.SqlVersionStruct{} - IsHaveDataDb := false - sqlStruck.Id = 1 - G_GameLogicPtr.Version = 0 - if err := db.SqlDb.Get(&sqlStruck, sqlStr, 1); err != nil { - G_GameLogicPtr.Version = 1 - IsHaveDataDb = false - } else { - G_GameLogicPtr.Version = sqlStruck.IsClose + 1 - IsHaveDataDb = true - } - sqlStruck.IsClose = G_GameLogicPtr.Version - - if IsHaveDataDb { - db.FormatAllMemUpdateDb(&sqlStruck, "t_gameserver", "id") - } else { - db.FormatAllMemInsertDb(&sqlStruck, "t_gameserver") - } -} - func (ad *GameLogic) SendServerVersion(a gate.Agent) { res := &msg.ResServerVersion{} res.Version = G_GameLogicPtr.Version @@ -748,7 +734,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() { RegisterMsgProcessFunc("ReqFriendTimeLine", ReqFriendTimeLine) // 请求好友时间线 RegisterMsgProcessFunc("ReqFriendRecommend", ReqFriendRecommend) // 获取推荐好友 RegisterMsgProcessFunc("ReqFriendTLUpvote", ReqFriendTLUpvote) // 请求时间线点赞 - RegisterMsgProcessFunc("ReqFriendTReward", ReqFriendTReward) // 请求时间线点赞 + RegisterMsgProcessFunc("ReqFriendTReward", ReqFriendTReward) // 获取时间线奖励 RegisterMsgProcessFunc("ReqAddNpc", ReqAddNpc) // 增加npc RegisterMsgProcessFunc("ReqWishApply", ReqWishApply) // 同意好友心愿单请求 RegisterMsgProcessFunc("ReqFriendByCode", ReqFriendByCode) // 根据邀请码查询好友 @@ -861,7 +847,6 @@ func (ad *GameLogic) RegisterNetWorkFunc() { RegisterMsgProcessFunc("ReqFriendTreasureEnd", ReqFriendTreasureEnd) // 结束游戏 // #region 充值 - RegisterMsgProcessFunc("ReqKafkaLog", ReqKafkaLog) // 客户端日志 RegisterMsgProcessFunc("ReqCreateOrderSn", ReqCreateOrderSn) // 创建订单号 RegisterMsgProcessFunc("ReqShippingOrder", ReqShippingOrder) // 获取订单号 RegisterMsgProcessFunc("ReqChargeReceive", ReqChargeReceive) // 礼包回复邮件 diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 28360eeb..bfe66951 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -221,7 +221,7 @@ func (p *Player) GuessColorBackData() { Status := p.GetActivityStatus(activity.ACT_TYPE_GUESS_COLOR) GuessColorMod := p.PlayMod.getGuessColorMod() - MapList := make([]*msg.GuessColorInfo, 0) + MapList := make([]*msg.GuessColorInfo, 0, len(GuessColorMod.MapList)) for _, v := range GuessColorMod.MapList { MapList = append(MapList, &msg.GuessColorInfo{ Map: v, @@ -252,7 +252,7 @@ func (p *Player) RaceBackData() { } Status := p.GetActivityStatus(activity.ACT_TYPE_RACE) RaceMod := p.PlayMod.getRaceMod() - Opponent := make([]*msg.Raceopponent, 0) + Opponent := make([]*msg.Raceopponent, 0, len(RaceMod.Opponent)) for _, v := range RaceMod.Opponent { Opponent = append(Opponent, &msg.Raceopponent{ Id: int32(v.Id), @@ -352,7 +352,7 @@ func (p *Player) CatnipBackData() { return } FriendMod := p.PlayMod.getFriendMod() - GameList := make([]*msg.CatnipGame, 0) + GameList := make([]*msg.CatnipGame, 0, len(CatnipMod.Game)) for _, v := range CatnipMod.Game { GameInfo := &msg.CatnipGame{ Id: int32(v.Id), @@ -373,7 +373,6 @@ func (p *Player) CatnipBackData() { GameList = append(GameList, GameInfo) } tmpData := make(map[int]*msg.CatnipInvite) - InviteList := make([]*msg.CatnipInvite, 0) for uid, info := range CatnipMod.InviteList { tmpData[uid] = &msg.CatnipInvite{ Uid: int64(uid), @@ -410,6 +409,7 @@ func (p *Player) CatnipBackData() { invite.Type = 4 // 已参与游戏的好友不显示邀请 } } + InviteList := make([]*msg.CatnipInvite, 0, len(tmpData)) for _, v := range tmpData { ResPlayerSimple := G_getGameLogic().GetResSimplePlayerByUid(int(v.Uid)) if ResPlayerSimple != nil { diff --git a/src/server/game/admin.go b/src/server/game/admin.go index be4b5acf..de5e0d8b 100644 --- a/src/server/game/admin.go +++ b/src/server/game/admin.go @@ -166,6 +166,7 @@ func AdminPlayerInfo(args []interface{}) error { res["AreaId"] = player.PlayMod.getDecorateMod().GetAreaId() res["Face"] = player.PlayMod.getFaceMod().SetId res["Charge"] = player.PlayMod.getChargeMod().Charge + res["MaxCharge"] = player.PlayMod.getChargeMod().MaxCharge res["Level"] = player.GetPlayerBaseMod().GetLevel() res["Diamond"] = player.GetPlayerBaseMod().GetDiamond() res["Star"] = player.GetPlayerBaseMod().GetStar() @@ -185,6 +186,31 @@ func AdminPlayerInfo(args []interface{}) error { res["Code"] = player.PlayMod.getBaseMod().AddCode res["ChessMap"] = player.PlayMod.getChessMod().ChessMap res["ActLog"] = player.PlayMod.getFriendMod().ActivityLog + friendList := player.PlayMod.getFriendMod().NewFriendList + type friendInfo struct { + Uid int64 + NickName string + Avatar int + Level int + LogoutTime int64 + LoginTime int64 + } + resFriendList := make([]friendInfo, 0, len(friendList)) + for v := range friendList { + ps := G_GameLogicPtr.GetSimplePlayerByUid(v) + if ps == nil { + continue + } + resFriendList = append(resFriendList, friendInfo{ + Uid: int64(v), + NickName: ps.Name, + Avatar: ps.Face, + Level: ps.Level, + LogoutTime: ps.Loginout, + LoginTime: ps.Login, + }) + } + res["FriendList"] = resFriendList OrderMap := make(map[int]interface{}) Index := 0 for k, v := range player.PlayMod.getOrderMod().OrderList { diff --git a/src/server/game/champship_mgr.go b/src/server/game/champship_mgr.go index d54fbed9..d133aab3 100644 --- a/src/server/game/champship_mgr.go +++ b/src/server/game/champship_mgr.go @@ -1,14 +1,17 @@ package game import ( + "fmt" "math" champshipCfg "server/conf/champship" randnameCfg "server/conf/randname" + "server/db" "server/game/mod/msg" GoUtil "server/game_util" proto "server/msg" "server/pkg/github.com/name5566/leaf/log" "sort" + "sync" "time" ) @@ -21,6 +24,7 @@ type ChampshipMgr struct { } type ChampshipData struct { + mu sync.RWMutex AutoId int RobotId int Rank map[int][]*ChampshipRank // 锦标赛排行榜 @@ -112,41 +116,82 @@ func (c *ChampshipMgr) NotifyAll() (interface{}, error) { func (c *ChampshipMgr) ZeroUpdate() (interface{}, error) { log.Debug("ChampshipMgr ZeroUpdate") - c.getData().ZeroTime = GoUtil.ZeroTimestamp() - c.getData().PreRank = c.getData().Rank - c.getData().PreRobot = c.getData().Robot - c.getData().PreGroupInfo = c.getData().GroupInfo - c.getData().AutoId = 0 - c.getData().RobotId = 1 - c.getData().Robot = make(map[int]*ChampshipRobot, 0) - c.getData().Rank = make(map[int][]*ChampshipRank, 0) - c.getData().GroupInfo = make(map[int]int, 0) + data := c.getData() + data.mu.Lock() + data.ZeroTime = GoUtil.ZeroTimestamp() + // 深拷贝 map,避免多个协程持有同一个 map 引用导致并发读写 + oldRank := make(map[int][]*ChampshipRank, len(data.Rank)) + for k, v := range data.Rank { + oldRank[k] = v + } + oldRobot := make(map[int]*ChampshipRobot, len(data.Robot)) + for k, v := range data.Robot { + oldRobot[k] = v + } + oldGroupInfo := make(map[int]int, len(data.GroupInfo)) + for k, v := range data.GroupInfo { + oldGroupInfo[k] = v + } + + data.PreRank = oldRank + data.PreRobot = oldRobot + data.PreGroupInfo = oldGroupInfo + data.AutoId = 0 + data.RobotId = 1 + data.Robot = make(map[int]*ChampshipRobot, 0) + data.Rank = make(map[int][]*ChampshipRank, 0) + data.GroupInfo = make(map[int]int, 0) c.update = true + // 0点更新排行榜缓存 + for k := range data.PreGroupInfo { + c.SetRankCache(k) + } + data.mu.Unlock() + c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { c.ZeroUpdate() }) - c.NotifyPlayer() c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { c.NotifyAll() }) + // 在锁外通知玩家,避免在持有锁时调用外部函数 + go c.NotifyPlayer() return nil, nil } func (c *ChampshipMgr) NotifyPlayer() { - List := c.getData().PreRank - for _, v := range List { - for i := 0; i < 3; i++ { + data := c.getData() + data.mu.RLock() + // 深拷贝需要通知的数据,避免在锁外访问 map + notifyList := make([]struct { + Uid int + Rank int + }, 0) + for _, v := range data.PreRank { + for i := 0; i < 3 && i < len(v); i++ { if v[i].Type == RANK_PLAYER_ROBOT { continue } - NotifyChampshipResult(v[i].Uid, i+1) + notifyList = append(notifyList, struct { + Uid int + Rank int + }{Uid: v[i].Uid, Rank: i + 1}) } } + data.mu.RUnlock() + + // 在锁外通知,避免持锁时间过长 + for _, item := range notifyList { + NotifyChampshipResult(item.Uid, item.Rank) + } } func (c *ChampshipMgr) ai() (interface{}, error) { ChampshipData := c.getData() + ChampshipData.mu.Lock() + defer ChampshipData.mu.Unlock() Now := GoUtil.Now() + uids := make(map[int]struct{}) for k, v := range ChampshipData.Rank { Notify := make(map[int]int) for e, r := range v { @@ -183,20 +228,30 @@ func (c *ChampshipMgr) ai() (interface{}, error) { continue } if Notify[r.Uid] != e { - NotifyPlayer(r.Uid, &msg.Msg{ - Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, - }) + c.SetRankCache(r.Uid) + uids[r.Uid] = struct{}{} } } ChampshipData.Rank[k] = v } + + // 在锁外通知玩家,避免在持锁时启动 goroutine 访问可能被并发修改的数据 + for uid := range uids { + go NotifyPlayer(uid, &msg.Msg{ + Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, + }) + } + c.mDispatr.AfterFunc(time.Duration(60)*time.Second, func() { c.ai() }) return nil, nil } + func (c *ChampshipMgr) GetPreRankMsg(Uid int) *proto.ResChampshipPreRank { ChampshipData := c.getData() + ChampshipData.mu.RLock() + defer ChampshipData.mu.RUnlock() GroupId := ChampshipData.PreGroupInfo[Uid] if GroupId == 0 { return &proto.ResChampshipPreRank{} @@ -253,6 +308,8 @@ func (c *ChampshipMgr) GetPreRankMsg(Uid int) *proto.ResChampshipPreRank { // TODO 待优化 func (c *ChampshipMgr) GetRankMsg(Uid int) *proto.ResChampshipRank { ChampshipData := c.getData() + ChampshipData.mu.RLock() + defer ChampshipData.mu.RUnlock() GroupId := ChampshipData.GroupInfo[Uid] if GroupId == 0 { return &proto.ResChampshipRank{} @@ -316,6 +373,8 @@ func (c *ChampshipMgr) group() (interface{}, error) { return nil, nil } ChampshipData := c.getData() + ChampshipData.mu.Lock() + defer ChampshipData.mu.Unlock() if len(ChampshipData.Pool) == 0 { // 未分配玩家池为空 return nil, nil } @@ -341,8 +400,16 @@ func (c *ChampshipMgr) group() (interface{}, error) { if len(g[i]) == 0 { continue } + // 少于10个的元素合并到下一组 if len(g[i]) < 10 && i > 1 { g[i-1] = append(g[i-1], g[i]...) + continue + } + // 不被10整除的元素分到下一组 + if len(g[i])%10 != 0 && i > 1 { + remainder := len(g[i]) % 10 + g[i-1] = append(g[i-1], g[i][len(g[i])-remainder:]...) + g[i] = g[i][:len(g[i])-remainder] } ChampshipData.AutoId++ StartId := ChampshipData.AutoId @@ -354,14 +421,6 @@ func (c *ChampshipMgr) group() (interface{}, error) { Score: UserData.Score, Time: UserData.Time, }) - sort.Slice(ChampshipData.Rank[ChampshipData.AutoId], func(i, j int) bool { // 排序 从大到小 数值相等按时间排序 - if ChampshipData.Rank[ChampshipData.AutoId][i].Score > ChampshipData.Rank[ChampshipData.AutoId][j].Score { - return true - } else if ChampshipData.Rank[ChampshipData.AutoId][i].Score == ChampshipData.Rank[ChampshipData.AutoId][j].Score { - return ChampshipData.Rank[ChampshipData.AutoId][i].Time < ChampshipData.Rank[ChampshipData.AutoId][j].Time - } - return false - }) if len(ChampshipData.Rank[ChampshipData.AutoId]) == 10 { ChampshipData.AutoId++ } @@ -377,25 +436,33 @@ func (c *ChampshipMgr) group() (interface{}, error) { Time: v.Time, Type: RANK_PLAYER_ROBOT, }) - sort.Slice(ChampshipData.Rank[j], func(x, y int) bool { // 排序 从大到小 数值相等按时间排序 - if ChampshipData.Rank[j][x].Score > ChampshipData.Rank[j][y].Score { - return true - } else if ChampshipData.Rank[j][x].Score == ChampshipData.Rank[j][y].Score { - return ChampshipData.Rank[j][x].Time < ChampshipData.Rank[j][y].Time - } - return false - }) ChampshipData.RobotId++ } + sort.Slice(ChampshipData.Rank[j], func(x, y int) bool { // 排序 从大到小 数值相等按时间排序 + if ChampshipData.Rank[j][x].Score > ChampshipData.Rank[j][y].Score { + return true + } else if ChampshipData.Rank[j][x].Score == ChampshipData.Rank[j][y].Score { + return ChampshipData.Rank[j][x].Time < ChampshipData.Rank[j][y].Time + } + return false + }) } } - for k := range ChampshipData.Pool { // 分组完成通知 - NotifyPlayer(k, &msg.Msg{ + // 收集需要通知的玩家 + notifyList := make([]int, 0, len(ChampshipData.Pool)) + for k := range ChampshipData.Pool { + c.SetRankCache(k) // SetRankCache 使用 unsafe 方法,在持有锁时是安全的 + notifyList = append(notifyList, k) + } + c.getData().Pool = make(map[int]*GroupInfo) // 清空未分配池 + + // 在锁外通知玩家,避免在持有锁时调用外部函数 + for _, uid := range notifyList { + go NotifyPlayer(uid, &msg.Msg{ Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, }) } - c.getData().Pool = make(map[int]*GroupInfo) // 清空未分配池 return nil, nil } @@ -403,6 +470,8 @@ func (c *ChampshipMgr) group() (interface{}, error) { func (c *ChampshipMgr) getGroupId(Uid int) int { ChampshipData := c.getData() + ChampshipData.mu.RLock() + defer ChampshipData.mu.RUnlock() GroupId, ok := ChampshipData.GroupInfo[Uid] if ok { return GroupId @@ -412,9 +481,19 @@ func (c *ChampshipMgr) getGroupId(Uid int) int { // 进去榜单 func (c *ChampshipMgr) inRank(m *msg.Msg) (interface{}, error) { - ChampshipData := c.getData() data := m.Extra.(CRank) + // 在加锁前获取 GroupId,避免在持有写锁时调用会获取读锁的 getGroupId 导致死锁 GroupId := c.getGroupId(data.Uid) + + ChampshipData := c.getData() + ChampshipData.mu.Lock() + defer ChampshipData.mu.Unlock() + + // 再次检查 GroupId,因为可能在等待锁期间被其他协程修改 + if currentGroupId, ok := ChampshipData.GroupInfo[data.Uid]; ok { + GroupId = currentGroupId + } + if GroupId == 0 { ChampshipData.Pool[data.Uid] = &GroupInfo{ Uid: data.Uid, @@ -458,19 +537,47 @@ func (c *ChampshipMgr) inRank(m *msg.Msg) (interface{}, error) { } return false }) + ChampshipData.Rank[GroupId] = RankList + + // 收集需要通知的玩家 + notifyList := make([]int, 0) for k, v := range RankList { - if Notify[v.Uid] != k { - NotifyPlayer(v.Uid, &msg.Msg{ - Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, - }) + if Notify[v.Uid] != k && v.Type != RANK_PLAYER_ROBOT { + c.SetRankCache(v.Uid) + notifyList = append(notifyList, v.Uid) } } - ChampshipData.Rank[GroupId] = RankList + // 在锁外通知玩家 + for _, uid := range notifyList { + go NotifyPlayer(uid, &msg.Msg{ + Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, + }) + } return nil, nil } func (c *ChampshipMgr) getMyRank(Uid int) int { + ChampshipData := c.getData() + ChampshipData.mu.RLock() + defer ChampshipData.mu.RUnlock() + GroupId := ChampshipData.GroupInfo[Uid] + if GroupId == 0 { + return 0 + } + RankList, ok := ChampshipData.Rank[GroupId] + if !ok { + return 0 + } + for k, v := range RankList { + if v.Uid == Uid { + return k + 1 + } + } + return 0 +} + +func (c *ChampshipMgr) unsafe_getMyRank(Uid int) int { ChampshipData := c.getData() GroupId := ChampshipData.GroupInfo[Uid] if GroupId == 0 { @@ -489,6 +596,25 @@ func (c *ChampshipMgr) getMyRank(Uid int) int { } func (c *ChampshipMgr) getLastMyRank(Uid int) int { + ChampshipData := c.getData() + ChampshipData.mu.RLock() + defer ChampshipData.mu.RUnlock() + GroupId := ChampshipData.PreGroupInfo[Uid] + if GroupId == 0 { + return 0 + } + RankList, ok := ChampshipData.PreRank[GroupId] + if !ok { + return 0 + } + for k, v := range RankList { + if v.Uid == Uid { + return k + 1 + } + } + return 0 +} +func (c *ChampshipMgr) unsafe_getLastMyRank(Uid int) int { ChampshipData := c.getData() GroupId := ChampshipData.PreGroupInfo[Uid] if GroupId == 0 { @@ -717,3 +843,24 @@ func CreateRobot(M float64, GroupId int) *ChampshipRobot { PerScore: PerScore, } } + +func (c *ChampshipMgr) SetRankCache(Uid int) { + PreRank := c.unsafe_getLastMyRank(Uid) + Rank := c.unsafe_getMyRank(Uid) + PreGroupId := c.getData().PreGroupInfo[Uid] + GroupId := c.getData().GroupInfo[Uid] + key := fmt.Sprintf("champship_rank_cache_%d", Uid) + log.Debug("SetRankCache key:%s; data:%s", key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId)) + db.RedisSetKey(key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId), time.Second*172800) +} + +func GetRankCache(Uid int) (int, int, int, int) { + key := fmt.Sprintf("champship_rank_cache_%d", Uid) + data, err := db.RedisGetKey(key) + if err != nil || data == "" { + return 0, 0, 0, 0 + } + var PreRank, Rank, PreGroupId, GroupId int + fmt.Sscanf(data, "%d_%d_%d_%d", &PreRank, &Rank, &PreGroupId, &GroupId) + return PreRank, Rank, PreGroupId, GroupId +} diff --git a/src/server/game/friend_func.go b/src/server/game/friend_func.go index 5f7afd4a..b1c9a191 100644 --- a/src/server/game/friend_func.go +++ b/src/server/game/friend_func.go @@ -39,7 +39,7 @@ func (p *Player) GetVisitorPlayer() int { if FriendMod.CheckFriend(k) { PlayerList = append(PlayerList, sortData{k, v.Time}) } else { - PlayerList2 = append(PlayerList, sortData{k, v.Time}) + PlayerList2 = append(PlayerList2, sortData{k, v.Time}) } } if len(PlayerList) != 0 { @@ -68,7 +68,7 @@ func (p *Player) GetVisitorPlayer() int { if ps == nil { continue } - if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过 + if Now-ps.Loginout > 86400 { // 24小时内登录过 continue } if ps.Loginout > recentLoginTime { @@ -79,17 +79,20 @@ func (p *Player) GetVisitorPlayer() int { if recentFriendUid != 0 { return recentFriendUid } - PlayerList3 := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER) + uids, err := db.GetCommendPlayerFromDb(p.M_DwUin, GoUtil.Now()-86400, 15) + if err != nil { + return 0 + } PlayerList4 := make([]int, 0) - for _, v := range PlayerList3 { - if v.Uid == int(p.M_DwUin) { + for _, Uid := range uids { + if Uid == int(p.M_DwUin) { continue } - PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) - if PlayerSimpleData.Level < 15 { + PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid) + if PlayerSimpleData == nil { continue } - PlayerList4 = append(PlayerList4, v.Uid) + PlayerList4 = append(PlayerList4, Uid) } L := GoUtil.RandSliceNum(PlayerList4, 1) if len(L) == 0 { @@ -99,37 +102,105 @@ func (p *Player) GetVisitorPlayer() int { } func GetRecommendPlayer(p *Player, Num int) []int { - PlayerList := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER) - PlayerList1 := make([]int, 0) - FriendMod := p.PlayMod.getFriendMod() - for _, v := range PlayerList { - if v.Uid == int(p.M_DwUin) { - continue - } - if FriendMod.CheckSendApply(v.Uid) { - continue - } - if FriendMod.CheckFriend(v.Uid) { - continue - } - PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) - if GoUtil.Now()-PlayerSimpleData.Loginout > 86400 { - continue - } - if PlayerSimpleData.Level < 4 { - continue - } - PlayerList1 = append(PlayerList1, v.Uid) + uids, err := db.GetCommendPlayerFromDb(p.M_DwUin, GoUtil.Now()-259200, 4) + if err != nil { + log.Debug("GetCommendPlayerFromDb err:%v, uid=%d", err, p.M_DwUin) + return nil } - if len(PlayerList1) == 0 { - for _, v := range PlayerList { - if v.Uid == int(p.M_DwUin) { + PlayerList1 := make([]int, 0, len(uids)) + FriendMod := p.PlayMod.getFriendMod() + for _, Uid := range uids { + if Uid == int(p.M_DwUin) { + continue + } + if FriendMod.CheckSendApply(Uid) { + continue + } + if FriendMod.CheckAddBefore(Uid) { + continue + } + PlayerList1 = append(PlayerList1, Uid) + } + // 按照时间门槛筛选用户 + filterByTime := func(excludeSeconds int64) []int { + now := GoUtil.Now() + result := make([]int, 0, len(PlayerList1)) + for _, Uid := range PlayerList1 { + recommendTime := FriendMod.GetRecommendTime(Uid) + if recommendTime == 0 || recommendTime <= now-excludeSeconds { + result = append(result, Uid) + } + } + return result + } + // 排查7日内推荐过的用户 + candidateList := filterByTime(604800) + // 用户数低于5则放宽到3日 + if len(candidateList) < 5 { + candidateList = filterByTime(259200) + } + // 用户数低于5则放宽到2日 + if len(candidateList) < 5 { + candidateList = filterByTime(172800) + } + + if len(candidateList) == 0 { + candidateList = append(candidateList, PlayerList1...) + } + + if len(candidateList) == 0 { + candidateList = make([]int, 0, len(uids)) + for _, Uid := range uids { + if Uid == int(p.M_DwUin) { continue } - PlayerList1 = append(PlayerList1, v.Uid) + candidateList = append(candidateList, Uid) } } - return GoUtil.RandSliceNum(PlayerList1, Num) + baseList := make([]*PlayerSimpleData, 0, len(candidateList)) + for _, uid := range candidateList { + ps := G_GameLogicPtr.GetSimplePlayerByUid(uid) + if ps != nil { + baseList = append(baseList, ps) + } + } + if len(baseList) == 0 { + return nil + } + BaseMod := p.PlayMod.getBaseMod() + level := BaseMod.GetLevel() + diffLimit := 10 + filtered := make([]int, 0, len(baseList)) + breakNum := 100 + for { + if breakNum <= 0 { + break + } + breakNum-- + filtered = filtered[:0] + for _, ps := range baseList { + if ps == nil { + continue + } + diff := level - ps.Level + if diff < 0 { + diff = -diff + } + if diff <= diffLimit { + filtered = append(filtered, ps.Uid) + } + } + if len(filtered) >= 5 || len(baseList) == 0 { + break + } + diffLimit++ + } + candidateList = filtered + recommendList := GoUtil.RandSliceNum(candidateList, Num) + for _, Uid := range recommendList { + FriendMod.AddRecommend(Uid) + } + return recommendList } func GetUidByFaceBook(Fb string) (int, error) { diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index f7ce991e..58378380 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -134,7 +134,7 @@ func ReqGmCommand_(player *Player, Command string) error { player.PlayMod.getSevenLoginMod().Active = num case "pay": ChargeId, _ := strconv.Atoi(arg[1]) - player.Kafka("pay", map[string]interface{}{ + player.TeLog("pay", map[string]interface{}{ "ProductId": ChargeId, "AppId": conf.Server.AppID, "Uid": player.M_DwUin, @@ -252,12 +252,27 @@ func ReqGmCommand_(player *Player, Command string) error { } player.PushClientRes(LimitedTimeEventMod.ProgressBackData()) case "champshipGroup": - G_GameLogicPtr.ChampshipMgrSend(&MsgMod.Msg{ - Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_GROUP, + SendMsgToCenterAsync(&MsgMod.Msg{ + HandleType: MsgMod.HANDLE_MOD_CHAMPSHIP_GROUP, }) - case "clearRank": + case "inrank": + ChampshipMod := player.PlayMod.getChampshipMod() num, _ := strconv.Atoi(arg[1]) - G_GameLogicPtr.RankMgr.ClearRank(num) + Score := float64(num) + // 更新排行榜 + m := &MsgMod.Msg{ + Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_INRANK, + SendT: GoUtil.Now(), + Extra: CRank{ + Uid: int(player.M_DwUin), + Score: Score, + H: ChampshipMod.GetH(), + N: ChampshipMod.GetN(), + }, + End: GoUtil.ZeroTimestamp() + 86400, // 第二天零点删除 + HandleType: MsgMod.HANDLE_MDO_CHAMPSHIP_INRANK, + } + SendMsgToCenterAsync(m) case "resetUserInfo": Rank := G_GameLogicPtr.RankMgr.getRank(RANK_TYPE_USER) for _, v := range Rank { @@ -281,6 +296,17 @@ func ReqGmCommand_(player *Player, Command string) error { HandbookMod.SetHandbook(v) HandbookMod.BookList[v] = handbook.STATUS_REWARD } + case "setLogin": + Id, _ := strconv.Atoi(arg[1]) + BaseMod := player.PlayMod.getBaseMod() + BaseMod.LoginTime = int64(Id) + case "setLogout": + Id, _ := strconv.Atoi(arg[1]) + BaseMod := player.PlayMod.getBaseMod() + BaseMod.LogoutTime = int64(Id) + case "setRegister": + Id, _ := strconv.Atoi(arg[1]) + player.PlayerBaseMod.Data.Rolecreatetime = int32(Id) case "handbookReward": HandbookMod := player.PlayMod.getHandbookMod() for _, v := range mergeDataCfg.GetAllId() { @@ -467,25 +493,6 @@ func ReqGmCommand_(player *Player, Command string) error { EndTime: EndTime, Num: int32(Times), }) - case "sendMail": - MailMod := player.PlayMod.getMailMod() - title := `MMM圣诞节奖励` - content := `测试` - MailMod.Send(title, "副标题", content, title, "副标题", content, []*item.Item{ - { - Id: item.ITEM_DIAMOND_ID, - Num: 10, - }, - { - Id: item.ITEM_ENERGY_ID, - Num: 10, - }, - { - Id: item.ITEM_STAR_ID, - Num: 10, - }, - }, 2) - player.PushClientRes(MailMod.BackData()) case "resetNpc": FriendMod := player.PlayMod.getFriendMod() FriendMod.Npc = []int{} @@ -587,6 +594,22 @@ func ReqGmCommand_(player *Player, Command string) error { LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod.AddEvent(Id, Cd) player.PushClientRes(LimitedTimeEventMod.BackData()) + case "debugMsg": + to, _ := strconv.Atoi(arg[1]) + num, _ := strconv.Atoi(arg[1]) + for i := 0; i < num; i++ { + uid := 100100000 + i + if uid == int(player.M_DwUin) { + continue + } + SendMsgToCenterAsync(&MsgMod.Msg{ + From: uid, + To: to, + Type: MsgMod.HANDLE_TYPE_APPLY, + SendT: GoUtil.Now(), + HandleType: MsgMod.HANDLE_MOD_PLAYER_MSG, + }) + } default: return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg) } diff --git a/src/server/game/log_mgr.go b/src/server/game/log_mgr.go deleted file mode 100644 index 825bedfc..00000000 --- a/src/server/game/log_mgr.go +++ /dev/null @@ -1,260 +0,0 @@ -package game - -import ( - "encoding/json" - "runtime" - kafkaMiddleware "server/middleware/kafka" - "server/pkg/github.com/name5566/leaf/log" - "sync" - "sync/atomic" - "time" -) - -const ( - Login_log = 1 - LoginOut_log = 2 - Event_log = 3 -) -const ( - PLAYROOM_LOST = "playroom_lost" - // 增大缓冲:针对 ~1000 条/s,保留足够秒数的缓冲(可按需调整) - LOG_LENGTH = 100000 - WORKER_COUNT = 500 -) - -type LogMgr struct { - // 将切片改为带缓冲通道 - L chan *Log - Lock sync.Mutex - wg sync.WaitGroup - stopOnce sync.Once - closing bool -} - -type Log struct { - Uid int64 - AppId int - ServerId int - EventName string - Param map[string]interface{} - TimeStamp int64 -} - -func (L *LogMgr) InitManager() { - // 初始化通道 - L.L = make(chan *Log, LOG_LENGTH) - - // 动态协程池参数 - maxWorkers := WORKER_COUNT - if cpuWorkers := runtime.NumCPU() * 2; cpuWorkers > maxWorkers { - maxWorkers = cpuWorkers - } - minWorkers := 100 - idleTimeout := 500 * time.Millisecond - - var activeWorkers int32 - - // worker 启动函数 - spawnWorker := func() { - L.wg.Add(1) - atomic.AddInt32(&activeWorkers, 1) - go func() { - defer L.wg.Done() - defer atomic.AddInt32(&activeWorkers, -1) - - for { - // 首先阻塞等待一个任务(若 channel 关闭则退出) - v, ok := <-L.L - if !ok { - return - } - // 处理消息(与原来逻辑一致) - value, _ := json.Marshal(v) - if kafkaMiddleware.KafkaMod == nil { - // 尝试非阻塞重入,否则丢弃最旧再试一次 - select { - case L.L <- v: - default: - select { - case <-L.L: - default: - } - select { - case L.L <- v: - default: - } - } - time.Sleep(10 * time.Millisecond) - } else { - if err := kafkaMiddleware.SendMsg([]byte(v.EventName), value); err != nil { - log.Debug("kafka log send err:%s", err.Error()) - select { - case L.L <- v: - default: - select { - case <-L.L: - default: - } - select { - case L.L <- v: - default: - } - } - time.Sleep(10 * time.Millisecond) - } - } - - // 快速循环处理后续可用任务,若超时则退出该 worker(回收) - timer := time.NewTimer(idleTimeout) - for { - select { - case v, ok := <-L.L: - if !ok { - if !timer.Stop() { - <-timer.C - } - return - } - // 处理消息 - value, _ := json.Marshal(v) - if kafkaMiddleware.KafkaMod == nil { - select { - case L.L <- v: - default: - select { - case <-L.L: - default: - } - select { - case L.L <- v: - default: - } - } - time.Sleep(10 * time.Millisecond) - } else { - if err := kafkaMiddleware.SendMsg([]byte(v.EventName), value); err != nil { - log.Debug("kafka log send err:%s", err.Error()) - select { - case L.L <- v: - default: - select { - case <-L.L: - default: - } - select { - case L.L <- v: - default: - } - } - time.Sleep(10 * time.Millisecond) - } - } - // 重置定时器以继续快速处理 - if !timer.Stop() { - <-timer.C - } - timer.Reset(idleTimeout) - case <-timer.C: - timer.Stop() - // 空闲超时,退出该 worker - return - } - } - } - }() - } - - // 启动初始最小 worker 数量 - for i := 0; i < minWorkers; i++ { - spawnWorker() - } - - // 监督器:动态根据队列长度扩展 worker,但不超过 maxWorkers - go func() { - ticker := time.NewTicker(200 * time.Millisecond) - defer ticker.Stop() - for range ticker.C { - L.Lock.Lock() - closing := L.closing - L.Lock.Unlock() - if closing { - return - } - backlog := len(L.L) - active := int(atomic.LoadInt32(&activeWorkers)) - if backlog > active && active < maxWorkers { - toSpawn := backlog - active - remain := maxWorkers - active - if toSpawn > remain { - toSpawn = remain - } - for i := 0; i < toSpawn; i++ { - spawnWorker() - } - } - } - }() -} - -func (L *LogMgr) AddLog(logs *Log) { - return - // 复制结构体和 Param map,避免并发修改导致 json.Marshal 时 panic - copyLog := *logs - - // 安全地复制 map,使用 defer recover 防止并发迭代时的 panic - if logs.Param != nil { - func() { - defer func() { - if r := recover(); r != nil { - // 发生 panic 时使用空 map - log.Debug("AddLog: concurrent map read/write detected, using empty map") - copyLog.Param = make(map[string]interface{}) - } - }() - newParam := make(map[string]interface{}, len(logs.Param)) - for k, v := range logs.Param { - newParam[k] = v - } - copyLog.Param = newParam - }() - } - - // 如果已经开始关闭,直接丢弃 - L.Lock.Lock() - if L.closing { - L.Lock.Unlock() - return - } - // 非阻塞入队:若通道满则先丢弃最旧一条再入队,避免阻塞调用者 - select { - case L.L <- ©Log: - L.Lock.Unlock() - return - default: - // 丢弃最旧一条以腾出空间(若有) - select { - case <-L.L: - default: - } - // 再尝试入队一次 - select { - case L.L <- ©Log: - default: - // 放不下就直接丢弃 - } - L.Lock.Unlock() - } -} - -func (L *LogMgr) Close() { - L.stopOnce.Do(func() { - L.Lock.Lock() - // 标记为正在关闭,阻止后续入队 - L.closing = true - // 关闭通道,通知所有 worker 退出(workers 会消费完所有已入队的消息) - close(L.L) - L.Lock.Unlock() - // 等待所有 worker 处理完 - L.wg.Wait() - }) -} diff --git a/src/server/game/message_handler.go b/src/server/game/message_handler.go index c763f57f..f50c8c69 100644 --- a/src/server/game/message_handler.go +++ b/src/server/game/message_handler.go @@ -47,8 +47,14 @@ func (p *Player) HandleMsg(m *msg.Msg) { p.Recover(backup) //还原Player的数据 return } - p.ProcessTrigger() - p.SendClientRes() + + // 处理在线消息 + if m.H == msg.MSG_TYPE_ONLINE { + p.ProcessTrigger() + p.SendClientRes() + } else { + p.Msg = make([]PlayerMsg, 0) + } } // 消息处理 @@ -56,7 +62,11 @@ func (p *Player) handle(m *msg.Msg) error { switch m.Type { case msg.HANDLE_TYPE_APPLY: // 好友申请 FriendMod := p.PlayMod.getFriendMod() - FriendMod.AddFriendApply(m.From) + ok := FriendMod.AddFriendApply(m.From) + // 已申请 + if ok { + return nil + } p.AddLog(m.From, friend.LOG_TYPE_FRIEND_APPLY, "", m.SendT) PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From) p.PushClientRes(&proto.ResFriendApplyNotify{ @@ -73,10 +83,10 @@ func (p *Player) handle(m *msg.Msg) error { Type: friend.FRIEND_NOTIFY_AGREE, Time: int32(GoUtil.Now()), }) - PlayroomMod := p.PlayMod.getPlayroomMod() - BaseMod := p.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) - p.PlayroomBackData() + // PlayroomMod := p.PlayMod.getPlayroomMod() + // BaseMod := p.PlayMod.getBaseMod() + // PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) + // p.PlayroomBackData() p.TeLog("friend_add", map[string]interface{}{ "player_id": m.From, "add_type": "接受申请", @@ -128,10 +138,6 @@ func (p *Player) handle(m *msg.Msg) error { return nil } FriendMod.AddFriend(m.From) - PlayroomMod := p.PlayMod.getPlayroomMod() - BaseMod := p.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) - p.PlayroomBackData() p.TeLog("friend_add", map[string]interface{}{ "player_id": m.From, "add_type": "发起申请", @@ -333,7 +339,7 @@ func (p *Player) handle(m *msg.Msg) error { FriendMod := p.PlayMod.getFriendMod() FriendMod.Interact(m.From, friend.INTERACT_TYPE_VISIT, m.SendT) p.UpdateUserInfo() - p.Kafka(PLAYROOM_LOST, map[string]interface{}{"uid": m.From, "item": Items}) + p.TeLog("playroom_lost", map[string]interface{}{"uid": m.From, "item": Items}) p.PushClientRes(PlayroomMod.NotifyLose()) case msg.HANDLE_TYPE_PLAYROOM_GAME: FriendMod := p.PlayMod.getFriendMod() @@ -374,9 +380,16 @@ func (p *Player) handle(m *msg.Msg) error { MailMod := p.PlayMod.getMailMod() mt, mc, mt_en, mc_en := mailCfg.GetChargeSendMail(PlayerSimpleData.Name) Items := p.ChargeItem(C.ChargeId) - MailId := MailMod.Send(mt, "", mc, mt_en, "", mc_en, Items, mail.MAIL_TYPE_GIFT) - p.AddLog(m.From, friend.LOG_TYPE_CHARGE_SEND, fmt.Sprintf("%d", MailId), m.SendT) - p.PushClientRes(MailMod.NotifyMail(MailId)) + mailId := MailMod.SendMail(&mail.MailStruct{ + Title: mt, + Content: mc, + TitleEn: mt_en, + ContentEn: mc_en, + Items: Items, + Type: mail.MAIL_TYPE_GIFT, + }) + p.AddLog(m.From, friend.LOG_TYPE_CHARGE_SEND, fmt.Sprintf("%d", mailId), m.SendT) + p.PushClientRes(MailMod.NotifyMail(mailId)) case msg.HANDLE_TYPE_CHARGE_RECEIVE: // 收到好友的感谢信 Content, ok := m.Extra.(string) if !ok { @@ -385,9 +398,15 @@ func (p *Player) handle(m *msg.Msg) error { PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From) MailMod := p.PlayMod.getMailMod() mt, mc, mt_en, mc_en := mailCfg.GetChargeReceiveMail(PlayerSimpleData.Name, Content) - MailId := MailMod.Send(mt, "", mc, mt_en, "", mc_en, nil, mail.MAIL_TYPE_NORMAL) - p.AddLog(m.From, friend.LOG_TYPE_CHARGE_RECEIVE, fmt.Sprintf("%d", MailId), m.SendT) - p.PushClientRes(MailMod.NotifyMail(MailId)) + mailId := MailMod.SendMail(&mail.MailStruct{ + Title: mt, + Content: mc, + TitleEn: mt_en, + ContentEn: mc_en, + Type: mail.MAIL_TYPE_NORMAL, + }) + p.AddLog(m.From, friend.LOG_TYPE_CHARGE_RECEIVE, fmt.Sprintf("%d", mailId), m.SendT) + p.PushClientRes(MailMod.NotifyMail(mailId)) case msg.HANDLE_TYPE_WISHLIST_SEND: // 发送愿望单请求 FriendMod := p.PlayMod.getFriendMod() FriendMod.AddWishApply(int64(m.From)) @@ -503,6 +522,8 @@ func (p *Player) handle(m *msg.Msg) error { } case msg.HANDLE_TYPE_FRIEND_SPONSOER: p.AddLog(m.From, friend.LOG_TYPE_FRIEND_SPONSOR_GET, "", m.SendT) + case msg.SERVER_PLAYER_SYNC_LOGOUT_MSG: + p.LoginBackData() default: log.Debug("uid : %d, handle msg type : %d not exist", p.M_DwUin, m.Type) } @@ -1091,7 +1112,7 @@ func (player *Player) GetPetOrderReward(Star int, Items []*item.Item) []*item.It } func ExcludeCardStar(CardList []int) []int { - StarList := make([]int, 0) + StarList := make([]int, 0, len(CardList)) for _, v := range CardList { Star := cardCfg.GetStarById(v) if Star < 2 || Star > 4 { @@ -1219,6 +1240,10 @@ func (p *Player) AddHighOrder() { } // 高级产物订单 +/** +当玩家生成了两个一样的最高等级产物,自动生成一个订单收掉它们。 +注意:当现有订单(无论是自动或固定订单)中已有两个或三个最高等级产物订单的时候,不执行此逻辑 +*/ func (p *Player) AddHighOrder2() { OrderMod := p.PlayMod.getOrderMod() ChessMod := p.PlayMod.getChessMod() @@ -1237,18 +1262,18 @@ func (p *Player) AddHighOrder2() { ChessMap[v]++ } for ChessId, Num := range ChessMap { - if Num < 3 { + if Num < 2 { continue } add := true for _, v := range OrderMod.GetOrderList() { - if GoUtil.SliceEqual(v.MergeId, []int{ChessId, ChessId, ChessId}) { + if GoUtil.SliceEqual(v.MergeId, []int{ChessId, ChessId}) || GoUtil.SliceEqual(v.MergeId, []int{ChessId, ChessId, ChessId}) { add = false break } } if add { - OrderMod.AddExtraOrder([]int{ChessId, ChessId, ChessId}) + OrderMod.AddExtraOrder([]int{ChessId, ChessId}) return } } diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index 08a742dc..94cd3be1 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -132,6 +132,7 @@ func FixBug() { // 先更新 PlayerList(需要加锁) messageMgrData.mu.Lock() defer messageMgrData.mu.Unlock() + now := GoUtil.Now() for k, v := range messageMgrData.MessageList { if k < 100000 { delete(messageMgrData.MessageList, k) @@ -139,11 +140,14 @@ func FixBug() { } // 反向遍历以安全删除元素 for i := len(v.Messages) - 1; i >= 0; i-- { - if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY { + if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY || (v.Messages[i].End != 0 && v.Messages[i].End < now) { // 删除消息 v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) } } + if len(v.Messages) == 0 { + delete(messageMgrData.MessageList, k) + } } } @@ -175,6 +179,7 @@ func (m *MessageMgr) CenterRegister() { m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_INFO, MessageHandlerFunc(ChampshipRankInfoHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_LIST, MessageHandlerFunc(ChampshipRankListHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_PRE_RANK, MessageHandlerFunc(ChampshipRankPreHandler)) + m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_GROUP, MessageHandlerFunc(ChampshipGroupHandler)) } } @@ -222,6 +227,11 @@ func NotifyAllPlayerMsg(m *msg.Msg) { } } +func ChampshipGroupHandler(data *msg.Msg) (interface{}, error) { + G_GameLogicPtr.ChampshipMgr.group() + return nil, nil +} + func ChampshipInRankHandler(data *msg.Msg) (interface{}, error) { G_GameLogicPtr.ChampshipMgr.inRank(data) return nil, nil @@ -289,16 +299,32 @@ func PlayerLoginHandler(data *msg.Msg) (interface{}, error) { messages := getMessge(int64(data.From)) messages.mu.Lock() // 复制消息列表,避免在锁内发送消息 + // 过滤过期消息 + now := GoUtil.Now() + validMessages := make([]*msg.Msg, 0, len(messages.Messages)) + for _, message := range messages.Messages { + if message.End == 0 || message.End >= now { + validMessages = append(validMessages, message) + } + } + messages.Messages = validMessages messagesToSend := make([]*msg.Msg, len(messages.Messages)) copy(messagesToSend, messages.Messages) messages.mu.Unlock() - + ReplyPlayerMsgASync(data, nil) // 在锁外发送离线消息 for _, message := range messagesToSend { + message.H = msg.MSG_TYPE_OFFLINE // 标记为离线消息 SendMsgToNodeAsync(message, node) } + SendMsgToNodeAsync(&msg.Msg{ + From: data.From, + To: data.From, + Type: msg.SERVER_PLAYER_SYNC_LOGOUT_MSG, + HandleType: msg.HANDLE_MOD_PLAYER_MSG, + Extra: len(messagesToSend), + }, node) // 发送离线消息处理完成通知 log.Debug("[Middleware] Player sync logout message player id: %v, len: %d", data.From, len(messagesToSend)) - ReplyPlayerMsgASync(data, nil) return nil, nil } @@ -372,7 +398,7 @@ func PlayerMsgHandler(data *msg.Msg) (interface{}, error) { if p == nil || p.stop { return nil, nil } - p.Send(data.Clone()) + go p.Send(data.Clone()) // 处理完后发送消费消息 if data.HandleType == msg.HANDLE_MOD_PLAYER_MSG { data.HandleType = msg.HANDLE_MOD_COMSUME_MSG @@ -810,6 +836,9 @@ func SendPlayerMsgSync(m *msg.Msg) (interface{}, error) { } func FriendMgrSend(m1 *msg.Msg) error { + if m1.SendT == 0 { + m1.SendT = GoUtil.Now() + } SendPlayerMsgAsync(m1) return nil } @@ -862,7 +891,24 @@ func saveMessage(m *msg.Msg) error { messages := getMessgeUnsafe(int64(m.To)) messages.mu.Lock() defer messages.mu.Unlock() + for _, msgItem := range messages.Messages { + if msgItem == nil { + continue + } + if msgItem.UniKey == m.UniKey { + // 已存在相同消息,直接返回 + return nil + } + } + // 添加消息 messages.Messages = append(messages.Messages, m) + // 添加消息 + messages.Messages = append(messages.Messages, m) + // 设置上限为2000条,超过则丢弃最早的消息 + if len(messages.Messages) > 2000 { + excess := len(messages.Messages) - 2000 + messages.Messages = messages.Messages[excess:] + } return nil } @@ -920,5 +966,12 @@ func deleteMessage(m *msg.Msg) error { messages.Messages[len(messages.Messages)-1] = nil // 清除最后一个元素的引用 messages.Messages = messages.Messages[:len(messages.Messages)-1] } + if len(messages.Messages) == 0 { + // 如果消息列表为空,则删除该玩家的消息列表 + messageMgrData := getMessageData() + messageMgrData.mu.Lock() + defer messageMgrData.mu.Unlock() + delete(messageMgrData.MessageList, int64(m.To)) + } return nil } diff --git a/src/server/game/mod/activity/activity.go b/src/server/game/mod/activity/activity.go index 87e0dac0..93eaf692 100644 --- a/src/server/game/mod/activity/activity.go +++ b/src/server/game/mod/activity/activity.go @@ -66,30 +66,26 @@ func (a *Activity) getGIftVar(key int) *Gift { if Var == nil { Var = &Gift{} a.SetVar(key, Var) + return Var.(*Gift) } - return Var.(*Gift) -} - -func (a *Activity) setGiftVar(key int, Var *Gift) { - a.SetVar(key, Var) + gift, ok := Var.(*Gift) + if !ok { + // 类型不匹配,重置为新的 Gift 对象 + gift = &Gift{} + a.SetVar(key, gift) + } + return gift } func (a *Activity) GetActivityStatus(data *gamedata.ActivityData) int { - switch data.AType { - case ACT_ATYPE_NORMAL: + if data.AType == ACT_ATYPE_NORMAL { return ACT_STATUS_START - case ACT_ATYPE_LIMIT_GIFT: + } + + if data.AType == ACT_ATYPE_LIMIT_GIFT { + Var := a.getGIftVar(data.Id) switch data.Type { - case ACT_TYPE_ADD_GIFT: - Var := a.getGIftVar(data.Id) - if Var.Reward { - return ACT_STATUS_NOT_START - } - if Var.Buy { - return ACT_STATUS_END - } - case ACT_TYPE_SUPER_GIFT: - Var := a.getGIftVar(data.Id) + case ACT_TYPE_ADD_GIFT, ACT_TYPE_SUPER_GIFT: if Var.Reward { return ACT_STATUS_NOT_START } @@ -97,13 +93,12 @@ func (a *Activity) GetActivityStatus(data *gamedata.ActivityData) int { return ACT_STATUS_END } default: - Var := a.getGIftVar(data.Id) if Var.Buy { return ACT_STATUS_NOT_START } } - } + return ACT_STATUS_START } @@ -117,5 +112,5 @@ func (a *Activity) GetReward(ActId int) ([]*item.Item, error) { } Var.Reward = true Var.RewardTime = GoUtil.Now() - return activityCfg.GetAcitivityRewardItems(ActId), nil + return activityCfg.GetActivityRewardItems(ActId), nil } diff --git a/src/server/game/mod/activity/activity_gift.go b/src/server/game/mod/activity/activity_gift.go index 3d0c174b..1b173dd7 100644 --- a/src/server/game/mod/activity/activity_gift.go +++ b/src/server/game/mod/activity/activity_gift.go @@ -15,5 +15,5 @@ func (a *Activity) Fire(Id int) ([]*item.Item, error) { } Var.Buy = true Var.Time = GoUtil.Now() - return activityCfg.GetAcitivityGiftItems(Id), nil + return activityCfg.GetActivityGiftItems(Id), nil } diff --git a/src/server/game/mod/avatar/Avatar.go b/src/server/game/mod/avatar/Avatar.go index 1e5cc51b..effaafe1 100644 --- a/src/server/game/mod/avatar/Avatar.go +++ b/src/server/game/mod/avatar/Avatar.go @@ -32,6 +32,7 @@ func (a *AvatarMod) InitData() { a.Init = true a.List = make(map[int]*Avatar) InitId := avatarCfg.GetInitList() + a.List = make(map[int]*Avatar, len(InitId)) for _, v := range InitId { a.List[v] = &Avatar{ AddTime: now, @@ -61,16 +62,21 @@ func (a *AvatarMod) Unlock(Id, Time int) error { v.Ts += int64(Time) return nil } + now := GoUtil.Now() + ts := int64(0) + if Time > 0 { + ts = now + int64(Time) + } a.List[Id] = &Avatar{ - Ts: now + int64(Time), + Ts: ts, AddTime: now, } return nil } func (a *AvatarMod) BackData() []*msg.AvatarInfo { - l := make([]*msg.AvatarInfo, 0) + l := make([]*msg.AvatarInfo, 0, len(a.List)) for k, v := range a.List { l = append(l, &msg.AvatarInfo{ Id: int32(k), diff --git a/src/server/game/mod/base/Base.go b/src/server/game/mod/base/Base.go index 5bd68e39..c64dcdb1 100644 --- a/src/server/game/mod/base/Base.go +++ b/src/server/game/mod/base/Base.go @@ -61,7 +61,6 @@ func (b *Base) InitData(Uid int, Ip string) { if b.NickName == "" { b.NickName = fmt.Sprintf("Player_%d", Uid) } - } func (b *Base) Login() int64 { @@ -69,9 +68,9 @@ func (b *Base) Login() int64 { if !GoUtil.IsSameDay(b.LoginTime, Now) { b.LoginDay += 1 } - logoutDuration := Now - b.LogoutTime - if b.LogoutTime == 0 { - logoutDuration = 0 + logoutDuration := int64(0) + if b.LogoutTime != 0 { + logoutDuration = Now - b.LogoutTime } b.LoginTime = Now b.LogoutTime = 0 @@ -195,7 +194,6 @@ func (b *Base) SetExp(Exp int) { func (b *Base) SetEnergy(Energy int) { b.Energy = Energy - } func (b *Base) SetStar(Star int) { @@ -227,10 +225,6 @@ func (b *Base) SetLang(lang msg.LANG_TYPE) { } func (b *Base) BuyEnergy(Energy int) ([]*item.Item, int, int) { - // if !b.IsFirstBuy { - // b.IsFirstBuy = true - // return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: 100}}, 100, 0 - // } b.EnergyBuy += 1 Mul := baseCfg.GetEnergyByMul(b.EnergyBuy) Diamond := int(float64(Energy) / Mul) @@ -269,11 +263,15 @@ func (b *Base) GetEnergyByAD() ([]*item.Item, error) { return nil, fmt.Errorf("energy ad is max") } b.EnergyAD += 1 - return []*item.Item{{Id: item.ITEM_ENERGY_ID, Num: 25}}, nil + return baseCfg.GetEnergyByADNum(), nil } func (b *Base) FormatEnergyMul(Energy int) { for { + if b.EnergyMul <= 0 { + b.EnergyMul = 0 + return + } EnergyLimit := baseCfg.GetLimitEnergyMul(b.Level) if EnergyLimit == 0 { return @@ -282,10 +280,6 @@ func (b *Base) FormatEnergyMul(Energy int) { return } b.EnergyMul-- - if b.EnergyMul < 0 { - b.EnergyMul = 0 - return - } } } diff --git a/src/server/game/mod/card/Card.go b/src/server/game/mod/card/Card.go index 8b9ce43f..80d96c8b 100644 --- a/src/server/game/mod/card/Card.go +++ b/src/server/game/mod/card/Card.go @@ -224,7 +224,7 @@ func (c *CardMod) BackData() *msg.ResCardInfo { } cardList = append(cardList, &msg.Card{Id: int32(k), Count: int32(v)}) } - ReqUid := make([]int64, 0) + ReqUid := make([]int64, 0, len(c.ReqFriend)) for _, v := range c.ReqFriend { if v.EndTime < GoUtil.Now() { delete(c.ReqFriend, v.BUid) @@ -232,7 +232,7 @@ func (c *CardMod) BackData() *msg.ResCardInfo { } ReqUid = append(ReqUid, int64(v.BUid)) } - ExUid := make([]int64, 0) + ExUid := make([]int64, 0, len(c.ExCard)) for k, v := range c.ExCard { if v.EndTime < GoUtil.Now() { delete(c.ExCard, k) @@ -514,7 +514,7 @@ func (c *CardMod) NotifyCard() *msg.ResNotifyCard { } func (c *CardMod) NotifyTimes() *msg.ResNotifyCardTimes { - ReqUid := make([]int64, 0) + ReqUid := make([]int64, 0, len(c.ReqFriend)) for k, v := range c.ReqFriend { if v.EndTime < GoUtil.Now() { delete(c.ReqFriend, k) @@ -522,7 +522,7 @@ func (c *CardMod) NotifyTimes() *msg.ResNotifyCardTimes { } ReqUid = append(ReqUid, int64(k)) } - ExUid := make([]int64, 0) + ExUid := make([]int64, 0, len(c.ExCard)) for k, v := range c.ExCard { if v.EndTime < GoUtil.Now() { delete(c.ExCard, k) @@ -590,7 +590,7 @@ func (c *CardMod) SeasonFirstReward() ([]*item.Item, error) { } func (c *CardMod) GetCardList() []int { - cardList := make([]int, 0) + cardList := make([]int, 0, len(c.CardList)) for k, v := range c.CardList { if v > 0 { cardList = append(cardList, k) diff --git a/src/server/game/mod/charge/charge_func.go b/src/server/game/mod/charge/charge_func.go index cd243096..082a7edb 100644 --- a/src/server/game/mod/charge/charge_func.go +++ b/src/server/game/mod/charge/charge_func.go @@ -20,42 +20,3 @@ func GetChessDiamond(Lv, Type int) int { } return max(1, d) } - -// func getChessMainRand(Color string) []*Rand { -// r := make([]*Rand, 0) -// for i := 6; i <= 10; i++ { -// Diamond := int(math.Pow(2, float64(i-1)) / 2.5) -// ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color) -// if ChessId == 0 { -// continue -// } -// r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond}) -// } -// return r -// } - -// func getChessSecondaryRand(Color string) []*Rand { -// r := make([]*Rand, 0) -// for i := 5; i <= 9; i++ { -// Diamond := int((math.Pow(2, float64(i-1)) / 2.5) * 2) -// ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color) -// if ChessId == 0 { -// continue -// } -// r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond}) -// } -// return r -// } - -// func getChessSubRand(Color string) []*Rand { -// r := make([]*Rand, 0) -// for i := 5; i <= 9; i++ { -// Diamond := int(math.Pow(2, float64(i-1))/2.5 + 6.4) -// ChessId := mergeDataCfg.GetChessIdByLvAndColor(i, Color) -// if ChessId == 0 { -// continue -// } -// r = append(r, &Rand{ChessId: ChessId, Diamond: Diamond}) -// } -// return r -// } diff --git a/src/server/game/mod/chess/Chess.go b/src/server/game/mod/chess/Chess.go index dd9880ac..85a1073b 100644 --- a/src/server/game/mod/chess/Chess.go +++ b/src/server/game/mod/chess/Chess.go @@ -149,7 +149,7 @@ func (cb *ChessBorad) ComposeChess(id int) (int, error) { return 0, errors.New("已达最大等级") } count := 0 - newList := make([]int, 0) + newList := make([]int, 0, len(cb.ChessList)) for _, chess := range cb.ChessList { if chess == id && count < 2 { count++ @@ -457,17 +457,17 @@ func (cb *ChessBorad) BackData() *msg.ResPlayerChessInfo { Count: int32(v.Num), }) } - Re := make([]string, 0) + Re := make([]string, 0, len(cb.Retire)) for k, v := range cb.Retire { if v == EMIT_RETIRE_END { Re = append(Re, k) } } - Ho := make([]int32, 0) + Ho := make([]int32, 0, len(cb.Honor)) for k := range cb.Honor { Ho = append(Ho, int32(k)) } - Rw := make([]string, 0) + Rw := make([]string, 0, len(cb.RetireReward)) for k, v := range cb.RetireReward { if v == true { Rw = append(Rw, k) @@ -633,7 +633,7 @@ func (cb *ChessBorad) RetireOrder(EmitType string) error { if cb.Retire[EmitType] != 1 { return errors.New("chess has not been retired") } - chess := make([]int, 0) + chess := make([]int, 0, len(cb.ChessMap)) EmitProduct := mergeDataCfg.GetEmitOrderProduce(EmitType) for k, v := range cb.ChessMap { arr := strings.Split(k, "@") diff --git a/src/server/game/mod/collect/Collect.go b/src/server/game/mod/collect/Collect.go index ccf909f4..3dfb3dd8 100644 --- a/src/server/game/mod/collect/Collect.go +++ b/src/server/game/mod/collect/Collect.go @@ -39,12 +39,12 @@ func (c *Collect) GetReward(Id, Num int) ([]*item.Item, error) { // 判断是否已领取 for _, v := range c.Reward { if v == Id { - return nil, fmt.Errorf("已领取") + return nil, fmt.Errorf("id : %d;已领取", Id) } } Need := collectCfg.GetRewardNeed(Id) if Num < Need { - return nil, fmt.Errorf("收集数量不足") + return nil, fmt.Errorf("id : %d;收集数量不足 %d", Id, Need) } // 领取奖励 c.Reward = append(c.Reward, Id) diff --git a/src/server/game/mod/emoji/emoji.go b/src/server/game/mod/emoji/emoji.go index ef72caf6..5d28a0aa 100644 --- a/src/server/game/mod/emoji/emoji.go +++ b/src/server/game/mod/emoji/emoji.go @@ -79,7 +79,7 @@ func (e *EmojiMod) GetEmojiSet() map[int32]int32 { } func (e *EmojiMod) BackData() []*msg.EmojiInfo { - l := make([]*msg.EmojiInfo, 0) + l := make([]*msg.EmojiInfo, 0, len(e.List)) for k, v := range e.List { l = append(l, &msg.EmojiInfo{ Id: int32(k), diff --git a/src/server/game/mod/endless/Endless.go b/src/server/game/mod/endless/Endless.go index 28f59309..13d82517 100644 --- a/src/server/game/mod/endless/Endless.go +++ b/src/server/game/mod/endless/Endless.go @@ -2,9 +2,11 @@ package endless import ( "fmt" + "math" endlessCfg "server/conf/endless" "server/game/mod/item" "server/msg" + "sort" ) type EndlessMod struct { @@ -39,14 +41,23 @@ func (e *EndlessMod) ZeroUpdate(MaxMoney float64, Lv int) { FirstMoney := 0.0 if MaxMoney > 0 { m := MaxMoney / 10 - GradeList := []float64{1.99, 3.99, 5.99, 9.99} - for i := 0; i < len(GradeList); i++ { - if m < GradeList[i] { - FirstMoney = GradeList[i] - break - } + GradeList := []float64{1.99, 3.99, 5.99, 7.99, 9.99} + type duch struct { + Grade float64 + Num float64 } - + duchList := make([]duch, 0, len(GradeList)) + for _, v := range GradeList { + duchList = append(duchList, duch{ + Grade: v, + Num: math.Abs(v - m), + }) + } + // 按照Num升序排序 + sort.Slice(duchList, func(i, j int) bool { + return duchList[i].Num < duchList[j].Num + }) + FirstMoney = duchList[0].Grade if FirstMoney == 0 { FirstMoney = 9.99 } diff --git a/src/server/game/mod/endless/endless_func.go b/src/server/game/mod/endless/endless_func.go index d59212d7..0a3ab7dd 100644 --- a/src/server/game/mod/endless/endless_func.go +++ b/src/server/game/mod/endless/endless_func.go @@ -1,50 +1,56 @@ package endless import ( + "math" endlessCfg "server/conf/endless" "server/game/mod/item" Util "server/game_util" ) // 初始化奖励 -func InitReward(Diamond float64, Order, Lv int) []*item.Item { +func InitReward(Energy float64, Order, Lv int) []*item.Item { numRand := map[int]int{1: 30, 2: 60, 3: 10} Num := Util.RandMap(numRand) - PerDiamond := endlessCfg.GetPerDiamond(item.ITEM_ENERGY_ID) - + PerEnergy := endlessCfg.GetPerEnergy(item.ITEM_ENERGY_ID) + getNum := func(energy, preEnergy float64) int { + num := int(energy / preEnergy) + num = int(math.Round(float64(num)/5.0) * 5) + return max(num, 5) // 最少5个能量 + } if Num == 1 { - return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(float64(Diamond)/PerDiamond))} + ItemNum := getNum(Energy, PerEnergy) + return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, ItemNum)} } if Num == 2 { - ItemId := endlessCfg.GetItemId(Diamond, 0, Lv) + ItemId := endlessCfg.GetItemId(Energy, 0, Lv) if len(ItemId) == 0 { - return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(Diamond/PerDiamond))} + return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, getNum(Energy, PerEnergy))} } RandItem := Util.RandSlice(ItemId) - ItemDiamond := endlessCfg.GeDiamondByItemId(RandItem) - LastDiamond := Diamond - ItemDiamond - ItemNum := int(LastDiamond / PerDiamond) + ItemEnergy := endlessCfg.GetEnergyByItemId(RandItem) + LastEnergy := Energy - ItemEnergy + ItemNum := getNum(LastEnergy, PerEnergy) return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, ItemNum), item.NewItem(RandItem, 1)} } if Num == 3 { - ItemId := endlessCfg.GetItemId(Diamond, 0, Lv) + ItemId := endlessCfg.GetItemId(Energy, 0, Lv) if len(ItemId) == 0 { - return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(Diamond/PerDiamond))} + return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, getNum(Energy, PerEnergy))} } RandItem1 := Util.RandSlice(ItemId) Type := endlessCfg.GetType(RandItem1) - ItemDiamond := endlessCfg.GeDiamondByItemId(RandItem1) - LastDiamond := Diamond - ItemDiamond - ItemId = endlessCfg.GetItemId(LastDiamond, Type, Lv) + ItemEnergy := endlessCfg.GetEnergyByItemId(RandItem1) + LastEnergy := Energy - ItemEnergy + ItemId = endlessCfg.GetItemId(LastEnergy, Type, Lv) if len(ItemId) == 0 { - ItemNum := int(LastDiamond / PerDiamond) + ItemNum := getNum(LastEnergy, PerEnergy) return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, ItemNum), item.NewItem(RandItem1, 1)} } RandItem2 := Util.RandSlice(ItemId) - ItemDiamond = endlessCfg.GeDiamondByItemId(RandItem2) - LastDiamond = LastDiamond - ItemDiamond - ItemNum := int(LastDiamond / PerDiamond) + ItemEnergy = endlessCfg.GetEnergyByItemId(RandItem2) + LastEnergy = LastEnergy - ItemEnergy + ItemNum := getNum(LastEnergy, PerEnergy) return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, ItemNum), item.NewItem(RandItem1, 1), item.NewItem(RandItem2, 1)} } @@ -53,7 +59,7 @@ func InitReward(Diamond float64, Order, Lv int) []*item.Item { // 初始化档次奖励 func initGrade(Money float64, Auto, Lv int) (map[int]*Endless, int) { - Diamond := endlessCfg.GetDiamond(Money) + Energy := endlessCfg.GetEnergy(Money) Per := []float64{0.5, 0.3, 0.2, 0.1} result := make(map[int]*Endless) for i := 1; i < 5; i++ { @@ -71,7 +77,7 @@ func initGrade(Money float64, Auto, Lv int) (map[int]*Endless, int) { result[Auto] = &Endless{ ChargeId: Charge, Type: Type, - Items: InitReward(Diamond*Per[i-1], i, Lv), + Items: InitReward(Energy*Per[i-1], i, Lv), } Auto++ } diff --git a/src/server/game/mod/face/Face.go b/src/server/game/mod/face/Face.go index 81b622d4..da51aa60 100644 --- a/src/server/game/mod/face/Face.go +++ b/src/server/game/mod/face/Face.go @@ -80,7 +80,7 @@ func (a *FaceMod) Unlock(Id, Time int) error { } func (f *FaceMod) BackData() []*msg.FaceInfo { - l := make([]*msg.FaceInfo, 0) + l := make([]*msg.FaceInfo, 0, len(f.List)) for k, v := range f.List { l = append(l, &msg.FaceInfo{ Id: int32(k), diff --git a/src/server/game/mod/friend/Friend.go b/src/server/game/mod/friend/Friend.go index 2bb2c8f5..23b38cb5 100644 --- a/src/server/game/mod/friend/Friend.go +++ b/src/server/game/mod/friend/Friend.go @@ -25,6 +25,13 @@ type FriendMod struct { ActivityLog []*ActLogInfo // 活动日志 ReplyList []*ReplyInfo // 好友回复列表 DailySponsor int // 好友赞助次数 + RecommendList map[int]*Recommend + DailyGetApply int // 每日获得申请次数 +} + +type Recommend struct { + Uid int + Time int64 } type ReplyInfo struct { @@ -54,6 +61,7 @@ type BubbleInfo struct { type FriendInfo struct { AddTime int64 + DelTime int64 Interact []*Interact // 拜访记录 } @@ -205,10 +213,14 @@ func (f *FriendMod) InitData() { } } } + if f.RecommendList == nil { + f.RecommendList = make(map[int]*Recommend) + } } func (f *FriendMod) ZeroUpdate() { f.DailySponsor = f.GetDailySponsorLimit() + f.DailyGetApply = 0 } func (f *FriendMod) GetNpc() []int { @@ -276,6 +288,7 @@ func (f *FriendMod) GetAddTime(id int) int64 { func (f *FriendMod) AddFriend(id int) { f.NewFriendList[id] = &FriendInfo{ AddTime: GoUtil.Now(), + DelTime: 0, } delete(f.ApplyList, id) } @@ -297,12 +310,19 @@ func (f *FriendMod) DelCardInfo(Id string) { } func (f *FriendMod) DelFriend(id int) { - delete(f.NewFriendList, id) + f.NewFriendList[id].DelTime = GoUtil.Now() } func (f *FriendMod) CheckFriend(Uid int) bool { _, ok := f.NewFriendList[Uid] - return ok + if !ok { + return false + } + return f.NewFriendList[Uid].DelTime == 0 +} + +func (f *FriendMod) GetFriendLen() int { + return len(f.GetFriendList()) } func (f *FriendMod) RefuseApply(id int) { @@ -315,30 +335,51 @@ func (f *FriendMod) CheckApply(id int) bool { return ok } func (f *FriendMod) GetFriendNum() int { - return len(f.NewFriendList) + i := 0 + for _, v := range f.NewFriendList { + if v.DelTime == 0 { + i++ + } + } + return i } func (f *FriendMod) GetFriendList() map[int]*FriendInfo { - return f.NewFriendList + res := make(map[int]*FriendInfo) + for k, v := range f.NewFriendList { + if v.DelTime == 0 { + res[k] = v + } + } + return res } func (f *FriendMod) GetSimpleFriendList() []int { rs := make([]int, 0, len(f.NewFriendList)) - for k := range f.NewFriendList { + for k, v := range f.NewFriendList { + if v.DelTime != 0 { + continue + } rs = append(rs, k) } return rs } +func (f *FriendMod) CheckAddBefore(uid int) bool { + _, ok := f.NewFriendList[uid] + return ok +} // 收到申请 -func (f *FriendMod) AddFriendApply(Uid int) { +func (f *FriendMod) AddFriendApply(Uid int) bool { + if f.DailyGetApply >= 30 { + return true + } f.ApplyList[Uid] = GoUtil.Now() + f.DailyGetApply++ + return false } // 发送申请 func (f *FriendMod) AddSendApply(Uid int) bool { - if _, ok := f.SendApply[Uid]; ok { - return true - } f.SendApply[Uid] = GoUtil.Now() return false } @@ -348,6 +389,13 @@ func (f *FriendMod) CheckSendApply(Id int) bool { return ok } +func (f *FriendMod) GetSendApplyTime(Id int) int64 { + if t, ok := f.SendApply[Id]; ok { + return t + } + return 0 +} + func (f *FriendMod) AgreeApply(UId int) { f.AddFriend(UId) delete(f.SendApply, UId) @@ -559,5 +607,26 @@ func (f *FriendMod) GetSponsorReward() ([]*item.Item, error) { return nil, fmt.Errorf("no sponsor left") } f.DailySponsor-- - return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, 25)}, nil + itemNum := friendCfg.GetFriendSponsorNum() + return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, itemNum)}, nil +} + +func (f *FriendMod) AddRecommend(Uid int) { + for _, v := range f.RecommendList { + if v.Uid == Uid { + v.Time = GoUtil.Now() + return + } + } + f.RecommendList[Uid] = &Recommend{ + Uid: Uid, + Time: GoUtil.Now(), + } +} + +func (f *FriendMod) GetRecommendTime(uid int) int64 { + if recommend, ok := f.RecommendList[uid]; ok { + return recommend.Time + } + return 0 } diff --git a/src/server/game/mod/item/Item.go b/src/server/game/mod/item/Item.go index 89fb1e2c..52ded44c 100644 --- a/src/server/game/mod/item/Item.go +++ b/src/server/game/mod/item/Item.go @@ -175,7 +175,7 @@ func Merge(Item1, Item2 []*Item) []*Item { for _, v := range Item2 { l[v.Id] += v.Num } - res := make([]*Item, 0) + res := make([]*Item, 0, len(l)) for k, v := range l { res = append(res, &Item{ Id: k, @@ -188,7 +188,7 @@ func MutilItem(i []*Item, num int) []*Item { if i == nil { return nil } - res := make([]*Item, 0) + res := make([]*Item, 0, len(i)) for _, v := range i { res = append(res, &Item{ Id: v.Id, @@ -202,7 +202,7 @@ func MutilItemFloat(i []*Item, num float64) []*Item { if i == nil { return nil } - res := make([]*Item, 0) + res := make([]*Item, 0, len(i)) for _, v := range i { res = append(res, &Item{ Id: v.Id, diff --git a/src/server/game/mod/limited_time_event/limited_time_event.go b/src/server/game/mod/limited_time_event/limited_time_event.go index 62aa7f98..1246bcf0 100644 --- a/src/server/game/mod/limited_time_event/limited_time_event.go +++ b/src/server/game/mod/limited_time_event/limited_time_event.go @@ -49,7 +49,8 @@ type LimitedTimeEventMod struct { BonusNum int First bool FirstReward bool - CatDaySale bool // 是否参与猫咪大甩卖活动 + CatDaySale bool // 是否参与猫咪大甩卖活动 + LastCatDaySale int64 // 上次开启猫咪大甩卖时间 } type LTEInfo struct { @@ -205,6 +206,9 @@ func (l *LimitedTimeEventMod) Trigger(Lv int) (int, []int, []int) { // 增加限时事件 func (l *LimitedTimeEventMod) AddEvent(EventId, Duration int) int64 { v, ok := l.EventList[EventId] + if EventId == EVENT_TYPE_CAT_DAY_SALE { + l.LastCatDaySale = GoUtil.Now() + } if ok && v.StartT+v.Remian > GoUtil.Now() { // 事件未过期 v.Remian += int64(Duration) @@ -270,36 +274,15 @@ func (l *LimitedTimeEventMod) ProgressBackData() *msg.ResLimitEventProgress { // 获取流星雨奖励 func (l *LimitedTimeEventMod) GetMeteorReward(MergeList, EmitList []int) []*item.Item { - eneryg := 0 - for _, v := range MergeList { - ChessLv := mergeDataCfg.GetLvById(v) - Color := mergeDataCfg.GetColorById(v) - EmitId := order.GetEmitByColor(EmitList, Color) - if EmitId == 0 { - continue - } - NewChessLv := mergeDataCfg.DynamicLevRev(ChessLv, EmitId, Color) - eneryg += int(math.Pow(2, float64(NewChessLv))) - } - - NewStar := int(max(math.Ceil(float64(eneryg)/0.36*0.1), 1)) + energy := order.GetVirtualEnergy(MergeList, EmitList) + NewStar := int(max(math.Ceil(float64(energy)/0.36*0.1), 1)) return []*item.Item{{Id: item.ITEM_STAR_ID, Num: NewStar}} } // 获取宝箱雨奖励 func (l *LimitedTimeEventMod) GetChestReward(MergeList, EmitList []int) []*item.Item { - eneryg := 0 - for _, v := range MergeList { - ChessLv := mergeDataCfg.GetLvById(v) - Color := mergeDataCfg.GetColorById(v) - EmitId := order.GetEmitByColor(EmitList, Color) - if EmitId == 0 { - continue - } - NewChessLv := mergeDataCfg.DynamicLevRev(ChessLv, EmitId, Color) - eneryg += int(math.Pow(2, float64(NewChessLv-1))) - } - star := math.Ceil(float64(eneryg) / 10 / 2.5) + energy := order.GetVirtualEnergy(MergeList, EmitList) + star := math.Ceil(float64(energy) / 10 / 2.5) return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, int(star))} } @@ -377,6 +360,10 @@ func (l *LimitedTimeEventMod) SelectProgressReward(Id, Lv, Energy int) ([]*item. if Energy < limitedTimeEventCfg.GetHighRollerNeedEnergy() { delete(RandMap, limitedTimeEventCfg.GetJackpotIdByType(EVENT_TYPE_HIGH_ROLLER)) } + if GoUtil.Now()-l.LastCatDaySale < limitedTimeEventCfg.GetCatSaleCD() { + // 参与猫咪大甩卖活动时,猫咪大甩卖事件不进池子 + delete(RandMap, limitedTimeEventCfg.GetJackpotIdByType(EVENT_TYPE_CAT_DAY_SALE)) + } n := 0 r := make([]int, 0) LastOption := l.LastOption diff --git a/src/server/game/mod/mail/Mail.go b/src/server/game/mod/mail/Mail.go index 53e08245..5b4ada0a 100644 --- a/src/server/game/mod/mail/Mail.go +++ b/src/server/game/mod/mail/Mail.go @@ -36,6 +36,10 @@ type MailInfo struct { TitlePtBr string SubTitlePtBr string ContentPtBr string + // 西班牙语 拉丁美洲 + TitleEsLatam string + SubTitleEsLatam string + ContentEsLatam string Items []*item.Item // 邮件道具 Type int //邮件类型 @@ -63,6 +67,11 @@ type MailStruct struct { SubTitlePtBr string ContentPtBr string + // 西班牙语 拉丁美洲 + TitleEsLatam string + SubTitleEsLatam string + ContentEsLatam string + Items []*item.Item Type int } @@ -81,30 +90,16 @@ func (m *MailMod) SendMail(mail *MailStruct) int { SubTitleEn: mail.SubTitleEn, ContentEn: mail.ContentEn, - TitlePtBr: mail.TitlePtBr, - SubTitlePtBr: mail.SubTitlePtBr, - ContentPtBr: mail.ContentPtBr, - Items: mail.Items, - Send: GoUtil.Now(), - Type: mail.Type, - Status: MAIL_STATUS_IDLE, - } - return m.AutoId -} - -// 发送邮件 -func (m *MailMod) Send(Title, SubTitle, Content, TitleEn, SubTitleEn, ContentEn string, Items []*item.Item, t int) int { - m.AutoId++ - m.List[m.AutoId] = &MailInfo{ - Title: Title, - SubTitle: SubTitle, - Content: Content, - TitleEn: TitleEn, - SubTitleEn: SubTitleEn, - ContentEn: ContentEn, - Items: Items, - Send: GoUtil.Now(), - Type: t, + TitlePtBr: mail.TitlePtBr, + SubTitlePtBr: mail.SubTitlePtBr, + ContentPtBr: mail.ContentPtBr, + TitleEsLatam: mail.TitleEsLatam, + SubTitleEsLatam: mail.SubTitleEsLatam, + ContentEsLatam: mail.ContentEsLatam, + Items: mail.Items, + Send: GoUtil.Now(), + Type: mail.Type, + Status: MAIL_STATUS_IDLE, } return m.AutoId } @@ -167,10 +162,13 @@ func (m *MailMod) BackData() *msg.ResMailList { TitlePtBr: v.TitlePtBr, SubTitlePtBr: v.SubTitlePtBr, ContentPtBr: v.ContentPtBr, + TitleEsLa: v.TitleEsLatam, + SubTitleEsLa: v.SubTitleEsLatam, + ContentEsLa: v.ContentEsLatam, + Type: int32(v.Type), Items: item.ItemToMsg(v.Items), Status: int32(v.Status), Time: int32(v.Send), - Type: int32(v.Type), } } return res @@ -192,10 +190,13 @@ func (m *MailMod) NotifyMail(Id int) *msg.MailNotify { SubTitlePtBr: mailInfo.SubTitlePtBr, ContentPtBr: mailInfo.ContentPtBr, - Type: int32(mailInfo.Type), - Items: item.ItemToMsg(mailInfo.Items), - Status: int32(mailInfo.Status), - Time: int32(mailInfo.Send), + TitleEsLa: mailInfo.TitleEsLatam, + SubTitleEsLa: mailInfo.SubTitleEsLatam, + ContentEsLa: mailInfo.ContentEsLatam, + Type: int32(mailInfo.Type), + Items: item.ItemToMsg(mailInfo.Items), + Status: int32(mailInfo.Status), + Time: int32(mailInfo.Send), }, } } diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index 02c7077b..ad79e4e5 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -31,6 +31,10 @@ const ( var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE} var MSG_NOON_UPDATE = &Msg{Type: SERVER_NOON_UPDATE} +const ( + MSG_TYPE_ONLINE = 0 // 在线消息 + MSG_TYPE_OFFLINE = 1 // 离线消息 +) const ( HANDLE_MOD_PLAYER_MSG = 20001 // 玩家消息 HANDLE_MOD_CLUSTER_MSG = 20002 // 集群消息 @@ -48,6 +52,7 @@ const ( HANDLE_MOD_CHAMPSHIP_RANK_INFO = 20014 // 锦标赛排名信息 HANDLE_MOD_CHAMPSHIP_RANK_LIST = 20015 // 锦标赛排行榜 HANDLE_MOD_CHAMPSHIP_PRE_RANK = 20016 // 锦标赛上期排名 + HANDLE_MOD_CHAMPSHIP_GROUP = 20017 // 锦标赛分组 ) const ( @@ -146,7 +151,8 @@ const ( HANDLE_TYPE_CATNIP_SEND_EMOJI // 发送猫薄荷表情 HANDLE_TYPE_CHAMPSHIP_MY_RANK // 锦标赛我的排名 - HANDLE_TYPE_LOGIN // 玩家登录处理 + HANDLE_TYPE_LOGIN // 玩家登录处理 + SERVER_PLAYER_SYNC_LOGOUT_MSG // 玩家处理完离线消息 ) const ( diff --git a/src/server/game/mod/order/Order.go b/src/server/game/mod/order/Order.go index b2247924..28301835 100644 --- a/src/server/game/mod/order/Order.go +++ b/src/server/game/mod/order/Order.go @@ -2,7 +2,6 @@ package order import ( "fmt" - limitedTimeEventCfg "server/conf/limited_time_event" mergeDataCfg "server/conf/merge_data" orderCfg "server/conf/order" "server/game/mod/item" @@ -118,12 +117,7 @@ func (o *OrderMod) RewardOrder(id int) ([]*item.Item, []int, int, int, error) { for _, v := range v.MergeId { Star += mergeDataCfg.GetStarById(v) } - if v.Type == Super_type { - Items := limitedTimeEventCfg.GetSuperOrderReward(Star) - ItemList = append(ItemList, Items...) - } else { - ItemList = v.Items - } + ItemList = v.Items if v.Type == Guide_type { return nil, v.MergeId, v.Type, 0, nil } @@ -452,14 +446,18 @@ func (o *OrderMod) CreateSuperOrder(lv int, Emit []int, EnergyMul int) error { } randNum := 0 mergeList := make([]int, 0) - OrderDiff := DIFF_LOW + // 忽视上一个订单的难度,生成此订单时,难度默认为50%概率的中难度、50%概率的高难度 + OrderDiff := DIFF_MID + if GoUtil.RandNum(1, 100) <= 50 { + OrderDiff = DIFF_HIGH + } var err error for { if randNum > 50 { break } randNum++ - mergeList, OrderDiff, err = randSuperOrderChess(o, lv, Emit, EnergyMul) + mergeList, OrderDiff, err = randSuperOrderChess(o, lv, Emit, EnergyMul, OrderDiff) if err != nil { continue } diff --git a/src/server/game/mod/order/order_func.go b/src/server/game/mod/order/order_func.go index 653a4344..904d1c9b 100644 --- a/src/server/game/mod/order/order_func.go +++ b/src/server/game/mod/order/order_func.go @@ -411,8 +411,23 @@ func GetEmitByColor(Emit []int, color string) int { return 0 } +func GetVirtualEnergy(MergeList, EmitList []int) int { + eneryg := 0 + for _, v := range MergeList { + ChessLv := mergeDataCfg.GetLvById(v) + Color := mergeDataCfg.GetColorById(v) + EmitId := GetEmitByColor(EmitList, Color) + if EmitId == 0 { + continue + } + NewChessLv := mergeDataCfg.DynamicLevRev(ChessLv, EmitId, Color) + eneryg += int(math.Pow(2, float64(NewChessLv-1))) + } + return eneryg +} + // 随机生成超级订单棋子 -func randSuperOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul int) ([]int, int, error) { +func randSuperOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul, OrderDiff int) ([]int, int, error) { initReflectChess(Emit, EnergyMul) filterPool(o) OrderN, err := userCfg.GetOrderNByLv(lv) @@ -425,7 +440,6 @@ func randSuperOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul int) ([]int, } // 生成订单难度和棋子数量 ChessNum := GoUtil.RandMap(RandChessNum) - OrderDiff := DIFF_HIGH ChessDiff := getChessDiff(ChessNum, OrderDiff, OrderN) mergeList := make([]int, 0, len(ChessDiff)) // 根据订单棋子难度生成棋子 diff --git a/src/server/game/mod/playroom/playroom.go b/src/server/game/mod/playroom/playroom.go index b38fe3f4..cd4b1683 100644 --- a/src/server/game/mod/playroom/playroom.go +++ b/src/server/game/mod/playroom/playroom.go @@ -707,6 +707,18 @@ func (p *PlayroomMod) GetTaskReward(Type int) (int, []*item.Item, error) { if GoUtil.InArray(Type, p.DailyTaskReward) { return 0, nil, fmt.Errorf("GetTaskReward Type is already in DailyTaskReward") } + finish := 0 + for _, v := range p.DailyTask { + if v.Status >= quest.QUEST_STATUS_FINISH { + finish++ + } + } + if Type == DAILY_TASK_TYPE_ONE && finish < playroomCfg.GetPlayroomTaskDailyNum1() { + return 0, nil, fmt.Errorf("GetTaskReward Type is DAILY_TASK_TYPE_ONE but finish is %d", finish) + } + if Type == DAILY_TASK_TYPE_TWO && finish < playroomCfg.GetPlayroomTaskDailyNum1()+playroomCfg.GetPlayroomTaskDailyNum2() { + return 0, nil, fmt.Errorf("GetTaskReward Type is DAILY_TASK_TYPE_TWO but finish is %d", finish) + } p.DailyTaskReward = append(p.DailyTaskReward, Type) Id := 0 var Items []*item.Item @@ -988,7 +1000,7 @@ func (p *PlayroomMod) PlayroomDressSet(DressSet map[int]int) ([]int, map[int]int if dressInfo.EndTime < GoUtil.Now() && dressInfo.EndTime != 0 { return nil, nil, fmt.Errorf("dress timeout") } - if p.DressSet[Type] == 0 && Id != 0 { + if p.DressSet[Type] != Id && Id != 0 { Part = append(Part, Type) } } @@ -1049,35 +1061,6 @@ func (p *PlayroomMod) GetPetAir() map[int]*PetAirInfo { return p.NewPetAir } -// RoomPoint Get Set -func (p *PlayroomMod) GetRoomPoint() int { - return p.RoomPoint -} -func (p *PlayroomMod) SetRoomPoint(Point int) { - p.RoomPoint = Point -} -func (p *PlayroomMod) AddRoomPointInvite(lv int) { - if lv < ROOM_POINT_UNLOCK_LV { - return - } - Point := playroomCfg.GetRoomPointInvite() - p.RoomPoint += Point - if p.RoomPoint < 0 { - p.RoomPoint = 0 - } -} - -func (p *PlayroomMod) AddRoomPointAdd(lv int) { - if lv < ROOM_POINT_UNLOCK_LV { - return - } - Point := playroomCfg.GetRoomPointAdd() - p.RoomPoint += Point - if p.RoomPoint < 0 { - p.RoomPoint = 0 - } -} - func (p *PlayroomMod) BackDataTask() []*msg.DailyTask { DailyTask := make([]*msg.DailyTask, 0) for k, v := range p.DailyTask { diff --git a/src/server/game/mod/quest/Quest.go b/src/server/game/mod/quest/Quest.go index 41a05914..8701be9b 100644 --- a/src/server/game/mod/quest/Quest.go +++ b/src/server/game/mod/quest/Quest.go @@ -15,29 +15,31 @@ const ( ) const ( - TRIGGER_LABEL_MERGELVTIME = "MergeLvTime" - TRIGGER_LABEL_FINISHORDER = "FinishOrder" - TRIGGER_LABEL_ENERGY = "Energy" - TRIGGER_LABEL_STAR = "Star" // 收集宠物币 - TRIGGER_LABEL_DIAMOND = "Diamond" // 消耗钻石 - TRIGGER_LABEL_MERGETIME = "MergeTime" - TRIGGER_LABEL_STOKECAT = "StokeCat" - TRIGGER_LABEL_TAKECAT = "TakeCat" - TRIGGER_LABEL_PLAYCAT = "PlayCat" - TRIGGER_LABEL_FEEDCAT = "FeedCat" - TRIGGER_LABEL_CLEANCAT = "CleanCat" - TRIGGER_LABEL_UPLV = "UpLv" // 升级 - TRIGGER_LABEL_LOGIN = "Login" // 登录 - TRIGGER_LABEL_GUIDE_LOGIN = "GuideLogin" // 新手任务登录 - TRIGGER_LABEL_INTERACT = "Interact" // 互动 - TRIGGER_LABEL_PETDRESS = "PetDress" // 宠物换装 - TRIGGER_LABEL_VISITROOM = "VisitRoom" // 参观房间 - TRIGGER_LABEL_PETTREASURE = "PetTreasure" // 宠物寻宝 - TRIGGER_LABEL_ROOMDEC = "RoomDec" // 房间装饰 - TRIGGER_LABEL_PETWORK = "PetWork" // 宠物工作 - TRIGGER_LABEL_DECORATE = "Decorate" // 装饰 - TRIGGER_LABEL_PURCHASE = "Purchase" // 购买任意物品 - TRIGGER_LABEL_BUBBLE = "Bubble" // 使用钻石打开气泡 + TRIGGER_LABEL_MERGELVTIME = "MergeLvTime" + TRIGGER_LABEL_FINISHORDER = "FinishOrder" + TRIGGER_LABEL_ENERGY = "Energy" + TRIGGER_LABEL_STAR = "Star" // 收集宠物币 + TRIGGER_LABEL_DIAMOND = "Diamond" // 消耗钻石 + TRIGGER_LABEL_MERGETIME = "MergeTime" + TRIGGER_LABEL_STOKECAT = "StokeCat" + TRIGGER_LABEL_TAKECAT = "TakeCat" + TRIGGER_LABEL_PLAYCAT = "PlayCat" + TRIGGER_LABEL_FEEDCAT = "FeedCat" + TRIGGER_LABEL_CLEANCAT = "CleanCat" + TRIGGER_LABEL_UPLV = "UpLv" // 升级 + TRIGGER_LABEL_LOGIN = "Login" // 登录 + TRIGGER_LABEL_GUIDE_LOGIN = "GuideLogin" // 新手任务登录 + TRIGGER_LABEL_INTERACT = "Interact" // 互动 + TRIGGER_LABEL_PETDRESS = "PetDress" // 宠物换装 + TRIGGER_LABEL_VISITROOM = "VisitRoom" // 参观房间 + TRIGGER_LABEL_PETTREASURE = "PetTreasure" // 宠物寻宝 + TRIGGER_LABEL_ROOMDEC = "RoomDec" // 房间装饰 + TRIGGER_LABEL_PETWORK = "PetWork" // 宠物工作 + TRIGGER_LABEL_DECORATE = "Decorate" // 装饰 + TRIGGER_LABEL_PURCHASE = "Purchase" // 购买任意物品 + TRIGGER_LABEL_BUBBLE = "Bubble" // 使用钻石打开气泡 + TRIGGER_LABEL_PLAYROOM_UPVOTE = "PlayRoomUpvote" // 给房间点赞 + TRIGGER_LABEL_PLAYROOM_GAME = "PlayRoomGame" // 玩房间小游戏 ) type QuestProgress struct { @@ -107,10 +109,15 @@ func TriggerQuestProgress(q *QuestProgress, Tr *Trigger) bool { if len(q.A) == 0 { return false } - DressType := GoUtil.Int(q.A[0]) - Ids := Tr.A[0].([]int) - if GoUtil.InArray(DressType, Ids) { - q.Num += 1 + if len(Tr.A) == 0 { + return false + } + Ids := GoUtil.IntSliceInterface(q.A) + arg := GoUtil.IntSlice(Tr.A[0]) + for _, t := range arg { + if GoUtil.InArray(t, Ids) { + q.Num += 1 + } } default: q.Num += 1 diff --git a/src/server/game/mod/race/race.go b/src/server/game/mod/race/race.go index 2a5b1628..f1b3e3cf 100644 --- a/src/server/game/mod/race/race.go +++ b/src/server/game/mod/race/race.go @@ -108,7 +108,7 @@ func (r *RaceMod) GetReward() ([]*item.Item, error) { } func randOpponents(OpponentNum int) []*Opponent { - Opponent := make([]*Opponent, 0) + Opponent := make([]*Opponent, 0, OpponentNum-1) names := randnameCfg.GetRandNames(OpponentNum) for i := 1; i < OpponentNum; i++ { Opponent = append(Opponent, randOpponent(i, names[i])) diff --git a/src/server/game/mod/seven_login/seven_login_func.go b/src/server/game/mod/seven_login/seven_login_func.go index f86a0b6f..a861918a 100644 --- a/src/server/game/mod/seven_login/seven_login_func.go +++ b/src/server/game/mod/seven_login/seven_login_func.go @@ -50,7 +50,7 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(Num))} // 奖励2 - NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0) + NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != JACKPOT_CARD_TYPE { NewJackpot = append(NewJackpot, v) @@ -65,7 +65,7 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot RemainDiamond -= 5 } if GoUtil.InArray(RewardData.Id, CardPackIds) { - CardJackpot := make([]*gamedata.SevenLoginJackpotData, 0) + CardJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { if v.Diamond <= RemainDiamond && v.Type == JACKPOT_CARD_TYPE { CardJackpot = append(CardJackpot, v) @@ -88,7 +88,7 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot Item3 := make([]*item.Item, 0) if RewardData.RewardNum == 3 { RemainDiamond += 5 - NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0) + NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != Item2Type { NewJackpot3 = append(NewJackpot3, v) diff --git a/src/server/game/mod_factory.go b/src/server/game/mod_factory.go index 3b8c07bb..2a22b68d 100644 --- a/src/server/game/mod_factory.go +++ b/src/server/game/mod_factory.go @@ -1,9 +1,14 @@ package game import ( + "server/game/mod/base" + "server/game/mod/card" + "server/game/mod/charge" "server/game/mod/chess" "server/game/mod/decorate" + "server/game/mod/endless" limitedTimeEvent "server/game/mod/limited_time_event" + "server/game/mod/playroom" ) func (p *Player) GetChessMod() *chess.ChessBorad { @@ -17,3 +22,23 @@ func (p *Player) GetDecorateMod() *decorate.Decorate { func (p *Player) GetLimitEventMod() *limitedTimeEvent.LimitedTimeEventMod { return p.PlayMod.getLimitedTimeEventMod() } + +func (p *Player) GetCardMod() *card.CardMod { + return p.PlayMod.getCardMod() +} + +func (p *Player) GetPlayroomMod() *playroom.PlayroomMod { + return p.PlayMod.getPlayroomMod() +} + +func (p *Player) GetEndlessMod() *endless.EndlessMod { + return p.PlayMod.getEndlessMod() +} + +func (p *Player) GetBaseMod() *base.Base { + return p.PlayMod.getBaseMod() +} + +func (p *Player) GetChargeMod() *charge.ChargeMod { + return p.PlayMod.getChargeMod() +} diff --git a/src/server/game/player_back.go b/src/server/game/player_back.go index cb327656..13859022 100644 --- a/src/server/game/player_back.go +++ b/src/server/game/player_back.go @@ -5,7 +5,6 @@ import ( playroomCfg "server/conf/playroom" "server/game/mod/item" limitedTimeEvent "server/game/mod/limited_time_event" - "server/game/mod/msg" GoUtil "server/game_util" proto "server/msg" ) @@ -25,10 +24,13 @@ func (p *Player) PlayroomBackData() { FriendMod := p.PlayMod.getFriendMod() r.Status = int32(PlayroomMod.Status) r.Items = item.ItemToMsg(PlayroomMod.Reward) - Opponent := make([]*proto.RoomOpponent, 0) - FriendList := make([]*proto.FriendRoom, 0) + + // 预分配切片容量,避免动态扩容 + visitorCount := len(PlayroomMod.Visitor) + Opponent := make([]*proto.RoomOpponent, 0, visitorCount) + FriendList := make([]*proto.FriendRoom, 0, len(FriendMod.GetFriendList())) if PlayroomMod.Target == 0 { - PlayroomMod.Target = p.GetVisitorPlayer() + PlayroomMod.SetTarget(p.GetVisitorPlayer()) } TargerRoom := &proto.FriendRoom{} if PlayroomMod.Target != 0 { @@ -75,8 +77,11 @@ func (p *Player) PlayroomBackData() { r.Opponent = Opponent r.Friend = FriendList r.Target = TargerRoom - Collect := make([]*proto.PlayroomCollectInfo, 0) - for _, v := range PlayroomMod.GetCollect() { + + // 预分配装饰品切片容量 + collectList := PlayroomMod.GetCollect() + Collect := make([]*proto.PlayroomCollectInfo, 0, len(collectList)) + for _, v := range collectList { Collect = append(Collect, &proto.PlayroomCollectInfo{ Id: int32(v.Id), AddTime: v.AddTime, @@ -99,14 +104,16 @@ func (p *Player) PlayroomBackData() { }) Dress[int32(v.Part)] = PlayroomDress } - ChipMessage := make([]*proto.ChipInfo, 0) + // 预分配芯片列表容量 + ChipMessage := make([]*proto.ChipInfo, 0, len(PlayroomMod.ChipList)) for _, v := range PlayroomMod.ChipList { ChipMessage = append(ChipMessage, &proto.ChipInfo{ Uid: int64(v.Uid), EmojiId: int32(v.Emoji), }) } - AdWatch := make([]*proto.AdItem, 0) + // 预分配广告列表容量 + AdWatch := make([]*proto.AdItem, 0, len(PlayroomMod.ADItem)) for k, v := range PlayroomMod.ADItem { AdWatch = append(AdWatch, &proto.AdItem{ Watch: int32(v.Watch), @@ -117,8 +124,10 @@ func (p *Player) PlayroomBackData() { r.Dress = Dress r.DressSet = GoUtil.MapIntToInt32(PlayroomMod.GetDressSet()) - PetAir := make([]*proto.PlayroomAirInfo, 0) - for _, v := range PlayroomMod.GetPetAir() { + // 预分配宠物空气列表容量 + petAirList := PlayroomMod.GetPetAir() + PetAir := make([]*proto.PlayroomAirInfo, 0, len(petAirList)) + for _, v := range petAirList { PetAir = append(PetAir, &proto.PlayroomAirInfo{ Id: int32(v.Id), AddTime: int64(v.AddTime), @@ -295,29 +304,23 @@ func (p *Player) ChargeBackData() { func (p *Player) BackChampship() { ChampshipMod := p.PlayMod.getChampshipMod() - MyRank, MyPreRank := p.GetChampshipRank() - p.PushClientRes(ChampshipMod.BackData(MyRank, MyPreRank)) + rank, preRank := p.GetChampshipRank() + p.PushClientRes(ChampshipMod.BackData(rank, preRank)) } +// 获取冠军赛排名 redis缓存 func (p *Player) GetChampshipRank() (int, int) { - MyRank := 0 - MyPreRank := 0 - res, _ := SendMsgToCenterSync(&msg.Msg{ - From: int(p.M_DwUin), - HandleType: msg.HANDLE_MOD_CHAMPSHIP_RANK_INFO, - }) - if res != nil { - MyRank = res.Extra.([]int)[0] - MyPreRank = res.Extra.([]int)[1] - } - return MyRank, MyPreRank + preRank, rank, _, _ := GetRankCache(int(p.M_DwUin)) + return rank, preRank } // 返回好友信息 func (p *Player) FriendListBackData() { FriendMod := p.PlayMod.getFriendMod() - var fl []*proto.ResPlayerSimple - for k, v := range FriendMod.GetFriendList() { + friendList := FriendMod.GetFriendList() + // 预分配切片容量 + fl := make([]*proto.ResPlayerSimple, 0, len(friendList)) + for k, v := range friendList { if k == int(p.M_DwUin) { continue } @@ -328,7 +331,8 @@ func (p *Player) FriendListBackData() { fl = append(fl, ps) } } - ReqFriendList := make([]int64, 0) + // 预分配申请列表容量 + ReqFriendList := make([]int64, 0, len(FriendMod.SendApply)) for k := range FriendMod.SendApply { ReqFriendList = append(ReqFriendList, int64(k)) } @@ -342,7 +346,8 @@ func (p *Player) FriendListBackData() { func (p *Player) FriendApplyBackData() { FriendMod := p.PlayMod.getFriendMod() - var al []*proto.ResFriendApplyInfo + // 预分配切片容量 + al := make([]*proto.ResFriendApplyInfo, 0, len(FriendMod.ApplyList)) for k, v := range FriendMod.ApplyList { ps := G_GameLogicPtr.GetResSimplePlayerByUid(k) if ps != nil { @@ -359,7 +364,8 @@ func (p *Player) FriendApplyBackData() { func (p *Player) FriendLogBackData() { FriendMod := p.PlayMod.getFriendMod() - var log []*proto.ResFriendLog + // 预分配切片容量 + log := make([]*proto.ResFriendLog, 0, len(FriendMod.Log)) for _, v := range FriendMod.Log { ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid) if ps == nil { @@ -376,7 +382,8 @@ func (p *Player) FriendLogBackData() { Upvote: v.Upvote, }) } - var reply []*proto.ResFriendReply + // 预分配回复列表容量 + reply := make([]*proto.ResFriendReply, 0, len(FriendMod.ReplyList)) for _, v := range FriendMod.ReplyList { ps := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid) if ps == nil { @@ -402,7 +409,8 @@ func (p *Player) FriendLogBackData() { func (p *Player) FriendCardBackData() { FriendMod := p.PlayMod.getFriendMod() - var msgList []*proto.ResFriendCard + // 预分配切片容量 + msgList := make([]*proto.ResFriendCard, 0, len(FriendMod.Card)) for _, v := range FriendMod.Card { m := GetCardInfoMsg(v) msgList = append(msgList, m) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index b368c3f7..1fe85f8c 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -1081,10 +1081,6 @@ func (p *Player) TeLog(Type string, Param map[string]interface{}) { go ga.GAlogEvent(Type, BaseMod.Account, "", Param) } -func (p *Player) Kafka(Type string, Param map[string]interface{}) { - -} - // 初始化活动 func (p *Player) initAcitivity() { p.activity = make(map[int]*ActivityInfo) @@ -1198,27 +1194,28 @@ func (p *Player) GetIp() string { return p.GetAgent().RemoteAddr().String() } +// TODO func_exec_add 需要优化成令牌桶算法,目前的实现可能存在性能问题 func (p *Player) func_exec_add() error { now := time.Now().Unix() - + // 如果是新的一秒,重置计数 if now != int64(p.func_time) { p.func_time = int(now) p.args["func_exec_count"] = 1 return nil } - + // 获取当前秒内的调用次数 count := 0 if v, ok := p.args["func_exec_count"]; ok { count = GoUtil.Int(v) } - + // 检查是否超过限制 if count >= 20 { return errors.New("func_exec_add: call limit exceeded (20 times per second)") } - + // 增加计数 p.args["func_exec_count"] = count + 1 return nil @@ -1240,9 +1237,10 @@ func (p *Player) DispatcherHandle() { case msg := <-p.msgChan: if msg != nil { p.wg.Done() - log.Debug("player %d recive msg %v", p.M_DwUin, msg) + now := time.Now() // 直接在当前 goroutine 中处理,避免创建过多 goroutine p.HandleMsg(msg.Clone()) + log.Debug("player %d recive msg %v;handle time %v", p.M_DwUin, msg, time.Since(now)) } } } diff --git a/src/server/game/player_mod.go b/src/server/game/player_mod.go index ad73eff0..5f0330eb 100644 --- a/src/server/game/player_mod.go +++ b/src/server/game/player_mod.go @@ -41,9 +41,17 @@ import ( sevenLogin "server/game/mod/seven_login" Var "server/game/mod/var" "server/pkg/github.com/name5566/leaf/log" + "sync" "time" ) +// buffer 对象池,复用 bytes.Buffer 减少内存分配 +var bufferPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(make([]byte, 0, 128*1024)) + }, +} + type PlayerData struct { Name string IsHaveDataDb bool @@ -238,10 +246,12 @@ func (p *PlayerMod) ClearData(player *Player) { } if p.is_update && !p.IsBlackList() { //序列化模块 - var buf bytes.Buffer - encode := gob.NewEncoder(&buf) + buf := bufferPool.Get().(*bytes.Buffer) + buf.Reset() // 清空之前的数据 + encode := gob.NewEncoder(buf) err := encode.Encode(p.mod_list) if err != nil { + bufferPool.Put(buf) // 即使出错也要归还 log.Debug("uid: %d, SaveData, playmod error %v", player.M_DwUin, err) return } @@ -254,22 +264,33 @@ func (p *PlayerMod) ClearData(player *Player) { err = db.SavePlayerModData(modData) if err != nil { + bufferPool.Put(buf) // 即使出错也要归还 log.Debug("uid: %d, SaveData, playmod error %v", player.M_DwUin, err) return } p.is_update = false + bufferPool.Put(buf) // 归还到对象池 } } func (p *PlayerMod) BackUp(B *PlayerBackUp) { - var buf bytes.Buffer - encode := gob.NewEncoder(&buf) + // 从对象池获取 buffer,复用以减少内存分配 + buf := bufferPool.Get().(*bytes.Buffer) + buf.Reset() // 清空之前的数据 + + encode := gob.NewEncoder(buf) err := encode.Encode(p.mod_list) if err != nil { log.Debug("Backup, playmod error %v", err) + bufferPool.Put(buf) // 即使出错也要归还 return } - B.PlayMod = buf.Bytes() + + // 复制数据,因为 buf 会被放回池中 + B.PlayMod = append([]byte(nil), buf.Bytes()...) + + // 归还到对象池供下次使用 + bufferPool.Put(buf) } func (p *PlayerMod) Recover(B *PlayerBackUp) { diff --git a/src/server/game/rank_mgr.go b/src/server/game/rank_mgr.go index a3bbdbe0..ed969059 100644 --- a/src/server/game/rank_mgr.go +++ b/src/server/game/rank_mgr.go @@ -98,29 +98,6 @@ func (r *RankMgr) getRank(RankType int) []*Rank { return []*Rank{} } -func (r *RankMgr) getAllRank(RankType int) []*Rank { - if v, ok := r.getData().List[RankType]; ok { - return v - } - return []*Rank{} -} - -func (r *RankMgr) getMyRank(Uid, RankType int) (int, float64) { - if d, ok := r.getData().List[RankType]; ok { - for k, v := range d { - if v.Uid == Uid { - return k + 1, v.Score - } - } - } - return 0, 0.0 -} - -// 设置榜单数据 -func (r *RankMgr) setRank(RankType int, data []*Rank) { - r.getData().List[RankType] = data -} - // 获取排行榜信息 func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) { data := m.Extra.(RankMsg) @@ -132,12 +109,10 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) { if data.RankType == RANK_TYPE_USER { return r.getRedisCountryRankInfo(m) } - rankList := r.getRank(data.RankType) - MyRank, MyScore := r.getMyRank(m.From, data.RankType) return &RankInfo{ - List: rankList, - MyRank: MyRank, - MyScore: MyScore, + List: []*Rank{}, + MyRank: 0, + MyScore: 0, }, nil } @@ -193,32 +168,6 @@ func (r *RankMgr) getRedisRankInfo(m *msg.Msg) (interface{}, error) { // 进入排行榜 func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) { data := m.Extra.(RankMsg) - rankList := r.getRank(data.RankType) - inRank := false - for _, v := range rankList { - if v.Uid == data.Uid { - if v.Score < data.Score { - v.Score = data.Score - v.Time = m.SendT - inRank = true - break - } - return nil, nil - } - } - - if !inRank { - rankList = append(rankList, &Rank{Uid: data.Uid, Score: data.Score, Time: m.SendT}) - } - sort.Slice(rankList, func(i, j int) bool { // 排序 从大到小 数值相等按时间排序 - if rankList[i].Score > rankList[j].Score { - return true - } else if rankList[i].Score == rankList[j].Score { - return rankList[i].Time < rankList[j].Time - } - return false - }) - r.setRank(data.RankType, rankList) if data.RankType == RANK_TYPE_USER { // 全球玩家排行榜 Uid := strconv.Itoa(data.Uid) @@ -234,11 +183,3 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) { r.update = true return nil, nil } - -func (r *RankMgr) ClearRank(RankType int) { - // if RankType == RANK_TYPE_GLOBAL { - // db.RedisDel(RANK_USER) - // return - // } - r.setRank(RankType, []*Rank{}) -} diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index 40f0c981..df581427 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -11,6 +11,7 @@ import ( collectCfg "server/conf/collect" decorateCfg "server/conf/decorate" emojiCfg "server/conf/emoji" + friendCfg "server/conf/friend" GuideTaskCfg "server/conf/guide_task" handbookCfg "server/conf/handbook" limitedTimeEventCfg "server/conf/limited_time_event" @@ -102,12 +103,6 @@ func ReqFriendPlayerSimple(player *Player, buf []byte) error { FriendMod := player.PlayMod.getFriendMod() PlayerSimpleData.AddTime = FriendMod.GetAddTime(Uid) PlayerSimpleData.Interact = FriendMod.GetInteractTime(Uid) - LastActLog := FriendMod.GetActLogLast() - PlayerSimpleData.Last = &msg.ActLog{ - Type: int32(LastActLog.Type), - Time: LastActLog.Time, - Param: LastActLog.Param, - } player.PushClientRes(PlayerSimpleData) return nil } @@ -282,6 +277,11 @@ func ReqRewardOrder(player *Player, buf []byte) error { if OrderType == order.Pet_type { Item = player.FormatPetOrderItem(Item) } + if OrderType == order.Super_type { + virtualEnergy := order.GetVirtualEnergy(mergeList, ChessMod.GetStarEmitList()) + superOrderItem := limitedTimeEventCfg.GetSuperOrderReward(virtualEnergy) + Item = item.Merge(Item, superOrderItem) + } ActItem := player.GetActivityItem(GoUtil.Int32ToInt(req.ActType)) Item = item.Merge(Item, ActItem) if !OrderMod.CheckSuperOrder() { @@ -1862,13 +1862,24 @@ func ReqApplyFriend(player *Player, buf []byte) error { }) return fmt.Errorf("already friend") } - // if FriendMod.AddSendApply(Uid) { - // player.SendErrClienRes(&msg.ResApplyFriend{ - // Code: msg.RES_CODE_FAIL, - // Msg: "already apply", - // }) - // return fmt.Errorf("already apply") - // } + // 好友人数到达上限(2000人)时,玩家将无法再发送好友申请 + if FriendMod.GetFriendLen() >= friendCfg.GetFriendLimitNum() { + player.SendErrClienRes(&msg.ResApplyFriend{ + Code: msg.RES_CODE_FAIL, + Msg: "friend list full", + }) + return fmt.Errorf("friend list full") + } + // 对于任何玩家而言,向自己在24小时内已从任意途径发送过好友申请的玩家再次发送好友申请时,该次申请不会被发出 + sendApplyTime := FriendMod.GetSendApplyTime(Uid) + if sendApplyTime != 0 && GoUtil.Now()-sendApplyTime < 86400 { + player.PushClientRes(&msg.ResApplyFriend{ + Code: msg.RES_CODE_FAIL, + Uid: req.Uid, + Msg: "already applied", + }) + return fmt.Errorf("already applied") + } if req.Type == 1 { Items, err := FriendMod.GetSponsorReward() if err != nil { @@ -1911,10 +1922,6 @@ func ReqApplyFriend(player *Player, buf []byte) error { Code: msg.RES_CODE_SUCCESS, Uid: req.Uid, }) - PlayroomMod := player.PlayMod.getPlayroomMod() - BaseMod := player.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointInvite(BaseMod.GetLevel()) - player.PlayroomBackData() return nil } @@ -1934,15 +1941,19 @@ func ReqAgreeFriend(player *Player, buf []byte) error { }) return fmt.Errorf("apply uid not exist") } - m := &MsqMod.Msg{ - Type: MsqMod.HADNLE_TYPE_AGREE, - From: int(player.M_DwUin), - To: Uid, - SendT: GoUtil.Now(), + // 好友人数到达上限(2000人)时,玩家将无法再同意好友申请 + if FriendMod.GetFriendLen() >= friendCfg.GetFriendLimitNum() { + player.SendErrClienRes(&msg.ResAgreeFriend{ + Code: msg.RES_CODE_FAIL, + Msg: "friend list full", + }) + return fmt.Errorf("friend list full") + } + // 新好友才可以打招呼 + if !FriendMod.CheckAddBefore(Uid) { + FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+24*3600, nil) } - FriendMgrSend(m) FriendMod.AddFriend(Uid) - FriendMod.AddReplyInfo(Uid, friend.REPLY_TYPE_GREETING, "", GoUtil.Now()+24*3600, nil) player.PushClientRes(&msg.ResAgreeFriend{ Code: msg.RES_CODE_SUCCESS, Uid: req.Uid, @@ -1953,12 +1964,15 @@ func ReqAgreeFriend(player *Player, buf []byte) error { "add_type": "接受申请", }) player.AddLog(Uid, friend.LOG_TYPE_FRIEND_BECOME, "", GoUtil.Now()) + m := &MsqMod.Msg{ + Type: MsqMod.HADNLE_TYPE_AGREE, + From: int(player.M_DwUin), + To: Uid, + SendT: GoUtil.Now(), + } + FriendMgrSend(m) player.FriendApplyBackData() player.FriendLogBackData() - PlayroomMod := player.PlayMod.getPlayroomMod() - BaseMod := player.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) - player.PlayroomBackData() player.PlayMod.save() return nil } @@ -2520,7 +2534,11 @@ func ReqGetFriendCard(player *Player, buf []byte) error { } FriendMod.DelCardInfo(req.Id) player.AddCard(CardInfo.CardId) - player.AddLog(CardInfo.AUid, friend.LOG_TYPE_CARD_SEND_ACCEPT, fmt.Sprintf("%d", CardInfo.CardId), GoUtil.Now()) + uid := CardInfo.AUid + if CardInfo.Type == card.TYPE_CARD_GIVE { + uid = CardInfo.BUid + } + player.AddLog(uid, friend.LOG_TYPE_CARD_SEND_ACCEPT, fmt.Sprintf("%d", CardInfo.CardId), GoUtil.Now()) player.PlayMod.save() player.PushClientRes(&msg.ResGetFriendCard{ Code: msg.RES_CODE_SUCCESS, @@ -2961,17 +2979,6 @@ func ReqCreateOrderSn(player *Player, buf []byte) error { // 订单发货 func ReqShippingOrder(player *Player, buf []byte) error { return nil - req := &msg.ReqShippingOrder{} - err := proto.Unmarshal(buf, req) - if err != nil { - return err - } - - go player.TriggerShippingOrder(req) - player.PushClientRes(&msg.ResShippingOrder{ - Code: msg.RES_CODE_SUCCESS, - }) - return nil } // 锦标赛 @@ -3370,10 +3377,6 @@ func ReqAutoAddInviteFriend(player *Player, buf []byte) error { Type: MsqMod.HANDLE_TYPE_INVITE_ADD_FRIEND, SendT: GoUtil.Now(), }) - PlayroomMod := player.PlayMod.getPlayroomMod() - BaseMod := player.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) - player.PlayroomBackData() player.TeLog("friend_add", map[string]interface{}{ "player_id": req.Id, "add_type": "邀请注册", @@ -3414,10 +3417,6 @@ func ReqAutoAddInviteFriend2(player *Player, buf []byte) error { Type: MsqMod.HANDLE_TYPE_INVITE_ADD_FRIEND, SendT: GoUtil.Now(), }) - PlayroomMod := player.PlayMod.getPlayroomMod() - BaseMod := player.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) - player.PlayroomBackData() player.TeLog("friend_add", map[string]interface{}{ "player_id": req.Id, "add_type": "邀请注册", @@ -3969,6 +3968,7 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error { "is_chip": true, "item_list": Items, }) + player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PLAYROOM_GAME}) FriendMod := player.PlayMod.getFriendMod() FriendMod.AddActLog(friend.ACT_LOG_TYPE_GET_VISIT_GAME_PRIZE_1, "") player.UpdateUserInfo() @@ -4132,7 +4132,7 @@ func ReqPlayroomFlip(player *Player, buf []byte) error { }) return err } - player.Kafka("playroom_flip", map[string]interface{}{ + player.TeLog("playroom_flip", map[string]interface{}{ "CardID": CardId, "Id": req.Id, }) @@ -4282,6 +4282,7 @@ func ReqPlayroomUpvote(player *Player, buf []byte) error { Type: MsqMod.HANDLE_TYPE_PLAYROOM_KISS, SendT: GoUtil.Now(), }) + player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_PLAYROOM_UPVOTE}) player.AddPlayroomUpvote(int(req.Id)) player.SetPlayroomKiss(1, int(req.Id)) player.TeLog("visit_like", map[string]interface{}{ @@ -4686,7 +4687,7 @@ func ReqKafkaLog(player *Player, buf []byte) error { if err != nil { return err } - player.Kafka(req.Event, map[string]interface{}{ + player.TeLog(req.Event, map[string]interface{}{ "From": "Client", "data": req.Data, }) @@ -4779,9 +4780,9 @@ func ReqCollect(player *Player, buf []byte) error { case collect.COLLECT_TYPE_EMOJI: AreaType = "emoji" Num = player.PlayMod.getEmojiMod().GetEmojiNum() - case collect.COLLECT_TYPE_FACE: + case collect.COLLECT_TYPE_FACE: // 增加默认头像1个 AreaType = "face" - Num = player.PlayMod.getFaceMod().GetFaceNum() + Num = player.PlayMod.getFaceMod().GetFaceNum() + 1 case collect.COLLECT_TYPE_AVATAR: AreaType = "avatar" Num = player.PlayMod.getAvatarMod().GetAvatarNum() @@ -5046,11 +5047,6 @@ func ReqAddNpc(player *Player, buf []byte) error { } player.PlayMod.save() player.FriendListBackData() - PlayroomMod := player.PlayMod.getPlayroomMod() - BaseMod := player.PlayMod.getBaseMod() - PlayroomMod.AddRoomPointInvite(BaseMod.GetLevel()) - PlayroomMod.AddRoomPointAdd(BaseMod.GetLevel()) - player.PlayroomBackData() player.TeLog("add_npc", map[string]interface{}{ "NpcId": int(req.NpcId), }) diff --git a/src/server/game/trigger_func.go b/src/server/game/trigger_func.go index 0d2a536e..374340ae 100644 --- a/src/server/game/trigger_func.go +++ b/src/server/game/trigger_func.go @@ -30,7 +30,7 @@ const ( func (player *Player) MailTrigger(Tr *quest.Trigger) bool { MailMod := player.PlayMod.getMailMod() TriggerMail := mailCfg.GetTriggerMail() - t := make([]*mailCfg.TriggerMail, 0) + t := make([]*mailCfg.TriggerMail, 0, len(TriggerMail)) for _, v := range TriggerMail { if GoUtil.InArray(v.Id, MailMod.TriggerMail) { continue diff --git a/src/server/game/var_mgr.go b/src/server/game/var_mgr.go index ca08ce94..ee2b5ed2 100644 --- a/src/server/game/var_mgr.go +++ b/src/server/game/var_mgr.go @@ -59,12 +59,31 @@ func (f *VarMgr) Init() { if f.getData().ZeroTime == GoUtil.ZeroTimestamp() { f.ZeroUpdate() } - f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { f.ZeroUpdate() }) } +func (f *VarMgr) fixbug() { + data := f.getData() + data.mu.Lock() + defer data.mu.Unlock() + for k, v := range data.NewUseVar { + if v != nil { + del := true + for _, ved := range v { + if ved.D.(int) != 0 { + del = false + } + } + if del { + delete(data.NewUseVar, k) + } + + } + } +} + func (f *VarMgr) version() { switch v := f.getData().Version; v { case 0: @@ -84,6 +103,10 @@ func (f *VarMgr) version() { } } f.getData().Version = 1 + case 1: + // future version update + f.fixbug() // 修复用户变量冗余数据 + f.getData().Version = 2 } } @@ -148,7 +171,7 @@ func (f *VarMgr) GetUserVar(uid int, key string) *VarExpireData { varData := f.getData().NewUseVar[uid] if varData == nil { varData = make(map[string]*VarExpireData) - f.getData().NewUseVar[uid] = varData + //f.getData().NewUseVar[uid] = varData } ved, ok := varData[key] if !ok { @@ -165,19 +188,6 @@ func (f *VarMgr) SetVar(key string, value interface{}) { SaveCacheVarData(key, f.getData().NewVar[key]) } -func (f *VarMgr) GetVar(key string) *VarExpireData { - if v, ok := f.getData().NewVar[key]; ok { - return v - } - data := &VarExpireData{} - f.getData().NewVar[key] = data - return data -} - -func (f *VarMgr) DelVar(key string) { - delete(f.getData().Var, key) -} - func (f *VarMgr) getData() *VarData { return f.data.(*VarData) } @@ -227,6 +237,8 @@ func SetVarDataHandler(m *msg.Msg) (interface{}, error) { func GetUserVarDataHandler(m *msg.Msg) (interface{}, error) { data := getVarData() + data.mu.Lock() + defer data.mu.Unlock() userVar := &VarExpireData{} if v, ok := m.Extra.(msg.VarData); ok { if varData, ok := data.NewUseVar[m.From]; ok { diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index fde503f6..de953b28 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -14,9 +14,16 @@ import ( "reflect" "strconv" "strings" + "sync" "time" ) +var bufferPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(make([]byte, 0, 128*1024)) + }, +} + // 实例化一个通过字符串映射函数切片的map var eventByName = make(map[string][]*EventObj) @@ -219,12 +226,15 @@ func String(a interface{}) string { } func GobMarshal(data interface{}) ([]byte, error) { - var buf bytes.Buffer - encode := gob.NewEncoder(&buf) + buf := bufferPool.Get().(*bytes.Buffer) + buf.Reset() // 清空之前的数据 + encode := gob.NewEncoder(buf) err := encode.Encode(data) if err != nil { + bufferPool.Put(buf) // 即使出错也要归还 return nil, err } + bufferPool.Put(buf) // 归还到对象池 return buf.Bytes(), nil } diff --git a/src/server/game_util/mapUtil.go b/src/server/game_util/mapUtil.go index 26aa25c8..6fc931e0 100644 --- a/src/server/game_util/mapUtil.go +++ b/src/server/game_util/mapUtil.go @@ -95,3 +95,14 @@ func DiffMap(a, b map[int]int) map[int]int { } return diff } + +func GetMapIntValueByKey(m interface{}, key string) int { + mi, ok := m.(map[string]interface{}) + if !ok { + return 0 + } + if v, ok := mi[key]; ok { + return Int(v) + } + return 0 +} diff --git a/src/server/game_util/mathUtil.go b/src/server/game_util/mathUtil.go index 709ff822..47e65f93 100644 --- a/src/server/game_util/mathUtil.go +++ b/src/server/game_util/mathUtil.go @@ -1,5 +1,7 @@ package GoUtil +import "math/rand" + func RandNum(start int, end int) int { if start > end { return 0 @@ -7,5 +9,5 @@ func RandNum(start int, end int) int { if start == end { return start } - return start + GetRand().Intn(end-start+1) + return start + rand.Intn(end-start+1) } diff --git a/src/server/game_util/sliceUtil.go b/src/server/game_util/sliceUtil.go index be29b52d..51887e22 100644 --- a/src/server/game_util/sliceUtil.go +++ b/src/server/game_util/sliceUtil.go @@ -2,6 +2,7 @@ package GoUtil import ( "fmt" + "math/rand" "reflect" "server/game/mod/item" "sort" @@ -21,6 +22,15 @@ func IntSlice(d interface{}) []int { } return result } + +func IntSliceInterface(d []interface{}) []int { + result := make([]int, 0, len(d)) + for _, v := range d { + num := Int(v) + result = append(result, num) + } + return result +} func IntToInt32(d []int) []int32 { r := make([]int32, 0, len(d)) for _, d := range d { @@ -51,7 +61,7 @@ func RandPopSlice(slice []int) ([]int, int) { if slen == 0 { return slice, -1 } - Id := GetRand().Intn(slen) + Id := rand.Intn(slen) Val := slice[Id] Slice2 := append(slice[0:Id], slice[Id+1:]...) return Slice2, Val @@ -62,7 +72,7 @@ func RandSlice(slice []int) int { if slen == 0 { return 0 } - Id := GetRand().Intn(slen) + Id := rand.Intn(slen) return slice[Id] } @@ -71,7 +81,7 @@ func RandItem(slice []*item.Item) *item.Item { if slen == 0 { return nil } - Id := GetRand().Intn(slen) + Id := rand.Intn(slen) return slice[Id] } @@ -84,7 +94,7 @@ func RandSliceNum(s []int, num int) []int { } for i := 0; i < num; i++ { - Id := GetRand().Intn(len(slice)) + Id := rand.Intn(len(slice)) r = append(r, slice[Id]) slice = append(slice[0:Id], slice[Id+1:]...) } @@ -100,7 +110,7 @@ func RandSliceNum2(s []interface{}, num int) []interface{} { } for i := 0; i < num; i++ { - Id := GetRand().Intn(len(slice)) + Id := rand.Intn(len(slice)) r = append(r, slice[Id]) slice = append(slice[0:Id], slice[Id+1:]...) } @@ -116,7 +126,7 @@ func RandSliceNumNonAdjacent(s []int, num int) []int { sort.Ints(slice) result := make([]int, 0, num) for len(result) < num { - Id := GetRand().Intn(len(slice)) + Id := rand.Intn(len(slice)) result = append(result, slice[Id]) slice = SubAdjacentElemSlice(slice, Id) } @@ -138,7 +148,7 @@ func RandStringSlice(slice []string) string { if slen == 0 { return "" } - Id := GetRand().Intn(slen) + Id := rand.Intn(slen) return slice[Id] } @@ -335,7 +345,7 @@ func PopStringArray(s []string) (string, []string) { func ShuffleStringArray(s []string) []string { r := make([]string, len(s)) - perm := GetRand().Perm(len(s)) + perm := rand.Perm(len(s)) for i, v := range perm { r[v] = s[i] } @@ -344,7 +354,7 @@ func ShuffleStringArray(s []string) []string { func ShuffleArray(s []int) []int { r := make([]int, len(s)) - perm := GetRand().Perm(len(s)) + perm := rand.Perm(len(s)) for i, v := range perm { r[v] = s[i] } diff --git a/src/server/gamedata/config_struct.go b/src/server/gamedata/config_struct.go deleted file mode 100644 index 14af12c0..00000000 --- a/src/server/gamedata/config_struct.go +++ /dev/null @@ -1,45 +0,0 @@ -package gamedata - -import ( - - // "io/ioutil" - - "server/pkg/github.com/name5566/leaf/recordfile" -) - -var G_AllConfigs = map[string]interface{}{} - -type ConfigData struct { - data map[string]interface{} -} - -func (cd *ConfigData) GetData() map[string]interface{} { - return cd.data -} - -func (cd *ConfigData) SetData(data map[string]interface{}) { - cd.data = data -} - -var G_AllConfigsData = map[string]*recordfile.RecordFile{} -var G_AllConfigsJsonData = map[string]*ConfigData{} - -func InitReadAllCfg() { - // 遍历 Map - for k, v := range G_AllConfigs { - rd := readRfNew(v, k) - G_AllConfigsData[k] = rd - } - -} - -func GetConfigByName(name string) *recordfile.RecordFile { - _, ok := G_AllConfigsData[name] - if ok { - return G_AllConfigsData[name] - } else { - rd := readRfNew(G_AllConfigs[name], name) - G_AllConfigsData[name] = rd - } - return G_AllConfigsData[name] -} diff --git a/src/server/gamedata/reader.go b/src/server/gamedata/reader.go index cbf505f7..6b8ff484 100644 --- a/src/server/gamedata/reader.go +++ b/src/server/gamedata/reader.go @@ -3,75 +3,61 @@ package gamedata import ( "encoding/json" "errors" - "fmt" "io" "os" "path/filepath" "strconv" + "sync" "server/conf" "server/game/mod/item" "server/pkg/github.com/name5566/leaf/log" - "server/pkg/github.com/name5566/leaf/recordfile" - - "github.com/fsnotify/fsnotify" ) -var watcher *fsnotify.Watcher -var ConfPath = "./gamedata/config/" +var ( + ConfPath = "./gamedata/config/" + G_AllConfigs = map[string]interface{}{} + G_AllConfigsJsonData = map[string]*ConfigData{} + configMutex sync.RWMutex // 全局配置锁 +) + +type ConfigData struct { + data map[string]interface{} + mu sync.RWMutex +} + +func (cd *ConfigData) GetData() map[string]interface{} { + cd.mu.RLock() + defer cd.mu.RUnlock() + return cd.data +} + +func (cd *ConfigData) SetData(data map[string]interface{}) { + cd.mu.Lock() + defer cd.mu.Unlock() + cd.data = data +} func init() { if conf.Server.GameConfPath != "" { ConfPath = conf.Server.GameConfPath } - watcher, _ = fsnotify.NewWatcher() - watcher.Add(ConfPath + "reload") - go func() { - for { - select { - case event, ok := <-watcher.Events: - if !ok { - return - } - if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Rename == fsnotify.Rename { - for k := range G_AllConfigsJsonData { - InitCfg(k) - log.Debug("配置已重新加载:%s", k) - } - - } - case err, ok := <-watcher.Errors: - if !ok { - return - } - fmt.Println("错误:", err) - } - } - }() - } func Reload() { + configMutex.RLock() + keys := make([]string, 0, len(G_AllConfigsJsonData)) for k := range G_AllConfigsJsonData { + keys = append(keys, k) + } + configMutex.RUnlock() + + for _, k := range keys { InitCfg(k) log.Debug("配置已重新加载:%s", k) } } -func readRfNew(st interface{}, ralativePath string) *recordfile.RecordFile { - rf, err := recordfile.New(st) - if err != nil { - log.Fatal("%v", err) - } - fn := ralativePath + ".txt" - err = rf.Read(ConfPath + fn) - if err != nil { - log.Fatal("%v: %v", fn, err) - } - - return rf -} - func InitCfg(cfgname string) { // 读取文件内容 filePath := ConfPath + cfgname + ".json" @@ -101,49 +87,54 @@ func InitCfg(cfgname string) { log.Debug("config name:%s,反序列化失败:%v", cfgname, err) return } + // 直接使用data,无需多余拷贝 rf := new(ConfigData) - convertedData := make(map[string]interface{}) - for k, v := range data { - convertedData[k] = v - } - rf.SetData(convertedData) + rf.SetData(data) + + // 使用锁保护全局map + configMutex.Lock() G_AllConfigsJsonData[cfgname] = rf + configMutex.Unlock() +} + +// 提取公共的 map 检查逻辑 +func getMapValue(a interface{}, key string) (interface{}, bool) { + if a == nil { + return nil, false + } + if m, ok := a.(map[string]interface{}); ok { + if v, ok := m[key]; ok { + return v, true + } + } + return nil, false } func GetValue(a interface{}, key string) interface{} { - if a == nil { - return nil - } - if v, ok := a.(map[string]interface{})[key]; ok { - return v - } - return nil + v, _ := getMapValue(a, key) + return v } func GetIntValue(a interface{}, key string) int { - if a == nil { + v, ok := getMapValue(a, key) + if !ok || v == nil { return 0 } - if v, ok := a.(map[string]interface{})[key]; ok { - if v == nil { - return 0 - } - return Int(v) - } - return 0 + return Int(v) } func GetIntSliceValue(a interface{}, key string) []int { - if a == nil { + v, ok := getMapValue(a, key) + if !ok || v == nil { return nil } - if v, ok := a.(map[string]interface{})[key]; ok { - if v == nil { - return nil - } - var r []int - for _, v := range v.([]interface{}) { - r = append(r, int(v.(float64))) + // 安全的类型断言,避免panic + if slice, ok := v.([]interface{}); ok { + r := make([]int, 0, len(slice)) // 预分配容量 + for _, item := range slice { + if num, ok := item.(float64); ok { + r = append(r, int(num)) + } } return r } @@ -151,68 +142,79 @@ func GetIntSliceValue(a interface{}, key string) []int { } func GetFloatValue(a interface{}, key string) float64 { - if a == nil { + v, ok := getMapValue(a, key) + if !ok || v == nil { return 0 } - if v, ok := a.(map[string]interface{})[key]; ok { - if v == nil { - return 0 - } - return v.(float64) + // 安全的类型断言 + if f, ok := v.(float64); ok { + return f } return 0 } func GetItemList(a interface{}, key string) []*item.Item { - if a == nil { + v, ok := getMapValue(a, key) + if !ok || v == nil { return nil } - if v, ok := a.(map[string]interface{})[key]; ok { - if v == nil { - return nil - } - return item.ParseItem(v) - } - return nil + return item.ParseItem(v) } func GetStringValue(a interface{}, key string) string { - if a == nil { + v, ok := getMapValue(a, key) + if !ok || v == nil { return "" } - if v, ok := a.(map[string]interface{})[key]; ok { - if v == nil { - return "" - } - return String(v) - } - return "" + return String(v) } func GetData(cfgname string) (map[string]interface{}, error) { - if v, ok := G_AllConfigsJsonData[cfgname]; ok { + configMutex.RLock() + v, ok := G_AllConfigsJsonData[cfgname] + configMutex.RUnlock() + + if ok { return v.GetData(), nil } - return make(map[string]interface{}), errors.New("not found") + return nil, errors.New("config not found: " + cfgname) } func GetDataByKey(cfgname, key string) (map[string]interface{}, error) { - if v, ok := G_AllConfigsJsonData[cfgname]; ok { - if v, ok := v.GetData()[key]; ok { - return v.(map[string]interface{}), nil + configMutex.RLock() + v, ok := G_AllConfigsJsonData[cfgname] + configMutex.RUnlock() + + if ok { + data := v.GetData() + if val, ok := data[key]; ok { + // 安全的类型断言 + if result, ok := val.(map[string]interface{}); ok { + return result, nil + } + return nil, errors.New("invalid data type for key: " + key) } } - return make(map[string]interface{}), errors.New("not found") + return nil, errors.New("config or key not found") } func GetDataByIntKey(cfgname string, key int) (map[string]interface{}, error) { keyStr := strconv.Itoa(key) - if v, ok := G_AllConfigsJsonData[cfgname]; ok { - if v, ok := v.GetData()[keyStr]; ok { - return v.(map[string]interface{}), nil + configMutex.RLock() + v, ok := G_AllConfigsJsonData[cfgname] + configMutex.RUnlock() + + if ok { + data := v.GetData() + if val, ok := data[keyStr]; ok { + // 安全的类型断言 + if result, ok := val.(map[string]interface{}); ok { + return result, nil + } + return nil, errors.New("invalid data type for key: " + keyStr) } } - return make(map[string]interface{}), errors.New("not found") + return nil, errors.New("config or key not found") } func Int(a interface{}) int { diff --git a/src/server/gamedata/util.go b/src/server/gamedata/util.go deleted file mode 100644 index 89fb11f0..00000000 --- a/src/server/gamedata/util.go +++ /dev/null @@ -1,15 +0,0 @@ -package gamedata - -func ParseInt(value interface{}) int { - if value == nil { - return 0 - } - return int(value.(float64)) -} - -func ParseString(value interface{}) string { - if value == nil { - return "" - } - return value.(string) -} diff --git a/src/server/go.mod b/src/server/go.mod index 5dd700d0..750a18f5 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -15,7 +15,6 @@ require ( github.com/jmoiron/sqlx v1.4.0 github.com/redis/go-redis/v9 v9.6.1 github.com/robfig/cron/v3 v3.0.1 - github.com/segmentio/kafka-go v0.4.47 github.com/shirou/gopsutil v3.21.11+incompatible google.golang.org/protobuf v1.36.2 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 @@ -35,10 +34,8 @@ require ( github.com/clbanning/mxj/v2 v2.7.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.15.9 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pierrec/lz4/v4 v4.1.15 // indirect github.com/stretchr/testify v1.9.0 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect @@ -49,17 +46,13 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect ) -require ( - github.com/fsnotify/fsnotify v1.8.0 // direct - golang.org/x/sys v0.29.0 // indirect -) +require golang.org/x/sys v0.29.0 // indirect require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/ThinkingDataAnalytics/go-sdk/v2 v2.0.3 // github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/google/uuid v1.6.0 // indirect + github.com/google/uuid v1.6.0 github.com/tuyou/galog v0.0.0 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/src/server/go.sum b/src/server/go.sum index f3a9147f..ac81bed5 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -2,8 +2,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/ThinkingDataAnalytics/go-sdk/v2 v2.0.3 h1:+2h2cOKzZgP8DmtuvkmUhOs5WfyseFTc0KLNR3EU2eA= -github.com/ThinkingDataAnalytics/go-sdk/v2 v2.0.3/go.mod h1:uhiHUKG8fMwf4Ou3186EBBagFrBdAsAA5GHiLMWQN2A= github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA= github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= @@ -95,8 +93,6 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= @@ -119,7 +115,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -132,8 +127,6 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -151,8 +144,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -160,8 +151,6 @@ github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0 github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0= -github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -169,11 +158,8 @@ github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= @@ -183,12 +169,6 @@ github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZ github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -290,15 +270,12 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -345,7 +322,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/src/server/main.go b/src/server/main.go index bb9e2371..d56aa3a8 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -26,9 +26,9 @@ func main() { lconf.ListenAddr = conf.Server.ListenAddr lconf.CenterAddr = conf.Server.CenterAddr lconf.PendingWriteNum = conf.PendingWriteNum - // 当内存>2G时开始GC + // 当内存>256M时开始GC debug.SetGCPercent(50) - debug.SetMemoryLimit(2 << 30) + debug.SetMemoryLimit(512 << 20) // 启动 pprof(仅绑定本地) go func() { // 如果需要绑定所有接口改为 ":6060" diff --git a/src/server/middleware/kafka/kafka.go b/src/server/middleware/kafka/kafka.go deleted file mode 100644 index 12f0b103..00000000 --- a/src/server/middleware/kafka/kafka.go +++ /dev/null @@ -1,23 +0,0 @@ -package kafkaMiddleware - -import ( - "context" - - "github.com/segmentio/kafka-go" -) - -var KafkaMod *kafka.Writer - -func SendMsg(key, value []byte) error { - if KafkaMod == nil { - return nil - } - err := KafkaMod.WriteMessages(context.Background(), kafka.Message{ - Key: key, - Value: value, - }) - if err != nil { - //log.Debug("WriteMessages err: %v", err) - } - return err -} diff --git a/src/server/sql/Merge_Pet.sql b/src/server/sql/Merge_Pet.sql index 4b73f620..0ea2a541 100644 --- a/src/server/sql/Merge_Pet.sql +++ b/src/server/sql/Merge_Pet.sql @@ -126,6 +126,9 @@ CREATE TABLE IF NOT EXISTS `system_mail_info` ( `title_ptbr` varchar(128) DEFAULT "" COMMENT '葡萄牙邮件标题', `subTitle_ptbr` varchar(128) DEFAULT "" COMMENT '葡萄牙邮件子标题', `content_ptbr` varchar(2048) DEFAULT "" COMMENT '葡萄牙邮件内容', + `title_es_latam` varchar(128) DEFAULT "" COMMENT '西班牙邮件标题', + `subTitle_es_latam` varchar(128) DEFAULT "" COMMENT '西班牙邮件子标题', + `content_es_latam` varchar(2048) DEFAULT "" COMMENT '西班牙邮件内容', `items` varchar(2048) DEFAULT "{}" COMMENT '邮件附件', `start_time` int unsigned NOT NULL DEFAULT '0' COMMENT '开始时间', `register_time` int unsigned NOT NULL DEFAULT '0' COMMENT '注册时间', diff --git a/src/server/test/__debug_bin.exe2315391482 b/src/server/test/__debug_bin.exe2315391482 new file mode 100644 index 00000000..61462269 Binary files /dev/null and b/src/server/test/__debug_bin.exe2315391482 differ diff --git a/src/server/test/charge_test.go b/src/server/test/charge_test.go new file mode 100644 index 00000000..ebfdf76d --- /dev/null +++ b/src/server/test/charge_test.go @@ -0,0 +1,13 @@ +package test + +import ( + "server/game" + "testing" +) + +func TestSpecialCharge(t *testing.T) { + p1 := new(game.Player) + p1.InitPlayer("3625212") + ChargeMod := p1.GetChargeMod() + ChargeMod.ZeroUpdate(nil) +} diff --git a/src/server/test/config_test.go b/src/server/test/config_test.go index 7e6d5c46..7379d427 100644 --- a/src/server/test/config_test.go +++ b/src/server/test/config_test.go @@ -3,7 +3,10 @@ package test import ( "fmt" activityCfg "server/conf/activity" + baseCfg "server/conf/base" + friendCfg "server/conf/friend" languageCfg "server/conf/language" + playroomCfg "server/conf/playroom" userCfg "server/conf/user" GoUtil "server/game_util" "server/msg" @@ -24,3 +27,18 @@ func TestGetActivityRecycleMail(t *testing.T) { en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, mailTitle) fmt.Println("en:", en) } + +func TestGetFriendSponsorNum(t *testing.T) { + r := friendCfg.GetFriendSponsorNum() + fmt.Println("r:", r) +} + +func TestGetPlayroomTaskDailyNum1(t *testing.T) { + r := playroomCfg.GetPlayroomTaskDailyNum1() + fmt.Println("r:", r) +} + +func TestGetEnergyByADNum(t *testing.T) { + r := baseCfg.GetEnergyByADNum() + fmt.Println("r:", r) +} diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index ea90b595..fe3769fa 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -78,3 +78,21 @@ func TestFixUserData(t *testing.T) { } log.Debug("All accounts fixed") } + +func TestRandInt(t *testing.T) { + p1 := new(game.Player) + p1.InitPlayer("3625212") + BaseMod := p1.GetBaseMod() + ChargeMod := p1.GetChargeMod() + EndlessMod := p1.GetEndlessMod() + EndlessMod.ZeroUpdate(ChargeMod.GetMaxCharge(), BaseMod.GetLevel()) +} + +func TestEndless(t *testing.T) { + p1 := new(game.Player) + p1.InitPlayer("3625212") + BaseMod := p1.GetBaseMod() + ChargeMod := p1.GetChargeMod() + EndlessMod := p1.GetEndlessMod() + EndlessMod.ZeroUpdate(ChargeMod.GetMaxCharge(), BaseMod.GetLevel()) +} diff --git a/src/server/test/order_test.go b/src/server/test/order_test.go index 8a2b02c2..3624ef70 100644 --- a/src/server/test/order_test.go +++ b/src/server/test/order_test.go @@ -23,7 +23,7 @@ func TestOrderStart(t *testing.T) { func TestOrderFinish(t *testing.T) { p1 := new(game.Player) - p1.InitPlayer("bbb004") + p1.InitPlayer("3659896") game.G_GameLogicPtr.SetPlayer(p1) ChessMod := p1.GetChessMod() err := ChessMod.FinishOrder([]int{1, 2, 3}) @@ -34,9 +34,9 @@ func TestOrderFinish(t *testing.T) { func TestChestRain(t *testing.T) { p1 := new(game.Player) - p1.InitPlayer("GSTTEST011") + p1.InitPlayer("3625212") ChessMod := p1.GetChessMod() LimitEventMod := p1.GetLimitEventMod() - f := LimitEventMod.GetChestReward([]int{928}, ChessMod.GetStarEmitList()) + f := LimitEventMod.GetMeteorReward([]int{226}, ChessMod.GetStarEmitList()) fmt.Printf("chest rain reward:%v", f) }