Ejemplo n.º 1
0
 static void OnChatPacket(object p, PacketEventArgs e)
 {
     try
     {
         Client c = (Client)e.lnk.AttachedObject;
         switch (e.pak.ContainerID)
         {
             case SEND_MESSAGE.ContID:
                 Debug.WriteLine("Server> SEND_MESSAGE Packet");
                 if (SendM3.UnpackContainer(e.pak, OPTIONS.Chat))
                 {
                     SendM3.UserID = c.ID;
                     Client.BCastContainer(SendM3, SEND_MESSAGE.ContID);
                 }
                 else
                 {
                     Console.WriteLine("Chat error > packet decode error > " + c.Username + " > " + e.pak.link.IPv4Address);
                     e.pak.link.Dispose();
                 }
                 break;
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine("Chat error > " + ex.ToString() + " > " + e.pak.link.IPv4Address);
         e.pak.link.Dispose();
     }
 }
Ejemplo n.º 2
0
 void OnPacketReceived(object sender, PacketEventArgs e)
 {
     var packet = (MessagePacket)e.Packet;
     var player = (Player)e.User["player"];
     var text = string.Format("{0}: {1}", player.Name, packet.Content);
     Console.WriteLine(text);
     _service.SendAll(new MessagePacket { Content = text });
 }
Ejemplo n.º 3
0
 private void PacketHandler_Animation(object sender, PacketEventArgs<AnimationPacket> e)
 {
     foreach (Client c in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z))
     {
         if (c == this)
             continue;
         c.PacketHandler.SendPacket(new AnimationPacket
         {
             Animation = e.Packet.Animation,
             PlayerId = this.EntityId
         });
     }
 }
Ejemplo n.º 4
0
        private static void OnChatPaket(object sender, PacketEventArgs e)
        {
            switch (e.pak.ContainerID)
            {
            case SEND_MESSAGE.ContID:
                Debug.WriteLine("SEND_MESSAGE Packet");
                if (SendM1.UnpackContainer(e.pak, OPTIONS.Chat))
                {
                    Message msg = new Message();

                    msg.command = 10;     // message

                    msg.UserID      = SendM1.UserID;
                    msg.Messagedata = SendM1.Message;

                    msg.Username = msg.UserID.ToString();

                    try
                    {
                        msg.Username = ClientArray[msg.UserID].Username;
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.ToString());
                    }

                    IncommingChat.Enqueue(msg);
                }
                break;

            case SEND_USER.ContID:
                Debug.WriteLine("SEND_USER Packet");
                if (SendU1.UnpackContainer(e.pak, OPTIONS.Chat))
                {
                    int statID = SendU1.StatusID;
                    if (statID == STATUS.USER_NEW)
                    {
                        uint   ID       = SendU1.UserID;
                        string Username = SendU1.Username;

                        Client c = new Client();
                        c.Username = Username;
                        c.ID       = ID;


                        ClientArray[ID] = c;

                        Message msg = new Message();

                        msg.command = 11;     // new

                        msg.cli      = c;
                        msg.UserID   = SendU1.UserID;
                        msg.Username = SendU1.Username;

                        msg.Messagedata = "new client '" + c.Username + "' connected.";

                        IncommingChat.Enqueue(msg);
                        Debug.WriteLine("New User: "******" ID: " + c.ID);
                    }

                    if (statID == STATUS.USER_DISCONNECT)
                    {
                        uint ID = SendU1.UserID;

                        try
                        {
                            Client c = ClientArray[ID];

                            Message msg = new Message();

                            msg.command = 12;     // Delete

                            msg.Messagedata = "Client '" + c.Username + "' disconnected.";

                            msg.cli = c;

                            IncommingChat.Enqueue(msg);
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(ex.ToString());
                        }
                    }
                }
                break;
            }
        }
Ejemplo n.º 5
0
        private void PacketHandler_PlayerItemPlacement(object sender, PacketEventArgs<PlayerBlockPlacementPacket> e)
        {
            // if(!Permissions.CanPlayerBuild(Username)) return;
            if (Inventory.Slots[Inventory.ActiveSlot].Type <= 255)
                return;

            int x = e.Packet.X;
            int y = e.Packet.Y;
            int z = e.Packet.Z;

            BlockData.Blocks adjacentBlockType = (BlockData.Blocks)World.GetBlockId(x, y, z); // Get block being built against.

            // Placed Item Info
            int px, py, pz;
            short pType = Inventory.Slots[Inventory.ActiveSlot].Type;
            short pMetaData = Inventory.Slots[Inventory.ActiveSlot].Durability;

            World.FromFace(x, y, z, e.Packet.Face, out px, out py, out pz);

            switch (e.Packet.Face)
            {
                case BlockFace.Held:
                    return; // TODO: Process buckets, food, etc.
            }

            switch (adjacentBlockType)
            {
                case BlockData.Blocks.Air:
                case BlockData.Blocks.Water:
                case BlockData.Blocks.Lava:
                case BlockData.Blocks.Still_Water:
                case BlockData.Blocks.Still_Lava:
                    return;
            }

            switch ((BlockData.Items)pType)
            {
                case BlockData.Items.Diamond_Hoe:
                case BlockData.Items.Gold_Hoe:
                case BlockData.Items.Iron_Hoe:
                case BlockData.Items.Stone_Hoe:
                case BlockData.Items.Wooden_Hoe:
                    if (adjacentBlockType == BlockData.Blocks.Dirt || adjacentBlockType == BlockData.Blocks.Grass)
                    {
                        // Think the client has a Notch bug where hoe's durability is not updated properly.
                        px = x; py = y; pz = z;
                        World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Soil, 0x00);
                    }
                    break;

                case BlockData.Items.Sign:

                    if (e.Packet.Face == BlockFace.Up) // Floor Sign
                    {
                        // Get the direction the player is facing.
                        switch (FacingDirection(8))
                        {
                            case "N":
                                pMetaData = (byte)MetaData.SignPost.North;
                                break;
                            case "NE":
                                pMetaData = (byte)MetaData.SignPost.Northeast;
                                break;
                            case "E":
                                pMetaData = (byte)MetaData.SignPost.East;
                                break;
                            case "SE":
                                pMetaData = (byte)MetaData.SignPost.Southeast;
                                break;
                            case "S":
                                pMetaData = (byte)MetaData.SignPost.South;
                                break;
                            case "SW":
                                pMetaData = (byte)MetaData.SignPost.Southwest;
                                break;
                            case "W":
                                pMetaData = (byte)MetaData.SignPost.West;
                                break;
                            case "NW":
                                pMetaData = (byte)MetaData.SignPost.Northwest;
                                break;
                            default:
                                return;
                        }

                        World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Sign_Post, (byte)pMetaData);
                    }
                    else // Wall Sign
                    {
                        switch (e.Packet.Face)
                        {
                            case BlockFace.East: pMetaData = (byte)MetaData.SignWall.East;
                                break;
                            case BlockFace.West: pMetaData = (byte)MetaData.SignWall.West;
                                break;
                            case BlockFace.North: pMetaData = (byte)MetaData.SignWall.North;
                                break;
                            case BlockFace.South: pMetaData = (byte)MetaData.SignWall.South;
                                break;
                            case BlockFace.Down:
                                return;
                        }

                        World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Wall_Sign, (byte)pMetaData);
                    }
                    break;

                case BlockData.Items.Seeds:
                    if (adjacentBlockType == BlockData.Blocks.Soil && e.Packet.Face == BlockFace.Down)
                    {
                        World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Crops, 0x00);
                    }
                    break;

                case BlockData.Items.Redstone:
                    World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Redstone_Wire, 0x00);
                    break;

                case BlockData.Items.Minecart:
                case BlockData.Items.Boat:
                case BlockData.Items.Storage_Minecart:
                case BlockData.Items.Powered_Minecart:
                    // TODO: Create new object
                    break;

                case BlockData.Items.Iron_Door:
                case BlockData.Items.Wooden_Door:
                    {
                        if (!BlockData.Air.Contains((BlockData.Blocks)World.GetBlockId(px, py + 1, pz)))
                            return;

                        switch (FacingDirection(4)) // Built on floor, set by facing dir
                        {
                            case "N":
                                pMetaData = (byte)MetaData.Door.Northwest;
                                break;
                            case "W":
                                pMetaData = (byte)MetaData.Door.Southwest;
                                break;
                            case "S":
                                pMetaData = (byte)MetaData.Door.Southeast;
                                break;
                            case "E":
                                pMetaData = (byte)MetaData.Door.Northeast;
                                break;
                            default:
                                return;
                        }

                        if ((BlockData.Items)pType == BlockData.Items.Iron_Door)
                        {
                            World.SetBlockAndData(px, py + 1, pz, (byte)BlockData.Blocks.Iron_Door, (byte)MetaData.Door.IsTopHalf);
                            World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Iron_Door, (byte)pMetaData);
                        }
                        else
                        {
                            World.SetBlockAndData(px, py + 1, pz, (byte)BlockData.Blocks.Wooden_Door, (byte)MetaData.Door.IsTopHalf);
                            World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Wooden_Door, (byte)pMetaData);
                        }

                        World.Update(px, py + 1, pz);
                    }
                    break;
            }

            if (!Inventory.DamageItem(Inventory.ActiveSlot)) // If item isn't durable, remove it.
                Inventory.RemoveItem(Inventory.ActiveSlot);

            World.Update(px, py, pz);
        }
 void OnOutgoingData(Player p, PacketEventArgs e)
 {
     if (e.Type == Packet.Types.MOTD)
     {
         string ip;
         if (Server.DebugMode)
         {
             ip = "127.0.0.1";
         }
         else
         {
             ip = InetUtils.GrabWebpage("http://www.mcforge.net/serverdata/ip.php");
         }
         Packet pa = new Packet();
         pa.Add(Packet.Types.MOTD);
         pa.Add((byte)7);
         pa.Add(ServerSettings.GetSetting("ServerName"), 64);
         pa.Add(ServerSettings.GetSetting("MOTD") + " &0cfg=" + ip + ":" + ServerSettings.GetSetting("Port") + "/" + p.Level.Name, 64);
         pa.Add((byte)0);
         e.Data = pa.bytes;
     }
     //Because this is way more fun and requires no edits to the core ~Gamemakergm
     else if (e.Type == Packet.Types.Message)
     {
         if (PluginSettings.GetSettingBoolean("joinleave-alert"))
         {
             string incoming = Encoding.ASCII.GetString(e.Data).Trim();
             //Logger.Log(incoming);
             if (incoming.Contains("joined the game!"))
             {
                 e.Cancel();
                 WOM.GlobalSendJoin(incoming.Substring(1, incoming.Length - incoming.IndexOf("joined the game!")));
             }
             else if (incoming.Contains("has disconnected"))
             {
                 e.Cancel();
                 WOM.GlobalSendLeave(incoming.Substring(1, incoming.Length - incoming.IndexOf("has disconnected")));
             }
         }
     }
     else { return; }
 }
        private void Client_ReceivedTcp(object sender, PacketEventArgs e)
        {
            string message = Encoding.ASCII.GetString(e.Data);

            if (message.StartsWith("%d"))
            {
                //Draw
                message = message.Replace("%d", "");
                string[] split = message.Split('_');
                string[] sP1 = split[0].Split(',');
                string[] sP2 = split[1].Split(',');
                string[] sColor = split[2].Split(',');
                Point p1 = new Point(Int32.Parse(sP1[0]), Int32.Parse(sP1[1]));
                Point p2 = new Point(Int32.Parse(sP2[0]), Int32.Parse(sP2[1]));

                byte R = Byte.Parse(sColor[0]);
                byte G = Byte.Parse(sColor[1]);
                byte B = Byte.Parse(sColor[2]);
                Canvas.DoDraw(p1, p2, Color.FromArgb(255, R, G, B));
            }
            else if (message.StartsWith("%m"))
            {
                //Message
                message = message.Replace("%m", "");
                //WriteLine(message);
            }
            else if (message.StartsWith("%r"))
            {
                //Resize
                message = message.Replace("%r", "");
                string[] split = message.Split(',');
                Canvas.ResizePanel(Int32.Parse(split[0]), Int32.Parse(split[1]));
            }
            else if (message.StartsWith("%c"))
            {
                //Clear
                Canvas.Clear(Color.White);
            }
        }
