Blame view

cmd/gameserver/service/agent.go 3.14 KB
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
1
  package service
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
2
3
  
  import (
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
4
5
  	"github.com/golang/protobuf/proto"
  	"math"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
6
7
  	"pro2d/common"
  	"pro2d/common/components"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
8
  	"pro2d/common/logger"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
9
  	"pro2d/models"
8d983031   zhangqijia   loginReq uid -> t...
10
  	"pro2d/pb"
58e37bfe   zhangqijia   add sync.Pool to ...
11
  	"sync"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
12
13
14
15
16
17
  	"sync/atomic"
  )
  
  type Agent struct {
  	components.IConnection
  	Server components.IServer
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
18
  	components.IAgent
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
19
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
20
21
22
23
  	Role               *models.RoleModel
  	nextCheckTime      int64 //下一次检查的时间
  	lastHeartCheckTime int64
  	heartTimeoutCount  int //超时次数
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
24
25
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
26
  var agentPool = sync.Pool{New: func() interface{} { return new(Agent) }}
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
27
  
58e37bfe   zhangqijia   add sync.Pool to ...
28
29
30
  func NewAgent(s components.IServer) *Agent {
  	a := agentPool.Get().(*Agent)
  	a.Server = s
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
31
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
32
  	a.nextCheckTime = 0
29a163be   zhangqijia   fix: CreateReq ui...
33
  	a.lastHeartCheckTime = common.Timex()
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
34
  	a.heartTimeoutCount = 0
58e37bfe   zhangqijia   add sync.Pool to ...
35
  	return a
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
36
37
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
38
39
  func (c *Agent) SetSchema(schema components.ISchema) {
  	c.Role = schema.(*models.RoleModel)
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
40
  	c.Role.SetConn(c)
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
41
42
  
  	c.Server.GetConnManage().AddRID(c.Role.Role.Id, c.IConnection.GetID())
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
43
44
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
45
46
47
  func (c *Agent) GetSchema() components.ISchema {
  	return c.Role
  }
8d983031   zhangqijia   loginReq uid -> t...
48
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
49
50
  func (c *Agent) SetServer(server components.IServer) {
  	c.Server = server
8d983031   zhangqijia   loginReq uid -> t...
51
52
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
53
54
55
  func (c *Agent) GetServer() components.IServer {
  	return c.Server
  }
8d983031   zhangqijia   loginReq uid -> t...
56
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
57
58
59
60
61
62
63
  func (c *Agent) OnConnection(conn components.IConnection) {
  	c.IConnection = conn
  }
  
  func (c *Agent) OnMessage(msg components.IMessage) {
  	atomic.StoreInt64(&c.lastHeartCheckTime, common.Timex())
  	if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_HeartReq) {
8d983031   zhangqijia   loginReq uid -> t...
64
65
66
  		return
  	}
  
765431a4   zhangqijia   增加schema接口, 抽象 mo...
67
  	md := c.Server.GetAction(msg.GetHeader().GetMsgID())
77f5eec7   zhangqijia   plugin 插件热更 接口
68
  	if md == nil {
58e37bfe   zhangqijia   add sync.Pool to ...
69
  		logger.Debug("cmd: %d, handler is nil", msg.GetHeader().GetMsgID())
77f5eec7   zhangqijia   plugin 插件热更 接口
70
71
  		return
  	}
58e37bfe   zhangqijia   add sync.Pool to ...
72
73
  	logger.Debug("protocolID: %d", msg.GetHeader().GetMsgID())
  	//fmt.Printf("errCode: %d, protoMsg:%v\n", errCode, protoMsg)
77f5eec7   zhangqijia   plugin 插件热更 接口
74
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
75
76
  	f := md.(func(agent components.IAgent, msg components.IMessage) (int32, interface{}))
  	errCode, protoMsg := f(c, msg)
8d983031   zhangqijia   loginReq uid -> t...
77
  
58e37bfe   zhangqijia   add sync.Pool to ...
78
  	if protoMsg == nil {
8d983031   zhangqijia   loginReq uid -> t...
79
  		c.Send(errCode, msg.GetHeader().GetMsgID(), nil)
58e37bfe   zhangqijia   add sync.Pool to ...
80
81
82
  		return
  	}
  
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
83
84
85
86
87
88
  	if errCode != 0 {
  		logger.Error("errCode %d, msg: %v", errCode, protoMsg)
  		c.Send(errCode, msg.GetHeader().GetMsgID(), nil)
  		return
  	}
  
58e37bfe   zhangqijia   add sync.Pool to ...
89
  	rsp, err := proto.Marshal(protoMsg.(proto.Message))
77f5eec7   zhangqijia   plugin 插件热更 接口
90
  	if err != nil {
8d983031   zhangqijia   loginReq uid -> t...
91
  		c.Send(-100, msg.GetHeader().GetMsgID(), nil)
58e37bfe   zhangqijia   add sync.Pool to ...
92
  		return
77f5eec7   zhangqijia   plugin 插件热更 接口
93
  	}
8d983031   zhangqijia   loginReq uid -> t...
94
  	c.Send(errCode, msg.GetHeader().GetMsgID(), rsp)
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
95
96
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
97
  func (c *Agent) OnTimer() {
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
98
  	nextCheckTime := atomic.LoadInt64(&c.nextCheckTime)
29a163be   zhangqijia   fix: CreateReq ui...
99
  	now := common.Timex()
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
100
101
102
103
104
105
106
107
108
109
  	if now >= nextCheckTime {
  		//检查心跳
  		c.checkHeartBeat(now)
  		nextCheckTime = now + common.HeartTimerInterval
  		atomic.StoreInt64(&c.nextCheckTime, nextCheckTime)
  	}
  
  	if c.Role != nil {
  		//role 恢复数据
  		c.Role.OnRecoverTimer(now)
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
110
  	}
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
111
112
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
113
114
  func (c *Agent) OnClose() {
  	c.IConnection = nil
8d983031   zhangqijia   loginReq uid -> t...
115
  	c.Role = nil
58e37bfe   zhangqijia   add sync.Pool to ...
116
117
  	agentPool.Put(c)
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
118
119
120
121
  	if c.Role == nil {
  		return
  	}
  
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
122
  	c.Server.GetConnManage().DelRID(c.Role.Role.Id)
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
123
124
125
  	c.Role.OnOfflineEvent()
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
126
  func (c *Agent) checkHeartBeat(now int64) {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
127
  	lastHeartCheckTime := atomic.LoadInt64(&c.lastHeartCheckTime)
58e37bfe   zhangqijia   add sync.Pool to ...
128
  	//logger.Debug("checkHeartBeat ID: %d, last: %d, now: %d", c.GetID(), lastHeartCheckTime, now)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
129
  	if math.Abs(float64(lastHeartCheckTime-now)) > common.HeartTimerInterval {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
130
131
132
133
134
135
  		c.heartTimeoutCount++
  		if c.heartTimeoutCount >= common.HeartTimeoutCountMax {
  			c.Stop()
  			return
  		}
  		logger.Debug("timeout count: %d", c.heartTimeoutCount)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
136
  	} else {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
137
138
139
  		c.heartTimeoutCount = 0
  	}
  }