public static byte[] HandleMessage(ClientInfo client, byte[] data) { Log.WriteLine(1, "[DO] Handling DO_MigrationMessage"); MemoryStream m = new MemoryStream(data); m.Seek(1, 0); ushort callID = Helper.ReadU16(m); DupObj from = new DupObj(Helper.ReadU32(m)); DupObj obj = new DupObj(Helper.ReadU32(m)); obj.Master = from; DupObj to = new DupObj(Helper.ReadU32(m)); DupObj fobj = DO_Session.FindObj(obj); if (fobj == null) { Log.WriteLine(1, "[DO] DupObj " + obj.getDesc() + " not found!", Color.Red); } else if (fobj.Master == (uint)to) { Log.WriteLine(1, "[DO] Master of DupObj " + fobj.getDesc() + " alread set, ignored!", Color.Orange); } else { fobj.Master = to; } List <byte[]> msgs = new List <byte[]>(); msgs.Add(DO_Outcome.Create(callID, 0x60001)); if (fobj != null && fobj.Class == DupObjClass.SES_cl_Player_NetZ && fobj.ID == 257 && !client.matchStartSent) { /* * msgs.Add(DO_RMCRequestMessage.Create(client.callCounterDO_RMC++, * 0x1006, * new DupObj(DupObjClass.Station, 1), * new DupObj(DupObjClass.SES_cl_Player_NetZ, 257), * (ushort)DO_RMCRequestMessage.DOC_METHOD.SetPlayerState, * new byte[] { 0x34, 0x12, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xC0, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } * )); * msgs.Add(DO_RMCRequestMessage.Create(client.callCounterDO_RMC++, * 0x1006, * new DupObj(DupObjClass.Station, 1), * new DupObj(DupObjClass.SES_cl_Player_NetZ, 257), * (ushort)DO_RMCRequestMessage.DOC_METHOD.SetPlayerRDVInfo, * new byte[] { 0x01, 0x00, 0x00, 0x00 } * )); */ SessionInfosParameter p = new SessionInfosParameter(); p.sParams.byte25 = 1; m = new MemoryStream(); m.WriteByte(2); //update Helper.WriteU32(m, new DupObj(DupObjClass.SES_cl_SessionInfos, 2)); m.WriteByte(2); //part p.toBuffer(m); msgs.Add(m.ToArray()); p.sParams.byte25 = 2; m = new MemoryStream(); m.WriteByte(2); //update Helper.WriteU32(m, new DupObj(DupObjClass.SES_cl_SessionInfos, 2)); m.WriteByte(2); //part p.toBuffer(m); msgs.Add(m.ToArray()); msgs.Add(DO_RMCRequestMessage.Create(client.callCounterDO_RMC++, 0x806, new DupObj(DupObjClass.Station, 1), new DupObj(DupObjClass.SES_cl_SessionInfos, 2), (ushort)DO_RMCRequestMessage.DOC_METHOD.OnStartMatch, new byte[] { } )); client.matchStartSent = true; } return(DO_BundleMessage.Create(client, msgs)); }
public static byte[] HandleMessage(ClientInfo client, QPacket p, byte[] data) { Log.WriteLine(1, "[DO] Handling DO_RMCRequestMessage..."); MemoryStream m = new MemoryStream(data); m.Seek(1, 0); ushort callID = Helper.ReadU16(m); uint flags = Helper.ReadU32(m); uint station = Helper.ReadU32(m); uint targetObject = Helper.ReadU32(m); DOC_METHOD method = (DOC_METHOD)Helper.ReadU16(m); Log.WriteLine(2, "[DO] RMC Call ID : 0x" + callID.ToString("X4")); Log.WriteLine(2, "[DO] RMC Call Flags : 0x" + flags.ToString("X8")); Log.WriteLine(2, "[DO] RMC Call Station : 0x" + station.ToString("X8")); Log.WriteLine(2, "[DO] RMC Call DupObj : 0x" + targetObject.ToString("X8") + " " + new DupObj(targetObject).getDesc()); byte[] buff; MemoryStream m2; List <byte[]> msgs; switch (method) { case DOC_METHOD.SyncRequest: Log.WriteLine(1, "[DO] Handling SyncRequest..."); ulong time = Helper.ReadU64(m); buff = Create(client.callCounterDO_RMC++, 0x83C, new DupObj(DupObjClass.Station, 1), new DupObj(DupObjClass.SessionClock, 1), 6, new Payload_SyncResponse(time).toBuffer()); m2 = new MemoryStream(); Helper.WriteU32(m2, (uint)buff.Length); m2.Write(buff, 0, buff.Length); m2.WriteByte((byte)QPacket.MakeChecksum(m2.ToArray(), 0)); p.payload = m2.ToArray(); p.payloadSize = (ushort)p.payload.Length; p.m_uiSignature = client.IDsend; DO.Send(p, client); return(null); case DOC_METHOD.RequestIDRangeFromMaster: Log.WriteLine(1, "[DO] Handling RequestIDRangeFromMaster..."); return(DO_RMCResponseMessage.Create(callID, 0x60001, new byte[] { 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00 })); case DOC_METHOD.IncreasePlayerNb: Log.WriteLine(1, "[DO] Handling IncreasePlayerNb..."); msgs = new List <byte[]>(); msgs.Add(new byte[] { 0x02, 0x02, 0x00, 0x40, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00 }); msgs.Add(DO_RMCResponseMessage.Create(callID, 0x60001, new byte[] { 0x00 })); return(DO_BundleMessage.Create(client, msgs)); case DOC_METHOD.AskForSettingPlayerParameters: Log.WriteLine(1, "[DO] Handling AskForSettingPlayerParameters..."); int len = (int)(data.Length - m.Position); buff = new byte[len]; m.Read(buff, 0, len); client.settings = buff; msgs = new List <byte[]>(); msgs.Add(DO_RMCRequestMessage.Create(client.callCounterDO_RMC++, 0x1006, new DupObj(DupObjClass.Station, 1), new DupObj(DupObjClass.SES_cl_Player_NetZ, 257), (ushort)DO_RMCRequestMessage.DOC_METHOD.SetPlayerParameters, client.settings )); msgs.Add(DO_RMCResponseMessage.Create(callID, 0x60001, new byte[] { 0x00 })); return(DO_BundleMessage.Create(client, msgs)); case DOC_METHOD.AskForSettingPlayerState: Log.WriteLine(1, "[DO] Handling AskForSettingPlayerState..."); msgs = new List <byte[]>(); msgs.Add(DO_RMCRequestMessage.Create(client.callCounterDO_RMC++, 0x1006, new DupObj(DupObjClass.Station, 1), new DupObj(DupObjClass.SES_cl_Player_NetZ, 257), (ushort)DO_RMCRequestMessage.DOC_METHOD.SetPlayerState, BitConverter.GetBytes(Helper.ReadU32(m)) )); msgs.Add(DO_RMCResponseMessage.Create(callID, 0x60001, new byte[] { 0x00 })); return(DO_BundleMessage.Create(client, msgs)); default: Log.WriteLine(1, "[DO] Error: Unhandled DOC method: " + method + "!"); return(null); } }