锦标赛优化

This commit is contained in:
hahwu 2024-11-26 17:17:14 +08:00
parent 1e345f4ca1
commit 7655b2c96f
15 changed files with 2311 additions and 1571 deletions

View File

@ -4,6 +4,7 @@ import (
"server/GoUtil"
champshipCfg "server/conf/champship"
"server/game/mod/msg"
proto "server/msg"
"sort"
"time"
)
@ -20,10 +21,12 @@ type ChampshipData struct {
AutoId int
RobotId int
Rank map[int][]*ChampshipRank // 锦标赛排行榜
Last map[int][]*ChampshipRank // 锦标赛排行榜 备份
PreRank map[int][]*ChampshipRank // 锦标赛排行榜 备份
Pool map[int]*GroupInfo // 锦标赛未分配玩家
GroupInfo map[int]int // 锦标赛分组信息
PreGroupInfo map[int]int // 锦标赛分组信息 备份
Robot map[int]*ChampshipRobot // 机器人
PreRobot map[int]*ChampshipRobot // 机器人 备份
}
type ChampshipRank struct {
@ -43,6 +46,7 @@ type ChampshipRobot struct {
GroupId int
Time int64
Score float64
PerScore float64
}
type GroupInfo struct {
@ -64,38 +68,237 @@ func (c *ChampshipMgr) Init() {
c.key = CHAMPSHIP_MGR_KEY
c.data = &ChampshipData{
Rank: make(map[int][]*ChampshipRank, 0),
Last: make(map[int][]*ChampshipRank, 0),
PreRank: make(map[int][]*ChampshipRank, 0),
Pool: make(map[int]*GroupInfo, 0),
GroupInfo: make(map[int]int),
PreGroupInfo: make(map[int]int),
Robot: make(map[int]*ChampshipRobot, 0),
PreRobot: make(map[int]*ChampshipRobot, 0),
}
// 注册处理函数
c.init()
c.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_GROUP, c.group)
c.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, c.inRank)
c.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_AI, c.ai)
c.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_ZERO, c.ZeroUpdate)
Now := GoUtil.Now()
ZeroTime := GoUtil.ZeroTimestamp()
Remain := max(Now-ZeroTime, 3000)
Remain := Now - ZeroTime
Remain1 := 1800 - Remain%1800
c.mDispatr.AfterFunc(time.Duration(Remain1), func() {
c.mDispatr.AfterFunc(time.Duration(Remain1)*time.Second, func() {
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_GROUP,
})
})
c.mDispatr.AfterFunc(time.Duration(60)*time.Second, func() {
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_AI,
})
})
c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() {
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_ZERO,
})
})
}
func (c *ChampshipMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
c.getData().Last = c.getData().Rank
c.getData().PreRank = c.getData().Rank
c.getData().PreRobot = c.getData().Robot
c.getData().PreGroupInfo = c.getData().GroupInfo
c.getData().Robot = make(map[int]*ChampshipRobot, 0)
c.getData().Rank = make(map[int][]*ChampshipRank, 0)
c.getData().GroupInfo = make(map[int]int, 0)
c.update = true
c.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() {
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_ZERO,
})
})
return nil, nil
}
func (c *ChampshipMgr) ai(m *msg.Msg) (interface{}, error) {
ChampshipData := c.getData()
Now := GoUtil.Now()
for k, v := range ChampshipData.Rank {
Notify := make(map[int]int)
for e, r := range v {
if r.Type == RANK_PLAYER_ROBOT {
AddScore := 0
Robot := ChampshipData.Robot[r.Uid]
if Robot == nil {
continue
}
if Robot.Type == 2 && Robot.Time+60 < Now {
AddScore = int(Robot.PerScore)
Robot.Time = Now
}
if Robot.Type == 3 && Robot.Time+1800 < Now {
AddScore = int(Robot.PerScore)
Robot.Time = Now
}
r.Score += float64(AddScore)
} else {
Notify[r.Uid] = e
}
}
sort.Slice(v, func(i, j int) bool { // 排序 从大到小 数值相等按时间排序
if v[i].Score > v[j].Score {
return true
} else if v[i].Score == v[j].Score {
return v[i].Time < v[j].Time
}
return false
})
for e, r := range v {
if r.Type == RANK_PLAYER_ROBOT {
continue
}
if Notify[r.Uid] != e {
NotifyPlayer(r.Uid, &msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY,
})
}
}
ChampshipData.Rank[k] = v
}
c.mDispatr.AfterFunc(time.Duration(60)*time.Second, func() {
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_AI,
})
})
return nil, nil
}
func (c *ChampshipMgr) GetPreRankMsg(Uid int) *proto.ResChampshipPreRank {
ChampshipData := c.getData()
GroupId := ChampshipData.GroupInfo[Uid]
if GroupId == 0 {
return &proto.ResChampshipPreRank{}
}
RankList, ok := ChampshipData.Rank[GroupId]
if !ok {
return &proto.ResChampshipPreRank{}
}
MyRank := 0
MyScore := 0.0
RL := make(map[int32]*proto.ResPlayerRank, 0)
for k, v := range RankList {
if v.Uid == Uid {
MyRank = k + 1
MyScore = v.Score
}
if v.Type == RANK_PLAYER_ROBOT {
Robot := ChampshipData.Robot[v.Uid]
if Robot == nil {
continue
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int32(v.Uid),
Score: float32(v.Score),
Name: Robot.Name,
Avatar: int32(Robot.Avatar),
Face: int32(Robot.Face),
Level: int32(Robot.Level),
}
} else {
SimplePlayer := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if SimplePlayer == nil {
continue
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int32(v.Uid),
Score: float32(v.Score),
Name: SimplePlayer.Name,
Avatar: int32(SimplePlayer.Avatar),
Face: int32(SimplePlayer.Face),
Level: int32(SimplePlayer.Level),
}
}
}
return &proto.ResChampshipPreRank{
MyRank: int32(MyRank),
MyScore: float32(MyScore),
RankList: RL,
}
}
func (c *ChampshipMgr) GetRankMsg(Uid int) *proto.ResChampshipRank {
ChampshipData := c.getData()
GroupId := ChampshipData.GroupInfo[Uid]
if GroupId == 0 {
return &proto.ResChampshipRank{}
}
RankList, ok := ChampshipData.Rank[GroupId]
if !ok {
return &proto.ResChampshipRank{}
}
MyRank := 0
MyScore := 0.0
RL := make(map[int32]*proto.ResPlayerRank, 0)
for k, v := range RankList {
if v.Uid == Uid {
MyRank = k + 1
MyScore = v.Score
}
if v.Type == RANK_PLAYER_ROBOT {
Robot := ChampshipData.Robot[v.Uid]
if Robot == nil {
continue
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int32(v.Uid),
Score: float32(v.Score),
Name: Robot.Name,
Avatar: int32(Robot.Avatar),
Face: int32(Robot.Face),
Level: int32(Robot.Level),
}
} else {
SimplePlayer := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if SimplePlayer == nil {
continue
}
RL[int32(k+1)] = &proto.ResPlayerRank{
Uid: int32(v.Uid),
Score: float32(v.Score),
Name: SimplePlayer.Name,
Avatar: int32(SimplePlayer.Avatar),
Face: int32(SimplePlayer.Face),
Level: int32(SimplePlayer.Level),
}
}
}
return &proto.ResChampshipRank{
MyRank: int32(MyRank),
MyScore: float32(MyScore),
RankList: RL,
}
}
// 分组
func (c *ChampshipMgr) group(m *msg.Msg) (interface{}, error) {
c.mDispatr.AfterFunc(time.Duration(1800)*time.Second, func() { // 30分钟后重新分组
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_GROUP,
})
})
Now := GoUtil.Now()
Zero := GoUtil.ZeroTimestamp()
if Now-Zero < 1800 { // 0点30分钟内不分组
return nil, nil
}
ChampshipData := c.getData()
if len(ChampshipData.Pool) == 0 { // 未分配玩家池为空
return nil, nil
}
g := make(map[int][]int, 0)
for k, v := range ChampshipData.Pool {
for k, v := range ChampshipData.Pool { // step 1:根据数值分配玩家
x := 0
n := champshipCfg.GetGroupId(v.N)
h := champshipCfg.GetGroupId(v.H)
@ -136,26 +339,26 @@ func (c *ChampshipMgr) group(m *msg.Msg) (interface{}, error) {
}
return false
})
if (j+1)/10 == 0 {
if len(ChampshipData.Rank[ChampshipData.AutoId]) == 10 {
ChampshipData.AutoId++
}
}
for j := StartId; j <= ChampshipData.AutoId; j++ {
for j := StartId; j <= ChampshipData.AutoId; j++ { // 填充机器人
RobotNum := 30 - len(ChampshipData.Rank[j])
RobotList := CreateRobotList(i, RobotNum, j)
for _, v := range RobotList {
ChampshipData.Robot[ChampshipData.RobotId] = v
ChampshipData.Rank[ChampshipData.AutoId] = append(ChampshipData.Rank[ChampshipData.AutoId], &ChampshipRank{
ChampshipData.Rank[j] = append(ChampshipData.Rank[j], &ChampshipRank{
Uid: ChampshipData.RobotId,
Score: v.Score,
Time: v.Time,
Type: RANK_PLAYER_ROBOT,
})
sort.Slice(ChampshipData.Rank[ChampshipData.AutoId], func(i, j int) bool { // 排序 从大到小 数值相等按时间排序
if ChampshipData.Rank[ChampshipData.AutoId][i].Score > ChampshipData.Rank[ChampshipData.AutoId][j].Score {
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[ChampshipData.AutoId][i].Score == ChampshipData.Rank[ChampshipData.AutoId][j].Score {
return ChampshipData.Rank[ChampshipData.AutoId][i].Time < ChampshipData.Rank[ChampshipData.AutoId][j].Time
} 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
})
@ -163,18 +366,18 @@ func (c *ChampshipMgr) group(m *msg.Msg) (interface{}, error) {
}
}
}
T := time.Now()
H := T.Hour()
if H != 0 {
c.mDispatr.AfterFunc(time.Duration(1800), func() {
c.Send(&msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_GROUP,
})
for k := range ChampshipData.Pool { // 分组完成通知
NotifyPlayer(k, &msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY,
})
}
c.getData().Pool = make(map[int]*GroupInfo) // 清空未分配池
return nil, nil
}
// 获取分组ID
func (c *ChampshipMgr) getGroupId(Uid int) int {
ChampshipData := c.getData()
GroupId, ok := ChampshipData.GroupInfo[Uid]
@ -199,26 +402,87 @@ func (c *ChampshipMgr) inRank(m *msg.Msg) (interface{}, error) {
}
return nil, nil
}
_, ok := ChampshipData.Rank[GroupId]
RankList, ok := ChampshipData.Rank[GroupId]
if !ok {
ChampshipData.Rank[GroupId] = make([]*ChampshipRank, 0)
}
ChampshipData.Rank[GroupId] = append(ChampshipData.Rank[GroupId], &ChampshipRank{
inRank := false
Notify := make(map[int]int)
for k, v := range RankList {
if v.Uid == data.Uid {
if v.Score < data.Score {
v.Score = data.Score
v.Time = GoUtil.Now()
inRank = true
break
}
return nil, nil
}
Notify[v.Uid] = k
}
if !inRank {
RankList = append(RankList, &ChampshipRank{
Uid: data.Uid,
Score: data.Score,
Time: GoUtil.Now(),
})
sort.Slice(ChampshipData.Rank[GroupId], func(i, j int) bool { // 排序 从大到小 数值相等按时间排序
if ChampshipData.Rank[GroupId][i].Score > ChampshipData.Rank[GroupId][j].Score {
}
sort.Slice(RankList, func(i, j int) bool { // 排序 从大到小 数值相等按时间排序
if RankList[i].Score > RankList[j].Score {
return true
} else if ChampshipData.Rank[GroupId][i].Score == ChampshipData.Rank[GroupId][j].Score {
return ChampshipData.Rank[GroupId][i].Time < ChampshipData.Rank[GroupId][j].Time
} else if RankList[i].Score == RankList[j].Score {
return RankList[i].Time < RankList[j].Time
}
return false
})
for k, v := range RankList {
if Notify[v.Uid] != k {
NotifyPlayer(v.Uid, &msg.Msg{
Type: msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY,
})
}
}
ChampshipData.Rank[GroupId] = RankList
return nil, nil
}
func (c *ChampshipMgr) getMyRank(Uid int) int {
ChampshipData := c.getData()
GroupId := ChampshipData.GroupInfo[Uid]
if GroupId == 0 {
return 0
}
RankList, ok := ChampshipData.Rank[GroupId]
if !ok {
return 0
}
for k, v := range RankList {
if v.Uid == Uid {
return k + 1
}
}
return 0
}
func (c *ChampshipMgr) getLastMyRank(Uid int) int {
ChampshipData := c.getData()
GroupId := ChampshipData.PreGroupInfo[Uid]
if GroupId == 0 {
return 0
}
RankList, ok := ChampshipData.PreRank[GroupId]
if !ok {
return 0
}
for k, v := range RankList {
if v.Uid == Uid {
return k + 1
}
}
return 0
}
func (c *ChampshipMgr) getData() *ChampshipData {
return c.data.(*ChampshipData)
}
@ -231,13 +495,14 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
r = append(r, CreateRobot(float64(GoUtil.RandNum(7531, 12180)), GroupId))
r = append(r, CreateRobot(float64(GoUtil.RandNum(4631, 7530)), GroupId))
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
for i := 0; i <= 6; i++ {
for i := 0; i < 6; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
for i := 0; i <= 5; i++ {
for i := 0; i < 5; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= Num-15; i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 2:
@ -245,15 +510,15 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
r = append(r, CreateRobot(float64(GoUtil.RandNum(7531, 12180)), GroupId))
r = append(r, CreateRobot(float64(GoUtil.RandNum(4631, 7530)), GroupId))
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
for i := 0; i <= 6; i++ {
for i := 0; i < 6; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
n := Num - 10
x := n / 2
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= n-x; i++ {
for i := 0; i < n-x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 3:
@ -261,18 +526,19 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
r = append(r, CreateRobot(float64(GoUtil.RandNum(7531, 12180)), GroupId))
r = append(r, CreateRobot(float64(GoUtil.RandNum(4631, 7530)), GroupId))
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
for i := 0; i <= 6; i++ {
for i := 0; i < 6; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
n := Num - 10
x := n / 3
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(581, 1730)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= n-x*2; i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 4:
@ -283,16 +549,17 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
n := Num - 4
x := n / 4
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(581, 1730)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= n-x*3; i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 5:
@ -302,19 +569,20 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
n := Num - 3
x := n / 5
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(581, 1730)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= n-x*4; i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 6:
@ -323,47 +591,49 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
n := Num - 2
x := n / 6
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(4631, 7530)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(581, 1730)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= Num-len(r); i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 7:
r = append(r, CreateRobot(float64(GoUtil.RandNum(12181, 21680)), GroupId))
n := Num - 1
x := n / 7
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(7531, 12180)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(4631, 7530)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(581, 1730)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= Num-len(r); i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
case 8, 9, 10, 11:
@ -372,28 +642,29 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
r = append(r, CreateRobot(float64(GoUtil.RandNum(35131, 64980)), GroupId))
}
x := Num / 8
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(12181, 21680)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(7531, 12180)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(4631, 7530)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(2781, 4630)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(1731, 2780)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(581, 1730)), GroupId))
}
for i := 0; i <= x; i++ {
for i := 0; i < x; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(241, 580)), GroupId))
}
for i := 0; i <= Num-len(r); i++ {
Last := Num - len(r)
for i := 0; i < Last; i++ {
r = append(r, CreateRobot(float64(GoUtil.RandNum(20, 240)), GroupId))
}
@ -404,19 +675,26 @@ func CreateRobotList(G, Num, GroupId int) []*ChampshipRobot {
func CreateRobot(M float64, GroupId int) *ChampshipRobot {
Type := GoUtil.RandMap(map[int]int{1: 25, 2: 50, 3: 25})
Score := M / 10
PerScore := 0.0
if Type == 2 {
PerScore = (M / 10 * 0.34) / float64(GoUtil.NextZeroTimestampDuration()) / 60
Score = M / 10 * 0.66
}
if Type == 3 {
PerScore = (M / 10 * 0.34) / float64(GoUtil.NextZeroTimestampDuration()) / 1800
Score = 0
}
return &ChampshipRobot{
Max: M,
Max: M / 10,
Type: Type,
Name: "Lily",
Avatar: 1,
Face: 1,
Level: 1,
Avatar: GoUtil.RandNum(1, 10),
Face: GoUtil.RandNum(1, 10),
Level: GoUtil.RandNum(1, 10),
GroupId: GroupId,
Time: GoUtil.Now(),
Score: Score,
PerScore: PerScore,
}
}

View File

@ -83,11 +83,13 @@ type GameLogic struct {
MPlayerProfileManager *PlayerProfileManager
MOldPlayerCompensateMgr *OldPlayerCompensateMgr
MHttpManager *HttpManager
MLogManager *LogMgr
SeverInfo *ServerInfo
FriendMgr *FriendMgr
RankMgr *RankMgr
MailMgr *MailMgr
ChampshipMgr *ChampshipMgr
}
type ServerInfo struct {
@ -356,6 +358,26 @@ func (ad *GameLogic) MailMgrCall(m *MsgMod.Msg) interface{} {
return result
}
// 锦标赛管理器
func (ad *GameLogic) CreateChampshipMgr() {
ad.ChampshipMgr = &ChampshipMgr{
ServerMod: new(ServerMod),
}
ad.ChampshipMgr.Init()
}
func (ad *GameLogic) ChampshipMgrSend(m *MsgMod.Msg) {
ad.ChampshipMgr.Send(m)
}
func (ad *GameLogic) ChampshipMgrCall(m *MsgMod.Msg) interface{} {
result, err := ad.ChampshipMgr.Call(m)
if err != nil {
return nil
}
return result
}
func (ad *GameLogic) GetSimplePlayerByUid(Id int) *PlayerSimpleData {
Idstr := strconv.Itoa(Id)
Value, _ := db.RedisGetKey(Idstr)
@ -363,7 +385,10 @@ func (ad *GameLogic) GetSimplePlayerByUid(Id int) *PlayerSimpleData {
player.Uid = Id
if Value == "" {
p := new(Player)
p.GetSimpleData(Id, player)
err := p.GetSimpleData(Id, player)
if err != nil {
return nil
}
value, _ := json.Marshal(player)
db.RedisSetKey(Idstr, string(value), 300)
} else {
@ -430,6 +455,7 @@ func G_getGameLogic() *GameLogic {
G_GameLogicPtr.CreateFriendMgr() //创建好友管理器
G_GameLogicPtr.CreateRankMgr() //创建排行榜管理器
G_GameLogicPtr.CreateMailMgr() //创建邮件管理器
G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器
ClusterMgrInit() //初始化集群
// G_GameLogicPtr.CreateHttpManager()
@ -972,6 +998,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqFastProduceReward", ReqFastProduceReward)
//场景转盘
RegisterMsgProcessFunc("ReqLimitSenceReward", ReqLimitSenceReward)
//领取限时事件进度奖励
// 好友
RegisterMsgProcessFunc("ReqFriendList", ReqFriendList) // 请求好友列表
@ -984,7 +1011,7 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
RegisterMsgProcessFunc("ReqApplyFriend", ReqApplyFriend) // 申请好友
RegisterMsgProcessFunc("ReqAgreeFriend", ReqAgreeFriend) // 同意申请
RegisterMsgProcessFunc("ReqRefuseFriend", ReqRefuseFriend) // 拒绝申请
RegisterMsgProcessFunc("ReqDeleteFriend", ReqDeleteFriend) // 删除好友
RegisterMsgProcessFunc("ReqDelFriend", ReqDelFriend) // 删除好友
// 榜单
RegisterMsgProcessFunc("ReqRank", ReqRank) // 请求榜单数据
@ -1010,6 +1037,8 @@ func (ad *GameLogic) RegisterNetWorkFunc() {
// 锦标赛
RegisterMsgProcessFunc("ReqChampshipReward", ReqChampshipReward) // 领取锦标赛奖励
RegisterMsgProcessFunc("ReqChampshipRankReward", ReqChampshipRankReward) // 领取锦标赛排行榜奖励
RegisterMsgProcessFunc("ReqChampshipRank", ReqChampshipRank) // 请求锦标赛排行榜
RegisterMsgProcessFunc("ReqChampshipPreRank", ReqChampshipPreRank) // 请求锦标赛昨日排行榜
}
@ -1175,6 +1204,14 @@ func (ad *GameLogic) NotifyAll(m *MsgMod.Msg) {
}
}
func NotifyPlayer(Uid int, m *MsgMod.Msg) {
p := G_GameLogicPtr.GetPlayerByUid(Uid)
if p == nil || p.stop {
return
}
p.SendMsg(m)
}
func setRedisLock(key, value string, Duration time.Duration) bool {
return db.RedisLock(key, "", Duration)
}

View File

@ -3,6 +3,7 @@ package game
import (
"server/game/mod/card"
"server/game/mod/item"
MsgMod "server/game/mod/msg"
"server/msg"
"strconv"
"strings"
@ -70,7 +71,15 @@ func ReqGmCommand(args []interface{}) error {
CardMod.AddCard(3)
FriendMod := player.PlayMod.getFriendMod()
FriendMod.Card = make(map[string]*card.CardInfo)
case "champshipGroup":
G_GameLogicPtr.ChampshipMgrSend(&MsgMod.Msg{
Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_GROUP,
})
case "champshipZero":
G_GameLogicPtr.ChampshipMgrSend(&MsgMod.Msg{
Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_ZERO,
})
}
return nil
}

View File

@ -4,6 +4,8 @@ import (
// "server/GoUtil"
// "server/MergeConst"
"context"
"database/sql"
"encoding/json"
"errors"
"fmt"
@ -416,10 +418,18 @@ func (p *Player) ClearData() {
func (p *Player) AutoSaveData() {
//保存数据
ctx := context.Background()
txOptions := &sql.TxOptions{}
tx, err := db.SqlDb.BeginTx(ctx, txOptions)
if err != nil {
log.Debug("AutoSaveData BeginTx failed:", err)
return
}
for _, v := range p.playerdata {
v.SaveDataFromDB("")
}
p.PlayMod.ClearData(p)
tx.Commit()
}
// 重新连接
@ -575,15 +585,8 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
Lable: Label,
})
}
NotifyCard := &msg.ResNotifyCard{}
NotifyCard.Card = make(map[int32]int32)
for _, v := range ResCard {
for _, c := range v.Card {
NotifyCard.Card[c]++
}
}
p.PushClientRes(NotifyCard)
CardMod := p.PlayMod.getCardMod()
p.PushClientRes(CardMod.NotifyCard())
if is_update {
p.PushClientRes(p.GetPlayerBaseMod().BackAsset())
@ -609,7 +612,7 @@ func (p *Player) LoginBackData() {
p.PushClientRes(p.PlayMod.mod_list.PiggyBank.BackData())
p.PushClientRes(p.GetPlayerBaseMod().BackAsset())
p.PushClientRes(p.GetPlayerBaseMod().BackKv())
MyRank := G_GameLogicPtr.RankMgr.getMyRank(RANK_TYPE_CHAMPSHIP, int(p.M_DwUin))
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(p.M_DwUin))
p.PushClientRes(p.PlayMod.mod_list.Champship.BackData(MyRank))
BackUserInfo(p)
}
@ -662,6 +665,7 @@ func (p *Player) UpdateUserInfo() {
Base := p.GetPlayerBaseMod()
simple.Name = p.GetPlayerBaseMod().GetName()
simple.Avatar = p.PlayMod.getAvatarMod().SetId
simple.Uid = int(p.M_DwUin)
simple.Face = p.PlayMod.getFaceMod().SetId
simple.Level = p.GetPlayerBaseMod().GetLevel()
simple.Decorate = p.PlayMod.getDecorateMod().DecorateNum
@ -696,13 +700,14 @@ func (p *Player) HandleInChampshipRank() {
Score := float64(ChampshipMod.GetScore())
// 更新排行榜
m := &MsgMod.Msg{
Type: MsgMod.HANDLE_TYPE_RANK,
Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_INRANK,
SendT: GoUtil.Now(),
Extra: RankMsg{
Extra: CRank{
Uid: int(p.M_DwUin),
Score: Score,
RankType: RANK_TYPE_CHAMPSHIP,
H: ChampshipMod.GetH(),
N: ChampshipMod.GetN(),
},
}
G_GameLogicPtr.RankMgrSend(m)
G_GameLogicPtr.ChampshipMgrSend(m)
}

View File

@ -4,6 +4,7 @@ import (
"bytes"
"encoding/gob"
"errors"
"fmt"
"server/GoUtil"
"server/MergeConst"
userCfg "server/conf/user"
@ -204,7 +205,6 @@ func (p *PlayerBaseData) SetChampshipID(ChampshipsGroupID int32, isNotify bool)
}
p.SaveDataFromDB("")
}
func (p *PlayerBaseData) Notify_Daily_Renew(param []interface{}) {
@ -217,7 +217,7 @@ func (p *PlayerBaseData) Notify_Daily_Renew(param []interface{}) {
agent := p.GetPlayer().GetAgentByPlayer()
data, _ := proto.Marshal(notify)
G_getGameLogic().PackResInfo(agent, "NotifyRenewBuyEnergyCnt", data)
p.SaveDataFromDB("")
}
func (p *PlayerBaseData) SaveDataFromDB(Key interface{}) bool {
@ -252,6 +252,7 @@ func (p *PlayerBaseData) SaveDataFromDB(Key interface{}) bool {
var buf bytes.Buffer
encode := gob.NewEncoder(&buf)
encode.Encode(p.KeyValueData)
log.Debug("player :%d KeyValueData Save:%v ", p.Data.DwUin, p.KeyValueData)
db.SavePlayerClientData(&db.SqlModStruct{
DwUin: p.Data.DwUin,
ModData: buf.Bytes(),
@ -327,7 +328,7 @@ func (p *PlayerBaseData) UpdateBaseItemInfo(update *msg.UpdateBaseItemInfo) {
p.Data.LastPlayTime = v
}
}
p.SaveDataFromDB("")
}
func (p *PlayerBaseData) ReqRemoveAd(buf []byte) {
@ -337,7 +338,6 @@ func (p *PlayerBaseData) ReqRemoveAd(buf []byte) {
p.Data.NoAd = 1
res.ResultCode = 0
p.SaveDataFromDB("")
agent := p.GetPlayer().GetAgentByPlayer()
data, _ := proto.Marshal(res)
@ -387,7 +387,7 @@ func (p *PlayerBaseData) ReqBindFacebookAccount(buf []byte) {
res.ResultCode = 0
p.Data.FaceBookId = req.BindAccountId
res.BindAccountId = req.BindAccountId
p.SaveDataFromDB("")
}
agent := p.GetPlayer().GetAgentByPlayer()
@ -403,7 +403,6 @@ func (p *PlayerBaseData) ReqUnBindFacebook(buf []byte) {
res.ResultCode = 0
res.BindAccountId = req.BindAccountId
p.Data.FaceBookId = ""
p.SaveDataFromDB("")
agent := p.GetPlayer().GetAgentByPlayer()
data, _ := proto.Marshal(res)
@ -432,13 +431,13 @@ func (p *PlayerBaseData) ReqOnlyBindFacebook(buf []byte) {
res.ResultCode = 0
p.Data.FaceBookId = req.BindAccountId
res.BindAccountId = req.BindAccountId
p.SaveDataFromDB("")
}
} else {
res.ResultCode = 0
p.Data.FaceBookId = req.BindAccountId
res.BindAccountId = req.BindAccountId
p.SaveDataFromDB("")
}
agent := p.GetPlayer().GetAgentByPlayer()
@ -447,91 +446,11 @@ func (p *PlayerBaseData) ReqOnlyBindFacebook(buf []byte) {
}
func (p *PlayerBaseData) ReqSynGameData(buf []byte) {
req := &msg.ReqSynGameData{}
res := &msg.ResSynGameData{}
proto.Unmarshal(buf, req)
sqlStr := "SELECT * FROM t_player_baseinfo WHERE FaceBookId = ?"
sqlStruck := db.ResPlayerBaseInfo{}
isHaveOther := false
if err := db.SqlDb.Get(&sqlStruck, sqlStr, req.NewFBId); err != nil {
isHaveOther = false
} else {
isHaveOther = true
}
if sqlStruck.DwUin == p.M_Player.M_DwUin {
return
}
if OldPlayer, ok := G_GameLogicPtr.M_Players[sqlStruck.DwUin]; ok {
agent := OldPlayer.GetAgentByPlayer()
// notify := &msg.ForceKickOut{}
notify := &msg.ResSynGameData{}
data, _ := proto.Marshal(notify)
if agent != nil {
G_getGameLogic().PackResInfo(agent, "ResSynGameData", data)
}
OldPlayer.ClearData()
delete(G_GameLogicPtr.M_Players, sqlStruck.DwUin)
} else {
player := G_GameLogicPtr.FindOfflinePlayer(sqlStruck.DwUin)
if player != nil {
timer1 := G_GameLogicPtr.MReadyToRemoveList[player]
timer1.Disabled()
G_GameLogicPtr.Mdispatr.ChanTimer <- timer1
timer1.Stop()
delete(G_GameLogicPtr.MReadyToRemoveList, player)
}
}
if isHaveOther {
if sqlStruck.DwUin == p.Data.DwUin {
res.ResultCode = MergeConst.Protocol_FaceBook_Binded
} else {
ReplaceName := sqlStruck.UserName
UserName := p.Data.UserName
res.ResultCode = 0
sqlStr1 := "SELECT * FROM t_account WHERE user_name = ?"
sqlAccStruck1 := db.Db_Account{}
if err2 := db.SqlDb.Get(&sqlAccStruck1, sqlStr1, UserName); err2 != nil {
} else {
sqlAccStruck1.UserName = ""
db.FormatAllMemUpdateDb(&sqlAccStruck1, "t_account", "auto_id")
}
p.Data.UserName = ""
p.SaveDataFromDB("")
sqlStruck.FaceBookId = req.NewFBId
sqlStruck.UserName = UserName
db.FormatAllMemUpdateDb(&sqlStruck, "t_player_baseinfo", "dwUin")
sqlStr := "SELECT * FROM t_account WHERE user_name = ?"
sqlAccStruck := db.Db_Account{}
if err2 := db.SqlDb.Get(&sqlAccStruck, sqlStr, ReplaceName); err2 != nil {
} else {
sqlAccStruck.UserName = UserName
db.FormatAllMemUpdateDb(&sqlAccStruck, "t_account", "auto_id")
}
}
} else {
res.ResultCode = 0
}
agent := p.GetPlayer().GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResSynGameData", data)
}
func (p *PlayerBaseData) ClearData() bool {
p.Data.LogoutTime = int32(time.Now().Unix())
p.SaveDataFromDB("")
GoUtil.RemoveEvent(MergeConst.Notify_Daily_Renew, p.Notify_Daily_Renew, p)
p.McronSave.Remove(p.McronSaveID)
p.McronSave.Stop()
@ -543,6 +462,8 @@ func (p *PlayerBaseData) ClearData() bool {
p.MTicker.Stop()
p.MTicker = nil
}
fmt.Print("ClearData:", p.Data.DwUin)
p.SaveDataFromDB("")
return true
}

View File

@ -178,7 +178,7 @@ func (p *PlayerChessData) UpdatePlayerChessData(buf []byte) error {
p.M_Player.SendErrClienRes(res)
return fmt.Errorf("棋子数据不一致")
}
p.SaveDataFromDB("")
return nil
}
@ -319,7 +319,6 @@ func (p *PlayerChessData) UpdateChessColorData(buf []byte) {
}
p.ColorData.MChessColorData = update.MChessColorData
p.SaveDataFromDB("")
}
func (p *PlayerChessData) GetChestKeyByValue(id int32) string {
for k, v := range p.Data.MChessData {
@ -332,7 +331,6 @@ func (p *PlayerChessData) GetChestKeyByValue(id int32) string {
func (p *PlayerChessData) ClearData() bool {
p.SaveDataFromDB("")
return true
}

View File

@ -119,9 +119,7 @@ func handle(p *Player, m *msg.Msg) error {
CardMod.AddExTimes()
CardMod.AddCard(CardInfo.CardId)
CardMod.DelExCard(CardInfo)
p.PushClientRes(&proto.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.CardId): 1},
})
p.PushClientRes(CardMod.NotifyCard())
p.PlayMod.save()
case msg.HANDLE_TYPE_REFUSE_EX_CARD: // B收到A拒绝置换卡牌
CardMod := p.PlayMod.getCardMod()
@ -130,9 +128,10 @@ func handle(p *Player, m *msg.Msg) error {
FriendMod := p.PlayMod.getFriendMod()
FriendMod.DelCardInfo(CardInfo.Id)
p.PlayMod.save()
p.PushClientRes(&proto.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.ExId): 1},
})
p.PushClientRes(CardMod.NotifyCard())
case msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY: // 锦标赛排名变动通知
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(p.M_DwUin))
p.PushClientRes(p.PlayMod.getChampshipMod().BackData(MyRank))
case msg.HANDLE_TYPE_MAIL: // 邮件操作
MailMod := p.PlayMod.getMailMod()
if m.Extra == nil {
@ -169,9 +168,6 @@ func HandleFriendMsg(p *Player, m *msg.Msg) error {
FriendMod.HandleMsg(m)
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(m.From)
switch m.Type {
case msg.HANDLE_TYPE_RANK_NOTIFY: // 排行榜更新
MyRank := G_GameLogicPtr.RankMgr.getMyRank(RANK_TYPE_CHAMPSHIP, int(p.M_DwUin))
p.PushClientRes(p.PlayMod.getChampshipMod().BackData(MyRank))
case msg.HANDLE_TYPE_APPLY: // 好友申请
FriendMod.AddFriendApply(m.From)
p.PushClientRes(&proto.ResFriendApplyNotify{

View File

@ -115,14 +115,13 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
data := m.Extra.(RankMsg)
rankList := r.getRank(data.RankType)
inRank := false
MyRank := 0
for k, v := range rankList {
for _, v := range rankList {
if v.Uid == data.Uid {
if v.Score < data.Score {
v.Score = data.Score
v.Time = m.SendT
inRank = true
MyRank = k + 1
break
}
return nil, nil
}
@ -139,16 +138,7 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
}
return false
})
for k, v := range rankList {
if v.Uid == data.Uid {
if MyRank != k+1 {
Notify(data.Uid, &msg.Msg{
Type: msg.HANDLE_TYPE_RANK_NOTIFY,
})
}
break
}
}
// if len(rankList) >= 100 {
// rankList = rankList[:100]
// }
@ -160,11 +150,3 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
r.update = true
return nil, nil
}
func Notify(Uid int, m *msg.Msg) {
p := G_GameLogicPtr.GetPlayerByUid(Uid)
if p == nil || p.stop {
return
}
p.SendMsg(m)
}

View File

@ -2026,13 +2026,14 @@ func ReqRewardOrder(args []interface{}) error {
// 限时事件增加进度
LimitedTimeEventMod.AddProgress(player.GetPlayerBaseMod().GetLevel())
MyRank := G_GameLogicPtr.RankMgr.getMyRank(RANK_TYPE_CHAMPSHIP, int(player.M_DwUin))
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(player.M_DwUin))
player.HandleInChampshipRank()
player.PlayMod.save()
player.PushClientRes(PiggyBankMod.BackData())
player.PushClientRes(OrderMod.BackData())
player.PushClientRes(ChampshipMod.BackData(MyRank))
player.PushClientRes(LimitedTimeEventMod.BackData())
player.PushClientRes(LimitedTimeEventMod.ProgressBackData())
return nil
}
@ -2738,41 +2739,31 @@ func ReqSearchPlayer(args []interface{}) error {
req := &msg.ReqSearchPlayer{}
proto.Unmarshal(buf, req)
Uid, err := strconv.Atoi(req.Uid)
SearchPlayers := make([]*PlayerSimpleData, 0)
list := make([]*msg.ResPlayerSimple, 0)
if err == nil {
SearchPlayer := G_GameLogicPtr.GetSimplePlayerByUid(Uid)
SearchPlayer := G_GameLogicPtr.GetResSimplePlayerByUid(Uid)
if SearchPlayer != nil {
SearchPlayers = append(SearchPlayers, SearchPlayer)
list = append(list, SearchPlayer)
}
}
data, err := db.SearchPlayer(req.Uid)
if err == nil {
if err != nil {
player.SendErrClienRes(&msg.ResSearchPlayer{
Code: 0,
})
}
for _, v := range data {
SearchPlayer := G_GameLogicPtr.GetSimplePlayerByUid(int(v.DwUin))
SearchPlayers = append(SearchPlayers, SearchPlayer)
}
}
if len(SearchPlayers) == 0 {
player.PushClientRes(&msg.ResSearchPlayer{
Code: MergeConst.Protocol_AddFriend_Is_NoExsit,
})
return fmt.Errorf("player not found")
}
list := make([]*msg.ResPlayerSimple, 0)
for _, v := range SearchPlayers {
if player.PlayMod.getFriendMod().CheckFriend(v.Uid) {
if player.M_DwUin == v.DwUin {
continue
}
if player.PlayMod.getFriendMod().CheckApply(v.Uid) {
if player.PlayMod.getFriendMod().CheckFriend(int(v.DwUin)) {
continue
}
list = append(list, &msg.ResPlayerSimple{
Uid: int32(v.Uid),
Name: v.Name,
Avatar: int32(v.Avatar),
Level: int32(v.Level),
Face: int32(v.Face),
})
if player.PlayMod.getFriendMod().CheckApply(int(v.DwUin)) {
continue
}
SearchPlayer := G_GameLogicPtr.GetResSimplePlayerByUid(int(v.DwUin))
list = append(list, SearchPlayer)
}
player.PushClientRes(&msg.ResSearchPlayer{
@ -2824,15 +2815,17 @@ func ReqAgreeFriend(args []interface{}) error {
G_GameLogicPtr.FriendMgrSend(m)
FriendMod.AddFriend(Uid)
player.PlayMod.save()
player.PushClientRes(&msg.ResApplyFriend{
player.PushClientRes(&msg.ResAgreeFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
Player: G_GameLogicPtr.GetResSimplePlayerByUid(int(req.Uid)),
})
FriendApplyBackData(player)
return nil
}
// 删除好友
func ReqDeleteFriend(args []interface{}) error {
func ReqDelFriend(args []interface{}) error {
_, player, buf := ParseArgs(args)
req := &msg.ReqDelFriend{}
proto.Unmarshal(buf, req)
@ -2849,6 +2842,7 @@ func ReqDeleteFriend(args []interface{}) error {
player.PlayMod.save()
player.PushClientRes(&msg.ResDelFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
FriendListBackData(player)
return nil
@ -2865,6 +2859,7 @@ func ReqRefuseFriend(args []interface{}) error {
player.PlayMod.save()
player.PushClientRes(&msg.ResRefuseFriend{
Code: msg.RES_CODE_SUCCESS,
Uid: req.Uid,
})
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_DEL,
@ -2998,9 +2993,7 @@ func ReqAgreeCardGive(args []interface{}) error {
Extra: CardInfo,
}
FriendMgrSend(m)
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.CardId): -1},
})
player.PushClientRes(CardMod.NotifyCard())
player.PushClientRes(&msg.ResAgreeCardGive{
Code: msg.RES_CODE_SUCCESS,
})
@ -3065,9 +3058,7 @@ func ReqCardSend(args []interface{}) error {
player.PushClientRes(&msg.ResCardSend{
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.CardId): -1},
})
player.PushClientRes(CardMod.NotifyCard())
player.PlayMod.save()
FriendMgrSend(m)
return nil
@ -3101,9 +3092,7 @@ func ReqCardExchange(args []interface{}) error {
player.PushClientRes(&msg.ResCardExchange{
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.CardId): -1},
})
player.PushClientRes(CardMod.NotifyCard())
player.PlayMod.save()
FriendMgrSend(m)
return nil
@ -3148,9 +3137,7 @@ func ReqSelectCardExchange(args []interface{}) error {
player.PushClientRes(&msg.ResSelectCardExchange{
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardId): -1},
})
player.PushClientRes(CardMod.NotifyCard())
m := &MsqMod.Msg{
Type: MsqMod.HANDLE_TYPE_SELECT_EX_CARD,
From: int(player.M_DwUin),
@ -3193,9 +3180,7 @@ func ReqAgreeCardExchange(args []interface{}) error {
To: CardInfo.BUid,
Extra: CardInfo,
}
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.ExId): 1},
})
player.PushClientRes(CardMod.NotifyCard())
FriendMgrSend(m)
return nil
}
@ -3259,9 +3244,7 @@ func ReqRefuseCardExchange(args []interface{}) error {
To: CardInfo.BUid,
Extra: CardInfo,
}
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.CardId): 1},
})
player.PushClientRes(CardMod.NotifyCard())
FriendMgrSend(m)
return nil
}
@ -3287,9 +3270,7 @@ func ReqGetFriendCard(args []interface{}) error {
player.PushClientRes(&msg.ResGetFriendCard{
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(CardInfo.CardId): 1},
})
player.PushClientRes(CardMod.NotifyCard())
return nil
}
@ -3315,21 +3296,22 @@ func ReqRank(args []interface{}) error {
return nil
}
// 请求昨日竞标赛榜单
// 请求竞标赛榜单
func ReqChampshipRank(args []interface{}) error {
_, player, buf := ParseArgs(args)
req := &msg.ReqRank{}
proto.Unmarshal(buf, req)
rankList := G_GameLogicPtr.RankMgr.getLastChampshipRank()
res := make(map[int32]*msg.ResPlayerSimple)
for k, rank := range rankList {
res[int32(k+1)] = G_GameLogicPtr.GetResSimplePlayerByUid(rank.Uid)
}
m := G_GameLogicPtr.ChampshipMgr.GetRankMsg(int(player.M_DwUin))
player.PushClientRes(m)
return nil
}
player.PushClientRes(&msg.ResRank{
Type: req.Type,
RankList: res,
})
func ReqChampshipPreRank(args []interface{}) error {
_, player, buf := ParseArgs(args)
req := &msg.ReqRank{}
proto.Unmarshal(buf, req)
m := G_GameLogicPtr.ChampshipMgr.GetPreRankMsg(int(player.M_DwUin))
player.PushClientRes(m)
return nil
}
@ -3600,7 +3582,7 @@ func ReqChampshipReward(args []interface{}) error {
})
return err
}
MyRank := G_GameLogicPtr.RankMgr.getMyRank(RANK_TYPE_CHAMPSHIP, int(player.M_DwUin))
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(player.M_DwUin))
player.PlayMod.save()
player.PushClientRes(ChampshipMod.BackData(MyRank))
player.PushClientRes(&msg.ResChampshipReward{
@ -3666,19 +3648,16 @@ func ReqFriendRecommend(args []interface{}) error {
break
}
PlayerSimpleData := G_GameLogicPtr.GetResSimplePlayerByUid(v.Uid)
if v.Uid == int(player.M_DwUin) {
continue
}
if FriendMod.CheckFriend(v.Uid) {
continue
}
if FriendMod.CheckApply(v.Uid) {
continue
}
RecommendList = append(RecommendList, &msg.ResPlayerSimple{
Uid: int32(PlayerSimpleData.Uid),
Name: PlayerSimpleData.Name,
Avatar: int32(PlayerSimpleData.Avatar),
Level: int32(PlayerSimpleData.Level),
Face: int32(PlayerSimpleData.Face),
})
RecommendList = append(RecommendList, PlayerSimpleData)
n++
}
player.PushClientRes(&msg.ResFriendRecommend{
@ -3714,9 +3693,9 @@ func ReqFriendTimeLine(args []interface{}) error {
func ReqChampshipRankReward(args []interface{}) error {
_, player, _ := ParseArgs(args)
MyRank := G_GameLogicPtr.RankMgr.getLastChampship(int(player.M_DwUin))
MyLastRank := G_GameLogicPtr.ChampshipMgr.getLastMyRank(int(player.M_DwUin))
ChampshipMod := player.PlayMod.getChampshipMod()
itemList, err := ChampshipMod.GetRankReward(MyRank)
itemList, err := ChampshipMod.GetRankReward(MyLastRank)
if err != nil {
player.SendErrClienRes(&msg.ResChampshipRankReward{
Code: msg.RES_CODE_FAIL,
@ -3733,6 +3712,7 @@ func ReqChampshipRankReward(args []interface{}) error {
return err
}
player.PlayMod.save()
MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(int(player.M_DwUin))
player.PushClientRes(ChampshipMod.BackData(MyRank))
player.PushClientRes(&msg.ResChampshipRankReward{
Code: msg.RES_CODE_SUCCESS,
@ -3777,9 +3757,9 @@ func ReqMasterCard(args []interface{}) error {
player.PlayMod.save()
player.PushClientRes(&msg.ResMasterCard{
Code: msg.RES_CODE_SUCCESS,
MasterId: req.Id,
CardId: req.CardId,
})
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(req.CardId): 1},
})
player.PushClientRes(CardMod.NotifyCard())
return nil
}

View File

@ -16,7 +16,7 @@ const (
RANK_MGR_KEY = "RANK_MGR"
MAIL_MGR_KEY = "MAIL_MGR"
CHAMPSHIP_MGR_KEY = "CHAMPSHIP_MGR"
PER_SAVE_TIME = 1
PER_SAVE_TIME = 60
)
type ServerMod struct {
@ -38,7 +38,7 @@ func (s *ServerMod) init() {
s.handler = make(map[int]interface{})
s.update = false
s.LoadData()
s.mDispatr.AfterFunc(time.Duration(PER_SAVE_TIME), func() {
s.mDispatr.AfterFunc(time.Duration(PER_SAVE_TIME)*time.Second, func() {
s.SaveData()
})
go func() {
@ -48,6 +48,7 @@ func (s *ServerMod) init() {
s.lock.Unlock()
}
}()
for {
select {
case msg := <-s.msgChan:
@ -61,6 +62,7 @@ func (s *ServerMod) init() {
}
}
}()
}
// 处理消息
@ -122,12 +124,9 @@ func (s *ServerMod) Call(m *msg.Msg) (interface{}, error) {
// mysql 保存消息
func (s *ServerMod) SaveData() {
s.mDispatr.AfterFunc(time.Duration(PER_SAVE_TIME+GoUtil.RandNum(5, 10)), func() {
s.mDispatr.AfterFunc(time.Duration(PER_SAVE_TIME+GoUtil.RandNum(5, 10))*time.Second, func() {
s.SaveData()
})
if !s.update {
return
}
DbData := db.SqlServerModStruct{}
DbData.Key = s.key
DbData.UpdataTime = GoUtil.Now()
@ -140,7 +139,6 @@ func (s *ServerMod) SaveData() {
if err != nil {
log.Debug("SaveData sql exec ,Mod Key: %s err:%v", s.key, err)
}
}
func (s *ServerMod) LoadData() {

View File

@ -20,6 +20,13 @@ type CardMod struct {
ReqTimes int //请求次数
ReqFriend map[int]*CardInfo //今日已请求好友
ExCard map[int]*CardInfo // 交换卡牌
Cache Cache // 缓存卡牌
}
type Cache struct {
Card map[int]int
Master map[int]int
ExStar int
}
const (
@ -73,6 +80,12 @@ func (c *CardMod) InitData() {
if c.ExCard == nil {
c.ExCard = make(map[int]*CardInfo)
}
if c.Cache.Card == nil {
c.Cache.Card = make(map[int]int)
}
if c.Cache.Master == nil {
c.Cache.Master = make(map[int]int)
}
}
func (c *CardMod) Login(ServerOpenTime int64) {
@ -101,10 +114,12 @@ func (c *CardMod) AddCard(Id int) {
if ok {
star := cardCfg.GetStarById(Id)
c.ExchangeStar += star
c.Cache.ExStar += star
c.CardList[Id]++
} else {
c.CardList[Id] = 1
}
c.Cache.Card[Id]++
}
// 开启卡包
@ -215,6 +230,7 @@ func (c *CardMod) ExStarReward(Id int) ([]*item.Item, error) {
return nil, err
}
}
c.Cache.ExStar -= CostStar
return itemList, nil
}
@ -247,6 +263,7 @@ func (c *CardMod) SubCard(id int) error {
count, ok := c.CardList[id]
if ok && count > 0 {
c.CardList[id]--
c.Cache.Card[id]--
return nil
}
return fmt.Errorf("SubCard card not enough")
@ -346,6 +363,7 @@ func (c *CardMod) DelExCard(CardInfo *CardInfo) {
}
func (c *CardMod) AddMasterCard(Id int) {
c.Cache.Master[Id]++
c.AllCard[Id]++
}
@ -357,6 +375,21 @@ func (c *CardMod) MasterCardEx(Id, CardId int) error {
return fmt.Errorf("MasterCardEx card type err")
}
c.AllCard[Id]--
c.AllCard[Id]--
c.AddCard(CardId)
return nil
}
func (c *CardMod) NotifyCard() *msg.ResNotifyCard {
m := &msg.ResNotifyCard{
Card: GoUtil.MapIntToInt32(c.Cache.Card),
Master: GoUtil.MapIntToInt32(c.Cache.Master),
ExStar: int32(c.Cache.ExStar),
}
c.Cache = Cache{
Card: make(map[int]int),
Master: make(map[int]int),
ExStar: 0,
}
return m
}

View File

@ -13,11 +13,14 @@ type ChampshipMod struct {
Score int
Reward int
RankReward bool
PreMax int // 昨日最高档
Max int // 历史最高档
}
func (c *ChampshipMod) InitData() {}
func (c *ChampshipMod) ZeroUpdate() {
c.PreMax = c.Reward
c.Score = 0
c.Reward = 0
c.RankReward = false
@ -48,6 +51,7 @@ func (c *ChampshipMod) AddScore(Chess []int) {
func (c *ChampshipMod) GetReward() []*item.Item {
Reward, Items := champshipCfg.GetReward(c.Reward, c.Score)
c.Reward = Reward
c.Max = max(c.Max, c.Reward)
return Items
}
@ -60,3 +64,11 @@ func (c *ChampshipMod) BackData(MyRank int) *msg.ResChampship {
Rank: int32(MyRank),
}
}
func (c *ChampshipMod) GetH() int {
return c.PreMax
}
func (c *ChampshipMod) GetN() int {
return c.Max
}

View File

@ -24,6 +24,7 @@ func getTaskReward(Id, AreaId int) []*item.Item {
func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item.Item {
Ids := GoUtil.GetMapKey(jackpot)
r := make(map[int][]*item.Item)
t := 0
for {
Ids1 := GoUtil.RandSliceNum(Ids, num)
sort.Ints(Ids1)
@ -44,6 +45,9 @@ func randJackpot(jackpot map[int]dailyTaskCfg.Jackpot, num int) map[int][]*item.
}
return r
}
if t > 100 {
return r
}
}
}

View File

@ -43,6 +43,9 @@ const (
// 锦标赛
HANDLE_TYPE_CHAMPSHIP_GROUP = 301 //锦标赛分组操作
HANDLE_TYPE_CHAMPSHIP_INRANK = 302 //锦标赛入榜操作
HANDLE_TYPE_CHAMPSHIP_AI = 303 //锦标赛入榜操作
HANDLE_TYPE_CHAMPSHIP_NOTIFY = 304 //锦标赛排名变动通知
HANDLE_TYPE_CHAMPSHIP_ZERO = 305 //锦标赛0点更新
//server mod handle
SERVER_ZERO_UPDATE = 1000 //zero update
)

File diff suppressed because it is too large Load Diff