Esempio n. 1
0
 private static void NetHooks_GetData(GetDataEventArgs e)
 {
     if (Main.netMode != 2 && e.MsgID == PacketTypes.ChatText && e.Length > 3)
     {
         byte   playerID = e.Msg.readBuffer[e.Index];
         Color  color    = new Color(e.Msg.readBuffer[e.Index + 1] << 16, e.Msg.readBuffer[e.Index + 2] << 8, e.Msg.readBuffer[e.Index + 3]);
         string message  = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 4, e.Length - 5);
         OnChatReceived(playerID, color, message);
     }
 }
Esempio n. 2
0
 private static void NetHooks_GetData(GetDataEventArgs e)
 {
     if (Main.netMode != 2 && e.MsgID == PacketTypes.ChatText && e.Length > 3)
     {
         byte playerID = e.Msg.readBuffer[e.Index];
         Color color = new Color(e.Msg.readBuffer[e.Index + 1] << 16, e.Msg.readBuffer[e.Index + 2] << 8, e.Msg.readBuffer[e.Index + 3]);
         string message = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 4, e.Length - 5);
         OnChatReceived(playerID, color, message);
     }
 }
Esempio n. 3
0
        public static bool OnGetData(ref byte msgid, messageBuffer msg, ref int idx, ref int length)
        {
            if (GetData == null)
                return false;

            var args = new GetDataEventArgs()
            {
                MsgID = (PacketTypes)msgid,
                Msg = msg,
                Index = idx,
                Length = length
            };

            GetData(args);

            msgid = (byte)args.MsgID;
            idx = args.Index;
            length = args.Length;

            return args.Handled;
        }
Esempio n. 4
0
        private static void NetHooks_GetData(GetDataEventArgs e)
        {
            if (Main.netMode != 2)
            {
                return;
            }

            if (e.MsgID == PacketTypes.ConnectRequest)
            {
                e.Handled = OnJoin(e.Msg.whoAmI);
                if (e.Handled)
                {
                    Netplay.serverSock[e.Msg.whoAmI].kill = true;
                }
            }
            else if (e.MsgID == PacketTypes.ChatText)
            {
                string str = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 0x4, e.Length - 0x5);
                e.Handled = OnChat(e.Msg, e.Msg.whoAmI, str);
            }
        }
Esempio n. 5
0
        public static bool OnGetData(ref byte msgid, messageBuffer msg, ref int idx, ref int length)
        {
            if (GetData == null)
            {
                return(false);
            }

            var args = new GetDataEventArgs()
            {
                MsgID  = (PacketTypes)msgid,
                Msg    = msg,
                Index  = idx,
                Length = length
            };

            GetData(args);

            msgid  = (byte)args.MsgID;
            idx    = args.Index;
            length = args.Length;

            return(args.Handled);
        }
Esempio n. 6
0
        private void GetData(GetDataEventArgs e)
        {
            if (e.Handled)
                return;

            PacketTypes type = e.MsgID;
            var player = Players[e.Msg.whoAmI];
            if (player == null)
            {
                e.Handled = true;
                return;
            }

            if (!player.ConnectionAlive)
            {
                e.Handled = true;
                return;
            }

            //if (type == PacketTypes.SyncPlayers)
            //Debug.WriteLine("Recv: {0:X} ({2}): {3} ({1:XX})", player.Index, (byte)type, player.TPlayer.dead ? "dead " : "alive", type.ToString());

            // Stop accepting updates from player as this player is going to be kicked/banned during OnUpdate (different thread so can produce race conditions)
            if ((Config.BanKillTileAbusers || Config.KickKillTileAbusers) &&
                player.TileThreshold >= Config.TileThreshold && !player.Group.HasPermission("ignoregriefdetection"))
            {
                Log.Debug("Rejecting " + type + " from " + player.Name + " as this player is about to be kicked");
                e.Handled = true;
            }
            else
            {
                using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                {
                    try
                    {
                        if (GetDataHandlers.HandlerGetData(type, player, data))
                            e.Handled = true;
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex.ToString());
                    }
                }
            }
        }
