Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2026-02-11 16:22:10 +08:00
commit 57c07ca2a3
88 changed files with 1715 additions and 1623 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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) // 礼包回复邮件

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 <- &copyLog:
L.Lock.Unlock()
return
default:
// 丢弃最旧一条以腾出空间(若有)
select {
case <-L.L:
default:
}
// 再尝试入队一次
select {
case L.L <- &copyLog:
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()
})
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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, "@")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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))
// 根据订单棋子难度生成棋子

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 '注册时间',

Binary file not shown.

View File

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

View File

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

View File

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

View File

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