private void Server_OnReceivePackageEvent(int id, int signal, byte[] buffer, object userToken) { if (userToken is LinkedListNode <UserInfo> userInfoNode) { UserInfo userInfo = userInfoNode.Value; userInfo.LastReceiveTime = DateTime.Now; int startIndex = 0; byte[] data; switch (signal) { case 0: int line = CCSerializeTool.ByteToInt(buffer, ref startIndex); lock (gameData) { int i = 0; for (; i < gameData.Count; i++) { if (line == gameData[i].Line) { if (userInfo.Line != i) { gameData[userInfo.Line].ClientInfoLock.EnterWriteLock(); try { gameData[userInfo.Line].ClientInfo.Remove(userInfoNode); } finally { gameData[userInfo.Line].ClientInfoLock.ExitWriteLock(); } userInfo.Line = i; gameData[userInfo.Line].ClientInfoLock.EnterWriteLock(); try { gameData[userInfo.Line].ClientInfo.AddLast(userInfoNode); } finally { gameData[userInfo.Line].ClientInfoLock.ExitWriteLock(); } } break; } } if (i == gameData.Count) { gameData.Add(new GameData() { Line = line }); gameData[userInfo.Line].ClientInfoLock.EnterWriteLock(); try { gameData[userInfo.Line].ClientInfo.Remove(userInfoNode); } finally { gameData[userInfo.Line].ClientInfoLock.ExitWriteLock(); } userInfo.Line = i; gameData[userInfo.Line].ClientInfoLock.EnterWriteLock(); try { gameData[userInfo.Line].ClientInfo.AddLast(userInfoNode); } finally { gameData[userInfo.Line].ClientInfoLock.ExitWriteLock(); } } } userInfo.MachineIdentity = CCSerializeTool.ByteToString(buffer, ref startIndex); userInfo.GamePath = CCSerializeTool.ByteToString(buffer, ref startIndex); lock (sendData) { sendData.Clear(); CCSerializeTool.IntToByteList(userInfo.Id, sendData); CCSerializeTool.StringToByteList(gameData[userInfo.Line].No1Qin, sendData); CCSerializeTool.StringToByteList(gameData[userInfo.Line].No2Qin, sendData); CCSerializeTool.StringToByteList(gameData[userInfo.Line].No3Qin, sendData); CCSerializeTool.StringToByteList(gameData[userInfo.Line].No4Qin, sendData); for (int i = 0; i < gameData[userInfo.Line].QinKey.Count; i++) { CCSerializeTool.IntToByteList(gameData[userInfo.Line].QinKey[i], sendData); } sendData.AddRange(gameData[userInfo.Line].HitQinKey); server.SendPackage(id, 0, sendData.ToArray()); } break; case 1: if (userInfo.GamePath.Equals("") || userInfo.MachineIdentity.Equals("")) { server.SendPackage(id, 4, buffer); } else { server.SendPackage(id, 1, buffer); } break; case 2: gameData[userInfo.Line].No1Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData[userInfo.Line].ClientInfoLock.EnterReadLock(); try { foreach (UserInfo tempUserInfo in gameData[userInfo.Line].ClientInfo) { if (tempUserInfo.Id != id) { server.SendPackage(tempUserInfo.Id, 5, buffer); } } } finally { gameData[userInfo.Line].ClientInfoLock.ExitReadLock(); } GenerateLog(userInfo.Line, userInfo.Remark + " 修改一号琴缺弦为:" + gameData[userInfo.Line].No1Qin); break; case 3: gameData[userInfo.Line].No2Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData[userInfo.Line].ClientInfoLock.EnterReadLock(); try { foreach (UserInfo tempUserInfo in gameData[userInfo.Line].ClientInfo) { if (tempUserInfo.Id != id) { server.SendPackage(tempUserInfo.Id, 6, buffer); } } } finally { gameData[userInfo.Line].ClientInfoLock.ExitReadLock(); } GenerateLog(userInfo.Line, userInfo.Remark + " 修改二号琴缺弦为:" + gameData[userInfo.Line].No2Qin); break; case 4: gameData[userInfo.Line].No3Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData[userInfo.Line].ClientInfoLock.EnterReadLock(); try { foreach (UserInfo tempUserInfo in gameData[userInfo.Line].ClientInfo) { if (tempUserInfo.Id != id) { server.SendPackage(tempUserInfo.Id, 7, buffer); } } } finally { gameData[userInfo.Line].ClientInfoLock.ExitReadLock(); } GenerateLog(userInfo.Line, userInfo.Remark + " 修改三号琴缺弦为:" + gameData[userInfo.Line].No3Qin); break; case 5: gameData[userInfo.Line].No4Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData[userInfo.Line].ClientInfoLock.EnterReadLock(); try { foreach (UserInfo tempUserInfo in gameData[userInfo.Line].ClientInfo) { if (tempUserInfo.Id != id) { server.SendPackage(tempUserInfo.Id, 8, buffer); } } } finally { gameData[userInfo.Line].ClientInfoLock.ExitReadLock(); } GenerateLog(userInfo.Line, userInfo.Remark + " 修改四号琴缺弦为:" + gameData[userInfo.Line].No4Qin); break; case 6: lock (sendData) { sendData.Clear(); int keyIndex = CCSerializeTool.ByteToInt(buffer, ref startIndex); for (int i = 0; i < gameData[userInfo.Line].QinKey.Count; i++) { if (i != keyIndex) { if (gameData[userInfo.Line].QinKey[i] == userInfo.Id) { gameData[userInfo.Line].QinKey[i] = 0; } } else { if (gameData[userInfo.Line].QinKey[i] == 0) { gameData[userInfo.Line].QinKey[i] = userInfo.Id; GenerateLog(userInfo.Line, userInfo.Remark + " 补 " + keyIndex.ToString() + " 琴弦。"); } else if (gameData[userInfo.Line].QinKey[i] == userInfo.Id) { gameData[userInfo.Line].QinKey[i] = 0; GenerateLog(userInfo.Line, userInfo.Remark + " 放弃补 " + keyIndex.ToString() + " 琴弦。"); } else { GenerateLog(userInfo.Line, userInfo.Remark + " 尝试补 " + keyIndex.ToString() + " 琴弦但冲突。"); } } CCSerializeTool.IntToByteList(gameData[userInfo.Line].QinKey[i], sendData); } CCSerializeTool.IntToByteList(keyIndex, sendData); data = sendData.ToArray(); } gameData[userInfo.Line].ClientInfoLock.EnterReadLock(); try { foreach (UserInfo tempUserInfo in gameData[userInfo.Line].ClientInfo) { if (tempUserInfo.Id != id) { server.SendPackage(tempUserInfo.Id, 9, data, 0, 48); } else { server.SendPackage(tempUserInfo.Id, 10, data); } } } finally { gameData[userInfo.Line].ClientInfoLock.ExitReadLock(); } break; case 7: lock (sendData) { sendData.Clear(); int keyIndex = CCSerializeTool.ByteToInt(buffer, ref startIndex); for (int i = 0; i < gameData[userInfo.Line].QinKey.Count; i++) { if (i == keyIndex) { if (gameData[userInfo.Line].QinKey[i] == 0) { gameData[userInfo.Line].QinKey[i] = userInfo.Id; GenerateLog(userInfo.Line, userInfo.Remark + " 强制补 " + keyIndex.ToString() + " 琴弦。"); } else { gameData[userInfo.Line].QinKey[i] = 0; GenerateLog(userInfo.Line, userInfo.Remark + " 强制取消补 " + keyIndex.ToString() + " 琴弦。"); } } CCSerializeTool.IntToByteList(gameData[userInfo.Line].QinKey[i], sendData); } CCSerializeTool.IntToByteList(keyIndex, sendData); data = sendData.ToArray(); } gameData[userInfo.Line].ClientInfoLock.EnterReadLock(); try { foreach (UserInfo tempUserInfo in gameData[userInfo.Line].ClientInfo) { if (tempUserInfo.Id != id) { server.SendPackage(tempUserInfo.Id, 9, data, 0, 48); } else { server.SendPackage(tempUserInfo.Id, 10, data); } } } finally { gameData[userInfo.Line].ClientInfoLock.ExitReadLock(); } break; case 8: userInfo.MachineIdentity = CCSerializeTool.ByteToString(buffer, ref startIndex); userInfo.GamePath = CCSerializeTool.ByteToString(buffer, ref startIndex); break; default: break; } } }
private void Client_OnReceivePackageEvent(int signal, byte[] buffer) { string methodMD5 = "3C8905B3EE89BB1A"; try { log.Generate(methodMD5 + " 进入"); int startIndex = 0; int ping; switch (signal) { case 0: gameData.SendInfoSuccess = true; int licence = CCSerializeTool.ByteToInt(buffer, ref startIndex); if (!gameData.Licence.Contains(licence)) { gameData.Licence.Add(licence); } gameData.No1Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData.No2Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData.No3Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); gameData.No4Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); for (int i = 0; i < 12; i++) { gameData.QinKey[i] = CCSerializeTool.ByteToInt(buffer, ref startIndex); } gameData.QinKey = gameData.QinKey; for (int i = 0; i < gameData.HitQinKey.Length; i++) { gameData.HitQinKey[i] = buffer[startIndex++]; } gameData.HitQinKey = gameData.HitQinKey; pingTimer.Start(); break; case 1: ping = Environment.TickCount - CCSerializeTool.ByteToInt(buffer, ref startIndex); startPing = false; gameData.Ping = ping > 9999 ? 9999 : (ping < 0 ? 9999 : ping); break; case 2: for (int i = 0; i < gameData.HitQinKey.Length; i++) { gameData.HitQinKey[i] = buffer[startIndex++]; } gameData.HitQinKey = gameData.HitQinKey; break; case 3: gameData.Licence.Clear(); gameData.Licence.Add(CCSerializeTool.ByteToInt(buffer, ref startIndex)); gameData.No1Qin = gameData.No2Qin = gameData.No3Qin = gameData.No4Qin = ""; for (int i = 0; i < gameData.QinKey.Count; i++) { gameData.QinKey[i] = 0; } gameData.QinKey = gameData.QinKey; for (int i = 0; i < gameData.HitQinKey.Length; i++) { gameData.HitQinKey[i] = 0; } gameData.HitQinKey = gameData.HitQinKey; gameData.HitKeyIndex = 0; break; case 4: ping = Environment.TickCount - CCSerializeTool.ByteToInt(buffer, ref startIndex); startPing = false; gameData.Ping = ping > 9999 ? 9999 : (ping < 0 ? 9999 : ping); lock (sendData) { sendData.Clear(); sendData.AddRange(machineIdentity); CCSerializeTool.StringToByteList(CCProcessInfo.GetProcessPath(GetWuXiaProcess()), sendData); client.SendPackage(8, sendData.ToArray()); } break; case 5: gameData.No1Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); break; case 6: gameData.No2Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); break; case 7: gameData.No3Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); break; case 8: gameData.No4Qin = CCSerializeTool.ByteToString(buffer, ref startIndex); break; case 9: for (int i = 0; i < 12; i++) { gameData.QinKey[i] = CCSerializeTool.ByteToInt(buffer, ref startIndex); } gameData.QinKey = gameData.QinKey; break; case 10: for (int i = 0; i < 12; i++) { gameData.QinKey[i] = CCSerializeTool.ByteToInt(buffer, ref startIndex); } gameData.QinKey = gameData.QinKey; int keyIndex = CCSerializeTool.ByteToInt(buffer, ref startIndex); if (!gameData.Licence.Contains(gameData.QinKey[keyIndex])) { SystemSounds.Asterisk.Play(); Dispatcher.Invoke(() => { Storyboard Storyboard1 = FindResource("Storyboard1") as Storyboard; Storyboard1.Stop(); Storyboard.SetTargetName(Storyboard1, "OneKey" + keyIndex.ToString()); Storyboard1.Begin(); }); } break; default: break; } } catch (Exception exception) { log.Generate(methodMD5 + " 异常,异常信息:" + exception.Message); log.Flush(); throw; } finally { log.Generate(methodMD5 + " 退出"); } }