Esempio n. 1
0
        public bool TryRemoveNode(Node node)
        {
            if (NodeDictionary.ContainsKey(node.ID))
            {
                Nodes.Remove(node);
                NodeDictionary.Remove(node.ID);
                return(true);
            }

            return(false);
        }
Esempio n. 2
0
        public void _PeerDisconnected(int peerId)
        {
            GD.Print(peerId, " disconnected!");
            if (!OnlinePlayers.TryGetValue(peerId, out var player))
            {
                return;
            }

            OnlinePlayers.Remove(peerId);
            Entities.DeReplicateEntity(player);
            player.Purge();
        }
Esempio n. 3
0
        /// <summary>
        /// remove node from the net
        /// </summary>
        /// <param name="datas"></param>
        public void RemoveNodes(params Node[] datas)
        {
            if (datas.Length == 0)
            {
                nodes      = new NodeDictionary();
                removedIDs = new List <int>();
                uniqueID   = 1;
                return;
            }

            foreach (var node in datas)
            {
                if (nodes.ContainsKey(node.id))
                {
                    // disconnect all the neighbors
                    foreach (var neighborID in node.neighbors)
                    {
                        var neighborNode = GetNode(neighborID);
                        if (neighborNode != null && neighborNode.neighbors.Contains(node.id))
                        {
                            neighborNode.neighbors.Remove(node.id);
                        }
                    }
                    //reset downstream connection
                    foreach (var nodeID in node.downstreams)   //TODO  move to neighbor check
                    {
                        var checkNode = GetNode(nodeID);
                        if (checkNode != null && checkNode.downstreams != null && checkNode.downstreams.Contains(node.id))
                        {
                            checkNode.downstreams.Remove(node.id);
                        }
                    }

                    //Recycle ID
                    if (!removedIDs.Contains(node.id))
                    {
                        removedIDs.Add(node.id);
                    }

                    //Remove node
                    nodes.Remove(node.id);
                }
            }
        }
Esempio n. 4
0
        public void BuildGraph()
        {
            PropertyDictionary = new PropertyDictionary();
            foreach (var property in Properties)
            {
                PropertyDictionary.Add(property.Guid, property);
            }

            NodeDictionary = new NodeDictionary();
            foreach (var node in Nodes)
            {
                NodeDictionary.Add(node.Guid, node);
            }

            // Link node lines with actual properties, find previous node and actor node where necessary
            var propertyNodes = Nodes.Where(node => node.Type == NodeType.PROP).ToDictionary(node => node.Guid, node => node);

            // convert each conversation line reference from port to property lists using edge list
            foreach (var node in Nodes)
            {
                if (node.Type != NodeType.SELF && node.Type != NodeType.NPC)
                {
                    continue;
                }
                foreach (var line in node.Lines)
                {
                    line.Checks   = new List <string>();
                    line.Triggers = new List <string>();
                    string setNext = null;
                    foreach (var edge in Edges)
                    {
                        // Find triggers
                        if (line.TriggerPort == edge.FromPort)
                        {
                            var nodeGuid = edge.ToNode;
                            line.Triggers.Add(propertyNodes[nodeGuid].Temp_PropertyNodeGuid);
                        }

                        // Find checks, only for NPC nodes
                        if (node.Type == NodeType.NPC && line.CheckPort == edge.ToPort && NodeDictionary[edge.FromNode].Type == NodeType.PROP)
                        {
                            var nodeGuid = edge.FromNode;
                            line.Checks.Add(propertyNodes[nodeGuid].Temp_PropertyNodeGuid);
                        }

                        // Find next node
                        if (edge.FromNode == node.Guid && line.Next == edge.FromPort)
                        {
                            setNext = edge.ToNode;
                        }
                    }

                    line.Next = setNext;
                }

                foreach (var edge in Edges)
                {
                    // Find actor node
                    if (edge.ToNode == node.Guid && node.Type == NodeType.NPC && propertyNodes.ContainsKey(edge.FromNode) && PropertyDictionary[propertyNodes[edge.FromNode].Temp_PropertyNodeGuid].Type == PropertyType.Actor)
                    {
                        node.ActorGuid = propertyNodes[edge.FromNode].Temp_PropertyNodeGuid;
                    }

                    // Find previous node
                    if (edge.ToNode == node.Guid && (NodeDictionary[edge.FromNode].Type == NodeType.NPC || NodeDictionary[edge.FromNode].Type == NodeType.SELF))
                    {
                        node.Previous = edge.FromNode;
                    }
                }
            }

            // Remove property nodes from Nodes and NodeDictionary
            var copyOfNodes = Nodes.ToList();

            copyOfNodes.ForEach(node => {
                if (node.Type == NodeType.NPC || node.Type == NodeType.SELF)
                {
                    return;
                }
                NodeDictionary.Remove(node.Guid);
                Nodes.Remove(node);
            });

            // Find start node
            foreach (var node in Nodes)
            {
                if (!string.IsNullOrEmpty(node.Previous))
                {
                    continue;
                }

                if (!string.IsNullOrEmpty(StartNode) && StartNode != node.Guid)
                {
                    Debug.LogWarning("Multiple nodes without a previous node detected! Defaulting to the first one found to be the start node.");
                    continue;
                }

                StartNode = node.Guid;
            }
        }