Example #1
0
        private void ParseData( GetDataEventArgs args )
        {
            try
            {
                PacketTypes packet = args.MsgID;
                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    TSPlayer player = TShock.Players[args.Msg.whoAmI];
                    var name = player.Name;
                    if (player.IsLoggedIn)
                    {
                        name = player.UserAccountName;
                    }
                    switch (packet)
                    {
                        case PacketTypes.Tile:
                            {
                                byte type = data.ReadInt8();
                                int x = data.ReadInt32();
                                int y = data.ReadInt32();
                                bool fail = true;
                                Action act;

                if (type == 0 || type == 2 || type == 4)
                                    act = Action.BREAK;
                                else if (type == 1 || type == 3)
                                    act = Action.PLACE;
                                else
                                    act = Action.ERROR;

                                byte tileType = 0;

                                if (act == Action.BREAK)
                                {
                                    tileType = Main.tile[x, y].type;
                                    fail = data.ReadBoolean();
                                }
                                else if (act == Action.PLACE)
                                {
                                    tileType = data.ReadInt8();
                                    fail = false;
                                }
                                if (act != Action.ERROR && !fail)
                                {
                                    TileEvent evt = new TileEvent(x, y, name, player.IP, act, tileType,
                                                                  LogTile.helper.GetTime());
                                    queue.Enqueue(evt);
                                }
                                break;
                            }
                        case PacketTypes.TileKill:
                            {
                                int x = data.ReadInt32();
                                int y = data.ReadInt32();
                                TileEvent evt = new TileEvent(x, y, name, player.IP, Action.BREAK, 0x15,
                                                              LogTile.helper.GetTime());
                                queue.Enqueue(evt);
                                break;
                            }
            //case PacketTypes.ChestOpen:
            //  {
            //    int chestID = data.ReadInt16();
            //    int x = data.ReadInt32();
            //    int y = data.ReadInt32();
            //    int curChest = 0;
            //    if (!chestMap.TryGetValue(player, out curChest)) // chest being opened
            //    {
            //      //Console.WriteLine( string.Format( "Open:{0}: cId:{1}:", player.Name, chestID ) );
            //      if ( chestID > 0 )  // sometimes, this gets called right after a close
            //      {
            //        chestMap.Add(player, chestID);
            //        itemMap.Add(player, Main.chest[chestID].item);
            //      } // if
            //    }
            //    else // chest is being closed
            //    {
            //      //Console.WriteLine( "Closing: " + player.Name );
            //      chestMap.Remove(player);
            //      itemMap.Remove(player);
            //    }

            //    break;
            //  }
            //case PacketTypes.ChestItem:
            //  {
            //    int chestID = data.ReadInt16();
            //    byte itemSlot = data.ReadInt8();
            //    byte stack = data.ReadInt8();
            //    int curChest = 0;
            //    int type = itemMap[player][itemSlot].type;
            //    if (LogTile.enableDebugOutput)									Console.WriteLine(type);
            //    Item[] curItems = Main.chest[chestID].item;
            //    if (LogTile.enableDebugOutput)									Console.WriteLine(curItems[itemSlot].type);
            //    //Console.WriteLine( "Chest item: " + player.Name );
            //    itemMap.Remove(player);
            //    itemMap.Add(player, curItems);
            //    break;
            //  }
            //case PacketTypes.ChestGetContents:
            //  {
            //    int x = data.ReadInt32();
            //    int y = data.ReadInt32();
            //    if (LogTile.enableDebugOutput)
            //      Console.WriteLine("GETChestContents: (" + x + ", " + y + ")");
            //    break;
            //  }
            //case PacketTypes.SignNew:
            //  {
            //    int id = data.ReadInt16();
            //    int x = data.ReadInt32();
            //    int y = data.ReadInt32();
            //    string text = data.ReadString();
            //    break;
            //  }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine( e.Message + " (" + e.StackTrace + ")" );
            }
        }
Example #2
0
        private void NetHooks_GetData(GetDataEventArgs e)
        {
            var player = Players[e.Msg.whoAmI];

            PacketTypes type = e.MsgID;

            if (type == PacketTypes.PlayerDamage)
            {
                if (player == null)
                {
                    e.Handled = true;
                    return;
                }

                if (player.IsInvincible)
                {
                    if (player.Player.TPlayer.statLife < player.Player.TPlayer.statLifeMax)
                    {
                        int deficit = player.Player.TPlayer.statLifeMax - player.Player.TPlayer.statLife;

                        int heartNum = (deficit / 20) + 4;

                        var heart = TShock.Utils.GetItemById(58);

                        for (int i = 0; i < heartNum; i++)
                        {
                            player.Player.GiveItem(heart.type, heart.name, heart.width, heart.height, 1);
                        }
                    }
                }
            }
            else if (type == PacketTypes.DoorUse)
            {
                if (player == null)
                {
                    e.Handled = false;
                    return;
                }

                using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                {
                    bool closed = ms.ReadBoolean();
                    int x = ms.ReadInt32();
                    int y = ms.ReadInt32();

                    RegionHelperManager regionHelper = new RegionHelperManager(TShock.DB);

                    if (!player.Player.Group.HasPermission(Permissions.editspawn) && !TShock.Regions.CanBuild(x, y, player.Player) && TShock.Regions.InArea(x, y) && regionHelper.GetRegionHelperByRegion(TShock.Regions.InAreaRegionName(x, y)).ContainsProperty(r => r.IsLocked))
                    {
                        int size = 10;

                        NetMessage.SendData((int)PacketTypes.DoorUse, -1, -1, "", 1, x, y);

                        TSPlayer.All.SendTileSquare(x, y, size);
                        WorldGen.RangeFrame(x, y, x + size, y + size);

                        int warpX = player.Player.TileX > x ? player.Player.TileX + 3 : player.Player.TileX - 3;

                        player.Player.Teleport(warpX, player.Player.TileY + 3);

                        player.Player.SendMessage(string.Format("Doors in region name: {0} are locked.", string.Join(", ", TShock.Regions.InAreaRegionName(x, y))), Color.Red);

                        e.Handled = true;
                    }
                }
            }
            else if (type == PacketTypes.PlayerUpdate)
            {
                using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))
                {
                    if (player.PrisonRecord != null)
                    {
                        if (!player.PrisonRecord.Released && player.PrisonRecord.Until <= DateTime.Now)
                        {
                            CommandHandlers.ReleaseFromPrison(new CommandArgs("releaseprisoner", null, new List<string>()
                            {
                                player.Player.UserAccountName
                            }));

                            player.PrisonRecord = null;
                        }
                        else
                        {
                            var plr = ms.ReadInt8();
                            var control = ms.ReadInt8();
                            var item = ms.ReadInt8();
                            var pos = new Vector2(ms.ReadSingle(), ms.ReadSingle());
                            var vel = new Vector2(ms.ReadSingle(), ms.ReadSingle());

                            var warp = TShock.Warps.FindWarp(Config.PrisonWarp);

                            float tilex;
                            float tiley;

                            if (warp.WarpPos != Vector2.Zero)
                            {
                                tilex = (int)(warp.WarpPos.X);
                                tiley = (int)(warp.WarpPos.Y);
                            }
                            else
                            {
                                tilex = Main.spawnTileX;
                                tiley = Main.spawnTileY;
                            }

                            float distance = Vector2.Distance(new Vector2((pos.X / 16f), (pos.Y / 16f)), new Vector2(tilex, tiley));
                            if (distance > TShock.Config.MaxRangeForDisabled)
                            {
                                if (warp.WarpPos != Vector2.Zero)
                                {
                                    player.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3);
                                }
                                else
                                {
                                    player.Player.Spawn();
                                }

                                TimeSpan remaining = player.PrisonRecord.Until - DateTime.Now;

                                player.Player.SendMessage(string.Format("You are still serving your prison sentence. {0} hour(s) {1} minute(s) remain.", (int)remaining.TotalHours, remaining.Minutes), Color.Yellow);
                            }
                        }
                    }
                    else
                    {
                        if (player.Player.Group.Name == Config.PrisonGroup)
                        {
                            CommandHandlers.ReleaseFromPrison(new CommandArgs("releaseprisoner", null, new List<string>()
                            {
                                player.Player.UserAccountName
                            }));
                        }
                    }
                }
            }
        }
