├── .gitignore ├── manager └── id_generator.go ├── genproto.bat ├── Dockerfile ├── conf └── constant.go ├── util ├── time.go ├── print.go ├── num.go ├── string.go ├── rand.go └── go.go ├── gate ├── init.go ├── session.go ├── route.go └── msg_handler.go ├── docker-compose.yml ├── README.md ├── center ├── init.go ├── game.go ├── user.go └── msg_handler.go ├── admin ├── init.go ├── http_server.go └── metrics.go ├── game ├── init.go ├── user.go ├── util.go ├── gamemgr.go ├── msg_handler.go └── game.go ├── go.mod ├── cmd ├── game │ └── main.go └── all │ └── main.go ├── logconfig └── log.go ├── msg ├── smsg │ ├── smsg.proto │ └── smsg.pb.go └── cmsg │ ├── cmsg.proto │ └── cmsg.pb.go └── go.sum /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | .idea -------------------------------------------------------------------------------- /manager/id_generator.go: -------------------------------------------------------------------------------- 1 | package manager 2 | -------------------------------------------------------------------------------- /genproto.bat: -------------------------------------------------------------------------------- 1 | protoc --go_out=. msg/cmsg/cmsg.proto 2 | protoc --go_out=. msg/smsg/smsg.proto -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | COPY bin/avatar-fight-server /usr/bin 3 | CMD ["/usr/bin/avatar-fight-server","-goserver","./goserver.json"] 4 | -------------------------------------------------------------------------------- /conf/constant.go: -------------------------------------------------------------------------------- 1 | package conf 2 | 3 | const ( 4 | GateServerID int32 = 100 5 | CenterServerID int32 = 101 6 | GameServerID int32 = 102 7 | AdminServerID int32 = 103 8 | ) 9 | -------------------------------------------------------------------------------- /util/time.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import "time" 4 | 5 | func GetCurrentSec() int64 { 6 | return time.Now().Unix() 7 | } 8 | 9 | func GetCurrentMillSec() int64 { 10 | return time.Now().UnixNano() / 1e6 11 | } 12 | -------------------------------------------------------------------------------- /util/print.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | func PrintElapse(title string, t time.Time) { 8 | //elaspe := time.Since(t) 9 | //if elaspe > time.Second/100 { 10 | // fmt.Println(title, ":", elaspe) 11 | //} 12 | 13 | } 14 | -------------------------------------------------------------------------------- /util/num.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import "math" 4 | 5 | func Int32Min(a, b int32) int32 { 6 | if a < b { 7 | return a 8 | } 9 | return b 10 | } 11 | 12 | func Distance(x1, y1, x2, y2 float32) float32 { 13 | return float32(math.Sqrt(math.Pow(float64(x1-x2), 2) + math.Pow(float64(y1-y2), 2))) 14 | } 15 | -------------------------------------------------------------------------------- /util/string.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | func RandomStr(length int) string { 4 | str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 5 | bytes := []byte(str) 6 | ret := make([]byte, 0, length) 7 | for i := 0; i < length; i++ { 8 | ret = append(ret, bytes[Randn(len(bytes))]) 9 | } 10 | return string(ret) 11 | } 12 | -------------------------------------------------------------------------------- /util/rand.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "math/rand" 5 | "time" 6 | ) 7 | 8 | func init() { 9 | rand.Seed(time.Now().UnixNano()) 10 | } 11 | 12 | func Rand32() int32 { 13 | return rand.Int31() 14 | } 15 | 16 | func Randn(n int) int { 17 | return rand.Intn(n) 18 | } 19 | 20 | func Rand32n(n int32) int32 { 21 | return rand.Int31n(n) 22 | } 23 | 24 | func Rand64() int64 { 25 | return rand.Int63() 26 | } 27 | 28 | func Rand64n(n int64) int64 { 29 | return rand.Int63n(n) 30 | } 31 | -------------------------------------------------------------------------------- /gate/init.go: -------------------------------------------------------------------------------- 1 | package gate 2 | 3 | import ( 4 | "github.com/0990/goserver" 5 | "github.com/0990/goserver/server" 6 | ) 7 | 8 | var Gate *server.Gate 9 | 10 | var SMgr *SessionMgr 11 | 12 | func Init(serverID int32, addr string, config goserver.Config) error { 13 | s, err := server.NewGate(serverID, addr, config) 14 | if err != nil { 15 | return err 16 | } 17 | Gate = s 18 | registerRoute() 19 | registerHandler() 20 | SMgr = newSessionMgr() 21 | return nil 22 | } 23 | 24 | func Run() { 25 | Gate.Run() 26 | } 27 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | 2 | version: "3.3" 3 | 4 | services: 5 | avatar-fight-server: 6 | build: . 7 | ports: 8 | - "9000:9000" 9 | - "9900:9900" 10 | environment: 11 | GOSERVER_NATS_URL: nats://nats-streaming-server:4222 12 | depends_on: 13 | - nats-streaming-server 14 | 15 | nats-streaming-server: 16 | image: "nats-streaming:0.16.2" 17 | 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # avatar-fight-server 2 | 头像大乱战golang服务端 3 | [点此试玩](http://af.09900990.xyz:5050) 4 | 5 | ## 服务器结构 6 | 基于github.com/0990/goserver服务器框架的游戏 7 | 有以下服务构成 8 | 1,gate服,负责消息转发 9 | 2,game服,负责游戏逻辑 10 | 3,center服,中心服,负责玩家管理 11 | 12 | ## 编译运行 13 | 1,先运行[nats-streaming-server](https://github.com/nats-io/nats-streaming-server) 14 | 2,执行build.bat 会生成bin/avatar-fight-server.exe,运行即可 15 | 16 | [客户端代码在此](https://github.com/0990/avatar-fight-client) 17 | 18 | ## 说明 19 | 1,服务器架构上支持多game服,目前未完善此部分 20 | 2,后续会加上对微信小游戏账号登录的支持 21 | -------------------------------------------------------------------------------- /center/init.go: -------------------------------------------------------------------------------- 1 | package center 2 | 3 | import ( 4 | "github.com/0990/goserver" 5 | "github.com/0990/goserver/server" 6 | ) 7 | 8 | var Server *server.Server 9 | 10 | var UMgr *UserMgr 11 | var GMgr *GameMgr 12 | 13 | func Init(serverID int32, config goserver.Config) error { 14 | s, err := server.NewServer(serverID, config) 15 | if err != nil { 16 | return err 17 | } 18 | Server = s 19 | registerHandler() 20 | GMgr = NewGameMgr() 21 | UMgr = NewUserMgr() 22 | return nil 23 | } 24 | 25 | func Run() { 26 | Server.Run() 27 | } 28 | -------------------------------------------------------------------------------- /admin/init.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/0990/goserver" 5 | "github.com/0990/goserver/server" 6 | ) 7 | 8 | var Server *server.Server 9 | 10 | func Init(serverID int32, addr string, config goserver.Config) error { 11 | s, err := server.NewServer(serverID, config) 12 | if err != nil { 13 | return err 14 | } 15 | Server = s 16 | startMetrics() 17 | 18 | hs := newHTTPServer(addr) 19 | err = hs.Run() 20 | if err != nil { 21 | return err 22 | } 23 | 24 | return nil 25 | } 26 | 27 | func Run() { 28 | Server.Run() 29 | } 30 | -------------------------------------------------------------------------------- /game/init.go: -------------------------------------------------------------------------------- 1 | package game 2 | 3 | import ( 4 | "github.com/0990/goserver" 5 | "github.com/0990/goserver/server" 6 | ) 7 | 8 | var Server *server.Server 9 | var GMgr *GameMgr 10 | var UMgr *UserMgr 11 | 12 | func Init(serverID int32, config goserver.Config) error { 13 | s, err := server.NewServer(serverID, config) 14 | if err != nil { 15 | return err 16 | } 17 | Server = s 18 | registerHandler() 19 | GMgr = NewGameMgr(s.Worker()) 20 | UMgr = NewUserMgr() 21 | return nil 22 | } 23 | 24 | func Run() { 25 | Server.Run() 26 | GMgr.Start() 27 | } 28 | -------------------------------------------------------------------------------- /util/go.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "fmt" 5 | "github.com/sirupsen/logrus" 6 | "os" 7 | "runtime/debug" 8 | ) 9 | 10 | func Recover() { 11 | if e := recover(); e != nil { 12 | stack := debug.Stack() 13 | logrus.WithFields(logrus.Fields{ 14 | "err": e, 15 | "stack": string(stack), 16 | }).Error("Recover") 17 | 18 | os.Stderr.Write([]byte(fmt.Sprintf("%v\n", e))) 19 | os.Stderr.Write(stack) 20 | } 21 | } 22 | 23 | // SafeGo go 24 | func SafeGo(f func()) { 25 | if f != nil { 26 | go func() { 27 | defer Recover() 28 | f() 29 | }() 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /gate/session.go: -------------------------------------------------------------------------------- 1 | package gate 2 | 3 | import "github.com/0990/goserver/network" 4 | 5 | type SessionMgr struct { 6 | sesID2Session map[int32]*Session 7 | } 8 | 9 | type Session struct { 10 | sesID int32 11 | userID uint64 12 | session network.Session 13 | logined bool 14 | } 15 | 16 | func newSessionMgr() *SessionMgr { 17 | return &SessionMgr{ 18 | sesID2Session: map[int32]*Session{}, 19 | } 20 | } 21 | 22 | func (p *SessionMgr) SetSessionLogined(sesID int32, userID uint64) { 23 | if session, exist := p.sesID2Session[sesID]; exist { 24 | session.userID = userID 25 | session.logined = true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/0990/avatar-fight-server 2 | 3 | go 1.13 4 | 5 | require ( 6 | github.com/0990/goserver v0.0.3 7 | github.com/golang/protobuf v1.5.2 8 | github.com/natefinch/lumberjack v2.0.0+incompatible 9 | github.com/nats-io/jwt v1.2.2 // indirect 10 | github.com/nats-io/nats.go v1.13.0 // indirect 11 | github.com/pkg/errors v0.9.1 12 | github.com/prometheus/client_golang v1.12.1 13 | github.com/sirupsen/logrus v1.8.1 14 | golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 // indirect 15 | golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect 16 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect 17 | ) 18 | -------------------------------------------------------------------------------- /cmd/game/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "github.com/0990/avatar-fight-server/conf" 6 | "github.com/0990/avatar-fight-server/game" 7 | "github.com/0990/goserver" 8 | "github.com/sirupsen/logrus" 9 | "os" 10 | "os/signal" 11 | ) 12 | 13 | var gosconf = flag.String("goserver", "default", "goserver config file") 14 | 15 | func main() { 16 | 17 | gosconf, err := goserver.ReadConfig(*gosconf) 18 | if err != nil { 19 | logrus.Fatal("readconf", err) 20 | } 21 | c := make(chan os.Signal, 1) 22 | signal.Notify(c) 23 | 24 | err = game.Init(conf.GameServerID, *gosconf) 25 | if err != nil { 26 | logrus.WithError(err).Fatal("gosconf", gosconf) 27 | } 28 | game.Run() 29 | 30 | s := <-c 31 | logrus.Info("Got signal:", s) 32 | } 33 | -------------------------------------------------------------------------------- /center/game.go: -------------------------------------------------------------------------------- 1 | package center 2 | 3 | type GameMgr struct { 4 | gameSeqid int64 5 | gameid2Game map[int64]*Game 6 | } 7 | 8 | func NewGameMgr() *GameMgr { 9 | p := &GameMgr{} 10 | p.gameid2Game = make(map[int64]*Game) 11 | return p 12 | } 13 | 14 | func (p *GameMgr) AddGame(gameID int64, serverID int32) { 15 | p.gameid2Game[gameID] = &Game{ 16 | serverID: serverID, 17 | gameID: gameID, 18 | } 19 | } 20 | 21 | func (p *GameMgr) GetGame(gameID int64) *Game { 22 | return p.gameid2Game[gameID] 23 | } 24 | 25 | func (p *GameMgr) AddGameUser(gameID int64, userID uint64) { 26 | game, exist := p.gameid2Game[gameID] 27 | if !exist { 28 | return 29 | } 30 | game.userIds = append(game.userIds, userID) 31 | } 32 | 33 | func (p *GameMgr) RemoveGame(gameID int64) *Game { 34 | game, exist := p.gameid2Game[gameID] 35 | if !exist { 36 | return nil 37 | } 38 | delete(p.gameid2Game, gameID) 39 | return game 40 | } 41 | 42 | type Game struct { 43 | gameID int64 44 | serverID int32 45 | userIds []uint64 46 | } 47 | -------------------------------------------------------------------------------- /gate/route.go: -------------------------------------------------------------------------------- 1 | package gate 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/conf" 5 | "github.com/0990/avatar-fight-server/msg/cmsg" 6 | "github.com/0990/goserver/network" 7 | "github.com/golang/protobuf/proto" 8 | ) 9 | 10 | func registerRoute() { 11 | //先简化处理,游戏服只有一个 12 | Route2ServerID((*cmsg.ReqJump)(nil), conf.GameServerID) 13 | Route2ServerID((*cmsg.ReqMove)(nil), conf.GameServerID) 14 | Route2ServerID((*cmsg.ReqShoot)(nil), conf.GameServerID) 15 | Route2ServerID((*cmsg.ReqGameScene)(nil), conf.GameServerID) 16 | Route2ServerID((*cmsg.ReqJoinGame)(nil), conf.CenterServerID) 17 | //enter是加入成功后,请求进入游戏的消息 18 | Route2ServerID((*cmsg.ReqEnterGame)(nil), conf.GameServerID) 19 | } 20 | 21 | func Route2ServerID(msg proto.Message, serverID int32) { 22 | Gate.RegisterRawSessionMsgHandler(msg, func(session network.Session, message proto.Message) { 23 | s, exist := SMgr.sesID2Session[session.ID()] 24 | if !exist { 25 | return 26 | } 27 | if !s.logined { 28 | return 29 | } 30 | Gate.GetServerById(serverID).RouteSession2Server(session.ID(), message) 31 | }) 32 | } 33 | -------------------------------------------------------------------------------- /admin/http_server.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "context" 5 | "github.com/0990/avatar-fight-server/util" 6 | "github.com/prometheus/client_golang/prometheus/promhttp" 7 | "github.com/sirupsen/logrus" 8 | "net" 9 | "net/http" 10 | "time" 11 | ) 12 | 13 | type httpServer struct { 14 | listenAddr string 15 | router *http.ServeMux 16 | server *http.Server 17 | } 18 | 19 | func newHTTPServer(listenAddr string) *httpServer { 20 | s := &httpServer{} 21 | s.router = http.NewServeMux() 22 | s.listenAddr = listenAddr 23 | s.routes() 24 | return s 25 | } 26 | 27 | func (s *httpServer) Run() error { 28 | ln, err := net.Listen("tcp", s.listenAddr) 29 | if err != nil { 30 | return err 31 | } 32 | s.server = &http.Server{Handler: s.router} 33 | util.SafeGo(func() { 34 | err := s.server.Serve(ln) 35 | if err != nil && err != http.ErrServerClosed { 36 | logrus.WithFields(logrus.Fields{ 37 | "ListenAddr": s.listenAddr, 38 | }).WithError(err).Error("http.ListenAndServer error") 39 | panic(err) 40 | } 41 | }) 42 | return nil 43 | } 44 | 45 | func (p *httpServer) routes() { 46 | p.router.Handle("/metrics", promhttp.Handler()) 47 | } 48 | 49 | func (s *httpServer) GraceShutDown() error { 50 | //给服务端最多30秒的关闭时间,如果服务端还没关好,强制结束整个服务 51 | ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) 52 | defer cancel() 53 | 54 | s.server.SetKeepAlivesEnabled(false) 55 | if err := s.server.Shutdown(ctx); err != nil { 56 | return err 57 | } 58 | return nil 59 | } 60 | -------------------------------------------------------------------------------- /logconfig/log.go: -------------------------------------------------------------------------------- 1 | package logconfig 2 | 3 | import ( 4 | "fmt" 5 | "github.com/natefinch/lumberjack" 6 | "github.com/sirupsen/logrus" 7 | "io" 8 | ) 9 | 10 | func InitLogrus(name string, maxMB int) { 11 | formatter := &logrus.TextFormatter{ 12 | DisableColors: true, 13 | DisableTimestamp: false, 14 | TimestampFormat: "2006-01-02 15:04:05", 15 | } 16 | logrus.SetFormatter(formatter) 17 | logrus.SetLevel(logrus.InfoLevel) 18 | logrus.AddHook(NewDefaultHook(name, maxMB)) 19 | } 20 | 21 | type DefaultHook struct { 22 | writers map[logrus.Level]io.Writer 23 | errWriter io.Writer 24 | fmt logrus.Formatter 25 | } 26 | 27 | func NewDefaultHook(name string, maxSize int) *DefaultHook { 28 | formatter := &logrus.TextFormatter{ 29 | DisableColors: true, 30 | DisableTimestamp: false, 31 | } 32 | 33 | writers := make(map[logrus.Level]io.Writer) 34 | for _, level := range logrus.AllLevels { 35 | writers[level] = &lumberjack.Logger{ 36 | Filename: fmt.Sprintf("%s_%s.log", name, level.String()), 37 | MaxSize: maxSize, 38 | MaxAge: 100, 39 | MaxBackups: 100, 40 | LocalTime: true, 41 | Compress: false, 42 | } 43 | } 44 | 45 | return &DefaultHook{ 46 | writers: writers, 47 | fmt: formatter, 48 | } 49 | } 50 | 51 | func (p *DefaultHook) Fire(entry *logrus.Entry) error { 52 | data, err := p.fmt.Format(entry) 53 | if err != nil { 54 | return err 55 | } 56 | _, err = p.writers[entry.Level].Write(data) 57 | return err 58 | } 59 | 60 | func (p *DefaultHook) Levels() []logrus.Level { 61 | return logrus.AllLevels 62 | } 63 | -------------------------------------------------------------------------------- /msg/smsg/smsg.proto: -------------------------------------------------------------------------------- 1 | syntax="proto3"; 2 | package smsg; 3 | 4 | message Server2AllSession{ 5 | bytes data = 1; 6 | } 7 | 8 | message GaCeReqLogin{ 9 | int32 sesid = 1; 10 | string token = 2; 11 | } 12 | 13 | message GaCeRespLogin{ 14 | enum Error{ 15 | Invalid = 0; 16 | } 17 | uint64 userID = 1; 18 | Error err = 2; 19 | string token = 3; 20 | bool inGame = 4; 21 | } 22 | 23 | message CeGaBindGameServer{ 24 | int32 sesid = 1; 25 | int32 gameserverid = 2; 26 | } 27 | 28 | message CeGamReqJoinGame{ 29 | uint64 userid =1; 30 | int32 sesid = 2; 31 | string nickname = 3; 32 | int32 gateServerid = 4; 33 | } 34 | 35 | message CeGamRespJoinGame{ 36 | enum Error{ 37 | Invalid = 0; 38 | GameNotExist = 1; 39 | } 40 | Error err = 1; 41 | int64 gameid =2; 42 | } 43 | 44 | message GamCeNoticeGameStart{ 45 | int64 gameid = 1; 46 | } 47 | 48 | message GamCeNoticeGameEnd{ 49 | int64 gameid = 1; 50 | } 51 | 52 | message CeGameUserDisconnect{ 53 | uint64 userid = 1; 54 | } 55 | 56 | message CeGameUserReconnect{ 57 | uint64 userid = 1; 58 | int32 gateID = 2; 59 | int32 sessionID = 3; 60 | } 61 | 62 | message GaCeUserDisconnect{ 63 | int32 sessionID = 1; 64 | } 65 | 66 | message CeGaCloseSession{ 67 | int32 sessionID = 1; 68 | } 69 | 70 | message AdReqMetrics{ 71 | int64 reqTime = 3; 72 | } 73 | 74 | message AdRespMetrics{ 75 | enum MetricsType{ 76 | Invalid = 0; 77 | OnlineCount = 1;//在线人数 78 | } 79 | 80 | message Metrics{ 81 | MetricsType key = 1; 82 | int32 value = 2; 83 | } 84 | 85 | repeated Metrics metrics = 1; 86 | int64 reqTime = 2; 87 | } -------------------------------------------------------------------------------- /game/user.go: -------------------------------------------------------------------------------- 1 | package game 2 | 3 | import ( 4 | "github.com/0990/goserver/rpc" 5 | "github.com/golang/protobuf/proto" 6 | ) 7 | 8 | type AccountType int8 9 | 10 | const ( 11 | _ AccountType = iota 12 | VISITOR 13 | WX 14 | ROBOT 15 | ) 16 | 17 | type UserMgr struct { 18 | ses2User map[rpc.GateSessionID]*User 19 | userID2User map[uint64]*User 20 | } 21 | 22 | func NewUserMgr() *UserMgr { 23 | p := new(UserMgr) 24 | p.ses2User = map[rpc.GateSessionID]*User{} 25 | p.userID2User = map[uint64]*User{} 26 | return p 27 | } 28 | 29 | func (p *UserMgr) GetUserBySession(id rpc.GateSessionID) (*User, bool) { 30 | v, ok := p.ses2User[id] 31 | return v, ok 32 | } 33 | 34 | func (p *UserMgr) GetUserByUserID(userID uint64) (*User, bool) { 35 | v, ok := p.userID2User[userID] 36 | return v, ok 37 | } 38 | 39 | func (p *UserMgr) DelUser(userID uint64) { 40 | u, ok := p.userID2User[userID] 41 | if !ok { 42 | return 43 | } 44 | delete(p.ses2User, u.sessionID) 45 | delete(p.userID2User, userID) 46 | } 47 | 48 | func (p *UserMgr) DelSession(sessionID rpc.GateSessionID) { 49 | delete(p.ses2User, sessionID) 50 | return 51 | } 52 | 53 | func (p *UserMgr) AddSession(sessionID rpc.GateSessionID, u *User) { 54 | p.ses2User[sessionID] = u 55 | } 56 | 57 | func (p *UserMgr) AddUser(u *User) { 58 | p.ses2User[u.sessionID] = u 59 | p.userID2User[u.userID] = u 60 | } 61 | 62 | type User struct { 63 | game *Game 64 | sessionID rpc.GateSessionID 65 | userID uint64 66 | nickname string 67 | accountType AccountType 68 | headImgUrl string 69 | offline bool 70 | } 71 | 72 | func (p *User) Send2Client(msg proto.Message) { 73 | if p.accountType == ROBOT { 74 | return 75 | } 76 | Server.RPCSession(p.sessionID).SendMsg(msg) 77 | } 78 | -------------------------------------------------------------------------------- /game/util.go: -------------------------------------------------------------------------------- 1 | package game 2 | 3 | import "math" 4 | 5 | func NewRotation(lastRotation, pressTime, targetRotation float32) float32 { 6 | delta := math.Abs(float64(targetRotation - lastRotation)) 7 | if delta >= 180 { 8 | delta = math.Abs(360 - delta) 9 | } 10 | var newRotation float32 11 | if delta <= float64(pressTime*ROTATION_DELTA) { 12 | newRotation = targetRotation 13 | } else { 14 | var change float32 15 | if lastRotation >= 0 { 16 | if lastRotation-180 < targetRotation && targetRotation < lastRotation { 17 | change = -pressTime * ROTATION_DELTA 18 | } else { 19 | change = pressTime * ROTATION_DELTA 20 | } 21 | } else { 22 | if lastRotation < targetRotation && targetRotation < lastRotation+180 { 23 | change = pressTime * ROTATION_DELTA 24 | } else { 25 | change = -pressTime * ROTATION_DELTA 26 | } 27 | } 28 | newRotation = lastRotation + change 29 | } 30 | 31 | if newRotation > 180 { 32 | newRotation = newRotation - 360 33 | } 34 | if newRotation < -180 { 35 | newRotation = 360 + newRotation 36 | } 37 | return newRotation 38 | } 39 | 40 | func NewXPos(lastPos, lastRotation, pressTime float32) float32 { 41 | newXPos := lastPos + pressTime*ENTITY_SPEED*float32(math.Cos(float64(lastRotation*math.Pi/180))) 42 | if newXPos < ENTITY_RADIUS { 43 | newXPos = ENTITY_RADIUS 44 | } 45 | if newXPos > WORLD_WIDTH-ENTITY_RADIUS { 46 | newXPos = WORLD_WIDTH - ENTITY_RADIUS 47 | } 48 | return newXPos 49 | } 50 | 51 | func NewYPos(lastPos, lastRotation, pressTime float32) float32 { 52 | newYPos := lastPos + pressTime*ENTITY_SPEED*float32(math.Sin(float64(lastRotation*math.Pi/180))) 53 | if newYPos < ENTITY_RADIUS { 54 | newYPos = ENTITY_RADIUS 55 | } 56 | 57 | if newYPos > WORLD_HEIGHT-ENTITY_RADIUS { 58 | newYPos = WORLD_HEIGHT - ENTITY_RADIUS 59 | } 60 | return newYPos 61 | } 62 | -------------------------------------------------------------------------------- /center/user.go: -------------------------------------------------------------------------------- 1 | package center 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/util" 5 | "github.com/0990/goserver/rpc" 6 | ) 7 | 8 | type UserMgr struct { 9 | token2User map[string]*User 10 | id2User map[uint64]*User 11 | ses2User map[rpc.GateSessionID]*User //TODO rpc.Session作为key的情况 12 | userSeqID uint64 13 | } 14 | 15 | func NewUserMgr() *UserMgr { 16 | p := new(UserMgr) 17 | p.token2User = make(map[string]*User) 18 | p.id2User = make(map[uint64]*User) 19 | p.ses2User = make(map[rpc.GateSessionID]*User) 20 | return p 21 | } 22 | 23 | type User struct { 24 | userID uint64 25 | session rpc.GateSessionID 26 | token string 27 | online bool 28 | //TODO token过期处理 29 | //tokenExpireTime int64 30 | game *Game 31 | } 32 | 33 | func (u *User) SetSession(s rpc.GateSessionID) { 34 | u.session = s 35 | } 36 | 37 | func (p *UserMgr) NewUserID() uint64 { 38 | p.userSeqID++ 39 | return p.userSeqID 40 | } 41 | 42 | func (p *UserMgr) AddUser(s rpc.GateSessionID) *User { 43 | token := util.RandomStr(10) 44 | userID := p.NewUserID() 45 | 46 | u := &User{ 47 | userID: userID, 48 | session: s, 49 | token: token, 50 | online: true, 51 | } 52 | p.token2User[token] = u 53 | p.id2User[userID] = u 54 | p.ses2User[s] = u 55 | return u 56 | } 57 | 58 | func (p *UserMgr) UpdateUserSession(u *User, s rpc.GateSessionID) { 59 | u.session = s 60 | p.ses2User[s] = u 61 | } 62 | 63 | func (p *UserMgr) FindUserByToken(token string) (*User, bool) { 64 | v, ok := p.token2User[token] 65 | return v, ok 66 | } 67 | 68 | func (p *UserMgr) FindUserBySession(session rpc.GateSessionID) (*User, bool) { 69 | v, ok := p.ses2User[session] 70 | return v, ok 71 | } 72 | 73 | func (p *UserMgr) RemoveSession(session rpc.GateSessionID) { 74 | delete(p.ses2User, session) 75 | } 76 | func (p *UserMgr) FindUserByUserId(userID uint64) (*User, bool) { 77 | v, ok := p.id2User[userID] 78 | return v, ok 79 | } 80 | -------------------------------------------------------------------------------- /game/gamemgr.go: -------------------------------------------------------------------------------- 1 | package game 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/conf" 5 | "github.com/0990/avatar-fight-server/msg/smsg" 6 | "github.com/0990/goserver/rpc" 7 | "github.com/0990/goserver/service" 8 | "github.com/pkg/errors" 9 | ) 10 | 11 | type GameMgr struct { 12 | //TODO 使用snowflake生成分布式的游戏ID 13 | gameSeqid int64 14 | gameid2Game map[int64]*Game 15 | userid2Game map[uint64]*Game 16 | currGame *Game 17 | worker service.Worker 18 | } 19 | 20 | func NewGameMgr(worker service.Worker) *GameMgr { 21 | p := new(GameMgr) 22 | p.gameid2Game = map[int64]*Game{} 23 | p.userid2Game = map[uint64]*Game{} 24 | p.worker = worker 25 | return p 26 | } 27 | 28 | func (p *GameMgr) Start() { 29 | p.CreateNewGame() 30 | } 31 | 32 | func (p *GameMgr) CreateNewGame() { 33 | p.gameSeqid++ 34 | game := newGame(p.gameSeqid, p.onGameEnd, p.worker) 35 | p.gameid2Game[p.gameSeqid] = game 36 | p.currGame = game 37 | game.Run() 38 | Server.GetServerById(conf.CenterServerID).Notify(&smsg.GamCeNoticeGameStart{ 39 | Gameid: game.gameID, 40 | }) 41 | return 42 | } 43 | 44 | func (p *GameMgr) onGameEnd(g *Game) { 45 | for _, entity := range g.userID2entity { 46 | UMgr.DelUser(entity.u.userID) 47 | } 48 | delete(p.gameid2Game, g.gameID) 49 | Server.GetServerById(conf.CenterServerID).Notify(&smsg.GamCeNoticeGameEnd{ 50 | Gameid: g.gameID, 51 | }) 52 | p.CreateNewGame() 53 | } 54 | 55 | func (p *GameMgr) JoinGame(userID uint64, nickname string, sesGateID int32, sesID int32) (*Game, error) { 56 | if p.currGame == nil { 57 | return nil, errors.New("currGame not exist") 58 | } 59 | 60 | session := rpc.GateSessionID{ 61 | GateID: sesGateID, 62 | SesID: sesID, 63 | } 64 | 65 | u := &User{ 66 | accountType: VISITOR, 67 | sessionID: session, 68 | userID: userID, 69 | nickname: nickname, 70 | } 71 | 72 | err := p.currGame.Join(u) 73 | if err != nil { 74 | return nil, err 75 | } 76 | UMgr.AddUser(u) 77 | return p.currGame, nil 78 | } 79 | -------------------------------------------------------------------------------- /admin/metrics.go: -------------------------------------------------------------------------------- 1 | package admin 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/conf" 5 | "github.com/0990/avatar-fight-server/msg/smsg" 6 | "github.com/0990/avatar-fight-server/util" 7 | "github.com/prometheus/client_golang/prometheus" 8 | "github.com/prometheus/client_golang/prometheus/promauto" 9 | "github.com/sirupsen/logrus" 10 | "strconv" 11 | "time" 12 | ) 13 | 14 | var ( 15 | metrics_online = promauto.NewGauge(prometheus.GaugeOpts{ 16 | Name: "online_count", 17 | Help: "online player count", 18 | }) 19 | 20 | metrics_rpc_millseconds = promauto.NewHistogramVec(prometheus.HistogramOpts{ 21 | Namespace: "", 22 | Subsystem: "", 23 | Name: "rpc_millseconds", 24 | Help: "", 25 | ConstLabels: nil, 26 | Buckets: []float64{10, 50, 200, 500}, 27 | }, []string{"serverId"}) 28 | ) 29 | 30 | func startMetrics() { 31 | serverIds := []int32{conf.GameServerID, conf.GateServerID, conf.CenterServerID} 32 | 33 | util.SafeGo(func() { 34 | for { 35 | time.Sleep(time.Second * 10) 36 | 37 | for _, v := range serverIds { 38 | serverId := v 39 | 40 | start := time.Now().UnixNano() 41 | 42 | metrics, err := reqMetrics(serverId) 43 | if err != nil { 44 | logrus.WithError(err).Error("req metrics") 45 | return 46 | } 47 | 48 | elapse := (time.Now().UnixNano() - start) / 1e6 49 | updateMetrics(serverId, metrics, elapse) 50 | } 51 | } 52 | }) 53 | } 54 | 55 | func updateMetrics(serverId int32, metrics []*smsg.AdRespMetrics_Metrics, elapse int64) { 56 | updateMetricsRPC(serverId, elapse) 57 | 58 | for _, v := range metrics { 59 | switch v.Key { 60 | case smsg.AdRespMetrics_OnlineCount: 61 | updateMetricsOnline(v.Value) 62 | default: 63 | 64 | } 65 | } 66 | } 67 | 68 | func updateMetricsRPC(serverId int32, elapse int64) { 69 | metrics_rpc_millseconds.With(prometheus.Labels{"serverId": strconv.FormatInt(int64(serverId), 10)}).Observe(float64(elapse)) 70 | } 71 | 72 | func updateMetricsOnline(count int32) { 73 | metrics_online.Set(float64(count)) 74 | } 75 | 76 | func reqMetrics(serverId int32) ([]*smsg.AdRespMetrics_Metrics, error) { 77 | resp := smsg.AdRespMetrics{} 78 | err := Server.GetServerById(serverId).Call(&smsg.AdReqMetrics{}, &resp) 79 | if err != nil { 80 | return nil, err 81 | } 82 | return resp.Metrics, nil 83 | } 84 | -------------------------------------------------------------------------------- /gate/msg_handler.go: -------------------------------------------------------------------------------- 1 | package gate 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/conf" 5 | "github.com/0990/avatar-fight-server/msg/cmsg" 6 | "github.com/0990/avatar-fight-server/msg/smsg" 7 | "github.com/0990/goserver/network" 8 | "github.com/0990/goserver/rpc" 9 | "time" 10 | ) 11 | 12 | func registerHandler() { 13 | Gate.RegisterNetWorkEvent(onConnect, onDisconnect) 14 | Gate.RegisterSessionMsgHandler(Login) 15 | //Gate.RegisterSessionMsgHandler(Test) 16 | Gate.RegisterServerHandler(NoticeSessionClose) 17 | Gate.RegisterRequestMsgHandler(Metric) 18 | } 19 | 20 | func Login(session network.Session, msg *cmsg.ReqLogin) { 21 | Gate.GetServerById(conf.CenterServerID).Request(&smsg.GaCeReqLogin{Sesid: session.ID(), Token: msg.Token}, func(cbResp *smsg.GaCeRespLogin, err error) { 22 | resp := &cmsg.RespLogin{} 23 | defer session.SendMsg(resp) 24 | if err != nil { 25 | resp.Err = cmsg.RespLogin_RPCError 26 | return 27 | } 28 | 29 | if cbResp.Err != 0 { 30 | resp.Err = 1 31 | return 32 | } 33 | 34 | userID := cbResp.UserID 35 | 36 | resp.UserID = userID 37 | resp.Token = cbResp.Token 38 | resp.InGame = cbResp.InGame 39 | 40 | SMgr.SetSessionLogined(session.ID(), userID) 41 | return 42 | }) 43 | } 44 | 45 | func onConnect(conn network.Session) { 46 | SMgr.sesID2Session[conn.ID()] = &Session{ 47 | session: conn, 48 | sesID: conn.ID(), 49 | } 50 | } 51 | 52 | func onDisconnect(conn network.Session) { 53 | //TODO 这里先简单处理,理论上没有登录上的玩家不用向中心服务器通知离线事件 54 | Gate.GetServerById(conf.CenterServerID).Notify(&smsg.GaCeUserDisconnect{ 55 | SessionID: conn.ID(), 56 | }) 57 | delete(SMgr.sesID2Session, conn.ID()) 58 | } 59 | 60 | func NoticeSessionClose(server rpc.Server, req *smsg.CeGaCloseSession) { 61 | s, exist := SMgr.sesID2Session[req.SessionID] 62 | if !exist { 63 | return 64 | } 65 | s.session.SendMsg(&cmsg.SNoticeKickOut{ 66 | Reason: cmsg.SNoticeKickOut_Relogin, 67 | }) 68 | //TODO 客户端有问题,暂时服务端过会再关 69 | Gate.AfterPost(time.Second, func() { 70 | s.session.Close() 71 | }) 72 | delete(SMgr.sesID2Session, req.SessionID) 73 | } 74 | 75 | func Test(session network.Session, msg *cmsg.ReqJoinGame) { 76 | Gate.GetServerById(conf.CenterServerID).RouteSession2Server(session.ID(), msg) 77 | } 78 | 79 | func Metric(peer rpc.RequestServer, req *smsg.AdReqMetrics) { 80 | resp := &smsg.AdRespMetrics{} 81 | defer peer.Answer(resp) 82 | } 83 | -------------------------------------------------------------------------------- /cmd/all/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "github.com/0990/avatar-fight-server/admin" 7 | "github.com/0990/avatar-fight-server/center" 8 | "github.com/0990/avatar-fight-server/conf" 9 | "github.com/0990/avatar-fight-server/game" 10 | "github.com/0990/avatar-fight-server/gate" 11 | "github.com/0990/avatar-fight-server/logconfig" 12 | "github.com/0990/goserver" 13 | "github.com/sirupsen/logrus" 14 | "net/http" 15 | _ "net/http/pprof" 16 | "os" 17 | "os/signal" 18 | "runtime" 19 | "syscall" 20 | ) 21 | 22 | var addr = flag.String("addr", "0.0.0.0:9000", "http service address") 23 | var pprofAddr = flag.String("pprof_addr", "0.0.0.0:9900", "http pprof service address") 24 | var adminAddr = flag.String("admin_addr", "0.0.0.0:8080", "admin http address") 25 | var gosconf = flag.String("goserver", "", "goserver config file") 26 | 27 | //TODO 加woker性能监控和运行时堆栈打印 28 | func main() { 29 | //日志初始化 30 | logconfig.InitLogrus("af", 10) 31 | 32 | flag.Parse() 33 | gosconf, err := goserver.ReadConfig(*gosconf) 34 | if err != nil { 35 | logrus.Fatal("readconfig ", err) 36 | } 37 | go func() { 38 | http.ListenAndServe(*pprofAddr, nil) 39 | }() 40 | //center 41 | err = center.Init(conf.CenterServerID, *gosconf) 42 | if err != nil { 43 | logrus.WithError(err).Fatal("gosconf", gosconf) 44 | } 45 | center.Run() 46 | 47 | //gate 48 | err = gate.Init(conf.GateServerID, *addr, *gosconf) 49 | if err != nil { 50 | logrus.WithError(err).Fatal("gosconf", gosconf) 51 | } 52 | gate.Run() 53 | 54 | //game 55 | err = game.Init(conf.GameServerID, *gosconf) 56 | if err != nil { 57 | logrus.WithError(err).Fatal("gosconf", gosconf) 58 | } 59 | game.Run() 60 | 61 | //admin 62 | err = admin.Init(conf.AdminServerID, *adminAddr, *gosconf) 63 | if err != nil { 64 | logrus.WithError(err).Fatal("gosconf", gosconf) 65 | } 66 | admin.Run() 67 | 68 | logrus.Info("start success...") 69 | c := make(chan os.Signal, 1) 70 | signal.Notify(c, os.Interrupt, os.Kill) 71 | s := <-c 72 | logrus.Info("Got signal:", s) 73 | } 74 | 75 | func setupSigusr1Trap() { 76 | c := make(chan os.Signal, 1) 77 | signal.Notify(c, syscall.SIGINT) 78 | go func() { 79 | for range c { 80 | DumpStacks() 81 | } 82 | }() 83 | } 84 | func DumpStacks() { 85 | buf := make([]byte, 16384) 86 | buf = buf[:runtime.Stack(buf, true)] 87 | fmt.Printf("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf) 88 | } 89 | -------------------------------------------------------------------------------- /game/msg_handler.go: -------------------------------------------------------------------------------- 1 | package game 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/msg/cmsg" 5 | "github.com/0990/avatar-fight-server/msg/smsg" 6 | "github.com/0990/goserver/rpc" 7 | "github.com/sirupsen/logrus" 8 | ) 9 | 10 | func registerHandler() { 11 | Server.RegisterRequestMsgHandler(JoinGame) 12 | Server.RegisterRequestMsgHandler(Metric) 13 | Server.RegisterSessionMsgHandler(ReqGameScene) 14 | Server.RegisterSessionMsgHandler(ReqEnterGame) 15 | Server.RegisterSessionMsgHandler(ReqMove) 16 | Server.RegisterSessionMsgHandler(ReqJump) 17 | Server.RegisterSessionMsgHandler(ReqShoot) 18 | Server.RegisterServerHandler(UserDisconnect) 19 | Server.RegisterServerHandler(UserReconnect) 20 | } 21 | 22 | func UserDisconnect(server rpc.Server, req *smsg.CeGameUserDisconnect) { 23 | userID := req.Userid 24 | user, ok := UMgr.GetUserByUserID(userID) 25 | if !ok { 26 | logrus.Error("session not existed") 27 | return 28 | } 29 | user.offline = true 30 | user.sessionID = rpc.GateSessionID{} 31 | UMgr.DelSession(user.sessionID) 32 | user.game.OnUserDisconnect(userID) 33 | } 34 | 35 | func UserReconnect(server rpc.Server, req *smsg.CeGameUserReconnect) { 36 | sessionID := rpc.GateSessionID{ 37 | GateID: req.GateID, 38 | SesID: req.SessionID, 39 | } 40 | userID := req.Userid 41 | user, ok := UMgr.GetUserByUserID(userID) 42 | if !ok { 43 | logrus.Error("session not existed") 44 | return 45 | } 46 | user.offline = false 47 | user.sessionID = sessionID 48 | UMgr.AddSession(sessionID, user) 49 | //user.game.OnUserReconnect(userID) 50 | } 51 | 52 | func JoinGame(server rpc.RequestServer, req *smsg.CeGamReqJoinGame) { 53 | resp := &smsg.CeGamRespJoinGame{} 54 | game, err := GMgr.JoinGame(req.Userid, req.Nickname, req.GateServerid, req.Sesid) 55 | if err != nil { 56 | resp.Err = smsg.CeGamRespJoinGame_GameNotExist 57 | server.Answer(resp) 58 | return 59 | } 60 | 61 | resp.Gameid = game.gameID 62 | server.Answer(resp) 63 | } 64 | 65 | func ReqEnterGame(session rpc.Session, req *cmsg.ReqEnterGame) { 66 | resp := &cmsg.RespEnterGame{} 67 | id := session.GateSessionID() 68 | user, ok := UMgr.GetUserBySession(id) 69 | if !ok { 70 | logrus.Error("session not existed") 71 | //resp.Err = cmsg.RespGameScene_GameNotExist 72 | session.SendMsg(resp) 73 | return 74 | } 75 | user.game.OnReqEnterGame(session, user.userID, req) 76 | } 77 | 78 | func ReqGameScene(session rpc.Session, req *cmsg.ReqGameScene) { 79 | resp := &cmsg.RespGameScene{} 80 | id := session.GateSessionID() 81 | user, ok := UMgr.GetUserBySession(id) 82 | if !ok { 83 | resp.Err = cmsg.RespGameScene_GameNotExist 84 | session.SendMsg(resp) 85 | return 86 | } 87 | user.game.OnReqGameScene(session, user.userID, req) 88 | } 89 | 90 | //TODO 以下三个消息可以利用reflect复用公共代码 91 | func ReqMove(session rpc.Session, req *cmsg.ReqMove) { 92 | id := session.GateSessionID() 93 | user, ok := UMgr.GetUserBySession(id) 94 | if !ok { 95 | return 96 | } 97 | user.game.OnReqMove(user.userID, req) 98 | } 99 | 100 | func ReqJump(session rpc.Session, req *cmsg.ReqJump) { 101 | id := session.GateSessionID() 102 | user, ok := UMgr.GetUserBySession(id) 103 | if !ok { 104 | return 105 | } 106 | user.game.OnReqJump(user.userID, req) 107 | } 108 | 109 | func ReqShoot(session rpc.Session, req *cmsg.ReqShoot) { 110 | id := session.GateSessionID() 111 | user, ok := UMgr.GetUserBySession(id) 112 | if !ok { 113 | return 114 | } 115 | user.game.OnReqShoot(user.userID, req) 116 | } 117 | 118 | func Metric(peer rpc.RequestServer, req *smsg.AdReqMetrics) { 119 | resp := &smsg.AdRespMetrics{} 120 | defer peer.Answer(resp) 121 | } 122 | -------------------------------------------------------------------------------- /msg/cmsg/cmsg.proto: -------------------------------------------------------------------------------- 1 | syntax="proto3"; 2 | package cmsg; 3 | message ReqLogin{ 4 | string token = 1; 5 | } 6 | 7 | message RespLogin{ 8 | enum Error{ 9 | Invalid = 0; 10 | RPCError = 1; 11 | } 12 | Error err = 1; 13 | uint64 userID = 2; 14 | string token = 3; 15 | bool inGame = 4;//是否正在游戏中 16 | } 17 | 18 | message ReqJoinGame{ 19 | string nickname =1; 20 | } 21 | 22 | message RespJoinGame{ 23 | enum Error{ 24 | Invalid = 0; 25 | UserNotExisted =1; 26 | AlreadyInGame = 2; 27 | } 28 | Error err = 1; 29 | string nickname = 2; 30 | } 31 | 32 | message ReqEnterGame{ 33 | 34 | } 35 | 36 | message RespEnterGame{ 37 | 38 | enum Error{ 39 | Invalid = 0; 40 | } 41 | message Config{ 42 | int32 bulletLiveTime = 1; 43 | float rotationDelta = 2; 44 | int32 entitySpeed = 3; 45 | int32 bulletSpeed = 4; 46 | int32 noticePosDuration = 5; 47 | int32 protectTime = 6; 48 | int32 entityRadius = 7; 49 | } 50 | 51 | Config config = 1; 52 | int32 entityID = 2; 53 | int32 gameLeftSec = 3; 54 | bool dead = 4;//是否已挂 55 | Error err = 5; 56 | } 57 | 58 | message Rank{ 59 | message Item{ 60 | int32 entityID = 1; 61 | int32 score = 2; 62 | int32 rank = 3; 63 | int32 killCount = 4; 64 | string headImgUrl = 5; 65 | string nickname = 6; 66 | } 67 | repeated Item list = 1; 68 | } 69 | 70 | message SNoticeGameOver{ 71 | message Killer{ 72 | int32 accountType = 1; 73 | string nickname = 2; 74 | string headImgUrl = 3; 75 | int32 hp = 4; 76 | } 77 | 78 | int32 overReason = 1; 79 | Killer killer = 2; 80 | int32 gameLeftSec = 3; 81 | Rank rank = 4; 82 | } 83 | 84 | message ReqMove{ 85 | float pressTime = 1; 86 | float targetRotation = 2; 87 | int32 inputSeqID = 3; 88 | } 89 | 90 | message ReqShoot{ 91 | 92 | } 93 | 94 | message ReqJump{ 95 | 96 | } 97 | 98 | //请求游戏场景信息 99 | message ReqGameScene{ 100 | 101 | } 102 | 103 | //断线重连,请求当前场景信息 104 | message RespGameScene{ 105 | enum Error{ 106 | Invalid = 0; 107 | GameNotExist = 1; 108 | } 109 | repeated Entity entities = 1; 110 | int32 gameLeftSec = 2; 111 | Error err = 3; 112 | } 113 | 114 | //子弹发送 115 | message SNoticeShoot{ 116 | float x = 1; 117 | float y = 2; 118 | float rotation = 3; 119 | int32 bulletID = 4; 120 | int32 creatorEntityID = 5; 121 | } 122 | 123 | message SNoticeWorldChange{ 124 | message Entity{ 125 | int32 id = 1; 126 | int32 hp = 2; 127 | int32 score = 3; 128 | int32 killCount = 4; 129 | } 130 | repeated int32 deleteBullets = 1; 131 | repeated int32 deleteEntities = 2; 132 | repeated Entity changedEntities = 3; 133 | } 134 | 135 | 136 | message SNoticeWorldPos{ 137 | message Entity{ 138 | int32 id = 1; 139 | float x = 2; 140 | float y = 3; 141 | float rotation = 4; 142 | } 143 | repeated Entity entities = 1; 144 | int32 lastProcessedInputID = 2; 145 | } 146 | 147 | message Entity{ 148 | int32 id = 1; 149 | int32 accountType = 2; 150 | string headImgUrl = 3; 151 | float rotation = 4; 152 | int32 hp = 5; 153 | int32 score = 6; 154 | int32 killCount = 7; 155 | bool dead = 8; 156 | bool protected = 9; 157 | float x = 10; 158 | float y = 11; 159 | string nickname = 12; 160 | } 161 | 162 | message SNoticeNewEntity{ 163 | Entity entity = 1; 164 | } 165 | 166 | //通知被T出 167 | message SNoticeKickOut{ 168 | enum Reason{ 169 | Invalid = 0; 170 | Relogin = 1;//重复登录被T出 171 | } 172 | Reason reason = 1; 173 | } 174 | 175 | 176 | -------------------------------------------------------------------------------- /center/msg_handler.go: -------------------------------------------------------------------------------- 1 | package center 2 | 3 | import ( 4 | "github.com/0990/avatar-fight-server/conf" 5 | "github.com/0990/avatar-fight-server/msg/cmsg" 6 | "github.com/0990/avatar-fight-server/msg/smsg" 7 | "github.com/0990/goserver/rpc" 8 | ) 9 | 10 | func registerHandler() { 11 | Server.RegisterRequestMsgHandler(Login) 12 | Server.RegisterRequestMsgHandler(Metric) 13 | Server.RegisterSessionMsgHandler(JoinGame) 14 | Server.RegisterServerHandler(NoticeGameStart) 15 | Server.RegisterServerHandler(NoticeGameEnd) 16 | Server.RegisterServerHandler(UserDisconnect) 17 | } 18 | 19 | func Login(peer rpc.RequestServer, req *smsg.GaCeReqLogin) { 20 | u, exist := UMgr.FindUserByToken(req.Token) 21 | 22 | gateSessionID := rpc.GateSessionID{ 23 | GateID: peer.ID(), 24 | SesID: req.Sesid, 25 | } 26 | //这里先简化处理,没找到就新建个玩家 27 | if exist { 28 | if u.online { 29 | Server.GetServerById(conf.GateServerID).Notify(&smsg.CeGaCloseSession{ 30 | SessionID: u.session.SesID, 31 | }) 32 | UMgr.RemoveSession(u.session) 33 | } 34 | 35 | if u.game != nil { 36 | if u.online { 37 | Server.GetServerById(conf.GameServerID).Notify(&smsg.CeGameUserDisconnect{ 38 | Userid: u.userID, 39 | }) 40 | } 41 | Server.GetServerById(conf.GameServerID).Notify(&smsg.CeGameUserReconnect{ 42 | Userid: u.userID, 43 | GateID: gateSessionID.GateID, 44 | SessionID: gateSessionID.SesID, 45 | }) 46 | } 47 | 48 | u.online = true 49 | UMgr.UpdateUserSession(u, gateSessionID) 50 | } else { 51 | u = UMgr.AddUser(gateSessionID) 52 | } 53 | resp := &smsg.GaCeRespLogin{ 54 | UserID: u.userID, 55 | Token: u.token, 56 | InGame: u.game != nil, 57 | } 58 | peer.Answer(resp) 59 | } 60 | 61 | func JoinGame(session rpc.Session, req *cmsg.ReqJoinGame) { 62 | resp := &cmsg.RespJoinGame{} 63 | 64 | u, exist := UMgr.FindUserBySession(session.GateSessionID()) 65 | if !exist { 66 | resp.Err = cmsg.RespJoinGame_UserNotExisted 67 | session.SendMsg(resp) 68 | return 69 | } 70 | 71 | if u.game != nil { 72 | resp.Err = cmsg.RespJoinGame_AlreadyInGame 73 | session.SendMsg(resp) 74 | return 75 | } 76 | 77 | Server.GetServerById(conf.GameServerID).Request(&smsg.CeGamReqJoinGame{ 78 | Userid: u.userID, 79 | Nickname: req.Nickname, 80 | GateServerid: u.session.GateID, 81 | Sesid: u.session.SesID, 82 | }, func(cbResp *smsg.CeGamRespJoinGame, err error) { 83 | if err != nil { 84 | resp.Err = 2 85 | session.SendMsg(cbResp) 86 | return 87 | } 88 | gameID := cbResp.Gameid 89 | u.game = GMgr.GetGame(gameID) 90 | GMgr.AddGameUser(gameID, u.userID) 91 | //TODO 多游戏服时,要在gate绑定game服 92 | //Server.GetServerById(100).Send(&smsg.CeGaBindGameServer{ 93 | // Sesid: 0, 94 | // Gameserverid: 102, 95 | //}) 96 | resp.Nickname = req.Nickname 97 | session.SendMsg(resp) 98 | return 99 | }) 100 | } 101 | 102 | func NoticeGameStart(server rpc.Server, req *smsg.GamCeNoticeGameStart) { 103 | GMgr.AddGame(req.Gameid, server.ID()) 104 | } 105 | 106 | func NoticeGameEnd(server rpc.Server, req *smsg.GamCeNoticeGameEnd) { 107 | game := GMgr.RemoveGame(req.Gameid) 108 | if game != nil { 109 | for _, userID := range game.userIds { 110 | if u, exist := UMgr.FindUserByUserId(userID); exist { 111 | u.game = nil 112 | } 113 | } 114 | } 115 | } 116 | 117 | func UserDisconnect(server rpc.Server, req *smsg.GaCeUserDisconnect) { 118 | session := rpc.GateSessionID{ 119 | GateID: server.ID(), 120 | SesID: req.SessionID, 121 | } 122 | u, exist := UMgr.FindUserBySession(session) 123 | if !exist { 124 | return 125 | } 126 | u.online = false 127 | UMgr.RemoveSession(session) 128 | if u.game != nil { 129 | Server.GetServerById(conf.GameServerID).Notify(&smsg.CeGameUserDisconnect{ 130 | Userid: u.userID, 131 | }) 132 | } 133 | } 134 | 135 | func Metric(peer rpc.RequestServer, req *smsg.AdReqMetrics) { 136 | resp := &smsg.AdRespMetrics{} 137 | defer peer.Answer(resp) 138 | 139 | resp.Metrics = append(resp.Metrics, &smsg.AdRespMetrics_Metrics{ 140 | Key: smsg.AdRespMetrics_OnlineCount, 141 | Value: int32(len(UMgr.ses2User)), 142 | }) 143 | } 144 | -------------------------------------------------------------------------------- /game/game.go: -------------------------------------------------------------------------------- 1 | package game 2 | 3 | import ( 4 | "container/list" 5 | "fmt" 6 | "github.com/0990/avatar-fight-server/msg/cmsg" 7 | "github.com/0990/avatar-fight-server/util" 8 | "github.com/0990/goserver/rpc" 9 | "github.com/0990/goserver/service" 10 | "github.com/golang/protobuf/proto" 11 | "github.com/pkg/errors" 12 | "github.com/sirupsen/logrus" 13 | "io" 14 | "math" 15 | "math/rand" 16 | "sort" 17 | "time" 18 | ) 19 | 20 | type OverReason int8 21 | 22 | const ( 23 | Invalid OverReason = iota 24 | Killed 25 | Normal 26 | ) 27 | 28 | const ( 29 | ENTITY_SPEED = 100.0 30 | ENTITY_RADIUS = 50.0 31 | BULLET_SPEED = 400.0 32 | 33 | SHOOT_LIMIT_MS = 500 //毫秒 34 | BULLET_LIVE_MS = 1500 //毫秒 35 | ENTITY_PROTECT_MS = 2000 //毫秒 36 | 37 | GAME_ROUND_SEC = 60 //秒 38 | 39 | WORLD_WIDTH = 2560.0 40 | WORLD_HEIGHT = 1440.0 41 | 42 | TICKER_UPDATE_MS = 50 43 | TICKER_NOTICE_POS_MS = 100 44 | 45 | ROTATION_DELTA = 180 46 | 47 | ROBOT_ID_START = 100000000000 48 | ) 49 | 50 | type Game struct { 51 | gameID int64 52 | entitySeqID int32 53 | bulletSeqID int32 54 | userSeqID uint64 55 | roundReqID int32 56 | robotCount int32 57 | startTimeSec int64 58 | userID2entity map[uint64]*Entity 59 | aliveUserID2Entity map[uint64]*Entity 60 | bulletList *list.List 61 | worker service.Worker 62 | onGameEnd func(*Game) 63 | 64 | updateTicker io.Closer 65 | syncPosTicker io.Closer 66 | printTicker io.Closer 67 | } 68 | 69 | func newGame(gameID int64, onGameEnd func(*Game), worker service.Worker) *Game { 70 | g := new(Game) 71 | g.userID2entity = map[uint64]*Entity{} 72 | g.aliveUserID2Entity = map[uint64]*Entity{} 73 | g.bulletList = list.New() 74 | g.gameID = gameID 75 | g.onGameEnd = onGameEnd 76 | g.worker = worker 77 | return g 78 | } 79 | 80 | type Entity struct { 81 | id int32 82 | x float32 83 | y float32 84 | rotation float32 85 | lastProcessedInput int32 86 | hp int32 87 | score int32 88 | dead bool 89 | isProtected bool //被保护中,玩家创建后一定时间内是受保护状态 90 | clientSceneReady bool //如果客户端进入场景了,代表已经数据和界面都准备好了,可以接受任何广播消息了 91 | 92 | createdTime int64 93 | 94 | killCount int32 95 | lastShootTime int64 96 | 97 | game *Game 98 | u *User 99 | } 100 | 101 | //func (p *Entity) Kill(someone *Entity) { 102 | // p.killCount++ 103 | // if someone.accountType == ROBOT { 104 | // p.score++ 105 | // } else { 106 | // p.score += 5 107 | // } 108 | //} 109 | 110 | func (p *Entity) ToCMsg() *cmsg.Entity { 111 | return &cmsg.Entity{ 112 | Id: p.id, 113 | AccountType: int32(p.u.accountType), 114 | HeadImgUrl: p.u.headImgUrl, 115 | Rotation: p.rotation, 116 | Hp: p.hp, 117 | Score: p.score, 118 | KillCount: p.killCount, 119 | Dead: p.dead, 120 | Protected: p.isProtected, 121 | X: p.x, 122 | Y: p.y, 123 | Nickname: p.u.nickname, 124 | } 125 | } 126 | 127 | func (p *Entity) KilledBy(killerUserID uint64) { 128 | var killer *Entity 129 | killer = p.game.userID2entity[killerUserID] 130 | //给击杀者相关奖励 131 | if killer != nil { 132 | killer.killCount++ 133 | if p.u.accountType == ROBOT { 134 | killer.score++ 135 | } else { 136 | killer.score += 5 137 | } 138 | } 139 | p.dead = true 140 | delete(p.game.aliveUserID2Entity, p.u.userID) 141 | 142 | killerInfo := &cmsg.SNoticeGameOver_Killer{} 143 | if killer != nil { 144 | killerInfo.HeadImgUrl = killer.u.headImgUrl 145 | killerInfo.AccountType = int32(killer.u.accountType) 146 | killerInfo.Nickname = killer.u.nickname 147 | killerInfo.Hp = killer.hp 148 | } 149 | 150 | msg := &cmsg.SNoticeGameOver{ 151 | OverReason: int32(Killed), 152 | GameLeftSec: p.game.gameLeftSec(), 153 | Killer: killerInfo, 154 | } 155 | p.u.Send2Client(msg) 156 | } 157 | 158 | type Bullet struct { 159 | id int32 160 | damage int32 161 | initCenterX float32 162 | initCenterY float32 163 | x float32 164 | y float32 165 | rotation float32 166 | creatorUserID uint64 167 | creatorEntityID int32 168 | createdTime int64 169 | } 170 | 171 | func (p *Game) Run() { 172 | p.startTimeSec = util.GetCurrentSec() 173 | p.updateTicker = p.worker.NewTicker(TICKER_UPDATE_MS*time.Millisecond, p.onUpdate) 174 | p.syncPosTicker = p.worker.NewTicker(TICKER_NOTICE_POS_MS*time.Millisecond, p.onNoticeWorldPos) 175 | p.worker.AfterPost(GAME_ROUND_SEC*time.Second, p.GameNormalEnd) 176 | 177 | p.printTicker = p.worker.NewTicker(time.Second*1, func() { 178 | //fmt.Println("entity count", len(p.userID2entity)) 179 | //fmt.Println("alive entity count", len(p.aliveUserID2Entity)) 180 | //fmt.Println("workerLen", p.worker.Len()) 181 | }) 182 | } 183 | 184 | func (p *Game) GameNormalEnd() { 185 | p.updateTicker.Close() 186 | p.syncPosTicker.Close() 187 | p.printTicker.Close() 188 | 189 | //TODO rankInfo 190 | rankInfo := &cmsg.Rank{} 191 | sortEntitys := p.sortRank() 192 | var rank int32 193 | for _, e := range sortEntitys { 194 | rank++ 195 | rankInfo.List = append(rankInfo.List, &cmsg.Rank_Item{ 196 | EntityID: e.id, 197 | Score: e.score, 198 | Rank: rank, 199 | KillCount: e.killCount, 200 | HeadImgUrl: e.u.headImgUrl, 201 | Nickname: e.u.nickname, 202 | }) 203 | } 204 | msg := &cmsg.SNoticeGameOver{ 205 | OverReason: int32(Normal), 206 | Rank: rankInfo, 207 | } 208 | p.Send2All(msg) 209 | 210 | p.userID2entity = make(map[uint64]*Entity) 211 | p.aliveUserID2Entity = make(map[uint64]*Entity) 212 | p.bulletList.Init() 213 | p.entitySeqID = 0 214 | p.robotCount = 0 215 | p.bulletSeqID = 0 216 | 217 | p.onGameEnd(p) 218 | } 219 | 220 | //排行 221 | func (p *Game) sortRank() []*Entity { 222 | entitys := make([]*Entity, 0, len(p.aliveUserID2Entity)) 223 | 224 | for _, v := range p.aliveUserID2Entity { 225 | entitys = append(entitys, v) 226 | } 227 | 228 | sort.Slice(entitys, func(i, j int) bool { 229 | a := entitys[i] 230 | b := entitys[j] 231 | if a.score > b.score { 232 | return true 233 | } else if a.score < b.score { 234 | return false 235 | } else { 236 | return a.id < b.id 237 | } 238 | }) 239 | return entitys 240 | } 241 | 242 | //刷新 主逻辑 243 | func (p *Game) onUpdate() { 244 | t := time.Now() 245 | defer util.PrintElapse("onUpdate", t) 246 | //创建机器人 247 | if rand.Int31()%150 < 3 { 248 | p.createRobot() 249 | } 250 | //机器人移动射击 251 | p.robotMoveShoot() 252 | //检查碰撞 253 | p.CheckCollision() 254 | } 255 | 256 | func (p *Game) onNoticeWorldPos() { 257 | t := time.Now() 258 | defer util.PrintElapse("onNoticeWorldPos", t) 259 | entities := make([]*cmsg.SNoticeWorldPos_Entity, 0, len(p.aliveUserID2Entity)) 260 | for _, e := range p.aliveUserID2Entity { 261 | entities = append(entities, &cmsg.SNoticeWorldPos_Entity{ 262 | Id: e.id, 263 | X: e.x, 264 | Y: e.y, 265 | Rotation: e.rotation, 266 | }) 267 | } 268 | 269 | p.SendPos2All(&cmsg.SNoticeWorldPos{ 270 | Entities: entities, 271 | }) 272 | } 273 | 274 | func (p *Game) newUserID() uint64 { 275 | p.userSeqID++ 276 | return p.userSeqID 277 | } 278 | 279 | func (p *Game) newEntityID() int32 { 280 | p.entitySeqID++ 281 | return p.entitySeqID 282 | } 283 | 284 | func (p *Game) createRobot() { 285 | p.robotCount++ 286 | nickname := fmt.Sprintf("robot%d", p.robotCount) 287 | 288 | //TODO 这里先简化处理,后面要使用唯一ID 289 | userID := ROBOT_ID_START + uint64(p.robotCount) 290 | 291 | u := &User{ 292 | accountType: ROBOT, 293 | userID: userID, 294 | nickname: nickname, 295 | } 296 | p.createEntity(u) 297 | } 298 | 299 | //模拟玩家移动射击 300 | func (p *Game) robotMoveShoot() { 301 | now := util.GetCurrentMillSec() 302 | for _, entity := range p.aliveUserID2Entity { 303 | if entity.u.accountType != ROBOT { 304 | continue 305 | } 306 | 307 | targetRotation := entity.rotation 308 | randInt := rand.Int() % 100 309 | switch { 310 | case randInt < 10: 311 | targetRotation = float32(rand.Int() % 180) 312 | case randInt < 20: 313 | targetRotation = float32(rand.Int() % 180) 314 | default: 315 | if entity.x < 640 { 316 | if entity.y < 360 { 317 | targetRotation = 45 318 | } else if entity.y > 1080 { 319 | targetRotation = -45 320 | } else { 321 | targetRotation = 0 322 | } 323 | } else if entity.x > 1920 { 324 | if entity.y < 360 { 325 | targetRotation = 135 326 | } else if entity.y > 1080 { 327 | targetRotation = -135 328 | } else { 329 | targetRotation = 180 330 | } 331 | } 332 | } 333 | 334 | p.entityMove(entity.u.userID, 0.05, targetRotation, 0) 335 | if now-entity.lastShootTime > 700 { 336 | p.entityShoot(entity.u.userID) 337 | } 338 | } 339 | } 340 | 341 | func (p *Game) createEntity(u *User) *Entity { 342 | x, y := p.GetRandPosition() 343 | 344 | e := &Entity{} 345 | e.id = p.newEntityID() 346 | e.x = x 347 | e.y = y 348 | e.u = u 349 | e.game = p 350 | e.hp = 6 351 | e.lastProcessedInput = -1 352 | e.createdTime = util.GetCurrentSec() 353 | e.isProtected = true 354 | e.lastShootTime = util.GetCurrentSec() 355 | 356 | p.worker.AfterPost(ENTITY_PROTECT_MS, func() { 357 | e.isProtected = false 358 | }) 359 | p.userID2entity[u.userID] = e 360 | p.aliveUserID2Entity[u.userID] = e 361 | 362 | p.Send2All(&cmsg.SNoticeNewEntity{ 363 | Entity: e.ToCMsg(), 364 | }) 365 | return e 366 | } 367 | 368 | func (p *Game) entityMove(userID uint64, pressTime, targetRotation float32, inputSeqid int32) { 369 | entity, exist := p.aliveUserID2Entity[userID] 370 | if !exist { 371 | return 372 | } 373 | 374 | lastRotation := entity.rotation 375 | newRotation := NewRotation(lastRotation, pressTime, targetRotation) 376 | newXPos := NewXPos(entity.x, lastRotation, pressTime) 377 | newYPos := NewYPos(entity.y, lastRotation, pressTime) 378 | 379 | entity.y = newYPos 380 | entity.x = newXPos 381 | entity.rotation = newRotation 382 | entity.lastProcessedInput = inputSeqid 383 | } 384 | 385 | func (p *Game) entityJump(userID uint64) { 386 | entity, exist := p.aliveUserID2Entity[userID] 387 | if !exist { 388 | return 389 | } 390 | 391 | entity.y = NewYPos(entity.y, entity.rotation, 1.0) 392 | entity.x = NewXPos(entity.x, entity.rotation, 1.0) 393 | } 394 | 395 | func (p *Game) entityShoot(userID uint64) { 396 | entity, exist := p.aliveUserID2Entity[userID] 397 | if !exist { 398 | return 399 | } 400 | 401 | if entity.dead { 402 | return 403 | } 404 | 405 | now := util.GetCurrentMillSec() 406 | if now-entity.lastShootTime < SHOOT_LIMIT_MS { 407 | return 408 | } 409 | 410 | entity.lastShootTime = now 411 | 412 | b := &Bullet{} 413 | b.rotation = entity.rotation 414 | rotation := float64(b.rotation * math.Pi / 180) 415 | b.y = entity.y + ENTITY_RADIUS*float32(math.Sin(rotation)) 416 | b.x = entity.x + ENTITY_RADIUS*float32(math.Cos(rotation)) 417 | b.initCenterX = entity.x 418 | b.initCenterY = entity.y 419 | 420 | b.creatorUserID = entity.u.userID 421 | b.creatorEntityID = entity.id 422 | 423 | b.id = p.NewBulletID() 424 | b.createdTime = now 425 | b.damage = 2 426 | p.bulletList.PushBack(b) 427 | 428 | //通知所有玩家 429 | msg := &cmsg.SNoticeShoot{} 430 | msg.X = b.x 431 | msg.Y = b.y 432 | msg.Rotation = b.rotation 433 | msg.BulletID = b.id 434 | msg.CreatorEntityID = b.creatorEntityID 435 | p.Send2All(msg) 436 | } 437 | 438 | func (p *Game) NewBulletID() int32 { 439 | p.bulletSeqID++ 440 | return p.bulletSeqID 441 | } 442 | 443 | func (p *Game) GetRandPosition() (x, y float32) { 444 | var nextRand bool 445 | var forCount int 446 | for { 447 | nextRand = false 448 | x = float32(rand.Int31()%(WORLD_WIDTH-2*ENTITY_RADIUS) + ENTITY_RADIUS) 449 | y = float32(rand.Int31()%(WORLD_HEIGHT-2*ENTITY_RADIUS) + ENTITY_RADIUS) 450 | 451 | for _, entity := range p.aliveUserID2Entity { 452 | if entity.dead { 453 | continue 454 | } 455 | 456 | //distance := math.Sqrt(math.Pow(float64(entity.x-x), 2) + math.Pow(entity.y-y, 2)) 457 | distance := util.Distance(entity.x, entity.y, x, y) 458 | if distance < 5*ENTITY_RADIUS { 459 | nextRand = true 460 | break 461 | } 462 | } 463 | if !nextRand { 464 | break 465 | } 466 | 467 | forCount++ 468 | if forCount > 10 { 469 | break 470 | } 471 | } 472 | return 473 | } 474 | 475 | func (p *Game) CheckCollision() { 476 | var delBullets, delEntities []int32 477 | var dirtyUserIds []uint64 478 | 479 | now := util.GetCurrentMillSec() 480 | //检测子弹和entity之间碰撞 481 | for e := p.bulletList.Front(); e != nil; { 482 | bullet := e.Value.(*Bullet) 483 | var bulletErase bool 484 | if now-bullet.createdTime > BULLET_LIVE_MS { 485 | bulletErase = true 486 | } else { 487 | rotation := float64(bullet.rotation * math.Pi / 180) 488 | bullet.y = bullet.initCenterY + (float32(now-bullet.createdTime)*BULLET_SPEED/1000+ENTITY_RADIUS)*float32(math.Sin(rotation)) 489 | bullet.x = bullet.initCenterX + (float32(now-bullet.createdTime)*BULLET_SPEED/1000+ENTITY_RADIUS)*float32(math.Cos(rotation)) 490 | 491 | for _, entity := range p.aliveUserID2Entity { 492 | if bullet.creatorUserID == entity.u.userID { 493 | continue 494 | } 495 | distance := util.Distance(bullet.x, bullet.y, entity.x, entity.y) 496 | if distance > ENTITY_RADIUS { 497 | continue 498 | } 499 | 500 | if !entity.isProtected { 501 | entity.hp -= bullet.damage 502 | if entity.hp <= 0 { 503 | entity.KilledBy(bullet.creatorUserID) 504 | delEntities = append(delEntities, entity.id) 505 | } 506 | dirtyUserIds = append(dirtyUserIds, entity.u.userID, bullet.creatorUserID) 507 | } 508 | bulletErase = true 509 | break 510 | } 511 | } 512 | 513 | next := e.Next() 514 | if bulletErase { 515 | delBullets = append(delBullets, bullet.id) 516 | p.bulletList.Remove(e) 517 | } 518 | e = next 519 | } 520 | 521 | //检测entity之间碰撞 522 | for userIDA, entityA := range p.aliveUserID2Entity { 523 | if entityA.isProtected { 524 | continue 525 | } 526 | for userIDB, entityB := range p.aliveUserID2Entity { 527 | if entityA.id == entityB.id { 528 | continue 529 | } 530 | 531 | if entityB.isProtected { 532 | continue 533 | } 534 | 535 | distance := util.Distance(entityA.x, entityA.y, entityB.x, entityB.y) 536 | 537 | if distance > 2*ENTITY_RADIUS { 538 | continue 539 | } 540 | 541 | damage := util.Int32Min(entityA.hp, entityB.hp) 542 | entityA.hp -= damage 543 | entityB.hp -= damage 544 | 545 | if entityB.hp <= 0 { 546 | entityB.KilledBy(userIDA) 547 | delEntities = append(delEntities, entityB.id) 548 | } 549 | 550 | if entityA.hp <= 0 { 551 | entityA.KilledBy(userIDB) 552 | delEntities = append(delEntities, entityA.id) 553 | } 554 | dirtyUserIds = append(dirtyUserIds, userIDA, userIDB) 555 | if entityA.dead { 556 | break 557 | } 558 | } 559 | } 560 | 561 | if len(delBullets) > 0 || len(delEntities) > 0 || len(dirtyUserIds) > 0 { 562 | changeEntitys := make([]*cmsg.SNoticeWorldChange_Entity, 0, len(dirtyUserIds)) 563 | for _, userID := range dirtyUserIds { 564 | if entity, exist := p.userID2entity[userID]; exist && !entity.dead { 565 | changeEntitys = append(changeEntitys, &cmsg.SNoticeWorldChange_Entity{ 566 | Id: entity.id, 567 | Score: entity.score, 568 | KillCount: entity.killCount, 569 | Hp: entity.hp, 570 | }) 571 | } 572 | } 573 | 574 | msg := &cmsg.SNoticeWorldChange{ 575 | DeleteBullets: delBullets, 576 | DeleteEntities: delEntities, 577 | ChangedEntities: changeEntitys, 578 | } 579 | 580 | p.Send2All(msg) 581 | } 582 | } 583 | 584 | func (p *Game) Send2All(msg proto.Message) { 585 | for _, v := range p.aliveUserID2Entity { 586 | if !v.clientSceneReady { 587 | continue 588 | } 589 | v.u.Send2Client(msg) 590 | } 591 | } 592 | 593 | func (p *Game) SendPos2All(msg *cmsg.SNoticeWorldPos) { 594 | for _, v := range p.aliveUserID2Entity { 595 | if v.u.accountType == ROBOT || !v.clientSceneReady { 596 | continue 597 | } 598 | msg.LastProcessedInputID = v.lastProcessedInput 599 | v.u.Send2Client(msg) 600 | } 601 | } 602 | 603 | func (p *Game) Join(u *User) error { 604 | if u.userID >= ROBOT_ID_START { 605 | return errors.New("userid too large") 606 | } 607 | if _, ok := p.userID2entity[u.userID]; ok { 608 | return errors.New("user already in game") 609 | } 610 | u.game = p 611 | p.createEntity(u) 612 | return nil 613 | } 614 | 615 | func (p *Game) gameLeftSec() int32 { 616 | return int32(GAME_ROUND_SEC + p.startTimeSec - util.GetCurrentSec()) 617 | } 618 | 619 | func (p *Game) OnReqGameScene(session rpc.Session, userID uint64, msg *cmsg.ReqGameScene) { 620 | resp := &cmsg.RespGameScene{} 621 | entity, ok := p.userID2entity[userID] 622 | if !ok { 623 | resp.Err = 1 624 | session.SendMsg(resp) 625 | return 626 | } 627 | entity.clientSceneReady = true 628 | 629 | entitys := make([]*cmsg.Entity, 0, len(p.aliveUserID2Entity)) 630 | for _, e := range p.aliveUserID2Entity { 631 | entitys = append(entitys, e.ToCMsg()) 632 | } 633 | 634 | resp.Entities = entitys 635 | resp.GameLeftSec = p.gameLeftSec() 636 | session.SendMsg(resp) 637 | } 638 | 639 | func (p *Game) OnReqEnterGame(session rpc.Session, userID uint64, msg *cmsg.ReqEnterGame) { 640 | resp := &cmsg.RespEnterGame{} 641 | entity, ok := p.userID2entity[userID] 642 | if !ok { 643 | resp.Err = 1 644 | session.SendMsg(resp) 645 | return 646 | } 647 | 648 | if entity.dead { 649 | resp.Dead = true 650 | resp.GameLeftSec = p.gameLeftSec() 651 | session.SendMsg(resp) 652 | return 653 | } 654 | 655 | config := &cmsg.RespEnterGame_Config{ 656 | BulletLiveTime: BULLET_LIVE_MS, 657 | RotationDelta: ROTATION_DELTA, 658 | EntitySpeed: ENTITY_SPEED, 659 | BulletSpeed: BULLET_SPEED, 660 | NoticePosDuration: TICKER_NOTICE_POS_MS, 661 | ProtectTime: ENTITY_PROTECT_MS, 662 | EntityRadius: ENTITY_RADIUS, 663 | } 664 | resp.EntityID = entity.id 665 | resp.Config = config 666 | resp.GameLeftSec = p.gameLeftSec() 667 | session.SendMsg(resp) 668 | } 669 | 670 | func (p *Game) OnReqMove(userID uint64, msg *cmsg.ReqMove) { 671 | p.entityMove(userID, msg.PressTime, msg.TargetRotation, msg.InputSeqID) 672 | } 673 | 674 | func (p *Game) OnReqJump(userID uint64, msg *cmsg.ReqJump) { 675 | p.entityJump(userID) 676 | } 677 | 678 | func (p *Game) OnReqShoot(userID uint64, msg *cmsg.ReqShoot) { 679 | p.entityShoot(userID) 680 | } 681 | 682 | func (p *Game) OnUserDisconnect(userID uint64) { 683 | entity, exist := p.userID2entity[userID] 684 | if !exist { 685 | logrus.WithField("userID", userID).Error("game OnUserDisconnect user not existed") 686 | return 687 | } 688 | entity.clientSceneReady = false 689 | } 690 | 691 | //func (p *Game) OnUserReconnect(userID uint64) { 692 | // entity, exist := p.userID2entity[userID] 693 | // if !exist { 694 | // logrus.WithField("userID", userID).Error("game OnUserDisconnect user not existed") 695 | // return 696 | // } 697 | // entity.clientSceneReady = false 698 | //} 699 | -------------------------------------------------------------------------------- /msg/smsg/smsg.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: msg/smsg/smsg.proto 3 | 4 | /* 5 | Package smsg is a generated protocol buffer package. 6 | 7 | It is generated from these files: 8 | msg/smsg/smsg.proto 9 | 10 | It has these top-level messages: 11 | Server2AllSession 12 | GaCeReqLogin 13 | GaCeRespLogin 14 | CeGaBindGameServer 15 | CeGamReqJoinGame 16 | CeGamRespJoinGame 17 | GamCeNoticeGameStart 18 | GamCeNoticeGameEnd 19 | CeGameUserDisconnect 20 | CeGameUserReconnect 21 | GaCeUserDisconnect 22 | CeGaCloseSession 23 | AdReqMetrics 24 | AdRespMetrics 25 | */ 26 | package smsg 27 | 28 | import proto "github.com/golang/protobuf/proto" 29 | import fmt "fmt" 30 | import math "math" 31 | 32 | // Reference imports to suppress errors if they are not otherwise used. 33 | var _ = proto.Marshal 34 | var _ = fmt.Errorf 35 | var _ = math.Inf 36 | 37 | // This is a compile-time assertion to ensure that this generated file 38 | // is compatible with the proto package it is being compiled against. 39 | // A compilation error at this line likely means your copy of the 40 | // proto package needs to be updated. 41 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 42 | 43 | type GaCeRespLogin_Error int32 44 | 45 | const ( 46 | GaCeRespLogin_Invalid GaCeRespLogin_Error = 0 47 | ) 48 | 49 | var GaCeRespLogin_Error_name = map[int32]string{ 50 | 0: "Invalid", 51 | } 52 | var GaCeRespLogin_Error_value = map[string]int32{ 53 | "Invalid": 0, 54 | } 55 | 56 | func (x GaCeRespLogin_Error) String() string { 57 | return proto.EnumName(GaCeRespLogin_Error_name, int32(x)) 58 | } 59 | func (GaCeRespLogin_Error) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } 60 | 61 | type CeGamRespJoinGame_Error int32 62 | 63 | const ( 64 | CeGamRespJoinGame_Invalid CeGamRespJoinGame_Error = 0 65 | CeGamRespJoinGame_GameNotExist CeGamRespJoinGame_Error = 1 66 | ) 67 | 68 | var CeGamRespJoinGame_Error_name = map[int32]string{ 69 | 0: "Invalid", 70 | 1: "GameNotExist", 71 | } 72 | var CeGamRespJoinGame_Error_value = map[string]int32{ 73 | "Invalid": 0, 74 | "GameNotExist": 1, 75 | } 76 | 77 | func (x CeGamRespJoinGame_Error) String() string { 78 | return proto.EnumName(CeGamRespJoinGame_Error_name, int32(x)) 79 | } 80 | func (CeGamRespJoinGame_Error) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 0} } 81 | 82 | type AdRespMetrics_MetricsType int32 83 | 84 | const ( 85 | AdRespMetrics_Invalid AdRespMetrics_MetricsType = 0 86 | AdRespMetrics_OnlineCount AdRespMetrics_MetricsType = 1 87 | ) 88 | 89 | var AdRespMetrics_MetricsType_name = map[int32]string{ 90 | 0: "Invalid", 91 | 1: "OnlineCount", 92 | } 93 | var AdRespMetrics_MetricsType_value = map[string]int32{ 94 | "Invalid": 0, 95 | "OnlineCount": 1, 96 | } 97 | 98 | func (x AdRespMetrics_MetricsType) String() string { 99 | return proto.EnumName(AdRespMetrics_MetricsType_name, int32(x)) 100 | } 101 | func (AdRespMetrics_MetricsType) EnumDescriptor() ([]byte, []int) { 102 | return fileDescriptor0, []int{13, 0} 103 | } 104 | 105 | type Server2AllSession struct { 106 | Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` 107 | } 108 | 109 | func (m *Server2AllSession) Reset() { *m = Server2AllSession{} } 110 | func (m *Server2AllSession) String() string { return proto.CompactTextString(m) } 111 | func (*Server2AllSession) ProtoMessage() {} 112 | func (*Server2AllSession) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } 113 | 114 | func (m *Server2AllSession) GetData() []byte { 115 | if m != nil { 116 | return m.Data 117 | } 118 | return nil 119 | } 120 | 121 | type GaCeReqLogin struct { 122 | Sesid int32 `protobuf:"varint,1,opt,name=sesid" json:"sesid,omitempty"` 123 | Token string `protobuf:"bytes,2,opt,name=token" json:"token,omitempty"` 124 | } 125 | 126 | func (m *GaCeReqLogin) Reset() { *m = GaCeReqLogin{} } 127 | func (m *GaCeReqLogin) String() string { return proto.CompactTextString(m) } 128 | func (*GaCeReqLogin) ProtoMessage() {} 129 | func (*GaCeReqLogin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } 130 | 131 | func (m *GaCeReqLogin) GetSesid() int32 { 132 | if m != nil { 133 | return m.Sesid 134 | } 135 | return 0 136 | } 137 | 138 | func (m *GaCeReqLogin) GetToken() string { 139 | if m != nil { 140 | return m.Token 141 | } 142 | return "" 143 | } 144 | 145 | type GaCeRespLogin struct { 146 | UserID uint64 `protobuf:"varint,1,opt,name=userID" json:"userID,omitempty"` 147 | Err GaCeRespLogin_Error `protobuf:"varint,2,opt,name=err,enum=smsg.GaCeRespLogin_Error" json:"err,omitempty"` 148 | Token string `protobuf:"bytes,3,opt,name=token" json:"token,omitempty"` 149 | InGame bool `protobuf:"varint,4,opt,name=inGame" json:"inGame,omitempty"` 150 | } 151 | 152 | func (m *GaCeRespLogin) Reset() { *m = GaCeRespLogin{} } 153 | func (m *GaCeRespLogin) String() string { return proto.CompactTextString(m) } 154 | func (*GaCeRespLogin) ProtoMessage() {} 155 | func (*GaCeRespLogin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } 156 | 157 | func (m *GaCeRespLogin) GetUserID() uint64 { 158 | if m != nil { 159 | return m.UserID 160 | } 161 | return 0 162 | } 163 | 164 | func (m *GaCeRespLogin) GetErr() GaCeRespLogin_Error { 165 | if m != nil { 166 | return m.Err 167 | } 168 | return GaCeRespLogin_Invalid 169 | } 170 | 171 | func (m *GaCeRespLogin) GetToken() string { 172 | if m != nil { 173 | return m.Token 174 | } 175 | return "" 176 | } 177 | 178 | func (m *GaCeRespLogin) GetInGame() bool { 179 | if m != nil { 180 | return m.InGame 181 | } 182 | return false 183 | } 184 | 185 | type CeGaBindGameServer struct { 186 | Sesid int32 `protobuf:"varint,1,opt,name=sesid" json:"sesid,omitempty"` 187 | Gameserverid int32 `protobuf:"varint,2,opt,name=gameserverid" json:"gameserverid,omitempty"` 188 | } 189 | 190 | func (m *CeGaBindGameServer) Reset() { *m = CeGaBindGameServer{} } 191 | func (m *CeGaBindGameServer) String() string { return proto.CompactTextString(m) } 192 | func (*CeGaBindGameServer) ProtoMessage() {} 193 | func (*CeGaBindGameServer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } 194 | 195 | func (m *CeGaBindGameServer) GetSesid() int32 { 196 | if m != nil { 197 | return m.Sesid 198 | } 199 | return 0 200 | } 201 | 202 | func (m *CeGaBindGameServer) GetGameserverid() int32 { 203 | if m != nil { 204 | return m.Gameserverid 205 | } 206 | return 0 207 | } 208 | 209 | type CeGamReqJoinGame struct { 210 | Userid uint64 `protobuf:"varint,1,opt,name=userid" json:"userid,omitempty"` 211 | Sesid int32 `protobuf:"varint,2,opt,name=sesid" json:"sesid,omitempty"` 212 | Nickname string `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"` 213 | GateServerid int32 `protobuf:"varint,4,opt,name=gateServerid" json:"gateServerid,omitempty"` 214 | } 215 | 216 | func (m *CeGamReqJoinGame) Reset() { *m = CeGamReqJoinGame{} } 217 | func (m *CeGamReqJoinGame) String() string { return proto.CompactTextString(m) } 218 | func (*CeGamReqJoinGame) ProtoMessage() {} 219 | func (*CeGamReqJoinGame) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } 220 | 221 | func (m *CeGamReqJoinGame) GetUserid() uint64 { 222 | if m != nil { 223 | return m.Userid 224 | } 225 | return 0 226 | } 227 | 228 | func (m *CeGamReqJoinGame) GetSesid() int32 { 229 | if m != nil { 230 | return m.Sesid 231 | } 232 | return 0 233 | } 234 | 235 | func (m *CeGamReqJoinGame) GetNickname() string { 236 | if m != nil { 237 | return m.Nickname 238 | } 239 | return "" 240 | } 241 | 242 | func (m *CeGamReqJoinGame) GetGateServerid() int32 { 243 | if m != nil { 244 | return m.GateServerid 245 | } 246 | return 0 247 | } 248 | 249 | type CeGamRespJoinGame struct { 250 | Err CeGamRespJoinGame_Error `protobuf:"varint,1,opt,name=err,enum=smsg.CeGamRespJoinGame_Error" json:"err,omitempty"` 251 | Gameid int64 `protobuf:"varint,2,opt,name=gameid" json:"gameid,omitempty"` 252 | } 253 | 254 | func (m *CeGamRespJoinGame) Reset() { *m = CeGamRespJoinGame{} } 255 | func (m *CeGamRespJoinGame) String() string { return proto.CompactTextString(m) } 256 | func (*CeGamRespJoinGame) ProtoMessage() {} 257 | func (*CeGamRespJoinGame) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } 258 | 259 | func (m *CeGamRespJoinGame) GetErr() CeGamRespJoinGame_Error { 260 | if m != nil { 261 | return m.Err 262 | } 263 | return CeGamRespJoinGame_Invalid 264 | } 265 | 266 | func (m *CeGamRespJoinGame) GetGameid() int64 { 267 | if m != nil { 268 | return m.Gameid 269 | } 270 | return 0 271 | } 272 | 273 | type GamCeNoticeGameStart struct { 274 | Gameid int64 `protobuf:"varint,1,opt,name=gameid" json:"gameid,omitempty"` 275 | } 276 | 277 | func (m *GamCeNoticeGameStart) Reset() { *m = GamCeNoticeGameStart{} } 278 | func (m *GamCeNoticeGameStart) String() string { return proto.CompactTextString(m) } 279 | func (*GamCeNoticeGameStart) ProtoMessage() {} 280 | func (*GamCeNoticeGameStart) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } 281 | 282 | func (m *GamCeNoticeGameStart) GetGameid() int64 { 283 | if m != nil { 284 | return m.Gameid 285 | } 286 | return 0 287 | } 288 | 289 | type GamCeNoticeGameEnd struct { 290 | Gameid int64 `protobuf:"varint,1,opt,name=gameid" json:"gameid,omitempty"` 291 | } 292 | 293 | func (m *GamCeNoticeGameEnd) Reset() { *m = GamCeNoticeGameEnd{} } 294 | func (m *GamCeNoticeGameEnd) String() string { return proto.CompactTextString(m) } 295 | func (*GamCeNoticeGameEnd) ProtoMessage() {} 296 | func (*GamCeNoticeGameEnd) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } 297 | 298 | func (m *GamCeNoticeGameEnd) GetGameid() int64 { 299 | if m != nil { 300 | return m.Gameid 301 | } 302 | return 0 303 | } 304 | 305 | type CeGameUserDisconnect struct { 306 | Userid uint64 `protobuf:"varint,1,opt,name=userid" json:"userid,omitempty"` 307 | } 308 | 309 | func (m *CeGameUserDisconnect) Reset() { *m = CeGameUserDisconnect{} } 310 | func (m *CeGameUserDisconnect) String() string { return proto.CompactTextString(m) } 311 | func (*CeGameUserDisconnect) ProtoMessage() {} 312 | func (*CeGameUserDisconnect) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } 313 | 314 | func (m *CeGameUserDisconnect) GetUserid() uint64 { 315 | if m != nil { 316 | return m.Userid 317 | } 318 | return 0 319 | } 320 | 321 | type CeGameUserReconnect struct { 322 | Userid uint64 `protobuf:"varint,1,opt,name=userid" json:"userid,omitempty"` 323 | GateID int32 `protobuf:"varint,2,opt,name=gateID" json:"gateID,omitempty"` 324 | SessionID int32 `protobuf:"varint,3,opt,name=sessionID" json:"sessionID,omitempty"` 325 | } 326 | 327 | func (m *CeGameUserReconnect) Reset() { *m = CeGameUserReconnect{} } 328 | func (m *CeGameUserReconnect) String() string { return proto.CompactTextString(m) } 329 | func (*CeGameUserReconnect) ProtoMessage() {} 330 | func (*CeGameUserReconnect) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } 331 | 332 | func (m *CeGameUserReconnect) GetUserid() uint64 { 333 | if m != nil { 334 | return m.Userid 335 | } 336 | return 0 337 | } 338 | 339 | func (m *CeGameUserReconnect) GetGateID() int32 { 340 | if m != nil { 341 | return m.GateID 342 | } 343 | return 0 344 | } 345 | 346 | func (m *CeGameUserReconnect) GetSessionID() int32 { 347 | if m != nil { 348 | return m.SessionID 349 | } 350 | return 0 351 | } 352 | 353 | type GaCeUserDisconnect struct { 354 | SessionID int32 `protobuf:"varint,1,opt,name=sessionID" json:"sessionID,omitempty"` 355 | } 356 | 357 | func (m *GaCeUserDisconnect) Reset() { *m = GaCeUserDisconnect{} } 358 | func (m *GaCeUserDisconnect) String() string { return proto.CompactTextString(m) } 359 | func (*GaCeUserDisconnect) ProtoMessage() {} 360 | func (*GaCeUserDisconnect) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } 361 | 362 | func (m *GaCeUserDisconnect) GetSessionID() int32 { 363 | if m != nil { 364 | return m.SessionID 365 | } 366 | return 0 367 | } 368 | 369 | type CeGaCloseSession struct { 370 | SessionID int32 `protobuf:"varint,1,opt,name=sessionID" json:"sessionID,omitempty"` 371 | } 372 | 373 | func (m *CeGaCloseSession) Reset() { *m = CeGaCloseSession{} } 374 | func (m *CeGaCloseSession) String() string { return proto.CompactTextString(m) } 375 | func (*CeGaCloseSession) ProtoMessage() {} 376 | func (*CeGaCloseSession) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } 377 | 378 | func (m *CeGaCloseSession) GetSessionID() int32 { 379 | if m != nil { 380 | return m.SessionID 381 | } 382 | return 0 383 | } 384 | 385 | type AdReqMetrics struct { 386 | ReqTime int64 `protobuf:"varint,3,opt,name=reqTime" json:"reqTime,omitempty"` 387 | } 388 | 389 | func (m *AdReqMetrics) Reset() { *m = AdReqMetrics{} } 390 | func (m *AdReqMetrics) String() string { return proto.CompactTextString(m) } 391 | func (*AdReqMetrics) ProtoMessage() {} 392 | func (*AdReqMetrics) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } 393 | 394 | func (m *AdReqMetrics) GetReqTime() int64 { 395 | if m != nil { 396 | return m.ReqTime 397 | } 398 | return 0 399 | } 400 | 401 | type AdRespMetrics struct { 402 | Metrics []*AdRespMetrics_Metrics `protobuf:"bytes,1,rep,name=metrics" json:"metrics,omitempty"` 403 | ReqTime int64 `protobuf:"varint,2,opt,name=reqTime" json:"reqTime,omitempty"` 404 | } 405 | 406 | func (m *AdRespMetrics) Reset() { *m = AdRespMetrics{} } 407 | func (m *AdRespMetrics) String() string { return proto.CompactTextString(m) } 408 | func (*AdRespMetrics) ProtoMessage() {} 409 | func (*AdRespMetrics) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } 410 | 411 | func (m *AdRespMetrics) GetMetrics() []*AdRespMetrics_Metrics { 412 | if m != nil { 413 | return m.Metrics 414 | } 415 | return nil 416 | } 417 | 418 | func (m *AdRespMetrics) GetReqTime() int64 { 419 | if m != nil { 420 | return m.ReqTime 421 | } 422 | return 0 423 | } 424 | 425 | type AdRespMetrics_Metrics struct { 426 | Key AdRespMetrics_MetricsType `protobuf:"varint,1,opt,name=key,enum=smsg.AdRespMetrics_MetricsType" json:"key,omitempty"` 427 | Value int32 `protobuf:"varint,2,opt,name=value" json:"value,omitempty"` 428 | } 429 | 430 | func (m *AdRespMetrics_Metrics) Reset() { *m = AdRespMetrics_Metrics{} } 431 | func (m *AdRespMetrics_Metrics) String() string { return proto.CompactTextString(m) } 432 | func (*AdRespMetrics_Metrics) ProtoMessage() {} 433 | func (*AdRespMetrics_Metrics) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13, 0} } 434 | 435 | func (m *AdRespMetrics_Metrics) GetKey() AdRespMetrics_MetricsType { 436 | if m != nil { 437 | return m.Key 438 | } 439 | return AdRespMetrics_Invalid 440 | } 441 | 442 | func (m *AdRespMetrics_Metrics) GetValue() int32 { 443 | if m != nil { 444 | return m.Value 445 | } 446 | return 0 447 | } 448 | 449 | func init() { 450 | proto.RegisterType((*Server2AllSession)(nil), "smsg.Server2AllSession") 451 | proto.RegisterType((*GaCeReqLogin)(nil), "smsg.GaCeReqLogin") 452 | proto.RegisterType((*GaCeRespLogin)(nil), "smsg.GaCeRespLogin") 453 | proto.RegisterType((*CeGaBindGameServer)(nil), "smsg.CeGaBindGameServer") 454 | proto.RegisterType((*CeGamReqJoinGame)(nil), "smsg.CeGamReqJoinGame") 455 | proto.RegisterType((*CeGamRespJoinGame)(nil), "smsg.CeGamRespJoinGame") 456 | proto.RegisterType((*GamCeNoticeGameStart)(nil), "smsg.GamCeNoticeGameStart") 457 | proto.RegisterType((*GamCeNoticeGameEnd)(nil), "smsg.GamCeNoticeGameEnd") 458 | proto.RegisterType((*CeGameUserDisconnect)(nil), "smsg.CeGameUserDisconnect") 459 | proto.RegisterType((*CeGameUserReconnect)(nil), "smsg.CeGameUserReconnect") 460 | proto.RegisterType((*GaCeUserDisconnect)(nil), "smsg.GaCeUserDisconnect") 461 | proto.RegisterType((*CeGaCloseSession)(nil), "smsg.CeGaCloseSession") 462 | proto.RegisterType((*AdReqMetrics)(nil), "smsg.AdReqMetrics") 463 | proto.RegisterType((*AdRespMetrics)(nil), "smsg.AdRespMetrics") 464 | proto.RegisterType((*AdRespMetrics_Metrics)(nil), "smsg.AdRespMetrics.Metrics") 465 | proto.RegisterEnum("smsg.GaCeRespLogin_Error", GaCeRespLogin_Error_name, GaCeRespLogin_Error_value) 466 | proto.RegisterEnum("smsg.CeGamRespJoinGame_Error", CeGamRespJoinGame_Error_name, CeGamRespJoinGame_Error_value) 467 | proto.RegisterEnum("smsg.AdRespMetrics_MetricsType", AdRespMetrics_MetricsType_name, AdRespMetrics_MetricsType_value) 468 | } 469 | 470 | func init() { proto.RegisterFile("msg/smsg/smsg.proto", fileDescriptor0) } 471 | 472 | var fileDescriptor0 = []byte{ 473 | // 573 bytes of a gzipped FileDescriptorProto 474 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0xcd, 0x6e, 0xd3, 0x40, 475 | 0x10, 0x66, 0xeb, 0xa4, 0x69, 0x27, 0x29, 0xa4, 0x6e, 0x54, 0x85, 0x02, 0x22, 0xda, 0x03, 0x44, 476 | 0x2a, 0x72, 0x21, 0x88, 0x0b, 0xb7, 0xe2, 0x54, 0x51, 0x10, 0x14, 0x69, 0x5b, 0x1e, 0xc0, 0xd8, 477 | 0xa3, 0x6a, 0x55, 0x7b, 0x9d, 0xec, 0x6e, 0x2b, 0x7a, 0xe3, 0xc0, 0x43, 0xf0, 0x7a, 0xbc, 0x09, 478 | 0xda, 0x1f, 0x37, 0x76, 0x21, 0xe5, 0x92, 0xec, 0x8c, 0xbe, 0x6f, 0xe6, 0x9b, 0x6f, 0x67, 0x0d, 479 | 0x7b, 0x85, 0xba, 0x38, 0x52, 0xd5, 0x4f, 0xb4, 0x90, 0xa5, 0x2e, 0xc3, 0x96, 0x39, 0xd3, 0x97, 480 | 0xb0, 0x7b, 0x86, 0xf2, 0x1a, 0xe5, 0xe4, 0x38, 0xcf, 0xcf, 0x50, 0x29, 0x5e, 0x8a, 0x30, 0x84, 481 | 0x56, 0x96, 0xe8, 0x64, 0x48, 0x46, 0x64, 0xdc, 0x63, 0xf6, 0x4c, 0xdf, 0x43, 0x6f, 0x96, 0xc4, 482 | 0xc8, 0x70, 0xf9, 0xa9, 0xbc, 0xe0, 0x22, 0x1c, 0x40, 0x5b, 0xa1, 0xe2, 0x99, 0x05, 0xb5, 0x99, 483 | 0x0b, 0x4c, 0x56, 0x97, 0x97, 0x28, 0x86, 0x1b, 0x23, 0x32, 0xde, 0x66, 0x2e, 0xa0, 0xbf, 0x08, 484 | 0xec, 0x38, 0xb2, 0x5a, 0x38, 0xf6, 0x3e, 0x6c, 0x5e, 0x29, 0x94, 0xf3, 0xa9, 0xa5, 0xb7, 0x98, 485 | 0x8f, 0xc2, 0x43, 0x08, 0x50, 0x4a, 0xcb, 0x7e, 0x38, 0x79, 0x1c, 0x59, 0xb9, 0x0d, 0x66, 0x74, 486 | 0x22, 0x65, 0x29, 0x99, 0x41, 0xad, 0x9a, 0x05, 0xb5, 0x66, 0xa6, 0x34, 0x17, 0xb3, 0xa4, 0xc0, 487 | 0x61, 0x6b, 0x44, 0xc6, 0x5b, 0xcc, 0x47, 0x74, 0x00, 0x6d, 0xcb, 0x0d, 0xbb, 0xd0, 0x99, 0x8b, 488 | 0xeb, 0x24, 0xe7, 0x59, 0xff, 0x01, 0x3d, 0x85, 0x30, 0xc6, 0x59, 0xf2, 0x81, 0x8b, 0xcc, 0xa0, 489 | 0x9c, 0x17, 0x6b, 0x86, 0xa3, 0xd0, 0xbb, 0x48, 0x0a, 0x54, 0x16, 0xc3, 0x33, 0xab, 0xb2, 0xcd, 490 | 0x1a, 0x39, 0xfa, 0x83, 0x40, 0xdf, 0x14, 0x2c, 0x18, 0x2e, 0x3f, 0x96, 0xae, 0x75, 0x35, 0xad, 491 | 0xaf, 0xe7, 0xa7, 0x75, 0x6e, 0xb9, 0x36, 0x1b, 0xf5, 0x36, 0x07, 0xb0, 0x25, 0x78, 0x7a, 0x29, 492 | 0xcc, 0x08, 0x6e, 0xb2, 0xdb, 0xd8, 0x49, 0xd0, 0x5e, 0x26, 0xcf, 0xec, 0x88, 0x56, 0xc2, 0x2a, 493 | 0x47, 0x7f, 0x12, 0xd8, 0xf5, 0x12, 0xd4, 0xe2, 0x56, 0xc3, 0x91, 0x73, 0x96, 0x58, 0x67, 0x9f, 494 | 0x39, 0x67, 0xff, 0x42, 0xd5, 0xdd, 0xdd, 0x87, 0x4d, 0x33, 0x99, 0x57, 0x17, 0x30, 0x1f, 0xd1, 495 | 0x17, 0xff, 0xf2, 0x31, 0xec, 0x9b, 0xf5, 0x28, 0xf0, 0xb4, 0xd4, 0x27, 0xdf, 0xb9, 0xd2, 0x7d, 496 | 0x42, 0x23, 0x18, 0xcc, 0x92, 0x22, 0x36, 0x29, 0x9e, 0xa2, 0x35, 0x57, 0x27, 0x52, 0xd7, 0xea, 497 | 0x92, 0x46, 0xdd, 0x57, 0x10, 0xde, 0xc1, 0x9f, 0x88, 0x6c, 0x2d, 0x3a, 0x82, 0x81, 0x55, 0x8f, 498 | 0x5f, 0x15, 0xca, 0x29, 0x57, 0x69, 0x29, 0x04, 0xa6, 0x7a, 0x9d, 0xd5, 0x34, 0x85, 0xbd, 0x15, 499 | 0x9e, 0xe1, 0x7f, 0xe0, 0xae, 0xad, 0xc6, 0xf9, 0xd4, 0x5f, 0x8d, 0x8f, 0xc2, 0xa7, 0xb0, 0xad, 500 | 0xdc, 0x23, 0x99, 0x4f, 0xed, 0xe5, 0xb4, 0xd9, 0x2a, 0x41, 0x27, 0x66, 0x84, 0xf8, 0xae, 0xa4, 501 | 0x06, 0x87, 0xdc, 0xe5, 0xbc, 0x76, 0xfb, 0x12, 0xe7, 0xa5, 0xc2, 0xea, 0xfd, 0xdd, 0xcf, 0x18, 502 | 0x43, 0xef, 0x38, 0x63, 0xb8, 0xfc, 0x8c, 0x5a, 0xf2, 0x54, 0x85, 0x43, 0xe8, 0x48, 0x5c, 0x9e, 503 | 0x73, 0xbf, 0x2e, 0x01, 0xab, 0x42, 0xfa, 0x9b, 0xc0, 0x8e, 0x81, 0xaa, 0x45, 0x85, 0x7d, 0x07, 504 | 0x9d, 0xc2, 0x1d, 0x87, 0x64, 0x14, 0x8c, 0xbb, 0x93, 0x27, 0x6e, 0x13, 0x1a, 0xa8, 0xc8, 0xff, 505 | 0xb3, 0x0a, 0x5b, 0x6f, 0xb1, 0xd1, 0x68, 0x71, 0xc0, 0xa0, 0x53, 0xd5, 0x7e, 0x03, 0xc1, 0x25, 506 | 0xde, 0xf8, 0x0d, 0x7b, 0x7e, 0x4f, 0xdd, 0xf3, 0x9b, 0x05, 0x32, 0x83, 0x35, 0x0f, 0xe0, 0x3a, 507 | 0xc9, 0xaf, 0xb0, 0x7a, 0x00, 0x36, 0xa0, 0x87, 0xd0, 0xad, 0x21, 0x9b, 0x7b, 0xf6, 0x08, 0xba, 508 | 0x5f, 0x44, 0xce, 0x05, 0xc6, 0xe5, 0x95, 0xd0, 0x7d, 0xf2, 0x6d, 0xd3, 0x7e, 0xcd, 0xde, 0xfe, 509 | 0x09, 0x00, 0x00, 0xff, 0xff, 0x70, 0x85, 0x65, 0x2d, 0xe4, 0x04, 0x00, 0x00, 510 | } 511 | -------------------------------------------------------------------------------- /msg/cmsg/cmsg.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: msg/cmsg/cmsg.proto 3 | 4 | /* 5 | Package cmsg is a generated protocol buffer package. 6 | 7 | It is generated from these files: 8 | msg/cmsg/cmsg.proto 9 | 10 | It has these top-level messages: 11 | ReqLogin 12 | RespLogin 13 | ReqJoinGame 14 | RespJoinGame 15 | ReqEnterGame 16 | RespEnterGame 17 | Rank 18 | SNoticeGameOver 19 | ReqMove 20 | ReqShoot 21 | ReqJump 22 | ReqGameScene 23 | RespGameScene 24 | SNoticeShoot 25 | SNoticeWorldChange 26 | SNoticeWorldPos 27 | Entity 28 | SNoticeNewEntity 29 | SNoticeKickOut 30 | */ 31 | package cmsg 32 | 33 | import proto "github.com/golang/protobuf/proto" 34 | import fmt "fmt" 35 | import math "math" 36 | 37 | // Reference imports to suppress errors if they are not otherwise used. 38 | var _ = proto.Marshal 39 | var _ = fmt.Errorf 40 | var _ = math.Inf 41 | 42 | // This is a compile-time assertion to ensure that this generated file 43 | // is compatible with the proto package it is being compiled against. 44 | // A compilation error at this line likely means your copy of the 45 | // proto package needs to be updated. 46 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 47 | 48 | type RespLogin_Error int32 49 | 50 | const ( 51 | RespLogin_Invalid RespLogin_Error = 0 52 | RespLogin_RPCError RespLogin_Error = 1 53 | ) 54 | 55 | var RespLogin_Error_name = map[int32]string{ 56 | 0: "Invalid", 57 | 1: "RPCError", 58 | } 59 | var RespLogin_Error_value = map[string]int32{ 60 | "Invalid": 0, 61 | "RPCError": 1, 62 | } 63 | 64 | func (x RespLogin_Error) String() string { 65 | return proto.EnumName(RespLogin_Error_name, int32(x)) 66 | } 67 | func (RespLogin_Error) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} } 68 | 69 | type RespJoinGame_Error int32 70 | 71 | const ( 72 | RespJoinGame_Invalid RespJoinGame_Error = 0 73 | RespJoinGame_UserNotExisted RespJoinGame_Error = 1 74 | RespJoinGame_AlreadyInGame RespJoinGame_Error = 2 75 | ) 76 | 77 | var RespJoinGame_Error_name = map[int32]string{ 78 | 0: "Invalid", 79 | 1: "UserNotExisted", 80 | 2: "AlreadyInGame", 81 | } 82 | var RespJoinGame_Error_value = map[string]int32{ 83 | "Invalid": 0, 84 | "UserNotExisted": 1, 85 | "AlreadyInGame": 2, 86 | } 87 | 88 | func (x RespJoinGame_Error) String() string { 89 | return proto.EnumName(RespJoinGame_Error_name, int32(x)) 90 | } 91 | func (RespJoinGame_Error) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } 92 | 93 | type RespEnterGame_Error int32 94 | 95 | const ( 96 | RespEnterGame_Invalid RespEnterGame_Error = 0 97 | ) 98 | 99 | var RespEnterGame_Error_name = map[int32]string{ 100 | 0: "Invalid", 101 | } 102 | var RespEnterGame_Error_value = map[string]int32{ 103 | "Invalid": 0, 104 | } 105 | 106 | func (x RespEnterGame_Error) String() string { 107 | return proto.EnumName(RespEnterGame_Error_name, int32(x)) 108 | } 109 | func (RespEnterGame_Error) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 0} } 110 | 111 | type RespGameScene_Error int32 112 | 113 | const ( 114 | RespGameScene_Invalid RespGameScene_Error = 0 115 | RespGameScene_GameNotExist RespGameScene_Error = 1 116 | ) 117 | 118 | var RespGameScene_Error_name = map[int32]string{ 119 | 0: "Invalid", 120 | 1: "GameNotExist", 121 | } 122 | var RespGameScene_Error_value = map[string]int32{ 123 | "Invalid": 0, 124 | "GameNotExist": 1, 125 | } 126 | 127 | func (x RespGameScene_Error) String() string { 128 | return proto.EnumName(RespGameScene_Error_name, int32(x)) 129 | } 130 | func (RespGameScene_Error) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} } 131 | 132 | type SNoticeKickOut_Reason int32 133 | 134 | const ( 135 | SNoticeKickOut_Invalid SNoticeKickOut_Reason = 0 136 | SNoticeKickOut_Relogin SNoticeKickOut_Reason = 1 137 | ) 138 | 139 | var SNoticeKickOut_Reason_name = map[int32]string{ 140 | 0: "Invalid", 141 | 1: "Relogin", 142 | } 143 | var SNoticeKickOut_Reason_value = map[string]int32{ 144 | "Invalid": 0, 145 | "Relogin": 1, 146 | } 147 | 148 | func (x SNoticeKickOut_Reason) String() string { 149 | return proto.EnumName(SNoticeKickOut_Reason_name, int32(x)) 150 | } 151 | func (SNoticeKickOut_Reason) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} } 152 | 153 | type ReqLogin struct { 154 | Token string `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"` 155 | } 156 | 157 | func (m *ReqLogin) Reset() { *m = ReqLogin{} } 158 | func (m *ReqLogin) String() string { return proto.CompactTextString(m) } 159 | func (*ReqLogin) ProtoMessage() {} 160 | func (*ReqLogin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } 161 | 162 | func (m *ReqLogin) GetToken() string { 163 | if m != nil { 164 | return m.Token 165 | } 166 | return "" 167 | } 168 | 169 | type RespLogin struct { 170 | Err RespLogin_Error `protobuf:"varint,1,opt,name=err,enum=cmsg.RespLogin_Error" json:"err,omitempty"` 171 | UserID uint64 `protobuf:"varint,2,opt,name=userID" json:"userID,omitempty"` 172 | Token string `protobuf:"bytes,3,opt,name=token" json:"token,omitempty"` 173 | InGame bool `protobuf:"varint,4,opt,name=inGame" json:"inGame,omitempty"` 174 | } 175 | 176 | func (m *RespLogin) Reset() { *m = RespLogin{} } 177 | func (m *RespLogin) String() string { return proto.CompactTextString(m) } 178 | func (*RespLogin) ProtoMessage() {} 179 | func (*RespLogin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } 180 | 181 | func (m *RespLogin) GetErr() RespLogin_Error { 182 | if m != nil { 183 | return m.Err 184 | } 185 | return RespLogin_Invalid 186 | } 187 | 188 | func (m *RespLogin) GetUserID() uint64 { 189 | if m != nil { 190 | return m.UserID 191 | } 192 | return 0 193 | } 194 | 195 | func (m *RespLogin) GetToken() string { 196 | if m != nil { 197 | return m.Token 198 | } 199 | return "" 200 | } 201 | 202 | func (m *RespLogin) GetInGame() bool { 203 | if m != nil { 204 | return m.InGame 205 | } 206 | return false 207 | } 208 | 209 | type ReqJoinGame struct { 210 | Nickname string `protobuf:"bytes,1,opt,name=nickname" json:"nickname,omitempty"` 211 | } 212 | 213 | func (m *ReqJoinGame) Reset() { *m = ReqJoinGame{} } 214 | func (m *ReqJoinGame) String() string { return proto.CompactTextString(m) } 215 | func (*ReqJoinGame) ProtoMessage() {} 216 | func (*ReqJoinGame) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } 217 | 218 | func (m *ReqJoinGame) GetNickname() string { 219 | if m != nil { 220 | return m.Nickname 221 | } 222 | return "" 223 | } 224 | 225 | type RespJoinGame struct { 226 | Err RespJoinGame_Error `protobuf:"varint,1,opt,name=err,enum=cmsg.RespJoinGame_Error" json:"err,omitempty"` 227 | Nickname string `protobuf:"bytes,2,opt,name=nickname" json:"nickname,omitempty"` 228 | } 229 | 230 | func (m *RespJoinGame) Reset() { *m = RespJoinGame{} } 231 | func (m *RespJoinGame) String() string { return proto.CompactTextString(m) } 232 | func (*RespJoinGame) ProtoMessage() {} 233 | func (*RespJoinGame) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } 234 | 235 | func (m *RespJoinGame) GetErr() RespJoinGame_Error { 236 | if m != nil { 237 | return m.Err 238 | } 239 | return RespJoinGame_Invalid 240 | } 241 | 242 | func (m *RespJoinGame) GetNickname() string { 243 | if m != nil { 244 | return m.Nickname 245 | } 246 | return "" 247 | } 248 | 249 | type ReqEnterGame struct { 250 | } 251 | 252 | func (m *ReqEnterGame) Reset() { *m = ReqEnterGame{} } 253 | func (m *ReqEnterGame) String() string { return proto.CompactTextString(m) } 254 | func (*ReqEnterGame) ProtoMessage() {} 255 | func (*ReqEnterGame) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } 256 | 257 | type RespEnterGame struct { 258 | Config *RespEnterGame_Config `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"` 259 | EntityID int32 `protobuf:"varint,2,opt,name=entityID" json:"entityID,omitempty"` 260 | GameLeftSec int32 `protobuf:"varint,3,opt,name=gameLeftSec" json:"gameLeftSec,omitempty"` 261 | Dead bool `protobuf:"varint,4,opt,name=dead" json:"dead,omitempty"` 262 | Err RespEnterGame_Error `protobuf:"varint,5,opt,name=err,enum=cmsg.RespEnterGame_Error" json:"err,omitempty"` 263 | } 264 | 265 | func (m *RespEnterGame) Reset() { *m = RespEnterGame{} } 266 | func (m *RespEnterGame) String() string { return proto.CompactTextString(m) } 267 | func (*RespEnterGame) ProtoMessage() {} 268 | func (*RespEnterGame) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } 269 | 270 | func (m *RespEnterGame) GetConfig() *RespEnterGame_Config { 271 | if m != nil { 272 | return m.Config 273 | } 274 | return nil 275 | } 276 | 277 | func (m *RespEnterGame) GetEntityID() int32 { 278 | if m != nil { 279 | return m.EntityID 280 | } 281 | return 0 282 | } 283 | 284 | func (m *RespEnterGame) GetGameLeftSec() int32 { 285 | if m != nil { 286 | return m.GameLeftSec 287 | } 288 | return 0 289 | } 290 | 291 | func (m *RespEnterGame) GetDead() bool { 292 | if m != nil { 293 | return m.Dead 294 | } 295 | return false 296 | } 297 | 298 | func (m *RespEnterGame) GetErr() RespEnterGame_Error { 299 | if m != nil { 300 | return m.Err 301 | } 302 | return RespEnterGame_Invalid 303 | } 304 | 305 | type RespEnterGame_Config struct { 306 | BulletLiveTime int32 `protobuf:"varint,1,opt,name=bulletLiveTime" json:"bulletLiveTime,omitempty"` 307 | RotationDelta float32 `protobuf:"fixed32,2,opt,name=rotationDelta" json:"rotationDelta,omitempty"` 308 | EntitySpeed int32 `protobuf:"varint,3,opt,name=entitySpeed" json:"entitySpeed,omitempty"` 309 | BulletSpeed int32 `protobuf:"varint,4,opt,name=bulletSpeed" json:"bulletSpeed,omitempty"` 310 | NoticePosDuration int32 `protobuf:"varint,5,opt,name=noticePosDuration" json:"noticePosDuration,omitempty"` 311 | ProtectTime int32 `protobuf:"varint,6,opt,name=protectTime" json:"protectTime,omitempty"` 312 | EntityRadius int32 `protobuf:"varint,7,opt,name=entityRadius" json:"entityRadius,omitempty"` 313 | } 314 | 315 | func (m *RespEnterGame_Config) Reset() { *m = RespEnterGame_Config{} } 316 | func (m *RespEnterGame_Config) String() string { return proto.CompactTextString(m) } 317 | func (*RespEnterGame_Config) ProtoMessage() {} 318 | func (*RespEnterGame_Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 0} } 319 | 320 | func (m *RespEnterGame_Config) GetBulletLiveTime() int32 { 321 | if m != nil { 322 | return m.BulletLiveTime 323 | } 324 | return 0 325 | } 326 | 327 | func (m *RespEnterGame_Config) GetRotationDelta() float32 { 328 | if m != nil { 329 | return m.RotationDelta 330 | } 331 | return 0 332 | } 333 | 334 | func (m *RespEnterGame_Config) GetEntitySpeed() int32 { 335 | if m != nil { 336 | return m.EntitySpeed 337 | } 338 | return 0 339 | } 340 | 341 | func (m *RespEnterGame_Config) GetBulletSpeed() int32 { 342 | if m != nil { 343 | return m.BulletSpeed 344 | } 345 | return 0 346 | } 347 | 348 | func (m *RespEnterGame_Config) GetNoticePosDuration() int32 { 349 | if m != nil { 350 | return m.NoticePosDuration 351 | } 352 | return 0 353 | } 354 | 355 | func (m *RespEnterGame_Config) GetProtectTime() int32 { 356 | if m != nil { 357 | return m.ProtectTime 358 | } 359 | return 0 360 | } 361 | 362 | func (m *RespEnterGame_Config) GetEntityRadius() int32 { 363 | if m != nil { 364 | return m.EntityRadius 365 | } 366 | return 0 367 | } 368 | 369 | type Rank struct { 370 | List []*Rank_Item `protobuf:"bytes,1,rep,name=list" json:"list,omitempty"` 371 | } 372 | 373 | func (m *Rank) Reset() { *m = Rank{} } 374 | func (m *Rank) String() string { return proto.CompactTextString(m) } 375 | func (*Rank) ProtoMessage() {} 376 | func (*Rank) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } 377 | 378 | func (m *Rank) GetList() []*Rank_Item { 379 | if m != nil { 380 | return m.List 381 | } 382 | return nil 383 | } 384 | 385 | type Rank_Item struct { 386 | EntityID int32 `protobuf:"varint,1,opt,name=entityID" json:"entityID,omitempty"` 387 | Score int32 `protobuf:"varint,2,opt,name=score" json:"score,omitempty"` 388 | Rank int32 `protobuf:"varint,3,opt,name=rank" json:"rank,omitempty"` 389 | KillCount int32 `protobuf:"varint,4,opt,name=killCount" json:"killCount,omitempty"` 390 | HeadImgUrl string `protobuf:"bytes,5,opt,name=headImgUrl" json:"headImgUrl,omitempty"` 391 | Nickname string `protobuf:"bytes,6,opt,name=nickname" json:"nickname,omitempty"` 392 | } 393 | 394 | func (m *Rank_Item) Reset() { *m = Rank_Item{} } 395 | func (m *Rank_Item) String() string { return proto.CompactTextString(m) } 396 | func (*Rank_Item) ProtoMessage() {} 397 | func (*Rank_Item) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6, 0} } 398 | 399 | func (m *Rank_Item) GetEntityID() int32 { 400 | if m != nil { 401 | return m.EntityID 402 | } 403 | return 0 404 | } 405 | 406 | func (m *Rank_Item) GetScore() int32 { 407 | if m != nil { 408 | return m.Score 409 | } 410 | return 0 411 | } 412 | 413 | func (m *Rank_Item) GetRank() int32 { 414 | if m != nil { 415 | return m.Rank 416 | } 417 | return 0 418 | } 419 | 420 | func (m *Rank_Item) GetKillCount() int32 { 421 | if m != nil { 422 | return m.KillCount 423 | } 424 | return 0 425 | } 426 | 427 | func (m *Rank_Item) GetHeadImgUrl() string { 428 | if m != nil { 429 | return m.HeadImgUrl 430 | } 431 | return "" 432 | } 433 | 434 | func (m *Rank_Item) GetNickname() string { 435 | if m != nil { 436 | return m.Nickname 437 | } 438 | return "" 439 | } 440 | 441 | type SNoticeGameOver struct { 442 | OverReason int32 `protobuf:"varint,1,opt,name=overReason" json:"overReason,omitempty"` 443 | Killer *SNoticeGameOver_Killer `protobuf:"bytes,2,opt,name=killer" json:"killer,omitempty"` 444 | GameLeftSec int32 `protobuf:"varint,3,opt,name=gameLeftSec" json:"gameLeftSec,omitempty"` 445 | Rank *Rank `protobuf:"bytes,4,opt,name=rank" json:"rank,omitempty"` 446 | } 447 | 448 | func (m *SNoticeGameOver) Reset() { *m = SNoticeGameOver{} } 449 | func (m *SNoticeGameOver) String() string { return proto.CompactTextString(m) } 450 | func (*SNoticeGameOver) ProtoMessage() {} 451 | func (*SNoticeGameOver) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } 452 | 453 | func (m *SNoticeGameOver) GetOverReason() int32 { 454 | if m != nil { 455 | return m.OverReason 456 | } 457 | return 0 458 | } 459 | 460 | func (m *SNoticeGameOver) GetKiller() *SNoticeGameOver_Killer { 461 | if m != nil { 462 | return m.Killer 463 | } 464 | return nil 465 | } 466 | 467 | func (m *SNoticeGameOver) GetGameLeftSec() int32 { 468 | if m != nil { 469 | return m.GameLeftSec 470 | } 471 | return 0 472 | } 473 | 474 | func (m *SNoticeGameOver) GetRank() *Rank { 475 | if m != nil { 476 | return m.Rank 477 | } 478 | return nil 479 | } 480 | 481 | type SNoticeGameOver_Killer struct { 482 | AccountType int32 `protobuf:"varint,1,opt,name=accountType" json:"accountType,omitempty"` 483 | Nickname string `protobuf:"bytes,2,opt,name=nickname" json:"nickname,omitempty"` 484 | HeadImgUrl string `protobuf:"bytes,3,opt,name=headImgUrl" json:"headImgUrl,omitempty"` 485 | Hp int32 `protobuf:"varint,4,opt,name=hp" json:"hp,omitempty"` 486 | } 487 | 488 | func (m *SNoticeGameOver_Killer) Reset() { *m = SNoticeGameOver_Killer{} } 489 | func (m *SNoticeGameOver_Killer) String() string { return proto.CompactTextString(m) } 490 | func (*SNoticeGameOver_Killer) ProtoMessage() {} 491 | func (*SNoticeGameOver_Killer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } 492 | 493 | func (m *SNoticeGameOver_Killer) GetAccountType() int32 { 494 | if m != nil { 495 | return m.AccountType 496 | } 497 | return 0 498 | } 499 | 500 | func (m *SNoticeGameOver_Killer) GetNickname() string { 501 | if m != nil { 502 | return m.Nickname 503 | } 504 | return "" 505 | } 506 | 507 | func (m *SNoticeGameOver_Killer) GetHeadImgUrl() string { 508 | if m != nil { 509 | return m.HeadImgUrl 510 | } 511 | return "" 512 | } 513 | 514 | func (m *SNoticeGameOver_Killer) GetHp() int32 { 515 | if m != nil { 516 | return m.Hp 517 | } 518 | return 0 519 | } 520 | 521 | type ReqMove struct { 522 | PressTime float32 `protobuf:"fixed32,1,opt,name=pressTime" json:"pressTime,omitempty"` 523 | TargetRotation float32 `protobuf:"fixed32,2,opt,name=targetRotation" json:"targetRotation,omitempty"` 524 | InputSeqID int32 `protobuf:"varint,3,opt,name=inputSeqID" json:"inputSeqID,omitempty"` 525 | } 526 | 527 | func (m *ReqMove) Reset() { *m = ReqMove{} } 528 | func (m *ReqMove) String() string { return proto.CompactTextString(m) } 529 | func (*ReqMove) ProtoMessage() {} 530 | func (*ReqMove) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } 531 | 532 | func (m *ReqMove) GetPressTime() float32 { 533 | if m != nil { 534 | return m.PressTime 535 | } 536 | return 0 537 | } 538 | 539 | func (m *ReqMove) GetTargetRotation() float32 { 540 | if m != nil { 541 | return m.TargetRotation 542 | } 543 | return 0 544 | } 545 | 546 | func (m *ReqMove) GetInputSeqID() int32 { 547 | if m != nil { 548 | return m.InputSeqID 549 | } 550 | return 0 551 | } 552 | 553 | type ReqShoot struct { 554 | } 555 | 556 | func (m *ReqShoot) Reset() { *m = ReqShoot{} } 557 | func (m *ReqShoot) String() string { return proto.CompactTextString(m) } 558 | func (*ReqShoot) ProtoMessage() {} 559 | func (*ReqShoot) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } 560 | 561 | type ReqJump struct { 562 | } 563 | 564 | func (m *ReqJump) Reset() { *m = ReqJump{} } 565 | func (m *ReqJump) String() string { return proto.CompactTextString(m) } 566 | func (*ReqJump) ProtoMessage() {} 567 | func (*ReqJump) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } 568 | 569 | // 请求游戏场景信息 570 | type ReqGameScene struct { 571 | } 572 | 573 | func (m *ReqGameScene) Reset() { *m = ReqGameScene{} } 574 | func (m *ReqGameScene) String() string { return proto.CompactTextString(m) } 575 | func (*ReqGameScene) ProtoMessage() {} 576 | func (*ReqGameScene) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } 577 | 578 | // 断线重连,请求当前场景信息 579 | type RespGameScene struct { 580 | Entities []*Entity `protobuf:"bytes,1,rep,name=entities" json:"entities,omitempty"` 581 | GameLeftSec int32 `protobuf:"varint,2,opt,name=gameLeftSec" json:"gameLeftSec,omitempty"` 582 | Err RespGameScene_Error `protobuf:"varint,3,opt,name=err,enum=cmsg.RespGameScene_Error" json:"err,omitempty"` 583 | } 584 | 585 | func (m *RespGameScene) Reset() { *m = RespGameScene{} } 586 | func (m *RespGameScene) String() string { return proto.CompactTextString(m) } 587 | func (*RespGameScene) ProtoMessage() {} 588 | func (*RespGameScene) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } 589 | 590 | func (m *RespGameScene) GetEntities() []*Entity { 591 | if m != nil { 592 | return m.Entities 593 | } 594 | return nil 595 | } 596 | 597 | func (m *RespGameScene) GetGameLeftSec() int32 { 598 | if m != nil { 599 | return m.GameLeftSec 600 | } 601 | return 0 602 | } 603 | 604 | func (m *RespGameScene) GetErr() RespGameScene_Error { 605 | if m != nil { 606 | return m.Err 607 | } 608 | return RespGameScene_Invalid 609 | } 610 | 611 | // 子弹发送 612 | type SNoticeShoot struct { 613 | X float32 `protobuf:"fixed32,1,opt,name=x" json:"x,omitempty"` 614 | Y float32 `protobuf:"fixed32,2,opt,name=y" json:"y,omitempty"` 615 | Rotation float32 `protobuf:"fixed32,3,opt,name=rotation" json:"rotation,omitempty"` 616 | BulletID int32 `protobuf:"varint,4,opt,name=bulletID" json:"bulletID,omitempty"` 617 | CreatorEntityID int32 `protobuf:"varint,5,opt,name=creatorEntityID" json:"creatorEntityID,omitempty"` 618 | } 619 | 620 | func (m *SNoticeShoot) Reset() { *m = SNoticeShoot{} } 621 | func (m *SNoticeShoot) String() string { return proto.CompactTextString(m) } 622 | func (*SNoticeShoot) ProtoMessage() {} 623 | func (*SNoticeShoot) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } 624 | 625 | func (m *SNoticeShoot) GetX() float32 { 626 | if m != nil { 627 | return m.X 628 | } 629 | return 0 630 | } 631 | 632 | func (m *SNoticeShoot) GetY() float32 { 633 | if m != nil { 634 | return m.Y 635 | } 636 | return 0 637 | } 638 | 639 | func (m *SNoticeShoot) GetRotation() float32 { 640 | if m != nil { 641 | return m.Rotation 642 | } 643 | return 0 644 | } 645 | 646 | func (m *SNoticeShoot) GetBulletID() int32 { 647 | if m != nil { 648 | return m.BulletID 649 | } 650 | return 0 651 | } 652 | 653 | func (m *SNoticeShoot) GetCreatorEntityID() int32 { 654 | if m != nil { 655 | return m.CreatorEntityID 656 | } 657 | return 0 658 | } 659 | 660 | type SNoticeWorldChange struct { 661 | DeleteBullets []int32 `protobuf:"varint,1,rep,packed,name=deleteBullets" json:"deleteBullets,omitempty"` 662 | DeleteEntities []int32 `protobuf:"varint,2,rep,packed,name=deleteEntities" json:"deleteEntities,omitempty"` 663 | ChangedEntities []*SNoticeWorldChange_Entity `protobuf:"bytes,3,rep,name=changedEntities" json:"changedEntities,omitempty"` 664 | } 665 | 666 | func (m *SNoticeWorldChange) Reset() { *m = SNoticeWorldChange{} } 667 | func (m *SNoticeWorldChange) String() string { return proto.CompactTextString(m) } 668 | func (*SNoticeWorldChange) ProtoMessage() {} 669 | func (*SNoticeWorldChange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } 670 | 671 | func (m *SNoticeWorldChange) GetDeleteBullets() []int32 { 672 | if m != nil { 673 | return m.DeleteBullets 674 | } 675 | return nil 676 | } 677 | 678 | func (m *SNoticeWorldChange) GetDeleteEntities() []int32 { 679 | if m != nil { 680 | return m.DeleteEntities 681 | } 682 | return nil 683 | } 684 | 685 | func (m *SNoticeWorldChange) GetChangedEntities() []*SNoticeWorldChange_Entity { 686 | if m != nil { 687 | return m.ChangedEntities 688 | } 689 | return nil 690 | } 691 | 692 | type SNoticeWorldChange_Entity struct { 693 | Id int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` 694 | Hp int32 `protobuf:"varint,2,opt,name=hp" json:"hp,omitempty"` 695 | Score int32 `protobuf:"varint,3,opt,name=score" json:"score,omitempty"` 696 | KillCount int32 `protobuf:"varint,4,opt,name=killCount" json:"killCount,omitempty"` 697 | } 698 | 699 | func (m *SNoticeWorldChange_Entity) Reset() { *m = SNoticeWorldChange_Entity{} } 700 | func (m *SNoticeWorldChange_Entity) String() string { return proto.CompactTextString(m) } 701 | func (*SNoticeWorldChange_Entity) ProtoMessage() {} 702 | func (*SNoticeWorldChange_Entity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14, 0} } 703 | 704 | func (m *SNoticeWorldChange_Entity) GetId() int32 { 705 | if m != nil { 706 | return m.Id 707 | } 708 | return 0 709 | } 710 | 711 | func (m *SNoticeWorldChange_Entity) GetHp() int32 { 712 | if m != nil { 713 | return m.Hp 714 | } 715 | return 0 716 | } 717 | 718 | func (m *SNoticeWorldChange_Entity) GetScore() int32 { 719 | if m != nil { 720 | return m.Score 721 | } 722 | return 0 723 | } 724 | 725 | func (m *SNoticeWorldChange_Entity) GetKillCount() int32 { 726 | if m != nil { 727 | return m.KillCount 728 | } 729 | return 0 730 | } 731 | 732 | type SNoticeWorldPos struct { 733 | Entities []*SNoticeWorldPos_Entity `protobuf:"bytes,1,rep,name=entities" json:"entities,omitempty"` 734 | LastProcessedInputID int32 `protobuf:"varint,2,opt,name=lastProcessedInputID" json:"lastProcessedInputID,omitempty"` 735 | } 736 | 737 | func (m *SNoticeWorldPos) Reset() { *m = SNoticeWorldPos{} } 738 | func (m *SNoticeWorldPos) String() string { return proto.CompactTextString(m) } 739 | func (*SNoticeWorldPos) ProtoMessage() {} 740 | func (*SNoticeWorldPos) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } 741 | 742 | func (m *SNoticeWorldPos) GetEntities() []*SNoticeWorldPos_Entity { 743 | if m != nil { 744 | return m.Entities 745 | } 746 | return nil 747 | } 748 | 749 | func (m *SNoticeWorldPos) GetLastProcessedInputID() int32 { 750 | if m != nil { 751 | return m.LastProcessedInputID 752 | } 753 | return 0 754 | } 755 | 756 | type SNoticeWorldPos_Entity struct { 757 | Id int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` 758 | X float32 `protobuf:"fixed32,2,opt,name=x" json:"x,omitempty"` 759 | Y float32 `protobuf:"fixed32,3,opt,name=y" json:"y,omitempty"` 760 | Rotation float32 `protobuf:"fixed32,4,opt,name=rotation" json:"rotation,omitempty"` 761 | } 762 | 763 | func (m *SNoticeWorldPos_Entity) Reset() { *m = SNoticeWorldPos_Entity{} } 764 | func (m *SNoticeWorldPos_Entity) String() string { return proto.CompactTextString(m) } 765 | func (*SNoticeWorldPos_Entity) ProtoMessage() {} 766 | func (*SNoticeWorldPos_Entity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15, 0} } 767 | 768 | func (m *SNoticeWorldPos_Entity) GetId() int32 { 769 | if m != nil { 770 | return m.Id 771 | } 772 | return 0 773 | } 774 | 775 | func (m *SNoticeWorldPos_Entity) GetX() float32 { 776 | if m != nil { 777 | return m.X 778 | } 779 | return 0 780 | } 781 | 782 | func (m *SNoticeWorldPos_Entity) GetY() float32 { 783 | if m != nil { 784 | return m.Y 785 | } 786 | return 0 787 | } 788 | 789 | func (m *SNoticeWorldPos_Entity) GetRotation() float32 { 790 | if m != nil { 791 | return m.Rotation 792 | } 793 | return 0 794 | } 795 | 796 | type Entity struct { 797 | Id int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` 798 | AccountType int32 `protobuf:"varint,2,opt,name=accountType" json:"accountType,omitempty"` 799 | HeadImgUrl string `protobuf:"bytes,3,opt,name=headImgUrl" json:"headImgUrl,omitempty"` 800 | Rotation float32 `protobuf:"fixed32,4,opt,name=rotation" json:"rotation,omitempty"` 801 | Hp int32 `protobuf:"varint,5,opt,name=hp" json:"hp,omitempty"` 802 | Score int32 `protobuf:"varint,6,opt,name=score" json:"score,omitempty"` 803 | KillCount int32 `protobuf:"varint,7,opt,name=killCount" json:"killCount,omitempty"` 804 | Dead bool `protobuf:"varint,8,opt,name=dead" json:"dead,omitempty"` 805 | Protected bool `protobuf:"varint,9,opt,name=protected" json:"protected,omitempty"` 806 | X float32 `protobuf:"fixed32,10,opt,name=x" json:"x,omitempty"` 807 | Y float32 `protobuf:"fixed32,11,opt,name=y" json:"y,omitempty"` 808 | Nickname string `protobuf:"bytes,12,opt,name=nickname" json:"nickname,omitempty"` 809 | } 810 | 811 | func (m *Entity) Reset() { *m = Entity{} } 812 | func (m *Entity) String() string { return proto.CompactTextString(m) } 813 | func (*Entity) ProtoMessage() {} 814 | func (*Entity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } 815 | 816 | func (m *Entity) GetId() int32 { 817 | if m != nil { 818 | return m.Id 819 | } 820 | return 0 821 | } 822 | 823 | func (m *Entity) GetAccountType() int32 { 824 | if m != nil { 825 | return m.AccountType 826 | } 827 | return 0 828 | } 829 | 830 | func (m *Entity) GetHeadImgUrl() string { 831 | if m != nil { 832 | return m.HeadImgUrl 833 | } 834 | return "" 835 | } 836 | 837 | func (m *Entity) GetRotation() float32 { 838 | if m != nil { 839 | return m.Rotation 840 | } 841 | return 0 842 | } 843 | 844 | func (m *Entity) GetHp() int32 { 845 | if m != nil { 846 | return m.Hp 847 | } 848 | return 0 849 | } 850 | 851 | func (m *Entity) GetScore() int32 { 852 | if m != nil { 853 | return m.Score 854 | } 855 | return 0 856 | } 857 | 858 | func (m *Entity) GetKillCount() int32 { 859 | if m != nil { 860 | return m.KillCount 861 | } 862 | return 0 863 | } 864 | 865 | func (m *Entity) GetDead() bool { 866 | if m != nil { 867 | return m.Dead 868 | } 869 | return false 870 | } 871 | 872 | func (m *Entity) GetProtected() bool { 873 | if m != nil { 874 | return m.Protected 875 | } 876 | return false 877 | } 878 | 879 | func (m *Entity) GetX() float32 { 880 | if m != nil { 881 | return m.X 882 | } 883 | return 0 884 | } 885 | 886 | func (m *Entity) GetY() float32 { 887 | if m != nil { 888 | return m.Y 889 | } 890 | return 0 891 | } 892 | 893 | func (m *Entity) GetNickname() string { 894 | if m != nil { 895 | return m.Nickname 896 | } 897 | return "" 898 | } 899 | 900 | type SNoticeNewEntity struct { 901 | Entity *Entity `protobuf:"bytes,1,opt,name=entity" json:"entity,omitempty"` 902 | } 903 | 904 | func (m *SNoticeNewEntity) Reset() { *m = SNoticeNewEntity{} } 905 | func (m *SNoticeNewEntity) String() string { return proto.CompactTextString(m) } 906 | func (*SNoticeNewEntity) ProtoMessage() {} 907 | func (*SNoticeNewEntity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } 908 | 909 | func (m *SNoticeNewEntity) GetEntity() *Entity { 910 | if m != nil { 911 | return m.Entity 912 | } 913 | return nil 914 | } 915 | 916 | // 通知被T出 917 | type SNoticeKickOut struct { 918 | Reason SNoticeKickOut_Reason `protobuf:"varint,1,opt,name=reason,enum=cmsg.SNoticeKickOut_Reason" json:"reason,omitempty"` 919 | } 920 | 921 | func (m *SNoticeKickOut) Reset() { *m = SNoticeKickOut{} } 922 | func (m *SNoticeKickOut) String() string { return proto.CompactTextString(m) } 923 | func (*SNoticeKickOut) ProtoMessage() {} 924 | func (*SNoticeKickOut) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } 925 | 926 | func (m *SNoticeKickOut) GetReason() SNoticeKickOut_Reason { 927 | if m != nil { 928 | return m.Reason 929 | } 930 | return SNoticeKickOut_Invalid 931 | } 932 | 933 | func init() { 934 | proto.RegisterType((*ReqLogin)(nil), "cmsg.ReqLogin") 935 | proto.RegisterType((*RespLogin)(nil), "cmsg.RespLogin") 936 | proto.RegisterType((*ReqJoinGame)(nil), "cmsg.ReqJoinGame") 937 | proto.RegisterType((*RespJoinGame)(nil), "cmsg.RespJoinGame") 938 | proto.RegisterType((*ReqEnterGame)(nil), "cmsg.ReqEnterGame") 939 | proto.RegisterType((*RespEnterGame)(nil), "cmsg.RespEnterGame") 940 | proto.RegisterType((*RespEnterGame_Config)(nil), "cmsg.RespEnterGame.Config") 941 | proto.RegisterType((*Rank)(nil), "cmsg.Rank") 942 | proto.RegisterType((*Rank_Item)(nil), "cmsg.Rank.Item") 943 | proto.RegisterType((*SNoticeGameOver)(nil), "cmsg.SNoticeGameOver") 944 | proto.RegisterType((*SNoticeGameOver_Killer)(nil), "cmsg.SNoticeGameOver.Killer") 945 | proto.RegisterType((*ReqMove)(nil), "cmsg.ReqMove") 946 | proto.RegisterType((*ReqShoot)(nil), "cmsg.ReqShoot") 947 | proto.RegisterType((*ReqJump)(nil), "cmsg.ReqJump") 948 | proto.RegisterType((*ReqGameScene)(nil), "cmsg.ReqGameScene") 949 | proto.RegisterType((*RespGameScene)(nil), "cmsg.RespGameScene") 950 | proto.RegisterType((*SNoticeShoot)(nil), "cmsg.SNoticeShoot") 951 | proto.RegisterType((*SNoticeWorldChange)(nil), "cmsg.SNoticeWorldChange") 952 | proto.RegisterType((*SNoticeWorldChange_Entity)(nil), "cmsg.SNoticeWorldChange.Entity") 953 | proto.RegisterType((*SNoticeWorldPos)(nil), "cmsg.SNoticeWorldPos") 954 | proto.RegisterType((*SNoticeWorldPos_Entity)(nil), "cmsg.SNoticeWorldPos.Entity") 955 | proto.RegisterType((*Entity)(nil), "cmsg.Entity") 956 | proto.RegisterType((*SNoticeNewEntity)(nil), "cmsg.SNoticeNewEntity") 957 | proto.RegisterType((*SNoticeKickOut)(nil), "cmsg.SNoticeKickOut") 958 | proto.RegisterEnum("cmsg.RespLogin_Error", RespLogin_Error_name, RespLogin_Error_value) 959 | proto.RegisterEnum("cmsg.RespJoinGame_Error", RespJoinGame_Error_name, RespJoinGame_Error_value) 960 | proto.RegisterEnum("cmsg.RespEnterGame_Error", RespEnterGame_Error_name, RespEnterGame_Error_value) 961 | proto.RegisterEnum("cmsg.RespGameScene_Error", RespGameScene_Error_name, RespGameScene_Error_value) 962 | proto.RegisterEnum("cmsg.SNoticeKickOut_Reason", SNoticeKickOut_Reason_name, SNoticeKickOut_Reason_value) 963 | } 964 | 965 | func init() { proto.RegisterFile("msg/cmsg/cmsg.proto", fileDescriptor0) } 966 | 967 | var fileDescriptor0 = []byte{ 968 | // 1131 bytes of a gzipped FileDescriptorProto 969 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0xdd, 0x8e, 0x22, 0x45, 970 | 0x14, 0xb6, 0x1b, 0xe8, 0x19, 0x0e, 0x2c, 0xc3, 0x96, 0xa3, 0x41, 0x9c, 0xac, 0xa4, 0xdc, 0xac, 971 | 0xf8, 0x13, 0x4c, 0x58, 0x2f, 0x36, 0xf1, 0x4a, 0x67, 0x88, 0x61, 0x67, 0x9c, 0x25, 0xc5, 0x6e, 972 | 0xbc, 0xf1, 0xa6, 0xb7, 0xfb, 0x2c, 0xd3, 0xa1, 0xe9, 0x62, 0xaa, 0x0b, 0x9c, 0x79, 0x06, 0x8d, 973 | 0x37, 0xde, 0x9b, 0x98, 0x18, 0xaf, 0x7d, 0x15, 0x13, 0x5f, 0xc2, 0xb7, 0x30, 0xf5, 0x43, 0xd3, 974 | 0xdd, 0x30, 0xa3, 0x37, 0x84, 0xfa, 0xea, 0x70, 0xea, 0x3b, 0xdf, 0x39, 0xf5, 0x15, 0xf0, 0xf6, 975 | 0x22, 0x9d, 0x7d, 0x1e, 0x6c, 0x3e, 0x06, 0x4b, 0xc1, 0x25, 0x27, 0x55, 0xf5, 0x9d, 0xf6, 0xe0, 976 | 0x90, 0xe1, 0xf5, 0x05, 0x9f, 0x45, 0x09, 0x39, 0x86, 0x9a, 0xe4, 0x73, 0x4c, 0x3a, 0x4e, 0xcf, 977 | 0xe9, 0xd7, 0x99, 0x59, 0xd0, 0x5f, 0x1d, 0xa8, 0x33, 0x4c, 0x97, 0x26, 0xe6, 0x23, 0xa8, 0xa0, 978 | 0x10, 0x3a, 0xa2, 0x35, 0x7c, 0x67, 0xa0, 0xf3, 0x65, 0xbb, 0x83, 0x91, 0x10, 0x5c, 0x30, 0x15, 979 | 0x41, 0xde, 0x05, 0x6f, 0x95, 0xa2, 0x18, 0x9f, 0x75, 0xdc, 0x9e, 0xd3, 0xaf, 0x32, 0xbb, 0xda, 980 | 0x1e, 0x52, 0xc9, 0x1d, 0xa2, 0xa2, 0xa3, 0xe4, 0x1b, 0x7f, 0x81, 0x9d, 0x6a, 0xcf, 0xe9, 0x1f, 981 | 0x32, 0xbb, 0xa2, 0x14, 0x6a, 0x3a, 0x27, 0x69, 0xc0, 0xc1, 0x38, 0x59, 0xfb, 0x71, 0x14, 0xb6, 982 | 0xdf, 0x22, 0x4d, 0x38, 0x64, 0x93, 0x53, 0xbd, 0xd1, 0x76, 0xe8, 0xc7, 0xd0, 0x60, 0x78, 0xfd, 983 | 0x9c, 0x9b, 0x9f, 0x90, 0x2e, 0x1c, 0x26, 0x51, 0x30, 0x4f, 0x54, 0x32, 0x53, 0x48, 0xb6, 0xa6, 984 | 0xbf, 0x38, 0xd0, 0x54, 0x6c, 0xb3, 0xe0, 0x4f, 0xf2, 0xe5, 0x74, 0xb6, 0xe5, 0x6c, 0x02, 0xf2, 985 | 0x15, 0xe5, 0x13, 0xbb, 0xa5, 0xc4, 0x5f, 0xee, 0xe5, 0x49, 0xa0, 0xf5, 0x2a, 0x45, 0x71, 0xc9, 986 | 0xe5, 0xe8, 0x26, 0x4a, 0x25, 0x86, 0x6d, 0x87, 0x3c, 0x84, 0x07, 0x5f, 0xc5, 0x02, 0xfd, 0xf0, 987 | 0x76, 0xac, 0x4f, 0x68, 0xbb, 0xb4, 0xa5, 0x48, 0x5d, 0x8f, 0x12, 0x89, 0x42, 0x17, 0xfd, 0x4f, 988 | 0x05, 0x1e, 0x28, 0x12, 0x19, 0x42, 0x86, 0xe0, 0x05, 0x3c, 0x79, 0x13, 0xcd, 0x34, 0xd3, 0xc6, 989 | 0xb0, 0xbb, 0x65, 0x9a, 0x05, 0x0d, 0x4e, 0x75, 0x04, 0xb3, 0x91, 0x8a, 0x2e, 0x26, 0x32, 0x92, 990 | 0xb7, 0xb6, 0x05, 0x35, 0x96, 0xad, 0x49, 0x0f, 0x1a, 0x33, 0x7f, 0x81, 0x17, 0xf8, 0x46, 0x4e, 991 | 0x31, 0xd0, 0xad, 0xa8, 0xb1, 0x3c, 0x44, 0x08, 0x54, 0x43, 0xf4, 0x43, 0xdb, 0x0e, 0xfd, 0x9d, 992 | 0x7c, 0x6a, 0xc4, 0xaa, 0x69, 0xb1, 0xde, 0xdb, 0x47, 0x61, 0xab, 0x56, 0xf7, 0x67, 0x17, 0x3c, 993 | 0xc3, 0x88, 0x3c, 0x81, 0xd6, 0xeb, 0x55, 0x1c, 0xa3, 0xbc, 0x88, 0xd6, 0xf8, 0x32, 0xb2, 0x7d, 994 | 0xa9, 0xb1, 0x12, 0x4a, 0x1e, 0xc3, 0x03, 0xc1, 0xa5, 0x2f, 0x23, 0x9e, 0x9c, 0x61, 0x2c, 0x7d, 995 | 0x4d, 0xdb, 0x65, 0x45, 0x50, 0x71, 0x37, 0x75, 0x4c, 0x97, 0x88, 0xe1, 0x86, 0x7b, 0x0e, 0x52, 996 | 0x11, 0x26, 0xb3, 0x89, 0xa8, 0x9a, 0x88, 0x1c, 0x44, 0x3e, 0x83, 0x87, 0x09, 0x97, 0x51, 0x80, 997 | 0x13, 0x9e, 0x9e, 0xad, 0x84, 0xce, 0xae, 0xeb, 0xaa, 0xb1, 0xdd, 0x0d, 0x95, 0x4f, 0x5d, 0x19, 998 | 0x0c, 0xa4, 0x26, 0xef, 0x99, 0x7c, 0x39, 0x88, 0x50, 0x68, 0x1a, 0x02, 0xcc, 0x0f, 0xa3, 0x55, 999 | 0xda, 0x39, 0xd0, 0x21, 0x05, 0x8c, 0x1e, 0xef, 0x1b, 0x11, 0xfa, 0xb7, 0x03, 0x55, 0xe6, 0x27, 1000 | 0x73, 0xf2, 0x21, 0x54, 0xe3, 0x28, 0x95, 0x1d, 0xa7, 0x57, 0xe9, 0x37, 0x86, 0x47, 0x56, 0x5d, 1001 | 0x3f, 0x99, 0x0f, 0xc6, 0x12, 0x17, 0x4c, 0x6f, 0x76, 0xff, 0x70, 0xa0, 0xaa, 0x96, 0x85, 0xe6, 1002 | 0x3a, 0xa5, 0xe6, 0x1e, 0x43, 0x2d, 0x0d, 0xb8, 0x40, 0xdb, 0x75, 0xb3, 0x50, 0x0d, 0x15, 0x7e, 1003 | 0x32, 0xb7, 0x7a, 0xe9, 0xef, 0xe4, 0x04, 0xea, 0xf3, 0x28, 0x8e, 0x4f, 0xf9, 0x2a, 0x91, 0x56, 1004 | 0xa6, 0x2d, 0x40, 0x1e, 0x01, 0x5c, 0xa1, 0x1f, 0x8e, 0x17, 0xb3, 0x57, 0x22, 0xd6, 0xea, 0xd4, 1005 | 0x59, 0x0e, 0x29, 0xdc, 0x07, 0xaf, 0x74, 0x1f, 0x7e, 0x73, 0xe1, 0x68, 0x7a, 0xa9, 0x95, 0x54, 1006 | 0x83, 0xf1, 0x62, 0x8d, 0x42, 0xe5, 0xe3, 0x6b, 0x14, 0x0c, 0xfd, 0x94, 0x27, 0x96, 0x75, 0x0e, 1007 | 0x21, 0x5f, 0x80, 0xa7, 0x0e, 0x47, 0xa1, 0x89, 0x37, 0x86, 0x27, 0x46, 0x83, 0x52, 0x9a, 0xc1, 1008 | 0xb9, 0x8e, 0x61, 0x36, 0xf6, 0x7f, 0x8c, 0xf2, 0x23, 0x5b, 0x79, 0x55, 0x67, 0x85, 0xad, 0xb2, 1009 | 0x46, 0x85, 0xee, 0x1a, 0xbc, 0xf3, 0x2c, 0x97, 0x1f, 0x04, 0xaa, 0xf8, 0x97, 0xb7, 0xcb, 0xcd, 1010 | 0x94, 0xe6, 0xa1, 0xfb, 0x3c, 0xa0, 0xa4, 0x57, 0x65, 0x47, 0xaf, 0x16, 0xb8, 0x57, 0x4b, 0x2b, 1011 | 0xb3, 0x7b, 0xb5, 0xa4, 0x1c, 0x0e, 0x18, 0x5e, 0x7f, 0xcb, 0xd7, 0xa8, 0x1a, 0xb1, 0x14, 0x98, 1012 | 0xa6, 0xd9, 0xe5, 0x70, 0xd9, 0x16, 0x50, 0xf7, 0x47, 0xfa, 0x62, 0x86, 0x92, 0xd9, 0x8b, 0x60, 1013 | 0x2f, 0x46, 0x09, 0x55, 0x04, 0xa2, 0x64, 0xb9, 0x92, 0x53, 0xbc, 0x1e, 0x9f, 0x59, 0x25, 0x72, 1014 | 0x08, 0x05, 0xed, 0xf5, 0xd3, 0x2b, 0xce, 0x25, 0xad, 0xeb, 0xc3, 0x9f, 0xaf, 0x16, 0x4b, 0x6b, 1015 | 0x3f, 0x4a, 0xdf, 0x69, 0x80, 0x09, 0xd2, 0x3f, 0x1d, 0x63, 0x3f, 0x19, 0x42, 0xfa, 0x76, 0xda, 1016 | 0x22, 0x4c, 0xed, 0x7c, 0x36, 0x8d, 0x8a, 0x23, 0x33, 0xe0, 0xd9, 0x6e, 0xb9, 0x1b, 0xee, 0x6e, 1017 | 0x37, 0xac, 0x89, 0x54, 0xca, 0x26, 0x92, 0x9d, 0x96, 0x33, 0x11, 0xfa, 0x64, 0xaf, 0xad, 0xb6, 1018 | 0xa1, 0xa9, 0xa2, 0x37, 0xb6, 0xda, 0x76, 0xe8, 0x4f, 0x0e, 0x34, 0xed, 0x9c, 0xe8, 0xf2, 0x48, 1019 | 0x13, 0x9c, 0x1b, 0x2b, 0xa4, 0x73, 0xa3, 0x56, 0xb7, 0x56, 0x33, 0xe7, 0x56, 0xf5, 0x70, 0xe3, 1020 | 0x28, 0x9a, 0x86, 0xcb, 0xb2, 0xb5, 0xda, 0x33, 0x3e, 0x31, 0x3e, 0xb3, 0x9d, 0xca, 0xd6, 0xa4, 1021 | 0x0f, 0x47, 0x81, 0x40, 0x5f, 0x72, 0x31, 0xda, 0x5c, 0x3d, 0x63, 0x19, 0x65, 0x98, 0xfe, 0xe8, 1022 | 0x02, 0xb1, 0x74, 0xbe, 0xe3, 0x22, 0x0e, 0x4f, 0xaf, 0xfc, 0x64, 0xa6, 0xfd, 0x2d, 0xc4, 0x18, 1023 | 0x25, 0x7e, 0xad, 0x53, 0x1a, 0x2d, 0x6b, 0xac, 0x08, 0xaa, 0x6e, 0x1b, 0x60, 0xb4, 0x91, 0xdc, 1024 | 0xd5, 0x61, 0x25, 0x94, 0x8c, 0xe1, 0x28, 0xd0, 0x79, 0xc3, 0x2c, 0xb0, 0xa2, 0x7b, 0xf3, 0x41, 1025 | 0xe1, 0xde, 0xe4, 0x08, 0x6c, 0xda, 0x55, 0xfe, 0x5d, 0xf7, 0x7b, 0xf0, 0xcc, 0x96, 0x9a, 0xd1, 1026 | 0x28, 0xb4, 0x83, 0xef, 0x46, 0xa1, 0x9d, 0x59, 0x77, 0x33, 0xb3, 0x5b, 0x6f, 0xa9, 0xe4, 0xbd, 1027 | 0xe5, 0x5e, 0x1f, 0xa1, 0x7f, 0x39, 0x99, 0x17, 0x68, 0x32, 0x13, 0x9e, 0x92, 0x67, 0x3b, 0x13, 1028 | 0x75, 0xb2, 0xcb, 0x7a, 0xc2, 0xd3, 0xdd, 0x09, 0x1b, 0xc2, 0x71, 0xec, 0xa7, 0x72, 0x22, 0x78, 1029 | 0x80, 0x69, 0x8a, 0xe1, 0x58, 0xcd, 0x77, 0xf6, 0xc4, 0xed, 0xdd, 0xeb, 0x4e, 0xee, 0xac, 0x4f, 1030 | 0xcf, 0x89, 0x5b, 0x98, 0x93, 0xca, 0xbe, 0x39, 0xa9, 0x16, 0xe7, 0x84, 0xfe, 0xee, 0xde, 0x99, 1031 | 0xb2, 0x64, 0x22, 0xee, 0xae, 0x89, 0xfc, 0x97, 0x51, 0xdc, 0x73, 0xb0, 0x6d, 0x48, 0x6d, 0xb7, 1032 | 0x21, 0xde, 0x9d, 0x0d, 0x39, 0x28, 0x1b, 0xfb, 0xe6, 0x6d, 0x3f, 0xcc, 0xbd, 0xed, 0xda, 0x81, 1033 | 0xf4, 0x83, 0x86, 0x61, 0xa7, 0xae, 0x37, 0xb6, 0x80, 0x91, 0x09, 0x0a, 0x32, 0x35, 0x72, 0x32, 1034 | 0x65, 0x96, 0xd8, 0x2c, 0x3d, 0x03, 0xcf, 0xa0, 0x6d, 0x1b, 0x7a, 0x89, 0x3f, 0x58, 0xbd, 0x1e, 1035 | 0x83, 0x67, 0x9e, 0x2a, 0xfb, 0x5f, 0xa6, 0x68, 0x25, 0x76, 0x8f, 0x46, 0xd0, 0xb2, 0xbf, 0x3c, 1036 | 0x8f, 0x82, 0xf9, 0x8b, 0x95, 0x24, 0x4f, 0xc1, 0x13, 0xdb, 0xa7, 0xa3, 0x35, 0x7c, 0xbf, 0x30, 1037 | 0x30, 0x36, 0x6a, 0x60, 0xde, 0x12, 0x66, 0x43, 0x29, 0x05, 0xcf, 0xbe, 0x2e, 0x05, 0x07, 0x69, 1038 | 0x28, 0xf7, 0x8b, 0xd5, 0x5f, 0xd6, 0xb6, 0xf3, 0xda, 0xd3, 0xff, 0x87, 0x9f, 0xfe, 0x1b, 0x00, 1039 | 0x00, 0xff, 0xff, 0xa5, 0xb8, 0x5f, 0x4a, 0x26, 0x0b, 0x00, 0x00, 1040 | } 1041 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= 13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= 14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= 15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 16 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 17 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 18 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 19 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 20 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= 21 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 22 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 23 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 24 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 25 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 26 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 27 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= 28 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 29 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 30 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 31 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 32 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= 33 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 34 | github.com/0990/goserver v0.0.2 h1:Gro30loExQP0prXsD4CoroE6SsGnNXUDVhxQ3t86nJE= 35 | github.com/0990/goserver v0.0.2/go.mod h1:/p+/vAM2mnZA5Ytcl9FinUimJN8Kn7yWYVAbBiX2IiU= 36 | github.com/0990/goserver v0.0.3 h1:zKklQRzap5Dkf3uKvcUcTd+A+Zvbm1bmACeHnTvmXLA= 37 | github.com/0990/goserver v0.0.3/go.mod h1:KX9123L3+2AJTux0Qjcl0obrtlpSOSoLWqcYUf/vbUc= 38 | github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 39 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 40 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 41 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 42 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 43 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 44 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 45 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 46 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 47 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 48 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 49 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 50 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 51 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 52 | github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= 53 | github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 54 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 55 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 56 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 57 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 58 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 59 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 60 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 61 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 62 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 63 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 64 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 65 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 66 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 67 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 68 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 69 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 70 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 71 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 72 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 73 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 74 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 75 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 76 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 77 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 78 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 79 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 80 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 81 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 82 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 83 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 84 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 85 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 86 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 87 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 88 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 89 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 90 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 91 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 92 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 93 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 94 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 95 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 96 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 97 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 98 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 99 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 100 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 101 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 102 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 103 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 104 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 105 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 106 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 107 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 108 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 109 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 110 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 111 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 112 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 113 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 114 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 115 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 116 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 117 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 118 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 119 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 120 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 121 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 122 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 123 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 124 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 125 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 126 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 127 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 128 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 129 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 130 | github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= 131 | github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 132 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 133 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 134 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 135 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 136 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 137 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 138 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 139 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 140 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 141 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 142 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 143 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 144 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 145 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 146 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 147 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 148 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 149 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 150 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 151 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 152 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 153 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 154 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 155 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 156 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 157 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 158 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 159 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 160 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 161 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 162 | github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= 163 | github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= 164 | github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= 165 | github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= 166 | github.com/nats-io/jwt v1.2.2 h1:w3GMTO969dFg+UOKTmmyuu7IGdusK+7Ytlt//OYH/uU= 167 | github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= 168 | github.com/nats-io/nats-server/v2 v2.1.2 h1:i2Ly0B+1+rzNZHHWtD4ZwKi+OU5l+uQo1iDHZ2PmiIc= 169 | github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= 170 | github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= 171 | github.com/nats-io/nats.go v1.13.0 h1:LvYqRB5epIzZWQp6lmeltOOZNLqCvm4b+qfvzZO03HE= 172 | github.com/nats-io/nats.go v1.13.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= 173 | github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 174 | github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 175 | github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= 176 | github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= 177 | github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= 178 | github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= 179 | github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= 180 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 181 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 182 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 183 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 184 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 185 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 186 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 187 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 188 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 189 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 190 | github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= 191 | github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= 192 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 193 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 194 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 195 | github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= 196 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 197 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 198 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 199 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 200 | github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= 201 | github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= 202 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 203 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 204 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 205 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 206 | github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= 207 | github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 208 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 209 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 210 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 211 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 212 | github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= 213 | github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 214 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 215 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 216 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 217 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 218 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 219 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 220 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 221 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 222 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 223 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 224 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 225 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 226 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 227 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 228 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 229 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 230 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 231 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 232 | golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 233 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 234 | golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 235 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 236 | golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 237 | golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s= 238 | golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 239 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 240 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 241 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 242 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 243 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 244 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 245 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 246 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 247 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 248 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 249 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 250 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 251 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 252 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 253 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 254 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 255 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 256 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 257 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 258 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 259 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 260 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 261 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 262 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 263 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 264 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 265 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 266 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 267 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 268 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 269 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 270 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 271 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 272 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 273 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 274 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 275 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 276 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 277 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 278 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 279 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 280 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 281 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 282 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 283 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 284 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 285 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 286 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 287 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 288 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 289 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 290 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 291 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 292 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 293 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 294 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 295 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 296 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 297 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 298 | golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 299 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 300 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 301 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 302 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 303 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 304 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 305 | golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 306 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 307 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 308 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 309 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 310 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 311 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 312 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 313 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 314 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 315 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 316 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 317 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 318 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 319 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 320 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 321 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 322 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 323 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 324 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 325 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 326 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 327 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 328 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 329 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 330 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 331 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 332 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 333 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 334 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 335 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 336 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 337 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 338 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 339 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 340 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 341 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 342 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 343 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 344 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 345 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 346 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 347 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 348 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 349 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 350 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 351 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 352 | golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 353 | golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= 354 | golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 355 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 356 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 357 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 358 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 359 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 360 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 361 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 362 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 363 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 364 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 365 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 366 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 367 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 368 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 369 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 370 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 371 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 372 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 373 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 374 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 375 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 376 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 377 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 378 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 379 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 380 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 381 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 382 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 383 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 384 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 385 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 386 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 387 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 388 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 389 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 390 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 391 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 392 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 393 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 394 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 395 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 396 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 397 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 398 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 399 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 400 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 401 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 402 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 403 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 404 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 405 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 406 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 407 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 408 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 409 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 410 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 411 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 412 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 413 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 414 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 415 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 416 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 417 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 418 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 419 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 420 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 421 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 422 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 423 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 424 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= 425 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= 426 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 427 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 428 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 429 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 430 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 431 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 432 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 433 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 434 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 435 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 436 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 437 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 438 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 439 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 440 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 441 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 442 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 443 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 444 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 445 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 446 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 447 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 448 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 449 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 450 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 451 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 452 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 453 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 454 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 455 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= 456 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 457 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 458 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 459 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 460 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 461 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 462 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 463 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 464 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 465 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 466 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 467 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 468 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 469 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= 470 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 471 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 472 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 473 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 474 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 475 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 476 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 477 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 478 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 479 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 480 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 481 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 482 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 483 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 484 | google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 485 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 486 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 487 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 488 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 489 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= 490 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 491 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 492 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= 493 | gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 494 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 495 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 496 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 497 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 498 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 499 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 500 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 501 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 502 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 503 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 504 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 505 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 506 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 507 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 508 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 509 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 510 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 511 | --------------------------------------------------------------------------------