Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2026-03-19 15:31:37 +08:00
commit 2fc50aeeaa
42 changed files with 880 additions and 296 deletions

3
.gitignore vendored
View File

@ -20,3 +20,6 @@ src/server/test/teLog/*
src/server/*.exe* src/server/*.exe*
src/server/msg/Gameapi.pb.go src/server/msg/Gameapi.pb.go
src/server/gen-go src/server/gen-go
src/server/GeoLite2-Country
src/server/test/GeoLite2-Country
src/server/msg/Gameapi_grpc.pb.go

View File

@ -56,3 +56,12 @@ func GetRewardType(Id int) int {
} }
return gamedata.GetIntValue(data, "Type") 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)
}

View File

@ -24,7 +24,7 @@ func init() {
gamedata.InitCfg(DAILY_TASK_REWARD) 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) data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil { if err != nil {
log.Debug("GetDailyTaskReward err:%v", err) log.Debug("GetDailyTaskReward err:%v", err)
@ -37,11 +37,9 @@ func GetDailyTaskReward(Id, factory, activityId int) []*item.Item {
items := gamedata.GetItemList(v, "ItemID") items := gamedata.GetItemList(v, "ItemID")
petCoinBase := gamedata.GetIntValue(v, "PetCoinBase") petCoinBase := gamedata.GetIntValue(v, "PetCoinBase")
if petCoinBase > 0 { if petCoinBase > 0 {
petCoinNum := int(float64(petCoinBase) * (float64(factory)/1000 + 1))
petCoinNum = (petCoinNum/5 + 1) * 5 // 向上取整到5的倍数
items = append(items, &item.Item{ items = append(items, &item.Item{
Id: item.ITEM_STAR_ID, Id: item.ITEM_STAR_ID,
Num: petCoinNum, Num: petCoinBase,
}) })
} }
return items return items

View File

@ -29,11 +29,11 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
var result []*gamedata.SevenLoginRewardData var result []*gamedata.SevenLoginRewardData
for k, v := range data { for k, v := range data {
Id, _ := strconv.Atoi(k) Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond") Energy := gamedata.GetFloatValue(v, "Energy")
RewardNum := gamedata.GetIntValue(v, "RewardNum") RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{ result = append(result, &gamedata.SevenLoginRewardData{
Id: Id, Id: Id,
Diamond: Diamond, Energy: Energy,
RewardNum: RewardNum, RewardNum: RewardNum,
}) })
} }
@ -53,11 +53,11 @@ func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
continue continue
} }
Id, _ := strconv.Atoi(k) Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond") Energy := gamedata.GetFloatValue(v, "Energy")
RewardNum := gamedata.GetIntValue(v, "RewardNum") RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{ result = append(result, &gamedata.SevenLoginRewardData{
Id: Id, Id: Id,
Diamond: Diamond, Energy: Energy,
RewardNum: RewardNum, RewardNum: RewardNum,
}) })
} }
@ -73,7 +73,7 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
var result []*gamedata.SevenLoginJackpotData var result []*gamedata.SevenLoginJackpotData
for k, v := range data { for k, v := range data {
Id, _ := strconv.Atoi(k) Id, _ := strconv.Atoi(k)
Diamond := gamedata.GetIntValue(v, "Diamond") Energy := gamedata.GetFloatValue(v, "Energy")
Type := gamedata.GetIntValue(v, "Type") Type := gamedata.GetIntValue(v, "Type")
Month := gamedata.GetIntValue(v, "Month") Month := gamedata.GetIntValue(v, "Month")
if IsMonth != Month && IsMonth != 0 { if IsMonth != Month && IsMonth != 0 {
@ -82,11 +82,11 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
ItemMap := gamedata.GetValue(v, "Item") ItemMap := gamedata.GetValue(v, "Item")
Items := item.ParseItem(ItemMap) Items := item.ParseItem(ItemMap)
result = append(result, &gamedata.SevenLoginJackpotData{ result = append(result, &gamedata.SevenLoginJackpotData{
Id: Id, Id: Id,
Diamond: Diamond, Energy: Energy,
Items: Items, Items: Items,
Type: Type, Type: Type,
Month: Month, Month: Month,
}) })
} }
return result return result

View File

@ -311,6 +311,27 @@ func ResetAccountData(oldName, newName string) error {
return err 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) { func UpdateAccountInfoToDb(account *Db_Account) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName) _, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName)
return return

View File

@ -793,6 +793,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
// #region 活动 // #region 活动
RegisterMsgProcessFunc("ReqActivityReward", ReqActivityReward) // 领取活动奖励 RegisterMsgProcessFunc("ReqActivityReward", ReqActivityReward) // 领取活动奖励
RegisterMsgProcessFunc("ReqAddGiftReward", ReqAddGiftReward) // 领取加赠活动奖励
// 挖矿 // 挖矿
RegisterMsgProcessFunc("ReqMining", ReqMining) // 请求挖矿数据 RegisterMsgProcessFunc("ReqMining", ReqMining) // 请求挖矿数据
RegisterMsgProcessFunc("ReqMiningReward", ReqMiningReward) // 领取挖矿奖励 RegisterMsgProcessFunc("ReqMiningReward", ReqMiningReward) // 领取挖矿奖励

View File

@ -307,6 +307,14 @@ func (p *Player) RedBackData() {
p.PushClientRes(&msg.ResActRed{Red: result}) 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() { func (p *Player) ActPassBackData() {
ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS) ActivityInfo := p.GetActivityInfo(activity.ACT_TYPE_PASS)

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

View File

@ -19,6 +19,7 @@ import (
proto "server/msg" proto "server/msg"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"strings" "strings"
"time"
) )
func (p *Player) Charge(ChargeId int) { func (p *Player) Charge(ChargeId int) {
@ -46,9 +47,9 @@ func (p *Player) SendCharge(d *ChargeExtra) {
func (p *Player) ADPetWorkFire(ChargeId int) { func (p *Player) ADPetWorkFire(ChargeId int) {
ChargeMod := p.PlayMod.getChargeMod() ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.FireAdReward(ChargeId) items := ChargeMod.FireAdReward(ChargeId)
if Item != nil { if items != nil {
err := p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String()) err := p.HandleItem(items, proto.ITEM_POP_LABEL_ActivityGift.String())
if err != nil { if err != nil {
log.Debug("ChargeFire err : %s", err) log.Debug("ChargeFire err : %s", err)
return return
@ -58,41 +59,37 @@ func (p *Player) ADPetWorkFire(ChargeId int) {
p.ChargeBackData() p.ChargeBackData()
} }
func (p *Player) ActivityFire(ChargeId int) { func (p *Player) ActivityFire(chargeId int) {
ActivityMod := p.PlayMod.getActivityMod() ActivityMod := p.PlayMod.getActivityMod()
ActivityId := activityCfg.GetActivityGiftId(ChargeId) activityId := activityCfg.GetActivityGiftId(chargeId)
ActivityInfo := p.GetActivityInfoById(ActivityId) activityInfo := p.GetActivityInfoById(activityId)
if ActivityInfo == nil { if activityInfo == nil {
log.Debug("ActivityFire ActivityInfo nil : player id :%d, charge id:%d", p.M_DwUin, ChargeId) log.Debug("ActivityFire ActivityInfo nil : player id :%d, charge id:%d", p.M_DwUin, chargeId)
return return
} }
Item, err := ActivityMod.Fire(ChargeId) items, err := ActivityMod.Fire(chargeId, activityInfo.Type)
if err != nil { if err != nil {
log.Debug("ActivityFire err : %s", err) log.Debug("ActivityFire err : %s", err)
return return
} }
if Item == nil { if items == nil {
log.Debug("ActivityFire err : %s", err)
return return
} }
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String()) err = p.HandleItem(items, proto.ITEM_POP_LABEL_ActivityGift.String())
if err != nil { if err != nil {
log.Debug("ChargeFire err : %s", err) log.Debug("ChargeFire err : %s", err)
return return
} }
if ActivityId == activity.ACT_TYPE_ADD_GIFT { if activityInfo.Type == activity.ACT_TYPE_ADD_GIFT {
Items := activityCfg.GetActivityRewardItems(ActivityId) if ActivityMod.AddEnd > GoUtil.Now() && !ActivityMod.AddReward {
if len(Items) > 0 { p.CallEvent(time.Duration(ActivityMod.AddEnd-GoUtil.Now())*time.Second, p.TickActivityAddGift, "activity_add_gift")
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActTypeAddGift.String())
if err != nil {
log.Debug("ChargeFire err : %s", err)
return
}
} }
} }
p.TeLog("charge_gift", map[string]interface{}{ p.TeLog("charge_gift", map[string]interface{}{
"activity_id": ActivityId, "activity_id": activityId,
"charge_id": ChargeId, "charge_id": chargeId,
"item_list": Item, "item_list": items,
}) })
p.PlayMod.save() p.PlayMod.save()
p.InitActivity() p.InitActivity()

View File

@ -120,7 +120,7 @@ func HandleClientReq(args []interface{}) {
G_GameLogicPtr.SendServerVersion(a) G_GameLogicPtr.SendServerVersion(a)
case "ReqRegisterAccount": case "ReqRegisterAccount":
detail := &msg.ReqRegisterAccount{} detail := &msg.ReqRegisterAccount{}
log.Debug("player %s start login", detail.UserName) log.Debug("player %s start register", detail.UserName)
proto.Unmarshal(buf, detail) proto.Unmarshal(buf, detail)
gl := G_getGameLogic() gl := G_getGameLogic()
defer func() { defer func() {

View File

@ -131,6 +131,7 @@ func ReqGmCommand_(player *Player, Command string) error {
VarMod.WeeklyResetTime = 0 VarMod.WeeklyResetTime = 0
player.ZeroUpdate(nil) player.ZeroUpdate(nil)
G_GameLogicPtr.ZeroFlush() G_GameLogicPtr.ZeroFlush()
player.PushClientRes(player.GetDailyTaskMod().BackData())
case "setSevenLoginActive": case "setSevenLoginActive":
num, _ := strconv.Atoi(arg[1]) num, _ := strconv.Atoi(arg[1])
player.PlayMod.getSevenLoginMod().Active = num player.PlayMod.getSevenLoginMod().Active = num
@ -591,14 +592,28 @@ func ReqGmCommand_(player *Player, Command string) error {
BaseMod.Account = newAccount BaseMod.Account = newAccount
player.GetPlayerBaseMod().Data.UserName = newAccount player.GetPlayerBaseMod().Data.UserName = newAccount
player.PushAndSendClienRes(&msg.ForceKickOut{}) 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": case "resetCode":
BaseMod := player.PlayMod.getBaseMod() BaseMod := player.PlayMod.getBaseMod()
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid))) BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))
player.BackUserInfo() player.BackUserInfo()
case "debug": case "debug":
player.AddPlayroomUpvote(100100129) player.HandleInUserRank()
i := player.GetPlayroomUpvote(100100129)
log.Debug("debug upvote:%d", i)
case "addLimitEvent": case "addLimitEvent":
Id, _ := strconv.Atoi(arg[1]) Id, _ := strconv.Atoi(arg[1])
Cd, _ := strconv.Atoi(arg[2]) 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)) GoUtil.NotifyPlayer(GoUtil.Int(PlayerSimpleData.Account), NOTIFY_TYPE_PETROOM_GAME, fmt.Sprintf(title, PlayerSimpleData.PetName), fmt.Sprintf(info, PlayerSimpleData.PetName))
case "resetWeekReward": case "resetWeekReward":
SevenMod := player.PlayMod.getSevenLoginMod() SevenMod := player.PlayMod.getSevenLoginMod()
SevenMod.WeekResetTime = 0
SevenMod.MonthResetTime = 0 SevenMod.MonthResetTime = 0
PlayerBaseMod := player.GetPlayerBaseMod() 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": case "debugLogoutMsg":
ToUid, _ := strconv.Atoi(arg[1]) ToUid, _ := strconv.Atoi(arg[1])
uidList, err := db.GetDebugPlayer(ToUid) uidList, err := db.GetDebugPlayer(ToUid)

View File

@ -150,7 +150,10 @@ func (p *Player) handle(m *msg.Msg) error {
p.PlayMod.save() p.PlayMod.save()
case msg.HANDLE_TYPE_INVITE_FRIEND: // 邀请好友 case msg.HANDLE_TYPE_INVITE_FRIEND: // 邀请好友
InviteMod := p.PlayMod.getInviteMod() 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.AddLog(m.From, friend.LOG_TYPE_FRIEND_INVITE, "", m.SendT)
p.PlayMod.save() p.PlayMod.save()
p.PushClientRes(InviteMod.NotifySuccess()) p.PushClientRes(InviteMod.NotifySuccess())

View File

@ -19,7 +19,7 @@ const (
ACT_TYPE_GUESS_COLOR = 2 // 猜颜色 ACT_TYPE_GUESS_COLOR = 2 // 猜颜色
ACT_TYPE_RACE = 3 // 赛跑 ACT_TYPE_RACE = 3 // 赛跑
ACT_TYPE_DISCOUNT_GIFT = 4 // 折扣礼包 ACT_TYPE_DISCOUNT_GIFT = 4 // 折扣礼包
ACT_TYPE_ADD_GIFT = 5 // 加送礼包 ACT_TYPE_ADD_GIFT = 5 // 买一赠一礼包
ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包 ACT_TYPE_SUPER_GIFT = 6 // 超值加购礼包
ACT_TYPE_CATNIP = 7 // 猫草大作战 ACT_TYPE_CATNIP = 7 // 猫草大作战
ACT_TYPE_PASS = 8 // 通行证 ACT_TYPE_PASS = 8 // 通行证
@ -33,6 +33,8 @@ const (
type Activity struct { type Activity struct {
Var map[int]interface{} Var map[int]interface{}
// 活动数据 // 活动数据
AddEnd int64 // 买一赠一礼包结束时间
AddReward bool // 买一赠一礼包奖励是否已领取
} }
type Gift struct { type Gift struct {
@ -94,15 +96,26 @@ func (a *Activity) GetActivityStatus(data *gamedata.ActivityData) int {
} }
// 活动礼包-获取奖励 // 活动礼包-获取奖励
func (a *Activity) GetReward(ActId int) ([]*item.Item, error) { func (a *Activity) GetReward(actId int) ([]*item.Item, error) {
Var := a.getGiftVar(ActId) varInfo := a.getGiftVar(actId)
if !Var.Buy { if !varInfo.Buy {
return nil, fmt.Errorf("ActId:%d not buy", ActId) return nil, fmt.Errorf("ActId:%d not buy", actId)
} }
if Var.Reward { if varInfo.Reward {
return nil, fmt.Errorf("ActId:%d reward already get", ActId) return nil, fmt.Errorf("ActId:%d reward already get", actId)
} }
Var.Reward = true varInfo.Reward = true
Var.RewardTime = GoUtil.Now() varInfo.RewardTime = GoUtil.Now()
return activityCfg.GetActivityRewardItems(ActId), nil 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
} }

View File

@ -3,10 +3,11 @@ package activity
import ( import (
activityCfg "server/conf/activity" activityCfg "server/conf/activity"
"server/game/mod/item" "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) // AId := activityCfg.GetActivityGiftId(Id)
// Var := a.getGiftVar(AId) // Var := a.getGiftVar(AId)
// if Var.Buy { // if Var.Buy {
@ -14,5 +15,8 @@ func (a *Activity) Fire(Id int) ([]*item.Item, error) {
// } // }
// Var.Buy = true // Var.Buy = true
// Var.Time = GoUtil.Now() // Var.Time = GoUtil.Now()
if atype == ACT_TYPE_ADD_GIFT {
a.AddEnd = GoUtil.Now() + 7*86400
}
return activityCfg.GetActivityGiftItems(Id), nil return activityCfg.GetActivityGiftItems(Id), nil
} }

View File

@ -45,9 +45,15 @@ type Base struct {
AddCode string // 用于添加好友的code AddCode string // 用于添加好友的code
DiviceId string // 设备id DiviceId string // 设备id
RegisterTime int64 // 注册时间 RegisterTime int64 // 注册时间
CountryCode string // 国家码
} }
func (b *Base) InitData(Uid int, Ip 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 != "" { if b.AddCode == "" && Ip != "" {
Code, _ := GoUtil.GetCountryByIP(Ip) Code, _ := GoUtil.GetCountryByIP(Ip)
CountryCode := conf.Server.CountryCode CountryCode := conf.Server.CountryCode

View File

@ -22,7 +22,7 @@ const (
COLLECT_TYPE_FACE = 2 COLLECT_TYPE_FACE = 2
COLLECT_TYPE_AVATAR = 3 COLLECT_TYPE_AVATAR = 3
jackpotPreviewSize = 18 // 展示的奖池预览数量,同时作为补充阈値 jackpotPreviewSize = 9 // 展示的奖池预览数量,同时作为补充阈値
) )
func (c *Collect) InitData() { func (c *Collect) InitData() {
@ -37,49 +37,57 @@ func (c *Collect) InitData() {
// ensureJackpot 当奖池剩余少于预览数量时自动补充 // ensureJackpot 当奖池剩余少于预览数量时自动补充
func (c *Collect) ensureJackpot() { func (c *Collect) ensureJackpot() {
if len(c.Jackpot) <= jackpotPreviewSize { rewardLen := collectCfg.GetRewardLen()
c.Jackpot = initJackpot2(c.Jackpot) 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 { for _, v := range c.Reward {
if v == Id { if v == id {
return nil, fmt.Errorf("id : %d;已领取", Id) return nil, fmt.Errorf("id : %d;已领取", id)
} }
} }
Need := collectCfg.GetRewardNeed(Id) need := collectCfg.GetRewardNeed(id)
if Num < Need { if num < need {
return nil, fmt.Errorf("id : %d;收集数量不足 %d", Id, Need) return nil, fmt.Errorf("id : %d;收集数量不足 %d", id, need)
} }
// 领取奖励 // 领取奖励
c.Reward = append(c.Reward, Id) c.Reward = append(c.Reward, id)
JackpotId := 0 jackpotId := c.Jackpot[id-1]
JackpotId, c.Jackpot = GoUtil.PopSlice(c.Jackpot) if jackpotId == 0 {
c.ensureJackpot() return nil, fmt.Errorf("id : %d;奖池数据异常", id)
return collectCfg.GetJackpotItems(JackpotId), nil }
items := collectCfg.GetJackpotItems(jackpotId)
items = GoUtil.FormatStarItem(items, factor)
return items, nil
} }
func (c *Collect) BackData() *msg.ResCollectInfo { func (c *Collect) BackData(factor int) *msg.ResCollectInfo {
ItemsMsg := make([]*msg.CollectItem, 0, jackpotPreviewSize) itemsMsg := make([]*msg.CollectItem, 0, jackpotPreviewSize)
for i := 0; i < jackpotPreviewSize; i++ { for k, v := range c.Jackpot {
Items := collectCfg.GetJackpotItems(c.Jackpot[i]) items := collectCfg.GetJackpotItems(v)
ItemsMsg = append(ItemsMsg, &msg.CollectItem{ items = GoUtil.FormatStarItem(items, factor)
Id: int32(i + 1), itemsMsg = append(itemsMsg, &msg.CollectItem{
Items: item.ItemToMsg(Items), Id: int32(k + 1),
Items: item.ItemToMsg(items),
}) })
} }
return &msg.ResCollectInfo{ return &msg.ResCollectInfo{
Id: GoUtil.IntToInt32(c.Reward), Id: GoUtil.IntToInt32(c.Reward),
Items: ItemsMsg, Items: itemsMsg,
} }
} }
func initJackpot2(r1 []int) []int { func initJackpot2(r1 []int) []int {
Ids := collectCfg.GetJackpotId() ids := collectCfg.GetJackpotId()
r2 := GoUtil.ShuffleArray(Ids) r2 := GoUtil.ShuffleArray(ids)
return append(r1, r2...) return append(r1, r2...)
} }

View File

@ -32,6 +32,7 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item.
lastIds1 = Ids1 lastIds1 = Ids1
prevIsCard := 0 prevIsCard := 0
valid := true valid := true
cardCount := 0
for _, k := range Ids1 { for _, k := range Ids1 {
curIsCard := jackpot[k].Is_card curIsCard := jackpot[k].Is_card
if prevIsCard == 1 && curIsCard == 1 { if prevIsCard == 1 && curIsCard == 1 {
@ -39,6 +40,12 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item.
break break
} }
prevIsCard = curIsCard prevIsCard = curIsCard
if curIsCard == 1 {
cardCount++
}
}
if cardCount < 2 {
continue
} }
if valid { if valid {
r := make(map[int][]*item.Item, num) r := make(map[int][]*item.Item, num)

View File

@ -3,7 +3,6 @@ package dailyTask
import ( import (
"fmt" "fmt"
dailyTaskCfg "server/conf/daily_task" dailyTaskCfg "server/conf/daily_task"
orderCfg "server/conf/order"
"server/game/mod/item" "server/game/mod/item"
"server/game/mod/quest" "server/game/mod/quest"
GoUtil "server/game_util" GoUtil "server/game_util"
@ -49,46 +48,46 @@ func (dt *DailyTaskMod) Unlock() {
dt.Lock = true 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 { if len(dt.DayTask) != 0 {
return false return false
} }
dt.ZeroUpdate(Lv, AreaId, dailyAcitivityId) dt.ZeroUpdate(lv, factor, dailyAcitivityId)
return true return true
} }
func (dt *DailyTaskMod) ZeroUpdate(Lv, AreaId, activityId int) { func (dt *DailyTaskMod) ZeroUpdate(lv, factor, activityId int) {
TaskList := dailyTaskCfg.GetTaskList(Lv) taskList := dailyTaskCfg.GetTaskList(lv)
if len(TaskList) <= 0 { if len(taskList) <= 0 {
return return
} }
TaskListId := GoUtil.GetMapKey(TaskList) taskListId := GoUtil.GetMapKey(taskList)
LastTaskId := GoUtil.GetMapKey(dt.lastTask) lastTaskId := GoUtil.GetMapKey(dt.lastTask)
TaskList1 := GoUtil.SubSlices(TaskListId, LastTaskId) taskList1 := GoUtil.SubSlices(taskListId, lastTaskId)
TaskId := GoUtil.RandSliceNum(TaskList1, 3) taskId := GoUtil.RandSliceNum(taskList1, 3)
OrderFactor := orderCfg.GetOrderFactor(AreaId) for i := range taskId {
for i := 0; i < len(TaskId); i++ { id := i + 1
Id := i + 1 questStr := taskList[taskId[i]]
questStr := TaskList[TaskId[i]] questProgress, err := quest.ParseQuest(questStr)
QuestProgress, err := quest.ParseQuest(questStr)
if err != nil { if err != nil {
log.Debug("parse quest err str : %s", questStr) log.Debug("parse quest err str : %s", questStr)
} }
Items := dailyTaskCfg.GetDailyTaskReward(Id, OrderFactor, activityId) items := dailyTaskCfg.GetDailyTaskReward(id, activityId)
dt.DayTask[Id] = DailyTask{ items = GoUtil.FormatStarItem(items, factor)
Items: Items, dt.DayTask[id] = DailyTask{
UnLock: Id == 1, Items: items,
Quest: QuestProgress, UnLock: id == 1,
Quest: questProgress,
} }
} }
// 更新 lastTask下次不重复当前任务 // 更新 lastTask下次不重复当前任务
dt.lastTask = make(map[int]struct{}, len(TaskId)) dt.lastTask = make(map[int]struct{}, len(taskId))
for _, id := range TaskId { for _, id := range taskId {
dt.lastTask[id] = struct{}{} dt.lastTask[id] = struct{}{}
} }
} }
func (dt *DailyTaskMod) WeekUpdate() { func (dt *DailyTaskMod) WeekUpdate(factor int) {
jackpot := dailyTaskCfg.GetTaskWeekJackpot() jackpot := dailyTaskCfg.GetTaskWeekJackpot()
jackpotRand := randJackpot(jackpot, 5) jackpotRand := randJackpot(jackpot, 5)
jackpotId := GoUtil.GetMapKey(jackpotRand) jackpotId := GoUtil.GetMapKey(jackpotRand)
@ -105,7 +104,15 @@ func (dt *DailyTaskMod) WeekUpdate() {
Items: []*item.Item{{Id: item.ITEM_FIVE_STAR_CARD_PACK, Num: 1}}, Items: []*item.Item{{Id: item.ITEM_FIVE_STAR_CARD_PACK, Num: 1}},
} }
dt.Active = 0 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 { 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 { func (dt *DailyTaskMod) BackData() *msg.ResDailyTask {
WeekReward := make(map[int32]*msg.DailyWeek) weekReward := make(map[int32]*msg.DailyWeek)
DailyTask := make(map[int32]*msg.DailyTask) dailyTask := make(map[int32]*msg.DailyTask)
for k, v := range dt.WeekReward { for k, v := range dt.WeekReward {
NeedActive := dailyTaskCfg.GetTaskActiveById(k) needActive := dailyTaskCfg.GetTaskActiveById(k)
WeekReward[int32(k)] = &msg.DailyWeek{ weekReward[int32(k)] = &msg.DailyWeek{
Status: v.Status, Status: v.Status,
NeedActive: int32(NeedActive), NeedActive: int32(needActive),
Items: item.ItemToMsg(v.Items), Items: item.ItemToMsg(v.Items),
} }
} }
for k, v := range dt.DayTask { for k, v := range dt.DayTask {
DailyTask[int32(k)] = &msg.DailyTask{ dailyTask[int32(k)] = &msg.DailyTask{
Status: int32(v.Status), Status: int32(v.Status),
UnLock: v.UnLock, UnLock: v.UnLock,
Progress: quest.QuestProgressToMsg(&v.Quest), Progress: quest.QuestProgressToMsg(&v.Quest),
Items: item.ItemToMsg(v.Items), Items: item.ItemToMsg(v.Items),
} }
} }
DayEnd := GoUtil.NextZeroTimestampDuration() dayEnd := GoUtil.NextZeroTimestampDuration()
WeekEnd := GoUtil.NextWeekTimestampDuration() weekEnd := GoUtil.NextWeekTimestampDuration()
return &msg.ResDailyTask{ return &msg.ResDailyTask{
WeekReward: WeekReward, WeekReward: weekReward,
DailyTask: DailyTask, DailyTask: dailyTask,
Active: int32(dt.Active), Active: int32(dt.Active),
DayEnd: int32(DayEnd), DayEnd: int32(dayEnd),
WeekEnd: int32(WeekEnd), 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) { func (dt *DailyTaskMod) GetWeekReward(id int) ([]*item.Item, error) {
if v, ok := dt.WeekReward[id]; ok { if v, ok := dt.WeekReward[id]; ok {
NeedActive := dailyTaskCfg.GetTaskActiveById(id) needActive := dailyTaskCfg.GetTaskActiveById(id)
if dt.Active < NeedActive { if dt.Active < needActive {
return nil, fmt.Errorf("active not enough") return nil, fmt.Errorf("active not enough")
} }
if !v.Status { if !v.Status {
@ -202,8 +209,8 @@ func (dt *DailyTaskMod) GetWeekReward2() []*item.Item {
} }
} }
if v, ok := dt.WeekReward[maxId]; ok { if v, ok := dt.WeekReward[maxId]; ok {
NeedActive := dailyTaskCfg.GetTaskActiveById(maxId) needActive := dailyTaskCfg.GetTaskActiveById(maxId)
if dt.Active < NeedActive { if dt.Active < needActive {
return nil return nil
} }
if !v.Status { if !v.Status {

View File

@ -66,42 +66,45 @@ func (f *FriendTreasureMod) Flip(Pos int) ([]*item.Item, int64, error) {
return nil, 0, fmt.Errorf("game not start") return nil, 0, fmt.Errorf("game not start")
} }
f.Shift++ f.Shift++
Info := f.List[Pos] info, ok := f.List[Pos]
Info.Status = GAME_STATUS_START if !ok {
if Info.Uid != 0 { return nil, 0, fmt.Errorf("invalid position")
log.Debug("uid:%v", Info.Uid)
f.Uids = append(f.Uids, Info.Uid)
} }
if Info.Type == FRIEND_TYPE_ALIVE { info.Status = GAME_STATUS_START
ProbMap := friendTreasureCfg.GetChestProb() if info.Uid != 0 {
Prob := GoUtil.RandMap(ProbMap) log.Debug("uid:%v", info.Uid)
Items := friendTreasureCfg.GetChestItems(Prob) f.Uids = append(f.Uids, info.Uid)
if Items != nil { }
f.BoxItems = append(f.BoxItems, Items...) 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 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 { if f.Status == GAME_STATUS_IDLE {
return nil, 0, fmt.Errorf("game is over") return nil, 0, fmt.Errorf("game is over")
} }
// f.Shift++ // f.Shift++
ProbAdd := friendTreasureCfg.GetProbAdd(f.Shift) probAdd := friendTreasureCfg.GetProbAdd(f.Shift)
ItemNum := int(float64(f.Star) * (100.0 + float64(ProbAdd)) / 100.0) itemNum := int(float64(f.Star) * (100.0 + float64(probAdd)) / 100.0)
FriendItemNum := ItemNum / 10 friendItemNum := itemNum / 10
Reward := []*item.Item{ reward := []*item.Item{
{Id: item.ITEM_STAR_ID, Num: ItemNum}, {Id: item.ITEM_STAR_ID, Num: itemNum},
} }
if f.Shift == 9 { if f.Shift == 9 {
BigReward := friendTreasureCfg.GetBigReward() bigReward := friendTreasureCfg.GetBigReward()
Reward = append(Reward, BigReward...) reward = append(reward, bigReward...)
} }
reward = GoUtil.FormatStarItem(reward, factor)
return Reward, FriendItemNum, nil return reward, friendItemNum, nil
} }
// 重置游戏数据 // 重置游戏数据
@ -119,15 +122,13 @@ func (f *FriendTreasureMod) NotifyStar() *msg.ResFriendTreasureStar {
} }
func (f *FriendTreasureMod) BackData() *msg.ResFriendTreasure { 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 { for _, v := range f.List {
TreasureInfoList = append(TreasureInfoList, v) treasureInfoList = append(treasureInfoList, v)
} }
return &msg.ResFriendTreasure{ return &msg.ResFriendTreasure{
Status: int32(f.Status), Status: int32(f.Status),
List: TreasureInfoList, List: treasureInfoList,
List2: f.List2, List2: f.List2,
Star: int32(f.Star), Star: int32(f.Star),
Shift: int32(f.Shift), Shift: int32(f.Shift),

View File

@ -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{}{} i.InviteList[id] = struct{}{}
return nil
} }
func (i *InviteMod) GetReward(Index int) ([]*item.Item, error) { func (i *InviteMod) GetReward(Index int) ([]*item.Item, error) {

View File

@ -701,15 +701,9 @@ func (p *PlayroomMod) GetTaskReward(Type int) (int, []*item.Item, error) {
p.DailyTaskReward = append(p.DailyTaskReward, Type) p.DailyTaskReward = append(p.DailyTaskReward, Type)
Id := 0 Id := 0
var Items []*item.Item var Items []*item.Item
if Type == DAILY_TASK_TYPE_TWO { ProbList := playroomCfg.GetTaskJackpotProb()
ProbList := limitedTimeEventCfg.GetSenceJackpotProb() Id = GoUtil.RandMap(ProbList)
Id = GoUtil.RandMap(ProbList) Items = playroomCfg.GetTaskJackpotReward(Id)
Items = limitedTimeEventCfg.GetSenceJackpotReward(Id)
} else {
ProbList := playroomCfg.GetTaskJackpotProb()
Id = GoUtil.RandMap(ProbList)
Items = playroomCfg.GetTaskJackpotReward(Id)
}
if len(Items) > 1 { if len(Items) > 1 {
// 多个奖励时,随机选择一个 // 多个奖励时,随机选择一个
Items = []*item.Item{GoUtil.RandItem(Items)} Items = []*item.Item{GoUtil.RandItem(Items)}

View File

@ -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() WeekZeroTimestamp := GoUtil.WeekZeroTimestamp()
Now := GoUtil.Now() Now := GoUtil.Now()
if WeekZeroTimestamp > s.WeekResetTime { if WeekZeroTimestamp > s.WeekResetTime {
RewardType := GoUtil.IfTrue(Now-int64(LastLoginTime) > GoUtil.SEVENDAYS && LastLoginTime > 0, BACK_REWARD, DEFAULT_REWARD).(int) RewardType := GoUtil.IfTrue(Now-int64(LastLoginTime) > GoUtil.SEVENDAYS && LastLoginTime > 0, BACK_REWARD, DEFAULT_REWARD).(int)
s.IsBack = RewardType == BACK_REWARD s.IsBack = RewardType == BACK_REWARD
s.LoginReward = randWeekReward(Add, RewardType) s.LoginReward = randWeekReward(Add, RewardType)
s.LoginReward = formatSevenReward(s.LoginReward, factor)
s.WeekResetTime = WeekZeroTimestamp s.WeekResetTime = WeekZeroTimestamp
s.DayR = 0 s.DayR = 0
} }
monthZeroTimestamp := GoUtil.MonthZeroTimestamp() monthZeroTimestamp := GoUtil.MonthZeroTimestamp()
if monthZeroTimestamp > s.MonthResetTime { if monthZeroTimestamp > s.MonthResetTime {
s.MonthReward = randMonthReward() s.MonthReward = randMonthReward()
s.MonthReward = formatSevenReward(s.MonthReward, factor)
s.Active = 0 s.Active = 0
s.MonthResetTime = monthZeroTimestamp s.MonthResetTime = monthZeroTimestamp
} }
@ -124,3 +126,13 @@ func (s *SevenLoginMod) BackData() *msg.ResSevenLogin {
IsBack: s.IsBack, 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
}

View File

@ -1,6 +1,7 @@
package sevenLogin package sevenLogin
import ( import (
"math"
"math/rand/v2" "math/rand/v2"
sevenLoginCfg "server/conf/seven_login" sevenLoginCfg "server/conf/seven_login"
"server/game/mod/item" "server/game/mod/item"
@ -17,111 +18,140 @@ const (
) )
func randWeekReward(Add, Type int) map[int]Reward { func randWeekReward(Add, Type int) map[int]Reward {
RewardList := sevenLoginCfg.GetSevenLoginReward() rewardList := sevenLoginCfg.GetSevenLoginReward()
sort.Slice(RewardList, func(i, j int) bool { sort.Slice(rewardList, func(i, j int) bool {
return RewardList[i].Id < RewardList[j].Id return rewardList[i].Id < rewardList[j].Id
}) })
jackpot := sevenLoginCfg.GetSevenLoginJackpot(0) jackpot := sevenLoginCfg.GetSevenLoginJackpot(0)
sort.Slice(jackpot, func(i, j int) bool { 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)) rI := make([]int, 0, len(rewardList))
for _, v := range RewardList { for _, v := range rewardList {
RI = append(RI, v.Id) rI = append(rI, v.Id)
} }
CardPackIds := GoUtil.RandSliceNumNonAdjacent(RI, 3) cardPackIds := GoUtil.RandSliceNumNonAdjacent(rI, 3)
result := make(map[int]Reward) result := make(map[int]Reward)
LastType := 0 lastType := []int{}
EnergyMul := 1.0 energyMul := 1.0
if Type == BACK_REWARD { if Type == BACK_REWARD {
EnergyMul = 2.0 energyMul = 2.0
} }
for _, v := range RewardList { for _, v := range rewardList {
v.Diamond = int(float64(v.Diamond) * (1 + float64(Add)/100)) v.Energy = float64(v.Energy) * (1 + float64(Add)/100)
Reward := randReward(v, LastType, jackpot, CardPackIds, 0.5, EnergyMul) rewardData, randItemType := randReward(v, lastType, jackpot, cardPackIds, 0.5, energyMul)
result[v.Id] = Reward lastType = randItemType
result[v.Id] = rewardData
} }
return result 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结尾 // 奖励1 体力 体力等价钻石占总价值的50%且1钻≈2.5体力体力值四舍五入需以0或5结尾
Num := float64(RewardData.Diamond) * EnergyPer * 2.5 num := math.Round(float64(rewardData.Energy) * energyPer)
Num = float64(int(Num/5+0.5)) * 5 energyNum := float64(int(num/5)) * 5
RemainDiamond := RewardData.Diamond - int(Num/2.5) remainEnergy := rewardData.Energy - energyNum
Num = Num * EnergyMul // 召回玩家 每日体力数*2
Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(Num))} energyNum = energyNum * energyMul
items1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(energyNum))}
// 奖励2 // 奖励2
newJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
for _, v := range jackpot { for _, v := range jackpot {
if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != JACKPOT_CARD_TYPE { if v.Energy <= remainEnergy && !GoUtil.InArray(v.Type, lastType) && v.Type != JACKPOT_CARD_TYPE {
NewJackpot = append(NewJackpot, v) newJackpot = append(newJackpot, v)
} }
} }
if len(NewJackpot) == 0 { var items2 []*item.Item
return Reward{Item1: Item1} itemType := []int{}
if rewardData.RewardNum == 3 {
remainEnergy -= 5
} }
var Item2 []*item.Item if GoUtil.InArray(rewardData.Id, cardPackIds) {
Item2Type := 0 cardJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
if RewardData.RewardNum == 3 {
RemainDiamond -= 5
}
if GoUtil.InArray(RewardData.Id, CardPackIds) {
CardJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
for _, v := range jackpot { for _, v := range jackpot {
if v.Diamond <= RemainDiamond && v.Type == JACKPOT_CARD_TYPE { if v.Energy <= remainEnergy && v.Type == JACKPOT_CARD_TYPE {
CardJackpot = append(CardJackpot, v) cardJackpot = append(cardJackpot, v)
} }
} }
if len(CardJackpot) == 0 { if len(cardJackpot) == 0 {
Item2 = []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, RemainDiamond)} items2 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(remainEnergy))}
} else { } else {
Index := rand.IntN(len(CardJackpot)) index := rand.IntN(len(cardJackpot))
Item2Type = CardJackpot[Index].Type itemType = append(itemType, cardJackpot[index].Type)
Item2 = CardJackpot[Index].Items items2 = cardJackpot[index].Items
RemainDiamond -= CardJackpot[Index].Diamond remainEnergy -= cardJackpot[index].Energy
} }
} else { } else {
Index := rand.IntN(len(NewJackpot)) if len(newJackpot) == 0 {
Item2Type = NewJackpot[Index].Type for _, v := range jackpot {
Item2 = NewJackpot[Index].Items if v.Energy <= remainEnergy {
RemainDiamond -= NewJackpot[Index].Diamond 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 var items3 []*item.Item
if RewardData.RewardNum == 3 { if rewardData.RewardNum == 3 {
RemainDiamond += 5 remainEnergy += 5
NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) newJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot))
for _, v := range jackpot { for _, v := range jackpot {
if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != Item2Type { if v.Energy <= remainEnergy && !GoUtil.InArray(v.Type, lastType) && !GoUtil.InArray(v.Type, itemType) {
NewJackpot3 = append(NewJackpot3, v) newJackpot3 = append(newJackpot3, v)
} }
} }
Index := rand.IntN(len(NewJackpot3)) if len(newJackpot3) == 0 {
Item3 = NewJackpot3[Index].Items 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{ return Reward{
Item1: Item1, Item1: items1,
Item2: Item2, Item2: items2,
Item3: Item3, Item3: items3,
} }, itemType
} }
func randMonthReward() map[int]Reward { func randMonthReward() map[int]Reward {
month := GoUtil.NowMonth() month := GoUtil.NowMonth()
RewardList := sevenLoginCfg.GetSevenLoginMonthReward(month) rewardList := sevenLoginCfg.GetSevenLoginMonthReward(month)
sort.Slice(RewardList, func(i, j int) bool { sort.Slice(rewardList, func(i, j int) bool {
return RewardList[i].Id < RewardList[j].Id return rewardList[i].Id < rewardList[j].Id
}) })
jackpot := sevenLoginCfg.GetSevenLoginJackpot(1) jackpot := sevenLoginCfg.GetSevenLoginJackpot(1)
sort.Slice(jackpot, func(i, j int) bool { 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) result := make(map[int]Reward)
for _, v := range RewardList { for _, v := range rewardList {
Reward := randReward(v, 0, jackpot, []int{}, 0.65, 1) reward, lastItemType := randReward(v, lastType, jackpot, []int{}, 0.65, 1)
result[v.Id] = Reward lastType = lastItemType
result[v.Id] = reward
} }
return result return result
} }

View File

@ -1,16 +1,19 @@
package game package game
import ( import (
"server/game/mod/activity"
"server/game/mod/base" "server/game/mod/base"
"server/game/mod/card" "server/game/mod/card"
"server/game/mod/champship" "server/game/mod/champship"
"server/game/mod/charge" "server/game/mod/charge"
"server/game/mod/chess" "server/game/mod/chess"
"server/game/mod/collect"
dailyTask "server/game/mod/daily_task" dailyTask "server/game/mod/daily_task"
"server/game/mod/decorate" "server/game/mod/decorate"
"server/game/mod/endless" "server/game/mod/endless"
"server/game/mod/face" "server/game/mod/face"
"server/game/mod/friend" "server/game/mod/friend"
friendTreasure "server/game/mod/friend_treasure.go"
"server/game/mod/fur" "server/game/mod/fur"
"server/game/mod/item" "server/game/mod/item"
limitedTimeEvent "server/game/mod/limited_time_event" limitedTimeEvent "server/game/mod/limited_time_event"
@ -95,3 +98,15 @@ func (p *Player) GetDailyTaskMod() *dailyTask.DailyTaskMod {
func (p *Player) GetItemMod() *item.ItemMod { func (p *Player) GetItemMod() *item.ItemMod {
return p.PlayMod.getItemMod() 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()
}

View File

@ -536,9 +536,8 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error)
upExp, upPExp = userCfg.GetLevUpExp(BaseMod.Level) upExp, upPExp = userCfg.GetLevUpExp(BaseMod.Level)
// 日常任务解锁 // 日常任务解锁
DailyTaskMod := player.PlayMod.getDailyTaskMod() DailyTaskMod := player.PlayMod.getDailyTaskMod()
DecorateMod := player.PlayMod.getDecorateMod()
dailyAcitivityId := player.GetDailyTaskActivityId() dailyAcitivityId := player.GetDailyTaskActivityId()
if DailyTaskMod.LevUpTrigger(BaseMod.Level, DecorateMod.GetAreaId(), dailyAcitivityId) { if DailyTaskMod.LevUpTrigger(BaseMod.Level, player.GetOrderFactor(), dailyAcitivityId) {
player.PushClientRes(DailyTaskMod.BackData()) player.PushClientRes(DailyTaskMod.BackData())
} }
upLv = BaseMod.Level upLv = BaseMod.Level

View File

@ -16,6 +16,7 @@ import (
limitedTimeEventCfg "server/conf/limited_time_event" limitedTimeEventCfg "server/conf/limited_time_event"
mergeDataCfg "server/conf/merge_data" mergeDataCfg "server/conf/merge_data"
miningCfg "server/conf/mining" miningCfg "server/conf/mining"
orderCfg "server/conf/order"
playroomCfg "server/conf/playroom" playroomCfg "server/conf/playroom"
"server/db" "server/db"
"server/ga" "server/ga"
@ -65,6 +66,9 @@ type Player struct {
activity map[int]*ActivityInfo activity map[int]*ActivityInfo
stop bool stop bool
wg sync.WaitGroup wg sync.WaitGroup
dispatcherWg sync.WaitGroup
stopOnce sync.Once
msgChanOnce sync.Once
func_time int func_time int
} }
@ -79,19 +83,24 @@ type PlayerMsg struct {
} }
func (p *Player) Stop() { func (p *Player) Stop() {
select { p.wg.Wait()
case <-p.stopSignal: p.signalDispatcherStop()
// 通道已经关闭 p.msgChanOnce.Do(func() {
return
default:
p.wg.Wait()
close(p.stopSignal)
close(p.msgChan) close(p.msgChan)
})
for _, timer := range p.timerList {
timer.Stop()
} }
p.McronSave.Stop() p.McronSave.Stop()
p.stop = true 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) { func (p *Player) CallEvent(Duration time.Duration, F func(), Label string) {
if v, ok := p.timerList[Label]; ok { if v, ok := p.timerList[Label]; ok {
v.Stop() v.Stop()
@ -213,6 +222,8 @@ func (p *Player) InitPlayer(UserName string) error {
p.timerList = make(map[string]*timer.Timer) p.timerList = make(map[string]*timer.Timer)
p.MDispatr = timer.NewDispatcher(100) p.MDispatr = timer.NewDispatcher(100)
p.stopSignal = make(chan bool) p.stopSignal = make(chan bool)
p.stopOnce = sync.Once{}
p.msgChanOnce = sync.Once{}
Base := &PlayerBaseData{p: p} Base := &PlayerBaseData{p: p}
// 玩家基础数据 // 玩家基础数据
@ -273,6 +284,8 @@ func (p *Player) InitPlayerByUid(Uid int) error {
p.timerList = make(map[string]*timer.Timer) p.timerList = make(map[string]*timer.Timer)
p.MDispatr = timer.NewDispatcher(100) p.MDispatr = timer.NewDispatcher(100)
p.stopSignal = make(chan bool) p.stopSignal = make(chan bool)
p.stopOnce = sync.Once{}
p.msgChanOnce = sync.Once{}
Base := &PlayerBaseData{p: p} Base := &PlayerBaseData{p: p}
// 玩家基础数据 // 玩家基础数据
@ -356,7 +369,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
p.PushClientRes(p.PlayMod.getBaseMod().BackData()) 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()) p.PushClientRes(p.PlayMod.getSevenLoginMod().BackData())
// 礼包充值 // 礼包充值
@ -389,7 +402,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
p.ActivityZeroUpdate() 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.PushClientRes(p.PlayMod.getDailyTaskMod().BackData())
p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_LOGIN}) p.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_LOGIN})
@ -400,7 +413,7 @@ func (p *Player) ZeroUpdate(a []interface{}) {
if VarMod.WeeklyResetTime < weekZeroTimestamp { if VarMod.WeeklyResetTime < weekZeroTimestamp {
VarMod.WeeklyResetTime = weekZeroTimestamp VarMod.WeeklyResetTime = weekZeroTimestamp
VarMod.WeeklyVar = make(map[int]interface{}) VarMod.WeeklyVar = make(map[int]interface{})
p.PlayMod.getDailyTaskMod().WeekUpdate() p.PlayMod.getDailyTaskMod().WeekUpdate(p.GetOrderFactor())
p.PushClientRes(p.PlayMod.getDailyTaskMod().BackData()) p.PushClientRes(p.PlayMod.getDailyTaskMod().BackData())
p.PlayMod.getLimitedTimeEventMod().WeekUpdate() 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_after": ItemMod.GetItem(v.Id),
"change_reason": Label, "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 { if err != nil {
return err return err
} }
@ -1011,6 +1036,8 @@ func (p *Player) InitPlayerOnly() {
p.timerList = make(map[string]*timer.Timer) p.timerList = make(map[string]*timer.Timer)
p.MDispatr = timer.NewDispatcher(10) p.MDispatr = timer.NewDispatcher(10)
p.stopSignal = make(chan bool) p.stopSignal = make(chan bool)
p.stopOnce = sync.Once{}
p.msgChanOnce = sync.Once{}
Base := &PlayerBaseData{p: p} Base := &PlayerBaseData{p: p}
@ -1111,6 +1138,9 @@ func (p *Player) HandleInUserRank() {
Uid: int(p.M_DwUin), Uid: int(p.M_DwUin),
Score: float64(Score), Score: float64(Score),
RankType: RANK_TYPE_USER, RankType: RANK_TYPE_USER,
Extra: map[string]interface{}{
"country": p.PlayMod.getBaseMod().CountryCode,
},
}, },
} }
G_GameLogicPtr.RankMgrSend(m) G_GameLogicPtr.RankMgrSend(m)
@ -1212,6 +1242,10 @@ func (p *Player) InitActivity() {
if minduration > 0 { if minduration > 0 {
p.CallEvent(time.Duration(minduration)*time.Second, p.TickActivity, "init_activity") 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{}{ p.TeLog("activity_ids", map[string]interface{}{
"info": p.activity, "info": p.activity,
}) })
@ -1229,6 +1263,30 @@ func (p *Player) TickActivity() {
p.SendClientRes() 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() { func (p *Player) BackDataActivity() {
ResActivityList := make([]*msg.ActivityInfo, 0) ResActivityList := make([]*msg.ActivityInfo, 0)
for _, v := range p.activity { for _, v := range p.activity {
@ -1243,9 +1301,11 @@ func (p *Player) BackDataActivity() {
Red: int32(Red), Red: int32(Red),
}) })
} }
ActivityMod := p.PlayMod.getActivityMod()
p.PushClientRes(&msg.ResActivity{ p.PushClientRes(&msg.ResActivity{
ActiveList: ResActivityList, ActiveList: ResActivityList,
AddEnd: ActivityMod.AddEnd,
AddReward: ActivityMod.AddReward,
}) })
} }
@ -1345,7 +1405,9 @@ func (p *Player) func_exec_add() error {
} }
func (p *Player) DispatcherHandle() { func (p *Player) DispatcherHandle() {
p.dispatcherWg.Add(1)
go func() { go func() {
defer p.dispatcherWg.Done()
var cb *timer.Timer var cb *timer.Timer
for { for {
select { select {
@ -1399,3 +1461,7 @@ func (p *Player) FixPlayroomPyhical() {
} }
} }
} }
func (p *Player) GetOrderFactor() int {
return orderCfg.GetOrderFactor(p.GetDecorateMod().AreaId)
}

View File

@ -48,6 +48,7 @@ type RankMsg struct {
Uid int Uid int
Score float64 Score float64
RankType int RankType int
Extra map[string]interface{}
} }
func (r *RankMgr) Init() { func (r *RankMgr) Init() {
@ -100,13 +101,25 @@ func (r *RankMgr) getRank(RankType int) []*Rank {
// 获取排行榜信息 // 获取排行榜信息
func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) { 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) return r.getRedisRankInfo(m)
} }
// 国家排行榜 // 国家排行榜
if data.RankType == RANK_TYPE_USER { if rank_type == RANK_TYPE_USER {
return r.getRedisCountryRankInfo(m) return r.getRedisCountryRankInfo(m)
} }
return &RankInfo{ return &RankInfo{
@ -117,7 +130,16 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
} }
func (r *RankMgr) getRedisCountryRankInfo(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) RedisList, err := db.RedisZRevRangeWithScores(RedisKey, 0, 100)
if err != nil { if err != nil {
return &RankInfo{}, 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) { 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 { if data.RankType == RANK_TYPE_USER {
// 全球玩家排行榜 // 全球玩家排行榜
Uid := strconv.Itoa(data.Uid) Uid := strconv.Itoa(data.Uid)
TimeSort := fmt.Sprintf("0.%d", RANK_TIME_SORT-GoUtil.Now()) TimeSort := fmt.Sprintf("0.%d", RANK_TIME_SORT-GoUtil.Now())
TimeSortF, _ := strconv.ParseFloat(TimeSort, 64) TimeSortF, _ := strconv.ParseFloat(TimeSort, 64)
db.RedisZAdd(RANK_USER, Uid, data.Score+TimeSortF) 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) db.RedisZAdd(RedisKey, Uid, data.Score+TimeSortF)
} }

View File

@ -2334,10 +2334,14 @@ func ReqRank(player *Player, buf []byte) error {
if err != nil { if err != nil {
return err return err
} }
BaseMod := player.PlayMod.getBaseMod()
m := &MsqMod.Msg{ m := &MsqMod.Msg{
From: int(player.M_DwUin), From: int(player.M_DwUin),
Type: MsqMod.HANDLE_TYPE_RANK_INFO, Type: MsqMod.HANDLE_TYPE_RANK_INFO,
Extra: RankMsg{RankType: int(req.Type)}, Extra: map[string]interface{}{
"country": BaseMod.CountryCode,
"rank_type": int(req.Type),
},
SendT: GoUtil.Now(), SendT: GoUtil.Now(),
} }
RankInfo := G_GameLogicPtr.RankMgrCall(m).(*RankInfo) RankInfo := G_GameLogicPtr.RankMgrCall(m).(*RankInfo)
@ -3207,9 +3211,15 @@ func ReqMiningReward(player *Player, buf []byte) error {
}) })
return err 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, "expend_token_num": Mining,
"level_ID": MiningMod.Pass - 1, "level_id": MiningMod.Pass - 1,
"event_id": aId,
}) })
player.PushClientRes(&msg.ResMiningReward{ player.PushClientRes(&msg.ResMiningReward{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
@ -4313,7 +4323,7 @@ func ReqFriendTreasureFilp(player *Player, buf []byte) error {
func ReqFriendTreasureEnd(player *Player, buf []byte) error { func ReqFriendTreasureEnd(player *Player, buf []byte) error {
FriendTreasureMod := player.PlayMod.getFriendTreasureMod() FriendTreasureMod := player.PlayMod.getFriendTreasureMod()
Items, FriendItemNum, err := FriendTreasureMod.EndGame() Items, FriendItemNum, err := FriendTreasureMod.EndGame(player.GetOrderFactor())
if err != nil { if err != nil {
player.SendErrClienRes( player.SendErrClienRes(
&msg.ResFriendTreasureEnd{ &msg.ResFriendTreasureEnd{
@ -4446,7 +4456,7 @@ func ReqSetEmoji(player *Player, buf []byte) error {
// 请求收藏室内 // 请求收藏室内
func ReqCollectInfo(player *Player, buf []byte) error { func ReqCollectInfo(player *Player, buf []byte) error {
CollectMod := player.PlayMod.getCollectMod() CollectMod := player.PlayMod.getCollectMod()
player.PushClientRes(CollectMod.BackData()) player.PushClientRes(CollectMod.BackData(player.GetOrderFactor()))
return nil return nil
} }
@ -4472,7 +4482,7 @@ func ReqCollect(player *Player, buf []byte) error {
AreaType = "avatar" AreaType = "avatar"
Num = player.PlayMod.getAvatarMod().GetAvatarNum() 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 { if err != nil {
player.SendErrClienRes(&msg.ResCollect{ player.SendErrClienRes(&msg.ResCollect{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -4489,7 +4499,7 @@ func ReqCollect(player *Player, buf []byte) error {
return err return err
} }
player.PlayMod.save() player.PlayMod.save()
player.PushClientRes(CollectMod.BackData()) player.PushClientRes(CollectMod.BackData(player.GetOrderFactor()))
player.PushClientRes(&msg.ResCollect{ player.PushClientRes(&msg.ResCollect{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
}) })
@ -4611,6 +4621,47 @@ func ReqLimitEventLuckyCat(player *Player, buf []byte) error {
return nil 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 { func ReqActivityReward(player *Player, buf []byte) error {
req := &msg.ReqActivityReward{} req := &msg.ReqActivityReward{}
err := proto.Unmarshal(buf, req) err := proto.Unmarshal(buf, req)

View File

@ -22,6 +22,7 @@ const (
BAN_MGR_KEY = "BAN_MGR" BAN_MGR_KEY = "BAN_MGR"
PER_SAVE_TIME = 60 PER_SAVE_TIME = 60
MESSAGE_MGR_KEY = "MESSAGE_MGR" MESSAGE_MGR_KEY = "MESSAGE_MGR"
ACTIVITY_MGR_KEY = "ACTIVITY_MGR"
) )
type ServerMod struct { type ServerMod struct {

View File

@ -12,14 +12,20 @@ import (
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io" "io"
"math"
"math/rand" "math/rand"
"net"
"net/http" "net/http"
"reflect" "reflect"
"server/game/mod/item"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"sort"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
"github.com/oschwald/geoip2-golang"
) )
var bufferPool = sync.Pool{ var bufferPool = sync.Pool{
@ -353,6 +359,24 @@ func Rand8DigitNumber() string {
return fmt.Sprintf("%08d", n) 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 { func UniqueInts(input []int) []int {
seen := make(map[int]struct{}) seen := make(map[int]struct{})
result := make([]int, 0, len(input)) result := make([]int, 0, len(input))
@ -478,15 +502,28 @@ func GenerateShuffledAlphabet() string {
// 根据IP获取国家名称 // 根据IP获取国家名称
func GetCountryByIP(ip string) (string, error) { func GetCountryByIP(ip string) (string, error) {
return "", nil parsedIP := net.ParseIP(ip)
// resp, err := http.Get("https://ipapi.co/" + ip + "/country_name/") if parsedIP == nil {
// if err != nil { return "", fmt.Errorf("invalid ip: %s", ip)
// return "", err }
// }
// defer resp.Body.Close() db, err := geoip2.Open("./GeoLite2-Country/GeoLite2-City.mmdb")
// buf := new(bytes.Buffer) if err != nil {
// buf.ReadFrom(resp.Body) return "", err
// return strings.TrimSpace(buf.String()), nil }
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国家码 // 根据国家名称获取ISO 3166-1国家码
@ -569,11 +606,7 @@ func GetISOCodeByCountry(country string) (string, error) {
// 综合函数根据IP获取ISO 3166-1国家码 // 综合函数根据IP获取ISO 3166-1国家码
func GetISOCodeByIP(ip string) (string, error) { func GetISOCodeByIP(ip string) (string, error) {
country, err := GetCountryByIP(ip) return GetCountryByIP(ip)
if err != nil {
return "", err
}
return GetISOCodeByCountry(country)
} }
func GetVarKey(Uid int) string { func GetVarKey(Uid int) string {
@ -658,3 +691,45 @@ func ElemNumber(list []int, ele int) int {
} }
return count 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
}

View File

@ -128,15 +128,15 @@ func RandSliceNumNonAdjacent(s []int, num int) []int {
for len(result) < num { for len(result) < num {
Id := rand.Intn(len(slice)) Id := rand.Intn(len(slice))
result = append(result, slice[Id]) result = append(result, slice[Id])
slice = SubAdjacentElemSlice(slice, Id) slice = SubAdjacentElemSlice(slice, slice[Id])
} }
return result return result
} }
func SubAdjacentElemSlice(s []int, Id int) []int { func SubAdjacentElemSlice(s []int, Id int) []int {
r := make([]int, 0, len(s)) r := make([]int, 0, len(s))
for k, v := range s { for _, v := range s {
if k < Id-1 || k > Id+1 { if v < Id-1 || v > Id+1 {
r = append(r, v) r = append(r, v)
} }
} }

View File

@ -31,16 +31,16 @@ type StartOrderData struct {
type SevenLoginRewardData struct { type SevenLoginRewardData struct {
Id int Id int
Diamond int Energy float64
RewardNum int RewardNum int
} }
type SevenLoginJackpotData struct { type SevenLoginJackpotData struct {
Id int Id int
Diamond int Energy float64
Items []*item.Item Items []*item.Item
Type int Type int
Month int Month int
} }
type ActivityData struct { type ActivityData struct {

View File

@ -1,6 +1,6 @@
module server module server
go 1.23 go 1.25.0
require ( require (
github.com/alibabacloud-go/cloudauth-20190307/v4 v4.9.2 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/go-sql-driver/mysql v1.8.1
github.com/gorilla/websocket v1.5.3 github.com/gorilla/websocket v1.5.3
github.com/jmoiron/sqlx v1.4.0 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/redis/go-redis/v9 v9.6.1
github.com/robfig/cron/v3 v3.0.1 github.com/robfig/cron/v3 v3.0.1
github.com/shirou/gopsutil v3.21.11+incompatible 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 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/json-iterator/go v1.1.12 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // 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/tjfoc/gmsm v1.4.1 // indirect
github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect
github.com/tklauser/numcpus v0.8.0 // indirect github.com/tklauser/numcpus v0.8.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // 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 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
) )
require ( require (
github.com/apache/thrift v0.22.0 // indirect github.com/oschwald/maxminddb-golang v1.13.0 // indirect
golang.org/x/sys v0.29.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 ( require (

View File

@ -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.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 h1:CG8rc/nxCNKfXbZWpWDzI9GjF4Tuu3Es14qT8Y0ClOk=
github.com/aliyun/credentials-go v1.4.6/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= 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 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= 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.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 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/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 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 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= 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-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.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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.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.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.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.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.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/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 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 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/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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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= 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/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 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= 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-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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 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.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= 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/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-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/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.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.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.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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/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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.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.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 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI=
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= 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-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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/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.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 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.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.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-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-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 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.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.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 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.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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 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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=

View File

@ -2,7 +2,6 @@ package network
import ( import (
"net" "net"
"server/conf"
"server/pkg/github.com/name5566/leaf/log" "server/pkg/github.com/name5566/leaf/log"
"sync" "sync"
"time" "time"
@ -84,9 +83,9 @@ func (server *TCPServer) run() {
return return
} }
tempDelay = 0 tempDelay = 0
if conf.Server.ServerType == "center" { // if conf.Server.ServerType == "center" {
log.Debug("accept connection from %v", conn.RemoteAddr()) // log.Debug("accept connection from %v", conn.RemoteAddr())
} // }
server.mutexConns.Lock() server.mutexConns.Lock()
if len(server.conns) >= server.MaxConnNum { if len(server.conns) >= server.MaxConnNum {
server.mutexConns.Unlock() server.mutexConns.Unlock()

View File

@ -2,7 +2,9 @@ package test
import ( import (
"server/game" "server/game"
"server/game/mod/activity"
"testing" "testing"
"time"
) )
func TestActivityOpenEnd(t *testing.T) { func TestActivityOpenEnd(t *testing.T) {
@ -11,3 +13,33 @@ func TestActivityOpenEnd(t *testing.T) {
p.InitActivity() p.InitActivity()
p.ActivityLogin() 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)
}

View File

@ -31,5 +31,5 @@ func TestWatchAd(t *testing.T) {
func TestActivityGiftAdd(t *testing.T) { func TestActivityGiftAdd(t *testing.T) {
p1 := new(game.Player) p1 := new(game.Player)
p1.InitPlayer("3625212") p1.InitPlayer("3625212")
p1.Charge(76) p1.Charge(71)
} }

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

View File

@ -26,6 +26,17 @@ func TestDailyZeroUpdate(t *testing.T) {
DailyTaskMod.BackData() 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) { func TestDailyTaskRewardScore(t *testing.T) {
score1 := dailyTaskCfg.GetDailyTaskScore(1, 1) score1 := dailyTaskCfg.GetDailyTaskScore(1, 1)
if score1 == 0 { if score1 == 0 {

View File

@ -96,7 +96,8 @@ func TestFixUserData(t *testing.T) {
func TestRandInt(t *testing.T) { func TestRandInt(t *testing.T) {
p1 := new(game.Player) p1 := new(game.Player)
p1.InitPlayer("3625212") p1.InitPlayer("3625212")
p1.DeleteHighOrder() CollectMod := p1.GetCollectMod()
p1.PushClientRes(CollectMod.BackData(p1.GetOrderFactor()))
} }
func TestII(t *testing.T) { func TestII(t *testing.T) {
@ -285,3 +286,18 @@ func TestChampionShipCreateRobot(t *testing.T) {
func TestRedisZset(t *testing.T) { func TestRedisZset(t *testing.T) {
db.RedisZAdd("rank_user", "100001", 100) 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)
}
}

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

View File

@ -1,6 +1,7 @@
package test package test
import ( import (
"fmt"
sevenLoginCfg "server/conf/seven_login" sevenLoginCfg "server/conf/seven_login"
"server/game" "server/game"
GoUtil "server/game_util" GoUtil "server/game_util"
@ -17,7 +18,15 @@ func TestSevenLoginZeroUpdate(t *testing.T) {
p1 := new(game.Player) p1 := new(game.Player)
p1.InitPlayer("3625212") p1.InitPlayer("3625212")
SevenLoginMod := p1.GetSevenLoginMod() SevenLoginMod := p1.GetSevenLoginMod()
SevenLoginMod.ZeroUpdate(0, 0) SevenLoginMod.WeekResetTime = 0
SevenLoginMod.MonthResetTime = 0
SevenLoginMod.ZeroUpdate(0, 0, p1.GetOrderFactor())
SevenLoginMod.BackData() 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)
} }