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/activity_mgr.go b/src/server/game/activity_mgr.go index e21c42ac..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,23 +87,22 @@ func (r *ActivityMgr) GetActivityList() []ActivityCfg { list := make([]ActivityCfg, 0, len(data.List)) now := GoUtil.Now() for _, v := range data.List { + info := v.Copy() //循环活动,重新计算活动时间 - if v.Interval > 0 { - if now > v.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 - } + if info.Interval > 0 { + info.AId = int(info.Startime) + list = append(list, info) + internal := (now - info.Startime) / info.Interval + for i := int64(0); i <= internal; i++ { + newInfo := info.Copy() + newInfo.Startime += info.Interval + newInfo.Endtime += info.Interval + newInfo.AId = int(newInfo.Startime) //活动id用开始时间表示,方便客户端排序 + list = append(list, newInfo) } - v.AId = int(v.Startime) //活动id用开始时间表示,方便客户端排序 } else { - v.AId = v.Id + list = append(list, info) } - list = append(list, *v) } return list } 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/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 +} 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 } // 获取玩家简单数据 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