From 1e32a111b5d21b050e99d5a7987c30d05922d66d Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Wed, 18 Sep 2024 10:21:06 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E6=88=BF=E9=97=B4=E7=94=BB=E9=9D=A2=E5=BF=AB=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Script/Event/EEvent.cs | 1 + .../Assets/Script/Manager/AppRoom.cs | 25 + .../Protobuf/ProtobufAxibugEmuOnline.cs | 482 +++++++++++++++++- AxibugEmuOnline.Server/Manager/RoomManager.cs | 22 + .../Protobuf/ProtobufAxibugEmuOnline.cs | 482 +++++++++++++++++- .../out/CS/ProtobufAxibugEmuOnline.cs | 482 +++++++++++++++++- .../proto/protobuf_AxibugEmuOnline.proto | 13 + 7 files changed, 1441 insertions(+), 66 deletions(-) diff --git a/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs b/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs index 12673f1..666423b 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Event/EEvent.cs @@ -8,6 +8,7 @@ OnRoomListAllUpdate,//房间列表全量刷新 OnRoomListSingleUpdate,//房间列表中单个更新 + OnRoomGetRoomScreen,//获取到房间数据 /// /// 我进入房间 diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppRoom.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppRoom.cs index 73d4ec5..515db04 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Manager/AppRoom.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppRoom.cs @@ -31,6 +31,7 @@ namespace AxibugEmuOnline.Client.Manager } Protobuf_Room_List _Protobuf_Room_List = new Protobuf_Room_List(); + Protobuf_Room_Get_Screen _Protobuf_Room_Get_Screen = new Protobuf_Room_Get_Screen(); Protobuf_Room_Create _Protobuf_Room_Create = new Protobuf_Room_Create(); Protobuf_Room_Join _Protobuf_Room_Join = new Protobuf_Room_Join(); Protobuf_Room_Leave _Protobuf_Room_Leave = new Protobuf_Room_Leave(); @@ -41,6 +42,7 @@ namespace AxibugEmuOnline.Client.Manager { NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomList, RecvGetRoomList); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomListUpdate, RecvGetRoomListUpdate); + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomGetScreen, RecvRoomGetScreen); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomCreate, RecvCreateRoom); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomJoin, RecvJoinRoom); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomLeave, RecvLeavnRoom); @@ -200,6 +202,29 @@ namespace AxibugEmuOnline.Client.Manager Protobuf_Room_Update_RESP msg = ProtoBufHelper.DeSerizlize(reqData); AddOrUpdateRoomList(msg.RoomMiniInfo); Eventer.Instance.PostEvent(EEvent.OnRoomListSingleUpdate, msg.RoomMiniInfo.GameRomID); + } + + /// + /// 获取房间画面快照 + /// + /// + public void SendGetRoomScreen(int RoomID) + { + _Protobuf_Room_Get_Screen.RoomID = RoomID; + App.log.Info($"获取房间画面快照"); + App.network.SendToServer((int)CommandID.CmdRoomGetScreen, ProtoBufHelper.Serizlize(_Protobuf_Room_Get_Screen)); + } + /// + /// 获取单个房间画面 + /// + /// + void RecvRoomGetScreen(byte[] reqData) + { + App.log.Debug("单个房间状态更新"); + Protobuf_Room_Get_Screen_RESP msg = ProtoBufHelper.DeSerizlize(reqData); + //解压 + byte[] data = Helper.DecompressByteArray(msg.RawBitmap.ToArray()); + Eventer.Instance.PostEvent(EEvent.OnRoomGetRoomScreen, msg.RoomID, data); } /// diff --git a/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs index 6c6329c..d8b8324 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Protobuf/ProtobufAxibugEmuOnline.cs @@ -71,26 +71,30 @@ namespace AxibugProtobuf { "KAwiPwonUHJvdG9idWZfUm9vbV9Ib3N0UGxheWVyX1VwZGF0ZVN0YXRlUmF3", "EhQKDExvYWRTdGF0ZVJhdxgBIAEoDCIuCixQcm90b2J1Zl9Sb29tX0hvc3RQ", "bGF5ZXJfVXBkYXRlU3RhdGVSYXdfUkVTUCIcChpQcm90b2J1Zl9Sb29tX1Bs", - "YXllcl9SZWFkeSqaAwoJQ29tbWFuZElEEg4KCkNNRF9ERUZBVUwQABIMCghD", - "TURfUElORxABEgwKCENNRF9QT05HEAISDgoJQ01EX0xPR0lOENEPEhAKC0NN", - "RF9DSEFUTVNHEKEfEhIKDUNNRF9Sb29tX0xpc3QQiScSGQoUQ01EX1Jvb21f", - "TGlzdF9VcGRhdGUQiicSFAoPQ01EX1Jvb21fQ3JlYXRlEO0nEhIKDUNNRF9S", - "b29tX0pvaW4Q8ScSEwoOQ01EX1Jvb21fTGVhdmUQ8icSIgodQ01EX1Jvb21f", - "TXlSb29tX1N0YXRlX0NoYW5nZWQQ9icSFgoRQ01EX1Jvb21fV2FpdFN0ZXAQ", - "0SgSJwoiQ01EX1Jvb21fSG9zdFBsYXllcl9VcGRhdGVTdGF0ZVJhdxDUKBIa", - "ChVDTURfUm9vbV9QbGF5ZXJfUmVhZHkQ2CgSIAobQ01EX1Jvb21fU2luZ2Vs", - "X1BsYXllcklucHV0EPouEh0KGENNRF9ST09NX1NZTl9QbGF5ZXJJbnB1dBD/", - "LhIPCgpDTURfU2NyZWVuENk2Ko8BCglFcnJvckNvZGUSEAoMRVJST1JfREVG", - "QVVMEAASDAoIRVJST1JfT0sQARIYChRFUlJPUl9ST09NX05PVF9GT1VORBAK", - "EiUKIUVSUk9SX1JPT01fU0xPVF9SRUFETFlfSEFEX1BMQVlFUhALEiEKHUVS", - "Uk9SX1JPT01fQ0FOVF9ET19DVVJSX1NUQVRFEDIqHAoJTG9naW5UeXBlEg8K", - "C0Jhc2VEZWZhdWx0EAAqSwoKRGV2aWNlVHlwZRIWChJEZXZpY2VUeXBlX0Rl", - "ZmF1bHQQABIGCgJQQxABEgsKB0FuZHJvaWQQAhIHCgNJT1MQAxIHCgNQU1YQ", - "BCpwCg1Sb29tR2FtZVN0YXRlEhIKDk5vbmVfR2FtZVN0YXRlEAASDAoIT25s", - "eUhvc3QQARIRCg1XYWl0UmF3VXBkYXRlEAISDQoJV2FpdFJlYWR5EAMSCQoF", - "UGF1c2UQBBIQCgxJbk9ubGluZUdhbWUQBSpOChFMb2dpblJlc3VsdFN0YXR1", - "cxIhCh1Mb2dpblJlc3VsdFN0YXR1c19CYXNlRGVmYXVsdBAAEgYKAk9LEAES", - "DgoKQWNjb3VudEVychACQgJIAWIGcHJvdG8z")); + "YXllcl9SZWFkeSIqChhQcm90b2J1Zl9Sb29tX0dldF9TY3JlZW4SDgoGUm9v", + "bUlEGAEgASgFIlMKHVByb3RvYnVmX1Jvb21fR2V0X1NjcmVlbl9SRVNQEg4K", + "BlJvb21JRBgBIAEoBRIPCgdGcmFtZUlEGAIgASgFEhEKCVJhd0JpdG1hcBgD", + "IAEoDCq0AwoJQ29tbWFuZElEEg4KCkNNRF9ERUZBVUwQABIMCghDTURfUElO", + "RxABEgwKCENNRF9QT05HEAISDgoJQ01EX0xPR0lOENEPEhAKC0NNRF9DSEFU", + "TVNHEKEfEhIKDUNNRF9Sb29tX0xpc3QQiScSGQoUQ01EX1Jvb21fTGlzdF9V", + "cGRhdGUQiicSGAoTQ01EX1Jvb21fR2V0X1NjcmVlbhCTJxIUCg9DTURfUm9v", + "bV9DcmVhdGUQ7ScSEgoNQ01EX1Jvb21fSm9pbhDxJxITCg5DTURfUm9vbV9M", + "ZWF2ZRDyJxIiCh1DTURfUm9vbV9NeVJvb21fU3RhdGVfQ2hhbmdlZBD2JxIW", + "ChFDTURfUm9vbV9XYWl0U3RlcBDRKBInCiJDTURfUm9vbV9Ib3N0UGxheWVy", + "X1VwZGF0ZVN0YXRlUmF3ENQoEhoKFUNNRF9Sb29tX1BsYXllcl9SZWFkeRDY", + "KBIgChtDTURfUm9vbV9TaW5nZWxfUGxheWVySW5wdXQQ+i4SHQoYQ01EX1JP", + "T01fU1lOX1BsYXllcklucHV0EP8uEg8KCkNNRF9TY3JlZW4Q2TYqjwEKCUVy", + "cm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJPUl9PSxABEhgKFEVS", + "Uk9SX1JPT01fTk9UX0ZPVU5EEAoSJQohRVJST1JfUk9PTV9TTE9UX1JFQURM", + "WV9IQURfUExBWUVSEAsSIQodRVJST1JfUk9PTV9DQU5UX0RPX0NVUlJfU1RB", + "VEUQMiocCglMb2dpblR5cGUSDwoLQmFzZURlZmF1bHQQACpLCgpEZXZpY2VU", + "eXBlEhYKEkRldmljZVR5cGVfRGVmYXVsdBAAEgYKAlBDEAESCwoHQW5kcm9p", + "ZBACEgcKA0lPUxADEgcKA1BTVhAEKnAKDVJvb21HYW1lU3RhdGUSEgoOTm9u", + "ZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRSYXdVcGRhdGUQ", + "AhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25saW5lR2FtZRAF", + "Kk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0U3RhdHVzX0Jh", + "c2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJCAkgBYgZwcm90", + "bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -117,7 +121,9 @@ namespace AxibugProtobuf { new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_WaitStep_RESP), global::AxibugProtobuf.Protobuf_Room_WaitStep_RESP.Parser, new[]{ "WaitStep", "LoadStateRaw" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw), global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw.Parser, new[]{ "LoadStateRaw" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw_RESP), global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw_RESP.Parser, null, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Player_Ready), global::AxibugProtobuf.Protobuf_Room_Player_Ready.Parser, null, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Player_Ready), global::AxibugProtobuf.Protobuf_Room_Player_Ready.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Get_Screen), global::AxibugProtobuf.Protobuf_Room_Get_Screen.Parser, new[]{ "RoomID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Get_Screen_RESP), global::AxibugProtobuf.Protobuf_Room_Get_Screen_RESP.Parser, new[]{ "RoomID", "FrameID", "RawBitmap" }, null, null, null, null) })); } #endregion @@ -154,6 +160,10 @@ namespace AxibugProtobuf { /// [pbr::OriginalName("CMD_Room_List_Update")] CmdRoomListUpdate = 5002, /// + ///房间列表 上行 | 下行 对应 Protobuf_Room_Get_Screen | Protobuf_Room_Get_Screen_RESP + /// + [pbr::OriginalName("CMD_Room_Get_Screen")] CmdRoomGetScreen = 5011, + /// ///房间内相关 /// [pbr::OriginalName("CMD_Room_Create")] CmdRoomCreate = 5101, @@ -180,7 +190,7 @@ namespace AxibugProtobuf { /// 主机玩家 上行 CMD_Room_HostPlayer_UpdateStateRaw消息,上传即时存档 /// 主机玩家上传完毕之后,服务器会通知进入Step1 /// - /// Step1:服务器广播"等待-全员加载即时存档" CMD_Room_WaitStep WaitStep=[1] 附带即时存档 ---> 客户端:全员等待(主机玩家一人上传) + /// Step1:服务器广播"等待-全员加载即时存档" CMD_Room_WaitStep WaitStep=[1] 附带即时存档 ---> 客户端:全员等待 /// 所有玩家确保加载ROM和即时存档,并保持模拟器暂停,准备完毕后 发送 CMD_Room_Player_Ready /// 所有玩家Ready之后,服务器会根据所有玩家延迟提前跑若干Frame,通知进入Step2 /// @@ -5727,6 +5737,434 @@ namespace AxibugProtobuf { } + public sealed partial class Protobuf_Room_Get_Screen : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Room_Get_Screen()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[24]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen(Protobuf_Room_Get_Screen other) : this() { + roomID_ = other.roomID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen Clone() { + return new Protobuf_Room_Get_Screen(this); + } + + /// Field number for the "RoomID" field. + public const int RoomIDFieldNumber = 1; + private int roomID_; + /// + ///房间ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int RoomID { + get { return roomID_; } + set { + roomID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Room_Get_Screen); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Room_Get_Screen other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RoomID != other.RoomID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (RoomID != 0) hash ^= RoomID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (RoomID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RoomID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Room_Get_Screen other) { + if (other == null) { + return; + } + if (other.RoomID != 0) { + RoomID = other.RoomID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + public sealed partial class Protobuf_Room_Get_Screen_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Room_Get_Screen_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[25]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP(Protobuf_Room_Get_Screen_RESP other) : this() { + roomID_ = other.roomID_; + frameID_ = other.frameID_; + rawBitmap_ = other.rawBitmap_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP Clone() { + return new Protobuf_Room_Get_Screen_RESP(this); + } + + /// Field number for the "RoomID" field. + public const int RoomIDFieldNumber = 1; + private int roomID_; + /// + ///房间ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int RoomID { + get { return roomID_; } + set { + roomID_ = value; + } + } + + /// Field number for the "FrameID" field. + public const int FrameIDFieldNumber = 2; + private int frameID_; + /// + ///帧编号 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int FrameID { + get { return frameID_; } + set { + frameID_ = value; + } + } + + /// Field number for the "RawBitmap" field. + public const int RawBitmapFieldNumber = 3; + private pb::ByteString rawBitmap_ = pb::ByteString.Empty; + /// + ///渲染层画面 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pb::ByteString RawBitmap { + get { return rawBitmap_; } + set { + rawBitmap_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Room_Get_Screen_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Room_Get_Screen_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RoomID != other.RoomID) return false; + if (FrameID != other.FrameID) return false; + if (RawBitmap != other.RawBitmap) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (RoomID != 0) hash ^= RoomID.GetHashCode(); + if (FrameID != 0) hash ^= FrameID.GetHashCode(); + if (RawBitmap.Length != 0) hash ^= RawBitmap.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (FrameID != 0) { + output.WriteRawTag(16); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(26); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (FrameID != 0) { + output.WriteRawTag(16); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(26); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (RoomID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RoomID); + } + if (FrameID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(FrameID); + } + if (RawBitmap.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(RawBitmap); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Room_Get_Screen_RESP other) { + if (other == null) { + return; + } + if (other.RoomID != 0) { + RoomID = other.RoomID; + } + if (other.FrameID != 0) { + FrameID = other.FrameID; + } + if (other.RawBitmap.Length != 0) { + RawBitmap = other.RawBitmap; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + case 16: { + FrameID = input.ReadInt32(); + break; + } + case 26: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + case 16: { + FrameID = input.ReadInt32(); + break; + } + case 26: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + } + #endif + + } + #endregion } diff --git a/AxibugEmuOnline.Server/Manager/RoomManager.cs b/AxibugEmuOnline.Server/Manager/RoomManager.cs index 466bcd5..cdcca5a 100644 --- a/AxibugEmuOnline.Server/Manager/RoomManager.cs +++ b/AxibugEmuOnline.Server/Manager/RoomManager.cs @@ -20,6 +20,7 @@ namespace AxibugEmuOnline.Server public RoomManager() { NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomList, OnCmdRoomList); + NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomGetScreen, CmdRoomGetScreen); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomCreate, OnCmdRoomCreate); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomJoin, OnCmdRoomJoin); NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdRoomLeave, OnCmdRoomLeave); @@ -132,6 +133,27 @@ namespace AxibugEmuOnline.Server resp.RoomMiniInfoList.Add(GetProtoDataRoom(room)); AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdChatmsg, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); } + public void CmdRoomGetScreen(Socket sk, byte[] reqData) + { + AppSrv.g_Log.Debug($"OnCmdRoomList "); + ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(sk); + Protobuf_Room_Get_Screen msg = ProtoBufHelper.DeSerizlize(reqData); + + Data_RoomData room = GetRoomData(_c.RoomState.RoomID); + bool bHadRoomStateChange = false; + ErrorCode Errcode = ErrorCode.ErrorOk; + Protobuf_Room_Get_Screen_RESP resp = new Protobuf_Room_Get_Screen_RESP(); + if (room == null) + Errcode = ErrorCode.ErrorRoomNotFound; + else + { + resp.FrameID = (int)room.mCurrFrameId; + resp.RoomID = room.RoomID; + resp.RawBitmap = room.ScreenRaw; + } + + AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdRoomGetScreen, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(resp)); + } /// /// diff --git a/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs index 6c6329c..d8b8324 100644 --- a/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs +++ b/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs @@ -71,26 +71,30 @@ namespace AxibugProtobuf { "KAwiPwonUHJvdG9idWZfUm9vbV9Ib3N0UGxheWVyX1VwZGF0ZVN0YXRlUmF3", "EhQKDExvYWRTdGF0ZVJhdxgBIAEoDCIuCixQcm90b2J1Zl9Sb29tX0hvc3RQ", "bGF5ZXJfVXBkYXRlU3RhdGVSYXdfUkVTUCIcChpQcm90b2J1Zl9Sb29tX1Bs", - "YXllcl9SZWFkeSqaAwoJQ29tbWFuZElEEg4KCkNNRF9ERUZBVUwQABIMCghD", - "TURfUElORxABEgwKCENNRF9QT05HEAISDgoJQ01EX0xPR0lOENEPEhAKC0NN", - "RF9DSEFUTVNHEKEfEhIKDUNNRF9Sb29tX0xpc3QQiScSGQoUQ01EX1Jvb21f", - "TGlzdF9VcGRhdGUQiicSFAoPQ01EX1Jvb21fQ3JlYXRlEO0nEhIKDUNNRF9S", - "b29tX0pvaW4Q8ScSEwoOQ01EX1Jvb21fTGVhdmUQ8icSIgodQ01EX1Jvb21f", - "TXlSb29tX1N0YXRlX0NoYW5nZWQQ9icSFgoRQ01EX1Jvb21fV2FpdFN0ZXAQ", - "0SgSJwoiQ01EX1Jvb21fSG9zdFBsYXllcl9VcGRhdGVTdGF0ZVJhdxDUKBIa", - "ChVDTURfUm9vbV9QbGF5ZXJfUmVhZHkQ2CgSIAobQ01EX1Jvb21fU2luZ2Vs", - "X1BsYXllcklucHV0EPouEh0KGENNRF9ST09NX1NZTl9QbGF5ZXJJbnB1dBD/", - "LhIPCgpDTURfU2NyZWVuENk2Ko8BCglFcnJvckNvZGUSEAoMRVJST1JfREVG", - "QVVMEAASDAoIRVJST1JfT0sQARIYChRFUlJPUl9ST09NX05PVF9GT1VORBAK", - "EiUKIUVSUk9SX1JPT01fU0xPVF9SRUFETFlfSEFEX1BMQVlFUhALEiEKHUVS", - "Uk9SX1JPT01fQ0FOVF9ET19DVVJSX1NUQVRFEDIqHAoJTG9naW5UeXBlEg8K", - "C0Jhc2VEZWZhdWx0EAAqSwoKRGV2aWNlVHlwZRIWChJEZXZpY2VUeXBlX0Rl", - "ZmF1bHQQABIGCgJQQxABEgsKB0FuZHJvaWQQAhIHCgNJT1MQAxIHCgNQU1YQ", - "BCpwCg1Sb29tR2FtZVN0YXRlEhIKDk5vbmVfR2FtZVN0YXRlEAASDAoIT25s", - "eUhvc3QQARIRCg1XYWl0UmF3VXBkYXRlEAISDQoJV2FpdFJlYWR5EAMSCQoF", - "UGF1c2UQBBIQCgxJbk9ubGluZUdhbWUQBSpOChFMb2dpblJlc3VsdFN0YXR1", - "cxIhCh1Mb2dpblJlc3VsdFN0YXR1c19CYXNlRGVmYXVsdBAAEgYKAk9LEAES", - "DgoKQWNjb3VudEVychACQgJIAWIGcHJvdG8z")); + "YXllcl9SZWFkeSIqChhQcm90b2J1Zl9Sb29tX0dldF9TY3JlZW4SDgoGUm9v", + "bUlEGAEgASgFIlMKHVByb3RvYnVmX1Jvb21fR2V0X1NjcmVlbl9SRVNQEg4K", + "BlJvb21JRBgBIAEoBRIPCgdGcmFtZUlEGAIgASgFEhEKCVJhd0JpdG1hcBgD", + "IAEoDCq0AwoJQ29tbWFuZElEEg4KCkNNRF9ERUZBVUwQABIMCghDTURfUElO", + "RxABEgwKCENNRF9QT05HEAISDgoJQ01EX0xPR0lOENEPEhAKC0NNRF9DSEFU", + "TVNHEKEfEhIKDUNNRF9Sb29tX0xpc3QQiScSGQoUQ01EX1Jvb21fTGlzdF9V", + "cGRhdGUQiicSGAoTQ01EX1Jvb21fR2V0X1NjcmVlbhCTJxIUCg9DTURfUm9v", + "bV9DcmVhdGUQ7ScSEgoNQ01EX1Jvb21fSm9pbhDxJxITCg5DTURfUm9vbV9M", + "ZWF2ZRDyJxIiCh1DTURfUm9vbV9NeVJvb21fU3RhdGVfQ2hhbmdlZBD2JxIW", + "ChFDTURfUm9vbV9XYWl0U3RlcBDRKBInCiJDTURfUm9vbV9Ib3N0UGxheWVy", + "X1VwZGF0ZVN0YXRlUmF3ENQoEhoKFUNNRF9Sb29tX1BsYXllcl9SZWFkeRDY", + "KBIgChtDTURfUm9vbV9TaW5nZWxfUGxheWVySW5wdXQQ+i4SHQoYQ01EX1JP", + "T01fU1lOX1BsYXllcklucHV0EP8uEg8KCkNNRF9TY3JlZW4Q2TYqjwEKCUVy", + "cm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJPUl9PSxABEhgKFEVS", + "Uk9SX1JPT01fTk9UX0ZPVU5EEAoSJQohRVJST1JfUk9PTV9TTE9UX1JFQURM", + "WV9IQURfUExBWUVSEAsSIQodRVJST1JfUk9PTV9DQU5UX0RPX0NVUlJfU1RB", + "VEUQMiocCglMb2dpblR5cGUSDwoLQmFzZURlZmF1bHQQACpLCgpEZXZpY2VU", + "eXBlEhYKEkRldmljZVR5cGVfRGVmYXVsdBAAEgYKAlBDEAESCwoHQW5kcm9p", + "ZBACEgcKA0lPUxADEgcKA1BTVhAEKnAKDVJvb21HYW1lU3RhdGUSEgoOTm9u", + "ZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRSYXdVcGRhdGUQ", + "AhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25saW5lR2FtZRAF", + "Kk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0U3RhdHVzX0Jh", + "c2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJCAkgBYgZwcm90", + "bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -117,7 +121,9 @@ namespace AxibugProtobuf { new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_WaitStep_RESP), global::AxibugProtobuf.Protobuf_Room_WaitStep_RESP.Parser, new[]{ "WaitStep", "LoadStateRaw" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw), global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw.Parser, new[]{ "LoadStateRaw" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw_RESP), global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw_RESP.Parser, null, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Player_Ready), global::AxibugProtobuf.Protobuf_Room_Player_Ready.Parser, null, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Player_Ready), global::AxibugProtobuf.Protobuf_Room_Player_Ready.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Get_Screen), global::AxibugProtobuf.Protobuf_Room_Get_Screen.Parser, new[]{ "RoomID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Get_Screen_RESP), global::AxibugProtobuf.Protobuf_Room_Get_Screen_RESP.Parser, new[]{ "RoomID", "FrameID", "RawBitmap" }, null, null, null, null) })); } #endregion @@ -154,6 +160,10 @@ namespace AxibugProtobuf { /// [pbr::OriginalName("CMD_Room_List_Update")] CmdRoomListUpdate = 5002, /// + ///房间列表 上行 | 下行 对应 Protobuf_Room_Get_Screen | Protobuf_Room_Get_Screen_RESP + /// + [pbr::OriginalName("CMD_Room_Get_Screen")] CmdRoomGetScreen = 5011, + /// ///房间内相关 /// [pbr::OriginalName("CMD_Room_Create")] CmdRoomCreate = 5101, @@ -180,7 +190,7 @@ namespace AxibugProtobuf { /// 主机玩家 上行 CMD_Room_HostPlayer_UpdateStateRaw消息,上传即时存档 /// 主机玩家上传完毕之后,服务器会通知进入Step1 /// - /// Step1:服务器广播"等待-全员加载即时存档" CMD_Room_WaitStep WaitStep=[1] 附带即时存档 ---> 客户端:全员等待(主机玩家一人上传) + /// Step1:服务器广播"等待-全员加载即时存档" CMD_Room_WaitStep WaitStep=[1] 附带即时存档 ---> 客户端:全员等待 /// 所有玩家确保加载ROM和即时存档,并保持模拟器暂停,准备完毕后 发送 CMD_Room_Player_Ready /// 所有玩家Ready之后,服务器会根据所有玩家延迟提前跑若干Frame,通知进入Step2 /// @@ -5727,6 +5737,434 @@ namespace AxibugProtobuf { } + public sealed partial class Protobuf_Room_Get_Screen : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Room_Get_Screen()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[24]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen(Protobuf_Room_Get_Screen other) : this() { + roomID_ = other.roomID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen Clone() { + return new Protobuf_Room_Get_Screen(this); + } + + /// Field number for the "RoomID" field. + public const int RoomIDFieldNumber = 1; + private int roomID_; + /// + ///房间ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int RoomID { + get { return roomID_; } + set { + roomID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Room_Get_Screen); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Room_Get_Screen other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RoomID != other.RoomID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (RoomID != 0) hash ^= RoomID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (RoomID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RoomID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Room_Get_Screen other) { + if (other == null) { + return; + } + if (other.RoomID != 0) { + RoomID = other.RoomID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + public sealed partial class Protobuf_Room_Get_Screen_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Room_Get_Screen_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[25]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP(Protobuf_Room_Get_Screen_RESP other) : this() { + roomID_ = other.roomID_; + frameID_ = other.frameID_; + rawBitmap_ = other.rawBitmap_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP Clone() { + return new Protobuf_Room_Get_Screen_RESP(this); + } + + /// Field number for the "RoomID" field. + public const int RoomIDFieldNumber = 1; + private int roomID_; + /// + ///房间ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int RoomID { + get { return roomID_; } + set { + roomID_ = value; + } + } + + /// Field number for the "FrameID" field. + public const int FrameIDFieldNumber = 2; + private int frameID_; + /// + ///帧编号 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int FrameID { + get { return frameID_; } + set { + frameID_ = value; + } + } + + /// Field number for the "RawBitmap" field. + public const int RawBitmapFieldNumber = 3; + private pb::ByteString rawBitmap_ = pb::ByteString.Empty; + /// + ///渲染层画面 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pb::ByteString RawBitmap { + get { return rawBitmap_; } + set { + rawBitmap_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Room_Get_Screen_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Room_Get_Screen_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RoomID != other.RoomID) return false; + if (FrameID != other.FrameID) return false; + if (RawBitmap != other.RawBitmap) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (RoomID != 0) hash ^= RoomID.GetHashCode(); + if (FrameID != 0) hash ^= FrameID.GetHashCode(); + if (RawBitmap.Length != 0) hash ^= RawBitmap.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (FrameID != 0) { + output.WriteRawTag(16); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(26); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (FrameID != 0) { + output.WriteRawTag(16); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(26); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (RoomID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RoomID); + } + if (FrameID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(FrameID); + } + if (RawBitmap.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(RawBitmap); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Room_Get_Screen_RESP other) { + if (other == null) { + return; + } + if (other.RoomID != 0) { + RoomID = other.RoomID; + } + if (other.FrameID != 0) { + FrameID = other.FrameID; + } + if (other.RawBitmap.Length != 0) { + RawBitmap = other.RawBitmap; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + case 16: { + FrameID = input.ReadInt32(); + break; + } + case 26: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + case 16: { + FrameID = input.ReadInt32(); + break; + } + case 26: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + } + #endif + + } + #endregion } diff --git a/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs b/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs index 6c6329c..d8b8324 100644 --- a/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs +++ b/ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs @@ -71,26 +71,30 @@ namespace AxibugProtobuf { "KAwiPwonUHJvdG9idWZfUm9vbV9Ib3N0UGxheWVyX1VwZGF0ZVN0YXRlUmF3", "EhQKDExvYWRTdGF0ZVJhdxgBIAEoDCIuCixQcm90b2J1Zl9Sb29tX0hvc3RQ", "bGF5ZXJfVXBkYXRlU3RhdGVSYXdfUkVTUCIcChpQcm90b2J1Zl9Sb29tX1Bs", - "YXllcl9SZWFkeSqaAwoJQ29tbWFuZElEEg4KCkNNRF9ERUZBVUwQABIMCghD", - "TURfUElORxABEgwKCENNRF9QT05HEAISDgoJQ01EX0xPR0lOENEPEhAKC0NN", - "RF9DSEFUTVNHEKEfEhIKDUNNRF9Sb29tX0xpc3QQiScSGQoUQ01EX1Jvb21f", - "TGlzdF9VcGRhdGUQiicSFAoPQ01EX1Jvb21fQ3JlYXRlEO0nEhIKDUNNRF9S", - "b29tX0pvaW4Q8ScSEwoOQ01EX1Jvb21fTGVhdmUQ8icSIgodQ01EX1Jvb21f", - "TXlSb29tX1N0YXRlX0NoYW5nZWQQ9icSFgoRQ01EX1Jvb21fV2FpdFN0ZXAQ", - "0SgSJwoiQ01EX1Jvb21fSG9zdFBsYXllcl9VcGRhdGVTdGF0ZVJhdxDUKBIa", - "ChVDTURfUm9vbV9QbGF5ZXJfUmVhZHkQ2CgSIAobQ01EX1Jvb21fU2luZ2Vs", - "X1BsYXllcklucHV0EPouEh0KGENNRF9ST09NX1NZTl9QbGF5ZXJJbnB1dBD/", - "LhIPCgpDTURfU2NyZWVuENk2Ko8BCglFcnJvckNvZGUSEAoMRVJST1JfREVG", - "QVVMEAASDAoIRVJST1JfT0sQARIYChRFUlJPUl9ST09NX05PVF9GT1VORBAK", - "EiUKIUVSUk9SX1JPT01fU0xPVF9SRUFETFlfSEFEX1BMQVlFUhALEiEKHUVS", - "Uk9SX1JPT01fQ0FOVF9ET19DVVJSX1NUQVRFEDIqHAoJTG9naW5UeXBlEg8K", - "C0Jhc2VEZWZhdWx0EAAqSwoKRGV2aWNlVHlwZRIWChJEZXZpY2VUeXBlX0Rl", - "ZmF1bHQQABIGCgJQQxABEgsKB0FuZHJvaWQQAhIHCgNJT1MQAxIHCgNQU1YQ", - "BCpwCg1Sb29tR2FtZVN0YXRlEhIKDk5vbmVfR2FtZVN0YXRlEAASDAoIT25s", - "eUhvc3QQARIRCg1XYWl0UmF3VXBkYXRlEAISDQoJV2FpdFJlYWR5EAMSCQoF", - "UGF1c2UQBBIQCgxJbk9ubGluZUdhbWUQBSpOChFMb2dpblJlc3VsdFN0YXR1", - "cxIhCh1Mb2dpblJlc3VsdFN0YXR1c19CYXNlRGVmYXVsdBAAEgYKAk9LEAES", - "DgoKQWNjb3VudEVychACQgJIAWIGcHJvdG8z")); + "YXllcl9SZWFkeSIqChhQcm90b2J1Zl9Sb29tX0dldF9TY3JlZW4SDgoGUm9v", + "bUlEGAEgASgFIlMKHVByb3RvYnVmX1Jvb21fR2V0X1NjcmVlbl9SRVNQEg4K", + "BlJvb21JRBgBIAEoBRIPCgdGcmFtZUlEGAIgASgFEhEKCVJhd0JpdG1hcBgD", + "IAEoDCq0AwoJQ29tbWFuZElEEg4KCkNNRF9ERUZBVUwQABIMCghDTURfUElO", + "RxABEgwKCENNRF9QT05HEAISDgoJQ01EX0xPR0lOENEPEhAKC0NNRF9DSEFU", + "TVNHEKEfEhIKDUNNRF9Sb29tX0xpc3QQiScSGQoUQ01EX1Jvb21fTGlzdF9V", + "cGRhdGUQiicSGAoTQ01EX1Jvb21fR2V0X1NjcmVlbhCTJxIUCg9DTURfUm9v", + "bV9DcmVhdGUQ7ScSEgoNQ01EX1Jvb21fSm9pbhDxJxITCg5DTURfUm9vbV9M", + "ZWF2ZRDyJxIiCh1DTURfUm9vbV9NeVJvb21fU3RhdGVfQ2hhbmdlZBD2JxIW", + "ChFDTURfUm9vbV9XYWl0U3RlcBDRKBInCiJDTURfUm9vbV9Ib3N0UGxheWVy", + "X1VwZGF0ZVN0YXRlUmF3ENQoEhoKFUNNRF9Sb29tX1BsYXllcl9SZWFkeRDY", + "KBIgChtDTURfUm9vbV9TaW5nZWxfUGxheWVySW5wdXQQ+i4SHQoYQ01EX1JP", + "T01fU1lOX1BsYXllcklucHV0EP8uEg8KCkNNRF9TY3JlZW4Q2TYqjwEKCUVy", + "cm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJPUl9PSxABEhgKFEVS", + "Uk9SX1JPT01fTk9UX0ZPVU5EEAoSJQohRVJST1JfUk9PTV9TTE9UX1JFQURM", + "WV9IQURfUExBWUVSEAsSIQodRVJST1JfUk9PTV9DQU5UX0RPX0NVUlJfU1RB", + "VEUQMiocCglMb2dpblR5cGUSDwoLQmFzZURlZmF1bHQQACpLCgpEZXZpY2VU", + "eXBlEhYKEkRldmljZVR5cGVfRGVmYXVsdBAAEgYKAlBDEAESCwoHQW5kcm9p", + "ZBACEgcKA0lPUxADEgcKA1BTVhAEKnAKDVJvb21HYW1lU3RhdGUSEgoOTm9u", + "ZV9HYW1lU3RhdGUQABIMCghPbmx5SG9zdBABEhEKDVdhaXRSYXdVcGRhdGUQ", + "AhINCglXYWl0UmVhZHkQAxIJCgVQYXVzZRAEEhAKDEluT25saW5lR2FtZRAF", + "Kk4KEUxvZ2luUmVzdWx0U3RhdHVzEiEKHUxvZ2luUmVzdWx0U3RhdHVzX0Jh", + "c2VEZWZhdWx0EAASBgoCT0sQARIOCgpBY2NvdW50RXJyEAJCAkgBYgZwcm90", + "bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.RoomGameState), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -117,7 +121,9 @@ namespace AxibugProtobuf { new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_WaitStep_RESP), global::AxibugProtobuf.Protobuf_Room_WaitStep_RESP.Parser, new[]{ "WaitStep", "LoadStateRaw" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw), global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw.Parser, new[]{ "LoadStateRaw" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw_RESP), global::AxibugProtobuf.Protobuf_Room_HostPlayer_UpdateStateRaw_RESP.Parser, null, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Player_Ready), global::AxibugProtobuf.Protobuf_Room_Player_Ready.Parser, null, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Player_Ready), global::AxibugProtobuf.Protobuf_Room_Player_Ready.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Get_Screen), global::AxibugProtobuf.Protobuf_Room_Get_Screen.Parser, new[]{ "RoomID" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Room_Get_Screen_RESP), global::AxibugProtobuf.Protobuf_Room_Get_Screen_RESP.Parser, new[]{ "RoomID", "FrameID", "RawBitmap" }, null, null, null, null) })); } #endregion @@ -154,6 +160,10 @@ namespace AxibugProtobuf { /// [pbr::OriginalName("CMD_Room_List_Update")] CmdRoomListUpdate = 5002, /// + ///房间列表 上行 | 下行 对应 Protobuf_Room_Get_Screen | Protobuf_Room_Get_Screen_RESP + /// + [pbr::OriginalName("CMD_Room_Get_Screen")] CmdRoomGetScreen = 5011, + /// ///房间内相关 /// [pbr::OriginalName("CMD_Room_Create")] CmdRoomCreate = 5101, @@ -180,7 +190,7 @@ namespace AxibugProtobuf { /// 主机玩家 上行 CMD_Room_HostPlayer_UpdateStateRaw消息,上传即时存档 /// 主机玩家上传完毕之后,服务器会通知进入Step1 /// - /// Step1:服务器广播"等待-全员加载即时存档" CMD_Room_WaitStep WaitStep=[1] 附带即时存档 ---> 客户端:全员等待(主机玩家一人上传) + /// Step1:服务器广播"等待-全员加载即时存档" CMD_Room_WaitStep WaitStep=[1] 附带即时存档 ---> 客户端:全员等待 /// 所有玩家确保加载ROM和即时存档,并保持模拟器暂停,准备完毕后 发送 CMD_Room_Player_Ready /// 所有玩家Ready之后,服务器会根据所有玩家延迟提前跑若干Frame,通知进入Step2 /// @@ -5727,6 +5737,434 @@ namespace AxibugProtobuf { } + public sealed partial class Protobuf_Room_Get_Screen : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Room_Get_Screen()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[24]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen(Protobuf_Room_Get_Screen other) : this() { + roomID_ = other.roomID_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen Clone() { + return new Protobuf_Room_Get_Screen(this); + } + + /// Field number for the "RoomID" field. + public const int RoomIDFieldNumber = 1; + private int roomID_; + /// + ///房间ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int RoomID { + get { return roomID_; } + set { + roomID_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Room_Get_Screen); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Room_Get_Screen other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RoomID != other.RoomID) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (RoomID != 0) hash ^= RoomID.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (RoomID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RoomID); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Room_Get_Screen other) { + if (other == null) { + return; + } + if (other.RoomID != 0) { + RoomID = other.RoomID; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + } + } + } + #endif + + } + + public sealed partial class Protobuf_Room_Get_Screen_RESP : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Room_Get_Screen_RESP()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[25]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP(Protobuf_Room_Get_Screen_RESP other) : this() { + roomID_ = other.roomID_; + frameID_ = other.frameID_; + rawBitmap_ = other.rawBitmap_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Protobuf_Room_Get_Screen_RESP Clone() { + return new Protobuf_Room_Get_Screen_RESP(this); + } + + /// Field number for the "RoomID" field. + public const int RoomIDFieldNumber = 1; + private int roomID_; + /// + ///房间ID + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int RoomID { + get { return roomID_; } + set { + roomID_ = value; + } + } + + /// Field number for the "FrameID" field. + public const int FrameIDFieldNumber = 2; + private int frameID_; + /// + ///帧编号 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int FrameID { + get { return frameID_; } + set { + frameID_ = value; + } + } + + /// Field number for the "RawBitmap" field. + public const int RawBitmapFieldNumber = 3; + private pb::ByteString rawBitmap_ = pb::ByteString.Empty; + /// + ///渲染层画面 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pb::ByteString RawBitmap { + get { return rawBitmap_; } + set { + rawBitmap_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Protobuf_Room_Get_Screen_RESP); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Protobuf_Room_Get_Screen_RESP other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (RoomID != other.RoomID) return false; + if (FrameID != other.FrameID) return false; + if (RawBitmap != other.RawBitmap) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (RoomID != 0) hash ^= RoomID.GetHashCode(); + if (FrameID != 0) hash ^= FrameID.GetHashCode(); + if (RawBitmap.Length != 0) hash ^= RawBitmap.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (FrameID != 0) { + output.WriteRawTag(16); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(26); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (RoomID != 0) { + output.WriteRawTag(8); + output.WriteInt32(RoomID); + } + if (FrameID != 0) { + output.WriteRawTag(16); + output.WriteInt32(FrameID); + } + if (RawBitmap.Length != 0) { + output.WriteRawTag(26); + output.WriteBytes(RawBitmap); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (RoomID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(RoomID); + } + if (FrameID != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(FrameID); + } + if (RawBitmap.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(RawBitmap); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Protobuf_Room_Get_Screen_RESP other) { + if (other == null) { + return; + } + if (other.RoomID != 0) { + RoomID = other.RoomID; + } + if (other.FrameID != 0) { + FrameID = other.FrameID; + } + if (other.RawBitmap.Length != 0) { + RawBitmap = other.RawBitmap; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + case 16: { + FrameID = input.ReadInt32(); + break; + } + case 26: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: { + RoomID = input.ReadInt32(); + break; + } + case 16: { + FrameID = input.ReadInt32(); + break; + } + case 26: { + RawBitmap = input.ReadBytes(); + break; + } + } + } + } + #endif + + } + #endregion } diff --git a/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto b/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto index 4eb8666..e9a8684 100644 --- a/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto +++ b/ProtobufCore/proto/protobuf_AxibugEmuOnline.proto @@ -17,6 +17,7 @@ enum CommandID //房间列表相关(仅用于列表显示) CMD_Room_List = 5001; //房间列表 上行 | 下行 对应 Protobuf_Room_List | Protobuf_Room_List_RESP CMD_Room_List_Update = 5002; //房间单个房间信息更新 对应 Protobuf_Room_Update_RESP + CMD_Room_Get_Screen = 5011; //房间列表 上行 | 下行 对应 Protobuf_Room_Get_Screen | Protobuf_Room_Get_Screen_RESP //房间内相关 CMD_Room_Create = 5101; //房间创建 对应 Protobuf_Room_Create | Protobuf_Room_Create_RESP @@ -263,4 +264,16 @@ message Protobuf_Room_HostPlayer_UpdateStateRaw_RESP message Protobuf_Room_Player_Ready { +} + +message Protobuf_Room_Get_Screen +{ + int32 RoomID = 1;//房间ID +} + +message Protobuf_Room_Get_Screen_RESP +{ + int32 RoomID = 1;//房间ID + int32 FrameID = 2;//帧编号 + bytes RawBitmap = 3;//渲染层画面 } \ No newline at end of file From 935518a2e17f5c62a699bde8fc81df2d61e7ad40 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Wed, 18 Sep 2024 10:44:41 +0800 Subject: [PATCH 2/2] png --- ...rnv8n-3154a6d3b50ff6eed3c3a4b9a344e4bf.png | Bin 6040 -> 8006 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/buv41s4ubh6tq9gb44r7hrnv8n-3154a6d3b50ff6eed3c3a4b9a344e4bf.png b/AxibugEmuOnline.Client/Assets/Resources/Icons/XMB-Icons/buv41s4ubh6tq9gb44r7hrnv8n-3154a6d3b50ff6eed3c3a4b9a344e4bf.png index 8d1715de46f21d6f34a5fff3caf8f220c908a943..474c7297964278da7530b16b1437a269f9efa5cb 100644 GIT binary patch literal 8006 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 Owl=pldwS~1wf_fsQ@O1G literal 6040 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