public void GetData(GetDataEventArgs args) { PacketTypes type = args.MsgID; var player = TShock.Players[args.Msg.whoAmI]; if (player == null) { args.Handled = true; return; } if (!player.ConnectionAlive) { args.Handled = true; return; } using (var data = new MemoryStream(args.Msg.readBuffer, args.Index, args.Length)) { try { if (GetDataHandlers.HandlerGetData(type, player, data)) args.Handled = true; } catch (Exception ex) { Log.ConsoleError(ex.ToString()); } } }
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()); } } }
private void GetData(GetDataEventArgs args) { if (args.MsgID == PacketTypes.ItemDrop) { var num = args.Index; var TPlayer = Main.player[args.Msg.whoAmI]; int ItemID = BitConverter.ToInt16(args.Msg.readBuffer, num); if (ItemID == 400) { if (Exceeded.Contains(args.Msg.whoAmI)) { args.Handled = true; return; } if (Thresholds[args.Msg.whoAmI] > Threshold) { Exceeded.Add(args.Msg.whoAmI); Thresholds[args.Msg.whoAmI] = 0; args.Handled = true; } else Thresholds[args.Msg.whoAmI]++; } } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled && e.MsgID == PacketTypes.Tile) { PlayerInfo info = Players[e.Msg.whoAmI]; if (info.pt != 0) { int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 1); int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 5); if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY) { if (info.pt == 1) { info.x = X; info.y = Y; TShock.Players[e.Msg.whoAmI].SendMessage(String.Format("Set point 1.", X, Y), Color.Yellow); } else { info.x2 = X; info.y2 = Y; TShock.Players[e.Msg.whoAmI].SendMessage(String.Format("Set point 2.", X, Y), Color.Yellow); } info.pt = 0; e.Handled = true; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 3); } } } }
public void GetData(GetDataEventArgs e) { if (e.MsgID == PacketTypes.SignNew) { if (enabled) { try { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); int x = reader.ReadInt16(); int y = reader.ReadInt16(); reader.Close(); int id = Terraria.Sign.ReadSign(x, y); TSPlayer player = TShock.Players[e.Msg.whoAmI]; if (!player.Group.HasPermission("signprotect.edit")) { player.SendErrorMessage("[SignProtect] You do not have permission to edit this sign."); e.Handled = true; return; } } } catch (Exception ex) { Console.WriteLine(ex); } } } }
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); } } } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled && e.MsgID == PacketTypes.Tile) { PlayerInfo info = TShock.Players[e.Msg.whoAmI].GetPlayerInfo(); if (info.Point != 0) { using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { reader.ReadByte(); int x = reader.ReadInt16(); int y = reader.ReadInt16(); if (x >= 0 && y >= 0 && x < Main.maxTilesX && y < Main.maxTilesY) { if (info.Point == 1) { info.X = x; info.Y = y; TShock.Players[e.Msg.whoAmI].SendInfoMessage("Set point 1."); } else if (info.Point == 2) { info.X2 = x; info.Y2 = y; TShock.Players[e.Msg.whoAmI].SendInfoMessage("Set point 2."); } else if (info.Point == 3) { List<string> regions = TShock.Regions.InAreaRegionName(x, y).ToList(); if (regions.Count == 0) { TShock.Players[e.Msg.whoAmI].SendErrorMessage("No region exists there."); return; } Region curReg = TShock.Regions.GetRegionByName(regions[0]); info.X = curReg.Area.Left; info.Y = curReg.Area.Top; info.X2 = curReg.Area.Right; info.Y2 = curReg.Area.Bottom; TShock.Players[e.Msg.whoAmI].SendInfoMessage("Set region."); } info.Point = 0; e.Handled = true; TShock.Players[e.Msg.whoAmI].SendTileSquare(x, y, 3); } } } } }
private void OnGetData(GetDataEventArgs args) { if (args.Handled) return; TSPlayer tsplr = TShock.Players[args.Msg.whoAmI]; if (args.MsgID == PacketTypes.Teleport) { if (tsplr.CurrentRegion != null && Database.IsNoTpRegion(tsplr.CurrentRegion.Name)) { tsplr.SendErrorMessage("You cannot teleport while in this region!"); tsplr.Teleport(tsplr.X, tsplr.Y); } } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled) { if (e.MsgID == PacketTypes.NpcItemStrike) { NPC npc = Main.npc[BitConverter.ToInt16(e.Msg.readBuffer, e.Index)]; Player plr = Main.player[e.Msg.readBuffer[e.Index + 2]]; if (npc.realLife >= 0) { npc = Main.npc[npc.realLife]; } if (npc.active && npc.type == 113) { double dmg = Main.CalculateDamage(plr.inventory[plr.selectedItem].damage, npc.defense); if (npc.life - dmg <= 0) { NetMessage.SendData(25, -1, -1, "Wall of Flesh has been defeated!", 255, 175, 75, 255); npc.active = false; e.Handled = true; } } } else if (e.MsgID == PacketTypes.NpcStrike) { NPC npc = Main.npc[BitConverter.ToInt16(e.Msg.readBuffer, e.Index)]; if (npc.realLife >= 0) { npc = Main.npc[npc.realLife]; } if (npc.active && npc.type == 113) { double dmg = Main.CalculateDamage(BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2), npc.defense); if (e.Msg.readBuffer[e.Index + 9] != 0) { dmg *= 2; } if (npc.life - dmg <= 0) { NetMessage.SendData(25, -1, -1, "Wall of Flesh has been defeated!", 255, 175, 75, 255); npc.active = false; e.Handled = true; } } } } }
private void OnGetData(GetDataEventArgs e) { if (e.MsgID == PacketTypes.ItemDrop) { if (!e.Handled) { TSPlayer player = TShock.Players[e.Msg.whoAmI]; if (!player.Group.HasPermission("geldar.admin")) { player.SendErrorMessage("You are not allowed to drop items on the server!"); player.SendErrorMessage("Rebind your drop key to avoid the destruction of more items."); player.SendErrorMessage("We will not refund any lost items"); } e.Handled = true; return; } } }
private void OnGetData(GetDataEventArgs e) { if (e.Handled) return; if (e.MsgID == PacketTypes.Teleport) { TSPlayer player = TShock.Players[e.Msg.whoAmI]; if (player != null) { if (player.Group.HasPermission("rodhealer.ignoredamage")) { List<int> buffs = new List<int>(player.TPlayer.buffType); if (buffs.Contains(88)) { player.Heal(player.TPlayer.statLifeMax2 / 7); } } } } }
void OnGetData(GetDataEventArgs args) { if (!doesHoneySuck) return; if (!args.Handled && args.MsgID == PacketTypes.Tile) { using (var reader = new BinaryReader(new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))) { var action = reader.ReadByte(); var x = reader.ReadInt16(); var y = reader.ReadInt16(); var type = reader.ReadUInt16(); //when this tile is destroyed... if (Main.tile[x, y].type != 225) return; if (action == 0) { //remove the tile from play instead of sending to the graveyard... Main.tile[x, y].active(false); Main.tile[x, y].frameX = -1; Main.tile[x, y].frameY = -1; Main.tile[x, y].liquidType(0); Main.tile[x, y].liquid = 0; Main.tile[x, y].type = 0; TSPlayer.All.SendTileSquare(x, y); TShock.Players[args.Msg.whoAmI].SendTileSquare(x, y); //and special summon honey block to the field Item itm = new Item(); itm.SetDefaults(1125); int itemid = Item.NewItem(x * 16, y * 16, itm.width, itm.height, itm.type, 1, true, 0, true); NetMessage.SendData((int)PacketTypes.ItemDrop, -1, -1, "", itemid, 0f, 0f, 0f); } } } }
private void OnGetData(GetDataEventArgs args) { //Restart boss timers if time is set if (args.MsgID != PacketTypes.TimeSet) { return; } bool day = config.BossToggles[BattleType.Day]; bool night = config.BossToggles[BattleType.Night]; bool special = config.BossToggles[BattleType.Special]; Timers.StartBosses(day, night, special); }
private void NetHooks_GetData(GetDataEventArgs e) { if (e == null || this.isDisposed || e.Handled) return; TSPlayer player = TShock.Players[e.Msg.whoAmI]; if (player == null) return; try { switch (e.MsgID) { case PacketTypes.Tile: { if (this.TileEdit == null) break; int editType = e.Msg.readBuffer[e.Index]; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || editType > 14) return; int blockType = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5); int objectStyle = e.Msg.readBuffer[e.Index + 7]; e.Handled = this.OnTileEdit( new TileEditEventArgs(player, (TileEditType)editType, new DPoint(x, y), (BlockType)blockType, objectStyle )); break; } case PacketTypes.PlaceObject: { if (this.ObjectPlacement == null && this.TileEdit == null) break; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); if (!TerrariaUtils.Tiles.IsValidCoord(x, y)) return; int blockType = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); int objectStyle = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6); int alternative = e.Msg.readBuffer[e.Index + 8]; int random = ((sbyte) e.Msg.readBuffer[e.Index + 9]); bool direction = BitConverter.ToBoolean(e.Msg.readBuffer, e.Index + 10); if (this.InvokeTileOnObjectPlacement) { e.Handled = this.OnTileEdit( new TileEditEventArgs(player, TileEditType.PlaceTile, new DPoint(x, y), (BlockType)blockType, objectStyle )); } if (!e.Handled) { e.Handled = this.OnObjectPlacement( new ObjectPlacementEventArgs(player, new DPoint(x, y), (BlockType)blockType, objectStyle, alternative, random, direction )); } break; } // Note: As for TileKill and TileKillNoItem, blockId will be of "1" if the player attempted to destroy // a tile but didn't succeed yet, and will be of "0" as the tile is actually destroyed. // However, there's one exception with Chests, they will never send their actual destroy packet, except a hack // tool is used, it seems. case PacketTypes.TileKill: { int type = e.Msg.readBuffer[e.Index]; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); if (!TerrariaUtils.Tiles.IsValidCoord(x, y)) break; int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5); if (type == 0 || type == 2) { // Chest placement / Dresser Placement e.Handled = this.OnChestPlace(new ChestPlaceEventArgs(player, new DPoint(x, y), type, style)); } else { // Chest kill int tileType = TerrariaUtils.Tiles[x, y].type; if (tileType != TileID.Containers && tileType != TileID.Dressers) break; if (this.InvokeTileEditOnChestKill) e.Handled = this.OnTileEdit(new TileEditEventArgs(player, TileEditType.TileKill, new DPoint(x, y), 0, 0)); if (!e.Handled) e.Handled = this.OnChestKill(new TileLocationEventArgs(player, new DPoint(x, y))); } break; } case PacketTypes.ChestOpen: { if (this.ChestOpen == null && this.ChestRename == null) break; int chestIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); if (!TerrariaUtils.Tiles.IsValidCoord(x, y)) break; int nameLength = e.Msg.readBuffer[e.Index + 6]; string newName = string.Empty; if ((nameLength > 0 && nameLength <= 20) || nameLength == 255) { // Name change requested? if (nameLength != 255) newName = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 8, nameLength); e.Handled = this.OnChestRename(new ChestRenameEventArgs(player, chestIndex, newName)); } if (!e.Handled) e.Handled = this.OnChestOpen(new ChestOpenEventArgs(player, chestIndex, new DPoint(x, y))); break; } case PacketTypes.ChestGetContents: { if (this.ChestGetContents == null) break; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || !Main.tile[x, y].active()) return; e.Handled = this.OnChestGetContents(new TileLocationEventArgs(player, new DPoint(x, y))); break; } case PacketTypes.ChestItem: { if (this.ChestModifySlot == null) break; int chestIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int slotIndex = e.Msg.readBuffer[e.Index + 2]; int itemStackSize = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); ItemPrefix itemPrefix = (ItemPrefix)e.Msg.readBuffer[e.Index + 5]; ItemType itemType = (ItemType)BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6); if (chestIndex >= Main.chest.Length || slotIndex > 39) break; e.Handled = this.OnChestModifySlot(new ChestModifySlotEventArgs( player, chestIndex, slotIndex, new ItemData(itemPrefix, itemType, itemStackSize) )); break; } case PacketTypes.SignNew: { if (this.SignEdit == null) break; int signIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); string newText; using (MemoryStream stream = new MemoryStream(e.Msg.readBuffer, e.Index + 6, e.Length - 7)) newText = new BinaryReader(stream).ReadString(); if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || !Main.tile[x, y].active()) return; e.Handled = this.OnSignEdit(new SignEditEventArgs(player, signIndex, new DPoint(x, y), newText)); break; } case PacketTypes.SignRead: { if (this.SignRead == null) break; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); if (!TerrariaUtils.Tiles.IsValidCoord(x, y)) break; e.Handled = this.OnSignRead(new TileLocationEventArgs(player, new DPoint(x, y))); break; } case PacketTypes.HitSwitch: { if (this.HitSwitch == null) break; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); if (!TerrariaUtils.Tiles.IsValidCoord(x, y) || !Main.tile[x, y].active()) return; // For some reason, TShock doesn't handle this packet so we just do our own checks. if (TShock.CheckIgnores(player)) return; if (TShock.CheckRangePermission(player, x, y, 32)) return; e.Handled = this.OnHitSwitch(new TileLocationEventArgs(player, new DPoint(x, y))); break; } case PacketTypes.SpawnBossorInvasion: { if (this.BossSpawn == null) break; //int playerIndex = BitConverter.ToInt32(e.Msg.readBuffer, e.Index); int bossType = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); e.Handled = this.OnBossSpawn(new BossSpawnEventArgs(player, (BossType)bossType)); break; } case PacketTypes.ItemDrop: case PacketTypes.UpdateItemDrop: { if (this.ItemUpdate == null) break; int itemIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); float x = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 2); float y = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 6); float velocityX = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 10); float velocityY = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 14); int itemStackSize = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 18); ItemPrefix itemPrefix = (ItemPrefix)e.Msg.readBuffer[e.Index + 20]; bool noDelay = (e.Msg.readBuffer[e.Index + 21] != 0); ItemType itemType = (ItemType)BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 22); // If it is actually an item pick up, then ensure a valid item index. if (itemType == 0 && (itemIndex < 0 || itemIndex >= Main.item.Length)) break; e.Handled = this.OnItemUpdate(new ItemUpdateEventArgs( player, itemIndex, new Vector2(x, y), new Vector2(velocityX, velocityY), noDelay, new ItemData(itemPrefix, itemType, itemStackSize) )); break; } case PacketTypes.ItemOwner: { if (this.ItemOwner == null) break; int itemIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int newOwnerPlayerIndex = e.Msg.readBuffer[e.Index + 2]; TSPlayer newOwner; if (newOwnerPlayerIndex < 255) newOwner = TShock.Players[newOwnerPlayerIndex]; else break; e.Handled = this.OnItemOwner(new ItemOwnerEventArgs(player, itemIndex, newOwner)); break; } case PacketTypes.ForceItemIntoNearestChest: { if (this.QuickStackNearby == null) break; int slotIndex = e.Msg.readBuffer[e.Index]; if (slotIndex >= TSPlayer.Server.TPlayer.inventory.Length) break; e.Handled = this.OnQuickStackNearby(new PlayerSlotEventArgs(player, slotIndex)); break; } case PacketTypes.PlayerSlot: { if (this.PlayerModifySlot == null) break; //byte playerIndex = e.Msg.readBuffer[e.Index]; int slotIndex = e.Msg.readBuffer[e.Index + 1]; int itemStackSize = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); ItemPrefix itemPrefix = (ItemPrefix)e.Msg.readBuffer[e.Index + 4]; ItemType itemType = (ItemType)BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5); Player tServerPlayer = TSPlayer.Server.TPlayer; if (slotIndex >= tServerPlayer.inventory.Length + tServerPlayer.bank.item.Length + tServerPlayer.bank2.item.Length) break; e.Handled = this.OnPlayerModifySlot(new PlayerModifySlotEventArgs( player, slotIndex, new ItemData(itemPrefix, itemType, itemStackSize) )); break; } case PacketTypes.LiquidSet: { if (this.LiquidSet == null) break; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); if (!TerrariaUtils.Tiles.IsValidCoord(x, y)) break; int liquidAmount = e.Msg.readBuffer[e.Index + 4]; LiquidKind liquidKind = (LiquidKind)e.Msg.readBuffer[e.Index + 5]; e.Handled = this.OnLiquidSet(new LiquidSetEventArgs(player, new DPoint(x, y), liquidAmount, liquidKind)); break; } case PacketTypes.DoorUse: { if (this.DoorUse == null) break; byte action = e.Msg.readBuffer[e.Index]; int x = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); if (!TerrariaUtils.Tiles.IsValidCoord(x, y)) break; int direction = e.Msg.readBuffer[e.Index + 5]; Direction actualDirection = Direction.Right; if (direction == 0) actualDirection = Direction.Left; e.Handled = this.OnDoorUse(new DoorUseEventArgs(player, new DPoint(x, y), (DoorAction)action, actualDirection)); break; } case PacketTypes.PlayerSpawn: { if (this.PlayerSpawn == null) break; int playerIndex = e.Msg.readBuffer[e.Index]; int spawnX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int spawnY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); if (!TerrariaUtils.Tiles.IsValidCoord(spawnX, spawnY)) break; e.Handled = this.OnPlayerSpawn(new PlayerSpawnEventArgs(player, new DPoint(spawnX, spawnY))); break; } // Note: Also door unlock case PacketTypes.ChestUnlock: { if (this.ChestUnlock == null) break; UnlockType unlockType = (UnlockType)e.Msg.readBuffer[e.Index]; int chestX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int chestY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); if (!TerrariaUtils.Tiles.IsValidCoord(chestX, chestY)) break; e.Handled = this.OnChestUnlock(new UnlockEventArgs(player, new DPoint(chestX, chestY), unlockType)); break; } case PacketTypes.ChatText: { if (this.ChatText == null) break; short playerIndex = e.Msg.readBuffer[e.Index]; if (playerIndex != e.Msg.whoAmI) break; int colorR = e.Msg.readBuffer[e.Index + 1]; int colorG = e.Msg.readBuffer[e.Index + 2]; int colorB = e.Msg.readBuffer[e.Index + 3]; string text = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 4, e.Length - 5); e.Handled = this.OnChatText(new ChatTextEventArgs(player, new Color(colorR, colorG, colorB), text)); break; } case PacketTypes.TileSendSquare: { if (this.SendTileSquare == null) break; int size = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int tileX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); int tileY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); if (!TerrariaUtils.Tiles.IsValidCoord(tileX, tileY)) break; e.Handled = this.OnSendTileSquare(new SendTileSquareEventArgs(player, new DPoint(tileX, tileY), size)); break; } case PacketTypes.PaintTile: { if (this.TilePaint == null) break; int tileX = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int tileY = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); if (!TerrariaUtils.Tiles.IsValidCoord(tileX, tileY)) break; int color = e.Msg.readBuffer[e.Index + 8]; e.Handled = this.OnTilePaint(new TilePaintEventArgs(player, new DPoint(tileX, tileY), (PaintColor)color)); break; } case PacketTypes.PlayerKillMe: { if (this.PlayerDeath == null) break; int playerIndex = e.Msg.readBuffer[e.Index]; int direction = e.Msg.readBuffer[e.Index + 1]; int dmg = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); bool pvp = e.Msg.readBuffer[e.Index + 4] != 0; string deathText = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 6, e.Length - 7); e.Handled = this.OnPlayerDeath(new PlayerDeathEventArgs(player, direction, dmg, pvp, deathText)); break; } case PacketTypes.Teleport: { if (this.Teleport == null) break; BitsByte flags = e.Msg.readBuffer[e.Index]; int playerIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); float x = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 3); float y = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 7); Vector2 destLocation = new Vector2(x, y); TeleportType tpType = TeleportType.PlayerToPos; if (flags[0]) tpType = TeleportType.NpcToPos; if (flags[1]) { if (flags[0]) tpType = TeleportType.Unknown; else tpType = TeleportType.PlayerNearPlayerWormhole; } e.Handled = this.OnTeleport(new TeleportEventArgs(player, destLocation, tpType)); break; } case PacketTypes.NpcStrike: { if (this.NpcTookDamage == null) break; int npcIndex = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int damage = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); float knockback = BitConverter.ToSingle(e.Msg.readBuffer, e.Index + 4); int hitDirection = e.Msg.readBuffer[e.Index + 8] - 1; // 1 left, -1 right bool isCritical = (e.Msg.readBuffer[e.Index + 9] == 1); e.Handled = this.OnNpcTookDamage(new NpcTookDamageEventArgs(player, npcIndex, damage, knockback, hitDirection, isCritical)); break; } } } catch (Exception ex) { ServerApi.LogWriter.PluginWriteLine( this.Plugin, string.Format("Internal error on handling data packet {0}. Exception details: \n{1}", e.MsgID, ex), TraceLevel.Error ); } }
void OnGetData(GetDataEventArgs e) { #region PlayerHP try { if (e.MsgID == PacketTypes.PlayerHp) { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var playerID = reader.ReadByte(); var HP = reader.ReadInt16(); var MaxHP = reader.ReadInt16(); if (Utils.GetPlayers((int)playerID) != null) { var player = Utils.GetPlayers((int)playerID); if (player.isHeal) { if (HP <= MaxHP / 2) { player.TSPlayer.Heal(500); player.TSPlayer.SendSuccessMessage("You just got healed!"); } } } } } } catch (Exception x) { Log.ConsoleError(x.ToString()); } #endregion #region PlayerMana //else if (e.MsgID == PacketTypes.PlayerMana) //{ // using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) // { // var reader = new BinaryReader(data); // var playerID = reader.ReadByte(); // var Mana = reader.ReadInt16(); // var MaxMana = reader.ReadInt16(); // var player = Utils.GetPlayers((int)playerID); // if (player.isHeal) // { // Item star = TShockAPI.TShock.Utils.GetItemById(184); // if (Mana <= MaxMana / 2) // { // TShock.Players[playerID].GiveItem(star.type, star.name, star.width, star.height, star.maxStack); // player.TSPlayer.SendSuccessMessage("Your mana has been restored!!"); // } // } // } //} #endregion #region PlayerDamage if (e.MsgID == PacketTypes.PlayerDamage) { try { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var ply = reader.ReadByte(); var hitDirection = reader.ReadByte(); var damage = reader.ReadInt16(); if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission("ignorecheatdetection") && e.Msg.whoAmI != ply) { if (config.maxDamageBan) { TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } else if (config.maxDamageKick) { TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } if (config.maxDamageIgnore) { e.Handled = true; } } //if (viewAll[ply]) //{ // e.Handled = true; //Should remove invincibility while /view'ing people //} } } catch (Exception x) { Log.ConsoleError(x.ToString()); } } #endregion #region NPCStrike if (e.MsgID == PacketTypes.NpcStrike) { try { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var npcID = reader.ReadInt16(); var damage = reader.ReadInt16(); if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission("ignorecheatdetection")) { if (config.maxDamageBan) { TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } else if (config.maxDamageKick) { TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } if (config.maxDamageIgnore) { e.Handled = true; } } } } catch (Exception x) { Log.ConsoleError(x.ToString()); } } #endregion #region PlayerTeam try { if (e.MsgID == PacketTypes.PlayerTeam) { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var ply = reader.ReadByte(); var team = reader.ReadByte(); if (Utils.GetPlayers((int)ply) != null) { var player = Utils.GetPlayers((int)ply); try { switch (team) { case 1: if (config.redPass != "") { if ((!player.accessRed) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendMessage("This team is locked, use /teamunlock red [password] to access it.", Color.Red); TShock.Players[ply].SetTeam(0); } } break; case 2: if (config.greenPass != "") { if ((!player.accessGreen) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendMessage("This team is locked, use /teamunlock green [password] to access it.", Color.Red); TShock.Players[ply].SetTeam(0); } } break; case 3: if (config.bluePass != "") { if ((!player.accessBlue) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendMessage("This team is locked, use /teamunlock blue [password] to access it.", Color.Red); TShock.Players[ply].SetTeam(0); } } break; case 4: if (config.yellowPass != "") { if ((!player.accessYellow) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendMessage("This team is locked, use /teamunlock yellow [password] to access it.", Color.Red); TShock.Players[ply].SetTeam(0); } } break; } } catch (Exception x) { Log.ConsoleError(x.ToString()); } } } } } catch (Exception x) { Log.ConsoleError(x.ToString()); } #endregion }
void OnGetData(GetDataEventArgs e) { if (!e.Handled) { int plr = e.Msg.whoAmI; using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { switch (e.MsgID) { case PacketTypes.ChestGetContents: { if (Infos[plr].TransactionsLeft > 0) { e.Handled = true; return; } int x = reader.ReadInt16(); int y = reader.ReadInt16(); Task.Factory.StartNew(() => GetChest(x, y, plr)).LogExceptions(); e.Handled = true; } break; case PacketTypes.ChestItem: { reader.ReadInt16(); byte slot = reader.ReadByte(); if (slot > 40) return; int stack = reader.ReadInt16(); byte prefix = reader.ReadByte(); int netID = reader.ReadInt16(); Infos[plr].TransactionsLeft++; Task.Factory.StartNew(() => ModChest(plr, slot, netID, stack, prefix)).LogExceptions(); e.Handled = true; } break; case PacketTypes.ChestOpen: { int action = reader.ReadInt16(); int x = reader.ReadInt16(); int y = reader.ReadInt16(); if (action == -1) { if (Infos[plr].TransactionsLeft > 0) { //user closed the chest, but still have items transferring, close when it finishes. Infos[plr].ShouldCloseAfterTransactions = true; } else { Infos[plr].X = -1; Infos[plr].Y = -1; } } else if (Infos[plr].TransactionsLeft > 0) { //the user is still transfering items, they shouldnt be allowed to open another chest until that finishes. return; } #if !MULTI_USE if (Infos.Any(p => p.X == x && p.Y == y)) { //chest is in use, ignore TShock.Players[plr].SendErrorMessage("This chest is currently open by someone else."); return; } #endif int length = reader.ReadByte(); if (length != 0 && length <= 20 && length != 255) TShock.Players[plr].SendData(PacketTypes.ChestName, "", 0, x, y); } break; case PacketTypes.TileKill: { if (Infos[plr].TransactionsLeft > 0) { return; } byte action = reader.ReadByte(); int x = reader.ReadInt16(); int y = reader.ReadInt16(); int style = reader.ReadInt16(); if (action == 0) { if (TShock.Regions.CanBuild(x, y, TShock.Players[plr])) { Task.Factory.StartNew(() => PlaceChest(x, y, plr)).LogExceptions(); WorldGen.PlaceChest(x, y, 21, false, style); NetMessage.SendData((int)PacketTypes.TileKill, -1, plr, "", 0, x, y, style, 1); NetMessage.SendData((int)PacketTypes.TileKill, plr, -1, "", 0, x, y, style, 0); e.Handled = true; } } else if (TShock.Regions.CanBuild(x, y, TShock.Players[plr]) && Main.tile[x, y].type == 21) { if (Main.tile[x, y].frameY % 36 != 0) y--; if (Main.tile[x, y].frameX % 36 != 0) x--; Task.Factory.StartNew(() => KillChest(x, y, plr)).LogExceptions(); e.Handled = true; } } break; } } } }
/// <summary> /// Occurs when a packet gets sent from a client to the server. /// </summary> /// <param name="args">Arguments.</param> void Net_GetData(GetDataEventArgs args) { Chain incomingChain = null; string packetInfo = null; Stopwatch processTimer = null; if (enabled == false || (incomingChain = GetIncomingChain()) == null) { return; } processTimer = new Stopwatch(); processTimer.Start(); packetInfo = string.Format("{0} len {1} from client slot {2}", args.MsgID.ToString("X"), args.Length, args.Msg.whoAmI); THLog.Debug("Packet in: " + packetInfo); incomingChain.ProcessChain(ref args, false); if (args.Handled == false) { THLog.Debug("Packet out: " + packetInfo); Interlocked.Increment(ref packetCounter); } else { Interlocked.Increment(ref handledCounter); } processTimer.Stop(); UpdateProcessorStats(processTimer.ElapsedMilliseconds); THLog.Debug("Chain process time: {0}ms", processTimer.ElapsedMilliseconds); }
void OnGetData(GetDataEventArgs e) { if (!e.Handled) { switch (e.MsgID) { case PacketTypes.PlaceItemFrame: //TSPlayer.All.SendInfoMessage("Placing item frame!"); break; case PacketTypes.PlaceTileEntity: //TSPlayer.All.SendInfoMessage("Placing tile entity!"); break; case PacketTypes.UpdateTileEntity: //TSPlayer.All.SendInfoMessage("Updating tile entity!"); break; case PacketTypes.Tile: { byte etype = e.Msg.readBuffer[e.Index]; int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 5); byte style = e.Msg.readBuffer[e.Index + 7]; if (type == 1 && (etype == 0 || etype == 4)) { if (Main.tile[X, Y].type == 21 || Main.tile[X, Y].type == 88) return; //Chests and dressers handled separately //else if (Main.tile[X, Y].type == 2699) //TSPlayer.All.SendInfoMessage("Weapon rack place"); } //DEBUG //TSPlayer.All.SendInfoMessage($"Type: {type}"); if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5); //DEBUG //TSPlayer.All.SendInfoMessage($"X: {X}, Y: {Y}, FrameX: {Main.tile[X, Y].frameX}, FrameY: {Main.tile[X, Y].frameY}"); e.Handled = true; //END DEBUG if (type == 0 && (etype == 0 || etype == 4)) adjustFurniture(ref X, ref Y, ref style); CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI])); e.Handled = true; } else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { //effect only adjustFurniture(ref X, ref Y, ref style); if (type == 1 && (etype == 0 || etype == 2 || etype == 4)) return; logEdit(etype, Main.tile[X, Y], X, Y, type, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), style); } } } break; case PacketTypes.PlaceObject: { int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 4); int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6); //DEBUG: //TSPlayer.All.SendInfoMessage($"Style: {style}"); int alt = (byte)e.Msg.readBuffer[e.Index + 8]; //TSPlayer.All.SendInfoMessage($"Alternate: {alt}"); int rand = (sbyte)e.Msg.readBuffer[e.Index + 9]; //TSPlayer.All.SendInfoMessage($"Random: {rand}"); bool dir = BitConverter.ToBoolean(e.Msg.readBuffer, e.Index + 10); if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5); CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI])); e.Handled = true; } else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { logEdit(1, Main.tile[X, Y], X, Y, type, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), (byte)style, alt, rand, dir); } } } break; //chest delete case PacketTypes.TileKill: { byte flag = e.Msg.readBuffer[e.Index]; int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5); byte style2 = (byte)style; if (X >= 0 && Y >= 0 && X < Main.maxTilesX && Y < Main.maxTilesY) { //PlaceChest if (flag == 0 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5); CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI])); e.Handled = true; } else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { logEdit(1, Main.tile[X, Y], X, Y, 21, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), style2); } return; } //KillChest if (flag == 1 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y) && Main.tile[X, Y].type == 21) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5); adjustFurniture(ref X, ref Y, ref style2); CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI])); e.Handled = true; return; } adjustFurniture(ref X, ref Y, ref style2); Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color()); return; } //PlaceDresser if (flag == 2 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5); CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI])); e.Handled = true; } else if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { logEdit(1, Main.tile[X, Y], X, Y, 88, TShock.Players[e.Msg.whoAmI].User.Name, new List<Vector2>(), style2); } return; } //KillDresser if (flag == 3 && regionCheck(TShock.Players[e.Msg.whoAmI], X, Y) && Main.tile[X, Y].type == 88) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y, 5); adjustFurniture(ref X, ref Y, ref style2); CommandQueue.Add(new HistoryCommand(X, Y, TShock.Players[e.Msg.whoAmI])); e.Handled = true; return; } adjustFurniture(ref X, ref Y, ref style2); Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color()); return; } } } break; case PacketTypes.PaintTile: { int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); byte color = e.Msg.readBuffer[e.Index + 4]; if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 25, color, 0, Main.tile[X, Y].color()); } } break; case PacketTypes.PaintWall: { int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); byte color = e.Msg.readBuffer[e.Index + 4]; if (regionCheck(TShock.Players[e.Msg.whoAmI], X, Y)) { Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 26, color, 0, Main.tile[X, Y].wallColor()); } } break; case PacketTypes.SignNew: { ushort signI = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index); int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); byte s = 0; adjustFurniture(ref X, ref Y, ref s); //Adjust coords so history picks it up, readSign() adjusts back to origin anyway Queue(TShock.Players[e.Msg.whoAmI].User.Name, X, Y, 27, data: signI, text: Main.sign[signI].text); } break; } } }
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 }
internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length) { if (Main.netMode == 2) { switch ((PacketTypes)msgId) { case PacketTypes.ConnectRequest: if (this.InvokeServerConnect(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ContinueConnecting2: if (this.InvokeServerJoin(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ChatText: var text = ""; using (var stream = new MemoryStream(buffer.readBuffer)) { stream.Position = index; using (var reader = new BinaryReader(stream)) { reader.ReadByte(); reader.ReadRGB(); text = reader.ReadString(); } } if (this.InvokeServerChat(buffer, buffer.whoAmI, @text)) { return(true); } break; //Making sure packet length is 38, otherwise it's not a valid UUID packet length. //We copy the bytes of the UUID then convert it to string. Then validating the GUID so its the correct format. //Then the bytes get hashed, and set as ClientUUID (and gets written in DB for auto-login) //length minus 2 = 36, the length of a UUID. case PacketTypes.ClientUUID: if (length == 38) { byte[] uuid = new byte[length - 2]; Buffer.BlockCopy(buffer.readBuffer, index + 1, uuid, 0, length - 2); Guid guid = new Guid(); if (Guid.TryParse(Encoding.Default.GetString(uuid, 0, uuid.Length), out guid)) { SHA512 shaM = new SHA512Managed(); var result = shaM.ComputeHash(uuid); Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2")); return(true); } } Netplay.Clients[buffer.whoAmI].ClientUUID = ""; return(true); } } GetDataEventArgs args = new GetDataEventArgs { MsgID = (PacketTypes)msgId, Msg = buffer, Index = index, Length = length }; this.NetGetData.Invoke(args); msgId = (byte)args.MsgID; index = args.Index; length = args.Length; return(args.Handled); }
internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length) { if (Main.netMode == 2) { // A critical server crash/corruption bug was reported by @bartico6 on GitHub. // If a packet length comes in at extreme values, the server can enter infinite loops, deadlock, and corrupt the world. // As a result, we take the following action: disconnect the player and log the attempt as soon as we can. // The length 1000 was chosen as an arbitrarily large number for all packets. It may need to be tuned later. if (length > 1000) { RemoteClient currentClient = Netplay.Clients[buffer.whoAmI]; string name = String.IsNullOrWhiteSpace(currentClient.Name) ? "Unknown" : currentClient.Name; ServerApi.LogWriter.ServerWriteLine("Disconnecting " + name + " (" + currentClient.Socket.GetRemoteAddress() + ") for attempted packet length overflow crash/DoS attempt.", TraceLevel.Error); Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } switch ((PacketTypes)msgId) { case PacketTypes.ConnectRequest: if (this.InvokeServerConnect(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ContinueConnecting2: if (this.InvokeServerJoin(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.LoadNetModule: using (var stream = new MemoryStream(buffer.readBuffer)) { stream.Position = index; using (var reader = new BinaryReader(stream)) { ushort moduleId = reader.ReadUInt16(); //LoadNetModule is now used for sending chat text. //Read the module ID to determine if this is in fact the text module if (moduleId == Terraria.Net.NetManager.Instance.GetId <Terraria.GameContent.NetModules.NetTextModule>()) { //Then deserialize the message from the reader Terraria.Chat.ChatMessage msg = Terraria.Chat.ChatMessage.Deserialize(reader); if (InvokeServerChat(buffer, buffer.whoAmI, @msg.Text, msg.CommandId)) { return(true); } } } } break; //Making sure packet length is 38, otherwise it's not a valid UUID packet length. //We copy the bytes of the UUID then convert it to string. Then validating the GUID so its the correct format. //Then the bytes get hashed, and set as ClientUUID (and gets written in DB for auto-login) //length minus 2 = 36, the length of a UUID. case PacketTypes.ClientUUID: if (length == 38) { byte[] uuid = new byte[length - 2]; Buffer.BlockCopy(buffer.readBuffer, index + 1, uuid, 0, length - 2); Guid guid = new Guid(); if (Guid.TryParse(Encoding.Default.GetString(uuid, 0, uuid.Length), out guid)) { SHA512 shaM = new SHA512Managed(); var result = shaM.ComputeHash(uuid); Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2")); return(true); } } Netplay.Clients[buffer.whoAmI].ClientUUID = ""; return(true); } } GetDataEventArgs args = new GetDataEventArgs { MsgID = (PacketTypes)msgId, Msg = buffer, Index = index, Length = length }; this.NetGetData.Invoke(args); msgId = (byte)args.MsgID; index = args.Index; length = args.Length; return(args.Handled); }
private static void OnGetData(GetDataEventArgs e) { if (e.Handled) return; using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) switch (e.MsgID) { #region Sign Edit case PacketTypes.SignNew: { reader.ReadInt16(); var x = reader.ReadInt16(); var y = reader.ReadInt16(); var text = reader.ReadString(); var id = Sign.ReadSign(x, y); if (id < 0 || Main.sign[id] == null) return; x = (short)Main.sign[id].x; y = (short)Main.sign[id].y; if (OnSignNew(x, y, text, e.Msg.whoAmI)) { e.Handled = true; TShock.Players[e.Msg.whoAmI].SendData(PacketTypes.SignNew, "", id); TShock.Players[e.Msg.whoAmI].SendErrorMessage("This sign is protected from modifications."); } } break; #endregion #region Sign Read case PacketTypes.SignRead: { var x = reader.ReadInt16(); var y = reader.ReadInt16(); var id = Sign.ReadSign(x, y); if (id < 0 || Main.sign[id] == null) return; x = (short)Main.sign[id].x; y = (short)Main.sign[id].y; var text = Main.sign[id].text; if (OnSignOpen(x, y, text, e.Msg.whoAmI)) { e.Handled = true; TShock.Players[e.Msg.whoAmI].SendErrorMessage("This sign is protected from viewing"); } } break; #endregion #region Tile Modify case PacketTypes.Tile: { var action = reader.ReadByte(); var x = reader.ReadInt16(); var y = reader.ReadInt16(); var type = reader.ReadUInt16(); if (Main.tile[x, y].type != 55) return; var id = Sign.ReadSign(x, y); if (id < 0 || Main.sign[id] == null) return; x = (short)Main.sign[id].x; y = (short)Main.sign[id].y; var text = Main.sign[id].text; bool handle; if (action == 0 && type == 0) handle = OnSignKill(x, y, text, e.Msg.whoAmI); else handle = OnSignHit(x, y, text, e.Msg.whoAmI); if (handle) { e.Handled = true; TShock.Players[e.Msg.whoAmI].SendTileSquare(x, y); } } break; #endregion } }
void OnGetData(GetDataEventArgs args) { var ply = args.Msg.whoAmI; if (args.MsgID == PacketTypes.SignRead && Memory[ply].Active) { using (var reader = new BinaryReader(new MemoryStream(args.Msg.readBuffer, args.Index, args.Length))) { int x = reader.ReadInt16(); int y = reader.ReadInt16(); int signID = Sign.ReadSign(x, y); Sign sign = UsingInfiniteSigns ? Utils.DbGetSign(x, y) : Main.sign[signID]; if (sign == null) TShock.Log.Debug("Utils.DbGetSign(int x, int y) returned null."); else { switch (Memory[ply].Action) { case SignAction.LOAD: if (UsingInfiniteSigns) { var text = FileTools.Load(Memory[ply].File); if (!Utils.DbSetSignText(sign.x, sign.y, text)) { TShock.Players[ply].PluginErrorMessage( "Failed to load to InfiniteSigns sign."); break; } } else { Sign.TextSign(signID, FileTools.Load(Memory[ply].File)); } TShock.Players[ply].PluginInfoMessage("Loaded file '{0}' to sign.", Memory[ply].File); break; case SignAction.SAVE: if (FileTools.Save(Memory[ply].File, sign.text)) { TShock.Players[ply].PluginInfoMessage("Saved sign's contents to file '{0}'.", Memory[ply].File); } else { TShock.Players[ply].PluginErrorMessage( "Failed to save to file. Check logs for details."); } break; case SignAction.COPY: Memory[ply].Clipboard = sign.text; TShock.Players[ply].PluginInfoMessage( "Copied sign's contents to clipboard."); break; case SignAction.PASTE: case SignAction.PERSISTENT: if (UsingInfiniteSigns) { var text = Memory[ply].Clipboard; if (!Utils.DbSetSignText(sign.x, sign.y, text)) { TShock.Players[ply].PluginErrorMessage( "Failed to paste to InfiniteSigns sign."); break; } } else { Sign.TextSign(signID, Memory[ply].Clipboard); } TShock.Players[ply].PluginInfoMessage("Pasted selection."); break; } Memory[ply].Active = Memory[ply].Action == SignAction.PERSISTENT; args.Handled = true; } } } }
internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length) { if (Main.netMode == 2) { switch ((PacketTypes) msgId) { case PacketTypes.ConnectRequest: if (this.InvokeServerConnect(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return true; } break; case PacketTypes.ContinueConnecting2: if (this.InvokeServerJoin(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return true; } break; case PacketTypes.ChatText: var text = ""; using(var stream = new MemoryStream(buffer.readBuffer)) { stream.Position = index; using(var reader = new BinaryReader(stream)) { reader.ReadByte(); reader.ReadRGB(); text = reader.ReadString(); } } if (this.InvokeServerChat(buffer, buffer.whoAmI, @text)) return true; break; case PacketTypes.ClientUUID: byte[] uuid = new byte[length - 5]; Buffer.BlockCopy(buffer.readBuffer, index + 4, uuid, 0, length - 5); SHA512 shaM = new SHA512Managed(); var result = shaM.ComputeHash(uuid); Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));; return true; } } GetDataEventArgs args = new GetDataEventArgs { MsgID = (PacketTypes)msgId, Msg = buffer, Index = index, Length = length }; this.NetGetData.Invoke(args); msgId = (byte)args.MsgID; index = args.Index; length = args.Length; return args.Handled; }
internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length) { if (Main.netMode != 2 && msgId == (byte)PacketTypes.ChatText && length > 3) { byte playerID = buffer.readBuffer[index]; Color color = new Color(buffer.readBuffer[index + 1] << 16, buffer.readBuffer[index + 2] << 8, buffer.readBuffer[index + 3]); string @string = Encoding.UTF8.GetString(buffer.readBuffer, index + 4, length - 5); this.InvokeClientChatReceived(playerID, color, @string); } if (Main.netMode == 2) { switch ((PacketTypes)msgId) { case PacketTypes.ConnectRequest: if (this.InvokeServerConnect(buffer.whoAmI)) { Netplay.serverSock[buffer.whoAmI].kill = true; return(true); } break; case PacketTypes.ContinueConnecting2: if (this.InvokeServerJoin(buffer.whoAmI)) { Netplay.serverSock[buffer.whoAmI].kill = true; return(true); } break; case PacketTypes.ChatText: var text = ""; using (var stream = new MemoryStream(buffer.readBuffer)) { stream.Position = index; using (var reader = new BinaryReader(stream)) { reader.ReadByte(); reader.ReadRGB(); text = reader.ReadString(); } } if (this.InvokeServerChat(buffer, buffer.whoAmI, @text)) { return(true); } break; case PacketTypes.ClientUUID: byte[] uuid = new byte[length - 5]; Buffer.BlockCopy(buffer.readBuffer, index + 4, uuid, 0, length - 5); SHA512 shaM = new SHA512Managed(); var result = shaM.ComputeHash(uuid); Netplay.serverSock[buffer.whoAmI].clientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));; return(true); break; } } GetDataEventArgs args = new GetDataEventArgs { MsgID = (PacketTypes)msgId, Msg = buffer, Index = index, Length = length }; this.NetGetData.Invoke(args); msgId = (byte)args.MsgID; index = args.Index; length = args.Length; return(args.Handled); }
/// <summary>OnGetData - Called when the server gets raw data packets.</summary> /// <param name="e">e - The GetDataEventArgs object.</param> private void OnGetData(GetDataEventArgs e) { if (e.Handled) return; PacketTypes type = e.MsgID; Debug.WriteLine("Recv: {0:X}: {2} ({1:XX})", e.Msg.whoAmI, (byte)type, type); var player = Players[e.Msg.whoAmI]; if (player == null || !player.ConnectionAlive) { e.Handled = true; return; } if (player.RequiresPassword && type != PacketTypes.PasswordSend) { e.Handled = true; return; } if ((player.State < 10 || player.Dead) && (int)type > 12 && (int)type != 16 && (int)type != 42 && (int)type != 50 && (int)type != 38 && (int)type != 21 && (int)type != 22) { e.Handled = true; return; } int length = e.Length - 1; if (length < 0) { length = 0; } using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length - 1)) { // Exceptions are already handled e.Handled = GetDataHandlers.HandlerGetData(type, player, data); } }
public void OnGetData(GetDataEventArgs e) { if (e.Handled) { return; } switch (e.MsgID) { #region Sign Edit case PacketTypes.SignNew: { int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 2); int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 6); string text = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 10, e.Length - 11); int id = Terraria.Sign.ReadSign(X, Y); if (id < 0 || Main.sign[id] == null) return; X = Main.sign[id].x; Y = Main.sign[id].y; if (OnSignEdit(X, Y, text, e.Msg.whoAmI)) { e.Handled = true; TShock.Players[e.Msg.whoAmI].SendData(PacketTypes.SignNew, "", id); } } break; #endregion #region Tile Modify case PacketTypes.Tile: { int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 1); int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 5); if (Main.tile[X, Y].type != 55) return; int id = Terraria.Sign.ReadSign(X, Y); if (id < 0 || Main.sign[id] == null) return; X = Main.sign[id].x; Y = Main.sign[id].y; string text = Main.sign[id].text; bool handle = false; if (e.Msg.readBuffer[e.Index] == 0 && e.Msg.readBuffer[e.Index + 9] == 0) handle = OnSignKill(X, Y, text, e.Msg.whoAmI); else handle = OnSignHit(X, Y, text, e.Msg.whoAmI); if (handle) { e.Handled = true; TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y); } } break; #endregion } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled) { using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { switch (e.MsgID) { case PacketTypes.SignNew: { reader.ReadInt16(); int x = reader.ReadInt16(); int y = reader.ReadInt16(); string text = reader.ReadString(); Task.Factory.StartNew(() => ModSign(x, y, e.Msg.whoAmI, text)); e.Handled = true; } break; case PacketTypes.SignRead: { int x = reader.ReadInt16(); int y = reader.ReadInt16(); Task.Factory.StartNew(() => GetSign(x, y, e.Msg.whoAmI)); e.Handled = true; } break; case PacketTypes.Tile: { byte action = reader.ReadByte(); int x = reader.ReadInt16(); int y = reader.ReadInt16(); ushort type = reader.ReadUInt16(); if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY) return; if (action == 0 && type == 0) { if (Sign.Nearby(x, y)) { Task.Factory.StartNew(() => KillSign(x, y, e.Msg.whoAmI)); e.Handled = true; } } else if (action == 1 && (type == 55 || type == 85)) { if (TShock.Regions.CanBuild(x, y, TShock.Players[e.Msg.whoAmI])) { WorldGen.PlaceSign(x, y, type); NetMessage.SendData(17, -1, e.Msg.whoAmI, "", 1, x, y, type); if (Main.tile[x, y].frameY != 0) y--; if (Main.tile[x, y].frameX % 36 != 0) x--; Task.Factory.StartNew(() => PlaceSign(x, y, e.Msg.whoAmI)); e.Handled = true; } } } break; } } } }
internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length) { if (Main.netMode == 2) { switch ((PacketTypes)msgId) { case PacketTypes.ConnectRequest: if (this.InvokeServerConnect(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ContinueConnecting2: if (this.InvokeServerJoin(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ChatText: var text = ""; using (var stream = new MemoryStream(buffer.readBuffer)) { stream.Position = index; using (var reader = new BinaryReader(stream)) { reader.ReadByte(); reader.ReadRGB(); text = reader.ReadString(); } } if (this.InvokeServerChat(buffer, buffer.whoAmI, @text)) { return(true); } break; case PacketTypes.ClientUUID: byte[] uuid = new byte[length - 5]; Buffer.BlockCopy(buffer.readBuffer, index + 4, uuid, 0, length - 5); SHA512 shaM = new SHA512Managed(); var result = shaM.ComputeHash(uuid); Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2"));; return(true); } } GetDataEventArgs args = new GetDataEventArgs { MsgID = (PacketTypes)msgId, Msg = buffer, Index = index, Length = length }; this.NetGetData.Invoke(args); msgId = (byte)args.MsgID; index = args.Index; length = args.Length; return(args.Handled); }
public void OnGetData(GetDataEventArgs e) { try { if (e.MsgID == PacketTypes.PlayerUpdate) { byte plyID = e.Msg.readBuffer[e.Index]; byte flags = e.Msg.readBuffer[e.Index + 1]; var player = PlayerList[plyID]; if (player != null && player.LastState != flags) { player.LastState = flags; player.IdleCount = 0; } } } catch (Exception ex) { Log.ConsoleError(ex.ToString()); } }
private void OnGetData(GetDataEventArgs e) { if (e.Handled) { return; } TSPlayer tsplayer = TShock.Players[e.Msg.whoAmI]; if (tsplayer == null) { return; } switch (e.MsgID) { #region Packet 45 - PlayerKillMe case PacketTypes.PlayerKillMe: if (tsplayer.Group.HasPermission(Permissions.TpBack)) { tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position); } return; case PacketTypes.Teleport: { if (tsplayer.Group.HasPermission(Permissions.TpBack)) { using (MemoryStream ms = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { BitsByte flags = (byte)ms.ReadByte(); int type = 0; if (flags[1]) { type = 2; } if (type == 0 && tsplayer.Group.HasPermission(TShockAPI.Permissions.rod)) { tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position); } else if (type == 2 && tsplayer.Group.HasPermission(TShockAPI.Permissions.wormhole)) { tsplayer.GetPlayerInfo().PushBackHistory(tsplayer.TPlayer.position); } } } } return; #endregion } }
internal bool InvokeNetGetData(ref byte msgId, MessageBuffer buffer, ref int index, ref int length) { if (Main.netMode == 2) { // A critical server crash/slow-down bug was exploited in which a 0-length // packet is sent, causing all NetGetData handlers to throw exceptions. // Because a packet's header is 2 bytes of length + 1 byte of packet type, // all packets must contain at least 3 bytes. // Ideally this check should occur in an OTAPI modification. if (length < 1) { RemoteClient currentClient = Netplay.Clients[buffer.whoAmI]; Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } // A critical server crash/corruption bug was reported by @bartico6 on GitHub. // If a packet length comes in at extreme values, the server can enter infinite loops, deadlock, and corrupt the world. // As a result, we take the following action: disconnect the player and log the attempt as soon as we can. // The length 1000 was chosen as an arbitrarily large number for all packets. It may need to be tuned later. if (length > 1000) { RemoteClient currentClient = Netplay.Clients[buffer.whoAmI]; Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } switch ((PacketTypes)msgId) { case PacketTypes.ConnectRequest: if (this.InvokeServerConnect(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ContinueConnecting2: if (this.InvokeServerJoin(buffer.whoAmI)) { Netplay.Clients[buffer.whoAmI].PendingTermination = true; return(true); } break; case PacketTypes.ChatText: var text = ""; using (var stream = new MemoryStream(buffer.readBuffer)) { stream.Position = index; using (var reader = new BinaryReader(stream)) { reader.ReadByte(); reader.ReadRGB(); text = reader.ReadString(); } } if (this.InvokeServerChat(buffer, buffer.whoAmI, @text)) { return(true); } break; //Making sure packet length is 38, otherwise it's not a valid UUID packet length. //We copy the bytes of the UUID then convert it to string. Then validating the GUID so its the correct format. //Then the bytes get hashed, and set as ClientUUID (and gets written in DB for auto-login) //length minus 2 = 36, the length of a UUID. case PacketTypes.ClientUUID: if (length == 38) { byte[] uuid = new byte[length - 2]; Buffer.BlockCopy(buffer.readBuffer, index + 1, uuid, 0, length - 2); Guid guid = new Guid(); if (Guid.TryParse(Encoding.Default.GetString(uuid, 0, uuid.Length), out guid)) { SHA512 shaM = new SHA512Managed(); var result = shaM.ComputeHash(uuid); Netplay.Clients[buffer.whoAmI].ClientUUID = result.Aggregate("", (s, b) => s + b.ToString("X2")); return(true); } } Netplay.Clients[buffer.whoAmI].ClientUUID = ""; return(true); } } GetDataEventArgs args = new GetDataEventArgs { MsgID = (PacketTypes)msgId, Msg = buffer, Index = index, Length = length }; this.NetGetData.Invoke(args); msgId = (byte)args.MsgID; index = args.Index; length = args.Length; return(args.Handled); }
/// <summary> /// Occurs when the server has received a message from the client. /// </summary> protected void NetHooks_GetData(GetDataEventArgs args) { byte[] bufferSegment = null; Terraria.Player player = null; if ((player = Terraria.Main.player.ElementAtOrDefault(args.Msg.whoAmI)) == null) { return; } bufferSegment = new byte[args.Length]; System.Array.Copy(args.Msg.readBuffer, args.Index, bufferSegment, 0, args.Length); if (args.MsgID == PacketTypes.NpcStrike) { Terraria.NPC npc = null; Packets.DamageNPC dmgPacket = Packets.PacketMarshal.MarshalFromBuffer<Packets.DamageNPC>(bufferSegment); if (dmgPacket.NPCID < 0 || dmgPacket.NPCID > Terraria.Main.npc.Length || args.Msg.whoAmI < 0 || dmgPacket.NPCID > Terraria.Main.player.Length) { return; } if ((npc = Terraria.Main.npc.ElementAtOrDefault(dmgPacket.NPCID)) == null) { return; } AddNPCDamage(npc, player, dmgPacket.Damage, Convert.ToBoolean(dmgPacket.CrititcalHit)); } }
void OnGetData(GetDataEventArgs e) { #region PlayerHP try { if (e.MsgID == PacketTypes.PlayerHp) { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var playerID = reader.ReadByte(); var HP = reader.ReadInt16(); var MaxHP = reader.ReadInt16(); if (Utils.GetPlayers((int)playerID) != null) { var player = Utils.GetPlayers((int)playerID); if (player.isHeal) { if (HP <= MaxHP / 2) { player.TSPlayer.Heal(500); player.TSPlayer.SendSuccessMessage("You just got healed!"); } } } } } } catch (Exception x) { TShock.Log.ConsoleError(x.ToString()); } #endregion #region PlayerDamage if (e.MsgID == PacketTypes.PlayerDamage) { try { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var ply = reader.ReadByte(); var hitDirection = reader.ReadByte(); var damage = reader.ReadInt16(); if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission(Permissions.ignoredamagecap) && e.Msg.whoAmI != ply) { if (config.maxDamageBan) { TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } else if (config.maxDamageKick) { TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } if (config.maxDamageIgnore) { e.Handled = true; } } } } catch (Exception x) { TShock.Log.ConsoleError(x.ToString()); } } #endregion #region NPCStrike if (e.MsgID == PacketTypes.NpcStrike) { try { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var npcID = reader.ReadInt16(); var damage = reader.ReadInt16(); if ((damage > config.maxDamage || damage < 0) && !TShock.Players[e.Msg.whoAmI].Group.HasPermission(Permissions.ignoredamagecap)) { if (config.maxDamageBan) { TShockAPI.TShock.Utils.Ban(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } else if (config.maxDamageKick) { TShockAPI.TShock.Utils.Kick(TShock.Players[e.Msg.whoAmI], "You have exceeded the max damage limit."); } if (config.maxDamageIgnore) { e.Handled = true; } } } } catch (Exception x) { TShock.Log.ConsoleError(x.ToString()); } } #endregion #region PlayerTeam try { if (e.MsgID == PacketTypes.PlayerTeam) { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var ply = reader.ReadByte(); var team = reader.ReadByte(); if (Utils.GetPlayers((int)ply) != null) { var player = Utils.GetPlayers((int)ply); try { switch (team) { case 1: if (config.redPass != "") { if ((!player.accessRed) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock red [password] to access it.", TShock.Config.CommandSpecifier); TShock.Players[ply].SetTeam(0); } } break; case 2: if (config.greenPass != "") { if ((!player.accessGreen) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock green [password] to access it.", TShock.Config.CommandSpecifier); TShock.Players[ply].SetTeam(0); } } break; case 3: if (config.bluePass != "") { if ((!player.accessBlue) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock blue [password] to access it.", TShock.Config.CommandSpecifier); TShock.Players[ply].SetTeam(0); } } break; case 4: if (config.yellowPass != "") { if ((!player.accessYellow) && (TShock.Players[ply].Group.Name != "superadmin")) { e.Handled = true; TShock.Players[ply].SendErrorMessage("This team is locked, use {0}teamunlock yellow [password] to access it.", TShock.Config.CommandSpecifier); TShock.Players[ply].SetTeam(0); } } break; } } catch (Exception x) { TShock.Log.ConsoleError(x.ToString()); } } } } } catch (Exception x) { TShock.Log.ConsoleError(x.ToString()); } #endregion if (e.MsgID == PacketTypes.ItemDrop) { try { using (var data = new MemoryStream(e.Msg.readBuffer, e.Index, e.Length)) { var reader = new BinaryReader(data); var itemid = reader.ReadInt16(); if (itemid < 400) return; } List<DateTime> plrinfo = new List<DateTime>(); int index = e.Msg.whoAmI; if (itemspam.ContainsKey(index)) { plrinfo = itemspam[index]; plrinfo.Add(DateTime.Now); if (plrinfo.Count > 10) { while (plrinfo.Count > 0 && (DateTime.Now - plrinfo[0]).TotalSeconds > 20) { plrinfo.RemoveAt(0); } if (plrinfo.Count > 10) { TShock.Players[index].SendData(PacketTypes.Status, "Do not spam items on this server!"); e.Handled = true; return; } } } else { itemspam.Add(index, new List<DateTime>() { DateTime.Now }); } } catch { } } }
void OnGetData(GetDataEventArgs e) { if (!e.Handled) { switch (e.MsgID) { case PacketTypes.PlaceItemFrame: //TSPlayer.All.SendInfoMessage("Placing item frame!"); break; case PacketTypes.PlaceTileEntity: //TSPlayer.All.SendInfoMessage("Placing tile entity!"); break; case PacketTypes.UpdateTileEntity: //TSPlayer.All.SendInfoMessage("Updating tile entity!"); break; case PacketTypes.Tile: { byte etype = e.Msg.readBuffer[e.Index]; int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 5); byte style = e.Msg.readBuffer[e.Index + 7]; if (type == 1 && (etype == 0 || etype == 4)) { if (Main.tile[X, Y].type == 21 || Main.tile[X, Y].type == 88) return; //Chests and dressers handled separately //else if (Main.tile[X, Y].type == 2699) //TSPlayer.All.SendInfoMessage("Weapon rack place"); } //DEBUG //TSPlayer.All.SendInfoMessage($"Type: {type}"); TSPlayer ply = TShock.Players[e.Msg.whoAmI]; string logName = ply.User == null ? "unregistered" : ply.User.Name; //Checking history now requires build permission in the area due to load order, if needed this could be fixed by having an alternate function check this packet on a higher order. if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; ply.SendTileSquare(X, Y, 5); //DEBUG //TSPlayer.All.SendInfoMessage($"X: {X}, Y: {Y}, FrameX: {Main.tile[X, Y].frameX}, FrameY: {Main.tile[X, Y].frameY}"); //END DEBUG if (type == 0 && (etype == 0 || etype == 4)) adjustFurniture(ref X, ref Y, ref style); CommandQueue.Add(new HistoryCommand(X, Y, ply)); e.Handled = true; } else { //effect only if (type == 1 && (etype == 0 || etype == 2 || etype == 4)) return; logEdit(etype, Main.tile[X, Y], X, Y, type, logName, new List<Vector2>(), style); } } break; case PacketTypes.PlaceObject: { int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); ushort type = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index + 4); int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6); //DEBUG: //TSPlayer.All.SendInfoMessage($"Style: {style}"); int alt = (byte)e.Msg.readBuffer[e.Index + 8]; //TSPlayer.All.SendInfoMessage($"Alternate: {alt}"); int rand = (sbyte)e.Msg.readBuffer[e.Index + 9]; //TSPlayer.All.SendInfoMessage($"Random: {rand}"); bool dir = BitConverter.ToBoolean(e.Msg.readBuffer, e.Index + 10); TSPlayer ply = TShock.Players[e.Msg.whoAmI]; string logName = ply.User == null ? "unregistered" : ply.User.Name; //Checking history now requires build permission in the area due to load order, if needed this could be fixed by having an alternate function check this packet on a higher order. if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; ply.SendTileSquare(X, Y, 5); CommandQueue.Add(new HistoryCommand(X, Y, ply)); e.Handled = true; } else { logEdit(1, Main.tile[X, Y], X, Y, type, logName, new List<Vector2>(), (byte)style, alt, rand, dir); } } break; //chest delete case PacketTypes.TileKill: { byte flag = e.Msg.readBuffer[e.Index]; int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 1); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 3); int style = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 5); byte style2 = (byte)style; TSPlayer ply = TShock.Players[e.Msg.whoAmI]; string logName = ply.User == null ? "unregistered" : ply.User.Name; //PlaceChest if (flag == 0) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; ply.SendTileSquare(X, Y, 5); CommandQueue.Add(new HistoryCommand(X, Y, ply)); e.Handled = true; } else { logEdit(1, Main.tile[X, Y], X, Y, 21, logName, new List<Vector2>(), style2); } return; } //KillChest if (flag == 1 && Main.tile[X, Y].type == 21) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; ply.SendTileSquare(X, Y, 5); adjustFurniture(ref X, ref Y, ref style2); CommandQueue.Add(new HistoryCommand(X, Y, ply)); e.Handled = true; return; } adjustFurniture(ref X, ref Y, ref style2); Queue(logName, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color()); return; } //PlaceDresser if (flag == 2) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; ply.SendTileSquare(X, Y, 5); CommandQueue.Add(new HistoryCommand(X, Y, ply)); e.Handled = true; } else { logEdit(1, Main.tile[X, Y], X, Y, 88, logName, new List<Vector2>(), style2); } return; } //KillDresser if (flag == 3 && Main.tile[X, Y].type == 88) { if (AwaitingHistory[e.Msg.whoAmI]) { AwaitingHistory[e.Msg.whoAmI] = false; ply.SendTileSquare(X, Y, 5); adjustFurniture(ref X, ref Y, ref style2); CommandQueue.Add(new HistoryCommand(X, Y, ply)); e.Handled = true; return; } adjustFurniture(ref X, ref Y, ref style2); Queue(logName, X, Y, 0, Main.tile[X, Y].type, style2, Main.tile[X, Y].color()); return; } } break; case PacketTypes.PaintTile: { int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); byte color = e.Msg.readBuffer[e.Index + 4]; string logName = TShock.Players[e.Msg.whoAmI].User == null ? "unregistered" : TShock.Players[e.Msg.whoAmI].User.Name; Queue(logName, X, Y, 25, color, 0, Main.tile[X, Y].color()); } break; case PacketTypes.PaintWall: { int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); byte color = e.Msg.readBuffer[e.Index + 4]; string logName = TShock.Players[e.Msg.whoAmI].User == null ? "unregistered" : TShock.Players[e.Msg.whoAmI].User.Name; Queue(logName, X, Y, 26, color, 0, Main.tile[X, Y].wallColor()); } break; case PacketTypes.SignNew: { ushort signI = BitConverter.ToUInt16(e.Msg.readBuffer, e.Index); int X = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); int Y = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); byte s = 0; adjustFurniture(ref X, ref Y, ref s); //Adjust coords so history picks it up, readSign() adjusts back to origin anyway string logName = TShock.Players[e.Msg.whoAmI].User == null ? "unregistered" : TShock.Players[e.Msg.whoAmI].User.Name; Queue(logName, X, Y, 27, data: signI, text: Main.sign[signI].text); } break; case PacketTypes.MassWireOperation: { int X1 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index); int Y1 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 2); int X2 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 4); int Y2 = BitConverter.ToInt16(e.Msg.readBuffer, e.Index + 6); byte toolMode = e.Msg.readBuffer[e.Index + 8]; //Modes Red=1, Green=2, Blue=4, Yellow=8, Actuator=16, Cutter=32 bool direction = Main.player[e.Msg.whoAmI].direction == 1; TSPlayer ply = TShock.Players[e.Msg.whoAmI]; string logName = ply.User == null ? "unregistered" : ply.User.Name; int minX = X1, maxX = X2, minY = Y1, maxY = Y2; int drawX = direction ? minX : maxX; int drawY = direction ? maxY : minY; if (X2 < X1) { minX = X2; maxX = X1; } if (Y2 < Y1) { minY = Y2; maxY = Y1; } int wires = 0, acts = 0; //We count our own wires since the client may only be able to place a few or even none. if ((toolMode & 32) == 0) countPlayerWires(Main.player[e.Msg.whoAmI], ref wires, ref acts); for (int starty = minY; starty <= maxY; starty++) { logAdvancedWire(drawX, starty, toolMode, logName, ref wires, ref acts); } for (int startx = minX; startx <= maxX; startx++) { if (startx == drawX) continue; logAdvancedWire(startx, drawY, toolMode, logName, ref wires, ref acts); } } break; } } }