Esempio n. 7
0
        void GetData(GetDataEventArgs e)
        {
            try
            {
                if (Main.netMode != 2) { return; }
                if (e.MsgID == 17)
                {
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        byte type = br.ReadByte();
                        int x = br.ReadInt32();
                        int y = br.ReadInt32();
                        byte typetile = br.ReadByte();

                        if (type == 0 || type == 1)
                            if (ConfigurationManager.spawnProtect)
                                if (!players[e.Msg.whoAmI].IsAdmin())
                                {
                                    var flag = CheckSpawn(x, y);
                                    if (flag)
                                    {
                                        Tools.SendMessage(e.Msg.whoAmI, "The spawn is protected!", new float[] { 255f, 0f, 0f });
                                        e.Handled = true;
                                    }
                                }

                        if (type == 0 && BlacklistTiles[Main.tile[x, y].type] && Main.player[e.Msg.whoAmI].active)
                        {
                            players[e.Msg.whoAmI].tileThreshold++;
                            players[e.Msg.whoAmI].tilesDestroyed.Add(new Position((float)x, (float)y), Main.tile[x, y]);
                        }
                    }
                    return;
                }
                else if (e.MsgID == 0x1e)
                {
                    byte id;
                    bool pvp;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        id = br.ReadByte();
                        pvp = br.ReadBoolean();
                    }
                    Main.player[e.Msg.whoAmI].hostile = pvp;
                    if (id != e.Msg.whoAmI)
                        Main.player[e.Msg.whoAmI].hostile = true;
                    if (ConfigurationManager.permaPvp)
                        Main.player[e.Msg.whoAmI].hostile = true;
                    NetMessage.SendData(30, -1, -1, "", e.Msg.whoAmI);
                    e.Handled = true;
                }
                else if (e.MsgID == 0x0A) //SendSection
                {
                    Tools.Broadcast(string.Format("{0}({1}) attempted sending a section", Main.player[e.Msg.whoAmI].name, e.Msg.whoAmI));
                    Tools.Kick(e.Msg.whoAmI, "SendSection abuse.");
                    e.Handled = true;
                }
                else if (e.MsgID == 0x17) //Npc Data
                {
                    Tools.Broadcast(string.Format("{0}({1}) attempted spawning an NPC", Main.player[e.Msg.whoAmI].name, e.Msg.whoAmI));
                    Tools.Kick(e.Msg.whoAmI, "Spawn NPC abuse");
                    e.Handled = true;
                }
                else if (e.MsgID == 0x0D) //Update Player
                {
                    byte plr = e.Msg.readBuffer[e.Index];
                    if (plr != e.Msg.whoAmI)
                    {
                        Tools.Kick(e.Msg.whoAmI, "Update Player abuse");
                        e.Handled = true;
                    }
                }
                else if (e.MsgID == 0x10)
                {
                    byte ply;
                    Int16 life, maxLife;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        ply = br.ReadByte();
                        life = br.ReadInt16();
                        maxLife = br.ReadInt16();
                    }
                    if (maxLife > Main.player[ply].statLifeMax + 20 || life > maxLife)
                        if (players[ply].syncHP)
                        {
                            Tools.HandleCheater(ply);
                            Log.Info(Tools.FindPlayer(ply) + " had increased max life by more than 20 or increased life more than max");
                        }
                        else
                            players[ply].syncHP = true;
                }
                else if (e.MsgID == 0x2a)
                {
                    byte ply;
                    Int16 mana, maxmana;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        ply = br.ReadByte();
                        mana = br.ReadInt16();
                        maxmana = br.ReadInt16();
                    }
                    if (maxmana > Main.player[ply].statManaMax + 20 || mana > maxmana)
                        if (players[ply].syncMP)
                        {
                            Tools.HandleCheater(ply);
                            Log.Info(Tools.FindPlayer(ply) + " had increased max mana by more than 20 or increased mana more than max");
                        }
                        else
                            players[ply].syncMP = true;
                }
                else if (e.MsgID == 0x19) // Chat Text
                {
                    byte ply;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        ply = br.ReadByte();
                    }
                    if (e.Msg.whoAmI != ply)
                    {
                        //f**k you f****t
                        Log.Info(Tools.FindPlayer(e.Msg.whoAmI) + " was kicked for trying to fake chat as someone else.");
                        Tools.HandleCheater(ply);
                    }
                }
                else if (e.MsgID == 0x1B) // New Projectile
                {
                    Int16 ident;
                    float posx;
                    float posy;
                    float velx;
                    float vely;
                    float knockback;
                    Int16 dmg;
                    byte owner;
                    byte type;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        ident = br.ReadInt16();
                        posx = br.ReadSingle();
                        posy = br.ReadSingle();
                        velx = br.ReadSingle();
                        vely = br.ReadSingle();
                        knockback = br.ReadSingle();
                        dmg = br.ReadInt16();
                        owner = br.ReadByte();
                        type = br.ReadByte();
                    }
                    if (type == 29 || type == 28)
                    {
                        if (!players[e.Msg.whoAmI].IsAdmin())
                        {
                            if (ConfigurationManager.kickBoom || ConfigurationManager.banBoom)
                            {
                                int i = e.Msg.whoAmI;
                                if (ConfigurationManager.banBoom)
                                    FileTools.WriteGrief((int)i);
                                Tools.Kick((int)i, "Explosives was thrown.");
                                Tools.Broadcast(Main.player[i].name + " was " + (ConfigurationManager.banBoom ? "banned" : "kicked") + " for throwing an explosive device.");
                                e.Handled = true;
                            }
                        }
                    }
                }
                else if (e.MsgID == 0x2C) // KillMe
                {
                    byte id;
                    byte hitdirection;
                    short dmg;
                    bool pvp;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        id = br.ReadByte();
                        hitdirection = br.ReadByte();
                        dmg = br.ReadInt16();
                        pvp = br.ReadBoolean();
                    }
                    if (id != e.Msg.whoAmI)
                    {
                        Tools.HandleGriefer(e.Msg.whoAmI);
                        Log.Info(Tools.FindPlayer(e.Msg.whoAmI) + " was kicked for trying to execute KillMe on someone else.");
                        e.Handled = true;
                    }
                }
                else if (e.MsgID == 0x30)
                {
                    int x;
                    int y;
                    byte liquid;
                    bool lava;
                    using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                    {
                        x = br.ReadInt32();
                        y = br.ReadInt32();
                        liquid = br.ReadByte();
                        lava = br.ReadBoolean();
                    }
                    if (ConfigurationManager.spawnProtect)
                        if (!players[e.Msg.whoAmI].IsAdmin())
                        {
                            var flag = CheckSpawn(x, y);
                            if (flag)
                            {
                                Tools.SendMessage(e.Msg.whoAmI, "The spawn is protected!", new float[] { 255f, 0f, 0f });
                                e.Handled = true;
                            }
                        }
                }
                else if (e.MsgID == 0x22) // Client only KillTile
                    e.Handled = true; // Client only uses it for chests, but sends regular 17 as well.
            }
            catch (Exception ex)
            {
                FileTools.WriteError(ex.ToString());
            }
        }
