Exemple #1
0
        public static void F_INTERACT(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
                return;

            Log.Dump("F_INTERACT", packet.ToArray(), 0, packet.ToArray().Length);

            InteractMenu Menu = new InteractMenu();
            Menu.Unk = packet.GetUint16();
            Menu.Oid = packet.GetUint16();
            Menu.Menu = packet.GetUint16();
            Menu.Page = packet.GetUint8();
            Menu.Num = packet.GetUint8();
            Menu.SellCount = packet.GetUint16();
            Menu.Count = packet.GetUint16();

            Object Obj = cclient.Plr.Region.GetObject(Menu.Oid);
            if (Obj == null)
                return;

            if (Obj.GetDistanceTo(cclient.Plr) > 20)
            {
                Log.Error("F_INTERACT", "Distance = " + Obj.GetDistanceTo(cclient.Plr));
                return;
            }

            Obj.SendInteract(cclient.Plr, Menu);
        }
Exemple #2
0
        public void HandlePacket(BaseClient client, PacketIn Packet)
        {
            Log.Dump("packethandle", Packet.ToArray(), 0, Packet.ToArray().Length);
            if (client == null || Packet == null)
            {
                Log.Error("TCPManager", "Packet || Client == null");
                return;
            }

            PacketFunction packetHandler = null;

            if (Packet.Opcode < (ulong)m_packetHandlers.Length)
            {
                packetHandler = m_packetHandlers[Packet.Opcode];
            }
            else if (!Errors.Contains(Packet.Opcode))
            {
                Errors.Add(Packet.Opcode);
                Log.Error("TCPManager", "Can not handle :" + Packet.Opcode + "(" + Packet.Opcode.ToString("X8") + ")");
            }

            if (packetHandler != null)
            {
                PacketHandlerAttribute[] packethandlerattribs = (PacketHandlerAttribute[])packetHandler.GetType().GetCustomAttributes(typeof(PacketHandlerAttribute), true);
                if (packethandlerattribs.Length > 0)
                {
                    if (packethandlerattribs[0].State > client.State)
                    {
                        Log.Error("TCPManager", "Can not handle packet (" + Packet.Opcode.ToString("X8") + "), Invalid client state (" + client.GetIp + ")");
                        return;
                    }
                }

                try
                {
                    packetHandler.Invoke(client, Packet);
                }
                catch (Exception e)
                {
                    Log.Error("TCPManager", "Packet handler error :" + Packet.Opcode + " " + e.ToString());
                }
            }
            else if (!Errors.Contains(Packet.Opcode))
            {
                Errors.Add(Packet.Opcode);
                Log.Error("TCPManager", "Can not Handle opcode :" + Packet.Opcode + "(" + Packet.Opcode.ToString("X8") + ")");
            }
        }
