Example #1
0
        private void OnGetData(GetDataEventArgs e)
        {
            if (e.MsgID != PacketTypes.NpcStrike)
            {
                return;
            }

            using (MemoryStream data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length - 1))
            {
                var id = data.ReadInt16();
                var dmg = data.ReadInt16();
                data.ReadSingle();
                data.ReadByte();
                data.ReadByte();

                if (id < 0 || id > Main.maxNPCs)
                {
                    return;
                }

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

                if (npc.type != NPCID.KingSlime || !npc.active)
                {
                    return;
                }
                if (dmg <= 0)
                {
                    return;
                }

                if (Main.rand == null)
                {
                    Main.rand = new Random((int)DateTime.Now.Ticks);
                }

                for (int i = 0; i < 20; i++)
                {
                    int amt = 4 + Main.rand.Next(1, 5);

                    for (int j = 0; j < amt; j++)
                    {
                        int x = (int)npc.position.X + Main.rand.Next(-80, 81);
                        int y = (int)npc.position.Y + Main.rand.Next(-80, 81);
                        NPC.NewNPC(x, y, NPCID.BlueSlime, 0);
                    }
                }
            }
        }
        private void checkItemDrops(GetDataEventArgs args)
        {
            if (args.MsgID == PacketTypes.ItemDrop)
            {
                if (args.Handled)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    Int16 id = data.ReadInt16();
                    float posx = data.ReadSingle();
                    float posy = data.ReadSingle();
                    float velx = data.ReadSingle();
                    float vely = data.ReadSingle();
                    int stack = data.ReadByte();
                    int prefix = data.ReadByte();
                    Int16 type = data.ReadInt16();

                    Item item = new Item();
                    item.SetDefaults(type);

                    if (id == 0)
                        return;

                    if (toBeCollected.ContainsKey(item.name))
                    {
                        toBeCollected[item.name] -= stack;

                        if (toBeCollected[item.name] < 0)
                        {
                            if (Math.Abs(toBeCollected[item.name]) > 1)
                                player.TSPlayer.SendInfoMessage(string.Format("Returning {0} {1}s", Math.Abs(toBeCollected[item.name]), item.name));
                            else
                                player.TSPlayer.SendInfoMessage(string.Format("Returning {0} {1}", Math.Abs(toBeCollected[item.name]), item.name));
                            args.Handled = true;
                            player.TSPlayer.GiveItem(item.type, item.name, item.width, item.width, Math.Abs(toBeCollected[item.name]));
                            toBeCollected.Remove(item.name);
                        }
                        else if (toBeCollected[item.name] > 0)
                        {
                             if (Math.Abs(toBeCollected[item.name]) > 1)
                                player.TSPlayer.SendInfoMessage(string.Format("Drop another {0} {1}s, to continue", Math.Abs(toBeCollected[item.name]), item.name));
                            else
                                player.TSPlayer.SendInfoMessage(string.Format("Drop {0} {1}, to continue", Math.Abs(toBeCollected[item.name]), item.name));
                            args.Handled = true;
                        }
                        else
                        {
                            if (stack > 1)
                                player.TSPlayer.SendInfoMessage(string.Format("You dropped {0} {1}s", stack, item.name));
                            else
                                player.TSPlayer.SendInfoMessage(string.Format("You dropped {0} {1}", stack, item.name));

                            toBeCollected.Remove(item.name);
                            args.Handled = true;
                        }
                    }
                    args.Handled = true;
                }
            }
        }