Esempio n. 8
0
        private void GetData(GetDataEventArgs e)
        {
            PacketTypes type = e.MsgID;
            var player = TShock.Players[e.Msg.whoAmI];
            if (player == null)
            {
                e.Handled = true;
                return;
            }

            if (!player.ConnectionAlive)
            {
                e.Handled = true;
                return;
            }

            using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
            {
                try
                {
                    if (GetDataHandlers.HandlerGetData(type, player, data))
                        e.Handled = true;
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
        }
Esempio n. 9
0
        private bool HandleGetData(GetDataEventArgs e)
        {
            if (!Netplay.serverSock[e.Msg.whoAmI].active || Netplay.serverSock[e.Msg.whoAmI].kill)
                return true;

            if (e.MsgID == 4)
            {
                var ban = Bans.GetBanByName(Main.player[e.Msg.whoAmI].name);
                if (ban != null)
                {
                    Tools.ForceKick(e.Msg.whoAmI, "You are banned: " + ban.Reason);
                    return true;
                }
                string name = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 23, (e.Length - (e.Index + 23)) + e.Index - 1);
                if (name.Length > 32)
                {
                    Tools.ForceKick(e.Msg.whoAmI, "Name exceeded 32 characters.");
                    return true;
                }
                if (players[e.Msg.whoAmI] == null)
                {
                    Tools.ForceKick(e.Msg.whoAmI, "Player doesn't exist");
                    return true;
                }
                else if (players[e.Msg.whoAmI].receivedInfo)
                {
                    return Tools.HandleGriefer(e.Msg.whoAmI, "Sent client info more than once");
                }
                else
                {
                    players[e.Msg.whoAmI].receivedInfo = true;
                }
            }
            else if (e.MsgID == 0x14)
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    short size = br.ReadInt16();
                    int x = br.ReadInt32();
                    int y = br.ReadInt32();
                    int plyX = Math.Abs((int)Main.player[e.Msg.whoAmI].position.X / 16);
                    int plyY = Math.Abs((int)Main.player[e.Msg.whoAmI].position.Y / 16);
                    int tileX = Math.Abs(x);
                    int tileY = Math.Abs(y);
                    if (size > 5 || Math.Abs(plyX - tileX) > 10 || Math.Abs(plyY - tileY) > 10)
                    {
                        return Tools.HandleGriefer(e.Msg.whoAmI, "Send Tile Square Abuse");
                    }
                }
            }
            else if (e.MsgID == 17)
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    byte type = br.ReadByte();
                    int x = br.ReadInt32();
                    int y = br.ReadInt32();
                    byte typetile = br.ReadByte();
                    if (type == 1 || type == 3)
                    {
                        int plyX = Math.Abs((int)Main.player[e.Msg.whoAmI].position.X / 16);
                        int plyY = Math.Abs((int)Main.player[e.Msg.whoAmI].position.Y / 16);
                        int tileX = Math.Abs(x);
                        int tileY = Math.Abs(y);

                        if ((Math.Abs(plyX - tileX) > 6) || (Math.Abs(plyY - tileY) > 6))
                        {
                            return Tools.HandleGriefer(e.Msg.whoAmI, "Placing impossible to place blocks.");
                        }
                    }
                    if (type == 0 || type == 1)
                    {
                        if (ConfigurationManager.spawnProtect)
                        {
                            if (!players[e.Msg.whoAmI].group.HasPermission("editspawn"))
                            {
                                var flag = CheckSpawn(x, y);
                                if (flag)
                                {
                                    Tools.SendMessage(e.Msg.whoAmI, "Spawn protected from changes.",
                                                      new[] { 255f, 0f, 0f });
                                    return true;
                                }
                            }
                        }
                    }

                    if (type == 0 && BlacklistTiles[Main.tile[x, y].type] && Main.player[e.Msg.whoAmI].active)
                    {
                        players[e.Msg.whoAmI].tileThreshold++;
                        players[e.Msg.whoAmI].tilesDestroyed.Add(new Position(x, y), Main.tile[x, y]);
                    }
                }
            }
            else if (e.MsgID == 0x1e)
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    int id = br.ReadByte();
                    bool pvp = br.ReadBoolean();

                    Main.player[e.Msg.whoAmI].hostile = pvp;
                    if (id != e.Msg.whoAmI)
                        Main.player[e.Msg.whoAmI].hostile = true;
                    if (ConfigurationManager.permaPvp)
                        Main.player[e.Msg.whoAmI].hostile = true;
                    NetMessage.SendData(30, -1, -1, "", e.Msg.whoAmI);
                    return true;
                }
            }
            else if (e.MsgID == 0x0A) //SendSection
            {
                return Tools.HandleGriefer(e.Msg.whoAmI, "SendSection abuse.");
            }
            else if (e.MsgID == 0x17) //Npc Data
            {
                return Tools.HandleGriefer(e.Msg.whoAmI, "Spawn NPC abuse");
            }
            else if (e.MsgID == 0x0D) //Update Player
            {
                byte plr = e.Msg.readBuffer[e.Index];
                if (plr != e.Msg.whoAmI)
                {
                    return Tools.HandleGriefer(e.Msg.whoAmI, "Update Player abuse");
                }
            }
            else if (e.MsgID == 0x10)
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    byte ply = br.ReadByte();
                    short life = br.ReadInt16();
                    short maxLife = br.ReadInt16();

                    if (maxLife > Main.player[ply].statLifeMax + 20 || life > maxLife)
                    {
                        if (players[ply].syncHP)
                        {
                            return Tools.HandleCheater(ply, "Abnormal life increase");
                        }
                        else
                        {
                            players[ply].syncHP = true;
                        }
                    }
                }
            }
            else if (e.MsgID == 0x2a)
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    byte ply = br.ReadByte();
                    short mana = br.ReadInt16();
                    short maxmana = br.ReadInt16();

                    if (maxmana > Main.player[ply].statManaMax + 20 || mana > maxmana)
                    {
                        if (players[ply].syncMP)
                        {
                            return Tools.HandleCheater(ply, "Abnormal mana increase");
                        }
                        else
                        {
                            players[ply].syncMP = true;
                        }
                    }
                }
            }
            else if (e.MsgID == 0x1B) // New Projectile
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    short ident = br.ReadInt16();
                    float posx = br.ReadSingle();
                    float posy = br.ReadSingle();
                    float velx = br.ReadSingle();
                    float vely = br.ReadSingle();
                    float knockback = br.ReadSingle();
                    short dmg = br.ReadInt16();
                    byte owner = br.ReadByte();
                    byte type = br.ReadByte();

                    if (type == 29 || type == 28 || type == 30)
                    {
                        return Tools.HandleExplosivesUser(e.Msg.whoAmI, "Throwing an explosive device.");
                    }
                }
            }
            else if (e.MsgID == 0x2C) // KillMe
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    byte id = br.ReadByte();
                    byte hitdirection = br.ReadByte();
                    short dmg = br.ReadInt16();
                    bool pvp = br.ReadBoolean();

                    if (id != e.Msg.whoAmI)
                    {
                        return Tools.HandleGriefer(e.Msg.whoAmI, "Trying to execute KillMe on someone else.");
                    }
                }
            }
            else if (e.MsgID == 0x1a) //PlayerDamage
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    byte playerid = br.ReadByte();
                    byte direction = br.ReadByte();
                    Int16 damage = br.ReadInt16();
                    byte pvp = br.ReadByte();

                    if (!Main.player[playerid].hostile)
                        return true;
                }
            }
            else if (e.MsgID == 0x30)
            {
                using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)))
                {
                    int x = br.ReadInt32();
                    int y = br.ReadInt32();
                    byte liquid = br.ReadByte();
                    bool lava = br.ReadBoolean();

                    //The liquid was picked up.
                    if (liquid == 0)
                        return false;

                    int plyX = Math.Abs((int)Main.player[e.Msg.whoAmI].position.X / 16);
                    int plyY = Math.Abs((int)Main.player[e.Msg.whoAmI].position.Y / 16);
                    int tileX = Math.Abs(x);
                    int tileY = Math.Abs(y);

                    int lavacount = 0;
                    int watercount = 0;

                    for (int i = 0; i < 44; i++)
                    {
                        if (Main.player[e.Msg.whoAmI].inventory[i].name == "Lava Bucket")
                            lavacount++;
                        else if (Main.player[e.Msg.whoAmI].inventory[i].name == "Water Bucket")
                            watercount++;
                    }

                    if (lava && lavacount <= 0)
                    {
                        return Tools.HandleGriefer(e.Msg.whoAmI, "Placing lava they didn't have."); ;
                    }
                    else if (!lava && watercount <= 0)
                    {
                        return Tools.HandleGriefer(e.Msg.whoAmI, "Placing water they didn't have.");
                    }
                    if ((Math.Abs(plyX - tileX) > 6) || (Math.Abs(plyY - tileY) > 6))
                    {
                        return Tools.HandleGriefer(e.Msg.whoAmI, "Placing impossible to place liquid."); ;
                    }

                    if (ConfigurationManager.spawnProtect)
                    {
                        if (!players[e.Msg.whoAmI].group.HasPermission("editspawn"))
                        {
                            var flag = CheckSpawn(x, y);
                            if (flag)
                            {
                                Tools.SendMessage(e.Msg.whoAmI, "The spawn is protected!", new[] { 255f, 0f, 0f });
                                return true;
                            }
                        }
                    }
                }
            }
            else if (e.MsgID == 0x22) // Client only KillTile
            {
                return true;  // Client only uses it for chests, but sends regular 17 as well.
            }

            return false;
        }
Esempio n. 10
0
 private void GetData(GetDataEventArgs e)
 {
     e.Handled = e.Handled || HandleGetData(e);
 }
Esempio n. 11
0
        private static void NetHooks_GetData(GetDataEventArgs e)
        {
            if (Main.netMode != 2)
                return;

            if (e.MsgID == PacketTypes.ConnectRequest)
            {
                e.Handled = OnJoin(e.Msg.whoAmI);
                if (e.Handled)
                    Netplay.serverSock[e.Msg.whoAmI].kill = true;
            }
            else if (e.MsgID == PacketTypes.ChatText)
            {
                string str = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 0x4, e.Length - 0x5);
                e.Handled = OnChat(e.Msg, e.Msg.whoAmI, str);
            }
        }