Ejemplo n.º 8
0
        protected virtual void ClientPacketReceived(object sender, PacketEventArgs e)
        {
            if (!(sender is ISocket socket))
            {
                return;
            }

            Stats.PacketsReceived++;
            Stats.AddInput(e.Transferred);

            if (e.Packet.Id == (byte)AresId.MSG_CHAT_CLIENT_LOGIN)
            {
                IClient user = Users.Find(s => s.Socket == socket);

                if (user == null)
                {
                    if (HandlePending(socket))
                    {
                        if (idpool.Count == 0)
                        {
                            socket.SendAsync(new Announce(Errors.RoomFull));
                            socket.Disconnect();
                            Logging.Info(
                                "AresServer",
                                "Chatroom has reached capacity ({0}). If this happens frequently consider raising Max Clients",
                                Config.MaxClients
                                );
                        }
                        else
                        {
                            int id     = idpool.Pop();
                            var client = new AresClient(this, socket, (ushort)id);

                            if (IPAddress.IsLoopback(client.ExternalIp) ||
                                client.ExternalIp.Equals(ExternalIp) ||
                                LocalAddresses.Contains(client.ExternalIp) ||
                                (Config.LocalAreaIsHost && client.ExternalIp.IsLocalAreaNetwork()))
                            {
                                client.LocalHost = true;
                            }

                            lock (Users) {
                                Users.Add(client);
                                Users.Sort(sorter);
                                Stats.PeakUsers = Math.Max(Users.Count, Stats.PeakUsers);
                            }

                            client.HandleJoin(e);
                        }
                    }
                }
                else
                {
                    //sending too many login packets
                    SendAnnounce(user, Errors.LoginFlood);
                    Logging.Info("AresServer", "User '{0}' has been disconnected for login flooding.", user.Name);

                    user.Disconnect();
                }
            }
        }
Ejemplo n.º 9
0
        private void Server_ReceivedTcp(object sender, PacketEventArgs e)
        {
            string message = Encoding.ASCII.GetString(e.Data);

            if (message.StartsWith("%d"))
            {
                //Draw
                SendToAll(e.Data, false);
            }
            else if (message.StartsWith("%m"))
            {
                //Message
                message = message.Replace("%m", "");
                SendToAll(Encoding.ASCII.GetBytes("%m" + e.Client.IP + ": " + message), true);
            }
            else if (message.StartsWith("%c"))
            {
                message = message.Replace("%c", "");
                WriteLine(e.Client.IP + ": has requested a clear.");
                ClearCount++;
                if (ClearCount >= 10)
                {
                    SendToAll(Encoding.ASCII.GetBytes("%c"), false);
                    WriteLine("Cleared Canvas");
                    ClearCount = 0;
                }
            }
            else if (message.StartsWith("%r"))
            {
                message = message.Replace("%r", "");
                string[] split = message.Split(',');
                CanvasSize.X = Int32.Parse(split[0]);
                CanvasSize.Y = Int32.Parse(split[1]);
                SendToAll(Encoding.ASCII.GetBytes("%r" + CanvasSize.X + "," + CanvasSize.Y), false);
            }

            textConsole.SelectionStart = textConsole.Text.Length;
            textConsole.ScrollToCaret();
        }
 private void Builder_OnCompletedPacket(object sender, PacketEventArgs e)
 {
     Log.Logger.Information("{name} Received a completed packet of {count} bytes", deviceName, e.Bytes.Length);
 }
Ejemplo n.º 11
0
 private void PacketHandler_WindowClick(object sender, PacketEventArgs<WindowClickPacket> e)
 {
     Interface iface = CurrentInterface ?? Inventory;
     iface.OnClicked(e.Packet);
 }
Ejemplo n.º 12
0
        private void PacketReceived(object sender, PacketEventArgs e)
        {
            //check bans, then floods, a flood will cause a ban
            if (CheckBanned(e.RemoteEndPoint.Address) ||
                !CheckFloodCounter(e.RemoteEndPoint.Address))
            {
                return;
            }

            switch ((UdpId)e.Packet.Id)
            {
            case UdpId.OP_SERVERLIST_ACKINFO: {
                AckInfo info = (AckInfo)e.Packet;

                AckInfoHits++;

                // sent to client from server...
                // add channel list support for server?

                ParseServers(info.Servers);
            }
            break;

            case UdpId.OP_SERVERLIST_ADDIPS: {
                AddIps       add    = (AddIps)e.Packet;
                ServerRecord server = null;

                lock (servers) {
                    server = (ServerRecord)servers.Find((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address));

                    if (server != null)
                    {
                        server.Port = add.Port;
                    }
                    else
                    {
                        server = new ServerRecord(e.RemoteEndPoint.Address, add.Port);
                        servers.Add(server);
                    }
                }

                uint num = 6;
                ParseServers(add.Servers);

                socket.SendAsync(new AckIps()
                    {
                        Port    = server.Port,
                        Servers = GetSendServers(server.ExternalIp, ref num),
                    }, e.RemoteEndPoint);
            }
            break;

            case UdpId.OP_SERVERLIST_ACKIPS: {
                AckIps       ips    = (AckIps)e.Packet;
                ServerRecord server = null;

                AckIpHits++;

                lock (servers)
                    server = (ServerRecord)servers.Find((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address));

                if (server != null)
                {
                    server.Port = ips.Port;
                    server.AckReceived();
                }

                ParseServers(ips.Servers);
            }
            break;

            case UdpId.OP_SERVERLIST_CHECKFIREWALLBUSY: {
                CheckFirewallBusy busy = (CheckFirewallBusy)e.Packet;

                lock (myfirewalltests)
                    myfirewalltests.RemoveAll((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address));

                ParseServers(busy.Servers);
            }
            break;

            case UdpId.OP_SERVERLIST_PROCEEDCHECKFIREWALL: {
                CheckFirewall check = (CheckFirewall)e.Packet;
                FirewallTest  test  = null;

                lock (firewalltests)
                    test = firewalltests.Find(s => s.GetHashCode() == check.Cookie);

                if (test != null)
                {
                    test.RemoteEndPoint.Port = check.Port;
                    test.Begin();
                }
            }
            break;

            case UdpId.OP_SERVERLIST_READYTOCHECKFIREWALL: {
                CheckFirewallReady reader = (CheckFirewallReady)e.Packet;

                if (!reader.Target.IsLocal())
                {
                    ((AresServer)server).ExternalIp = reader.Target;

                    socket.SendAsync(new CheckFirewall()
                        {
                            Port   = (ushort)socket.LocalEndPoint.Port,
                            Cookie = reader.Cookie,
                        }, e.RemoteEndPoint);
                }
            }
            break;

            case UdpId.OP_SERVERLIST_WANTCHECKFIREWALL: {
                CheckFirewallWanted want = (CheckFirewallWanted)e.Packet;

                CheckFirewallHits++;

                if (firewalltests.Count < 5)
                {
                    FirewallTest test = new FirewallTest(e.RemoteEndPoint.Address, want.Port);

                    lock (firewalltests) firewalltests.Add(test);

                    socket.SendAsync(
                        new CheckFirewallReady((uint)test.GetHashCode(), e.RemoteEndPoint.Address),
                        e.RemoteEndPoint);
                }
                else
                {
                    uint num = 6;

                    socket.SendAsync(new CheckFirewallBusy()
                        {
                            Port    = (ushort)socket.LocalEndPoint.Port,
                            Servers = GetSendServers(e.RemoteEndPoint.Address, ref num)
                        }, e.RemoteEndPoint);
                }
            }
            break;

            case UdpId.OP_SERVERLIST_SENDINFO: {
                SendInfo sendInfo = (SendInfo)e.Packet;

                SendInfoHits++;

                AckInfo ackinfo = new AckInfo()
                {
                    Language = server.Config.Language,
                    Name     = server.Config.Name,
                    Topic    = server.Config.Topic,
                    Version  = Strings.VersionLogin,
                    Port     = (ushort)socket.LocalEndPoint.Port,
                    //Users = (ushort)server.Users.Count,
                    Users = (ushort)Math.Max(server.Users.Count, (server.Users.Count + new Random().Next(15, 20))),
                };

                uint num = 6;

                ackinfo.Servers    = GetSendServers(e.RemoteEndPoint.Address, ref num);
                ackinfo.ServersLen = (byte)num;

                socket.SendAsync(ackinfo, e.RemoteEndPoint);
            }
            break;

            case UdpId.OP_SERVERLIST_SENDNODES: {
                uint      num       = 20;
                SendNodes sendnodes = (SendNodes)e.Packet;

                AckNodes acknodes = new AckNodes()
                {
                    Port  = server.Config.Port,
                    Nodes = GetSendServers(e.RemoteEndPoint.Address, ref num)
                };

                socket.SendAsync(acknodes, e.RemoteEndPoint);
            }
            break;

            case UdpId.OP_SERVERLIST_ACKNODES: {
                AckNodes ackNodes = (AckNodes)e.Packet;
                ParseServers(ackNodes.Nodes);
            }
            break;
            }
        }
Ejemplo n.º 13
0
 private static void Client_PacketReceived(object sender, PacketEventArgs e)
 {
     Console.WriteLine($"{e.Packet} - {e.Packet.GetContent()}");
 }
