public void RemovePeer(Guid address) { var peer = Peers.Where(p => p.Address == address).FirstOrDefault(); if (peer != null) { Peers.Remove(peer); EventHub.Publish_PeerLeaved(new BlockChainEventArgs(peer, peer)); } }
public async Task SendPacketToAllConnectedPeersAsync(CitpPacket packet) { var connectedPeers = Peers.Where(p => p.IsConnected).ToList(); // If it's possible that different peers might need different versions of the packet, // run this special routine to avoid serializing the packet more than once for each version. if (packet.LayerType == CitpLayerType.MediaServerExtensionsLayer) { var msexPacket = (MsexPacket)packet; if (msexPacket.Version.HasValue == false) { msexPacket.MessagePart = 0; msexPacket.MessagePartCount = 1; msexPacket.RequestResponseIndex = 0; foreach (MsexVersion version in Enum.GetValues(typeof(MsexVersion))) { if (version == MsexVersion.UnsupportedVersion) { continue; } var peersWithVersion = connectedPeers.Where(p => p.MsexVersion == version).ToList(); if (peersWithVersion.Count == 0) { continue; } msexPacket.Version = version; var data = msexPacket.ToByteArray(); foreach (var peer in peersWithVersion) { await sendDataToPeerAsync(peer, data).ConfigureAwait(false); } } } } else { foreach (var peer in connectedPeers) { await SendPacketAsync(packet, peer).ConfigureAwait(false); } } }
private static async Task SendPacket10(ENetPeer peer, PlayerMoving pMov) { DataItems def = new DataItems(); var t = ""; try { //itemDefs.ToList().ForEach(x => Console.WriteLine(x)); var f = CoreData[pMov.PlantingTree].Split('|'); def.ItemID = Convert.ToInt32(f[0]); def.Name = f[1]; t = f[9]; } catch (Exception e) { Console.WriteLine("Sendpacket10 error : " + e.Message); } var p = peer.Data as Player; int id = pMov.PlantingTree; if (t.Contains("Hair")) { if ((peer.Data as Player).HairClothes == pMov.PlantingTree) { (peer.Data as Player).HairClothes = 0; } else { (peer.Data as Player).HairClothes = pMov.PlantingTree; } } else if (t.Contains("Shirt")) { if ((peer.Data as Player).ShirtClothes == pMov.PlantingTree) { (peer.Data as Player).ShirtClothes = 0; } else { (peer.Data as Player).ShirtClothes = pMov.PlantingTree; } } else if (t.Contains("Pants")) { if ((peer.Data as Player).PantsClothes == pMov.PlantingTree) { (peer.Data as Player).PantsClothes = 0; } else { (peer.Data as Player).PantsClothes = pMov.PlantingTree; } } else if (t.Contains("Feet")) { if ((peer.Data as Player).PantsClothes == pMov.PlantingTree) { (peer.Data as Player).PantsClothes = 0; } else { (peer.Data as Player).PantsClothes = pMov.PlantingTree; } } else if (t.Contains("Face")) { if ((peer.Data as Player).PantsClothes == pMov.PlantingTree) { (peer.Data as Player).PantsClothes = 0; } else { (peer.Data as Player).PantsClothes = pMov.PlantingTree; } } else if (t.Contains("Hand")) { if ((peer.Data as Player).HandClothes == pMov.PlantingTree) { (peer.Data as Player).HandClothes = 0; } else { (peer.Data as Player).HandClothes = pMov.PlantingTree; } int item = pMov.PlantingTree; } else if (t.Contains("Back")) { if ((peer.Data as Player).BackClothes == pMov.PlantingTree) { (peer.Data as Player).BackClothes = 0; (peer.Data as Player).InWings = false; } else { (peer.Data as Player).BackClothes = pMov.PlantingTree; int item = pMov.PlantingTree; if (def.Name.ToLower().Contains("wing") || def.Name.ToLower().Contains("cape") || def.Name.ToLower().Contains("aura") || def.Name.ToLower().Contains("dragon warrior's shield") || def.Name.ToLower().Contains("spirit")) { (peer.Data as Player).InWings = true; } await peer.SendState(); // ^^^^ wings } } else if (t.Contains("Mask")) { if ((peer.Data as Player).MaskClothes == pMov.PlantingTree) { (peer.Data as Player).MaskClothes = 0; } else { (peer.Data as Player).MaskClothes = pMov.PlantingTree; } } else if (t.Contains("Necklace")) { if ((peer.Data as Player).NecklaceClothes == pMov.PlantingTree) { (peer.Data as Player).NecklaceClothes = 0; } else { (peer.Data as Player).NecklaceClothes = pMov.PlantingTree; } } else { if (def.Name.ToLower().Contains("ances")) { if ((peer.Data as Player).AncesClothes == pMov.PlantingTree) { (peer.Data as Player).AncesClothes = 0; } (peer.Data as Player).AncesClothes = pMov.PlantingTree; } else { Console.WriteLine("Invalid item activated: " + pMov.PlantingTree + " by " + (peer.Data as Player).DisplayName); } } Peers.Where(x => x.InWorld(peer)).ToList().ForEach(async x => await x.SendSound("change_clothes.wav")); await peer.UpdateClothes(); }
private void RequestPeers() { //считаем сколько нужно пиров int needPeersCount = normalPeersCount - Peers.Where(peer => peer.Status == PeerStatus.Connected).Count(); if (needPeersCount <= 0) { return; } //сначала ищем пиры без трекера if (VotingsUser.PeerDiscovery) { try { PeerDiscovery.DiscoverPeersAsync(PeerDiscovery.DiscoveryMethod.UDPBroadcast); } catch { } } //пиры подключенные прямо (сортируем по кол-ву запросов) var connectedPeersDirect = Peers.Where(peer => peer.Status == PeerStatus.Connected && peer.ConnectionMode == ConnectionMode.Direct) .OrderBy(peer => peer.PeersRequestsCount); //подключенные трекеры (сортируем по кол-ву запросов) var connectedTrackers = Trackers.Where(tracker => tracker.Status == TrackerStatus.Connected) .OrderBy(tracker => tracker.PeersRequestsCount); //пиры подключенные через трекер (сортируем по кол-ву запросов) var connectedPeersWithTracker = Peers.Where(peer => peer.Status == PeerStatus.Connected && peer.ConnectionMode == ConnectionMode.WithTracker) .OrderBy(peer => peer.PeersRequestsCount); //если есть подключенные пиры и трекеры if (connectedPeersDirect.Any() && connectedTrackers.Any()) { var firstPeerDirect = connectedPeersDirect.First(); var firstTracker = connectedTrackers.First(); //запрашиваем у первого прямого пира, если к нему было меньше запросов чем к первому трекеру if (firstPeerDirect.PeersRequestsCount <= firstTracker.PeersRequestsCount) { firstPeerDirect.RequestPeers(needPeersCount); } //если есть подключенные через трекеры пиры else if (connectedPeersWithTracker.Any()) { var firstPeerWithTracker = connectedPeersWithTracker.First(); //запрашиваем у первого трекера, если к нему было меньше запросов чем к первому подключенному через трекер пиру if (firstTracker.PeersRequestsCount <= firstPeerWithTracker.PeersRequestsCount) { firstTracker.RequestPeersFromTracker(needPeersCount); } else { firstPeerWithTracker.RequestPeers(needPeersCount); } } else { firstTracker.RequestPeersFromTracker(needPeersCount); } } else if (connectedPeersDirect.Any()) { var firstPeerDirect = connectedPeersDirect.First(); firstPeerDirect.RequestPeers(needPeersCount); } else if (connectedTrackers.Any()) { var firstTracker = connectedTrackers.First(); firstTracker.RequestPeersFromTracker(needPeersCount); } }
public static async Task SendCommands(ENetPeer peer, string cch) { // When adding a command with more than 1 param , example : "/hello world", // Make sure you use 'Contains' instead of 'Substring'! string str = cch.Split('|').Last(); if (str == "/test") { await peer.OnConsoleMessage("Worked!"); } else if (str == "/clearworld") { World world = peer.GetWorld(); int pos = 0; for (int i = 0; i < world.Items.Length; i++) { if (world.Items[i].Foreground == 242) { pos = i; } } if (world.OwnerName != (peer.Data as Player).RawName) { await peer.OnTalkBubble("You need to be the world owner to do this!", (peer.Data as Player).NetID); return; } WorldDatabase.Worlds[WorldDatabase.Worlds.IndexOf(world)] = WorldDatabase.GenerateClearWorld(world.Name, world.Width, world.Height , world.OwnerName, pos); foreach (var a in Peers.Where(x => x.InWorld(peer) && x.State == ENetPeerState.Connected)) { await a.SendLeave(); await a.OnAddNotification("", "World " + world.Name + " has been cleared!", "open_hub.wav"); await a.JoinWorld(world.Name, 0, 0); } } else if (str.Contains("/item ")) { try { string[] arr = str.Split(' '); if (arr.Length != 3) { return; } if (Convert.ToInt32(arr[2]) > 200) { await peer.OnTalkBubble("Maximum is 200 items only!"); } var a = (peer.Data as Player).PlayerInventory.Items.Where(x => x.ItemID == Convert.ToInt32(arr[1])).ToList(); if (a.Count == 0) { InventoryItems items = new InventoryItems { ItemCount = (byte)Convert.ToInt32(arr[2]), ItemID = Convert.ToInt32(arr[1]) }; (peer.Data as Player).PlayerInventory.Items = (peer.Data as Player) .PlayerInventory.Items.Append(items).ToArray(); await peer.OnConsoleMessage(ItemsData[items.ItemID].Name + " with ID " + items.ItemID + " " + "has been added to your inventory."); } else { InventoryItems items = new InventoryItems { ItemCount = (byte)(Convert.ToInt32(arr[2]) + a[0].ItemCount), ItemID = (byte)Convert.ToInt32(arr[1]) }; if (items.ItemCount > 200) { await peer.OnTalkBubble("You can only add " + (200 - (items.ItemCount - Convert.ToInt32(arr[2]))) + " items more!"); return; } int index = Array.IndexOf((peer.Data as Player).PlayerInventory.Items, a[0]); (peer.Data as Player).PlayerInventory.Items[index] = items; await peer.OnConsoleMessage(ItemsData[items.ItemID].Name + " with ID " + items.ItemID + " " + "has been added to your inventory."); } await peer.SendInventory((peer.Data as Player).PlayerInventory); } catch { return; } } else if (str == "/longpunch") { try { (peer.Data as Player).SmState = (peer.Data as Player).SmState == 1 ? 0 : 1; await peer.JoinWorld((peer.Data as Player).World, 0, 0); } catch (Exception e) { Console.WriteLine(e.Message); } } else if (str.Contains("/find ")) { try { string f = str.Substring(6); var arr = ItemsData.Where (x => x.Name.ToLower() .Contains(f.ToLower()) && x.ItemID % 2 == 0).ToList(); if (arr.Count > 100) { await peer.OnConsoleMessage("`4More than 100 items found. " + "Please specify more!"); await peer.OnTalkBubble("More than 100 items found. " + "Please specify more!"); return; } string s = "set_default_color|\nadd_label|small|Found " + arr.Count + " items|left|420|\nadd_spacer|small|\n"; arr.ForEach(x => s += "add_button_with_icon|findbutton" + x.ItemID + "|`9" + x.Name + "|left|" + x.ItemID + "||\n"); s += "\nadd_spacer|small|\nend_dialog|finddialog|Cancel||"; await peer.OnDialogRequest(s); } catch { return; } } else if (str == "/testing") { string s = "set_default_color|\nadd_label|small|testing|left|420|\nadd_text_input|textinput|`oWow : ||10|\nadd_spacer|small|\nadd_text_input|textinput2|`oWow||10|\nend_dialog|f|cancel|ok|"; await peer.OnDialogRequest(s); } else { if (str[0] == '/') { string s = str.ToLower(); if (s == "/fp" || s == "/dance" || s == "/dance2" || s == "/lol" || s == "/cheer") { await peer.OnAction(str); } else { await peer.OnConsoleMessage("Invalid Command!"); } } else { if (str.All(char.IsWhiteSpace)) { return; } await peer.SendChat(str); } } }
public void JoinOverlay(Nod existingNode) { Nod newNode = new Nod(); if (this.Peers.Count == 1) { // join with the SP newNode.Chain = 1; newNode.Ring = 1; newNode.Id = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " "; newNode.Status = new Neighbour(false, true, false, false); if (!IsNodeInOverlay(newNode)) { Peers.Add(newNode); } } else { //rest of the cases Neighbour status = existingNode.GetStatus(); if (!status.left) { if (existingNode.Chain + 1 > NrChains) { newNode.Chain = existingNode.Chain + 1 - NrChains; } else { newNode.Chain = existingNode.Chain + 1; } newNode.Ring = existingNode.Ring; newNode.Id = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " "; if (newNode.Chain == NrChains) { newNode.Status = new Neighbour(false, true, true, true); } else { newNode.Status = new Neighbour(false, true, false, true); } //existingNode.status.left = true; Peers.Where(item => item.Id == existingNode.Id).ToList().ForEach(s => s.Status.left = true); if (!IsNodeInOverlay(newNode)) { Peers.Add(newNode); } } else { if (!status.right) { if (existingNode.Chain - 1 == 0) { newNode.Chain = NrChains; } else { newNode.Chain = existingNode.Chain - 1; } newNode.Ring = existingNode.Ring; newNode.Id = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " "; if (newNode.Chain == NrChains) { newNode.Status = new Neighbour(false, true, true, true); } else { newNode.Status = new Neighbour(false, true, false, true); } Peers.Where(item => item.Id == existingNode.Id).ToList().ForEach(s => s.Status.right = true); //existingNode.status.right = true; if (!IsNodeInOverlay(newNode)) { Peers.Add(newNode); } } else { if (!status.up) { newNode.Chain = existingNode.Chain; newNode.Ring = existingNode.Ring + 1; newNode.Id = newNode.Chain.ToString() + "-" + newNode.Ring.ToString() + " "; newNode.Status = new Neighbour(false, true, false, false); Peers.Where(item => item.Id == existingNode.Id).ToList().ForEach(s => s.Status.up = true); //existingNode.status.up = true; if (!IsNodeInOverlay(newNode)) { Peers.Add(newNode); } } } } } LastNode = newNode; }
public void UpdateAllNeihhbours(Nod node) { if (node.Ring == NrRings) { //pe ultimul ring Peers.Where(item => item.Ring == node.Ring - 1).ToList().ForEach(s => s.Status.up = false); if (node.Chain == 1) { Peers.Where(item => item.Chain == NrChains).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.left = false; } }); Peers.Where(item => item.Chain == node.Chain + 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.right = false; } }); } else { if (node.Chain == NrChains) { Peers.Where(item => item.Chain == 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.left = false; } }); Peers.Where(item => item.Chain == node.Chain - 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.right = false; } }); } else { Peers.Where(item => item.Chain == NrChains + 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.left = false; } }); Peers.Where(item => item.Chain == node.Chain - 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.right = false; } }); } } } else { //in mijloc if (node.Ring == 1) { //ne mai gandim Console.WriteLine("Not implemented"); } else { Peers.Where(item => item.Ring == node.Ring - 1).ToList().ForEach(s => s.Status.up = false); Peers.Where(item => item.Ring == node.Ring + 1).ToList().ForEach(s => s.Status.down = false); if (node.Chain == 1) { Peers.Where(item => item.Chain == NrChains).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.left = false; } }); Peers.Where(item => item.Chain == node.Chain + 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.right = false; } }); } else { if (node.Chain == NrChains) { Peers.Where(item => item.Chain == 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.left = false; } }); Peers.Where(item => item.Chain == node.Chain - 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.right = false; } }); } else { Peers.Where(item => item.Chain == NrChains + 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.left = false; } }); Peers.Where(item => item.Chain == node.Chain - 1).ToList().ForEach(s => { if (IsNodeInOverlay(s)) { s.Status.right = false; } }); } } } } }