From a203d5e4850a571fcec6968a141fd59edbf78c80 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:44:34 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=A6=E6=A0=87?= =?UTF-8?q?=E8=B5=9B=E6=B4=BB=E5=8A=A8=E5=BC=80=E5=A7=8B=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/player_back.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/game/player_back.go b/src/server/game/player_back.go index 19e7afd2..f99d70ed 100644 --- a/src/server/game/player_back.go +++ b/src/server/game/player_back.go @@ -324,6 +324,7 @@ func (p *Player) BackChampship() { res.Title = cfg.Title } if activityInfo != nil { + res.StartTime = int32(activityInfo.StartT) res.EndTime = int32(activityInfo.EndT) } res.Cfg = cfg From 4a1c14dbbf0058fbf5ec9970f20e744a667ecbd4 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:24:28 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E9=94=A6=E6=A0=87=E8=B5=9B=E6=B8=85?= =?UTF-8?q?=E7=90=86=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/player_back.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/server/game/player_back.go b/src/server/game/player_back.go index f99d70ed..7c8e8413 100644 --- a/src/server/game/player_back.go +++ b/src/server/game/player_back.go @@ -315,7 +315,11 @@ func (p *Player) BackChampship() { res := ChampshipMod.BackData(rank, preRank, todayActivityId, yesterdayActivityId) cfg := G_GameLogicPtr.ActivityMgr.GetChampshipCfg(todayActivityId) res.EndTime = int32(GoUtil.ZeroTimestamp() + 86400) - if cfg != nil && GoUtil.Now()-GoUtil.ZeroTimestamp() >= int64(cfg.ClearTime) { + if activityInfo != nil { + res.StartTime = int32(activityInfo.StartT) + res.EndTime = int32(activityInfo.EndT) + } + if cfg != nil && GoUtil.Now()-int64(res.StartTime) >= int64(cfg.ClearTime) { res.Status = 1 } else { cfg = G_GameLogicPtr.ActivityMgr.GetChampshipCfg(yesterdayActivityId) @@ -323,10 +327,7 @@ func (p *Player) BackChampship() { if cfg != nil { res.Title = cfg.Title } - if activityInfo != nil { - res.StartTime = int32(activityInfo.StartT) - res.EndTime = int32(activityInfo.EndT) - } + res.Cfg = cfg p.PushClientRes(res) } From a2189782be368161c46636d0d1d23fe2d230e2eb Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:37:02 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E9=94=A6=E6=A0=87=E8=B5=9B=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/unit_test/championship_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/unit_test/championship_test.go b/src/server/unit_test/championship_test.go index 9b658f90..51d57256 100644 --- a/src/server/unit_test/championship_test.go +++ b/src/server/unit_test/championship_test.go @@ -45,3 +45,8 @@ func TestChampionshipZeroUpdate(t *testing.T) { fmt.Printf("before zero update today id %d score : %d\n", todayAid, player.GetChampshipMod().GetScore()) player.ChampionshipZeroUpdate() } + +func TestChampionshipBack(t *testing.T) { + player := getTestPlayer() + player.BackChampship() +} From 6b379a2de51ce64193349c7d4ba0f92a87393def Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:09:01 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E9=94=A6=E6=A0=87=E8=B5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/activity_func.go | 2 +- src/server/game/activity_mgr.go | 52 ++++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index aba0ff84..4d96c9d4 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -531,7 +531,7 @@ func (p *Player) CatnipBackData() { func (p *Player) GetChampshipActivityId() (int, int) { var todayActivityId int var yesterdayActivityId int - activiyCfgList := G_GameLogicPtr.ActivityMgr.GetActivityList() + activiyCfgList := G_GameLogicPtr.ActivityMgr.GetChampshipCfgList() now := GoUtil.Now() level := p.GetBaseMod().GetLevel() type sortData struct { diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index e21c42ac..d3f3d728 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -70,23 +70,55 @@ func (r *ActivityMgr) GetActivityList() []ActivityCfg { list := make([]ActivityCfg, 0, len(data.List)) now := GoUtil.Now() for _, v := range data.List { + info := *v //循环活动,重新计算活动时间 - if v.Interval > 0 { - if now > v.Endtime { + if info.Interval > 0 { + if now >= info.Endtime { //活动已结束,计算下一次活动时间 - interval := (now - v.Startime) / v.Interval - v.Startime += interval * v.Interval - v.Endtime += interval * v.Interval - if now > v.Endtime { - v.Startime += v.Interval - v.Endtime += v.Interval + interval := (now - info.Startime) / info.Interval + info.Startime += interval * info.Interval + info.Endtime += interval * info.Interval + if now > info.Endtime { + info.Startime += info.Interval + info.Endtime += info.Interval } } - v.AId = int(v.Startime) //活动id用开始时间表示,方便客户端排序 + v.AId = int(info.Startime) //活动id用开始时间表示,方便客户端排序 } else { v.AId = v.Id } - list = append(list, *v) + list = append(list, info) + } + return list +} + +func (r *ActivityMgr) GetChampshipCfgList() []ActivityCfg { + // 获取活动列表 + data := r.getData() + data.mu.Lock() + defer data.mu.Unlock() + list := make([]ActivityCfg, 0, len(data.List)) + now := GoUtil.Now() + for _, v := range data.List { + info := *v + if info.Type != activity.ACT_TYPE_CHAMPION { + continue + } + //循环活动,重新计算活动时间 + if info.Interval > 0 { + v.AId = int(info.Startime) + list = append(list, info) + internal := (now - info.Startime) / info.Interval + for i := int64(0); i <= internal; i++ { + v.Startime += info.Interval + v.Endtime += info.Interval + v.AId = int(info.Startime) //活动id用开始时间表示,方便客户端排序 + list = append(list, info) + } + } else { + info.AId = info.Id + list = append(list, info) + } } return list } From e0b73ccf6fe2dd8bc00a3c0a0c713367aa3a297b Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 14 Apr 2026 10:03:33 +0800 Subject: [PATCH 5/8] =?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/game/activity_func.go | 2 +- src/server/game/activity_mgr.go | 64 ++++++++++++-------------------- 2 files changed, 25 insertions(+), 41 deletions(-) diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 4d96c9d4..aba0ff84 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -531,7 +531,7 @@ func (p *Player) CatnipBackData() { func (p *Player) GetChampshipActivityId() (int, int) { var todayActivityId int var yesterdayActivityId int - activiyCfgList := G_GameLogicPtr.ActivityMgr.GetChampshipCfgList() + activiyCfgList := G_GameLogicPtr.ActivityMgr.GetActivityList() now := GoUtil.Now() level := p.GetBaseMod().GetLevel() type sortData struct { diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index d3f3d728..4e13ff45 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -44,6 +44,23 @@ func (ac *ActivityCfg) String() string { ac.Id, ac.Type, ac.Startime, ac.Endtime, ac.Level, ac.Title, ac.MailTitle, ac.MailContent, ac.cfg, ac.Extra) } +func (ac *ActivityCfg) Copy() ActivityCfg { + return ActivityCfg{ + Id: ac.Id, + AId: ac.AId, + Type: ac.Type, + Startime: ac.Startime, + Endtime: ac.Endtime, + Level: ac.Level, + Title: ac.Title, + MailTitle: ac.MailTitle, + MailContent: ac.MailContent, + cfg: ac.cfg, + Interval: ac.Interval, + Extra: ac.Extra, + } +} + const () func (r *ActivityMgr) Init() { @@ -70,53 +87,20 @@ func (r *ActivityMgr) GetActivityList() []ActivityCfg { list := make([]ActivityCfg, 0, len(data.List)) now := GoUtil.Now() for _, v := range data.List { - info := *v + info := v.Copy() //循环活动,重新计算活动时间 if info.Interval > 0 { - if now >= info.Endtime { - //活动已结束,计算下一次活动时间 - interval := (now - info.Startime) / info.Interval - info.Startime += interval * info.Interval - info.Endtime += interval * info.Interval - if now > info.Endtime { - info.Startime += info.Interval - info.Endtime += info.Interval - } - } - v.AId = int(info.Startime) //活动id用开始时间表示,方便客户端排序 - } else { - v.AId = v.Id - } - list = append(list, info) - } - return list -} - -func (r *ActivityMgr) GetChampshipCfgList() []ActivityCfg { - // 获取活动列表 - data := r.getData() - data.mu.Lock() - defer data.mu.Unlock() - list := make([]ActivityCfg, 0, len(data.List)) - now := GoUtil.Now() - for _, v := range data.List { - info := *v - if info.Type != activity.ACT_TYPE_CHAMPION { - continue - } - //循环活动,重新计算活动时间 - if info.Interval > 0 { - v.AId = int(info.Startime) + info.AId = int(info.Startime) list = append(list, info) internal := (now - info.Startime) / info.Interval for i := int64(0); i <= internal; i++ { - v.Startime += info.Interval - v.Endtime += info.Interval - v.AId = int(info.Startime) //活动id用开始时间表示,方便客户端排序 - list = append(list, info) + newInfo := info.Copy() + newInfo.Startime += info.Interval + newInfo.Endtime += info.Interval + newInfo.AId = int(newInfo.Startime) //活动id用开始时间表示,方便客户端排序 + list = append(list, newInfo) } } else { - info.AId = info.Id list = append(list, info) } } From 66995cc63d407ffc1d5213aacddd195655fddaf4 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 14 Apr 2026 10:51:23 +0800 Subject: [PATCH 6/8] =?UTF-8?q?gm=E5=91=BD=E4=BB=A4=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 | 6 +++++- src/server/game/player_data.go | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index bda7fa03..4dfbd304 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -529,7 +529,11 @@ func ReqGmCommand_(player *Player, Command string) error { case "copyUser": p1 := new(Player) p1.M_DwUin = int64(GoUtil.Int(arg[1])) - p1.InitPlayerOnly() + err := p1.InitPlayerOnly() + if err != nil { + log.Error("failed to initialize player: %v", err) + return err + } BaseMod := p1.PlayMod.getBaseMod() BaseMod.Uid = player.M_DwUin BaseMod.NickName = player.PlayMod.getBaseMod().NickName diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 4dba3fd2..2a8ec9d5 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -1052,7 +1052,7 @@ func (p *Player) LoginBackData() { p.BackUserInfo() } -func (p *Player) InitPlayerOnly() { +func (p *Player) InitPlayerOnly() error { p.lock.Lock() defer p.lock.Unlock() p.Msg = make([]PlayerMsg, 0) @@ -1068,7 +1068,7 @@ func (p *Player) InitPlayerOnly() { // 玩家基础数据 ok := Base.GetDataByUid(p.M_DwUin) if !ok { - return + return errors.New("player base data load failed") } p.PlayerBaseMod = Base p.M_DwUin = Base.Data.DwUin @@ -1077,10 +1077,11 @@ func (p *Player) InitPlayerOnly() { modData := &PlayerModData{PlayerData: NewPlayerData("PlayerModData", p)} ok = modData.LoadDataFromDB(Base.Data.DwUin) if !ok { - return + return errors.New("player mod data load failed") } modData.InitMod(p) p.PlayMod.mod_list = modData.ModList + return nil } // 获取玩家简单数据 From 9f54f3733a11e1ab174b67981220ddbe08dd82d6 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 14 Apr 2026 12:14:42 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E7=8C=AB=E7=8C=AB=E5=9B=9E=E7=A4=BC?= =?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/activity_func.go | 47 ++++++++++++++++++- .../mod/cat_return_gift/cat_return_gift.go | 20 ++++++-- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index aba0ff84..d9a0723c 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -562,6 +562,40 @@ func (p *Player) GetChampshipActivityId() (int, int) { return todayActivityId, yesterdayActivityId } +func (p *Player) GetTodayAndYesterdayActivityId(atype int) (int, int) { + var todayActivityId int + var yesterdayActivityId int + activiyCfgList := G_GameLogicPtr.ActivityMgr.GetActivityList() + now := GoUtil.Now() + level := p.GetBaseMod().GetLevel() + type sortData struct { + Id int + EndTime int64 + } + var sortList []sortData + for _, v := range activiyCfgList { + if v.Type != atype { + continue + } + if v.Level > level { + continue + } + if v.Startime <= now && v.Endtime >= now { + todayActivityId = v.Id + } + if v.Endtime < now { + sortList = append(sortList, sortData{Id: v.Id, EndTime: v.Endtime}) + } + } + if len(sortList) > 0 { + sort.Slice(sortList, func(i, j int) bool { + return sortList[i].EndTime > sortList[j].EndTime + }) + yesterdayActivityId = sortList[0].Id + } + return todayActivityId, yesterdayActivityId +} + func (p *Player) ChampionshipZeroUpdate() { todayActivityId, _ := p.GetChampshipActivityId() ChampionshipMod := p.PlayMod.getChampshipMod() @@ -662,17 +696,26 @@ func (p *Player) CatReturnGiftBackData() { if activityInfo == nil { return } + _, YestdayAid := p.GetTodayAndYesterdayActivityId(activity.ACT_TYPE_CAT_RETURN_GIFT) cfg := G_GameLogicPtr.ActivityMgr.GetCatReturnGiftCfg(activityInfo.Id) if cfg == nil { return } CatReturnGiftMod := p.GetCatReturnGiftMod() + score := CatReturnGiftMod.GetScore() + reward := CatReturnGiftMod.GetReward() + // 清理期展示旧活动配置 + if GoUtil.Now()-activityInfo.StartT < int64(cfg.ClearTime) { + cfg = G_GameLogicPtr.ActivityMgr.GetCatReturnGiftCfg(YestdayAid) + score = CatReturnGiftMod.GetLastScore() + reward = CatReturnGiftMod.GetLastReward() + } res := &msg.ResCatReturnGift{ StartTime: activityInfo.StartT, EndTime: activityInfo.EndT, Cfg: cfg, - Score: int32(CatReturnGiftMod.GetScore()), - Reward: int32(CatReturnGiftMod.GetReward()), + Score: int32(score), + Reward: int32(reward), } p.PushClientRes(res) } diff --git a/src/server/game/mod/cat_return_gift/cat_return_gift.go b/src/server/game/mod/cat_return_gift/cat_return_gift.go index 8a7aa6be..b158e948 100644 --- a/src/server/game/mod/cat_return_gift/cat_return_gift.go +++ b/src/server/game/mod/cat_return_gift/cat_return_gift.go @@ -1,10 +1,12 @@ package catreturngift type CatReturnGiftMod struct { - Id int - AId int - Score int - Reward int + Id int + AId int + Score int + Reward int + LastScore int + LastReward int } func (c *CatReturnGiftMod) InitData() {} @@ -24,6 +26,8 @@ func (c *CatReturnGiftMod) Login(id, aid int) (int, int, int) { } score := c.Score reward := c.Reward + c.LastScore = score + c.LastReward = reward c.AId = aid c.Id = id c.Score = 0 @@ -46,3 +50,11 @@ func (c *CatReturnGiftMod) AddScore(score int) { func (c *CatReturnGiftMod) SetReward(reward int) { c.Reward = reward } + +func (c *CatReturnGiftMod) GetLastReward() int { + return c.LastReward +} + +func (c *CatReturnGiftMod) GetLastScore() int { + return c.LastScore +} From 1f3a97e323d33cb8e99a7402b6f6327343341936 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 14 Apr 2026 14:33:00 +0800 Subject: [PATCH 8/8] =?UTF-8?q?sql=E8=AF=AD=E5=8F=A5=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/sql/Merge_Pet.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/sql/Merge_Pet.sql b/src/server/sql/Merge_Pet.sql index f89fa039..6633c6e3 100644 --- a/src/server/sql/Merge_Pet.sql +++ b/src/server/sql/Merge_Pet.sql @@ -165,5 +165,6 @@ CREATE TABLE IF NOT EXISTS t_activity_mod ( `cfg` TEXT COMMENT '活动配置', `cfg_buf` BLOB COMMENT '活动配置buf', `extra` TEXT COMMENT '活动额外数据', - `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间' + `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + `interval` int unsigned NOT NULL DEFAULT '0' COMMENT '活动开始间隔时间,单位秒,0表示不循环' ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci COMMENT = '系统活动表'; \ No newline at end of file