Merge branch 'develop' into sdk
This commit is contained in:
commit
2fc50aeeaa
3
.gitignore
vendored
3
.gitignore
vendored
@ -20,3 +20,6 @@ src/server/test/teLog/*
|
||||
src/server/*.exe*
|
||||
src/server/msg/Gameapi.pb.go
|
||||
src/server/gen-go
|
||||
src/server/GeoLite2-Country
|
||||
src/server/test/GeoLite2-Country
|
||||
src/server/msg/Gameapi_grpc.pb.go
|
||||
|
||||
@ -56,3 +56,12 @@ func GetRewardType(Id int) int {
|
||||
}
|
||||
return gamedata.GetIntValue(data, "Type")
|
||||
}
|
||||
|
||||
func GetRewardLen() int {
|
||||
data, err := gamedata.GetData(CFG_COLLECT)
|
||||
if err != nil {
|
||||
log.Debug("GetRewardLen err:%v", err)
|
||||
return 0
|
||||
}
|
||||
return len(data)
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ func init() {
|
||||
gamedata.InitCfg(DAILY_TASK_REWARD)
|
||||
}
|
||||
|
||||
func GetDailyTaskReward(Id, factory, activityId int) []*item.Item {
|
||||
func GetDailyTaskReward(Id, activityId int) []*item.Item {
|
||||
data, err := gamedata.GetData(DAILY_TASK_REWARD)
|
||||
if err != nil {
|
||||
log.Debug("GetDailyTaskReward err:%v", err)
|
||||
@ -37,11 +37,9 @@ func GetDailyTaskReward(Id, factory, activityId int) []*item.Item {
|
||||
items := gamedata.GetItemList(v, "ItemID")
|
||||
petCoinBase := gamedata.GetIntValue(v, "PetCoinBase")
|
||||
if petCoinBase > 0 {
|
||||
petCoinNum := int(float64(petCoinBase) * (float64(factory)/1000 + 1))
|
||||
petCoinNum = (petCoinNum/5 + 1) * 5 // 向上取整到5的倍数
|
||||
items = append(items, &item.Item{
|
||||
Id: item.ITEM_STAR_ID,
|
||||
Num: petCoinNum,
|
||||
Num: petCoinBase,
|
||||
})
|
||||
}
|
||||
return items
|
||||
|
||||
@ -29,11 +29,11 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
|
||||
var result []*gamedata.SevenLoginRewardData
|
||||
for k, v := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Diamond := gamedata.GetIntValue(v, "Diamond")
|
||||
Energy := gamedata.GetFloatValue(v, "Energy")
|
||||
RewardNum := gamedata.GetIntValue(v, "RewardNum")
|
||||
result = append(result, &gamedata.SevenLoginRewardData{
|
||||
Id: Id,
|
||||
Diamond: Diamond,
|
||||
Energy: Energy,
|
||||
RewardNum: RewardNum,
|
||||
})
|
||||
}
|
||||
@ -53,11 +53,11 @@ func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
|
||||
continue
|
||||
}
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Diamond := gamedata.GetIntValue(v, "Diamond")
|
||||
Energy := gamedata.GetFloatValue(v, "Energy")
|
||||
RewardNum := gamedata.GetIntValue(v, "RewardNum")
|
||||
result = append(result, &gamedata.SevenLoginRewardData{
|
||||
Id: Id,
|
||||
Diamond: Diamond,
|
||||
Energy: Energy,
|
||||
RewardNum: RewardNum,
|
||||
})
|
||||
}
|
||||
@ -73,7 +73,7 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
|
||||
var result []*gamedata.SevenLoginJackpotData
|
||||
for k, v := range data {
|
||||
Id, _ := strconv.Atoi(k)
|
||||
Diamond := gamedata.GetIntValue(v, "Diamond")
|
||||
Energy := gamedata.GetFloatValue(v, "Energy")
|
||||
Type := gamedata.GetIntValue(v, "Type")
|
||||
Month := gamedata.GetIntValue(v, "Month")
|
||||
if IsMonth != Month && IsMonth != 0 {
|
||||
@ -82,11 +82,11 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
|
||||
ItemMap := gamedata.GetValue(v, "Item")
|
||||
Items := item.ParseItem(ItemMap)
|
||||
result = append(result, &gamedata.SevenLoginJackpotData{
|
||||
Id: Id,
|
||||
Diamond: Diamond,
|
||||
Items: Items,
|
||||
Type: Type,
|
||||
Month: Month,
|
||||
Id: Id,
|
||||
Energy: Energy,
|
||||
Items: Items,
|
||||
Type: Type,
|
||||
Month: Month,
|
||||
})
|
||||
}
|
||||
return result
|
||||
|
||||
@ -311,6 +311,27 @@ func ResetAccountData(oldName, newName string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func MappingAccountData(oldName, newName string) error {
|
||||
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
|
||||
_, err := SqlDb.Exec(sqlStr, "", oldName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, "", oldName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_account SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, oldName, newName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
|
||||
_, err = SqlDb.Exec(sqlStr, oldName, newName)
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdateAccountInfoToDb(account *Db_Account) (err error) {
|
||||
_, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName)
|
||||
return
|
||||
|
||||
@ -793,6 +793,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
|
||||
|
||||
// #region 活动
|
||||
RegisterMsgProcessFunc("ReqActivityReward", ReqActivityReward) // 领取活动奖励
|
||||
RegisterMsgProcessFunc("ReqAddGiftReward", ReqAddGiftReward) // 领取加赠活动奖励
|
||||
// 挖矿
|
||||
RegisterMsgProcessFunc("ReqMining", ReqMining) // 请求挖矿数据
|
||||
RegisterMsgProcessFunc("ReqMiningReward", ReqMiningReward) // 领取挖矿奖励
|
||||
|
||||
@ -307,6 +307,14 @@ func (p *Player) RedBackData() {
|
||||
p.PushClientRes(&msg.ResActRed{Red: result})
|
||||
}
|
||||
|
||||
func (p *Player) GetMiningItemId() int {
|
||||
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_MINING)
|
||||
if ActivityInfo == nil {
|
||||
return 0
|
||||
}
|
||||
return miningCfg.GetActivityItemId(ActivityInfo.Id)
|
||||
}
|
||||
|
||||
// 通行证活动数据返回
|
||||
func (p *Player) ActPassBackData() {
|
||||
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS)
|
||||
|
||||
60
src/server/game/activity_mgr.go
Normal file
60
src/server/game/activity_mgr.go
Normal file
@ -0,0 +1,60 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"server/game/mod/msg"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type ActivityMgr struct {
|
||||
*ServerMod
|
||||
}
|
||||
|
||||
type ActivityData struct {
|
||||
List map[int]*ActivityCfg // 玩家排行榜
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
type ActivityCfg struct {
|
||||
Id int
|
||||
Type int
|
||||
Strartime int64
|
||||
Endtime int64
|
||||
Level int
|
||||
Title string
|
||||
MailTitle string
|
||||
MailContent string
|
||||
RewardItem map[string]interface{}
|
||||
Extra map[string]interface{}
|
||||
}
|
||||
|
||||
const ()
|
||||
|
||||
func (r *ActivityMgr) Init() {
|
||||
r.key = RANK_MGR_KEY
|
||||
r.data = &ActivityData{
|
||||
List: make(map[int]*ActivityCfg, 0),
|
||||
}
|
||||
// 注册处理函数
|
||||
r.init()
|
||||
}
|
||||
|
||||
func (r *ActivityMgr) getData() *ActivityData {
|
||||
return r.data.(*ActivityData)
|
||||
}
|
||||
|
||||
// 零点更新 重置榜单
|
||||
func (r *ActivityMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (r ActivityMgr) GetActivityCfg(Id int) ActivityCfg {
|
||||
// 获取活动配置
|
||||
data := r.getData()
|
||||
data.mu.Lock()
|
||||
defer data.mu.Unlock()
|
||||
cfg, ok := data.List[Id]
|
||||
if !ok {
|
||||
return ActivityCfg{}
|
||||
}
|
||||
return *cfg
|
||||
}
|
||||
@ -19,6 +19,7 @@ import (
|
||||
proto "server/msg"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (p *Player) Charge(ChargeId int) {
|
||||
@ -46,9 +47,9 @@ func (p *Player) SendCharge(d *ChargeExtra) {
|
||||
|
||||
func (p *Player) ADPetWorkFire(ChargeId int) {
|
||||
ChargeMod := p.PlayMod.getChargeMod()
|
||||
Item := ChargeMod.FireAdReward(ChargeId)
|
||||
if Item != nil {
|
||||
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String())
|
||||
items := ChargeMod.FireAdReward(ChargeId)
|
||||
if items != nil {
|
||||
err := p.HandleItem(items, proto.ITEM_POP_LABEL_ActivityGift.String())
|
||||
if err != nil {
|
||||
log.Debug("ChargeFire err : %s", err)
|
||||
return
|
||||
@ -58,41 +59,37 @@ func (p *Player) ADPetWorkFire(ChargeId int) {
|
||||
p.ChargeBackData()
|
||||
}
|
||||
|
||||
func (p *Player) ActivityFire(ChargeId int) {
|
||||
func (p *Player) ActivityFire(chargeId int) {
|
||||
ActivityMod := p.PlayMod.getActivityMod()
|
||||
ActivityId := activityCfg.GetActivityGiftId(ChargeId)
|
||||
ActivityInfo := p.GetActivityInfoById(ActivityId)
|
||||
if ActivityInfo == nil {
|
||||
log.Debug("ActivityFire ActivityInfo nil : player id :%d, charge id:%d", p.M_DwUin, ChargeId)
|
||||
activityId := activityCfg.GetActivityGiftId(chargeId)
|
||||
activityInfo := p.GetActivityInfoById(activityId)
|
||||
if activityInfo == nil {
|
||||
log.Debug("ActivityFire ActivityInfo nil : player id :%d, charge id:%d", p.M_DwUin, chargeId)
|
||||
return
|
||||
}
|
||||
Item, err := ActivityMod.Fire(ChargeId)
|
||||
items, err := ActivityMod.Fire(chargeId, activityInfo.Type)
|
||||
if err != nil {
|
||||
log.Debug("ActivityFire err : %s", err)
|
||||
return
|
||||
}
|
||||
if Item == nil {
|
||||
if items == nil {
|
||||
log.Debug("ActivityFire err : %s", err)
|
||||
return
|
||||
}
|
||||
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String())
|
||||
err = p.HandleItem(items, proto.ITEM_POP_LABEL_ActivityGift.String())
|
||||
if err != nil {
|
||||
log.Debug("ChargeFire err : %s", err)
|
||||
return
|
||||
}
|
||||
if ActivityId == activity.ACT_TYPE_ADD_GIFT {
|
||||
Items := activityCfg.GetActivityRewardItems(ActivityId)
|
||||
if len(Items) > 0 {
|
||||
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActTypeAddGift.String())
|
||||
if err != nil {
|
||||
log.Debug("ChargeFire err : %s", err)
|
||||
return
|
||||
}
|
||||
if activityInfo.Type == activity.ACT_TYPE_ADD_GIFT {
|
||||
if ActivityMod.AddEnd > GoUtil.Now() && !ActivityMod.AddReward {
|
||||
p.CallEvent(time.Duration(ActivityMod.AddEnd-GoUtil.Now())*time.Second, p.TickActivityAddGift, "activity_add_gift")
|
||||
}
|
||||
}
|
||||
p.TeLog("charge_gift", map[string]interface{}{
|
||||
"activity_id": ActivityId,
|
||||
"charge_id": ChargeId,
|
||||
"item_list": Item,
|
||||
"activity_id": activityId,
|
||||
"charge_id": chargeId,
|
||||
"item_list": items,
|
||||
})
|
||||
p.PlayMod.save()
|
||||
p.InitActivity()
|
||||
|
||||
@ -120,7 +120,7 @@ func HandleClientReq(args []interface{}) {
|
||||
G_GameLogicPtr.SendServerVersion(a)
|
||||
case "ReqRegisterAccount":
|
||||
detail := &msg.ReqRegisterAccount{}
|
||||
log.Debug("player %s start login", detail.UserName)
|
||||
log.Debug("player %s start register", detail.UserName)
|
||||
proto.Unmarshal(buf, detail)
|
||||
gl := G_getGameLogic()
|
||||
defer func() {
|
||||
|
||||
@ -131,6 +131,7 @@ func ReqGmCommand_(player *Player, Command string) error {
|
||||
VarMod.WeeklyResetTime = 0
|
||||
player.ZeroUpdate(nil)
|
||||
G_GameLogicPtr.ZeroFlush()
|
||||
player.PushClientRes(player.GetDailyTaskMod().BackData())
|
||||
case "setSevenLoginActive":
|
||||
num, _ := strconv.Atoi(arg[1])
|
||||
player.PlayMod.getSevenLoginMod().Active = num
|
||||
@ -591,14 +592,28 @@ func ReqGmCommand_(player *Player, Command string) error {
|
||||
BaseMod.Account = newAccount
|
||||
player.GetPlayerBaseMod().Data.UserName = newAccount
|
||||
player.PushAndSendClienRes(&msg.ForceKickOut{})
|
||||
case "mapping":
|
||||
if len(arg) < 2 {
|
||||
return fmt.Errorf("mapping command requires an argument")
|
||||
}
|
||||
BaseMod := player.PlayMod.getBaseMod()
|
||||
account := BaseMod.Account
|
||||
err := db.MappingAccountData(account, arg[1])
|
||||
if err != nil {
|
||||
log.Error("resetPlayer err:%s", err.Error())
|
||||
return err
|
||||
}
|
||||
log.Debug("player reset: old account: %s; new account %s", account, arg[1])
|
||||
BaseMod.Account = ""
|
||||
player.GetPlayerBaseMod().Data.UserName = ""
|
||||
player.PushAndSendClienRes(&msg.ForceKickOut{})
|
||||
player.ClearData()
|
||||
case "resetCode":
|
||||
BaseMod := player.PlayMod.getBaseMod()
|
||||
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))
|
||||
player.BackUserInfo()
|
||||
case "debug":
|
||||
player.AddPlayroomUpvote(100100129)
|
||||
i := player.GetPlayroomUpvote(100100129)
|
||||
log.Debug("debug upvote:%d", i)
|
||||
player.HandleInUserRank()
|
||||
case "addLimitEvent":
|
||||
Id, _ := strconv.Atoi(arg[1])
|
||||
Cd, _ := strconv.Atoi(arg[2])
|
||||
@ -629,9 +644,15 @@ func ReqGmCommand_(player *Player, Command string) error {
|
||||
GoUtil.NotifyPlayer(GoUtil.Int(PlayerSimpleData.Account), NOTIFY_TYPE_PETROOM_GAME, fmt.Sprintf(title, PlayerSimpleData.PetName), fmt.Sprintf(info, PlayerSimpleData.PetName))
|
||||
case "resetWeekReward":
|
||||
SevenMod := player.PlayMod.getSevenLoginMod()
|
||||
SevenMod.WeekResetTime = 0
|
||||
SevenMod.MonthResetTime = 0
|
||||
PlayerBaseMod := player.GetPlayerBaseMod()
|
||||
SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime())
|
||||
SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), player.GetOrderFactor())
|
||||
player.PushClientRes(SevenMod.BackData())
|
||||
case "addInvite":
|
||||
Id, _ := strconv.Atoi(arg[1])
|
||||
player.PlayMod.getInviteMod().AddInvite(Id)
|
||||
player.PushClientRes(player.PlayMod.getInviteMod().NotifySuccess())
|
||||
case "debugLogoutMsg":
|
||||
ToUid, _ := strconv.Atoi(arg[1])
|
||||
uidList, err := db.GetDebugPlayer(ToUid)
|
||||
|
||||
@ -150,7 +150,10 @@ func (p *Player) handle(m *msg.Msg) error {
|
||||
p.PlayMod.save()
|
||||
case msg.HANDLE_TYPE_INVITE_FRIEND: // 邀请好友
|
||||
InviteMod := p.PlayMod.getInviteMod()
|
||||
InviteMod.AddInvite(m.From)
|
||||
err := InviteMod.AddInvite(m.From)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
p.AddLog(m.From, friend.LOG_TYPE_FRIEND_INVITE, "", m.SendT)
|
||||
p.PlayMod.save()
|
||||
p.PushClientRes(InviteMod.NotifySuccess())
|
||||
|
||||
@ -19,7 +19,7 @@ const (
|
||||
ACT_TYPE_GUESS_COLOR = 2 // 猜颜色
|
||||
ACT_TYPE_RACE = 3 // 赛跑
|
||||
ACT_TYPE_DISCOUNT_GIFT = 4 // 折扣礼包
|
||||
ACT_TYPE_ADD_GIFT = 5 // 加送礼包
|
||||
ACT_TYPE_ADD_GIFT = 5 // 买一赠一礼包
|
||||
ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包
|
||||
ACT_TYPE_CATNIP = 7 // 猫草大作战
|
||||
ACT_TYPE_PASS = 8 // 通行证
|
||||
@ -33,6 +33,8 @@ const (
|
||||
type Activity struct {
|
||||
Var map[int]interface{}
|
||||
// 活动数据
|
||||
AddEnd int64 // 买一赠一礼包结束时间
|
||||
AddReward bool // 买一赠一礼包奖励是否已领取
|
||||
}
|
||||
|
||||
type Gift struct {
|
||||
@ -94,15 +96,26 @@ func (a *Activity) GetActivityStatus(data *gamedata.ActivityData) int {
|
||||
}
|
||||
|
||||
// 活动礼包-获取奖励
|
||||
func (a *Activity) GetReward(ActId int) ([]*item.Item, error) {
|
||||
Var := a.getGiftVar(ActId)
|
||||
if !Var.Buy {
|
||||
return nil, fmt.Errorf("ActId:%d not buy", ActId)
|
||||
func (a *Activity) GetReward(actId int) ([]*item.Item, error) {
|
||||
varInfo := a.getGiftVar(actId)
|
||||
if !varInfo.Buy {
|
||||
return nil, fmt.Errorf("ActId:%d not buy", actId)
|
||||
}
|
||||
if Var.Reward {
|
||||
return nil, fmt.Errorf("ActId:%d reward already get", ActId)
|
||||
if varInfo.Reward {
|
||||
return nil, fmt.Errorf("ActId:%d reward already get", actId)
|
||||
}
|
||||
Var.Reward = true
|
||||
Var.RewardTime = GoUtil.Now()
|
||||
return activityCfg.GetActivityRewardItems(ActId), nil
|
||||
varInfo.Reward = true
|
||||
varInfo.RewardTime = GoUtil.Now()
|
||||
return activityCfg.GetActivityRewardItems(actId), nil
|
||||
}
|
||||
|
||||
func (a *Activity) GetAddGiftReward(aId int) ([]*item.Item, error) {
|
||||
if a.AddReward {
|
||||
return nil, fmt.Errorf("AddGift reward already get")
|
||||
}
|
||||
if a.AddEnd == 0 {
|
||||
return nil, fmt.Errorf("AddGift not buy")
|
||||
}
|
||||
a.AddReward = true
|
||||
return activityCfg.GetActivityRewardItems(aId), nil
|
||||
}
|
||||
|
||||
@ -3,10 +3,11 @@ package activity
|
||||
import (
|
||||
activityCfg "server/conf/activity"
|
||||
"server/game/mod/item"
|
||||
GoUtil "server/game_util"
|
||||
)
|
||||
|
||||
// 活动礼包
|
||||
func (a *Activity) Fire(Id int) ([]*item.Item, error) {
|
||||
func (a *Activity) Fire(Id int, atype int) ([]*item.Item, error) {
|
||||
// AId := activityCfg.GetActivityGiftId(Id)
|
||||
// Var := a.getGiftVar(AId)
|
||||
// if Var.Buy {
|
||||
@ -14,5 +15,8 @@ func (a *Activity) Fire(Id int) ([]*item.Item, error) {
|
||||
// }
|
||||
// Var.Buy = true
|
||||
// Var.Time = GoUtil.Now()
|
||||
if atype == ACT_TYPE_ADD_GIFT {
|
||||
a.AddEnd = GoUtil.Now() + 7*86400
|
||||
}
|
||||
return activityCfg.GetActivityGiftItems(Id), nil
|
||||
}
|
||||
|
||||
@ -45,9 +45,15 @@ type Base struct {
|
||||
AddCode string // 用于添加好友的code
|
||||
DiviceId string // 设备id
|
||||
RegisterTime int64 // 注册时间
|
||||
CountryCode string // 国家码
|
||||
}
|
||||
|
||||
func (b *Base) InitData(Uid int, Ip string) {
|
||||
if b.CountryCode == "" {
|
||||
Ip = GoUtil.GetIPFromAddr(Ip)
|
||||
code, _ := GoUtil.GetCountryByIP(Ip)
|
||||
b.CountryCode = code
|
||||
}
|
||||
if b.AddCode == "" && Ip != "" {
|
||||
Code, _ := GoUtil.GetCountryByIP(Ip)
|
||||
CountryCode := conf.Server.CountryCode
|
||||
|
||||
@ -22,7 +22,7 @@ const (
|
||||
COLLECT_TYPE_FACE = 2
|
||||
COLLECT_TYPE_AVATAR = 3
|
||||
|
||||
jackpotPreviewSize = 18 // 展示的奖池预览数量,同时作为补充阈値
|
||||
jackpotPreviewSize = 9 // 展示的奖池预览数量,同时作为补充阈値
|
||||
)
|
||||
|
||||
func (c *Collect) InitData() {
|
||||
@ -37,49 +37,57 @@ func (c *Collect) InitData() {
|
||||
|
||||
// ensureJackpot 当奖池剩余少于预览数量时自动补充
|
||||
func (c *Collect) ensureJackpot() {
|
||||
if len(c.Jackpot) <= jackpotPreviewSize {
|
||||
c.Jackpot = initJackpot2(c.Jackpot)
|
||||
rewardLen := collectCfg.GetRewardLen()
|
||||
if len(c.Jackpot) <= rewardLen {
|
||||
loopNum := (rewardLen-len(c.Jackpot))/jackpotPreviewSize + 1
|
||||
for i := 0; i < loopNum; i++ {
|
||||
c.Jackpot = append(c.Jackpot, initJackpot2(nil)...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取收集奖励
|
||||
func (c *Collect) GetReward(Id, Num int) ([]*item.Item, error) {
|
||||
func (c *Collect) GetReward(id, num, factor int) ([]*item.Item, error) {
|
||||
// 判断是否已领取
|
||||
for _, v := range c.Reward {
|
||||
if v == Id {
|
||||
return nil, fmt.Errorf("id : %d;已领取", Id)
|
||||
if v == id {
|
||||
return nil, fmt.Errorf("id : %d;已领取", id)
|
||||
}
|
||||
}
|
||||
Need := collectCfg.GetRewardNeed(Id)
|
||||
if Num < Need {
|
||||
return nil, fmt.Errorf("id : %d;收集数量不足 %d", Id, Need)
|
||||
need := collectCfg.GetRewardNeed(id)
|
||||
if num < need {
|
||||
return nil, fmt.Errorf("id : %d;收集数量不足 %d", id, need)
|
||||
}
|
||||
// 领取奖励
|
||||
c.Reward = append(c.Reward, Id)
|
||||
JackpotId := 0
|
||||
JackpotId, c.Jackpot = GoUtil.PopSlice(c.Jackpot)
|
||||
c.ensureJackpot()
|
||||
return collectCfg.GetJackpotItems(JackpotId), nil
|
||||
c.Reward = append(c.Reward, id)
|
||||
jackpotId := c.Jackpot[id-1]
|
||||
if jackpotId == 0 {
|
||||
return nil, fmt.Errorf("id : %d;奖池数据异常", id)
|
||||
}
|
||||
items := collectCfg.GetJackpotItems(jackpotId)
|
||||
items = GoUtil.FormatStarItem(items, factor)
|
||||
return items, nil
|
||||
}
|
||||
|
||||
func (c *Collect) BackData() *msg.ResCollectInfo {
|
||||
ItemsMsg := make([]*msg.CollectItem, 0, jackpotPreviewSize)
|
||||
for i := 0; i < jackpotPreviewSize; i++ {
|
||||
Items := collectCfg.GetJackpotItems(c.Jackpot[i])
|
||||
ItemsMsg = append(ItemsMsg, &msg.CollectItem{
|
||||
Id: int32(i + 1),
|
||||
Items: item.ItemToMsg(Items),
|
||||
func (c *Collect) BackData(factor int) *msg.ResCollectInfo {
|
||||
itemsMsg := make([]*msg.CollectItem, 0, jackpotPreviewSize)
|
||||
for k, v := range c.Jackpot {
|
||||
items := collectCfg.GetJackpotItems(v)
|
||||
items = GoUtil.FormatStarItem(items, factor)
|
||||
itemsMsg = append(itemsMsg, &msg.CollectItem{
|
||||
Id: int32(k + 1),
|
||||
Items: item.ItemToMsg(items),
|
||||
})
|
||||
}
|
||||
return &msg.ResCollectInfo{
|
||||
Id: GoUtil.IntToInt32(c.Reward),
|
||||
Items: ItemsMsg,
|
||||
Items: itemsMsg,
|
||||
}
|
||||
}
|
||||
|
||||
func initJackpot2(r1 []int) []int {
|
||||
Ids := collectCfg.GetJackpotId()
|
||||
r2 := GoUtil.ShuffleArray(Ids)
|
||||
ids := collectCfg.GetJackpotId()
|
||||
r2 := GoUtil.ShuffleArray(ids)
|
||||
return append(r1, r2...)
|
||||
}
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ import (
|
||||
)
|
||||
|
||||
func getTaskReward(Id, AreaId, activityId int) []*item.Item {
|
||||
|
||||
|
||||
switch Id {
|
||||
case 2:
|
||||
StarNum := int(50 * math.Pow(1.04, float64(AreaId)))
|
||||
@ -32,6 +32,7 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item.
|
||||
lastIds1 = Ids1
|
||||
prevIsCard := 0
|
||||
valid := true
|
||||
cardCount := 0
|
||||
for _, k := range Ids1 {
|
||||
curIsCard := jackpot[k].Is_card
|
||||
if prevIsCard == 1 && curIsCard == 1 {
|
||||
@ -39,6 +40,12 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item.
|
||||
break
|
||||
}
|
||||
prevIsCard = curIsCard
|
||||
if curIsCard == 1 {
|
||||
cardCount++
|
||||
}
|
||||
}
|
||||
if cardCount < 2 {
|
||||
continue
|
||||
}
|
||||
if valid {
|
||||
r := make(map[int][]*item.Item, num)
|
||||
|
||||
@ -3,7 +3,6 @@ package dailyTask
|
||||
import (
|
||||
"fmt"
|
||||
dailyTaskCfg "server/conf/daily_task"
|
||||
orderCfg "server/conf/order"
|
||||
"server/game/mod/item"
|
||||
"server/game/mod/quest"
|
||||
GoUtil "server/game_util"
|
||||
@ -49,46 +48,46 @@ func (dt *DailyTaskMod) Unlock() {
|
||||
dt.Lock = true
|
||||
}
|
||||
|
||||
func (dt *DailyTaskMod) LevUpTrigger(Lv, AreaId, dailyAcitivityId int) bool {
|
||||
func (dt *DailyTaskMod) LevUpTrigger(lv, factor, dailyAcitivityId int) bool {
|
||||
if len(dt.DayTask) != 0 {
|
||||
return false
|
||||
}
|
||||
dt.ZeroUpdate(Lv, AreaId, dailyAcitivityId)
|
||||
dt.ZeroUpdate(lv, factor, dailyAcitivityId)
|
||||
return true
|
||||
}
|
||||
|
||||
func (dt *DailyTaskMod) ZeroUpdate(Lv, AreaId, activityId int) {
|
||||
TaskList := dailyTaskCfg.GetTaskList(Lv)
|
||||
if len(TaskList) <= 0 {
|
||||
func (dt *DailyTaskMod) ZeroUpdate(lv, factor, activityId int) {
|
||||
taskList := dailyTaskCfg.GetTaskList(lv)
|
||||
if len(taskList) <= 0 {
|
||||
return
|
||||
}
|
||||
TaskListId := GoUtil.GetMapKey(TaskList)
|
||||
LastTaskId := GoUtil.GetMapKey(dt.lastTask)
|
||||
TaskList1 := GoUtil.SubSlices(TaskListId, LastTaskId)
|
||||
TaskId := GoUtil.RandSliceNum(TaskList1, 3)
|
||||
OrderFactor := orderCfg.GetOrderFactor(AreaId)
|
||||
for i := 0; i < len(TaskId); i++ {
|
||||
Id := i + 1
|
||||
questStr := TaskList[TaskId[i]]
|
||||
QuestProgress, err := quest.ParseQuest(questStr)
|
||||
taskListId := GoUtil.GetMapKey(taskList)
|
||||
lastTaskId := GoUtil.GetMapKey(dt.lastTask)
|
||||
taskList1 := GoUtil.SubSlices(taskListId, lastTaskId)
|
||||
taskId := GoUtil.RandSliceNum(taskList1, 3)
|
||||
for i := range taskId {
|
||||
id := i + 1
|
||||
questStr := taskList[taskId[i]]
|
||||
questProgress, err := quest.ParseQuest(questStr)
|
||||
if err != nil {
|
||||
log.Debug("parse quest err str : %s", questStr)
|
||||
}
|
||||
Items := dailyTaskCfg.GetDailyTaskReward(Id, OrderFactor, activityId)
|
||||
dt.DayTask[Id] = DailyTask{
|
||||
Items: Items,
|
||||
UnLock: Id == 1,
|
||||
Quest: QuestProgress,
|
||||
items := dailyTaskCfg.GetDailyTaskReward(id, activityId)
|
||||
items = GoUtil.FormatStarItem(items, factor)
|
||||
dt.DayTask[id] = DailyTask{
|
||||
Items: items,
|
||||
UnLock: id == 1,
|
||||
Quest: questProgress,
|
||||
}
|
||||
}
|
||||
// 更新 lastTask,下次不重复当前任务
|
||||
dt.lastTask = make(map[int]struct{}, len(TaskId))
|
||||
for _, id := range TaskId {
|
||||
dt.lastTask = make(map[int]struct{}, len(taskId))
|
||||
for _, id := range taskId {
|
||||
dt.lastTask[id] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
func (dt *DailyTaskMod) WeekUpdate() {
|
||||
func (dt *DailyTaskMod) WeekUpdate(factor int) {
|
||||
jackpot := dailyTaskCfg.GetTaskWeekJackpot()
|
||||
jackpotRand := randJackpot(jackpot, 5)
|
||||
jackpotId := GoUtil.GetMapKey(jackpotRand)
|
||||
@ -105,7 +104,15 @@ func (dt *DailyTaskMod) WeekUpdate() {
|
||||
Items: []*item.Item{{Id: item.ITEM_FIVE_STAR_CARD_PACK, Num: 1}},
|
||||
}
|
||||
dt.Active = 0
|
||||
dt.WeekReward = weekReward
|
||||
dt.WeekReward = formatWeekReward(weekReward, factor)
|
||||
}
|
||||
|
||||
func formatWeekReward(reward map[int]WeekReward, factor int) map[int]WeekReward {
|
||||
for k, v := range reward {
|
||||
v.Items = GoUtil.FormatStarItem(v.Items, factor)
|
||||
reward[k] = v
|
||||
}
|
||||
return reward
|
||||
}
|
||||
|
||||
func (dt *DailyTaskMod) Trigger(Tr *quest.Trigger) bool {
|
||||
@ -138,32 +145,32 @@ func (dt *DailyTaskMod) Trigger(Tr *quest.Trigger) bool {
|
||||
}
|
||||
|
||||
func (dt *DailyTaskMod) BackData() *msg.ResDailyTask {
|
||||
WeekReward := make(map[int32]*msg.DailyWeek)
|
||||
DailyTask := make(map[int32]*msg.DailyTask)
|
||||
weekReward := make(map[int32]*msg.DailyWeek)
|
||||
dailyTask := make(map[int32]*msg.DailyTask)
|
||||
for k, v := range dt.WeekReward {
|
||||
NeedActive := dailyTaskCfg.GetTaskActiveById(k)
|
||||
WeekReward[int32(k)] = &msg.DailyWeek{
|
||||
needActive := dailyTaskCfg.GetTaskActiveById(k)
|
||||
weekReward[int32(k)] = &msg.DailyWeek{
|
||||
Status: v.Status,
|
||||
NeedActive: int32(NeedActive),
|
||||
NeedActive: int32(needActive),
|
||||
Items: item.ItemToMsg(v.Items),
|
||||
}
|
||||
}
|
||||
for k, v := range dt.DayTask {
|
||||
DailyTask[int32(k)] = &msg.DailyTask{
|
||||
dailyTask[int32(k)] = &msg.DailyTask{
|
||||
Status: int32(v.Status),
|
||||
UnLock: v.UnLock,
|
||||
Progress: quest.QuestProgressToMsg(&v.Quest),
|
||||
Items: item.ItemToMsg(v.Items),
|
||||
}
|
||||
}
|
||||
DayEnd := GoUtil.NextZeroTimestampDuration()
|
||||
WeekEnd := GoUtil.NextWeekTimestampDuration()
|
||||
dayEnd := GoUtil.NextZeroTimestampDuration()
|
||||
weekEnd := GoUtil.NextWeekTimestampDuration()
|
||||
return &msg.ResDailyTask{
|
||||
WeekReward: WeekReward,
|
||||
DailyTask: DailyTask,
|
||||
WeekReward: weekReward,
|
||||
DailyTask: dailyTask,
|
||||
Active: int32(dt.Active),
|
||||
DayEnd: int32(DayEnd),
|
||||
WeekEnd: int32(WeekEnd),
|
||||
DayEnd: int32(dayEnd),
|
||||
WeekEnd: int32(weekEnd),
|
||||
}
|
||||
}
|
||||
|
||||
@ -181,8 +188,8 @@ func (dt *DailyTaskMod) GetDailyReward(id, activityId int) ([]*item.Item, error)
|
||||
|
||||
func (dt *DailyTaskMod) GetWeekReward(id int) ([]*item.Item, error) {
|
||||
if v, ok := dt.WeekReward[id]; ok {
|
||||
NeedActive := dailyTaskCfg.GetTaskActiveById(id)
|
||||
if dt.Active < NeedActive {
|
||||
needActive := dailyTaskCfg.GetTaskActiveById(id)
|
||||
if dt.Active < needActive {
|
||||
return nil, fmt.Errorf("active not enough")
|
||||
}
|
||||
if !v.Status {
|
||||
@ -202,8 +209,8 @@ func (dt *DailyTaskMod) GetWeekReward2() []*item.Item {
|
||||
}
|
||||
}
|
||||
if v, ok := dt.WeekReward[maxId]; ok {
|
||||
NeedActive := dailyTaskCfg.GetTaskActiveById(maxId)
|
||||
if dt.Active < NeedActive {
|
||||
needActive := dailyTaskCfg.GetTaskActiveById(maxId)
|
||||
if dt.Active < needActive {
|
||||
return nil
|
||||
}
|
||||
if !v.Status {
|
||||
|
||||
@ -66,42 +66,45 @@ func (f *FriendTreasureMod) Flip(Pos int) ([]*item.Item, int64, error) {
|
||||
return nil, 0, fmt.Errorf("game not start")
|
||||
}
|
||||
f.Shift++
|
||||
Info := f.List[Pos]
|
||||
Info.Status = GAME_STATUS_START
|
||||
if Info.Uid != 0 {
|
||||
log.Debug("uid:%v", Info.Uid)
|
||||
f.Uids = append(f.Uids, Info.Uid)
|
||||
info, ok := f.List[Pos]
|
||||
if !ok {
|
||||
return nil, 0, fmt.Errorf("invalid position")
|
||||
}
|
||||
if Info.Type == FRIEND_TYPE_ALIVE {
|
||||
ProbMap := friendTreasureCfg.GetChestProb()
|
||||
Prob := GoUtil.RandMap(ProbMap)
|
||||
Items := friendTreasureCfg.GetChestItems(Prob)
|
||||
if Items != nil {
|
||||
f.BoxItems = append(f.BoxItems, Items...)
|
||||
info.Status = GAME_STATUS_START
|
||||
if info.Uid != 0 {
|
||||
log.Debug("uid:%v", info.Uid)
|
||||
f.Uids = append(f.Uids, info.Uid)
|
||||
}
|
||||
if info.Type == FRIEND_TYPE_ALIVE {
|
||||
probMap := friendTreasureCfg.GetChestProb()
|
||||
prob := GoUtil.RandMap(probMap)
|
||||
items := friendTreasureCfg.GetChestItems(prob)
|
||||
if items != nil {
|
||||
f.BoxItems = append(f.BoxItems, items...)
|
||||
}
|
||||
return Items, Info.Uid, nil
|
||||
return items, info.Uid, nil
|
||||
}
|
||||
return nil, 0, nil
|
||||
}
|
||||
|
||||
// 结束游戏
|
||||
func (f *FriendTreasureMod) EndGame() ([]*item.Item, int, error) {
|
||||
func (f *FriendTreasureMod) EndGame(factor int) ([]*item.Item, int, error) {
|
||||
if f.Status == GAME_STATUS_IDLE {
|
||||
return nil, 0, fmt.Errorf("game is over")
|
||||
}
|
||||
// f.Shift++
|
||||
ProbAdd := friendTreasureCfg.GetProbAdd(f.Shift)
|
||||
ItemNum := int(float64(f.Star) * (100.0 + float64(ProbAdd)) / 100.0)
|
||||
FriendItemNum := ItemNum / 10
|
||||
Reward := []*item.Item{
|
||||
{Id: item.ITEM_STAR_ID, Num: ItemNum},
|
||||
probAdd := friendTreasureCfg.GetProbAdd(f.Shift)
|
||||
itemNum := int(float64(f.Star) * (100.0 + float64(probAdd)) / 100.0)
|
||||
friendItemNum := itemNum / 10
|
||||
reward := []*item.Item{
|
||||
{Id: item.ITEM_STAR_ID, Num: itemNum},
|
||||
}
|
||||
if f.Shift == 9 {
|
||||
BigReward := friendTreasureCfg.GetBigReward()
|
||||
Reward = append(Reward, BigReward...)
|
||||
bigReward := friendTreasureCfg.GetBigReward()
|
||||
reward = append(reward, bigReward...)
|
||||
}
|
||||
|
||||
return Reward, FriendItemNum, nil
|
||||
reward = GoUtil.FormatStarItem(reward, factor)
|
||||
return reward, friendItemNum, nil
|
||||
}
|
||||
|
||||
// 重置游戏数据
|
||||
@ -119,15 +122,13 @@ func (f *FriendTreasureMod) NotifyStar() *msg.ResFriendTreasureStar {
|
||||
}
|
||||
|
||||
func (f *FriendTreasureMod) BackData() *msg.ResFriendTreasure {
|
||||
TreasureInfoList := make([]*msg.TreasureInfo, 0, len(f.List))
|
||||
|
||||
treasureInfoList := make([]*msg.TreasureInfo, 0, len(f.List))
|
||||
for _, v := range f.List {
|
||||
TreasureInfoList = append(TreasureInfoList, v)
|
||||
treasureInfoList = append(treasureInfoList, v)
|
||||
}
|
||||
|
||||
return &msg.ResFriendTreasure{
|
||||
Status: int32(f.Status),
|
||||
List: TreasureInfoList,
|
||||
List: treasureInfoList,
|
||||
List2: f.List2,
|
||||
Star: int32(f.Star),
|
||||
Shift: int32(f.Shift),
|
||||
|
||||
@ -19,8 +19,12 @@ func (i *InviteMod) InitData() {
|
||||
}
|
||||
}
|
||||
|
||||
func (i *InviteMod) AddInvite(id int) {
|
||||
func (i *InviteMod) AddInvite(id int) error {
|
||||
if _, exists := i.InviteList[id]; exists {
|
||||
return fmt.Errorf("invite already exists")
|
||||
}
|
||||
i.InviteList[id] = struct{}{}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *InviteMod) GetReward(Index int) ([]*item.Item, error) {
|
||||
|
||||
@ -701,15 +701,9 @@ func (p *PlayroomMod) GetTaskReward(Type int) (int, []*item.Item, error) {
|
||||
p.DailyTaskReward = append(p.DailyTaskReward, Type)
|
||||
Id := 0
|
||||
var Items []*item.Item
|
||||
if Type == DAILY_TASK_TYPE_TWO {
|
||||
ProbList := limitedTimeEventCfg.GetSenceJackpotProb()
|
||||
Id = GoUtil.RandMap(ProbList)
|
||||
Items = limitedTimeEventCfg.GetSenceJackpotReward(Id)
|
||||
} else {
|
||||
ProbList := playroomCfg.GetTaskJackpotProb()
|
||||
Id = GoUtil.RandMap(ProbList)
|
||||
Items = playroomCfg.GetTaskJackpotReward(Id)
|
||||
}
|
||||
ProbList := playroomCfg.GetTaskJackpotProb()
|
||||
Id = GoUtil.RandMap(ProbList)
|
||||
Items = playroomCfg.GetTaskJackpotReward(Id)
|
||||
if len(Items) > 1 {
|
||||
// 多个奖励时,随机选择一个
|
||||
Items = []*item.Item{GoUtil.RandItem(Items)}
|
||||
|
||||
@ -30,19 +30,21 @@ func (s *SevenLoginMod) InitData() {
|
||||
|
||||
}
|
||||
|
||||
func (s *SevenLoginMod) ZeroUpdate(Add, LastLoginTime int) {
|
||||
func (s *SevenLoginMod) ZeroUpdate(Add, LastLoginTime, factor int) {
|
||||
WeekZeroTimestamp := GoUtil.WeekZeroTimestamp()
|
||||
Now := GoUtil.Now()
|
||||
if WeekZeroTimestamp > s.WeekResetTime {
|
||||
RewardType := GoUtil.IfTrue(Now-int64(LastLoginTime) > GoUtil.SEVENDAYS && LastLoginTime > 0, BACK_REWARD, DEFAULT_REWARD).(int)
|
||||
s.IsBack = RewardType == BACK_REWARD
|
||||
s.LoginReward = randWeekReward(Add, RewardType)
|
||||
s.LoginReward = formatSevenReward(s.LoginReward, factor)
|
||||
s.WeekResetTime = WeekZeroTimestamp
|
||||
s.DayR = 0
|
||||
}
|
||||
monthZeroTimestamp := GoUtil.MonthZeroTimestamp()
|
||||
if monthZeroTimestamp > s.MonthResetTime {
|
||||
s.MonthReward = randMonthReward()
|
||||
s.MonthReward = formatSevenReward(s.MonthReward, factor)
|
||||
s.Active = 0
|
||||
s.MonthResetTime = monthZeroTimestamp
|
||||
}
|
||||
@ -124,3 +126,13 @@ func (s *SevenLoginMod) BackData() *msg.ResSevenLogin {
|
||||
IsBack: s.IsBack,
|
||||
}
|
||||
}
|
||||
|
||||
func formatSevenReward(reward map[int]Reward, factor int) map[int]Reward {
|
||||
for k, v := range reward {
|
||||
v.Item1 = GoUtil.FormatStarItem(v.Item1, factor)
|
||||
v.Item2 = GoUtil.FormatStarItem(v.Item2, factor)
|
||||
v.Item3 = GoUtil.FormatStarItem(v.Item3, factor)
|
||||
reward[k] = v
|
||||
}
|
||||
return reward
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package sevenLogin
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
sevenLoginCfg "server/conf/seven_login"
|
||||
"server/game/mod/item"
|
||||
@ -17,111 +18,140 @@ const (
|
||||
)
|
||||
|
||||
func randWeekReward(Add, Type int) map[int]Reward {
|
||||
RewardList := sevenLoginCfg.GetSevenLoginReward()
|
||||
sort.Slice(RewardList, func(i, j int) bool {
|
||||
return RewardList[i].Id < RewardList[j].Id
|
||||
rewardList := sevenLoginCfg.GetSevenLoginReward()
|
||||
sort.Slice(rewardList, func(i, j int) bool {
|
||||
return rewardList[i].Id < rewardList[j].Id
|
||||
})
|
||||
jackpot := sevenLoginCfg.GetSevenLoginJackpot(0)
|
||||
sort.Slice(jackpot, func(i, j int) bool {
|
||||
return jackpot[i].Diamond < jackpot[j].Diamond
|
||||
return jackpot[i].Energy < jackpot[j].Energy
|
||||
})
|
||||
RI := make([]int, 0, len(RewardList))
|
||||
for _, v := range RewardList {
|
||||
RI = append(RI, v.Id)
|
||||
rI := make([]int, 0, len(rewardList))
|
||||
for _, v := range rewardList {
|
||||
rI = append(rI, v.Id)
|
||||
}
|
||||
CardPackIds := GoUtil.RandSliceNumNonAdjacent(RI, 3)
|
||||
cardPackIds := GoUtil.RandSliceNumNonAdjacent(rI, 3)
|
||||
result := make(map[int]Reward)
|
||||
LastType := 0
|
||||
EnergyMul := 1.0
|
||||
lastType := []int{}
|
||||
energyMul := 1.0
|
||||
if Type == BACK_REWARD {
|
||||
EnergyMul = 2.0
|
||||
energyMul = 2.0
|
||||
}
|
||||
for _, v := range RewardList {
|
||||
v.Diamond = int(float64(v.Diamond) * (1 + float64(Add)/100))
|
||||
Reward := randReward(v, LastType, jackpot, CardPackIds, 0.5, EnergyMul)
|
||||
result[v.Id] = Reward
|
||||
for _, v := range rewardList {
|
||||
v.Energy = float64(v.Energy) * (1 + float64(Add)/100)
|
||||
rewardData, randItemType := randReward(v, lastType, jackpot, cardPackIds, 0.5, energyMul)
|
||||
lastType = randItemType
|
||||
result[v.Id] = rewardData
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot []*gamedata.SevenLoginJackpotData, CardPackIds []int, EnergyPer, EnergyMul float64) Reward {
|
||||
func randReward(rewardData *gamedata.SevenLoginRewardData, lastType []int, jackpot []*gamedata.SevenLoginJackpotData, cardPackIds []int, energyPer, energyMul float64) (Reward, []int) {
|
||||
// 奖励1 体力 体力等价钻石占总价值的50%,且1钻≈2.5体力;体力值四舍五入,需以0或5结尾
|
||||
Num := float64(RewardData.Diamond) * EnergyPer * 2.5
|
||||
Num = float64(int(Num/5+0.5)) * 5
|
||||
RemainDiamond := RewardData.Diamond - int(Num/2.5)
|
||||
Num = Num * EnergyMul
|
||||
Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(Num))}
|
||||
num := math.Round(float64(rewardData.Energy) * energyPer)
|
||||
energyNum := float64(int(num/5)) * 5
|
||||
remainEnergy := rewardData.Energy - energyNum
|
||||
// 召回玩家 每日体力数*2
|
||||
energyNum = energyNum * energyMul
|
||||
items1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(energyNum))}
|
||||
// 奖励2
|
||||
|
||||
NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
|
||||
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)
|
||||
if v.Energy <= remainEnergy && !GoUtil.InArray(v.Type, lastType) && v.Type != JACKPOT_CARD_TYPE {
|
||||
newJackpot = append(newJackpot, v)
|
||||
}
|
||||
}
|
||||
if len(NewJackpot) == 0 {
|
||||
return Reward{Item1: Item1}
|
||||
var items2 []*item.Item
|
||||
itemType := []int{}
|
||||
if rewardData.RewardNum == 3 {
|
||||
remainEnergy -= 5
|
||||
}
|
||||
var Item2 []*item.Item
|
||||
Item2Type := 0
|
||||
if RewardData.RewardNum == 3 {
|
||||
RemainDiamond -= 5
|
||||
}
|
||||
if GoUtil.InArray(RewardData.Id, CardPackIds) {
|
||||
CardJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
|
||||
if GoUtil.InArray(rewardData.Id, cardPackIds) {
|
||||
cardJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
|
||||
for _, v := range jackpot {
|
||||
if v.Diamond <= RemainDiamond && v.Type == JACKPOT_CARD_TYPE {
|
||||
CardJackpot = append(CardJackpot, v)
|
||||
if v.Energy <= remainEnergy && v.Type == JACKPOT_CARD_TYPE {
|
||||
cardJackpot = append(cardJackpot, v)
|
||||
}
|
||||
}
|
||||
if len(CardJackpot) == 0 {
|
||||
Item2 = []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, RemainDiamond)}
|
||||
if len(cardJackpot) == 0 {
|
||||
items2 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(remainEnergy))}
|
||||
} else {
|
||||
Index := rand.IntN(len(CardJackpot))
|
||||
Item2Type = CardJackpot[Index].Type
|
||||
Item2 = CardJackpot[Index].Items
|
||||
RemainDiamond -= CardJackpot[Index].Diamond
|
||||
index := rand.IntN(len(cardJackpot))
|
||||
itemType = append(itemType, cardJackpot[index].Type)
|
||||
items2 = cardJackpot[index].Items
|
||||
remainEnergy -= cardJackpot[index].Energy
|
||||
}
|
||||
} else {
|
||||
Index := rand.IntN(len(NewJackpot))
|
||||
Item2Type = NewJackpot[Index].Type
|
||||
Item2 = NewJackpot[Index].Items
|
||||
RemainDiamond -= NewJackpot[Index].Diamond
|
||||
if len(newJackpot) == 0 {
|
||||
for _, v := range jackpot {
|
||||
if v.Energy <= remainEnergy {
|
||||
newJackpot = append(newJackpot, v)
|
||||
}
|
||||
}
|
||||
if len(newJackpot) == 0 {
|
||||
items2 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(remainEnergy))}
|
||||
return Reward{Item1: items1, Item2: items2}, nil
|
||||
}
|
||||
sort.Slice(newJackpot, func(i, j int) bool {
|
||||
return newJackpot[i].Energy > newJackpot[j].Energy
|
||||
})
|
||||
itemType = append(itemType, newJackpot[0].Type)
|
||||
return Reward{Item1: items1, Item2: newJackpot[0].Items}, itemType
|
||||
}
|
||||
sort.Slice(newJackpot, func(i, j int) bool {
|
||||
return newJackpot[i].Energy > newJackpot[j].Energy
|
||||
})
|
||||
itemType = append(itemType, newJackpot[0].Type)
|
||||
items2 = newJackpot[0].Items
|
||||
remainEnergy -= newJackpot[0].Energy
|
||||
}
|
||||
var Item3 []*item.Item
|
||||
if RewardData.RewardNum == 3 {
|
||||
RemainDiamond += 5
|
||||
NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
|
||||
var items3 []*item.Item
|
||||
if rewardData.RewardNum == 3 {
|
||||
remainEnergy += 5
|
||||
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)
|
||||
if v.Energy <= remainEnergy && !GoUtil.InArray(v.Type, lastType) && !GoUtil.InArray(v.Type, itemType) {
|
||||
newJackpot3 = append(newJackpot3, v)
|
||||
}
|
||||
}
|
||||
Index := rand.IntN(len(NewJackpot3))
|
||||
Item3 = NewJackpot3[Index].Items
|
||||
if len(newJackpot3) == 0 {
|
||||
items3 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(remainEnergy))}
|
||||
return Reward{
|
||||
Item1: items1,
|
||||
Item2: items2,
|
||||
Item3: items3,
|
||||
}, itemType
|
||||
}
|
||||
sort.Slice(newJackpot3, func(i, j int) bool {
|
||||
return newJackpot3[i].Energy > newJackpot3[j].Energy
|
||||
})
|
||||
items3 = newJackpot3[0].Items
|
||||
itemType = append(itemType, newJackpot3[0].Type)
|
||||
}
|
||||
|
||||
return Reward{
|
||||
Item1: Item1,
|
||||
Item2: Item2,
|
||||
Item3: Item3,
|
||||
}
|
||||
Item1: items1,
|
||||
Item2: items2,
|
||||
Item3: items3,
|
||||
}, itemType
|
||||
}
|
||||
|
||||
func randMonthReward() map[int]Reward {
|
||||
month := GoUtil.NowMonth()
|
||||
RewardList := sevenLoginCfg.GetSevenLoginMonthReward(month)
|
||||
sort.Slice(RewardList, func(i, j int) bool {
|
||||
return RewardList[i].Id < RewardList[j].Id
|
||||
rewardList := sevenLoginCfg.GetSevenLoginMonthReward(month)
|
||||
sort.Slice(rewardList, func(i, j int) bool {
|
||||
return rewardList[i].Id < rewardList[j].Id
|
||||
})
|
||||
jackpot := sevenLoginCfg.GetSevenLoginJackpot(1)
|
||||
sort.Slice(jackpot, func(i, j int) bool {
|
||||
return jackpot[i].Diamond < jackpot[j].Diamond
|
||||
return jackpot[i].Energy < jackpot[j].Energy
|
||||
})
|
||||
lastType := []int{}
|
||||
result := make(map[int]Reward)
|
||||
for _, v := range RewardList {
|
||||
Reward := randReward(v, 0, jackpot, []int{}, 0.65, 1)
|
||||
result[v.Id] = Reward
|
||||
for _, v := range rewardList {
|
||||
reward, lastItemType := randReward(v, lastType, jackpot, []int{}, 0.65, 1)
|
||||
lastType = lastItemType
|
||||
result[v.Id] = reward
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@ -1,16 +1,19 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"server/game/mod/activity"
|
||||
"server/game/mod/base"
|
||||
"server/game/mod/card"
|
||||
"server/game/mod/champship"
|
||||
"server/game/mod/charge"
|
||||
"server/game/mod/chess"
|
||||
"server/game/mod/collect"
|
||||
dailyTask "server/game/mod/daily_task"
|
||||
"server/game/mod/decorate"
|
||||
"server/game/mod/endless"
|
||||
"server/game/mod/face"
|
||||
"server/game/mod/friend"
|
||||
friendTreasure "server/game/mod/friend_treasure.go"
|
||||
"server/game/mod/fur"
|
||||
"server/game/mod/item"
|
||||
limitedTimeEvent "server/game/mod/limited_time_event"
|
||||
@ -95,3 +98,15 @@ func (p *Player) GetDailyTaskMod() *dailyTask.DailyTaskMod {
|
||||
func (p *Player) GetItemMod() *item.ItemMod {
|
||||
return p.PlayMod.getItemMod()
|
||||
}
|
||||
|
||||
func (p *Player) GetFriendTreasureMod() *friendTreasure.FriendTreasureMod {
|
||||
return p.PlayMod.getFriendTreasureMod()
|
||||
}
|
||||
|
||||
func (p *Player) GetActivityMod() *activity.Activity {
|
||||
return p.PlayMod.getActivityMod()
|
||||
}
|
||||
|
||||
func (p *Player) GetCollectMod() *collect.Collect {
|
||||
return p.PlayMod.getCollectMod()
|
||||
}
|
||||
|
||||
@ -536,9 +536,8 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error)
|
||||
upExp, upPExp = userCfg.GetLevUpExp(BaseMod.Level)
|
||||
// 日常任务解锁
|
||||
DailyTaskMod := player.PlayMod.getDailyTaskMod()
|
||||
DecorateMod := player.PlayMod.getDecorateMod()
|
||||
dailyAcitivityId := player.GetDailyTaskActivityId()
|
||||
if DailyTaskMod.LevUpTrigger(BaseMod.Level, DecorateMod.GetAreaId(), dailyAcitivityId) {
|
||||
if DailyTaskMod.LevUpTrigger(BaseMod.Level, player.GetOrderFactor(), dailyAcitivityId) {
|
||||
player.PushClientRes(DailyTaskMod.BackData())
|
||||
}
|
||||
upLv = BaseMod.Level
|
||||
|
||||
@ -16,6 +16,7 @@ import (
|
||||
limitedTimeEventCfg "server/conf/limited_time_event"
|
||||
mergeDataCfg "server/conf/merge_data"
|
||||
miningCfg "server/conf/mining"
|
||||
orderCfg "server/conf/order"
|
||||
playroomCfg "server/conf/playroom"
|
||||
"server/db"
|
||||
"server/ga"
|
||||
@ -65,6 +66,9 @@ type Player struct {
|
||||
activity map[int]*ActivityInfo
|
||||
stop bool
|
||||
wg sync.WaitGroup
|
||||
dispatcherWg sync.WaitGroup
|
||||
stopOnce sync.Once
|
||||
msgChanOnce sync.Once
|
||||
func_time int
|
||||
}
|
||||
|
||||
@ -79,19 +83,24 @@ type PlayerMsg struct {
|
||||
}
|
||||
|
||||
func (p *Player) Stop() {
|
||||
select {
|
||||
case <-p.stopSignal:
|
||||
// 通道已经关闭
|
||||
return
|
||||
default:
|
||||
p.wg.Wait()
|
||||
close(p.stopSignal)
|
||||
p.wg.Wait()
|
||||
p.signalDispatcherStop()
|
||||
p.msgChanOnce.Do(func() {
|
||||
close(p.msgChan)
|
||||
})
|
||||
for _, timer := range p.timerList {
|
||||
timer.Stop()
|
||||
}
|
||||
p.McronSave.Stop()
|
||||
p.stop = true
|
||||
}
|
||||
|
||||
func (p *Player) signalDispatcherStop() {
|
||||
p.stopOnce.Do(func() {
|
||||
close(p.stopSignal)
|
||||
})
|
||||
}
|
||||
|
||||
func (p *Player) CallEvent(Duration time.Duration, F func(), Label string) {
|
||||
if v, ok := p.timerList[Label]; ok {
|
||||
v.Stop()
|
||||
@ -213,6 +222,8 @@ func (p *Player) InitPlayer(UserName string) error {
|
||||
p.timerList = make(map[string]*timer.Timer)
|
||||
p.MDispatr = timer.NewDispatcher(100)
|
||||
p.stopSignal = make(chan bool)
|
||||
p.stopOnce = sync.Once{}
|
||||
p.msgChanOnce = sync.Once{}
|
||||
Base := &PlayerBaseData{p: p}
|
||||
|
||||
// 玩家基础数据
|
||||
@ -273,6 +284,8 @@ func (p *Player) InitPlayerByUid(Uid int) error {
|
||||
p.timerList = make(map[string]*timer.Timer)
|
||||
p.MDispatr = timer.NewDispatcher(100)
|
||||
p.stopSignal = make(chan bool)
|
||||
p.stopOnce = sync.Once{}
|
||||
p.msgChanOnce = sync.Once{}
|
||||
Base := &PlayerBaseData{p: p}
|
||||
|
||||
// 玩家基础数据
|
||||
@ -356,7 +369,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
|
||||
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
|
||||
|
||||
// 七日签到
|
||||
p.PlayMod.getSevenLoginMod().ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime())
|
||||
p.PlayMod.getSevenLoginMod().ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), p.GetOrderFactor())
|
||||
p.PushClientRes(p.PlayMod.getSevenLoginMod().BackData())
|
||||
|
||||
// 礼包充值
|
||||
@ -389,7 +402,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
|
||||
p.ActivityZeroUpdate()
|
||||
|
||||
// 每日任务
|
||||
p.PlayMod.getDailyTaskMod().ZeroUpdate(p.GetPlayerBaseMod().GetLevel(), p.PlayMod.getDecorateMod().GetAreaId(), p.GetDailyTaskActivityId())
|
||||
p.PlayMod.getDailyTaskMod().ZeroUpdate(p.GetPlayerBaseMod().GetLevel(), p.GetOrderFactor(), p.GetDailyTaskActivityId())
|
||||
p.PushClientRes(p.PlayMod.getDailyTaskMod().BackData())
|
||||
|
||||
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_LOGIN})
|
||||
@ -400,7 +413,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
|
||||
if VarMod.WeeklyResetTime < weekZeroTimestamp {
|
||||
VarMod.WeeklyResetTime = weekZeroTimestamp
|
||||
VarMod.WeeklyVar = make(map[int]interface{})
|
||||
p.PlayMod.getDailyTaskMod().WeekUpdate()
|
||||
p.PlayMod.getDailyTaskMod().WeekUpdate(p.GetOrderFactor())
|
||||
p.PushClientRes(p.PlayMod.getDailyTaskMod().BackData())
|
||||
|
||||
p.PlayMod.getLimitedTimeEventMod().WeekUpdate()
|
||||
@ -922,6 +935,18 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
|
||||
"change_after": ItemMod.GetItem(v.Id),
|
||||
"change_reason": Label,
|
||||
})
|
||||
if v.Id == p.GetMiningItemId() {
|
||||
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_MINING)
|
||||
aId := 0
|
||||
if ActivityInfo != nil {
|
||||
aId = ActivityInfo.Id
|
||||
}
|
||||
p.TeLog("get_token", map[string]interface{}{
|
||||
"obtain_way": Label,
|
||||
"get_num": v.Num,
|
||||
"event_id": aId,
|
||||
})
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -1011,6 +1036,8 @@ func (p *Player) InitPlayerOnly() {
|
||||
p.timerList = make(map[string]*timer.Timer)
|
||||
p.MDispatr = timer.NewDispatcher(10)
|
||||
p.stopSignal = make(chan bool)
|
||||
p.stopOnce = sync.Once{}
|
||||
p.msgChanOnce = sync.Once{}
|
||||
|
||||
Base := &PlayerBaseData{p: p}
|
||||
|
||||
@ -1111,6 +1138,9 @@ func (p *Player) HandleInUserRank() {
|
||||
Uid: int(p.M_DwUin),
|
||||
Score: float64(Score),
|
||||
RankType: RANK_TYPE_USER,
|
||||
Extra: map[string]interface{}{
|
||||
"country": p.PlayMod.getBaseMod().CountryCode,
|
||||
},
|
||||
},
|
||||
}
|
||||
G_GameLogicPtr.RankMgrSend(m)
|
||||
@ -1212,6 +1242,10 @@ func (p *Player) InitActivity() {
|
||||
if minduration > 0 {
|
||||
p.CallEvent(time.Duration(minduration)*time.Second, p.TickActivity, "init_activity")
|
||||
}
|
||||
ActivityMod = p.PlayMod.getActivityMod()
|
||||
if ActivityMod.AddEnd > now && !ActivityMod.AddReward {
|
||||
p.CallEvent(time.Duration(ActivityMod.AddEnd-now)*time.Second, p.TickActivityAddGift, "init_activity_add_gift")
|
||||
}
|
||||
p.TeLog("activity_ids", map[string]interface{}{
|
||||
"info": p.activity,
|
||||
})
|
||||
@ -1229,6 +1263,30 @@ func (p *Player) TickActivity() {
|
||||
p.SendClientRes()
|
||||
}
|
||||
|
||||
func (p *Player) TickActivityAddGift() {
|
||||
p.lock.Lock()
|
||||
defer p.lock.Unlock()
|
||||
ActivityMod := p.PlayMod.getActivityMod()
|
||||
activityInfo := p.GetActivityInfo(activity.ACT_TYPE_ADD_GIFT)
|
||||
if activityInfo == nil {
|
||||
log.Error("tick activity add gift error! activity end!")
|
||||
return
|
||||
}
|
||||
items, err := ActivityMod.GetAddGiftReward(activityInfo.Id)
|
||||
if err != nil {
|
||||
log.Error("tick activity add gift error! get reward failed! activity id: %d, err: %v", activityInfo.Id, err)
|
||||
return
|
||||
}
|
||||
err = p.HandleItem(items, msg.ITEM_POP_LABEL_ActTypeAddGift.String())
|
||||
if err != nil {
|
||||
log.Error("tick activity add gift error! handle reward failed! activity id: %d, err: %v", activityInfo.Id, err)
|
||||
return
|
||||
}
|
||||
p.PlayMod.save()
|
||||
p.BackDataActivity()
|
||||
p.SendClientRes()
|
||||
}
|
||||
|
||||
func (p *Player) BackDataActivity() {
|
||||
ResActivityList := make([]*msg.ActivityInfo, 0)
|
||||
for _, v := range p.activity {
|
||||
@ -1243,9 +1301,11 @@ func (p *Player) BackDataActivity() {
|
||||
Red: int32(Red),
|
||||
})
|
||||
}
|
||||
|
||||
ActivityMod := p.PlayMod.getActivityMod()
|
||||
p.PushClientRes(&msg.ResActivity{
|
||||
ActiveList: ResActivityList,
|
||||
AddEnd: ActivityMod.AddEnd,
|
||||
AddReward: ActivityMod.AddReward,
|
||||
})
|
||||
}
|
||||
|
||||
@ -1345,7 +1405,9 @@ func (p *Player) func_exec_add() error {
|
||||
}
|
||||
|
||||
func (p *Player) DispatcherHandle() {
|
||||
p.dispatcherWg.Add(1)
|
||||
go func() {
|
||||
defer p.dispatcherWg.Done()
|
||||
var cb *timer.Timer
|
||||
for {
|
||||
select {
|
||||
@ -1399,3 +1461,7 @@ func (p *Player) FixPlayroomPyhical() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Player) GetOrderFactor() int {
|
||||
return orderCfg.GetOrderFactor(p.GetDecorateMod().AreaId)
|
||||
}
|
||||
|
||||
@ -48,6 +48,7 @@ type RankMsg struct {
|
||||
Uid int
|
||||
Score float64
|
||||
RankType int
|
||||
Extra map[string]interface{}
|
||||
}
|
||||
|
||||
func (r *RankMgr) Init() {
|
||||
@ -100,13 +101,25 @@ func (r *RankMgr) getRank(RankType int) []*Rank {
|
||||
|
||||
// 获取排行榜信息
|
||||
func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
|
||||
data := m.Extra.(RankMsg)
|
||||
data, ok := m.Extra.(map[string]interface{})
|
||||
if !ok {
|
||||
return &RankInfo{
|
||||
List: []*Rank{},
|
||||
MyRank: 0,
|
||||
MyScore: 0,
|
||||
}, nil
|
||||
}
|
||||
// 全球排行榜
|
||||
if data.RankType == RANK_TYPE_GLOBAL {
|
||||
rank_type := RANK_TYPE_GLOBAL
|
||||
info, ok := data["rank_type"]
|
||||
if ok {
|
||||
rank_type = GoUtil.Int(info)
|
||||
}
|
||||
if rank_type == RANK_TYPE_GLOBAL {
|
||||
return r.getRedisRankInfo(m)
|
||||
}
|
||||
// 国家排行榜
|
||||
if data.RankType == RANK_TYPE_USER {
|
||||
if rank_type == RANK_TYPE_USER {
|
||||
return r.getRedisCountryRankInfo(m)
|
||||
}
|
||||
return &RankInfo{
|
||||
@ -117,7 +130,16 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
|
||||
}
|
||||
|
||||
func (r *RankMgr) getRedisCountryRankInfo(m *msg.Msg) (interface{}, error) {
|
||||
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, conf.Server.CountryCode)
|
||||
data, ok := m.Extra.(map[string]interface{})
|
||||
if !ok {
|
||||
return &RankInfo{}, nil
|
||||
}
|
||||
country := "000"
|
||||
info, ok := data["country"]
|
||||
if ok && info != "" {
|
||||
country = info.(string)
|
||||
}
|
||||
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, country)
|
||||
RedisList, err := db.RedisZRevRangeWithScores(RedisKey, 0, 100)
|
||||
if err != nil {
|
||||
return &RankInfo{}, nil
|
||||
@ -167,16 +189,22 @@ func (r *RankMgr) getRedisRankInfo(m *msg.Msg) (interface{}, error) {
|
||||
|
||||
// 进入排行榜
|
||||
func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
|
||||
data := m.Extra.(RankMsg)
|
||||
data, ok := m.Extra.(RankMsg)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid rank msg")
|
||||
}
|
||||
if data.RankType == RANK_TYPE_USER {
|
||||
// 全球玩家排行榜
|
||||
Uid := strconv.Itoa(data.Uid)
|
||||
TimeSort := fmt.Sprintf("0.%d", RANK_TIME_SORT-GoUtil.Now())
|
||||
TimeSortF, _ := strconv.ParseFloat(TimeSort, 64)
|
||||
db.RedisZAdd(RANK_USER, Uid, data.Score+TimeSortF)
|
||||
|
||||
info, ok := data.Extra["country"]
|
||||
if !ok || info == "" {
|
||||
info = "000"
|
||||
}
|
||||
// 地区玩家排行榜
|
||||
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, conf.Server.CountryCode)
|
||||
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, info)
|
||||
db.RedisZAdd(RedisKey, Uid, data.Score+TimeSortF)
|
||||
}
|
||||
|
||||
|
||||
@ -2334,10 +2334,14 @@ func ReqRank(player *Player, buf []byte) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
BaseMod := player.PlayMod.getBaseMod()
|
||||
m := &MsqMod.Msg{
|
||||
From: int(player.M_DwUin),
|
||||
Type: MsqMod.HANDLE_TYPE_RANK_INFO,
|
||||
Extra: RankMsg{RankType: int(req.Type)},
|
||||
From: int(player.M_DwUin),
|
||||
Type: MsqMod.HANDLE_TYPE_RANK_INFO,
|
||||
Extra: map[string]interface{}{
|
||||
"country": BaseMod.CountryCode,
|
||||
"rank_type": int(req.Type),
|
||||
},
|
||||
SendT: GoUtil.Now(),
|
||||
}
|
||||
RankInfo := G_GameLogicPtr.RankMgrCall(m).(*RankInfo)
|
||||
@ -3207,9 +3211,15 @@ func ReqMiningReward(player *Player, buf []byte) error {
|
||||
})
|
||||
return err
|
||||
}
|
||||
player.TeLog("mining_finish", map[string]interface{}{
|
||||
ActivityInfo := player.GetActivityInfo(activity.ACT_TYPE_MINING)
|
||||
aId := 0
|
||||
if ActivityInfo != nil {
|
||||
aId = ActivityInfo.Id
|
||||
}
|
||||
player.TeLog("finish_level", map[string]interface{}{
|
||||
"expend_token_num": Mining,
|
||||
"level_ID": MiningMod.Pass - 1,
|
||||
"level_id": MiningMod.Pass - 1,
|
||||
"event_id": aId,
|
||||
})
|
||||
player.PushClientRes(&msg.ResMiningReward{
|
||||
Code: msg.RES_CODE_SUCCESS,
|
||||
@ -4313,7 +4323,7 @@ func ReqFriendTreasureFilp(player *Player, buf []byte) error {
|
||||
|
||||
func ReqFriendTreasureEnd(player *Player, buf []byte) error {
|
||||
FriendTreasureMod := player.PlayMod.getFriendTreasureMod()
|
||||
Items, FriendItemNum, err := FriendTreasureMod.EndGame()
|
||||
Items, FriendItemNum, err := FriendTreasureMod.EndGame(player.GetOrderFactor())
|
||||
if err != nil {
|
||||
player.SendErrClienRes(
|
||||
&msg.ResFriendTreasureEnd{
|
||||
@ -4446,7 +4456,7 @@ func ReqSetEmoji(player *Player, buf []byte) error {
|
||||
// 请求收藏室内
|
||||
func ReqCollectInfo(player *Player, buf []byte) error {
|
||||
CollectMod := player.PlayMod.getCollectMod()
|
||||
player.PushClientRes(CollectMod.BackData())
|
||||
player.PushClientRes(CollectMod.BackData(player.GetOrderFactor()))
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -4472,7 +4482,7 @@ func ReqCollect(player *Player, buf []byte) error {
|
||||
AreaType = "avatar"
|
||||
Num = player.PlayMod.getAvatarMod().GetAvatarNum()
|
||||
}
|
||||
Items, err := CollectMod.GetReward(int(req.Id), Num)
|
||||
Items, err := CollectMod.GetReward(int(req.Id), Num, player.GetOrderFactor())
|
||||
if err != nil {
|
||||
player.SendErrClienRes(&msg.ResCollect{
|
||||
Code: msg.RES_CODE_FAIL,
|
||||
@ -4489,7 +4499,7 @@ func ReqCollect(player *Player, buf []byte) error {
|
||||
return err
|
||||
}
|
||||
player.PlayMod.save()
|
||||
player.PushClientRes(CollectMod.BackData())
|
||||
player.PushClientRes(CollectMod.BackData(player.GetOrderFactor()))
|
||||
player.PushClientRes(&msg.ResCollect{
|
||||
Code: msg.RES_CODE_SUCCESS,
|
||||
})
|
||||
@ -4611,6 +4621,47 @@ func ReqLimitEventLuckyCat(player *Player, buf []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 领取加赠活动奖励
|
||||
func ReqAddGiftReward(player *Player, buf []byte) error {
|
||||
req := &msg.ReqAddGiftReward{}
|
||||
err := proto.Unmarshal(buf, req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
activityInfo := player.GetActivityInfo(activity.ACT_TYPE_ADD_GIFT)
|
||||
if activityInfo == nil {
|
||||
player.SendErrClienRes(&msg.ResActivityReward{
|
||||
Code: msg.RES_CODE_FAIL,
|
||||
Msg: "activity not exist",
|
||||
})
|
||||
return fmt.Errorf("activity not exist")
|
||||
}
|
||||
ActivityMod := player.PlayMod.getActivityMod()
|
||||
items, err := ActivityMod.GetAddGiftReward(activityInfo.Id)
|
||||
if err != nil {
|
||||
player.SendErrClienRes(&msg.ResAddGiftReward{
|
||||
Code: msg.RES_CODE_FAIL,
|
||||
Msg: err.Error(),
|
||||
})
|
||||
return err
|
||||
}
|
||||
err = player.HandleItem(items, msg.ITEM_POP_LABEL_ActTypeAddGift.String())
|
||||
if err != nil {
|
||||
player.SendErrClienRes(&msg.ResAddGiftReward{
|
||||
Code: msg.RES_CODE_FAIL,
|
||||
Msg: err.Error(),
|
||||
})
|
||||
return err
|
||||
}
|
||||
player.PlayMod.save()
|
||||
player.BackDataActivity()
|
||||
player.PushClientRes(&msg.ResAddGiftReward{
|
||||
Code: msg.RES_CODE_SUCCESS,
|
||||
})
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func ReqActivityReward(player *Player, buf []byte) error {
|
||||
req := &msg.ReqActivityReward{}
|
||||
err := proto.Unmarshal(buf, req)
|
||||
|
||||
@ -22,6 +22,7 @@ const (
|
||||
BAN_MGR_KEY = "BAN_MGR"
|
||||
PER_SAVE_TIME = 60
|
||||
MESSAGE_MGR_KEY = "MESSAGE_MGR"
|
||||
ACTIVITY_MGR_KEY = "ACTIVITY_MGR"
|
||||
)
|
||||
|
||||
type ServerMod struct {
|
||||
|
||||
@ -12,14 +12,20 @@ import (
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/rand"
|
||||
"net"
|
||||
"net/http"
|
||||
"reflect"
|
||||
"server/game/mod/item"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/oschwald/geoip2-golang"
|
||||
)
|
||||
|
||||
var bufferPool = sync.Pool{
|
||||
@ -353,6 +359,24 @@ func Rand8DigitNumber() string {
|
||||
return fmt.Sprintf("%08d", n)
|
||||
}
|
||||
|
||||
// RandThreeNonAdjacent 从 [1, x] 中随机抽取 3 个两两不相邻的数。
|
||||
func RandThreeNonAdjacent(x int) ([]int, error) {
|
||||
if x < 5 {
|
||||
return nil, fmt.Errorf("x must be >= 5")
|
||||
}
|
||||
|
||||
// 先在 [1, x-2] 中均匀抽 3 个不重复数,再通过偏移构造为不相邻的结果。
|
||||
base := rand.Perm(x - 2)[:3]
|
||||
sort.Ints(base)
|
||||
|
||||
ret := make([]int, 3)
|
||||
for i, v := range base {
|
||||
ret[i] = (v + 1) + i
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func UniqueInts(input []int) []int {
|
||||
seen := make(map[int]struct{})
|
||||
result := make([]int, 0, len(input))
|
||||
@ -478,15 +502,28 @@ func GenerateShuffledAlphabet() string {
|
||||
|
||||
// 根据IP获取国家名称
|
||||
func GetCountryByIP(ip string) (string, error) {
|
||||
return "", nil
|
||||
// resp, err := http.Get("https://ipapi.co/" + ip + "/country_name/")
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// defer resp.Body.Close()
|
||||
// buf := new(bytes.Buffer)
|
||||
// buf.ReadFrom(resp.Body)
|
||||
// return strings.TrimSpace(buf.String()), nil
|
||||
parsedIP := net.ParseIP(ip)
|
||||
if parsedIP == nil {
|
||||
return "", fmt.Errorf("invalid ip: %s", ip)
|
||||
}
|
||||
|
||||
db, err := geoip2.Open("./GeoLite2-Country/GeoLite2-City.mmdb")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
record, err := db.Country(parsedIP)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
countryName := record.Country.Names["en"]
|
||||
if countryName == "" {
|
||||
return "", fmt.Errorf("country name not found for ip %s", ip)
|
||||
}
|
||||
|
||||
return GetISOCodeByCountry(countryName)
|
||||
}
|
||||
|
||||
// 根据国家名称获取ISO 3166-1国家码
|
||||
@ -569,11 +606,7 @@ func GetISOCodeByCountry(country string) (string, error) {
|
||||
|
||||
// 综合函数:根据IP获取ISO 3166-1国家码
|
||||
func GetISOCodeByIP(ip string) (string, error) {
|
||||
country, err := GetCountryByIP(ip)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return GetISOCodeByCountry(country)
|
||||
return GetCountryByIP(ip)
|
||||
}
|
||||
|
||||
func GetVarKey(Uid int) string {
|
||||
@ -658,3 +691,45 @@ func ElemNumber(list []int, ele int) int {
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func GetIPFromAddr(addr string) string {
|
||||
ip, _, err := net.SplitHostPort(addr)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return ip
|
||||
}
|
||||
|
||||
func GetGeoInfo(ip string) (string, string, error) {
|
||||
parsedIP := net.ParseIP(ip)
|
||||
if parsedIP == nil {
|
||||
return "", "", fmt.Errorf("invalid ip: %s", ip)
|
||||
}
|
||||
|
||||
db, err := geoip2.Open("./GeoLite2-Country/GeoLite2-City.mmdb")
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
defer db.Close()
|
||||
record, err := db.Country(parsedIP)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
countryCode, err := GetISOCodeByCountry(record.Country.Names["en"])
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
return countryCode, record.Country.IsoCode, nil
|
||||
}
|
||||
|
||||
func FormatStarItem(items []*item.Item, factor int) []*item.Item {
|
||||
for _, v := range items {
|
||||
if v.Id == item.ITEM_STAR_ID {
|
||||
Num := math.Round(float64(v.Num) * float64(factor) / 100)
|
||||
v.Num = int(Num) / 5 * 5
|
||||
}
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
@ -128,15 +128,15 @@ func RandSliceNumNonAdjacent(s []int, num int) []int {
|
||||
for len(result) < num {
|
||||
Id := rand.Intn(len(slice))
|
||||
result = append(result, slice[Id])
|
||||
slice = SubAdjacentElemSlice(slice, Id)
|
||||
slice = SubAdjacentElemSlice(slice, slice[Id])
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func SubAdjacentElemSlice(s []int, Id int) []int {
|
||||
r := make([]int, 0, len(s))
|
||||
for k, v := range s {
|
||||
if k < Id-1 || k > Id+1 {
|
||||
for _, v := range s {
|
||||
if v < Id-1 || v > Id+1 {
|
||||
r = append(r, v)
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,16 +31,16 @@ type StartOrderData struct {
|
||||
|
||||
type SevenLoginRewardData struct {
|
||||
Id int
|
||||
Diamond int
|
||||
Energy float64
|
||||
RewardNum int
|
||||
}
|
||||
|
||||
type SevenLoginJackpotData struct {
|
||||
Id int
|
||||
Diamond int
|
||||
Items []*item.Item
|
||||
Type int
|
||||
Month int
|
||||
Id int
|
||||
Energy float64
|
||||
Items []*item.Item
|
||||
Type int
|
||||
Month int
|
||||
}
|
||||
|
||||
type ActivityData struct {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
module server
|
||||
|
||||
go 1.23
|
||||
go 1.25.0
|
||||
|
||||
require (
|
||||
github.com/alibabacloud-go/cloudauth-20190307/v4 v4.9.2
|
||||
@ -13,10 +13,12 @@ require (
|
||||
github.com/go-sql-driver/mysql v1.8.1
|
||||
github.com/gorilla/websocket v1.5.3
|
||||
github.com/jmoiron/sqlx v1.4.0
|
||||
github.com/oschwald/geoip2-golang v1.13.0
|
||||
github.com/redis/go-redis/v9 v9.6.1
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/shirou/gopsutil v3.21.11+incompatible
|
||||
google.golang.org/protobuf v1.36.2
|
||||
google.golang.org/grpc v1.79.2
|
||||
google.golang.org/protobuf v1.36.11
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
||||
)
|
||||
|
||||
@ -36,19 +38,20 @@ require (
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // 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
|
||||
github.com/tklauser/numcpus v0.8.0 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||
golang.org/x/net v0.34.0 // indirect
|
||||
golang.org/x/net v0.51.0 // indirect
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/apache/thrift v0.22.0 // indirect
|
||||
golang.org/x/sys v0.29.0 // indirect
|
||||
github.com/oschwald/maxminddb-golang v1.13.0 // indirect
|
||||
golang.org/x/sys v0.41.0 // indirect
|
||||
golang.org/x/text v0.34.0 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
|
||||
@ -73,8 +73,6 @@ github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmP
|
||||
github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
|
||||
github.com/aliyun/credentials-go v1.4.6 h1:CG8rc/nxCNKfXbZWpWDzI9GjF4Tuu3Es14qT8Y0ClOk=
|
||||
github.com/aliyun/credentials-go v1.4.6/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U=
|
||||
github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc=
|
||||
github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
||||
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||
@ -95,6 +93,10 @@ 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/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
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=
|
||||
@ -110,12 +112,15 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
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=
|
||||
@ -146,6 +151,10 @@ 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/oschwald/geoip2-golang v1.13.0 h1:Q44/Ldc703pasJeP5V9+aFSZFmBN7DKHbNsSFzQATJI=
|
||||
github.com/oschwald/geoip2-golang v1.13.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo=
|
||||
github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU=
|
||||
github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o=
|
||||
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=
|
||||
@ -176,6 +185,18 @@ github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
||||
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
|
||||
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
|
||||
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
|
||||
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
|
||||
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
|
||||
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
|
||||
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
|
||||
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
@ -221,8 +242,8 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
||||
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
|
||||
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
|
||||
golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
|
||||
golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@ -254,8 +275,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
|
||||
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
@ -278,6 +299,8 @@ 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.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
|
||||
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
|
||||
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=
|
||||
@ -295,22 +318,28 @@ golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxb
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
||||
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU=
|
||||
google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU=
|
||||
google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
||||
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
|
||||
@ -2,7 +2,6 @@ package network
|
||||
|
||||
import (
|
||||
"net"
|
||||
"server/conf"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"sync"
|
||||
"time"
|
||||
@ -84,9 +83,9 @@ func (server *TCPServer) run() {
|
||||
return
|
||||
}
|
||||
tempDelay = 0
|
||||
if conf.Server.ServerType == "center" {
|
||||
log.Debug("accept connection from %v", conn.RemoteAddr())
|
||||
}
|
||||
// if conf.Server.ServerType == "center" {
|
||||
// log.Debug("accept connection from %v", conn.RemoteAddr())
|
||||
// }
|
||||
server.mutexConns.Lock()
|
||||
if len(server.conns) >= server.MaxConnNum {
|
||||
server.mutexConns.Unlock()
|
||||
|
||||
@ -2,7 +2,9 @@ package test
|
||||
|
||||
import (
|
||||
"server/game"
|
||||
"server/game/mod/activity"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestActivityOpenEnd(t *testing.T) {
|
||||
@ -11,3 +13,33 @@ func TestActivityOpenEnd(t *testing.T) {
|
||||
p.InitActivity()
|
||||
p.ActivityLogin()
|
||||
}
|
||||
|
||||
func TestActivityAddGift(t *testing.T) {
|
||||
p := new(game.Player)
|
||||
p.InitPlayer("3625212")
|
||||
p.InitActivity()
|
||||
p.Charge(72)
|
||||
p.BackDataActivity()
|
||||
|
||||
ActivityMod := p.GetActivityMod()
|
||||
activityInfo := p.GetActivityInfo(activity.ACT_TYPE_ADD_GIFT)
|
||||
if activityInfo == nil {
|
||||
t.Error("activityInfo is nil")
|
||||
return
|
||||
}
|
||||
items, err := ActivityMod.GetAddGiftReward(activityInfo.Id)
|
||||
if err != nil {
|
||||
t.Error("GetAddGiftReward error:", err)
|
||||
return
|
||||
}
|
||||
t.Logf("GetAddGiftReward items:%v", items)
|
||||
}
|
||||
|
||||
func TestActivityAddGiftTick(t *testing.T) {
|
||||
p := new(game.Player)
|
||||
p.InitPlayer("3625212")
|
||||
p.InitActivity()
|
||||
p.Charge(72)
|
||||
p.BackDataActivity()
|
||||
time.Sleep(time.Second * 15)
|
||||
}
|
||||
|
||||
@ -31,5 +31,5 @@ func TestWatchAd(t *testing.T) {
|
||||
func TestActivityGiftAdd(t *testing.T) {
|
||||
p1 := new(game.Player)
|
||||
p1.InitPlayer("3625212")
|
||||
p1.Charge(76)
|
||||
p1.Charge(71)
|
||||
}
|
||||
|
||||
14
src/server/test/collect_test.go
Normal file
14
src/server/test/collect_test.go
Normal file
@ -0,0 +1,14 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"server/game"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestCollectBack(t *testing.T) {
|
||||
p1 := new(game.Player)
|
||||
p1.InitPlayer("3625212")
|
||||
CollectMod := p1.GetCollectMod()
|
||||
res := CollectMod.BackData(p1.GetOrderFactor())
|
||||
t.Logf("res:%v", res)
|
||||
}
|
||||
@ -26,6 +26,17 @@ func TestDailyZeroUpdate(t *testing.T) {
|
||||
DailyTaskMod.BackData()
|
||||
}
|
||||
|
||||
func TestDailyWeekUpdate(t *testing.T) {
|
||||
player := new(game.Player)
|
||||
player.InitPlayerByUid(100001)
|
||||
DailyTaskMod := player.GetDailyTaskMod()
|
||||
DailyTaskMod.WeekUpdate(200)
|
||||
for _, v := range DailyTaskMod.WeekReward {
|
||||
fmt.Printf("week reward id: %d, items: %v\n", v.Id, v.Items)
|
||||
}
|
||||
DailyTaskMod.BackData()
|
||||
}
|
||||
|
||||
func TestDailyTaskRewardScore(t *testing.T) {
|
||||
score1 := dailyTaskCfg.GetDailyTaskScore(1, 1)
|
||||
if score1 == 0 {
|
||||
|
||||
@ -96,7 +96,8 @@ func TestFixUserData(t *testing.T) {
|
||||
func TestRandInt(t *testing.T) {
|
||||
p1 := new(game.Player)
|
||||
p1.InitPlayer("3625212")
|
||||
p1.DeleteHighOrder()
|
||||
CollectMod := p1.GetCollectMod()
|
||||
p1.PushClientRes(CollectMod.BackData(p1.GetOrderFactor()))
|
||||
}
|
||||
|
||||
func TestII(t *testing.T) {
|
||||
@ -285,3 +286,18 @@ func TestChampionShipCreateRobot(t *testing.T) {
|
||||
func TestRedisZset(t *testing.T) {
|
||||
db.RedisZAdd("rank_user", "100001", 100)
|
||||
}
|
||||
|
||||
func TestGeoIp(t *testing.T) {
|
||||
ip := "117.30.95.111:5557"
|
||||
ip = GoUtil.GetIPFromAddr(ip)
|
||||
code, _ := GoUtil.GetCountryByIP(ip)
|
||||
fmt.Printf("IP: %s, Country Code: %s\n", ip, code)
|
||||
}
|
||||
|
||||
func TestRandAn(t *testing.T) {
|
||||
rI := []int{1, 2, 3, 4, 5, 6, 7}
|
||||
for i := 0; i < 10; i++ {
|
||||
randNum := GoUtil.RandSliceNumNonAdjacent(rI, 3)
|
||||
fmt.Printf("Random Number: %v\n", randNum)
|
||||
}
|
||||
}
|
||||
|
||||
29
src/server/test/friendTreasure_test.go
Normal file
29
src/server/test/friendTreasure_test.go
Normal file
@ -0,0 +1,29 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"server/game"
|
||||
friendTreasure "server/game/mod/friend_treasure.go"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestFriendTreasure(t *testing.T) {
|
||||
player := new(game.Player)
|
||||
player.InitPlayerByUid(100001)
|
||||
FriendTreasureMod := player.GetFriendTreasureMod()
|
||||
FriendTreasureMod.Status = friendTreasure.GAME_STATUS_START
|
||||
FriendTreasureMod.Shift = 1
|
||||
FriendTreasureMod.Star = 100
|
||||
Items, FriendItemNum, err := FriendTreasureMod.EndGame(111)
|
||||
if err != nil {
|
||||
t.Errorf("EndGame error: %v", err)
|
||||
}
|
||||
if len(Items) != 1 {
|
||||
t.Errorf("EndGame error: expected 1 item, got %d", len(Items))
|
||||
}
|
||||
if Items[0].Num != 220 {
|
||||
t.Errorf("EndGame error: expected item num 220, got %d", Items[0].Num)
|
||||
}
|
||||
if FriendItemNum != 22 {
|
||||
t.Errorf("EndGame error: expected friend item num 22, got %d", FriendItemNum)
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
sevenLoginCfg "server/conf/seven_login"
|
||||
"server/game"
|
||||
GoUtil "server/game_util"
|
||||
@ -17,7 +18,15 @@ func TestSevenLoginZeroUpdate(t *testing.T) {
|
||||
p1 := new(game.Player)
|
||||
p1.InitPlayer("3625212")
|
||||
SevenLoginMod := p1.GetSevenLoginMod()
|
||||
SevenLoginMod.ZeroUpdate(0, 0)
|
||||
SevenLoginMod.WeekResetTime = 0
|
||||
SevenLoginMod.MonthResetTime = 0
|
||||
SevenLoginMod.ZeroUpdate(0, 0, p1.GetOrderFactor())
|
||||
SevenLoginMod.BackData()
|
||||
t.Logf("SevenLoginMod:%v", SevenLoginMod)
|
||||
fmt.Printf("order factor:%v\n", p1.GetOrderFactor())
|
||||
for k, v := range SevenLoginMod.LoginReward {
|
||||
t.Logf("Reward:%v\n", v)
|
||||
fmt.Printf("id :%d ; Reward:%v\n", k, v)
|
||||
}
|
||||
t.Logf("SevenLoginMod:%v\n", SevenLoginMod.MonthReward)
|
||||
fmt.Printf("SevenLoginMod:%v\n", SevenLoginMod.MonthReward)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user