Example #3
0
        private void OnGetData(GetDataEventArgs args)
        {
            if (args.MsgID != PacketTypes.NpcStrike)
            {
                return;
            }

            if (args.Msg.whoAmI < 0 || args.Msg.whoAmI > Main.maxNetPlayers)
            {
                return;
            }

            Player player = Main.player[args.Msg.whoAmI];

            using (MemoryStream ms = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length - 1))
            {
                short id = ms.ReadInt16();
                ms.ReadInt16();
                ms.ReadSingle();
                ms.ReadInt8();
                bool crit = Convert.ToBoolean(ms.ReadInt8());

                if (Main.npc[id] == null)
                {
                    return;
                }

                if (crit)
                {
                    Dictionary<string, int[]> messages;
                    Item selected = player.inventory[player.selectedItem];

                    if (selected.ranged && !ItemID.Sets.Explosives[selected.type])
                    {
                        messages = config.CritMessages[WeaponType.Range].Messages;
                    }
                    else if (selected.melee)
                    {
                        messages = config.CritMessages[WeaponType.Melee].Messages;
                    }
                    else if (selected.magic)
                    {
                        messages = config.CritMessages[WeaponType.Magic].Messages;
                    }
                    else
                    {
                        if (ItemID.Sets.Explosives[selected.type]
                            || selected.type == ItemID.Grenade
                            || selected.type == ItemID.BouncyGrenade
                            || selected.type == ItemID.PartyGirlGrenade
                            || selected.type == ItemID.StickyGrenade)
                        {
                            messages = config.CritMessages[WeaponType.Explosive].Messages;
                        }
                        else
                        {
                            messages = config.CritMessages[WeaponType.Melee].Messages;
                        }
                    }

                    KeyValuePair<string, int[]> message = messages.ElementAt(r.Next(0, messages.Count));

                    Color c = new Color(message.Value[0], message.Value[1], message.Value[2]);

                    NetMessage.SendData((int)PacketTypes.CreateCombatText,
                        -1, -1, message.Key, (int)c.PackedValue, Main.npc[id].position.X, Main.npc[id].position.Y);
                }
            }
        }
