Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2026-04-16 17:39:30 +08:00
commit fd557731a2
11 changed files with 139 additions and 41 deletions

View File

@ -2,7 +2,7 @@
"AppID": 0,
"LogLevel": "debug",
"LogPath": "./log",
"TCPAddr": ":3602",
"TCPAddr": ":3601",
"WSAddr": ":3567",
"RPCAddr": ":50051",
"MySqlAddr": "127.0.0.1",

View File

@ -561,12 +561,11 @@ func G_getGameLogic() *GameLogic {
G_GameLogicPtr.RegisterEvent() // 注册事件
G_GameLogicPtr.RegisterNetWorkFunc() // 注册客户端接口
G_GameLogicPtr.InitActivity() // 初始化活动
G_GameLogicPtr.CreateActivityMgr() //创建活动管理器
if conf.Server.ServerType == "center" {
// G_GameLogicPtr.CreateFriendMgr() //创建好友管理器
G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器
G_GameLogicPtr.CreateVarMgr() // 创建变量管理器
} else {
G_GameLogicPtr.CreateActivityMgr() //创建活动管理器
}
G_GameLogicPtr.CreateRankMgr() //创建排行榜管理器
G_GameLogicPtr.CreateMailMgr() //创建邮件管理器

View File

@ -102,6 +102,8 @@ func (p *Player) ActivityLogin() {
// 猫猫回礼登录
p.CatReturnGiftLogin()
// 赛季活动登录
p.ChampionshipLogin()
}
// 发送活动邮件
@ -185,6 +187,11 @@ func (p *Player) CatReturnGiftLogin() {
p.CatReturnGiftZeroUpdate()
}
func (p *Player) ChampionshipLogin() {
p.ChampionshipZeroUpdate()
p.BackChampship()
}
// 猫猫回礼0点更新
func (p *Player) CatReturnGiftZeroUpdate() {
activityInfo := p.GetActivityInfo(activity.ACT_TYPE_CAT_RETURN_GIFT)
@ -592,16 +599,18 @@ func (p *Player) GetTodayAndYesterdayActivityId(atype int) (int, int) {
}
func (p *Player) ChampionshipZeroUpdate() {
todayActivityId, _ := p.GetChampshipActivityId()
ChampionshipMod := p.PlayMod.getChampshipMod()
aid := ChampionshipMod.AId
activityCfg := G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
if activityCfg.AId != 0 && activityCfg.AId == ChampionshipMod.AId {
return
}
var items []*item.Item
items = p.GetChampshipReward(aid)
items = p.GetChampshipReward(ChampionshipMod.Id)
if len(items) > 0 {
p.SendActivityMail2(items, "backend_championship_mail_title", "backend_championship_mail_content")
p.PushClientRes(p.GetMailMod().BackData())
}
p.PlayMod.getChampshipMod().ZeroUpdate(todayActivityId)
p.PlayMod.getChampshipMod().ZeroUpdate(activityCfg.Id, activityCfg.AId)
}
func (p *Player) GetChampshipReward(id int) []*item.Item {

View File

@ -107,6 +107,41 @@ func (r *ActivityMgr) GetActivityList() []ActivityCfg {
return list
}
func (r *ActivityMgr) GetActivityListByType(atype int) 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 {
if v.Type == atype {
info := v.Copy()
//循环活动,重新计算活动时间
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)
}
} else {
list = append(list, info)
}
}
}
for _, v := range list {
if v.Startime <= GoUtil.Now() && v.Endtime > GoUtil.Now() {
return v
}
}
return ActivityCfg{}
}
func (r *ActivityMgr) GetActivityCfg(Id int) ActivityCfg {
// 获取活动配置
data := r.getData()

View File

@ -326,7 +326,12 @@ func ReqAdminBan(args []interface{}) error {
}
func AcitivityCfgReload() {
G_GameLogicPtr.ActivityMgr.Reload()
if G_GameLogicPtr.ActivityMgr != nil {
G_GameLogicPtr.ActivityMgr.Reload()
}
if G_GameLogicPtr.ChampshipMgr != nil {
go G_GameLogicPtr.ChampshipMgr.ReloadActivity()
}
}
func AdminShipping(req *msg.ReqOrderShipping) (*msg.ResOrderShipping, error) {

View File

@ -10,6 +10,7 @@ import (
faceCfg "server/conf/face"
randnameCfg "server/conf/randname"
"server/db"
"server/game/mod/activity"
"server/game/mod/friend"
"server/game/mod/msg"
GoUtil "server/game_util"
@ -19,6 +20,7 @@ import (
"time"
"gitea.bywaystudios.com/pet_home/leaf/log"
"gitea.bywaystudios.com/pet_home/leaf/timer"
)
const (
@ -29,6 +31,8 @@ type ChampshipMgr struct {
*ServerMod
}
var dispterTimer map[string]*timer.Timer
type ChampshipData struct {
mu sync.RWMutex
AutoId int
@ -42,6 +46,7 @@ type ChampshipData struct {
PreRobot map[int]*ChampshipRobot // 机器人 备份
ZeroTime int64
Version int
Aid int // 当前活动ID
}
type ChampshipRank struct {
@ -86,6 +91,7 @@ type CRank struct {
}
func (c *ChampshipMgr) Init() {
dispterTimer = make(map[string]*timer.Timer, 0)
c.key = CHAMPSHIP_MGR_KEY
c.data = &ChampshipData{
Rank: make(map[int][]*ChampshipRank, 0),
@ -101,20 +107,18 @@ func (c *ChampshipMgr) Init() {
c.version()
now := GoUtil.Now()
zeroTime := GoUtil.ZeroTimestamp()
if c.getData().ZeroTime != zeroTime {
activityCfg := G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
t := c.mDispatr.AfterFunc(time.Duration(activityCfg.Endtime-now)*time.Second, func() {
c.ZeroUpdate()
} else {
c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() {
c.ZeroUpdate()
})
}
})
dispterTimer["zero"] = t
log.Debug("ChampshipMgr init success, activity endtime:%d, now:%d, remain:%d, next zero update time:%s", activityCfg.Endtime, now, activityCfg.Endtime-now, GoUtil.FormatTime(activityCfg.Endtime))
remain := now - zeroTime
remain1 := 1800 - remain%1800
c.mDispatr.AfterFunc(time.Duration(remain1)*time.Second, func() { // 30分钟后重新分组
c.group(false)
c.group()
})
c.mDispatr.AfterFunc(time.Duration(60)*time.Second, func() {
c.ai()
})
@ -140,6 +144,14 @@ func (c *ChampshipMgr) version() {
}
}
}
if c.data.(*ChampshipData).Version == 1 {
c.data.(*ChampshipData).Version = 2
activityCfg := G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
// 如果活动ID没有变化说明没有新的活动不需要重置数据
if activityCfg.AId != 0 && c.data.(*ChampshipData).Aid == 0 {
c.data.(*ChampshipData).Aid = activityCfg.AId
}
}
}
func sortChampionshipRank(rankList []*ChampshipRank) {
@ -171,11 +183,38 @@ func (c *ChampshipMgr) ZeroNotifyAll() (interface{}, error) {
return nil, nil
}
func (c *ChampshipMgr) ReloadActivity() {
activityCfg := G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
log.Debug("championship reload activity %v", activityCfg)
if activityCfg.AId == 0 {
log.Debug("championship reload activity failed, no active, aid:%d", activityCfg.AId)
return
}
t := dispterTimer["zero"]
if t != nil {
t.Stop()
}
timeDuration := activityCfg.Endtime - GoUtil.Now()
t = c.mDispatr.AfterFunc(time.Duration(timeDuration)*time.Second, func() {
c.ZeroUpdate()
})
dispterTimer["zero"] = t
log.Debug("ChampshipMgr reload activity success, activity endtime:%d, now:%d, remain:%d, next zero update time:%s", activityCfg.Endtime, GoUtil.Now(), activityCfg.Endtime-GoUtil.Now(), GoUtil.FormatTime(activityCfg.Endtime))
}
func (c *ChampshipMgr) ZeroUpdate() (interface{}, error) {
c.group(true)
log.Debug("ChampshipMgr ZeroUpdate")
data := c.getData()
data.mu.Lock()
activityCfg := G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
// 如果活动ID没有变化说明没有新的活动不需要重置数据
if activityCfg.AId != 0 && activityCfg.AId == data.Aid {
log.Debug("championship zero update not init by aid %d", data.Aid)
data.mu.Unlock()
return nil, nil
}
log.Debug("championship zero update by aid %d", activityCfg.AId)
data.Aid = activityCfg.AId
data.ZeroTime = GoUtil.ZeroTimestamp()
// 深拷贝 map避免多个协程持有同一个 map 引用导致并发读写
oldRank := make(map[int][]*ChampshipRank, len(data.Rank))
@ -203,14 +242,13 @@ func (c *ChampshipMgr) ZeroUpdate() (interface{}, error) {
c.SetRankCache(k)
}
data.mu.Unlock()
timeDuration := GoUtil.NextZeroTimestampDuration()
if timeDuration <= 0 {
log.Error("championship zero update error")
timeDuration = 24 * 3600
}
c.mDispatr.AfterFunc(time.Duration(timeDuration)*time.Second, func() {
timeDuration := activityCfg.Endtime - GoUtil.Now()
t := c.mDispatr.AfterFunc(time.Duration(timeDuration)*time.Second, func() {
c.ZeroUpdate()
})
dispterTimer["zero"] = t
now := GoUtil.Now()
log.Debug("ChampshipMgr init success, activity endtime:%d, now:%d, remain:%d, next zero update time:%s", activityCfg.Endtime, now, activityCfg.Endtime-now, GoUtil.FormatTime(activityCfg.Endtime))
c.mDispatr.AfterFunc(time.Duration(timeDuration+1800)*time.Second, func() {
c.ZeroNotifyAll()
})
@ -484,14 +522,9 @@ func (c *ChampshipMgr) GetRankMsg(uid int) *proto.ResChampshipRank {
}
// 分组
func (c *ChampshipMgr) group(iszero bool) (interface{}, error) {
now := GoUtil.Now()
zero := GoUtil.ZeroTimestamp()
if now-zero < 1800 && !iszero { // 0点30分钟内不分组
return nil, nil
}
func (c *ChampshipMgr) group() (interface{}, error) {
c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { // 30分钟后重新分组
c.group(false)
c.group()
})
ChampshipData := c.getData()
ChampshipData.mu.Lock()
@ -1043,7 +1076,7 @@ func (c *ChampshipMgr) Debug() {
H: GoUtil.RandNum(1, 99),
}
}
c.group(true)
c.group()
var i int
for _, v := range ChampshipData.Rank {
for _, v1 := range v {

View File

@ -221,7 +221,7 @@ func NotifyAllPlayerMsg(m *msg.Msg) {
}
func ChampshipGroupHandler(data *msg.Msg) (interface{}, error) {
G_GameLogicPtr.ChampshipMgr.group(true)
G_GameLogicPtr.ChampshipMgr.group()
return nil, nil
}

View File

@ -15,19 +15,23 @@ type ChampshipMod struct {
RankReward bool
PreMax int // 昨日最高档
Max int // 历史最高档
AId int // 活动id
LastAId int // 上次活动id
AId int // 活动aid 当前活动开始时间戳
LastAId int // 上次活动aid
Id int // 活动配置id
LastId int
}
func (c *ChampshipMod) InitData() {}
func (c *ChampshipMod) ZeroUpdate(aid int) {
func (c *ChampshipMod) ZeroUpdate(id, aid int) {
c.PreMax = c.Reward
c.Score = 0
c.Reward = 0
c.RankReward = false
c.LastAId = c.AId
c.AId = aid
c.LastId = c.Id
c.Id = id
}
func (c *ChampshipMod) GetScore() int {
@ -100,6 +104,6 @@ func (c *ChampshipMod) GetN() int {
return c.Max
}
func (c *ChampshipMod) GetAId() int {
return c.AId
func (c *ChampshipMod) GetId() int {
return c.Id
}

View File

@ -291,6 +291,7 @@ func (p *Player) InitPlayer(UserName string) error {
p.FixDecorate()
p.FixPlayroomPyhical()
p.FixPlayroomInteract()
p.FixChampionshipActivity()
return nil
}
@ -354,6 +355,7 @@ func (p *Player) InitPlayerByUid(Uid int) error {
p.FixDecorate()
p.FixPlayroomPyhical()
p.FixPlayroomInteract()
p.FixChampionshipActivity()
return nil
}
@ -418,8 +420,6 @@ func (p *Player) ZeroUpdate(a []interface{}) {
PlayroomMod.ResetWeeklyDiscount()
}
p.PlayroomBackData()
p.ChampionshipZeroUpdate()
p.BackChampship()
// p.InitActivity()
// p.ActivityZeroUpdate()
@ -1495,6 +1495,15 @@ func (p *Player) FixPlayroomInteract() {
}
}
func (p *Player) FixChampionshipActivity() {
activityCfg := G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
ChampshipMod := p.PlayMod.getChampshipMod()
if activityCfg.Id != 0 && ChampshipMod.Id == 0 {
ChampshipMod.Id = activityCfg.Id
ChampshipMod.AId = activityCfg.AId
}
}
func (p *Player) GetOrderFactor() int {
return orderCfg.GetOrderFactor(p.GetDecorateMod().AreaId)
}

View File

@ -2549,7 +2549,7 @@ func ReqChampship(player *Player, req *msg.ReqChampship) error {
func ReqChampshipReward(player *Player, req *msg.ReqChampshipReward) error {
ChampshipMod := player.PlayMod.getChampshipMod()
rewardId := ChampshipMod.Reward
itemList := player.GetChampshipReward(ChampshipMod.GetAId())
itemList := player.GetChampshipReward(ChampshipMod.GetId())
err := player.HandleItem(itemList, msg.ITEM_POP_LABEL_ChampshipReward.String())
if err != nil {
player.SendErrClienRes(&msg.ResChampshipReward{

View File

@ -2,6 +2,8 @@ package unit
import (
"fmt"
"server/game"
"server/game/mod/activity"
"testing"
)
@ -9,9 +11,11 @@ func TestChampionshipReward(t *testing.T) {
player := getTestPlayer()
player.GetChampshipMod().AddScore([]int{15, 15, 15})
todayAid, yestAid := player.GetChampshipActivityId()
activityCfg := game.G_GameLogicPtr.ActivityMgr.GetActivityListByType(activity.ACT_TYPE_CHAMPION)
fmt.Printf("activity cfg : %v\n", activityCfg)
items := player.GetChampshipReward(todayAid)
fmt.Printf("today id %d items : %v\n", todayAid, items)
player.GetChampshipMod().ZeroUpdate(todayAid)
player.GetChampshipMod().ZeroUpdate(activityCfg.Id, activityCfg.AId)
player.GetChampshipMod().AddScore([]int{15, 15, 15})
yestAid = 0
items = player.GetChampshipReward(yestAid)