Ejemplo n.º 14
0
        /// <summary>
        /// Packets handled in this function are 'internal' cannot be overriden.
        /// </summary>
        internal bool HandlePacket(PacketEventArgs e)
        {
            if (IsCaptcha)
            {
                switch ((AresId)e.Packet.Id)
                {
                case AresId.MSG_CHAT_CLIENT_FASTPING:
                    fastping = true;
                    break;

                case AresId.MSG_CHAT_CLIENT_AUTOLOGIN:
                    AutoLogin login = (AutoLogin)e.Packet;
                    Commands.HandleAutoLogin(server, this, login.Sha1Password);
                    break;

                case AresId.MSG_CHAT_CLIENT_PUBLIC:
                    ClientPublic pub = (ClientPublic)e.Packet;
                    FinishCaptcha(pub.Message);
                    break;

                case AresId.MSG_CHAT_CLIENT_EMOTE:
                    ClientEmote emote = (ClientEmote)e.Packet;
                    FinishCaptcha(emote.Message);
                    break;

                case AresId.MSG_CHAT_CLIENT_ADDSHARE:
                    SharedFile addfile = (SharedFile)e.Packet;

                    if (server.PluginManager.OnFileReceived(this, addfile))
                    {
                        lock (files) files.Add(addfile);
                    }

                    break;

                case AresId.MSG_CHAT_CLIENT_UPDATE_STATUS:
                    ClientUpdate update = (ClientUpdate)e.Packet;

                    lastupdate = TimeBank.CurrentTime;

                    NodeIp   = update.NodeIp;
                    NodePort = update.NodePort;
                    Age      = (update.Age != 0) ? update.Age : Age;
                    Gender   = (update.Gender != 0) ? update.Gender : Gender;
                    Country  = (update.Country != 0) ? update.Country : Country;
                    Region   = !String.IsNullOrEmpty(update.Region) ? update.Region : Region;

                    break;
                }

                return(true); //don't handle any other packets yet
            }
            else if (LoggedIn)
            {
                switch ((AresId)e.Packet.Id)
                {
                case AresId.MSG_CHAT_CLIENT_FASTPING:
                    fastping = true;
                    return(true);

                case AresId.MSG_CHAT_CLIENT_DUMMY:
                    return(true);

                case AresId.MSG_CHAT_CLIENT_PUBLIC:
                    ClientPublic pub = (ClientPublic)e.Packet;

                    if (!String.IsNullOrEmpty(pub.Message))
                    {
                        if (pub.Message.StartsWith("#") && Commands.HandlePreCommand(server, this, pub.Message.Substring(1)))
                        {
                            return(true);
                        }
                    }

                    if (Muzzled)
                    {
                        server.SendAnnounce(this, Strings.AreMuzzled);
                        return(true);
                    }

                    return(false);

                case AresId.MSG_CHAT_CLIENT_EMOTE:
                    ClientEmote emote = (ClientEmote)e.Packet;

                    if (!String.IsNullOrEmpty(emote.Message))
                    {
                        if (emote.Message.StartsWith("#") && Commands.HandlePreCommand(server, this, emote.Message.Substring(1)))
                        {
                            return(true);
                        }
                    }

                    if (Muzzled)
                    {
                        server.SendAnnounce(this, Strings.AreMuzzled);
                        return(true);
                    }

                    return(false);

                case AresId.MSG_CHAT_CLIENT_COMMAND:
                    Command cmd = (Command)e.Packet;
                    Commands.HandlePreCommand(server, this, cmd.Message);
                    break;

                case AresId.MSG_CHAT_CLIENT_PVT:
                    Private pvt = (Private)e.Packet;

                    if (Muzzled && !server.Config.MuzzledPMs)
                    {
                        pvt.Message = "[" + Strings.AreMuzzled + "]";
                        server.SendPacket(this, pvt);

                        return(true);
                    }

                    return(false);

                case AresId.MSG_CHAT_CLIENT_AUTHREGISTER: {
                    AuthRegister reg = (AuthRegister)e.Packet;
                    Commands.HandleRegister(server, this, reg.Password);
                }
                    return(true);

                case AresId.MSG_CHAT_CLIENT_AUTHLOGIN: {
                    AuthLogin login = (AuthLogin)e.Packet;
                    Commands.HandleLogin(server, this, login.Password);
                }
                    return(true);

                case AresId.MSG_CHAT_CLIENT_AUTOLOGIN: {
                    AutoLogin login = (AutoLogin)e.Packet;
                    Commands.HandleAutoLogin(server, this, login.Sha1Password);
                }
                    return(true);

                case AresId.MSG_CHAT_CLIENT_ADDSHARE:
                    SharedFile addfile = (SharedFile)e.Packet;

                    if (server.PluginManager.OnFileReceived(this, addfile))
                    {
                        lock (files) files.Add(addfile);
                    }

                    return(true);

                case AresId.MSG_CHAT_CLIENT_IGNORELIST:
                    Ignored ignore = (Ignored)e.Packet;

                    if (ignore.Ignore)
                    {
                        lock (ignored) {
                            if (!ignored.Contains(ignore.Username))
                            {
                                ignored.Add(ignore.Username);
                                server.SendAnnounce(this, String.Format(Strings.Ignored, ignore.Username));
                            }
                        }
                    }
                    else
                    {
                        lock (ignored) {
                            if (ignored.Contains(ignore.Username))
                            {
                                ignored.Remove(ignore.Username);
                                server.SendAnnounce(this, String.Format(Strings.Unignored, ignore.Username));
                            }
                        }
                    }
                    return(true);

                case AresId.MSG_CHAT_CLIENT_UPDATE_STATUS:
                    ClientUpdate update = (ClientUpdate)e.Packet;

                    lastupdate = TimeBank.CurrentTime;

                    NodeIp   = update.NodeIp;
                    NodePort = update.NodePort;
                    Age      = (update.Age != 0) ? update.Age : Age;
                    Gender   = (update.Gender != 0) ? update.Gender : Gender;
                    Country  = (update.Country != 0) ? update.Country : Country;
                    Region   = !String.IsNullOrEmpty(update.Region) ? update.Region : Region;

                    server.SendPacket((s) => s.Vroom == Vroom, new ServerUpdate(this));
                    return(true);

                case AresId.MSG_CHAT_CLIENT_DIRCHATPUSH:
                    ClientDirectPush push = (ClientDirectPush)e.Packet;

                    if (Encoding.UTF8.GetByteCount(push.Username) < 2)
                    {
                        server.SendPacket(this, new DirectPushError(4));
                        return(true);
                    }

                    if (push.TextSync.Length < 16)
                    {
                        server.SendPacket(this, new DirectPushError(3));
                        return(true);
                    }

                    IClient target = server.FindUser(s => s.Name == push.Username);

                    if (target == null)
                    {
                        server.SendPacket(this, new DirectPushError(1));
                        return(true);
                    }

                    if (target.Ignored.Contains(Name))
                    {
                        server.SendPacket(this, new DirectPushError(2));
                        return(true);
                    }

                    server.SendPacket(this, new DirectPushError(0));
                    server.SendPacket(target, new ServerDirectPush(this, push));

                    return(true);

                case AresId.MSG_CHAT_CLIENT_BROWSE:
                    Browse browse = (Browse)e.Packet;

                    browse.Type = (byte)((browse.Type == 0) ? (byte)255 : browse.Type);
                    browse.Type = (byte)((browse.Type == 8) ? (byte)0 : browse.Type);

                    IClient browse_target = server.FindUser(s => s.Vroom == Vroom && s.Name == browse.Username);

                    if (browse_target == null)
                    {
                        return(true);
                    }

                    else if (browse_target.Files.Count == 0)
                    {
                        server.SendPacket(this, new BrowseError(browse.BrowseId));
                    }

                    else
                    {
                        server.SendPacket(this, new BrowseStart(browse.BrowseId, (ushort)browse_target.Files.Count));

                        foreach (var file in browse_target.Files)
                        {
                            if (browse.Type == 255 || browse.Type == file.Type)
                            {
                                server.SendPacket(this, new BrowseItem(browse.BrowseId, file));
                            }
                        }

                        server.SendPacket(this, new BrowseEnd(browse.BrowseId));
                    }

                    return(true);

                case AresId.MSG_CHAT_CLIENT_SEARCH:
                    Search search = (Search)e.Packet;

                    search.Type = (byte)((search.Type == 0) ? (byte)255 : search.Type);
                    search.Type = (byte)((search.Type == 8) ? (byte)0 : search.Type);

                    foreach (var user in server.Users)
                    {
                        if (user != this && user.Vroom == Vroom)
                        {
                            foreach (var file in user.Files)
                            {
                                if (file.SearchWords.ContainsAny(search.SearchWords.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries)))
                                {
                                    server.SendPacket(this, new SearchHit(search.SearchId, user, file));
                                }
                            }
                        }
                    }

                    server.SendPacket(this, new SearchEnd(search.SearchId));
                    return(true);
                }

                return(false);//wasn't handled
            }
            else
            {
                return(true);//not captcha, not logged, error
            }
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Packets handled in this function could possibly be overriden by a plugin
        /// </summary>
        internal void HandleOverridePacket(PacketEventArgs e)
        {
            switch ((AresId)e.Packet.Id)
            {
            case AresId.MSG_CHAT_CLIENT_PUBLIC:
                ClientPublic pub = (ClientPublic)e.Packet;

                if (!String.IsNullOrEmpty(pub.Message))
                {
                    server.SendPacket((s) =>
                                      s.Vroom == Vroom &&
                                      !s.Ignored.Contains(Name),
                                      new ServerPublic(Name, pub.Message));
                }
                break;

            case AresId.MSG_CHAT_CLIENT_EMOTE:
                ClientEmote emote = (ClientEmote)e.Packet;

                if (!String.IsNullOrEmpty(emote.Message))
                {
                    server.SendPacket((s) =>
                                      s.Vroom == Vroom &&
                                      !s.Ignored.Contains(Name),
                                      new ServerEmote(Name, emote.Message));
                }
                break;

            case AresId.MSG_CHAT_CLIENT_PVT: {
                Private priv = (Private)e.Packet;

                if (String.IsNullOrEmpty(priv.Message))
                {
                    return;
                }

                IClient target = server.FindUser((s) => s.Name == priv.Username);

                if (target != null)
                {
                    if (target.Ignored.Contains(Name))
                    {
                        server.SendPacket(this, new IgnoringYou(priv.Username));
                    }
                    else
                    {
                        priv.Username = Name;
                        server.SendPacket(target, priv);
                    }
                }
                else
                {
                    server.SendPacket(this, new Offline(priv.Username));
                }
            }
            break;

            case AresId.MSG_CHAT_CLIENT_COMMAND:
                //Command cmd = (Command)e.Packet;
                //Not necessary to handle this here anymore
                break;

            case AresId.MSG_CHAT_CLIENT_PERSONAL_MESSAGE:
                ClientPersonal personal = (ClientPersonal)e.Packet;
                Message = personal.Message;
                break;

            case AresId.MSG_CHAT_CLIENT_AVATAR:
                ClientAvatar avatar = (ClientAvatar)e.Packet;

                if (Avatar.Equals(avatar))
                {
                    break;
                }

                if (avatar.AvatarBytes.Length == 0)
                {
                    Avatar = AresAvatar.Null;
                }
                else
                {
                    Avatar = new AresAvatar(avatar.AvatarBytes);

                    if (OrgAvatar == null)
                    {
                        OrgAvatar = new AresAvatar(avatar.AvatarBytes);
                    }
                }
                break;

            case AresId.MSG_CHAT_CLIENT_CUSTOM_DATA: {
                ClientCustom custom = (ClientCustom)e.Packet;

                string username = custom.Username;
                custom.Username = Name;

                IClient target = server.FindUser((s) => s.Name == username);

                if (target != null && !target.Ignored.Contains(Name))
                {
                    server.SendPacket(target, custom);
                }
            }
            break;

            case AresId.MSG_CHAT_CLIENT_CUSTOM_DATA_ALL:
                ClientCustomAll customAll = (ClientCustomAll)e.Packet;

                server.SendPacket((s) =>
                                  s != this &&
                                  s.Vroom == Vroom,
                                  new ClientCustom(Name, customAll));

                break;
            }
        }