Example #4
0
        // ParseData +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        private void ParseData( GetDataEventArgs args )
        {
            try
            {
                PacketTypes packet = args.MsgID;
                using ( var data = new MemoryStream( args.Msg.readBuffer, args.Index, args.Length ) )
                {
                    TSPlayer player = TShock.Players[args.Msg.whoAmI];
                    switch ( packet )
                    {
                        case PacketTypes.ChestItem:
            {
              string action, itemName;
              short  chestID   = data.ReadInt16();
              byte   itemSlot  = data.ReadInt8();
              byte   itemStack = data.ReadInt8();
              byte   prefix    = data.ReadInt8();
              short  itemType  = data.ReadInt16();
              var    oldItem   = Main.chest[chestID].item[itemSlot];
              if ( oldItem.name != null && oldItem.name.Length > 0 )
              {
                action = "cGet";
                itemName = oldItem.name;
              } // if
              else
              {
                var newItem = new Item();
                newItem.netDefaults( itemType );
                newItem.Prefix( prefix );
                newItem.AffixName();
                action = "cPut";
                itemName = newItem.name;
              } // else

              if ( itemType != prevItemType )
              {
                _ircClient.SendMessage( SendType.Message, _actionChannel,
                                 string.Format( "{0} ({1}): {2}: {3}",
                                 player.Name, player.Group.Name, action, itemName ) );
                prevItemType = itemType;
              } // if
                            break;
                        } // case
                    } // switch
                } // using
            } // try
            catch ( Exception exception )
            {
                Console.WriteLine( exception.Message + "(" + exception.StackTrace + ")" );
            } // catch
        }