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; } } }
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 }
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); } } }
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 })); } } } } }