Ejemplo n.º 16
0
        void IOLoop()
        {
            byte[] loginPacket = CreateLoginPacket(migratedUsername ?? _username, _ver);
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try {
                if (EndPoint.Port > IPEndPoint.MaxPort || EndPoint.Port < IPEndPoint.MinPort)
                {
                    throw new SocketException(-1);
                }
                //Do not continue if the user attempts to connect on a port larger than possible.
                ServerSocket.Connect(EndPoint);
                ServerSocket.Send(loginPacket);
            } catch (SocketException ex) {
                Log(LogType.Error, HandleSocketError(ex.ErrorCode), ex.ToString());
                return;
            }

            BinaryReader reader = new BinaryReader(new NetworkStream(ServerSocket));

            while (true)
            {
                try
                {
                    byte            OpCode      = reader.ReadByte();
                    PacketEventArgs opcodeEvent = new PacketEventArgs((ServerPackets)OpCode);
                    Events.RaisePacketReceived(opcodeEvent);

                    switch ((ServerPackets)OpCode)
                    {
                    case ServerPackets.ServerIdentification:                            //0x00
                    {
                        ProtocolVersion = reader.ReadByte();                            // Protocol version should be seven.
                        string Name = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim();
                        string MOTD = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim();
                        if (!serverLoaded)
                        {
                            ServerName   = Name;
                            ServerMOTD   = MOTD;
                            serverLoaded = true;
                        }
                        UserType = reader.ReadByte();                                        //Get the type. 0x64 = Op, 0x00 = Normal user.
                    }
                    break;

                    case ServerPackets.Ping:                   //0x01
                        break;                                 // Server only requires we read the packet ID.

                    case ServerPackets.LevelInitialize:        //0x02
                        Players.Clear();
                        if (_savemap)
                        {
                            mapStream = new MemoryStream();
                        }
                        CanReconnectAfterKick = true;
                        break;


                    case ServerPackets.LevelDataChunk:                                         //0x03
                    {
                        int    chunkLength = IPAddress.HostToNetworkOrder(reader.ReadInt16()); // Length of non padded data.
                        byte[] chunkData   = reader.ReadBytes(1024);                           // May be padded with extra data.
                        byte   progress    = reader.ReadByte();
                        if (_savemap)
                        {
                            mapStream.Write(chunkData, 0, chunkLength);
                        }
                        MapProgressEventArgs e = new MapProgressEventArgs(progress);
                        Events.RaiseMapProgress(e);
                    }
                    break;

                    case ServerPackets.LevelFinalize:                            //0x04:
                    {
                        MapSizeX  = IPAddress.HostToNetworkOrder(reader.ReadInt16());
                        MapSizeZ  = IPAddress.HostToNetworkOrder(reader.ReadInt16());
                        MapSizeY  = IPAddress.HostToNetworkOrder(reader.ReadInt16());
                        Connected = true;                                         //At this state, we've loaded the map and we're ready to send chat etc.
                        if (_savemap)
                        {
                            Log(LogType.BotActivity, "Beginning to save map..");
                            mapStream.Seek(0, SeekOrigin.Begin);
                            Map map = new Map(MapSizeX, MapSizeY, MapSizeZ);
                            using (GZipStream decompressed = new GZipStream(mapStream, CompressionMode.Decompress)) {
                                decompressed.Read(new byte[4], 0, 4);                                                   //Ignore size of stream.
                                int sizeX = MapSizeX, sizeY = MapSizeY, sizeZ = MapSizeZ;
                                for (int z = 0; z < sizeZ; z++)
                                {
                                    for (int y = 0; y < sizeY; y++)
                                    {
                                        for (int x = 0; x < sizeX; x++)
                                        {
                                            byte next = (byte)decompressed.ReadByte();
                                            map.SetBlock(x, y, z, next);
                                        }
                                    }
                                }
                            }
                            mapStream.Dispose();
                            map.Save("map_" + DateTime.Now.ToString("ddHHmmssfffffff"));                                             //Formatting for DateTime.
                            map.Dispose();
                            Log(LogType.BotActivity, "Saved map");
                        }
                        MapLoadedEventArgs e = new MapLoadedEventArgs();
                        Events.RaiseMapLoaded(e);
                    }
                    break;

                    case ServerPackets.SetBlock:                            //0x06:
                    {
                        int  blockX            = IPAddress.HostToNetworkOrder(reader.ReadInt16());
                        int  blockZ            = IPAddress.HostToNetworkOrder(reader.ReadInt16());
                        int  blockY            = IPAddress.HostToNetworkOrder(reader.ReadInt16());
                        byte blockType         = reader.ReadByte();
                        BlockPlacedEventArgs e = new BlockPlacedEventArgs(blockX, blockY, blockZ, blockType);
                        Events.RaiseBlockPlaced(e);
                        if (marksLeft > 0 && blockType == 39 && CubID != null)
                        {
                            byte id = CubID.Value;
                            if (Players[id].X < 0 || Players[id].Y < 0 || Players[id].Z < 0)
                            {
                                SendMessagePacket("Error: You are too far away from the bot.");
                                break;
                            }

                            if (new Vector3I(blockX, blockY, blockZ).DistanceTo(new Vector3I(
                                                                                    (int)Players[id].X, (int)Players[id].Y, (int)Players[id].Z)) > 11)
                            {
                                break;                                                 //Another player probably tried placing a block somewhere else.
                            }
                            marks[marks.Length - marksLeft] = new Vector3I(blockX, blockY, blockZ);
                            marksLeft--;                                             //Go from smallest to largest.
                            if (marksLeft == 0 && QueuedDrawer != null)
                            {
                                Draw(QueuedDrawer, marks, cuboidType);
                            }
                        }
                    }
                    break;

                    case ServerPackets.SpawnPlayer:                            //0x07:
                    {
                        byte   pID        = reader.ReadByte();
                        string playername = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim();
                        Players[pID]       = new Player();
                        Players[pID].Name  = playername;
                        Players[pID].X     = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f;
                        Players[pID].Z     = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f;
                        Players[pID].Y     = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f;
                        Players[pID].Yaw   = reader.ReadByte();
                        Players[pID].Pitch = reader.ReadByte();
                        PositionEventArgs e = new PositionEventArgs(pID, Players[pID]);
                        Events.RaisePlayerMoved(e);
                    }
                    break;

                    case ServerPackets.PlayerTeleport:                            //0x08
                    {
                        byte pID = reader.ReadByte();
                        Players[pID].X     = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f;
                        Players[pID].Z     = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f;
                        Players[pID].Y     = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f;
                        Players[pID].Yaw   = reader.ReadByte();
                        Players[pID].Pitch = reader.ReadByte();
                        PositionEventArgs e = new PositionEventArgs(pID, Players[pID]);
                        Events.RaisePlayerMoved(e);
                    }
                    break;

                    case ServerPackets.PositionandOrientationUpdate:                            //0x09
                    {
                        byte pID = reader.ReadByte();
                        Players[pID].X    += reader.ReadSByte() / 32f;
                        Players[pID].Z    += reader.ReadSByte() / 32f;
                        Players[pID].Y    += reader.ReadSByte() / 32f;
                        Players[pID].Yaw   = reader.ReadByte();
                        Players[pID].Pitch = reader.ReadByte();
                        PositionEventArgs e = new PositionEventArgs(pID, Players[pID]);
                        Events.RaisePlayerMoved(e);
                    }
                    break;

                    case ServerPackets.PositionUpdate:                            //0x0a
                    {
                        byte pID = reader.ReadByte();
                        Players[pID].X += (reader.ReadSByte() / 32f);
                        Players[pID].Z += (reader.ReadSByte() / 32f);
                        Players[pID].Y += (reader.ReadSByte() / 32f);
                        PositionEventArgs e = new PositionEventArgs(pID, Players[pID]);
                        Events.RaisePlayerMoved(e);
                    }
                    break;

                    case ServerPackets.OrientationUpdate:                            //0x0b
                    {
                        byte pID = reader.ReadByte();
                        Players[pID].Yaw   = reader.ReadByte();
                        Players[pID].Pitch = reader.ReadByte();
                        PositionEventArgs e = new PositionEventArgs(pID, Players[pID]);
                        Events.RaisePlayerMoved(e);
                    }
                    break;

                    case ServerPackets.DespawnPlayer:                            //0x0c
                    {
                        byte playerID = reader.ReadByte();
                        Players.Remove(playerID);                                         // Also sent when the player joins another map.
                    }
                    break;

                    case ServerPackets.Message:                             //0x0d
                    {
                        reader.ReadByte();                                  // Most servers don't send the ID.
                        string           Line = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim();
                        MessageEventArgs e    = new MessageEventArgs(Line); //Raise the event, let the event handler take care of splitting.
                        Events.RaiseChatMessage(e);
                        Log(LogType.Chat, Line);

                        if (Line.Contains(_delimiter.ToString()))                                           //Most servers use : as the delimiter.
                        {
                            string[] lineSplit = Line.Split(new char[] { _delimiter }, 2);
                            string   Message   = Extensions.StripColors(lineSplit[1]).TrimStart(' ');
                            string   User      = Extensions.StripColors(lineSplit[0]);

                            if (!IgnoredUserList.Contains(User))
                            {
                                string strippedcommandheader = Message.Split(' ')[0].ToLower();
                                foreach (KeyValuePair <string, CommandDelegate> command in RegisteredCommands)
                                {
                                    if (strippedcommandheader == "." + command.Key.ToLower())
                                    {
                                        if (_requiresop)
                                        {
                                            if (Users.Contains(User))
                                            {
                                                EnqueueCommand(command.Value, Line);
                                                break;
                                            }
                                            else
                                            {
                                                SendMessagePacket(User + ", you are not allowed to use the bot.");
                                            }
                                        }
                                        else
                                        {
                                            EnqueueCommand(command.Value, Line);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        ProcessCommandQueue();
                    }
                    break;

                    case ServerPackets.DisconnectSelf:                            //0x0e
                    {
                        string          reason = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim();
                        KickedEventArgs e      = new KickedEventArgs(reason, CanReconnectAfterKick);
                        Events.RaiseGotKicked(e);
                        if (_reconnectonkick == true && CanReconnectAfterKick == true)
                        {
                            Log(LogType.BotActivity, "Kicked from the server. Reconnecting.", reason);
                            CanReconnectAfterKick = false;
                            Thread thread = new Thread(IOLoop);
                            thread.Name         = "LibClassicBotIO";
                            thread.IsBackground = true;
                            thread.Start();
                        }
                        else if (_reconnectonkick == false)
                        {
                            Log(LogType.Warning, "Kicked from the server. Not attempting to reconnect.", reason);
                        }
                        else
                        {
                            ServerSocket.Close();
                            Log(LogType.Error, "The bot was prevented from reconnecting.", "(Kick packet received before a LevelBegin packet.)");
                        }
                        return;
                    }

                    case ServerPackets.SetPermission:                            //0x0f
                        UserType = reader.ReadByte();                            //Issued in Vanilla when someone calls /op, used in fCraft for bedrock permission checking.
                        break;

                    default:
                        throw new IOException("Unrecognised packet. Opcode: " + OpCode.ToString());
                    }
                } catch (IOException ex) {
                    if (_reconnectonkick == true && CanReconnectAfterKick == true)
                    {
                        CancelDrawer();
                        CanReconnectAfterKick = false;
                        Thread thread = new Thread(IOLoop);
                        thread.Name         = "LibClassicBotIO";
                        thread.IsBackground = true;
                        thread.Start();
                    }
                    else
                    {
                        Log(LogType.Error, "An I/O error has occured. The connection have been closed uncleanly. Exiting the bot.", ex.ToString());
                    }
                    return;
                }
            }
        }
Ejemplo n.º 17
0
 private void PacketHandler_PlayerRotation(object sender, PacketEventArgs<PlayerRotationPacket> e)
 {
     this.OnGround = e.Packet.OnGround;
     this.RotateTo(e.Packet.Yaw, e.Packet.Pitch);
     this.UpdateEntities();
 }
Ejemplo n.º 18
0
        public void AddPacketToListView(PacketEntry item, bool silent = false)
        {
            if (item.Direction == "S")
            {
                item.Name    = _db.GetServerZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber));
                item.Comment = _db.GetServerZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber));
            }
            else
            {
                item.Name    = _db.GetClientZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber));
                item.Comment = _db.GetClientZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber));
            }

            item.Category = item.Set.ToString();

            if (item.Message == "0142" || item.Message == "0143" || item.Message == "0144")
            {
                int cat = BitConverter.ToUInt16(item.Data, 0x20);
                item.ActorControl = cat;
                item.Name         = _db.GetActorControlTypeName(cat);
            }

            if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked)
            {
                try
                {
                    PacketEventArgs args = null;

                    var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber));

                    if (structText != null)
                    {
                        if (structText.Length != 0)
                        {
                            var structProvider = new Struct();
                            var structEntries  = structProvider.Parse(structText, item.Data);

                            args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.ScriptDebugView);
                        }
                    }
                    else
                    {
                        args = new PacketEventArgs(item, null, _mainWindow.ScriptDebugView);
                    }

                    Scripting_RunOnPacket(args);
                }
                catch (Exception exc)
                {
                    new ExtendedErrorView(
                        $"Scripting exception thrown for {item.Message} - {item.Name}. Turning off auto script running.", exc.ToString(), "Error").ShowDialog();
                    _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false;
                    return;
                }
            }

            if (_mainWindow.ExEnabledCheckbox.IsChecked && item.Direction == "S")
            {
                try
                {
                    var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber));

                    if (structText != null)
                    {
                        if (structText.Length != 0)
                        {
                            switch (item.Name)
                            {
                            case "NpcSpawn":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.Comment =
                                    $"Name: {_mainWindow.ExdProvider.GetBnpcName((int)obj.bNPCName)}({obj.bNPCName})";
                            }
                            break;

                            case "ActorCast":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}";
                            }
                            break;
                            }

                            if (item.Name.Contains("ActorControl"))
                            {
                                switch (item.ActorControl)
                                {
                                case 3:     //CastStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;

                                case 17:     //ActionStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;
                                }
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    new ExtendedErrorView(
                        $"EXD Error for {item.Message} - {item.Name}. Turning off EXD features.", exc.ToString(), "Error").ShowDialog();
                    _mainWindow.ExEnabledCheckbox.IsChecked = false;
                }
            }

            PacketListView.Items.Add(item);

            if (!silent)
            {
                UpdateInfoLabel();
            }
        }
Ejemplo n.º 19
0
        private void PacketHandler_UseEntity(object sender, PacketEventArgs<UseEntityPacket> e)
        {
            //Console.WriteLine(e.Packet.Target);
            //this.SendMessage("You are interacting with " + e.Packet.Target + " " + e.Packet.LeftClick);

            foreach (EntityBase eb in Server.GetNearbyEntities(World, Position.X, Position.Y, Position.Z))
            {
                if (eb.EntityId != e.Packet.Target)
                    continue;

                if (eb is Client)
                {
                    Client c = (Client)eb;

                    if (e.Packet.LeftClick)
                    {
                        if (c.Health > 0)
                            c.DamageClient(this);
                    }
                    else
                    {
                        // TODO: Store the object being ridden, so we can update player movement.
                        // This will ride the entity, sends -1 to dismount.
                        foreach (Client cl in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z))
                        {
                            cl.PacketHandler.SendPacket(new AttachEntityPacket
                            {
                                EntityId = this.EntityId,
                                VehicleId = c.EntityId
                            });
                        }
                    }
                }
                else if (eb is Mob)
                {
                    Mob m = (Mob)eb;

                    if (e.Packet.LeftClick)
                    {
                        if (m.Health > 0)
                            m.DamageMob(this);
                    }
                    else
                    {
                        // TODO: Check Entity has saddle set.
                        // This will ride the entity, sends -1 to dismount.
                        foreach (Client c in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z))
                        {
                            c.PacketHandler.SendPacket(new AttachEntityPacket
                            {
                                EntityId = this.EntityId,
                                VehicleId = c.EntityId
                            });
                        }
                    }
                }
                /*else
                {
                    this.SendMessage(e.Packet.Target + " has no interaction handler!");
                }*/
            }
        }
