Esempio n. 1
0
        public static bool Handle(Socket sock, string chat)
        {
            string[] param   = chat.Trim().Split(' ');
            string   command = param[0];

            switch (command.Substring(1))
            {
            case "help":
                string[] helptext = new string[] { "TrickEmu",
                                                   "----------------",
                                                   "[Commands]",
                                                   "!oxc <text> - OX chat",
                                                   "!gmc <text> - GM chat",
                                                   "!move <Map ID> - Move map",
                                                   "[Etc.]",
                                                   "Literally nothing.",
                                                   "...and that's about it.", };

                foreach (string s in helptext)
                {
                    PacketBuffer data = new PacketBuffer();
                    data.WriteHeaderUshort(0x13C);                              // Packet ID
                    data.WriteHeaderByteArray(new byte[] { 0x00, 0x00, 0x01 }); // Packet header padding
                    data.WriteByteArray(new byte[] { 0x00, 0x00 });             // ?
                    data.WriteString(s);
                    data.WriteByteArray(new byte[] { 0x00, 0x00 });             // ????

                    sock.Send(data.getPacket());
                }

                Program.logger.Debug("Player executed help command.");
                return(true);

            case "move":
                Program._clientPlayers[sock.GetHashCode()].ChangingMap = true;

                if (param.Length < 2)
                {
                    GameFunctions.SendChat("Usage: !move [Map ID]", sock);
                    return(true);
                }

                int MapId = 1;

                try
                {
                    MapId = int.Parse(param[1]);
                }
                catch
                {
                    GameFunctions.SendChat("Usage: !move [Map ID]", sock);
                    return(true);
                }

                try
                {
                    GameFunctions.SendChat("Changing zone to " + Program.Maps.MapName[MapId] + ".", sock);
                }
                catch
                {
                    GameFunctions.SendChat("Changing zone to ID " + MapId + " without position data.", sock);
                }

                foreach (KeyValuePair <int, Character> entry in Program._clientPlayers)
                {
                    if (entry.Key == sock.GetHashCode())
                    {
                        continue;
                    }
                    // Map value hasn't been changed yet for the moving player.
                    // But if the looped player isn't in the map, there's no need to broadcast this to them.
                    if (entry.Value.Map != Program._clientPlayers[sock.GetHashCode()].Map)
                    {
                        continue;
                    }

                    try
                    {
                        // Disconnected
                        PacketBuffer dcmsg = new PacketBuffer();
                        dcmsg.WriteHeaderHexString("06 00 00 00 01");
                        dcmsg.WriteUshort(Program._clientPlayers[sock.GetHashCode()].EntityID);

                        entry.Value.Socket.Send(dcmsg.getPacket());
                    }
                    catch
                    {
                        // ignored
                    }
                }

                List <byte> move1 = new List <byte>();

                PacketBuffer msg1 = new PacketBuffer();
                msg1.WriteHeaderHexString("1B 00 00 00 01");
                msg1.WriteUshort(Program._clientPlayers[sock.GetHashCode()].EntityID);
                msg1.WriteHexString("A4 05 5C 00 02");
                move1.AddRange(msg1.getPacket());

                PacketBuffer msg2 = new PacketBuffer();
                msg2.WriteHeaderHexString("99 00 00 00 01");
                msg2.WriteByte((byte)MapId);
                msg2.WriteHexString("00 00 00 00 00");
                move1.AddRange(msg2.getPacket());

                PacketBuffer msg3 = new PacketBuffer();
                msg3.WriteHeaderHexString("15 00 00 00 01");
                msg3.WriteUshort(Program._clientPlayers[sock.GetHashCode()].EntityID);
                move1.AddRange(msg3.getPacket());

                sock.Send(move1.ToArray());

                PacketBuffer pkt2 = new PacketBuffer();
                pkt2.WriteHeaderHexString("9A 00 00 00 01");
                pkt2.WriteHexString("F2 92 B3 00");
                pkt2.WriteUInt32(Program._clientPlayers[sock.GetHashCode()].ID);
                pkt2.WriteHexString("00 00 00 00");
                pkt2.WriteString(Program._GameIP);
                pkt2.WriteHexString("00 F6 55 00 00 23 48 00 00");
                pkt2.WriteByte((byte)MapId);
                pkt2.WriteHexString("00");

                int PosX = 512;
                int PosY = 512;

                // X coordinate
                if (param.Length > 2)
                {
                    Program.logger.Debug("Length of param: {0}", param.Length);
                    try
                    {
                        pkt2.WriteUshort((ushort)int.Parse(param[2]));
                        PosX = int.Parse(param[2]);
                    }
                    catch
                    {
                        GameFunctions.SendChat("Invalid X position given. Using default X 512.", sock);
                        pkt2.WriteUshort((ushort)PosX);
                    }
                }
                else
                {
                    try
                    {
                        pkt2.WriteUshort((ushort)Program.Maps.MapPos[MapId].X);     // X pos
                        PosX = Program.Maps.MapPos[MapId].X;
                    }
                    catch
                    {
                        pkt2.WriteUshort((ushort)PosX);
                    }
                }

                // Y coordinate
                if (param.Length > 3)
                {
                    Program.logger.Debug("Length of param: {0}", param.Length);
                    try
                    {
                        pkt2.WriteUshort((ushort)int.Parse(param[3]));
                        PosY = int.Parse(param[3]);
                    }
                    catch
                    {
                        GameFunctions.SendChat("Invalid Y position given. Using default Y 512.", sock);
                        pkt2.WriteUshort((ushort)PosY);
                    }
                }
                else
                {
                    try
                    {
                        pkt2.WriteUshort((ushort)Program.Maps.MapPos[MapId].Y);     // Y pos
                        PosY = Program.Maps.MapPos[MapId].Y;
                    }
                    catch
                    {
                        pkt2.WriteUshort((ushort)PosY);
                    }
                }

                Program._clientPlayers[sock.GetHashCode()].Map  = MapId;
                Program._clientPlayers[sock.GetHashCode()].PosX = (ushort)PosX;
                Program._clientPlayers[sock.GetHashCode()].PosY = (ushort)PosY;

                pkt2.WriteHexString("02");
                sock.Send(pkt2.getPacket());
                return(true);
            }

            return(false);
        }