Exemple #3
0
        public PacketIn DeCrypt(PacketIn packet)
        {
            if (m_crypts.Count <= 0)
            {
                return(packet);
            }

            ulong opcode   = packet.Opcode;
            ulong size     = packet.Size;
            long  StartPos = packet.Position;

            foreach (KeyValuePair <ICryptHandler, CryptKey[]> Entry in m_crypts)
            {
                try
                {
                    Log.Debug("Decrypt", "Decrypt with " + Entry.Key + ",Size=" + packet.Size);

                    byte[] Buf = new byte[size];

                    long Pos = packet.Position;
                    packet.Read(Buf, 0, (int)Buf.Length);
                    packet.Position = Pos;

                    PacketIn Pack = Entry.Key.Decrypt(Entry.Value[1], Buf);
                    packet.Write(Pack.ToArray(), 0, Pack.ToArray().Length);

                    packet.Opcode = opcode;
                    packet.Size   = size;
                }
                catch (Exception e)
                {
                    Log.Error("BaseClient", "Decrypt Error : " + e.ToString());
                    continue;
                }
            }

            Log.Tcp("Decrypt", packet.ToArray(), 0, packet.ToArray().Length);
            packet.Position = StartPos;
            return(packet);
        }
        static public void CMSG_AuthSessionTokenReq(BaseClient client, PacketIn packet)
        {
            Client cclient = client as Client;

            PacketOut Out = new PacketOut((byte)Opcodes.SMSG_AuthSessionTokenReply);
        

            AuthSessionTokenReq.Builder authReq = AuthSessionTokenReq.CreateBuilder();
            authReq.MergeFrom(packet.ToArray());

            string session = Encoding.ASCII.GetString(authReq.SessionToken.ToByteArray());
           // Log.Debug("AuthSession", "session " + session);
            cclient.Username = "";                                  //username is not important anymore in 1.4.8
            cclient.Token = session;



            AuthSessionTokenReply.Builder authReply = AuthSessionTokenReply.CreateBuilder();
            authReply.SetResultCode(AuthSessionTokenReply.Types.ResultCode.RES_SUCCESS);

          
            Out.Write(authReply.Build().ToByteArray());

            cclient.SendTCPCuted(Out);
       
            
        /*   //TODO: need auth check

            if (Result != AuthResult.AUTH_SUCCESS)
                cclient.Disconnect();
            else
            {
                cclient.Username = Username;
                cclient.Token = Token;
            }*/
        }
        public void HandlePacket(BaseClient client, PacketIn packet)
        {
            //#if DEBUG
            Log.Info("HandlePacket", $"Packet : {packet.Opcode} ({packet.Opcode.ToString("X8")})");
            Log.Dump("HandlePacket", packet.ToArray(), 0, packet.ToArray().Length);
            //#endif

            if (client == null)
            {
                Log.Error("TCPManager", "Client == null");
                return;
            }

            PacketFunction packetHandler = null;

            if (packet.Opcode < (ulong)m_packetHandlers.Length)
            {
                packetHandler = m_packetHandlers[packet.Opcode];
            }
            else if (!Errors.Contains(packet.Opcode))
            {
                Errors.Add(packet.Opcode);
                Log.Error("TCPManager", $"Can not handle :{packet.Opcode} ({packet.Opcode.ToString("X8")})");
            }

            if (packetHandler != null)
            {
                /*
                 *
                 * The reflection code below seems to have been used to verify the client was in the correct state before the packet was handled.
                 * However, it didn't actually work; eliminating the reflection and using an array implementation broke the emu and testing confirmed
                 * the original check was broken, so I've eliminated it for now.
                 *
                 *
                 * if (stateRequirement[packet.Opcode] > client.State)
                 * {
                 *  Log.Error("TCPManager", $"Can not handle packet ({packet.Opcode.ToString("X8")}), Invalid client state {client.State} (expected {stateRequirement[packet.Opcode]}) ({client.GetIp()})");
                 *  PacketHandlerAttribute[] packethandlerattribs = (PacketHandlerAttribute[])packetHandler.GetType().GetCustomAttributes(typeof(PacketHandlerAttribute), true);
                 *  if (packethandlerattribs.Length > 0)
                 *  {
                 *      Log.Error("TCPManager", $"Old code provided state {packethandlerattribs[0].State}");
                 *      if (packethandlerattribs[0].State > client.State)
                 *          return;
                 *  }
                 *  else
                 *  {
                 *      Log.Error("TCPManager", "Old code was stateless");
                 *  }
                 * }
                 */

                try
                {
                    packetHandler.Invoke(client, packet);
                }
                catch (Exception e)
                {
                    Log.Error("TCPManager", $"Packet handler error :{packet.Opcode} {e}");
                }
            }
            else if (!Errors.Contains(packet.Opcode))
            {
                Errors.Add(packet.Opcode);
                Log.Error("TCPManager", $"Can not Handle opcode :{packet.Opcode} ({packet.Opcode.ToString("X8")})");
            }
        }