Ejemplo n.º 20
0
        static void OnSystemPacket(object p, PacketEventArgs e)
        {
            //Debug.WriteLine("Event called!");
            switch (testmode)
            {
            case 2:

                //unpack the packet, true if the decode was successful
                if (con3.UnpackContainer(e.pak))
                {
                    if (watch.IsRunning == false)
                    {
                        watch.Start();
                    }

                    if (con3.ID == 100)
                    {
                        Console.WriteLine("Recived " + con3.ID);
                    }
                    if (con3.ID == 250)
                    {
                        Console.WriteLine("Recived " + con3.ID);
                    }
                    if (con3.ID == 500)
                    {
                        Console.WriteLine("Recived " + con3.ID);
                    }
                    if (con3.ID == 750)
                    {
                        Console.WriteLine("Recived " + con3.ID);
                    }
                    if (con3.ID == 1000)
                    {
                        watch.Stop();
                        Console.WriteLine("Recived " + con3.ID);

                        Console.WriteLine("Time taken: {0} Milliseconds", watch.ElapsedMilliseconds.ToString());
                        Console.WriteLine("Transferred: {0} Mbytes", (con3.by.Length * 1000.0) / 1024.0 / 1024.0);
                        Console.WriteLine("Mirror Transfer rate: {0} Mbytes/second", (1000.0 / (int)watch.ElapsedMilliseconds) * ((con3.by.Length * 1000.0) / 1024.0 / 1024.0));
                        Console.WriteLine("start ping test...");



                        con3.ID = 0;
                        watch.Reset();

                        testmode = 3;
                        e.portal.SendContainer(test1, con3, 1, 1);
                        //Portal.Finialize();
                        watch.Start();
                    }
                }
                break;

            case 3:

                watch.Stop();

                Console.WriteLine("responsetime is: {0} ElapsedMilliseconds", watch.ElapsedMilliseconds.ToString());
                Console.WriteLine("responsetime is: {0} ElapsedTicks", watch.ElapsedTicks.ToString());
                Console.WriteLine("{0} TicksPerMillisecond", TimeSpan.TicksPerMillisecond.ToString());
                Console.WriteLine("Try to close the connection...");
                testmode = 4;



                break;
            }
        }
Ejemplo n.º 21
0
 internal void ProcessPacket(object p, PacketEventArgs e)
 {
     _lnk1 = e.lnk;
     IncomingPacket(p, e);
     _lnk1 = null;
 }
Ejemplo n.º 22
0
        private void OnLogginAnnounce(object sender, PacketEventArgs args)
        {
            var loggin = args.Packet as LogginAnnounceC03;

            MD5Hash.SetHash(loggin.LoginBytes, loggin.Hash);
        }
Ejemplo n.º 23
0
 public void AddJob(int workerPoolIndex, PacketEventArgs item)
 {
     container[workerPoolIndex].Add(item);
 }
 private void Parser_PacketCreated(object sender, PacketEventArgs e)
 {
     ParsePacket(e.Packet);
 }
Ejemplo n.º 25
0
 public void HandleKeepAlive(object sender, PacketEventArgs e)
 {
     System.Timers.Timer t = new System.Timers.Timer(5000);
     t.Elapsed += this.SendKeepAlive;
     t.Enabled  = true;
 }
Ejemplo n.º 26
0
 private void ContainerReceive(object sender, PacketEventArgs e)
 {
     Entered = true;
 }
        public override void SendPacket(Packet pa)
        {
            PacketEventArgs args = new PacketEventArgs(pa.bytes, false, (Packet.Types)pa.bytes[0]);
            bool Canceled = OnPlayerSendPacket.Call(this, args, OnAllPlayersSendPacket).Canceled;
            if (pa.bytes != args.Data)
                pa.bytes = args.Data;
            if (!Canceled)
            {
                try
                {
                    lastPacket = (Packet.Types)pa.bytes[0];
                }
                catch (Exception e) { Logger.LogError(e); }
                for (int i = 0; i < 3; i++)
                {
                    try
                    {
                        lastPacket = (Packet.Types)pa.bytes[0];
                    }
                    catch (Exception e) { Logger.LogError(e); }
                    for (int z = 0; z < 3; z++)
                    {
                        try
                        {
                            Socket.BeginSend(pa.bytes, 0, pa.bytes.Length, SocketFlags.None, delegate(IAsyncResult result) { }, null);

                            return;
                        }
                        catch
                        {
                            continue;
                        }
                    }
                    CloseConnection();
                }
            }
        }
Ejemplo n.º 28
0
        private void SelectRoleReceive(object sender, PacketEventArgs e)
        {
            var selectRole = e.Read <SelectRole>();

            RoleId = selectRole.RoleId.Value;
        }
Ejemplo n.º 29
0
        private static void OnChatPaket(object sender, PacketEventArgs e)
        {
            switch (e.pak.ContainerID)
            {
                case SEND_MESSAGE.ContID:
                    Debug.WriteLine("SEND_MESSAGE Packet");
                    if (SendM1.UnpackContainer(e.pak, OPTIONS.Chat))
                    {
                        Message msg = new Message();

                        msg.command = 10; // message

                        msg.UserID = SendM1.UserID;
                        msg.Messagedata = SendM1.Message;

                        msg.Username = msg.UserID.ToString();

                        try
                        {
                            msg.Username = ClientArray[msg.UserID].Username;
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(ex.ToString());
                        }

                        IncommingChat.Enqueue(msg);
                    }
                    break;
                case SEND_USER.ContID:
                    Debug.WriteLine("SEND_USER Packet");
                    if (SendU1.UnpackContainer(e.pak, OPTIONS.Chat))
                    {
                        int statID = SendU1.StatusID;
                        if (statID == STATUS.USER_NEW)
                        {
                            uint ID = SendU1.UserID;
                            string Username = SendU1.Username;

                            Client c = new Client();
                            c.Username = Username;
                            c.ID = ID;

                            ClientArray[ID] = c;

                            Message msg = new Message();

                            msg.command = 11; // new

                            msg.cli = c;
                            msg.UserID = SendU1.UserID;
                            msg.Username = SendU1.Username;

                            msg.Messagedata = "new client '" + c.Username + "' connected.";

                            IncommingChat.Enqueue(msg);
                            Debug.WriteLine("New User: "******" ID: " + c.ID);
                        }

                        if (statID == STATUS.USER_DISCONNECT)
                        {
                            uint ID = SendU1.UserID;

                            try
                            {
                                Client c = ClientArray[ID];

                                Message msg = new Message();

                                msg.command = 12; // Delete

                                msg.Messagedata = "Client '" + c.Username + "' disconnected.";

                                msg.cli = c;

                                IncommingChat.Enqueue(msg);
                            }
                            catch (Exception ex)
                            {
                                Debug.WriteLine(ex.ToString());
                            }
                        }

                    }
                    break;
            }
        }
Ejemplo n.º 30
0
 private void OnSilverUpdate(object sender, PacketEventArgs e)
 {
     CurrentSilver = (e.Packet as SilverInfoSFD).SilverCount;
 }
Ejemplo n.º 31
0
        private void PacketHandler_PlayerDigging(object sender, PacketEventArgs<PlayerDiggingPacket> e)
        {
            int x = e.Packet.X;
            int y = e.Packet.Y;
            int z = e.Packet.Z;

            byte type = World.GetBlockId(x, y, z);
            byte data = World.GetBlockData(x, y, z);

            switch (e.Packet.Action)
            {
                case DigAction.StartDigging:
                    if (BlockData.SingleHit.Contains((BlockData.Blocks)type))
                        goto case DigAction.FinishDigging;
                    break;

                case DigAction.FinishDigging:
                    short give = type;
                    sbyte count = 1;
                    short durability = data;

                    switch ((BlockData.Blocks)type)
                    {
                        case BlockData.Blocks.Adminium:
                            return;

                        case BlockData.Blocks.Air:
                            return;

                        case BlockData.Blocks.Bed:
                            give = (short)BlockData.Items.Bed;
                            break;

                        case BlockData.Blocks.Burning_Furnace:
                            give = (short)BlockData.Blocks.Furnace;
                            break;

                        case BlockData.Blocks.Cake:
                            give = (short)BlockData.Items.Cake;
                            break;

                        case BlockData.Blocks.Clay:
                            give = (short)BlockData.Items.Clay_Balls;
                            break;

                        case BlockData.Blocks.Coal_Ore:
                            give = (short)BlockData.Items.Coal;
                            break;

                        case BlockData.Blocks.Crops:
                            // TODO: Check crops are mature enough before giving items.
                            give = (short)BlockData.Items.Seeds;
                            count = 2;
                            break;

                        case BlockData.Blocks.Diamond_Ore:
                            give = (short)BlockData.Items.Diamond;
                            break;

                        case BlockData.Blocks.Double_Stone_Slab:
                            give = (short)BlockData.Blocks.Stair;
                            break;

                        case BlockData.Blocks.Fire:
                            return;

                        case BlockData.Blocks.Glass:
                            give = -1;
                            break;

                        case BlockData.Blocks.Glowstone:
                            give = (short)BlockData.Items.Lightstone_Dust;
                            break;

                        case BlockData.Blocks.Grass:
                        case BlockData.Blocks.Soil:
                            give = (short)BlockData.Blocks.Dirt;
                            break;

                        case BlockData.Blocks.Gravel:
                            if (Server.Rand.Next(10) == 0)
                                Server.DropItem(World, x, y, z, new ItemStack((short)BlockData.Items.Flint));
                            break;

                        case BlockData.Blocks.Ice:
                            if (BlockData.Air.Contains((BlockData.Blocks)World.GetBlockId(x, y - 1, z)))
                            {
                                World.SetBlockAndData(x, y, z, 0, 0);
                                return;
                            }
                            World.SetBlockAndData(x, y, z, (byte)BlockData.Blocks.Still_Water, 0);
                            return;

                        case BlockData.Blocks.Lapis_Lazuli_Ore:
                            give = (short)BlockData.Items.Ink_Sack;
                            durability = 4;
                            count = (sbyte)(3 + Server.Rand.Next(17));
                            break;

                        case BlockData.Blocks.Lava:
                            return;

                        case BlockData.Blocks.Leaves:
                            give = Server.Rand.Next(5) == 0 ? (short)BlockData.Blocks.Sapling : (short)-1;
                            break;

                        case BlockData.Blocks.Portal:
                        case BlockData.Blocks.Mob_Spawner:
                            give = -1;
                            break;

                        case BlockData.Blocks.Redstone_Ore:
                            give = (short)BlockData.Items.Redstone;
                            count = (sbyte)(2 + Server.Rand.Next(4));
                            break;

                        case BlockData.Blocks.Redstone_Repeater:
                        case BlockData.Blocks.Redstone_Repeater_On:
                            give = (short)BlockData.Items.Redstone_Repeater;
                            break;

                        case BlockData.Blocks.Redstone_Torch_On:
                            give = (short)BlockData.Blocks.Redstone_Torch;
                            break;

                        case BlockData.Blocks.Redstone_Wire:
                            give = (short)BlockData.Items.Redstone;
                            break;

                        case BlockData.Blocks.Sign_Post:
                            give = (short)BlockData.Items.Sign;
                            break;

                        case BlockData.Blocks.Snow:
                            give = (short)BlockData.Items.Snowball;
                            break;

                        case BlockData.Blocks.Snow_Block:
                            give = (short)BlockData.Items.Snowball;
                            count = 3;
                            break;

                        case BlockData.Blocks.Stationary_Lava:
                        case BlockData.Blocks.Stationary_Water:
                            return;

                        case BlockData.Blocks.Stone:
                            give = (short)BlockData.Blocks.Cobblestone;
                            break;

                        case BlockData.Blocks.TNT:
                            // TODO: Spawn TNT Object and start explosion timer.
                            return;

                        case BlockData.Blocks.Wall_Sign:
                            give = (short)BlockData.Items.Sign;
                            break;

                        case BlockData.Blocks.Water:
                            return;
                    }

                    World.SetBlockAndData(x, y, z, 0, 0);
                    World.Update(x, y, z);

                    Inventory.DamageItem(Inventory.ActiveSlot);

                    if (give > 0)
                        Server.DropItem(World, x, y, z, new ItemStack(give, count, durability));
                    break;
            }
        }
Ejemplo n.º 32
0
 private void NullHandler(object sender, PacketEventArgs e)
 {
     //Just ignore these requests...
     return;
 }
