static void OnChatPacket(object p, PacketEventArgs e) { try { Client c = (Client)e.lnk.AttachedObject; switch (e.pak.ContainerID) { case SEND_MESSAGE.ContID: Debug.WriteLine("Server> SEND_MESSAGE Packet"); if (SendM3.UnpackContainer(e.pak, OPTIONS.Chat)) { SendM3.UserID = c.ID; Client.BCastContainer(SendM3, SEND_MESSAGE.ContID); } else { Console.WriteLine("Chat error > packet decode error > " + c.Username + " > " + e.pak.link.IPv4Address); e.pak.link.Dispose(); } break; } } catch (Exception ex) { Console.WriteLine("Chat error > " + ex.ToString() + " > " + e.pak.link.IPv4Address); e.pak.link.Dispose(); } }
void OnPacketReceived(object sender, PacketEventArgs e) { var packet = (MessagePacket)e.Packet; var player = (Player)e.User["player"]; var text = string.Format("{0}: {1}", player.Name, packet.Content); Console.WriteLine(text); _service.SendAll(new MessagePacket { Content = text }); }
private void PacketHandler_Animation(object sender, PacketEventArgs<AnimationPacket> e) { foreach (Client c in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z)) { if (c == this) continue; c.PacketHandler.SendPacket(new AnimationPacket { Animation = e.Packet.Animation, PlayerId = this.EntityId }); } }
private static void OnChatPaket(object sender, PacketEventArgs e) { switch (e.pak.ContainerID) { case SEND_MESSAGE.ContID: Debug.WriteLine("SEND_MESSAGE Packet"); if (SendM1.UnpackContainer(e.pak, OPTIONS.Chat)) { Message msg = new Message(); msg.command = 10; // message msg.UserID = SendM1.UserID; msg.Messagedata = SendM1.Message; msg.Username = msg.UserID.ToString(); try { msg.Username = ClientArray[msg.UserID].Username; } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } IncommingChat.Enqueue(msg); } break; case SEND_USER.ContID: Debug.WriteLine("SEND_USER Packet"); if (SendU1.UnpackContainer(e.pak, OPTIONS.Chat)) { int statID = SendU1.StatusID; if (statID == STATUS.USER_NEW) { uint ID = SendU1.UserID; string Username = SendU1.Username; Client c = new Client(); c.Username = Username; c.ID = ID; ClientArray[ID] = c; Message msg = new Message(); msg.command = 11; // new msg.cli = c; msg.UserID = SendU1.UserID; msg.Username = SendU1.Username; msg.Messagedata = "new client '" + c.Username + "' connected."; IncommingChat.Enqueue(msg); Debug.WriteLine("New User: "******" ID: " + c.ID); } if (statID == STATUS.USER_DISCONNECT) { uint ID = SendU1.UserID; try { Client c = ClientArray[ID]; Message msg = new Message(); msg.command = 12; // Delete msg.Messagedata = "Client '" + c.Username + "' disconnected."; msg.cli = c; IncommingChat.Enqueue(msg); } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } } } break; } }
private void PacketHandler_PlayerItemPlacement(object sender, PacketEventArgs<PlayerBlockPlacementPacket> e) { // if(!Permissions.CanPlayerBuild(Username)) return; if (Inventory.Slots[Inventory.ActiveSlot].Type <= 255) return; int x = e.Packet.X; int y = e.Packet.Y; int z = e.Packet.Z; BlockData.Blocks adjacentBlockType = (BlockData.Blocks)World.GetBlockId(x, y, z); // Get block being built against. // Placed Item Info int px, py, pz; short pType = Inventory.Slots[Inventory.ActiveSlot].Type; short pMetaData = Inventory.Slots[Inventory.ActiveSlot].Durability; World.FromFace(x, y, z, e.Packet.Face, out px, out py, out pz); switch (e.Packet.Face) { case BlockFace.Held: return; // TODO: Process buckets, food, etc. } switch (adjacentBlockType) { case BlockData.Blocks.Air: case BlockData.Blocks.Water: case BlockData.Blocks.Lava: case BlockData.Blocks.Still_Water: case BlockData.Blocks.Still_Lava: return; } switch ((BlockData.Items)pType) { case BlockData.Items.Diamond_Hoe: case BlockData.Items.Gold_Hoe: case BlockData.Items.Iron_Hoe: case BlockData.Items.Stone_Hoe: case BlockData.Items.Wooden_Hoe: if (adjacentBlockType == BlockData.Blocks.Dirt || adjacentBlockType == BlockData.Blocks.Grass) { // Think the client has a Notch bug where hoe's durability is not updated properly. px = x; py = y; pz = z; World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Soil, 0x00); } break; case BlockData.Items.Sign: if (e.Packet.Face == BlockFace.Up) // Floor Sign { // Get the direction the player is facing. switch (FacingDirection(8)) { case "N": pMetaData = (byte)MetaData.SignPost.North; break; case "NE": pMetaData = (byte)MetaData.SignPost.Northeast; break; case "E": pMetaData = (byte)MetaData.SignPost.East; break; case "SE": pMetaData = (byte)MetaData.SignPost.Southeast; break; case "S": pMetaData = (byte)MetaData.SignPost.South; break; case "SW": pMetaData = (byte)MetaData.SignPost.Southwest; break; case "W": pMetaData = (byte)MetaData.SignPost.West; break; case "NW": pMetaData = (byte)MetaData.SignPost.Northwest; break; default: return; } World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Sign_Post, (byte)pMetaData); } else // Wall Sign { switch (e.Packet.Face) { case BlockFace.East: pMetaData = (byte)MetaData.SignWall.East; break; case BlockFace.West: pMetaData = (byte)MetaData.SignWall.West; break; case BlockFace.North: pMetaData = (byte)MetaData.SignWall.North; break; case BlockFace.South: pMetaData = (byte)MetaData.SignWall.South; break; case BlockFace.Down: return; } World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Wall_Sign, (byte)pMetaData); } break; case BlockData.Items.Seeds: if (adjacentBlockType == BlockData.Blocks.Soil && e.Packet.Face == BlockFace.Down) { World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Crops, 0x00); } break; case BlockData.Items.Redstone: World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Redstone_Wire, 0x00); break; case BlockData.Items.Minecart: case BlockData.Items.Boat: case BlockData.Items.Storage_Minecart: case BlockData.Items.Powered_Minecart: // TODO: Create new object break; case BlockData.Items.Iron_Door: case BlockData.Items.Wooden_Door: { if (!BlockData.Air.Contains((BlockData.Blocks)World.GetBlockId(px, py + 1, pz))) return; switch (FacingDirection(4)) // Built on floor, set by facing dir { case "N": pMetaData = (byte)MetaData.Door.Northwest; break; case "W": pMetaData = (byte)MetaData.Door.Southwest; break; case "S": pMetaData = (byte)MetaData.Door.Southeast; break; case "E": pMetaData = (byte)MetaData.Door.Northeast; break; default: return; } if ((BlockData.Items)pType == BlockData.Items.Iron_Door) { World.SetBlockAndData(px, py + 1, pz, (byte)BlockData.Blocks.Iron_Door, (byte)MetaData.Door.IsTopHalf); World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Iron_Door, (byte)pMetaData); } else { World.SetBlockAndData(px, py + 1, pz, (byte)BlockData.Blocks.Wooden_Door, (byte)MetaData.Door.IsTopHalf); World.SetBlockAndData(px, py, pz, (byte)BlockData.Blocks.Wooden_Door, (byte)pMetaData); } World.Update(px, py + 1, pz); } break; } if (!Inventory.DamageItem(Inventory.ActiveSlot)) // If item isn't durable, remove it. Inventory.RemoveItem(Inventory.ActiveSlot); World.Update(px, py, pz); }
void OnOutgoingData(Player p, PacketEventArgs e) { if (e.Type == Packet.Types.MOTD) { string ip; if (Server.DebugMode) { ip = "127.0.0.1"; } else { ip = InetUtils.GrabWebpage("http://www.mcforge.net/serverdata/ip.php"); } Packet pa = new Packet(); pa.Add(Packet.Types.MOTD); pa.Add((byte)7); pa.Add(ServerSettings.GetSetting("ServerName"), 64); pa.Add(ServerSettings.GetSetting("MOTD") + " &0cfg=" + ip + ":" + ServerSettings.GetSetting("Port") + "/" + p.Level.Name, 64); pa.Add((byte)0); e.Data = pa.bytes; } //Because this is way more fun and requires no edits to the core ~Gamemakergm else if (e.Type == Packet.Types.Message) { if (PluginSettings.GetSettingBoolean("joinleave-alert")) { string incoming = Encoding.ASCII.GetString(e.Data).Trim(); //Logger.Log(incoming); if (incoming.Contains("joined the game!")) { e.Cancel(); WOM.GlobalSendJoin(incoming.Substring(1, incoming.Length - incoming.IndexOf("joined the game!"))); } else if (incoming.Contains("has disconnected")) { e.Cancel(); WOM.GlobalSendLeave(incoming.Substring(1, incoming.Length - incoming.IndexOf("has disconnected"))); } } } else { return; } }
private void Client_ReceivedTcp(object sender, PacketEventArgs e) { string message = Encoding.ASCII.GetString(e.Data); if (message.StartsWith("%d")) { //Draw message = message.Replace("%d", ""); string[] split = message.Split('_'); string[] sP1 = split[0].Split(','); string[] sP2 = split[1].Split(','); string[] sColor = split[2].Split(','); Point p1 = new Point(Int32.Parse(sP1[0]), Int32.Parse(sP1[1])); Point p2 = new Point(Int32.Parse(sP2[0]), Int32.Parse(sP2[1])); byte R = Byte.Parse(sColor[0]); byte G = Byte.Parse(sColor[1]); byte B = Byte.Parse(sColor[2]); Canvas.DoDraw(p1, p2, Color.FromArgb(255, R, G, B)); } else if (message.StartsWith("%m")) { //Message message = message.Replace("%m", ""); //WriteLine(message); } else if (message.StartsWith("%r")) { //Resize message = message.Replace("%r", ""); string[] split = message.Split(','); Canvas.ResizePanel(Int32.Parse(split[0]), Int32.Parse(split[1])); } else if (message.StartsWith("%c")) { //Clear Canvas.Clear(Color.White); } }
protected virtual void ClientPacketReceived(object sender, PacketEventArgs e) { if (!(sender is ISocket socket)) { return; } Stats.PacketsReceived++; Stats.AddInput(e.Transferred); if (e.Packet.Id == (byte)AresId.MSG_CHAT_CLIENT_LOGIN) { IClient user = Users.Find(s => s.Socket == socket); if (user == null) { if (HandlePending(socket)) { if (idpool.Count == 0) { socket.SendAsync(new Announce(Errors.RoomFull)); socket.Disconnect(); Logging.Info( "AresServer", "Chatroom has reached capacity ({0}). If this happens frequently consider raising Max Clients", Config.MaxClients ); } else { int id = idpool.Pop(); var client = new AresClient(this, socket, (ushort)id); if (IPAddress.IsLoopback(client.ExternalIp) || client.ExternalIp.Equals(ExternalIp) || LocalAddresses.Contains(client.ExternalIp) || (Config.LocalAreaIsHost && client.ExternalIp.IsLocalAreaNetwork())) { client.LocalHost = true; } lock (Users) { Users.Add(client); Users.Sort(sorter); Stats.PeakUsers = Math.Max(Users.Count, Stats.PeakUsers); } client.HandleJoin(e); } } } else { //sending too many login packets SendAnnounce(user, Errors.LoginFlood); Logging.Info("AresServer", "User '{0}' has been disconnected for login flooding.", user.Name); user.Disconnect(); } } }
private void Server_ReceivedTcp(object sender, PacketEventArgs e) { string message = Encoding.ASCII.GetString(e.Data); if (message.StartsWith("%d")) { //Draw SendToAll(e.Data, false); } else if (message.StartsWith("%m")) { //Message message = message.Replace("%m", ""); SendToAll(Encoding.ASCII.GetBytes("%m" + e.Client.IP + ": " + message), true); } else if (message.StartsWith("%c")) { message = message.Replace("%c", ""); WriteLine(e.Client.IP + ": has requested a clear."); ClearCount++; if (ClearCount >= 10) { SendToAll(Encoding.ASCII.GetBytes("%c"), false); WriteLine("Cleared Canvas"); ClearCount = 0; } } else if (message.StartsWith("%r")) { message = message.Replace("%r", ""); string[] split = message.Split(','); CanvasSize.X = Int32.Parse(split[0]); CanvasSize.Y = Int32.Parse(split[1]); SendToAll(Encoding.ASCII.GetBytes("%r" + CanvasSize.X + "," + CanvasSize.Y), false); } textConsole.SelectionStart = textConsole.Text.Length; textConsole.ScrollToCaret(); }
private void Builder_OnCompletedPacket(object sender, PacketEventArgs e) { Log.Logger.Information("{name} Received a completed packet of {count} bytes", deviceName, e.Bytes.Length); }
private void PacketHandler_WindowClick(object sender, PacketEventArgs<WindowClickPacket> e) { Interface iface = CurrentInterface ?? Inventory; iface.OnClicked(e.Packet); }
private void PacketReceived(object sender, PacketEventArgs e) { //check bans, then floods, a flood will cause a ban if (CheckBanned(e.RemoteEndPoint.Address) || !CheckFloodCounter(e.RemoteEndPoint.Address)) { return; } switch ((UdpId)e.Packet.Id) { case UdpId.OP_SERVERLIST_ACKINFO: { AckInfo info = (AckInfo)e.Packet; AckInfoHits++; // sent to client from server... // add channel list support for server? ParseServers(info.Servers); } break; case UdpId.OP_SERVERLIST_ADDIPS: { AddIps add = (AddIps)e.Packet; ServerRecord server = null; lock (servers) { server = (ServerRecord)servers.Find((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address)); if (server != null) { server.Port = add.Port; } else { server = new ServerRecord(e.RemoteEndPoint.Address, add.Port); servers.Add(server); } } uint num = 6; ParseServers(add.Servers); socket.SendAsync(new AckIps() { Port = server.Port, Servers = GetSendServers(server.ExternalIp, ref num), }, e.RemoteEndPoint); } break; case UdpId.OP_SERVERLIST_ACKIPS: { AckIps ips = (AckIps)e.Packet; ServerRecord server = null; AckIpHits++; lock (servers) server = (ServerRecord)servers.Find((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address)); if (server != null) { server.Port = ips.Port; server.AckReceived(); } ParseServers(ips.Servers); } break; case UdpId.OP_SERVERLIST_CHECKFIREWALLBUSY: { CheckFirewallBusy busy = (CheckFirewallBusy)e.Packet; lock (myfirewalltests) myfirewalltests.RemoveAll((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address)); ParseServers(busy.Servers); } break; case UdpId.OP_SERVERLIST_PROCEEDCHECKFIREWALL: { CheckFirewall check = (CheckFirewall)e.Packet; FirewallTest test = null; lock (firewalltests) test = firewalltests.Find(s => s.GetHashCode() == check.Cookie); if (test != null) { test.RemoteEndPoint.Port = check.Port; test.Begin(); } } break; case UdpId.OP_SERVERLIST_READYTOCHECKFIREWALL: { CheckFirewallReady reader = (CheckFirewallReady)e.Packet; if (!reader.Target.IsLocal()) { ((AresServer)server).ExternalIp = reader.Target; socket.SendAsync(new CheckFirewall() { Port = (ushort)socket.LocalEndPoint.Port, Cookie = reader.Cookie, }, e.RemoteEndPoint); } } break; case UdpId.OP_SERVERLIST_WANTCHECKFIREWALL: { CheckFirewallWanted want = (CheckFirewallWanted)e.Packet; CheckFirewallHits++; if (firewalltests.Count < 5) { FirewallTest test = new FirewallTest(e.RemoteEndPoint.Address, want.Port); lock (firewalltests) firewalltests.Add(test); socket.SendAsync( new CheckFirewallReady((uint)test.GetHashCode(), e.RemoteEndPoint.Address), e.RemoteEndPoint); } else { uint num = 6; socket.SendAsync(new CheckFirewallBusy() { Port = (ushort)socket.LocalEndPoint.Port, Servers = GetSendServers(e.RemoteEndPoint.Address, ref num) }, e.RemoteEndPoint); } } break; case UdpId.OP_SERVERLIST_SENDINFO: { SendInfo sendInfo = (SendInfo)e.Packet; SendInfoHits++; AckInfo ackinfo = new AckInfo() { Language = server.Config.Language, Name = server.Config.Name, Topic = server.Config.Topic, Version = Strings.VersionLogin, Port = (ushort)socket.LocalEndPoint.Port, //Users = (ushort)server.Users.Count, Users = (ushort)Math.Max(server.Users.Count, (server.Users.Count + new Random().Next(15, 20))), }; uint num = 6; ackinfo.Servers = GetSendServers(e.RemoteEndPoint.Address, ref num); ackinfo.ServersLen = (byte)num; socket.SendAsync(ackinfo, e.RemoteEndPoint); } break; case UdpId.OP_SERVERLIST_SENDNODES: { uint num = 20; SendNodes sendnodes = (SendNodes)e.Packet; AckNodes acknodes = new AckNodes() { Port = server.Config.Port, Nodes = GetSendServers(e.RemoteEndPoint.Address, ref num) }; socket.SendAsync(acknodes, e.RemoteEndPoint); } break; case UdpId.OP_SERVERLIST_ACKNODES: { AckNodes ackNodes = (AckNodes)e.Packet; ParseServers(ackNodes.Nodes); } break; } }
private static void Client_PacketReceived(object sender, PacketEventArgs e) { Console.WriteLine($"{e.Packet} - {e.Packet.GetContent()}"); }
/// <summary> /// Packets handled in this function are 'internal' cannot be overriden. /// </summary> internal bool HandlePacket(PacketEventArgs e) { if (IsCaptcha) { switch ((AresId)e.Packet.Id) { case AresId.MSG_CHAT_CLIENT_FASTPING: fastping = true; break; case AresId.MSG_CHAT_CLIENT_AUTOLOGIN: AutoLogin login = (AutoLogin)e.Packet; Commands.HandleAutoLogin(server, this, login.Sha1Password); break; case AresId.MSG_CHAT_CLIENT_PUBLIC: ClientPublic pub = (ClientPublic)e.Packet; FinishCaptcha(pub.Message); break; case AresId.MSG_CHAT_CLIENT_EMOTE: ClientEmote emote = (ClientEmote)e.Packet; FinishCaptcha(emote.Message); break; case AresId.MSG_CHAT_CLIENT_ADDSHARE: SharedFile addfile = (SharedFile)e.Packet; if (server.PluginManager.OnFileReceived(this, addfile)) { lock (files) files.Add(addfile); } break; case AresId.MSG_CHAT_CLIENT_UPDATE_STATUS: ClientUpdate update = (ClientUpdate)e.Packet; lastupdate = TimeBank.CurrentTime; NodeIp = update.NodeIp; NodePort = update.NodePort; Age = (update.Age != 0) ? update.Age : Age; Gender = (update.Gender != 0) ? update.Gender : Gender; Country = (update.Country != 0) ? update.Country : Country; Region = !String.IsNullOrEmpty(update.Region) ? update.Region : Region; break; } return(true); //don't handle any other packets yet } else if (LoggedIn) { switch ((AresId)e.Packet.Id) { case AresId.MSG_CHAT_CLIENT_FASTPING: fastping = true; return(true); case AresId.MSG_CHAT_CLIENT_DUMMY: return(true); case AresId.MSG_CHAT_CLIENT_PUBLIC: ClientPublic pub = (ClientPublic)e.Packet; if (!String.IsNullOrEmpty(pub.Message)) { if (pub.Message.StartsWith("#") && Commands.HandlePreCommand(server, this, pub.Message.Substring(1))) { return(true); } } if (Muzzled) { server.SendAnnounce(this, Strings.AreMuzzled); return(true); } return(false); case AresId.MSG_CHAT_CLIENT_EMOTE: ClientEmote emote = (ClientEmote)e.Packet; if (!String.IsNullOrEmpty(emote.Message)) { if (emote.Message.StartsWith("#") && Commands.HandlePreCommand(server, this, emote.Message.Substring(1))) { return(true); } } if (Muzzled) { server.SendAnnounce(this, Strings.AreMuzzled); return(true); } return(false); case AresId.MSG_CHAT_CLIENT_COMMAND: Command cmd = (Command)e.Packet; Commands.HandlePreCommand(server, this, cmd.Message); break; case AresId.MSG_CHAT_CLIENT_PVT: Private pvt = (Private)e.Packet; if (Muzzled && !server.Config.MuzzledPMs) { pvt.Message = "[" + Strings.AreMuzzled + "]"; server.SendPacket(this, pvt); return(true); } return(false); case AresId.MSG_CHAT_CLIENT_AUTHREGISTER: { AuthRegister reg = (AuthRegister)e.Packet; Commands.HandleRegister(server, this, reg.Password); } return(true); case AresId.MSG_CHAT_CLIENT_AUTHLOGIN: { AuthLogin login = (AuthLogin)e.Packet; Commands.HandleLogin(server, this, login.Password); } return(true); case AresId.MSG_CHAT_CLIENT_AUTOLOGIN: { AutoLogin login = (AutoLogin)e.Packet; Commands.HandleAutoLogin(server, this, login.Sha1Password); } return(true); case AresId.MSG_CHAT_CLIENT_ADDSHARE: SharedFile addfile = (SharedFile)e.Packet; if (server.PluginManager.OnFileReceived(this, addfile)) { lock (files) files.Add(addfile); } return(true); case AresId.MSG_CHAT_CLIENT_IGNORELIST: Ignored ignore = (Ignored)e.Packet; if (ignore.Ignore) { lock (ignored) { if (!ignored.Contains(ignore.Username)) { ignored.Add(ignore.Username); server.SendAnnounce(this, String.Format(Strings.Ignored, ignore.Username)); } } } else { lock (ignored) { if (ignored.Contains(ignore.Username)) { ignored.Remove(ignore.Username); server.SendAnnounce(this, String.Format(Strings.Unignored, ignore.Username)); } } } return(true); case AresId.MSG_CHAT_CLIENT_UPDATE_STATUS: ClientUpdate update = (ClientUpdate)e.Packet; lastupdate = TimeBank.CurrentTime; NodeIp = update.NodeIp; NodePort = update.NodePort; Age = (update.Age != 0) ? update.Age : Age; Gender = (update.Gender != 0) ? update.Gender : Gender; Country = (update.Country != 0) ? update.Country : Country; Region = !String.IsNullOrEmpty(update.Region) ? update.Region : Region; server.SendPacket((s) => s.Vroom == Vroom, new ServerUpdate(this)); return(true); case AresId.MSG_CHAT_CLIENT_DIRCHATPUSH: ClientDirectPush push = (ClientDirectPush)e.Packet; if (Encoding.UTF8.GetByteCount(push.Username) < 2) { server.SendPacket(this, new DirectPushError(4)); return(true); } if (push.TextSync.Length < 16) { server.SendPacket(this, new DirectPushError(3)); return(true); } IClient target = server.FindUser(s => s.Name == push.Username); if (target == null) { server.SendPacket(this, new DirectPushError(1)); return(true); } if (target.Ignored.Contains(Name)) { server.SendPacket(this, new DirectPushError(2)); return(true); } server.SendPacket(this, new DirectPushError(0)); server.SendPacket(target, new ServerDirectPush(this, push)); return(true); case AresId.MSG_CHAT_CLIENT_BROWSE: Browse browse = (Browse)e.Packet; browse.Type = (byte)((browse.Type == 0) ? (byte)255 : browse.Type); browse.Type = (byte)((browse.Type == 8) ? (byte)0 : browse.Type); IClient browse_target = server.FindUser(s => s.Vroom == Vroom && s.Name == browse.Username); if (browse_target == null) { return(true); } else if (browse_target.Files.Count == 0) { server.SendPacket(this, new BrowseError(browse.BrowseId)); } else { server.SendPacket(this, new BrowseStart(browse.BrowseId, (ushort)browse_target.Files.Count)); foreach (var file in browse_target.Files) { if (browse.Type == 255 || browse.Type == file.Type) { server.SendPacket(this, new BrowseItem(browse.BrowseId, file)); } } server.SendPacket(this, new BrowseEnd(browse.BrowseId)); } return(true); case AresId.MSG_CHAT_CLIENT_SEARCH: Search search = (Search)e.Packet; search.Type = (byte)((search.Type == 0) ? (byte)255 : search.Type); search.Type = (byte)((search.Type == 8) ? (byte)0 : search.Type); foreach (var user in server.Users) { if (user != this && user.Vroom == Vroom) { foreach (var file in user.Files) { if (file.SearchWords.ContainsAny(search.SearchWords.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries))) { server.SendPacket(this, new SearchHit(search.SearchId, user, file)); } } } } server.SendPacket(this, new SearchEnd(search.SearchId)); return(true); } return(false);//wasn't handled } else { return(true);//not captcha, not logged, error } }
/// <summary> /// Packets handled in this function could possibly be overriden by a plugin /// </summary> internal void HandleOverridePacket(PacketEventArgs e) { switch ((AresId)e.Packet.Id) { case AresId.MSG_CHAT_CLIENT_PUBLIC: ClientPublic pub = (ClientPublic)e.Packet; if (!String.IsNullOrEmpty(pub.Message)) { server.SendPacket((s) => s.Vroom == Vroom && !s.Ignored.Contains(Name), new ServerPublic(Name, pub.Message)); } break; case AresId.MSG_CHAT_CLIENT_EMOTE: ClientEmote emote = (ClientEmote)e.Packet; if (!String.IsNullOrEmpty(emote.Message)) { server.SendPacket((s) => s.Vroom == Vroom && !s.Ignored.Contains(Name), new ServerEmote(Name, emote.Message)); } break; case AresId.MSG_CHAT_CLIENT_PVT: { Private priv = (Private)e.Packet; if (String.IsNullOrEmpty(priv.Message)) { return; } IClient target = server.FindUser((s) => s.Name == priv.Username); if (target != null) { if (target.Ignored.Contains(Name)) { server.SendPacket(this, new IgnoringYou(priv.Username)); } else { priv.Username = Name; server.SendPacket(target, priv); } } else { server.SendPacket(this, new Offline(priv.Username)); } } break; case AresId.MSG_CHAT_CLIENT_COMMAND: //Command cmd = (Command)e.Packet; //Not necessary to handle this here anymore break; case AresId.MSG_CHAT_CLIENT_PERSONAL_MESSAGE: ClientPersonal personal = (ClientPersonal)e.Packet; Message = personal.Message; break; case AresId.MSG_CHAT_CLIENT_AVATAR: ClientAvatar avatar = (ClientAvatar)e.Packet; if (Avatar.Equals(avatar)) { break; } if (avatar.AvatarBytes.Length == 0) { Avatar = AresAvatar.Null; } else { Avatar = new AresAvatar(avatar.AvatarBytes); if (OrgAvatar == null) { OrgAvatar = new AresAvatar(avatar.AvatarBytes); } } break; case AresId.MSG_CHAT_CLIENT_CUSTOM_DATA: { ClientCustom custom = (ClientCustom)e.Packet; string username = custom.Username; custom.Username = Name; IClient target = server.FindUser((s) => s.Name == username); if (target != null && !target.Ignored.Contains(Name)) { server.SendPacket(target, custom); } } break; case AresId.MSG_CHAT_CLIENT_CUSTOM_DATA_ALL: ClientCustomAll customAll = (ClientCustomAll)e.Packet; server.SendPacket((s) => s != this && s.Vroom == Vroom, new ClientCustom(Name, customAll)); break; } }
void IOLoop() { byte[] loginPacket = CreateLoginPacket(migratedUsername ?? _username, _ver); ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { if (EndPoint.Port > IPEndPoint.MaxPort || EndPoint.Port < IPEndPoint.MinPort) { throw new SocketException(-1); } //Do not continue if the user attempts to connect on a port larger than possible. ServerSocket.Connect(EndPoint); ServerSocket.Send(loginPacket); } catch (SocketException ex) { Log(LogType.Error, HandleSocketError(ex.ErrorCode), ex.ToString()); return; } BinaryReader reader = new BinaryReader(new NetworkStream(ServerSocket)); while (true) { try { byte OpCode = reader.ReadByte(); PacketEventArgs opcodeEvent = new PacketEventArgs((ServerPackets)OpCode); Events.RaisePacketReceived(opcodeEvent); switch ((ServerPackets)OpCode) { case ServerPackets.ServerIdentification: //0x00 { ProtocolVersion = reader.ReadByte(); // Protocol version should be seven. string Name = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim(); string MOTD = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim(); if (!serverLoaded) { ServerName = Name; ServerMOTD = MOTD; serverLoaded = true; } UserType = reader.ReadByte(); //Get the type. 0x64 = Op, 0x00 = Normal user. } break; case ServerPackets.Ping: //0x01 break; // Server only requires we read the packet ID. case ServerPackets.LevelInitialize: //0x02 Players.Clear(); if (_savemap) { mapStream = new MemoryStream(); } CanReconnectAfterKick = true; break; case ServerPackets.LevelDataChunk: //0x03 { int chunkLength = IPAddress.HostToNetworkOrder(reader.ReadInt16()); // Length of non padded data. byte[] chunkData = reader.ReadBytes(1024); // May be padded with extra data. byte progress = reader.ReadByte(); if (_savemap) { mapStream.Write(chunkData, 0, chunkLength); } MapProgressEventArgs e = new MapProgressEventArgs(progress); Events.RaiseMapProgress(e); } break; case ServerPackets.LevelFinalize: //0x04: { MapSizeX = IPAddress.HostToNetworkOrder(reader.ReadInt16()); MapSizeZ = IPAddress.HostToNetworkOrder(reader.ReadInt16()); MapSizeY = IPAddress.HostToNetworkOrder(reader.ReadInt16()); Connected = true; //At this state, we've loaded the map and we're ready to send chat etc. if (_savemap) { Log(LogType.BotActivity, "Beginning to save map.."); mapStream.Seek(0, SeekOrigin.Begin); Map map = new Map(MapSizeX, MapSizeY, MapSizeZ); using (GZipStream decompressed = new GZipStream(mapStream, CompressionMode.Decompress)) { decompressed.Read(new byte[4], 0, 4); //Ignore size of stream. int sizeX = MapSizeX, sizeY = MapSizeY, sizeZ = MapSizeZ; for (int z = 0; z < sizeZ; z++) { for (int y = 0; y < sizeY; y++) { for (int x = 0; x < sizeX; x++) { byte next = (byte)decompressed.ReadByte(); map.SetBlock(x, y, z, next); } } } } mapStream.Dispose(); map.Save("map_" + DateTime.Now.ToString("ddHHmmssfffffff")); //Formatting for DateTime. map.Dispose(); Log(LogType.BotActivity, "Saved map"); } MapLoadedEventArgs e = new MapLoadedEventArgs(); Events.RaiseMapLoaded(e); } break; case ServerPackets.SetBlock: //0x06: { int blockX = IPAddress.HostToNetworkOrder(reader.ReadInt16()); int blockZ = IPAddress.HostToNetworkOrder(reader.ReadInt16()); int blockY = IPAddress.HostToNetworkOrder(reader.ReadInt16()); byte blockType = reader.ReadByte(); BlockPlacedEventArgs e = new BlockPlacedEventArgs(blockX, blockY, blockZ, blockType); Events.RaiseBlockPlaced(e); if (marksLeft > 0 && blockType == 39 && CubID != null) { byte id = CubID.Value; if (Players[id].X < 0 || Players[id].Y < 0 || Players[id].Z < 0) { SendMessagePacket("Error: You are too far away from the bot."); break; } if (new Vector3I(blockX, blockY, blockZ).DistanceTo(new Vector3I( (int)Players[id].X, (int)Players[id].Y, (int)Players[id].Z)) > 11) { break; //Another player probably tried placing a block somewhere else. } marks[marks.Length - marksLeft] = new Vector3I(blockX, blockY, blockZ); marksLeft--; //Go from smallest to largest. if (marksLeft == 0 && QueuedDrawer != null) { Draw(QueuedDrawer, marks, cuboidType); } } } break; case ServerPackets.SpawnPlayer: //0x07: { byte pID = reader.ReadByte(); string playername = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim(); Players[pID] = new Player(); Players[pID].Name = playername; Players[pID].X = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f; Players[pID].Z = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f; Players[pID].Y = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f; Players[pID].Yaw = reader.ReadByte(); Players[pID].Pitch = reader.ReadByte(); PositionEventArgs e = new PositionEventArgs(pID, Players[pID]); Events.RaisePlayerMoved(e); } break; case ServerPackets.PlayerTeleport: //0x08 { byte pID = reader.ReadByte(); Players[pID].X = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f; Players[pID].Z = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f; Players[pID].Y = IPAddress.HostToNetworkOrder(reader.ReadInt16()) / 32f; Players[pID].Yaw = reader.ReadByte(); Players[pID].Pitch = reader.ReadByte(); PositionEventArgs e = new PositionEventArgs(pID, Players[pID]); Events.RaisePlayerMoved(e); } break; case ServerPackets.PositionandOrientationUpdate: //0x09 { byte pID = reader.ReadByte(); Players[pID].X += reader.ReadSByte() / 32f; Players[pID].Z += reader.ReadSByte() / 32f; Players[pID].Y += reader.ReadSByte() / 32f; Players[pID].Yaw = reader.ReadByte(); Players[pID].Pitch = reader.ReadByte(); PositionEventArgs e = new PositionEventArgs(pID, Players[pID]); Events.RaisePlayerMoved(e); } break; case ServerPackets.PositionUpdate: //0x0a { byte pID = reader.ReadByte(); Players[pID].X += (reader.ReadSByte() / 32f); Players[pID].Z += (reader.ReadSByte() / 32f); Players[pID].Y += (reader.ReadSByte() / 32f); PositionEventArgs e = new PositionEventArgs(pID, Players[pID]); Events.RaisePlayerMoved(e); } break; case ServerPackets.OrientationUpdate: //0x0b { byte pID = reader.ReadByte(); Players[pID].Yaw = reader.ReadByte(); Players[pID].Pitch = reader.ReadByte(); PositionEventArgs e = new PositionEventArgs(pID, Players[pID]); Events.RaisePlayerMoved(e); } break; case ServerPackets.DespawnPlayer: //0x0c { byte playerID = reader.ReadByte(); Players.Remove(playerID); // Also sent when the player joins another map. } break; case ServerPackets.Message: //0x0d { reader.ReadByte(); // Most servers don't send the ID. string Line = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim(); MessageEventArgs e = new MessageEventArgs(Line); //Raise the event, let the event handler take care of splitting. Events.RaiseChatMessage(e); Log(LogType.Chat, Line); if (Line.Contains(_delimiter.ToString())) //Most servers use : as the delimiter. { string[] lineSplit = Line.Split(new char[] { _delimiter }, 2); string Message = Extensions.StripColors(lineSplit[1]).TrimStart(' '); string User = Extensions.StripColors(lineSplit[0]); if (!IgnoredUserList.Contains(User)) { string strippedcommandheader = Message.Split(' ')[0].ToLower(); foreach (KeyValuePair <string, CommandDelegate> command in RegisteredCommands) { if (strippedcommandheader == "." + command.Key.ToLower()) { if (_requiresop) { if (Users.Contains(User)) { EnqueueCommand(command.Value, Line); break; } else { SendMessagePacket(User + ", you are not allowed to use the bot."); } } else { EnqueueCommand(command.Value, Line); break; } } } } } ProcessCommandQueue(); } break; case ServerPackets.DisconnectSelf: //0x0e { string reason = Encoding.ASCII.GetString(reader.ReadBytes(64)).Trim(); KickedEventArgs e = new KickedEventArgs(reason, CanReconnectAfterKick); Events.RaiseGotKicked(e); if (_reconnectonkick == true && CanReconnectAfterKick == true) { Log(LogType.BotActivity, "Kicked from the server. Reconnecting.", reason); CanReconnectAfterKick = false; Thread thread = new Thread(IOLoop); thread.Name = "LibClassicBotIO"; thread.IsBackground = true; thread.Start(); } else if (_reconnectonkick == false) { Log(LogType.Warning, "Kicked from the server. Not attempting to reconnect.", reason); } else { ServerSocket.Close(); Log(LogType.Error, "The bot was prevented from reconnecting.", "(Kick packet received before a LevelBegin packet.)"); } return; } case ServerPackets.SetPermission: //0x0f UserType = reader.ReadByte(); //Issued in Vanilla when someone calls /op, used in fCraft for bedrock permission checking. break; default: throw new IOException("Unrecognised packet. Opcode: " + OpCode.ToString()); } } catch (IOException ex) { if (_reconnectonkick == true && CanReconnectAfterKick == true) { CancelDrawer(); CanReconnectAfterKick = false; Thread thread = new Thread(IOLoop); thread.Name = "LibClassicBotIO"; thread.IsBackground = true; thread.Start(); } else { Log(LogType.Error, "An I/O error has occured. The connection have been closed uncleanly. Exiting the bot.", ex.ToString()); } return; } } }
private void PacketHandler_PlayerRotation(object sender, PacketEventArgs<PlayerRotationPacket> e) { this.OnGround = e.Packet.OnGround; this.RotateTo(e.Packet.Yaw, e.Packet.Pitch); this.UpdateEntities(); }
public void AddPacketToListView(PacketEntry item, bool silent = false) { if (item.Direction == "S") { item.Name = _db.GetServerZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber)); item.Comment = _db.GetServerZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber)); } else { item.Name = _db.GetClientZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber)); item.Comment = _db.GetClientZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber)); } item.Category = item.Set.ToString(); if (item.Message == "0142" || item.Message == "0143" || item.Message == "0144") { int cat = BitConverter.ToUInt16(item.Data, 0x20); item.ActorControl = cat; item.Name = _db.GetActorControlTypeName(cat); } if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked) { try { PacketEventArgs args = null; var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { var structProvider = new Struct(); var structEntries = structProvider.Parse(structText, item.Data); args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.ScriptDebugView); } } else { args = new PacketEventArgs(item, null, _mainWindow.ScriptDebugView); } Scripting_RunOnPacket(args); } catch (Exception exc) { new ExtendedErrorView( $"Scripting exception thrown for {item.Message} - {item.Name}. Turning off auto script running.", exc.ToString(), "Error").ShowDialog(); _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false; return; } } if (_mainWindow.ExEnabledCheckbox.IsChecked && item.Direction == "S") { try { var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { switch (item.Name) { case "NpcSpawn": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.Comment = $"Name: {_mainWindow.ExdProvider.GetBnpcName((int)obj.bNPCName)}({obj.bNPCName})"; } break; case "ActorCast": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}"; } break; } if (item.Name.Contains("ActorControl")) { switch (item.ActorControl) { case 3: //CastStart { var ctrl = Util.FastParseActorControl(item.Data); item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; case 17: //ActionStart { var ctrl = Util.FastParseActorControl(item.Data); item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; } } } } } catch (Exception exc) { new ExtendedErrorView( $"EXD Error for {item.Message} - {item.Name}. Turning off EXD features.", exc.ToString(), "Error").ShowDialog(); _mainWindow.ExEnabledCheckbox.IsChecked = false; } } PacketListView.Items.Add(item); if (!silent) { UpdateInfoLabel(); } }
private void PacketHandler_UseEntity(object sender, PacketEventArgs<UseEntityPacket> e) { //Console.WriteLine(e.Packet.Target); //this.SendMessage("You are interacting with " + e.Packet.Target + " " + e.Packet.LeftClick); foreach (EntityBase eb in Server.GetNearbyEntities(World, Position.X, Position.Y, Position.Z)) { if (eb.EntityId != e.Packet.Target) continue; if (eb is Client) { Client c = (Client)eb; if (e.Packet.LeftClick) { if (c.Health > 0) c.DamageClient(this); } else { // TODO: Store the object being ridden, so we can update player movement. // This will ride the entity, sends -1 to dismount. foreach (Client cl in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z)) { cl.PacketHandler.SendPacket(new AttachEntityPacket { EntityId = this.EntityId, VehicleId = c.EntityId }); } } } else if (eb is Mob) { Mob m = (Mob)eb; if (e.Packet.LeftClick) { if (m.Health > 0) m.DamageMob(this); } else { // TODO: Check Entity has saddle set. // This will ride the entity, sends -1 to dismount. foreach (Client c in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z)) { c.PacketHandler.SendPacket(new AttachEntityPacket { EntityId = this.EntityId, VehicleId = c.EntityId }); } } } /*else { this.SendMessage(e.Packet.Target + " has no interaction handler!"); }*/ } }
static void OnSystemPacket(object p, PacketEventArgs e) { //Debug.WriteLine("Event called!"); switch (testmode) { case 2: //unpack the packet, true if the decode was successful if (con3.UnpackContainer(e.pak)) { if (watch.IsRunning == false) { watch.Start(); } if (con3.ID == 100) { Console.WriteLine("Recived " + con3.ID); } if (con3.ID == 250) { Console.WriteLine("Recived " + con3.ID); } if (con3.ID == 500) { Console.WriteLine("Recived " + con3.ID); } if (con3.ID == 750) { Console.WriteLine("Recived " + con3.ID); } if (con3.ID == 1000) { watch.Stop(); Console.WriteLine("Recived " + con3.ID); Console.WriteLine("Time taken: {0} Milliseconds", watch.ElapsedMilliseconds.ToString()); Console.WriteLine("Transferred: {0} Mbytes", (con3.by.Length * 1000.0) / 1024.0 / 1024.0); Console.WriteLine("Mirror Transfer rate: {0} Mbytes/second", (1000.0 / (int)watch.ElapsedMilliseconds) * ((con3.by.Length * 1000.0) / 1024.0 / 1024.0)); Console.WriteLine("start ping test..."); con3.ID = 0; watch.Reset(); testmode = 3; e.portal.SendContainer(test1, con3, 1, 1); //Portal.Finialize(); watch.Start(); } } break; case 3: watch.Stop(); Console.WriteLine("responsetime is: {0} ElapsedMilliseconds", watch.ElapsedMilliseconds.ToString()); Console.WriteLine("responsetime is: {0} ElapsedTicks", watch.ElapsedTicks.ToString()); Console.WriteLine("{0} TicksPerMillisecond", TimeSpan.TicksPerMillisecond.ToString()); Console.WriteLine("Try to close the connection..."); testmode = 4; break; } }
internal void ProcessPacket(object p, PacketEventArgs e) { _lnk1 = e.lnk; IncomingPacket(p, e); _lnk1 = null; }
private void OnLogginAnnounce(object sender, PacketEventArgs args) { var loggin = args.Packet as LogginAnnounceC03; MD5Hash.SetHash(loggin.LoginBytes, loggin.Hash); }
public void AddJob(int workerPoolIndex, PacketEventArgs item) { container[workerPoolIndex].Add(item); }
private void Parser_PacketCreated(object sender, PacketEventArgs e) { ParsePacket(e.Packet); }
public void HandleKeepAlive(object sender, PacketEventArgs e) { System.Timers.Timer t = new System.Timers.Timer(5000); t.Elapsed += this.SendKeepAlive; t.Enabled = true; }
private void ContainerReceive(object sender, PacketEventArgs e) { Entered = true; }
public override void SendPacket(Packet pa) { PacketEventArgs args = new PacketEventArgs(pa.bytes, false, (Packet.Types)pa.bytes[0]); bool Canceled = OnPlayerSendPacket.Call(this, args, OnAllPlayersSendPacket).Canceled; if (pa.bytes != args.Data) pa.bytes = args.Data; if (!Canceled) { try { lastPacket = (Packet.Types)pa.bytes[0]; } catch (Exception e) { Logger.LogError(e); } for (int i = 0; i < 3; i++) { try { lastPacket = (Packet.Types)pa.bytes[0]; } catch (Exception e) { Logger.LogError(e); } for (int z = 0; z < 3; z++) { try { Socket.BeginSend(pa.bytes, 0, pa.bytes.Length, SocketFlags.None, delegate(IAsyncResult result) { }, null); return; } catch { continue; } } CloseConnection(); } } }
private void SelectRoleReceive(object sender, PacketEventArgs e) { var selectRole = e.Read <SelectRole>(); RoleId = selectRole.RoleId.Value; }
private void OnSilverUpdate(object sender, PacketEventArgs e) { CurrentSilver = (e.Packet as SilverInfoSFD).SilverCount; }
private void PacketHandler_PlayerDigging(object sender, PacketEventArgs<PlayerDiggingPacket> e) { int x = e.Packet.X; int y = e.Packet.Y; int z = e.Packet.Z; byte type = World.GetBlockId(x, y, z); byte data = World.GetBlockData(x, y, z); switch (e.Packet.Action) { case DigAction.StartDigging: if (BlockData.SingleHit.Contains((BlockData.Blocks)type)) goto case DigAction.FinishDigging; break; case DigAction.FinishDigging: short give = type; sbyte count = 1; short durability = data; switch ((BlockData.Blocks)type) { case BlockData.Blocks.Adminium: return; case BlockData.Blocks.Air: return; case BlockData.Blocks.Bed: give = (short)BlockData.Items.Bed; break; case BlockData.Blocks.Burning_Furnace: give = (short)BlockData.Blocks.Furnace; break; case BlockData.Blocks.Cake: give = (short)BlockData.Items.Cake; break; case BlockData.Blocks.Clay: give = (short)BlockData.Items.Clay_Balls; break; case BlockData.Blocks.Coal_Ore: give = (short)BlockData.Items.Coal; break; case BlockData.Blocks.Crops: // TODO: Check crops are mature enough before giving items. give = (short)BlockData.Items.Seeds; count = 2; break; case BlockData.Blocks.Diamond_Ore: give = (short)BlockData.Items.Diamond; break; case BlockData.Blocks.Double_Stone_Slab: give = (short)BlockData.Blocks.Stair; break; case BlockData.Blocks.Fire: return; case BlockData.Blocks.Glass: give = -1; break; case BlockData.Blocks.Glowstone: give = (short)BlockData.Items.Lightstone_Dust; break; case BlockData.Blocks.Grass: case BlockData.Blocks.Soil: give = (short)BlockData.Blocks.Dirt; break; case BlockData.Blocks.Gravel: if (Server.Rand.Next(10) == 0) Server.DropItem(World, x, y, z, new ItemStack((short)BlockData.Items.Flint)); break; case BlockData.Blocks.Ice: if (BlockData.Air.Contains((BlockData.Blocks)World.GetBlockId(x, y - 1, z))) { World.SetBlockAndData(x, y, z, 0, 0); return; } World.SetBlockAndData(x, y, z, (byte)BlockData.Blocks.Still_Water, 0); return; case BlockData.Blocks.Lapis_Lazuli_Ore: give = (short)BlockData.Items.Ink_Sack; durability = 4; count = (sbyte)(3 + Server.Rand.Next(17)); break; case BlockData.Blocks.Lava: return; case BlockData.Blocks.Leaves: give = Server.Rand.Next(5) == 0 ? (short)BlockData.Blocks.Sapling : (short)-1; break; case BlockData.Blocks.Portal: case BlockData.Blocks.Mob_Spawner: give = -1; break; case BlockData.Blocks.Redstone_Ore: give = (short)BlockData.Items.Redstone; count = (sbyte)(2 + Server.Rand.Next(4)); break; case BlockData.Blocks.Redstone_Repeater: case BlockData.Blocks.Redstone_Repeater_On: give = (short)BlockData.Items.Redstone_Repeater; break; case BlockData.Blocks.Redstone_Torch_On: give = (short)BlockData.Blocks.Redstone_Torch; break; case BlockData.Blocks.Redstone_Wire: give = (short)BlockData.Items.Redstone; break; case BlockData.Blocks.Sign_Post: give = (short)BlockData.Items.Sign; break; case BlockData.Blocks.Snow: give = (short)BlockData.Items.Snowball; break; case BlockData.Blocks.Snow_Block: give = (short)BlockData.Items.Snowball; count = 3; break; case BlockData.Blocks.Stationary_Lava: case BlockData.Blocks.Stationary_Water: return; case BlockData.Blocks.Stone: give = (short)BlockData.Blocks.Cobblestone; break; case BlockData.Blocks.TNT: // TODO: Spawn TNT Object and start explosion timer. return; case BlockData.Blocks.Wall_Sign: give = (short)BlockData.Items.Sign; break; case BlockData.Blocks.Water: return; } World.SetBlockAndData(x, y, z, 0, 0); World.Update(x, y, z); Inventory.DamageItem(Inventory.ActiveSlot); if (give > 0) Server.DropItem(World, x, y, z, new ItemStack(give, count, durability)); break; } }
private void NullHandler(object sender, PacketEventArgs e) { //Just ignore these requests... return; }
private void PacketHandler_PlayerPositionRotation(object sender, PacketEventArgs<PlayerPositionRotationPacket> e) { this.OnGround = e.Packet.OnGround; this.Stance = e.Packet.Stance; this.MoveTo(e.Packet.X, e.Packet.Y, e.Packet.Z, e.Packet.Yaw, e.Packet.Pitch); }
private void OnPacketReceived(PacketEventArgs e) { PacketReceived?.Invoke(this, e); }
private void PacketHandler_UseBed(object sender, PacketEventArgs<UseBedPacket> e) { throw new NotImplementedException(); }
private void PacketHandler_ChatMessage(object sender, PacketEventArgs<ChatMessagePacket> e) { string clean = Chat.CleanMessage(e.Packet.Message); if (clean.StartsWith("/")) ExecuteCommand(clean.Substring(1)); else ExecuteChat(clean); }
private void PacketHander_Respawn(object sender, PacketEventArgs<RespawnPacket> e) { HandleRespawn(); }
static void OnLoginPacket(object p, PacketEventArgs e) { Debug.WriteLine("SEND_LOGIN Packet"); //unpack the packet, true if the decode was successful if (SEND_LOGIN.ContID == e.pak.ContainerID && SendL3.UnpackContainer(e.pak, OPTIONS.Login)) { Client c = (Client)e.lnk.AttachedObject; if (c.Username == "NONE" && SendL3.Username != "NONE" && SendL3.Username.Length > 2 && SendL3.Username.Length < 25) { c.Username = SendL3.Username; //Send ID & OK OPTIONS.Login.SendContainer(c.lnk, null, STATUS.LOGIN_OK, c.ID); //send new client all existing clients foreach (Client c2 in Client.ClientList) { if (c != c2) { SendU3.StatusID = STATUS.USER_NEW; SendU3.UserID = c2.ID; SendU3.Username = c2.Username; OPTIONS.Chat.SendContainer(c.lnk, SendU3, SEND_USER.ContID, c2.ID); } } //BCast new client SendU3.StatusID = STATUS.USER_NEW; SendU3.UserID = c.ID; SendU3.Username = c.Username; Client.BCastContainer(SendU3, SEND_USER.ContID); } else { Console.WriteLine("Login error > Username invalid " + e.pak.link.IPv4Address); e.pak.link.Dispose(); } } else { Console.WriteLine("Login error > Disconnecting " + e.pak.link.IPv4Address); e.pak.link.Dispose(); } }
void OnIncomingData(Player p, PacketEventArgs args) { if (args.Data.Length < 0) { return; } if (args.Data[0] != (byte)'G') { return; } args.Cancel(); var netStream = p.Client.GetStream(); using (var Writer = new StreamWriter(netStream)) { var line = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[0]; var match = Parser.Match(line); if (match.Success) { var lvl = Level.FindLevel(match.Groups[1].Value); var versionLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[2]; var userNameLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[3]; var version = versionLine.Remove(0, "X-WoM-Version: ".Length).Replace("\r", ""); var username = userNameLine.Remove(0, "X-WoM-Username: "******"\r", ""); Thread.Sleep(1500); //Trying to find player before it loads so wait. var player = Player.Find(username); if (player != null) { player.ExtraData.ChangeOrCreate <object, object>("UsingWoM", true); if (!String.IsNullOrWhiteSpace(version)) { player.ExtraData.ChangeOrCreate <object, object>("WoMVersion", version); if (PluginSettings.GetSettingBoolean("notify-ops") == true) { Player.UniversalChatOps(username + " joined using " + version); Logger.Log(username + " joined using " + version); } } } if (lvl == null) { Writer.Write("HTTP/1.1 404 Not Found"); Writer.Flush(); } else { if (!lvl.ExtraData.ContainsKey("WoMConfig")) { Writer.Write("HTTP/1.1 500 Internal Server Error"); Writer.Flush(); } else { var config = (string[])lvl.ExtraData["WoMConfig"]; var bytes = Encoding.UTF8.GetBytes(config.ToString <string>()); Writer.WriteLine("HTTP/1.1 200 OK"); Writer.WriteLine("Date: " + DateTime.UtcNow.ToString("R")); Writer.WriteLine("Server: Apache/2.2.21 (CentOS)"); Writer.WriteLine("Last-Modified: " + DateTime.UtcNow.ToString("R")); Writer.WriteLine("Accept-Ranges: bytes"); Writer.WriteLine("Content-Length: " + bytes.Length); Writer.WriteLine("Connection: close"); Writer.WriteLine("Content-Type: text/plain"); Writer.WriteLine(); foreach (var entry in config) { Writer.WriteLine(entry); } } CFGSettings a = (CFGSettings)CFGDict.GetIfExist <Level, CFGSettings>(p.Level); WOM.SendDetail(player, a.GetSetting("detail.user")); //Send the detail with parsed variables. } } else { Writer.Write("HTTP/1.1 400 Bad Request"); Writer.Flush(); } } }
public void AddPacketToListView(PacketListItem item) { if (item.DirectionCol == "S") { item.NameCol = _db.GetServerZoneOpName(int.Parse(item.MessageCol, NumberStyles.HexNumber)); item.CommentCol = _db.GetServerZoneOpComment(int.Parse(item.MessageCol, NumberStyles.HexNumber)); } else { item.NameCol = _db.GetClientZoneOpName(int.Parse(item.MessageCol, NumberStyles.HexNumber)); item.CommentCol = _db.GetClientZoneOpComment(int.Parse(item.MessageCol, NumberStyles.HexNumber)); } item.CategoryCol = item.Set.ToString(); if (item.MessageCol == "0142" || item.MessageCol == "0143" || item.MessageCol == "0144") { int cat = BitConverter.ToUInt16(item.Data, 0x20); item.ActorControl = cat; item.NameCol = _db.GetActorControlTypeName(cat); } if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked) { try { PacketEventArgs args = null; var structText = _db.GetServerZoneStruct(int.Parse(item.MessageCol, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { var structProvider = new Struct(); var structEntries = structProvider.Parse(structText, item.Data); args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.ScriptDebugView); } } else { args = new PacketEventArgs(item, null, _mainWindow.ScriptDebugView); } Scripting_RunOnPacket(args); } catch (Exception exc) { MessageBox.Show( $"[XivMonTab] Script error!\n\n{exc}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false; return; } } if (_mainWindow.ExEnabledCheckbox.IsChecked && item.DirectionCol == "S") { try { var structText = _db.GetServerZoneStruct(int.Parse(item.MessageCol, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { switch (item.NameCol) { case "NpcSpawn": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.CommentCol = $"Name: {_mainWindow.ExdProvider.GetBnpcName((int)obj.bNPCName)}({obj.bNPCName})"; } break; case "ActorCast": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.CommentCol = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}"; } break; } if (item.NameCol.Contains("ActorControl")) { switch (item.ActorControl) { case 3: //CastStart { var ctrl = Util.FastParseActorControl(item.Data); item.CommentCol = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; case 17: //ActionStart { var ctrl = Util.FastParseActorControl(item.Data); item.CommentCol = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; } } } } } catch (Exception exc) { MessageBox.Show( $"[XivMonTab] EXD error for {item.MessageCol} - {item.NameCol}!\n\n{exc}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); _mainWindow.ExEnabledCheckbox.IsChecked = false; } } PacketListView.Items.Add(item); UpdateInfoLabel(); }
public void parsePacket(object sender, EventArgs e) { PacketEventArgs ev = (PacketEventArgs)e; switch (version) { case OpCodeVersion.P2805: switch ((OpCode2805)ev.packet.opCode) { case OpCode2805.S_LOGIN: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); var pl = login(p); if (onLogin != null) { onLogin(this, new PlayerEventArgs(pl)); } } break; case OpCode2805.S_SPAWN_USER: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); var pl = spawnPlayer(p); if (onSpawnPlayer != null) { onSpawnPlayer(this, new PlayerEventArgs(pl)); } } break; case OpCode2805.S_DESPAWN_USER: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); var pl = deSpawnPlayer(p); if (onDeSpawnPlayer != null) { onDeSpawnPlayer(this, new PlayerEventArgs(pl)); } } break; case OpCode2805.S_SPAWN_PROJECTILE: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); spawnProjectile(p); } break; case OpCode2805.S_DESPAWN_PROJECTILE: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); deSpawnProjectile(p); } break; case OpCode2805.S_EACH_SKILL_RESULT: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); var el = damage(p); if (el != null) { if (onDamage != null) { onDamage(this, el); } } } break; case OpCode2805.S_USER_STATUS: { TeraPacketParser p = TeraPacketCreator.create(ev.packet); var pl = userStatusChange(p); if (pl != null) { if (pl.inBattle) { if (onBattleStart != null) { onBattleStart(this, new PlayerEventArgs(pl)); } } else { if (onBattleEnd != null) { onBattleEnd(this, new PlayerEventArgs(pl)); } } } } break; case OpCode2805.S_CLEAR_ALL_HOLDED_ABNORMALITY: clearAllAbnormality(); if (onClearAbnormality != null) { onClearAbnormality(this, EventArgs.Empty); } break; } break; } }
private void HandleUdpPacket(PacketEventArgs e) { if (CheckBanned(e.RemoteEndPoint.Address)) { return; } switch ((AresUdpId)e.Packet.Id) { case AresUdpId.OP_SERVERLIST_ACKINFO: { AckInfo info = (AckInfo)e.Packet; AckInfoHits++; lastackinfo = DateTime.Now; AresChannel channel = FindChannel(e.RemoteEndPoint.Address, info.Port); if (channel == null) { channel = FindLocalChannel(e.RemoteEndPoint.Address); } if (channel == null) { return; } channel.Port = info.Port; channel.Users = info.Users; channel.Name = info.Name; channel.Topic = info.Topic; channel.Language = info.Language; channel.Version = info.Version; ParseServers(info.Servers); } break; case AresUdpId.OP_SERVERLIST_ADDIPS: { AddIps add = (AddIps)e.Packet; AddIpHits++; AresChannel channel = FindChannel(e.RemoteEndPoint.Address, add.Port); if (channel != null) { channel.Port = add.Port; } else { var address = e.RemoteEndPoint.Address; if (e.RemoteEndPoint.Address.IsLocalAreaNetwork()) { address = ExternalIp ?? address; } channel = new AresChannel(address, add.Port); Channels.Add(channel); } uint num = 6; ParseServers(add.Servers); socket.SendAsync(new AckIps() { Port = channel.Port, Servers = GetSendServers(server.ExternalIp, ref num), }, e.RemoteEndPoint); } break; case AresUdpId.OP_SERVERLIST_ACKIPS: { AckIps ips = (AckIps)e.Packet; AckIpHits++; AresChannel channel = FindChannel(e.RemoteEndPoint.Address, ips.Port); if (channel != null) { channel.Port = ips.Port; channel.AckCount++; channel.TryCount = 0; channel.LastAcked = DateTime.Now; } ParseServers(ips.Servers); } break; case AresUdpId.OP_SERVERLIST_CHECKFIREWALLBUSY: { CheckFirewallBusy busy = (CheckFirewallBusy)e.Packet; lock (myfirewalltests) myfirewalltests.RemoveAll((s) => s.ExternalIp.Equals(e.RemoteEndPoint.Address)); ParseServers(busy.Servers); } break; case AresUdpId.OP_SERVERLIST_PROCEEDCHECKFIREWALL: { CheckFirewall check = (CheckFirewall)e.Packet; FirewallTest test = null; lock (firewalltests) test = firewalltests.Find(s => s.GetHashCode() == check.Token); if (test != null) { test.RemoteEndPoint.Port = check.Port; test.Begin(); } } break; case AresUdpId.OP_SERVERLIST_READYTOCHECKFIREWALL: { CheckFirewallReady ready = (CheckFirewallReady)e.Packet; if (!ready.Target.IsLocalAreaNetwork()) { ExternalIp = ready.Target; //Console.Write() socket.SendAsync(new CheckFirewall() { Port = (ushort)socket.LocalEndPoint.Port, Token = ready.Token, }, e.RemoteEndPoint); } } break; case AresUdpId.OP_SERVERLIST_WANTCHECKFIREWALL: { CheckFirewallWanted want = (CheckFirewallWanted)e.Packet; CheckFirewallHits++; if (firewalltests.Count < 5) { FirewallTest test = new FirewallTest(e.RemoteEndPoint.Address, want.Port); lock (firewalltests) firewalltests.Add(test); socket.SendAsync( new CheckFirewallReady((uint)test.GetHashCode(), e.RemoteEndPoint.Address), e.RemoteEndPoint); } else { uint num = 6; socket.SendAsync(new CheckFirewallBusy() { Port = (ushort)socket.LocalEndPoint.Port, Servers = GetSendServers(e.RemoteEndPoint.Address, ref num) }, e.RemoteEndPoint); } } break; case AresUdpId.OP_SERVERLIST_SENDINFO: { SendInfo sendInfo = (SendInfo)e.Packet; SendInfoHits++; if (Listing && Server != null) { AckInfo ackinfo = new AckInfo() { Language = Server.Config.Language, Name = Server.Config.Name, Topic = Server.Config.Topic, Version = Strings.VersionChannels, Port = (ushort)socket.LocalEndPoint.Port, Users = (ushort)(Server.Users.Count + 1), }; uint num = 6; ackinfo.Servers = GetSendServers(e.RemoteEndPoint.Address, ref num); ackinfo.ServersLen = (byte)num; socket.SendAsync(ackinfo, e.RemoteEndPoint); } } break; } }
/// <summary> /// Adds a Packet to the PacketToSendEvent. /// </summary> /// <param name="sender">original sender of the packet (mostly "this")</param> public void addPacketEvent(object sender, PacketEventArgs e) { PacketToSendEvent(sender, e); }
static void client_PacketReceived(object sender, PacketEventArgs e) { var packet = e.Packet; Console.WriteLine(packet.GetString()); }
public void AddJob(PacketEventArgs item) { int randomGet = rnd.Next(0, container.Count); container[randomGet].Add(item); }
private void OnUserLogin(object sender, PacketEventArgs e) { if (Enabled && !e.Handled) { var arg = e.Packet.Arg; var id = e.Packet.Id; int userId = arg.userId; int localsid = arg.localsid; int blkickuser = arg.blkickuser; byte[] loginip = arg.loginip; byte[] account = arg.account; int zoneId = Zone.ZoneId; dynamic res = new DynamicStructure(); try { res.retcode = 0; res.remainplaytime = 0; res.func = 0; res.funcparm = 0; res.blisgm = 0; res.freetimeleft = 0; res.freetimeend = 0; res.creatime = 0; res.adduppoint = 0; res.soldpoint = 0; int overwrite = blkickuser; Session.Database.RecordOnline(userId, Zone.Aid, ref zoneId, ref localsid, ref overwrite); if (zoneId != Zone.ZoneId || (blkickuser == 0 && localsid != arg.localsid)) { Log.Warn("(zoneId != Zone.ZoneId || localsid != arg.localsid <=> {0} != {1} || {2} != {3}", zoneId, Zone.ZoneId, localsid, (int)arg.localsid); res.retcode = 10; } else { DateTime creatime = Session.Database.Query("acquireUserCreatime.byUid", userId).First().CreaTime; Log.Trace("OnUserLogin login={0}, uid={1}, ip={2}", Encoding.ASCII.GetString(account), userId, Ext.GetIp(loginip)); res.creatime = Ext.ToUnixTime(creatime); } } catch (Exception ex) { Log.Error(ex); res.retcode = 0xff; /* * if ((arrayOfObject[0] != null) && (arrayOfObject[1] != null) && (arrayOfObject[2] != null) && ((((Integer)arrayOfObject[0]).intValue() != i) || (((Integer)arrayOfObject[1]).intValue() != localUserLoginArg.localsid))) * if (((Integer)arrayOfObject[2]).intValue() == 1) * { * KickoutUser localObject = (KickoutUser)Rpc.Create("KICKOUTUSER"); * localObject.userid = localUserLoginArg.userid; * localObject.localsid = ((Integer)arrayOfObject[1]).intValue(); * localObject.cause = 32; * GAuthServer.GetLog().info("Send Kickout userid=" + localObject.userid + " sid=" + localObject.localsid); * Session localSession = GetSessionbyZoneid((Integer)arrayOfObject[0]); * if (localSession != null) * localGAuthServer.Send(localSession, localObject); * else * GAuthServer.GetLog().info("Error: kickout user " + localObject.userid + " failed."); * } * else * { * localUserLoginRes.retcode = 10; * return; * } */ } Session.Send(0x0f, id, arg, res); Log.Trace("0x0F sended, retcode = {0}", (int)res.retcode); } }
private void HandleUserPacket(object sender, PacketEventArgs e) { this.FireUserPacket(e.packet, e.ep); }
private void PacketHandler_Disconnect(object sender, PacketEventArgs<DisconnectPacket> e) { Logger.Log(Logger.LogLevel.Info, DisplayName + " disconnected: " + e.Packet.Reason); Running = false; }
private bool Server_AuthValidation(NetHandler handler, PacketEventArgs e) { //Check username and password return true; }
private void PacketHandler_Handshake(object sender, PacketEventArgs<HandshakePacket> e) { Username = Regex.Replace(e.Packet.UsernameOrHash, Chat.DISALLOWED, ""); DisplayName = Username; SendHandshake(); }
//Aka support public void OnSendPacket(Player Player, PacketEventArgs args) { ExtraPlayerData TemporaryPlayer = FindPlayer(Player); if (args.Type == Packet.Types.SendSpawn && args.Data[0] != 255) { if (TemporaryPlayer.Aka) { ExtraPlayerData otherPlayer = FindPlayer(args.Data[1]); byte[] b = enc.GetBytes(otherPlayer.Player.Username.PadRight(64)); Array.Copy(b, 0, args.Data, 2, b.Length); } } }
private void PacketHandler_HoldingChange(object sender, PacketEventArgs<HoldingChangePacket> e) { Inventory.OnActiveChanged((short)(e.Packet.Slot += 36)); foreach (Client c in Server.GetNearbyPlayers(World, Position.X, Position.Y, Position.Z).Where(c => c != this)) { c.SendHoldingEquipment(this); } }
void OnIncomingData(Player p, PacketEventArgs args) { if (args.Data.Length < 0) return; if (args.Data[0] != (byte)'G') return; args.Cancel(); var netStream = p.Client.GetStream(); using (var Writer = new StreamWriter(netStream)) { var line = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[0]; var match = Parser.Match(line); if (match.Success) { var lvl = Level.FindLevel(match.Groups[1].Value); var versionLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[2]; var userNameLine = Encoding.UTF8.GetString(args.Data, 0, args.Data.Length).Split('\n')[3]; var version = versionLine.Remove(0, "X-WoM-Version: ".Length).Replace("\r", ""); var username = userNameLine.Remove(0, "X-WoM-Username: "******"\r", ""); Thread.Sleep(1500); //Trying to find player before it loads so wait. var player = Player.Find(username); if (player != null) { player.ExtraData.ChangeOrCreate<object, object>("UsingWoM", true); if (!String.IsNullOrWhiteSpace(version)) { player.ExtraData.ChangeOrCreate<object, object>("WoMVersion", version); if (PluginSettings.GetSettingBoolean("notify-ops") == true) { Player.UniversalChatOps(username + " joined using " + version); Logger.Log(username + " joined using " + version); } } } if (lvl == null) { Writer.Write("HTTP/1.1 404 Not Found"); Writer.Flush(); } else { if (!lvl.ExtraData.ContainsKey("WoMConfig")) { Writer.Write("HTTP/1.1 500 Internal Server Error"); Writer.Flush(); } else { var config = (string[])lvl.ExtraData["WoMConfig"]; var bytes = Encoding.UTF8.GetBytes(config.ToString<string>()); Writer.WriteLine("HTTP/1.1 200 OK"); Writer.WriteLine("Date: " + DateTime.UtcNow.ToString("R")); Writer.WriteLine("Server: Apache/2.2.21 (CentOS)"); Writer.WriteLine("Last-Modified: " + DateTime.UtcNow.ToString("R")); Writer.WriteLine("Accept-Ranges: bytes"); Writer.WriteLine("Content-Length: " + bytes.Length); Writer.WriteLine("Connection: close"); Writer.WriteLine("Content-Type: text/plain"); Writer.WriteLine(); foreach (var entry in config) Writer.WriteLine(entry); } CFGSettings a = (CFGSettings)CFGDict.GetIfExist<Level, CFGSettings>(p.Level); WOM.SendDetail(player, a.GetSetting("detail.user")); //Send the detail with parsed variables. } } else { Writer.Write("HTTP/1.1 400 Bad Request"); Writer.Flush(); } } }
private void PacketHandler_LoginRequest(object sender, PacketEventArgs<LoginRequestPacket> e) { if (!CheckUsername(e.Packet.Username)) Kick("Inconsistent username"); else if (e.Packet.ProtocolOrEntityId < ProtocolVersion) Kick("Outdated client"); else SendLoginSequence(); }
private byte[] HandlePacket(byte[] buffer) { try { int length = 0; byte msg = buffer[0]; // Get the length of the message by checking the first byte switch (msg) { case 0: length = 130; break; // login case 2: SMPKick("This is not an SMP Server!"); break; // SMP Handshake packet case 5: length = 8; break; // blockchange case 8: length = 9; break; // input case 13: length = 65; break; // chat default: { PacketEventArgs args = new PacketEventArgs(buffer, true, (Packet.Types)msg); bool canceled = OnPlayerReceiveUnknownPacket.Call(this, args, OnAllPlayersReceiveUnknownPacket).Canceled; if (canceled) return new byte[1]; Kick("Unhandled message id \"" + msg + "\"!"); return new byte[0]; } } if (buffer.Length > length) { byte[] message = new byte[length]; Buffer.BlockCopy(buffer, 1, message, 0, length); byte[] tempbuffer = new byte[buffer.Length - length - 1]; Buffer.BlockCopy(buffer, length + 1, tempbuffer, 0, buffer.Length - length - 1); buffer = tempbuffer; if (!OnPlayerReceivePacket.Call(this, new PacketEventArgs(message, true, (Packet.Types)msg), OnAllPlayersReceivePacket).Canceled) { ThreadPool.QueueUserWorkItem(delegate { switch (msg) { case 0: HandleLogin(message); break; case 5: HandleBlockchange(message); break; case 8: HandleIncomingPos(message); break; case 13: HandleChat(message); break; } }); } if (buffer.Length > 0) buffer = HandlePacket(buffer); else return new byte[0]; } } catch (Exception e) { Kick("CONNECTION ERROR: (0x03)"); Logger.Log("[ERROR]: PLAYER MESSAGE RECEIVE ERROR (0x03)", System.Drawing.Color.Red, System.Drawing.Color.Black); Logger.LogError(e); } return buffer; }
private void PacketHandler_Player(object sender, PacketEventArgs<PlayerPacket> e) { this.OnGround = e.Packet.OnGround; this.UpdateEntities(); }
public static void OnLoginPacket(object sender, PacketEventArgs e) { if (e.pak.ContainerID == 1) { OPTIONS.clientID = e.pak.ObjectID; Message msg = new Message(); msg.command = 1; //open IncommingLogin.Enqueue(msg); } }
private void PacketHandler_PlayerBlockPlacement(object sender, PacketEventArgs<PlayerBlockPlacementPacket> e) { // if (!Permissions.CanPlayerBuild(Username)) return; // Using activeslot provides current item info wtihout having to maintain ActiveItem if (Inventory.Slots[Inventory.ActiveSlot].Type <= 0 || Inventory.Slots[Inventory.ActiveSlot].Count < 1) return; // TODO: Neaten this out, or address via handler? if (Inventory.Slots[Inventory.ActiveSlot].Type > 255 || e.Packet.Face == BlockFace.Held) // Client is using an Item. { PacketHandler_PlayerItemPlacement(sender, e); return; } int x = e.Packet.X; int y = e.Packet.Y; int z = e.Packet.Z; BlockData.Blocks type = (BlockData.Blocks)World.GetBlockId(x, y, z); // Get block being built against. // Built Block Info int bx, by, bz; byte bType = (byte)Inventory.Slots[Inventory.ActiveSlot].Type; byte bMetaData = (byte)Inventory.Slots[Inventory.ActiveSlot].Durability; World.FromFace(x, y, z, e.Packet.Face, out bx, out by, out bz); switch (type) // Can't build against these blocks. { case BlockData.Blocks.Air: case BlockData.Blocks.Water: case BlockData.Blocks.Lava: case BlockData.Blocks.Still_Water: case BlockData.Blocks.Still_Lava: return; } switch ((BlockData.Blocks)bType) { case BlockData.Blocks.Cactus: { BlockData.Blocks uType = (BlockData.Blocks)World.GetBlockId(bx, by - 1, bz); if (uType != BlockData.Blocks.Sand && uType != BlockData.Blocks.Cactus) return; } break; case BlockData.Blocks.Crops: { BlockData.Blocks uType = (BlockData.Blocks)World.GetBlockId(bx, by - 1, bz); if (uType != BlockData.Blocks.Soil) return; } break; case BlockData.Blocks.Furnace: case BlockData.Blocks.Dispenser: switch (e.Packet.Face) //Bugged, as the client has a mind of its own for facing { case BlockFace.East: bMetaData = (byte)MetaData.Furnace.East; break; case BlockFace.West: bMetaData = (byte)MetaData.Furnace.West; break; case BlockFace.North: bMetaData = (byte)MetaData.Furnace.North; break; case BlockFace.South: bMetaData = (byte)MetaData.Furnace.South; break; default: switch (FacingDirection(4)) // Built on floor, set by facing dir { case "N": bMetaData = (byte)MetaData.Furnace.North; break; case "W": bMetaData = (byte)MetaData.Furnace.West; break; case "S": bMetaData = (byte)MetaData.Furnace.South; break; case "E": bMetaData = (byte)MetaData.Furnace.East; break; default: return; } break; } break; case BlockData.Blocks.Rails: // TODO: Rail Logic break; case BlockData.Blocks.Reed: // TODO: Check there is water nearby before placing. break; case BlockData.Blocks.Stair: // TODO : If (Block Y - 1 = Stair && Block Y = Air) Then DoubleStair // Else if (Buildblock = Stair) Then DoubleStair break; case BlockData.Blocks.Wooden_Stairs: case BlockData.Blocks.Cobblestone_Stairs: switch (FacingDirection(4)) { case "N": bMetaData = (byte)MetaData.Stairs.South; break; case "E": bMetaData = (byte)MetaData.Stairs.West; break; case "S": bMetaData = (byte)MetaData.Stairs.North; break; case "W": bMetaData = (byte)MetaData.Stairs.East; break; default: return; } break; case BlockData.Blocks.Torch: switch (e.Packet.Face) { case BlockFace.Down: return; case BlockFace.Up: bMetaData = (byte)MetaData.Torch.Standing; break; case BlockFace.West: bMetaData = (byte)MetaData.Torch.West; break; case BlockFace.East: bMetaData = (byte)MetaData.Torch.East; break; case BlockFace.North: bMetaData = (byte)MetaData.Torch.North; break; case BlockFace.South: bMetaData = (byte)MetaData.Torch.South; break; } break; } World.SetBlockAndData(bx, by, bz, bType, bMetaData); World.Update(bx, by, bz); Inventory.RemoveItem(Inventory.ActiveSlot); }
private void PacketSource_ReceivedPacket(PacketSource<WaxPacket> sender, PacketEventArgs<WaxPacket> e) { // If a correctly parsed packet... if (e.Packet != null && e.Packet is WaxPacket) { WaxPacket packet = (WaxPacket)e.Packet; //Console.WriteLine("[" + packet.Timestamp + "]"); //Console.WriteLine(packet.ToString()); lock (SyncRoot) { if (!waxDevices.ContainsKey(packet.DeviceId)) { // Create new device waxDevices.Add(packet.DeviceId, new WaxDevice(packet.DeviceId, packet.Timestamp)); OnNewDevice(new ManagerEventArgs(waxDevices[packet.DeviceId])); } WaxDevice waxDevice = waxDevices[packet.DeviceId]; waxDevice.AddSamples(packet.Samples); // Forward packet to all destinations foreach (PacketDest<WaxPacket> dest in packetDests) { dest.SendPacket(packet); } if (packet != null) { DebugString = packet.ToString(); } } OnReceivedPacket(new ManagerEventArgs(waxDevices[packet.DeviceId], packet)); } }
private void TimerProcessingRequest_Elapsed(object sender, EventArgs e) { ////ensures that one thread enter a processing request section, in the same time reading sms section may will be occured. ////If another thread tries to enter a locked code, it will wait, block, until the object is released. lock (portColletion) { PacketEventArgs workItem = workerPoolManager.GetJob(); if (workItem != null) { BasicInformation currentConnection = portColletion.Get(); if (currentConnection != null) { List <string> command = new List <string>(); ParameterizedMap parsingCommand; try { string dataEncode = Encoding.GetEncoding("ibm850").GetString(workItem.Data); Request request = Newtonsoft.Json.JsonConvert.DeserializeObject <Request>(dataEncode, new Newtonsoft.Json.JsonSerializerSettings { TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects }); ICommandParser <ParameterizedMap> parser = new CommandParser(); parsingCommand = parser.Parse(request.QueueWorkItem.Command); DynamicData parameters = new DynamicData(); foreach (string key in parsingCommand.ToDictionary().Keys) { if (!key.Equals("Command")) { parameters.Add(key, parsingCommand.TryGet <object>(key)); } } parameters.Add("id", request.QueueWorkItem.SeqNbr == null ? "" : request.QueueWorkItem.SeqNbr); command = parsingCommand.TryGet <string>("Command").Split('.').ToList(); ParameterizedMap param = new ParameterizedMap(); param.Add("base", currentConnection); param.Add("packet", workItem); param.Add("command", command); param.Add("parameters", parameters); string responseOut; string encrypted; Worker.IPipeline pipe = ObjectPool.Instance.Resolve <Worker.IPipeline>(); pipe.BeforePush(param); responseOut = pipe.Push(param); OnDataSent(responseOut.ToString()); pipe.AfterPush(param); // send back to client if request workItem is send from tcp if (workItem.Client != null) { Crypter crypter = new Crypter(new DefaultConfigurationKey()); encrypted = crypter.Encrypt(responseOut.ToString()); try { this.Send(((IPEndPoint)workItem.Client.RemoteEndPoint).Port, ASCIIEncoding.ASCII.GetBytes(encrypted.ToString())); } catch (System.Net.Sockets.SocketException) { // client was closed, dont raise error. } catch (ObjectDisposedException) { // client was closed, dont raise error. } } } catch (Exception ex) { RaiseError(currentConnection, ex, "process request"); } } else { workerPoolManager.CurrentWorker.Add(workItem); } } } }