Blame view

cmd/gameserver/service/agent.go 4.74 KB
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
1
  package service
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
2
3
  
  import (
495e9142   zhangqijia   fix: 增加DisConnect...
4
  	"fmt"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
5
6
  	"github.com/golang/protobuf/proto"
  	"math"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
7
8
  	"pro2d/common"
  	"pro2d/common/components"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
9
  	"pro2d/common/logger"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
10
  	"pro2d/models"
8d983031   zhangqijia   loginReq uid -> t...
11
  	"pro2d/pb"
58e37bfe   zhangqijia   add sync.Pool to ...
12
  	"sync"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
13
14
15
16
17
18
  	"sync/atomic"
  )
  
  type Agent struct {
  	components.IConnection
  	Server components.IServer
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
19
  	components.IAgent
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
20
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
21
22
23
24
  	Role               *models.RoleModel
  	nextCheckTime      int64 //下一次检查的时间
  	lastHeartCheckTime int64
  	heartTimeoutCount  int //超时次数
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
25
26
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
27
  var agentPool = sync.Pool{New: func() interface{} { return new(Agent) }}
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
28
  
58e37bfe   zhangqijia   add sync.Pool to ...
29
30
31
  func NewAgent(s components.IServer) *Agent {
  	a := agentPool.Get().(*Agent)
  	a.Server = s
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
32
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
33
  	a.nextCheckTime = 0
29a163be   zhangqijia   fix: CreateReq ui...
34
  	a.lastHeartCheckTime = common.Timex()
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
35
  	a.heartTimeoutCount = 0
58e37bfe   zhangqijia   add sync.Pool to ...
36
  	return a
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
37
38
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
39
40
  func (c *Agent) SetSchema(schema components.ISchema) {
  	c.Role = schema.(*models.RoleModel)
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
41
  	c.Role.SetConn(c)
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
42
  
23822e2f   zhangqijia   fix: update proto...
43
44
  	c.Server.GetConnManage().AddRID(c.Role.Data.Id, c.IConnection.GetID())
  	c.Server.GetConnManage().AddUID(c.Role.Data.Uid, c.IConnection.GetID())
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
45
46
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
47
48
49
  func (c *Agent) GetSchema() components.ISchema {
  	return c.Role
  }
8d983031   zhangqijia   loginReq uid -> t...
50
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
51
52
  func (c *Agent) SetServer(server components.IServer) {
  	c.Server = server
8d983031   zhangqijia   loginReq uid -> t...
53
54
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
55
56
57
  func (c *Agent) GetServer() components.IServer {
  	return c.Server
  }
8d983031   zhangqijia   loginReq uid -> t...
58
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
59
60
61
62
  func (c *Agent) OnConnection(conn components.IConnection) {
  	c.IConnection = conn
  }
  
4a502dd5   zhangqijia   fix: game,account...
63
64
65
  /*OnLoginQuery 登录请求
  2 角色不存在
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
66
  func (c *Agent) OnLoginQuery(msg components.IMessage) (int32, proto.Message) {
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
67
68
69
70
71
72
  	req := pb.LoginReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
  
495e9142   zhangqijia   fix: 增加DisConnect...
73
74
75
76
  	uid := req.Token
  
  	// 判断是否已经登录 ,挤掉,断开连接
  	conn := c.Server.GetConnManage().GetConnByUID(uid)
495e9142   zhangqijia   fix: 增加DisConnect...
77
78
  	if conn != nil {
  		logger.Debug("挤掉。。。。。。。。")
8568cf44   zhangqijia   update preserve
79
  		conn.SendSuccess(uint32(pb.ProtoCode_DisConnectNty), nil, msg.GetHeader().GetPreserve())
495e9142   zhangqijia   fix: 增加DisConnect...
80
81
82
83
  		conn.Stop()
  	}
  
  	role := models.RoleExistByUid(uid)
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
84
85
86
87
  	if role == nil {
  		return 2, nil
  	}
  	role.SetProperty("Device", req.Device)
f8ce769e   zhangqijia   fix: rpc = rar + ...
88
  	protoMsg := &pb.LoginRsp{
23822e2f   zhangqijia   fix: update proto...
89
  		Role:       role.Data,
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
90
91
92
93
94
95
96
97
98
  		Hero:       role.GetAllHero(),
  		Team:       role.GetAllTeam(),
  		Equipments: role.GetEquipments(),
  	}
  	//登录成功,存储agent role
  	c.SetSchema(role)
  	return 0, protoMsg
  }
  
8568cf44   zhangqijia   update preserve
99
  func (c *Agent) SendMsg(errCode int32, cmd uint32, msg interface{}, preserve uint32) error {
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
100
  	if msg == nil || errCode != 0 {
8568cf44   zhangqijia   update preserve
101
  		return c.Send(errCode, cmd, nil, preserve)
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
102
  	}
927b2652   zhangqijia   feat: EmailNewNty...
103
  	return c.SendPB(errCode, cmd, msg.(proto.Message), preserve)
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
104
105
  }
  
495e9142   zhangqijia   fix: 增加DisConnect...
106
  func (c *Agent) OnMessage(msg components.IMessage) error {
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
107
  	atomic.StoreInt64(&c.lastHeartCheckTime, common.Timex())
17c74a17   zhangqijia   fix: update time
108
  	logger.Debug("req protocolID: %d", msg.GetHeader().GetMsgID())
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
109
  	//heart
a7566463   zhangqijia   fix: update proto...
110
  	if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_HeartRpc) {
495e9142   zhangqijia   fix: 增加DisConnect...
111
  		return nil
8d983031   zhangqijia   loginReq uid -> t...
112
113
  	}
  
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
114
  	//login
a7566463   zhangqijia   fix: update proto...
115
  	if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_LoginRpc) {
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
116
  		code, protoMsg := c.OnLoginQuery(msg)
8568cf44   zhangqijia   update preserve
117
  		return c.SendMsg(code, msg.GetHeader().GetMsgID(), protoMsg, msg.GetHeader().GetPreserve())
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
118
119
120
  	}
  
  	//get handler by msgid
8568cf44   zhangqijia   update preserve
121
122
  	method := c.Server.GetAction(msg.GetHeader().GetMsgID())
  	if method == nil {
495e9142   zhangqijia   fix: 增加DisConnect...
123
  		return fmt.Errorf("cmd: %d, handler is nil", msg.GetHeader().GetMsgID())
77f5eec7   zhangqijia   plugin 插件热更 接口
124
  	}
8d983031   zhangqijia   loginReq uid -> t...
125
  
a7566463   zhangqijia   fix: update proto...
126
  	if msg.GetHeader().GetMsgID() != uint32(pb.ProtoCode_CreateRpc) && c.Role == nil {
8568cf44   zhangqijia   update preserve
127
  		return c.Send(-101, msg.GetHeader().GetMsgID(), nil, msg.GetHeader().GetPreserve())
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
128
129
  	}
  
fc3e08ac   zhangqijia   feat: add log com...
130
131
  	c.Role.StartActionUnicode()
  
8568cf44   zhangqijia   update preserve
132
133
  	// 调用协议号对应的逻辑函数
  	f := method.(func(role *models.RoleModel, msg components.IMessage) (int32, interface{}))
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
134
  	errCode, protoMsg := f(c.Role, msg)
495e9142   zhangqijia   fix: 增加DisConnect...
135
  	logger.Debug("rsp errcode: %d, protocode: %d", errCode, msg.GetHeader().GetMsgID())
fc3e08ac   zhangqijia   feat: add log com...
136
137
138
139
  	err := c.SendMsg(errCode, msg.GetHeader().GetMsgID(), protoMsg, msg.GetHeader().GetPreserve())
  
  	c.Role.EndActionUnicode()
  	return err
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
140
141
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
142
  func (c *Agent) OnTimer() {
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
143
  	nextCheckTime := atomic.LoadInt64(&c.nextCheckTime)
29a163be   zhangqijia   fix: CreateReq ui...
144
  	now := common.Timex()
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
145
146
147
148
149
150
151
152
153
154
  	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
155
  	}
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
156
157
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
158
159
  func (c *Agent) OnClose() {
  	c.IConnection = nil
8d983031   zhangqijia   loginReq uid -> t...
160
  	c.Role = nil
58e37bfe   zhangqijia   add sync.Pool to ...
161
162
  	agentPool.Put(c)
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
163
164
165
166
  	if c.Role == nil {
  		return
  	}
  
23822e2f   zhangqijia   fix: update proto...
167
168
169
  	logger.Debug("ID: %d close, roleid", c.IConnection.GetID(), c.Role.Data.Id)
  	c.Server.GetConnManage().DelRID(c.Role.Data.Id)
  	c.Server.GetConnManage().DelUID(c.Role.Data.Uid)
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
170
171
172
  	c.Role.OnOfflineEvent()
  }
  
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
173
  func (c *Agent) checkHeartBeat(now int64) {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
174
  	lastHeartCheckTime := atomic.LoadInt64(&c.lastHeartCheckTime)
58e37bfe   zhangqijia   add sync.Pool to ...
175
  	//logger.Debug("checkHeartBeat ID: %d, last: %d, now: %d", c.GetID(), lastHeartCheckTime, now)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
176
  	if math.Abs(float64(lastHeartCheckTime-now)) > common.HeartTimerInterval {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
177
178
179
180
181
  		c.heartTimeoutCount++
  		if c.heartTimeoutCount >= common.HeartTimeoutCountMax {
  			c.Stop()
  			return
  		}
8f6d9ea9   zhangqijia   fix: UpLevel
182
  		//logger.Debug("timeout count: %d", c.heartTimeoutCount)
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
183
  	} else {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
184
185
186
  		c.heartTimeoutCount = 0
  	}
  }