Skip to content

Commit 8cbba2f

Browse files
authored
Merge pull request #22 from megalon/feat/connections
v0.3.0
2 parents 59dcb92 + 917b3a3 commit 8cbba2f

File tree

160 files changed

+5251
-260
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

160 files changed

+5251
-260
lines changed

Editor Scripts/MovesetGraphEditor.cs

+65-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Linq;
45
using UnityEditor;
56
using UnityEngine;
67
using XNode;
@@ -16,19 +17,21 @@ public class MovesetGraphEditor : NodeGraphEditor
1617
private GUIStyle titleStyle;
1718
private Rect titleRect;
1819
private int windowPadding = 20;
19-
20+
2021
public override string GetNodeMenuName(System.Type type)
2122
{
2223
if (type.Namespace != null && type.Namespace.StartsWith("NASB_Moveset_Editor"))
2324
{
25+
if (Consts.NodesToIgnore.Contains(type.Name)) return null;
26+
2427
string nodeMenuName = base.GetNodeMenuName(type).Replace("NASB_Moveset_Editor/", "");
2528

2629
// Organize State Action nodes
2730
if (nodeMenuName.Contains("State Actions/"))
28-
{
31+
{
2932
string nodeName = nodeMenuName.Substring("State Actions/".Length);
3033
if (nodeName.StartsWith("SA"))
31-
{
34+
{
3235
string nameWithoutSA = nodeName.Substring("SA".Length).Trim();
3336
int alphaComp = string.Compare(nameWithoutSA, "N");
3437
if (alphaComp < 1)
@@ -43,9 +46,9 @@ public override string GetNodeMenuName(System.Type type)
4346
else return null;
4447
}
4548

46-
public override void OnCreate()
47-
{
48-
base.OnCreate();
49+
public override void OnCreate()
50+
{
51+
base.OnCreate();
4952
window.titleContent = new GUIContent(Consts.PROJECT_NAME);
5053

5154
titleStyle = new GUIStyle();
@@ -55,9 +58,9 @@ public override void OnCreate()
5558
titleRect = new Rect(windowPadding, windowPadding, window.position.width - windowPadding, window.position.height - windowPadding);
5659
}
5760

58-
public override void OnOpen()
59-
{
60-
base.OnOpen();
61+
public override void OnOpen()
62+
{
63+
base.OnOpen();
6164

6265
SetupInsetGraphName();
6366
}
@@ -70,15 +73,15 @@ public override void OnWindowFocus()
7073
}
7174

7275
public override void OnGUI()
73-
{
74-
base.OnGUI();
76+
{
77+
base.OnGUI();
7578

7679
GUILayout.BeginArea(titleRect);
7780
EditorGUILayout.LabelField(graphParentName, titleStyle);
7881
EditorGUILayout.Space(windowPadding * 0.66f);
7982
EditorGUILayout.LabelField(graphSubName, titleStyle);
8083
GUILayout.EndArea();
81-
}
84+
}
8285

8386
public override NodeEditorPreferences.Settings GetDefaultPreferences()
8487
{
@@ -92,24 +95,70 @@ public override NodeEditorPreferences.Settings GetDefaultPreferences()
9295
}
9396

9497
private void SetupInsetGraphName()
95-
{
98+
{
9699
string graphPath = AssetDatabase.GetAssetPath(base.serializedObject.targetObject);
97100

98101
try
99-
{
102+
{
100103
graphPath = graphPath.Substring(graphPath.IndexOf($"{Consts.GRAPH_FOLDER_NAME}") + Consts.GRAPH_FOLDER_NAME.Length + 1);
101104
graphPath = graphPath.Substring(0, graphPath.Length - ".asset".Length);
102105
graphParentName = graphPath.Substring(0, graphPath.IndexOf("/"));
103106
graphSubName = graphPath.Substring(graphParentName.Length + 1);
104107
} catch
105-
{
108+
{
106109
graphParentName = graphPath;
107110
}
108111
}
109112

110113
public override void AddContextMenuItems(GenericMenu menu, Type compatibleType = null, NodePort.IO direction = NodePort.IO.Input)
111114
{
112-
base.AddContextMenuItems(menu, compatibleType, direction);
115+
Vector2 pos = NodeEditorWindow.current.WindowToGridPosition(Event.current.mousePosition);
116+
117+
if (compatibleType != null)
118+
{
119+
Type[] nodeTypes;
120+
121+
// If this is a list, get the type of the item in the list, then find nodes that have inputs for that type
122+
if (typeof(IEnumerable).IsAssignableFrom(compatibleType) && compatibleType != typeof(string))
123+
{
124+
Type subType = Type.GetType(compatibleType.GenericTypeArguments[0].AssemblyQualifiedName);
125+
nodeTypes = NodeEditorUtilities.GetCompatibleNodesTypes(NodeEditorReflection.nodeTypes, subType, direction).OrderBy(GetNodeMenuOrder).ToArray();
126+
}
127+
else if (NodeEditorPreferences.GetSettings().createFilter)
128+
{
129+
nodeTypes = NodeEditorUtilities.GetCompatibleNodesTypes(NodeEditorReflection.nodeTypes, compatibleType, direction).OrderBy(GetNodeMenuOrder).ToArray();
130+
}
131+
else
132+
{
133+
nodeTypes = NodeEditorReflection.nodeTypes.OrderBy(GetNodeMenuOrder).ToArray();
134+
}
135+
136+
for (int i = 0; i < nodeTypes.Length; i++)
137+
{
138+
Type type = nodeTypes[i];
139+
140+
//Get node context menu path
141+
string path = GetNodeMenuName(type);
142+
if (string.IsNullOrEmpty(path)) continue;
143+
144+
// Check if user is allowed to add more of given node type
145+
XNode.Node.DisallowMultipleNodesAttribute disallowAttrib;
146+
bool disallowed = false;
147+
if (NodeEditorUtilities.GetAttrib(type, out disallowAttrib))
148+
{
149+
int typeCount = target.nodes.Count(x => x.GetType() == type);
150+
if (typeCount >= disallowAttrib.max) disallowed = true;
151+
}
152+
153+
// Add node entry to context menu
154+
if (disallowed) menu.AddItem(new GUIContent(path), false, null);
155+
else menu.AddItem(new GUIContent(path), false, () => {
156+
XNode.Node node = CreateNode(type, pos);
157+
NodeEditorWindow.current.AutoConnect(node);
158+
});
159+
}
160+
}
161+
base.AddContextMenuItems(menu, compatibleType, direction);
113162
menu.AddSeparator("");
114163
menu.AddItem(new GUIContent("Organize Graph"), false, () => GraphHandler.CheckOrganizeGraph());
115164
}

Editor Scripts/Nodes/BaseMovesetNodeEditor.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public override void OnBodyGUI()
3535
if (excludes.Contains(iterator.name)) continue;
3636

3737
if (iterator.type.Equals("string")) {
38-
EditorGUILayout.LabelField(iterator.displayName);
39-
iterator.stringValue = EditorGUILayout.TextField(iterator.stringValue);
38+
DisplayStringProp(iterator);
4039
} else if (iterator.type.Equals("bool")) {
4140
iterator.boolValue = EditorGUILayout.ToggleLeft(iterator.displayName, iterator.boolValue);
4241
} else if (iterator.type.Equals("Enum") && iterator.displayName.Length > Consts.MaxDisplayNameLength)
@@ -69,5 +68,11 @@ public override void OnBodyGUI()
6968

7069
serializedObject.ApplyModifiedProperties();
7170
}
71+
72+
protected void DisplayStringProp(SerializedProperty property)
73+
{
74+
EditorGUILayout.LabelField(property.displayName);
75+
property.stringValue = EditorGUILayout.TextField(property.stringValue);
76+
}
7277
}
7378
}

Editor Scripts/Nodes/FloatSources/FSFuncNodeEditor.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public override void OnBodyGUI()
4141
{
4242
EditorGUILayout.HelpBox(Utils.funcTextDict[currentFunc].ContainerContents["Formula"]);
4343
}
44-
} else if (iterator.type.Equals("FloatSource") && Utils.funcTextDict.ContainsKey(currentFunc))
44+
} else if (iterator.type.Equals("FloatSource") && Utils.funcTextDict.ContainsKey(currentFunc) && !iterator.name.Contains("NodeInput"))
4545
{
4646
NodeEditorGUILayout.PropertyField(iterator, Utils.funcTextDict[currentFunc].ContainerContents[iterator.name], true);
4747
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using NASB_Moveset_Editor;
2+
using NASB_Moveset_Editor.StateActions;
3+
using System.Collections;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using UnityEditor;
7+
using UnityEngine;
8+
using XNodeEditor;
9+
10+
namespace NASB_Moveset_Editor
11+
{
12+
[CustomNodeEditor(typeof(HurtBoneNode))]
13+
public class HurtBoneNodeEditor : StateActionNodeEditor
14+
{
15+
public override void OnBodyGUI()
16+
{
17+
serializedObject.Update();
18+
string[] excludes = { "m_Script", "graph", "position", "ports" };
19+
20+
SerializedProperty iterator = serializedObject.GetIterator();
21+
bool enterChildren = true;
22+
while (iterator.NextVisible(enterChildren))
23+
{
24+
enterChildren = false;
25+
if (excludes.Contains(iterator.name)) continue;
26+
27+
if (iterator.type.Equals("string"))
28+
{
29+
EditorGUILayout.LabelField(iterator.displayName);
30+
iterator.stringValue = EditorGUILayout.TextField(iterator.stringValue);
31+
} else if (iterator.name.Equals("KnockbackArmor"))
32+
{
33+
EditorGUILayout.LabelField(iterator.displayName);
34+
iterator.intValue = EditorGUILayout.IntField(iterator.intValue);
35+
} else if (iterator.name.Equals("ForceZ0"))
36+
{
37+
// ForceZ0 is ignored as of game update v21.5.0
38+
// And NASB Parser for Unity v1.2.0
39+
}
40+
else
41+
{
42+
NodeEditorGUILayout.PropertyField(iterator, true);
43+
}
44+
}
45+
46+
serializedObject.ApplyModifiedProperties();
47+
}
48+
}
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
using UnityEditor;
5+
using XNodeEditor;
6+
using NASB_Moveset_Editor.StateActions;
7+
8+
namespace NASB_Moveset_Editor
9+
{
10+
[CustomNodeEditor(typeof(SACheckThingNode))]
11+
public class SACheckThingNodeEditor : StateActionNodeEditor
12+
{
13+
public override void OnBodyGUI()
14+
{
15+
serializedObject.Update();
16+
SerializedProperty iterator = serializedObject.GetIterator();
17+
18+
// Node input
19+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("NodeInput"), true);
20+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("CheckThing"), true);
21+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("Action"), true);
22+
SerializedProperty elseBool = iterator.serializedObject.FindProperty("Else");
23+
elseBool.boolValue = EditorGUILayout.ToggleLeft(elseBool.displayName, elseBool.boolValue);
24+
25+
if (elseBool.boolValue)
26+
{
27+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("ElseAction"), true);
28+
}
29+
30+
// Iterate through dynamic ports and draw them in the order in which they are serialized
31+
foreach (XNode.NodePort dynamicPort in target.DynamicPorts)
32+
{
33+
if (NodeEditorGUILayout.IsDynamicPortListPort(dynamicPort)) continue;
34+
NodeEditorGUILayout.PortField(dynamicPort);
35+
}
36+
37+
serializedObject.ApplyModifiedProperties();
38+
}
39+
}
40+
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using NASB_Moveset_Editor.StateActions;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using UnityEditor;
5+
using UnityEngine;
6+
using XNodeEditor;
7+
using static XNodeEditor.NodeEditor;
8+
9+
namespace NASB_Moveset_Editor
10+
{
11+
[CustomNodeEditor(typeof(SAConfigHitboxNode))]
12+
public class SAConfigHitboxNodeEditor : StateActionNodeEditor
13+
{
14+
public override void OnBodyGUI()
15+
{
16+
serializedObject.Update();
17+
SerializedProperty iterator = serializedObject.GetIterator();
18+
19+
// Node input
20+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("NodeInput"), true);
21+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("Hitbox"), true);
22+
23+
// ForceZ0 is ignored as of game update v21.5.0
24+
// and NASB Parser for Unity v1.2.0
25+
//
26+
// SerializedProperty forceZ0Bool = iterator.serializedObject.FindProperty("ForceZ0");
27+
// forceZ0Bool.boolValue = EditorGUILayout.ToggleLeft(forceZ0Bool.displayName, forceZ0Bool.boolValue);
28+
29+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("Radius"), true);
30+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("LocalOffset"), true);
31+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("WorldOffset"), true);
32+
33+
DisplayStringProp(iterator.serializedObject.FindProperty("Prop"));
34+
DisplayStringProp(iterator.serializedObject.FindProperty("Bone"));
35+
DisplayStringProp(iterator.serializedObject.FindProperty("FxId"));
36+
DisplayStringProp(iterator.serializedObject.FindProperty("SfxId"));
37+
38+
SerializedProperty secondTrackBool = iterator.serializedObject.FindProperty("SecondTrack");
39+
secondTrackBool.boolValue = EditorGUILayout.ToggleLeft(secondTrackBool.displayName, secondTrackBool.boolValue);
40+
41+
if (secondTrackBool.boolValue)
42+
{
43+
DisplayStringProp(iterator.serializedObject.FindProperty("Bone2"));
44+
45+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("LocalOffset2"), true);
46+
NodeEditorGUILayout.PropertyField(iterator.serializedObject.FindProperty("WorldOffset2"), true);
47+
}
48+
49+
// Iterate through dynamic ports and draw them in the order in which they are serialized
50+
foreach (XNode.NodePort dynamicPort in target.DynamicPorts)
51+
{
52+
if (NodeEditorGUILayout.IsDynamicPortListPort(dynamicPort)) continue;
53+
NodeEditorGUILayout.PortField(dynamicPort);
54+
}
55+
56+
serializedObject.ApplyModifiedProperties();
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)