Exemple #6
0
        public static void F_PLAYER_STATE2(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
                return;

            Player Plr = cclient.Plr;

            long Pos = packet.Position;

            PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_STATE2);
            Out.Write(packet.ToArray(), (int)packet.Position, (int)packet.Size);
            Out.WriteByte(0);
            Plr.DispatchPacket(Out, false);

            packet.Position = Pos;

            UInt16 Key = packet.GetUint16();

            byte Type = packet.GetUint8();
            byte MoveingState = packet.GetUint8();
            byte CombatByte = packet.GetUint8();
            byte Strafe = packet.GetUint8();

            UInt16 Heading = packet.GetUint16R();
            UInt16 X = packet.GetUint16R();
            UInt16 Y = packet.GetUint16R();
            byte Unk1 = packet.GetUint8();
            UInt16 Z = packet.GetUint16R();
            byte zmod = packet.GetUint8();

            //    Log.Success("zMod ",""+zmod);
            // zmod is somewhat strange what i found out so far
            // z mod is 255 while standing
            // z mod is 0 while running and z is below 65535
            // z mod is 1 while running and z is above 65535
            // z mod can be  113 / 97 / 115 / 99 while running and z is below 65535 and enemy in target
            // z mod is 99 / 100 / 116  while running and z is above 65535 and enemy in target

            // z mod is 4 while running in water
            // z mod is 68 while swimming in water
            // z mod is ticking with 255 7 times then 68 while standing in deep water
            // z mod is 12 while running in water (that should lower your health / kill you and reduce movement speed)
            // z mod is ticking with 255 7 times then 12 while standing in lava

            if (packet.Size < 10)
                return;

            int z_temp = Z;

            Heading /= 8;
            X /= 2;
            Y /= 2;

            // z update if z is higher then 65535

            if (zmod != 0 && zmod != 97 && zmod != 113 && zmod != 99 && zmod != 115)
                z_temp += 65535;

            if (Type != (byte)MovementTypes.NotMoving)
                Plr.IsMoving = true;
            else
                Plr.IsMoving = false;

             //   Log.Success("Movement Before ", X + "," + Y + "," + Z + "  ztemp"+ z_temp);
            if (CombatByte >= 50 && CombatByte < 0x92 || CombatByte == 0xDF)
            {
                if (Plr.LastCX != 0 && Plr.LastCY != 0)
                {
                    if (Plr.LastCX > 12288 && X < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset);
                    else if (X > 12288 && Plr.LastCX < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset);

                    if (Plr.LastCY > 24576 && Y < 8192)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1));
                    else if (Y > 24576 && Plr.LastCY < 8192)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1));
                }

                Plr.LastCX = X;
                Plr.LastCY = Y;

                X = Plr.Zone.CalculCombat(X, Plr.XOffset, true);
                Y = Plr.Zone.CalculCombat(Y, Plr.YOffset, false);
                Heading /= 2;
                z_temp /= 16;

                // combat offset z

                if (Plr._ZoneMgr.ZoneId == 161 || Plr._ZoneMgr.ZoneId == 162)
                {
                    z_temp += 12288;
                }
                else
                    z_temp += 4096;

            }
            else
            {
                if (Plr.LastX != 0 && Plr.LastY != 0)
                {
                    if (Plr.LastX > 24576 && X < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset);
                    else if (Plr.LastX < 4096 && X > 24576)
                        Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset);

                    if (Plr.LastY > 24576 && Y < 4096)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1));
                    else if (Plr.LastY < 4096 && Y > 24576)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1));

                }

                Plr.LastX = X;
                Plr.LastY = Y;

                X = Plr.Zone.CalculPin(X, Plr.XOffset, true);
                Y = Plr.Zone.CalculPin(Y, Plr.YOffset, false);
                Log.Success("4 ",""+z_temp);

                z_temp /= 4;
            }

              //  if (Plr.IsInWorld() && Plr.Zone.ZoneId == 161)
              //      Z += 16384;

             //   Log.Success("Movement after", "X=" + X + ",Y=" + Y + ",Z=" + Z + ",ztemp = " + z_temp + "," + Type + "," + Unk1 + "," + CombatByte);
            Plr.SetPosition(X, Y,(ushort) z_temp, Heading);
        }
Exemple #7
0
        public static void F_REQUEST_INIT_PLAYER(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            Log.Dump("F_REQUEST_INIT_PLAYER", packet.ToArray(), 0, packet.ToArray().Length);

            if (cclient.Plr == null)
                return;

            foreach (Player Obj in cclient.Plr._PlayerRanged)
                Obj.SendMeTo(cclient.Plr);
        }
Exemple #8
0
        public static void F_PLAYER_STATE2(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
                return;

            Player Plr = cclient.Plr;

            try
            {
                long Pos = packet.Position;

                PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_STATE2);
                Out.Write(packet.ToArray(), (int)packet.Position, (int)packet.Size);
                Out.WriteByte(0);
                Plr.DispatchPacket(Out, false);

                packet.Position = Pos;
            }
            catch (Exception e)
            {
                Log.Error("F_PLAYER_STATE2", e.ToString());
            }

            if (packet.Size < 17)
            {
                Plr.IsMoving = false;
                return;
            }

            UInt16 Key = packet.GetUint16();

            byte MoveByte = packet.GetUint8();
            byte UnkByte = packet.GetUint8();
            byte CombatByte = packet.GetUint8();
            byte RotateByte = packet.GetUint8();

            UInt16 Heading = packet.GetUint16R();
            UInt16 X = packet.GetUint16R();
            UInt16 Y = packet.GetUint16R();
            byte Unk1 = packet.GetUint8();
            UInt16 Z = packet.GetUint16R();
            //byte Unk2 = packet.GetUint8();

            Heading /= 8;
            X /= 2;
            Y /= 2;
            Z /= 2;

            if (CombatByte >= 50 && CombatByte < 0x92 || CombatByte == 0xDF)
            {
                if (Plr.LastCX != 0 && Plr.LastCY != 0)
                {
                    if (Plr.LastCX > 12288 && X < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset);
                    else if (X > 12288 && Plr.LastCX < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset);

                    if (Plr.LastCY > 24576 && Y < 8192)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1));
                    else if (Y > 24576 && Plr.LastCY < 8192)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1));
                }

                Plr.LastCX = X;
                Plr.LastCY = Y;

                X = Plr.Zone.CalculCombat(X, Plr.XOffset, true);
                Y = Plr.Zone.CalculCombat(Y, Plr.YOffset, false);
                Heading /= 2;
                Z += 32768;
                Z /= 4;
            }
            else
            {
                if (Plr.LastX != 0 && Plr.LastY != 0)
                {
                    if (Plr.LastX > 24576 && X < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset);
                    else if (Plr.LastX < 4096 && X > 24576)
                        Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset);

                    if (Plr.LastY > 24576 && Y < 4096)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1));
                    else if (Plr.LastY < 4096 && Y > 24576)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1));

                }

                Plr.LastX = X;
                Plr.LastY = Y;

                X = Plr.Zone.CalculPin(X, Plr.XOffset, true);
                Y = Plr.Zone.CalculPin(Y, Plr.YOffset, false);
            }

            Plr.SetPosition(X, Y, Z, Heading);
        }
