public bool TryRemoveNode(Node node) { if (NodeDictionary.ContainsKey(node.ID)) { Nodes.Remove(node); NodeDictionary.Remove(node.ID); return(true); } return(false); }
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(); }
/// <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); } } }
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; } }