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/msg/Gameapi.pb.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")
}
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)
}
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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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{}{}
return nil
}
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)
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)}

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

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

View File

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

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