Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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);
                }
            }
        }
Exemplo n.º 6
0
        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;
        }
Exemplo n.º 7
0
 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;
                         }
                     });
                 }
             }
         }
     }
 }