Exemple #9
0
        static public void F_PLAYER_STATE2(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
                return;

            Player Plr = cclient.Plr;

            long Pos = packet.Position;

            PacketOut Out = new PacketOut((byte)Opcodes.F_PLAYER_STATE2);
            Out.Write(packet.ToArray(), (int)packet.Position, (int)packet.Size);
            Out.WriteByte(0);
            Plr.DispatchPacket(Out, false);

            packet.Position = Pos;

            UInt16 Key = packet.GetUint16();

            byte Type = packet.GetUint8();
            byte MoveingState = packet.GetUint8();
            byte CombatByte = packet.GetUint8();
            byte Strafe = packet.GetUint8();

            UInt16 Heading = packet.GetUint16R();
            UInt16 X = packet.GetUint16R();
            UInt16 Y = packet.GetUint16R();
            byte Unk1 = packet.GetUint8();
            UInt16 Z = packet.GetUint16R();

            if (packet.Size < 10)
                return;

            Heading /= 8;
            X /= 2;
            Y /= 2;
            Z /= 2;

            if (Type != (byte)MovementTypes.NotMoving)
                Plr.IsMoving = true;
            else
                Plr.IsMoving = false;

            //Log.Success("Movement Before ", X + "," + Y + "," + Z);
            if (CombatByte >= 50 && CombatByte < 0x92 || CombatByte == 0xDF)
            {
                if (Plr.LastCX != 0 && Plr.LastCY != 0)
                {
                    if (Plr.LastCX > 12288 && X < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset);
                    else if (X > 12288 && Plr.LastCX < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset);

                    if (Plr.LastCY > 24576 && Y < 8192)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1));
                    else if (Y > 24576 && Plr.LastCY < 8192)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1));
                }

                Plr.LastCX = X;
                Plr.LastCY = Y;

                X = Plr.Zone.CalculCombat(X, Plr.XOffset, true);
                Y = Plr.Zone.CalculCombat(Y, Plr.YOffset, false);
                Heading /= 2;
                Z += 32768;
                Z /= 4;
                Z /= 2;
            }
            else
            {
                if (Plr.LastX != 0 && Plr.LastY != 0)
                {
                    if (Plr.LastX > 24576 && X < 4096)
                        Plr.SetOffset((ushort)(Plr.XOffset + 1), Plr.YOffset);
                    else if (Plr.LastX < 4096 && X > 24576)
                        Plr.SetOffset((ushort)(Plr.XOffset - 1), Plr.YOffset);

                    if (Plr.LastY > 24576 && Y < 4096)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset + 1));
                    else if (Plr.LastY < 4096 && Y > 24576)
                        Plr.SetOffset(Plr.XOffset, (ushort)(Plr.YOffset - 1));

                }

                Plr.LastX = X;
                Plr.LastY = Y;

                X = Plr.Zone.CalculPin(X, Plr.XOffset, true);
                Y = Plr.Zone.CalculPin(Y, Plr.YOffset, false);
                Z /= 2;
            }

            if (Plr.IsInWorld() && Plr.Zone.ZoneId == 161)
                Z += 16384;

            //Log.Success("Movement after", "X=" + X + ",Y=" + Y + ",Z=" + Z + "," + Type + "," + Unk1 + "," + CombatByte);
            Plr.SetPosition(X, Y, Z, Heading);
        }