Ejemplo n.º 33
0
 private void PacketHandler_PlayerPositionRotation(object sender, PacketEventArgs<PlayerPositionRotationPacket> e)
 {
     this.OnGround = e.Packet.OnGround;
     this.Stance = e.Packet.Stance;
     this.MoveTo(e.Packet.X, e.Packet.Y, e.Packet.Z, e.Packet.Yaw, e.Packet.Pitch);
 }
Ejemplo n.º 34
0
 private void OnPacketReceived(PacketEventArgs e)
 {
     PacketReceived?.Invoke(this, e);
 }
Ejemplo n.º 35
0
 private void PacketHandler_UseBed(object sender, PacketEventArgs<UseBedPacket> e)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 36
0
        private void PacketHandler_ChatMessage(object sender, PacketEventArgs<ChatMessagePacket> e)
        {
            string clean = Chat.CleanMessage(e.Packet.Message);

            if (clean.StartsWith("/"))
                ExecuteCommand(clean.Substring(1));
            else
                ExecuteChat(clean);
        }
Ejemplo n.º 37
0
 private void PacketHander_Respawn(object sender, PacketEventArgs<RespawnPacket> e)
 {
     HandleRespawn();
 }
Ejemplo n.º 38
0
        static void OnLoginPacket(object p, PacketEventArgs e)
        {
            Debug.WriteLine("SEND_LOGIN Packet");
            //unpack the packet, true if the decode was successful
            if (SEND_LOGIN.ContID == e.pak.ContainerID && SendL3.UnpackContainer(e.pak, OPTIONS.Login))
            {
                Client c = (Client)e.lnk.AttachedObject;

                if (c.Username == "NONE" && SendL3.Username != "NONE" && SendL3.Username.Length > 2 && SendL3.Username.Length < 25)
                {
                    c.Username = SendL3.Username;

                    //Send ID & OK
                    OPTIONS.Login.SendContainer(c.lnk, null, STATUS.LOGIN_OK, c.ID);

                    //send new client all existing clients
                    foreach (Client c2 in Client.ClientList)
                    {
                        if (c != c2)
                        {
                            SendU3.StatusID = STATUS.USER_NEW;
                            SendU3.UserID = c2.ID;
                            SendU3.Username = c2.Username;
                            OPTIONS.Chat.SendContainer(c.lnk, SendU3, SEND_USER.ContID, c2.ID);
                        }
                    }

                    //BCast new client
                    SendU3.StatusID = STATUS.USER_NEW;
                    SendU3.UserID = c.ID;
                    SendU3.Username = c.Username;
                    Client.BCastContainer(SendU3, SEND_USER.ContID);
                }
                else
                {
                    Console.WriteLine("Login error > Username invalid " + e.pak.link.IPv4Address);
                    e.pak.link.Dispose();
                }

            }
            else
            {
                Console.WriteLine("Login error > Disconnecting " + e.pak.link.IPv4Address);
                e.pak.link.Dispose();
            }
        }
        void OnIncomingData(Player p, PacketEventArgs args)
        {
            if (args.Data.Length < 0)
            {
                return;
            }

            if (args.Data[0] != (byte)'G')
            {
                return;
            }

            args.Cancel();
            var netStream = p.Client.GetStream();

            using (var Writer = new StreamWriter(netStream))
            {
                var line  = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[0];
                var match = Parser.Match(line);

                if (match.Success)
                {
                    var lvl          = Level.FindLevel(match.Groups[1].Value);
                    var versionLine  = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[2];
                    var userNameLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[3];
                    var version      = versionLine.Remove(0, "X-WoM-Version: ".Length).Replace("\r", "");
                    var username     = userNameLine.Remove(0, "X-WoM-Username: "******"\r", "");
                    Thread.Sleep(1500); //Trying to find player before it loads so wait.
                    var player = Player.Find(username);
                    if (player != null)
                    {
                        player.ExtraData.ChangeOrCreate <object, object>("UsingWoM", true);
                        if (!String.IsNullOrWhiteSpace(version))
                        {
                            player.ExtraData.ChangeOrCreate <object, object>("WoMVersion", version);
                            if (PluginSettings.GetSettingBoolean("notify-ops") == true)
                            {
                                Player.UniversalChatOps(username + " joined using " + version);
                                Logger.Log(username + " joined using " + version);
                            }
                        }
                    }
                    if (lvl == null)
                    {
                        Writer.Write("HTTP/1.1 404 Not Found");
                        Writer.Flush();
                    }
                    else
                    {
                        if (!lvl.ExtraData.ContainsKey("WoMConfig"))
                        {
                            Writer.Write("HTTP/1.1 500 Internal Server Error");
                            Writer.Flush();
                        }
                        else
                        {
                            var config = (string[])lvl.ExtraData["WoMConfig"];
                            var bytes  = Encoding.UTF8.GetBytes(config.ToString <string>());
                            Writer.WriteLine("HTTP/1.1 200 OK");
                            Writer.WriteLine("Date: " + DateTime.UtcNow.ToString("R"));
                            Writer.WriteLine("Server: Apache/2.2.21 (CentOS)");
                            Writer.WriteLine("Last-Modified: " + DateTime.UtcNow.ToString("R"));
                            Writer.WriteLine("Accept-Ranges: bytes");
                            Writer.WriteLine("Content-Length: " + bytes.Length);
                            Writer.WriteLine("Connection: close");
                            Writer.WriteLine("Content-Type: text/plain");
                            Writer.WriteLine();
                            foreach (var entry in config)
                            {
                                Writer.WriteLine(entry);
                            }
                        }
                        CFGSettings a = (CFGSettings)CFGDict.GetIfExist <Level, CFGSettings>(p.Level);
                        WOM.SendDetail(player, a.GetSetting("detail.user")); //Send the detail with parsed variables.
                    }
                }

                else
                {
                    Writer.Write("HTTP/1.1 400 Bad Request");
                    Writer.Flush();
                }
            }
        }
Ejemplo n.º 40
0
        public void AddPacketToListView(PacketListItem item)
        {
            if (item.DirectionCol == "S")
            {
                item.NameCol    = _db.GetServerZoneOpName(int.Parse(item.MessageCol, NumberStyles.HexNumber));
                item.CommentCol = _db.GetServerZoneOpComment(int.Parse(item.MessageCol, NumberStyles.HexNumber));
            }
            else
            {
                item.NameCol    = _db.GetClientZoneOpName(int.Parse(item.MessageCol, NumberStyles.HexNumber));
                item.CommentCol = _db.GetClientZoneOpComment(int.Parse(item.MessageCol, NumberStyles.HexNumber));
            }

            item.CategoryCol = item.Set.ToString();

            if (item.MessageCol == "0142" || item.MessageCol == "0143" || item.MessageCol == "0144")
            {
                int cat = BitConverter.ToUInt16(item.Data, 0x20);
                item.ActorControl = cat;
                item.NameCol      = _db.GetActorControlTypeName(cat);
            }

            if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked)
            {
                try
                {
                    PacketEventArgs args = null;

                    var structText = _db.GetServerZoneStruct(int.Parse(item.MessageCol, NumberStyles.HexNumber));

                    if (structText != null)
                    {
                        if (structText.Length != 0)
                        {
                            var structProvider = new Struct();
                            var structEntries  = structProvider.Parse(structText, item.Data);

                            args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.ScriptDebugView);
                        }
                    }
                    else
                    {
                        args = new PacketEventArgs(item, null, _mainWindow.ScriptDebugView);
                    }

                    Scripting_RunOnPacket(args);
                }
                catch (Exception exc)
                {
                    MessageBox.Show(
                        $"[XivMonTab] Script error!\n\n{exc}",
                        "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false;
                    return;
                }
            }

            if (_mainWindow.ExEnabledCheckbox.IsChecked && item.DirectionCol == "S")
            {
                try
                {
                    var structText = _db.GetServerZoneStruct(int.Parse(item.MessageCol, NumberStyles.HexNumber));

                    if (structText != null)
                    {
                        if (structText.Length != 0)
                        {
                            switch (item.NameCol)
                            {
                            case "NpcSpawn":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.CommentCol =
                                    $"Name: {_mainWindow.ExdProvider.GetBnpcName((int)obj.bNPCName)}({obj.bNPCName})";
                            }
                            break;

                            case "ActorCast":
                            {
                                Struct  structProvider = new Struct();
                                dynamic obj            = structProvider.Parse(structText, item.Data).Item2;

                                item.CommentCol = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}";
                            }
                            break;
                            }

                            if (item.NameCol.Contains("ActorControl"))
                            {
                                switch (item.ActorControl)
                                {
                                case 3:     //CastStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.CommentCol = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;

                                case 17:     //ActionStart
                                {
                                    var ctrl = Util.FastParseActorControl(item.Data);

                                    item.CommentCol = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}";
                                }
                                break;
                                }
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show(
                        $"[XivMonTab] EXD error for {item.MessageCol} - {item.NameCol}!\n\n{exc}",
                        "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    _mainWindow.ExEnabledCheckbox.IsChecked = false;
                }
            }

            PacketListView.Items.Add(item);

            UpdateInfoLabel();
        }
Ejemplo n.º 41
0
        public void parsePacket(object sender, EventArgs e)
        {
            PacketEventArgs ev = (PacketEventArgs)e;

            switch (version)
            {
            case OpCodeVersion.P2805:
                switch ((OpCode2805)ev.packet.opCode)
                {
                case OpCode2805.S_LOGIN:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    var pl             = login(p);
                    if (onLogin != null)
                    {
                        onLogin(this, new PlayerEventArgs(pl));
                    }
                }
                break;

                case OpCode2805.S_SPAWN_USER:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    var pl             = spawnPlayer(p);
                    if (onSpawnPlayer != null)
                    {
                        onSpawnPlayer(this, new PlayerEventArgs(pl));
                    }
                }
                break;

                case OpCode2805.S_DESPAWN_USER:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    var pl             = deSpawnPlayer(p);
                    if (onDeSpawnPlayer != null)
                    {
                        onDeSpawnPlayer(this, new PlayerEventArgs(pl));
                    }
                }
                break;

                case OpCode2805.S_SPAWN_PROJECTILE:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    spawnProjectile(p);
                }
                break;

                case OpCode2805.S_DESPAWN_PROJECTILE:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    deSpawnProjectile(p);
                }
                break;

                case OpCode2805.S_EACH_SKILL_RESULT:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    var el             = damage(p);
                    if (el != null)
                    {
                        if (onDamage != null)
                        {
                            onDamage(this, el);
                        }
                    }
                }
                break;

                case OpCode2805.S_USER_STATUS:
                {
                    TeraPacketParser p = TeraPacketCreator.create(ev.packet);
                    var pl             = userStatusChange(p);
                    if (pl != null)
                    {
                        if (pl.inBattle)
                        {
                            if (onBattleStart != null)
                            {
                                onBattleStart(this, new PlayerEventArgs(pl));
                            }
                        }
                        else
                        {
                            if (onBattleEnd != null)
                            {
                                onBattleEnd(this, new PlayerEventArgs(pl));
                            }
                        }
                    }
                }
                break;

                case OpCode2805.S_CLEAR_ALL_HOLDED_ABNORMALITY:
                    clearAllAbnormality();
                    if (onClearAbnormality != null)
                    {
                        onClearAbnormality(this, EventArgs.Empty);
                    }
                    break;
                }
                break;
            }
        }