Example #3
0
        private void OnGetData(GetDataEventArgs args)
        {
            var player = Utils.GetPlayer(args.Msg.whoAmI);

            #region ItemDrop
            if (args.MsgID == PacketTypes.ItemDrop)
            {
                if (args.Handled || !player.listingReward)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    Int16 id = data.ReadInt16();
                    float posx = data.ReadSingle();
                    float posy = data.ReadSingle();
                    float velx = data.ReadSingle();
                    float vely = data.ReadSingle();
                    Int16 stacks = data.ReadInt16();
                    int prefix = data.ReadByte();
                    bool nodelay = data.ReadBoolean();
                    Int16 netid = data.ReadInt16();

                    Item item = new Item();
                    item.SetDefaults(netid);

                    Console.WriteLine(String.Join(", ", id, stacks, prefix, netid));

                    if (stacks == 0)
                        return;

                    player.droppedItems.Add(new BHItem(netid, stacks, prefix));
                    player.TSPlayer.SendInfoMessage("{0} {1}{2} has been added to bounty rewards.",
                        stacks,
                        (prefix == 0) ? "" : TShock.Utils.GetPrefixByIdOrName(prefix.ToString())[0].ToString() + " ",
                        item.name);
                    args.Handled = true;
                }
            }
            #endregion

            #region PlayerDamage
            if (args.MsgID == PacketTypes.PlayerDamage)
            {
                if (args.Handled)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    var playerID = data.ReadByte();
                    var hitDirection = data.ReadByte();
                    var damage = data.ReadInt16();
                    var pvp = data.ReadBoolean();
                    var crit = data.ReadBoolean();

                    Utils.GetPlayer(playerID).killingPlayer = (args.Msg.whoAmI != playerID) ? Utils.GetPlayer(args.Msg.whoAmI) : null;
                }
            }
            #endregion

            #region KillMe
            if (args.MsgID == PacketTypes.PlayerKillMe)
            {
                if (args.Handled)
                    return;

                using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))
                {
                    var playerId = data.ReadByte();
                    var hitDirection = data.ReadByte();
                    var damage = data.ReadInt16();
                    var pvp = data.ReadBoolean();

                    var plr = Utils.GetPlayer(playerId);

                    if (plr.killingPlayer != null)
                    {
                        var killer = plr.killingPlayer;
                        if (pvp)
                        {
                            if (Utils.CheckVictimWasTarget(plr.name, killer.activeBounties))
                            {
                                List<Bounty> completedBounties = new List<Bounty>();
                                foreach (Bounty bounty in killer.activeBounties.Keys)
                                {
                                    if (bounty.target == plr.name)
                                    {
                                        for (int i = 0; i < bounty.reward.Count - 1; i++)
                                        {
                                            Item item = new Item();
                                            item.SetDefaults(bounty.reward[i].id);
                                            killer.TSPlayer.GiveItem(item.netID, item.name, item.width, item.height, bounty.reward[i].stack, bounty.reward[i].prefix);
                                        }
                                        if (bounty.reward[bounty.reward.Count - 1].money != 0)
                                        {
                                            SEconomyPlugin.Instance.WorldAccount.TransferToAsync(
                                                SEconomyPlugin.Instance.GetBankAccount(killer.TSPlayer.UserAccountName),
                                                bounty.reward[bounty.reward.Count - 1].money,
                                                Wolfje.Plugins.SEconomy.Journal.BankAccountTransferOptions.AnnounceToReceiver,
                                                String.Format("for the bounty rewards.", bounty.reward[bounty.reward.Count - 1].money),
                                                String.Format("BountyHunt: " + "receiving money for reward."));
                                        }
                                        completedBounties.Add(bounty);
                                    }
                                }
                                for (int i = 0; i < completedBounties.Count; i++)
                                {
                                    foreach (var hunter in completedBounties[i].hunter)
                                    {
                                        var foundplr = TShock.Utils.FindPlayer(hunter);
                                        foundplr[0].SendInfoMessage("{0} completed {1}, a bounty you accepted.", killer.name, completedBounties[i].name);
                                        foundplr[0].SendInfoMessage("{0} will be removed from your accepted bounties.", completedBounties[i].name);
                                    }
                                    bounties.Remove(completedBounties[i]);
                                    dbManager.DeleteBounty(completedBounties[i]);
                                }
                            }
                            if (Utils.CheckVictimWasHunter(plr.name, plr.activeBounties))
                            {
                                List<Bounty> failedBounties = new List<Bounty>();
                                foreach (Bounty bounty in plr.activeBounties.Keys)
                                {
                                    if (bounty.target == killer.name)
                                    {
                                        plr.activeBounties[bounty]++;
                                        if (config.MaxAttemptsPerBounty != 0 && plr.activeBounties[bounty] >= config.MaxAttemptsPerBounty)
                                        {
                                            failedBounties.Add(bounty);
                                        }
                                        if (config.HunterDeathPenalty != 0)
                                        {
                                            SEconomyPlugin.Instance.GetBankAccount(plr.TSPlayer.UserAccountName).TransferToAsync(
                                                SEconomyPlugin.Instance.WorldAccount,
                                                config.HunterDeathPenalty,
                                                Wolfje.Plugins.SEconomy.Journal.BankAccountTransferOptions.AnnounceToSender,
                                                String.Format("dying to your bounty target."),
                                                String.Format("BountyHunt: " + "lost money for death on the hunt."));
                                            if (config.AddDeathPenaltyToRewards)
                                                bounties[bounties.IndexOf(bounty)].reward[bounties[bounties.IndexOf(bounty)].reward.Count].money += config.HunterDeathPenalty;
                                        }
                                    }
                                }
                                for (int i = 0; i < failedBounties.Count; i++)
                                {
                                    plr.TSPlayer.SendErrorMessage("You have failed the {0} bounty {1} time(s).", failedBounties[i].name, plr.activeBounties[failedBounties[i]]);
                                    plr.TSPlayer.SendErrorMessage("{0} will be removed from your accept bounties, and can no longer be accepted by you.", failedBounties[i]);

                                    foreach (Bounty bounty in bounties)
                                    {
                                        if (bounty == failedBounties[i])
                                        {
                                            bounty.hunter.Remove(plr.name);
                                            bounty.failures.Add(plr.name);
                                            dbManager.UpdateHunters(bounty);
                                            dbManager.UpdateFailures(bounty);
                                        }
                                    }
                                }
                            }
                        }
                        plr.killingPlayer = null;
                    }
                }
            }
            #endregion
        }
Example #4
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 #5
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
                            }));
                        }
                    }
                }
            }
        }