diff --git a/battle_srv/common/conf.go b/battle_srv/common/conf.go index 41b06a2..da0589c 100644 --- a/battle_srv/common/conf.go +++ b/battle_srv/common/conf.go @@ -37,6 +37,8 @@ type mysqlConf struct { type sioConf struct { HostAndPort string `json:"hostAndPort"` + UdpHost string `json:"udpHost"` + UdpPort int `json:"udpPort"` } type botServerConf struct { diff --git a/battle_srv/configs.template/sio.json b/battle_srv/configs.template/sio.json index 68118bf..6b7dc47 100644 --- a/battle_srv/configs.template/sio.json +++ b/battle_srv/configs.template/sio.json @@ -1,3 +1,5 @@ { - "hostAndPort": "0.0.0.0:9992" + "hostAndPort": "0.0.0.0:9992", + "udpHost": "0.0.0.0", + "udpPort": 3000 } diff --git a/battle_srv/main.go b/battle_srv/main.go index 739835b..b6b54d6 100644 --- a/battle_srv/main.go +++ b/battle_srv/main.go @@ -23,6 +23,8 @@ import ( "github.com/gin-gonic/gin" "github.com/robfig/cron" "go.uber.org/zap" + + "net" ) func main() { @@ -34,7 +36,7 @@ func main() { env_tools.MergeTestPlayerAccounts() } models.InitRoomHeapManager() - startScheduler() + // startScheduler() router := gin.Default() setRouter(router) @@ -54,6 +56,7 @@ func main() { } Logger.Info("Listening and serving HTTP on", zap.Any("Conf.Sio.HostAndPort", Conf.Sio.HostAndPort)) }() + go startUdpServer() var gracefulStop = make(chan os.Signal) signal.Notify(gracefulStop, syscall.SIGTERM) signal.Notify(gracefulStop, syscall.SIGINT) @@ -114,3 +117,26 @@ func startScheduler() { //c.AddFunc("*/1 * * * * *", FuncName) c.Start() } + +func startUdpServer() { + conn, err := net.ListenUDP("udp", &net.UDPAddr{ + Port: Conf.Sio.UdpPort, + IP: net.ParseIP(Conf.Sio.UdpHost), + }) + if err != nil { + panic(err) + } + + defer conn.Close() + Logger.Info(fmt.Sprintf("Udp server started at %s", conn.LocalAddr().String())) + + for { + message := make([]byte, 2046) + rlen, remote, err := conn.ReadFromUDP(message[:]) + if err != nil { + panic(err) + } + Logger.Info(fmt.Sprintf("received: %d bytes from %s\n", rlen, remote)) + ws.HandleUdpHolePunchingForPlayer(message[0:rlen], remote) + } +} diff --git a/battle_srv/models/player.go b/battle_srv/models/player.go index 6ec281b..4769c78 100644 --- a/battle_srv/models/player.go +++ b/battle_srv/models/player.go @@ -50,6 +50,8 @@ type Player struct { LastSentInputFrameId int32 AckingFrameId int32 AckingInputFrameId int32 + + UdpAddr *PeerUdpAddr } func ExistPlayerByName(name string) (bool, error) { diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index bedde4f..18e2788 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -13,6 +13,7 @@ import ( "io/ioutil" "jsexport/battle" "math/rand" + "net" "os" "path/filepath" "resolv" @@ -32,6 +33,7 @@ const ( DOWNSYNC_MSG_ACT_BATTLE_STOPPED = int32(3) DOWNSYNC_MSG_ACT_FORCED_RESYNC = int32(4) DOWNSYNC_MSG_ACT_PEER_INPUT_BATCH = int32(5) + DOWNSYNC_MSG_ACT_PEER_UDP_ADDR = int32(6) DOWNSYNC_MSG_ACT_BATTLE_READY_TO_START = int32(-1) DOWNSYNC_MSG_ACT_BATTLE_START = int32(0) @@ -176,6 +178,7 @@ func (pR *Room) AddPlayerIfPossible(pPlayerFromDbInit *Player, session *websocke defer pR.onPlayerAdded(playerId) + pPlayerFromDbInit.UdpAddr = nil pPlayerFromDbInit.AckingFrameId = -1 pPlayerFromDbInit.AckingInputFrameId = -1 pPlayerFromDbInit.LastSentInputFrameId = MAGIC_LAST_SENT_INPUT_FRAME_ID_NORMAL_ADDED @@ -215,6 +218,7 @@ func (pR *Room) ReAddPlayerIfPossible(pTmpPlayerInstance *Player, session *webso */ defer pR.onPlayerReAdded(playerId) pEffectiveInRoomPlayerInstance := pR.Players[playerId] + pEffectiveInRoomPlayerInstance.UdpAddr = nil pEffectiveInRoomPlayerInstance.AckingFrameId = -1 pEffectiveInRoomPlayerInstance.AckingInputFrameId = -1 pEffectiveInRoomPlayerInstance.LastSentInputFrameId = MAGIC_LAST_SENT_INPUT_FRAME_ID_READDED @@ -1068,7 +1072,9 @@ func (pR *Room) sendSafely(roomDownsyncFrame *pb.RoomDownsyncFrame, toSendInputF panic(fmt.Sprintf("Error marshaling downsync message: roomId=%v, playerId=%v, roomState=%v, roomEffectivePlayerCount=%v", pR.Id, playerId, pR.State, pR.EffectivePlayerCount)) } - if MAGIC_JOIN_INDEX_DEFAULT == peerJoinIndex { + shouldUseSecondaryWsSession := (MAGIC_JOIN_INDEX_DEFAULT != peerJoinIndex && DOWNSYNC_MSG_ACT_INPUT_BATCH == act) // FIXME: Simplify the condition + //Logger.Info(fmt.Sprintf("shouldUseSecondaryWsSession=%v: roomId=%v, playerId=%v, roomState=%v, roomEffectivePlayerCount=%v", shouldUseSecondaryWsSession, pR.Id, playerId, pR.State, pR.EffectivePlayerCount)) + if !shouldUseSecondaryWsSession { if playerDownsyncSession, existent := pR.PlayerDownsyncSessionDict[playerId]; existent { if err := playerDownsyncSession.WriteMessage(websocket.BinaryMessage, theBytes); nil != err { panic(fmt.Sprintf("Error sending primary downsync message: roomId=%v, playerId=%v, roomState=%v, roomEffectivePlayerCount=%v, err=%v", pR.Id, playerId, pR.State, pR.EffectivePlayerCount, err)) @@ -1607,3 +1613,53 @@ func (pR *Room) SetSecondarySession(playerId int32, session *websocket.Conn, sig } } } + +func (pR *Room) UpdatePeerUdpAddrList(playerId int32, peerAddr *net.UDPAddr, pReq *pb.HolePunchUpsync) { + // TODO: There's a chance that by now "player.JoinIndex" is not yet determined, use a lock to sync + if player, ok := pR.Players[playerId]; ok && MAGIC_JOIN_INDEX_DEFAULT != player.JoinIndex { + playerBattleState := atomic.LoadInt32(&(player.BattleState)) + switch playerBattleState { + case PlayerBattleStateIns.DISCONNECTED, PlayerBattleStateIns.LOST, PlayerBattleStateIns.EXPELLED_DURING_GAME, PlayerBattleStateIns.EXPELLED_IN_DISMISSAL: + // Kindly note that "PlayerBattleStateIns.ADDED_PENDING_BATTLE_COLLIDER_ACK, PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK" are allowed + return + } + if _, existent := pR.PlayerDownsyncSessionDict[playerId]; existent { + player.UdpAddr = &pb.PeerUdpAddr{ + Ip: peerAddr.IP.String(), + Port: int32(peerAddr.Port), + AuthKey: pReq.AuthKey, + } + Logger.Info(fmt.Sprintf("UpdatePeerUdpAddrList done for roomId=%v, playerId=%d, peerAddr=%s", pR.Id, playerId, peerAddr)) + + peerJoinIndex := player.JoinIndex + peerUdpAddrList := make([]*pb.PeerUdpAddr, pR.Capacity, pR.Capacity) + + for _, otherPlayer := range pR.Players { + if MAGIC_JOIN_INDEX_DEFAULT == otherPlayer.JoinIndex { + // TODO: Again this shouldn't happen, apply proper locking + continue + } + // In case of highly concurrent update that might occur while later marshalling, use the ptr of a copy + peerUdpAddrList[otherPlayer.JoinIndex-1] = &pb.PeerUdpAddr{ + Ip: otherPlayer.UdpAddr.Ip, + Port: otherPlayer.UdpAddr.Port, + AuthKey: otherPlayer.UdpAddr.AuthKey, + } + } + + // Broadcast this new UDP addr to all the existing players + for otherPlayerId, otherPlayer := range pR.Players { + otherPlayerBattleState := atomic.LoadInt32(&(otherPlayer.BattleState)) + switch otherPlayerBattleState { + case PlayerBattleStateIns.DISCONNECTED, PlayerBattleStateIns.LOST, PlayerBattleStateIns.EXPELLED_DURING_GAME, PlayerBattleStateIns.EXPELLED_IN_DISMISSAL: + continue + } + + Logger.Info(fmt.Sprintf("Downsyncing peerUdpAddrList for roomId=%v, playerId=%d", pR.Id, otherPlayerId)) + pR.sendSafely(&pb.RoomDownsyncFrame{ + PeerUdpAddrList: peerUdpAddrList, + }, nil, DOWNSYNC_MSG_ACT_PEER_UDP_ADDR, otherPlayerId, false, peerJoinIndex) + } + } + } +} diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index ab8c56b..afb1cce 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -663,101 +663,6 @@ func (x *WsReq) GetHb() *HeartbeatUpsync { return nil } -type WsResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ret int32 `protobuf:"varint,1,opt,name=ret,proto3" json:"ret,omitempty"` - EchoedMsgId int32 `protobuf:"varint,2,opt,name=echoedMsgId,proto3" json:"echoedMsgId,omitempty"` - Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` - Rdf *RoomDownsyncFrame `protobuf:"bytes,4,opt,name=rdf,proto3" json:"rdf,omitempty"` - InputFrameDownsyncBatch []*InputFrameDownsync `protobuf:"bytes,5,rep,name=inputFrameDownsyncBatch,proto3" json:"inputFrameDownsyncBatch,omitempty"` - BciFrame *BattleColliderInfo `protobuf:"bytes,6,opt,name=bciFrame,proto3" json:"bciFrame,omitempty"` - PeerJoinIndex int32 `protobuf:"varint,7,opt,name=peerJoinIndex,proto3" json:"peerJoinIndex,omitempty"` // Only used when "InputsBufferSnapshot.peerJoinIndex" is used. -} - -func (x *WsResp) Reset() { - *x = WsResp{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WsResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WsResp) ProtoMessage() {} - -func (x *WsResp) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WsResp.ProtoReflect.Descriptor instead. -func (*WsResp) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} -} - -func (x *WsResp) GetRet() int32 { - if x != nil { - return x.Ret - } - return 0 -} - -func (x *WsResp) GetEchoedMsgId() int32 { - if x != nil { - return x.EchoedMsgId - } - return 0 -} - -func (x *WsResp) GetAct() int32 { - if x != nil { - return x.Act - } - return 0 -} - -func (x *WsResp) GetRdf() *RoomDownsyncFrame { - if x != nil { - return x.Rdf - } - return nil -} - -func (x *WsResp) GetInputFrameDownsyncBatch() []*InputFrameDownsync { - if x != nil { - return x.InputFrameDownsyncBatch - } - return nil -} - -func (x *WsResp) GetBciFrame() *BattleColliderInfo { - if x != nil { - return x.BciFrame - } - return nil -} - -func (x *WsResp) GetPeerJoinIndex() int32 { - if x != nil { - return x.PeerJoinIndex - } - return 0 -} - type InputsBufferSnapshot struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -767,13 +672,13 @@ type InputsBufferSnapshot struct { UnconfirmedMask uint64 `protobuf:"varint,2,opt,name=unconfirmedMask,proto3" json:"unconfirmedMask,omitempty"` ToSendInputFrameDownsyncs []*InputFrameDownsync `protobuf:"bytes,3,rep,name=toSendInputFrameDownsyncs,proto3" json:"toSendInputFrameDownsyncs,omitempty"` ShouldForceResync bool `protobuf:"varint,4,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"` - PeerJoinIndex int32 `protobuf:"varint,5,opt,name=peerJoinIndex,proto3" json:"peerJoinIndex,omitempty"` // Only used when "WsResp.peerJoinIndex" is used. + PeerJoinIndex int32 `protobuf:"varint,5,opt,name=peerJoinIndex,proto3" json:"peerJoinIndex,omitempty"` } func (x *InputsBufferSnapshot) Reset() { *x = InputsBufferSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[7] + mi := &file_room_downsync_frame_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -786,7 +691,7 @@ func (x *InputsBufferSnapshot) String() string { func (*InputsBufferSnapshot) ProtoMessage() {} func (x *InputsBufferSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[7] + mi := &file_room_downsync_frame_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -799,7 +704,7 @@ func (x *InputsBufferSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use InputsBufferSnapshot.ProtoReflect.Descriptor instead. func (*InputsBufferSnapshot) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} } func (x *InputsBufferSnapshot) GetRefRenderFrameId() int32 { @@ -872,7 +777,7 @@ type MeleeBullet struct { func (x *MeleeBullet) Reset() { *x = MeleeBullet{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[8] + mi := &file_room_downsync_frame_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -885,7 +790,7 @@ func (x *MeleeBullet) String() string { func (*MeleeBullet) ProtoMessage() {} func (x *MeleeBullet) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[8] + mi := &file_room_downsync_frame_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -898,7 +803,7 @@ func (x *MeleeBullet) ProtoReflect() protoreflect.Message { // Deprecated: Use MeleeBullet.ProtoReflect.Descriptor instead. func (*MeleeBullet) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} } func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { @@ -1110,7 +1015,7 @@ type FireballBullet struct { func (x *FireballBullet) Reset() { *x = FireballBullet{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[9] + mi := &file_room_downsync_frame_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1123,7 +1028,7 @@ func (x *FireballBullet) String() string { func (*FireballBullet) ProtoMessage() {} func (x *FireballBullet) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[9] + mi := &file_room_downsync_frame_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1136,7 +1041,7 @@ func (x *FireballBullet) ProtoReflect() protoreflect.Message { // Deprecated: Use FireballBullet.ProtoReflect.Descriptor instead. func (*FireballBullet) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{9} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} } func (x *FireballBullet) GetOriginatedRenderFrameId() int32 { @@ -1374,13 +1279,14 @@ type BattleColliderInfo struct { SpaceOffsetX float64 `protobuf:"fixed64,11,opt,name=spaceOffsetX,proto3" json:"spaceOffsetX,omitempty"` SpaceOffsetY float64 `protobuf:"fixed64,12,opt,name=spaceOffsetY,proto3" json:"spaceOffsetY,omitempty"` CollisionMinStep int32 `protobuf:"varint,13,opt,name=collisionMinStep,proto3" json:"collisionMinStep,omitempty"` + BoundRoomCapacity int32 `protobuf:"varint,14,opt,name=boundRoomCapacity,proto3" json:"boundRoomCapacity,omitempty"` FrameDataLoggingEnabled bool `protobuf:"varint,1024,opt,name=frameDataLoggingEnabled,proto3" json:"frameDataLoggingEnabled,omitempty"` } func (x *BattleColliderInfo) Reset() { *x = BattleColliderInfo{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[10] + mi := &file_room_downsync_frame_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1393,7 +1299,7 @@ func (x *BattleColliderInfo) String() string { func (*BattleColliderInfo) ProtoMessage() {} func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[10] + mi := &file_room_downsync_frame_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1406,7 +1312,7 @@ func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BattleColliderInfo.ProtoReflect.Descriptor instead. func (*BattleColliderInfo) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{10} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{9} } func (x *BattleColliderInfo) GetStageName() string { @@ -1500,6 +1406,13 @@ func (x *BattleColliderInfo) GetCollisionMinStep() int32 { return 0 } +func (x *BattleColliderInfo) GetBoundRoomCapacity() int32 { + if x != nil { + return x.BoundRoomCapacity + } + return 0 +} + func (x *BattleColliderInfo) GetFrameDataLoggingEnabled() bool { if x != nil { return x.FrameDataLoggingEnabled @@ -1507,6 +1420,132 @@ func (x *BattleColliderInfo) GetFrameDataLoggingEnabled() bool { return false } +type HolePunchUpsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IntAuthToken string `protobuf:"bytes,1,opt,name=intAuthToken,proto3" json:"intAuthToken,omitempty"` + BoundRoomId int32 `protobuf:"varint,2,opt,name=boundRoomId,proto3" json:"boundRoomId,omitempty"` + AuthKey int32 `protobuf:"varint,3,opt,name=authKey,proto3" json:"authKey,omitempty"` +} + +func (x *HolePunchUpsync) Reset() { + *x = HolePunchUpsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HolePunchUpsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HolePunchUpsync) ProtoMessage() {} + +func (x *HolePunchUpsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HolePunchUpsync.ProtoReflect.Descriptor instead. +func (*HolePunchUpsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{10} +} + +func (x *HolePunchUpsync) GetIntAuthToken() string { + if x != nil { + return x.IntAuthToken + } + return "" +} + +func (x *HolePunchUpsync) GetBoundRoomId() int32 { + if x != nil { + return x.BoundRoomId + } + return 0 +} + +func (x *HolePunchUpsync) GetAuthKey() int32 { + if x != nil { + return x.AuthKey + } + return 0 +} + +type PeerUdpAddr struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` + Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + AuthKey int32 `protobuf:"varint,3,opt,name=authKey,proto3" json:"authKey,omitempty"` +} + +func (x *PeerUdpAddr) Reset() { + *x = PeerUdpAddr{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PeerUdpAddr) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PeerUdpAddr) ProtoMessage() {} + +func (x *PeerUdpAddr) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PeerUdpAddr.ProtoReflect.Descriptor instead. +func (*PeerUdpAddr) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{11} +} + +func (x *PeerUdpAddr) GetIp() string { + if x != nil { + return x.Ip + } + return "" +} + +func (x *PeerUdpAddr) GetPort() int32 { + if x != nil { + return x.Port + } + return 0 +} + +func (x *PeerUdpAddr) GetAuthKey() int32 { + if x != nil { + return x.AuthKey + } + return 0 +} + type RoomDownsyncFrame struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1521,12 +1560,13 @@ type RoomDownsyncFrame struct { ShouldForceResync bool `protobuf:"varint,1025,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"` SpeciesIdList []int32 `protobuf:"varint,1026,rep,packed,name=speciesIdList,proto3" json:"speciesIdList,omitempty"` BulletLocalIdCounter int32 `protobuf:"varint,1027,opt,name=bulletLocalIdCounter,proto3" json:"bulletLocalIdCounter,omitempty"` + PeerUdpAddrList []*PeerUdpAddr `protobuf:"bytes,1028,rep,name=peerUdpAddrList,proto3" json:"peerUdpAddrList,omitempty"` } func (x *RoomDownsyncFrame) Reset() { *x = RoomDownsyncFrame{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[11] + mi := &file_room_downsync_frame_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1539,7 +1579,7 @@ func (x *RoomDownsyncFrame) String() string { func (*RoomDownsyncFrame) ProtoMessage() {} func (x *RoomDownsyncFrame) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[11] + mi := &file_room_downsync_frame_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1552,7 +1592,7 @@ func (x *RoomDownsyncFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomDownsyncFrame.ProtoReflect.Descriptor instead. func (*RoomDownsyncFrame) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{11} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{12} } func (x *RoomDownsyncFrame) GetId() int32 { @@ -1618,34 +1658,44 @@ func (x *RoomDownsyncFrame) GetBulletLocalIdCounter() int32 { return 0 } -type HolePunchUpsync struct { +func (x *RoomDownsyncFrame) GetPeerUdpAddrList() []*PeerUdpAddr { + if x != nil { + return x.PeerUdpAddrList + } + return nil +} + +type WsResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - JoinIndex int32 `protobuf:"varint,1,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - IntAuthToken string `protobuf:"bytes,2,opt,name=intAuthToken,proto3" json:"intAuthToken,omitempty"` - BoundRoomId int32 `protobuf:"varint,3,opt,name=boundRoomId,proto3" json:"boundRoomId,omitempty"` - AuthKey int32 `protobuf:"varint,4,opt,name=authKey,proto3" json:"authKey,omitempty"` + Ret int32 `protobuf:"varint,1,opt,name=ret,proto3" json:"ret,omitempty"` + EchoedMsgId int32 `protobuf:"varint,2,opt,name=echoedMsgId,proto3" json:"echoedMsgId,omitempty"` + Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` + Rdf *RoomDownsyncFrame `protobuf:"bytes,4,opt,name=rdf,proto3" json:"rdf,omitempty"` + InputFrameDownsyncBatch []*InputFrameDownsync `protobuf:"bytes,5,rep,name=inputFrameDownsyncBatch,proto3" json:"inputFrameDownsyncBatch,omitempty"` + BciFrame *BattleColliderInfo `protobuf:"bytes,6,opt,name=bciFrame,proto3" json:"bciFrame,omitempty"` + PeerJoinIndex int32 `protobuf:"varint,7,opt,name=peerJoinIndex,proto3" json:"peerJoinIndex,omitempty"` } -func (x *HolePunchUpsync) Reset() { - *x = HolePunchUpsync{} +func (x *WsResp) Reset() { + *x = WsResp{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[12] + mi := &file_room_downsync_frame_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HolePunchUpsync) String() string { +func (x *WsResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HolePunchUpsync) ProtoMessage() {} +func (*WsResp) ProtoMessage() {} -func (x *HolePunchUpsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[12] +func (x *WsResp) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1656,35 +1706,56 @@ func (x *HolePunchUpsync) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HolePunchUpsync.ProtoReflect.Descriptor instead. -func (*HolePunchUpsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{12} +// Deprecated: Use WsResp.ProtoReflect.Descriptor instead. +func (*WsResp) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{13} } -func (x *HolePunchUpsync) GetJoinIndex() int32 { +func (x *WsResp) GetRet() int32 { if x != nil { - return x.JoinIndex + return x.Ret } return 0 } -func (x *HolePunchUpsync) GetIntAuthToken() string { +func (x *WsResp) GetEchoedMsgId() int32 { if x != nil { - return x.IntAuthToken - } - return "" -} - -func (x *HolePunchUpsync) GetBoundRoomId() int32 { - if x != nil { - return x.BoundRoomId + return x.EchoedMsgId } return 0 } -func (x *HolePunchUpsync) GetAuthKey() int32 { +func (x *WsResp) GetAct() int32 { if x != nil { - return x.AuthKey + return x.Act + } + return 0 +} + +func (x *WsResp) GetRdf() *RoomDownsyncFrame { + if x != nil { + return x.Rdf + } + return nil +} + +func (x *WsResp) GetInputFrameDownsyncBatch() []*InputFrameDownsync { + if x != nil { + return x.InputFrameDownsyncBatch + } + return nil +} + +func (x *WsResp) GetBciFrame() *BattleColliderInfo { + if x != nil { + return x.BciFrame + } + return nil +} + +func (x *WsResp) GetPeerJoinIndex() int32 { + if x != nil { + return x.PeerJoinIndex } return 0 } @@ -1804,252 +1875,262 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, 0x68, 0x62, - 0x22, 0xaf, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, - 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, - 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, - 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, - 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, - 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x70, 0x65, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x9a, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x42, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x72, - 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, - 0x6b, 0x12, 0x58, 0x0a, 0x19, 0x74, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, - 0x52, 0x19, 0x74, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x73, - 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x65, 0x65, - 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x89, 0x07, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, - 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, - 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, - 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, - 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, - 0x58, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, - 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, - 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, - 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, - 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, - 0x58, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, - 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, - 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, - 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, - 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x59, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, - 0x69, 0x7a, 0x65, 0x58, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, - 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x58, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, - 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x6f, - 0x77, 0x55, 0x70, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, - 0x70, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x75, 0x6c, - 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x12, 0x28, 0x0a, - 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, - 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x42, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x49, 0x6e, 0x42, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x08, 0x0a, 0x0e, - 0x46, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x38, - 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x22, 0x9a, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x66, + 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, + 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, + 0x58, 0x0a, 0x19, 0x74, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x19, + 0x74, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x4a, + 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x70, 0x65, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x89, 0x07, + 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, - 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, - 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, - 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, - 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, - 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, - 0x56, 0x65, 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, - 0x56, 0x65, 0x6c, 0x59, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, - 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, - 0x56, 0x65, 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, - 0x56, 0x65, 0x6c, 0x59, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, - 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, - 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, 0x24, - 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x59, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, - 0x7a, 0x65, 0x58, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, - 0x78, 0x53, 0x69, 0x7a, 0x65, 0x58, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, - 0x53, 0x69, 0x7a, 0x65, 0x59, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x77, - 0x55, 0x70, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x75, 0x6c, 0x6c, - 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x42, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x49, 0x6e, 0x42, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0xe7, 0x07, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, - 0x23, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, - 0xe8, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, - 0x72, 0x69, 0x64, 0x59, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0xe9, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, 0x58, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x69, 0x72, - 0x59, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x13, - 0x0a, 0x04, 0x76, 0x65, 0x6c, 0x58, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, - 0x65, 0x6c, 0x58, 0x12, 0x13, 0x0a, 0x04, 0x76, 0x65, 0x6c, 0x59, 0x18, 0xec, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x76, 0x65, 0x6c, 0x59, 0x12, 0x15, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, - 0x64, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x22, - 0xc9, 0x05, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, - 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, - 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, - 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, - 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, - 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, - 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, - 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, - 0x6f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, - 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, - 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x59, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x4d, 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, - 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, - 0x12, 0x39, 0x0a, 0x17, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x80, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x17, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xc2, 0x03, 0x0a, 0x11, - 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x41, 0x72, 0x72, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, - 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x0a, 0x70, - 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x41, 0x72, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, - 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, - 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0f, 0x66, 0x69, - 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x46, 0x69, 0x72, - 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0f, 0x66, 0x69, 0x72, - 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x16, - 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x18, 0x80, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, - 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x2d, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, - 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x81, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x79, 0x6e, 0x63, 0x12, 0x25, 0x0a, 0x0d, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x82, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x14, 0x62, - 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x65, 0x72, 0x18, 0x83, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x62, 0x75, 0x6c, 0x6c, - 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, - 0x22, 0x8f, 0x01, 0x0a, 0x0f, 0x48, 0x6f, 0x6c, 0x65, 0x50, 0x75, 0x6e, 0x63, 0x68, 0x55, 0x70, - 0x73, 0x79, 0x6e, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x41, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, - 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x68, - 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, - 0x65, 0x79, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, + 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, + 0x65, 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, + 0x65, 0x6c, 0x59, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, + 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, + 0x65, 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, + 0x65, 0x6c, 0x59, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, + 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, + 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, 0x24, 0x0a, + 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x59, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, + 0x65, 0x58, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, + 0x53, 0x69, 0x7a, 0x65, 0x58, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, + 0x69, 0x7a, 0x65, 0x59, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, + 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, + 0x70, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x75, 0x6c, 0x6c, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x42, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, + 0x49, 0x6e, 0x42, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x08, 0x0a, 0x0e, 0x46, 0x69, + 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x17, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, + 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, + 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, + 0x6c, 0x59, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, + 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, + 0x6c, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, + 0x6c, 0x59, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, + 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, + 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, 0x24, 0x0a, 0x0d, + 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x59, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, + 0x58, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, + 0x69, 0x7a, 0x65, 0x58, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, + 0x7a, 0x65, 0x59, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, + 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, + 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x78, + 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x42, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, + 0x6e, 0x42, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0xe7, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x23, 0x0a, + 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0xe8, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, + 0x64, 0x59, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, 0x58, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, + 0xea, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x13, 0x0a, 0x04, + 0x76, 0x65, 0x6c, 0x58, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x65, 0x6c, + 0x58, 0x12, 0x13, 0x0a, 0x04, 0x76, 0x65, 0x6c, 0x59, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x76, 0x65, 0x6c, 0x59, 0x12, 0x15, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, + 0xed, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x22, 0xf7, 0x05, + 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, + 0x50, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, + 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x46, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, + 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, + 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, + 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, + 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, + 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, 0x22, + 0x0a, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x59, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4d, + 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, + 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x2c, + 0x0a, 0x11, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x17, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x80, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x71, 0x0a, 0x0f, 0x48, 0x6f, 0x6c, 0x65, 0x50, + 0x75, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, + 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, + 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x4b, 0x0a, 0x0b, 0x50, 0x65, + 0x65, 0x72, 0x55, 0x64, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x61, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x82, 0x04, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, + 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, + 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x41, 0x72, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x73, 0x41, 0x72, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, + 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, + 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, + 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x65, 0x62, 0x61, + 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x46, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, + 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0f, 0x66, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, + 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x16, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, + 0x73, 0x6b, 0x18, 0x80, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x12, 0x2d, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x81, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, + 0x12, 0x25, 0x0a, 0x0d, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x18, 0x82, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, + 0x73, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x14, 0x62, 0x75, 0x6c, 0x6c, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, + 0x83, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, + 0x70, 0x65, 0x65, 0x72, 0x55, 0x64, 0x70, 0x41, 0x64, 0x64, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x18, + 0x84, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x55, 0x64, 0x70, 0x41, 0x64, 0x64, 0x72, 0x52, 0x0f, 0x70, 0x65, 0x65, + 0x72, 0x55, 0x64, 0x70, 0x41, 0x64, 0x64, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xaf, 0x02, 0x0a, + 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, + 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, + 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, + 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, + 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x65, 0x65, 0x72, + 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x70, 0x65, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x13, + 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2064,7 +2145,7 @@ func file_room_downsync_frame_proto_rawDescGZIP() []byte { return file_room_downsync_frame_proto_rawDescData } -var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_room_downsync_frame_proto_goTypes = []interface{}{ (*PlayerDownsync)(nil), // 0: protos.PlayerDownsync (*InputFrameDecoded)(nil), // 1: protos.InputFrameDecoded @@ -2072,29 +2153,31 @@ var file_room_downsync_frame_proto_goTypes = []interface{}{ (*InputFrameDownsync)(nil), // 3: protos.InputFrameDownsync (*HeartbeatUpsync)(nil), // 4: protos.HeartbeatUpsync (*WsReq)(nil), // 5: protos.WsReq - (*WsResp)(nil), // 6: protos.WsResp - (*InputsBufferSnapshot)(nil), // 7: protos.InputsBufferSnapshot - (*MeleeBullet)(nil), // 8: protos.MeleeBullet - (*FireballBullet)(nil), // 9: protos.FireballBullet - (*BattleColliderInfo)(nil), // 10: protos.BattleColliderInfo - (*RoomDownsyncFrame)(nil), // 11: protos.RoomDownsyncFrame - (*HolePunchUpsync)(nil), // 12: protos.HolePunchUpsync + (*InputsBufferSnapshot)(nil), // 6: protos.InputsBufferSnapshot + (*MeleeBullet)(nil), // 7: protos.MeleeBullet + (*FireballBullet)(nil), // 8: protos.FireballBullet + (*BattleColliderInfo)(nil), // 9: protos.BattleColliderInfo + (*HolePunchUpsync)(nil), // 10: protos.HolePunchUpsync + (*PeerUdpAddr)(nil), // 11: protos.PeerUdpAddr + (*RoomDownsyncFrame)(nil), // 12: protos.RoomDownsyncFrame + (*WsResp)(nil), // 13: protos.WsResp } var file_room_downsync_frame_proto_depIdxs = []int32{ 2, // 0: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync 4, // 1: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync - 11, // 2: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame - 3, // 3: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync - 10, // 4: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo - 3, // 5: protos.InputsBufferSnapshot.toSendInputFrameDownsyncs:type_name -> protos.InputFrameDownsync - 0, // 6: protos.RoomDownsyncFrame.playersArr:type_name -> protos.PlayerDownsync - 8, // 7: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet - 9, // 8: protos.RoomDownsyncFrame.fireballBullets:type_name -> protos.FireballBullet - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 3, // 2: protos.InputsBufferSnapshot.toSendInputFrameDownsyncs:type_name -> protos.InputFrameDownsync + 0, // 3: protos.RoomDownsyncFrame.playersArr:type_name -> protos.PlayerDownsync + 7, // 4: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet + 8, // 5: protos.RoomDownsyncFrame.fireballBullets:type_name -> protos.FireballBullet + 11, // 6: protos.RoomDownsyncFrame.peerUdpAddrList:type_name -> protos.PeerUdpAddr + 12, // 7: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame + 3, // 8: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync + 9, // 9: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } @@ -2176,18 +2259,6 @@ func file_room_downsync_frame_proto_init() { } } file_room_downsync_frame_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WsResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputsBufferSnapshot); i { case 0: return &v.state @@ -2199,7 +2270,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeleeBullet); i { case 0: return &v.state @@ -2211,7 +2282,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FireballBullet); i { case 0: return &v.state @@ -2223,7 +2294,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BattleColliderInfo); i { case 0: return &v.state @@ -2235,8 +2306,20 @@ func file_room_downsync_frame_proto_init() { return nil } } + file_room_downsync_frame_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HolePunchUpsync); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } file_room_downsync_frame_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoomDownsyncFrame); i { + switch v := v.(*PeerUdpAddr); i { case 0: return &v.state case 1: @@ -2248,7 +2331,19 @@ func file_room_downsync_frame_proto_init() { } } file_room_downsync_frame_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HolePunchUpsync); i { + switch v := v.(*RoomDownsyncFrame); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_room_downsync_frame_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WsResp); i { case 0: return &v.state case 1: @@ -2266,7 +2361,7 @@ func file_room_downsync_frame_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_room_downsync_frame_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 14, NumExtensions: 0, NumServices: 0, }, diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index 782bcda..79c0c11 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -10,6 +10,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/gorilla/websocket" "go.uber.org/zap" + "net" "net/http" "strconv" "sync/atomic" @@ -256,17 +257,19 @@ func Serve(c *gin.Context) { SpaceOffsetX: pRoom.SpaceOffsetX, SpaceOffsetY: pRoom.SpaceOffsetY, - RenderCacheSize: pRoom.RenderCacheSize, - CollisionMinStep: pRoom.CollisionMinStep, + RenderCacheSize: pRoom.RenderCacheSize, + CollisionMinStep: pRoom.CollisionMinStep, + BoundRoomCapacity: int32(pRoom.Capacity), FrameDataLoggingEnabled: pRoom.FrameDataLoggingEnabled, } resp := &pb.WsResp{ - Ret: int32(Constants.RetCode.Ok), - EchoedMsgId: int32(0), - Act: models.DOWNSYNC_MSG_ACT_HB_REQ, - BciFrame: bciFrame, + Ret: int32(Constants.RetCode.Ok), + EchoedMsgId: int32(0), + Act: models.DOWNSYNC_MSG_ACT_HB_REQ, + BciFrame: bciFrame, + PeerJoinIndex: pThePlayer.JoinIndex, } Logger.Debug("Sending downsync HeartbeatRequirements:", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("resp", resp)) @@ -432,12 +435,12 @@ func HandleSecondaryWsSessionForPlayer(c *gin.Context) { playerId, err := models.GetPlayerIdByToken(token) if err != nil || playerId == 0 { // TODO: Abort with specific message. - Logger.Warn("Secondary ws session playerLogin record not found for ws authentication:", zap.Any("intAuthToken", token)) + Logger.Warn("Secondary ws session playerLogin record not found:", zap.Any("intAuthToken", token)) c.AbortWithStatus(http.StatusBadRequest) return } - Logger.Info("Secondary ws session playerLogin record has been found for ws authentication:", zap.Any("playerId", playerId), zap.Any("intAuthToken", token), zap.Any("boundRoomId", boundRoomId)) + Logger.Info("Secondary ws session playerLogin record has been found:", zap.Any("playerId", playerId), zap.Any("intAuthToken", token), zap.Any("boundRoomId", boundRoomId)) conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { @@ -482,3 +485,32 @@ func HandleSecondaryWsSessionForPlayer(c *gin.Context) { pRoom.SetSecondarySession(int32(playerId), conn, signalToCloseConnOfThisPlayer) } + +func HandleUdpHolePunchingForPlayer(message []byte, peerAddr *net.UDPAddr) { + pReq := new(pb.HolePunchUpsync) + if unmarshalErr := proto.Unmarshal(message, pReq); nil != unmarshalErr { + Logger.Error("Udp session failed to unmarshal", zap.Error(unmarshalErr)) + return + } + + token := pReq.IntAuthToken + boundRoomId := pReq.BoundRoomId + + pRoom, existent := (*models.RoomMapManagerIns)[int32(boundRoomId)] + // Deliberately querying playerId after querying room, because the former is against persistent storage and could be slow! + if !existent { + Logger.Warn("Udp session failed to get:\n", zap.Any("intAuthToken", token), zap.Any("forBoundRoomId", boundRoomId)) + return + } + + // TODO: Wrap the following 2 stmts by sql transaction! + playerId, err := models.GetPlayerIdByToken(token) + if err != nil || playerId == 0 { + // TODO: Abort with specific message. + Logger.Warn("Udp session playerLogin record not found for:", zap.Any("intAuthToken", token)) + return + } + + Logger.Info("Udp session playerLogin record has been found:", zap.Any("playerId", playerId), zap.Any("intAuthToken", token), zap.Any("boundRoomId", boundRoomId), zap.Any("peerAddr", peerAddr)) + pRoom.UpdatePeerUdpAddrList(int32(playerId), peerAddr, pReq) +} diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index be466ea..58a17cc 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -77,22 +77,12 @@ message WsReq { HeartbeatUpsync hb = 8; } -message WsResp { - int32 ret = 1; - int32 echoedMsgId = 2; - int32 act = 3; - RoomDownsyncFrame rdf = 4; - repeated InputFrameDownsync inputFrameDownsyncBatch = 5; - BattleColliderInfo bciFrame = 6; - int32 peerJoinIndex = 7; // Only used when "InputsBufferSnapshot.peerJoinIndex" is used. -} - message InputsBufferSnapshot { int32 refRenderFrameId = 1; uint64 unconfirmedMask = 2; repeated InputFrameDownsync toSendInputFrameDownsyncs = 3; bool shouldForceResync = 4; - int32 peerJoinIndex = 5; // Only used when "WsResp.peerJoinIndex" is used. + int32 peerJoinIndex = 5; } message MeleeBullet { @@ -191,10 +181,23 @@ message BattleColliderInfo { double spaceOffsetX = 11; double spaceOffsetY = 12; int32 collisionMinStep = 13; + int32 boundRoomCapacity = 14; bool frameDataLoggingEnabled = 1024; } +message HolePunchUpsync { + string intAuthToken = 1; + int32 boundRoomId = 2; + int32 authKey = 3; +} + +message PeerUdpAddr { + string ip = 1; + int32 port = 2; + int32 authKey = 3; +} + message RoomDownsyncFrame { int32 id = 1; repeated PlayerDownsync playersArr = 2; @@ -207,11 +210,15 @@ message RoomDownsyncFrame { repeated int32 speciesIdList = 1026; int32 bulletLocalIdCounter = 1027; + repeated PeerUdpAddr peerUdpAddrList = 1028; } -message HolePunchUpsync { - int32 joinIndex = 1; - string intAuthToken = 2; - int32 boundRoomId = 3; - int32 authKey = 4; +message WsResp { + int32 ret = 1; + int32 echoedMsgId = 2; + int32 act = 3; + RoomDownsyncFrame rdf = 4; + repeated InputFrameDownsync inputFrameDownsyncBatch = 5; + BattleColliderInfo bciFrame = 6; + int32 peerJoinIndex = 7; } diff --git a/frontend/assets/scripts/FindingPlayer.js b/frontend/assets/scripts/FindingPlayer.js index a5844a4..4418d4d 100644 --- a/frontend/assets/scripts/FindingPlayer.js +++ b/frontend/assets/scripts/FindingPlayer.js @@ -54,7 +54,7 @@ cc.Class({ exitBtnOnClick(evt) { window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); - window.closeWSConnection(); + window.closeWSConnection(constants.RET_CODE.UNKNOWN_ERROR, ""); cc.director.loadScene('login'); }, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index f2504cb..fa0b309 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -336,7 +336,6 @@ cc.Class({ self.recentRenderCache = new RingBuffer(self.renderCacheSize); - self.selfPlayerInfo = null; // This field is kept for distinguishing "self" and "others". self.recentInputCache = gopkgs.NewRingBufferJs((self.renderCacheSize >> 1) + 1); self.gopkgsCollisionSys = gopkgs.NewCollisionSpaceJs((self.spaceOffsetX << 1), (self.spaceOffsetY << 1), self.collisionMinStep, self.collisionMinStep); @@ -500,7 +499,7 @@ cc.Class({ const fullPathOfTmxFile = cc.js.formatStr("map/%s/map", parsedBattleColliderInfo.stageName); cc.loader.loadRes(fullPathOfTmxFile, cc.TiledMapAsset, (err, tmxAsset) => { if (null != err) { - console.error(err); + console.error(`Error occurred when loading tiled stage ${parsedBattleColliderInfo.stageName}`, err); return; } @@ -549,10 +548,6 @@ cc.Class({ const collisionBarrierIndex = (self.collisionBarrierIndexPrefix + barrierIdCounter); self.gopkgsCollisionSysMap[collisionBarrierIndex] = newBarrierCollider; } - self.selfPlayerInfo = JSON.parse(cc.sys.localStorage.getItem('selfPlayer')); - Object.assign(self.selfPlayerInfo, { - Id: self.selfPlayerInfo.playerId - }); self.initDebugDrawers(); const reqData = window.pb.protos.WsReq.encode({ msgId: Date.now(), @@ -920,7 +915,7 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu return; } self._stringifyRdfIdToActuallyUsedInput(); - window.closeWSConnection(constants.RET_CODE.BATTLE_STOPPED); + window.closeWSConnection(constants.RET_CODE.BATTLE_STOPPED, ""); self.battleState = ALL_BATTLE_STATES.IN_SETTLEMENT; self.countdownNanos = null; if (self.musicEffectManagerScriptIns) { @@ -1273,24 +1268,6 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame } const j = gopkgs.ConvertToDelayedInputFrameId(i); const delayedInputFrame = self.recentInputCache.GetByFrameId(j); - /* - const prevJ = gopkgs.ConvertToDelayedInputFrameId(i - 1); - const prevDelayedInputFrame = self.recentInputCache.GetByFrameId(prevJ); - const prevBtnALevel = (null == prevDelayedInputFrame ? 0 : ((prevDelayedInputFrame.InputList[self.selfPlayerInfo.JoinIndex - 1] >> 4) & 1)); - const btnALevel = ((delayedInputFrame.InputList[self.selfPlayerInfo.JoinIndex - 1] >> 4) & 1); - if ( - ATK_CHARACTER_STATE.Atk1[0] == currRdf.PlayersArr[self.selfPlayerInfo.JoinIndex - 1].CharacterState - || - ATK_CHARACTER_STATE.Atk2[0] == currRdf.PlayersArr[self.selfPlayerInfo.JoinIndex - 1].CharacterState - ) { - console.log(`rdf.Id=${i}, (btnALevel,j)=(${btnALevel},${j}), (prevBtnALevel,prevJ) is (${prevBtnALevel},${prevJ}), in cancellable atk!`); - } - if (btnALevel > 0) { - if (btnALevel > prevBtnALevel) { - console.log(`rdf.Id=${i}, rising edge of btnA triggered`); - } - } - */ if (self.frameDataLoggingEnabled) { const actuallyUsedInputClone = delayedInputFrame.InputList.slice(); @@ -1336,7 +1313,7 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame const selfPlayerId = self.selfPlayerInfo.Id; if (selfPlayerId == playerId) { - self.selfPlayerInfo.JoinIndex = immediatePlayerInfo.JoinIndex; + self.selfPlayerInfo.JoinIndex = immediatePlayerInfo.JoinIndex; // Update here in case of any change during WAITING phase nodeAndScriptIns[1].showArrowTipNode(); } } diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 8025577..75fb42b 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -156,13 +156,12 @@ cc.Class({ cc.log(`#2 Js called back by CPP: onUdpMessage: ${JSON.stringify(echoed)}`); }; const res1 = DelayNoMore.UdpSession.openUdpSession(8888 + self.selfPlayerInfo.JoinIndex); - const holePunchDate = window.pb.protos.HolePunchUpsync.encode({ - joinIndex: self.selfPlayerInfo.JoinIndex, + const holePunchData = window.pb.protos.HolePunchUpsync.encode({ boundRoomId: 22, intAuthToken: "foobar", authKey: Math.floor(Math.random() * 65535), }).finish() - const res2 = DelayNoMore.UdpSession.punchToServer("127.0.0.1", 3000, holePunchDate); + const res2 = DelayNoMore.UdpSession.punchToServer("127.0.0.1", 3000, holePunchData); const res3 = DelayNoMore.UdpSession.upsertPeerUdpAddr(self.selfPlayerInfo.JoinIndex, "192.168.31.194", 6789, 123456, 2, self.selfPlayerInfo.JoinIndex); //const res4 = DelayNoMore.UdpSession.closeUdpSession(); } diff --git a/frontend/assets/scripts/WsSessionMgr.js b/frontend/assets/scripts/WsSessionMgr.js index 20e9d24..0c4e38c 100644 --- a/frontend/assets/scripts/WsSessionMgr.js +++ b/frontend/assets/scripts/WsSessionMgr.js @@ -12,6 +12,7 @@ window.DOWNSYNC_MSG_ACT_INPUT_BATCH = 2; window.DOWNSYNC_MSG_ACT_BATTLE_STOPPED = 3; window.DOWNSYNC_MSG_ACT_FORCED_RESYNC = 4; window.DOWNSYNC_MSG_ACT_PEER_INPUT_BATCH = 5; +window.DOWNSYNC_MSG_ACT_PEER_UDP_ADDR = 6; window.sendSafely = function(msgStr) { /** @@ -46,9 +47,19 @@ window.getBoundRoomIdFromPersistentStorage = function() { return cc.sys.localStorage.getItem("boundRoomId"); }; +window.getBoundRoomCapacityFromPersistentStorage = function() { + const boundRoomIdExpiresAt = parseInt(cc.sys.localStorage.getItem("boundRoomIdExpiresAt")); + if (!boundRoomIdExpiresAt || Date.now() >= boundRoomIdExpiresAt) { + window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); + return null; + } + return cc.sys.localStorage.getItem("boundRoomCapacity"); +}; + window.clearBoundRoomIdInBothVolatileAndPersistentStorage = function() { window.boundRoomId = null; cc.sys.localStorage.removeItem("boundRoomId"); + cc.sys.localStorage.removeItem("boundRoomCapacity"); cc.sys.localStorage.removeItem("boundRoomIdExpiresAt"); }; @@ -57,20 +68,44 @@ window.clearSelfPlayer = function() { }; window.boundRoomId = getBoundRoomIdFromPersistentStorage(); +window.boundRoomCapacity = getBoundRoomCapacityFromPersistentStorage(); window.handleHbRequirements = function(resp) { + console.log(`Handle hb requirements #1`); if (constants.RET_CODE.OK != resp.ret) return; - if (null == window.boundRoomId) { + // The assignment of "window.mapIns" is inside "Map.onLoad", which precedes "initPersistentSessionClient". + window.mapIns.selfPlayerInfo = JSON.parse(cc.sys.localStorage.getItem('selfPlayer')); // This field is kept for distinguishing "self" and "others". + window.mapIns.selfPlayerInfo.Id = window.mapIns.selfPlayerInfo.playerId; + window.mapIns.selfPlayerInfo.JoinIndex = resp.peerJoinIndex; + console.log(`Handle hb requirements #2`); + if (null == window.boundRoomId || null == window.boundRoomCapacity) { window.boundRoomId = resp.bciFrame.boundRoomId; + window.boundRoomCapacity = resp.bciFrame.boundRoomCapacity; cc.sys.localStorage.setItem('boundRoomId', window.boundRoomId); + cc.sys.localStorage.setItem('boundRoomCapacity', window.boundRoomCapacity); cc.sys.localStorage.setItem('boundRoomIdExpiresAt', Date.now() + 10 * 60 * 1000); // Temporarily hardcoded, for `boundRoomId` only. } - + console.log(`Handle hb requirements #3`); if (window.handleBattleColliderInfo) { - if (!cc.sys.isNative) { - window.initSecondarySession(null, window.boundRoomId); - } window.handleBattleColliderInfo(resp.bciFrame); } + console.log(`Handle hb requirements #4`); + + if (!cc.sys.isNative) { + console.log(`Handle hb requirements #5, web`); + window.initSecondarySession(null, window.boundRoomId); + } else { + console.log(`Handle hb requirements #5, native`); + const res1 = DelayNoMore.UdpSession.openUdpSession(8888 + window.mapIns.selfPlayerInfo.JoinIndex); + const intAuthToken = window.mapIns.selfPlayerInfo.intAuthToken; + const authKey = Math.floor(Math.random() * 65535); + window.mapIns.selfPlayerInfo.authKey = authKey; + const holePunchData = window.pb.protos.HolePunchUpsync.encode({ + boundRoomId: window.boundRoomId, + intAuthToken: intAuthToken, + authKey: authKey, + }).finish(); + const res2 = DelayNoMore.UdpSession.punchToServer(backendAddress.HOST, 3000, holePunchData); + } }; function _uint8ToBase64(uint8Arr) { @@ -128,6 +163,7 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) { urlToConnect = urlToConnect + "&expectedRoomId=" + expectedRoomId; } else { window.boundRoomId = getBoundRoomIdFromPersistentStorage(); + window.boundRoomCapacity = getBoundRoomCapacityFromPersistentStorage(); if (null != window.boundRoomId) { console.log("initPersistentSessionClient with boundRoomId == " + boundRoomId); urlToConnect = urlToConnect + "&boundRoomId=" + window.boundRoomId; @@ -178,6 +214,16 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) { } mapIns.onRoomDownsyncFrame(resp.rdf, resp.inputFrameDownsyncBatch); break; + case window.DOWNSYNC_MSG_ACT_PEER_UDP_ADDR: + console.warn(`Got DOWNSYNC_MSG_ACT_PEER_UDP_ADDR resp=${JSON.stringify(resp, null, 2)}`); + if (cc.sys.isNative) { + const peerJoinIndex = resp.peerJoinIndex; + const peerAddrList = resp.rdf.peerUdpAddrList; + const peerAddr = peerAddrList[peerJoinIndex - 1]; + console.log(`Got DOWNSYNC_MSG_ACT_PEER_UDP_ADDR peerAddr=${peerAddr}; boundRoomCapacity=${window.boundRoomCapacity}, mapIns.selfPlayerInfo=${window.mapIns.selfPlayerInfo}`); + DelayNoMore.UdpSession.upsertPeerUdpAddr(peerJoinIndex, peerAddr.ip, peerAddr.port, peerAddr.authKey, window.boundRoomCapacity, window.mapIns.selfPlayerInfo.JoinIndex); + } + break; default: break; } @@ -224,6 +270,9 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) { default: break; } + if (cc.sys.isNative) { + DelayNoMore.UdpSession.closeUdpSession(); + } }; }; @@ -234,7 +283,7 @@ window.clearLocalStorageAndBackToLoginScene = function(shouldRetainBoundRoomIdIn window.mapIns.musicEffectManagerScriptIns.stopAllMusic(); } - window.closeWSConnection(); + window.closeWSConnection(constants.RET_CODE.UNKNOWN_ERROR, ""); window.clearSelfPlayer(); if (true != shouldRetainBoundRoomIdInBothVolatileAndPersistentStorage) { window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index 269e6e0..3cd7e59 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -3547,380 +3547,6 @@ $root.protos = (function() { return WsReq; })(); - protos.WsResp = (function() { - - /** - * Properties of a WsResp. - * @memberof protos - * @interface IWsResp - * @property {number|null} [ret] WsResp ret - * @property {number|null} [echoedMsgId] WsResp echoedMsgId - * @property {number|null} [act] WsResp act - * @property {protos.RoomDownsyncFrame|null} [rdf] WsResp rdf - * @property {Array.|null} [inputFrameDownsyncBatch] WsResp inputFrameDownsyncBatch - * @property {protos.BattleColliderInfo|null} [bciFrame] WsResp bciFrame - * @property {number|null} [peerJoinIndex] WsResp peerJoinIndex - */ - - /** - * Constructs a new WsResp. - * @memberof protos - * @classdesc Represents a WsResp. - * @implements IWsResp - * @constructor - * @param {protos.IWsResp=} [properties] Properties to set - */ - function WsResp(properties) { - this.inputFrameDownsyncBatch = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * WsResp ret. - * @member {number} ret - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.ret = 0; - - /** - * WsResp echoedMsgId. - * @member {number} echoedMsgId - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.echoedMsgId = 0; - - /** - * WsResp act. - * @member {number} act - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.act = 0; - - /** - * WsResp rdf. - * @member {protos.RoomDownsyncFrame|null|undefined} rdf - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.rdf = null; - - /** - * WsResp inputFrameDownsyncBatch. - * @member {Array.} inputFrameDownsyncBatch - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.inputFrameDownsyncBatch = $util.emptyArray; - - /** - * WsResp bciFrame. - * @member {protos.BattleColliderInfo|null|undefined} bciFrame - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.bciFrame = null; - - /** - * WsResp peerJoinIndex. - * @member {number} peerJoinIndex - * @memberof protos.WsResp - * @instance - */ - WsResp.prototype.peerJoinIndex = 0; - - /** - * Creates a new WsResp instance using the specified properties. - * @function create - * @memberof protos.WsResp - * @static - * @param {protos.IWsResp=} [properties] Properties to set - * @returns {protos.WsResp} WsResp instance - */ - WsResp.create = function create(properties) { - return new WsResp(properties); - }; - - /** - * Encodes the specified WsResp message. Does not implicitly {@link protos.WsResp.verify|verify} messages. - * @function encode - * @memberof protos.WsResp - * @static - * @param {protos.WsResp} message WsResp message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - WsResp.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.ret != null && Object.hasOwnProperty.call(message, "ret")) - writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ret); - if (message.echoedMsgId != null && Object.hasOwnProperty.call(message, "echoedMsgId")) - writer.uint32(/* id 2, wireType 0 =*/16).int32(message.echoedMsgId); - if (message.act != null && Object.hasOwnProperty.call(message, "act")) - writer.uint32(/* id 3, wireType 0 =*/24).int32(message.act); - if (message.rdf != null && Object.hasOwnProperty.call(message, "rdf")) - $root.protos.RoomDownsyncFrame.encode(message.rdf, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); - if (message.inputFrameDownsyncBatch != null && message.inputFrameDownsyncBatch.length) - for (var i = 0; i < message.inputFrameDownsyncBatch.length; ++i) - $root.protos.InputFrameDownsync.encode(message.inputFrameDownsyncBatch[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); - if (message.bciFrame != null && Object.hasOwnProperty.call(message, "bciFrame")) - $root.protos.BattleColliderInfo.encode(message.bciFrame, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); - if (message.peerJoinIndex != null && Object.hasOwnProperty.call(message, "peerJoinIndex")) - writer.uint32(/* id 7, wireType 0 =*/56).int32(message.peerJoinIndex); - return writer; - }; - - /** - * Encodes the specified WsResp message, length delimited. Does not implicitly {@link protos.WsResp.verify|verify} messages. - * @function encodeDelimited - * @memberof protos.WsResp - * @static - * @param {protos.WsResp} message WsResp message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - WsResp.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a WsResp message from the specified reader or buffer. - * @function decode - * @memberof protos.WsResp - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {protos.WsResp} WsResp - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - WsResp.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.WsResp(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - message.ret = reader.int32(); - break; - } - case 2: { - message.echoedMsgId = reader.int32(); - break; - } - case 3: { - message.act = reader.int32(); - break; - } - case 4: { - message.rdf = $root.protos.RoomDownsyncFrame.decode(reader, reader.uint32()); - break; - } - case 5: { - if (!(message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length)) - message.inputFrameDownsyncBatch = []; - message.inputFrameDownsyncBatch.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32())); - break; - } - case 6: { - message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32()); - break; - } - case 7: { - message.peerJoinIndex = reader.int32(); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a WsResp message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof protos.WsResp - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {protos.WsResp} WsResp - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - WsResp.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a WsResp message. - * @function verify - * @memberof protos.WsResp - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - WsResp.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.ret != null && message.hasOwnProperty("ret")) - if (!$util.isInteger(message.ret)) - return "ret: integer expected"; - if (message.echoedMsgId != null && message.hasOwnProperty("echoedMsgId")) - if (!$util.isInteger(message.echoedMsgId)) - return "echoedMsgId: integer expected"; - if (message.act != null && message.hasOwnProperty("act")) - if (!$util.isInteger(message.act)) - return "act: integer expected"; - if (message.rdf != null && message.hasOwnProperty("rdf")) { - var error = $root.protos.RoomDownsyncFrame.verify(message.rdf); - if (error) - return "rdf." + error; - } - if (message.inputFrameDownsyncBatch != null && message.hasOwnProperty("inputFrameDownsyncBatch")) { - if (!Array.isArray(message.inputFrameDownsyncBatch)) - return "inputFrameDownsyncBatch: array expected"; - for (var i = 0; i < message.inputFrameDownsyncBatch.length; ++i) { - var error = $root.protos.InputFrameDownsync.verify(message.inputFrameDownsyncBatch[i]); - if (error) - return "inputFrameDownsyncBatch." + error; - } - } - if (message.bciFrame != null && message.hasOwnProperty("bciFrame")) { - var error = $root.protos.BattleColliderInfo.verify(message.bciFrame); - if (error) - return "bciFrame." + error; - } - if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex")) - if (!$util.isInteger(message.peerJoinIndex)) - return "peerJoinIndex: integer expected"; - return null; - }; - - /** - * Creates a WsResp message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof protos.WsResp - * @static - * @param {Object.} object Plain object - * @returns {protos.WsResp} WsResp - */ - WsResp.fromObject = function fromObject(object) { - if (object instanceof $root.protos.WsResp) - return object; - var message = new $root.protos.WsResp(); - if (object.ret != null) - message.ret = object.ret | 0; - if (object.echoedMsgId != null) - message.echoedMsgId = object.echoedMsgId | 0; - if (object.act != null) - message.act = object.act | 0; - if (object.rdf != null) { - if (typeof object.rdf !== "object") - throw TypeError(".protos.WsResp.rdf: object expected"); - message.rdf = $root.protos.RoomDownsyncFrame.fromObject(object.rdf); - } - if (object.inputFrameDownsyncBatch) { - if (!Array.isArray(object.inputFrameDownsyncBatch)) - throw TypeError(".protos.WsResp.inputFrameDownsyncBatch: array expected"); - message.inputFrameDownsyncBatch = []; - for (var i = 0; i < object.inputFrameDownsyncBatch.length; ++i) { - if (typeof object.inputFrameDownsyncBatch[i] !== "object") - throw TypeError(".protos.WsResp.inputFrameDownsyncBatch: object expected"); - message.inputFrameDownsyncBatch[i] = $root.protos.InputFrameDownsync.fromObject(object.inputFrameDownsyncBatch[i]); - } - } - if (object.bciFrame != null) { - if (typeof object.bciFrame !== "object") - throw TypeError(".protos.WsResp.bciFrame: object expected"); - message.bciFrame = $root.protos.BattleColliderInfo.fromObject(object.bciFrame); - } - if (object.peerJoinIndex != null) - message.peerJoinIndex = object.peerJoinIndex | 0; - return message; - }; - - /** - * Creates a plain object from a WsResp message. Also converts values to other types if specified. - * @function toObject - * @memberof protos.WsResp - * @static - * @param {protos.WsResp} message WsResp - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - WsResp.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.inputFrameDownsyncBatch = []; - if (options.defaults) { - object.ret = 0; - object.echoedMsgId = 0; - object.act = 0; - object.rdf = null; - object.bciFrame = null; - object.peerJoinIndex = 0; - } - if (message.ret != null && message.hasOwnProperty("ret")) - object.ret = message.ret; - if (message.echoedMsgId != null && message.hasOwnProperty("echoedMsgId")) - object.echoedMsgId = message.echoedMsgId; - if (message.act != null && message.hasOwnProperty("act")) - object.act = message.act; - if (message.rdf != null && message.hasOwnProperty("rdf")) - object.rdf = $root.protos.RoomDownsyncFrame.toObject(message.rdf, options); - if (message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length) { - object.inputFrameDownsyncBatch = []; - for (var j = 0; j < message.inputFrameDownsyncBatch.length; ++j) - object.inputFrameDownsyncBatch[j] = $root.protos.InputFrameDownsync.toObject(message.inputFrameDownsyncBatch[j], options); - } - if (message.bciFrame != null && message.hasOwnProperty("bciFrame")) - object.bciFrame = $root.protos.BattleColliderInfo.toObject(message.bciFrame, options); - if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex")) - object.peerJoinIndex = message.peerJoinIndex; - return object; - }; - - /** - * Converts this WsResp to JSON. - * @function toJSON - * @memberof protos.WsResp - * @instance - * @returns {Object.} JSON object - */ - WsResp.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for WsResp - * @function getTypeUrl - * @memberof protos.WsResp - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - WsResp.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.WsResp"; - }; - - return WsResp; - })(); - protos.InputsBufferSnapshot = (function() { /** @@ -5899,6 +5525,7 @@ $root.protos = (function() { * @property {number|null} [spaceOffsetX] BattleColliderInfo spaceOffsetX * @property {number|null} [spaceOffsetY] BattleColliderInfo spaceOffsetY * @property {number|null} [collisionMinStep] BattleColliderInfo collisionMinStep + * @property {number|null} [boundRoomCapacity] BattleColliderInfo boundRoomCapacity * @property {boolean|null} [frameDataLoggingEnabled] BattleColliderInfo frameDataLoggingEnabled */ @@ -6021,6 +5648,14 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.collisionMinStep = 0; + /** + * BattleColliderInfo boundRoomCapacity. + * @member {number} boundRoomCapacity + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.boundRoomCapacity = 0; + /** * BattleColliderInfo frameDataLoggingEnabled. * @member {boolean} frameDataLoggingEnabled @@ -6079,6 +5714,8 @@ $root.protos = (function() { writer.uint32(/* id 12, wireType 1 =*/97).double(message.spaceOffsetY); if (message.collisionMinStep != null && Object.hasOwnProperty.call(message, "collisionMinStep")) writer.uint32(/* id 13, wireType 0 =*/104).int32(message.collisionMinStep); + if (message.boundRoomCapacity != null && Object.hasOwnProperty.call(message, "boundRoomCapacity")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.boundRoomCapacity); if (message.frameDataLoggingEnabled != null && Object.hasOwnProperty.call(message, "frameDataLoggingEnabled")) writer.uint32(/* id 1024, wireType 0 =*/8192).bool(message.frameDataLoggingEnabled); return writer; @@ -6167,6 +5804,10 @@ $root.protos = (function() { message.collisionMinStep = reader.int32(); break; } + case 14: { + message.boundRoomCapacity = reader.int32(); + break; + } case 1024: { message.frameDataLoggingEnabled = reader.bool(); break; @@ -6245,6 +5886,9 @@ $root.protos = (function() { if (message.collisionMinStep != null && message.hasOwnProperty("collisionMinStep")) if (!$util.isInteger(message.collisionMinStep)) return "collisionMinStep: integer expected"; + if (message.boundRoomCapacity != null && message.hasOwnProperty("boundRoomCapacity")) + if (!$util.isInteger(message.boundRoomCapacity)) + return "boundRoomCapacity: integer expected"; if (message.frameDataLoggingEnabled != null && message.hasOwnProperty("frameDataLoggingEnabled")) if (typeof message.frameDataLoggingEnabled !== "boolean") return "frameDataLoggingEnabled: boolean expected"; @@ -6303,6 +5947,8 @@ $root.protos = (function() { message.spaceOffsetY = Number(object.spaceOffsetY); if (object.collisionMinStep != null) message.collisionMinStep = object.collisionMinStep | 0; + if (object.boundRoomCapacity != null) + message.boundRoomCapacity = object.boundRoomCapacity | 0; if (object.frameDataLoggingEnabled != null) message.frameDataLoggingEnabled = Boolean(object.frameDataLoggingEnabled); return message; @@ -6343,6 +5989,7 @@ $root.protos = (function() { object.spaceOffsetX = 0; object.spaceOffsetY = 0; object.collisionMinStep = 0; + object.boundRoomCapacity = 0; object.frameDataLoggingEnabled = false; } if (message.stageName != null && message.hasOwnProperty("stageName")) @@ -6377,6 +6024,8 @@ $root.protos = (function() { object.spaceOffsetY = options.json && !isFinite(message.spaceOffsetY) ? String(message.spaceOffsetY) : message.spaceOffsetY; if (message.collisionMinStep != null && message.hasOwnProperty("collisionMinStep")) object.collisionMinStep = message.collisionMinStep; + if (message.boundRoomCapacity != null && message.hasOwnProperty("boundRoomCapacity")) + object.boundRoomCapacity = message.boundRoomCapacity; if (message.frameDataLoggingEnabled != null && message.hasOwnProperty("frameDataLoggingEnabled")) object.frameDataLoggingEnabled = message.frameDataLoggingEnabled; return object; @@ -6411,6 +6060,506 @@ $root.protos = (function() { return BattleColliderInfo; })(); + protos.HolePunchUpsync = (function() { + + /** + * Properties of a HolePunchUpsync. + * @memberof protos + * @interface IHolePunchUpsync + * @property {string|null} [intAuthToken] HolePunchUpsync intAuthToken + * @property {number|null} [boundRoomId] HolePunchUpsync boundRoomId + * @property {number|null} [authKey] HolePunchUpsync authKey + */ + + /** + * Constructs a new HolePunchUpsync. + * @memberof protos + * @classdesc Represents a HolePunchUpsync. + * @implements IHolePunchUpsync + * @constructor + * @param {protos.IHolePunchUpsync=} [properties] Properties to set + */ + function HolePunchUpsync(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HolePunchUpsync intAuthToken. + * @member {string} intAuthToken + * @memberof protos.HolePunchUpsync + * @instance + */ + HolePunchUpsync.prototype.intAuthToken = ""; + + /** + * HolePunchUpsync boundRoomId. + * @member {number} boundRoomId + * @memberof protos.HolePunchUpsync + * @instance + */ + HolePunchUpsync.prototype.boundRoomId = 0; + + /** + * HolePunchUpsync authKey. + * @member {number} authKey + * @memberof protos.HolePunchUpsync + * @instance + */ + HolePunchUpsync.prototype.authKey = 0; + + /** + * Creates a new HolePunchUpsync instance using the specified properties. + * @function create + * @memberof protos.HolePunchUpsync + * @static + * @param {protos.IHolePunchUpsync=} [properties] Properties to set + * @returns {protos.HolePunchUpsync} HolePunchUpsync instance + */ + HolePunchUpsync.create = function create(properties) { + return new HolePunchUpsync(properties); + }; + + /** + * Encodes the specified HolePunchUpsync message. Does not implicitly {@link protos.HolePunchUpsync.verify|verify} messages. + * @function encode + * @memberof protos.HolePunchUpsync + * @static + * @param {protos.HolePunchUpsync} message HolePunchUpsync message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HolePunchUpsync.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.intAuthToken != null && Object.hasOwnProperty.call(message, "intAuthToken")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.intAuthToken); + if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.boundRoomId); + if (message.authKey != null && Object.hasOwnProperty.call(message, "authKey")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.authKey); + return writer; + }; + + /** + * Encodes the specified HolePunchUpsync message, length delimited. Does not implicitly {@link protos.HolePunchUpsync.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.HolePunchUpsync + * @static + * @param {protos.HolePunchUpsync} message HolePunchUpsync message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HolePunchUpsync.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HolePunchUpsync message from the specified reader or buffer. + * @function decode + * @memberof protos.HolePunchUpsync + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.HolePunchUpsync} HolePunchUpsync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HolePunchUpsync.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.HolePunchUpsync(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.intAuthToken = reader.string(); + break; + } + case 2: { + message.boundRoomId = reader.int32(); + break; + } + case 3: { + message.authKey = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HolePunchUpsync message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.HolePunchUpsync + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.HolePunchUpsync} HolePunchUpsync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HolePunchUpsync.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HolePunchUpsync message. + * @function verify + * @memberof protos.HolePunchUpsync + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HolePunchUpsync.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.intAuthToken != null && message.hasOwnProperty("intAuthToken")) + if (!$util.isString(message.intAuthToken)) + return "intAuthToken: string expected"; + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + if (!$util.isInteger(message.boundRoomId)) + return "boundRoomId: integer expected"; + if (message.authKey != null && message.hasOwnProperty("authKey")) + if (!$util.isInteger(message.authKey)) + return "authKey: integer expected"; + return null; + }; + + /** + * Creates a HolePunchUpsync message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.HolePunchUpsync + * @static + * @param {Object.} object Plain object + * @returns {protos.HolePunchUpsync} HolePunchUpsync + */ + HolePunchUpsync.fromObject = function fromObject(object) { + if (object instanceof $root.protos.HolePunchUpsync) + return object; + var message = new $root.protos.HolePunchUpsync(); + if (object.intAuthToken != null) + message.intAuthToken = String(object.intAuthToken); + if (object.boundRoomId != null) + message.boundRoomId = object.boundRoomId | 0; + if (object.authKey != null) + message.authKey = object.authKey | 0; + return message; + }; + + /** + * Creates a plain object from a HolePunchUpsync message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.HolePunchUpsync + * @static + * @param {protos.HolePunchUpsync} message HolePunchUpsync + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HolePunchUpsync.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.intAuthToken = ""; + object.boundRoomId = 0; + object.authKey = 0; + } + if (message.intAuthToken != null && message.hasOwnProperty("intAuthToken")) + object.intAuthToken = message.intAuthToken; + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + object.boundRoomId = message.boundRoomId; + if (message.authKey != null && message.hasOwnProperty("authKey")) + object.authKey = message.authKey; + return object; + }; + + /** + * Converts this HolePunchUpsync to JSON. + * @function toJSON + * @memberof protos.HolePunchUpsync + * @instance + * @returns {Object.} JSON object + */ + HolePunchUpsync.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for HolePunchUpsync + * @function getTypeUrl + * @memberof protos.HolePunchUpsync + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + HolePunchUpsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.HolePunchUpsync"; + }; + + return HolePunchUpsync; + })(); + + protos.PeerUdpAddr = (function() { + + /** + * Properties of a PeerUdpAddr. + * @memberof protos + * @interface IPeerUdpAddr + * @property {string|null} [ip] PeerUdpAddr ip + * @property {number|null} [port] PeerUdpAddr port + * @property {number|null} [authKey] PeerUdpAddr authKey + */ + + /** + * Constructs a new PeerUdpAddr. + * @memberof protos + * @classdesc Represents a PeerUdpAddr. + * @implements IPeerUdpAddr + * @constructor + * @param {protos.IPeerUdpAddr=} [properties] Properties to set + */ + function PeerUdpAddr(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PeerUdpAddr ip. + * @member {string} ip + * @memberof protos.PeerUdpAddr + * @instance + */ + PeerUdpAddr.prototype.ip = ""; + + /** + * PeerUdpAddr port. + * @member {number} port + * @memberof protos.PeerUdpAddr + * @instance + */ + PeerUdpAddr.prototype.port = 0; + + /** + * PeerUdpAddr authKey. + * @member {number} authKey + * @memberof protos.PeerUdpAddr + * @instance + */ + PeerUdpAddr.prototype.authKey = 0; + + /** + * Creates a new PeerUdpAddr instance using the specified properties. + * @function create + * @memberof protos.PeerUdpAddr + * @static + * @param {protos.IPeerUdpAddr=} [properties] Properties to set + * @returns {protos.PeerUdpAddr} PeerUdpAddr instance + */ + PeerUdpAddr.create = function create(properties) { + return new PeerUdpAddr(properties); + }; + + /** + * Encodes the specified PeerUdpAddr message. Does not implicitly {@link protos.PeerUdpAddr.verify|verify} messages. + * @function encode + * @memberof protos.PeerUdpAddr + * @static + * @param {protos.PeerUdpAddr} message PeerUdpAddr message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerUdpAddr.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.ip != null && Object.hasOwnProperty.call(message, "ip")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.ip); + if (message.port != null && Object.hasOwnProperty.call(message, "port")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.port); + if (message.authKey != null && Object.hasOwnProperty.call(message, "authKey")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.authKey); + return writer; + }; + + /** + * Encodes the specified PeerUdpAddr message, length delimited. Does not implicitly {@link protos.PeerUdpAddr.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.PeerUdpAddr + * @static + * @param {protos.PeerUdpAddr} message PeerUdpAddr message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerUdpAddr.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PeerUdpAddr message from the specified reader or buffer. + * @function decode + * @memberof protos.PeerUdpAddr + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.PeerUdpAddr} PeerUdpAddr + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerUdpAddr.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.PeerUdpAddr(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.ip = reader.string(); + break; + } + case 2: { + message.port = reader.int32(); + break; + } + case 3: { + message.authKey = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PeerUdpAddr message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.PeerUdpAddr + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.PeerUdpAddr} PeerUdpAddr + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerUdpAddr.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PeerUdpAddr message. + * @function verify + * @memberof protos.PeerUdpAddr + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PeerUdpAddr.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.ip != null && message.hasOwnProperty("ip")) + if (!$util.isString(message.ip)) + return "ip: string expected"; + if (message.port != null && message.hasOwnProperty("port")) + if (!$util.isInteger(message.port)) + return "port: integer expected"; + if (message.authKey != null && message.hasOwnProperty("authKey")) + if (!$util.isInteger(message.authKey)) + return "authKey: integer expected"; + return null; + }; + + /** + * Creates a PeerUdpAddr message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.PeerUdpAddr + * @static + * @param {Object.} object Plain object + * @returns {protos.PeerUdpAddr} PeerUdpAddr + */ + PeerUdpAddr.fromObject = function fromObject(object) { + if (object instanceof $root.protos.PeerUdpAddr) + return object; + var message = new $root.protos.PeerUdpAddr(); + if (object.ip != null) + message.ip = String(object.ip); + if (object.port != null) + message.port = object.port | 0; + if (object.authKey != null) + message.authKey = object.authKey | 0; + return message; + }; + + /** + * Creates a plain object from a PeerUdpAddr message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.PeerUdpAddr + * @static + * @param {protos.PeerUdpAddr} message PeerUdpAddr + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PeerUdpAddr.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.ip = ""; + object.port = 0; + object.authKey = 0; + } + if (message.ip != null && message.hasOwnProperty("ip")) + object.ip = message.ip; + if (message.port != null && message.hasOwnProperty("port")) + object.port = message.port; + if (message.authKey != null && message.hasOwnProperty("authKey")) + object.authKey = message.authKey; + return object; + }; + + /** + * Converts this PeerUdpAddr to JSON. + * @function toJSON + * @memberof protos.PeerUdpAddr + * @instance + * @returns {Object.} JSON object + */ + PeerUdpAddr.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for PeerUdpAddr + * @function getTypeUrl + * @memberof protos.PeerUdpAddr + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PeerUdpAddr.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.PeerUdpAddr"; + }; + + return PeerUdpAddr; + })(); + protos.RoomDownsyncFrame = (function() { /** @@ -6426,6 +6575,7 @@ $root.protos = (function() { * @property {boolean|null} [shouldForceResync] RoomDownsyncFrame shouldForceResync * @property {Array.|null} [speciesIdList] RoomDownsyncFrame speciesIdList * @property {number|null} [bulletLocalIdCounter] RoomDownsyncFrame bulletLocalIdCounter + * @property {Array.|null} [peerUdpAddrList] RoomDownsyncFrame peerUdpAddrList */ /** @@ -6441,6 +6591,7 @@ $root.protos = (function() { this.meleeBullets = []; this.fireballBullets = []; this.speciesIdList = []; + this.peerUdpAddrList = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -6519,6 +6670,14 @@ $root.protos = (function() { */ RoomDownsyncFrame.prototype.bulletLocalIdCounter = 0; + /** + * RoomDownsyncFrame peerUdpAddrList. + * @member {Array.} peerUdpAddrList + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.peerUdpAddrList = $util.emptyArray; + /** * Creates a new RoomDownsyncFrame instance using the specified properties. * @function create @@ -6568,6 +6727,9 @@ $root.protos = (function() { } if (message.bulletLocalIdCounter != null && Object.hasOwnProperty.call(message, "bulletLocalIdCounter")) writer.uint32(/* id 1027, wireType 0 =*/8216).int32(message.bulletLocalIdCounter); + if (message.peerUdpAddrList != null && message.peerUdpAddrList.length) + for (var i = 0; i < message.peerUdpAddrList.length; ++i) + $root.protos.PeerUdpAddr.encode(message.peerUdpAddrList[i], writer.uint32(/* id 1028, wireType 2 =*/8226).fork()).ldelim(); return writer; }; @@ -6651,6 +6813,12 @@ $root.protos = (function() { message.bulletLocalIdCounter = reader.int32(); break; } + case 1028: { + if (!(message.peerUdpAddrList && message.peerUdpAddrList.length)) + message.peerUdpAddrList = []; + message.peerUdpAddrList.push($root.protos.PeerUdpAddr.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -6735,6 +6903,15 @@ $root.protos = (function() { if (message.bulletLocalIdCounter != null && message.hasOwnProperty("bulletLocalIdCounter")) if (!$util.isInteger(message.bulletLocalIdCounter)) return "bulletLocalIdCounter: integer expected"; + if (message.peerUdpAddrList != null && message.hasOwnProperty("peerUdpAddrList")) { + if (!Array.isArray(message.peerUdpAddrList)) + return "peerUdpAddrList: array expected"; + for (var i = 0; i < message.peerUdpAddrList.length; ++i) { + var error = $root.protos.PeerUdpAddr.verify(message.peerUdpAddrList[i]); + if (error) + return "peerUdpAddrList." + error; + } + } return null; }; @@ -6811,6 +6988,16 @@ $root.protos = (function() { } if (object.bulletLocalIdCounter != null) message.bulletLocalIdCounter = object.bulletLocalIdCounter | 0; + if (object.peerUdpAddrList) { + if (!Array.isArray(object.peerUdpAddrList)) + throw TypeError(".protos.RoomDownsyncFrame.peerUdpAddrList: array expected"); + message.peerUdpAddrList = []; + for (var i = 0; i < object.peerUdpAddrList.length; ++i) { + if (typeof object.peerUdpAddrList[i] !== "object") + throw TypeError(".protos.RoomDownsyncFrame.peerUdpAddrList: object expected"); + message.peerUdpAddrList[i] = $root.protos.PeerUdpAddr.fromObject(object.peerUdpAddrList[i]); + } + } return message; }; @@ -6832,6 +7019,7 @@ $root.protos = (function() { object.meleeBullets = []; object.fireballBullets = []; object.speciesIdList = []; + object.peerUdpAddrList = []; } if (options.defaults) { object.id = 0; @@ -6884,6 +7072,11 @@ $root.protos = (function() { } if (message.bulletLocalIdCounter != null && message.hasOwnProperty("bulletLocalIdCounter")) object.bulletLocalIdCounter = message.bulletLocalIdCounter; + if (message.peerUdpAddrList && message.peerUdpAddrList.length) { + object.peerUdpAddrList = []; + for (var j = 0; j < message.peerUdpAddrList.length; ++j) + object.peerUdpAddrList[j] = $root.protos.PeerUdpAddr.toObject(message.peerUdpAddrList[j], options); + } return object; }; @@ -6916,27 +7109,31 @@ $root.protos = (function() { return RoomDownsyncFrame; })(); - protos.HolePunchUpsync = (function() { + protos.WsResp = (function() { /** - * Properties of a HolePunchUpsync. + * Properties of a WsResp. * @memberof protos - * @interface IHolePunchUpsync - * @property {number|null} [joinIndex] HolePunchUpsync joinIndex - * @property {string|null} [intAuthToken] HolePunchUpsync intAuthToken - * @property {number|null} [boundRoomId] HolePunchUpsync boundRoomId - * @property {number|null} [authKey] HolePunchUpsync authKey + * @interface IWsResp + * @property {number|null} [ret] WsResp ret + * @property {number|null} [echoedMsgId] WsResp echoedMsgId + * @property {number|null} [act] WsResp act + * @property {protos.RoomDownsyncFrame|null} [rdf] WsResp rdf + * @property {Array.|null} [inputFrameDownsyncBatch] WsResp inputFrameDownsyncBatch + * @property {protos.BattleColliderInfo|null} [bciFrame] WsResp bciFrame + * @property {number|null} [peerJoinIndex] WsResp peerJoinIndex */ /** - * Constructs a new HolePunchUpsync. + * Constructs a new WsResp. * @memberof protos - * @classdesc Represents a HolePunchUpsync. - * @implements IHolePunchUpsync + * @classdesc Represents a WsResp. + * @implements IWsResp * @constructor - * @param {protos.IHolePunchUpsync=} [properties] Properties to set + * @param {protos.IWsResp=} [properties] Properties to set */ - function HolePunchUpsync(properties) { + function WsResp(properties) { + this.inputFrameDownsyncBatch = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -6944,117 +7141,162 @@ $root.protos = (function() { } /** - * HolePunchUpsync joinIndex. - * @member {number} joinIndex - * @memberof protos.HolePunchUpsync + * WsResp ret. + * @member {number} ret + * @memberof protos.WsResp * @instance */ - HolePunchUpsync.prototype.joinIndex = 0; + WsResp.prototype.ret = 0; /** - * HolePunchUpsync intAuthToken. - * @member {string} intAuthToken - * @memberof protos.HolePunchUpsync + * WsResp echoedMsgId. + * @member {number} echoedMsgId + * @memberof protos.WsResp * @instance */ - HolePunchUpsync.prototype.intAuthToken = ""; + WsResp.prototype.echoedMsgId = 0; /** - * HolePunchUpsync boundRoomId. - * @member {number} boundRoomId - * @memberof protos.HolePunchUpsync + * WsResp act. + * @member {number} act + * @memberof protos.WsResp * @instance */ - HolePunchUpsync.prototype.boundRoomId = 0; + WsResp.prototype.act = 0; /** - * HolePunchUpsync authKey. - * @member {number} authKey - * @memberof protos.HolePunchUpsync + * WsResp rdf. + * @member {protos.RoomDownsyncFrame|null|undefined} rdf + * @memberof protos.WsResp * @instance */ - HolePunchUpsync.prototype.authKey = 0; + WsResp.prototype.rdf = null; /** - * Creates a new HolePunchUpsync instance using the specified properties. + * WsResp inputFrameDownsyncBatch. + * @member {Array.} inputFrameDownsyncBatch + * @memberof protos.WsResp + * @instance + */ + WsResp.prototype.inputFrameDownsyncBatch = $util.emptyArray; + + /** + * WsResp bciFrame. + * @member {protos.BattleColliderInfo|null|undefined} bciFrame + * @memberof protos.WsResp + * @instance + */ + WsResp.prototype.bciFrame = null; + + /** + * WsResp peerJoinIndex. + * @member {number} peerJoinIndex + * @memberof protos.WsResp + * @instance + */ + WsResp.prototype.peerJoinIndex = 0; + + /** + * Creates a new WsResp instance using the specified properties. * @function create - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static - * @param {protos.IHolePunchUpsync=} [properties] Properties to set - * @returns {protos.HolePunchUpsync} HolePunchUpsync instance + * @param {protos.IWsResp=} [properties] Properties to set + * @returns {protos.WsResp} WsResp instance */ - HolePunchUpsync.create = function create(properties) { - return new HolePunchUpsync(properties); + WsResp.create = function create(properties) { + return new WsResp(properties); }; /** - * Encodes the specified HolePunchUpsync message. Does not implicitly {@link protos.HolePunchUpsync.verify|verify} messages. + * Encodes the specified WsResp message. Does not implicitly {@link protos.WsResp.verify|verify} messages. * @function encode - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static - * @param {protos.HolePunchUpsync} message HolePunchUpsync message or plain object to encode + * @param {protos.WsResp} message WsResp message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - HolePunchUpsync.encode = function encode(message, writer) { + WsResp.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex")) - writer.uint32(/* id 1, wireType 0 =*/8).int32(message.joinIndex); - if (message.intAuthToken != null && Object.hasOwnProperty.call(message, "intAuthToken")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.intAuthToken); - if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) - writer.uint32(/* id 3, wireType 0 =*/24).int32(message.boundRoomId); - if (message.authKey != null && Object.hasOwnProperty.call(message, "authKey")) - writer.uint32(/* id 4, wireType 0 =*/32).int32(message.authKey); + if (message.ret != null && Object.hasOwnProperty.call(message, "ret")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ret); + if (message.echoedMsgId != null && Object.hasOwnProperty.call(message, "echoedMsgId")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.echoedMsgId); + if (message.act != null && Object.hasOwnProperty.call(message, "act")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.act); + if (message.rdf != null && Object.hasOwnProperty.call(message, "rdf")) + $root.protos.RoomDownsyncFrame.encode(message.rdf, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.inputFrameDownsyncBatch != null && message.inputFrameDownsyncBatch.length) + for (var i = 0; i < message.inputFrameDownsyncBatch.length; ++i) + $root.protos.InputFrameDownsync.encode(message.inputFrameDownsyncBatch[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.bciFrame != null && Object.hasOwnProperty.call(message, "bciFrame")) + $root.protos.BattleColliderInfo.encode(message.bciFrame, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.peerJoinIndex != null && Object.hasOwnProperty.call(message, "peerJoinIndex")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.peerJoinIndex); return writer; }; /** - * Encodes the specified HolePunchUpsync message, length delimited. Does not implicitly {@link protos.HolePunchUpsync.verify|verify} messages. + * Encodes the specified WsResp message, length delimited. Does not implicitly {@link protos.WsResp.verify|verify} messages. * @function encodeDelimited - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static - * @param {protos.HolePunchUpsync} message HolePunchUpsync message or plain object to encode + * @param {protos.WsResp} message WsResp message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - HolePunchUpsync.encodeDelimited = function encodeDelimited(message, writer) { + WsResp.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a HolePunchUpsync message from the specified reader or buffer. + * Decodes a WsResp message from the specified reader or buffer. * @function decode - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {protos.HolePunchUpsync} HolePunchUpsync + * @returns {protos.WsResp} WsResp * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - HolePunchUpsync.decode = function decode(reader, length) { + WsResp.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.HolePunchUpsync(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.WsResp(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.joinIndex = reader.int32(); + message.ret = reader.int32(); break; } case 2: { - message.intAuthToken = reader.string(); + message.echoedMsgId = reader.int32(); break; } case 3: { - message.boundRoomId = reader.int32(); + message.act = reader.int32(); break; } case 4: { - message.authKey = reader.int32(); + message.rdf = $root.protos.RoomDownsyncFrame.decode(reader, reader.uint32()); + break; + } + case 5: { + if (!(message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length)) + message.inputFrameDownsyncBatch = []; + message.inputFrameDownsyncBatch.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32())); + break; + } + case 6: { + message.bciFrame = $root.protos.BattleColliderInfo.decode(reader, reader.uint32()); + break; + } + case 7: { + message.peerJoinIndex = reader.int32(); break; } default: @@ -7066,127 +7308,179 @@ $root.protos = (function() { }; /** - * Decodes a HolePunchUpsync message from the specified reader or buffer, length delimited. + * Decodes a WsResp message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {protos.HolePunchUpsync} HolePunchUpsync + * @returns {protos.WsResp} WsResp * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - HolePunchUpsync.decodeDelimited = function decodeDelimited(reader) { + WsResp.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a HolePunchUpsync message. + * Verifies a WsResp message. * @function verify - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - HolePunchUpsync.verify = function verify(message) { + WsResp.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) - if (!$util.isInteger(message.joinIndex)) - return "joinIndex: integer expected"; - if (message.intAuthToken != null && message.hasOwnProperty("intAuthToken")) - if (!$util.isString(message.intAuthToken)) - return "intAuthToken: string expected"; - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) - if (!$util.isInteger(message.boundRoomId)) - return "boundRoomId: integer expected"; - if (message.authKey != null && message.hasOwnProperty("authKey")) - if (!$util.isInteger(message.authKey)) - return "authKey: integer expected"; + if (message.ret != null && message.hasOwnProperty("ret")) + if (!$util.isInteger(message.ret)) + return "ret: integer expected"; + if (message.echoedMsgId != null && message.hasOwnProperty("echoedMsgId")) + if (!$util.isInteger(message.echoedMsgId)) + return "echoedMsgId: integer expected"; + if (message.act != null && message.hasOwnProperty("act")) + if (!$util.isInteger(message.act)) + return "act: integer expected"; + if (message.rdf != null && message.hasOwnProperty("rdf")) { + var error = $root.protos.RoomDownsyncFrame.verify(message.rdf); + if (error) + return "rdf." + error; + } + if (message.inputFrameDownsyncBatch != null && message.hasOwnProperty("inputFrameDownsyncBatch")) { + if (!Array.isArray(message.inputFrameDownsyncBatch)) + return "inputFrameDownsyncBatch: array expected"; + for (var i = 0; i < message.inputFrameDownsyncBatch.length; ++i) { + var error = $root.protos.InputFrameDownsync.verify(message.inputFrameDownsyncBatch[i]); + if (error) + return "inputFrameDownsyncBatch." + error; + } + } + if (message.bciFrame != null && message.hasOwnProperty("bciFrame")) { + var error = $root.protos.BattleColliderInfo.verify(message.bciFrame); + if (error) + return "bciFrame." + error; + } + if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex")) + if (!$util.isInteger(message.peerJoinIndex)) + return "peerJoinIndex: integer expected"; return null; }; /** - * Creates a HolePunchUpsync message from a plain object. Also converts values to their respective internal types. + * Creates a WsResp message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static * @param {Object.} object Plain object - * @returns {protos.HolePunchUpsync} HolePunchUpsync + * @returns {protos.WsResp} WsResp */ - HolePunchUpsync.fromObject = function fromObject(object) { - if (object instanceof $root.protos.HolePunchUpsync) + WsResp.fromObject = function fromObject(object) { + if (object instanceof $root.protos.WsResp) return object; - var message = new $root.protos.HolePunchUpsync(); - if (object.joinIndex != null) - message.joinIndex = object.joinIndex | 0; - if (object.intAuthToken != null) - message.intAuthToken = String(object.intAuthToken); - if (object.boundRoomId != null) - message.boundRoomId = object.boundRoomId | 0; - if (object.authKey != null) - message.authKey = object.authKey | 0; + var message = new $root.protos.WsResp(); + if (object.ret != null) + message.ret = object.ret | 0; + if (object.echoedMsgId != null) + message.echoedMsgId = object.echoedMsgId | 0; + if (object.act != null) + message.act = object.act | 0; + if (object.rdf != null) { + if (typeof object.rdf !== "object") + throw TypeError(".protos.WsResp.rdf: object expected"); + message.rdf = $root.protos.RoomDownsyncFrame.fromObject(object.rdf); + } + if (object.inputFrameDownsyncBatch) { + if (!Array.isArray(object.inputFrameDownsyncBatch)) + throw TypeError(".protos.WsResp.inputFrameDownsyncBatch: array expected"); + message.inputFrameDownsyncBatch = []; + for (var i = 0; i < object.inputFrameDownsyncBatch.length; ++i) { + if (typeof object.inputFrameDownsyncBatch[i] !== "object") + throw TypeError(".protos.WsResp.inputFrameDownsyncBatch: object expected"); + message.inputFrameDownsyncBatch[i] = $root.protos.InputFrameDownsync.fromObject(object.inputFrameDownsyncBatch[i]); + } + } + if (object.bciFrame != null) { + if (typeof object.bciFrame !== "object") + throw TypeError(".protos.WsResp.bciFrame: object expected"); + message.bciFrame = $root.protos.BattleColliderInfo.fromObject(object.bciFrame); + } + if (object.peerJoinIndex != null) + message.peerJoinIndex = object.peerJoinIndex | 0; return message; }; /** - * Creates a plain object from a HolePunchUpsync message. Also converts values to other types if specified. + * Creates a plain object from a WsResp message. Also converts values to other types if specified. * @function toObject - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static - * @param {protos.HolePunchUpsync} message HolePunchUpsync + * @param {protos.WsResp} message WsResp * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - HolePunchUpsync.toObject = function toObject(message, options) { + WsResp.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; + if (options.arrays || options.defaults) + object.inputFrameDownsyncBatch = []; if (options.defaults) { - object.joinIndex = 0; - object.intAuthToken = ""; - object.boundRoomId = 0; - object.authKey = 0; + object.ret = 0; + object.echoedMsgId = 0; + object.act = 0; + object.rdf = null; + object.bciFrame = null; + object.peerJoinIndex = 0; } - if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) - object.joinIndex = message.joinIndex; - if (message.intAuthToken != null && message.hasOwnProperty("intAuthToken")) - object.intAuthToken = message.intAuthToken; - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) - object.boundRoomId = message.boundRoomId; - if (message.authKey != null && message.hasOwnProperty("authKey")) - object.authKey = message.authKey; + if (message.ret != null && message.hasOwnProperty("ret")) + object.ret = message.ret; + if (message.echoedMsgId != null && message.hasOwnProperty("echoedMsgId")) + object.echoedMsgId = message.echoedMsgId; + if (message.act != null && message.hasOwnProperty("act")) + object.act = message.act; + if (message.rdf != null && message.hasOwnProperty("rdf")) + object.rdf = $root.protos.RoomDownsyncFrame.toObject(message.rdf, options); + if (message.inputFrameDownsyncBatch && message.inputFrameDownsyncBatch.length) { + object.inputFrameDownsyncBatch = []; + for (var j = 0; j < message.inputFrameDownsyncBatch.length; ++j) + object.inputFrameDownsyncBatch[j] = $root.protos.InputFrameDownsync.toObject(message.inputFrameDownsyncBatch[j], options); + } + if (message.bciFrame != null && message.hasOwnProperty("bciFrame")) + object.bciFrame = $root.protos.BattleColliderInfo.toObject(message.bciFrame, options); + if (message.peerJoinIndex != null && message.hasOwnProperty("peerJoinIndex")) + object.peerJoinIndex = message.peerJoinIndex; return object; }; /** - * Converts this HolePunchUpsync to JSON. + * Converts this WsResp to JSON. * @function toJSON - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @instance * @returns {Object.} JSON object */ - HolePunchUpsync.prototype.toJSON = function toJSON() { + WsResp.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for HolePunchUpsync + * Gets the default type url for WsResp * @function getTypeUrl - * @memberof protos.HolePunchUpsync + * @memberof protos.WsResp * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - HolePunchUpsync.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + WsResp.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/protos.HolePunchUpsync"; + return typeUrlPrefix + "/protos.WsResp"; }; - return HolePunchUpsync; + return WsResp; })(); return protos; diff --git a/frontend/build-templates/jsb-link/frameworks/runtime-src/proj.win32/DelayNoMore.vcxproj b/frontend/build-templates/jsb-link/frameworks/runtime-src/proj.win32/DelayNoMore.vcxproj index a866407..3256f14 100644 --- a/frontend/build-templates/jsb-link/frameworks/runtime-src/proj.win32/DelayNoMore.vcxproj +++ b/frontend/build-templates/jsb-link/frameworks/runtime-src/proj.win32/DelayNoMore.vcxproj @@ -25,6 +25,7 @@ v140_xp v141 v140_xp + v140 Application @@ -206,4 +207,4 @@ copy "$(ProjectDir)..\..\..\project.json" "$(OutDir)\" /Y - + \ No newline at end of file diff --git a/frontend/settings/builder.json b/frontend/settings/builder.json index 4245ee4..ab222b4 100644 --- a/frontend/settings/builder.json +++ b/frontend/settings/builder.json @@ -17,8 +17,7 @@ }, "encryptJs": false, "excludeScenes": [ - "92160186-3e0d-4e0a-ae20-97286170ba58", - "2ff474d9-0c9e-4fe3-87ec-fbff7cae85b4" + "8491a86c-bec9-4813-968a-128ca01639e0" ], "fb-instant-games": {}, "includeSDKBox": false, @@ -38,7 +37,7 @@ "REMOTE_SERVER_ROOT": "", "orientation": "portrait" }, - "startScene": "8491a86c-bec9-4813-968a-128ca01639e0", + "startScene": "2ff474d9-0c9e-4fe3-87ec-fbff7cae85b4", "title": "DelayNoMore", "webOrientation": "landscape", "wechatgame": { @@ -58,5 +57,5 @@ "packageName": "org.genxium.delaynomore" }, "win32": {}, - "includeAnySDK": null + "includeAnySDK": false } diff --git a/frontend/settings/project.json b/frontend/settings/project.json index 3b28a1d..e18d4b0 100644 --- a/frontend/settings/project.json +++ b/frontend/settings/project.json @@ -73,7 +73,7 @@ "shelter_z_reducer", "shelter" ], - "last-module-event-record-time": 1673930863015, + "last-module-event-record-time": 1674632533161, "simulator-orientation": false, "simulator-resolution": { "height": 640,