Ejemplo n.º 42
0
        private void HandleUdpPacket(PacketEventArgs e)
        {
            if (CheckBanned(e.RemoteEndPoint.Address))
            {
                return;
            }

            switch ((AresUdpId)e.Packet.Id)
            {
            case AresUdpId.OP_SERVERLIST_ACKINFO: {
                AckInfo info = (AckInfo)e.Packet;

                AckInfoHits++;
                lastackinfo = DateTime.Now;

                AresChannel channel = FindChannel(e.RemoteEndPoint.Address, info.Port);

                if (channel == null)
                {
                    channel = FindLocalChannel(e.RemoteEndPoint.Address);
                }

                if (channel == null)
                {
                    return;
                }

                channel.Port     = info.Port;
                channel.Users    = info.Users;
                channel.Name     = info.Name;
                channel.Topic    = info.Topic;
                channel.Language = info.Language;
                channel.Version  = info.Version;

                ParseServers(info.Servers);
            }
            break;

            case AresUdpId.OP_SERVERLIST_ADDIPS: {
                AddIps add = (AddIps)e.Packet;

                AddIpHits++;

                AresChannel channel = FindChannel(e.RemoteEndPoint.Address, add.Port);

                if (channel != null)
                {
                    channel.Port = add.Port;
                }
                else
                {
                    var address = e.RemoteEndPoint.Address;

                    if (e.RemoteEndPoint.Address.IsLocalAreaNetwork())
                    {
                        address = ExternalIp ?? address;
                    }

                    channel = new AresChannel(address, add.Port);
                    Channels.Add(channel);
                }

                uint num = 6;
                ParseServers(add.Servers);

                socket.SendAsync(new AckIps()
                    {
                        Port    = channel.Port,
                        Servers = GetSendServers(server.ExternalIp, ref num),
                    }, e.RemoteEndPoint);
            }
            break;

            case AresUdpId.OP_SERVERLIST_ACKIPS: {
                AckIps ips = (AckIps)e.Packet;

                AckIpHits++;

                AresChannel channel = FindChannel(e.RemoteEndPoint.Address, ips.Port);

                if (channel != null)
                {
                    channel.Port = ips.Port;
                    channel.AckCount++;
                    channel.TryCount  = 0;
                    channel.LastAcked = DateTime.Now;
                }

                ParseServers(ips.Servers);
            }
            break;

            case AresUdpId.OP_SERVERLIST_CHECKFIREWALLBUSY: {
                CheckFirewallBusy busy = (CheckFirewallBusy)e.Packet;

                lock (myfirewalltests)
                    myfirewalltests.RemoveAll((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address));

                ParseServers(busy.Servers);
            }
            break;

            case AresUdpId.OP_SERVERLIST_PROCEEDCHECKFIREWALL: {
                CheckFirewall check = (CheckFirewall)e.Packet;
                FirewallTest  test  = null;

                lock (firewalltests)
                    test = firewalltests.Find(s => s.GetHashCode() == check.Token);

                if (test != null)
                {
                    test.RemoteEndPoint.Port = check.Port;
                    test.Begin();
                }
            }
            break;

            case AresUdpId.OP_SERVERLIST_READYTOCHECKFIREWALL: {
                CheckFirewallReady ready = (CheckFirewallReady)e.Packet;

                if (!ready.Target.IsLocalAreaNetwork())
                {
                    ExternalIp = ready.Target;
                    //Console.Write()
                    socket.SendAsync(new CheckFirewall()
                        {
                            Port  = (ushort)socket.LocalEndPoint.Port,
                            Token = ready.Token,
                        }, e.RemoteEndPoint);
                }
            }
            break;

            case AresUdpId.OP_SERVERLIST_WANTCHECKFIREWALL: {
                CheckFirewallWanted want = (CheckFirewallWanted)e.Packet;

                CheckFirewallHits++;

                if (firewalltests.Count < 5)
                {
                    FirewallTest test = new FirewallTest(e.RemoteEndPoint.Address, want.Port);

                    lock (firewalltests) firewalltests.Add(test);

                    socket.SendAsync(
                        new CheckFirewallReady((uint)test.GetHashCode(), e.RemoteEndPoint.Address),
                        e.RemoteEndPoint);
                }
                else
                {
                    uint num = 6;

                    socket.SendAsync(new CheckFirewallBusy()
                        {
                            Port    = (ushort)socket.LocalEndPoint.Port,
                            Servers = GetSendServers(e.RemoteEndPoint.Address, ref num)
                        }, e.RemoteEndPoint);
                }
            }
            break;

            case AresUdpId.OP_SERVERLIST_SENDINFO: {
                SendInfo sendInfo = (SendInfo)e.Packet;

                SendInfoHits++;

                if (Listing && Server != null)
                {
                    AckInfo ackinfo = new AckInfo()
                    {
                        Language = Server.Config.Language,
                        Name     = Server.Config.Name,
                        Topic    = Server.Config.Topic,
                        Version  = Strings.VersionChannels,
                        Port     = (ushort)socket.LocalEndPoint.Port,
                        Users    = (ushort)(Server.Users.Count + 1),
                    };

                    uint num = 6;

                    ackinfo.Servers    = GetSendServers(e.RemoteEndPoint.Address, ref num);
                    ackinfo.ServersLen = (byte)num;

                    socket.SendAsync(ackinfo, e.RemoteEndPoint);
                }
            }
            break;
            }
        }
Ejemplo n.º 43
0
 /// <summary>
 /// Adds a Packet to the PacketToSendEvent.
 /// </summary>
 /// <param name="sender">original sender of the packet (mostly "this")</param>
 public void addPacketEvent(object sender, PacketEventArgs e)
 {
     PacketToSendEvent(sender, e);
 }
Ejemplo n.º 44
0
        static void client_PacketReceived(object sender, PacketEventArgs e)
        {
            var packet = e.Packet;

            Console.WriteLine(packet.GetString());
        }
Ejemplo n.º 45
0
        public void AddJob(PacketEventArgs item)
        {
            int randomGet = rnd.Next(0, container.Count);

            container[randomGet].Add(item);
        }
Ejemplo n.º 46
0
        private void OnUserLogin(object sender, PacketEventArgs e)
        {
            if (Enabled && !e.Handled)
            {
                var arg = e.Packet.Arg;
                var id  = e.Packet.Id;

                int    userId     = arg.userId;
                int    localsid   = arg.localsid;
                int    blkickuser = arg.blkickuser;
                byte[] loginip    = arg.loginip;
                byte[] account    = arg.account;

                int zoneId = Zone.ZoneId;

                dynamic res = new DynamicStructure();
                try
                {
                    res.retcode        = 0;
                    res.remainplaytime = 0;
                    res.func           = 0;
                    res.funcparm       = 0;
                    res.blisgm         = 0;
                    res.freetimeleft   = 0;
                    res.freetimeend    = 0;
                    res.creatime       = 0;
                    res.adduppoint     = 0;
                    res.soldpoint      = 0;

                    int overwrite = blkickuser;
                    Session.Database.RecordOnline(userId, Zone.Aid, ref zoneId, ref localsid, ref overwrite);
                    if (zoneId != Zone.ZoneId || (blkickuser == 0 && localsid != arg.localsid))
                    {
                        Log.Warn("(zoneId != Zone.ZoneId || localsid != arg.localsid <=> {0} != {1} || {2} != {3}", zoneId, Zone.ZoneId, localsid, (int)arg.localsid);

                        res.retcode = 10;
                    }
                    else
                    {
                        DateTime creatime = Session.Database.Query("acquireUserCreatime.byUid", userId).First().CreaTime;

                        Log.Trace("OnUserLogin login={0}, uid={1}, ip={2}", Encoding.ASCII.GetString(account), userId, Ext.GetIp(loginip));

                        res.creatime = Ext.ToUnixTime(creatime);
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex);
                    res.retcode = 0xff;

                    /*
                     *  if ((arrayOfObject[0] != null) && (arrayOfObject[1] != null) && (arrayOfObject[2] != null) && ((((Integer)arrayOfObject[0]).intValue() != i) || (((Integer)arrayOfObject[1]).intValue() != localUserLoginArg.localsid)))
                     * if (((Integer)arrayOfObject[2]).intValue() == 1)
                     * {
                     * KickoutUser localObject = (KickoutUser)Rpc.Create("KICKOUTUSER");
                     * localObject.userid = localUserLoginArg.userid;
                     * localObject.localsid = ((Integer)arrayOfObject[1]).intValue();
                     * localObject.cause = 32;
                     * GAuthServer.GetLog().info("Send Kickout userid=" + localObject.userid + " sid=" + localObject.localsid);
                     * Session localSession = GetSessionbyZoneid((Integer)arrayOfObject[0]);
                     * if (localSession != null)
                     * localGAuthServer.Send(localSession, localObject);
                     * else
                     * GAuthServer.GetLog().info("Error: kickout user " + localObject.userid + " failed.");
                     * }
                     * else
                     * {
                     * localUserLoginRes.retcode = 10;
                     * return;
                     * }
                     */
                }

                Session.Send(0x0f, id, arg, res);
                Log.Trace("0x0F sended, retcode = {0}", (int)res.retcode);
            }
        }
Ejemplo n.º 47
0
 private void HandleUserPacket(object sender, PacketEventArgs e)
 {
     this.FireUserPacket(e.packet, e.ep);
 }
Ejemplo n.º 48
0
 private void PacketHandler_Disconnect(object sender, PacketEventArgs<DisconnectPacket> e)
 {
     Logger.Log(Logger.LogLevel.Info, DisplayName + " disconnected: " + e.Packet.Reason);
     Running = false;
 }
Ejemplo n.º 49
0
 private bool Server_AuthValidation(NetHandler handler, PacketEventArgs e)
 {
     //Check username and password
     return true;
 }
Ejemplo n.º 50
0
 private void PacketHandler_Handshake(object sender, PacketEventArgs<HandshakePacket> e)
 {
     Username = Regex.Replace(e.Packet.UsernameOrHash, Chat.DISALLOWED, "");
     DisplayName = Username;
     SendHandshake();
 }
Ejemplo n.º 51
0
 //Aka support
 public void OnSendPacket(Player Player, PacketEventArgs args)
 {
     ExtraPlayerData TemporaryPlayer = FindPlayer(Player);
     if (args.Type == Packet.Types.SendSpawn && args.Data[0] != 255)
     {
         if (TemporaryPlayer.Aka)
         {
             ExtraPlayerData otherPlayer = FindPlayer(args.Data[1]);
             byte[] b = enc.GetBytes(otherPlayer.Player.Username.PadRight(64));
             Array.Copy(b, 0, args.Data, 2, b.Length);
         }
     }
 }
Ejemplo n.º 52
0
        private void PacketHandler_HoldingChange(object sender, PacketEventArgs<HoldingChangePacket> e)
        {
            Inventory.OnActiveChanged((short)(e.Packet.Slot += 36));

            foreach (Client c in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z).Where(c => c != this))
            {
                c.SendHoldingEquipment(this);
            }
        }
        void OnIncomingData(Player p, PacketEventArgs args)
        {
            if (args.Data.Length < 0)
                return;

            if (args.Data[0] != (byte)'G')
                return;

            args.Cancel();
            var netStream = p.Client.GetStream();
            using (var Writer = new StreamWriter(netStream))
            {
                var line = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[0];
                var match = Parser.Match(line);

                if (match.Success)
                {
                    var lvl = Level.FindLevel(match.Groups[1].Value);
                    var versionLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[2];
                    var userNameLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[3];
                    var version = versionLine.Remove(0, "X-WoM-Version: ".Length).Replace("\r", "");
                    var username = userNameLine.Remove(0, "X-WoM-Username: "******"\r", "");
                    Thread.Sleep(1500); //Trying to find player before it loads so wait.
                    var player = Player.Find(username);
                    if (player != null)
                    {
                        player.ExtraData.ChangeOrCreate<object, object>("UsingWoM", true);
                        if (!String.IsNullOrWhiteSpace(version))
                        {
                            player.ExtraData.ChangeOrCreate<object, object>("WoMVersion", version);
                            if (PluginSettings.GetSettingBoolean("notify-ops") == true)
                            {
                                Player.UniversalChatOps(username + " joined using " + version);
                                Logger.Log(username + " joined using " + version);
                            }
                        }
                    }
                    if (lvl == null)
                    {
                        Writer.Write("HTTP/1.1 404 Not Found");
                        Writer.Flush();
                    }
                    else
                    {
                        if (!lvl.ExtraData.ContainsKey("WoMConfig"))
                        {
                            Writer.Write("HTTP/1.1 500 Internal Server Error");
                            Writer.Flush();
                        }
                        else
                        {
                            var config = (string[])lvl.ExtraData["WoMConfig"];
                            var bytes = Encoding.UTF8.GetBytes(config.ToString<string>());
                            Writer.WriteLine("HTTP/1.1 200 OK");
                            Writer.WriteLine("Date: " + DateTime.UtcNow.ToString("R"));
                            Writer.WriteLine("Server: Apache/2.2.21 (CentOS)");
                            Writer.WriteLine("Last-Modified: " + DateTime.UtcNow.ToString("R"));
                            Writer.WriteLine("Accept-Ranges: bytes");
                            Writer.WriteLine("Content-Length: " + bytes.Length);
                            Writer.WriteLine("Connection: close");
                            Writer.WriteLine("Content-Type: text/plain");
                            Writer.WriteLine();
                            foreach (var entry in config)
                                Writer.WriteLine(entry);
                        }
                        CFGSettings a = (CFGSettings)CFGDict.GetIfExist<Level, CFGSettings>(p.Level);
                        WOM.SendDetail(player, a.GetSetting("detail.user")); //Send the detail with parsed variables.
                    }
                }

                else
                {
                    Writer.Write("HTTP/1.1 400 Bad Request");
                    Writer.Flush();
                }
            }
        }
