锦标赛优化

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"
)
@ -17,13 +18,15 @@ type ChampshipMgr struct {
}
type ChampshipData struct {
AutoId int
RobotId int
Rank map[int][]*ChampshipRank // 锦标赛排行榜
Last map[int][]*ChampshipRank // 锦标赛排行榜 备份
Pool map[int]*GroupInfo // 锦标赛未分配玩家
GroupInfo map[int]int // 锦标赛分组信息
Robot map[int]*ChampshipRobot // 机器人
AutoId int
RobotId int
Rank 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 {
@ -34,15 +37,16 @@ type ChampshipRank struct {
}
type ChampshipRobot struct {
Max float64
Type int
Name string
Avatar int
Face int
Level int
GroupId int
Time int64
Score float64
Max float64
Type int
Name string
Avatar int
Face int
Level int
GroupId int
Time int64
Score float64
PerScore float64
}
type GroupInfo struct {
@ -63,39 +67,238 @@ type CRank struct {
func (c *ChampshipMgr) Init() {
c.key = CHAMPSHIP_MGR_KEY
c.data = &ChampshipData{
Rank: make(map[int][]*ChampshipRank, 0),
Last: make(map[int][]*ChampshipRank, 0),
Pool: make(map[int]*GroupInfo, 0),
Robot: make(map[int]*ChampshipRobot, 0),
Rank: 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{
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 {
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(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,
Type: Type,
Name: "Lily",
Avatar: 1,
Face: 1,
Level: 1,
GroupId: GroupId,
Time: GoUtil.Now(),
Score: Score,
Max: M / 10,
Type: Type,
Name: "Lily",
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
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{
Uid: int(p.M_DwUin),
Score: Score,
RankType: RANK_TYPE_CHAMPSHIP,
Extra: CRank{
Uid: int(p.M_DwUin),
Score: Score,
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 {
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,
if err != nil {
player.SendErrClienRes(&msg.ResSearchPlayer{
Code: 0,
})
return fmt.Errorf("player not found")
}
list := make([]*msg.ResPlayerSimple, 0)
for _, v := range SearchPlayers {
if player.PlayMod.getFriendMod().CheckFriend(v.Uid) {
for _, v := range data {
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{
Code: msg.RES_CODE_SUCCESS,
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,
@ -3776,10 +3756,10 @@ func ReqMasterCard(args []interface{}) error {
}
player.PlayMod.save()
player.PushClientRes(&msg.ResMasterCard{
Code: msg.RES_CODE_SUCCESS,
})
player.PushClientRes(&msg.ResNotifyCard{
Card: map[int32]int32{int32(req.CardId): 1},
Code: msg.RES_CODE_SUCCESS,
MasterId: req.Id,
CardId: req.CardId,
})
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