private static void NetHooks_GetData(GetDataEventArgs e) { if (Main.netMode != 2 && e.MsgID == PacketTypes.ChatText && e.Length > 3) { byte playerID = e.Msg.readBuffer[e.Index]; Color color = new Color(e.Msg.readBuffer[e.Index + 1] << 16, e.Msg.readBuffer[e.Index + 2] << 8, e.Msg.readBuffer[e.Index + 3]); string message = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 4, e.Length - 5); OnChatReceived(playerID, color, message); } }
public static bool OnGetData(ref byte msgid, messageBuffer msg, ref int idx, ref int length) { if (GetData == null) return false; var args = new GetDataEventArgs() { MsgID = (PacketTypes)msgid, Msg = msg, Index = idx, Length = length }; GetData(args); msgid = (byte)args.MsgID; idx = args.Index; length = args.Length; return args.Handled; }
private static void NetHooks_GetData(GetDataEventArgs e) { if (Main.netMode != 2) { return; } if (e.MsgID == PacketTypes.ConnectRequest) { e.Handled = OnJoin(e.Msg.whoAmI); if (e.Handled) { Netplay.serverSock[e.Msg.whoAmI].kill = true; } } else if (e.MsgID == PacketTypes.ChatText) { string str = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 0x4, e.Length - 0x5); e.Handled = OnChat(e.Msg, e.Msg.whoAmI, str); } }
public static bool OnGetData(ref byte msgid, messageBuffer msg, ref int idx, ref int length) { if (GetData == null) { return(false); } var args = new GetDataEventArgs() { MsgID = (PacketTypes)msgid, Msg = msg, Index = idx, Length = length }; GetData(args); msgid = (byte)args.MsgID; idx = args.Index; length = args.Length; return(args.Handled); }
private void GetData(GetDataEventArgs e) { if (e.Handled) return; PacketTypes type = e.MsgID; var player = Players[e.Msg.whoAmI]; if (player == null) { e.Handled = true; return; } if (!player.ConnectionAlive) { e.Handled = true; return; } //if (type == PacketTypes.SyncPlayers) //Debug.WriteLine("Recv: {0:X} ({2}): {3} ({1:XX})", player.Index, (byte)type, player.TPlayer.dead ? "dead " : "alive", type.ToString()); // Stop accepting updates from player as this player is going to be kicked/banned during OnUpdate (different thread so can produce race conditions) if ((Config.BanKillTileAbusers || Config.KickKillTileAbusers) && player.TileThreshold >= Config.TileThreshold && !player.Group.HasPermission("ignoregriefdetection")) { Log.Debug("Rejecting " + type + " from " + player.Name + " as this player is about to be kicked"); e.Handled = true; } else { 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()); } } } }
void GetData(GetDataEventArgs e) { try { if (Main.netMode != 2) { return; } if (e.MsgID == 17) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { byte type = br.ReadByte(); int x = br.ReadInt32(); int y = br.ReadInt32(); byte typetile = br.ReadByte(); if (type == 0 || type == 1) if (ConfigurationManager.spawnProtect) if (!players[e.Msg.whoAmI].IsAdmin()) { var flag = CheckSpawn(x, y); if (flag) { Tools.SendMessage(e.Msg.whoAmI, "The spawn is protected!", new float[] { 255f, 0f, 0f }); e.Handled = true; } } if (type == 0 && BlacklistTiles[Main.tile[x, y].type] && Main.player[e.Msg.whoAmI].active) { players[e.Msg.whoAmI].tileThreshold++; players[e.Msg.whoAmI].tilesDestroyed.Add(new Position((float)x, (float)y), Main.tile[x, y]); } } return; } else if (e.MsgID == 0x1e) { byte id; bool pvp; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { id = br.ReadByte(); pvp = br.ReadBoolean(); } Main.player[e.Msg.whoAmI].hostile = pvp; if (id != e.Msg.whoAmI) Main.player[e.Msg.whoAmI].hostile = true; if (ConfigurationManager.permaPvp) Main.player[e.Msg.whoAmI].hostile = true; NetMessage.SendData(30, -1, -1, "", e.Msg.whoAmI); e.Handled = true; } else if (e.MsgID == 0x0A) //SendSection { Tools.Broadcast(string.Format("{0}({1}) attempted sending a section", Main.player[e.Msg.whoAmI].name, e.Msg.whoAmI)); Tools.Kick(e.Msg.whoAmI, "SendSection abuse."); e.Handled = true; } else if (e.MsgID == 0x17) //Npc Data { Tools.Broadcast(string.Format("{0}({1}) attempted spawning an NPC", Main.player[e.Msg.whoAmI].name, e.Msg.whoAmI)); Tools.Kick(e.Msg.whoAmI, "Spawn NPC abuse"); e.Handled = true; } else if (e.MsgID == 0x0D) //Update Player { byte plr = e.Msg.readBuffer[e.Index]; if (plr != e.Msg.whoAmI) { Tools.Kick(e.Msg.whoAmI, "Update Player abuse"); e.Handled = true; } } else if (e.MsgID == 0x10) { byte ply; Int16 life, maxLife; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { ply = br.ReadByte(); life = br.ReadInt16(); maxLife = br.ReadInt16(); } if (maxLife > Main.player[ply].statLifeMax + 20 || life > maxLife) if (players[ply].syncHP) { Tools.HandleCheater(ply); Log.Info(Tools.FindPlayer(ply) + " had increased max life by more than 20 or increased life more than max"); } else players[ply].syncHP = true; } else if (e.MsgID == 0x2a) { byte ply; Int16 mana, maxmana; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { ply = br.ReadByte(); mana = br.ReadInt16(); maxmana = br.ReadInt16(); } if (maxmana > Main.player[ply].statManaMax + 20 || mana > maxmana) if (players[ply].syncMP) { Tools.HandleCheater(ply); Log.Info(Tools.FindPlayer(ply) + " had increased max mana by more than 20 or increased mana more than max"); } else players[ply].syncMP = true; } else if (e.MsgID == 0x19) // Chat Text { byte ply; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { ply = br.ReadByte(); } if (e.Msg.whoAmI != ply) { //f**k you f****t Log.Info(Tools.FindPlayer(e.Msg.whoAmI) + " was kicked for trying to fake chat as someone else."); Tools.HandleCheater(ply); } } else if (e.MsgID == 0x1B) // New Projectile { Int16 ident; float posx; float posy; float velx; float vely; float knockback; Int16 dmg; byte owner; byte type; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { ident = br.ReadInt16(); posx = br.ReadSingle(); posy = br.ReadSingle(); velx = br.ReadSingle(); vely = br.ReadSingle(); knockback = br.ReadSingle(); dmg = br.ReadInt16(); owner = br.ReadByte(); type = br.ReadByte(); } if (type == 29 || type == 28) { if (!players[e.Msg.whoAmI].IsAdmin()) { if (ConfigurationManager.kickBoom || ConfigurationManager.banBoom) { int i = e.Msg.whoAmI; if (ConfigurationManager.banBoom) FileTools.WriteGrief((int)i); Tools.Kick((int)i, "Explosives was thrown."); Tools.Broadcast(Main.player[i].name + " was " + (ConfigurationManager.banBoom ? "banned" : "kicked") + " for throwing an explosive device."); e.Handled = true; } } } } else if (e.MsgID == 0x2C) // KillMe { byte id; byte hitdirection; short dmg; bool pvp; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { id = br.ReadByte(); hitdirection = br.ReadByte(); dmg = br.ReadInt16(); pvp = br.ReadBoolean(); } if (id != e.Msg.whoAmI) { Tools.HandleGriefer(e.Msg.whoAmI); Log.Info(Tools.FindPlayer(e.Msg.whoAmI) + " was kicked for trying to execute KillMe on someone else."); e.Handled = true; } } else if (e.MsgID == 0x30) { int x; int y; byte liquid; bool lava; using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { x = br.ReadInt32(); y = br.ReadInt32(); liquid = br.ReadByte(); lava = br.ReadBoolean(); } if (ConfigurationManager.spawnProtect) if (!players[e.Msg.whoAmI].IsAdmin()) { var flag = CheckSpawn(x, y); if (flag) { Tools.SendMessage(e.Msg.whoAmI, "The spawn is protected!", new float[] { 255f, 0f, 0f }); e.Handled = true; } } } else if (e.MsgID == 0x22) // Client only KillTile e.Handled = true; // Client only uses it for chests, but sends regular 17 as well. } catch (Exception ex) { FileTools.WriteError(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 bool HandleGetData(GetDataEventArgs e) { if (!Netplay.serverSock[e.Msg.whoAmI].active || Netplay.serverSock[e.Msg.whoAmI].kill) return true; if (e.MsgID == 4) { var ban = Bans.GetBanByName(Main.player[e.Msg.whoAmI].name); if (ban != null) { Tools.ForceKick(e.Msg.whoAmI, "You are banned: " + ban.Reason); return true; } string name = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 23, (e.Length - (e.Index + 23)) + e.Index - 1); if (name.Length > 32) { Tools.ForceKick(e.Msg.whoAmI, "Name exceeded 32 characters."); return true; } if (players[e.Msg.whoAmI] == null) { Tools.ForceKick(e.Msg.whoAmI, "Player doesn't exist"); return true; } else if (players[e.Msg.whoAmI].receivedInfo) { return Tools.HandleGriefer(e.Msg.whoAmI, "Sent client info more than once"); } else { players[e.Msg.whoAmI].receivedInfo = true; } } else if (e.MsgID == 0x14) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { short size = br.ReadInt16(); int x = br.ReadInt32(); int y = br.ReadInt32(); int plyX = Math.Abs((int)Main.player[e.Msg.whoAmI].position.X / 16); int plyY = Math.Abs((int)Main.player[e.Msg.whoAmI].position.Y / 16); int tileX = Math.Abs(x); int tileY = Math.Abs(y); if (size > 5 || Math.Abs(plyX - tileX) > 10 || Math.Abs(plyY - tileY) > 10) { return Tools.HandleGriefer(e.Msg.whoAmI, "Send Tile Square Abuse"); } } } else if (e.MsgID == 17) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { byte type = br.ReadByte(); int x = br.ReadInt32(); int y = br.ReadInt32(); byte typetile = br.ReadByte(); if (type == 1 || type == 3) { int plyX = Math.Abs((int)Main.player[e.Msg.whoAmI].position.X / 16); int plyY = Math.Abs((int)Main.player[e.Msg.whoAmI].position.Y / 16); int tileX = Math.Abs(x); int tileY = Math.Abs(y); if ((Math.Abs(plyX - tileX) > 6) || (Math.Abs(plyY - tileY) > 6)) { return Tools.HandleGriefer(e.Msg.whoAmI, "Placing impossible to place blocks."); } } if (type == 0 || type == 1) { if (ConfigurationManager.spawnProtect) { if (!players[e.Msg.whoAmI].group.HasPermission("editspawn")) { var flag = CheckSpawn(x, y); if (flag) { Tools.SendMessage(e.Msg.whoAmI, "Spawn protected from changes.", new[] { 255f, 0f, 0f }); return true; } } } } if (type == 0 && BlacklistTiles[Main.tile[x, y].type] && Main.player[e.Msg.whoAmI].active) { players[e.Msg.whoAmI].tileThreshold++; players[e.Msg.whoAmI].tilesDestroyed.Add(new Position(x, y), Main.tile[x, y]); } } } else if (e.MsgID == 0x1e) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { int id = br.ReadByte(); bool pvp = br.ReadBoolean(); Main.player[e.Msg.whoAmI].hostile = pvp; if (id != e.Msg.whoAmI) Main.player[e.Msg.whoAmI].hostile = true; if (ConfigurationManager.permaPvp) Main.player[e.Msg.whoAmI].hostile = true; NetMessage.SendData(30, -1, -1, "", e.Msg.whoAmI); return true; } } else if (e.MsgID == 0x0A) //SendSection { return Tools.HandleGriefer(e.Msg.whoAmI, "SendSection abuse."); } else if (e.MsgID == 0x17) //Npc Data { return Tools.HandleGriefer(e.Msg.whoAmI, "Spawn NPC abuse"); } else if (e.MsgID == 0x0D) //Update Player { byte plr = e.Msg.readBuffer[e.Index]; if (plr != e.Msg.whoAmI) { return Tools.HandleGriefer(e.Msg.whoAmI, "Update Player abuse"); } } else if (e.MsgID == 0x10) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { byte ply = br.ReadByte(); short life = br.ReadInt16(); short maxLife = br.ReadInt16(); if (maxLife > Main.player[ply].statLifeMax + 20 || life > maxLife) { if (players[ply].syncHP) { return Tools.HandleCheater(ply, "Abnormal life increase"); } else { players[ply].syncHP = true; } } } } else if (e.MsgID == 0x2a) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { byte ply = br.ReadByte(); short mana = br.ReadInt16(); short maxmana = br.ReadInt16(); if (maxmana > Main.player[ply].statManaMax + 20 || mana > maxmana) { if (players[ply].syncMP) { return Tools.HandleCheater(ply, "Abnormal mana increase"); } else { players[ply].syncMP = true; } } } } else if (e.MsgID == 0x1B) // New Projectile { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { short ident = br.ReadInt16(); float posx = br.ReadSingle(); float posy = br.ReadSingle(); float velx = br.ReadSingle(); float vely = br.ReadSingle(); float knockback = br.ReadSingle(); short dmg = br.ReadInt16(); byte owner = br.ReadByte(); byte type = br.ReadByte(); if (type == 29 || type == 28 || type == 30) { return Tools.HandleExplosivesUser(e.Msg.whoAmI, "Throwing an explosive device."); } } } else if (e.MsgID == 0x2C) // KillMe { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { byte id = br.ReadByte(); byte hitdirection = br.ReadByte(); short dmg = br.ReadInt16(); bool pvp = br.ReadBoolean(); if (id != e.Msg.whoAmI) { return Tools.HandleGriefer(e.Msg.whoAmI, "Trying to execute KillMe on someone else."); } } } else if (e.MsgID == 0x1a) //PlayerDamage { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { byte playerid = br.ReadByte(); byte direction = br.ReadByte(); Int16 damage = br.ReadInt16(); byte pvp = br.ReadByte(); if (!Main.player[playerid].hostile) return true; } } else if (e.MsgID == 0x30) { using (var br = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) { int x = br.ReadInt32(); int y = br.ReadInt32(); byte liquid = br.ReadByte(); bool lava = br.ReadBoolean(); //The liquid was picked up. if (liquid == 0) return false; int plyX = Math.Abs((int)Main.player[e.Msg.whoAmI].position.X / 16); int plyY = Math.Abs((int)Main.player[e.Msg.whoAmI].position.Y / 16); int tileX = Math.Abs(x); int tileY = Math.Abs(y); int lavacount = 0; int watercount = 0; for (int i = 0; i < 44; i++) { if (Main.player[e.Msg.whoAmI].inventory[i].name == "Lava Bucket") lavacount++; else if (Main.player[e.Msg.whoAmI].inventory[i].name == "Water Bucket") watercount++; } if (lava && lavacount <= 0) { return Tools.HandleGriefer(e.Msg.whoAmI, "Placing lava they didn't have."); ; } else if (!lava && watercount <= 0) { return Tools.HandleGriefer(e.Msg.whoAmI, "Placing water they didn't have."); } if ((Math.Abs(plyX - tileX) > 6) || (Math.Abs(plyY - tileY) > 6)) { return Tools.HandleGriefer(e.Msg.whoAmI, "Placing impossible to place liquid."); ; } if (ConfigurationManager.spawnProtect) { if (!players[e.Msg.whoAmI].group.HasPermission("editspawn")) { var flag = CheckSpawn(x, y); if (flag) { Tools.SendMessage(e.Msg.whoAmI, "The spawn is protected!", new[] { 255f, 0f, 0f }); return true; } } } } } else if (e.MsgID == 0x22) // Client only KillTile { return true; // Client only uses it for chests, but sends regular 17 as well. } return false; }
private void GetData(GetDataEventArgs e) { e.Handled = e.Handled || HandleGetData(e); }
private static void NetHooks_GetData(GetDataEventArgs e) { if (Main.netMode != 2) return; if (e.MsgID == PacketTypes.ConnectRequest) { e.Handled = OnJoin(e.Msg.whoAmI); if (e.Handled) Netplay.serverSock[e.Msg.whoAmI].kill = true; } else if (e.MsgID == PacketTypes.ChatText) { string str = Encoding.ASCII.GetString(e.Msg.readBuffer, e.Index + 0x4, e.Length - 0x5); e.Handled = OnChat(e.Msg, e.Msg.whoAmI, str); } }