Ejemplo n.º 54
0
 private void PacketHandler_LoginRequest(object sender, PacketEventArgs<LoginRequestPacket> e)
 {
     if (!CheckUsername(e.Packet.Username))
         Kick("Inconsistent username");
     else if (e.Packet.ProtocolOrEntityId < ProtocolVersion)
         Kick("Outdated client");
     else
         SendLoginSequence();
 }
        private byte[] HandlePacket(byte[] buffer)
        {

            try
            {
                int length = 0; byte msg = buffer[0];
                // Get the length of the message by checking the first byte
                switch (msg)
                {
                    case 0: length = 130; break; // login
                    case 2: SMPKick("This is not an SMP Server!"); break; // SMP Handshake packet
                    case 5: length = 8; break; // blockchange
                    case 8: length = 9; break; // input
                    case 13: length = 65; break; // chat
                    default:
                        {
                            PacketEventArgs args = new PacketEventArgs(buffer, true, (Packet.Types)msg);
                            bool canceled = OnPlayerReceiveUnknownPacket.Call(this, args, OnAllPlayersReceiveUnknownPacket).Canceled;
                            if (canceled)
                                return new byte[1];
                            Kick("Unhandled message id \"" + msg + "\"!");
                            return new byte[0];
                        }

                }
                if (buffer.Length > length)
                {
                    byte[] message = new byte[length];
                    Buffer.BlockCopy(buffer, 1, message, 0, length);

                    byte[] tempbuffer = new byte[buffer.Length - length - 1];
                    Buffer.BlockCopy(buffer, length + 1, tempbuffer, 0, buffer.Length - length - 1);

                    buffer = tempbuffer;
                    if (!OnPlayerReceivePacket.Call(this, new PacketEventArgs(message, true, (Packet.Types)msg), OnAllPlayersReceivePacket).Canceled)
                    {
                        ThreadPool.QueueUserWorkItem(delegate
                        {
                            switch (msg)
                            {
                                case 0: HandleLogin(message); break;
                                case 5: HandleBlockchange(message); break;
                                case 8: HandleIncomingPos(message); break;
                                case 13: HandleChat(message); break;
                            }
                        });
                    }

                    if (buffer.Length > 0)
                        buffer = HandlePacket(buffer);
                    else
                        return new byte[0];


                }
            }
            catch (Exception e)
            {
                Kick("CONNECTION ERROR: (0x03)");
                Logger.Log("[ERROR]: PLAYER MESSAGE RECEIVE ERROR (0x03)", System.Drawing.Color.Red, System.Drawing.Color.Black);
                Logger.LogError(e);
            }
            return buffer;
        }
Ejemplo n.º 56
0
 private void PacketHandler_Player(object sender, PacketEventArgs<PlayerPacket> e)
 {
     this.OnGround = e.Packet.OnGround;
     this.UpdateEntities();
 }
Ejemplo n.º 57
0
        public static void OnLoginPacket(object sender, PacketEventArgs e)
        {
            if (e.pak.ContainerID == 1)
            {
                OPTIONS.clientID = e.pak.ObjectID;

                Message msg = new Message();
                msg.command = 1; //open

                IncommingLogin.Enqueue(msg);
            }
        }
Ejemplo n.º 58
0
        private void PacketHandler_PlayerBlockPlacement(object sender, PacketEventArgs<PlayerBlockPlacementPacket> e)
        {
            //  if (!Permissions.CanPlayerBuild(Username)) return;
            // Using activeslot provides current item info wtihout having to maintain ActiveItem
            if (Inventory.Slots[Inventory.ActiveSlot].Type <= 0 || Inventory.Slots[Inventory.ActiveSlot].Count < 1)
                return;

            // TODO: Neaten this out, or address via handler?
            if (Inventory.Slots[Inventory.ActiveSlot].Type > 255 || e.Packet.Face == BlockFace.Held) // Client is using an Item.
            {
                PacketHandler_PlayerItemPlacement(sender, e);
                return;
            }

            int x = e.Packet.X;
            int y = e.Packet.Y;
            int z = e.Packet.Z;

            BlockData.Blocks type = (BlockData.Blocks)World.GetBlockId(x, y, z); // Get block being built against.

            // Built Block Info
            int bx, by, bz;
            byte bType = (byte)Inventory.Slots[Inventory.ActiveSlot].Type;
            byte bMetaData = (byte)Inventory.Slots[Inventory.ActiveSlot].Durability;

            World.FromFace(x, y, z, e.Packet.Face, out bx, out by, out bz);

            switch (type) // Can't build against these blocks.
            {
                case BlockData.Blocks.Air:
                case BlockData.Blocks.Water:
                case BlockData.Blocks.Lava:
                case BlockData.Blocks.Still_Water:
                case BlockData.Blocks.Still_Lava:
                    return;
            }

            switch ((BlockData.Blocks)bType)
            {

                case BlockData.Blocks.Cactus:
                    {
                        BlockData.Blocks uType = (BlockData.Blocks)World.GetBlockId(bx, by - 1, bz);
                        if (uType != BlockData.Blocks.Sand && uType != BlockData.Blocks.Cactus)
                            return;
                    }
                    break;

                case BlockData.Blocks.Crops:
                    {
                        BlockData.Blocks uType = (BlockData.Blocks)World.GetBlockId(bx, by - 1, bz);
                        if (uType != BlockData.Blocks.Soil)
                            return;
                    }
                    break;

                case BlockData.Blocks.Furnace:
                case BlockData.Blocks.Dispenser:
                    switch (e.Packet.Face) //Bugged, as the client has a mind of its own for facing
                    {
                        case BlockFace.East: bMetaData = (byte)MetaData.Furnace.East;
                            break;
                        case BlockFace.West: bMetaData = (byte)MetaData.Furnace.West;
                            break;
                        case BlockFace.North: bMetaData = (byte)MetaData.Furnace.North;
                            break;
                        case BlockFace.South: bMetaData = (byte)MetaData.Furnace.South;
                            break;
                        default:
                            switch (FacingDirection(4)) // Built on floor, set by facing dir
                            {
                                case "N":
                                    bMetaData = (byte)MetaData.Furnace.North;
                                    break;
                                case "W":
                                    bMetaData = (byte)MetaData.Furnace.West;
                                    break;
                                case "S":
                                    bMetaData = (byte)MetaData.Furnace.South;
                                    break;
                                case "E":
                                    bMetaData = (byte)MetaData.Furnace.East;
                                    break;
                                default:
                                    return;

                            }
                            break;
                    }
                    break;

                case BlockData.Blocks.Rails:
                    // TODO: Rail Logic
                    break;

                case BlockData.Blocks.Reed:
                    // TODO: Check there is water nearby before placing.
                    break;

                case BlockData.Blocks.Stair:
                    // TODO : If (Block  Y - 1 = Stair && Block Y = Air) Then DoubleStair
                    // Else if (Buildblock = Stair) Then DoubleStair
                    break;

                case BlockData.Blocks.Wooden_Stairs:
                case BlockData.Blocks.Cobblestone_Stairs:
                    switch (FacingDirection(4))
                    {
                        case "N":
                            bMetaData = (byte)MetaData.Stairs.South;
                            break;
                        case "E":
                            bMetaData = (byte)MetaData.Stairs.West;
                            break;
                        case "S":
                            bMetaData = (byte)MetaData.Stairs.North;
                            break;
                        case "W":
                            bMetaData = (byte)MetaData.Stairs.East;
                            break;
                        default:
                            return;
                    }
                    break;

                case BlockData.Blocks.Torch:
                    switch (e.Packet.Face)
                    {
                        case BlockFace.Down: return;
                        case BlockFace.Up: bMetaData = (byte)MetaData.Torch.Standing;
                            break;
                        case BlockFace.West: bMetaData = (byte)MetaData.Torch.West;
                            break;
                        case BlockFace.East: bMetaData = (byte)MetaData.Torch.East;
                            break;
                        case BlockFace.North: bMetaData = (byte)MetaData.Torch.North;
                            break;
                        case BlockFace.South: bMetaData = (byte)MetaData.Torch.South;
                            break;
                    }
                    break;
            }

            World.SetBlockAndData(bx, by, bz, bType, bMetaData);
            World.Update(bx, by, bz);

            Inventory.RemoveItem(Inventory.ActiveSlot);
        }
Ejemplo n.º 59
0
        private void PacketSource_ReceivedPacket(PacketSource<WaxPacket> sender, PacketEventArgs<WaxPacket> e)
        {
            // If a correctly parsed packet...
            if (e.Packet != null && e.Packet is WaxPacket)
            {
                WaxPacket packet = (WaxPacket)e.Packet;

                //Console.WriteLine("[" + packet.Timestamp + "]");
                //Console.WriteLine(packet.ToString());

                lock (SyncRoot)
                {
                    if (!waxDevices.ContainsKey(packet.DeviceId))
                    {
                        // Create new device
                        waxDevices.Add(packet.DeviceId, new WaxDevice(packet.DeviceId, packet.Timestamp));
                        OnNewDevice(new ManagerEventArgs(waxDevices[packet.DeviceId]));
                    }
                    WaxDevice waxDevice = waxDevices[packet.DeviceId];

                    waxDevice.AddSamples(packet.Samples);

                    // Forward packet to all destinations
                    foreach (PacketDest<WaxPacket> dest in packetDests)
                    {
                        dest.SendPacket(packet);
                    }

                    if (packet != null)
                    {
                        DebugString = packet.ToString();
                    }
                }
                OnReceivedPacket(new ManagerEventArgs(waxDevices[packet.DeviceId], packet));
            }
        }
Ejemplo n.º 60
0
        private void TimerProcessingRequest_Elapsed(object sender, EventArgs e)
        {
            ////ensures that one thread enter a processing request section, in the same time reading sms section may will be occured.
            ////If another thread tries to enter a locked code, it will wait, block, until the object is released.
            lock (portColletion)
            {
                PacketEventArgs workItem = workerPoolManager.GetJob();
                if (workItem != null)
                {
                    BasicInformation currentConnection = portColletion.Get();
                    if (currentConnection != null)
                    {
                        List <string>    command = new List <string>();
                        ParameterizedMap parsingCommand;
                        try
                        {
                            string dataEncode = Encoding.GetEncoding("ibm850").GetString(workItem.Data);

                            Request request = Newtonsoft.Json.JsonConvert.DeserializeObject <Request>(dataEncode, new Newtonsoft.Json.JsonSerializerSettings
                            {
                                TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects
                            });
                            ICommandParser <ParameterizedMap> parser = new CommandParser();
                            parsingCommand = parser.Parse(request.QueueWorkItem.Command);

                            DynamicData parameters = new DynamicData();
                            foreach (string key in parsingCommand.ToDictionary().Keys)
                            {
                                if (!key.Equals("Command"))
                                {
                                    parameters.Add(key, parsingCommand.TryGet <object>(key));
                                }
                            }
                            parameters.Add("id", request.QueueWorkItem.SeqNbr == null ? "" : request.QueueWorkItem.SeqNbr);
                            command = parsingCommand.TryGet <string>("Command").Split('.').ToList();

                            ParameterizedMap param = new ParameterizedMap();
                            param.Add("base", currentConnection);
                            param.Add("packet", workItem);
                            param.Add("command", command);
                            param.Add("parameters", parameters);

                            string responseOut;
                            string encrypted;

                            Worker.IPipeline pipe = ObjectPool.Instance.Resolve <Worker.IPipeline>();

                            pipe.BeforePush(param);
                            responseOut = pipe.Push(param);
                            OnDataSent(responseOut.ToString());
                            pipe.AfterPush(param);

                            // send back to client if request workItem is send from tcp
                            if (workItem.Client != null)
                            {
                                Crypter crypter = new Crypter(new DefaultConfigurationKey());
                                encrypted = crypter.Encrypt(responseOut.ToString());
                                try
                                {
                                    this.Send(((IPEndPoint)workItem.Client.RemoteEndPoint).Port, ASCIIEncoding.ASCII.GetBytes(encrypted.ToString()));
                                }
                                catch (System.Net.Sockets.SocketException)
                                {
                                    // client was closed, dont raise error.
                                }
                                catch (ObjectDisposedException)
                                {
                                    // client was closed, dont raise error.
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            RaiseError(currentConnection, ex, "process request");
                        }
                    }
                    else
                    {
                        workerPoolManager.CurrentWorker.Add(workItem);
                    }
                }
            }
        }