Ejemplo n.º 1
0
        private void SendBaseInfoTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            string methodMD5 = "B5BE9A7B29C08AD2";

            try {
                log.Generate(methodMD5 + " 进入");
                if (gameData.SendInfoSuccess)
                {
                    lock (sendData) {
                        sendData.Clear();
                        if (startPing == false)
                        {
                            lastPing  = Environment.TickCount;
                            startPing = true;
                            CCSerializeTool.IntToByteList(lastPing, sendData);
                        }
                        else
                        {
                            CCSerializeTool.IntToByteList(Environment.TickCount, sendData);
                        }
                        client.SendPackage(1, sendData.ToArray());
                    }
                }
                else
                {
                    lock (sendData) {
                        sendData.Clear();
                        CCSerializeTool.IntToByteList(gameData.Line, sendData);
                        sendData.AddRange(machineIdentity);
                        CCSerializeTool.StringToByteList(CCProcessInfo.GetProcessPath(GetWuXiaProcess()), sendData);
                        client.SendPackage(0, sendData.ToArray());
                    }
                }
                sendBaseInfoTimer.Start();
            } catch (Exception exception) {
                log.Generate(methodMD5 + " 异常,异常信息:" + exception.Message);
                log.Flush();
                throw;
            } finally {
                log.Generate(methodMD5 + " 退出");
            }
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        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 + " 退出");
            }
        }