private void PlaceEvents() { GeneratingGraph = true; PointF Position = new PointF(EventColumn, 0); Graphics g = graphControl1.GetLayoutGraphics(); foreach (DotaActionCollection kvEvents in Ability.ActionList) { var Event = DotaData.Events.FirstOrDefault(x => x.ClassName == kvEvents.ClassName); if (Event.RespectsTargetFlag && Ability.AbilityBehavior.HasFlag(DotaAbility.AbilityBehaviorFlags.DOTA_ABILITY_BEHAVIOR_UNIT_TARGET)) { //Add the target pin Event.Targets = Event.Targets | DotaEvent.TargetsFlags.TARGET; } var EventNode = new EventNode(Event, Ability.ActionList.GetActionCollection(Event)); EventNode.Location = Position; EventNode.PerformLayout(g); graphControl1.AddNode(EventNode); PointF col = Position; col.X = EventNode.Bounds.Right + ColumnSpacing; //Move this node to the left of the event node + spacing PointF previousCol = col; ExecuteNodeItem ExNode = EventNode.OutputExecute; float columnHeight = EventNode.Bounds.Height; foreach (var kvAction in kvEvents) { if (kvAction == null) { continue; } var ActionNode = new ActionNode(kvAction); ActionNode.Location = col; graphControl1.AddNode(ActionNode); ActionNode.PerformLayout(g); //Connect the execute nodes var inputNode = ActionNode.InputExecute; graphControl1.Connect(ExNode, inputNode); ExNode = ActionNode.OutputExecute; ConnectTargets(EventNode, ActionNode); var varRefs = ActionNode.VariableReferences; foreach (var Ref in varRefs) { var pos = previousCol; pos.Y += columnHeight; //Get the data variable for this reference var actionVariable = ability.ActionList.Variables.FirstOrDefault(x => x.Name == Ref.VariableName.Replace("%", "")); if (actionVariable == null) { MessageBox.Show("Found a reference to " + Ref.VariableName + "but could not find it in the variable table!"); continue; } //Create the variable node and add it to the graph VariableNode varNode = new VariableNode(actionVariable); varNode.Location = pos; varNode.PerformLayout(g); graphControl1.AddNode(varNode); //Connect it's output to the referenced input pins foreach (var inputPin in Ref.InputPins) { graphControl1.Connect(varNode.OutputPin, inputPin); } columnHeight += varNode.Bounds.Height + VariableSpacing; } //Move the pen right to place the next action node previousCol = col; col.X = ActionNode.Bounds.Right + ColumnSpacing; columnHeight = Math.Max(ActionNode.Bounds.Height, columnHeight); } Position.Y += columnHeight + EventSpacing; } GeneratingGraph = false; }