예제 #1
0
        protected override async Task ReceivedPacket(NetworkClient client, ConanPacket packet)
        {
            Logger.LogInformation($"Received opcode: {(GameServerOpcodes) packet.Opcode} ({packet.Opcode.ToHex()})");

            switch ((GameServerOpcodes)packet.Opcode)
            {
            case GameServerOpcodes.Hello:
            {
                //Resources.
                var clientInstance = packet.Data.ReadUInt32(); // 0x0802e5d4 0x1101b4f5
                var accountId      = packet.Data.ReadUInt32(); // 0x310cec57 0x2b68ea25=728295973
                var clientVersion  = packet.Data.ReadString();

                client.Account = await Database.GetAccount(accountId);

                client.Character = await Database.GetCharacter(clientInstance);

                await Database.UpdateClientInstance(client.Account, clientInstance);

                Logger.LogInformation($"Character: {clientInstance.ToHex()} with client Version: {clientVersion}");

                /*if (clientVersion != "v4.00.NoTS@369764")
                 * {
                 *  Logger.Info("Incompatible client connects to the Server");
                 *  //break;
                 * }*/

                //ReportDimensionId(client, client.Character.RealmId ?? throw new Exception()); // 1
                //ReportServerId(client, client.Character.RealmId ?? throw new Exception()); // 0x00000006
                //AckAuthentication(client, 1);

                foreach (var line in Resources.dumphex.Replace("\r", "").Split('\n'))
                {
                    var hex = line.Replace("|", "");
                    if (hex.Contains("# BIGBOY #"))
                    {
                        hex = Resources.bigboy.Replace("\r", "").Replace("\n", "");
                    }
                    //else if (line.Contains("MapChange"))
                    //   MapChange2(client);
                    else if (!hex.StartsWith("0x"))
                    {
                        continue;
                    }

                    var bytesLine = hex.Replace(",", "").Replace("0x", "").Replace(" ", "").HexToByteArray();

                    new PacketStream(bytesLine).Send(client);
                }

                //await DoTeleport(client, 500);

                break;
            }

            case GameServerOpcodes.Ox2000:
            {
                if (packet.SenderBytes[1] == 0x48)
                {
                    var sId1 = packet.Data.ReadUInt32();
                    var sId2 = packet.Data.ReadUInt32();
                    var sId3 = packet.Data.ReadUInt32();
                    var sId4 = packet.Data.ReadUInt32();

                    var aBuffer = new PacketStream();
                    aBuffer.WriteHeader(Sender3, Receiver3, null, 0x2000);
                    aBuffer.WriteUInt32(sId3);
                    aBuffer.WriteUInt32(sId4);
                    aBuffer.WriteUInt32(sId4 != 0x000027f9 ? 0x00000002 : 0x00000000);
                    aBuffer.Send(client);
                }
                else
                {
                    Handle0X2000(client, packet);
                }

                break;
            }

            case GameServerOpcodes.Ox200C:     // request change map(?)
            {
                Logger.LogInformation("0x200C: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox205C:
            {
                Logger.LogInformation("0x205C: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox205E:
            {
                Logger.LogInformation("0x205E: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox205F:
            {
                var unk0        = packet.Data.ReadUInt32(); // 0xc350
                var characterId = packet.Data.ReadUInt32();

                Logger.LogInformation("0x205F: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox206D:
            {
                Logger.LogInformation("0x206D: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox2085:
            {
                Logger.LogInformation("0x205A: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox206A:     // request change map(?)
            {
                /*byte[] sender = { 0x0d, 0x13, 0xce, 0x71, 0xb1, 0x10, 0x14 };
                 *      byte[] receiver = { 0x0d, 0x47, 0xc1, 0x67, 0x6c, 0x10, 0x84, 0x80, 0x80, 0x08 };
                 *
                 *      PacketBuffer aBuffer = new PacketBuffer();
                 *      aBuffer.WriteHeader(sender, receiver, null, 0x2009, true);
                 *      aBuffer.WriteUInt32(0x00000067);
                 *      aBuffer.WriteUInt32(0x5a32f0d7);
                 *      aBuffer.WriteUInt32(0x0000c350);
                 *      aBuffer.WriteUInt32(client.client.Account.nClientInst);
                 *      aBuffer.WriteByte(0);
                 *      aBuffer.WriteUInt64(0);
                 *      aBuffer.WriteUInt64(0);
                 *      aBuffer.WriteUInt64(0);
                 *      aBuffer.WriteUInt32(0x3f800000);
                 *      aBuffer.WriteByte(0x62);
                 *      aBuffer.WriteUInt32(0x0000c79c);
                 *      aBuffer.WriteUInt32(0x00000faa); //map
                 *      aBuffer.WriteUInt32(client.client.Account.nClientInst);
                 *      aBuffer.WriteUInt32(0x0000000a);
                 *      aBuffer.WriteUInt32(0x00009c50);
                 *      aBuffer.WriteUInt32(0x00030bde); //instance
                 *      aBuffer.WriteUInt64(0);
                 *      aBuffer.WriteUInt32(0x00000014);
                 *      aBuffer.WriteUInt32(0x00018704);
                 *      aBuffer.WriteUInt32(0x43a14000);
                 *      aBuffer.WriteUInt32(0x43160000);
                 *      aBuffer.WriteUInt32(0x4430399a);
                 *      aBuffer.WriteUInt32(0x00000032);
                 *      aBuffer.WriteByte(0);
                 *      //Log.Warning("Send Packet:\n%s\n\n", String::arrayToHexString(aBuffer.buffer, aBuffer.bufferLength).c_str());
                 *      aBuffer.Send(client);
                 *
                 *      aBuffer = new PacketBuffer();
                 *      aBuffer.WriteHeader(sender, receiver, null, 0x2002, true);
                 *      //aBuffer.WriteUInt32(htonl(inet_addr(realm->worldServerIPAddress)));
                 *      //aBuffer.WriteUInt16(realm->worldServerPort);
                 *      aBuffer.WriteUInt32(Native.Network.htonl(Native.Network.inet_addr("127.0.0.1")));
                 *      aBuffer.WriteUInt16(Program.GameServerPort);
                 *      aBuffer.Send(client);*/

                //var packetData = packet.Data?.ToArray().ToHexString();
                Logger.LogInformation("0x206A: " + packet.Data?.ToArray().ToHexString());

                break;
            }

            case GameServerOpcodes.Ox207B:
            {
                Logger.LogInformation("0x207B: " + packet.Data?.ToArray().ToHexString());
                //Logger.Info("Receive opcode 0x207b. Maybe hide object(helmet,...)");

                break;
            }

            case GameServerOpcodes.Ox205A:
            {
                var counter = packet.Data.ReadUInt32();

                Logger.LogInformation($"0x205A: {counter} ({counter:X4})");
                //

                break;
            }

            case GameServerOpcodes.Ping:     // Ping
            {
                Logger.LogInformation("Ping: " + packet.Data?.ToArray().ToHexString());

                new PacketStream()     // p.158
                .WriteHeader(Sender10, Receiver10, null, GameServerRespondOpcodes.Pong)
                .WriteUInt32(0)        //0x42c80000) // old = 0x42c80000, new = 0x42B32A07
                .WriteUInt32(0)
                .WriteUInt32(0)
                .Send(client);

                break;
            }

            case GameServerOpcodes.SpawnCheck:     // p.160&161
            {
                Logger.LogInformation("SpawnCheck?: " + packet.Data?.ToArray().ToHexString());

                /*var part1 = packet.Data.ReadUInt32();
                 * var spawnId = packet.Data.ReadUInt32();
                 * var unk0 = packet.Data.ReadUInt32();
                 * var nClientInst = packet.Data.ReadUInt32();
                 *
                 * new PacketStream()
                 *  .WriteHeader(Sender9, Receiver9, null, GameServerRespondOpcodes.SpawnCheck)
                 *  .WriteUInt32(part1)
                 *  .WriteUInt32(spawnId)
                 *  .WriteByte(0)
                 *  .Send(client);*/

                break;
            }

            case GameServerOpcodes.GcPing:     // GCPing?  p.162
            {
                Logger.LogInformation("GcPing: " + packet.Data?.ToArray().ToHexString());

                var counter = packet.Data.ReadUInt32();
                var time    = Statics.EpochTime();

                new PacketStream()
                .WriteHeader(Sender8, Receiver8, null, GameServerRespondOpcodes.GcPing)
                .WriteUInt32(counter)
                .WriteUInt32(0x0000004E)
                // counter  retvalue
                // 1        0x2B, 0x95, 0x70, 0x58 -> p.167
                // 2        0x2C, 0x70, 0x01, 0x78 -> p.448
                // 3        0x2c, 0x7e, 0xc6, 0xb8 -> p.540
                // 4        0x2c, 0x7e, 0xc6, 0xb8 -> p.541
                // 5        0x2c, 0xa6, 0xb1, 0x78 -> p.564
                .WriteUInt32(time)         // not the correct value? But still working
                .Send(client);

                // is this still relevant?

                /*if (client.Account.CreateState == 1 && client.Account.CreateCounter > 0)
                 * {
                 *  client.Account.State = 0;
                 *  client.Account.CreateCounter = 0;
                 *
                 *  var data1 = new byte[]
                 *  {
                 *      0x00, 0x00, 0x00, 0x00, 0x0e, 0x08, 0x05, 0x10, 0x00, 0x18, 0xec, 0x97, 0x02, 0x32, 0x04,
                 *      0x08, 0x00, 0x10, 0x00
                 *  };
                 *
                 *  var aBuffer = new PacketStream();
                 *  aBuffer.WriteHeader(Sender7, Receiver7, null, 0x2000);
                 *  aBuffer.WriteUInt32(0x0000001f);
                 *  aBuffer.WriteUInt32(0xa36d3b74);
                 *  aBuffer.WriteUInt32(0x0000c350);
                 *  aBuffer.WriteUInt32(client.Account.ClientInstance);
                 *  aBuffer.WriteArray(data1);
                 *  aBuffer.Send(client);
                 *
                 *  var data2 = new byte[]
                 *  {
                 *      0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x2a, 0xf8, 0x00, 0x00,
                 *      0x01, 0xf9, 0x00, 0x00, 0x43, 0x30, 0x00, 0x00, 0x01, 0xfb, 0x00, 0x00, 0x00, 0x00
                 *  };
                 *
                 *  aBuffer = new PacketStream();
                 *  aBuffer.WriteHeader(Sender7, Receiver7, null, 0x2000);
                 *  aBuffer.WriteUInt32(0x00000029);
                 *  aBuffer.WriteUInt32(0x96b8dc59);
                 *  aBuffer.WriteUInt32(0x0000c350);
                 *  aBuffer.WriteUInt32(client.Account.ClientInstance);
                 *  aBuffer.WriteArray(data2);
                 *  aBuffer.Send(client);
                 * }*/

                break;
            }

            case GameServerOpcodes.ManualRemoveBuff:
            {
                var packetData = packet.Data?.ToArray();
                Logger.LogInformation("REMOVE BUFF");

                break;
            }

            case GameServerOpcodes.ChatCommand:
            {
                Logger.LogInformation("ChatCommand: " + packet.Data?.ToArray().ToHexString());

                var unk0 = packet.Data.ReadUInt32();
                var unk1 = packet.Data.ReadUInt32();
                var unk2 = packet.Data.ReadUInt32();
                var unk3 = packet.Data.ReadUInt32();
                var text = packet.Data.ReadString();

                if (text[0] == '.' && text[1] != '.' && client.Account.Type >= AccountType.GameMaster)
                {
                    HandleGmCommand(client, text);
                }
                else
                {
                    _agentServerListener.CharacterSay(client.Account, text);
                }

                break;
            }

            case GameServerOpcodes.VanityToggle:
            {
                var packetData = packet.Data?.ToArray();
                Logger.LogInformation("VanityToggle");

                break;
            }

            default:
            {
                Logger.LogWarning($"Unknown packet: {packet}");
                break;
            }
            }
        }
예제 #2
0
        public override void ReceivedPacket(NetworkClient client, ConanPacket packet)
        {
            Logger.Info("Received opcode: " + (Opcodes)packet.Opcode + " (" + packet.Opcode.ToHex() + ")");
            var account = (Account)client.Tag;

            switch ((Opcodes)packet.Opcode)
            {
            case Opcodes.Hello:
            {
                account.ClientInstance = packet.Data.ReadUInt32(); // 0x0802e5d4
                account.Id             = packet.Data.ReadUInt32(); // 0x310cec57
                var clientVersion = packet.Data.ReadString();

                var charId = (UInt32)Database.ExecuteScalar <Int64>(
                    "SELECT characterid FROM clientinstances " +
                    "WHERE accountid=" + account.Id + " AND clientinst=" + account.ClientInstance);

                account.Character = new Character(charId);
                account.Character.LoadDetailsFromDatabase(Database);
                account.LoadDetailsFromDatabase(Database);

                Logger.Info("CharID: " + account.ClientInstance.ToHex());
                Logger.Info("Recieve Client Version: " + clientVersion);

                /*if (clientVersion != "v4.00.NoTS@369764")
                 * {
                 *  Logger.Info("Incompatible client connects to the Server");
                 *  //break;
                 * }*/

                ReportDimensionId(client, account, account.Character.RealmId);  // 1
                ReportServerId(client, account, account.Character.RealmId);     // 0x00000006
                AckAuthentication(client, account, 1);

                Send0X201C(client, account);     // No imediate visible change when not sending these
                Send0X200A(client, account);

                var packetData135 = Functions.HexStreamToByteArray(File.ReadAllText("../../other/fs135.hex")
                                                                   .Replace("\r", "").Replace("\n", ""));
                new PacketStream()     // To big to keep here, but necessary to send...
                .WriteHeader(Sender0, Receiver0, null, 0x2000)
                .WriteArrayPrependLengthUInt32(new ConanStream()
                                               .WriteUInt32(Ox2000RespondsOpcodes.Ox737A6DF9)
                                               .WriteArray(packetData135))
                .Send(client);

                MapChange(client, account);
                SpawnPlayer(client, account);
                SetTimeofDay(client);

                //SendPlayerBuffsTest(client, account);
                //SendSitOnMountTest(client, account);
                //Send0x33A56FB0(client); // No imediate visible change when not sending these
                //SendObjectSpawnTest(client); // No imediate visible change when not sending these
                //SendSpawnNPCAndPlayersTest(client); // Spawn some NPC's and other players
                //Send0x4F57DC08(client); // No imediate visible change when not sending these
                //Send0x642CD3D6(client); // No imediate visible change when not sending these
                //Send0x96C46740(client); // No imediate visible change when not sending these

                break;
            }

            case Opcodes.Ox2000:
            {
                if (packet.SenderInt[1] == 0x48)
                {
                    var sId1 = packet.Data.ReadUInt32();
                    var sId2 = packet.Data.ReadUInt32();
                    var sId3 = packet.Data.ReadUInt32();
                    var sId4 = packet.Data.ReadUInt32();

                    var aBuffer = new PacketStream();
                    aBuffer.WriteHeader(Sender3, Receiver3, null, 0x2000);
                    aBuffer.WriteUInt32(sId3);
                    aBuffer.WriteUInt32(sId4);
                    aBuffer.WriteUInt32(sId4 != 0x000027f9 ? 0x00000002 : 0x00000000);
                    aBuffer.Send(client);
                }
                else
                {
                    Handle0X2000(client, account, packet);
                }

                break;
            }

            case Opcodes.Ox206A:     // request change map(?)
            {
                /*byte[] sender = { 0x0d, 0x13, 0xce, 0x71, 0xb1, 0x10, 0x14 };
                 * byte[] receiver = { 0x0d, 0x47, 0xc1, 0x67, 0x6c, 0x10, 0x84, 0x80, 0x80, 0x08 };
                 *
                 * PacketBuffer aBuffer = new PacketBuffer();
                 * aBuffer.WriteHeader(sender, receiver, null, 0x2009, true);
                 * aBuffer.WriteUInt32(0x00000067);
                 * aBuffer.WriteUInt32(0x5a32f0d7);
                 * aBuffer.WriteUInt32(0x0000c350);
                 * aBuffer.WriteUInt32(account.nClientInst);
                 * aBuffer.WriteByte(0);
                 * aBuffer.WriteUInt64(0);
                 * aBuffer.WriteUInt64(0);
                 * aBuffer.WriteUInt64(0);
                 * aBuffer.WriteUInt32(0x3f800000);
                 * aBuffer.WriteByte(0x62);
                 * aBuffer.WriteUInt32(0x0000c79c);
                 * aBuffer.WriteUInt32(0x00000faa); //map
                 * aBuffer.WriteUInt32(account.nClientInst);
                 * aBuffer.WriteUInt32(0x0000000a);
                 * aBuffer.WriteUInt32(0x00009c50);
                 * aBuffer.WriteUInt32(0x00030bde); //instance
                 * aBuffer.WriteUInt64(0);
                 * aBuffer.WriteUInt32(0x00000014);
                 * aBuffer.WriteUInt32(0x00018704);
                 * aBuffer.WriteUInt32(0x43a14000);
                 * aBuffer.WriteUInt32(0x43160000);
                 * aBuffer.WriteUInt32(0x4430399a);
                 * aBuffer.WriteUInt32(0x00000032);
                 * aBuffer.WriteByte(0);
                 * //Log.Warning("Send Packet:\n%s\n\n", String::arrayToHexString(aBuffer.buffer, aBuffer.bufferLength).c_str());
                 * aBuffer.Send(client);
                 *
                 * aBuffer = new PacketBuffer();
                 * aBuffer.WriteHeader(sender, receiver, null, 0x2002, true);
                 * //aBuffer.WriteUInt32(htonl(inet_addr(realm->worldServerIPAddress)));
                 * //aBuffer.WriteUInt16(realm->worldServerPort);
                 * aBuffer.WriteUInt32(Native.Network.htonl(Native.Network.inet_addr("127.0.0.1")));
                 * aBuffer.WriteUInt16(Program.GameServerPort);
                 * aBuffer.Send(client);*/

                //var packetData = packet.Data.ToArray().ToHexString();
                Logger.Info("Opcodes.Ox206A");

                break;
            }

            case Opcodes.Ox207B:
            {
                //var packetData = packet.Data;
                Logger.Info("Opcodes.Ox207B");
                //Logger.Info("Receive opcode 0x207b. Maybe hide object(helmet,...)");

                break;
            }

            case Opcodes.Ox205A:
            {
                //var packetData = packet.Data;
                Logger.Info("Opcodes.Ox205A");
                //

                break;
            }

            case Opcodes.Ping:           // Ping
            {
                new PacketStream()       // p.158
                .WriteHeader(Sender10, Receiver10, null, SendOpcodes.Pong)
                .WriteUInt32(0x42c80000) // old = 0x42c80000, new = 0x42B32A07
                .WriteUInt32(0)
                .WriteUInt32(0)
                .Send(client);

                break;
            }

            case Opcodes.SpawnCheck:     // p.160&161
            {
                var part1       = packet.Data.ReadUInt32();
                var spawnId     = packet.Data.ReadUInt32();
                var unk0        = packet.Data.ReadUInt32();
                var nClientInst = packet.Data.ReadUInt32();

                new PacketStream()
                .WriteHeader(Sender9, Receiver9, null, 0x2008)
                .WriteUInt32(part1)
                .WriteUInt32(spawnId)
                .WriteByte(0)
                .Send(client);

                break;
            }

            case Opcodes.GcPing:     // GCPing?  p.162
            {
                var counter = packet.Data.ReadUInt32();
                var time    = 0;
                Other.time(ref time);

                new PacketStream()
                .WriteHeader(Sender8, Receiver8, null, 0x0000207D)
                .WriteUInt32(counter)
                .WriteUInt32(0x0000004E)
                // counter  retvalue
                // 1        0x2B, 0x95, 0x70, 0x58 -> p.167
                // 2        0x2C, 0x70, 0x01, 0x78 -> p.448
                // 3        0x2c, 0x7e, 0xc6, 0xb8 -> p.540
                // 4        0x2c, 0x7e, 0xc6, 0xb8 -> p.541
                // 5        0x2c, 0xa6, 0xb1, 0x78 -> p.564
                .WriteUInt32(time)         // not the correct value? But still working
                .Send(client);

                if (account.CreateState == 1 && account.CreateCounter > 0)
                {
                    account.State         = 0;
                    account.CreateCounter = 0;

                    var data1 = new byte[]
                    {
                        0x00, 0x00, 0x00, 0x00, 0x0e, 0x08, 0x05, 0x10, 0x00, 0x18, 0xec, 0x97, 0x02, 0x32, 0x04,
                        0x08, 0x00, 0x10, 0x00
                    };

                    var aBuffer = new PacketStream();
                    aBuffer.WriteHeader(Sender7, Receiver7, null, 0x2000);
                    aBuffer.WriteUInt32(0x0000001f);
                    aBuffer.WriteUInt32(0xa36d3b74);
                    aBuffer.WriteUInt32(0x0000c350);
                    aBuffer.WriteUInt32(account.ClientInstance);
                    aBuffer.WriteArray(data1);
                    aBuffer.Send(client);

                    var data2 = new byte[]
                    {
                        0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x2a, 0xf8, 0x00, 0x00,
                        0x01, 0xf9, 0x00, 0x00, 0x43, 0x30, 0x00, 0x00, 0x01, 0xfb, 0x00, 0x00, 0x00, 0x00
                    };

                    aBuffer = new PacketStream();
                    aBuffer.WriteHeader(Sender7, Receiver7, null, 0x2000);
                    aBuffer.WriteUInt32(0x00000029);
                    aBuffer.WriteUInt32(0x96b8dc59);
                    aBuffer.WriteUInt32(0x0000c350);
                    aBuffer.WriteUInt32(account.ClientInstance);
                    aBuffer.WriteArray(data2);
                    aBuffer.Send(client);
                }

                break;
            }

            case Opcodes.ManualRemoveBuff:
            {
                Logger.Info("REMOVE BUFF");

                break;
            }

            case Opcodes.ChatCommand:
            {
                var unk0 = packet.Data.ReadUInt32();
                var unk1 = packet.Data.ReadUInt32();
                var unk2 = packet.Data.ReadUInt32();
                var unk3 = packet.Data.ReadUInt32();
                var text = packet.Data.ReadString();

                if (text[0] == '.' && text[1] != '.' && account.Type >= AccountType.GameMaster)
                {
                    HandleGMCommand(client, account, text);
                }
                else
                {
                    _agentServerListener.CharacterSay(account, text);
                }

                break;
            }

            default:
            {
                Logger.Info("Unknown packet: " + packet);
                break;
            }
            }
        }