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 + ")" ); } }
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 })); } } } } }
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); } } }
// 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 }