From bb820093ff71384747ce7e8cd2ccbe5508cefd1d Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 14:09:56 +0800 Subject: [PATCH 01/46] =?UTF-8?q?=E9=94=A6=E6=A0=87=E8=B5=9B=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/champship_mgr.go | 59 ++++++++++++++++++++++++------- src/server/test/champship_test.go | 5 +++ src/server/test/fix_test.go | 2 +- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/server/game/champship_mgr.go b/src/server/game/champship_mgr.go index c18232e3..fdcf7db6 100644 --- a/src/server/game/champship_mgr.go +++ b/src/server/game/champship_mgr.go @@ -116,12 +116,16 @@ func (c *ChampshipMgr) Init() { }) } -func (c *ChampshipMgr) NotifyAll() (interface{}, error) { +// 每天零点30分通知所有在线玩家领取奖励 +func (c *ChampshipMgr) ZeroNotifyAll() (interface{}, error) { NotifyAllPlayerMsg(&msg.Msg{ Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, HandleType: msg.HANDLE_MOD_PLAYER_MSG, End: GoUtil.Now() + onehour, }) + c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration()+1800)*time.Second, func() { + c.ZeroNotifyAll() + }) return nil, nil } @@ -163,8 +167,8 @@ func (c *ChampshipMgr) ZeroUpdate() (interface{}, error) { c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { c.ZeroUpdate() }) - c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { - c.NotifyAll() + c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration()+1800)*time.Second, func() { + c.ZeroNotifyAll() }) // 在锁外通知玩家,避免在持有锁时调用外部函数 go c.NotifyPlayer() @@ -457,13 +461,13 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { } else { x = n } + x = max(x, 1) _, ok := g[x] if !ok { g[x] = make([]int, 0) } g[x] = append(g[x], k) } - for i := 11; i > 0; i-- { if len(g[i]) == 0 { continue @@ -481,21 +485,29 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { } ChampshipData.AutoId++ StartId := ChampshipData.AutoId - numGroups := (len(g[i]) + 9) / 10 // 向上取整,计算需要的组数 - ChampshipData.AutoId += numGroups for j := 0; j < len(g[i]); j++ { - groupIndex := StartId + j/10 - ChampshipData.GroupInfo[g[i][j]] = groupIndex + if len(ChampshipData.Rank[ChampshipData.AutoId]) >= 10 { + log.Error("championship error: more than 10 players in a group") + } + ChampshipData.GroupInfo[g[i][j]] = ChampshipData.AutoId UserData := ChampshipData.Pool[g[i][j]] - ChampshipData.Rank[groupIndex] = append(ChampshipData.Rank[groupIndex], &ChampshipRank{ + ChampshipData.Rank[ChampshipData.AutoId] = append(ChampshipData.Rank[ChampshipData.AutoId], &ChampshipRank{ Uid: UserData.Uid, Score: UserData.Score, Time: UserData.Time, }) - log.Debug("group AutoId:%d, Uid:%d, Score:%f, Time:%d", groupIndex, UserData.Uid, UserData.Score, UserData.Time) + log.Debug("group AutoId:%d, Uid:%d, Score:%.2f, Time:%d", ChampshipData.AutoId, UserData.Uid, UserData.Score, UserData.Time) + if len(ChampshipData.Rank[ChampshipData.AutoId]) >= 10 && j != len(g[i])-1 { + ChampshipData.AutoId++ + } } for j := StartId; j <= ChampshipData.AutoId; j++ { // 填充机器人 + if len(ChampshipData.Rank[j]) >= 30 || len(ChampshipData.Rank[j]) == 0 { + log.Error("championship error: more than 30 players in a group or no player in a group") + continue + } RobotNum := 30 - len(ChampshipData.Rank[j]) + log.Debug("group AutoId:%d, player num:%d, need robot num:%d", j, len(ChampshipData.Rank[j]), RobotNum) RobotList := CreateRobotList(i, RobotNum, j) for i := 0; i < RobotNum; i++ { FormatRobotInfo(RobotList[i], i+1) @@ -513,8 +525,6 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { sort.Slice(ChampshipData.Rank[j], func(x, y int) bool { // 排序 从大到小 数值相等按时间排序 if ChampshipData.Rank[j][x].Score > ChampshipData.Rank[j][y].Score { return true - } else if ChampshipData.Rank[j][x].Score == ChampshipData.Rank[j][y].Score { - return ChampshipData.Rank[j][x].Time < ChampshipData.Rank[j][y].Time } return false }) @@ -966,6 +976,31 @@ func (c *ChampshipMgr) SetRankCache(Uid int) { db.RedisSetKey(key, fmt.Sprintf("%d_%d_%d_%d", PreRank, Rank, PreGroupId, GroupId), time.Second*172800) } +func (c *ChampshipMgr) Debug() { + ChampshipData := c.getData() + ChampshipData.Pool = make(map[int]*GroupInfo) + ChampshipData.Rank = make(map[int][]*ChampshipRank) + for i := 1; i <= 1000; i++ { + ChampshipData.Pool[i+10000] = &GroupInfo{ + Uid: i + 10000, + Score: float64(GoUtil.RandNum(20, 21680)), + Time: GoUtil.Now(), + N: GoUtil.RandNum(1, 99), + H: GoUtil.RandNum(1, 99), + } + } + c.group(true) + var i int + for _, v := range ChampshipData.Rank { + for _, v1 := range v { + if v1.Type == 0 { + i++ + } + } + } + log.Debug("Debug player num:%d", i) +} + func GetRankCache(Uid int) (int, int, int, int) { key := fmt.Sprintf("champship_rank_cache_%d", Uid) data, err := db.RedisGetKey(key) diff --git a/src/server/test/champship_test.go b/src/server/test/champship_test.go index 6a636f7d..61df8926 100644 --- a/src/server/test/champship_test.go +++ b/src/server/test/champship_test.go @@ -47,3 +47,8 @@ func TestChampionshipCreateRobot(t *testing.T) { } fmt.Print("success") } + +func TestChampionshipGroup(t *testing.T) { + game.G_GameLogicPtr.CreateChampshipMgr() + game.G_GameLogicPtr.ChampshipMgr.Debug() +} diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 27530992..12679938 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -100,7 +100,7 @@ func TestRandInt(t *testing.T) { } func TestII(t *testing.T) { - for i := 10; i >= 0; i-- { + for i := 0; i < 10; i++ { fmt.Printf("i: %d\n", i) } } From b26297c864e0543a1b9b9b895d03c6c6c18824ea Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 15:12:48 +0800 Subject: [PATCH 02/46] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E5=8F=91=E5=B0=84?= =?UTF-8?q?=E5=99=A8=E5=9C=A8=E8=83=8C=E5=8C=85=E7=94=9F=E6=88=90=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=A5=96=E5=8A=B1=E7=9A=84bug;2.=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9B=9E=E6=94=B6=E8=AE=A2=E5=8D=95=E9=80=80=E5=BD=B9=E5=8F=91?= =?UTF-8?q?=E5=B0=84=E5=99=A8=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/mod/chess/Chess.go | 17 +++++++++++++++-- src/server/test/order_test.go | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/server/game/mod/chess/Chess.go b/src/server/game/mod/chess/Chess.go index 3c42a208..9a8e2958 100644 --- a/src/server/game/mod/chess/Chess.go +++ b/src/server/game/mod/chess/Chess.go @@ -300,6 +300,19 @@ func (cb *ChessBorad) emitListToSlice(retireFilter bool) []int { } EM[EmitID] = max(EM[EmitID], k) } + for _, v := range cb.ChessBag.List { + EmitID := mergeDataCfg.GetEmitId(v.ChessId) + if EmitID == "" { + continue + } + if retireFilter && cb.Retire[EmitID] >= EMIT_RETIRE_START { + continue + } + if mergeDataCfg.GetEmitType(v.ChessId) == "sub" { + continue + } + EM[EmitID] = max(EM[EmitID], (v.ChessId)) + } result := make([]int, 0, len(EM)) for _, v := range EM { result = append(result, v) @@ -729,8 +742,8 @@ func (cb *ChessBorad) GetRetireReward(Id string) ([]*item.Item, error) { func (cb *ChessBorad) GetRetireProduceColor() []string { color := make([]string, 0, len(cb.Retire)) for k, v := range cb.Retire { - if v == EMIT_RETIRE_ING { - color = append(color, mergeDataCfg.GetEmitTypeByColor(k)) + if v >= EMIT_RETIRE_ING { + color = append(color, mergeDataCfg.GetEmitProduce(k)...) } } return color diff --git a/src/server/test/order_test.go b/src/server/test/order_test.go index a6941e28..f55be88d 100644 --- a/src/server/test/order_test.go +++ b/src/server/test/order_test.go @@ -52,3 +52,17 @@ func TestInitOrderItem(t *testing.T) { p1.InitOrderItem() fmt.Printf("order item:%v", OrderMod.OrderList[1].Items) } + +func TestHighOrder(t *testing.T) { + p1 := new(game.Player) + p1.InitPlayer("3625212") + OrderMod := p1.GetOrderMod() + OrderMod.OrderList = make(map[int]order.Order) + OrderMod.OrderList[1] = order.Order{ + MergeId: []int{1346}, + } + p1.AddHighOrder() + p1.AddHighOrder2() + p1.InitOrderItem() + fmt.Printf("order item:%v", OrderMod.OrderList[1].Items) +} From a54b6a417522e9d7328c30b8da782a438177f1fe Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 15:28:30 +0800 Subject: [PATCH 03/46] =?UTF-8?q?=E9=94=A6=E6=A0=87=E8=B5=9B=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/benchmark_test.go | 7 +++++ src/server/game/champship_mgr.go | 52 +++++++++++++++---------------- src/server/test/champship_test.go | 2 +- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/server/benchmark_test.go b/src/server/benchmark_test.go index 5765fa3b..20b84adb 100644 --- a/src/server/benchmark_test.go +++ b/src/server/benchmark_test.go @@ -58,3 +58,10 @@ func printMemUsage() { func bToMb(b uint64) uint64 { return b / 1024 / 1024 } + +func BenchmarkChampionshipGroup(b *testing.B) { + for i := 0; i < b.N; i++ { + game.G_GameLogicPtr.CreateChampshipMgr() + game.G_GameLogicPtr.ChampshipMgr.Debug() + } +} diff --git a/src/server/game/champship_mgr.go b/src/server/game/champship_mgr.go index fdcf7db6..4ff59a4c 100644 --- a/src/server/game/champship_mgr.go +++ b/src/server/game/champship_mgr.go @@ -3,7 +3,6 @@ package game import ( "fmt" "math" - "math/rand" avatarCfg "server/conf/avatar" champshipCfg "server/conf/champship" @@ -451,7 +450,20 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { if len(ChampshipData.Pool) == 0 { // 未分配玩家池为空 return nil, nil } + total, err := db.RedisZCard(RANK_USER) + if err != nil { + total = 10000 + } + total = min(total, 10000) g := make(map[int][]int, 0) + list, err := db.RedisZRevRangeWithScores(RANK_USER, 0, total) + if err != nil { + log.Debug("redis zrevrange failed, err:%v\n", err) + } + uids := make([]int, 0, len(list)) + for _, v := range list { + uids = append(uids, GoUtil.Int(v.Member)) + } for k, v := range ChampshipData.Pool { // step 1:根据数值分配玩家 x := 0 n := champshipCfg.GetGroupId(v.N) @@ -496,7 +508,7 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { Score: UserData.Score, Time: UserData.Time, }) - log.Debug("group AutoId:%d, Uid:%d, Score:%.2f, Time:%d", ChampshipData.AutoId, UserData.Uid, UserData.Score, UserData.Time) + //log.Debug("group AutoId:%d, Uid:%d, Score:%.2f, Time:%d", ChampshipData.AutoId, UserData.Uid, UserData.Score, UserData.Time) if len(ChampshipData.Rank[ChampshipData.AutoId]) >= 10 && j != len(g[i])-1 { ChampshipData.AutoId++ } @@ -507,10 +519,10 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { continue } RobotNum := 30 - len(ChampshipData.Rank[j]) - log.Debug("group AutoId:%d, player num:%d, need robot num:%d", j, len(ChampshipData.Rank[j]), RobotNum) + //log.Debug("group AutoId:%d, player num:%d, need robot num:%d", j, len(ChampshipData.Rank[j]), RobotNum) RobotList := CreateRobotList(i, RobotNum, j) for i := 0; i < RobotNum; i++ { - FormatRobotInfo(RobotList[i], i+1) + go FormatRobotInfo(RobotList[i], i+1, uids) } for _, v := range RobotList { ChampshipData.Robot[ChampshipData.RobotId] = v @@ -534,7 +546,7 @@ func (c *ChampshipMgr) group(iszero bool) (interface{}, error) { // 收集需要通知的玩家 notifyList := make([]int, 0, len(ChampshipData.Pool)) for k := range ChampshipData.Pool { - c.SetRankCache(k) // SetRankCache 使用 unsafe 方法,在持有锁时是安全的 + go c.SetRankCache(k) // SetRankCache 使用 unsafe 方法,在持有锁时是安全的 notifyList = append(notifyList, k) } c.getData().Pool = make(map[int]*GroupInfo) // 清空未分配池 @@ -928,31 +940,19 @@ func CreateRobot(M float64, GroupId int) *ChampshipRobot { } } -func FormatRobotInfo(Robot *ChampshipRobot, index int) { - num, err := db.RedisZCard(RANK_USER) - if err != nil { - num = 0 - } - x := int(num) / 30 +func FormatRobotInfo(Robot *ChampshipRobot, index int, uids []int) { + x := int(len(uids)) / 30 if index > int(x) { index = int(x) } - start := int64((index - 1) * x) - end := int64(index*x - 1) - rinfo, err := db.RedisZRevRangeWithScores(RANK_USER, start, end) - if err != nil { - log.Error("FormatRobotInfo RedisZRevRangeWithScores error: %v, start %d, end %d", err, start, end) - return + start := max(int64((index-1)*x), 0) + end := max(int64(index*x-1), 0) + rindex := GoUtil.RandNum(int(start), int(end)) + if rindex >= len(uids) { + rindex = len(uids) - 1 } - if len(rinfo) == 0 { - log.Error("FormatRobotInfo RedisZRevRangeWithScores no data, start %d, end %d", start, end) - return - } - id := rand.Intn(len(rinfo)) - if id >= len(rinfo) { - id = len(rinfo) - 1 - } - playerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(GoUtil.Int(rinfo[id].Member)) + uid := uids[rindex] + playerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(uid) if playerSimpleData == nil { return } diff --git a/src/server/test/champship_test.go b/src/server/test/champship_test.go index 61df8926..b4b9b852 100644 --- a/src/server/test/champship_test.go +++ b/src/server/test/champship_test.go @@ -43,7 +43,7 @@ func TestChampionshipCreateRobot(t *testing.T) { j := 1 RobotList := game.CreateRobotList(i, RobotNum, j) for i := 0; i < RobotNum; i++ { - game.FormatRobotInfo(RobotList[i], i+1) + game.FormatRobotInfo(RobotList[i], i+1, []int{100001, 100002, 100003}) } fmt.Print("success") } From 5647721a416a36e515e7c7d9eda6860b3e06f636 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 16:19:25 +0800 Subject: [PATCH 04/46] =?UTF-8?q?=E5=8E=8B=E5=8A=9B=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/benchmark_test.go | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/server/benchmark_test.go b/src/server/benchmark_test.go index 20b84adb..c7f61d88 100644 --- a/src/server/benchmark_test.go +++ b/src/server/benchmark_test.go @@ -65,3 +65,49 @@ func BenchmarkChampionshipGroup(b *testing.B) { game.G_GameLogicPtr.ChampshipMgr.Debug() } } + +func BenchmarkPlayerInit(b *testing.B) { + for i := 0; i < b.N; i++ { + p := new(game.Player) + p.InitPlayer("3625212") + p.LoginBackData() + } +} + +func BenchmarkPlayerBackup(b *testing.B) { + p := new(game.Player) + p.InitPlayer("3625212") + for i := 0; i < b.N; i++ { + p.BackUp() + } +} + +func BenchmarkPlayerRecover(b *testing.B) { + p := new(game.Player) + p.InitPlayer("3625212") + backup := p.BackUp() + for i := 0; i < b.N; i++ { + p.Recover(backup) + } +} + +func BenchmarkPlayerHandleMsg(b *testing.B) { + p := new(game.Player) + p.InitPlayer("3625212") + list := make([]*msg.Msg, 0, 1000) + for i := 0; i < 1000; i++ { + m := &msg.Msg{ + HandleType: msg.HANDLE_MOD_PLAYER_LOGIN, + Type: msg.HANDLE_TYPE_APPLY, + From: 100001, + To: i + 100002, + Extra: 0, + } + list = append(list, m) + } + for i := 0; i < b.N; i++ { + for _, m := range list { + p.HandleMsg(m) + } + } +} From 0abecb446ed03ec75fe6d12c3bf458ebaeb92d96 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:08:00 +0800 Subject: [PATCH 05/46] =?UTF-8?q?message=20=E4=BF=A1=E6=81=AF=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/message_mgr.go | 59 +++++++++++++++++++--------------- src/server/game/mod/msg/Msg.go | 2 +- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index 4bfb0285..90c6fab4 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -100,35 +100,42 @@ func (m *MessageMgr) MessageMgrInit() { m.NodeRegister() m.CenterRegister() FixBug() + log.Debug("MessageMgr initialized successfully") } func FixBug() { - // messageMgrData := getMessageData() - // // 先更新 PlayerList(需要加锁) - // messageMgrData.mu.Lock() - // defer messageMgrData.mu.Unlock() - // now := GoUtil.Now() - // for k, v := range messageMgrData.MessageList { - // if k < 100000 { - // delete(messageMgrData.MessageList, k) - // continue - // } - // isLose := CheckPlayerLose(int(k)) - // // 反向遍历以安全删除元素 - // for i := len(v.Messages) - 1; i >= 0; i-- { - // if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY || (v.Messages[i].End != 0 && v.Messages[i].End < now) { - // // 删除消息 - // v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) - // } - // if isLose && v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_RESULT { - // // 删除消息 - // v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) - // } - // } - // if len(v.Messages) == 0 { - // delete(messageMgrData.MessageList, k) - // } - // } + messageMgrData := getMessageData() + // 先更新 PlayerList(需要加锁) + messageMgrData.mu.Lock() + defer messageMgrData.mu.Unlock() + now := GoUtil.Now() + for k, v := range messageMgrData.MessageList { + if k < 100000 { + delete(messageMgrData.MessageList, k) + continue + } + newMsgList := make([]*msg.Msg, 0, len(v.Messages)) + // 反向遍历以安全删除元素 + for _, message := range v.Messages { + if message == nil { + continue + } + if message.Type == msg.HADNLE_TYPE_AGREE || message.Type == msg.HANDLE_TYPE_DEL { + newMsgList = append(newMsgList, message) + continue + } + if message.End < now { + log.Debug("delete message %v", message) + continue + } + newMsgList = append(newMsgList, message) + } + v.Messages = newMsgList + if len(v.Messages) == 0 { + log.Debug("delete messagelist uid:%d", k) + delete(messageMgrData.MessageList, k) + } + } } // 注册处理器 diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index 70c172c3..3d447193 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -204,7 +204,7 @@ func (m *Msg) Reply(data interface{}) *Msg { func (m *Msg) String() string { typeStr := "default" handleTypeStr := formatHandleType(m.HandleType) - if m.HandleType == HANDLE_MOD_REPLY_PLAYER_MSG { + if m.HandleType == HANDLE_MOD_PLAYER_MSG { typeStr = formatType(m.Type) } return fmt.Sprintf("Msg{Type:%s, To:%d, From:%d, SendT:%d, End:%d, Id:%d, HandleType:%s, Items:%+v, Extra:%+v}", From a3622b43f026df8f871c3de4753d99775030036a Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:08:27 +0800 Subject: [PATCH 06/46] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/admin.go | 1 + src/server/game/mod/kv/kv.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/server/game/admin.go b/src/server/game/admin.go index 61fa6386..87589fe7 100644 --- a/src/server/game/admin.go +++ b/src/server/game/admin.go @@ -186,6 +186,7 @@ func AdminPlayerInfo(args []interface{}) error { res["Code"] = player.PlayMod.getBaseMod().AddCode res["ChessMap"] = player.PlayMod.getChessMod().ChessMap res["ActLog"] = player.PlayMod.getFriendMod().ActivityLog + res["AdWatch"] = player.PlayMod.getKvMod().GetAdValue() friendList := player.PlayMod.getFriendMod().NewFriendList type friendInfo struct { Uid int64 diff --git a/src/server/game/mod/kv/kv.go b/src/server/game/mod/kv/kv.go index e721041e..0ed22f0d 100644 --- a/src/server/game/mod/kv/kv.go +++ b/src/server/game/mod/kv/kv.go @@ -1,6 +1,9 @@ package kv -import "server/msg" +import ( + GoUtil "server/game_util" + "server/msg" +) type KvMod struct { Data map[int]string @@ -31,3 +34,10 @@ func (f *KvMod) BackData() *msg.ResKv { Kv: kv, } } + +func (f *KvMod) GetAdValue() int { + if v, ok := f.Data[133]; ok { + return GoUtil.Int(v) + } + return 0 +} From 1a61c7fd1c43b3c805c6d02ec974998efe80edb0 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:47:17 +0800 Subject: [PATCH 07/46] =?UTF-8?q?=E9=99=90=E6=97=B6=E4=BA=8B=E4=BB=B6-?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../limited_time_event/limited_time_event.go | 17 +++++++++++++++++ src/server/test/limit_test.go | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/server/game/mod/limited_time_event/limited_time_event.go b/src/server/game/mod/limited_time_event/limited_time_event.go index fa12fe2c..410ab9c7 100644 --- a/src/server/game/mod/limited_time_event/limited_time_event.go +++ b/src/server/game/mod/limited_time_event/limited_time_event.go @@ -368,6 +368,23 @@ func (l *LimitedTimeEventMod) SelectProgressReward(Id, Lv, Energy int) ([]*item. return Item, limitedTimeEventCfg.GetProgressRewardType(RewardId), OrderNum, RewardList, nil } +func (l *LimitedTimeEventMod) DebugProgressRewardList(Lv, Energy int) map[int]int { + // 重新生成进度奖励 + SelectNum := limitedTimeEventCfg.GetProgressSelectNum(Lv) + BonusLv := limitedTimeEventCfg.GetBonusLv(Lv) + RandMap := limitedTimeEventCfg.GetProgressRewardRand(BonusLv) + // 体力小于200 high roller事件不进池子 + if Energy < limitedTimeEventCfg.GetHighRollerNeedEnergy() { + delete(RandMap, limitedTimeEventCfg.GetJackpotIdByType(EVENT_TYPE_HIGH_ROLLER)) + } + if GoUtil.Now()-l.LastCatDaySale < limitedTimeEventCfg.GetCatSaleCD() { + // 参与猫咪大甩卖活动时,猫咪大甩卖事件不进池子 + delete(RandMap, limitedTimeEventCfg.GetJackpotIdByType(EVENT_TYPE_CAT_DAY_SALE)) + } + l.fillProgressReward(RandMap, SelectNum) + return l.ProgressReward +} + // fillProgressReward 随机填充进度奖励(最多尝试10次避免与上次相同) func (l *LimitedTimeEventMod) fillProgressReward(RandMap map[int]int, SelectNum int) { LastOption := l.LastOption diff --git a/src/server/test/limit_test.go b/src/server/test/limit_test.go index 39ade1dd..7e815878 100644 --- a/src/server/test/limit_test.go +++ b/src/server/test/limit_test.go @@ -1,6 +1,7 @@ package test import ( + "fmt" "server/game" limitedTimeEvent "server/game/mod/limited_time_event" "testing" @@ -42,3 +43,14 @@ func TestSenceDash(t *testing.T) { } t.Logf("Scene dash reward: Id=%d, items=%v", Id, items) } + +func TestProgressReward(t *testing.T) { + p := new(game.Player) + p.InitPlayer("3625212") + LimitEventMod := p.GetLimitEventMod() + BaseMod := p.GetBaseMod() + for i := 0; i < 100; i++ { + res := LimitEventMod.DebugProgressRewardList(38, BaseMod.Energy) // 输出当前进度奖励列表 + fmt.Printf("Current progress reward list: %v\n", res) + } +} From fac56917a9acda75a9492392e29bdae180db26c9 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 18:16:00 +0800 Subject: [PATCH 08/46] =?UTF-8?q?1+1=E7=A4=BC=E5=8C=85=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/charge_func.go | 10 ++++++++++ src/server/test/charge_test.go | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/src/server/game/charge_func.go b/src/server/game/charge_func.go index 52fecc2e..193523ae 100644 --- a/src/server/game/charge_func.go +++ b/src/server/game/charge_func.go @@ -79,6 +79,16 @@ func (p *Player) ActivityFire(ChargeId int) { 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 + } + } + } p.PlayMod.save() p.initActivity() p.BackDataActivity() diff --git a/src/server/test/charge_test.go b/src/server/test/charge_test.go index a25840be..f7166f10 100644 --- a/src/server/test/charge_test.go +++ b/src/server/test/charge_test.go @@ -26,3 +26,10 @@ func TestWatchAd(t *testing.T) { count = ChargeMod.GetAdWatch() fmt.Println("观看广告次数:", count) } + +// 1+1礼包 +func TestActivityGiftAdd(t *testing.T) { + p1 := new(game.Player) + p1.InitPlayer("3625212") + p1.Charge(72) +} From 631944f2bea0434ec6906573f607794052d137f7 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 11 Mar 2026 22:03:17 +0800 Subject: [PATCH 09/46] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=A2=9E=E5=8A=A0=E5=AE=9A=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/conf/activity/activity_cfg.go | 36 +++++++++--------------- src/server/game/activity_func.go | 14 ++++++++- src/server/game/charge_func.go | 2 +- src/server/game/gm_handler.go | 4 +-- src/server/game/player_base_mod.go | 2 +- src/server/game/player_data.go | 36 +++++++++++++++++++++--- src/server/game/register_network_func.go | 2 +- src/server/test/activity_test.go | 13 +++++++++ 8 files changed, 77 insertions(+), 32 deletions(-) create mode 100644 src/server/test/activity_test.go diff --git a/src/server/conf/activity/activity_cfg.go b/src/server/conf/activity/activity_cfg.go index 71a50cf5..b1cac0ea 100644 --- a/src/server/conf/activity/activity_cfg.go +++ b/src/server/conf/activity/activity_cfg.go @@ -57,7 +57,6 @@ func GetActivityList() []*gamedata.ActivityData { log.Debug("GetActivityList err:%v", err) return nil } - Now := GoUtil.Now() List := make([]*gamedata.ActivityData, 0, len(data)) for k, v := range data { @@ -65,28 +64,21 @@ func GetActivityList() []*gamedata.ActivityData { EndTimeStr := gamedata.GetStringValue(v, "EndTime") StartTime := GoUtil.ParseTime(StartTimeStr) EndTime := GoUtil.ParseTime(EndTimeStr) - if Now >= StartTime && Now <= EndTime { - Id, err := strconv.Atoi(k) - if err != nil { - log.Debug("GetActivityList parse id err:%v, key:%s", err, k) - continue - } - Type := gamedata.GetIntValue(v, "Type") - Name := gamedata.GetStringValue(v, "Name") - Title := gamedata.GetStringValue(v, "Title") - Level := gamedata.GetIntValue(v, "Level") - ActivityData := &gamedata.ActivityData{ - Id: Id, - Type: Type, - AType: gamedata.GetIntValue(v, "AType"), - Name: Name, - Title: Title, - Level: Level, - StartTime: StartTime, - EndTime: EndTime, - } - List = append(List, ActivityData) + Type := gamedata.GetIntValue(v, "Type") + Name := gamedata.GetStringValue(v, "Name") + Title := gamedata.GetStringValue(v, "Title") + Level := gamedata.GetIntValue(v, "Level") + ActivityData := &gamedata.ActivityData{ + Id: GoUtil.Int(k), + Type: Type, + AType: gamedata.GetIntValue(v, "AType"), + Name: Name, + Title: Title, + Level: Level, + StartTime: StartTime, + EndTime: EndTime, } + List = append(List, ActivityData) } return List } diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index cfce0658..14e8a79f 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -31,7 +31,19 @@ func (p *Player) ActivityLogin() { if OldId == 0 { return } - ItemId := guesscolorCfg.GetActivityItemId(OldId) + var ItemId int + switch actType { + case activity.ACT_TYPE_MINING: + ItemId = miningCfg.GetActivityItemId(OldId) + case activity.ACT_TYPE_GUESS_COLOR: + ItemId = guesscolorCfg.GetActivityItemId(OldId) + case activity.ACT_TYPE_RACE: + ItemId = raceCfg.GetCoin(OldId) + case activity.ACT_TYPE_PASS: + ItemId = passCfg.GetActivityItemId(OldId) + default: + return + } ItemNum := ItemMod.GetItem(ItemId) if ItemNum != 0 { ItemMod.AddItem(ItemId, -ItemNum) diff --git a/src/server/game/charge_func.go b/src/server/game/charge_func.go index 193523ae..c892db7c 100644 --- a/src/server/game/charge_func.go +++ b/src/server/game/charge_func.go @@ -90,7 +90,7 @@ func (p *Player) ActivityFire(ChargeId int) { } } p.PlayMod.save() - p.initActivity() + p.InitActivity() p.BackDataActivity() } diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index 990c1aaf..77bf594b 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -101,7 +101,7 @@ func ReqGmCommand_(player *Player, Command string) error { player.PlayMod.getBaseMod().Level = num player.PlayMod.getBaseMod().Exp = 0 player.PushClientRes(player.PlayerBaseMod.BackAsset()) - player.initActivity() + player.InitActivity() player.PlayMod.getGuideTaskMod().Unlock(num) player.PlayMod.getOrderMod().TriggerOrder(num, order.TRIGGER_TYPE_LV, nil, 1) player.PushClientRes(player.PlayMod.getOrderMod().BackData()) @@ -124,7 +124,7 @@ func ReqGmCommand_(player *Player, Command string) error { ActivityMod.Var = nil ActivityMod.InitData() player.PlayMod.save() - player.initActivity() + player.InitActivity() player.BackDataActivity() case "weekUpdate": VarMod := player.PlayMod.getVarMod() diff --git a/src/server/game/player_base_mod.go b/src/server/game/player_base_mod.go index 8f0628f7..b4d4cbbc 100644 --- a/src/server/game/player_base_mod.go +++ b/src/server/game/player_base_mod.go @@ -561,7 +561,7 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error) player.TriggerOrder(BaseMod.Level, order.TRIGGER_TYPE_LV, ChessMod.GetOrderEmit(), player.PlayMod.getBaseMod().GetEnergyMul()) player.PushClientRes(OrderMod.BackData()) // 重载活动 - player.initActivity() + player.InitActivity() player.BackDataActivity() player.QuestTrigger(&quest.Trigger{Label: quest.TRIGGER_LABEL_UPLV}) player.TeLog("level_up", map[string]interface{}{ diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 38ab33d5..b8dfac74 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -248,7 +248,7 @@ func (p *Player) InitPlayer(UserName string) error { log.Debug("AddFunc failed:", err) } p.McronSave.Start() - p.initActivity() + p.InitActivity() p.ZeroUpdate(nil) p.NoonUpdate(nil) p.Login() @@ -307,7 +307,7 @@ func (p *Player) InitPlayerByUid(Uid int) error { log.Debug("AddFunc failed:", err) } p.McronSave.Start() - p.initActivity() + p.InitActivity() p.ZeroUpdate(nil) p.NoonUpdate(nil) p.Login() @@ -384,7 +384,7 @@ func (p *Player) ZeroUpdate(a []interface{}) { } p.PlayroomBackData() p.PlayMod.getChampshipMod().ZeroUpdate() - p.initActivity() + p.InitActivity() p.ActivityZeroUpdate() // 每日任务 @@ -1171,11 +1171,15 @@ func (p *Player) TeLog(Type string, Param map[string]interface{}) { } // 初始化活动 -func (p *Player) initActivity() { +func (p *Player) InitActivity() { p.activity = make(map[int]*ActivityInfo) ActivityList := activityCfg.GetActivityList() Level := p.GetPlayerBaseMod().GetLevel() ActivityMod := p.PlayMod.getActivityMod() + now := GoUtil.Now() + var startduration int64 + var minduration int64 + var endduration int64 for _, v := range ActivityList { if v.Level > Level { continue @@ -1184,6 +1188,17 @@ func (p *Player) initActivity() { if Status == 0 { continue } + startduration = v.StartTime - now + endduration = v.EndTime - now + 1 + if startduration > 0 && (minduration == 0 || minduration > startduration) { + minduration = startduration + } + if endduration > 0 && (minduration == 0 || minduration > endduration) { + minduration = endduration + } + if v.StartTime > now || v.EndTime < now { + continue + } p.activity[v.Id] = &ActivityInfo{ StartT: v.StartTime, EndT: v.EndTime, @@ -1193,10 +1208,23 @@ func (p *Player) initActivity() { Title: v.Title, } } + if minduration > 0 { + p.CallEvent(time.Duration(minduration)*time.Second, p.TickActivity, "init_activity") + } p.TeLog("activity_ids", map[string]interface{}{ "info": p.activity, }) p.ActivityLogin() + +} + +func (p *Player) TickActivity() { + p.lock.Lock() + defer p.lock.Unlock() + p.InitActivity() + p.ActivityZeroUpdate() + p.BackDataActivity() + p.SendClientRes() } func (p *Player) BackDataActivity() { diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index d9194431..35304f11 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -4646,7 +4646,7 @@ func ReqActivityReward(player *Player, buf []byte) error { "Items": Items, }) player.PlayMod.save() - player.initActivity() + player.InitActivity() player.BackDataActivity() player.PushClientRes(&msg.ResActivityReward{ Code: msg.RES_CODE_SUCCESS, diff --git a/src/server/test/activity_test.go b/src/server/test/activity_test.go new file mode 100644 index 00000000..03dd8307 --- /dev/null +++ b/src/server/test/activity_test.go @@ -0,0 +1,13 @@ +package test + +import ( + "server/game" + "testing" +) + +func TestActivityOpenEnd(t *testing.T) { + p := new(game.Player) + p.InitPlayer("3625212") + p.InitActivity() + p.ActivityLogin() +} From 37ef7dd4341452cafb391202ae03eb1f33ee0370 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 10:54:58 +0800 Subject: [PATCH 10/46] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=8C=E6=B4=BB=E5=8A=A8=E7=B1=BB=E5=9E=8B=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E4=BB=A5=E6=97=B6=E9=97=B4=E6=AE=B5=E4=B8=BA=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/GameLogic.go | 1 + src/server/game/activity_func.go | 17 ++++++++++++----- src/server/test/activity_test.go | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 561e8ae6..d5651b23 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -514,6 +514,7 @@ func (ad *GameLogic) ClearData(args []interface{}) { if player != nil && player.M_DwUin != 0 { player.agent = nil log.Debug("player %d 断开连接", player.M_DwUin) + player.AutoSaveData() player.CallEvent(120*time.Second, func() { player.lock.Lock() defer player.lock.Unlock() diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 14e8a79f..d2595885 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -462,7 +462,8 @@ func (p *Player) GetChampshipActivityId() (int, int) { var yesterdayActivityId int activiyCfgList := activityCfg.GetActivityListOrigin() Now := GoUtil.Now() - YesterDay := GoUtil.ZeroTimestamp() - 1 + YesterDayEnd := GoUtil.ZeroTimestamp() - 1 + YesterDayStart := GoUtil.ZeroTimestamp() - 24*3600 level := p.GetBaseMod().GetLevel() champshipActivityIds := champshipCfg.GetChampshipActivityId() for _, v := range activiyCfgList { @@ -475,7 +476,10 @@ func (p *Player) GetChampshipActivityId() (int, int) { if v.StartTime <= Now && v.EndTime >= Now { todayActivityId = v.Id } - if v.StartTime <= YesterDay && v.EndTime >= YesterDay { + if v.StartTime <= YesterDayStart && v.EndTime >= YesterDayStart { + yesterdayActivityId = v.Id + } + if v.StartTime <= YesterDayEnd && v.EndTime >= YesterDayEnd { yesterdayActivityId = v.Id } } @@ -485,8 +489,9 @@ func (p *Player) GetChampshipActivityId() (int, int) { func (p *Player) GetDailyTaskActivityId() int { var activityId int activiyCfgList := activityCfg.GetActivityListOrigin() - Now := GoUtil.Now() level := p.GetBaseMod().GetLevel() + todayZeroStart := GoUtil.ZeroTimestamp() + todayZeroEnd := GoUtil.ZeroTimestamp() + 24*3600 - 1 activityIds := dailyTaskCfg.GetActivityIds() for _, v := range activiyCfgList { if !GoUtil.InArray(v.Type, activityIds) { @@ -495,9 +500,11 @@ func (p *Player) GetDailyTaskActivityId() int { if v.Level > level { continue } - if v.StartTime <= Now && v.EndTime >= Now { + if v.StartTime <= todayZeroStart && v.EndTime >= todayZeroStart { + activityId = v.Id + } + if v.StartTime <= todayZeroEnd && v.EndTime >= todayZeroEnd { activityId = v.Id - break } } return activityId diff --git a/src/server/test/activity_test.go b/src/server/test/activity_test.go index 03dd8307..1b723262 100644 --- a/src/server/test/activity_test.go +++ b/src/server/test/activity_test.go @@ -11,3 +11,18 @@ func TestActivityOpenEnd(t *testing.T) { p.InitActivity() p.ActivityLogin() } + +func TestChampionshipActivityId(t *testing.T) { + p := new(game.Player) + p.InitPlayer("3625212") + todayActivityId, yesterdayActivityId := p.GetChampshipActivityId() + t.Logf("Current championship activity ID: %d", todayActivityId) + t.Logf("Yesterday's championship activity ID: %d", yesterdayActivityId) +} + +func TestDailyTaskActivityId(t *testing.T) { + p := new(game.Player) + p.InitPlayer("3625212") + activityId := p.GetDailyTaskActivityId() + t.Logf("Current daily task activity ID: %d", activityId) +} From 77ff2416988037286fa47c3f1fe02aebe1ca23b4 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 11:20:24 +0800 Subject: [PATCH 11/46] =?UTF-8?q?Revert=20"=E6=B4=BB=E5=8A=A8=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E6=B4=BB=E5=8A=A8=E7=B1=BB=E5=9E=8B=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E4=BB=A5=E6=97=B6=E9=97=B4=E6=AE=B5=E4=B8=BA=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 37ef7dd4341452cafb391202ae03eb1f33ee0370. --- src/server/game/GameLogic.go | 1 - src/server/game/activity_func.go | 17 +++++------------ src/server/test/activity_test.go | 15 --------------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index d5651b23..561e8ae6 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -514,7 +514,6 @@ func (ad *GameLogic) ClearData(args []interface{}) { if player != nil && player.M_DwUin != 0 { player.agent = nil log.Debug("player %d 断开连接", player.M_DwUin) - player.AutoSaveData() player.CallEvent(120*time.Second, func() { player.lock.Lock() defer player.lock.Unlock() diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index d2595885..14e8a79f 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -462,8 +462,7 @@ func (p *Player) GetChampshipActivityId() (int, int) { var yesterdayActivityId int activiyCfgList := activityCfg.GetActivityListOrigin() Now := GoUtil.Now() - YesterDayEnd := GoUtil.ZeroTimestamp() - 1 - YesterDayStart := GoUtil.ZeroTimestamp() - 24*3600 + YesterDay := GoUtil.ZeroTimestamp() - 1 level := p.GetBaseMod().GetLevel() champshipActivityIds := champshipCfg.GetChampshipActivityId() for _, v := range activiyCfgList { @@ -476,10 +475,7 @@ func (p *Player) GetChampshipActivityId() (int, int) { if v.StartTime <= Now && v.EndTime >= Now { todayActivityId = v.Id } - if v.StartTime <= YesterDayStart && v.EndTime >= YesterDayStart { - yesterdayActivityId = v.Id - } - if v.StartTime <= YesterDayEnd && v.EndTime >= YesterDayEnd { + if v.StartTime <= YesterDay && v.EndTime >= YesterDay { yesterdayActivityId = v.Id } } @@ -489,9 +485,8 @@ func (p *Player) GetChampshipActivityId() (int, int) { func (p *Player) GetDailyTaskActivityId() int { var activityId int activiyCfgList := activityCfg.GetActivityListOrigin() + Now := GoUtil.Now() level := p.GetBaseMod().GetLevel() - todayZeroStart := GoUtil.ZeroTimestamp() - todayZeroEnd := GoUtil.ZeroTimestamp() + 24*3600 - 1 activityIds := dailyTaskCfg.GetActivityIds() for _, v := range activiyCfgList { if !GoUtil.InArray(v.Type, activityIds) { @@ -500,11 +495,9 @@ func (p *Player) GetDailyTaskActivityId() int { if v.Level > level { continue } - if v.StartTime <= todayZeroStart && v.EndTime >= todayZeroStart { - activityId = v.Id - } - if v.StartTime <= todayZeroEnd && v.EndTime >= todayZeroEnd { + if v.StartTime <= Now && v.EndTime >= Now { activityId = v.Id + break } } return activityId diff --git a/src/server/test/activity_test.go b/src/server/test/activity_test.go index 1b723262..03dd8307 100644 --- a/src/server/test/activity_test.go +++ b/src/server/test/activity_test.go @@ -11,18 +11,3 @@ func TestActivityOpenEnd(t *testing.T) { p.InitActivity() p.ActivityLogin() } - -func TestChampionshipActivityId(t *testing.T) { - p := new(game.Player) - p.InitPlayer("3625212") - todayActivityId, yesterdayActivityId := p.GetChampshipActivityId() - t.Logf("Current championship activity ID: %d", todayActivityId) - t.Logf("Yesterday's championship activity ID: %d", yesterdayActivityId) -} - -func TestDailyTaskActivityId(t *testing.T) { - p := new(game.Player) - p.InitPlayer("3625212") - activityId := p.GetDailyTaskActivityId() - t.Logf("Current daily task activity ID: %d", activityId) -} From 715e88a41e3cf62266eee5327c8032d9a594c178 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 11:23:31 +0800 Subject: [PATCH 12/46] =?UTF-8?q?socket=E6=96=AD=E5=BC=80=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E4=BF=9D=E5=AD=98=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/GameLogic.go | 1 + src/server/game/player_data.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 561e8ae6..e3ea35e7 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -513,6 +513,7 @@ func (ad *GameLogic) ClearData(args []interface{}) { player := args[0].(*Player) if player != nil && player.M_DwUin != 0 { player.agent = nil + player.AutoSaveData() log.Debug("player %d 断开连接", player.M_DwUin) player.CallEvent(120*time.Second, func() { player.lock.Lock() diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index b8dfac74..922dbf1a 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -556,7 +556,7 @@ func (p *Player) AutoSaveData() { if err != nil { log.Debug("AutoSaveData Commit failed:", err) } - + log.Release("uid: %d, auto save data", p.M_DwUin) } // 重新连接 From a386b1e29f89000b2d39e9060955b63988fd7c8d Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 11:48:39 +0800 Subject: [PATCH 13/46] =?UTF-8?q?ZADD=E5=8F=AA=E4=BF=9D=E5=AD=9810000?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E8=A1=8C=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/db/Redis.go | 14 ++++++++++++++ src/server/test/fix_test.go | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/server/db/Redis.go b/src/server/db/Redis.go index b2b79719..31b9eea9 100644 --- a/src/server/db/Redis.go +++ b/src/server/db/Redis.go @@ -194,6 +194,20 @@ func RedisZAdd(key string, member string, score float64) { err := RdbWrite.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err() if err != nil { log.Debug("redis zadd failed, err:%v\n", err) + return + } + const maxRankSize int64 = 10000 + count, err := RdbWrite.ZCard(ctx, key).Result() + if err != nil { + log.Debug("redis zcard failed, err:%v\n", err) + return + } + if count > maxRankSize { + removeCount := count - maxRankSize + err = RdbWrite.ZRemRangeByRank(ctx, key, 0, removeCount-1).Err() + if err != nil { + log.Debug("redis zremrangebyrank failed, err:%v\n", err) + } } } diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 12679938..e59763a0 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -281,3 +281,7 @@ func TestChampionShipCreateRobot(t *testing.T) { robot := game.CreateRobot(1.0, 1) fmt.Printf("Created Robot: %v\n", robot) } + +func TestRedisZset(t *testing.T) { + db.RedisZAdd("rank_user", "100001", 100) +} From 1639ee330f34c017bcaa2d2def58340c2047c1d6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:24:42 +0800 Subject: [PATCH 14/46] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=9B=9E=E6=94=B6?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/activity_func.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 14e8a79f..439a84ff 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -47,7 +47,7 @@ func (p *Player) ActivityLogin() { ItemNum := ItemMod.GetItem(ItemId) if ItemNum != 0 { ItemMod.AddItem(ItemId, -ItemNum) - p.SendActivityMail(ItemId, ItemNum, ActivityId, nil) + p.SendActivityMail(item.ITEM_ENERGY_ID, ItemNum, ActivityId, nil) } } From 410d918a7553a6e4fd76e12907e8fd07f6c15c24 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:44:24 +0800 Subject: [PATCH 15/46] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=9B=9E=E6=94=B6?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/conf/language/language_cfg.go | 33 ++++++++++++++++++++++-- src/server/game/activity_func.go | 2 +- src/server/game/player_data.go | 1 + src/server/test/charge_test.go | 2 +- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/server/conf/language/language_cfg.go b/src/server/conf/language/language_cfg.go index 375526c9..53bdce56 100644 --- a/src/server/conf/language/language_cfg.go +++ b/src/server/conf/language/language_cfg.go @@ -6,16 +6,45 @@ import ( ) const ( - CFG_LANGUAGE = "LanguageData" - CFG_ALLLANGUAGE = "AllLanguage" + CFG_LANGUAGE = "LanguageData" + CFG_ALLLANGUAGE = "AllLanguage" + CFG_ALLLANGUAGE_CLIENT = "AllLanguageClient" ) func init() { gamedata.InitCfg(CFG_LANGUAGE) gamedata.InitCfg(CFG_ALLLANGUAGE) + gamedata.InitCfg(CFG_ALLLANGUAGE_CLIENT) } func GetLanguage(lang msg.LANG_TYPE, key string) string { + res := _GetClientLanguage(lang, key) + if res != key { + return res + } + return _GetBackendLanguage(lang, key) +} + +func _GetClientLanguage(lang msg.LANG_TYPE, key string) string { + data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE_CLIENT, key) + if err != nil { + return key + } + switch lang { + case msg.LANG_TYPE_LANG_EN: + return gamedata.GetStringValue(data, "en_US") + case msg.LANG_TYPE_LANG_PTBR: + return gamedata.GetStringValue(data, "pt_BR") + case msg.LANG_TYPE_LANG_CN: + return gamedata.GetStringValue(data, "zh_CN") + case msg.LANG_TYPE_LANG_ES_LATAM: + return gamedata.GetStringValue(data, "es_LATAM") + default: + return key + } +} + +func _GetBackendLanguage(lang msg.LANG_TYPE, key string) string { data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE, key) if err != nil { return key diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 439a84ff..79bbbe4e 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -47,7 +47,7 @@ func (p *Player) ActivityLogin() { ItemNum := ItemMod.GetItem(ItemId) if ItemNum != 0 { ItemMod.AddItem(ItemId, -ItemNum) - p.SendActivityMail(item.ITEM_ENERGY_ID, ItemNum, ActivityId, nil) + p.SendActivityMail(item.ITEM_ENERGY_ID, ItemNum, OldId, nil) } } diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 922dbf1a..8ae4a1e2 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -1224,6 +1224,7 @@ func (p *Player) TickActivity() { p.InitActivity() p.ActivityZeroUpdate() p.BackDataActivity() + p.PushClientRes(p.GetMailMod().BackData()) p.SendClientRes() } diff --git a/src/server/test/charge_test.go b/src/server/test/charge_test.go index f7166f10..fc6b9060 100644 --- a/src/server/test/charge_test.go +++ b/src/server/test/charge_test.go @@ -31,5 +31,5 @@ func TestWatchAd(t *testing.T) { func TestActivityGiftAdd(t *testing.T) { p1 := new(game.Player) p1.InitPlayer("3625212") - p1.Charge(72) + p1.Charge(76) } From 6450c857ceb5a8768bfd22dbe0106b2cc1f125a5 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:09:45 +0800 Subject: [PATCH 16/46] =?UTF-8?q?GM=20=E6=8C=87=E4=BB=A4=EF=BC=8C=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/db/Mysql.go | 21 +++++++++++++++++++++ src/server/game/gm_handler.go | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/server/db/Mysql.go b/src/server/db/Mysql.go index af80a370..e2581d95 100644 --- a/src/server/db/Mysql.go +++ b/src/server/db/Mysql.go @@ -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 diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index 77bf594b..85979836 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -591,6 +591,22 @@ 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))) From 9b653d37e6a2519a9585a91b06998c31478f3640 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:05:32 +0800 Subject: [PATCH 17/46] =?UTF-8?q?=E7=A4=BC=E5=8C=85=E5=85=85=E5=80=BC?= =?UTF-8?q?=E6=89=93=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/charge_func.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/game/charge_func.go b/src/server/game/charge_func.go index c892db7c..6daee5de 100644 --- a/src/server/game/charge_func.go +++ b/src/server/game/charge_func.go @@ -89,6 +89,11 @@ func (p *Player) ActivityFire(ChargeId int) { } } } + p.TeLog("charge_gift", map[string]interface{}{ + "activity_id": ActivityId, + "charge_id": ChargeId, + "item_list": Item, + }) p.PlayMod.save() p.InitActivity() p.BackDataActivity() From ff3c6468cf257d7a1d9e12ff657a8d0162ff3783 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:23:59 +0800 Subject: [PATCH 18/46] =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + src/server/game/charge_func.go | 1 + src/server/game/gm_handler.go | 4 +- src/server/game/mod/base/Base.go | 6 ++ src/server/game/player_data.go | 3 + src/server/game/rank_mgr.go | 42 +++++++++++--- src/server/game/register_network_func.go | 10 +++- src/server/game_util/GoUtil.go | 72 +++++++++++++++++++----- src/server/go.mod | 2 + src/server/go.sum | 4 ++ src/server/test/charge_test.go | 2 +- src/server/test/fix_test.go | 7 +++ 12 files changed, 127 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index fdc27c87..623c746c 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ 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 diff --git a/src/server/game/charge_func.go b/src/server/game/charge_func.go index 6daee5de..72282af0 100644 --- a/src/server/game/charge_func.go +++ b/src/server/game/charge_func.go @@ -72,6 +72,7 @@ func (p *Player) ActivityFire(ChargeId int) { return } if Item == nil { + log.Debug("ActivityFire err : %s", err) return } err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String()) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index 85979836..82644c82 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -612,9 +612,7 @@ func ReqGmCommand_(player *Player, Command string) error { 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]) diff --git a/src/server/game/mod/base/Base.go b/src/server/game/mod/base/Base.go index 28c1201a..0a52df8a 100644 --- a/src/server/game/mod/base/Base.go +++ b/src/server/game/mod/base/Base.go @@ -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 diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 8ae4a1e2..763ab8d5 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -1110,6 +1110,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) diff --git a/src/server/game/rank_mgr.go b/src/server/game/rank_mgr.go index ed969059..be26812d 100644 --- a/src/server/game/rank_mgr.go +++ b/src/server/game/rank_mgr.go @@ -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) } diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index 35304f11..bced11dd 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -2333,10 +2333,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) diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index 9b3fc74c..954a35d3 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -13,6 +13,7 @@ import ( "fmt" "io" "math/rand" + "net" "net/http" "reflect" "server/pkg/github.com/name5566/leaf/log" @@ -20,6 +21,8 @@ import ( "strings" "sync" "time" + + "github.com/oschwald/geoip2-golang" ) var bufferPool = sync.Pool{ @@ -478,15 +481,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 +585,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 +670,35 @@ 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 +} diff --git a/src/server/go.mod b/src/server/go.mod index 071ec27e..f8e477c8 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -48,6 +48,8 @@ require ( require ( github.com/apache/thrift v0.22.0 // indirect + github.com/oschwald/geoip2-golang v1.13.0 // indirect + github.com/oschwald/maxminddb-golang v1.13.0 // indirect golang.org/x/sys v0.29.0 // indirect ) diff --git a/src/server/go.sum b/src/server/go.sum index 03c7cb8e..b152ad73 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -146,6 +146,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= diff --git a/src/server/test/charge_test.go b/src/server/test/charge_test.go index fc6b9060..4250dba3 100644 --- a/src/server/test/charge_test.go +++ b/src/server/test/charge_test.go @@ -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) } diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index e59763a0..22d304b7 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -285,3 +285,10 @@ 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) +} From 53c573d7e003dd56cfa2aa76c88ce193922cc332 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:57:14 +0800 Subject: [PATCH 19/46] =?UTF-8?q?=E4=B8=83=E6=97=A5=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E5=A5=96=E5=8A=B1bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conf/seven_login/seven_login_cfg.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/server/conf/seven_login/seven_login_cfg.go b/src/server/conf/seven_login/seven_login_cfg.go index 8b464349..4e5d57b5 100644 --- a/src/server/conf/seven_login/seven_login_cfg.go +++ b/src/server/conf/seven_login/seven_login_cfg.go @@ -5,7 +5,9 @@ import ( "server/game/mod/item" "server/gamedata" "server/pkg/github.com/name5566/leaf/log" + "sort" "strconv" + "time" ) const ( @@ -93,10 +95,23 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData { } func GetMonthActive(Id int) int { - data, err := gamedata.GetDataByIntKey(CFG_SEVEN_LOGIN_MONTH, Id) + month := int(time.Now().Month()) + data, err := gamedata.GetData(CFG_SEVEN_LOGIN_MONTH) + active := []int{} if err != nil { log.Debug("GetSevenLoginReward err:%v", err) return int(math.Inf(1)) } - return gamedata.GetIntValue(data, "Active") + for _, v := range data { + if gamedata.GetIntValue(v, "Month") == month { + active = append(active, gamedata.GetIntValue(v, "Active")) + } + } + sort.Ints(active) + if Id-1 < 0 || Id-1 >= len(active) { + log.Debug("GetSevenLoginReward err:%v", err) + return int(math.Inf(1)) + } + id := active[Id-1] + return id } From 4f9b7ed56de874e3212393ed478c90ed0efb467a Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 12 Mar 2026 20:05:40 +0800 Subject: [PATCH 20/46] =?UTF-8?q?Revert=20"=E4=B8=83=E6=97=A5=E7=AD=BE?= =?UTF-8?q?=E5=88=B0=E5=A5=96=E5=8A=B1bug=E4=BF=AE=E5=A4=8D"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 53c573d7e003dd56cfa2aa76c88ce193922cc332. --- .../conf/seven_login/seven_login_cfg.go | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/server/conf/seven_login/seven_login_cfg.go b/src/server/conf/seven_login/seven_login_cfg.go index 4e5d57b5..8b464349 100644 --- a/src/server/conf/seven_login/seven_login_cfg.go +++ b/src/server/conf/seven_login/seven_login_cfg.go @@ -5,9 +5,7 @@ import ( "server/game/mod/item" "server/gamedata" "server/pkg/github.com/name5566/leaf/log" - "sort" "strconv" - "time" ) const ( @@ -95,23 +93,10 @@ func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData { } func GetMonthActive(Id int) int { - month := int(time.Now().Month()) - data, err := gamedata.GetData(CFG_SEVEN_LOGIN_MONTH) - active := []int{} + data, err := gamedata.GetDataByIntKey(CFG_SEVEN_LOGIN_MONTH, Id) if err != nil { log.Debug("GetSevenLoginReward err:%v", err) return int(math.Inf(1)) } - for _, v := range data { - if gamedata.GetIntValue(v, "Month") == month { - active = append(active, gamedata.GetIntValue(v, "Active")) - } - } - sort.Ints(active) - if Id-1 < 0 || Id-1 >= len(active) { - log.Debug("GetSevenLoginReward err:%v", err) - return int(math.Inf(1)) - } - id := active[Id-1] - return id + return gamedata.GetIntValue(data, "Active") } From 0020a4af8ce9a8599334bdcd2db621614df16997 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Fri, 13 Mar 2026 18:40:42 +0800 Subject: [PATCH 21/46] 1 --- src/server/game/activity_mgr.go | 60 +++++++++++++++++++++++++++++++++ src/server/game/server_mod.go | 1 + 2 files changed, 61 insertions(+) create mode 100644 src/server/game/activity_mgr.go diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go new file mode 100644 index 00000000..df6c2c82 --- /dev/null +++ b/src/server/game/activity_mgr.go @@ -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 +} diff --git a/src/server/game/server_mod.go b/src/server/game/server_mod.go index 43757e59..374f03d1 100644 --- a/src/server/game/server_mod.go +++ b/src/server/game/server_mod.go @@ -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 { From 4caadbf8378185debc9aca743c03fd1f20c3170c Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 16 Mar 2026 16:09:39 +0800 Subject: [PATCH 22/46] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/GameLogic.go | 8 ++++++++ src/server/game/player_data.go | 36 +++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index e3ea35e7..640a29cf 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -510,6 +510,14 @@ func (ad *GameLogic) SendServerVersion(a gate.Agent) { } func (ad *GameLogic) ClearData(args []interface{}) { + G_GameLogicPtr.M_Players.Range(func(k, v interface{}) bool { + v.(*Player).PushAndSendClienRes(&msg.ForceKickOut{}) + v.(*Player).ClearData() + v = nil + log.Debug("palyer %d 断开连接 写入数据", k) + return true + }) + return player := args[0].(*Player) if player != nil && player.M_DwUin != 0 { player.agent = nil diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 763ab8d5..60871934 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -65,6 +65,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 +82,25 @@ type PlayerMsg struct { } func (p *Player) Stop() { - select { - case <-p.stopSignal: - // 通道已经关闭 - return - default: - p.wg.Wait() - close(p.stopSignal) + p.wg.Wait() + p.stopDispatcherLoop() + p.msgChanOnce.Do(func() { close(p.msgChan) + }) + for _, timer := range p.timerList { + timer.Stop() } p.McronSave.Stop() p.stop = true } +func (p *Player) stopDispatcherLoop() { + p.stopOnce.Do(func() { + close(p.stopSignal) + }) + p.dispatcherWg.Wait() +} + 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} // 玩家基础数据 @@ -272,6 +283,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} // 玩家基础数据 @@ -1010,6 +1023,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} @@ -1347,7 +1362,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 { @@ -1372,6 +1389,11 @@ func (p *Player) DispatcherHandle() { }() } +func (p *Player) StopDispatcher() { + p.wg.Wait() + p.stopDispatcherLoop() +} + func CheckPlayerLose(Uid int) bool { FriendSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid) if FriendSimpleData == nil { From a2997b3be52be93fcf5d7233f381781e5e081347 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 16 Mar 2026 16:58:17 +0800 Subject: [PATCH 23/46] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=98=E5=8C=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/GameLogic.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 640a29cf..e3ea35e7 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -510,14 +510,6 @@ func (ad *GameLogic) SendServerVersion(a gate.Agent) { } func (ad *GameLogic) ClearData(args []interface{}) { - G_GameLogicPtr.M_Players.Range(func(k, v interface{}) bool { - v.(*Player).PushAndSendClienRes(&msg.ForceKickOut{}) - v.(*Player).ClearData() - v = nil - log.Debug("palyer %d 断开连接 写入数据", k) - return true - }) - return player := args[0].(*Player) if player != nil && player.M_DwUin != 0 { player.agent = nil From cb5c5e91f7024bb5cc695d7450913d7f7916fcfe Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:21:13 +0800 Subject: [PATCH 24/46] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/player_data.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 60871934..70f6ff7f 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -83,7 +83,7 @@ type PlayerMsg struct { func (p *Player) Stop() { p.wg.Wait() - p.stopDispatcherLoop() + p.signalDispatcherStop() p.msgChanOnce.Do(func() { close(p.msgChan) }) @@ -94,11 +94,10 @@ func (p *Player) Stop() { p.stop = true } -func (p *Player) stopDispatcherLoop() { +func (p *Player) signalDispatcherStop() { p.stopOnce.Do(func() { close(p.stopSignal) }) - p.dispatcherWg.Wait() } func (p *Player) CallEvent(Duration time.Duration, F func(), Label string) { @@ -1389,11 +1388,6 @@ func (p *Player) DispatcherHandle() { }() } -func (p *Player) StopDispatcher() { - p.wg.Wait() - p.stopDispatcherLoop() -} - func CheckPlayerLose(Uid int) bool { FriendSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid) if FriendSimpleData == nil { From 47ffc52955b6798c069390e4660e66dafbc52c66 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 16 Mar 2026 19:37:20 +0800 Subject: [PATCH 25/46] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E7=BA=BF=E4=B8=8Aplayroom=E7=94=9F=E7=90=86=E5=80=BC=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/mod/playroom/playroom.go | 20 ++++++++++++++++++++ src/server/game/player_base_mod.go | 2 ++ src/server/game/player_data.go | 11 +++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/server/game/mod/playroom/playroom.go b/src/server/game/mod/playroom/playroom.go index 5bcf1826..1bcb2639 100644 --- a/src/server/game/mod/playroom/playroom.go +++ b/src/server/game/mod/playroom/playroom.go @@ -916,7 +916,27 @@ func (p *PlayroomMod) UnLock(Lv int) bool { p.MoodInfo[k] = &Mood{Id: k, Num: 100} } } + return true +} +func (p *PlayroomMod) FixUnLock(Lv int) bool { + UnlockLv := playroomCfg.GetUnLockLv() + if Lv < UnlockLv || len(p.Physiology) != 0 { + return false + } + Now := GoUtil.Now() + p.Physiology = make(map[int]*Physiology) + TypeList := playroomCfg.GetPhysiologyTypeList() + for _, v := range TypeList { + Max := playroomCfg.GetPhysiologyMax(v) + p.Physiology[v] = &Physiology{Id: v, Num: Max, Time: Now} + } + if len(p.MoodInfo) == 0 { + p.MoodInfo = make(map[int]*Mood) + for k := 1; k <= 3; k++ { + p.MoodInfo[k] = &Mood{Id: k, Num: 100} + } + } return true } diff --git a/src/server/game/player_base_mod.go b/src/server/game/player_base_mod.go index b4d4cbbc..3de3f0c2 100644 --- a/src/server/game/player_base_mod.go +++ b/src/server/game/player_base_mod.go @@ -567,6 +567,8 @@ func (p *PlayerBaseData) AddExp(player *Player, exp int, pexp int) (int, error) player.TeLog("level_up", map[string]interface{}{ "after_level": BaseMod.Level, }) + PlayroomMod := player.PlayMod.getPlayroomMod() + PlayroomMod.UnLock(BaseMod.GetLevel()) NewExpLv, NewPetLv := userCfg.GetNewLevUpExp(BaseMod.Level, BaseMod.Exp, BaseMod.PExp) player.TeLog("property_level_up", map[string]interface{}{ "property_level": BaseMod.Level, diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 70f6ff7f..3434b743 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -270,6 +270,7 @@ func (p *Player) InitPlayer(UserName string) error { ChargeMod.FixBug(ChessMod.GetEmitList()) p.FixOrderBug() p.FixDecorate() + p.FixPlayroomPyhical() return nil } @@ -1407,3 +1408,13 @@ func (p *Player) Lock() { func (p *Player) UnLock() { p.lock.Unlock() } + +func (p *Player) FixPlayroomPyhical() { + if p.GetBaseMod().GetLevel() >= playroomCfg.GetUnLockLv() { + PlayroomMod := p.PlayMod.getPlayroomMod() + if len(PlayroomMod.GetPhysiologyList()) != len(playroomCfg.GetPhysiologyTypeList()) { + PlayroomMod.Physiology = make(map[int]*playroom.Physiology) + PlayroomMod.UnLock(p.GetBaseMod().GetLevel()) + } + } +} From 1f1aa56d1ba602d4111a27b8dd147ccd9ac50348 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:29:10 +0800 Subject: [PATCH 26/46] =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/external.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/external.go b/src/server/game/external.go index 4742cbba..d43b7dae 100644 --- a/src/server/game/external.go +++ b/src/server/game/external.go @@ -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() { From 630064912a6972a0744214fd09529421a5d7b8e2 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:58:51 +0800 Subject: [PATCH 27/46] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/limited_time_trigger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/limited_time_trigger.go b/src/server/game/limited_time_trigger.go index 00027714..1d8f1eb5 100644 --- a/src/server/game/limited_time_trigger.go +++ b/src/server/game/limited_time_trigger.go @@ -172,7 +172,7 @@ func (p *Player) LimitedTimePlayroomTrigger_(Id int) { CleanMood := PlayroomMod.GetMoodInfo(playroom.MOOD_TYPE_CLEAN) PlayroomMod.AddMood(MType, -MEffect*DiffValue) // 上厕所数值为0 且清洁度大于50时,清洁度降至50 - if Id == playroom.PHYSIOLOGY_TYPE_TOLIET && Num == 0 && CleanMood.Num > 50 { + if CleanMood != nil && Id == playroom.PHYSIOLOGY_TYPE_TOLIET && Num == 0 && CleanMood.Num > 50 { CleanMood.Num = 50 } Physiology.Num = Num From b1b22e06d88383ebcf24741b7ca4ca7fcf96afb4 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:57:20 +0800 Subject: [PATCH 28/46] =?UTF-8?q?=E4=B8=83=E6=97=A5=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conf/seven_login/seven_login_cfg.go | 20 ++++----- src/server/game/gm_handler.go | 2 +- .../game/mod/seven_login/seven_login.go | 30 ++++++++++++- .../game/mod/seven_login/seven_login_func.go | 43 +++++++++++-------- src/server/game/player_data.go | 7 ++- src/server/gamedata/type.go | 12 +++--- src/server/test/seven_test.go | 9 +++- 7 files changed, 86 insertions(+), 37 deletions(-) diff --git a/src/server/conf/seven_login/seven_login_cfg.go b/src/server/conf/seven_login/seven_login_cfg.go index 8b464349..2b4d7ec9 100644 --- a/src/server/conf/seven_login/seven_login_cfg.go +++ b/src/server/conf/seven_login/seven_login_cfg.go @@ -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 diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index 82644c82..b069da3e 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -645,7 +645,7 @@ func ReqGmCommand_(player *Player, Command string) error { SevenMod := player.PlayMod.getSevenLoginMod() SevenMod.MonthResetTime = 0 PlayerBaseMod := player.GetPlayerBaseMod() - SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime()) + SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), player.GetOrderFactor()) case "debugLogoutMsg": ToUid, _ := strconv.Atoi(arg[1]) uidList, err := db.GetDebugPlayer(ToUid) diff --git a/src/server/game/mod/seven_login/seven_login.go b/src/server/game/mod/seven_login/seven_login.go index a8d09277..59361c61 100644 --- a/src/server/game/mod/seven_login/seven_login.go +++ b/src/server/game/mod/seven_login/seven_login.go @@ -2,6 +2,7 @@ package sevenLogin import ( "fmt" + "math" sevenLoginCfg "server/conf/seven_login" "server/game/mod/item" GoUtil "server/game_util" @@ -30,19 +31,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 +127,28 @@ 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 { + for _, v := range v.Item1 { + if v.Id == item.ITEM_STAR_ID { + Num := math.Round(float64(v.Num) * float64(factor) / 100) + v.Num = int(Num) / 5 * 5 + } + } + for _, v := range v.Item2 { + if v.Id == item.ITEM_STAR_ID { + Num := math.Round(float64(v.Num) * float64(factor) / 100) + v.Num = int(Num) / 5 * 5 + } + } + for _, v := range v.Item3 { + if v.Id == item.ITEM_STAR_ID { + Num := math.Round(float64(v.Num) * float64(factor) / 100) + v.Num = int(Num) / 5 * 5 + } + } + reward[k] = v + } + return reward +} diff --git a/src/server/game/mod/seven_login/seven_login_func.go b/src/server/game/mod/seven_login/seven_login_func.go index 5eec7e73..81d205e7 100644 --- a/src/server/game/mod/seven_login/seven_login_func.go +++ b/src/server/game/mod/seven_login/seven_login_func.go @@ -1,6 +1,7 @@ package sevenLogin import ( + "math" "math/rand/v2" sevenLoginCfg "server/conf/seven_login" "server/game/mod/item" @@ -23,7 +24,7 @@ func randWeekReward(Add, Type int) map[int]Reward { }) 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 { @@ -37,7 +38,7 @@ func randWeekReward(Add, Type int) map[int]Reward { EnergyMul = 2.0 } 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) result[v.Id] = Reward } @@ -46,16 +47,16 @@ func randWeekReward(Add, Type int) map[int]Reward { func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot []*gamedata.SevenLoginJackpotData, CardPackIds []int, EnergyPer, EnergyMul float64) Reward { // 奖励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) * 0.5) + energyNum := float64(int(Num/5)) * 5 + RemainEnergy := RewardData.Energy - energyNum + // 召回玩家 每日体力数*2 + energyNum = energyNum * EnergyMul + Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(energyNum))} // 奖励2 - NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { - if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != JACKPOT_CARD_TYPE { + if v.Energy <= RemainEnergy && v.Type != LastType && v.Type != JACKPOT_CARD_TYPE { NewJackpot = append(NewJackpot, v) } } @@ -65,38 +66,46 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot var Item2 []*item.Item Item2Type := 0 if RewardData.RewardNum == 3 { - RemainDiamond -= 5 + RemainEnergy -= 5 } 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 { + 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)} + Item2 = []*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 + RemainEnergy -= CardJackpot[Index].Energy } } else { Index := rand.IntN(len(NewJackpot)) Item2Type = NewJackpot[Index].Type Item2 = NewJackpot[Index].Items - RemainDiamond -= NewJackpot[Index].Diamond + RemainEnergy -= NewJackpot[Index].Energy } var Item3 []*item.Item if RewardData.RewardNum == 3 { - RemainDiamond += 5 + RemainEnergy += 5 NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { - if v.Diamond <= RemainDiamond && v.Type != LastType && v.Type != Item2Type { + if v.Energy <= RemainEnergy && v.Type != LastType && v.Type != Item2Type { NewJackpot3 = append(NewJackpot3, v) } } + if len(NewJackpot3) == 0 { + Item3 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(RemainEnergy))} + return Reward{ + Item1: Item1, + Item2: Item2, + Item3: Item3, + } + } Index := rand.IntN(len(NewJackpot3)) Item3 = NewJackpot3[Index].Items } @@ -116,7 +125,7 @@ func randMonthReward() map[int]Reward { }) 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 }) result := make(map[int]Reward) for _, v := range RewardList { diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 3434b743..1bb2e196 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -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" @@ -368,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()) // 礼包充值 @@ -1418,3 +1419,7 @@ func (p *Player) FixPlayroomPyhical() { } } } + +func (p *Player) GetOrderFactor() int { + return orderCfg.GetOrderFactor(p.GetDecorateMod().AreaId) +} diff --git a/src/server/gamedata/type.go b/src/server/gamedata/type.go index 2bb48771..099762d7 100644 --- a/src/server/gamedata/type.go +++ b/src/server/gamedata/type.go @@ -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 { diff --git a/src/server/test/seven_test.go b/src/server/test/seven_test.go index 792e5114..b0cdf9b0 100644 --- a/src/server/test/seven_test.go +++ b/src/server/test/seven_test.go @@ -1,6 +1,7 @@ package test import ( + "fmt" sevenLoginCfg "server/conf/seven_login" "server/game" GoUtil "server/game_util" @@ -17,7 +18,13 @@ func TestSevenLoginZeroUpdate(t *testing.T) { p1 := new(game.Player) p1.InitPlayer("3625212") SevenLoginMod := p1.GetSevenLoginMod() - SevenLoginMod.ZeroUpdate(0, 0) + SevenLoginMod.WeekResetTime = 0 + SevenLoginMod.ZeroUpdate(0, 0, p1.GetOrderFactor()) SevenLoginMod.BackData() + fmt.Printf("order factor:%v\n", p1.GetOrderFactor()) + for _, v := range SevenLoginMod.LoginReward { + t.Logf("Reward:%v", v) + fmt.Printf("Reward:%v\n", v) + } t.Logf("SevenLoginMod:%v", SevenLoginMod) } From 9dec8fa2660449f9da763c1533e97bf2f0e96cd3 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:25:25 +0800 Subject: [PATCH 29/46] =?UTF-8?q?=E6=AF=8F=E6=97=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/mod/daily_task/DailyTask.go | 92 ++++++++++++--------- src/server/game/player_base_mod.go | 3 +- src/server/game/player_data.go | 2 +- src/server/test/dailytask_test.go | 11 +++ 4 files changed, 65 insertions(+), 43 deletions(-) diff --git a/src/server/game/mod/daily_task/DailyTask.go b/src/server/game/mod/daily_task/DailyTask.go index 2c629ef8..aadee80a 100644 --- a/src/server/game/mod/daily_task/DailyTask.go +++ b/src/server/game/mod/daily_task/DailyTask.go @@ -2,8 +2,8 @@ package dailyTask import ( "fmt" + "math" dailyTaskCfg "server/conf/daily_task" - orderCfg "server/conf/order" "server/game/mod/item" "server/game/mod/quest" GoUtil "server/game_util" @@ -49,46 +49,45 @@ 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, factor, activityId) + 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,20 @@ 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 { + for _, v := range v.Items { + if v.Id == item.ITEM_STAR_ID { + Num := math.Round(float64(v.Num) * float64(factor) / 100) + v.Num = int(Num) / 5 * 5 + } + } + reward[k] = v + } + return reward } func (dt *DailyTaskMod) Trigger(Tr *quest.Trigger) bool { @@ -138,32 +150,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 +193,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 +214,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 { diff --git a/src/server/game/player_base_mod.go b/src/server/game/player_base_mod.go index 3de3f0c2..6a3eca24 100644 --- a/src/server/game/player_base_mod.go +++ b/src/server/game/player_base_mod.go @@ -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 diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 1bb2e196..c257c4be 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -413,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() diff --git a/src/server/test/dailytask_test.go b/src/server/test/dailytask_test.go index 673ba37a..44479631 100644 --- a/src/server/test/dailytask_test.go +++ b/src/server/test/dailytask_test.go @@ -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 { From 469e52f984daf89cc2cf4ed74ef0d4abc6b81f08 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:59:53 +0800 Subject: [PATCH 30/46] =?UTF-8?q?=E5=A2=9E=E5=8A=A0gm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/gm_handler.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index b069da3e..e64919d8 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -646,6 +646,10 @@ func ReqGmCommand_(player *Player, Command string) error { SevenMod.MonthResetTime = 0 PlayerBaseMod := player.GetPlayerBaseMod() SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), player.GetOrderFactor()) + 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) From 2a43279167c4d7f46aa22dcc5761f24be869e4c6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:34:01 +0800 Subject: [PATCH 31/46] =?UTF-8?q?=E5=AE=A0=E7=89=A9=E5=AE=9D=E8=97=8F?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E5=9F=BA=E7=A1=80=E5=80=BC=E9=9C=80=E4=B9=98?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=9C=BA=E6=99=AF=E5=80=8D=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mod/friend_treasure.go/friend_treasure.go | 3 +- src/server/game/mod_factory.go | 5 ++++ src/server/game/register_network_func.go | 2 +- src/server/test/friendTreasure_test.go | 29 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/server/test/friendTreasure_test.go diff --git a/src/server/game/mod/friend_treasure.go/friend_treasure.go b/src/server/game/mod/friend_treasure.go/friend_treasure.go index 06823956..42689985 100644 --- a/src/server/game/mod/friend_treasure.go/friend_treasure.go +++ b/src/server/game/mod/friend_treasure.go/friend_treasure.go @@ -85,13 +85,14 @@ func (f *FriendTreasureMod) Flip(Pos int) ([]*item.Item, int64, error) { } // 结束游戏 -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) + ItemNum = int(float64(ItemNum)*float64(factor)/100/5) * 5 FriendItemNum := ItemNum / 10 Reward := []*item.Item{ {Id: item.ITEM_STAR_ID, Num: ItemNum}, diff --git a/src/server/game/mod_factory.go b/src/server/game/mod_factory.go index 12118ed9..b30a5390 100644 --- a/src/server/game/mod_factory.go +++ b/src/server/game/mod_factory.go @@ -11,6 +11,7 @@ import ( "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 +96,7 @@ 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() +} diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index bced11dd..25a910ef 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -4316,7 +4316,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{ diff --git a/src/server/test/friendTreasure_test.go b/src/server/test/friendTreasure_test.go new file mode 100644 index 00000000..7779dd55 --- /dev/null +++ b/src/server/test/friendTreasure_test.go @@ -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) + } +} From 7d5161a44d168a259f2d02221634fe5228622759 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:45:40 +0800 Subject: [PATCH 32/46] =?UTF-8?q?gm=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/gm_handler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index e64919d8..e1298a08 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -643,9 +643,10 @@ 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.MonthResetTime = 0 + SevenMod.WeekResetTime = 0 PlayerBaseMod := player.GetPlayerBaseMod() SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), player.GetOrderFactor()) + player.PushClientRes(SevenMod.BackData()) case "addInvite": Id, _ := strconv.Atoi(arg[1]) player.PlayMod.getInviteMod().AddInvite(Id) From 01fc89f874e4c70e2707202e267647107004396f Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:59:28 +0800 Subject: [PATCH 33/46] =?UTF-8?q?=E6=8C=96=E7=9F=BF=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E5=9F=8B=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/activity_func.go | 8 ++++++++ src/server/game/player_data.go | 6 ++++++ src/server/game/register_network_func.go | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 79bbbe4e..bcce1d93 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -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) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index c257c4be..37dfdbf1 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -935,6 +935,12 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error { "change_after": ItemMod.GetItem(v.Id), "change_reason": Label, }) + if v.Id == p.GetMiningItemId() { + p.TeLog("get_token", map[string]interface{}{ + "obtain_way": Label, + "get_num": v.Num, + }) + } if err != nil { return err } diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index 25a910ef..4eae97ff 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -3210,7 +3210,7 @@ func ReqMiningReward(player *Player, buf []byte) error { }) return err } - player.TeLog("mining_finish", map[string]interface{}{ + player.TeLog("finish_level", map[string]interface{}{ "expend_token_num": Mining, "level_ID": MiningMod.Pass - 1, }) From 7df724a8d6196b2cb0df0b3d61937176df388ed6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:18:19 +0800 Subject: [PATCH 34/46] =?UTF-8?q?=E4=B9=B0=E4=B8=80=E8=B5=A0=E4=B8=80?= =?UTF-8?q?=E7=A4=BC=E5=8C=85=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/server/game/GameLogic.go | 1 + src/server/game/charge_func.go | 40 ++++++++--------- src/server/game/mod/activity/activity.go | 33 +++++++++----- src/server/game/mod/activity/activity_gift.go | 8 +++- src/server/game/mod_factory.go | 5 +++ src/server/game/player_data.go | 32 +++++++++++++- src/server/game/register_network_func.go | 41 ++++++++++++++++++ src/server/go.mod | 15 ++++--- src/server/go.sum | 43 +++++++++++++++---- src/server/test/activity_test.go | 32 ++++++++++++++ 11 files changed, 201 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 623c746c..ab614cb0 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ 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 diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index e3ea35e7..f485759a 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -793,6 +793,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() { // #region 活动 RegisterMsgProcessFunc("ReqActivityReward", ReqActivityReward) // 领取活动奖励 + RegisterMsgProcessFunc("ReqAddGiftReward", ReqAddGiftReward) // 领取加赠活动奖励 // 挖矿 RegisterMsgProcessFunc("ReqMining", ReqMining) // 请求挖矿数据 RegisterMsgProcessFunc("ReqMiningReward", ReqMiningReward) // 领取挖矿奖励 diff --git a/src/server/game/charge_func.go b/src/server/game/charge_func.go index 72282af0..7c33e90a 100644 --- a/src/server/game/charge_func.go +++ b/src/server/game/charge_func.go @@ -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,42 +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() diff --git a/src/server/game/mod/activity/activity.go b/src/server/game/mod/activity/activity.go index b001afe7..a4d7e194 100644 --- a/src/server/game/mod/activity/activity.go +++ b/src/server/game/mod/activity/activity.go @@ -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 } diff --git a/src/server/game/mod/activity/activity_gift.go b/src/server/game/mod/activity/activity_gift.go index 8f287eda..ad5090e7 100644 --- a/src/server/game/mod/activity/activity_gift.go +++ b/src/server/game/mod/activity/activity_gift.go @@ -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,10 @@ func (a *Activity) Fire(Id int) ([]*item.Item, error) { // } // Var.Buy = true // Var.Time = GoUtil.Now() + if atype == ACT_TYPE_ADD_GIFT { + //todo 测试 + a.AddEnd = GoUtil.Now() + 7 + //a.AddEnd = GoUtil.Now() + 7*86400 + } return activityCfg.GetActivityGiftItems(Id), nil } diff --git a/src/server/game/mod_factory.go b/src/server/game/mod_factory.go index b30a5390..c8d83363 100644 --- a/src/server/game/mod_factory.go +++ b/src/server/game/mod_factory.go @@ -1,6 +1,7 @@ package game import ( + "server/game/mod/activity" "server/game/mod/base" "server/game/mod/card" "server/game/mod/champship" @@ -100,3 +101,7 @@ func (p *Player) GetItemMod() *item.ItemMod { func (p *Player) GetFriendTreasureMod() *friendTreasure.FriendTreasureMod { return p.PlayMod.getFriendTreasureMod() } + +func (p *Player) GetActivityMod() *activity.Activity { + return p.PlayMod.getActivityMod() +} diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 37dfdbf1..9b1b196b 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -1236,6 +1236,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, }) @@ -1253,6 +1257,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 { @@ -1267,9 +1295,11 @@ func (p *Player) BackDataActivity() { Red: int32(Red), }) } - + ActivityMod := p.PlayMod.getActivityMod() p.PushClientRes(&msg.ResActivity{ ActiveList: ResActivityList, + AddEnd: ActivityMod.AddEnd, + AddReward: ActivityMod.AddReward, }) } diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index 4eae97ff..d7905d0f 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -4614,6 +4614,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) diff --git a/src/server/go.mod b/src/server/go.mod index f8e477c8..3aa595ee 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -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,21 +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 - github.com/oschwald/geoip2-golang v1.13.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 ( diff --git a/src/server/go.sum b/src/server/go.sum index b152ad73..5373fd05 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -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= @@ -180,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= @@ -225,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= @@ -258,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= @@ -282,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= @@ -299,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= diff --git a/src/server/test/activity_test.go b/src/server/test/activity_test.go index 03dd8307..799ed857 100644 --- a/src/server/test/activity_test.go +++ b/src/server/test/activity_test.go @@ -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) +} From 95c4c4ee2e6c37986ff73ab2906e6746f4488c80 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:24:19 +0800 Subject: [PATCH 35/46] =?UTF-8?q?=E4=B9=B0=E4=B8=80=E8=B5=A0=E4=B8=80?= =?UTF-8?q?=E7=A4=BC=E5=8C=85=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/mod/activity/activity_gift.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/server/game/mod/activity/activity_gift.go b/src/server/game/mod/activity/activity_gift.go index ad5090e7..23875261 100644 --- a/src/server/game/mod/activity/activity_gift.go +++ b/src/server/game/mod/activity/activity_gift.go @@ -16,9 +16,7 @@ func (a *Activity) Fire(Id int, atype int) ([]*item.Item, error) { // Var.Buy = true // Var.Time = GoUtil.Now() if atype == ACT_TYPE_ADD_GIFT { - //todo 测试 - a.AddEnd = GoUtil.Now() + 7 - //a.AddEnd = GoUtil.Now() + 7*86400 + a.AddEnd = GoUtil.Now() + 7*86400 } return activityCfg.GetActivityGiftItems(Id), nil } From 2341d2d1444a4be9f0ce86615b74da632fb58149 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 14:42:06 +0800 Subject: [PATCH 36/46] =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/github.com/name5566/leaf/network/tcp_server.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/server/pkg/github.com/name5566/leaf/network/tcp_server.go b/src/server/pkg/github.com/name5566/leaf/network/tcp_server.go index 2b25178b..ea4d7d93 100644 --- a/src/server/pkg/github.com/name5566/leaf/network/tcp_server.go +++ b/src/server/pkg/github.com/name5566/leaf/network/tcp_server.go @@ -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() From 1b125ca2224dc2fa5356a375e17d4805d45e3dc6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:32:12 +0800 Subject: [PATCH 37/46] =?UTF-8?q?=E6=AF=8F=E6=97=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=91=A8=E5=A5=96=E5=8A=B1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/gm_handler.go | 1 + src/server/game/mod/daily_task/DailyFunc.go | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index e1298a08..4c9ef26e 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -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 diff --git a/src/server/game/mod/daily_task/DailyFunc.go b/src/server/game/mod/daily_task/DailyFunc.go index 28728d10..55eb6092 100644 --- a/src/server/game/mod/daily_task/DailyFunc.go +++ b/src/server/game/mod/daily_task/DailyFunc.go @@ -9,7 +9,7 @@ import ( ) func getTaskReward(Id, AreaId, activityId int) []*item.Item { - + switch Id { case 2: StarNum := int(50 * math.Pow(1.04, float64(AreaId))) @@ -32,6 +32,7 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item. lastIds1 = Ids1 prevIsCard := 0 valid := true + cardCount := 0 for _, k := range Ids1 { curIsCard := jackpot[k].Is_card if prevIsCard == 1 && curIsCard == 1 { @@ -39,6 +40,12 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item. break } prevIsCard = curIsCard + if curIsCard == 1 { + cardCount++ + } + } + if cardCount < 2 { + continue } if valid { r := make(map[int][]*item.Item, num) From c72819f253856f76258208f8ca52a824918567cb Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:03:28 +0800 Subject: [PATCH 38/46] =?UTF-8?q?=E4=BC=98=E5=8C=96GM=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/gm_handler.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index 4c9ef26e..036915a0 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -645,6 +645,7 @@ func ReqGmCommand_(player *Player, Command string) error { case "resetWeekReward": SevenMod := player.PlayMod.getSevenLoginMod() SevenMod.WeekResetTime = 0 + SevenMod.MonthResetTime = 0 PlayerBaseMod := player.GetPlayerBaseMod() SevenMod.ZeroUpdate(PlayerBaseMod.GetSevenLoginAdd(), PlayerBaseMod.GetLastLoginTime(), player.GetOrderFactor()) player.PushClientRes(SevenMod.BackData()) From 658fd9e2b833ca49b27d66508441fd71dc063748 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:47:33 +0800 Subject: [PATCH 39/46] =?UTF-8?q?=E4=B8=83=E6=97=A5=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/mod/seven_login/seven_login_func.go | 80 ++++++++++--------- src/server/game_util/GoUtil.go | 19 +++++ src/server/game_util/sliceUtil.go | 6 +- src/server/test/fix_test.go | 8 ++ src/server/test/seven_test.go | 8 +- 5 files changed, 78 insertions(+), 43 deletions(-) diff --git a/src/server/game/mod/seven_login/seven_login_func.go b/src/server/game/mod/seven_login/seven_login_func.go index 81d205e7..6562e570 100644 --- a/src/server/game/mod/seven_login/seven_login_func.go +++ b/src/server/game/mod/seven_login/seven_login_func.go @@ -18,36 +18,37 @@ 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].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 { + for _, v := range rewardList { v.Energy = float64(v.Energy) * (1 + float64(Add)/100) - Reward := randReward(v, LastType, jackpot, CardPackIds, 0.5, EnergyMul) - result[v.Id] = Reward + 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 := math.Round(float64(RewardData.Energy) * 0.5) + Num := math.Round(float64(RewardData.Energy) * energyPer) energyNum := float64(int(Num/5)) * 5 RemainEnergy := RewardData.Energy - energyNum // 召回玩家 每日体力数*2 @@ -56,15 +57,12 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot // 奖励2 NewJackpot := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { - if v.Energy <= RemainEnergy && 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) } } - if len(NewJackpot) == 0 { - return Reward{Item1: Item1} - } var Item2 []*item.Item - Item2Type := 0 + ItemType := []int{} if RewardData.RewardNum == 3 { RemainEnergy -= 5 } @@ -79,22 +77,27 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot Item2 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(RemainEnergy))} } else { Index := rand.IntN(len(CardJackpot)) - Item2Type = CardJackpot[Index].Type + ItemType = append(ItemType, CardJackpot[Index].Type) Item2 = CardJackpot[Index].Items RemainEnergy -= CardJackpot[Index].Energy } } else { - Index := rand.IntN(len(NewJackpot)) - Item2Type = NewJackpot[Index].Type - Item2 = NewJackpot[Index].Items - RemainEnergy -= NewJackpot[Index].Energy + if len(NewJackpot) == 0 { + return Reward{Item1: Item1}, nil + } + sort.Slice(NewJackpot, func(i, j int) bool { + return NewJackpot[i].Energy > NewJackpot[j].Energy + }) + ItemType = append(ItemType, NewJackpot[0].Type) + Item2 = NewJackpot[0].Items + RemainEnergy -= NewJackpot[0].Energy } var Item3 []*item.Item if RewardData.RewardNum == 3 { RemainEnergy += 5 NewJackpot3 := make([]*gamedata.SevenLoginJackpotData, 0, len(jackpot)) for _, v := range jackpot { - if v.Energy <= RemainEnergy && v.Type != LastType && v.Type != Item2Type { + if v.Energy <= RemainEnergy && !GoUtil.InArray(v.Type, LastType) && !GoUtil.InArray(v.Type, ItemType) { NewJackpot3 = append(NewJackpot3, v) } } @@ -104,33 +107,38 @@ func randReward(RewardData *gamedata.SevenLoginRewardData, LastType int, jackpot Item1: Item1, Item2: Item2, Item3: Item3, - } + }, ItemType } - Index := rand.IntN(len(NewJackpot3)) - Item3 = NewJackpot3[Index].Items + sort.Slice(NewJackpot3, func(i, j int) bool { + return NewJackpot3[i].Energy > NewJackpot3[j].Energy + }) + Item3 = NewJackpot3[0].Items + ItemType = append(ItemType, NewJackpot3[0].Type) } return Reward{ Item1: Item1, Item2: Item2, Item3: Item3, - } + }, 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].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 } diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index 954a35d3..f6e46086 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -17,6 +17,7 @@ import ( "net/http" "reflect" "server/pkg/github.com/name5566/leaf/log" + "sort" "strconv" "strings" "sync" @@ -356,6 +357,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)) diff --git a/src/server/game_util/sliceUtil.go b/src/server/game_util/sliceUtil.go index 51887e22..178446a5 100644 --- a/src/server/game_util/sliceUtil.go +++ b/src/server/game_util/sliceUtil.go @@ -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) } } diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 22d304b7..7c77ae4b 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -292,3 +292,11 @@ func TestGeoIp(t *testing.T) { 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) + } +} diff --git a/src/server/test/seven_test.go b/src/server/test/seven_test.go index b0cdf9b0..8cd74f3d 100644 --- a/src/server/test/seven_test.go +++ b/src/server/test/seven_test.go @@ -22,9 +22,9 @@ func TestSevenLoginZeroUpdate(t *testing.T) { SevenLoginMod.ZeroUpdate(0, 0, p1.GetOrderFactor()) SevenLoginMod.BackData() fmt.Printf("order factor:%v\n", p1.GetOrderFactor()) - for _, v := range SevenLoginMod.LoginReward { - t.Logf("Reward:%v", v) - fmt.Printf("Reward:%v\n", v) + 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", SevenLoginMod) + t.Logf("SevenLoginMod:%v\n", SevenLoginMod.MonthReward) } From ee9b19b98c8d4e361982acee534b17e3d8d4ba1c Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:41:40 +0800 Subject: [PATCH 40/46] =?UTF-8?q?=E9=82=80=E8=AF=B7=E5=A5=BD=E5=8F=8B,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=B2=E6=88=90=E5=8A=9F=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/message_handler.go | 5 ++++- src/server/game/mod/invite/invite.go | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/server/game/message_handler.go b/src/server/game/message_handler.go index df0c54b2..1779a079 100644 --- a/src/server/game/message_handler.go +++ b/src/server/game/message_handler.go @@ -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()) diff --git a/src/server/game/mod/invite/invite.go b/src/server/game/mod/invite/invite.go index 4db9e05a..1cc26505 100644 --- a/src/server/game/mod/invite/invite.go +++ b/src/server/game/mod/invite/invite.go @@ -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) { From 31e41bab0f7b58f4989996933ea844e57939c07c Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:54:53 +0800 Subject: [PATCH 41/46] =?UTF-8?q?playroom=E4=BB=BB=E5=8A=A1=E8=BD=AC?= =?UTF-8?q?=E7=9B=98=E5=A5=96=E5=8A=B1=E5=8F=AA=E6=8A=BD=E5=8F=96playroom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/mod/playroom/playroom.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/server/game/mod/playroom/playroom.go b/src/server/game/mod/playroom/playroom.go index 1bcb2639..b2e820b6 100644 --- a/src/server/game/mod/playroom/playroom.go +++ b/src/server/game/mod/playroom/playroom.go @@ -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)} From 7270808f808f9e80582862b9bf4c0465f30233a6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 10:39:34 +0800 Subject: [PATCH 42/46] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=A0=E7=89=A9?= =?UTF-8?q?=E5=B8=81=E6=A0=B9=E6=8D=AE=E8=86=A8=E8=83=80=E7=B3=BB=E6=95=B0?= =?UTF-8?q?=E5=8F=98=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/conf/daily_task/daily_task_cfg.go | 6 +-- src/server/game/mod/collect/Collect.go | 39 +++++++------- src/server/game/mod/daily_task/DailyTask.go | 11 ++-- .../mod/friend_treasure.go/friend_treasure.go | 54 +++++++++---------- .../game/mod/seven_login/seven_login.go | 22 ++------ src/server/game/mod_factory.go | 5 ++ src/server/game/player_data.go | 2 +- src/server/game/register_network_func.go | 6 +-- src/server/game_util/GoUtil.go | 12 +++++ src/server/test/collect_test.go | 14 +++++ 10 files changed, 91 insertions(+), 80 deletions(-) create mode 100644 src/server/test/collect_test.go diff --git a/src/server/conf/daily_task/daily_task_cfg.go b/src/server/conf/daily_task/daily_task_cfg.go index c969b437..a3971b03 100644 --- a/src/server/conf/daily_task/daily_task_cfg.go +++ b/src/server/conf/daily_task/daily_task_cfg.go @@ -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 diff --git a/src/server/game/mod/collect/Collect.go b/src/server/game/mod/collect/Collect.go index d85c5f44..d8e27941 100644 --- a/src/server/game/mod/collect/Collect.go +++ b/src/server/game/mod/collect/Collect.go @@ -43,43 +43,46 @@ func (c *Collect) ensureJackpot() { } // 获取收集奖励 -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.Reward = append(c.Reward, id) + jackpotId := 0 + jackpotId, c.Jackpot = GoUtil.PopSlice(c.Jackpot) c.ensureJackpot() - return collectCfg.GetJackpotItems(JackpotId), nil + items := collectCfg.GetJackpotItems(jackpotId) + items = GoUtil.FormatStarItem(items, factor) + return items, nil } -func (c *Collect) BackData() *msg.ResCollectInfo { - ItemsMsg := make([]*msg.CollectItem, 0, jackpotPreviewSize) +func (c *Collect) BackData(factor int) *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{ + items := collectCfg.GetJackpotItems(c.Jackpot[i]) + items = GoUtil.FormatStarItem(items, factor) + itemsMsg = append(itemsMsg, &msg.CollectItem{ Id: int32(i + 1), - Items: item.ItemToMsg(Items), + 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...) } diff --git a/src/server/game/mod/daily_task/DailyTask.go b/src/server/game/mod/daily_task/DailyTask.go index aadee80a..84406ce0 100644 --- a/src/server/game/mod/daily_task/DailyTask.go +++ b/src/server/game/mod/daily_task/DailyTask.go @@ -2,7 +2,6 @@ package dailyTask import ( "fmt" - "math" dailyTaskCfg "server/conf/daily_task" "server/game/mod/item" "server/game/mod/quest" @@ -73,7 +72,8 @@ func (dt *DailyTaskMod) ZeroUpdate(lv, factor, activityId int) { if err != nil { log.Debug("parse quest err str : %s", questStr) } - items := dailyTaskCfg.GetDailyTaskReward(id, factor, activityId) + items := dailyTaskCfg.GetDailyTaskReward(id, activityId) + items = GoUtil.FormatStarItem(items, factor) dt.DayTask[id] = DailyTask{ Items: items, UnLock: id == 1, @@ -109,12 +109,7 @@ func (dt *DailyTaskMod) WeekUpdate(factor int) { func formatWeekReward(reward map[int]WeekReward, factor int) map[int]WeekReward { for k, v := range reward { - for _, v := range v.Items { - if v.Id == item.ITEM_STAR_ID { - Num := math.Round(float64(v.Num) * float64(factor) / 100) - v.Num = int(Num) / 5 * 5 - } - } + v.Items = GoUtil.FormatStarItem(v.Items, factor) reward[k] = v } return reward diff --git a/src/server/game/mod/friend_treasure.go/friend_treasure.go b/src/server/game/mod/friend_treasure.go/friend_treasure.go index 42689985..05209023 100644 --- a/src/server/game/mod/friend_treasure.go/friend_treasure.go +++ b/src/server/game/mod/friend_treasure.go/friend_treasure.go @@ -66,20 +66,23 @@ 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 } @@ -90,19 +93,18 @@ func (f *FriendTreasureMod) EndGame(factor int) ([]*item.Item, int, error) { 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) - ItemNum = int(float64(ItemNum)*float64(factor)/100/5) * 5 - 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 } // 重置游戏数据 @@ -120,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), diff --git a/src/server/game/mod/seven_login/seven_login.go b/src/server/game/mod/seven_login/seven_login.go index 59361c61..ae523bc8 100644 --- a/src/server/game/mod/seven_login/seven_login.go +++ b/src/server/game/mod/seven_login/seven_login.go @@ -2,7 +2,6 @@ package sevenLogin import ( "fmt" - "math" sevenLoginCfg "server/conf/seven_login" "server/game/mod/item" GoUtil "server/game_util" @@ -130,24 +129,9 @@ func (s *SevenLoginMod) BackData() *msg.ResSevenLogin { func formatSevenReward(reward map[int]Reward, factor int) map[int]Reward { for k, v := range reward { - for _, v := range v.Item1 { - if v.Id == item.ITEM_STAR_ID { - Num := math.Round(float64(v.Num) * float64(factor) / 100) - v.Num = int(Num) / 5 * 5 - } - } - for _, v := range v.Item2 { - if v.Id == item.ITEM_STAR_ID { - Num := math.Round(float64(v.Num) * float64(factor) / 100) - v.Num = int(Num) / 5 * 5 - } - } - for _, v := range v.Item3 { - if v.Id == item.ITEM_STAR_ID { - Num := math.Round(float64(v.Num) * float64(factor) / 100) - v.Num = int(Num) / 5 * 5 - } - } + 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 diff --git a/src/server/game/mod_factory.go b/src/server/game/mod_factory.go index c8d83363..cf3ef97b 100644 --- a/src/server/game/mod_factory.go +++ b/src/server/game/mod_factory.go @@ -7,6 +7,7 @@ import ( "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" @@ -105,3 +106,7 @@ func (p *Player) GetFriendTreasureMod() *friendTreasure.FriendTreasureMod { func (p *Player) GetActivityMod() *activity.Activity { return p.PlayMod.getActivityMod() } + +func (p *Player) GetCollectMod() *collect.Collect { + return p.PlayMod.getCollectMod() +} diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 9b1b196b..1126587d 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -402,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}) diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index d7905d0f..dc29880f 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -4449,7 +4449,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 } @@ -4475,7 +4475,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, @@ -4492,7 +4492,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, }) diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index f6e46086..114e5a21 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/GoUtil.go @@ -12,10 +12,12 @@ 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" @@ -721,3 +723,13 @@ func GetGeoInfo(ip string) (string, string, error) { 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 +} diff --git a/src/server/test/collect_test.go b/src/server/test/collect_test.go new file mode 100644 index 00000000..884a6758 --- /dev/null +++ b/src/server/test/collect_test.go @@ -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) +} From 05c5c5dcaac9b96eb04fe0d99851bf64796a3354 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:20:32 +0800 Subject: [PATCH 43/46] =?UTF-8?q?=E6=8C=96=E7=9F=BF=E6=89=93=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/player_data.go | 6 ++++++ src/server/game/register_network_func.go | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 1126587d..e2a5afe6 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -936,9 +936,15 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error { "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 { diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index dc29880f..df679b7a 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -3210,9 +3210,15 @@ func ReqMiningReward(player *Player, buf []byte) error { }) return err } + 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, + "event_ID": aId, }) player.PushClientRes(&msg.ResMiningReward{ Code: msg.RES_CODE_SUCCESS, From 7b18ddbbdd91aa17c9ba27f35fce5aa25e45d196 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:35:27 +0800 Subject: [PATCH 44/46] =?UTF-8?q?=E6=8C=96=E7=9F=BF=E6=89=93=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/player_data.go | 2 +- src/server/game/register_network_func.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index e2a5afe6..d7fe5240 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -944,7 +944,7 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error { p.TeLog("get_token", map[string]interface{}{ "obtain_way": Label, "get_num": v.Num, - "event_ID": aId, + "event_id": aId, }) } if err != nil { diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index df679b7a..daf9d0e6 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -3217,8 +3217,8 @@ func ReqMiningReward(player *Player, buf []byte) error { } player.TeLog("finish_level", map[string]interface{}{ "expend_token_num": Mining, - "level_ID": MiningMod.Pass - 1, - "event_ID": aId, + "level_id": MiningMod.Pass - 1, + "event_id": aId, }) player.PushClientRes(&msg.ResMiningReward{ Code: msg.RES_CODE_SUCCESS, From fdbeb25af265f6a3ed4a53409047999f97d353e1 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:07:27 +0800 Subject: [PATCH 45/46] =?UTF-8?q?=E4=B8=83=E6=97=A5=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/mod/seven_login/seven_login_func.go | 113 ++++++++++-------- src/server/test/seven_test.go | 2 + 2 files changed, 65 insertions(+), 50 deletions(-) diff --git a/src/server/game/mod/seven_login/seven_login_func.go b/src/server/game/mod/seven_login/seven_login_func.go index 6562e570..f74f471c 100644 --- a/src/server/game/mod/seven_login/seven_login_func.go +++ b/src/server/game/mod/seven_login/seven_login_func.go @@ -46,81 +46,94 @@ func randWeekReward(Add, Type int) map[int]Reward { return result } -func randReward(RewardData *gamedata.SevenLoginRewardData, LastType []int, jackpot []*gamedata.SevenLoginJackpotData, CardPackIds []int, energyPer, EnergyMul float64) (Reward, []int) { +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 := math.Round(float64(RewardData.Energy) * energyPer) - energyNum := float64(int(Num/5)) * 5 - RemainEnergy := RewardData.Energy - energyNum + num := math.Round(float64(rewardData.Energy) * energyPer) + energyNum := float64(int(num/5)) * 5 + remainEnergy := rewardData.Energy - energyNum // 召回玩家 每日体力数*2 - energyNum = energyNum * EnergyMul - Item1 := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(energyNum))} + 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.Energy <= RemainEnergy && !GoUtil.InArray(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) } } - var Item2 []*item.Item - ItemType := []int{} - if RewardData.RewardNum == 3 { - RemainEnergy -= 5 + var items2 []*item.Item + itemType := []int{} + if rewardData.RewardNum == 3 { + remainEnergy -= 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.Energy <= RemainEnergy && 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_ENERGY_ID, int(RemainEnergy))} + if len(cardJackpot) == 0 { + items2 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(remainEnergy))} } else { - Index := rand.IntN(len(CardJackpot)) - ItemType = append(ItemType, CardJackpot[Index].Type) - Item2 = CardJackpot[Index].Items - RemainEnergy -= CardJackpot[Index].Energy + index := rand.IntN(len(cardJackpot)) + itemType = append(itemType, cardJackpot[index].Type) + items2 = cardJackpot[index].Items + remainEnergy -= cardJackpot[index].Energy } } else { - if len(NewJackpot) == 0 { - return Reward{Item1: Item1}, nil + 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 + sort.Slice(newJackpot, func(i, j int) bool { + return newJackpot[i].Energy > newJackpot[j].Energy }) - ItemType = append(ItemType, NewJackpot[0].Type) - Item2 = NewJackpot[0].Items - RemainEnergy -= NewJackpot[0].Energy + itemType = append(itemType, newJackpot[0].Type) + items2 = newJackpot[0].Items + remainEnergy -= newJackpot[0].Energy } - var Item3 []*item.Item - if RewardData.RewardNum == 3 { - RemainEnergy += 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.Energy <= RemainEnergy && !GoUtil.InArray(v.Type, LastType) && !GoUtil.InArray(v.Type, ItemType) { - NewJackpot3 = append(NewJackpot3, v) + if v.Energy <= remainEnergy && !GoUtil.InArray(v.Type, lastType) && !GoUtil.InArray(v.Type, itemType) { + newJackpot3 = append(newJackpot3, v) } } - if len(NewJackpot3) == 0 { - Item3 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(RemainEnergy))} + if len(newJackpot3) == 0 { + items3 = []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, int(remainEnergy))} return Reward{ - Item1: Item1, - Item2: Item2, - Item3: Item3, - }, ItemType + Item1: items1, + Item2: items2, + Item3: items3, + }, itemType } - sort.Slice(NewJackpot3, func(i, j int) bool { - return NewJackpot3[i].Energy > NewJackpot3[j].Energy + sort.Slice(newJackpot3, func(i, j int) bool { + return newJackpot3[i].Energy > newJackpot3[j].Energy }) - Item3 = NewJackpot3[0].Items - ItemType = append(ItemType, NewJackpot3[0].Type) + items3 = newJackpot3[0].Items + itemType = append(itemType, newJackpot3[0].Type) } return Reward{ - Item1: Item1, - Item2: Item2, - Item3: Item3, - }, ItemType + Item1: items1, + Item2: items2, + Item3: items3, + }, itemType } func randMonthReward() map[int]Reward { diff --git a/src/server/test/seven_test.go b/src/server/test/seven_test.go index 8cd74f3d..9e436243 100644 --- a/src/server/test/seven_test.go +++ b/src/server/test/seven_test.go @@ -19,6 +19,7 @@ func TestSevenLoginZeroUpdate(t *testing.T) { p1.InitPlayer("3625212") SevenLoginMod := p1.GetSevenLoginMod() SevenLoginMod.WeekResetTime = 0 + SevenLoginMod.MonthResetTime = 0 SevenLoginMod.ZeroUpdate(0, 0, p1.GetOrderFactor()) SevenLoginMod.BackData() fmt.Printf("order factor:%v\n", p1.GetOrderFactor()) @@ -27,4 +28,5 @@ func TestSevenLoginZeroUpdate(t *testing.T) { fmt.Printf("id :%d ; Reward:%v\n", k, v) } t.Logf("SevenLoginMod:%v\n", SevenLoginMod.MonthReward) + fmt.Printf("SevenLoginMod:%v\n", SevenLoginMod.MonthReward) } From 852eb088faca6a42fa8ab1c781466a29d123da6b Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:25:13 +0800 Subject: [PATCH 46/46] =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=93=81=E5=A5=96?= =?UTF-8?q?=E5=8A=B1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/conf/collect/collect_cfg.go | 9 +++++++++ src/server/game/mod/collect/Collect.go | 23 ++++++++++++++--------- src/server/test/fix_test.go | 3 ++- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/server/conf/collect/collect_cfg.go b/src/server/conf/collect/collect_cfg.go index 0394fff4..7dd75dfe 100644 --- a/src/server/conf/collect/collect_cfg.go +++ b/src/server/conf/collect/collect_cfg.go @@ -56,3 +56,12 @@ func GetRewardType(Id int) int { } return gamedata.GetIntValue(data, "Type") } + +func GetRewardLen() int { + data, err := gamedata.GetData(CFG_COLLECT) + if err != nil { + log.Debug("GetRewardLen err:%v", err) + return 0 + } + return len(data) +} diff --git a/src/server/game/mod/collect/Collect.go b/src/server/game/mod/collect/Collect.go index d8e27941..d6eac176 100644 --- a/src/server/game/mod/collect/Collect.go +++ b/src/server/game/mod/collect/Collect.go @@ -22,7 +22,7 @@ const ( COLLECT_TYPE_FACE = 2 COLLECT_TYPE_AVATAR = 3 - jackpotPreviewSize = 18 // 展示的奖池预览数量,同时作为补充阈値 + jackpotPreviewSize = 9 // 展示的奖池预览数量,同时作为补充阈値 ) func (c *Collect) InitData() { @@ -37,8 +37,12 @@ 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)...) + } } } @@ -56,9 +60,10 @@ func (c *Collect) GetReward(id, num, factor int) ([]*item.Item, error) { } // 领取奖励 c.Reward = append(c.Reward, id) - jackpotId := 0 - jackpotId, c.Jackpot = GoUtil.PopSlice(c.Jackpot) - c.ensureJackpot() + 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 @@ -66,11 +71,11 @@ func (c *Collect) GetReward(id, num, factor int) ([]*item.Item, error) { func (c *Collect) BackData(factor int) *msg.ResCollectInfo { itemsMsg := make([]*msg.CollectItem, 0, jackpotPreviewSize) - for i := 0; i < jackpotPreviewSize; i++ { - items := collectCfg.GetJackpotItems(c.Jackpot[i]) + for k, v := range c.Jackpot { + items := collectCfg.GetJackpotItems(v) items = GoUtil.FormatStarItem(items, factor) itemsMsg = append(itemsMsg, &msg.CollectItem{ - Id: int32(i + 1), + Id: int32(k + 1), Items: item.ItemToMsg(items), }) } diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 7c77ae4b..21afff50 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -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) {