Compare commits

..

No commits in common. "main" and "combo-release-actions" have entirely different histories.

139 changed files with 648 additions and 9945 deletions

View File

@ -6,7 +6,7 @@
"Description": "A set of components and classes for capturing Enhanced Input actions for buffering actions and stringing them into complex combos.",
"Category": "Input",
"CreatedBy": "Jamie Greunbaum",
"EngineVersion": "5.4.0",
"EngineVersion": "5.2.0",
"CanContainContent": true,
"IsBetaVersion": true,
"IsExperimentalVersion": true,
@ -17,11 +17,6 @@
"Type": "Runtime",
"LoadingPhase": "PreDefault"
},
{
"Name": "ComboInputNodes",
"Type": "UncookedOnly",
"LoadingPhase": "Default"
},
{
"Name": "ComboInputEditor",
"Type": "Editor",

View File

@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.00009 6L6.50009 1H9.50009L8.00009 6ZM14.4001 2.46997L12.4601 1.46997L11.4001 5.96997L14.4001 2.46997ZM4.6001 6L3.5401 1.5L1.6001 2.5L4.6001 6Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.4201 11C12.9501 9.66 11.9401 7.31995 10.9501 7.31995C9.48006 7.31995 9.48006 8.67004 8.88006 8.67004H7.07006C6.47006 8.67004 6.52006 7.31995 5.07006 7.31995C4.07006 7.31995 3.07004 9.66 2.61004 11C1.77004 13.5 1.68006 14.7 3.48006 14.7C5.48006 14.7 5.48005 12.41 8.03005 12.41C10.5801 12.41 10.6201 14.7 12.5301 14.7C14.4401 14.7 14.3101 13.52 13.4201 11ZM7.00005 11H6.00005V12H5.00005V11H4.00005V10H5.00005V9H6.00005V10H7.00005V11ZM10.5001 12.25C10.0359 12.25 9.59081 12.0656 9.26262 11.7374C8.93444 11.4092 8.75005 10.9641 8.75005 10.5C8.75005 10.0359 8.93444 9.59076 9.26262 9.26257C9.59081 8.93438 10.0359 8.75 10.5001 8.75C10.9642 8.75 11.4093 8.93438 11.7375 9.26257C12.0657 9.59076 12.2501 10.0359 12.2501 10.5C12.2501 10.9641 12.0657 11.4092 11.7375 11.7374C11.4093 12.0656 10.9642 12.25 10.5001 12.25Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5 10C10.3674 10 10.2402 10.0527 10.1465 10.1465C10.0527 10.2403 10 10.3674 10 10.5C10 10.6326 10.0527 10.7597 10.1465 10.8535C10.2402 10.9473 10.3674 11 10.5 11C10.6326 11 10.7598 10.9473 10.8535 10.8535C10.9473 10.7597 11 10.6326 11 10.5C11 10.3674 10.9473 10.2403 10.8535 10.1465C10.7598 10.0527 10.6326 10 10.5 10Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,31 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.3" fill-rule="evenodd" clip-rule="evenodd" d="M49 42.5C47.5 38.4 44.3 31 41.3 31C36.6 31 36.6 32.3 34.8 32.3C33.9 32.3 30.4 32.3 29.2 32.3C27.4 32.3 27.4 31 22.7 31C19.8 31 16.5 38.4 15 42.5C12.3 50.5 12.1 54 17.7 54C23.9 54 23.9 48.8 31.9 48.8C39.9 48.8 40.2 54 46.1 54C51.7 54 51.7 50.5 49 42.5ZM28.5 41.7H25.8C25.5 41.7 25.3 41.9 25.3 42.2V44.6C25.3 44.9 25.1 45.1 24.8 45.1H23.4C23.1 45.1 22.9 44.9 22.9 44.6V42.2C22.9 41.9 22.7 41.7 22.4 41.7H20C19.7 41.7 19.5 41.5 19.5 41.2V39.8C19.5 39.5 19.7 39.3 20 39.3H22.4C22.7 39.3 22.9 39.1 22.9 38.8V36.1C22.9 35.8 23.1 35.6 23.4 35.6H24.8C25.1 35.6 25.3 35.8 25.3 36.1V38.8C25.3 39.1 25.5 39.3 25.8 39.3H28.5C28.8 39.3 29 39.5 29 39.8V41.2C29 41.5 28.7 41.7 28.5 41.7ZM43.6 45.6C39.3 47.9 35 44.6 35.5 40.4C35.8 37.6 38.1 35.3 41 35.4C44.1 35.5 46.9 38.3 46.3 41.9C46 43.6 45 44.9 43.6 45.6Z" fill="black" stroke="black" stroke-width="4" stroke-miterlimit="10"/>
<path d="M41.9001 45.5C45.3001 45.5 48 42.8001 48 39.4001C48 36.0001 45.3001 33.3 41.9001 33.3C38.5001 33.3 35.8 36.0001 35.8 39.4001C35.8 42.8001 38.5001 45.5 41.9001 45.5Z" fill="#7F7F7F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.9 41.2C49.3 36.6 45.6 28.4 42.4 28.4C37.1 28.4 37.1 29.8 35.2 29.8C34.2 29.8 30.3 29.8 29 29.8C27 29.8 27 28.4 21.8 28.4C18.5 28.4 14.9 36.6 13.3 41.2C10.3 50.1 9.99998 54 16.3 54C23.2 54 23.2 48.2 32.1 48.2C41 48.2 41.1 54 47.7 54C53.9 54 53.9 50.1 50.9 41.2ZM28.1 40.3H25.1C24.8 40.3 24.5 40.6 24.5 40.9V43.6C24.5 43.9 24.2 44.2 23.9 44.2H22.3C22 44.2 21.7 43.9 21.7 43.6V40.9C21.7 40.6 21.4 40.3 21.1 40.3H18.4C18.1 40.3 17.8 40 17.8 39.7V38.1C17.8 37.8 18.1 37.5 18.4 37.5H21.1C21.4 37.5 21.7 37.2 21.7 36.9V33.9C21.7 33.6 22 33.3 22.3 33.3H24C24.3 33.3 24.6 33.6 24.6 33.9V36.9C24.6 37.2 24.9 37.5 25.2 37.5H28.2C28.5 37.5 28.8 37.8 28.8 38.1V39.7C28.6 40.1 28.4 40.3 28.1 40.3ZM44.9 44.7C40.1 47.2 35.3 43.6 35.8 38.9C36.1 35.8 38.7 33.2 41.9 33.3C45.4 33.4 48.5 36.5 47.9 40.6C47.6 42.4 46.5 43.9 44.9 44.7Z" fill="url(#paint0_linear_10421_29483)"/>
<path d="M41.9 38.2C42.7 38.2 43.4 37.5 43.4 36.7C43.4 35.9 42.7 35.2 41.9 35.2C41.1 35.2 40.4 35.9 40.4 36.7C40.4 37.5 41.1 38.2 41.9 38.2Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M44.8 41.1C45.6 41.1 46.3 40.4 46.3 39.6C46.3 38.8 45.6 38.1 44.8 38.1C44 38.1 43.3 38.8 43.3 39.6C43.3 40.4 44 41.1 44.8 41.1Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M39 41.1C39.8 41.1 40.5 40.4 40.5 39.6C40.5 38.8 39.8 38.1 39 38.1C38.2 38.1 37.5 38.8 37.5 39.6C37.5 40.4 38.2 41.1 39 41.1Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M41.9 43.7C42.7 43.7 43.4 43 43.4 42.2C43.4 41.4 42.7 40.7 41.9 40.7C41.1 40.7 40.4 41.4 40.4 42.2C40.4 43 41.1 43.7 41.9 43.7Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.1 40.3H25.1C24.8 40.3 24.5 40.6001 24.5 40.9001V43.6C24.5 43.9 24.2 44.2001 23.9 44.2001H22.3C22 44.2001 21.7001 43.9 21.7001 43.6V40.9001C21.7001 40.6001 21.4 40.3 21.1 40.3H18.4C18.1 40.3 17.8 40.0001 17.8 39.7001V38.1C17.8 37.8 18.1 37.5 18.4 37.5H21.1C21.4 37.5 21.7001 37.2001 21.7001 36.9001V33.9C21.7001 33.6 22 33.3 22.3 33.3H24C24.3 33.3 24.6 33.6 24.6 33.9V36.9001C24.6 37.2001 24.9001 37.5 25.2001 37.5H28.2001C28.5001 37.5 28.8 37.8 28.8 38.1V39.7001C28.6 40.1001 28.4001 40.3 28.1 40.3Z" fill="#E5E5E5" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M37.5 7.19995H26.5L32 25.6L37.5 7.19995Z" fill="url(#paint1_linear_10421_29483)"/>
<path d="M55.6 12.6L48.5 9L44.5 25.6L55.6 12.6Z" fill="url(#paint2_linear_10421_29483)"/>
<path d="M8.40002 12.6L15.5 9L19.5 25.6L8.40002 12.6Z" fill="url(#paint3_linear_10421_29483)"/>
<defs>
<linearGradient id="paint0_linear_10421_29483" x1="32.1444" y1="28.6896" x2="31.9936" y2="61.413" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF"/>
<stop offset="1" stop-color="#545454"/>
</linearGradient>
<linearGradient id="paint1_linear_10421_29483" x1="32" y1="7.18745" x2="32" y2="25.625" gradientUnits="userSpaceOnUse">
<stop stop-color="#E5E5E5"/>
<stop offset="1" stop-color="#7F7F7F"/>
</linearGradient>
<linearGradient id="paint2_linear_10421_29483" x1="50.0687" y1="9.0312" x2="50.0687" y2="25.625" gradientUnits="userSpaceOnUse">
<stop stop-color="#E5E5E5"/>
<stop offset="1" stop-color="#7F7F7F"/>
</linearGradient>
<linearGradient id="paint3_linear_10421_29483" x1="13.9312" y1="9.0312" x2="13.9312" y2="25.625" gradientUnits="userSpaceOnUse">
<stop stop-color="#E5E5E5"/>
<stop offset="1" stop-color="#7F7F7F"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -0,0 +1,11 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10717_30145)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.4199 12C14.9499 10.66 13.9399 8.32007 12.9499 8.32007C11.4799 8.32007 11.4799 9.66992 10.8799 9.66992H9.07006C8.47006 9.66992 8.52006 8.32007 7.07006 8.32007C6.07006 8.32007 5.0701 10.66 4.6101 12C3.7701 14.5 3.67997 15.7 5.47997 15.7C7.47997 15.7 7.48002 13.4099 10.03 13.4099C12.58 13.4099 12.62 15.7 14.53 15.7C16.44 15.7 16.3099 14.52 15.4199 12ZM8.99999 12H7.99999V13H6.99999V12H5.99999V11H6.99999V10H7.99999V11H8.99999V12ZM12.5 13.25C12.1539 13.25 11.8156 13.1474 11.5278 12.9551C11.24 12.7628 11.0157 12.4894 10.8833 12.1697C10.7508 11.8499 10.7162 11.4982 10.7837 11.1587C10.8512 10.8192 11.0177 10.5072 11.2624 10.2625C11.5072 10.0177 11.8192 9.85122 12.1587 9.78369C12.4981 9.71617 12.8499 9.75085 13.1697 9.8833C13.4894 10.0158 13.7628 10.24 13.9551 10.5278C14.1474 10.8156 14.25 11.1539 14.25 11.5C14.25 11.9641 14.0657 12.4094 13.7375 12.7375C13.4093 13.0657 12.9641 13.25 12.5 13.25V13.25ZM12.5 11C12.4011 11 12.3044 11.0293 12.2222 11.0842C12.1399 11.1392 12.0759 11.2172 12.0381 11.3086C12.0002 11.4 11.9902 11.5007 12.0095 11.5977C12.0288 11.6946 12.0765 11.7836 12.1465 11.8535C12.2164 11.9234 12.3053 11.9712 12.4023 11.9905C12.4993 12.0098 12.6 11.9998 12.6914 11.9619C12.7828 11.9241 12.8608 11.8601 12.9158 11.7778C12.9707 11.6956 13 11.5989 13 11.5C13 11.3674 12.9473 11.2403 12.8535 11.1465C12.7597 11.0527 12.6326 11 12.5 11Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1 10H4C4.17 9.66 4.34003 9.32 4.53003 9H4V7H12V7.52002C12.3286 7.44234 12.6631 7.39226 13 7.37012V7H15V8.25C15.3086 8.66867 15.5797 9.11381 15.8101 9.58008C15.9265 9.41963 15.9926 9.22814 16 9.03003V1C16 0.734784 15.8946 0.480505 15.707 0.292969C15.5195 0.105432 15.2652 0 15 0H1C0.734784 0 0.480505 0.105432 0.292969 0.292969C0.105432 0.480505 0 0.734784 0 1V9C0 9.26522 0.105432 9.51949 0.292969 9.70703C0.480505 9.89457 0.734784 10 1 10ZM14 6H11V4H14V6ZM13 1H15V3H13V1ZM10 1H12V3H10V1ZM10 6H8V4H10V6ZM7 1H9V3H7V1ZM7 6H5V4H7V6ZM4 1H6V3H4V1ZM4 6H2V4H4V6ZM1 1H3V3H1V1ZM1 7H3V9H1V7Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_10717_30145">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,28 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10717_30076)">
<path opacity="0.3" fill-rule="evenodd" clip-rule="evenodd" d="M4 13V37C4.00621 37.4042 4.09863 37.8024 4.27108 38.168C4.44353 38.5336 4.69204 38.8582 5 39.12C5.66071 39.6917 6.50632 40.0044 7.38 40H54.62C55.4937 40.0044 56.3393 39.6917 57 39.12C57.308 38.8582 57.5565 38.5336 57.7289 38.168C57.9014 37.8024 57.9938 37.4042 58 37V13C57.9938 12.5959 57.9014 12.1977 57.7289 11.8321C57.5565 11.4665 57.308 11.1419 57 10.88C56.3393 10.3084 55.4937 9.99571 54.62 10H7.38C6.50632 9.99571 5.66071 10.3084 5 10.88C4.69204 11.1419 4.44353 11.4665 4.27108 11.8321C4.09863 12.1977 4.00621 12.5959 4 13V13Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 10V34C4.00621 34.4042 4.09863 34.8024 4.27108 35.168C4.44353 35.5336 4.69204 35.8582 5 36.12C5.66071 36.6917 6.50632 37.0044 7.38 37H54.62C55.4937 37.0044 56.3393 36.6917 57 36.12C57.308 35.8582 57.5565 35.5336 57.7289 35.168C57.9014 34.8024 57.9938 34.4042 58 34V10C57.9938 9.59586 57.9014 9.19766 57.7289 8.83206C57.5565 8.46646 57.308 8.14189 57 7.88004C56.3393 7.30837 55.4937 6.99571 54.62 7.00004H7.38C6.50632 6.99571 5.66071 7.30837 5 7.88004C4.69204 8.14189 4.44353 8.46646 4.27108 8.83206C4.09863 9.19766 4.00621 9.59586 4 10V10Z" fill="url(#paint0_linear_10717_30076)"/>
<path d="M44 16H38V10H44V16ZM34 10H28V16H34V10ZM54 10H48V16H54V10ZM31 25H37V19H31V25ZM41 19V25H51V19H41ZM54 28H47V31.27C47.49 31.27 48 31.22 48.68 31.22C49.95 31.22 51.29 32.37 52.56 34H54V28ZM8 34H14V28H8V34ZM24 10H18V16H24V10ZM14 10H8V16H14V10ZM11 25H17V19H11V25ZM21 25H27V19H21V25ZM28.86 31.22C33.72 31.22 33.86 32.48 35.86 32.48H41C41.6805 32.4732 42.3555 32.3584 43 32.14V28H18V34H24C25.23 32.37 26.34 31.22 28.86 31.22Z" fill="#E5E5E5"/>
<path opacity="0.3" fill-rule="evenodd" clip-rule="evenodd" d="M56.14 48.16C54.62 43.79 51.11 36 48.07 36C43.07 36 43.07 37.33 41.23 37.33H35.34C33.44 37.33 33.44 36 28.5 36C25.36 36 21.94 43.79 20.42 48.16C17.57 56.61 17.29 60.32 23.27 60.32C29.83 60.32 29.83 54.81 38.27 54.81C46.71 54.81 46.82 60.32 53.09 60.32C59 60.32 59 56.61 56.14 48.16Z" fill="black"/>
<path d="M47.59 49.24C48.738 49.242 49.8607 48.9033 50.8161 48.2667C51.7714 47.6301 52.5164 46.7244 52.9566 45.6642C53.3968 44.604 53.5125 43.437 53.289 42.3109C53.0656 41.1849 52.513 40.1505 51.7012 39.3388C50.8895 38.5271 49.8551 37.9745 48.7291 37.751C47.6031 37.5275 46.436 37.6432 45.3758 38.0834C44.3156 38.5237 43.4099 39.2686 42.7733 40.2239C42.1368 41.1793 41.798 42.302 41.8 43.45C41.796 44.2115 41.9431 44.9662 42.2326 45.6704C42.5222 46.3747 42.9485 47.0146 43.487 47.553C44.0254 48.0915 44.6653 48.5178 45.3696 48.8074C46.0738 49.0969 46.8285 49.244 47.59 49.24V49.24Z" fill="#7F7F7F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M56.14 45.16C54.62 40.79 51.11 33 48.07 33C43.07 33 43.07 34.33 41.23 34.33H35.34C33.44 34.33 33.44 33 28.5 33C25.36 33 21.94 40.79 20.42 45.16C17.57 53.61 17.29 57.32 23.27 57.32C29.83 57.32 29.83 51.81 38.27 51.81C46.71 51.81 46.82 57.32 53.09 57.32C59 57.32 59 53.61 56.14 45.16ZM34.48 44.3H31.63C31.4827 44.3115 31.3443 44.3752 31.2397 44.4797C31.1352 44.5842 31.0715 44.7226 31.06 44.87V47.44C31.0506 47.5881 30.9875 47.7276 30.8826 47.8326C30.7777 47.9375 30.6381 48.0006 30.49 48.01H29C28.8527 47.9985 28.7143 47.9348 28.6097 47.8303C28.5052 47.7258 28.4415 47.5874 28.43 47.44V44.87C28.4206 44.7219 28.3575 44.5824 28.2526 44.4774C28.1477 44.3725 28.0081 44.3094 27.86 44.3H25.27C25.1219 44.2906 24.9824 44.2275 24.8775 44.1226C24.7725 44.0176 24.7095 43.8781 24.7 43.73V42.21C24.7095 42.0619 24.7725 41.9224 24.8775 41.8174C24.9824 41.7125 25.1219 41.6494 25.27 41.64H27.83C27.9781 41.6306 28.1177 41.5675 28.2226 41.4626C28.3275 41.3576 28.3906 41.2181 28.4 41.07V38.22C28.4115 38.0726 28.4752 37.9342 28.5797 37.8297C28.6843 37.7252 28.8227 37.6615 28.97 37.65H30.59C30.7374 37.6615 30.8758 37.7252 30.9803 37.8297C31.0848 37.9342 31.1486 38.0726 31.16 38.22V41.07C31.1695 41.2181 31.2325 41.3576 31.3375 41.4626C31.4424 41.5675 31.5819 41.6306 31.73 41.64H34.58C34.7274 41.6515 34.8658 41.7152 34.9703 41.8197C35.0748 41.9242 35.1386 42.0626 35.15 42.21V43.73C35 44.11 34.77 44.3 34.48 44.3ZM50.48 48.48C45.92 50.86 41.36 47.48 41.84 42.97C41.9606 41.5181 42.6231 40.1648 43.6959 39.1791C44.7687 38.1934 46.1732 37.6475 47.63 37.65C48.4782 37.6819 49.31 37.8933 50.0705 38.2704C50.8309 38.6475 51.5027 39.1817 52.0414 39.8376C52.5801 40.4935 52.9735 41.2563 53.1957 42.0755C53.4178 42.8947 53.4636 43.7518 53.33 44.59C53.1955 45.4226 52.8627 46.2106 52.3597 46.8876C51.8567 47.5647 51.1983 48.1108 50.44 48.48H50.48Z" fill="url(#paint1_linear_10717_30076)"/>
<path d="M47.5899 42.31C47.7871 42.3265 47.9856 42.3019 48.1728 42.2378C48.3599 42.1737 48.5318 42.0715 48.6774 41.9375C48.8231 41.8036 48.9393 41.6409 49.0188 41.4597C49.0984 41.2785 49.1394 41.0828 49.1394 40.885C49.1394 40.6871 49.0984 40.4914 49.0188 40.3102C48.9393 40.129 48.8231 39.9663 48.6774 39.8324C48.5318 39.6985 48.3599 39.5962 48.1728 39.5321C47.9856 39.468 47.7871 39.4434 47.5899 39.46C47.2326 39.4899 46.8996 39.653 46.6569 39.917C46.4141 40.1809 46.2794 40.5264 46.2794 40.885C46.2794 41.2435 46.4141 41.589 46.6569 41.853C46.8996 42.1169 47.2326 42.28 47.5899 42.31V42.31Z" fill="white" stroke="#BFBFBF" stroke-width="0.24" stroke-miterlimit="10"/>
<path d="M50.35 45.06C50.7073 45.03 51.0404 44.8669 51.2831 44.603C51.5258 44.339 51.6605 43.9935 51.6605 43.635C51.6605 43.2764 51.5258 42.9309 51.2831 42.667C51.0404 42.403 50.7073 42.2399 50.35 42.21C50.1528 42.1934 49.9544 42.218 49.7672 42.2821C49.58 42.3462 49.4082 42.4485 49.2625 42.5824C49.1169 42.7163 49.0006 42.879 48.9211 43.0602C48.8416 43.2414 48.8005 43.4371 48.8005 43.635C48.8005 43.8328 48.8416 44.0285 48.9211 44.2097C49.0006 44.3909 49.1169 44.5536 49.2625 44.6875C49.4082 44.8215 49.58 44.9237 49.7672 44.9878C49.9544 45.0519 50.1528 45.0765 50.35 45.06V45.06Z" fill="white" stroke="#BFBFBF" stroke-width="0.24" stroke-miterlimit="10"/>
<path d="M44.84 45.06C45.1973 45.03 45.5304 44.8669 45.7731 44.603C46.0158 44.339 46.1505 43.9935 46.1505 43.635C46.1505 43.2764 46.0158 42.9309 45.7731 42.667C45.5304 42.403 45.1973 42.2399 44.84 42.21C44.6428 42.1934 44.4444 42.218 44.2572 42.2821C44.07 42.3462 43.8982 42.4485 43.7525 42.5824C43.6069 42.7163 43.4906 42.879 43.4111 43.0602C43.3316 43.2414 43.2905 43.4371 43.2905 43.635C43.2905 43.8328 43.3316 44.0285 43.4111 44.2097C43.4906 44.3909 43.6069 44.5536 43.7525 44.6875C43.8982 44.8215 44.07 44.9237 44.2572 44.9878C44.4444 45.0519 44.6428 45.0765 44.84 45.06V45.06Z" fill="white" stroke="#BFBFBF" stroke-width="0.24" stroke-miterlimit="10"/>
<path d="M47.59 47.53C47.8736 47.532 48.1515 47.4495 48.3882 47.2932C48.6249 47.1368 48.8097 46.9136 48.9192 46.6519C49.0286 46.3902 49.0578 46.1018 49.0029 45.8235C48.9481 45.5452 48.8117 45.2895 48.6111 45.0889C48.4105 44.8883 48.1548 44.7519 47.8765 44.697C47.5981 44.6422 47.3098 44.6713 47.0481 44.7808C46.7864 44.8903 46.5632 45.0751 46.4068 45.3118C46.2504 45.5485 46.168 45.8263 46.17 46.11C46.1801 46.4834 46.3329 46.8388 46.5971 47.1029C46.8612 47.3671 47.2165 47.5199 47.59 47.53V47.53Z" fill="white" stroke="#BFBFBF" stroke-width="0.24" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.4799 44.3H31.6299C31.4826 44.3115 31.3442 44.3752 31.2397 44.4797C31.1352 44.5843 31.0714 44.7227 31.0599 44.87V47.44C31.0505 47.5881 30.9874 47.7277 30.8825 47.8326C30.7776 47.9375 30.638 48.0006 30.49 48.01H29C28.8526 47.9985 28.7142 47.9348 28.6097 47.8303C28.5052 47.7258 28.4414 47.5874 28.43 47.44V44.87C28.4205 44.7219 28.3574 44.5824 28.2525 44.4775C28.1476 44.3725 28.008 44.3095 27.86 44.3H25.27C25.1219 44.2906 24.9823 44.2275 24.8774 44.1226C24.7725 44.0177 24.7094 43.8781 24.7 43.73V42.21C24.7094 42.0619 24.7725 41.9224 24.8774 41.8175C24.9823 41.7125 25.1219 41.6495 25.27 41.64H27.83C27.978 41.6306 28.1176 41.5675 28.2225 41.4626C28.3274 41.3577 28.3905 41.2181 28.4 41.07V38.22C28.4114 38.0727 28.4752 37.9343 28.5797 37.8297C28.6842 37.7252 28.8226 37.6615 28.9699 37.65H30.59C30.7373 37.6615 30.8757 37.7252 30.9802 37.8297C31.0847 37.9343 31.1485 38.0727 31.16 38.22V41.07C31.1694 41.2181 31.2325 41.3577 31.3374 41.4626C31.4423 41.5675 31.5819 41.6306 31.7299 41.64H34.58C34.7273 41.6515 34.8657 41.7152 34.9702 41.8197C35.0747 41.9243 35.1385 42.0627 35.15 42.21V43.73C35 44.11 34.7699 44.3 34.4799 44.3Z" fill="#E5E5E5" stroke="#BFBFBF" stroke-width="0.24" stroke-miterlimit="10"/>
</g>
<defs>
<linearGradient id="paint0_linear_10717_30076" x1="31" y1="7.00004" x2="31" y2="37" gradientUnits="userSpaceOnUse">
<stop stop-color="#BEBEBE"/>
<stop offset="1" stop-color="#6F6F6F"/>
</linearGradient>
<linearGradient id="paint1_linear_10717_30076" x1="38.32" y1="33.28" x2="38.18" y2="64.36" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF"/>
<stop offset="1" stop-color="#545454"/>
</linearGradient>
<clipPath id="clip0_10717_30076">
<rect width="54" height="53.32" fill="white" transform="translate(4 7)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M13.1398 8C12.6898 6.73 11.73 4.51001 10.8 4.51001C9.39999 4.51001 9.40999 5.79004 8.79999 5.79004H7.09003C6.52003 5.79004 6.56986 4.51001 5.16986 4.51001C4.22986 4.51001 3.26002 6.73 2.83002 8C2.03002 10.37 1.94985 11.51 3.65985 11.51C5.57985 11.51 5.50991 9.33997 7.96991 9.33997C10.4299 9.33997 10.4299 11.51 12.2299 11.51C14.0299 11.51 13.9998 10.39 13.1398 8ZM6.99994 8H5.99994V9H4.99994V8H3.99994V7H4.99994V6H5.99994V7H6.99994V8ZM10.4999 9.25C10.1538 9.25 9.81556 9.14737 9.52777 8.95508C9.23999 8.76279 9.0157 8.48945 8.88324 8.16968C8.75079 7.84991 8.71611 7.49804 8.78363 7.15857C8.85116 6.8191 9.01765 6.50732 9.26239 6.26257C9.50713 6.01783 9.81917 5.85109 10.1586 5.78357C10.4981 5.71605 10.8498 5.75073 11.1696 5.88318C11.4894 6.01563 11.7627 6.23992 11.955 6.52771C12.1473 6.8155 12.2499 7.15388 12.2499 7.5C12.2499 7.96413 12.0657 8.40924 11.7375 8.73743C11.4093 9.06562 10.9641 9.25 10.4999 9.25ZM10.4999 7C10.4011 7 10.3043 7.02929 10.2221 7.08423C10.1399 7.13917 10.0759 7.21735 10.038 7.30872C10.0002 7.40008 9.99017 7.50054 10.0095 7.59753C10.0288 7.69452 10.0765 7.78359 10.1464 7.85352C10.2164 7.92344 10.3053 7.97106 10.4023 7.99036C10.4993 8.00965 10.6 7.99976 10.6913 7.96191C10.7827 7.92407 10.8608 7.86006 10.9157 7.77783C10.9707 7.69561 10.9999 7.59889 10.9999 7.5C10.9999 7.36739 10.9472 7.24025 10.8535 7.14648C10.7597 7.05272 10.6325 7 10.4999 7Z" fill="white"/>
<path d="M11.1416 2.67396C10.6352 2.66885 10.1366 2.80972 9.69638 3.08245C9.25615 3.35518 8.88989 3.75002 8.63484 4.22682H7.32798C7.0836 3.74077 6.72185 3.33694 6.28186 3.05907C5.84188 2.78121 5.34062 2.63994 4.83221 2.65058C3.10754 2.65058 1.89689 5.41779 1.17917 7.74131C0.461455 10.0648 0.215084 11.5244 0.922091 12.5986C1.18656 12.9499 1.52595 13.225 1.91067 13.4C2.29539 13.5751 2.71376 13.6447 3.12887 13.6027C3.68396 13.5906 4.2297 13.4439 4.72629 13.1733C5.22287 12.9026 5.65776 12.5148 5.99967 12.038C6.22774 11.6919 6.52878 11.4105 6.87736 11.2175C7.22595 11.0244 7.61201 10.9255 8.00298 10.9288C8.39896 10.9387 8.78728 11.0495 9.13697 11.2522C9.48666 11.455 9.7879 11.7441 10.0168 12.0964C10.3554 12.5582 10.7815 12.9349 11.2658 13.2009C11.7502 13.4669 12.2815 13.6158 12.8235 13.6376C13.2497 13.6813 13.6789 13.6093 14.0733 13.428C14.4677 13.2466 14.8149 12.9617 15.0836 12.5986C15.8013 11.431 15.5121 9.92475 14.8158 7.76469C13.1768 2.68562 11.6451 2.67396 11.1416 2.67396Z" stroke="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,18 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.3" fill-rule="evenodd" clip-rule="evenodd" d="M49 30.5C47.5 26.4 44.3 19 41.3 19C36.6 19 36.6 20.3 34.8 20.3C33.9 20.3 30.4 20.3 29.2 20.3C27.4 20.3 27.4 19 22.7 19C19.8 19 16.5 26.4 15 30.5C12.3 38.5 12.1 42 17.7 42C23.9 42 23.9 36.8 31.9 36.8C39.9 36.8 40.2 42 46.1 42C51.7 42 51.7 38.5 49 30.5ZM28.5 29.7H25.8C25.5 29.7 25.3 29.9 25.3 30.2V32.6C25.3 32.9 25.1 33.1 24.8 33.1H23.4C23.1 33.1 22.9 32.9 22.9 32.6V30.2C22.9 29.9 22.7 29.7 22.4 29.7H20C19.7 29.7 19.5 29.5 19.5 29.2V27.8C19.5 27.5 19.7 27.3 20 27.3H22.4C22.7 27.3 22.9 27.1 22.9 26.8V24.1C22.9 23.8 23.1 23.6 23.4 23.6H24.8C25.1 23.6 25.3 23.8 25.3 24.1V26.8C25.3 27.1 25.5 27.3 25.8 27.3H28.5C28.8 27.3 29 27.5 29 27.8V29.2C29 29.5 28.7 29.7 28.5 29.7ZM43.6 33.6C39.3 35.9 35 32.6 35.5 28.4C35.8 25.6 38.1 23.3 41 23.4C44.1 23.5 46.9 26.3 46.3 29.9C46 31.6 45 32.9 43.6 33.6Z" fill="black" stroke="black" stroke-width="4" stroke-miterlimit="10"/>
<path d="M41.9001 33.5C45.3001 33.5 48 30.8001 48 27.4001C48 24.0001 45.3001 21.3 41.9001 21.3C38.5001 21.3 35.8 24.0001 35.8 27.4001C35.8 30.8001 38.5001 33.5 41.9001 33.5Z" fill="#7F7F7F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.9 29.2C49.3 24.6 45.6 16.4 42.4 16.4C37.1 16.4 37.1 17.8 35.2 17.8C34.2 17.8 30.3 17.8 29 17.8C27 17.8 27 16.4 21.8 16.4C18.5 16.4 14.9 24.6 13.3 29.2C10.3 38.1 9.99998 42 16.3 42C23.2 42 23.2 36.2 32.1 36.2C41 36.2 41.1 42 47.7 42C53.9 42 53.9 38.1 50.9 29.2ZM28.1 28.3H25.1C24.8 28.3 24.5 28.6 24.5 28.9V31.6C24.5 31.9 24.2 32.2 23.9 32.2H22.3C22 32.2 21.7 31.9 21.7 31.6V28.9C21.7 28.6 21.4 28.3 21.1 28.3H18.4C18.1 28.3 17.8 28 17.8 27.7V26.1C17.8 25.8 18.1 25.5 18.4 25.5H21.1C21.4 25.5 21.7 25.2 21.7 24.9V21.9C21.7 21.6 22 21.3 22.3 21.3H24C24.3 21.3 24.6 21.6 24.6 21.9V24.9C24.6 25.2 24.9 25.5 25.2 25.5H28.2C28.5 25.5 28.8 25.8 28.8 26.1V27.7C28.6 28.1 28.4 28.3 28.1 28.3ZM44.9 32.7C40.1 35.2 35.3 31.6 35.8 26.9C36.1 23.8 38.7 21.2 41.9 21.3C45.4 21.4 48.5 24.5 47.9 28.6C47.6 30.4 46.5 31.9 44.9 32.7Z" fill="url(#paint0_linear_11318_30131)"/>
<path d="M54.4489 27.9886L54.449 27.9885L54.4466 27.9818L54.4419 27.9682L54.4418 27.9681C53.5929 25.5273 52.1761 22.0893 50.4925 19.1913C49.6582 17.7552 48.6653 16.2881 47.5345 15.1316C46.5181 14.092 44.7597 12.65 42.4 12.65C39.3793 12.65 37.579 13.0554 36.1658 13.605C35.5933 13.8277 35.2876 13.9596 35.1161 14.0404C35.1091 14.0437 35.1024 14.0469 35.0958 14.05H29.0343C29.0154 14.0413 28.994 14.0316 28.9699 14.0207C28.7976 13.9431 28.5026 13.8163 27.9592 13.605C26.5576 13.06 24.7856 12.65 21.8 12.65C19.4415 12.65 17.6769 14.06 16.6307 15.124C15.4863 16.2879 14.4926 17.7635 13.6633 19.2029C11.9896 22.1075 10.6 25.5477 9.75812 27.9681L9.75811 27.9681L9.75337 27.9817L9.75334 27.9817L9.75104 27.9885L9.74643 28.0022L10.4571 28.2418L9.74643 28.0022C8.98454 30.2625 8.34952 32.333 7.95275 34.1581C7.56718 35.9318 7.32972 37.7991 7.61055 39.536C7.9204 41.4526 8.88208 43.2603 10.7701 44.4354C12.4491 45.4803 14.4377 45.75 16.3 45.75C20.7888 45.75 23.3789 43.8244 25.2657 42.4216L25.2755 42.4143L24.8281 41.8125L25.2755 42.4143C25.4111 42.3136 25.5416 42.2166 25.6692 42.1228C26.6002 41.4393 27.3378 40.9488 28.2396 40.5881C29.1146 40.2381 30.3053 39.95 32.1 39.95C33.8953 39.95 35.0939 40.2383 35.9755 40.5897C36.8806 40.9505 37.6214 41.4418 38.5341 42.1161C38.6769 42.2216 38.8237 42.332 38.9777 42.4478L38.9906 42.4574C40.8141 43.8284 43.3701 45.75 47.7 45.75C49.555 45.75 51.5208 45.4743 53.1944 44.4505C55.0542 43.3127 56.0659 41.5588 56.433 39.6432C56.7676 37.8967 56.5757 36.0159 56.214 34.2159C55.8427 32.3684 55.2219 30.2817 54.4535 28.0022C54.4535 28.0022 54.4535 28.0022 54.4535 28.0022L54.4489 27.9886ZM29.1279 14.0932C29.1385 14.0974 29.1397 14.0985 29.1286 14.0935C29.1284 14.0934 29.1281 14.0933 29.1279 14.0932Z" stroke="#636363" stroke-width="1.5"/>
<path d="M6.66671 26.9641L7.61283 27.283L6.66671 26.9641C5.89443 29.2552 5.21287 31.4625 4.77695 33.4677C4.36148 35.3788 4.02444 37.7181 4.40223 40.0548C4.83341 42.7217 6.22696 45.4359 9.05289 47.1946C11.484 48.7076 14.1882 49 16.3 49C21.8651 49 25.1753 46.5388 27.1715 45.0546L27.1801 45.0482L27.2146 45.0225C27.3517 44.9206 27.4742 44.8296 27.5926 44.7426C28.4775 44.093 28.9431 43.807 29.4466 43.6056C29.902 43.4235 30.6785 43.2 32.1 43.2C33.5227 43.2 34.3085 43.4239 34.772 43.6087C35.278 43.8104 35.7471 44.0978 36.6028 44.73L37.197 43.9257L36.6028 44.73C36.7328 44.8261 36.8685 44.9281 37.0247 45.0455L37.0692 45.079L37.0803 45.0873C39.0007 46.5313 42.2837 49 47.7 49C49.8195 49 52.4814 48.6965 54.8904 47.2229C57.6507 45.5343 59.114 42.9212 59.6249 40.2549C60.0761 37.9001 59.7942 35.5356 59.4003 33.5755C58.9889 31.5287 58.3176 29.291 57.5333 26.9641L57.5242 26.9372L57.5243 26.9372L57.5211 26.928L57.5115 26.9004L57.5115 26.9004C56.62 24.3375 55.1238 20.6934 53.3027 17.5587C52.4059 16.0151 51.2566 14.2897 49.8584 12.8595C48.6765 11.6507 46.1139 9.40002 42.4 9.40002C39.0581 9.40002 36.846 9.85337 34.9879 10.576C34.7737 10.6593 34.5874 10.7335 34.4243 10.8H29.7007C29.5415 10.7351 29.3557 10.661 29.1371 10.576L28.7772 11.5016L29.1371 10.576C27.3008 9.86185 25.1197 9.40002 21.8 9.40002C18.1095 9.40002 15.5462 11.5916 14.3134 12.8453C12.8936 14.2892 11.7403 16.0305 10.8473 17.5803C9.03403 20.7273 7.56669 24.3756 6.68852 26.9004L6.68851 26.9004L6.67902 26.9277L6.67898 26.9277L6.67592 26.9367L6.66671 26.9641Z" stroke="#A5A5A5" stroke-width="2"/>
<path d="M41.9 26.2C42.7 26.2 43.4 25.5 43.4 24.7C43.4 23.9 42.7 23.2 41.9 23.2C41.1 23.2 40.4 23.9 40.4 24.7C40.4 25.5 41.1 26.2 41.9 26.2Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M44.8 29.1C45.6 29.1 46.3 28.4 46.3 27.6C46.3 26.8 45.6 26.1 44.8 26.1C44 26.1 43.3 26.8 43.3 27.6C43.3 28.4 44 29.1 44.8 29.1Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M39 29.1C39.8 29.1 40.5 28.4 40.5 27.6C40.5 26.8 39.8 26.1 39 26.1C38.2 26.1 37.5 26.8 37.5 27.6C37.5 28.4 38.2 29.1 39 29.1Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path d="M41.9 31.7C42.7 31.7 43.4 31 43.4 30.2C43.4 29.4 42.7 28.7 41.9 28.7C41.1 28.7 40.4 29.4 40.4 30.2C40.4 31 41.1 31.7 41.9 31.7Z" fill="white" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.1 28.3H25.1C24.8 28.3 24.5 28.6001 24.5 28.9001V31.6C24.5 31.9 24.2 32.2001 23.9 32.2001H22.3C22 32.2001 21.7001 31.9 21.7001 31.6V28.9001C21.7001 28.6001 21.4 28.3 21.1 28.3H18.4C18.1 28.3 17.8 28.0001 17.8 27.7001V26.1C17.8 25.8 18.1 25.5 18.4 25.5H21.1C21.4 25.5 21.7001 25.2001 21.7001 24.9001V21.9C21.7001 21.6 22 21.3 22.3 21.3H24C24.3 21.3 24.6 21.6 24.6 21.9V24.9001C24.6 25.2001 24.9001 25.5 25.2001 25.5H28.2001C28.5001 25.5 28.8 25.8 28.8 26.1V27.7001C28.6 28.1001 28.4001 28.3 28.1 28.3Z" fill="#E5E5E5" stroke="#BFBFBF" stroke-width="0.25" stroke-miterlimit="10"/>
<defs>
<linearGradient id="paint0_linear_11318_30131" x1="32.1444" y1="16.6896" x2="31.9936" y2="49.413" gradientUnits="userSpaceOnUse">
<stop stop-color="#BFBFBF"/>
<stop offset="1" stop-color="#545454"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,13 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10717_30146)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.4199 3.67993C14.9499 2.33993 13.9399 0 12.9499 0C11.4799 0 11.4799 1.34985 10.8799 1.34985H9.07006C8.47006 1.34985 8.52006 0 7.07006 0C6.07006 0 5.0701 2.33993 4.6101 3.67993C3.7701 6.17993 3.67997 7.37988 5.47997 7.37988C7.47997 7.37988 7.48002 5.08984 10.03 5.08984C12.58 5.08984 12.62 7.37988 14.53 7.37988C16.44 7.37988 16.3099 6.19993 15.4199 3.67993ZM8.99999 3.67993H7.99999V4.67993H6.99999V3.67993H5.99999V2.67993H6.99999V1.67993H7.99999V2.67993H8.99999V3.67993ZM12.5 4.92993C12.1539 4.92993 11.8156 4.8273 11.5278 4.63501C11.24 4.44272 11.0157 4.16938 10.8833 3.84961C10.7508 3.52984 10.7162 3.17809 10.7837 2.83862C10.8512 2.49916 11.0177 2.18712 11.2624 1.94238C11.5072 1.69764 11.8192 1.53115 12.1587 1.46362C12.4981 1.3961 12.8499 1.43078 13.1697 1.56323C13.4894 1.69569 13.7628 1.91998 13.9551 2.20776C14.1474 2.49555 14.25 2.83381 14.25 3.17993C14.25 3.64406 14.0657 4.08929 13.7375 4.41748C13.4093 4.74567 12.9641 4.92993 12.5 4.92993V4.92993ZM12.5 2.67993C12.4011 2.67993 12.3044 2.70922 12.2222 2.76416C12.1399 2.8191 12.0759 2.89716 12.0381 2.98853C12.0002 3.07989 11.9902 3.1806 12.0095 3.27759C12.0288 3.37458 12.0765 3.46352 12.1465 3.53345C12.2164 3.60337 12.3053 3.65112 12.4023 3.67041C12.4993 3.6897 12.6 3.67969 12.6914 3.64185C12.7828 3.604 12.8608 3.53999 12.9158 3.45776C12.9707 3.37554 13 3.27882 13 3.17993C13 3.04732 12.9473 2.92018 12.8535 2.82642C12.7597 2.73265 12.6326 2.67993 12.5 2.67993Z" fill="white"/>
<path d="M5.44999 11.3699C7.44999 11.3699 7.45004 9.07985 10 9.07985C12.55 9.07985 12.59 11.3699 14.5 11.3699C16.05 11.3699 16.26 10.4999 15.74 8.66994C15.3401 8.80265 14.9214 8.87013 14.5 8.86989C14.1161 8.87192 13.7345 8.81119 13.3702 8.68996C13.1067 8.84597 12.8062 8.92881 12.5 8.92995C12.0359 8.92995 11.5907 8.74568 11.2625 8.41749C10.9343 8.08931 10.75 7.64407 10.75 7.17995C10.7513 7.04184 10.7681 6.90439 10.8001 6.77003C10.5567 6.63241 10.2793 6.56635 10 6.57985C9.63904 6.56256 9.28394 6.67626 9.00004 6.89992V7.67995H8.17997C8.12493 7.74164 8.06478 7.79844 8.00004 7.84987V8.67995H7.00004V8.53004C6.51565 8.75888 5.98569 8.87496 5.44999 8.86989C5.04562 8.87183 4.64371 8.80771 4.26005 8.67995C3.76005 10.4899 3.90999 11.3699 5.44999 11.3699Z" fill="white"/>
<path d="M5.44999 15.3699C7.44999 15.3699 7.45004 13.0798 10 13.0798C12.55 13.0798 12.59 15.3699 14.5 15.3699C16.05 15.3699 16.26 14.4999 15.74 12.6699C15.3401 12.8026 14.9214 12.8701 14.5 12.8699C14.1161 12.8719 13.7345 12.8112 13.3702 12.69C13.1067 12.846 12.8062 12.9288 12.5 12.9299C12.0359 12.9299 11.5907 12.7457 11.2625 12.4175C10.9343 12.0893 10.75 11.6441 10.75 11.1799C10.7513 11.0418 10.7681 10.9044 10.8001 10.77C10.5567 10.6324 10.2793 10.5663 10 10.5798C9.63904 10.5626 9.28394 10.6763 9.00004 10.8999V11.6799H8.17997C8.12493 11.7416 8.06478 11.7984 8.00004 11.8499V12.6799H7.00004V12.53C6.51565 12.7589 5.98569 12.875 5.44999 12.8699C5.04562 12.8718 4.64371 12.8077 4.26005 12.6799C3.76005 14.4899 3.90999 15.3699 5.44999 15.3699Z" fill="white"/>
<path opacity="0.5" d="M0 13.6799H3V12.6799H1V8.67993H3V7.67993H1V3.67993H3V2.67993H0V13.6799Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_10717_30146">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,58 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10717_29985)">
<g opacity="0.2">
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.9 62C31.55 62 31.55 57.25 38.9 57.25C46.25 57.25 46.22 62 51.63 62C56.71 62 56.71 58.8 54.25 51.51C54.07 50.98 53.85 50.39 53.6 49.76C53.0346 49.9058 52.4538 49.9831 51.87 49.99V49.99C51.8698 50.8315 51.6602 51.6597 51.26 52.4C50.8575 53.1391 50.275 53.7646 49.5664 54.2187C48.8579 54.6727 48.0462 54.9406 47.2065 54.9974C46.3669 55.0543 45.5265 54.8982 44.7632 54.5438C43.9999 54.1894 43.3384 53.6481 42.84 52.97C42.3493 52.2894 42.0302 51.5004 41.91 50.67C41.7986 49.8356 41.8997 48.9866 42.2039 48.2017C42.508 47.4168 43.0054 46.7214 43.65 46.18C42.1448 45.4816 40.4988 45.1394 38.84 45.18C36.6528 45.1257 34.5043 45.7626 32.7 47V48C32.7148 48.1248 32.7712 48.241 32.8601 48.3299C32.949 48.4188 33.0652 48.4752 33.19 48.49H35.65C35.7784 48.4949 35.9001 48.5481 35.991 48.639C36.0818 48.7298 36.135 48.8516 36.14 48.98V50.29C35.98 50.62 35.81 50.78 35.57 50.78H33.11C32.9816 50.7849 32.8598 50.8381 32.769 50.929C32.6781 51.0198 32.6249 51.1416 32.62 51.27V53.49C32.6051 53.6148 32.5487 53.731 32.4599 53.8199C32.371 53.9088 32.2548 53.9652 32.13 53.98H30.81C30.6852 53.9652 30.569 53.9088 30.4801 53.8199C30.3912 53.731 30.3348 53.6148 30.32 53.49V51.24C30.315 51.1116 30.2618 50.9898 30.171 50.899C30.0801 50.8081 29.9583 50.7549 29.83 50.75H27.62C27.4916 50.745 27.3698 50.6918 27.279 50.601C27.1881 50.5102 27.1349 50.3884 27.13 50.26V49.89C26.7226 49.9514 26.3118 49.9882 25.9 50C25.2847 50.0072 24.6706 49.9435 24.07 49.81C23.83 50.41 23.62 50.99 23.44 51.51C21 58.78 20.73 62 25.9 62Z" fill="black"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.9 58C31.55 58 31.55 53.25 38.9 53.25C46.25 53.25 46.22 58 51.63 58C56.71 58 56.71 54.8 54.25 47.51C54.07 46.98 53.85 46.39 53.6 45.76C53.0346 45.9058 52.4538 45.9831 51.87 45.99V45.99C51.8698 46.8315 51.6602 47.6597 51.26 48.4C50.8575 49.1391 50.275 49.7646 49.5664 50.2187C48.8579 50.6727 48.0462 50.9406 47.2065 50.9974C46.3669 51.0543 45.5265 50.8982 44.7632 50.5438C43.9999 50.1894 43.3384 49.6481 42.84 48.97C42.3493 48.2894 42.0302 47.5004 41.91 46.67C41.7986 45.8356 41.8997 44.9866 42.2039 44.2017C42.508 43.4168 43.0054 42.7214 43.65 42.18C42.1448 41.4816 40.4988 41.1394 38.84 41.18C36.6528 41.1257 34.5043 41.7626 32.7 43V44C32.7148 44.1248 32.7712 44.241 32.8601 44.3299C32.949 44.4188 33.0652 44.4752 33.19 44.49H35.65C35.7784 44.4949 35.9001 44.5481 35.991 44.639C36.0818 44.7298 36.135 44.8516 36.14 44.98V46.29C35.98 46.62 35.81 46.78 35.57 46.78H33.11C32.9816 46.7849 32.8598 46.8381 32.769 46.929C32.6781 47.0198 32.6249 47.1416 32.62 47.27V49.49C32.6051 49.6148 32.5487 49.731 32.4599 49.8199C32.371 49.9088 32.2548 49.9652 32.13 49.98H30.81C30.6852 49.9652 30.569 49.9088 30.4801 49.8199C30.3912 49.731 30.3348 49.6148 30.32 49.49V47.24C30.315 47.1116 30.2618 46.9898 30.171 46.899C30.0801 46.8081 29.9583 46.7549 29.83 46.75H27.62C27.4916 46.745 27.3698 46.6918 27.279 46.601C27.1881 46.5102 27.1349 46.3884 27.13 46.26V45.89C26.7226 45.9514 26.3118 45.9882 25.9 46C25.2847 46.0072 24.6706 45.9435 24.07 45.81C23.83 46.41 23.62 46.99 23.44 47.51C21 54.78 20.73 58 25.9 58Z" fill="url(#paint0_linear_10717_29985)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.88 51C48.2061 51 49.4779 50.4732 50.4156 49.5355C51.3533 48.5978 51.88 47.3261 51.88 46H51.64C47.8 46 46.64 43.61 43.64 42.22C42.8719 42.8843 42.3243 43.7668 42.07 44.75C41.8114 45.7417 41.8638 46.789 42.22 47.75C42.5752 48.7006 43.2112 49.5206 44.0436 50.1011C44.876 50.6816 45.8653 50.9951 46.88 51V51Z" fill="#7F7F7F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M45.72 43.4399C45.6823 43.5567 45.6588 43.6776 45.65 43.7999C45.666 44.1179 45.8018 44.418 46.03 44.6399C46.2593 44.8607 46.562 44.9889 46.88 44.9999C47.1349 44.9892 47.3799 44.8982 47.58 44.7399" fill="white"/>
<path d="M45.72 43.4399C45.6823 43.5567 45.6588 43.6776 45.65 43.7999C45.666 44.1179 45.8018 44.418 46.03 44.6399C46.2593 44.8607 46.562 44.9889 46.88 44.9999C47.1349 44.9892 47.3799 44.8982 47.58 44.7399" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M48.46 45.27C48.3269 45.3837 48.218 45.5232 48.14 45.68C48.0685 45.8457 48.0347 46.0252 48.0409 46.2055C48.0471 46.3859 48.0933 46.5626 48.176 46.723C48.2588 46.8833 48.3761 47.0233 48.5195 47.1329C48.6628 47.2425 48.8288 47.3189 49.0052 47.3566C49.1817 47.3943 49.3643 47.3924 49.54 47.351C49.7156 47.3096 49.8799 47.2297 50.021 47.1172C50.1621 47.0047 50.2764 46.8622 50.3558 46.7002C50.4352 46.5381 50.4776 46.3605 50.48 46.18C50.4795 46.0771 50.4592 45.9752 50.42 45.88" fill="white"/>
<path d="M48.46 45.27C48.3269 45.3837 48.218 45.5232 48.14 45.68C48.0685 45.8457 48.0347 46.0252 48.0409 46.2055C48.0471 46.3859 48.0933 46.5626 48.176 46.723C48.2588 46.8833 48.3761 47.0233 48.5195 47.1329C48.6628 47.2425 48.8288 47.3189 49.0052 47.3566C49.1817 47.3943 49.3643 47.3924 49.54 47.351C49.7156 47.3096 49.8799 47.2297 50.021 47.1172C50.1621 47.0047 50.2764 46.8622 50.3558 46.7002C50.4352 46.5381 50.4776 46.3605 50.48 46.18C50.4795 46.0771 50.4592 45.9752 50.42 45.88" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.62 46.75H29.83C29.9584 46.7549 30.0802 46.8082 30.171 46.899C30.2619 46.9898 30.3151 47.1116 30.32 47.24V49.46C30.3348 49.5848 30.3912 49.701 30.4801 49.7899C30.569 49.8788 30.6852 49.9352 30.81 49.95H32.13C32.2548 49.9352 32.371 49.8788 32.4599 49.7899C32.5488 49.701 32.6052 49.5848 32.62 49.46V47.24C32.6249 47.1116 32.6782 46.9898 32.769 46.899C32.8598 46.8082 32.9816 46.7549 33.11 46.75H35.57C35.81 46.75 35.98 46.59 36.14 46.26V45C36.1351 44.8716 36.0819 44.7498 35.991 44.659C35.9002 44.5682 35.7784 44.5149 35.65 44.51H33.19C33.0612 44.4991 32.9405 44.4423 32.85 44.35C32.762 44.2535 32.7092 44.1302 32.7 44V43C31.7 43.63 30.92 44.33 29.99 44.89C29.1163 45.4181 28.1424 45.7586 27.13 45.89V46.26C27.1349 46.3884 27.1882 46.5102 27.279 46.601C27.3698 46.6918 27.4916 46.7451 27.62 46.75Z" fill="#E5E5E5"/>
<path d="M27.13 45.89V46.26C27.1349 46.3884 27.1882 46.5102 27.279 46.601C27.3698 46.6918 27.4916 46.7451 27.62 46.75H29.83C29.9584 46.7549 30.0802 46.8082 30.171 46.899C30.2619 46.9898 30.3151 47.1116 30.32 47.24V49.46C30.3348 49.5848 30.3912 49.701 30.4801 49.7899C30.569 49.8788 30.6852 49.9352 30.81 49.95H32.13C32.2548 49.9352 32.371 49.8788 32.4599 49.7899C32.5488 49.701 32.6052 49.5848 32.62 49.46V47.24C32.6249 47.1116 32.6782 46.9898 32.769 46.899C32.8598 46.8082 32.9816 46.7549 33.11 46.75H35.57C35.81 46.75 35.98 46.59 36.14 46.26V45C36.1351 44.8716 36.0819 44.7498 35.991 44.659C35.9002 44.5682 35.7784 44.5149 35.65 44.51H33.19C33.0612 44.4991 32.9405 44.4423 32.85 44.35C32.762 44.2535 32.7092 44.1302 32.7 44V43" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M44.5 47.41C44.7431 47.4068 44.98 47.3334 45.1823 47.1985C45.3846 47.0636 45.5435 46.8732 45.64 46.65C45.728 46.4243 45.7523 46.1786 45.71 45.94C45.6638 45.6918 45.5435 45.4635 45.365 45.285C45.1865 45.1065 44.9582 44.9862 44.71 44.94C44.4723 44.8945 44.2267 44.9153 44 45C43.7768 45.0965 43.5863 45.2554 43.4515 45.4577C43.3166 45.66 43.2432 45.8969 43.24 46.14C43.2476 46.4638 43.3796 46.7723 43.6087 47.0013C43.8377 47.2303 44.1462 47.3624 44.47 47.37L44.5 47.41Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M46.8801 49.54C47.1646 49.5398 47.4403 49.4411 47.6602 49.2604C47.8801 49.0798 48.0306 48.8286 48.086 48.5494C48.1414 48.2703 48.0983 47.9806 47.9641 47.7297C47.8298 47.4788 47.6128 47.2822 47.3498 47.1734C47.0869 47.0646 46.7944 47.0503 46.5221 47.133C46.2498 47.2157 46.0146 47.3903 45.8566 47.6269C45.6986 47.8636 45.6275 48.1477 45.6555 48.4309C45.6835 48.7141 45.8088 48.9788 46.0101 49.18C46.1243 49.2942 46.26 49.3847 46.4092 49.4465C46.5585 49.5083 46.7185 49.54 46.8801 49.54Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<g opacity="0.2">
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.9 46C31.55 46 31.55 41.25 38.9 41.25C46.25 41.25 46.22 46 51.63 46C56.71 46 56.71 42.8 54.25 35.51C54.07 34.98 53.85 34.39 53.6 33.76C53.0346 33.9058 52.4538 33.9831 51.87 33.99C51.8698 34.8315 51.6602 35.6597 51.26 36.4C50.8575 37.1391 50.275 37.7646 49.5664 38.2187C48.8579 38.6727 48.0462 38.9406 47.2065 38.9974C46.3669 39.0543 45.5265 38.8982 44.7632 38.5438C43.9999 38.1894 43.3384 37.6481 42.84 36.97C42.3493 36.2894 42.0302 35.5004 41.91 34.67C41.7986 33.8356 41.8997 32.9866 42.2039 32.2017C42.508 31.4168 43.0054 30.7214 43.65 30.18C42.1448 29.4816 40.4988 29.1394 38.84 29.18C36.6528 29.1257 34.5043 29.7626 32.7 31V32C32.7148 32.1248 32.7712 32.241 32.8601 32.3299C32.949 32.4188 33.0652 32.4752 33.19 32.49H35.65C35.7784 32.4949 35.9001 32.5481 35.991 32.639C36.0818 32.7298 36.135 32.8516 36.14 32.98V34.29C35.98 34.62 35.81 34.78 35.57 34.78H33.11C32.9816 34.7849 32.8598 34.8381 32.769 34.929C32.6781 35.0198 32.6249 35.1416 32.62 35.27V37.49C32.6051 37.6148 32.5487 37.731 32.4599 37.8199C32.371 37.9088 32.2548 37.9652 32.13 37.98H30.81C30.6852 37.9652 30.569 37.9088 30.4801 37.8199C30.3912 37.731 30.3348 37.6148 30.32 37.49V35.24C30.315 35.1116 30.2618 34.9898 30.171 34.899C30.0801 34.8081 29.9583 34.7549 29.83 34.75H27.62C27.4916 34.745 27.3698 34.6918 27.279 34.601C27.1881 34.5102 27.1349 34.3884 27.13 34.26V33.89C26.7226 33.9514 26.3118 33.9882 25.9 34C25.2847 34.0072 24.6706 33.9435 24.07 33.81C23.83 34.41 23.62 34.99 23.44 35.51C21 42.78 20.73 46 25.9 46Z" fill="black"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.9 42C31.55 42 31.55 37.25 38.9 37.25C46.25 37.25 46.22 42 51.63 42C56.71 42 56.71 38.8 54.25 31.51C54.07 30.98 53.85 30.39 53.6 29.76C53.0346 29.9058 52.4538 29.9831 51.87 29.99V29.99C51.8698 30.8315 51.6602 31.6597 51.26 32.4C50.8575 33.1391 50.275 33.7646 49.5664 34.2187C48.8579 34.6727 48.0462 34.9406 47.2065 34.9974C46.3669 35.0543 45.5265 34.8982 44.7632 34.5438C43.9999 34.1894 43.3384 33.6481 42.84 32.97C42.3493 32.2894 42.0302 31.5004 41.91 30.67C41.7986 29.8356 41.8997 28.9866 42.2039 28.2017C42.508 27.4168 43.0054 26.7214 43.65 26.18C42.1448 25.4816 40.4988 25.1394 38.84 25.18C36.6528 25.1257 34.5043 25.7626 32.7 27V28C32.7148 28.1248 32.7712 28.241 32.8601 28.3299C32.949 28.4188 33.0652 28.4752 33.19 28.49H35.65C35.7784 28.4949 35.9001 28.5481 35.991 28.639C36.0818 28.7298 36.135 28.8516 36.14 28.98V30.29C35.98 30.62 35.81 30.78 35.57 30.78H33.11C32.9816 30.7849 32.8598 30.8381 32.769 30.929C32.6781 31.0198 32.6249 31.1416 32.62 31.27V33.49C32.6051 33.6148 32.5487 33.731 32.4599 33.8199C32.371 33.9088 32.2548 33.9652 32.13 33.98H30.81C30.6852 33.9652 30.569 33.9088 30.4801 33.8199C30.3912 33.731 30.3348 33.6148 30.32 33.49V31.24C30.315 31.1116 30.2618 30.9898 30.171 30.899C30.0801 30.8081 29.9583 30.7549 29.83 30.75H27.62C27.4916 30.745 27.3698 30.6918 27.279 30.601C27.1881 30.5102 27.1349 30.3884 27.13 30.26V29.89C26.7226 29.9514 26.3118 29.9882 25.9 30C25.2847 30.0072 24.6706 29.9435 24.07 29.81C23.83 30.41 23.62 30.99 23.44 31.51C21 38.78 20.73 42 25.9 42Z" fill="url(#paint1_linear_10717_29985)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.88 35C48.2061 35 49.4778 34.4732 50.4155 33.5355C51.3532 32.5978 51.88 31.3261 51.88 30H51.64C47.8 30 46.64 27.61 43.64 26.22C42.8719 26.8843 42.3242 27.7668 42.07 28.75C41.8194 29.7378 41.8767 30.7786 42.2341 31.733C42.5916 32.6874 43.2321 33.5098 44.07 34.09C44.8936 34.6694 45.8731 34.9865 46.88 35V35Z" fill="#7F7F7F"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M45.72 27.4399C45.6823 27.5567 45.6588 27.6776 45.65 27.7999C45.666 28.1179 45.8018 28.418 46.03 28.6399C46.2593 28.8607 46.562 28.9889 46.88 28.9999C47.1349 28.9892 47.3799 28.8982 47.58 28.7399" fill="white"/>
<path d="M45.72 27.4399C45.6823 27.5567 45.6588 27.6776 45.65 27.7999C45.666 28.1179 45.8018 28.418 46.03 28.6399C46.2593 28.8607 46.562 28.9889 46.88 28.9999C47.1349 28.9892 47.3799 28.8982 47.58 28.7399" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M48.46 29.27C48.3269 29.3837 48.218 29.5232 48.14 29.68C48.0685 29.8457 48.0347 30.0252 48.0409 30.2055C48.0471 30.3859 48.0933 30.5626 48.176 30.723C48.2588 30.8833 48.3761 31.0233 48.5195 31.1329C48.6628 31.2425 48.8288 31.3189 49.0052 31.3566C49.1817 31.3943 49.3643 31.3924 49.54 31.351C49.7156 31.3096 49.8799 31.2297 50.021 31.1172C50.1621 31.0047 50.2764 30.8622 50.3558 30.7002C50.4352 30.5381 50.4776 30.3605 50.48 30.18C50.4795 30.0771 50.4592 29.9752 50.42 29.88" fill="white"/>
<path d="M48.46 29.27C48.3269 29.3837 48.218 29.5232 48.14 29.68C48.0685 29.8457 48.0347 30.0252 48.0409 30.2055C48.0471 30.3859 48.0933 30.5626 48.176 30.723C48.2588 30.8833 48.3761 31.0233 48.5195 31.1329C48.6628 31.2425 48.8288 31.3189 49.0052 31.3566C49.1817 31.3943 49.3643 31.3924 49.54 31.351C49.7156 31.3096 49.8799 31.2297 50.021 31.1172C50.1621 31.0047 50.2764 30.8622 50.3558 30.7002C50.4352 30.5381 50.4776 30.3605 50.48 30.18C50.4795 30.0771 50.4592 29.9752 50.42 29.88" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.62 30.75H29.83C29.9584 30.7549 30.0802 30.8082 30.171 30.899C30.2619 30.9898 30.3151 31.1116 30.32 31.24V33.46C30.3348 33.5848 30.3912 33.701 30.4801 33.7899C30.569 33.8788 30.6852 33.9352 30.81 33.95H32.13C32.2548 33.9352 32.371 33.8788 32.4599 33.7899C32.5488 33.701 32.6052 33.5848 32.62 33.46V31.24C32.6249 31.1116 32.6782 30.9898 32.769 30.899C32.8598 30.8082 32.9816 30.7549 33.11 30.75H35.57C35.81 30.75 35.98 30.59 36.14 30.26V29C36.1351 28.8716 36.0819 28.7498 35.991 28.659C35.9002 28.5682 35.7784 28.5149 35.65 28.51H33.19C33.0612 28.4991 32.9405 28.4423 32.85 28.35C32.762 28.2535 32.7092 28.1302 32.7 28V27C31.7 27.63 30.92 28.33 29.99 28.89C29.1188 29.4325 28.1453 29.7899 27.13 29.94V30.31C27.1483 30.4286 27.2072 30.5373 27.2965 30.6175C27.3858 30.6977 27.5001 30.7445 27.62 30.75V30.75Z" fill="#E5E5E5"/>
<path d="M27.13 29.89V30.26C27.1349 30.3884 27.1882 30.5102 27.279 30.601C27.3698 30.6918 27.4916 30.7451 27.62 30.75H29.83C29.9584 30.7549 30.0802 30.8082 30.171 30.899C30.2619 30.9898 30.3151 31.1116 30.32 31.24V33.46C30.3348 33.5848 30.3912 33.701 30.4801 33.7899C30.569 33.8788 30.6852 33.9352 30.81 33.95H32.13C32.2548 33.9352 32.371 33.8788 32.4599 33.7899C32.5488 33.701 32.6052 33.5848 32.62 33.46V31.24C32.6249 31.1116 32.6782 30.9898 32.769 30.899C32.8598 30.8082 32.9816 30.7549 33.11 30.75H35.57C35.81 30.75 35.98 30.59 36.14 30.26V29C36.1351 28.8716 36.0819 28.7498 35.991 28.659C35.9002 28.5682 35.7784 28.5149 35.65 28.51H33.19C33.0612 28.4991 32.9405 28.4423 32.85 28.35C32.762 28.2535 32.7092 28.1302 32.7 28V27" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M44.5 31.41C44.7431 31.4068 44.98 31.3333 45.1823 31.1985C45.3846 31.0636 45.5435 30.8732 45.64 30.65C45.728 30.4242 45.7523 30.1786 45.71 29.94C45.6638 29.6918 45.5435 29.4635 45.365 29.285C45.1865 29.1065 44.9582 28.9862 44.71 28.94C44.4723 28.8945 44.2267 28.9153 44 29C43.7768 29.0965 43.5863 29.2554 43.4515 29.4577C43.3166 29.66 43.2432 29.8969 43.24 30.14C43.2476 30.4638 43.3796 30.7723 43.6087 31.0013C43.8377 31.2303 44.1462 31.3624 44.47 31.37L44.5 31.41Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M46.8801 33.54C47.1646 33.5398 47.4403 33.4411 47.6602 33.2604C47.8801 33.0798 48.0306 32.8286 48.086 32.5494C48.1414 32.2703 48.0983 31.9806 47.9641 31.7297C47.8298 31.4788 47.6128 31.2822 47.3498 31.1734C47.0869 31.0646 46.7944 31.0503 46.5221 31.133C46.2498 31.2157 46.0146 31.3903 45.8566 31.6269C45.6986 31.8636 45.6275 32.1477 45.6555 32.4309C45.6835 32.7141 45.8088 32.9788 46.0101 33.18C46.1243 33.2942 46.26 33.3847 46.4092 33.4465C46.5585 33.5083 46.7185 33.54 46.8801 33.54V33.54Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<g opacity="0.2">
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.25 19.49C52.94 15.72 49.91 9 47.29 9C42.94 9 42.94 10.15 41.39 10.15H36.31C34.67 10.15 34.67 9 30.4 9C27.7 9 24.75 15.72 23.4 19.49C21 26.78 20.73 30 25.9 30C31.55 30 31.55 25.25 38.9 25.25C46.25 25.25 46.22 30 51.63 30C56.71 30 56.71 26.78 54.25 19.49ZM36.14 18.26C35.98 18.59 35.81 18.75 35.57 18.75H33.11C32.9816 18.7549 32.8599 18.8082 32.769 18.899C32.6782 18.9898 32.625 19.1116 32.62 19.24V21.46C32.6052 21.5848 32.5488 21.701 32.4599 21.7899C32.371 21.8788 32.2548 21.9352 32.13 21.95H30.81C30.6852 21.9352 30.569 21.8788 30.4801 21.7899C30.3912 21.701 30.3349 21.5848 30.32 21.46V19.24C30.3151 19.1116 30.2619 18.9898 30.171 18.899C30.0802 18.8082 29.9584 18.7549 29.83 18.75H27.62C27.4916 18.7451 27.3699 18.6918 27.279 18.601C27.1882 18.5102 27.135 18.3884 27.13 18.26V17C27.135 16.8716 27.1882 16.7498 27.279 16.659C27.3699 16.5682 27.4916 16.5149 27.62 16.51H29.83C29.9584 16.5051 30.0802 16.4518 30.171 16.361C30.2619 16.2702 30.3151 16.1484 30.32 16.02V13.51C30.325 13.3816 30.3782 13.2598 30.469 13.169C30.5599 13.0782 30.6816 13.0249 30.81 13.02H32.21C32.3384 13.0249 32.4602 13.0782 32.551 13.169C32.6419 13.2598 32.6951 13.3816 32.7 13.51V16C32.7149 16.1248 32.7712 16.241 32.8601 16.3299C32.949 16.4188 33.0652 16.4752 33.19 16.49H35.65C35.7784 16.4949 35.9002 16.5482 35.991 16.639C36.0819 16.7298 36.1351 16.8516 36.14 16.98V18.26ZM46.88 23C45.8906 22.9998 44.9235 22.7061 44.1011 22.1561C43.2787 21.606 42.638 20.8244 42.26 19.91C41.8813 18.9886 41.7907 17.974 42 17C42.196 16.0391 42.6702 15.1571 43.3636 14.4636C44.0571 13.7702 44.9391 13.296 45.9 13.1C46.8696 12.9011 47.8766 12.9987 48.79 13.38C50.0152 13.8867 50.9889 14.8593 51.4971 16.0839C52.0053 17.3084 52.0064 18.6847 51.5 19.91C51.2526 20.52 50.8852 21.0742 50.4197 21.5397C49.9542 22.0052 49.4001 22.3726 48.79 22.62C48.1844 22.8706 47.5354 22.9997 46.88 23V23Z" fill="black"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.25 15.49C52.94 11.72 49.91 5 47.29 5C42.94 5 42.94 6.15 41.39 6.15H36.31C34.67 6.15 34.67 5 30.4 5C27.7 5 24.75 11.72 23.4 15.49C21 22.78 20.73 26 25.9 26C31.55 26 31.55 21.25 38.9 21.25C46.25 21.25 46.22 26 51.63 26C56.71 26 56.71 22.78 54.25 15.49ZM36.14 14.26C35.98 14.59 35.81 14.75 35.57 14.75H33.11C32.9816 14.7549 32.8599 14.8082 32.769 14.899C32.6782 14.9898 32.625 15.1116 32.62 15.24V17.46C32.6052 17.5848 32.5488 17.701 32.4599 17.7899C32.371 17.8788 32.2548 17.9352 32.13 17.95H30.81C30.6852 17.9352 30.569 17.8788 30.4801 17.7899C30.3912 17.701 30.3349 17.5848 30.32 17.46V15.24C30.3151 15.1116 30.2619 14.9898 30.171 14.899C30.0802 14.8082 29.9584 14.7549 29.83 14.75H27.62C27.4916 14.7451 27.3699 14.6918 27.279 14.601C27.1882 14.5102 27.135 14.3884 27.13 14.26V13C27.135 12.8716 27.1882 12.7498 27.279 12.659C27.3699 12.5682 27.4916 12.5149 27.62 12.51H29.83C29.9584 12.5051 30.0802 12.4518 30.171 12.361C30.2619 12.2702 30.3151 12.1484 30.32 12.02V9.51C30.3249 9.37878 30.3784 9.25406 30.47 9.16C30.5605 9.06768 30.6812 9.01091 30.81 9H32.21C32.3384 9.00494 32.4602 9.05815 32.551 9.149C32.6419 9.23984 32.6951 9.36162 32.7 9.49V12C32.7149 12.1248 32.7712 12.241 32.8601 12.3299C32.949 12.4188 33.0652 12.4752 33.19 12.49H35.65C35.7784 12.4949 35.9002 12.5482 35.991 12.639C36.0819 12.7298 36.1351 12.8516 36.14 12.98V14.26ZM46.88 19C45.8906 18.9998 44.9235 18.7061 44.1011 18.1561C43.2787 17.606 42.638 16.8244 42.26 15.91C41.8813 14.9886 41.7907 13.974 42 13C42.196 12.0391 42.6702 11.1571 43.3636 10.4636C44.0571 9.77018 44.9391 9.29597 45.9 9.1C46.8696 8.90111 47.8766 8.99867 48.79 9.38C49.8589 9.82233 50.7413 10.6216 51.2869 11.6415C51.8325 12.6615 52.0076 13.8391 51.7823 14.9737C51.5571 16.1083 50.9454 17.1297 50.0515 17.8639C49.1576 18.598 48.0368 18.9995 46.88 19Z" fill="url(#paint2_linear_10717_29985)"/>
<path d="M46.88 19C47.8694 18.9998 48.8365 18.7062 49.6589 18.1561C50.4814 17.6061 51.1221 16.8244 51.5 15.91C51.8854 14.9906 51.9831 13.976 51.78 13C51.5827 12.0365 51.1055 11.1525 50.4082 10.4588C49.711 9.7651 48.8246 9.29245 47.86 9.10001C46.9 8.90726 45.9044 9.00473 45 9.38001C43.9335 9.82131 43.0525 10.618 42.5065 11.6349C41.9606 12.6518 41.7832 13.8263 42.0046 14.9591C42.226 16.0919 42.8324 17.1132 43.7211 17.8497C44.6097 18.5863 45.7258 18.9927 46.88 19Z" fill="#7F7F7F"/>
<path d="M46.88 13C47.1196 12.993 47.3523 12.9178 47.5507 12.7832C47.7491 12.6485 47.9049 12.4601 48 12.24C48.088 12.0143 48.1123 11.7686 48.07 11.53C48.0238 11.2818 47.9035 11.0535 47.725 10.875C47.5465 10.6965 47.3181 10.5762 47.07 10.53C46.8314 10.4877 46.5857 10.512 46.36 10.6C46.1368 10.6965 45.9463 10.8554 45.8115 11.0577C45.6766 11.26 45.6032 11.4969 45.6 11.74C45.6 11.9072 45.6332 12.0727 45.6978 12.2269C45.7623 12.381 45.8569 12.5208 45.9761 12.6381C46.0952 12.7554 46.2365 12.8478 46.3917 12.9099C46.5468 12.972 46.7128 13.0027 46.88 13V13Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M49.25 15.41C49.4917 15.4059 49.7268 15.3307 49.926 15.1938C50.1252 15.0568 50.2796 14.8642 50.37 14.64C50.4596 14.4144 50.4805 14.1674 50.43 13.93C50.3846 13.6899 50.2658 13.4697 50.09 13.3C49.9169 13.1297 49.6969 13.0149 49.4582 12.9704C49.2195 12.9259 48.9729 12.9536 48.75 13.05C48.5288 13.1452 48.34 13.3027 48.2068 13.5034C48.0736 13.7041 48.0018 13.9392 48 14.18C48.0031 14.3429 48.0382 14.5035 48.1034 14.6528C48.1686 14.8021 48.2626 14.9371 48.38 15.05C48.4943 15.1642 48.6299 15.2548 48.7792 15.3165C48.9285 15.3783 49.0884 15.4101 49.25 15.41V15.41Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M44.5 15.41C44.7431 15.4068 44.98 15.3333 45.1823 15.1985C45.3846 15.0636 45.5435 14.8732 45.64 14.65C45.728 14.4243 45.7523 14.1786 45.71 13.94C45.6638 13.6918 45.5435 13.4635 45.365 13.285C45.1865 13.1065 44.9582 12.9862 44.71 12.94C44.4723 12.8945 44.2267 12.9153 44 13C43.7768 13.0965 43.5863 13.2554 43.4515 13.4577C43.3166 13.66 43.2432 13.8969 43.24 14.14C43.2476 14.4638 43.3796 14.7723 43.6087 15.0013C43.8377 15.2303 44.1462 15.3624 44.47 15.37L44.5 15.41Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path d="M46.8801 17.54C47.1646 17.5398 47.4403 17.4411 47.6602 17.2604C47.8801 17.0798 48.0306 16.8286 48.086 16.5494C48.1414 16.2703 48.0983 15.9806 47.9641 15.7297C47.8298 15.4788 47.6128 15.2822 47.3498 15.1734C47.0869 15.0646 46.7944 15.0503 46.5221 15.133C46.2498 15.2157 46.0146 15.3903 45.8566 15.6269C45.6986 15.8636 45.6275 16.1477 45.6555 16.4309C45.6835 16.7141 45.8088 16.9788 46.0101 17.18C46.1243 17.2942 46.26 17.3847 46.4092 17.4465C46.5585 17.5083 46.7185 17.54 46.8801 17.54V17.54Z" fill="white" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M35.57 14.75H33.11C32.9816 14.7549 32.8598 14.8082 32.769 14.899C32.6782 14.9898 32.6249 15.1116 32.62 15.24V17.46C32.6052 17.5848 32.5488 17.701 32.4599 17.7899C32.371 17.8788 32.2548 17.9352 32.13 17.95H30.81C30.6852 17.9352 30.569 17.8788 30.4801 17.7899C30.3912 17.701 30.3348 17.5848 30.32 17.46V15.24C30.3151 15.1116 30.2619 14.9898 30.171 14.899C30.0802 14.8082 29.9584 14.7549 29.83 14.75H27.62C27.4916 14.7451 27.3698 14.6918 27.279 14.601C27.1882 14.5102 27.1349 14.3884 27.13 14.26V13C27.1349 12.8716 27.1882 12.7498 27.279 12.659C27.3698 12.5682 27.4916 12.5149 27.62 12.51H29.83C29.9584 12.5051 30.0802 12.4518 30.171 12.361C30.2619 12.2702 30.3151 12.1484 30.32 12.02V9.51C30.3249 9.37878 30.3784 9.25406 30.47 9.16C30.5605 9.06768 30.6812 9.01091 30.81 9H32.21C32.3384 9.00494 32.4602 9.05815 32.551 9.149C32.6419 9.23984 32.6951 9.36162 32.7 9.49V12C32.7148 12.1248 32.7712 12.241 32.8601 12.3299C32.949 12.4188 33.0652 12.4752 33.19 12.49H35.65C35.7784 12.4949 35.9002 12.5482 35.991 12.639C36.0819 12.7298 36.1351 12.8516 36.14 12.98V14.29C36 14.59 35.81 14.75 35.57 14.75Z" fill="#E5E5E5" stroke="#BFBFBF" stroke-width="0.2" stroke-miterlimit="10"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 10H19V13H11V30H19V33H11V50H19V53H8V10Z" fill="#7F7F7F"/>
</g>
<defs>
<linearGradient id="paint0_linear_10717_29985" x1="38.81" y1="57.98" x2="38.81" y2="41.23" gradientUnits="userSpaceOnUse">
<stop stop-color="#545454"/>
<stop offset="1" stop-color="#BFBFBF"/>
</linearGradient>
<linearGradient id="paint1_linear_10717_29985" x1="38.81" y1="41.98" x2="38.81" y2="25.23" gradientUnits="userSpaceOnUse">
<stop stop-color="#545454"/>
<stop offset="1" stop-color="#BFBFBF"/>
</linearGradient>
<linearGradient id="paint2_linear_10717_29985" x1="38.84" y1="31.46" x2="38.72" y2="4.64" gradientUnits="userSpaceOnUse">
<stop stop-color="#545454"/>
<stop offset="1" stop-color="#BFBFBF"/>
</linearGradient>
<clipPath id="clip0_10717_29985">
<rect width="47.85" height="57" fill="white" transform="translate(8 5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
version="1.1"
id="svg3"
sodipodi:docname="ComboAction_16.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs3" />
<sodipodi:namedview
id="namedview3"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="38.051184"
inkscape:cx="11.839316"
inkscape:cy="11.44511"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg3"
showgrid="false" />
<path
d="M8.00009 6L6.50009 1H9.50009L8.00009 6ZM14.4001 2.46997L12.4601 1.46997L11.4001 5.96997L14.4001 2.46997ZM4.6001 6L3.5401 1.5L1.6001 2.5L4.6001 6Z"
fill="white"
id="path1"
style="fill:#8000ff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M13.4201 11C12.9501 9.66 11.9401 7.31995 10.9501 7.31995C9.48006 7.31995 9.48006 8.67004 8.88006 8.67004H7.07006C6.47006 8.67004 6.52006 7.31995 5.07006 7.31995C4.07006 7.31995 3.07004 9.66 2.61004 11C1.77004 13.5 1.68006 14.7 3.48006 14.7C5.48006 14.7 5.48005 12.41 8.03005 12.41C10.5801 12.41 10.6201 14.7 12.5301 14.7C14.4401 14.7 14.3101 13.52 13.4201 11ZM7.00005 11H6.00005V12H5.00005V11H4.00005V10H5.00005V9H6.00005V10H7.00005V11ZM10.5001 12.25C10.0359 12.25 9.59081 12.0656 9.26262 11.7374C8.93444 11.4092 8.75005 10.9641 8.75005 10.5C8.75005 10.0359 8.93444 9.59076 9.26262 9.26257C9.59081 8.93438 10.0359 8.75 10.5001 8.75C10.9642 8.75 11.4093 8.93438 11.7375 9.26257C12.0657 9.59076 12.2501 10.0359 12.2501 10.5C12.2501 10.9641 12.0657 11.4092 11.7375 11.7374C11.4093 12.0656 10.9642 12.25 10.5001 12.25Z"
fill="white"
id="path2"
style="fill:#8100ff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M 9.5,10 C 9.3674,10 9.2402,10.0527 9.1465,10.1465 9.0527,10.2403 9,10.3674 9,10.5 9,10.6326 9.0527,10.7597 9.1465,10.8535 9.2402,10.9473 9.3674,11 9.5,11 9.6326,11 9.7598,10.9473 9.8535,10.8535 9.9473,10.7597 10,10.6326 10,10.5 10,10.3674 9.9473,10.2403 9.8535,10.1465 9.7598,10.0527 9.6326,10 9.5,10 Z"
fill="white"
id="path3"
style="fill:#8000ff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="m 11.5,10 c -0.1326,0 -0.2598,0.0527 -0.3535,0.1465 C 11.0527,10.2403 11,10.3674 11,10.5 c 0,0.1326 0.0527,0.2597 0.1465,0.3535 C 11.2402,10.9473 11.3674,11 11.5,11 11.6326,11 11.7598,10.9473 11.8535,10.8535 11.9473,10.7597 12,10.6326 12,10.5 12,10.3674 11.9473,10.2403 11.8535,10.1465 11.7598,10.0527 11.6326,10 11.5,10 Z"
fill="white"
id="path4"
style="fill:#8000ff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M 10.5,9 C 10.3674,9 10.2402,9.0527 10.1465,9.1465 10.0527,9.2403 10,9.3674 10,9.5 10,9.6326 10.0527,9.7597 10.1465,9.8535 10.2402,9.9473 10.3674,10 10.5,10 10.6326,10 10.7598,9.9473 10.8535,9.8535 10.9473,9.7597 11,9.6326 11,9.5 11,9.3674 10.9473,9.2403 10.8535,9.1465 10.7598,9.0527 10.6326,9 10.5,9 Z"
fill="white"
id="path5"
style="fill:#8000ff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="m 10.5,11 c -0.1326,0 -0.2598,0.0527 -0.3535,0.1465 C 10.0527,11.2403 10,11.3674 10,11.5 c 0,0.1326 0.0527,0.2597 0.1465,0.3535 C 10.2402,11.9473 10.3674,12 10.5,12 10.6326,12 10.7598,11.9473 10.8535,11.8535 10.9473,11.7597 11,11.6326 11,11.5 11,11.3674 10.9473,11.2403 10.8535,11.1465 10.7598,11.0527 10.6326,11 10.5,11 Z"
fill="white"
id="path6"
style="fill:#8000ff;fill-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,185 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
fill="none"
version="1.1"
id="svg18"
sodipodi:docname="ComboAction_64.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview18"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="13.453125"
inkscape:cx="30.736353"
inkscape:cy="33.114983"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg18" />
<path
opacity="0.3"
fill-rule="evenodd"
clip-rule="evenodd"
d="M 49,42.5 C 47.5,38.4 44.3,31 41.3,31 c -4.7,0 -4.7,1.3 -6.5,1.3 -0.9,0 -4.4,0 -5.6,0 -1.8,0 -1.8,-1.3 -6.5,-1.3 -2.9,0 -6.2,7.4 -7.7,11.5 -2.7,8 -2.9,11.5 2.7,11.5 6.2,0 6.2,-5.2 14.2,-5.2 8,0 8.3,5.2 14.2,5.2 5.6,0 5.6,-3.5 2.9,-11.5 z M 28.5,41.7 h -2.7 c -0.3,0 -0.5,0.2 -0.5,0.5 v 2.4 c 0,0.3 -0.2,0.5 -0.5,0.5 h -1.4 c -0.3,0 -0.5,-0.2 -0.5,-0.5 v -2.4 c 0,-0.3 -0.2,-0.5 -0.5,-0.5 H 20 c -0.3,0 -0.5,-0.2 -0.5,-0.5 v -1.4 c 0,-0.3 0.2,-0.5 0.5,-0.5 h 2.4 c 0.3,0 0.5,-0.2 0.5,-0.5 v -2.7 c 0,-0.3 0.2,-0.5 0.5,-0.5 h 1.4 c 0.3,0 0.5,0.2 0.5,0.5 v 2.7 c 0,0.3 0.2,0.5 0.5,0.5 h 2.7 c 0.3,0 0.5,0.2 0.5,0.5 v 1.4 c 0,0.3 -0.3,0.5 -0.5,0.5 z m 15.1,3.9 c -4.3,2.3 -8.6,-1 -8.1,-5.2 0.3,-2.8 2.6,-5.1 5.5,-5 3.1,0.1 5.9,2.9 5.3,6.5 -0.3,1.7 -1.3,3 -2.7,3.7 z"
fill="#000000"
stroke="#000000"
stroke-width="4"
stroke-miterlimit="10"
id="path1"
style="display:inline;fill-rule:evenodd;fill:#000000;fill-opacity:1;opacity:0.299" />
<path
d="M41.9001 45.5C45.3001 45.5 48 42.8001 48 39.4001C48 36.0001 45.3001 33.3 41.9001 33.3C38.5001 33.3 35.8 36.0001 35.8 39.4001C35.8 42.8001 38.5001 45.5 41.9001 45.5Z"
fill="#7F7F7F"
id="path2"
style="fill:#7f00fe;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="m 50.9,41.2 c -1.6,-4.6 -5.3,-12.8 -8.5,-12.8 -5.3,0 -5.3,1.4 -7.2,1.4 -1,0 -4.9,0 -6.2,0 -2,0 -2,-1.4 -7.2,-1.4 -3.3,0 -6.9,8.2 -8.5,12.8 -3,8.9 -3.30002,12.8 3,12.8 6.9,0 6.9,-5.8 15.8,-5.8 8.9,0 9,5.8 15.6,5.8 6.2,0 6.2,-3.9 3.2,-12.8 z M 28.1,40.3 h -3 c -0.3,0 -0.6,0.3 -0.6,0.6 v 2.7 c 0,0.3 -0.3,0.6 -0.6,0.6 h -1.6 c -0.3,0 -0.6,-0.3 -0.6,-0.6 v -2.7 c 0,-0.3 -0.3,-0.6 -0.6,-0.6 h -2.7 c -0.3,0 -0.6,-0.3 -0.6,-0.6 v -1.6 c 0,-0.3 0.3,-0.6 0.6,-0.6 h 2.7 c 0.3,0 0.6,-0.3 0.6,-0.6 v -3 c 0,-0.3 0.3,-0.6 0.6,-0.6 H 24 c 0.3,0 0.6,0.3 0.6,0.6 v 3 c 0,0.3 0.3,0.6 0.6,0.6 h 3 c 0.3,0 0.6,0.3 0.6,0.6 v 1.6 c -0.2,0.4 -0.4,0.6 -0.7,0.6 z m 16.8,4.4 c -4.8,2.5 -9.6,-1.1 -9.1,-5.8 0.3,-3.1 2.9,-5.7 6.1,-5.6 3.5,0.1 6.6,3.2 6,7.3 -0.3,1.8 -1.4,3.3 -3,4.1 z"
fill="url(#paint0_linear_10421_29483)"
id="path3"
style="display:inline" />
<path
d="M41.9 38.2C42.7 38.2 43.4 37.5 43.4 36.7C43.4 35.9 42.7 35.2 41.9 35.2C41.1 35.2 40.4 35.9 40.4 36.7C40.4 37.5 41.1 38.2 41.9 38.2Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path4"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M44.8 41.1C45.6 41.1 46.3 40.4 46.3 39.6C46.3 38.8 45.6 38.1 44.8 38.1C44 38.1 43.3 38.8 43.3 39.6C43.3 40.4 44 41.1 44.8 41.1Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path5"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M39 41.1C39.8 41.1 40.5 40.4 40.5 39.6C40.5 38.8 39.8 38.1 39 38.1C38.2 38.1 37.5 38.8 37.5 39.6C37.5 40.4 38.2 41.1 39 41.1Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path6"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M41.9 43.7C42.7 43.7 43.4 43 43.4 42.2C43.4 41.4 42.7 40.7 41.9 40.7C41.1 40.7 40.4 41.4 40.4 42.2C40.4 43 41.1 43.7 41.9 43.7Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path7"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M28.1 40.3H25.1C24.8 40.3 24.5 40.6001 24.5 40.9001V43.6C24.5 43.9 24.2 44.2001 23.9 44.2001H22.3C22 44.2001 21.7001 43.9 21.7001 43.6V40.9001C21.7001 40.6001 21.4 40.3 21.1 40.3H18.4C18.1 40.3 17.8 40.0001 17.8 39.7001V38.1C17.8 37.8 18.1 37.5 18.4 37.5H21.1C21.4 37.5 21.7001 37.2001 21.7001 36.9001V33.9C21.7001 33.6 22 33.3 22.3 33.3H24C24.3 33.3 24.6 33.6 24.6 33.9V36.9001C24.6 37.2001 24.9001 37.5 25.2001 37.5H28.2001C28.5001 37.5 28.8 37.8 28.8 38.1V39.7001C28.6 40.1001 28.4001 40.3 28.1 40.3Z"
fill="#E5E5E5"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path8"
style="stroke:#bf7fff;stroke-opacity:1;fill:#e5cbff;fill-opacity:1" />
<path
d="M37.5 7.19995H26.5L32 25.6L37.5 7.19995Z"
fill="url(#paint1_linear_10421_29483)"
id="path9" />
<path
d="M55.6 12.6L48.5 9L44.5 25.6L55.6 12.6Z"
fill="url(#paint2_linear_10421_29483)"
id="path10" />
<path
d="M8.40002 12.6L15.5 9L19.5 25.6L8.40002 12.6Z"
fill="url(#paint3_linear_10421_29483)"
id="path11" />
<defs
id="defs18">
<linearGradient
id="paint0_linear_10421_29483"
x1="32.1444"
y1="28.6896"
x2="31.9936"
y2="61.413"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#BFBFBF"
id="stop11"
offset="0"
style="stop-color:#bf7fff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#545454"
id="stop12"
style="stop-color:#5400a8;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="paint1_linear_10421_29483"
x1="32"
y1="7.18745"
x2="32"
y2="25.625"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#E5E5E5"
id="stop13"
offset="0"
style="stop-color:#e5cbff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#7F7F7F"
id="stop14"
style="stop-color:#7f00fe;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="paint2_linear_10421_29483"
x1="50.0687"
y1="9.0312"
x2="50.0687"
y2="25.625"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#E5E5E5"
id="stop15"
offset="0"
style="stop-color:#e5cbff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#7F7F7F"
id="stop16"
style="stop-color:#7f00fe;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="paint3_linear_10421_29483"
x1="13.9312"
y1="9.0312"
x2="13.9312"
y2="25.625"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#E5E5E5"
id="stop17"
offset="0"
style="stop-color:#e5cbff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#7F7F7F"
id="stop18"
style="stop-color:#7f00fe;stop-opacity:1;" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

View File

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
version="1.1"
id="svg2"
sodipodi:docname="ComboInputAsset_16.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview2"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="53.8125"
inkscape:cx="8"
inkscape:cy="8"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<g
clip-path="url(#clip0_10717_30145)"
id="g2">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M15.4199 12C14.9499 10.66 13.9399 8.32007 12.9499 8.32007C11.4799 8.32007 11.4799 9.66992 10.8799 9.66992H9.07006C8.47006 9.66992 8.52006 8.32007 7.07006 8.32007C6.07006 8.32007 5.0701 10.66 4.6101 12C3.7701 14.5 3.67997 15.7 5.47997 15.7C7.47997 15.7 7.48002 13.4099 10.03 13.4099C12.58 13.4099 12.62 15.7 14.53 15.7C16.44 15.7 16.3099 14.52 15.4199 12ZM8.99999 12H7.99999V13H6.99999V12H5.99999V11H6.99999V10H7.99999V11H8.99999V12ZM12.5 13.25C12.1539 13.25 11.8156 13.1474 11.5278 12.9551C11.24 12.7628 11.0157 12.4894 10.8833 12.1697C10.7508 11.8499 10.7162 11.4982 10.7837 11.1587C10.8512 10.8192 11.0177 10.5072 11.2624 10.2625C11.5072 10.0177 11.8192 9.85122 12.1587 9.78369C12.4981 9.71617 12.8499 9.75085 13.1697 9.8833C13.4894 10.0158 13.7628 10.24 13.9551 10.5278C14.1474 10.8156 14.25 11.1539 14.25 11.5C14.25 11.9641 14.0657 12.4094 13.7375 12.7375C13.4093 13.0657 12.9641 13.25 12.5 13.25V13.25ZM12.5 11C12.4011 11 12.3044 11.0293 12.2222 11.0842C12.1399 11.1392 12.0759 11.2172 12.0381 11.3086C12.0002 11.4 11.9902 11.5007 12.0095 11.5977C12.0288 11.6946 12.0765 11.7836 12.1465 11.8535C12.2164 11.9234 12.3053 11.9712 12.4023 11.9905C12.4993 12.0098 12.6 11.9998 12.6914 11.9619C12.7828 11.9241 12.8608 11.8601 12.9158 11.7778C12.9707 11.6956 13 11.5989 13 11.5C13 11.3674 12.9473 11.2403 12.8535 11.1465C12.7597 11.0527 12.6326 11 12.5 11Z"
fill="white"
id="path1"
style="fill:#8000ff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M1 10H4C4.17 9.66 4.34003 9.32 4.53003 9H4V7H12V7.52002C12.3286 7.44234 12.6631 7.39226 13 7.37012V7H15V8.25C15.3086 8.66867 15.5797 9.11381 15.8101 9.58008C15.9265 9.41963 15.9926 9.22814 16 9.03003V1C16 0.734784 15.8946 0.480505 15.707 0.292969C15.5195 0.105432 15.2652 0 15 0H1C0.734784 0 0.480505 0.105432 0.292969 0.292969C0.105432 0.480505 0 0.734784 0 1V9C0 9.26522 0.105432 9.51949 0.292969 9.70703C0.480505 9.89457 0.734784 10 1 10ZM14 6H11V4H14V6ZM13 1H15V3H13V1ZM10 1H12V3H10V1ZM10 6H8V4H10V6ZM7 1H9V3H7V1ZM7 6H5V4H7V6ZM4 1H6V3H4V1ZM4 6H2V4H4V6ZM1 1H3V3H1V1ZM1 7H3V9H1V7Z"
fill="white"
id="path2"
style="fill:#8000ff;fill-opacity:1" />
</g>
<defs
id="defs2">
<clipPath
id="clip0_10717_30145">
<rect
width="16"
height="16"
fill="white"
id="rect2" />
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -1,163 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
fill="none"
version="1.1"
id="svg14"
sodipodi:docname="ComboInputAsset_64.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview14"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="13.453125"
inkscape:cx="32"
inkscape:cy="32"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg14" />
<g
clip-path="url(#clip0_10717_30076)"
id="g11">
<path
opacity="0.3"
fill-rule="evenodd"
clip-rule="evenodd"
d="M4 13V37C4.00621 37.4042 4.09863 37.8024 4.27108 38.168C4.44353 38.5336 4.69204 38.8582 5 39.12C5.66071 39.6917 6.50632 40.0044 7.38 40H54.62C55.4937 40.0044 56.3393 39.6917 57 39.12C57.308 38.8582 57.5565 38.5336 57.7289 38.168C57.9014 37.8024 57.9938 37.4042 58 37V13C57.9938 12.5959 57.9014 12.1977 57.7289 11.8321C57.5565 11.4665 57.308 11.1419 57 10.88C56.3393 10.3084 55.4937 9.99571 54.62 10H7.38C6.50632 9.99571 5.66071 10.3084 5 10.88C4.69204 11.1419 4.44353 11.4665 4.27108 11.8321C4.09863 12.1977 4.00621 12.5959 4 13V13Z"
fill="black"
id="path1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M4 10V34C4.00621 34.4042 4.09863 34.8024 4.27108 35.168C4.44353 35.5336 4.69204 35.8582 5 36.12C5.66071 36.6917 6.50632 37.0044 7.38 37H54.62C55.4937 37.0044 56.3393 36.6917 57 36.12C57.308 35.8582 57.5565 35.5336 57.7289 35.168C57.9014 34.8024 57.9938 34.4042 58 34V10C57.9938 9.59586 57.9014 9.19766 57.7289 8.83206C57.5565 8.46646 57.308 8.14189 57 7.88004C56.3393 7.30837 55.4937 6.99571 54.62 7.00004H7.38C6.50632 6.99571 5.66071 7.30837 5 7.88004C4.69204 8.14189 4.44353 8.46646 4.27108 8.83206C4.09863 9.19766 4.00621 9.59586 4 10V10Z"
fill="url(#paint0_linear_10717_30076)"
id="path2" />
<path
d="M44 16H38V10H44V16ZM34 10H28V16H34V10ZM54 10H48V16H54V10ZM31 25H37V19H31V25ZM41 19V25H51V19H41ZM54 28H47V31.27C47.49 31.27 48 31.22 48.68 31.22C49.95 31.22 51.29 32.37 52.56 34H54V28ZM8 34H14V28H8V34ZM24 10H18V16H24V10ZM14 10H8V16H14V10ZM11 25H17V19H11V25ZM21 25H27V19H21V25ZM28.86 31.22C33.72 31.22 33.86 32.48 35.86 32.48H41C41.6805 32.4732 42.3555 32.3584 43 32.14V28H18V34H24C25.23 32.37 26.34 31.22 28.86 31.22Z"
fill="#E5E5E5"
id="path3"
style="fill:#e5cbff;fill-opacity:1" />
<path
opacity="0.3"
fill-rule="evenodd"
clip-rule="evenodd"
d="M56.14 48.16C54.62 43.79 51.11 36 48.07 36C43.07 36 43.07 37.33 41.23 37.33H35.34C33.44 37.33 33.44 36 28.5 36C25.36 36 21.94 43.79 20.42 48.16C17.57 56.61 17.29 60.32 23.27 60.32C29.83 60.32 29.83 54.81 38.27 54.81C46.71 54.81 46.82 60.32 53.09 60.32C59 60.32 59 56.61 56.14 48.16Z"
fill="black"
id="path4" />
<path
d="M47.59 49.24C48.738 49.242 49.8607 48.9033 50.8161 48.2667C51.7714 47.6301 52.5164 46.7244 52.9566 45.6642C53.3968 44.604 53.5125 43.437 53.289 42.3109C53.0656 41.1849 52.513 40.1505 51.7012 39.3388C50.8895 38.5271 49.8551 37.9745 48.7291 37.751C47.6031 37.5275 46.436 37.6432 45.3758 38.0834C44.3156 38.5237 43.4099 39.2686 42.7733 40.2239C42.1368 41.1793 41.798 42.302 41.8 43.45C41.796 44.2115 41.9431 44.9662 42.2326 45.6704C42.5222 46.3747 42.9485 47.0146 43.487 47.553C44.0254 48.0915 44.6653 48.5178 45.3696 48.8074C46.0738 49.0969 46.8285 49.244 47.59 49.24V49.24Z"
fill="#7F7F7F"
id="path5"
style="fill:#7f00fe;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M56.14 45.16C54.62 40.79 51.11 33 48.07 33C43.07 33 43.07 34.33 41.23 34.33H35.34C33.44 34.33 33.44 33 28.5 33C25.36 33 21.94 40.79 20.42 45.16C17.57 53.61 17.29 57.32 23.27 57.32C29.83 57.32 29.83 51.81 38.27 51.81C46.71 51.81 46.82 57.32 53.09 57.32C59 57.32 59 53.61 56.14 45.16ZM34.48 44.3H31.63C31.4827 44.3115 31.3443 44.3752 31.2397 44.4797C31.1352 44.5842 31.0715 44.7226 31.06 44.87V47.44C31.0506 47.5881 30.9875 47.7276 30.8826 47.8326C30.7777 47.9375 30.6381 48.0006 30.49 48.01H29C28.8527 47.9985 28.7143 47.9348 28.6097 47.8303C28.5052 47.7258 28.4415 47.5874 28.43 47.44V44.87C28.4206 44.7219 28.3575 44.5824 28.2526 44.4774C28.1477 44.3725 28.0081 44.3094 27.86 44.3H25.27C25.1219 44.2906 24.9824 44.2275 24.8775 44.1226C24.7725 44.0176 24.7095 43.8781 24.7 43.73V42.21C24.7095 42.0619 24.7725 41.9224 24.8775 41.8174C24.9824 41.7125 25.1219 41.6494 25.27 41.64H27.83C27.9781 41.6306 28.1177 41.5675 28.2226 41.4626C28.3275 41.3576 28.3906 41.2181 28.4 41.07V38.22C28.4115 38.0726 28.4752 37.9342 28.5797 37.8297C28.6843 37.7252 28.8227 37.6615 28.97 37.65H30.59C30.7374 37.6615 30.8758 37.7252 30.9803 37.8297C31.0848 37.9342 31.1486 38.0726 31.16 38.22V41.07C31.1695 41.2181 31.2325 41.3576 31.3375 41.4626C31.4424 41.5675 31.5819 41.6306 31.73 41.64H34.58C34.7274 41.6515 34.8658 41.7152 34.9703 41.8197C35.0748 41.9242 35.1386 42.0626 35.15 42.21V43.73C35 44.11 34.77 44.3 34.48 44.3ZM50.48 48.48C45.92 50.86 41.36 47.48 41.84 42.97C41.9606 41.5181 42.6231 40.1648 43.6959 39.1791C44.7687 38.1934 46.1732 37.6475 47.63 37.65C48.4782 37.6819 49.31 37.8933 50.0705 38.2704C50.8309 38.6475 51.5027 39.1817 52.0414 39.8376C52.5801 40.4935 52.9735 41.2563 53.1957 42.0755C53.4178 42.8947 53.4636 43.7518 53.33 44.59C53.1955 45.4226 52.8627 46.2106 52.3597 46.8876C51.8567 47.5647 51.1983 48.1108 50.44 48.48H50.48Z"
fill="url(#paint1_linear_10717_30076)"
id="path6" />
<path
d="M47.5899 42.31C47.7871 42.3265 47.9856 42.3019 48.1728 42.2378C48.3599 42.1737 48.5318 42.0715 48.6774 41.9375C48.8231 41.8036 48.9393 41.6409 49.0188 41.4597C49.0984 41.2785 49.1394 41.0828 49.1394 40.885C49.1394 40.6871 49.0984 40.4914 49.0188 40.3102C48.9393 40.129 48.8231 39.9663 48.6774 39.8324C48.5318 39.6985 48.3599 39.5962 48.1728 39.5321C47.9856 39.468 47.7871 39.4434 47.5899 39.46C47.2326 39.4899 46.8996 39.653 46.6569 39.917C46.4141 40.1809 46.2794 40.5264 46.2794 40.885C46.2794 41.2435 46.4141 41.589 46.6569 41.853C46.8996 42.1169 47.2326 42.28 47.5899 42.31V42.31Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.24"
stroke-miterlimit="10"
id="path7"
style="stroke:#bf7fff;stroke-opacity:1;fill:#faf4ff;fill-opacity:1" />
<path
d="M50.35 45.06C50.7073 45.03 51.0404 44.8669 51.2831 44.603C51.5258 44.339 51.6605 43.9935 51.6605 43.635C51.6605 43.2764 51.5258 42.9309 51.2831 42.667C51.0404 42.403 50.7073 42.2399 50.35 42.21C50.1528 42.1934 49.9544 42.218 49.7672 42.2821C49.58 42.3462 49.4082 42.4485 49.2625 42.5824C49.1169 42.7163 49.0006 42.879 48.9211 43.0602C48.8416 43.2414 48.8005 43.4371 48.8005 43.635C48.8005 43.8328 48.8416 44.0285 48.9211 44.2097C49.0006 44.3909 49.1169 44.5536 49.2625 44.6875C49.4082 44.8215 49.58 44.9237 49.7672 44.9878C49.9544 45.0519 50.1528 45.0765 50.35 45.06V45.06Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.24"
stroke-miterlimit="10"
id="path8"
style="fill:#f9f4ff;fill-opacity:1;stroke:#bf7fff;stroke-opacity:1" />
<path
d="M44.84 45.06C45.1973 45.03 45.5304 44.8669 45.7731 44.603C46.0158 44.339 46.1505 43.9935 46.1505 43.635C46.1505 43.2764 46.0158 42.9309 45.7731 42.667C45.5304 42.403 45.1973 42.2399 44.84 42.21C44.6428 42.1934 44.4444 42.218 44.2572 42.2821C44.07 42.3462 43.8982 42.4485 43.7525 42.5824C43.6069 42.7163 43.4906 42.879 43.4111 43.0602C43.3316 43.2414 43.2905 43.4371 43.2905 43.635C43.2905 43.8328 43.3316 44.0285 43.4111 44.2097C43.4906 44.3909 43.6069 44.5536 43.7525 44.6875C43.8982 44.8215 44.07 44.9237 44.2572 44.9878C44.4444 45.0519 44.6428 45.0765 44.84 45.06V45.06Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.24"
stroke-miterlimit="10"
id="path9"
style="fill:#f9f4ff;fill-opacity:1;stroke:#bf7fff;stroke-opacity:1" />
<path
d="M47.59 47.53C47.8736 47.532 48.1515 47.4495 48.3882 47.2932C48.6249 47.1368 48.8097 46.9136 48.9192 46.6519C49.0286 46.3902 49.0578 46.1018 49.0029 45.8235C48.9481 45.5452 48.8117 45.2895 48.6111 45.0889C48.4105 44.8883 48.1548 44.7519 47.8765 44.697C47.5981 44.6422 47.3098 44.6713 47.0481 44.7808C46.7864 44.8903 46.5632 45.0751 46.4068 45.3118C46.2504 45.5485 46.168 45.8263 46.17 46.11C46.1801 46.4834 46.3329 46.8388 46.5971 47.1029C46.8612 47.3671 47.2165 47.5199 47.59 47.53V47.53Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.24"
stroke-miterlimit="10"
id="path10"
style="fill:#f9f4ff;fill-opacity:1;stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M34.4799 44.3H31.6299C31.4826 44.3115 31.3442 44.3752 31.2397 44.4797C31.1352 44.5843 31.0714 44.7227 31.0599 44.87V47.44C31.0505 47.5881 30.9874 47.7277 30.8825 47.8326C30.7776 47.9375 30.638 48.0006 30.49 48.01H29C28.8526 47.9985 28.7142 47.9348 28.6097 47.8303C28.5052 47.7258 28.4414 47.5874 28.43 47.44V44.87C28.4205 44.7219 28.3574 44.5824 28.2525 44.4775C28.1476 44.3725 28.008 44.3095 27.86 44.3H25.27C25.1219 44.2906 24.9823 44.2275 24.8774 44.1226C24.7725 44.0177 24.7094 43.8781 24.7 43.73V42.21C24.7094 42.0619 24.7725 41.9224 24.8774 41.8175C24.9823 41.7125 25.1219 41.6495 25.27 41.64H27.83C27.978 41.6306 28.1176 41.5675 28.2225 41.4626C28.3274 41.3577 28.3905 41.2181 28.4 41.07V38.22C28.4114 38.0727 28.4752 37.9343 28.5797 37.8297C28.6842 37.7252 28.8226 37.6615 28.9699 37.65H30.59C30.7373 37.6615 30.8757 37.7252 30.9802 37.8297C31.0847 37.9343 31.1485 38.0727 31.16 38.22V41.07C31.1694 41.2181 31.2325 41.3577 31.3374 41.4626C31.4423 41.5675 31.5819 41.6306 31.7299 41.64H34.58C34.7273 41.6515 34.8657 41.7152 34.9702 41.8197C35.0747 41.9243 35.1385 42.0627 35.15 42.21V43.73C35 44.11 34.7699 44.3 34.4799 44.3Z"
fill="#E5E5E5"
stroke="#BFBFBF"
stroke-width="0.24"
stroke-miterlimit="10"
id="path11"
style="fill:#f9f4ff;fill-opacity:1;stroke:#bf7fff;stroke-opacity:1" />
</g>
<defs
id="defs14">
<linearGradient
id="paint0_linear_10717_30076"
x1="31"
y1="7.00004"
x2="31"
y2="37"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#BEBEBE"
id="stop11"
offset="0"
style="stop-color:#be7dff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#6F6F6F"
id="stop12"
style="stop-color:#6f00de;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="paint1_linear_10717_30076"
x1="38.32"
y1="33.28"
x2="38.18"
y2="64.36"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#BFBFBF"
id="stop13"
offset="0"
style="stop-color:#bf7fff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#545454"
id="stop14"
style="stop-color:#5400a8;stop-opacity:1;" />
</linearGradient>
<clipPath
id="clip0_10717_30076">
<rect
width="54"
height="53.32"
fill="white"
transform="translate(4 7)"
id="rect14" />
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
version="1.1"
id="svg2"
sodipodi:docname="ComboInput_16.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs2" />
<sodipodi:namedview
id="namedview2"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="26.90625"
inkscape:cx="5.630662"
inkscape:cy="5.4819977"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
opacity="0.5"
fill-rule="evenodd"
clip-rule="evenodd"
d="M 13.1398,8 C 12.6898,6.73 11.73,4.51001 10.8,4.51001 c -1.40001,0 -1.39001,1.28003 -2.00001,1.28003 H 7.09003 c -0.57,0 -0.52017,-1.28003 -1.92017,-1.28003 -0.94,0 -1.90984,2.21999 -2.33984,3.48999 -0.8,2.37 -0.88017,3.51 0.82983,3.51 1.92,0 1.85006,-2.17003 4.31006,-2.17003 2.45999,0 2.45999,2.17003 4.25999,2.17003 1.8,0 1.7699,-1.12 0.9099,-3.51 z M 6.99994,8 h -1 v 1 h -1 V 8 h -1 V 7 h 1 V 6 h 1 v 1 h 1 z M 10.4999,9.25 C 10.1538,9.25 9.81556,9.14737 9.52777,8.95508 9.23999,8.76279 9.0157,8.48945 8.88324,8.16968 8.75079,7.84991 8.71611,7.49804 8.78363,7.15857 8.85116,6.8191 9.01765,6.50732 9.26239,6.26257 9.50713,6.01783 9.81917,5.85109 10.1586,5.78357 c 0.3395,-0.06752 0.6912,-0.03284 1.011,0.09961 0.3198,0.13245 0.5931,0.35674 0.7854,0.64453 0.1923,0.28779 0.2949,0.62617 0.2949,0.97229 0,0.46413 -0.1842,0.90924 -0.5124,1.23743 C 11.4093,9.06562 10.9641,9.25 10.4999,9.25 Z m 0,-2.25 c -0.0988,0 -0.1956,0.02929 -0.2778,0.08423 -0.0822,0.05494 -0.1462,0.13312 -0.1841,0.22449 -0.0378,0.09136 -0.04783,0.19182 -0.0285,0.28881 0.0193,0.09699 0.067,0.18606 0.1369,0.25599 0.07,0.06992 0.1589,0.11754 0.2559,0.13684 0.097,0.01929 0.1977,0.0094 0.289,-0.02845 C 10.7827,7.92407 10.8608,7.86006 10.9157,7.77783 10.9707,7.69561 10.9999,7.59889 10.9999,7.5 10.9999,7.36739 10.9472,7.24025 10.8535,7.14648 10.7597,7.05272 10.6325,7 10.4999,7 Z"
fill="white"
id="path1"
style="fill:#8000ff;fill-opacity:1"
sodipodi:nodetypes="csssscsssccccccccccccccscccccsssssssccccccscs" />
<path
d="M11.1416 2.67396C10.6352 2.66885 10.1366 2.80972 9.69638 3.08245C9.25615 3.35518 8.88989 3.75002 8.63484 4.22682H7.32798C7.0836 3.74077 6.72185 3.33694 6.28186 3.05907C5.84188 2.78121 5.34062 2.63994 4.83221 2.65058C3.10754 2.65058 1.89689 5.41779 1.17917 7.74131C0.461455 10.0648 0.215084 11.5244 0.922091 12.5986C1.18656 12.9499 1.52595 13.225 1.91067 13.4C2.29539 13.5751 2.71376 13.6447 3.12887 13.6027C3.68396 13.5906 4.2297 13.4439 4.72629 13.1733C5.22287 12.9026 5.65776 12.5148 5.99967 12.038C6.22774 11.6919 6.52878 11.4105 6.87736 11.2175C7.22595 11.0244 7.61201 10.9255 8.00298 10.9288C8.39896 10.9387 8.78728 11.0495 9.13697 11.2522C9.48666 11.455 9.7879 11.7441 10.0168 12.0964C10.3554 12.5582 10.7815 12.9349 11.2658 13.2009C11.7502 13.4669 12.2815 13.6158 12.8235 13.6376C13.2497 13.6813 13.6789 13.6093 14.0733 13.428C14.4677 13.2466 14.8149 12.9617 15.0836 12.5986C15.8013 11.431 15.5121 9.92475 14.8158 7.76469C13.1768 2.68562 11.6451 2.67396 11.1416 2.67396Z"
stroke="white"
id="path2"
style="stroke:#8000ff;stroke-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -1,129 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
fill="none"
version="1.1"
id="svg11"
sodipodi:docname="ComboInput_64.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview11"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="13.453125"
inkscape:cx="32"
inkscape:cy="32"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg11" />
<path
opacity="0.3"
fill-rule="evenodd"
clip-rule="evenodd"
d="M49 30.5C47.5 26.4 44.3 19 41.3 19C36.6 19 36.6 20.3 34.8 20.3C33.9 20.3 30.4 20.3 29.2 20.3C27.4 20.3 27.4 19 22.7 19C19.8 19 16.5 26.4 15 30.5C12.3 38.5 12.1 42 17.7 42C23.9 42 23.9 36.8 31.9 36.8C39.9 36.8 40.2 42 46.1 42C51.7 42 51.7 38.5 49 30.5ZM28.5 29.7H25.8C25.5 29.7 25.3 29.9 25.3 30.2V32.6C25.3 32.9 25.1 33.1 24.8 33.1H23.4C23.1 33.1 22.9 32.9 22.9 32.6V30.2C22.9 29.9 22.7 29.7 22.4 29.7H20C19.7 29.7 19.5 29.5 19.5 29.2V27.8C19.5 27.5 19.7 27.3 20 27.3H22.4C22.7 27.3 22.9 27.1 22.9 26.8V24.1C22.9 23.8 23.1 23.6 23.4 23.6H24.8C25.1 23.6 25.3 23.8 25.3 24.1V26.8C25.3 27.1 25.5 27.3 25.8 27.3H28.5C28.8 27.3 29 27.5 29 27.8V29.2C29 29.5 28.7 29.7 28.5 29.7ZM43.6 33.6C39.3 35.9 35 32.6 35.5 28.4C35.8 25.6 38.1 23.3 41 23.4C44.1 23.5 46.9 26.3 46.3 29.9C46 31.6 45 32.9 43.6 33.6Z"
fill="black"
stroke="black"
stroke-width="4"
stroke-miterlimit="10"
id="path1" />
<path
d="M41.9001 33.5C45.3001 33.5 48 30.8001 48 27.4001C48 24.0001 45.3001 21.3 41.9001 21.3C38.5001 21.3 35.8 24.0001 35.8 27.4001C35.8 30.8001 38.5001 33.5 41.9001 33.5Z"
fill="#7F7F7F"
id="path2"
style="fill:#7f00fe;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M50.9 29.2C49.3 24.6 45.6 16.4 42.4 16.4C37.1 16.4 37.1 17.8 35.2 17.8C34.2 17.8 30.3 17.8 29 17.8C27 17.8 27 16.4 21.8 16.4C18.5 16.4 14.9 24.6 13.3 29.2C10.3 38.1 9.99998 42 16.3 42C23.2 42 23.2 36.2 32.1 36.2C41 36.2 41.1 42 47.7 42C53.9 42 53.9 38.1 50.9 29.2ZM28.1 28.3H25.1C24.8 28.3 24.5 28.6 24.5 28.9V31.6C24.5 31.9 24.2 32.2 23.9 32.2H22.3C22 32.2 21.7 31.9 21.7 31.6V28.9C21.7 28.6 21.4 28.3 21.1 28.3H18.4C18.1 28.3 17.8 28 17.8 27.7V26.1C17.8 25.8 18.1 25.5 18.4 25.5H21.1C21.4 25.5 21.7 25.2 21.7 24.9V21.9C21.7 21.6 22 21.3 22.3 21.3H24C24.3 21.3 24.6 21.6 24.6 21.9V24.9C24.6 25.2 24.9 25.5 25.2 25.5H28.2C28.5 25.5 28.8 25.8 28.8 26.1V27.7C28.6 28.1 28.4 28.3 28.1 28.3ZM44.9 32.7C40.1 35.2 35.3 31.6 35.8 26.9C36.1 23.8 38.7 21.2 41.9 21.3C45.4 21.4 48.5 24.5 47.9 28.6C47.6 30.4 46.5 31.9 44.9 32.7Z"
fill="url(#paint0_linear_11318_30131)"
id="path3" />
<path
d="M54.4489 27.9886L54.449 27.9885L54.4466 27.9818L54.4419 27.9682L54.4418 27.9681C53.5929 25.5273 52.1761 22.0893 50.4925 19.1913C49.6582 17.7552 48.6653 16.2881 47.5345 15.1316C46.5181 14.092 44.7597 12.65 42.4 12.65C39.3793 12.65 37.579 13.0554 36.1658 13.605C35.5933 13.8277 35.2876 13.9596 35.1161 14.0404C35.1091 14.0437 35.1024 14.0469 35.0958 14.05H29.0343C29.0154 14.0413 28.994 14.0316 28.9699 14.0207C28.7976 13.9431 28.5026 13.8163 27.9592 13.605C26.5576 13.06 24.7856 12.65 21.8 12.65C19.4415 12.65 17.6769 14.06 16.6307 15.124C15.4863 16.2879 14.4926 17.7635 13.6633 19.2029C11.9896 22.1075 10.6 25.5477 9.75812 27.9681L9.75811 27.9681L9.75337 27.9817L9.75334 27.9817L9.75104 27.9885L9.74643 28.0022L10.4571 28.2418L9.74643 28.0022C8.98454 30.2625 8.34952 32.333 7.95275 34.1581C7.56718 35.9318 7.32972 37.7991 7.61055 39.536C7.9204 41.4526 8.88208 43.2603 10.7701 44.4354C12.4491 45.4803 14.4377 45.75 16.3 45.75C20.7888 45.75 23.3789 43.8244 25.2657 42.4216L25.2755 42.4143L24.8281 41.8125L25.2755 42.4143C25.4111 42.3136 25.5416 42.2166 25.6692 42.1228C26.6002 41.4393 27.3378 40.9488 28.2396 40.5881C29.1146 40.2381 30.3053 39.95 32.1 39.95C33.8953 39.95 35.0939 40.2383 35.9755 40.5897C36.8806 40.9505 37.6214 41.4418 38.5341 42.1161C38.6769 42.2216 38.8237 42.332 38.9777 42.4478L38.9906 42.4574C40.8141 43.8284 43.3701 45.75 47.7 45.75C49.555 45.75 51.5208 45.4743 53.1944 44.4505C55.0542 43.3127 56.0659 41.5588 56.433 39.6432C56.7676 37.8967 56.5757 36.0159 56.214 34.2159C55.8427 32.3684 55.2219 30.2817 54.4535 28.0022C54.4535 28.0022 54.4535 28.0022 54.4535 28.0022L54.4489 27.9886ZM29.1279 14.0932C29.1385 14.0974 29.1397 14.0985 29.1286 14.0935C29.1284 14.0934 29.1281 14.0933 29.1279 14.0932Z"
stroke="#636363"
stroke-width="1.5"
id="path4"
style="stroke:#6300c6;stroke-opacity:1" />
<path
d="M6.66671 26.9641L7.61283 27.283L6.66671 26.9641C5.89443 29.2552 5.21287 31.4625 4.77695 33.4677C4.36148 35.3788 4.02444 37.7181 4.40223 40.0548C4.83341 42.7217 6.22696 45.4359 9.05289 47.1946C11.484 48.7076 14.1882 49 16.3 49C21.8651 49 25.1753 46.5388 27.1715 45.0546L27.1801 45.0482L27.2146 45.0225C27.3517 44.9206 27.4742 44.8296 27.5926 44.7426C28.4775 44.093 28.9431 43.807 29.4466 43.6056C29.902 43.4235 30.6785 43.2 32.1 43.2C33.5227 43.2 34.3085 43.4239 34.772 43.6087C35.278 43.8104 35.7471 44.0978 36.6028 44.73L37.197 43.9257L36.6028 44.73C36.7328 44.8261 36.8685 44.9281 37.0247 45.0455L37.0692 45.079L37.0803 45.0873C39.0007 46.5313 42.2837 49 47.7 49C49.8195 49 52.4814 48.6965 54.8904 47.2229C57.6507 45.5343 59.114 42.9212 59.6249 40.2549C60.0761 37.9001 59.7942 35.5356 59.4003 33.5755C58.9889 31.5287 58.3176 29.291 57.5333 26.9641L57.5242 26.9372L57.5243 26.9372L57.5211 26.928L57.5115 26.9004L57.5115 26.9004C56.62 24.3375 55.1238 20.6934 53.3027 17.5587C52.4059 16.0151 51.2566 14.2897 49.8584 12.8595C48.6765 11.6507 46.1139 9.40002 42.4 9.40002C39.0581 9.40002 36.846 9.85337 34.9879 10.576C34.7737 10.6593 34.5874 10.7335 34.4243 10.8H29.7007C29.5415 10.7351 29.3557 10.661 29.1371 10.576L28.7772 11.5016L29.1371 10.576C27.3008 9.86185 25.1197 9.40002 21.8 9.40002C18.1095 9.40002 15.5462 11.5916 14.3134 12.8453C12.8936 14.2892 11.7403 16.0305 10.8473 17.5803C9.03403 20.7273 7.56669 24.3756 6.68852 26.9004L6.68851 26.9004L6.67902 26.9277L6.67898 26.9277L6.67592 26.9367L6.66671 26.9641Z"
stroke="#A5A5A5"
stroke-width="2"
id="path5"
style="stroke:#a54bff;stroke-opacity:1" />
<path
d="M41.9 26.2C42.7 26.2 43.4 25.5 43.4 24.7C43.4 23.9 42.7 23.2 41.9 23.2C41.1 23.2 40.4 23.9 40.4 24.7C40.4 25.5 41.1 26.2 41.9 26.2Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path6"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M44.8 29.1C45.6 29.1 46.3 28.4 46.3 27.6C46.3 26.8 45.6 26.1 44.8 26.1C44 26.1 43.3 26.8 43.3 27.6C43.3 28.4 44 29.1 44.8 29.1Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path7"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M39 29.1C39.8 29.1 40.5 28.4 40.5 27.6C40.5 26.8 39.8 26.1 39 26.1C38.2 26.1 37.5 26.8 37.5 27.6C37.5 28.4 38.2 29.1 39 29.1Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path8"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M41.9 31.7C42.7 31.7 43.4 31 43.4 30.2C43.4 29.4 42.7 28.7 41.9 28.7C41.1 28.7 40.4 29.4 40.4 30.2C40.4 31 41.1 31.7 41.9 31.7Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path9"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M28.1 28.3H25.1C24.8 28.3 24.5 28.6001 24.5 28.9001V31.6C24.5 31.9 24.2 32.2001 23.9 32.2001H22.3C22 32.2001 21.7001 31.9 21.7001 31.6V28.9001C21.7001 28.6001 21.4 28.3 21.1 28.3H18.4C18.1 28.3 17.8 28.0001 17.8 27.7001V26.1C17.8 25.8 18.1 25.5 18.4 25.5H21.1C21.4 25.5 21.7001 25.2001 21.7001 24.9001V21.9C21.7001 21.6 22 21.3 22.3 21.3H24C24.3 21.3 24.6 21.6 24.6 21.9V24.9001C24.6 25.2001 24.9001 25.5 25.2001 25.5H28.2001C28.5001 25.5 28.8 25.8 28.8 26.1V27.7001C28.6 28.1001 28.4001 28.3 28.1 28.3Z"
fill="#E5E5E5"
stroke="#BFBFBF"
stroke-width="0.25"
stroke-miterlimit="10"
id="path10"
style="fill:#e5cbff;fill-opacity:1;stroke:#bf7fff;stroke-opacity:1" />
<defs
id="defs11">
<linearGradient
id="paint0_linear_11318_30131"
x1="32.1444"
y1="16.6896"
x2="31.9936"
y2="49.413"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#BFBFBF"
id="stop10"
offset="0"
style="stop-color:#bf7fff;stop-opacity:1;" />
<stop
offset="1"
stop-color="#545454"
id="stop11"
style="stop-color:#5400a8;stop-opacity:1;" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 9.0 KiB

View File

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
version="1.1"
id="svg4"
sodipodi:docname="ComboSequenceNode_16.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="53.8125"
inkscape:cx="8"
inkscape:cy="8"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
clip-path="url(#clip0_10717_30146)"
id="g4">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M15.4199 3.67993C14.9499 2.33993 13.9399 0 12.9499 0C11.4799 0 11.4799 1.34985 10.8799 1.34985H9.07006C8.47006 1.34985 8.52006 0 7.07006 0C6.07006 0 5.0701 2.33993 4.6101 3.67993C3.7701 6.17993 3.67997 7.37988 5.47997 7.37988C7.47997 7.37988 7.48002 5.08984 10.03 5.08984C12.58 5.08984 12.62 7.37988 14.53 7.37988C16.44 7.37988 16.3099 6.19993 15.4199 3.67993ZM8.99999 3.67993H7.99999V4.67993H6.99999V3.67993H5.99999V2.67993H6.99999V1.67993H7.99999V2.67993H8.99999V3.67993ZM12.5 4.92993C12.1539 4.92993 11.8156 4.8273 11.5278 4.63501C11.24 4.44272 11.0157 4.16938 10.8833 3.84961C10.7508 3.52984 10.7162 3.17809 10.7837 2.83862C10.8512 2.49916 11.0177 2.18712 11.2624 1.94238C11.5072 1.69764 11.8192 1.53115 12.1587 1.46362C12.4981 1.3961 12.8499 1.43078 13.1697 1.56323C13.4894 1.69569 13.7628 1.91998 13.9551 2.20776C14.1474 2.49555 14.25 2.83381 14.25 3.17993C14.25 3.64406 14.0657 4.08929 13.7375 4.41748C13.4093 4.74567 12.9641 4.92993 12.5 4.92993V4.92993ZM12.5 2.67993C12.4011 2.67993 12.3044 2.70922 12.2222 2.76416C12.1399 2.8191 12.0759 2.89716 12.0381 2.98853C12.0002 3.07989 11.9902 3.1806 12.0095 3.27759C12.0288 3.37458 12.0765 3.46352 12.1465 3.53345C12.2164 3.60337 12.3053 3.65112 12.4023 3.67041C12.4993 3.6897 12.6 3.67969 12.6914 3.64185C12.7828 3.604 12.8608 3.53999 12.9158 3.45776C12.9707 3.37554 13 3.27882 13 3.17993C13 3.04732 12.9473 2.92018 12.8535 2.82642C12.7597 2.73265 12.6326 2.67993 12.5 2.67993Z"
fill="white"
id="path1"
style="fill:#8000ff;fill-opacity:1" />
<path
d="M5.44999 11.3699C7.44999 11.3699 7.45004 9.07985 10 9.07985C12.55 9.07985 12.59 11.3699 14.5 11.3699C16.05 11.3699 16.26 10.4999 15.74 8.66994C15.3401 8.80265 14.9214 8.87013 14.5 8.86989C14.1161 8.87192 13.7345 8.81119 13.3702 8.68996C13.1067 8.84597 12.8062 8.92881 12.5 8.92995C12.0359 8.92995 11.5907 8.74568 11.2625 8.41749C10.9343 8.08931 10.75 7.64407 10.75 7.17995C10.7513 7.04184 10.7681 6.90439 10.8001 6.77003C10.5567 6.63241 10.2793 6.56635 10 6.57985C9.63904 6.56256 9.28394 6.67626 9.00004 6.89992V7.67995H8.17997C8.12493 7.74164 8.06478 7.79844 8.00004 7.84987V8.67995H7.00004V8.53004C6.51565 8.75888 5.98569 8.87496 5.44999 8.86989C5.04562 8.87183 4.64371 8.80771 4.26005 8.67995C3.76005 10.4899 3.90999 11.3699 5.44999 11.3699Z"
fill="white"
id="path2"
style="fill:#8000ff;fill-opacity:1" />
<path
d="M5.44999 15.3699C7.44999 15.3699 7.45004 13.0798 10 13.0798C12.55 13.0798 12.59 15.3699 14.5 15.3699C16.05 15.3699 16.26 14.4999 15.74 12.6699C15.3401 12.8026 14.9214 12.8701 14.5 12.8699C14.1161 12.8719 13.7345 12.8112 13.3702 12.69C13.1067 12.846 12.8062 12.9288 12.5 12.9299C12.0359 12.9299 11.5907 12.7457 11.2625 12.4175C10.9343 12.0893 10.75 11.6441 10.75 11.1799C10.7513 11.0418 10.7681 10.9044 10.8001 10.77C10.5567 10.6324 10.2793 10.5663 10 10.5798C9.63904 10.5626 9.28394 10.6763 9.00004 10.8999V11.6799H8.17997C8.12493 11.7416 8.06478 11.7984 8.00004 11.8499V12.6799H7.00004V12.53C6.51565 12.7589 5.98569 12.875 5.44999 12.8699C5.04562 12.8718 4.64371 12.8077 4.26005 12.6799C3.76005 14.4899 3.90999 15.3699 5.44999 15.3699Z"
fill="white"
id="path3"
style="fill:#8000ff;fill-opacity:1" />
<path
opacity="0.5"
d="M0 13.6799H3V12.6799H1V8.67993H3V7.67993H1V3.67993H3V2.67993H0V13.6799Z"
fill="white"
id="path4"
style="fill:#8000ff;fill-opacity:1" />
</g>
<defs
id="defs4">
<clipPath
id="clip0_10717_30146">
<rect
width="16"
height="16"
fill="white"
id="rect4" />
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -1,331 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
fill="none"
version="1.1"
id="svg36"
sodipodi:docname="ComboSequenceNode_64.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview36"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="13.453125"
inkscape:cx="32"
inkscape:cy="32"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg36" />
<g
clip-path="url(#clip0_10717_29985)"
id="g31">
<g
opacity="0.2"
id="g1">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M25.9 62C31.55 62 31.55 57.25 38.9 57.25C46.25 57.25 46.22 62 51.63 62C56.71 62 56.71 58.8 54.25 51.51C54.07 50.98 53.85 50.39 53.6 49.76C53.0346 49.9058 52.4538 49.9831 51.87 49.99V49.99C51.8698 50.8315 51.6602 51.6597 51.26 52.4C50.8575 53.1391 50.275 53.7646 49.5664 54.2187C48.8579 54.6727 48.0462 54.9406 47.2065 54.9974C46.3669 55.0543 45.5265 54.8982 44.7632 54.5438C43.9999 54.1894 43.3384 53.6481 42.84 52.97C42.3493 52.2894 42.0302 51.5004 41.91 50.67C41.7986 49.8356 41.8997 48.9866 42.2039 48.2017C42.508 47.4168 43.0054 46.7214 43.65 46.18C42.1448 45.4816 40.4988 45.1394 38.84 45.18C36.6528 45.1257 34.5043 45.7626 32.7 47V48C32.7148 48.1248 32.7712 48.241 32.8601 48.3299C32.949 48.4188 33.0652 48.4752 33.19 48.49H35.65C35.7784 48.4949 35.9001 48.5481 35.991 48.639C36.0818 48.7298 36.135 48.8516 36.14 48.98V50.29C35.98 50.62 35.81 50.78 35.57 50.78H33.11C32.9816 50.7849 32.8598 50.8381 32.769 50.929C32.6781 51.0198 32.6249 51.1416 32.62 51.27V53.49C32.6051 53.6148 32.5487 53.731 32.4599 53.8199C32.371 53.9088 32.2548 53.9652 32.13 53.98H30.81C30.6852 53.9652 30.569 53.9088 30.4801 53.8199C30.3912 53.731 30.3348 53.6148 30.32 53.49V51.24C30.315 51.1116 30.2618 50.9898 30.171 50.899C30.0801 50.8081 29.9583 50.7549 29.83 50.75H27.62C27.4916 50.745 27.3698 50.6918 27.279 50.601C27.1881 50.5102 27.1349 50.3884 27.13 50.26V49.89C26.7226 49.9514 26.3118 49.9882 25.9 50C25.2847 50.0072 24.6706 49.9435 24.07 49.81C23.83 50.41 23.62 50.99 23.44 51.51C21 58.78 20.73 62 25.9 62Z"
fill="black"
id="path1" />
</g>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M25.9 58C31.55 58 31.55 53.25 38.9 53.25C46.25 53.25 46.22 58 51.63 58C56.71 58 56.71 54.8 54.25 47.51C54.07 46.98 53.85 46.39 53.6 45.76C53.0346 45.9058 52.4538 45.9831 51.87 45.99V45.99C51.8698 46.8315 51.6602 47.6597 51.26 48.4C50.8575 49.1391 50.275 49.7646 49.5664 50.2187C48.8579 50.6727 48.0462 50.9406 47.2065 50.9974C46.3669 51.0543 45.5265 50.8982 44.7632 50.5438C43.9999 50.1894 43.3384 49.6481 42.84 48.97C42.3493 48.2894 42.0302 47.5004 41.91 46.67C41.7986 45.8356 41.8997 44.9866 42.2039 44.2017C42.508 43.4168 43.0054 42.7214 43.65 42.18C42.1448 41.4816 40.4988 41.1394 38.84 41.18C36.6528 41.1257 34.5043 41.7626 32.7 43V44C32.7148 44.1248 32.7712 44.241 32.8601 44.3299C32.949 44.4188 33.0652 44.4752 33.19 44.49H35.65C35.7784 44.4949 35.9001 44.5481 35.991 44.639C36.0818 44.7298 36.135 44.8516 36.14 44.98V46.29C35.98 46.62 35.81 46.78 35.57 46.78H33.11C32.9816 46.7849 32.8598 46.8381 32.769 46.929C32.6781 47.0198 32.6249 47.1416 32.62 47.27V49.49C32.6051 49.6148 32.5487 49.731 32.4599 49.8199C32.371 49.9088 32.2548 49.9652 32.13 49.98H30.81C30.6852 49.9652 30.569 49.9088 30.4801 49.8199C30.3912 49.731 30.3348 49.6148 30.32 49.49V47.24C30.315 47.1116 30.2618 46.9898 30.171 46.899C30.0801 46.8081 29.9583 46.7549 29.83 46.75H27.62C27.4916 46.745 27.3698 46.6918 27.279 46.601C27.1881 46.5102 27.1349 46.3884 27.13 46.26V45.89C26.7226 45.9514 26.3118 45.9882 25.9 46C25.2847 46.0072 24.6706 45.9435 24.07 45.81C23.83 46.41 23.62 46.99 23.44 47.51C21 54.78 20.73 58 25.9 58Z"
fill="url(#paint0_linear_10717_29985)"
id="path2" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M46.88 51C48.2061 51 49.4779 50.4732 50.4156 49.5355C51.3533 48.5978 51.88 47.3261 51.88 46H51.64C47.8 46 46.64 43.61 43.64 42.22C42.8719 42.8843 42.3243 43.7668 42.07 44.75C41.8114 45.7417 41.8638 46.789 42.22 47.75C42.5752 48.7006 43.2112 49.5206 44.0436 50.1011C44.876 50.6816 45.8653 50.9951 46.88 51V51Z"
fill="#7F7F7F"
id="path3"
style="fill:#7f00fe;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M45.72 43.4399C45.6823 43.5567 45.6588 43.6776 45.65 43.7999C45.666 44.1179 45.8018 44.418 46.03 44.6399C46.2593 44.8607 46.562 44.9889 46.88 44.9999C47.1349 44.9892 47.3799 44.8982 47.58 44.7399"
fill="white"
id="path4" />
<path
d="M45.72 43.4399C45.6823 43.5567 45.6588 43.6776 45.65 43.7999C45.666 44.1179 45.8018 44.418 46.03 44.6399C46.2593 44.8607 46.562 44.9889 46.88 44.9999C47.1349 44.9892 47.3799 44.8982 47.58 44.7399"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path5"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M48.46 45.27C48.3269 45.3837 48.218 45.5232 48.14 45.68C48.0685 45.8457 48.0347 46.0252 48.0409 46.2055C48.0471 46.3859 48.0933 46.5626 48.176 46.723C48.2588 46.8833 48.3761 47.0233 48.5195 47.1329C48.6628 47.2425 48.8288 47.3189 49.0052 47.3566C49.1817 47.3943 49.3643 47.3924 49.54 47.351C49.7156 47.3096 49.8799 47.2297 50.021 47.1172C50.1621 47.0047 50.2764 46.8622 50.3558 46.7002C50.4352 46.5381 50.4776 46.3605 50.48 46.18C50.4795 46.0771 50.4592 45.9752 50.42 45.88"
fill="white"
id="path6" />
<path
d="M48.46 45.27C48.3269 45.3837 48.218 45.5232 48.14 45.68C48.0685 45.8457 48.0347 46.0252 48.0409 46.2055C48.0471 46.3859 48.0933 46.5626 48.176 46.723C48.2588 46.8833 48.3761 47.0233 48.5195 47.1329C48.6628 47.2425 48.8288 47.3189 49.0052 47.3566C49.1817 47.3943 49.3643 47.3924 49.54 47.351C49.7156 47.3096 49.8799 47.2297 50.021 47.1172C50.1621 47.0047 50.2764 46.8622 50.3558 46.7002C50.4352 46.5381 50.4776 46.3605 50.48 46.18C50.4795 46.0771 50.4592 45.9752 50.42 45.88"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path7"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M27.62 46.75H29.83C29.9584 46.7549 30.0802 46.8082 30.171 46.899C30.2619 46.9898 30.3151 47.1116 30.32 47.24V49.46C30.3348 49.5848 30.3912 49.701 30.4801 49.7899C30.569 49.8788 30.6852 49.9352 30.81 49.95H32.13C32.2548 49.9352 32.371 49.8788 32.4599 49.7899C32.5488 49.701 32.6052 49.5848 32.62 49.46V47.24C32.6249 47.1116 32.6782 46.9898 32.769 46.899C32.8598 46.8082 32.9816 46.7549 33.11 46.75H35.57C35.81 46.75 35.98 46.59 36.14 46.26V45C36.1351 44.8716 36.0819 44.7498 35.991 44.659C35.9002 44.5682 35.7784 44.5149 35.65 44.51H33.19C33.0612 44.4991 32.9405 44.4423 32.85 44.35C32.762 44.2535 32.7092 44.1302 32.7 44V43C31.7 43.63 30.92 44.33 29.99 44.89C29.1163 45.4181 28.1424 45.7586 27.13 45.89V46.26C27.1349 46.3884 27.1882 46.5102 27.279 46.601C27.3698 46.6918 27.4916 46.7451 27.62 46.75Z"
fill="#E5E5E5"
id="path8"
style="fill:#e5cbff;fill-opacity:1" />
<path
d="M27.13 45.89V46.26C27.1349 46.3884 27.1882 46.5102 27.279 46.601C27.3698 46.6918 27.4916 46.7451 27.62 46.75H29.83C29.9584 46.7549 30.0802 46.8082 30.171 46.899C30.2619 46.9898 30.3151 47.1116 30.32 47.24V49.46C30.3348 49.5848 30.3912 49.701 30.4801 49.7899C30.569 49.8788 30.6852 49.9352 30.81 49.95H32.13C32.2548 49.9352 32.371 49.8788 32.4599 49.7899C32.5488 49.701 32.6052 49.5848 32.62 49.46V47.24C32.6249 47.1116 32.6782 46.9898 32.769 46.899C32.8598 46.8082 32.9816 46.7549 33.11 46.75H35.57C35.81 46.75 35.98 46.59 36.14 46.26V45C36.1351 44.8716 36.0819 44.7498 35.991 44.659C35.9002 44.5682 35.7784 44.5149 35.65 44.51H33.19C33.0612 44.4991 32.9405 44.4423 32.85 44.35C32.762 44.2535 32.7092 44.1302 32.7 44V43"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path9"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M44.5 47.41C44.7431 47.4068 44.98 47.3334 45.1823 47.1985C45.3846 47.0636 45.5435 46.8732 45.64 46.65C45.728 46.4243 45.7523 46.1786 45.71 45.94C45.6638 45.6918 45.5435 45.4635 45.365 45.285C45.1865 45.1065 44.9582 44.9862 44.71 44.94C44.4723 44.8945 44.2267 44.9153 44 45C43.7768 45.0965 43.5863 45.2554 43.4515 45.4577C43.3166 45.66 43.2432 45.8969 43.24 46.14C43.2476 46.4638 43.3796 46.7723 43.6087 47.0013C43.8377 47.2303 44.1462 47.3624 44.47 47.37L44.5 47.41Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path10"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M46.8801 49.54C47.1646 49.5398 47.4403 49.4411 47.6602 49.2604C47.8801 49.0798 48.0306 48.8286 48.086 48.5494C48.1414 48.2703 48.0983 47.9806 47.9641 47.7297C47.8298 47.4788 47.6128 47.2822 47.3498 47.1734C47.0869 47.0646 46.7944 47.0503 46.5221 47.133C46.2498 47.2157 46.0146 47.3903 45.8566 47.6269C45.6986 47.8636 45.6275 48.1477 45.6555 48.4309C45.6835 48.7141 45.8088 48.9788 46.0101 49.18C46.1243 49.2942 46.26 49.3847 46.4092 49.4465C46.5585 49.5083 46.7185 49.54 46.8801 49.54Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path11"
style="stroke:#bf7fff;stroke-opacity:1" />
<g
opacity="0.2"
id="g12">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M25.9 46C31.55 46 31.55 41.25 38.9 41.25C46.25 41.25 46.22 46 51.63 46C56.71 46 56.71 42.8 54.25 35.51C54.07 34.98 53.85 34.39 53.6 33.76C53.0346 33.9058 52.4538 33.9831 51.87 33.99C51.8698 34.8315 51.6602 35.6597 51.26 36.4C50.8575 37.1391 50.275 37.7646 49.5664 38.2187C48.8579 38.6727 48.0462 38.9406 47.2065 38.9974C46.3669 39.0543 45.5265 38.8982 44.7632 38.5438C43.9999 38.1894 43.3384 37.6481 42.84 36.97C42.3493 36.2894 42.0302 35.5004 41.91 34.67C41.7986 33.8356 41.8997 32.9866 42.2039 32.2017C42.508 31.4168 43.0054 30.7214 43.65 30.18C42.1448 29.4816 40.4988 29.1394 38.84 29.18C36.6528 29.1257 34.5043 29.7626 32.7 31V32C32.7148 32.1248 32.7712 32.241 32.8601 32.3299C32.949 32.4188 33.0652 32.4752 33.19 32.49H35.65C35.7784 32.4949 35.9001 32.5481 35.991 32.639C36.0818 32.7298 36.135 32.8516 36.14 32.98V34.29C35.98 34.62 35.81 34.78 35.57 34.78H33.11C32.9816 34.7849 32.8598 34.8381 32.769 34.929C32.6781 35.0198 32.6249 35.1416 32.62 35.27V37.49C32.6051 37.6148 32.5487 37.731 32.4599 37.8199C32.371 37.9088 32.2548 37.9652 32.13 37.98H30.81C30.6852 37.9652 30.569 37.9088 30.4801 37.8199C30.3912 37.731 30.3348 37.6148 30.32 37.49V35.24C30.315 35.1116 30.2618 34.9898 30.171 34.899C30.0801 34.8081 29.9583 34.7549 29.83 34.75H27.62C27.4916 34.745 27.3698 34.6918 27.279 34.601C27.1881 34.5102 27.1349 34.3884 27.13 34.26V33.89C26.7226 33.9514 26.3118 33.9882 25.9 34C25.2847 34.0072 24.6706 33.9435 24.07 33.81C23.83 34.41 23.62 34.99 23.44 35.51C21 42.78 20.73 46 25.9 46Z"
fill="black"
id="path12" />
</g>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M25.9 42C31.55 42 31.55 37.25 38.9 37.25C46.25 37.25 46.22 42 51.63 42C56.71 42 56.71 38.8 54.25 31.51C54.07 30.98 53.85 30.39 53.6 29.76C53.0346 29.9058 52.4538 29.9831 51.87 29.99V29.99C51.8698 30.8315 51.6602 31.6597 51.26 32.4C50.8575 33.1391 50.275 33.7646 49.5664 34.2187C48.8579 34.6727 48.0462 34.9406 47.2065 34.9974C46.3669 35.0543 45.5265 34.8982 44.7632 34.5438C43.9999 34.1894 43.3384 33.6481 42.84 32.97C42.3493 32.2894 42.0302 31.5004 41.91 30.67C41.7986 29.8356 41.8997 28.9866 42.2039 28.2017C42.508 27.4168 43.0054 26.7214 43.65 26.18C42.1448 25.4816 40.4988 25.1394 38.84 25.18C36.6528 25.1257 34.5043 25.7626 32.7 27V28C32.7148 28.1248 32.7712 28.241 32.8601 28.3299C32.949 28.4188 33.0652 28.4752 33.19 28.49H35.65C35.7784 28.4949 35.9001 28.5481 35.991 28.639C36.0818 28.7298 36.135 28.8516 36.14 28.98V30.29C35.98 30.62 35.81 30.78 35.57 30.78H33.11C32.9816 30.7849 32.8598 30.8381 32.769 30.929C32.6781 31.0198 32.6249 31.1416 32.62 31.27V33.49C32.6051 33.6148 32.5487 33.731 32.4599 33.8199C32.371 33.9088 32.2548 33.9652 32.13 33.98H30.81C30.6852 33.9652 30.569 33.9088 30.4801 33.8199C30.3912 33.731 30.3348 33.6148 30.32 33.49V31.24C30.315 31.1116 30.2618 30.9898 30.171 30.899C30.0801 30.8081 29.9583 30.7549 29.83 30.75H27.62C27.4916 30.745 27.3698 30.6918 27.279 30.601C27.1881 30.5102 27.1349 30.3884 27.13 30.26V29.89C26.7226 29.9514 26.3118 29.9882 25.9 30C25.2847 30.0072 24.6706 29.9435 24.07 29.81C23.83 30.41 23.62 30.99 23.44 31.51C21 38.78 20.73 42 25.9 42Z"
fill="url(#paint1_linear_10717_29985)"
id="path13" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M46.88 35C48.2061 35 49.4778 34.4732 50.4155 33.5355C51.3532 32.5978 51.88 31.3261 51.88 30H51.64C47.8 30 46.64 27.61 43.64 26.22C42.8719 26.8843 42.3242 27.7668 42.07 28.75C41.8194 29.7378 41.8767 30.7786 42.2341 31.733C42.5916 32.6874 43.2321 33.5098 44.07 34.09C44.8936 34.6694 45.8731 34.9865 46.88 35V35Z"
fill="#7F7F7F"
id="path14"
style="fill:#7f00fe;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M45.72 27.4399C45.6823 27.5567 45.6588 27.6776 45.65 27.7999C45.666 28.1179 45.8018 28.418 46.03 28.6399C46.2593 28.8607 46.562 28.9889 46.88 28.9999C47.1349 28.9892 47.3799 28.8982 47.58 28.7399"
fill="white"
id="path15" />
<path
d="M45.72 27.4399C45.6823 27.5567 45.6588 27.6776 45.65 27.7999C45.666 28.1179 45.8018 28.418 46.03 28.6399C46.2593 28.8607 46.562 28.9889 46.88 28.9999C47.1349 28.9892 47.3799 28.8982 47.58 28.7399"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path16"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M48.46 29.27C48.3269 29.3837 48.218 29.5232 48.14 29.68C48.0685 29.8457 48.0347 30.0252 48.0409 30.2055C48.0471 30.3859 48.0933 30.5626 48.176 30.723C48.2588 30.8833 48.3761 31.0233 48.5195 31.1329C48.6628 31.2425 48.8288 31.3189 49.0052 31.3566C49.1817 31.3943 49.3643 31.3924 49.54 31.351C49.7156 31.3096 49.8799 31.2297 50.021 31.1172C50.1621 31.0047 50.2764 30.8622 50.3558 30.7002C50.4352 30.5381 50.4776 30.3605 50.48 30.18C50.4795 30.0771 50.4592 29.9752 50.42 29.88"
fill="white"
id="path17" />
<path
d="M48.46 29.27C48.3269 29.3837 48.218 29.5232 48.14 29.68C48.0685 29.8457 48.0347 30.0252 48.0409 30.2055C48.0471 30.3859 48.0933 30.5626 48.176 30.723C48.2588 30.8833 48.3761 31.0233 48.5195 31.1329C48.6628 31.2425 48.8288 31.3189 49.0052 31.3566C49.1817 31.3943 49.3643 31.3924 49.54 31.351C49.7156 31.3096 49.8799 31.2297 50.021 31.1172C50.1621 31.0047 50.2764 30.8622 50.3558 30.7002C50.4352 30.5381 50.4776 30.3605 50.48 30.18C50.4795 30.0771 50.4592 29.9752 50.42 29.88"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path18"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M27.62 30.75H29.83C29.9584 30.7549 30.0802 30.8082 30.171 30.899C30.2619 30.9898 30.3151 31.1116 30.32 31.24V33.46C30.3348 33.5848 30.3912 33.701 30.4801 33.7899C30.569 33.8788 30.6852 33.9352 30.81 33.95H32.13C32.2548 33.9352 32.371 33.8788 32.4599 33.7899C32.5488 33.701 32.6052 33.5848 32.62 33.46V31.24C32.6249 31.1116 32.6782 30.9898 32.769 30.899C32.8598 30.8082 32.9816 30.7549 33.11 30.75H35.57C35.81 30.75 35.98 30.59 36.14 30.26V29C36.1351 28.8716 36.0819 28.7498 35.991 28.659C35.9002 28.5682 35.7784 28.5149 35.65 28.51H33.19C33.0612 28.4991 32.9405 28.4423 32.85 28.35C32.762 28.2535 32.7092 28.1302 32.7 28V27C31.7 27.63 30.92 28.33 29.99 28.89C29.1188 29.4325 28.1453 29.7899 27.13 29.94V30.31C27.1483 30.4286 27.2072 30.5373 27.2965 30.6175C27.3858 30.6977 27.5001 30.7445 27.62 30.75V30.75Z"
fill="#E5E5E5"
id="path19"
style="fill:#e5cbff;fill-opacity:1" />
<path
d="M27.13 29.89V30.26C27.1349 30.3884 27.1882 30.5102 27.279 30.601C27.3698 30.6918 27.4916 30.7451 27.62 30.75H29.83C29.9584 30.7549 30.0802 30.8082 30.171 30.899C30.2619 30.9898 30.3151 31.1116 30.32 31.24V33.46C30.3348 33.5848 30.3912 33.701 30.4801 33.7899C30.569 33.8788 30.6852 33.9352 30.81 33.95H32.13C32.2548 33.9352 32.371 33.8788 32.4599 33.7899C32.5488 33.701 32.6052 33.5848 32.62 33.46V31.24C32.6249 31.1116 32.6782 30.9898 32.769 30.899C32.8598 30.8082 32.9816 30.7549 33.11 30.75H35.57C35.81 30.75 35.98 30.59 36.14 30.26V29C36.1351 28.8716 36.0819 28.7498 35.991 28.659C35.9002 28.5682 35.7784 28.5149 35.65 28.51H33.19C33.0612 28.4991 32.9405 28.4423 32.85 28.35C32.762 28.2535 32.7092 28.1302 32.7 28V27"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path20"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M44.5 31.41C44.7431 31.4068 44.98 31.3333 45.1823 31.1985C45.3846 31.0636 45.5435 30.8732 45.64 30.65C45.728 30.4242 45.7523 30.1786 45.71 29.94C45.6638 29.6918 45.5435 29.4635 45.365 29.285C45.1865 29.1065 44.9582 28.9862 44.71 28.94C44.4723 28.8945 44.2267 28.9153 44 29C43.7768 29.0965 43.5863 29.2554 43.4515 29.4577C43.3166 29.66 43.2432 29.8969 43.24 30.14C43.2476 30.4638 43.3796 30.7723 43.6087 31.0013C43.8377 31.2303 44.1462 31.3624 44.47 31.37L44.5 31.41Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path21"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M46.8801 33.54C47.1646 33.5398 47.4403 33.4411 47.6602 33.2604C47.8801 33.0798 48.0306 32.8286 48.086 32.5494C48.1414 32.2703 48.0983 31.9806 47.9641 31.7297C47.8298 31.4788 47.6128 31.2822 47.3498 31.1734C47.0869 31.0646 46.7944 31.0503 46.5221 31.133C46.2498 31.2157 46.0146 31.3903 45.8566 31.6269C45.6986 31.8636 45.6275 32.1477 45.6555 32.4309C45.6835 32.7141 45.8088 32.9788 46.0101 33.18C46.1243 33.2942 46.26 33.3847 46.4092 33.4465C46.5585 33.5083 46.7185 33.54 46.8801 33.54V33.54Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path22"
style="stroke:#bf7fff;stroke-opacity:1" />
<g
opacity="0.2"
id="g23">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M54.25 19.49C52.94 15.72 49.91 9 47.29 9C42.94 9 42.94 10.15 41.39 10.15H36.31C34.67 10.15 34.67 9 30.4 9C27.7 9 24.75 15.72 23.4 19.49C21 26.78 20.73 30 25.9 30C31.55 30 31.55 25.25 38.9 25.25C46.25 25.25 46.22 30 51.63 30C56.71 30 56.71 26.78 54.25 19.49ZM36.14 18.26C35.98 18.59 35.81 18.75 35.57 18.75H33.11C32.9816 18.7549 32.8599 18.8082 32.769 18.899C32.6782 18.9898 32.625 19.1116 32.62 19.24V21.46C32.6052 21.5848 32.5488 21.701 32.4599 21.7899C32.371 21.8788 32.2548 21.9352 32.13 21.95H30.81C30.6852 21.9352 30.569 21.8788 30.4801 21.7899C30.3912 21.701 30.3349 21.5848 30.32 21.46V19.24C30.3151 19.1116 30.2619 18.9898 30.171 18.899C30.0802 18.8082 29.9584 18.7549 29.83 18.75H27.62C27.4916 18.7451 27.3699 18.6918 27.279 18.601C27.1882 18.5102 27.135 18.3884 27.13 18.26V17C27.135 16.8716 27.1882 16.7498 27.279 16.659C27.3699 16.5682 27.4916 16.5149 27.62 16.51H29.83C29.9584 16.5051 30.0802 16.4518 30.171 16.361C30.2619 16.2702 30.3151 16.1484 30.32 16.02V13.51C30.325 13.3816 30.3782 13.2598 30.469 13.169C30.5599 13.0782 30.6816 13.0249 30.81 13.02H32.21C32.3384 13.0249 32.4602 13.0782 32.551 13.169C32.6419 13.2598 32.6951 13.3816 32.7 13.51V16C32.7149 16.1248 32.7712 16.241 32.8601 16.3299C32.949 16.4188 33.0652 16.4752 33.19 16.49H35.65C35.7784 16.4949 35.9002 16.5482 35.991 16.639C36.0819 16.7298 36.1351 16.8516 36.14 16.98V18.26ZM46.88 23C45.8906 22.9998 44.9235 22.7061 44.1011 22.1561C43.2787 21.606 42.638 20.8244 42.26 19.91C41.8813 18.9886 41.7907 17.974 42 17C42.196 16.0391 42.6702 15.1571 43.3636 14.4636C44.0571 13.7702 44.9391 13.296 45.9 13.1C46.8696 12.9011 47.8766 12.9987 48.79 13.38C50.0152 13.8867 50.9889 14.8593 51.4971 16.0839C52.0053 17.3084 52.0064 18.6847 51.5 19.91C51.2526 20.52 50.8852 21.0742 50.4197 21.5397C49.9542 22.0052 49.4001 22.3726 48.79 22.62C48.1844 22.8706 47.5354 22.9997 46.88 23V23Z"
fill="black"
id="path23" />
</g>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M54.25 15.49C52.94 11.72 49.91 5 47.29 5C42.94 5 42.94 6.15 41.39 6.15H36.31C34.67 6.15 34.67 5 30.4 5C27.7 5 24.75 11.72 23.4 15.49C21 22.78 20.73 26 25.9 26C31.55 26 31.55 21.25 38.9 21.25C46.25 21.25 46.22 26 51.63 26C56.71 26 56.71 22.78 54.25 15.49ZM36.14 14.26C35.98 14.59 35.81 14.75 35.57 14.75H33.11C32.9816 14.7549 32.8599 14.8082 32.769 14.899C32.6782 14.9898 32.625 15.1116 32.62 15.24V17.46C32.6052 17.5848 32.5488 17.701 32.4599 17.7899C32.371 17.8788 32.2548 17.9352 32.13 17.95H30.81C30.6852 17.9352 30.569 17.8788 30.4801 17.7899C30.3912 17.701 30.3349 17.5848 30.32 17.46V15.24C30.3151 15.1116 30.2619 14.9898 30.171 14.899C30.0802 14.8082 29.9584 14.7549 29.83 14.75H27.62C27.4916 14.7451 27.3699 14.6918 27.279 14.601C27.1882 14.5102 27.135 14.3884 27.13 14.26V13C27.135 12.8716 27.1882 12.7498 27.279 12.659C27.3699 12.5682 27.4916 12.5149 27.62 12.51H29.83C29.9584 12.5051 30.0802 12.4518 30.171 12.361C30.2619 12.2702 30.3151 12.1484 30.32 12.02V9.51C30.3249 9.37878 30.3784 9.25406 30.47 9.16C30.5605 9.06768 30.6812 9.01091 30.81 9H32.21C32.3384 9.00494 32.4602 9.05815 32.551 9.149C32.6419 9.23984 32.6951 9.36162 32.7 9.49V12C32.7149 12.1248 32.7712 12.241 32.8601 12.3299C32.949 12.4188 33.0652 12.4752 33.19 12.49H35.65C35.7784 12.4949 35.9002 12.5482 35.991 12.639C36.0819 12.7298 36.1351 12.8516 36.14 12.98V14.26ZM46.88 19C45.8906 18.9998 44.9235 18.7061 44.1011 18.1561C43.2787 17.606 42.638 16.8244 42.26 15.91C41.8813 14.9886 41.7907 13.974 42 13C42.196 12.0391 42.6702 11.1571 43.3636 10.4636C44.0571 9.77018 44.9391 9.29597 45.9 9.1C46.8696 8.90111 47.8766 8.99867 48.79 9.38C49.8589 9.82233 50.7413 10.6216 51.2869 11.6415C51.8325 12.6615 52.0076 13.8391 51.7823 14.9737C51.5571 16.1083 50.9454 17.1297 50.0515 17.8639C49.1576 18.598 48.0368 18.9995 46.88 19Z"
fill="url(#paint2_linear_10717_29985)"
id="path24" />
<path
d="M46.88 19C47.8694 18.9998 48.8365 18.7062 49.6589 18.1561C50.4814 17.6061 51.1221 16.8244 51.5 15.91C51.8854 14.9906 51.9831 13.976 51.78 13C51.5827 12.0365 51.1055 11.1525 50.4082 10.4588C49.711 9.7651 48.8246 9.29245 47.86 9.10001C46.9 8.90726 45.9044 9.00473 45 9.38001C43.9335 9.82131 43.0525 10.618 42.5065 11.6349C41.9606 12.6518 41.7832 13.8263 42.0046 14.9591C42.226 16.0919 42.8324 17.1132 43.7211 17.8497C44.6097 18.5863 45.7258 18.9927 46.88 19Z"
fill="#7F7F7F"
id="path25"
style="fill:#7f00fe;fill-opacity:1" />
<path
d="M46.88 13C47.1196 12.993 47.3523 12.9178 47.5507 12.7832C47.7491 12.6485 47.9049 12.4601 48 12.24C48.088 12.0143 48.1123 11.7686 48.07 11.53C48.0238 11.2818 47.9035 11.0535 47.725 10.875C47.5465 10.6965 47.3181 10.5762 47.07 10.53C46.8314 10.4877 46.5857 10.512 46.36 10.6C46.1368 10.6965 45.9463 10.8554 45.8115 11.0577C45.6766 11.26 45.6032 11.4969 45.6 11.74C45.6 11.9072 45.6332 12.0727 45.6978 12.2269C45.7623 12.381 45.8569 12.5208 45.9761 12.6381C46.0952 12.7554 46.2365 12.8478 46.3917 12.9099C46.5468 12.972 46.7128 13.0027 46.88 13V13Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path26"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M49.25 15.41C49.4917 15.4059 49.7268 15.3307 49.926 15.1938C50.1252 15.0568 50.2796 14.8642 50.37 14.64C50.4596 14.4144 50.4805 14.1674 50.43 13.93C50.3846 13.6899 50.2658 13.4697 50.09 13.3C49.9169 13.1297 49.6969 13.0149 49.4582 12.9704C49.2195 12.9259 48.9729 12.9536 48.75 13.05C48.5288 13.1452 48.34 13.3027 48.2068 13.5034C48.0736 13.7041 48.0018 13.9392 48 14.18C48.0031 14.3429 48.0382 14.5035 48.1034 14.6528C48.1686 14.8021 48.2626 14.9371 48.38 15.05C48.4943 15.1642 48.6299 15.2548 48.7792 15.3165C48.9285 15.3783 49.0884 15.4101 49.25 15.41V15.41Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path27"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M44.5 15.41C44.7431 15.4068 44.98 15.3333 45.1823 15.1985C45.3846 15.0636 45.5435 14.8732 45.64 14.65C45.728 14.4243 45.7523 14.1786 45.71 13.94C45.6638 13.6918 45.5435 13.4635 45.365 13.285C45.1865 13.1065 44.9582 12.9862 44.71 12.94C44.4723 12.8945 44.2267 12.9153 44 13C43.7768 13.0965 43.5863 13.2554 43.4515 13.4577C43.3166 13.66 43.2432 13.8969 43.24 14.14C43.2476 14.4638 43.3796 14.7723 43.6087 15.0013C43.8377 15.2303 44.1462 15.3624 44.47 15.37L44.5 15.41Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path28"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
d="M46.8801 17.54C47.1646 17.5398 47.4403 17.4411 47.6602 17.2604C47.8801 17.0798 48.0306 16.8286 48.086 16.5494C48.1414 16.2703 48.0983 15.9806 47.9641 15.7297C47.8298 15.4788 47.6128 15.2822 47.3498 15.1734C47.0869 15.0646 46.7944 15.0503 46.5221 15.133C46.2498 15.2157 46.0146 15.3903 45.8566 15.6269C45.6986 15.8636 45.6275 16.1477 45.6555 16.4309C45.6835 16.7141 45.8088 16.9788 46.0101 17.18C46.1243 17.2942 46.26 17.3847 46.4092 17.4465C46.5585 17.5083 46.7185 17.54 46.8801 17.54V17.54Z"
fill="white"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path29"
style="stroke:#bf7fff;stroke-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M35.57 14.75H33.11C32.9816 14.7549 32.8598 14.8082 32.769 14.899C32.6782 14.9898 32.6249 15.1116 32.62 15.24V17.46C32.6052 17.5848 32.5488 17.701 32.4599 17.7899C32.371 17.8788 32.2548 17.9352 32.13 17.95H30.81C30.6852 17.9352 30.569 17.8788 30.4801 17.7899C30.3912 17.701 30.3348 17.5848 30.32 17.46V15.24C30.3151 15.1116 30.2619 14.9898 30.171 14.899C30.0802 14.8082 29.9584 14.7549 29.83 14.75H27.62C27.4916 14.7451 27.3698 14.6918 27.279 14.601C27.1882 14.5102 27.1349 14.3884 27.13 14.26V13C27.1349 12.8716 27.1882 12.7498 27.279 12.659C27.3698 12.5682 27.4916 12.5149 27.62 12.51H29.83C29.9584 12.5051 30.0802 12.4518 30.171 12.361C30.2619 12.2702 30.3151 12.1484 30.32 12.02V9.51C30.3249 9.37878 30.3784 9.25406 30.47 9.16C30.5605 9.06768 30.6812 9.01091 30.81 9H32.21C32.3384 9.00494 32.4602 9.05815 32.551 9.149C32.6419 9.23984 32.6951 9.36162 32.7 9.49V12C32.7148 12.1248 32.7712 12.241 32.8601 12.3299C32.949 12.4188 33.0652 12.4752 33.19 12.49H35.65C35.7784 12.4949 35.9002 12.5482 35.991 12.639C36.0819 12.7298 36.1351 12.8516 36.14 12.98V14.29C36 14.59 35.81 14.75 35.57 14.75Z"
fill="#E5E5E5"
stroke="#BFBFBF"
stroke-width="0.2"
stroke-miterlimit="10"
id="path30"
style="stroke:#bf7fff;stroke-opacity:1;fill:#e5cbff;fill-opacity:1" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M8 10H19V13H11V30H19V33H11V50H19V53H8V10Z"
fill="#7F7F7F"
id="path31"
style="fill:#7f00fe;fill-opacity:1" />
</g>
<defs
id="defs36">
<linearGradient
id="paint0_linear_10717_29985"
x1="38.81"
y1="57.98"
x2="38.81"
y2="41.23"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#545454"
id="stop31"
offset="0"
style="stop-color:#5400a8;stop-opacity:1;" />
<stop
offset="1"
stop-color="#BFBFBF"
id="stop32"
style="stop-color:#bf7fff;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="paint1_linear_10717_29985"
x1="38.81"
y1="41.98"
x2="38.81"
y2="25.23"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#545454"
id="stop33"
offset="0"
style="stop-color:#5400a8;stop-opacity:1;" />
<stop
offset="1"
stop-color="#BFBFBF"
id="stop34"
style="stop-color:#bf7fff;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="paint2_linear_10717_29985"
x1="38.84"
y1="31.46"
x2="38.72"
y2="4.64"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#545454"
id="stop35"
offset="0"
style="stop-color:#5400a8;stop-opacity:1;" />
<stop
offset="1"
stop-color="#BFBFBF"
id="stop36"
style="stop-color:#bf7fff;stop-opacity:1;" />
</linearGradient>
<clipPath
id="clip0_10717_29985">
<rect
width="47.85"
height="57"
fill="white"
transform="translate(8 5)"
id="rect36" />
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -44,12 +44,13 @@ public class ComboInput : ModuleRules
"Core",
"CoreUObject",
"Engine",
"GameplayTags",
"Slate",
"SlateCore",
"DeveloperSettings",
"Projects",
"BlueprintGraph",
"GraphEditor",
"KismetCompiler",
}
);

View File

@ -1,118 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "ComboActionGraph.h"
#include "Nodes/ComboActionGraphEdge.h"
#include "Nodes/ComboActionGraphNode.h"
#include "Nodes/ComboActionGraphNode_StartNode.h"
#define LOCTEXT_NAMESPACE "ComboActionGraph"
DEFINE_LOG_CATEGORY(LogComboActionGraph);
UComboActionGraph::UComboActionGraph()
{
this->NodeType = UComboActionGraphNode::StaticClass();
this->EdgeType = UComboActionGraphEdge::StaticClass();
this->bEdgeEnabled = false;
this->GraphGUID = FGuid::NewGuid();
#if WITH_EDITORONLY_DATA
this->EdGraph = nullptr;
this->bCanRenameNode = true;
#endif
}
void UComboActionGraph::CreateGraph()
{
#if WITH_EDITOR
// We already have an existing graph or start node
if (this->EdGraph != nullptr || this->StartNode != nullptr)
{
return;
}
this->StartNode = this->ConstructActionNode<UComboActionGraphNode_StartNode>();
if (this->StartNode != nullptr )
{
this->StartNode->Graph = this;
this->RootNodes.Add(this->StartNode);
this->AllNodes.Add(this->StartNode);
}
#endif
}
void UComboActionGraph::ClearGraph()
{
for (UComboActionGraphNode *Node : this->AllNodes)
{
Node->ParentNodes.Empty();
Node->ChildNodes.Empty();
Node->Edges.Empty();
}
this->AllNodes.Empty();
this->RootNodes.Empty();
}
void UComboActionGraph::PostInitProperties()
{
UObject::PostInitProperties();
// Ignore these cases
if (this->HasAnyFlags(EObjectFlags::RF_ClassDefaultObject | EObjectFlags::RF_NeedLoad))
{
return;
}
#if WITH_EDITOR
this->CreateGraph();
#endif
}
#if WITH_EDITOR
bool UComboActionGraph::ValidateGraph(TArray<FText> &ValidationErrors, bool RichTextFormat)
{
bool bReturnValue = true;
if (this->StartNode == nullptr)
{
const FString RichTextReturn =
FString("* ")
.Append(TEXT("<RichTextBlock.Bold>Dialogue Graph</>"))
.Append(": Has no Start Node!");
const FString TextReturn =
this->GetName()
.Append(": Has no Start Node!");
ValidationErrors.Add(FText::FromString(RichTextFormat ? RichTextReturn : TextReturn));
bReturnValue = false;
}
for (UComboActionGraphNode *Itr : this->AllNodes)
{
if (Itr != nullptr && !Itr->ValidateNode(ValidationErrors, RichTextFormat))
{
bReturnValue = false;
}
}
return bReturnValue;
}
EDataValidationResult UComboActionGraph::IsDataValid(TArray<FText> &ValidationErrors)
{
//return this->ValidateGraph(ValidationErrors, false)
// ? EDataValidationResult::Valid
// : EDataValidationResult::Invalid;
return EDataValidationResult::NotValidated;
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -2,45 +2,38 @@
#include "Components/ComboManagerComponent.h"
#include "ComboActionGraph.h"
#include "ComboInputAssets.h"
#include "EnhancedInputComponent.h"
#include "InputBufferLocalPlayerSubsystem.h"
#include "Components/InputBufferComponent.h"
#include "Engine/LocalPlayer.h"
#include "GameFramework/Character.h"
#include "Kismet/GameplayStatics.h"
#include "Nodes/ComboActionGraphNode_ActionNode.h"
DEFINE_LOG_CATEGORY(LogComboManagerComponent);
UComboManagerComponent::UComboManagerComponent()
{
this->PrimaryComponentTick.bStartWithTickEnabled = false;
this->PrimaryComponentTick.bTickEvenWhenPaused = false;
this->PrimaryComponentTick.bCanEverTick = false;
this->bWantsInitializeComponent = true;
PrimaryComponentTick.bStartWithTickEnabled = false;
PrimaryComponentTick.bTickEvenWhenPaused = false;
PrimaryComponentTick.bCanEverTick = false;
}
void UComboManagerComponent::InitializeComponent()
void UComboManagerComponent::BeginPlay()
{
Super::InitializeComponent();
Super::BeginPlay();
checkf(this->ComboGraph, TEXT("No combo graph is set for %s in actor %s"), *UComboManagerComponent::StaticClass()->GetName(), *this->GetOwner()->GetName());
this->PreviousNode = this->ActiveNode = this->ComboGraph->StartNode;
}
// If this component's owner is the player character or controller, attach it to the subsystem.
APlayerController *PlayerController = UGameplayStatics::GetPlayerController(this, 0);
if (this->GetOwner() == PlayerController)
{
UEnhancedInputComponent *InputComponent = Cast<UEnhancedInputComponent>(PlayerController->InputComponent);
checkf(InputComponent, TEXT("Discovered player input component is not of type %s."), *UEnhancedInputComponent::StaticClass()->GetName());
void UComboManagerComponent::SetComboGraph(const UComboActionGraph *Graph)
{
checkf(Graph, TEXT("Attempting to set a null combo graph."));
this->ComboGraph = Graph;
this->FoundInputsCache.Empty();
this->FindAllUsedInputs();
this->ResetCombo();
UInputBufferLocalPlayerSubsystem *InputBufferSubsystem = PlayerController->GetLocalPlayer()->GetSubsystem<UInputBufferLocalPlayerSubsystem>();
InputBufferSubsystem->AttachComboManager(this, InputComponent);
}
}
@ -83,85 +76,50 @@ void UComboManagerComponent::ActivateComboAction(const UComboInputAsset *Input)
return;
}
// Find the next node in the graph.
const UComboAction *ComboAction = nullptr;
const UComboActionGraphNode *NextNode = this->FindActiveNodeData(this->ActiveNode, Input, EComboActionTriggerEvent::Activated, ComboAction);
if (!NextNode)
{
// If there is no next active node, then return to the start node.
NextNode = this->FindActiveNodeData(this->ComboGraph->StartNode, Input, EComboActionTriggerEvent::Activated, ComboAction);
}
checkf(NextNode, TEXT("No combo sequence nodes available."));
const TObjectPtr<const UComboSequenceNode> CurrentNode = (this->ActiveNode ? this->ActiveNode : this->DefaultStartNode);
checkf(CurrentNode, TEXT("No combo sequence nodes available."));
const FComboSequenceAction *ActionData = CurrentNode->ComboBranch.Find(Input);
// If this node has an action we can activate, then activate it.
if (ComboAction)
if (ActionData && ActionData->ComboAction)
{
this->BeginNodeTransition(NextNode);
this->BroadcastDelegates(ComboAction, EComboActionTriggerEvent::Activated);
UE_LOG(LogComboManagerComponent, Verbose, TEXT("%s activated"), *ComboAction->ActionName.ToString());
this->BeginNodeTransition(ActionData->NextNode);
this->BroadcastDelegates(ActionData->ComboAction, EComboActionTriggerEvent::Activated);
UE_LOG(LogComboManagerComponent, Verbose, TEXT("%s activated"), *ActionData->ComboAction->ActionName.ToString());
}
// Otherwise, see if we have a fallback we can use.
else if (const TObjectPtr<const UComboAction> *FallbackAction = this->FallbackActions.Find(Input))
else if (const TObjectPtr<const UComboAction> *ComboAction = this->FallbackActions.Find(Input))
{
this->ResetCombo();
this->BroadcastDelegates(*FallbackAction, EComboActionTriggerEvent::Activated);
UE_LOG(LogComboManagerComponent, Verbose, TEXT("Fallback action %s activated"), *(*FallbackAction)->ActionName.ToString());
this->BroadcastDelegates(*ComboAction, EComboActionTriggerEvent::Activated);
UE_LOG(LogComboManagerComponent, Verbose, TEXT("Fallback action %s activated"), *(*ComboAction)->ActionName.ToString());
}
// If we haven't found an action to perform, end here.
// If we haven't found an action to perform, reset the combo and activate using the default start node.
else
{
UE_LOG(LogComboManagerComponent, Verbose, TEXT("No action found for %s"), *Input->ComboInputName.ToString());
this->ActiveNode = nullptr;
this->ActivateComboAction(Input);
return;
}
}
void UComboManagerComponent::DEBUG__UnlockAction(TObjectPtr<const UComboInputAsset> Unlock)
{
APlayerController *Controller = UGameplayStatics::GetPlayerController(this, 0);
if (UInputBufferComponent *InputComponent = Cast<UInputBufferComponent>(Controller->InputComponent))
{
InputComponent->UnlockComboInput(Unlock);
}
UInputBufferLocalPlayerSubsystem *Subsystem = Controller->GetLocalPlayer()->GetSubsystem<UInputBufferLocalPlayerSubsystem>();
Subsystem->UnlockComboInput(Unlock);
}
void UComboManagerComponent::ReleaseComboAction(const class UComboInputAsset *Input)
{
if (this->LastComboAction && this->ActiveNode)
if (this->LastComboAction)
{
// See if we have a fallback we can release.
const TObjectPtr<const UComboAction> *FallbackAction = this->FallbackActions.Find(Input);
if (FallbackAction && *FallbackAction == this->LastComboAction)
{
this->ResetCombo();
this->BroadcastDelegates(*FallbackAction, EComboActionTriggerEvent::Released);
UE_LOG(LogComboManagerComponent, Verbose, TEXT("Fallback action %s released"), *(*FallbackAction)->ActionName.ToString());
}
else
{
// Find a node that matches the release action.
const UComboAction *ComboAction = nullptr;
for (const UComboActionGraphNode *Node : this->ActiveNode->ChildNodes)
{
if (const UComboActionGraphNode_ActionNode *ActionNode = StaticCast<const UComboActionGraphNode_ActionNode *>(Node))
{
if (ActionNode->GetTriggerEvent() == EComboActionTriggerEvent::Released)
{
ComboAction = ActionNode->GetComboAction();
break;
}
}
}
if (ComboAction)
{
this->BroadcastDelegates(ComboAction, EComboActionTriggerEvent::Released);
UE_LOG(LogComboManagerComponent, Verbose, TEXT("%s released"), *ComboAction->ActionName.ToString());
}
}
this->BroadcastDelegates(this->LastComboAction, EComboActionTriggerEvent::Released);
this->LastComboAction = nullptr;
}
this->LastComboAction = nullptr;
}
void UComboManagerComponent::BeginNodeTransition(const UComboActionGraphNode *NextNode)
void UComboManagerComponent::BeginNodeTransition(const UComboSequenceNode *NextNode)
{
this->PreviousNode = this->ActiveNode;
this->ActiveNode = NextNode;
@ -178,80 +136,7 @@ void UComboManagerComponent::FinishTransition()
void UComboManagerComponent::ResetCombo()
{
this->GetWorld()->GetTimerManager().ClearTimer(this->DEBUG__ResetComboTimer);
this->PreviousNode = this->ActiveNode = this->ComboGraph->StartNode;
APlayerController *Controller = UGameplayStatics::GetPlayerController(this, 0);
if (UInputBufferComponent *InputComponent = Cast<UInputBufferComponent>(Controller->InputComponent))
{
for (const UComboInputAsset *Unlock : this->FoundInputsCache)
{
InputComponent->UnlockComboInput(Unlock);
}
}
}
TSet<const UComboInputAsset *> &UComboManagerComponent::FindAllUsedInputs()
{
if (this->FoundInputsCache.IsEmpty())
{
// First check the graph for inputs to respond to.
this->FindAllUsedInputs_RecurseGraph(this->ComboGraph->StartNode, this->FoundInputsCache);
// Next check the fallback actions for supplementary inputs to respond to.
TArray<TObjectPtr<const UComboInputAsset>> FallbackInputs;
this->FallbackActions.GetKeys(FallbackInputs);
for (const TObjectPtr<const UComboInputAsset> &FallbackInput : FallbackInputs)
{
this->FoundInputsCache.Add(FallbackInput);
}
// Finally check the offset action for the final input to respond to.
if (this->OffsetMap.ComboInput)
{
this->FoundInputsCache.Add(this->OffsetMap.ComboInput);
}
}
return this->FoundInputsCache;
}
void UComboManagerComponent::FindAllUsedInputs_RecurseGraph(const UComboActionGraphNode *CurrentNode, TSet<const UComboInputAsset *> &FoundInputs)
{
for (const UComboActionGraphNode *NextNode : CurrentNode->ChildNodes)
{
// It should be safe to assume all of our nodes are action nodes. If at some point
// this becomes less reliable, this should be changed. But just for the sake of
// saving a bit of performance on start-up, we're doing this right now.
checkf(NextNode->GetClass() == UComboActionGraphNode_ActionNode::StaticClass(), TEXT("This graph contains non-action nodes. The cast in this function will fail."));
FoundInputs.Add(StaticCast<const UComboActionGraphNode_ActionNode *>(NextNode)->GetComboInput());
this->FindAllUsedInputs_RecurseGraph(NextNode, FoundInputs);
}
}
const UComboActionGraphNode *UComboManagerComponent::FindActiveNodeData(const UComboActionGraphNode *CurrentNode, const UComboInputAsset *Input, const EComboActionTriggerEvent TriggerEvent, const UComboAction *&ComboAction)
{
checkf(CurrentNode, TEXT("Attempting to find an active node from a null node."));
// Find a node that matches both the combo input and the trigger action.
const UComboActionGraphNode *NextNode = nullptr;
for (const UComboActionGraphNode *GraphNode : CurrentNode->ChildNodes)
{
if (const UComboActionGraphNode_ActionNode *ActionNode = Cast<UComboActionGraphNode_ActionNode>(GraphNode))
{
if (ActionNode->GetComboInput() == Input && ActionNode->GetTriggerEvent() == EComboActionTriggerEvent::Activated)
{
// If we found the right node, only acknowledge it if it's enabled.
const UComboAction *CheckAction = ActionNode->GetComboAction();
if (ActionNode->bEnabled || this->ComboGraph->UnlockedActions.Contains(CheckAction))
{
ComboAction = CheckAction;
NextNode = ActionNode;
}
break;
}
}
}
return NextNode;
this->ActiveNode = this->PreviousNode = nullptr;
}
@ -262,9 +147,6 @@ void UComboManagerComponent::BroadcastDelegates(const UComboAction *ComboAction,
{
Binding->Execute(ComboAction, TriggerEvent);
}
else
{
this->OnUnhandledAction.Broadcast(ComboAction, (TriggerEvent == EComboActionTriggerEvent::Activated) ? true : false);
}
this->OnComboAction.Broadcast(ComboAction, (TriggerEvent == EComboActionTriggerEvent::Activated) ? true : false);
this->LastComboAction = ComboAction;
}

View File

@ -1,250 +0,0 @@
// ©2022 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Components/InputBufferComponent.h"
#include "ComboInputAssets.h"
#include "EnhancedInputComponent.h"
#include "Kismet/GameplayStatics.h"
#include "Components/ComboManagerComponent.h"
#include "GlobalSettings/InputBufferGlobalSettings.h"
DEFINE_LOG_CATEGORY(LogInputBufferComponent);
UInputBufferComponent::UInputBufferComponent()
{
this->bWantsInitializeComponent = true;
}
void UInputBufferComponent::InitializeComponent()
{
Super::InitializeComponent();
if (APlayerController *PlayerController = UGameplayStatics::GetPlayerController(this, 0))
{
if (UComboManagerComponent *ComboManager = PlayerController->GetComponentByClass<UComboManagerComponent>())
{
// Get the player character and try to connect to its combo manager.
this->OnNewComboInput.BindUObject(ComboManager, &UComboManagerComponent::HandleComboInput);
const TSet<const UComboInputAsset *> &ComboInputs = ComboManager->FindAllUsedInputs();
// Get all unique EnhancedInput actions bound to combo input actions.
TSet<const UInputAction *> InputActionsToBind;
for (const UComboInputAsset *ComboInput : ComboInputs)
{
if (ComboInput)
{
this->ComboInputList.Emplace(ComboInput);
for (const UInputAction *InputAction : ComboInput->ActionGroup)
{
InputActionsToBind.Add(InputAction);
}
}
else
{
UE_LOG(LogInputBufferComponent, Verbose, TEXT("Invalid combo input found"));
}
}
for (const UInputAction *InputAction : InputActionsToBind)
{
this->BindAction(InputAction, ETriggerEvent::Started, this, &UInputBufferComponent::AddActionToBuffer, InputAction);
this->BindAction(InputAction, ETriggerEvent::Completed, this, &UInputBufferComponent::ExpireAction, InputAction);
}
}
}
}
void UInputBufferComponent::AddActionToBuffer(const FInputActionValue &Value, const class UInputAction *Action)
{
this->MultiPressActions.Add(Action);
this->ExpiringActions.Remove(Action);
// Find any combo input that matches this action, plus buffered actions.
bool bComboInputFound = false;
for (TObjectPtr<const UComboInputAsset> ComboInput : this->ComboInputList)
{
if (ComboInput->MatchesInputActions(this->MultiPressActions))
{
this->ActivateComboInput(ComboInput.Get());
bComboInputFound = true;
break;
}
}
// If we haven't found any matching inputs, check if anything was somehow unhandled.
// This can happen if, for example, a jump input can combine with an attack input to
// create a combo action, but jump by itself has no action on its own.
if (!bComboInputFound)
{
if (!this->UnhandledActions.IsEmpty())
{
TSet<const UInputAction*> HandledActions = this->MultiPressActions;
for (const UInputAction *UnhandledAction : this->UnhandledActions)
{
HandledActions.Remove(UnhandledAction);
}
for (TObjectPtr<const UComboInputAsset> ComboInput : this->ComboInputList)
{
if (ComboInput->MatchesInputActions(HandledActions))
{
this->ActivateComboInput(ComboInput);
bComboInputFound = true;
break;
}
}
}
this->UnhandledActions.Add(Action);
}
const UInputBufferGlobalSettings *Settings = GetDefault<UInputBufferGlobalSettings>();
this->GetWorld()->GetTimerManager().SetTimer(this->MultiPressTimerHandle, this, &UInputBufferComponent::ClearMultiPresses, Settings->MultiPressTimerLength);
}
void UInputBufferComponent::ClearMultiPresses()
{
#if WITH_EDITOR
TArray<FString> ActionNames;
for (const UInputAction *Action : this->MultiPressActions)
{
ActionNames.Add(Action->GetName());
}
UE_LOG(LogInputBufferComponent, Verbose, TEXT("Multi-press buffer cleared (%s)"), *FString::Join(ActionNames, TEXT(" | ")));
#endif
this->MultiPressActions.Empty();
this->UnhandledActions.Empty();
}
void UInputBufferComponent::ActivateComboInput(const UComboInputAsset *ComboInput)
{
checkf(ComboInput, TEXT("Invalid %s."), *UComboInputAsset::StaticClass()->GetName());
const bool bNewInputLocked = this->LockedComboInputs.Contains(ComboInput);
const bool bNewSupercedesActive = (this->InputBufferActive && this->InputBufferActive->ContainsOneOf(ComboInput->ActionGroup) && !bNewInputLocked);
// Make this combo input active if it isn't being locked, or if we are
// overwriting a previous combo input with a multi-press combo input.
if (bNewSupercedesActive || !bNewInputLocked)
{
// Set the combo input as active.
this->InputBufferActive = ComboInput;
this->InputBufferHold = nullptr;
const UInputBufferGlobalSettings *Settings = GetDefault<UInputBufferGlobalSettings>();
for (const TObjectPtr<const UComboInputAsset> &LockedAsset : this->ComboInputList)
{
this->LockComboInput(LockedAsset);
}
this->OnNewComboInput.Execute(ComboInput, EComboActionTriggerEvent::Activated);
// If the incoming combo input contains an expiring action,
// we know it's been released, so send that signal too.
if (ComboInput->ContainsOneOf(this->ExpiringActions))
{
this->OnNewComboInput.Execute(ComboInput, EComboActionTriggerEvent::Released);
}
UE_LOG(LogInputBufferComponent, Verbose, TEXT("%s is active."), *ComboInput->ComboInputName.ToString());
}
else
{
this->HoldComboInput(ComboInput);
}
}
void UInputBufferComponent::HoldComboInput(const UComboInputAsset *ComboInput)
{
this->InputBufferHold = ComboInput;
UE_SUPPRESS(LogInputBufferComponent, Verbose,
{
if (this->LockedComboInputs.Contains(ComboInput))
{
UE_LOG(LogInputBufferComponent, Verbose, TEXT("%s is locked and won't be activated yet."), *ComboInput->ComboInputName.ToString());
}
else
{
UE_LOG(LogInputBufferComponent, Verbose, TEXT("%s added to buffer."), *ComboInput->ComboInputName.ToString());
}
}
);
}
void UInputBufferComponent::LockComboInput(const UComboInputAsset *Input)
{
this->LockedComboInputs.Emplace(Input);
}
void UInputBufferComponent::UnlockComboInput(const UComboInputAsset *Unlocked)
{
// Remove the newly-unlocked asset from the locked combo inputs.
UE_CLOG(this->LockedComboInputs.Contains(Unlocked), LogInputBufferComponent, Verbose, TEXT("%s has unlocked."), *Unlocked->ComboInputName.ToString());
this->LockedComboInputs.Remove(Unlocked);
// Check if the newly unlocked combo input is in the hold.
if (Unlocked == this->InputBufferHold)
{
const UComboInputAsset *OriginalActive = this->InputBufferActive;
// Activate the held combo input.
const UComboInputAsset *HeldAsset = this->InputBufferHold;
this->InputBufferHold = nullptr;
if (HeldAsset)
{
this->ActivateComboInput(HeldAsset);
}
UE_LOG(LogInputBufferComponent, Verbose, TEXT("%s has expired."), *OriginalActive->ComboInputName.ToString());
}
}
void UInputBufferComponent::ExpireAction(const FInputActionValue &Value, const class UInputAction *Action)
{
// Only send a release event if we haven't already, i.e. if the combo input associated
// with the action is not already buffered for another future activation.
if (this->InputBufferActive && this->InputBufferActive != this->InputBufferHold && this->InputBufferActive->MatchesInputAction(Action))
{
this->OnNewComboInput.Execute(this->InputBufferActive, EComboActionTriggerEvent::Released);
}
// Prepare to expire any buffered combo inputs
this->ExpiringActions.Add(Action);
const UInputBufferGlobalSettings *Settings = GetDefault<UInputBufferGlobalSettings>();
this->GetWorld()->GetTimerManager().SetTimer(this->InputReleaseExpirationTimerHandle, this, &UInputBufferComponent::ExpireBufferedActions, Settings->InputReleaseExpirationTimerLength);
}
void UInputBufferComponent::ExpireBufferedActions()
{
// Only bother dealing with this if there's something to deal with in the first place.
if (!this->ExpiringActions.IsEmpty())
{
UE_SUPPRESS(LogInputBufferComponent, Verbose,
{
TArray<FString> ActionNames;
for (const UInputAction *Action : this->ExpiringActions)
{
ActionNames.Add(Action->GetName());
}
UE_LOG(LogInputBufferComponent, Verbose, TEXT("Released actions expired (%s)"), *FString::Join(ActionNames, TEXT(" | ")));
}
);
// If there is an action in the hold, check if it's related
// to our current released buttons, and if so cancel it.
if (this->InputBufferHold)
{
for (const UInputAction *Action : this->ExpiringActions)
{
if (this->InputBufferHold->MatchesInputAction(Action))
{
UE_LOG(LogInputBufferComponent, Verbose, TEXT("%s has been cancelled."), *this->InputBufferHold->ComboInputName.ToString());
this->InputBufferHold = nullptr;
break;
}
}
}
this->ExpiringActions.Empty();
}
}

View File

@ -1,6 +1,6 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "K2Node_ComboAction.h"
#include "Events/K2Node_ComboAction.h"
#include "AssetRegistry/AssetRegistryModule.h"
#include "BlueprintActionDatabaseRegistrar.h"
@ -26,47 +26,16 @@
#define LOCTEXT_NAMESPACE "K2Node_ComboAction"
#define COMBO_ACTION_ACTIVATED_PIN_NAME TEXT("Activated")
#define COMBO_ACTION_RELEASED_PIN_NAME TEXT("Released")
#define COMBO_ACTION_OBJECT_PIN_NAME TEXT("ComboAction")
void ForEachEventPinName(TFunctionRef<void(EComboActionTriggerEvent Event, FName PinName)> PinLambda)
{
UEnum *EventEnum = StaticEnum<EComboActionTriggerEvent>();
for (int32 i = 0; i < EventEnum->NumEnums() - 1; ++i)
{
if (!EventEnum->HasMetaData(TEXT("Hidden"), i))
{
PinLambda(EComboActionTriggerEvent(EventEnum->GetValueByIndex(i)), *EventEnum->GetNameStringByIndex(i));
}
}
}
void UK2Node_ComboAction::AllocateDefaultPins()
{
const UEdGraphSchema_K2 *Schema = GetDefault<UEdGraphSchema_K2>();
this->AdvancedPinDisplay = ENodeAdvancedPins::Hidden;
ForEachEventPinName([this](EComboActionTriggerEvent Event, FName PinName)
{
static const UEnum *EventEnum = StaticEnum<EComboActionTriggerEvent>();
UEdGraphPin *NewPin = this->CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, PinName);
NewPin->PinToolTip = EventEnum->GetToolTipTextByIndex(EventEnum->GetIndexByValue(static_cast<uint8>(Event))).ToString();
NewPin->bAdvancedView = (Event > EComboActionTriggerEvent::Activated);
});
UEdGraphPin *ComboActionPin = this->CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Object, UComboAction::StaticClass(), COMBO_ACTION_OBJECT_PIN_NAME);
ComboActionPin->bAdvancedView = true;
Schema->SetPinAutogeneratedDefaultValueBasedOnType(ComboActionPin);
if (this->ComboAction)
{
ComboActionPin->DefaultObject = const_cast<UObject *>(Cast<UObject>(this->ComboAction));
ComboActionPin->DefaultValue = this->ComboAction->GetName();
Schema->ConstructBasicPinTooltip(*ComboActionPin, LOCTEXT("ComboActionPinDescription", "The combo action that caused this event to fire"), ComboActionPin->PinToolTip);
}
CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, COMBO_ACTION_ACTIVATED_PIN_NAME);
CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, COMBO_ACTION_RELEASED_PIN_NAME);
CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Object, UComboAction::StaticClass(), COMBO_ACTION_OBJECT_PIN_NAME);
Super::AllocateDefaultPins();
}
@ -159,43 +128,49 @@ void UK2Node_ComboAction::ExpandNode(FKismetCompilerContext &CompilerContext, UE
{
Super::ExpandNode(CompilerContext, SourceGraph);
const UEdGraphSchema_K2 *Schema = CompilerContext.GetSchema();
UEdGraphPin *ComboActionActivatedPin = this->FindPin(COMBO_ACTION_ACTIVATED_PIN_NAME);
UEdGraphPin *ComboActionReleasedPin = this->FindPin(COMBO_ACTION_RELEASED_PIN_NAME);
// Create a temporary variable to copy Key in to
UK2Node_TemporaryVariable *ComboActionObjectVar = CompilerContext.SpawnIntermediateNode<UK2Node_TemporaryVariable>(this, SourceGraph);
ComboActionObjectVar->VariableType.PinCategory = UEdGraphSchema_K2::PC_Object;
ComboActionObjectVar->VariableType.PinSubCategoryObject = UComboAction::StaticClass();
ComboActionObjectVar->AllocateDefaultPins();
// Establish active pins
struct ActivePinData
struct EventPinData
{
ActivePinData(UEdGraphPin *InPin, EComboActionTriggerEvent InTriggerEvent) : Pin(InPin), TriggerEvent(InTriggerEvent){}
EventPinData(UEdGraphPin *InPin, EComboActionTriggerEvent InEvent) { this->Pin = InPin; this->TriggerEvent = InEvent; }
UEdGraphPin *GetPin() const { return this->Pin; }
const EComboActionTriggerEvent &GetTriggerEvent() { return this->TriggerEvent; }
private:
UEdGraphPin *Pin;
EComboActionTriggerEvent TriggerEvent;
};
TArray<ActivePinData> ActivePins;
ForEachEventPinName([this, &ActivePins, &CompilerContext](EComboActionTriggerEvent Event, FName PinName)
TArray<EventPinData> ActivePins;
if ((ComboActionActivatedPin != nullptr) && (ComboActionActivatedPin->LinkedTo.Num() > 0))
{
UEdGraphPin *InputActionPin = this->FindPin(PinName, EEdGraphPinDirection::EGPD_Output);
if (InputActionPin && InputActionPin->LinkedTo.Num() > 0)
{
ActivePins.Add(ActivePinData(InputActionPin, Event));
}
});
for(const ActivePinData &PinData : ActivePins)
ActivePins.Add(EventPinData(ComboActionActivatedPin, EComboActionTriggerEvent::Activated));
}
if ((ComboActionReleasedPin != nullptr) && (ComboActionReleasedPin->LinkedTo.Num() > 0))
{
UEdGraphPin *ComboActionPin = PinData.Pin;
ActivePins.Add(EventPinData(ComboActionReleasedPin, EComboActionTriggerEvent::Released));
}
if (ComboActionPin->LinkedTo.Num() > 0)
const UEdGraphSchema_K2 *Schema = CompilerContext.GetSchema();
// If more than one is linked we have to do more complicated behaviors
//if (ActivePins.Num() > 1)
//{
// Create a temporary variable to copy Key in to
UK2Node_TemporaryVariable *ComboActionObjectVar = CompilerContext.SpawnIntermediateNode<UK2Node_TemporaryVariable>(this, SourceGraph);
ComboActionObjectVar->VariableType.PinCategory = UEdGraphSchema_K2::PC_Object;
ComboActionObjectVar->VariableType.PinSubCategoryObject = UComboAction::StaticClass();
ComboActionObjectVar->AllocateDefaultPins();
for (auto PinIt = ActivePins.CreateIterator(); PinIt; ++PinIt)
{
UEdGraphPin *EachPin = (*PinIt).GetPin();
// Create the combo action event
UK2Node_ComboActionEvent *ComboActionEvent = CompilerContext.SpawnIntermediateEventNode<UK2Node_ComboActionEvent>(this, ComboActionPin, SourceGraph);
UK2Node_ComboActionEvent *ComboActionEvent = CompilerContext.SpawnIntermediateEventNode<UK2Node_ComboActionEvent>(this, EachPin, SourceGraph);
ComboActionEvent->CustomFunctionName = FName(*FString::Printf(TEXT("ComboActionEvent_%s_%s"), *this->GetActionName().ToString(), *ComboActionEvent->GetName()));
ComboActionEvent->ComboAction = this->ComboAction;
ComboActionEvent->TriggerEvent = PinData.TriggerEvent;
ComboActionEvent->TriggerEvent = (*PinIt).GetTriggerEvent();
ComboActionEvent->EventReference.SetExternalDelegateMember(FName(TEXT("ComboActionHandlerDynamicSignature__DelegateSignature")));
ComboActionEvent->bInternalEvent = true;
ComboActionEvent->AllocateDefaultPins();
@ -205,17 +180,35 @@ void UK2Node_ComboAction::ExpandNode(FKismetCompilerContext &CompilerContext, UE
ComboActionObjectInitialize->AllocateDefaultPins();
Schema->TryCreateConnection(ComboActionObjectVar->GetVariablePin(), ComboActionObjectInitialize->GetVariablePin());
Schema->TryCreateConnection(ComboActionObjectInitialize->GetValuePin(), ComboActionEvent->FindPinChecked(COMBO_ACTION_OBJECT_PIN_NAME));
// Connect the events to the assign key nodes
Schema->TryCreateConnection(Schema->FindExecutionPin(*ComboActionEvent, EGPD_Output), ComboActionObjectInitialize->GetExecPin());
// Move the original event connections to the then pin of the key assign
CompilerContext.MovePinLinksToIntermediate(*ComboActionPin, *ComboActionObjectInitialize->GetThenPin());
CompilerContext.MovePinLinksToIntermediate(*EachPin, *ComboActionObjectInitialize->GetThenPin());
// Move the original event variable connections to the intermediate nodes
CompilerContext.MovePinLinksToIntermediate(*this->FindPin(COMBO_ACTION_OBJECT_PIN_NAME), *ComboActionObjectVar->GetVariablePin());
}
}
//}
//else if (ActivePins.Num() == 1)
//{
// UEdGraphPin *ComboActionPin = ActivePins[0].GetPin();
// EComboActionTriggerEvent ComboActionTriggerEvent = ActivePins[0].GetTriggerEvent();
// if (ComboActionPin->LinkedTo.Num() > 0)
// {
// UK2Node_ComboActionEvent *ComboActionEvent = CompilerContext.SpawnIntermediateEventNode<UK2Node_ComboActionEvent>(this, ComboActionPin, SourceGraph);
// ComboActionEvent->CustomFunctionName = FName(*FString::Printf(TEXT("ComboActionEvent_%s_%s"), *this->GetActionName().ToString(), *ComboActionEvent->GetName()));
// ComboActionEvent->ComboAction = this->ComboAction;
// ComboActionEvent->TriggerEvent = ComboActionTriggerEvent;
// ComboActionEvent->EventReference.SetExternalDelegateMember(FName(TEXT("ComboActionHandlerDynamicSignature__DelegateSignature")));
// ComboActionEvent->bInternalEvent = true;
// ComboActionEvent->AllocateDefaultPins();
// CompilerContext.MovePinLinksToIntermediate(*ComboActionPin, *Schema->FindExecutionPin(*ComboActionEvent, EGPD_Output));
// CompilerContext.MovePinLinksToIntermediate(*this->FindPin(COMBO_ACTION_OBJECT_PIN_NAME), *ComboActionEvent->FindPin(COMBO_ACTION_OBJECT_PIN_NAME));
// }
//}
}
void UK2Node_ComboAction::GetMenuActions(FBlueprintActionDatabaseRegistrar &ActionRegistrar) const

View File

@ -1,6 +1,6 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "K2Node_ComboActionEvent.h"
#include "Events/K2Node_ComboActionEvent.h"
#include "ComboInputTriggers.h"
#include "Events/ComboActionDelegateBinding.h"

View File

@ -3,10 +3,7 @@
#pragma once
#include "CoreMinimal.h"
#include "ComboInputTriggers.h"
#include "K2Node_Event.h"
#include "K2Node_ComboActionEvent.generated.h"
@ -15,7 +12,7 @@
* when the ComboManagerComponent activates the associated action.
*/
UCLASS()
class COMBOINPUTNODES_API UK2Node_ComboActionEvent : public UK2Node_Event
class COMBOINPUT_API UK2Node_ComboActionEvent : public UK2Node_Event
{
GENERATED_BODY()

View File

@ -1,6 +1,6 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "GlobalSettings/InputBufferGlobalSettings.h"
#include "GlobalSettings/InputBufferSubsystemGlobalSettings.h"

View File

@ -0,0 +1,204 @@
// ©2022 Batty Bovine Productions, LLC. All Rights Reserved.
#include "InputBufferLocalPlayerSubsystem.h"
#include "ComboInputAssets.h"
#include "EnhancedInputComponent.h"
#include "Components/ComboManagerComponent.h"
#include "GlobalSettings/InputBufferSubsystemGlobalSettings.h"
DEFINE_LOG_CATEGORY(LogInputBufferLocalPlayerSubsystem);
void UInputBufferLocalPlayerSubsystem::Initialize(FSubsystemCollectionBase &Collection)
{
Super::Initialize(Collection);
}
void UInputBufferLocalPlayerSubsystem::AttachComboManager(UComboManagerComponent *ComboManager, UEnhancedInputComponent *InputComponent)
{
// Get the player character and try to connect to its combo manager.
this->OnNewComboInput.BindUObject(ComboManager, &UComboManagerComponent::HandleComboInput);
// Get all unique EnhancedInput actions bound to combo input actions.
const UInputBufferSubsystemGlobalSettings *Settings = GetDefault<UInputBufferSubsystemGlobalSettings>();
TSet<const UInputAction*> InputActionsToBind;
for (TSoftObjectPtr<const UComboInputAsset> ComboInput : Settings->ComboActions)
{
for (const UInputAction *InputAction : ComboInput->ActionGroup)
{
InputActionsToBind.Add(InputAction);
}
}
for (const UInputAction *InputAction : InputActionsToBind)
{
InputComponent->BindAction(InputAction, ETriggerEvent::Started, this, &UInputBufferLocalPlayerSubsystem::AddActionToBuffer, InputAction);
InputComponent->BindAction(InputAction, ETriggerEvent::Completed, this, &UInputBufferLocalPlayerSubsystem::ExpireAction, InputAction);
}
}
void UInputBufferLocalPlayerSubsystem::AddActionToBuffer(const FInputActionValue &Value, const class UInputAction *Action)
{
this->MostRecentActions.Add(Action);
this->ExpiringActions.Remove(Action);
// Find any combo input that matches this action, plus buffered actions.
const UInputBufferSubsystemGlobalSettings *Settings = GetDefault<UInputBufferSubsystemGlobalSettings>();
for (TSoftObjectPtr<const UComboInputAsset> ComboInput : Settings->ComboActions)
{
if (ComboInput->MatchesInputActions(this->MostRecentActions))
{
this->ActivateComboInput(ComboInput.Get());
break;
}
}
this->GetWorld()->GetTimerManager().SetTimer(this->MultiPressTimerHandle, this, &UInputBufferLocalPlayerSubsystem::ClearMultiPresses, Settings->MultiPressTimerLength);
}
void UInputBufferLocalPlayerSubsystem::ClearMultiPresses()
{
#if WITH_EDITOR
TArray<FString> ActionNames;
for (const UInputAction *Action : this->MostRecentActions)
{
ActionNames.Add(Action->GetName());
}
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("Multi-press buffer cleared (%s)"), *FString::Join(ActionNames, TEXT(" | ")));
#endif
this->MostRecentActions.Empty();
}
void UInputBufferLocalPlayerSubsystem::ActivateComboInput(const UComboInputAsset *ComboInput)
{
checkf(ComboInput, TEXT("Invalid %s."), *UComboInputAsset::StaticClass()->GetName());
const bool bNewInputLocked = this->LockedComboInputs.Contains(ComboInput);
const bool bNewSupercedesActive = (this->InputBufferActive && this->InputBufferActive->ContainsOneOf(ComboInput->ActionGroup) && !bNewInputLocked);
// Make this combo input active if it isn't being locked, or if we are
// overwriting a previous combo input with a multi-press combo input.
if (bNewSupercedesActive || !bNewInputLocked)
{
// Set the combo input as active.
this->InputBufferActive = ComboInput;
// If we have inputs to lock, prepare the buffer.
if (!ComboInput->LockedComboInputs.IsEmpty())
{
this->LockedComboInputs = ComboInput->LockedComboInputs;
this->InputBufferHold = nullptr;
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s is active."), *ComboInput->ComboInputName.ToString());
}
else
{
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s is active and won't lock inputs."), *ComboInput->ComboInputName.ToString());
}
this->OnNewComboInput.Execute(ComboInput, EComboActionTriggerEvent::Activated);
// If the incoming combo input contains an expiring action,
// we know it's been released, so send that signal too.
if (ComboInput->ContainsOneOf(this->ExpiringActions))
{
this->OnNewComboInput.Execute(ComboInput, EComboActionTriggerEvent::Released);
}
}
else
{
this->HoldComboInput(ComboInput);
}
}
void UInputBufferLocalPlayerSubsystem::HoldComboInput(const UComboInputAsset *ComboInput)
{
this->InputBufferHold = ComboInput;
UE_SUPPRESS(LogInputBufferLocalPlayerSubsystem, Verbose,
{
if (this->LockedComboInputs.Contains(ComboInput))
{
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s is locked and won't be activated yet."), *ComboInput->ComboInputName.ToString());
}
else
{
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s added to buffer."), *ComboInput->ComboInputName.ToString());
}
}
);
}
void UInputBufferLocalPlayerSubsystem::UnlockComboInput(const UComboInputAsset *Unlocked)
{
// Remove the newly-unlocked asset from the locked combo inputs.
UE_CLOG(this->LockedComboInputs.Contains(Unlocked), LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s has unlocked."), *Unlocked->ComboInputName.ToString());
this->LockedComboInputs.Remove(Unlocked);
// Check if the newly unlocked combo input is in the hold.
if (Unlocked == this->InputBufferHold)
{
const UComboInputAsset *OriginalActive = this->InputBufferActive;
// Activate the held combo input.
const UComboInputAsset *HeldAsset = this->InputBufferHold;
this->InputBufferHold = nullptr;
if (HeldAsset)
{
this->ActivateComboInput(HeldAsset);
}
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s has expired."), *OriginalActive->ComboInputName.ToString());
}
}
void UInputBufferLocalPlayerSubsystem::ExpireAction(const FInputActionValue &Value, const class UInputAction *Action)
{
// Only send a release event if we haven't already, i.e. if the combo input associated
// with the action is not already buffered for another future activation.
if (this->InputBufferActive && this->InputBufferActive != this->InputBufferHold && this->InputBufferActive->MatchesInputAction(Action))
{
this->OnNewComboInput.Execute(this->InputBufferActive, EComboActionTriggerEvent::Released);
}
// Prepare to expire any buffered combo inputs
this->ExpiringActions.Add(Action);
const UInputBufferSubsystemGlobalSettings *Settings = GetDefault<UInputBufferSubsystemGlobalSettings>();
this->GetWorld()->GetTimerManager().SetTimer(this->InputReleaseExpirationTimerHandle, this, &UInputBufferLocalPlayerSubsystem::ExpireBufferedActions, Settings->InputReleaseExpirationTimerLength);
}
void UInputBufferLocalPlayerSubsystem::ExpireBufferedActions()
{
// Only bother dealing with this if there's something to deal with in the first place.
if (!this->ExpiringActions.IsEmpty())
{
UE_SUPPRESS(LogInputBufferLocalPlayerSubsystem, Verbose,
{
TArray<FString> ActionNames;
for (const UInputAction *Action : this->ExpiringActions)
{
ActionNames.Add(Action->GetName());
}
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("Released actions expired (%s)"), *FString::Join(ActionNames, TEXT(" | ")));
}
);
// If there is an action in the hold, check if it's related
// to our current released buttons, and if so cancel it.
if (this->InputBufferHold)
{
for (const UInputAction *Action : this->ExpiringActions)
{
if (this->InputBufferHold->MatchesInputAction(Action))
{
UE_LOG(LogInputBufferLocalPlayerSubsystem, Verbose, TEXT("%s has been cancelled."), *this->InputBufferHold->ComboInputName.ToString());
this->InputBufferHold = nullptr;
break;
}
}
}
this->ExpiringActions.Empty();
}
}

View File

@ -1,6 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Nodes/ComboActionGraphEdge.h"

View File

@ -1,203 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Nodes/ComboActionGraphNode.h"
#include "ComboActionGraph.h"
#include "ComboInputAssets.h"
#include "ComboInputTriggers.h"
DEFINE_LOG_CATEGORY(LogComboActionGraphNode);
#define LOCTEXT_NAMESPACE "ComboActionGraphNode"
UComboActionGraphNode::UComboActionGraphNode()
{
this->NodeGUID = FGuid::NewGuid();
this->bEnabled = true;
#if WITH_EDITORONLY_DATA
this->CompatibleGraphType = UComboActionGraph::StaticClass();
this->BackgroundColor = FLinearColor::Black;
this->bAllowInputNodes = true;
this->bAllowOutputNodes = true;
this->bAllowCopy = true;
this->bAllowCut = true;
this->bAllowDelete = true;
this->bAllowPaste = true;
this->bAllowManualCreate = true;
this->NodeTypeName = LOCTEXT("ComboActionGraphNode_InternalName", "ComboActionGraphNode");
this->NodeTooltipText = LOCTEXT("ComboActionGraphNode_Tooltip", "Combo action graph base node. Child nodes provide more information.");
#endif
}
void UComboActionGraphNode::SetNewWorld(UWorld *NewWorld)
{
if (NewWorld)
{
this->OwningWorld = NewWorld;
}
}
void UComboActionGraphNode::InitializeNode_Implementation(UWorld *InWorld)
{
this->SetNewWorld(InWorld);
if (this->Graph)
{
this->SetNodeIndex(this->Graph->AllNodes.Find(this));
}
}
void UComboActionGraphNode::ProcessNode(const TScriptInterface<IComboActionGraphManagerInterface> &Manager)
{
if (!this->GetWorld())
{
UE_LOG(LogComboActionGraphNode, Error, TEXT("[ProcessNode] Cannot find World!"));
return;
}
if (!this->GetGraph())
{
UE_LOG(LogComboActionGraphNode, Error, TEXT("[ProcessNode] Invalid owning Graph!!"));
return;
}
}
void UComboActionGraphNode::SetNodeIndex(const int32 NewIndex)
{
check(NewIndex>INDEX_NONE);
this->NodeIndex = NewIndex;
}
#if WITH_EDITOR
FText UComboActionGraphNode::GetDescription_Implementation() const
{
return LOCTEXT("NodeDesc", "Mountea Dialogue Graph Node");
}
FText UComboActionGraphNode::GetNodeCategory_Implementation() const
{
return LOCTEXT("NodeCategory", "Mountea Dialogue Tree Node");
}
FString UComboActionGraphNode::GetNodeDocumentationLink_Implementation() const
{
return TEXT("A link to the documentation for this plugin will go here.");
}
FText UComboActionGraphNode::GetNodeTooltipText_Implementation() const
{
return FText::Format(LOCTEXT("ComboActionGraphNode_FinalTooltip", "{0}\n\n{1}"), this->GetDefaultTooltipBody(), this->NodeTooltipText);
}
bool UComboActionGraphNode::CanCreateConnection(UComboActionGraphNode *Other, enum EEdGraphPinDirection Direction, FText &ErrorMessage)
{
if (Other == nullptr)
{
ErrorMessage = FText::FromString("Invalid Other Node!");
}
if (Other->GetMaxChildNodes() > -1 && Other->ChildNodes.Num() >= Other->GetMaxChildNodes())
{
const FString TextReturn =
FString(Other->GetNodeTitle().ToString()).
Append(": Cannot have more than ").Append(FString::FromInt(Other->GetMaxChildNodes())).Append(" Children Nodes!");
ErrorMessage = FText::FromString(TextReturn);
return false;
}
if (Direction == EEdGraphPinDirection::EGPD_Output)
{
// Fast checking for native classes
if ( AllowedInputClasses.Contains(Other->GetClass()) )
{
return true;
}
// Slower iterative checking for child classes
for (auto Itr : AllowedInputClasses)
{
if (Other->GetClass()->IsChildOf(Itr))
{
return true;
}
}
ErrorMessage = FText::FromString("Invalid Node Connection!");
return false;
}
return true;
}
bool UComboActionGraphNode::ValidateNode(TArray<FText> &ValidationsMessages, const bool RichFormat)
{
bool bResult = true;
if (this->ParentNodes.Num() == 0 && this->ChildNodes.Num() == 0)
{
bResult = false;
const FString RichTextReturn =
FString("* ")
.Append("<RichTextBlock.Bold>")
.Append(this->NodeTitle.ToString())
.Append("</>")
.Append(": This Node has no Connections!");
const FString TextReturn =
FString(this->NodeTitle.ToString())
.Append(": This Node has no Connections!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
if (this->bAllowInputNodes && this->ParentNodes.Num() == 0)
{
bResult = false;
const FString RichTextReturn =
FString("* ")
.Append("<RichTextBlock.Bold>")
.Append(this->NodeTitle.ToString())
.Append("</>")
.Append(": This node requires inputs, however none are found!");
const FString TextReturn =
FString(this->NodeTitle.ToString())
.Append(": This node requires inputs, however none are found!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
return bResult;
}
void UComboActionGraphNode::OnPasted()
{
this->NodeGUID = FGuid::NewGuid();
this->ParentNodes.Empty();
this->ChildNodes.Empty();
this->Edges.Empty();
}
FText UComboActionGraphNode::GetDefaultTooltipBody() const
{
//const FText Inherits = FText::Format(LOCTEXT("UComboActionGraphNode_InheritsTooltip", "Inherits Graph Decorators: {0}"), InheritsValue);
//const FText Implements = FText::Format(LOCTEXT("UComboActionGraphNode_ImplementsTooltip", "Implements Decorators: {0}"), ImplementsNumber);
return FText::Format(LOCTEXT("UComboActionGraphNode_BaseTooltip", "{0}\n\n{1}\n{2}"), this->NodeTypeName, this->NodeTypeName, this->NodeTypeName);
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -1,49 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Nodes/ComboActionGraphNode_ActionNode.h"
#include "Nodes/ComboActionGraphNode_StartNode.h"
#define LOCTEXT_NAMESPACE "ComboActionGraphNode_ActionNode"
UComboActionGraphNode_ActionNode::UComboActionGraphNode_ActionNode()
{
#if WITH_EDITORONLY_DATA
this->NodeTitle = LOCTEXT("ComboActionGraphNode_ActionNodeTitle", "Action Node");
this->NodeTypeName = LOCTEXT("ComboActionGraphNode_ActionNodeInternalTitle", "Action Node");
this->ContextMenuName = LOCTEXT("ComboActionGraphNode_ActionNodeContextMenuName", "Action Node");
this->NodeTooltipText = LOCTEXT("ComboActionGraphNode_ActionTooltip", "Action node is a node which contains combo actions based on inputs.");
#endif
this->AllowedInputClasses.Add(UComboActionGraphNode_StartNode::StaticClass());
this->AllowedInputClasses.Add(UComboActionGraphNode_ActionNode::StaticClass());
this->MaxChildNodes = -1;
}
void UComboActionGraphNode_ActionNode::PreProcessNode(const TScriptInterface<IComboActionGraphManagerInterface> &Manager)
{
Super::PreProcessNode(Manager);
}
void UComboActionGraphNode_ActionNode::ProcessNode(const TScriptInterface<IComboActionGraphManagerInterface> &Manager)
{
Super::ProcessNode(Manager);
}
#if WITH_EDITOR
FText UComboActionGraphNode_ActionNode::GetDescription_Implementation() const
{
return LOCTEXT("ComboActionGraphNode_ActionNodeDescription", "Action node is a node which contains combo actions based on inputs.");
}
FText UComboActionGraphNode_ActionNode::GetNodeCategory_Implementation() const
{
return LOCTEXT("ComboActionGraphNode_ActionNodeCategory", "Combo Action Branch Nodes");
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -1,181 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Nodes/ComboActionGraphNode_ActionNodeBase.h"
#include "ComboInputAssets.h"
#define LOCTEXT_NAMESPACE "ComboActionGraphNode_ActionNodeBase"
UComboActionGraphNode_ActionNodeBase::UComboActionGraphNode_ActionNodeBase()
{
#if WITH_EDITORONLY_DATA
this->NodeTitle = LOCTEXT("ComboActionGraphNode_ActionNodeBaseTitle", "Action Node Base");
this->NodeTypeName = LOCTEXT("ComboActionGraphNode_ActionNodeBaseInternalTitle", "Action Node Base");
this->ContextMenuName = LOCTEXT("ComboActionGraphNode_ActionNodeBaseContextMenu", "Action Node");
this->NodeTooltipText = LOCTEXT("ComboActionGraphNode_BaseTooltip", "* Abstract class, should not appear in graph editor.\n* Enhances 'ComboActionGraphNode' Base class with action data.");
#endif
}
void UComboActionGraphNode_ActionNodeBase::ProcessNode(const TScriptInterface<IComboActionGraphManagerInterface> &Manager)
{
Super::ProcessNode(Manager);
}
void UComboActionGraphNode_ActionNodeBase::PreProcessNode(const TScriptInterface<IComboActionGraphManagerInterface> &Manager)
{
Super::PreProcessNode(Manager);
}
bool UComboActionGraphNode_ActionNodeBase::ValidateNodeRuntime_Implementation() const
{
if (!this->ComboInput)
{
return false;
}
if (this->TriggerEvent == EComboActionTriggerEvent::None)
{
return false;
}
if (!this->ComboAction)
{
return false;
}
if (this->MaxChildNodes > -1 && this->ChildNodes.Num() > this->MaxChildNodes)
{
return false;
}
return true;
}
#if WITH_EDITOR
bool UComboActionGraphNode_ActionNodeBase::ValidateNode(TArray<FText> &ValidationsMessages, const bool RichFormat)
{
bool bResult = Super::ValidateNode(ValidationsMessages, RichFormat);
if (!this->ComboInput)
{
bResult = false;
const FString RichTextReturn =
FString("* ").
Append("<RichTextBlock.Bold>").
Append(NodeTitle.ToString()).
Append("</>").
Append(": Does not reference a valid combo input!");
const FString TextReturn =
FString(NodeTitle.ToString()).
Append(": Does not reference a valid combo input!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
if (this->TriggerEvent == EComboActionTriggerEvent::None)
{
bResult = false;
const FString RichTextReturn =
FString("* ").
Append("<RichTextBlock.Bold>").
Append(NodeTitle.ToString()).
Append("</>").
Append(": Does not reference a valid trigger event!");
const FString TextReturn =
FString(NodeTitle.ToString()).
Append(": Does not reference a valid trigger event!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
if (!this->ComboAction)
{
bResult = false;
const FString RichTextReturn =
FString("* ").
Append("<RichTextBlock.Bold>").
Append(NodeTitle.ToString()).
Append("</>").
Append(": Does not reference a valid combo action!");
const FString TextReturn =
FString(NodeTitle.ToString()).
Append(": Does not reference a valid combo action!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
if (this->MaxChildNodes > -1 && this->ChildNodes.Num() > this->MaxChildNodes)
{
const FString RichTextReturn = FString("* ")
.Append("<RichTextBlock.Bold>")
.Append(this->NodeTitle.ToString())
.Append("</>")
.Append(": Has more than ")
.Append("<RichTextBlock.Bold>")
.Append(FString::FromInt(this->MaxChildNodes))
.Append("</>")
.Append(" child nodes!");
const FString TextReturn = FString(this->NodeTitle.ToString())
.Append(": Has more than ").Append(FString::FromInt(this->MaxChildNodes)).Append(" child nodes!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
return bResult;
}
void UComboActionGraphNode_ActionNodeBase::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
Super::PostEditChangeProperty(PropertyChangedEvent);
if (PropertyChangedEvent.GetPropertyName() == GET_MEMBER_NAME_CHECKED(UComboActionGraphNode_ActionNodeBase, ComboInput))
{
this->Preview.Empty();
this->PreviewsUpdated.ExecuteIfBound();
}
if (PropertyChangedEvent.GetPropertyName() == GET_MEMBER_NAME_CHECKED(UComboActionGraphNode_ActionNodeBase, TriggerEvent))
{
this->UpdatePreviews();
this->PreviewsUpdated.ExecuteIfBound();
}
}
#if WITH_EDITOR
FLinearColor UComboActionGraphNode_ActionNodeBase::GetBackgroundColour() const
{
if (this->ComboAction && this->ComboAction->NodeColor != FLinearColor())
{
return this->ComboAction->NodeColor;
}
else if (this->ComboInput)
{
return this->ComboInput->NodeColor;
}
return Super::GetBackgroundColour();
}
#endif
FText UComboActionGraphNode_ActionNodeBase::GetDescription_Implementation() const
{
return LOCTEXT("ComboActionGraphNode_BaseDescription", "Action base node has no logic tied to itself.");
}
TArray<FText> UComboActionGraphNode_ActionNodeBase::GetPreviews() const
{
return TArray<FText>();
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -1,63 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Nodes/ComboActionGraphNode_StartNode.h"
#define LOCTEXT_NAMESPACE "ComboActionGraphNode_StartNode"
UComboActionGraphNode_StartNode::UComboActionGraphNode_StartNode()
{
#if WITH_EDITORONLY_DATA
this->bAllowInputNodes = false;
this->NodeTitle = LOCTEXT("ComboActionGraphNode_StartNodeTitle", "Start Action");
this->NodeTypeName = LOCTEXT("ComboActionGraphNode_StartNodeInternalTitle", "Start Action");
this->ContextMenuName = LOCTEXT("ComboActionGraphNode_StartNodeContextMenuName", "Start Action");
this->BackgroundColor = FLinearColor(0.0f, 1.0f, 0.0f, 1.0f);
this->bAllowCopy = false;
this->bAllowCut = false;
this->bAllowPaste = false;
this->bAllowDelete = false;
this->bAllowManualCreate = false;
this->NodeTooltipText = LOCTEXT("ComboActionGraphNode_CompleteTooltip", "* This Node will be added to the graph automatically.\n* This Node cannot be created manually.\n* This Node cannot be deleted.\n* Does not implement any logic.");
#endif
this->MaxChildNodes = -1;
}
#if WITH_EDITOR
FText UComboActionGraphNode_StartNode::GetDescription_Implementation() const
{
return LOCTEXT("ComboActionGraphNode_StartNodeDescription", "Start node is automatically placed and cannot be deleted.");
}
bool UComboActionGraphNode_StartNode::ValidateNode(TArray<FText>& ValidationsMessages, const bool RichFormat)
{
bool bResult = Super::ValidateNode(ValidationsMessages, RichFormat);
if (this->ChildNodes.Num() == 0)
{
bResult = false;
const FString RichTextReturn =
FString("* ")
.Append("<RichTextBlock.Bold>")
.Append(this->NodeTitle.ToString())
.Append("</>")
.Append(": Does not have any child nodes!");
const FString TextReturn =
FString(this->NodeTitle.ToString())
.Append(": Does not have any child nodes!");
ValidationsMessages.Add(FText::FromString(RichFormat ? RichTextReturn : TextReturn));
}
return bResult;
}
#endif
#undef LOCTEXT_NAMESPACE

View File

@ -1,144 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Nodes/ComboActionGraphEdge.h"
#include "ComboActionGraph.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogComboActionGraph, Log, All);
/**
* Combo Action graph.
*
* Can be manually created from Content Browser, using Combo Action category.
* Comes with a node editor, which provides easy to follow visual way to create combo strings.
*/
UCLASS(BlueprintType, ClassGroup=("Combo Input|Action"), DisplayName="Combo Action Tree", HideCategories=("Hidden", "Private", "Base"), AutoExpandCategories=("Combo Input", "Action"))
class COMBOINPUT_API UComboActionGraph : public UObject
{
GENERATED_BODY()
public:
UComboActionGraph();
#pragma region Variables
protected:
/**
* Unique GUID for this graph.
* Can be used for debugging and tracing purposes.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input")
FGuid GraphGUID;
public:
/**
* Pointer to the starting node of the dialogue graph.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
class UComboActionGraphNode *StartNode = nullptr;
/**
* The class of the action node represented by this instance.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
TSubclassOf<UComboActionGraphNode> NodeType;
/**
* The class of the action edge represented by this instance.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
TSubclassOf<UComboActionGraphEdge> EdgeType;
/**
* An array of root nodes in the action graph. These are the nodes that do not have any incoming connections.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
TArray<UComboActionGraphNode*> RootNodes;
/**
* Array containing all the nodes in the graph, including both root nodes and child nodes.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
TArray<UComboActionGraphNode*> AllNodes;
/**
* Set containing actions to be unlocked if their associated nodes are currently locked.
*/
UPROPERTY(BlueprintReadWrite, Category="Combo Input|Action")
TSet<const class UComboAction*> UnlockedActions;
// Flag indicating whether an edge is enabled
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
bool bEdgeEnabled;
#pragma endregion
#pragma region Functions
public:
/**
* Returns the GUID of the graph.
*
* @return The GUID of the graph.
*/
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
FGuid GetGraphGUID() const { return this->GraphGUID; }
/**
* Returns an array containing all nodes in the dialogue graph.
* @return An array of all nodes in the dialogue graph.
*/
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
TArray<UComboActionGraphNode*> GetAllNodes() const { return this->AllNodes; }
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
TArray<UComboActionGraphNode*> GetRootNodes() const { return this->RootNodes; }
/**
* Returns the first node in the graph.
*
* @return The start node of this graph.
*/
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
UComboActionGraphNode *GetStartNode() const { return this->StartNode; }
public:
void CreateGraph();
void ClearGraph();
FORCEINLINE bool IsEdgeEnabled() const { return bEdgeEnabled; }
virtual void PostInitProperties() override;
#pragma endregion
#if WITH_EDITORONLY_DATA
public:
UPROPERTY()
TObjectPtr<class UEdGraph> EdGraph;
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action|Editor")
bool bCanRenameNode;
#endif
#if WITH_EDITOR
virtual bool ValidateGraph(TArray<FText> &ValidationErrors, bool RichTextFormat);
virtual EDataValidationResult IsDataValid(TArray<FText> &ValidationErrors) override;
public:
// Construct and initialize a node within this Dialogue.
template<class T>
T* ConstructActionNode(TSubclassOf<class UComboActionGraphNode> DialogueNodeClass = T::StaticClass())
{
// Set flag to be transactional so it registers with undo system
T *ActionNode = NewObject<T>(this, DialogueNodeClass, NAME_None, EObjectFlags::RF_Transactional);
ActionNode->OnCreatedInEditor();
return ActionNode;
}
#endif
};

View File

@ -9,6 +9,24 @@
#include "ComboInputAssets.generated.h"
/**
* Struct that is used as the value for a combo branch. ComboAction is the action to be
* executed, and NextNode is the node that will be activated next in the sequence.
*/
USTRUCT(BlueprintType)
struct COMBOINPUT_API FComboSequenceAction
{
GENERATED_BODY()
public:
// Action to perform when the associated combo sequence node is activated.
UPROPERTY(BlueprintReadOnly, EditAnywhere)
TObjectPtr<const class UComboAction> ComboAction;
// Sequence node to switch to once this action is complete.
UPROPERTY(BlueprintReadOnly, EditAnywhere)
TObjectPtr<const class UComboSequenceNode> NextNode;
};
/**
* An action that can be executed as part of a combo sequence. This is essentially a
* representation of an attack, and can be sent to the Animation Graph to play an
@ -23,10 +41,21 @@ public:
// Human-readable name of this combo action.
UPROPERTY(BlueprintReadOnly, EditAnywhere)
FName ActionName;
};
// Sets the colour of the node this action is tied to. Will override any other colours.
/**
* This represents a node in the combo graph, with each key in the ComboBranch being
* an input this node can react to, and each value containing the action to be executed
* next, and the node to activate after the action is complete.
*/
UCLASS(BlueprintType)
class COMBOINPUT_API UComboSequenceNode : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly, EditAnywhere)
FLinearColor NodeColor;
TMap<const class UComboInputAsset *, struct FComboSequenceAction> ComboBranch;
};
/**
@ -92,7 +121,10 @@ public:
UPROPERTY(BlueprintReadWrite, EditAnywhere)
TSet<const class UInputAction*> ActionGroup;
// Sets the colour of the node this action is tied to. Can be overridden by UComboAction.
UPROPERTY(BlueprintReadOnly, EditAnywhere)
FLinearColor NodeColor;
// Combo inputs that should be prevented from occurring during this
// action. These will be locked when the action is broadcast, and
// should be unlocked by the receiving actor by sending an unlock
// event.
UPROPERTY(BlueprintReadWrite, EditAnywhere)
TSet<TObjectPtr<const class UComboInputAsset>> LockedComboInputs;
};

View File

@ -42,10 +42,7 @@ class COMBOINPUT_API UComboManagerComponent : public UActorComponent
public:
UComboManagerComponent();
virtual void InitializeComponent() override;
UFUNCTION(BlueprintCallable)
void SetComboGraph(const class UComboActionGraph *Graph);
virtual void BeginPlay() override;
UFUNCTION(BlueprintCallable)
void HandleComboInput(const class UComboInputAsset *Input, const EComboActionTriggerEvent &TriggerEvent);
@ -58,12 +55,9 @@ public:
this->ComboActionEventBindings.Emplace(Key.Key, MoveTemp(Delegate));
}
// Recursively search the graph for all inputs used by the graph.
TSet<const UComboInputAsset *> &FindAllUsedInputs();
protected:
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly)
TObjectPtr<const class UComboActionGraph> ComboGraph;
TObjectPtr<const class UComboSequenceNode> DefaultStartNode;
// This input will be recognised as an offset input, which cancels a node transition
// if activated early enough in the transition. This locks the current place in the
@ -81,34 +75,28 @@ protected:
TMap<TObjectPtr<const class UComboInputAsset>, float> DEBUG__UnlockTimers;
UPROPERTY(BlueprintReadWrite, BlueprintAssignable)
FComboActionHandlerDelegate OnUnhandledAction;
FComboActionHandlerDelegate OnComboAction;
private:
void ActivateComboAction(const class UComboInputAsset *Input);
void ReleaseComboAction(const class UComboInputAsset *Input);
void BeginNodeTransition(const class UComboActionGraphNode *NextNode);
void BeginNodeTransition(const class UComboSequenceNode *NextNode);
void FinishTransition();
void ResetCombo();
const UComboActionGraphNode *FindActiveNodeData(const UComboActionGraphNode *CurrentNode, const UComboInputAsset *Input, const EComboActionTriggerEvent TriggerEvent, const UComboAction *&ComboAction);
void FindAllUsedInputs_RecurseGraph(const UComboActionGraphNode *CurrentNode, TSet<const UComboInputAsset *> &FoundInputs);
void BroadcastDelegates(const class UComboAction *ComboAction, const EComboActionTriggerEvent &TriggerEvent);
void DEBUG__UnlockAction(TObjectPtr<const class UComboInputAsset> Unlock);
TObjectPtr<const class UComboActionGraphNode> ActiveNode = nullptr;
TObjectPtr<const class UComboActionGraphNode> PreviousNode = nullptr;
const class UComboSequenceNode *ActiveNode = nullptr;
const class UComboSequenceNode *PreviousNode = nullptr;
TObjectPtr<const class UComboAction> LastComboAction = nullptr;
TMap<FName, FComboActionHandlerDynamicSignature> ComboActionEventBindings;
TObjectPtr<class UInputBufferComponent> AttachedInputBuffer;
// Cache of combo inputs found in the current graph.
TSet<const UComboInputAsset *> FoundInputsCache;
FTimerHandle FinishTransitionTimer;
FTimerHandle DEBUG__ResetComboTimer;

View File

@ -19,7 +19,7 @@ class FKismetCompilerContext;
UCLASS()
class COMBOINPUTNODES_API UK2Node_ComboAction : public UK2Node, public IK2Node_EventNodeInterface
class COMBOINPUT_API UK2Node_ComboAction : public UK2Node, public IK2Node_EventNodeInterface
{
GENERATED_BODY()

View File

@ -1,26 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "Engine/DeveloperSettingsBackedByCVars.h"
#include "InputBufferGlobalSettings.generated.h"
/**
* Global settings for the input buffer
*/
UCLASS(Config=Game, defaultconfig, meta=(DisplayName="Input Buffer"))
class COMBOINPUT_API UInputBufferGlobalSettings : public UDeveloperSettingsBackedByCVars
{
GENERATED_BODY()
public:
// Length of time after releasing an input to keep the associated combo action buffered before clearing it.
UPROPERTY(Config, BlueprintReadOnly, EditDefaultsOnly, meta=(UIMin="0.0", UIMax="0.5", ClampMin="0.0", ClampMax="0.5"))
float InputReleaseExpirationTimerLength = 0.15f;
// Length of time within which we can recognise multiple button presses as one input.
UPROPERTY(Config, BlueprintReadOnly, EditDefaultsOnly, meta=(UIMin="0.01", UIMax="0.25", ClampMin="0.01", ClampMax="0.25"))
float MultiPressTimerLength = 0.025f;
};

View File

@ -0,0 +1,32 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "Engine/DeveloperSettingsBackedByCVars.h"
#include "InputBufferSubsystemGlobalSettings.generated.h"
/**
* Global settings for the input buffer subsystem
*/
UCLASS(Config=Game, defaultconfig, meta=(DisplayName="Input Buffer Subsystem"))
class COMBOINPUT_API UInputBufferSubsystemGlobalSettings : public UDeveloperSettingsBackedByCVars
{
GENERATED_BODY()
public:
// List of possible combo inputs that can be taken. A combo input is selected from this list
// either if an action is made while the current combo is inactive, or when the previous
// action expires.
UPROPERTY(Config, BlueprintReadOnly, EditDefaultsOnly)
TSet<TSoftObjectPtr<const class UComboInputAsset>> ComboActions;
// Length of time after releasing an input to keep the associated combo action buffered before clearing it.
UPROPERTY(Config, BlueprintReadOnly, EditDefaultsOnly, meta = (UIMin = "0.0", UIMax = "0.5"))
float InputReleaseExpirationTimerLength = 0.0666666666666666667f;
// Length of time within which we can recognise multiple button presses as one input.
UPROPERTY(Config, BlueprintReadOnly, EditDefaultsOnly, meta = (UIMin = "0.02", UIMax = "0.25"))
float MultiPressTimerLength = 0.025f;
};

View File

@ -3,11 +3,11 @@
#pragma once
#include "CoreMinimal.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputBufferComponent.generated.h"
#include "InputBufferLocalPlayerSubsystem.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogInputBufferComponent, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogInputBufferLocalPlayerSubsystem, Log, All);
DECLARE_DELEGATE_TwoParams(FNewComboInput, const class UComboInputAsset*, const EComboActionTriggerEvent &);
@ -16,16 +16,15 @@ DECLARE_DELEGATE_TwoParams(FNewComboInput, const class UComboInputAsset*, const
* Subsystem that handles input buffering, and passing the resulting actions to the player's ComboManagerComponent.
*/
UCLASS()
class COMBOINPUT_API UInputBufferComponent : public UEnhancedInputComponent
class COMBOINPUT_API UInputBufferLocalPlayerSubsystem : public UEnhancedInputLocalPlayerSubsystem
{
GENERATED_BODY()
public:
UInputBufferComponent();
virtual void InitializeComponent() override;
virtual void Initialize(FSubsystemCollectionBase &Collection) override;
void AttachComboManager(class UComboManagerComponent *ComboManager, class UEnhancedInputComponent *InputComponent);
UFUNCTION(BlueprintCallable)
void LockComboInput(const class UComboInputAsset *Input);
UFUNCTION(BlueprintCallable)
void UnlockComboInput(const class UComboInputAsset *Unlocked);
@ -50,11 +49,7 @@ private:
// Set of currently locked actions; will not be activated until an unlock signal is received.
TSet<TObjectPtr<const class UComboInputAsset>> LockedComboInputs;
// A local backup of the global setting containing the list of combo inputs to respond to.
TSet<TObjectPtr<const UComboInputAsset>> ComboInputList;
TSet<const class UInputAction*> MultiPressActions;
TSet<const class UInputAction*> UnhandledActions;
TSet<const class UInputAction*> MostRecentActions;
TSet<const class UInputAction*> ExpiringActions;
FNewComboInput OnNewComboInput;

View File

@ -1,42 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ComboActionGraphEdge.generated.h"
/**
* Combo Action edges.
*
* Currently those edges are just connecting objects with no advanced logic.
*/
UCLASS(ClassGroup=("Combo Input|Action"), NotBlueprintType)
class COMBOINPUT_API UComboActionGraphEdge : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
void SetGraph(class UComboActionGraph *InGraph) { this->Graph = InGraph; }
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
void SetStartNode(class UComboActionGraphNode *InNode) { this->StartNode = InNode; }
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
void SetEndNode(class UComboActionGraphNode *InNode) { this->EndNode = InNode; }
UFUNCTION(BlueprintPure, Category="Combo Input|Action")
class UComboActionGraph *GetGraph() const { return this->Graph; }
UFUNCTION(BlueprintPure, Category="Combo Input|Action")
class UComboActionGraphNode *GetStartNode() const { return this->StartNode; }
UFUNCTION(BlueprintPure, Category="Combo Input|Action")
class UComboActionGraphNode *GetEndNode() const { return this->EndNode; }
private:
UPROPERTY(VisibleAnywhere, Category="Combo Input|Action")
class UComboActionGraph *Graph = nullptr;
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action", meta=(AllowPrivateAccess="true"))
class UComboActionGraphNode *StartNode = nullptr;
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action", meta=(AllowPrivateAccess="true"))
class UComboActionGraphNode *EndNode = nullptr;
};

View File

@ -1,337 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ComboActionGraphNode.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogComboActionGraphNode, Log, All);
/**
* Combo Action graph Node abstract base class.
*
* Provides generic functionality to be enhanced or overriden by Child Classes.
* Does come with ability to define Colours, Name, Description and Title.
* Contains information about Parent and Children Nodes.
*/
UCLASS(Abstract, BlueprintType, ClassGroup=("Combo Input|Action"), AutoExpandCategories=("Combo Input", "Action", "Combo Input|Action"), HideCategories=("Private"))
class COMBOINPUT_API UComboActionGraphNode : public UObject
{
GENERATED_BODY()
public:
UComboActionGraphNode();
#pragma region Variables
#pragma region ReadOnly
public:
/**
* Array of parent nodes for the current active node in the combo string.
* Parent nodes are nodes that have a directed edge pointing to the current active node.
*/
UPROPERTY(BlueprintReadOnly, Category = "Private")
TArray<class UComboActionGraphNode *> ParentNodes;
/**
* The array of child nodes of the current dialogue node.
*/
UPROPERTY(BlueprintReadOnly, Category = "Private")
TArray<class UComboActionGraphNode *> ChildNodes;
/**
* Map of edges connecting this Node in the Combo Action graph.
* The key of the map is the source node, and the value is the edge connecting it to its target node.
* Can be used to traverse the graph, get information about node connections...
*/
UPROPERTY(BlueprintReadOnly, Category="Private")
TMap<class UComboActionGraphNode*, class UComboActionGraphEdge*> Edges;
/**
* Pointer to the parent dialogue graph of this node.
*/
UPROPERTY(BlueprintReadOnly, Category="Private", meta=(DisplayThumbnail=false))
TObjectPtr<class UComboActionGraph> Graph;
/**
* Temporary NodeIndex.
* This variable will be deleted.
*/
UPROPERTY(BlueprintReadOnly, Category="Private")
int32 NodeIndex = INDEX_NONE;
protected:
/**
* The unique identifier for this Dialogue Graph Node.
* This is used to differentiate between nodes, and must be unique within the graph.
* Can be used for debugging and tracing purposes.
*/
UPROPERTY(BlueprintReadOnly, Category="Private")
FGuid NodeGUID;
/**
* The world that owns this Dialogue Graph Node.
* This is the world in which this Dialogue Graph Node is currently running.
* Can be used for accessing world-related functionality.
*/
UPROPERTY(BlueprintReadOnly, Category="Private")
TObjectPtr<UWorld> OwningWorld;
#pragma endregion
#pragma region Editable
public:
/**
* Whether the node is enabled by default. Disabled nodes will be ignored by the
* combo manager until they are enabled again programmatically. This allows actions
* to be unlockable during gameplay.
*/
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category="Combo Input|Action")
uint8 bEnabled : 1;
/**
* The maximum number of children nodes that this node can have.
* If this value is -1, then there is no limit on the number of children nodes.
* Can be used to enforce a maximum number of connections for certain types of nodes.
*/
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category="Combo Input|Action")
int32 MaxChildNodes = -1;
/**
* The array of allowed input classes for this Dialogue Node.
* Only nodes with classes from this array can be connected as inputs to this node.
* Can be used to restrict the types of inputs this node can accept.
*/
UPROPERTY(BlueprintReadOnly, Category="Combo Input|Action")
TArray<TSubclassOf<class UComboActionGraphNode>> AllowedInputClasses;
#pragma endregion
#pragma endregion
#pragma region Functions
public:
/**
* Initializes the node with the given world.
*
* @param InWorld The world to use for initialization.
*/
UFUNCTION(BlueprintNativeEvent, Category = "Combo Input|Action")
void InitializeNode(UWorld *InWorld);
virtual void InitializeNode_Implementation(UWorld *InWorld);
virtual void PreProcessNode(const TScriptInterface<class IComboActionGraphManagerInterface> &Manager){}
virtual void ProcessNode(const TScriptInterface<class IComboActionGraphManagerInterface> &Manager);
/**
* Returns how many Children Nodes this Node allows to have.
* -1 means no limits.
*
* @return Max child nodes
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Combo Input|Action")
int32 GetMaxChildNodes() const { return this->MaxChildNodes; }
/**
* Gets the index of the node within the dialogue graph.
*
* @return The index of the node.
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Combo Input|Action")
FORCEINLINE int32 GetNodeIndex() const { return NodeIndex; }
/**
* Sets the index of this dialogue node in the dialogue graph.
*
* @param NewIndex The new index to set.
*/
void SetNodeIndex(const int32 NewIndex);
/**
* Gets the GUID of the node.
*
* @return The GUID of the node.
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Combo Input|Action")
FORCEINLINE FGuid GetNodeGUID() const { return NodeGUID; }
/**
* Gets the owning Graph of the node.
* Might be null
*
* @return The owning Graph of the node.
*/
UFUNCTION(BlueprintCallable, Category = "Combo Input|Action")
class UComboActionGraph *GetGraph() const { return this->Graph; }
/**
* Serves purpose of validating Node before Dialogue gets Started.
* Any broken Node results in non-starting Dialogue to avoid crashes.
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Combo Input|Action")
bool ValidateNodeRuntime() const;
virtual bool ValidateNodeRuntime_Implementation() const { return true; }
public:
FORCEINLINE ULevel* GetLevel() const { return GetTypedOuter<ULevel>(); }
/**
* Provides a way to update Node's owning World.
* Useful for Loading sub-levels.
*/
UFUNCTION(BlueprintCallable, Category="Combo Input|Action")
virtual void SetNewWorld(UWorld* NewWorld);
virtual UWorld* GetWorld() const override
{
if (OwningWorld) return OwningWorld;
// CDO objects do not belong to a world
// If the actors outer is destroyed or unreachable we are shutting down and the world should be nullptr
if (
!HasAnyFlags(RF_ClassDefaultObject) && ensureMsgf(GetOuter(), TEXT("Actor: %s has a null OuterPrivate in AActor::GetWorld()"), *GetFullName())
&& !GetOuter()->HasAnyFlags(RF_BeginDestroyed) && !GetOuter()->IsUnreachable()
)
{
if (ULevel* Level = GetLevel())
{
return Level->OwningWorld;
}
}
return nullptr;
}
#pragma endregion
#if WITH_EDITORONLY_DATA
// Defines whether this Node type allows inputs
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowInputNodes;
// Defines whether this Node type allows outputs
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowOutputNodes;
// Defines whether this Node can be copied
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowCopy;
// Defines whether this Node can be cut
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowCut;
// Defines whether this Node can be pasted
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowPaste;
// Defines whether this Node can be deleted
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowDelete;
// Defines whether this Node can be manually created
UPROPERTY(BlueprintReadOnly, Category = "Editor")
bool bAllowManualCreate;
// Display title of the Node
UPROPERTY(BlueprintReadOnly, Category = "Editor")
FText NodeTitle;
// Display name of the Node menu category
UPROPERTY(BlueprintReadOnly, Category = "Editor")
FText ContextMenuName;
// List of compatible graph types
UPROPERTY(BlueprintReadOnly, Category = "Editor")
TSubclassOf<UObject> CompatibleGraphType;
// Defines background colour of this Node
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "Editor")
FLinearColor BackgroundColor;
// Contains Node Tooltip text
UPROPERTY(BlueprintReadOnly, Category = "Editor")
FText NodeTooltipText;
// User friendly node type name
UPROPERTY(BlueprintReadOnly, Category = "Editor")
FText NodeTypeName;
#endif
#if WITH_EDITOR
/**
* Returns the tooltip text for this graph node.
*
* @return The tooltip text for this node.
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Combo Input|Action", meta=(DevelopmentOnly=true))
FText GetNodeTooltipText() const;
virtual FText GetNodeTooltipText_Implementation() const;
/**
* Returns the Title text for this graph node.
*
* @return The Title text for this node.
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Combo Input|Action", meta=(DevelopmentOnly=true))
FText GetNodeTitle() const;
virtual FText GetNodeTitle_Implementation() const { return this->NodeTitle; }
/**
* Returns the Description text for this graph node.
*
* @return The Description text for this node.
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Combo Input|Action", meta=(DevelopmentOnly=true))
FText GetDescription() const;
virtual FText GetDescription_Implementation() const;
/**
* Returns the Node Category text for this graph node.
*
* @return The Node Category text for this node.
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Combo Input|Action", meta=(DevelopmentOnly=true))
FText GetNodeCategory() const;
virtual FText GetNodeCategory_Implementation() const;
/**
* Returns the Documentation Link for this graph node.
*
* @return The Documentation Link for this node.
*/
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Combo Input|Action", meta=(DevelopmentOnly=true))
FString GetNodeDocumentationLink() const;
virtual FString GetNodeDocumentationLink_Implementation() const;
/**
* Returns the background colour for this graph node.
*
* @return The background colour for this node.
*/
virtual FLinearColor GetBackgroundColour() const { return this->BackgroundColor; }
FText GetInternalName() const { return this->NodeTypeName; }
// Allows setting up the Node Title
virtual void SetNodeTitle(const FText &NewTitle) { this->NodeTitle = NewTitle; }
// Allows advanced filtering if Node can be connected from other Node
virtual bool CanCreateConnection(UComboActionGraphNode *Other, enum EEdGraphPinDirection Direction, FText& ErrorMessage);
// Validation function responsible for generating user friendly validation messages
virtual bool ValidateNode(TArray<FText> &ValidationsMessages, const bool RichFormat);
// Once Node is pasted, this function is called
virtual void OnPasted();
// Generates default Tooltip body text used for all Nodes
UFUNCTION(BlueprintPure, Category="Combo Input|Action", meta=(DevelopmentOnly=true))
FText GetDefaultTooltipBody() const;
virtual void OnCreatedInEditor() {};
#endif
};

View File

@ -1,33 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Nodes/ComboActionGraphNode_ActionNodeBase.h"
#include "UObject/Object.h"
#include "ComboActionGraphNode_ActionNode.generated.h"
/**
* Combo Action node.
*
* This Node represents Player's combo actions.
*/
UCLASS(ClassGroup=("Combo Input|Action"), DisplayName="Action Node", meta=(ToolTip="Combo Action Tree: Action Node"))
class COMBOINPUT_API UComboActionGraphNode_ActionNode : public UComboActionGraphNode_ActionNodeBase
{
GENERATED_BODY()
UComboActionGraphNode_ActionNode();
public:
virtual void PreProcessNode(const TScriptInterface<class IComboActionGraphManagerInterface> &Manager) override;
virtual void ProcessNode(const TScriptInterface<class IComboActionGraphManagerInterface> &Manager) override;
#if WITH_EDITOR
virtual FText GetDescription_Implementation() const override;
virtual FText GetNodeCategory_Implementation() const override;
#endif
};

View File

@ -1,87 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ComboInputTriggers.h"
#include "Engine/DataTable.h"
#include "Nodes/ComboActionGraphNode.h"
#include "UObject/Object.h"
#include "ComboActionGraphNode_ActionNodeBase.generated.h"
/**
* Combo Action Graph Node abstract Base class.
*
* Enhances 'ComboActionGraphNode' Base class with action data.
*/
UCLASS(Abstract, ClassGroup=("Combo Input|Action"), AutoExpandCategories=("Combo Input", "Action", "Combo Input|Action"))
class COMBOINPUT_API UComboActionGraphNode_ActionNodeBase : public UComboActionGraphNode
{
GENERATED_BODY()
public:
UComboActionGraphNode_ActionNodeBase();
virtual void ProcessNode(const TScriptInterface<class IComboActionGraphManagerInterface> &Manager) override;
virtual void PreProcessNode(const TScriptInterface<class IComboActionGraphManagerInterface> &Manager) override;
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Combo Input|Action")
class UComboInputAsset *GetComboInput() const { return this->ComboInput; }
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Combo Input|Action")
enum EComboActionTriggerEvent GetTriggerEvent() const { return this->TriggerEvent; }
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Combo Input|Action")
class UComboAction *GetComboAction() const { return this->ComboAction; }
virtual bool ValidateNodeRuntime_Implementation() const override;
#if WITH_EDITOR
virtual FLinearColor GetBackgroundColour() const override;
#endif
#if WITH_EDITORONLY_DATA
/**
* Shows read-only Texts with localization of selected row.
*/
UPROPERTY(Transient, VisibleAnywhere, Category="Base", meta=(MultiLine=true, ShowOnlyInnerProperties))
TArray<FText> Preview;
FSimpleDelegate PreviewsUpdated;
#endif
protected:
// Combo input to respond to in order to reach this action.
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category="Combo Input|Action")
TObjectPtr<class UComboInputAsset> ComboInput;
// Trigger event to respond to in order to reach this action.
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category="Combo Input|Action")
EComboActionTriggerEvent TriggerEvent = EComboActionTriggerEvent::Activated;
// Combo action to fire upon this node's activation.
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Combo Input|Action")
TObjectPtr<class UComboAction> ComboAction;
#if WITH_EDITOR
protected:
virtual bool ValidateNode(TArray<FText> &ValidationMessages, const bool RichFormat) override;
virtual void PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent) override;
virtual FText GetDescription_Implementation() const override;
public:
TArray<FText> GetPreviews() const;
#endif
#if WITH_EDITORONLY_DATA
public:
virtual void UpdatePreviews() { this->Preview = this->GetPreviews(); }
#endif
};

View File

@ -1,35 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Nodes/ComboActionGraphNode.h"
#include "UObject/Object.h"
#include "ComboActionGraphNode_StartNode.generated.h"
/**
* Combo Action Start Node.
*
* This Node will be added to the graph automatically when created.
* This node cannot be created manually.
* This node cannot be deleted.
* Does not implement any logic.
*/
UCLASS(ClassGroup=("Combo Input|Action"), DisplayName="Start Node", meta=(ToolTip="Combo Action Tree: Start Node"))
class COMBOINPUT_API UComboActionGraphNode_StartNode : public UComboActionGraphNode
{
GENERATED_BODY()
public:
UComboActionGraphNode_StartNode();
#if WITH_EDITOR
virtual FText GetDescription_Implementation() const override;
virtual bool ValidateNode(TArray<FText>& ValidationsMessages, const bool RichFormat);
#endif
};

View File

@ -25,19 +25,8 @@ public class ComboInputEditor : ModuleRules
{
"Core",
"CoreUObject",
"Engine",
"UnrealEd",
"ApplicationCore",
"AssetTools",
"BlueprintGraph",
"DeveloperSettings",
"GraphEditor",
"InputCore",
"Projects",
"Slate",
"SlateCore",
"ToolMenus",
"SlateCore"
}
);

View File

@ -1,437 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "ComboActionGraphSchema.h"
#include "ComboActionGraph.h"
//#include "FConnectionDrawingPolicy_ComboActionGraph.h"
#include "GraphEditorActions.h"
#include "Ed/EdComboActionGraphEdge.h"
#include "Ed/EdComboActionGraphNode.h"
#include "Framework/Commands/GenericCommands.h"
#include "Nodes/ComboActionGraphEdge.h"
#include "Nodes/ComboActionGraphNode.h"
#define LOCTEXT_NAMESPACE "ComboActionGraph"
int32 UComboActionGraphSchema::CurrentCacheRefreshID = 0;
UEdGraphNode *FAssetSchemaAction_ComboActionGraphSchema_NewNode::PerformAction(UEdGraph *ParentGraph, UEdGraphPin *FromPin, const FVector2D Location, bool bSelectNewNode)
{
UEdGraphNode *ResultNode = nullptr;
if (this->NodeTemplate != nullptr)
{
const FScopedTransaction Transaction(LOCTEXT("ComboActionGraphEditorNewNode", "Combo Action Graph Editor: New Node"));
ParentGraph->Modify();
if (FromPin != nullptr)
FromPin->Modify();
this->NodeTemplate->Rename(nullptr, ParentGraph);
ParentGraph->AddNode(this->NodeTemplate, true, bSelectNewNode);
this->NodeTemplate->CreateNewGuid();
this->NodeTemplate->PostPlacedNewNode();
this->NodeTemplate->AllocateDefaultPins();
this->NodeTemplate->AutowireNewNode(FromPin);
this->NodeTemplate->NodePosX = Location.X;
this->NodeTemplate->NodePosY = Location.Y;
this->NodeTemplate->ComboActionGraphNode->SetFlags(EObjectFlags::RF_Transactional);
this->NodeTemplate->SetFlags(EObjectFlags::RF_Transactional);
ResultNode = this->NodeTemplate;
}
return ResultNode;
}
void FAssetSchemaAction_ComboActionGraphSchema_NewNode::AddReferencedObjects(FReferenceCollector &Collector)
{
FEdGraphSchemaAction::AddReferencedObjects(Collector);
Collector.AddReferencedObject(this->NodeTemplate);
}
UEdGraphNode *FAssetSchemaAction_ComboActionGraphSchema_NewEdge::PerformAction(UEdGraph *ParentGraph, UEdGraphPin *FromPin, const FVector2D Location, bool bSelectNewNode)
{
UEdGraphNode *ResultNode = nullptr;
if (this->NodeTemplate != nullptr)
{
const FScopedTransaction Transaction(LOCTEXT("ComboActionGraphEditorNewEdge", "Combo Action Graph Editor: New Edge"));
ParentGraph->Modify();
if (FromPin != nullptr)
FromPin->Modify();
this->NodeTemplate->Rename(nullptr, ParentGraph);
ParentGraph->AddNode(this->NodeTemplate, true, bSelectNewNode);
this->NodeTemplate->CreateNewGuid();
this->NodeTemplate->PostPlacedNewNode();
this->NodeTemplate->AllocateDefaultPins();
this->NodeTemplate->AutowireNewNode(FromPin);
this->NodeTemplate->NodePosX = Location.X;
this->NodeTemplate->NodePosY = Location.Y;
this->NodeTemplate->ComboActionGraphEdge->SetFlags(EObjectFlags::RF_Transactional);
this->NodeTemplate->SetFlags(EObjectFlags::RF_Transactional);
ResultNode = this->NodeTemplate;
}
return ResultNode;
}
void FAssetSchemaAction_ComboActionGraphSchema_NewEdge::AddReferencedObjects(FReferenceCollector &Collector)
{
FEdGraphSchemaAction::AddReferencedObjects(Collector);
Collector.AddReferencedObject(this->NodeTemplate);
}
void UComboActionGraphSchema::GetBreakLinkToSubMenuActions(UToolMenu *Menu, UEdGraphPin *InGraphPin)
{
// Make sure we have a unique name for every entry in the list
TMap<FString, uint32> LinkTitleCount;
FToolMenuSection &Section = Menu->FindOrAddSection("ComboActionGraphAssetGraphSchemaPinActions");
// Add all the links we could break from
for (TArray<class UEdGraphPin*>::TConstIterator Links(InGraphPin->LinkedTo); Links; ++Links)
{
UEdGraphPin* Pin = *Links;
FString TitleString = Pin->GetOwningNode()->GetNodeTitle(ENodeTitleType::ListView).ToString();
FText Title = FText::FromString(TitleString);
if (Pin->PinName != TEXT(""))
{
TitleString = FString::Printf(TEXT("%s (%s)"), *TitleString, *Pin->PinName.ToString());
// Add name of connection if possible
FFormatNamedArguments Args;
Args.Add(TEXT("NodeTitle"), Title);
Args.Add(TEXT("PinName"), Pin->GetDisplayName());
Title = FText::Format(LOCTEXT("BreakDescPin", "{NodeTitle} ({PinName})"), Args);
}
uint32& Count = LinkTitleCount.FindOrAdd(TitleString);
FText Description;
FFormatNamedArguments Args;
Args.Add(TEXT("NodeTitle"), Title);
Args.Add(TEXT("NumberOfNodes"), Count);
if (Count == 0)
{
Description = FText::Format(LOCTEXT("BreakDesc", "Break link to {NodeTitle}"), Args);
}
else
{
Description = FText::Format(LOCTEXT("BreakDescMulti", "Break link to {NodeTitle} ({NumberOfNodes})"), Args);
}
++Count;
Section.AddMenuEntry(NAME_None, Description, Description, FSlateIcon(), FUIAction(
FExecuteAction::CreateUObject(this, &UComboActionGraphSchema::BreakSinglePinLink, const_cast<UEdGraphPin*>(InGraphPin), *Links)));
}
}
void UComboActionGraphSchema::GetGraphContextActions(FGraphContextMenuBuilder &ContextMenuBuilder) const
{
UComboActionGraph *Graph = CastChecked<UComboActionGraph>(ContextMenuBuilder.CurrentGraph->GetOuter());
if (Graph->NodeType == nullptr)
{
return;
}
const bool bNoParent = (ContextMenuBuilder.FromPin == NULL);
FText AddToolTip = LOCTEXT("NewMoutneaDialogueGraphNodeTooltip", "Add Dialogue Node here");
TSet<TSubclassOf<UComboActionGraphNode>> Visited;
FText Desc = Graph->NodeType.GetDefaultObject()->ContextMenuName;
FText NodeCategory = Graph->NodeType.GetDefaultObject()->GetNodeCategory();
if (Desc.IsEmpty())
{
FString Title = Graph->NodeType->GetName();
Title.RemoveFromEnd("_C");
Desc = FText::FromString(Title);
}
if (!Graph->NodeType->HasAnyClassFlags(CLASS_Abstract))
{
TSharedPtr<FAssetSchemaAction_ComboActionGraphSchema_NewNode> NewNodeAction(new FAssetSchemaAction_ComboActionGraphSchema_NewNode(NodeCategory, Desc, AddToolTip, 0));
NewNodeAction->NodeTemplate = NewObject<UEdComboActionGraphNode>(ContextMenuBuilder.OwnerOfTemporaries);
NewNodeAction->NodeTemplate->ComboActionGraphNode = NewObject<UComboActionGraphNode>(NewNodeAction->NodeTemplate, Graph->NodeType);
NewNodeAction->NodeTemplate->ComboActionGraphNode->Graph = Graph;
ContextMenuBuilder.AddAction(NewNodeAction);
Visited.Add(Graph->NodeType);
}
for (TObjectIterator<UClass> It; It; ++It)
{
if (It->IsChildOf(Graph->NodeType) && !It->HasAnyClassFlags(CLASS_Abstract) && !Visited.Contains(*It))
{
TSubclassOf<UComboActionGraphNode> NodeType = *It;
if (It->GetName().StartsWith("REINST") || It->GetName().StartsWith("SKEL"))
continue;
if (!Graph->GetClass()->IsChildOf(NodeType.GetDefaultObject()->CompatibleGraphType))
continue;
if (!NodeType.GetDefaultObject()->bAllowManualCreate)
continue;
Desc = NodeType.GetDefaultObject()->ContextMenuName;
AddToolTip = NodeType.GetDefaultObject()->GetDescription();
NodeCategory = NodeType.GetDefaultObject()->GetNodeCategory();
if (Desc.IsEmpty())
{
FString Title = NodeType->GetName();
Title.RemoveFromEnd("_C");
Desc = FText::FromString(Title);
}
TSharedPtr<FAssetSchemaAction_ComboActionGraphSchema_NewNode> Action(new FAssetSchemaAction_ComboActionGraphSchema_NewNode(NodeCategory, Desc, AddToolTip, 0));
Action->NodeTemplate = NewObject<UEdComboActionGraphNode>(ContextMenuBuilder.OwnerOfTemporaries);
Action->NodeTemplate->ComboActionGraphNode = NewObject<UComboActionGraphNode>(Action->NodeTemplate, NodeType);
Action->NodeTemplate->ComboActionGraphNode->Graph = Graph;
ContextMenuBuilder.AddAction(Action);
Visited.Add(NodeType);
}
}
}
void UComboActionGraphSchema::GetContextMenuActions(UToolMenu *Menu, UGraphNodeContextMenuContext *Context) const
{
if (Context->Pin)
{
{
FToolMenuSection& Section = Menu->AddSection("ComboActionGraphAssetGraphSchemaNodeActions", LOCTEXT("PinActionsMenuHeader", "Pin Actions"));
// Only display the 'Break Links' option if there is a link to break!
if (Context->Pin->LinkedTo.Num() > 0)
{
Section.AddMenuEntry(FGraphEditorCommands::Get().BreakPinLinks);
// add sub menu for break link to
if (Context->Pin->LinkedTo.Num() > 1)
{
Section.AddSubMenu(
"BreakLinkTo",
LOCTEXT("BreakLinkTo", "Break Link To..."),
LOCTEXT("BreakSpecificLinks", "Break a specific link..."),
FNewToolMenuDelegate::CreateUObject((UComboActionGraphSchema *const)this, &UComboActionGraphSchema::GetBreakLinkToSubMenuActions, const_cast<UEdGraphPin*>(Context->Pin)));
}
else
{
((UComboActionGraphSchema *const)this)->GetBreakLinkToSubMenuActions(Menu, const_cast<UEdGraphPin*>(Context->Pin));
}
}
}
}
else if (Context->Node)
{
{
FToolMenuSection& Section = Menu->AddSection("ComboActionGraphAssetGraphSchemaNodeActions", LOCTEXT("ClassActionsMenuHeader", "Node Actions"));
Section.AddSeparator(FName(TEXT("Main Options")));
Section.AddMenuEntry(FGenericCommands::Get().Rename);
Section.AddSeparator(FName(TEXT("Other Options")));
Section.AddMenuEntry(FGenericCommands::Get().Delete);
Section.AddMenuEntry(FGenericCommands::Get().Cut);
Section.AddMenuEntry(FGenericCommands::Get().Copy);
Section.AddMenuEntry(FGenericCommands::Get().Duplicate);
Section.AddMenuEntry(FGraphEditorCommands::Get().BreakNodeLinks);
}
}
Super::GetContextMenuActions(Menu, Context);
}
const FPinConnectionResponse UComboActionGraphSchema::CanCreateConnection(const UEdGraphPin *A, const UEdGraphPin *B) const
{
// Make sure the pins are not on the same node
if (A->GetOwningNode() == B->GetOwningNode())
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorSameNode", "Both are on the same node"));
}
// Compare the directions
if ((A->Direction == EGPD_Input) && (B->Direction == EGPD_Input))
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorInput", "Can't connect input node to input node"));
}
else if ((A->Direction == EGPD_Output) && (B->Direction == EGPD_Output))
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorOutput", "Can't connect output node to output node"));
}
// check for cycles
FComboActionNodeVisitorCycleChecker CycleChecker;
if (!CycleChecker.CheckForLoop(A->GetOwningNode(), B->GetOwningNode()))
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorCycle", "Can't create a graph cycle"));
}
if (!CycleChecker.CheckForLoop(B->GetOwningNode(), A->GetOwningNode()))
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinErrorCycle", "Can't create a graph cycle"));
}
UEdComboActionGraphNode* EdNode_A = Cast<UEdComboActionGraphNode>(A->GetOwningNode());
UEdComboActionGraphNode* EdNode_B = Cast<UEdComboActionGraphNode>(B->GetOwningNode());
if (EdNode_A == nullptr || EdNode_B == nullptr)
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, LOCTEXT("PinError", "Not a valid UComboActionGraphEdNode"));
}
FText ErrorMessage;
if (A->Direction == EGPD_Input)
{
if (!EdNode_A->ComboActionGraphNode->CanCreateConnection(EdNode_B->ComboActionGraphNode, EGPD_Input, ErrorMessage))
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, ErrorMessage);
}
}
else
{
if (!EdNode_B->ComboActionGraphNode->CanCreateConnection(EdNode_A->ComboActionGraphNode, EGPD_Output, ErrorMessage))
{
return FPinConnectionResponse(CONNECT_RESPONSE_DISALLOW, ErrorMessage);
}
}
if (EdNode_A->ComboActionGraphNode->GetGraph()->bEdgeEnabled)
{
return FPinConnectionResponse(CONNECT_RESPONSE_MAKE_WITH_CONVERSION_NODE, LOCTEXT("PinConnect", "Connect nodes with edge"));
}
else
{
return FPinConnectionResponse(CONNECT_RESPONSE_MAKE, LOCTEXT("PinConnect", "Connect nodes"));
}
}
bool UComboActionGraphSchema::CreateAutomaticConversionNodeAndConnections(UEdGraphPin *A, UEdGraphPin *B) const
{
UEdComboActionGraphNode *NodeA = Cast<UEdComboActionGraphNode>(A->GetOwningNode());
UEdComboActionGraphNode *NodeB = Cast<UEdComboActionGraphNode>(B->GetOwningNode());
if (NodeA == nullptr || NodeB == nullptr)
return false;
if (NodeA->GetInputPin() == nullptr || NodeA->GetOutputPin() == nullptr || NodeB->GetInputPin() == nullptr || NodeB->GetOutputPin() == nullptr)
return false;
UComboActionGraph* Graph = NodeA->ComboActionGraphNode->GetGraph();
FVector2D InitPos((NodeA->NodePosX + NodeB->NodePosX) / 2, (NodeA->NodePosY + NodeB->NodePosY) / 2);
FAssetSchemaAction_ComboActionGraphSchema_NewEdge Action;
Action.NodeTemplate = NewObject<UEdComboActionGraphEdge>(NodeA->GetGraph());
Action.NodeTemplate->SetEdge(NewObject<UComboActionGraphEdge>(Action.NodeTemplate, Graph->EdgeType));
UEdComboActionGraphEdge *EdgeNode = Cast<UEdComboActionGraphEdge>(Action.PerformAction(NodeA->GetGraph(), nullptr, InitPos, false));
if (A->Direction == EEdGraphPinDirection::EGPD_Output)
{
EdgeNode->CreateConnections(NodeA, NodeB);
}
else
{
EdgeNode->CreateConnections(NodeB, NodeA);
}
return true;
}
FConnectionDrawingPolicy *UComboActionGraphSchema::CreateConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float InZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj) const
{
/*
if (const UMounteaDialogueGraphEditorSettings* MounteaDialogueGraphEditorSettings = GetMutableDefault<UMounteaDialogueGraphEditorSettings>())
{
if (MounteaDialogueGraphEditorSettings->AllowAdvancedWiring())
{
return new FConnectionDrawingPolicy_AdvancedMounteaDialogueGraph(InBackLayerID, InFrontLayerID, InZoomFactor, InClippingRect, InDrawElements, InGraphObj);
}
}
*/
//return new FConnectionDrawingPolicy_ComboActionGraph(InBackLayerID, InFrontLayerID, InZoomFactor, InClippingRect, InDrawElements, InGraphObj);
return nullptr;
}
FLinearColor UComboActionGraphSchema::GetPinTypeColor(const FEdGraphPinType &PinType) const
{
return FColor::White;
}
void UComboActionGraphSchema::BreakNodeLinks(UEdGraphNode &TargetNode) const
{
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakNodeLinks", "Break Node Links"));
Super::BreakNodeLinks(TargetNode);
}
void UComboActionGraphSchema::BreakPinLinks(UEdGraphPin &TargetPin, bool bSendsNodeNotifcation) const
{
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakPinLinks", "Break Pin Links"));
Super::BreakPinLinks(TargetPin, bSendsNodeNotifcation);
}
void UComboActionGraphSchema::BreakSinglePinLink(UEdGraphPin *SourcePin, UEdGraphPin *TargetPin) const
{
const FScopedTransaction Transaction(NSLOCTEXT("UnrealEd", "GraphEd_BreakSinglePinLink", "Break Pin Link"));
Super::BreakSinglePinLink(SourcePin, TargetPin);
}
UEdGraphPin *UComboActionGraphSchema::DropPinOnNode(UEdGraphNode *InTargetNode, const FName &InSourcePinName, const FEdGraphPinType &InSourcePinType, EEdGraphPinDirection InSourcePinDirection) const
{
UEdComboActionGraphNode *EdNode = Cast<UEdComboActionGraphNode>(InTargetNode);
switch (InSourcePinDirection)
{
case EEdGraphPinDirection::EGPD_Input:
return EdNode->GetOutputPin();
case EEdGraphPinDirection::EGPD_Output:
return EdNode->GetInputPin();
default:
return nullptr;
}
}
bool UComboActionGraphSchema::SupportsDropPinOnNode(UEdGraphNode *InTargetNode, const FEdGraphPinType &InSourcePinType, EEdGraphPinDirection InSourcePinDirection, FText &OutErrorMessage) const
{
return Cast<UEdComboActionGraphNode>(InTargetNode) != nullptr;
}
bool UComboActionGraphSchema::IsCacheVisualizationOutOfDate(int32 InVisualizationCacheID) const
{
return CurrentCacheRefreshID != InVisualizationCacheID;
}
int32 UComboActionGraphSchema::GetCurrentVisualizationCacheID() const
{
return CurrentCacheRefreshID;
}
void UComboActionGraphSchema::ForceVisualizationCacheClear() const
{
CurrentCacheRefreshID++;
}
void UComboActionGraphSchema::CreateDefaultNodesForGraph(UEdGraph &Graph) const
{
Super::CreateDefaultNodesForGraph(Graph);
}
#undef LOCTEXT_NAMESPACE

View File

@ -1,164 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ComboActionGraphSchema.generated.h"
class FComboActionNodeVisitorCycleChecker
{
public:
/** Check whether a loop in the graph would be caused by linking the passed-in nodes */
bool CheckForLoop(UEdGraphNode *StartNode, UEdGraphNode *EndNode)
{
VisitedNodes.Add(StartNode);
if (!QuiCheckDirectConnections(StartNode, EndNode))
{
return false;
}
return TraverseInputNodesToRoot(EndNode);
}
private:
bool TraverseInputNodesToRoot(UEdGraphNode *Node)
{
VisitedNodes.Add(Node);
for (int32 PinIndex = 0; PinIndex < Node->Pins.Num(); ++PinIndex)
{
UEdGraphPin *MyPin = Node->Pins[PinIndex];
if (MyPin->Direction == EGPD_Output)
{
for (int32 LinkedPinIndex = 0; LinkedPinIndex < MyPin->LinkedTo.Num(); ++LinkedPinIndex)
{
UEdGraphPin *OtherPin = MyPin->LinkedTo[LinkedPinIndex];
if (OtherPin)
{
UEdGraphNode *OtherNode = OtherPin->GetOwningNode();
if (VisitedNodes.Contains(OtherNode))
{
return false;
}
else
{
return TraverseInputNodesToRoot(OtherNode);
}
}
}
}
}
return true;
}
bool QuiCheckDirectConnections(UEdGraphNode *A, UEdGraphNode *B)
{
for (auto Itr : B->Pins)
{
if (A->Pins.Contains(Itr))
{
return false;
}
}
for (auto Itr : A->Pins)
{
if (B->Pins.Contains(Itr))
{
return false;
}
}
return true;
}
TSet<UEdGraphNode *> VisitedNodes;
};
/** Action to add a node to the graph */
USTRUCT()
struct FAssetSchemaAction_ComboActionGraphSchema_NewNode : public FEdGraphSchemaAction
{
GENERATED_BODY();
public:
FAssetSchemaAction_ComboActionGraphSchema_NewNode() : NodeTemplate(nullptr){}
FAssetSchemaAction_ComboActionGraphSchema_NewNode(const FText &InNodeCategory, const FText &InMenuDesc, const FText &InToolTip, const int32 InGrouping)
: FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), NodeTemplate(nullptr){}
virtual UEdGraphNode *PerformAction(class UEdGraph *ParentGraph, UEdGraphPin *FromPin, const FVector2D Location, bool bSelectNewNode = true) override;
virtual void AddReferencedObjects(FReferenceCollector &Collector) override;
TObjectPtr<class UEdComboActionGraphNode> NodeTemplate;
};
USTRUCT()
struct FAssetSchemaAction_ComboActionGraphSchema_NewEdge : public FEdGraphSchemaAction
{
GENERATED_BODY();
public:
FAssetSchemaAction_ComboActionGraphSchema_NewEdge() : NodeTemplate(nullptr)
{}
FAssetSchemaAction_ComboActionGraphSchema_NewEdge(const FText &InNodeCategory, const FText &InMenuDesc, const FText &InToolTip, const int32 InGrouping)
: FEdGraphSchemaAction(InNodeCategory, InMenuDesc, InToolTip, InGrouping), NodeTemplate(nullptr)
{}
virtual UEdGraphNode *PerformAction(class UEdGraph *ParentGraph, UEdGraphPin *FromPin, const FVector2D Location, bool bSelectNewNode = true) override;
virtual void AddReferencedObjects(FReferenceCollector &Collector) override;
TObjectPtr<class UEdComboActionGraphEdge> NodeTemplate;
};
UCLASS(MinimalAPI)
class UComboActionGraphSchema : public UEdGraphSchema
{
GENERATED_BODY()
public:
void GetBreakLinkToSubMenuActions(class UToolMenu* Menu, class UEdGraphPin* InGraphPin);
virtual EGraphType GetGraphType(const UEdGraph* TestEdGraph) const override { return EGraphType::GT_StateMachine; }
virtual void GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const override;
virtual void GetContextMenuActions(class UToolMenu* Menu, class UGraphNodeContextMenuContext* Context) const override;
virtual const FPinConnectionResponse CanCreateConnection(const UEdGraphPin* A, const UEdGraphPin* B) const override;
virtual bool CreateAutomaticConversionNodeAndConnections(UEdGraphPin* A, UEdGraphPin* B) const override;
virtual class FConnectionDrawingPolicy* CreateConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float InZoomFactor, const FSlateRect& InClippingRect, class FSlateWindowElementList& InDrawElements, class UEdGraph* InGraphObj) const override;
virtual FLinearColor GetPinTypeColor(const FEdGraphPinType& PinType) const override;
virtual void BreakNodeLinks(UEdGraphNode& TargetNode) const override;
virtual void BreakPinLinks(UEdGraphPin& TargetPin, bool bSendsNodeNotifcation) const override;
virtual void BreakSinglePinLink(UEdGraphPin* SourcePin, UEdGraphPin* TargetPin) const override;
virtual UEdGraphPin* DropPinOnNode(UEdGraphNode* InTargetNode, const FName& InSourcePinName, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection) const override;
virtual bool SupportsDropPinOnNode(UEdGraphNode* InTargetNode, const FEdGraphPinType& InSourcePinType, EEdGraphPinDirection InSourcePinDirection, FText& OutErrorMessage) const override;
virtual bool IsCacheVisualizationOutOfDate(int32 InVisualizationCacheID) const override;
virtual int32 GetCurrentVisualizationCacheID() const override;
virtual void ForceVisualizationCacheClear() const override;
virtual void CreateDefaultNodesForGraph(UEdGraph& Graph) const override;
private:
static int32 CurrentCacheRefreshID;
};

View File

@ -2,17 +2,10 @@
#include "ComboInputEditor.h"
#include "ComboActionGraph.h"
#include "ComboInputAssets.h"
#include "ToolMenuSection.h"
#include "AssetTypeActions/AssetTypeActions_DataAsset.h"
#include "Ed/AssetEditor_ComboActionGraph.h"
#include "Ed/EdComboActionGraphEdge.h"
#include "Ed/EdComboActionGraphNode.h"
#include "Ed/FComboActionGraphEditorCommands.h"
#include "Ed/SEdComboActionGraphEdge.h"
#include "Ed/SEdComboActionGraphNode.h"
#include "Interfaces/IPluginManager.h"
#include "Styling/SlateStyle.h"
#include "Styling/SlateStyleMacros.h"
@ -23,7 +16,6 @@
#define LOCTEXT_NAMESPACE "FComboInputEditorModule"
EAssetTypeCategories::Type FComboInputEditorModule::ComboAssetsCategory;
EAssetTypeCategories::Type FComboInputEditorModule::ComboActionGraphCategory;
class FAssetTypeActions_ComboAction : public FAssetTypeActions_DataAsset
@ -36,76 +28,68 @@ public:
virtual UClass *GetSupportedClass() const override { return UComboAction::StaticClass(); }
};
class FAssetTypeActions_ComboSequenceNode : public FAssetTypeActions_DataAsset
{
public:
virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboSequenceNode", "Combo Sequence Node"); }
virtual uint32 GetCategories() override { return FComboInputEditorModule::GetInputAssetsCategory(); }
virtual FColor GetTypeColor() const override { return FColor(255, 127, 255); }
virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboSequenceNodeDesc", "This represents a node in the combo graph, with each key in the ComboBranch being an input this node can react to, and each value containing the action to be executed next, and the node to activate after the action is complete."); }
virtual UClass *GetSupportedClass() const override { return UComboSequenceNode::StaticClass(); }
};
class FAssetTypeActions_ComboInputAsset : public FAssetTypeActions_DataAsset
{
public:
virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboInputAsset", "Combo Input Asset"); }
virtual uint32 GetCategories() override { return FComboInputEditorModule::GetInputAssetsCategory(); }
virtual FColor GetTypeColor() const override { return FColor(255, 127, 255); }
virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboInputAssetDesc", "This maps a sequence of button inputs from EnhancedInput to a combo action that can be used to execute a sequence of moves. This gets sent from the input buffer subsystem to the player controller's ComboManagerComponent, which executes the associated action in the current ComboActionGraph."); }
virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboInputAssetDesc", "This maps a sequence of button inputs from EnhancedInput to a combo action that can be used to execute a sequence of moves.This gets sent from the input buffer subsystem to the player controller's ComboManagerComponent, which executes the associated action in the current ComboSequenceNode."); }
virtual UClass *GetSupportedClass() const override { return UComboInputAsset::StaticClass(); }
};
class FAssetTypeActions_ComboActionGraph : public FAssetTypeActions_Base
{
public:
virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboActionGraph", "Combo Action Graph"); }
virtual uint32 GetCategories() override { return FComboInputEditorModule::GetInputAssetsCategory(); }
virtual FColor GetTypeColor() const override { return FColor(255, 127, 255); }
virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboActionGraphDesc", "A node graph containing a sequence of combo actions. Each node can respond to any number of combo inputs, and when activated will execute the associated event."); }
virtual UClass *GetSupportedClass() const override { return UComboActionGraph::StaticClass(); }
virtual void OpenAssetEditor(const TArray<UObject*> &InObjects, TSharedPtr<class IToolkitHost> EditWithinLevelEditor = TSharedPtr<IToolkitHost>()) override
{
const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone;
for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ObjIt++)
{
if (UComboActionGraph *Graph = Cast<UComboActionGraph>(*ObjIt))
{
TSharedRef<FAssetEditor_ComboActionGraph> NewGraphEditor(new FAssetEditor_ComboActionGraph());
NewGraphEditor->InitComboActionGraphAssetEditor(Mode, EditWithinLevelEditor, Graph);
}
}
}
};
class FComboActionGraphPanelNodeFactory : public FGraphPanelNodeFactory
{
public:
virtual TSharedPtr<class SGraphNode> CreateNode(UEdGraphNode *Node) const override
{
if (UEdComboActionGraphNode *EdGraphNode = Cast<UEdComboActionGraphNode>(Node))
{
return SNew(SEdComboActionGraphNode, EdGraphNode);
}
else if (UEdComboActionGraphEdge *EdGraphEdge = Cast<UEdComboActionGraphEdge>(Node))
{
return SNew(SEdComboActionGraphEdge, EdGraphEdge);
}
return nullptr;
}
};
UComboAction_Factory::UComboAction_Factory(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
this->SupportedClass = UComboAction::StaticClass();
this->bEditAfterNew = true;
this->bCreateNew = true;
SupportedClass = UComboAction::StaticClass();
bEditAfterNew = true;
bCreateNew = true;
}
UObject *UComboAction_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn)
{
if (this->ComboActionClass != nullptr)
{
return NewObject<UComboAction>(InParent, this->ComboActionClass, Name, Flags | EObjectFlags::RF_Transactional, Context);
return NewObject<UComboAction>(InParent, this->ComboActionClass, Name, Flags | RF_Transactional, Context);
}
else
{
check(Class->IsChildOf(UComboAction::StaticClass()));
return NewObject<UComboAction>(InParent, Class, Name, Flags | EObjectFlags::RF_Transactional, Context);
return NewObject<UComboAction>(InParent, Class, Name, Flags | RF_Transactional, Context);
}
}
UComboSequenceNode_Factory::UComboSequenceNode_Factory(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UComboSequenceNode::StaticClass();
bEditAfterNew = true;
bCreateNew = true;
}
UObject *UComboSequenceNode_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn)
{
if (this->ComboSequenceNodeClass != nullptr)
{
return NewObject<UComboSequenceNode>(InParent, this->ComboSequenceNodeClass, Name, Flags | RF_Transactional, Context);
}
else
{
check(Class->IsChildOf(UComboSequenceNode::StaticClass()));
return NewObject<UComboSequenceNode>(InParent, Class, Name, Flags | RF_Transactional, Context);
}
}
@ -113,199 +97,75 @@ UObject *UComboAction_Factory::FactoryCreateNew(UClass *Class, UObject *InParent
UComboInputAsset_Factory::UComboInputAsset_Factory(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
{
this->SupportedClass = UComboInputAsset::StaticClass();
this->bEditAfterNew = true;
this->bCreateNew = true;
SupportedClass = UComboInputAsset::StaticClass();
bEditAfterNew = true;
bCreateNew = true;
}
UObject *UComboInputAsset_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn)
{
if (this->ComboInputAssetClass != nullptr)
{
return NewObject<UComboInputAsset>(InParent, this->ComboInputAssetClass, Name, Flags | EObjectFlags::RF_Transactional, Context);
return NewObject<UComboInputAsset>(InParent, this->ComboInputAssetClass, Name, Flags | RF_Transactional, Context);
}
else
{
check(Class->IsChildOf(UComboInputAsset::StaticClass()));
return NewObject<UComboInputAsset>(InParent, Class, Name, Flags | EObjectFlags::RF_Transactional, Context);
return NewObject<UComboInputAsset>(InParent, Class, Name, Flags | RF_Transactional, Context);
}
}
UComboActionGraph_Factory::UComboActionGraph_Factory(const FObjectInitializer &ObjectInitializer)
: Super(ObjectInitializer)
class FComboInputSlateStyle final : public FSlateStyleSet
{
this->SupportedClass = UComboActionGraph::StaticClass();
this->bEditAfterNew = true;
this->bCreateNew = true;
}
UObject *UComboActionGraph_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn)
{
if (this->ComboActionGraphClass != nullptr)
public:
FComboInputSlateStyle() : FSlateStyleSet("ComboInputEditor")
{
return NewObject<UComboActionGraph>(InParent, this->ComboActionGraphClass, Name, Flags | EObjectFlags::RF_Transactional, Context);
SetParentStyleName(FAppStyle::GetAppStyleSetName());
// The icons are located in /Engine/Plugins/ComboInput/Content/Editor/Slate/Icons
SetContentRoot(FPaths::EnginePluginsDir() / TEXT("ComboInput/Content/Editor/Slate"));
SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate"));
// Combo Input Editor icons
static const FVector2D Icon16 = FVector2D(16.0f, 16.0f);
static const FVector2D Icon64 = FVector2D(64.0f, 64.0f);
Set("ComboInputIcon_Small", new IMAGE_BRUSH_SVG("Icons/ComboInput_16", Icon16));
Set("ComboInputIcon_Large", new IMAGE_BRUSH_SVG("Icons/ComboInput_64", Icon64));
Set("ClassIcon.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_16", Icon16));
Set("ClassThumbnail.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_64", Icon64));
Set("ClassIcon.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16));
Set("ClassThumbnail.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64));
Set("ClassIcon.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_16", Icon16));
Set("ClassThumbnail.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_64", Icon64));
}
else
{
check(Class->IsChildOf(UComboActionGraph::StaticClass()));
return NewObject<UComboActionGraph>(InParent, Class, Name, Flags | EObjectFlags::RF_Transactional, Context);
}
}
};
FComboInputSlateStyle::FComboInputSlateStyle() : FSlateStyleSet("ComboInputEditor")
{
this->SetParentStyleName(FAppStyle::GetAppStyleSetName());
const FString &PluginSlateDir = IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir();
this->SetContentRoot(PluginSlateDir / TEXT("Resources/Slate"));
this->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate"));
// Combo Input Editor icons
static const FVector2D Icon12(12.0f, 12.0f);
static const FVector2D Icon16(16.0f, 16.0f);
static const FVector2D Icon40(40.0f, 40.0f);
static const FVector2D Icon64(64.0f, 64.0f);
this->Set("ComboInputIcon_Small", new IMAGE_BRUSH_SVG("Icons/ComboInput_16", Icon16));
this->Set("ComboInputIcon_Large", new IMAGE_BRUSH_SVG("Icons/ComboInput_64", Icon64));
this->Set("ClassIcon.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_16", Icon16));
this->Set("ClassThumbnail.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_64", Icon64));
this->Set("ClassIcon.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16));
this->Set("ClassThumbnail.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64));
this->Set("ClassIcon.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_16", Icon16));
this->Set("ClassThumbnail.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_64", Icon64));
this->Set("ClassIcon.ComboActionGraph", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16));
this->Set("ClassThumbnail.ComboActionGraph", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64));
// Combo Action Graph editor brushes
{
this->SetContentRoot(PluginSlateDir / TEXT("Resources/Slate/Editor"));
this->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate/Editor"));
this->Set("MDSStyleSet.AutoArrange.small", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon16));
this->Set("MDSStyleSet.AutoArrange", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon40));
this->Set("MDSStyleSet.AutoArrange.large", new IMAGE_BRUSH(TEXT("AutoArrangeIcon"), Icon64));
this->Set("MDSStyleSet.GraphSettings.small", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon16));
this->Set("MDSStyleSet.GraphSettings", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon40));
this->Set("MDSStyleSet.GraphSettings.large", new IMAGE_BRUSH(TEXT("GraphSettings"), Icon64));
this->Set("MDSStyleSet.ValidateGraph.small", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon16));
this->Set("MDSStyleSet.ValidateGraph", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon40));
this->Set("MDSStyleSet.ValidateGraph.large", new IMAGE_BRUSH(TEXT("ValidateGraph"), Icon64));
this->Set("MDSStyleSet.Graph.NodeOverlay", new BOX_BRUSH(TEXT("NodeOverlay"), FMargin(8.0f / 64.0f, 3.0f / 32.0f, 0, 0)));
this->Set("MDSStyleSet.Graph.PinDocksOverlay", new BOX_BRUSH(TEXT("PinDocksOverlay"), FMargin(8.0f / 64.0f, 3.0f / 32.0f, 0, 0)));
this->Set("MDSStyleSet.Graph.SimpleArrow", new IMAGE_BRUSH(TEXT("SimpleArrow"), Icon16));
this->Set("MDSStyleSet.Graph.HollowArrow", new IMAGE_BRUSH(TEXT("HollowArrow"), Icon16));
this->Set("MDSStyleSet.Graph.FancyArrow", new IMAGE_BRUSH(TEXT("FancyArrow"), Icon16));
this->Set("MDSStyleSet.Graph.Bubble", new IMAGE_BRUSH(TEXT("Bubble"), Icon16));
this->Set("MDSStyleSet.Node.SoftEdges", new BOX_BRUSH(TEXT("NodeSoftCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
this->Set("MDSStyleSet.Node.HardEdges", new BOX_BRUSH(TEXT("NodeHardCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
this->Set("MDSStyleSet.Node.TextSoftEdges", new BOX_BRUSH(TEXT("TextSoftCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
this->Set("MDSStyleSet.Node.TextHardEdges", new BOX_BRUSH(TEXT("TextHardCorners"), FMargin(16.f / 64.f, 25.f / 64.f, 16.f / 64.f, 16.f / 64.f)));
this->Set("MDSStyleSet.Node.IndexCircle", new IMAGE_BRUSH(TEXT("IndexIcon"), Icon16));
this->Set("MDSStyleSet.Icon.OK", new IMAGE_BRUSH(TEXT("OKIcon"), Icon16));
this->Set("MDSStyleSet.Icon.Error", new IMAGE_BRUSH(TEXT("ErroIcon"), Icon16));
this->Set("MDSStyleSet.Icon.BulletPoint", new IMAGE_BRUSH(TEXT("CircleBox"), Icon16));
this->Set("MDSStyleSet.Graph.CornerImage", new IMAGE_BRUSH(TEXT("Icon128"), FVector2D(128.0f, 128.0f)));
this->Set("MDSStyleSet.Icon.Browse", new IMAGE_BRUSH(TEXT("BrowseIcon"), Icon12));
this->Set("MDSStyleSet.Icon.Edit", new IMAGE_BRUSH(TEXT("EditIcon"), Icon12));
this->Set("MDSStyleSet.Buttons.Documentation", new IMAGE_BRUSH(TEXT("Documentation"), FVector2D(200.0f, 70.0f)));
this->Set("MDSStyleSet.Buttons.Documentation.small", new IMAGE_BRUSH(TEXT("DocumentationIcon"), Icon12));
this->Set("MDSStyleSet.Node.Icon.large", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon64));
this->Set("MDSStyleSet.Node.Icon", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon16));
this->Set("MDSStyleSet.Node.Icon.small", new IMAGE_BRUSH(TEXT("DialogueNodeIcon"), Icon12));
this->Set("MDSStyleSet.Icon.Close", new IMAGE_BRUSH(TEXT("CloseIcon"), Icon12));
this->Set("MDSStyleSet.Icon.HeartIcon", new IMAGE_BRUSH(TEXT("HeartIcon"), Icon12));
this->Set("MDSStyleSet.Icon.UBIcon", new IMAGE_BRUSH(TEXT("UnrealBucketIcon"), Icon12));
this->Set("MDSStyleSet.Icon.MoneyIcon", new IMAGE_BRUSH(TEXT("MoneyIcon"), Icon12));
this->Set("MDSStyleSet.Buttons.Style", FButtonStyle()
.SetNormal(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, 1, 1, 0.1f)))
.SetHovered(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, .55f, 0, 0.2f)))
.SetPressed(BOX_BRUSH("RoundedSelection_16x", 4.0f / 16.0f, FLinearColor(1, .55f, 0, 0.4f))));
const FScrollBarStyle ScrollBar = GetWidgetStyle<FScrollBarStyle>("ScrollBar");
FTextBlockStyle NormalText = FTextBlockStyle()
.SetFont(DEFAULT_FONT("Regular", FCoreStyle::RegularTextSize))
.SetColorAndOpacity(FSlateColor::UseForeground())
.SetShadowOffset(FVector2D::ZeroVector)
.SetShadowColorAndOpacity(FLinearColor::Black)
.SetHighlightColor(FLinearColor(0.02f, 0.3f, 0.0f))
.SetHighlightShape(BOX_BRUSH("TextBlockHighlightShape", FMargin(3.f / 8.f)));
FTextBlockStyle NodeTitle = FTextBlockStyle(NormalText)
.SetFont(DEFAULT_FONT("Bold", 14))
.SetColorAndOpacity(FLinearColor(230.0f / 255.0f, 230.0f / 255.0f, 230.0f / 255.0f))
.SetShadowOffset(FVector2D(2, 2))
.SetShadowColorAndOpacity(FLinearColor(0.f, 0.f, 0.f, 0.7f));
this->Set("MDSStyleSet.NodeTitle", NodeTitle);
FEditableTextBoxStyle NodeTitleEditableText = FEditableTextBoxStyle()
.SetFont(NormalText.Font)
.SetBackgroundImageNormal(BOX_BRUSH("TextBox", FMargin(4.0f / 16.0f)))
.SetBackgroundImageHovered(BOX_BRUSH("TextBox_Hovered", FMargin(4.0f / 16.0f)))
.SetBackgroundImageFocused(BOX_BRUSH("TextBox_Hovered", FMargin(4.0f / 16.0f)))
.SetBackgroundImageReadOnly(BOX_BRUSH("TextBox_ReadOnly", FMargin(4.0f / 16.0f)))
.SetScrollBarStyle(ScrollBar);
this->Set("MDSStyleSet.NodeTitleEditableText", NodeTitleEditableText);
this->Set("MDSStyleSet.NodeTitleInlineEditableText", FInlineEditableTextBlockStyle()
.SetTextStyle(NodeTitle)
.SetEditableTextBoxStyle(NodeTitleEditableText)
);
}
}
void FComboInputEditorModule::StartupModule()
{
// Register combo action asset
IAssetTools &AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
FComboInputEditorModule::ComboAssetsCategory = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("Combo Input")), LOCTEXT("ComboInputAssetsCategory", "Combo Input"));
FComboInputEditorModule::ComboAssetsCategory = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("Input")), LOCTEXT("InputAssetsCategory", "Input"));
this->RegisterAssetTypeActions(AssetTools, MakeShareable(new FAssetTypeActions_ComboAction));
this->RegisterAssetTypeActions(AssetTools, MakeShareable(new FAssetTypeActions_ComboSequenceNode));
this->RegisterAssetTypeActions(AssetTools, MakeShareable(new FAssetTypeActions_ComboInputAsset));
// Make a new style set for Combo Input, which will register any custom icons for the types in this plugin
this->ComboInputEditorStyleSet = MakeShared<FComboInputSlateStyle>();
FSlateStyleRegistry::RegisterSlateStyle(*this->ComboInputEditorStyleSet.Get());
// Combo Action Graph
{
this->ComboActionGraphPanelNodeFactory = MakeShareable(new FComboActionGraphPanelNodeFactory());
FEdGraphUtilities::RegisterVisualNodeFactory(this->ComboActionGraphPanelNodeFactory);
// Register asset actions
this->ComboActionGraphAssetActions = MakeShared<FAssetTypeActions_ComboActionGraph>();
this->RegisterAssetTypeActions(AssetTools, this->ComboActionGraphAssetActions.ToSharedRef());
}
FComboActionGraphEditorCommands::Register();
StyleSet = MakeShared<FComboInputSlateStyle>();
FSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get());
}
void FComboInputEditorModule::ShutdownModule()
{
FComboActionGraphEditorCommands::Unregister();
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FComboInputEditorModule, ComboInputEditorModule)
IMPLEMENT_MODULE(FComboInputEditorModule, ComboInputEditorModule)

View File

@ -1,922 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "AssetEditor_ComboActionGraph.h"
#include "ComboActionGraph.h"
#include "ComboActionGraphSchema.h"
#include "ComboInputEditor.h"
#include "EdGraphUtilities.h"
#include "GraphEditorActions.h"
#include "Ed/EdComboActionGraph.h"
#include "Ed/EdComboActionGraphEdge.h"
#include "Ed/EdComboActionGraphNode.h"
#include "Ed/FAssetEditorToolbarComboActionGraph.h"
#include "Ed/FComboActionGraphEditorCommands.h"
#include "Framework/Commands/GenericCommands.h"
#include "HAL/PlatformApplicationMisc.h"
#include "Kismet2/BlueprintEditorUtils.h"
#include "Layout/AssetEditorTabs.h"
#include "Layout/ComboActionGraphLayoutStrategy.h"
#include "Layout/ComboActionForceDirectedSolveLayoutStrategy.h"
#include "Layout/ComboActionTreeSolveLayoutStrategy.h"
#include "Nodes/ComboActionGraphNode.h"
#include "Popups/ComboInputPopup_GraphValidation.h"
#include "Search/ComboActionSearchUtils.h"
#include "Search/SComboActionSearch.h"
#include "Settings/ComboActionGraphEditorSettings.h"
#include "UObject/ObjectSaveContext.h"
#define LOCTEXT_NAMESPACE "AssetEditor_ComboActionGraph"
DEFINE_LOG_CATEGORY(LogAssetEditorComboActionGraph);
#pragma region ConstantNames
const FName ComboActionGraphEditorAppName = FName(TEXT("ComboActionGraphEditorApp"));
const FName FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID(TEXT("ComboActionGraphProperty"));
const FName FAssetEditorTabs_ComboActionGraph::ViewportID(TEXT("Viewport"));
const FName FAssetEditorTabs_ComboActionGraph::SearchToolbarID(TEXT("Search"));
#pragma endregion
FAssetEditor_ComboActionGraph::FAssetEditor_ComboActionGraph()
{
this->EditingGraph = nullptr;
this->ComboActionGraphEditorSettings = GetMutableDefault<UComboActionGraphEditorSettings>();
this->OnPackageSavedDelegateHandle = UPackage::PackageSavedWithContextEvent.AddRaw(this, &FAssetEditor_ComboActionGraph::OnPackageSaved);
}
FAssetEditor_ComboActionGraph::~FAssetEditor_ComboActionGraph()
{
this->EditingGraph = nullptr;
UPackage::PackageSavedWithContextEvent.Remove(this->OnPackageSavedDelegateHandle);
this->ToolbarBuilder.Reset();
}
void FAssetEditor_ComboActionGraph::OnPackageSaved(const FString &String, UPackage *Package, FObjectPostSaveContext ObjectPostSaveContext)
{
this->RebuildComboActionGraph();
}
void FAssetEditor_ComboActionGraph::InitComboActionGraphAssetEditor(const EToolkitMode::Type Mode, const TSharedPtr<IToolkitHost>& InitToolkitHost, UComboActionGraph *Graph)
{
this->EditingGraph = Graph;
this->CreateEdGraph();
if (!this->ToolbarBuilder.IsValid())
{
this->ToolbarBuilder = MakeShareable(new FAssetEditorToolbarComboActionGraph(SharedThis(this)));
}
this->BindCommands();
this->CreateInternalWidgets();
TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
this->ToolbarBuilder->AddComboActionGraphToolbar(ToolbarExtender);
// Layout
const TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout = FTabManager::NewLayout("Standalone_ComboActionGraphEditor_LayoutV0.3")
->AddArea
(
FTabManager::NewPrimaryArea()->SetOrientation(EOrientation::Orient_Vertical)
->Split
(
FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Horizontal)->SetSizeCoefficient(0.9f)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(3.f)
->AddTab(FAssetEditorTabs_ComboActionGraph::ViewportID, ETabState::OpenedTab)->SetHideTabWell(true)
)
->Split
(
FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Vertical)
->Split
(
FTabManager::NewSplitter()->SetOrientation(EOrientation::Orient_Vertical)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.9f)
->AddTab(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID, ETabState::OpenedTab)->SetHideTabWell(true)
)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.3f)
->AddTab(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, ETabState::OpenedTab)
)
)
)
)
);
const bool bCreateDefaultStandaloneMenu = true;
const bool bCreateDefaultToolbar = true;
FAssetEditorToolkit::InitAssetEditor
(
Mode,
InitToolkitHost,
ComboActionGraphEditorAppName,
StandaloneDefaultLayout,
bCreateDefaultStandaloneMenu,
bCreateDefaultToolbar,
EditingGraph,
false
);
this->RegenerateMenusAndToolbars();
}
UComboActionGraphEditorSettings *FAssetEditor_ComboActionGraph::GetSettings() const
{
return this->ComboActionGraphEditorSettings;
}
void FAssetEditor_ComboActionGraph::RegisterTabSpawners(const TSharedRef<FTabManager> &InTabManager)
{
this->WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_ComboActionTreeEditor", "Combo Action Tree Editor"));
auto WorkspaceMenuCategoryRef = this->WorkspaceMenuCategory.ToSharedRef();
FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Viewport))
.SetDisplayName(LOCTEXT("GraphCanvasTab", "Viewport"))
.SetGroup(WorkspaceMenuCategoryRef)
.SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "GraphEditor.EventGraph_16x"));
InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Details))
.SetDisplayName(LOCTEXT("DetailsTab", "Property"))
.SetGroup(WorkspaceMenuCategoryRef)
.SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Details"));
InTabManager->RegisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID, FOnSpawnTab::CreateSP(this, &FAssetEditor_ComboActionGraph::SpawnTab_Search))
.SetDisplayName(LOCTEXT("SearchTab", "Search"))
.SetGroup(WorkspaceMenuCategoryRef)
.SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "Kismet.Tabs.FindResults"));
}
void FAssetEditor_ComboActionGraph::UnregisterTabSpawners(const TSharedRef<FTabManager> &InTabManager)
{
FAssetEditorToolkit::UnregisterTabSpawners(InTabManager);
InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ViewportID);
InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID);
InTabManager->UnregisterTabSpawner(FAssetEditorTabs_ComboActionGraph::SearchToolbarID);
}
bool FAssetEditor_ComboActionGraph::CloseWindow(EAssetEditorCloseReason InCloseReason)
{
const bool bSatisfied = FAssetEditorToolkit::CloseWindow(InCloseReason);
if (this->EditingGraph)
{
if (this->EditingGraph->EdGraph)
{
UEdComboActionGraph *EdGraph = Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph);
if (EdGraph->GetComboActionEditorPtr().HasSameObject(this)) EdGraph->ResetDialogueEditorPtr();
}
}
return bSatisfied;
}
FName FAssetEditor_ComboActionGraph::GetToolkitFName() const
{
return FName("FComboActionGraphEditor");
}
FText FAssetEditor_ComboActionGraph::GetBaseToolkitName() const
{
return LOCTEXT("ComboActionGraphEditorAppLabel", "Combo Action Graph Editor");
}
FText FAssetEditor_ComboActionGraph::GetToolkitName() const
{
const bool bDirtyState = this->EditingGraph->GetOutermost()->IsDirty();
FFormatNamedArguments Args;
Args.Add(TEXT("ComboActionGraphName"), FText::FromString(this->EditingGraph->GetName()));
Args.Add(TEXT("DirtyState"), bDirtyState ? FText::FromString(TEXT("*")) : FText::GetEmpty());
return FText::Format(LOCTEXT("ComboActionGraphEditorToolkitName", "{ComboActionGraphName}{DirtyState}"), Args);
}
FText FAssetEditor_ComboActionGraph::GetToolkitToolTipText() const
{
return FAssetEditorToolkit::GetToolTipTextForObject(EditingGraph);
}
FLinearColor FAssetEditor_ComboActionGraph::GetWorldCentricTabColorScale() const
{
return FLinearColor::Gray;
}
FString FAssetEditor_ComboActionGraph::GetWorldCentricTabPrefix() const
{
return TEXT("ComboActionGraphEditor");
}
FString FAssetEditor_ComboActionGraph::GetDocumentationLink() const
{
return TEXT("There should be a link to the documentation here someday.");
}
void FAssetEditor_ComboActionGraph::SaveAsset_Execute()
{
if (this->EditingGraph != nullptr)
{
this->RebuildComboActionGraph();
}
FAssetEditorToolkit::SaveAsset_Execute();
}
void FAssetEditor_ComboActionGraph::UpdateToolbar()
{
// TODO
}
void FAssetEditor_ComboActionGraph::RegisterToolbarTab(const TSharedRef<FTabManager> &InTabManager)
{
FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
}
void FAssetEditor_ComboActionGraph::AddReferencedObjects(FReferenceCollector &Collector)
{
Collector.AddReferencedObject(this->EditingGraph);
Collector.AddReferencedObject(this->EditingGraph->EdGraph);
}
FString FAssetEditor_ComboActionGraph::GetReferencerName() const
{
return TEXT("FAssetEditor_ComboActionGraph");
}
void FAssetEditor_ComboActionGraph::SetDialogueBeingEdited(UComboActionGraph *NewDialogue)
{
if (NewDialogue == nullptr || NewDialogue == this->EditingGraph)
{
return;
}
UComboActionGraph *Previous = this->EditingGraph;
this->EditingGraph = NewDialogue;
this->RemoveEditingObject(Previous);
this->AddEditingObject(NewDialogue);
}
void FAssetEditor_ComboActionGraph::CreateInternalWidgets()
{
this->ViewportWidget = this->CreateViewportWidget();
FDetailsViewArgs Args;
Args.bUpdatesFromSelection = false;
Args.bLockable = false;
Args.bAllowSearch = true;
Args.NameAreaSettings = FDetailsViewArgs::HideNameArea;
Args.bHideSelectionTip = false;
Args.bShowObjectLabel = false;
FPropertyEditorModule &PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
this->PropertyWidget = PropertyModule.CreateDetailView(Args);
this->PropertyWidget->SetObject(this->EditingGraph);
this->PropertyWidget->OnFinishedChangingProperties().AddSP(this, &FAssetEditor_ComboActionGraph::OnFinishedChangingProperties);
this->FindResultsView = SNew(SComboActionSearch, SharedThis(this));
}
TSharedRef<SGraphEditor> FAssetEditor_ComboActionGraph::CreateViewportWidget()
{
const FComboInputEditorModule &Module = FModuleManager::GetModuleChecked<FComboInputEditorModule>("ComboInputEditor");
FGraphAppearanceInfo AppearanceInfo;
AppearanceInfo.CornerText = LOCTEXT("AppearanceCornerText_ComboActionGraph", "Combo Action Tree");
AppearanceInfo.CornerImage = Module.Get().GetComboInputEditorStyleSet()->GetBrush(TEXT("MDSStyleSet.Graph.CornerImage"));
AppearanceInfo.InstructionText = LOCTEXT("InstructionText_ComboActionGraph", "Place action nodes by right clicking.");
this->CreateCommandList();
SGraphEditor::FGraphEditorEvents InEvents;
InEvents.OnSelectionChanged = SGraphEditor::FOnSelectionChanged::CreateSP(this, &FAssetEditor_ComboActionGraph::OnSelectedNodesChanged);
InEvents.OnNodeDoubleClicked = FSingleNodeEvent::CreateSP(this, &FAssetEditor_ComboActionGraph::OnNodeDoubleClicked);
return SNew(SGraphEditor)
.AdditionalCommands(GraphEditorCommands)
.IsEditable(true)
.Appearance(AppearanceInfo)
.GraphToEdit(EditingGraph->EdGraph)
.GraphEvents(InEvents)
.AutoExpandActionMenu(true)
.ShowGraphStateOverlay(false);
}
void FAssetEditor_ComboActionGraph::BindCommands()
{
this->ToolkitCommands->MapAction
(
FComboActionGraphEditorCommands::Get().AutoArrange,
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::AutoArrange),
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanAutoArrange)
);
this->ToolkitCommands->MapAction
(
FComboActionGraphEditorCommands::Get().ValidateGraph,
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::ValidateGraph),
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanValidateGraph)
);
}
void FAssetEditor_ComboActionGraph::CreateEdGraph()
{
if (this->EditingGraph->EdGraph == nullptr)
{
this->EditingGraph->EdGraph = CastChecked<UEdComboActionGraph>(FBlueprintEditorUtils::CreateNewGraph(EditingGraph, NAME_None, UEdComboActionGraph::StaticClass(), UComboActionGraphSchema::StaticClass()));
this->EditingGraph->EdGraph->bAllowDeletion = false;
// Give the schema a chance to fill out any required nodes (like the results node)
const UEdGraphSchema *Schema = this->EditingGraph->EdGraph->GetSchema();
Schema->CreateDefaultNodesForGraph(*this->EditingGraph->EdGraph);
UEdComboActionGraph *ComboActionGraph = Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph);
UEdComboActionGraphNode *NewNode = ComboActionGraph->CreateIntermediateNode<UEdComboActionGraphNode>();
NewNode->SetComboActionGraphNode(this->EditingGraph->StartNode);
NewNode->CreateNewGuid();
NewNode->PostPlacedNewNode();
NewNode->AllocateDefaultPins();
NewNode->AutowireNewNode(nullptr);
NewNode->NodePosX = 0;
NewNode->NodePosY = 0;
NewNode->ComboActionGraphNode->SetFlags(EObjectFlags::RF_Transactional);
NewNode->SetFlags(EObjectFlags::RF_Transactional);
ComboActionGraph->RebuildComboActionGraph();
}
if (UEdComboActionGraph *EdComboActionGraph = Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph))
{
EdComboActionGraph->SetDialogueEditorPtr(SharedThis(this));
EdComboActionGraph->RebuildComboActionGraph();
}
}
void FAssetEditor_ComboActionGraph::CreateCommandList()
{
if (this->GraphEditorCommands.IsValid())
{
return;
}
this->GraphEditorCommands = MakeShareable(new FUICommandList);
this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().AutoArrange,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::AutoArrange),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanAutoArrange));
this->GraphEditorCommands->MapAction(FComboActionGraphEditorCommands::Get().ValidateGraph,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::ValidateGraph),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanValidateGraph));
this->GraphEditorCommands->MapAction(FGenericCommands::Get().SelectAll,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::SelectAllNodes),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanSelectAllNodes)
);
this->GraphEditorCommands->MapAction(FGenericCommands::Get().Delete,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::DeleteSelectedNodes),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanDeleteNodes)
);
this->GraphEditorCommands->MapAction(FGenericCommands::Get().Copy,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CopySelectedNodes),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanCopyNodes)
);
this->GraphEditorCommands->MapAction(FGenericCommands::Get().Cut,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CutSelectedNodes),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanCutNodes)
);
this->GraphEditorCommands->MapAction(FGenericCommands::Get().Paste,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::PasteNodes),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanPasteNodes)
);
this->GraphEditorCommands->MapAction(FGenericCommands::Get().Duplicate,
FExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::DuplicateNodes),
FCanExecuteAction::CreateRaw(this, &FAssetEditor_ComboActionGraph::CanDuplicateNodes)
);
this->GraphEditorCommands->MapAction(FGenericCommands::Get().Rename,
FExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::OnRenameNode),
FCanExecuteAction::CreateSP(this, &FAssetEditor_ComboActionGraph::CanRenameNodes)
);
}
TSharedPtr<SGraphEditor> FAssetEditor_ComboActionGraph::GetCurrentGraphEditor() const
{
return this->ViewportWidget;
}
FGraphPanelSelectionSet FAssetEditor_ComboActionGraph::GetSelectedNodes() const
{
FGraphPanelSelectionSet CurrentSelection;
TSharedPtr<SGraphEditor> FocusedGraphEd = this->GetCurrentGraphEditor();
if (FocusedGraphEd.IsValid())
{
CurrentSelection = FocusedGraphEd->GetSelectedNodes();
}
return CurrentSelection;
}
void FAssetEditor_ComboActionGraph::RebuildComboActionGraph()
{
if (this->EditingGraph == nullptr)
{
UE_LOG(LogAssetEditorComboActionGraph, Warning, TEXT("[RebuildComboActionGraph] EditingGraph is nullptr"));
return;
}
UEdComboActionGraph *EdGraph = Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph);
check(EdGraph != nullptr);
EdGraph->RebuildComboActionGraph();
}
void FAssetEditor_ComboActionGraph::SelectAllNodes()
{
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (CurrentGraphEditor.IsValid())
{
CurrentGraphEditor->SelectAllNodes();
}
}
void FAssetEditor_ComboActionGraph::DeleteSelectedNodes()
{
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (!CurrentGraphEditor.IsValid())
{
return;
}
const FScopedTransaction Transaction(FGenericCommands::Get().Delete->GetDescription());
CurrentGraphEditor->GetCurrentGraph()->Modify();
const FGraphPanelSelectionSet SelectedNodes = CurrentGraphEditor->GetSelectedNodes();
CurrentGraphEditor->ClearSelectionSet();
for (FGraphPanelSelectionSet::TConstIterator NodeIt(SelectedNodes); NodeIt; ++NodeIt)
{
UEdGraphNode* EdNode = Cast<UEdGraphNode>(*NodeIt);
if (EdNode == nullptr || !EdNode->CanUserDeleteNode())
continue;;
if (UEdComboActionGraphNode *EdNode_Node = Cast<UEdComboActionGraphNode>(EdNode))
{
EdNode_Node->Modify();
const UEdGraphSchema *Schema = EdNode_Node->GetSchema();
if (Schema != nullptr)
{
Schema->BreakNodeLinks(*EdNode_Node);
}
EdNode_Node->DestroyNode();
}
else
{
EdNode->Modify();
EdNode->DestroyNode();
}
}
// Update UI
CurrentGraphEditor->NotifyGraphChanged();
UEdGraph *EdGraph = CurrentGraphEditor->GetCurrentGraph();
UObject *GraphOwner = EdGraph->GetOuter();
if (GraphOwner)
{
GraphOwner->PostEditChange();
GraphOwner->MarkPackageDirty();
}
this->RebuildComboActionGraph();
}
bool FAssetEditor_ComboActionGraph::CanDeleteNodes() const
{
// If any of the nodes can be deleted then we should allow deleting
const FGraphPanelSelectionSet SelectedNodes = this->GetSelectedNodes();
for (FGraphPanelSelectionSet::TConstIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
{
UEdGraphNode* Node = Cast<UEdGraphNode>(*SelectedIter);
if (Node != nullptr && Node->CanUserDeleteNode())
{
return true;
}
}
return false;
}
void FAssetEditor_ComboActionGraph::DeleteSelectedDuplicatableNodes()
{
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (!CurrentGraphEditor.IsValid())
{
return;
}
const FGraphPanelSelectionSet OldSelectedNodes = CurrentGraphEditor->GetSelectedNodes();
CurrentGraphEditor->ClearSelectionSet();
for (FGraphPanelSelectionSet::TConstIterator SelectedIter(OldSelectedNodes); SelectedIter; ++SelectedIter)
{
UEdGraphNode *Node = Cast<UEdGraphNode>(*SelectedIter);
if (Node && Node->CanDuplicateNode())
{
CurrentGraphEditor->SetNodeSelection(Node, true);
}
}
// Delete the duplicatable nodes
this->DeleteSelectedNodes();
CurrentGraphEditor->ClearSelectionSet();
for (FGraphPanelSelectionSet::TConstIterator SelectedIter(OldSelectedNodes); SelectedIter; ++SelectedIter)
{
if (UEdGraphNode* Node = Cast<UEdGraphNode>(*SelectedIter))
{
CurrentGraphEditor->SetNodeSelection(Node, true);
}
}
}
void FAssetEditor_ComboActionGraph::CutSelectedNodes()
{
this->CopySelectedNodes();
this->DeleteSelectedDuplicatableNodes();
}
void FAssetEditor_ComboActionGraph::CopySelectedNodes()
{
// Export the selected nodes and place the text on the clipboard
FGraphPanelSelectionSet SelectedNodes = this->GetSelectedNodes();
FString ExportedText;
for (FGraphPanelSelectionSet::TIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
{
UEdGraphNode *Node = Cast<UEdGraphNode>(*SelectedIter);
if (Node == nullptr)
{
SelectedIter.RemoveCurrent();
continue;
}
if (UEdComboActionGraphEdge *EdNode_Edge = Cast<UEdComboActionGraphEdge>(*SelectedIter))
{
UEdComboActionGraphNode *StartNode = EdNode_Edge->GetStartNode();
UEdComboActionGraphNode *EndNode = EdNode_Edge->GetEndNode();
if (!SelectedNodes.Contains(StartNode) || !SelectedNodes.Contains(EndNode))
{
SelectedIter.RemoveCurrent();
continue;
}
}
Node->PrepareForCopying();
}
FEdGraphUtilities::ExportNodesToText(SelectedNodes, ExportedText);
FPlatformApplicationMisc::ClipboardCopy(*ExportedText);
}
bool FAssetEditor_ComboActionGraph::CanCopyNodes() const
{
// If any of the nodes can be duplicated then we should allow copying
const FGraphPanelSelectionSet SelectedNodes = this->GetSelectedNodes();
for (FGraphPanelSelectionSet::TConstIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
{
UEdGraphNode *Node = Cast<UEdGraphNode>(*SelectedIter);
if (Node && Node->CanDuplicateNode() == false)
{
return false;
}
}
return true;
}
void FAssetEditor_ComboActionGraph::PasteNodes()
{
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (CurrentGraphEditor.IsValid())
{
this->PasteNodesHere(CurrentGraphEditor->GetPasteLocation());
}
}
void FAssetEditor_ComboActionGraph::PasteNodesHere(const FVector2D &Location)
{
// Find the graph editor with focus
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (!CurrentGraphEditor.IsValid())
{
return;
}
// Select the newly pasted stuff
UEdGraph *EdGraph = CurrentGraphEditor->GetCurrentGraph();
{
const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription());
EdGraph->Modify();
// Clear the selection set (newly pasted stuff will be selected)
CurrentGraphEditor->ClearSelectionSet();
// Grab the text to paste from the clipboard.
FString TextToImport;
FPlatformApplicationMisc::ClipboardPaste(TextToImport);
// Import the nodes
TSet<UEdGraphNode*> PastedNodes;
FEdGraphUtilities::ImportNodesFromText(EdGraph, TextToImport, PastedNodes);
//Average position of nodes so we can move them while still maintaining relative distances to each other
FVector2D AvgNodePosition(0.0f, 0.0f);
for (TSet<UEdGraphNode*>::TIterator It(PastedNodes); It; ++It)
{
UEdGraphNode* Node = *It;
AvgNodePosition.X += Node->NodePosX;
AvgNodePosition.Y += Node->NodePosY;
}
float InvNumNodes = 1.0f / float(PastedNodes.Num());
AvgNodePosition.X *= InvNumNodes;
AvgNodePosition.Y *= InvNumNodes;
// 0 is always Start Node!
int32 SharedIndex = EditingGraph->GetAllNodes().Num();
for (TSet<UEdGraphNode*>::TIterator It(PastedNodes); It; ++It)
{
UEdGraphNode* Node = *It;
CurrentGraphEditor->SetNodeSelection(Node, true);
Node->NodePosX = (Node->NodePosX - AvgNodePosition.X) + Location.X;
Node->NodePosY = (Node->NodePosY - AvgNodePosition.Y) + Location.Y;
Node->SnapToGrid(16);
// Give new node a different Guid from the old one
Node->CreateNewGuid();
if (UEdComboActionGraphNode *MounteaNode = Cast<UEdComboActionGraphNode>(Node))
{
if (MounteaNode->ComboActionGraphNode)
{
MounteaNode->ComboActionGraphNode->OnPasted();
//MounteaNode->SetDialogueNodeIndex(SharedIndex);
}
SharedIndex++;
}
}
}
// Update UI
CurrentGraphEditor->NotifyGraphChanged();
UObject *GraphOwner = EdGraph->GetOuter();
if (GraphOwner)
{
GraphOwner->PostEditChange();
GraphOwner->MarkPackageDirty();
}
this->RebuildComboActionGraph();
}
bool FAssetEditor_ComboActionGraph::CanPasteNodes() const
{
const FGraphPanelSelectionSet SelectedNodes = this->GetSelectedNodes();
for (FGraphPanelSelectionSet::TConstIterator SelectedIter(SelectedNodes); SelectedIter; ++SelectedIter)
{
const UEdComboActionGraphNode *Node = Cast<UEdComboActionGraphNode>(*SelectedIter);
if (Node && Node->CanUserPasteNodes() == false)
{
return false;
}
}
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (!CurrentGraphEditor.IsValid())
{
return false;
}
FString ClipboardContent;
FPlatformApplicationMisc::ClipboardPaste(ClipboardContent);
return FEdGraphUtilities::CanImportNodesFromText(CurrentGraphEditor->GetCurrentGraph(), ClipboardContent);
}
void FAssetEditor_ComboActionGraph::AutoArrange()
{
// For now, auto-arrange is broken. Just in case it can be activated by accident,
// show a popup saying as much if an auto-arrange is attempted.
TArray<FText> ValidationMessages;
ValidationMessages.Add(LOCTEXT("AssetEditor_ComboActionGraph_AutoArrangeDisabled", "Auto-arrange is currently broken."));
ComboInputPopup_GraphValidation::Open(ValidationMessages);
//UEdComboActionGraph *EdGraph = Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph);
//check(EdGraph != nullptr);
//const FScopedTransaction Transaction(LOCTEXT("ComboActionGraphEditorAutoArrange", "Combo Action Graph Editor: Auto Arrange all Nodes"));
//EdGraph->Modify(true);
//UComboActionGraphLayoutStrategy *LayoutStrategy = nullptr;
//switch (this->ComboActionGraphEditorSettings->GetAutoLayoutStrategy())
//{
// case EComboActionAutoLayoutStrategyType::Tree:
// LayoutStrategy = NewObject<UComboActionGraphLayoutStrategy>(EdGraph, UComboActionTreeSolveLayoutStrategy::StaticClass());
// break;
// case EComboActionAutoLayoutStrategyType::ForceDirected:
// LayoutStrategy = NewObject<UComboActionGraphLayoutStrategy>(EdGraph, UComboActionForceDirectedSolveLayoutStrategy::StaticClass());
// break;
// default:
// break;
//}
//if (LayoutStrategy != nullptr)
//{
// LayoutStrategy->Layout(EdGraph);
// LayoutStrategy->ConditionalBeginDestroy();
//}
//else
//{
// UE_LOG(LogAssetEditorComboActionGraph, Error, TEXT("[AutoArrange] LayoutStrategy is null."));
//}
}
bool FAssetEditor_ComboActionGraph::CanAutoArrange() const
{
return this->EditingGraph != nullptr && Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph) != nullptr;
}
void FAssetEditor_ComboActionGraph::ValidateGraph()
{
if (this->ValidationWindow.IsValid())
{
this->ValidationWindow->RequestDestroyWindow();
}
UEdComboActionGraph *EdGraph = Cast<UEdComboActionGraph>(this->EditingGraph->EdGraph);
check(EdGraph != nullptr);
const FScopedTransaction Transaction(LOCTEXT("ComboActionGraphEditorValidateGraph", "Combo Action Graph Editor: Validate Graph."));
UComboActionGraph *ComboActionGraph = EdGraph->GetComboActionGraph();
check(ComboActionGraph != nullptr);
this->RebuildComboActionGraph();
TArray<FText> ValidationMessages;
if (ComboActionGraph->ValidateGraph(ValidationMessages, true) == false)
{
this->ValidationWindow = ComboInputPopup_GraphValidation::Open(ValidationMessages);
}
else
{
ValidationMessages.Empty();
this->ValidationWindow = ComboInputPopup_GraphValidation::Open(ValidationMessages);
}
}
void FAssetEditor_ComboActionGraph::OnRenameNode()
{
TSharedPtr<SGraphEditor> CurrentGraphEditor = this->GetCurrentGraphEditor();
if (CurrentGraphEditor.IsValid())
{
const FGraphPanelSelectionSet SelectedNodes = GetSelectedNodes();
for (FGraphPanelSelectionSet::TConstIterator NodeIt(SelectedNodes); NodeIt; ++NodeIt)
{
UEdGraphNode *SelectedNode = Cast<UEdGraphNode>(*NodeIt);
if (SelectedNode != nullptr && SelectedNode->bCanRenameNode)
{
CurrentGraphEditor->IsNodeTitleVisible(SelectedNode, true);
break;
}
}
}
}
bool FAssetEditor_ComboActionGraph::CanRenameNodes() const
{
check(this->GetSettings() != nullptr);
return this->GetSettings()->AllowRenameNodes() == true && this->GetSelectedNodes().Num() == 1;
}
void FAssetEditor_ComboActionGraph::OnSelectedNodesChanged(const TSet<UObject*> &NewSelection)
{
TArray<UObject*> Selection;
for (UObject* SelectionEntry : NewSelection)
{
Selection.Add(SelectionEntry);
}
if (Selection.Num() == 1)
{
// When just one node is selected, add it to PropertyWidget
this->PropertyWidget->SetObjects(Selection);
this->PropertyWidget->ShowAllAdvancedProperties();
//UComboActionEditorBFC::TriggerPreviewRefresh(Selection);
}
else
{
this->PropertyWidget->SetObject(this->EditingGraph);
}
this->RebuildComboActionGraph();
}
void FAssetEditor_ComboActionGraph::OnNodeDoubleClicked(UEdGraphNode *Node)
{
this->GraphEditorCommands->TryExecuteAction(FGenericCommands::Get().Rename.ToSharedRef());
}
void FAssetEditor_ComboActionGraph::OnFinishedChangingProperties(const FPropertyChangedEvent& PropertyChangedEvent)
{
if (this->EditingGraph == nullptr)
return;
this->EditingGraph->EdGraph->GetSchema()->ForceVisualizationCacheClear();
this->RebuildComboActionGraph();
}
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Viewport(const FSpawnTabArgs &Args)
{
check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ViewportID);
TSharedRef<SDockTab> SpawnedTab = SNew(SDockTab)
.Label(LOCTEXT("ViewportTab_Title", "Viewport"));
if (this->ViewportWidget.IsValid())
{
SpawnedTab->SetContent(this->ViewportWidget.ToSharedRef());
}
return SpawnedTab;
}
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Details(const FSpawnTabArgs& Args)
{
check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::ComboActionGraphPropertyID);
auto DockTab = SNew(SDockTab)
.Label(LOCTEXT("Details_Title", "Property"))
[
this->PropertyWidget.ToSharedRef()
];
DockTab->SetTabIcon(FAppStyle::GetBrush("LevelEditor.Tabs.Details"));
return DockTab;
}
TSharedRef<SDockTab> FAssetEditor_ComboActionGraph::SpawnTab_Search(const FSpawnTabArgs &Args)
{
check(Args.GetTabId() == FAssetEditorTabs_ComboActionGraph::SearchToolbarID);
auto DockTab = SNew(SDockTab)
.Label(LOCTEXT("Search_Title", "Search"))
[
this->FindResultsView.ToSharedRef()
];
DockTab->SetTabIcon(FAppStyle::GetBrush("Kismet.Tabs.FindResults"));
return DockTab;
}
#undef LOCTEXT_NAMESPACE

View File

@ -1,167 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Toolkits/AssetEditorToolkit.h"
DECLARE_LOG_CATEGORY_EXTERN(LogAssetEditorComboActionGraph, Log, All);
class COMBOINPUTEDITOR_API FAssetEditor_ComboActionGraph : public FAssetEditorToolkit, public FNotifyHook, public FGCObject
{
public:
FAssetEditor_ComboActionGraph();
virtual ~FAssetEditor_ComboActionGraph() override;
void OnPackageSaved(const FString &String, UPackage *Package, FObjectPostSaveContext ObjectPostSaveContext);
void InitComboActionGraphAssetEditor(const EToolkitMode::Type Mode, const TSharedPtr<IToolkitHost> &InitToolkitHost, class UComboActionGraph *Graph);
class UComboActionGraphEditorSettings *GetSettings() const;
#pragma region ToolkitInterface
public:
// IToolkit interface
virtual void RegisterTabSpawners(const TSharedRef<FTabManager> &InTabManager) override;
virtual void UnregisterTabSpawners(const TSharedRef<FTabManager> &InTabManager) override;
virtual bool CloseWindow(EAssetEditorCloseReason InCloseReason) override;
// End of IToolkit interface
#pragma endregion
#pragma region AssetEditorToolkit
virtual FName GetToolkitFName() const override;
virtual FText GetBaseToolkitName() const override;
virtual FText GetToolkitName() const override;
virtual FText GetToolkitToolTipText() const override;
virtual FLinearColor GetWorldCentricTabColorScale() const override;
virtual FString GetWorldCentricTabPrefix() const override;
virtual FString GetDocumentationLink() const override;
virtual void SaveAsset_Execute() override;
#pragma endregion
#pragma region Toolbar
void UpdateToolbar();
TSharedPtr<class FAssetEditorToolbarComboActionGraph> GetToolbarBuilder() { return this->ToolbarBuilder; }
void RegisterToolbarTab(const TSharedRef<class FTabManager> &InTabManager);
#pragma endregion
#pragma region SerializableObjectInterface
virtual void AddReferencedObjects(FReferenceCollector &Collector) override;
#pragma endregion
#pragma region FGCObject
virtual FString GetReferencerName() const override;
#pragma endregion
// Gets/Sets the dialogue being edited
class UComboActionGraph *GetEditingGraphSafe()
{
check(EditingGraph);
return EditingGraph;
}
void SetDialogueBeingEdited(class UComboActionGraph *NewDialogue);
virtual void JumpToNode(const class UEdGraphNode *JumpToMe, bool bRequestRename = false, bool bSelectNode = true)
{
if (this->ViewportWidget.IsValid())
{
this->ViewportWidget->JumpToNode(JumpToMe, bRequestRename, bSelectNode);
}
}
private:
void CreateInternalWidgets();
TSharedRef<SGraphEditor> CreateViewportWidget();
void BindCommands();
void CreateEdGraph();
void CreateCommandList();
TSharedPtr<SGraphEditor> GetCurrentGraphEditor() const;
FGraphPanelSelectionSet GetSelectedNodes() const;
void RebuildComboActionGraph();
#pragma region GraphEditorCommands
void SelectAllNodes();
bool CanSelectAllNodes() const { return true; }
void DeleteSelectedNodes();
bool CanDeleteNodes() const;
void DeleteSelectedDuplicatableNodes();
void CutSelectedNodes();
bool CanCutNodes() const { return this->CanCopyNodes() && this->CanDeleteNodes(); }
void CopySelectedNodes();
bool CanCopyNodes() const;
void PasteNodes();
void PasteNodesHere(const FVector2D &Location);
bool CanPasteNodes() const;
void DuplicateNodes() { this->CopySelectedNodes(); this->PasteNodes(); }
bool CanDuplicateNodes() { return this->CanCopyNodes(); }
void AutoArrange();
bool CanAutoArrange() const;
void ValidateGraph();
bool CanValidateGraph() const { return true; }
void OnRenameNode();
bool CanRenameNodes() const;
#pragma endregion
#pragma region GraphEditorEvents
void OnSelectedNodesChanged(const TSet<class UObject*> &NewSelection);
void OnNodeDoubleClicked(UEdGraphNode *Node);
void OnFinishedChangingProperties(const FPropertyChangedEvent &PropertyChangedEvent);
void OnPackageSaved(const FString &PackageFileName, UObject *Outer);
#pragma endregion
#pragma region Variables
private:
TSharedRef<SDockTab> SpawnTab_Viewport(const FSpawnTabArgs &Args);
TSharedRef<SDockTab> SpawnTab_Details(const FSpawnTabArgs &Args);
TSharedRef<SDockTab> SpawnTab_Search(const FSpawnTabArgs &Args);
class UComboActionGraphEditorSettings *ComboActionGraphEditorSettings;
TObjectPtr<class UComboActionGraph> EditingGraph;
//Toolbar
TSharedPtr<FAssetEditorToolbarComboActionGraph> ToolbarBuilder;
/** Handle to the registered OnPackageSave delegate */
FDelegateHandle OnPackageSavedDelegateHandle;
TSharedPtr<SGraphEditor> ViewportWidget;
TSharedPtr<class IDetailsView> PropertyWidget;
TSharedPtr<class SComboActionSearch> FindResultsView;
/** The command list for this editor */
TSharedPtr<FUICommandList> GraphEditorCommands;
TSharedPtr<SWindow> ValidationWindow;
#pragma endregion
};

View File

@ -1,210 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "Ed/EdComboActionGraph.h"
#include "ComboActionGraph.h"
#include "Ed/AssetEditor_ComboActionGraph.h"
#include "Ed/EdComboActionGraphEdge.h"
#include "Ed/EdComboActionGraphNode.h"
#include "Nodes/ComboActionGraphEdge.h"
#include "Nodes/ComboActionGraphNode.h"
//#include "Helpers/MounteaDialogueGraphEditorHelpers.h"
//#include "Helpers/MounteaDialogueGraphEditorUtilities.h"
//#include "Helpers/MounteaDialogueSystemEditorBFC.h"
DEFINE_LOG_CATEGORY(LogEdComboActionGraph);
void UEdComboActionGraph::RebuildComboActionGraph()
{
UE_LOG(LogEdComboActionGraph, Warning, TEXT("UEdComboActionGraph::RebuildComboActionGraph has been called"));
UComboActionGraph *Graph = GetComboActionGraph();
this->Clear();
for (const TObjectPtr<UEdGraphNode> &Node : this->Nodes)
{
if (UEdComboActionGraphNode *EdNode = Cast<UEdComboActionGraphNode>(Node))
{
if (EdNode->ComboActionGraphNode == nullptr)
continue;
UComboActionGraphNode *ComboActionGraphNode = EdNode->ComboActionGraphNode;
this->NodeMap.Add(ComboActionGraphNode, EdNode);
Graph->AllNodes.Add(ComboActionGraphNode);
//EdNode->SetDialogueNodeIndex( Graph->AllNodes.Find(EdNode->ComboActionGraphNode) );
for (int PinIdx = 0; PinIdx < EdNode->Pins.Num(); ++PinIdx)
{
UEdGraphPin* Pin = EdNode->Pins[PinIdx];
if (Pin->Direction != EEdGraphPinDirection::EGPD_Output)
continue;
for (int LinkToIdx = 0; LinkToIdx < Pin->LinkedTo.Num(); ++LinkToIdx)
{
UComboActionGraphNode *ChildNode = nullptr;
if (UEdComboActionGraphNode *EdNode_Child = Cast<UEdComboActionGraphNode>(Pin->LinkedTo[LinkToIdx]->GetOwningNode()))
{
ChildNode = EdNode_Child->ComboActionGraphNode;
}
else if (UEdComboActionGraphEdge *EdNode_Edge = Cast<UEdComboActionGraphEdge>(Pin->LinkedTo[LinkToIdx]->GetOwningNode()))
{
UEdComboActionGraphNode *Child = EdNode_Edge->GetEndNode();;
if (Child != nullptr)
{
ChildNode = Child->ComboActionGraphNode;
}
}
if (ChildNode != nullptr)
{
ComboActionGraphNode->ChildNodes.Add(ChildNode);
ChildNode->ParentNodes.Add(ComboActionGraphNode);
}
else
{
UE_LOG(LogEdComboActionGraph, Error, TEXT("[RebuildComboActionGraph] Can't find child node"));
}
}
}
}
else if (UEdComboActionGraphEdge *EdgeNode = Cast<UEdComboActionGraphEdge>(Node))
{
UEdComboActionGraphNode *StartNode = EdgeNode->GetStartNode();
UEdComboActionGraphNode *EndNode = EdgeNode->GetEndNode();
UComboActionGraphEdge *Edge = EdgeNode->ComboActionGraphEdge;
if (StartNode == nullptr || EndNode == nullptr || Edge == nullptr)
{
UE_LOG(LogEdComboActionGraph, Error, TEXT("[RebuildComboActionGraph] Add edge failed."));
continue;
}
this->EdgeMap.Add(Edge, EdgeNode);
Edge->SetGraph(Graph);
Edge->Rename(nullptr, Graph, REN_DontCreateRedirectors | REN_DoNotDirty);
StartNode->ComboActionGraphNode->Edges.Add(EndNode->ComboActionGraphNode, Edge);
Edge->SetStartNode(StartNode->ComboActionGraphNode);
Edge->SetEndNode(EndNode->ComboActionGraphNode);
}
}
for (UComboActionGraphNode *Node : Graph->AllNodes)
{
if (Node->ParentNodes.Num() == 0)
{
Graph->RootNodes.Add(Node);
SortNodes(Node);
}
Node->Graph = Graph;
Node->Rename(nullptr, Graph, REN_DontCreateRedirectors | REN_DoNotDirty);
}
Graph->RootNodes.Sort([&](const UComboActionGraphNode &L, const UComboActionGraphNode &R)
{
UEdComboActionGraphNode *EdNode_LNode = this->NodeMap[&L];
UEdComboActionGraphNode *EdNode_RNode = this->NodeMap[&R];
return EdNode_LNode->NodePosX < EdNode_RNode->NodePosX;
});
}
UComboActionGraph *UEdComboActionGraph::GetComboActionGraph() const
{
return CastChecked<UComboActionGraph>(GetOuter());
}
bool UEdComboActionGraph::Modify(bool bAlwaysMarkDirty)
{
bool Rtn = Super::Modify(bAlwaysMarkDirty);
this->GetComboActionGraph()->Modify();
for (TObjectPtr<UEdGraphNode> &Node : this->Nodes)
{
Node->Modify();
}
return Rtn;
}
void UEdComboActionGraph::PostEditUndo()
{
this->NotifyGraphChanged();
Super::PostEditUndo();
}
void UEdComboActionGraph::SetDialogueEditorPtr(TWeakPtr<FAssetEditor_ComboActionGraph> NewPtr)
{
this->ComboActionEditorPtr = NewPtr;
}
bool UEdComboActionGraph::JumpToNode(const UComboActionGraphNode *Node)
{
//return FComboActionGraphEditorUtilities::OpenEditorAndJumpToGraphNode(this->ComboActionEditorPtr, *NodeMap.Find(Node));
return false;
}
void UEdComboActionGraph::Clear()
{
UComboActionGraph *Graph = this->GetComboActionGraph();
Graph->ClearGraph();
this->NodeMap.Reset();
this->EdgeMap.Reset();
for (int i = 0; i < this->Nodes.Num(); ++i)
{
if (UEdComboActionGraphNode *EdNode = Cast<UEdComboActionGraphNode>(Nodes[i]))
{
UComboActionGraphNode *MounteaDialogueGraphNode = EdNode->ComboActionGraphNode;
MounteaDialogueGraphNode->ParentNodes.Reset();
MounteaDialogueGraphNode->ChildNodes.Reset();
MounteaDialogueGraphNode->Edges.Reset();
}
}
}
void UEdComboActionGraph::SortNodes(UComboActionGraphNode *RootNode)
{
int Level = 0;
TArray<UComboActionGraphNode*> CurrLevelNodes = { RootNode };
TArray<UComboActionGraphNode*> NextLevelNodes;
while (CurrLevelNodes.Num() != 0)
{
int32 LevelWidth = 0;
for (int i = 0; i < CurrLevelNodes.Num(); ++i)
{
UComboActionGraphNode *Node = CurrLevelNodes[i];
auto Comp = [&](const UComboActionGraphNode &L, const UComboActionGraphNode &R)
{
UEdComboActionGraphNode *EdNode_LNode = NodeMap[&L];
UEdComboActionGraphNode *EdNode_RNode = NodeMap[&R];
return EdNode_LNode->NodePosX < EdNode_RNode->NodePosX;
};
Node->ChildNodes.Sort(Comp);
Node->ParentNodes.Sort(Comp);
for (int j = 0; j < Node->ChildNodes.Num(); ++j)
{
NextLevelNodes.Add(Node->ChildNodes[j]);
}
}
CurrLevelNodes = NextLevelNodes;
NextLevelNodes.Reset();
++Level;
}
}

View File

@ -1,46 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "EdGraph/EdGraph.h"
#include "EdComboActionGraph.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogEdComboActionGraph, Log, All);
UCLASS()
class COMBOINPUTEDITOR_API UEdComboActionGraph : public UEdGraph
{
GENERATED_BODY()
public:
virtual void RebuildComboActionGraph();
UComboActionGraph *GetComboActionGraph() const;
virtual bool Modify(bool bAlwaysMarkDirty) override;
virtual void PostEditUndo() override;
TWeakPtr<class FAssetEditor_ComboActionGraph> GetComboActionEditorPtr() const { return this->ComboActionEditorPtr; }
void SetDialogueEditorPtr(TWeakPtr<class FAssetEditor_ComboActionGraph> NewPtr);
void ResetDialogueEditorPtr() { this->ComboActionEditorPtr.Reset(); }
bool JumpToNode(const class UComboActionGraphNode *Node);
public:
UPROPERTY(Transient)
TMap<class UComboActionGraphNode*, class UEdComboActionGraphNode*> NodeMap;
UPROPERTY(Transient)
TMap<class UComboActionGraphEdge*, class UEdComboActionGraphEdge*> EdgeMap;
protected:
void Clear();
void SortNodes(UComboActionGraphNode *RootNode);
private:
/** Pointer back to the combo action editor that owns us */
TWeakPtr<FAssetEditor_ComboActionGraph> ComboActionEditorPtr;
};

View File

@ -1,83 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "EdComboActionGraphEdge.h"
#include "EdComboActionGraphNode.h"
#include "Nodes/ComboActionGraphEdge.h"
void UEdComboActionGraphEdge::SetEdge(UComboActionGraphEdge *Edge)
{
this->ComboActionGraphEdge = Edge;
}
void UEdComboActionGraphEdge::AllocateDefaultPins()
{
UEdGraphPin* Inputs = this->CreatePin(EGPD_Input, TEXT("Edge"), FName(), TEXT("In"));
Inputs->bHidden = true;
UEdGraphPin* Outputs = this->CreatePin(EGPD_Output, TEXT("Edge"), FName(), TEXT("Out"));
Outputs->bHidden = true;
}
FText UEdComboActionGraphEdge::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return Super::GetNodeTitle(TitleType);
}
void UEdComboActionGraphEdge::PinConnectionListChanged(UEdGraphPin *Pin)
{
if (Pin->LinkedTo.Num() == 0)
{
// Commit suicide; transitions must always have an input and output connection
Modify();
// Our parent graph will have our graph in SubGraphs so needs to be modified to record that.
if (UEdGraph *ParentGraph = GetGraph())
{
ParentGraph->Modify();
}
DestroyNode();
}
}
void UEdComboActionGraphEdge::PrepareForCopying()
{
this->ComboActionGraphEdge->Rename(nullptr, this, REN_DontCreateRedirectors | REN_DoNotDirty);
}
void UEdComboActionGraphEdge::CreateConnections(UEdComboActionGraphNode *Start, UEdComboActionGraphNode *End)
{
Pins[0]->Modify();
Pins[0]->LinkedTo.Empty();
Start->GetOutputPin()->Modify();
Pins[0]->MakeLinkTo(Start->GetOutputPin());
// This to next
Pins[1]->Modify();
Pins[1]->LinkedTo.Empty();
End->GetInputPin()->Modify();
Pins[1]->MakeLinkTo(End->GetInputPin());
}
UEdComboActionGraphNode *UEdComboActionGraphEdge::GetStartNode()
{
if (Pins[0]->LinkedTo.Num() > 0)
{
return Cast<UEdComboActionGraphNode>(Pins[0]->LinkedTo[0]->GetOwningNode());
}
return nullptr;
}
UEdComboActionGraphNode *UEdComboActionGraphEdge::GetEndNode()
{
if (Pins[1]->LinkedTo.Num() > 0)
{
return Cast<UEdComboActionGraphNode>(Pins[1]->LinkedTo[0]->GetOwningNode());
}
return nullptr;
}

View File

@ -1,45 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "EdGraph/EdGraphNode.h"
#include "EdComboActionGraphEdge.generated.h"
/**
*
*/
UCLASS(MinimalAPI)
class UEdComboActionGraphEdge : public UEdGraphNode
{
GENERATED_BODY()
public:
UPROPERTY()
class UEdGraph *Graph;
UPROPERTY(VisibleAnywhere, Instanced, Category="Combo Action Graph")
class UComboActionGraphEdge *ComboActionGraphEdge;
public:
void SetEdge(class UComboActionGraphEdge *Edge);
virtual void AllocateDefaultPins() override;
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
virtual void PinConnectionListChanged(UEdGraphPin *Pin) override;
virtual void PrepareForCopying() override;
virtual UEdGraphPin *GetInputPin() const { return Pins[0]; }
virtual UEdGraphPin *GetOutputPin() const { return Pins[1]; }
void CreateConnections(class UEdComboActionGraphNode *Start, class UEdComboActionGraphNode* End);
class UEdComboActionGraphNode *GetStartNode();
class UEdComboActionGraphNode *GetEndNode();
};

View File

@ -1,173 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "EdComboActionGraphNode.h"
#include "Ed/EdComboActionGraph.h"
#include "Helpers/ComboActionEditorBFC.h"
#include "Nodes/ComboActionGraphNode.h"
#include "Settings/ComboActionGraphEditorSettings.h"
#define LOCTEXT_NAMESPACE "UEdComboActionGraphNode"
DEFINE_LOG_CATEGORY(LogEdComboActionGraphNode);
UEdComboActionGraphNode::UEdComboActionGraphNode()
{
bCanRenameNode = true;
bAllowCopy = true;
bAllowDelete = true;
bAllowDuplicate = true;
bAllowPaste = true;
}
void UEdComboActionGraphNode::SetComboActionGraphNode(UComboActionGraphNode *NewNode)
{
this->ComboActionGraphNode = NewNode;
if (this->ComboActionGraphNode)
{
this->bAllowCopy = this->ComboActionGraphNode->bAllowCopy;
this->bAllowDelete = this->ComboActionGraphNode->bAllowDelete;
this->bAllowDuplicate = this->ComboActionGraphNode->bAllowPaste;
this->bAllowPaste = this->ComboActionGraphNode->bAllowPaste;
}
}
UEdComboActionGraph *UEdComboActionGraphNode::GetEdComboActionGraph() const
{
return Cast<UEdComboActionGraph>(this->GetGraph());
};
void UEdComboActionGraphNode::AllocateDefaultPins()
{
if (this->ComboActionGraphNode == nullptr)
{
UE_LOG(LogEdComboActionGraphNode, Error, TEXT("[AllocateDefaultPins] Cannot find Owning Graph Node!"));
return;
}
if (this->ComboActionGraphNode->bAllowInputNodes)
{
this->CreatePin(EGPD_Input, "MultipleNodes", FName(), TEXT("In"));
}
if (this->ComboActionGraphNode->bAllowOutputNodes)
{
this->CreatePin(EGPD_Output, "MultipleNodes", FName(), TEXT("Out"));
}
}
FText UEdComboActionGraphNode::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return UComboActionEditorBFC::GetNodeTitle(this->ComboActionGraphNode);
}
void UEdComboActionGraphNode::PrepareForCopying()
{
this->ComboActionGraphNode->Rename(nullptr, this, REN_DontCreateRedirectors | REN_DoNotDirty);
}
void UEdComboActionGraphNode::AutowireNewNode(UEdGraphPin* FromPin)
{
Super::AutowireNewNode(FromPin);
if (FromPin != nullptr)
{
if (GetSchema()->TryCreateConnection(FromPin, GetInputPin()))
{
FromPin->GetOwningNode()->NodeConnectionListChanged();
}
}
}
UEdGraphPin* UEdComboActionGraphNode::GetInputPin() const
{
return Pins[0];
}
UEdGraphPin* UEdComboActionGraphNode::GetOutputPin() const
{
if (Pins.IsValidIndex(1))
{
return Pins[1];
}
return Pins[0];
}
bool UEdComboActionGraphNode::CanUserDeleteNode() const
{
if(!Super::CanUserDeleteNode())
{
return false;
}
if (this->ComboActionGraphNode)
{
return this->ComboActionGraphNode->bAllowDelete;
}
return bAllowDelete;
}
bool UEdComboActionGraphNode::CanDuplicateNode() const
{
if(!Super::CanUserDeleteNode())
{
return false;
}
if (this->ComboActionGraphNode)
{
return this->ComboActionGraphNode->bAllowCopy;
}
return bAllowCopy;
}
bool UEdComboActionGraphNode::CanUserPasteNodes() const
{
if (this->ComboActionGraphNode)
{
return this->ComboActionGraphNode->bAllowPaste;
}
return bAllowPaste;
}
FText UEdComboActionGraphNode::GetTooltipText() const
{
if (this->ComboActionGraphNode)
{
return this->ComboActionGraphNode->GetNodeTooltipText();
}
return NSLOCTEXT("UEdComboActionGraphNode", "DefaultToolTip", "Combo Action Node");
}
#if WITH_EDITOR
FLinearColor UEdComboActionGraphNode::GetBackgroundColor() const
{
return this->ComboActionGraphNode ? this->ComboActionGraphNode->GetBackgroundColour() : FLinearColor::Black;
}
FSlateIcon UEdComboActionGraphNode::GetIconAndTint(FLinearColor& OutColor) const
{
static const FSlateIcon Icon = FSlateIcon(FComboInputSlateStyle::GetAppStyleSetName(), "MDSStyleSet.Node.Icon.small");
OutColor = this->ComboActionGraphNode->GetBackgroundColour();
return Icon;
}
#endif
void UEdComboActionGraphNode::PostEditUndo()
{
Super::PostEditUndo();
}
void UEdComboActionGraphNode::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
Super::PostEditChangeProperty(PropertyChangedEvent);
}
#undef LOCTEXT_NAMESPACE

View File

@ -1,62 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "SEdComboActionGraphNode.h"
#include "EdGraph/EdGraphNode.h"
#include "EdComboActionGraphNode.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogEdComboActionGraphNode, Log, All);
/**
*
*/
UCLASS(MinimalAPI)
class UEdComboActionGraphNode : public UEdGraphNode
{
GENERATED_BODY()
public:
UEdComboActionGraphNode();
void SetComboActionGraphNode(UComboActionGraphNode *NewNode);
class UEdComboActionGraph *GetEdComboActionGraph() const;
virtual void AllocateDefaultPins() override;
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
virtual void PrepareForCopying() override;
virtual void AutowireNewNode(UEdGraphPin *FromPin) override;
virtual UEdGraphPin *GetInputPin() const;
virtual UEdGraphPin *GetOutputPin() const;
virtual bool CanUserDeleteNode() const override;
virtual bool CanDuplicateNode() const override;
virtual bool CanUserPasteNodes() const;
virtual FText GetTooltipText() const override;
#if WITH_EDITOR
virtual void PostEditUndo() override;
virtual void PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent) override;
virtual FLinearColor GetBackgroundColor() const;
virtual FSlateIcon GetIconAndTint(FLinearColor &OutColor) const override;
#endif
UPROPERTY(VisibleAnywhere, Instanced, Category="Combo Action Graph")
class UComboActionGraphNode *ComboActionGraphNode;
SEdComboActionGraphNode *SEdNode;
private:
bool bAllowCopy;
bool bAllowDelete;
bool bAllowDuplicate;
bool bAllowPaste;
};

View File

@ -1,44 +0,0 @@
// ©2023 Batty Bovine Productions, LLC. All Rights Reserved.
#include "FAssetEditorToolbarComboActionGraph.h"
#include "ComboInputEditor.h"
#include "Ed/AssetEditor_ComboActionGraph.h"
#include "Ed/FComboActionGraphEditorCommands.h"
#define LOCTEXT_NAMESPACE "AssetEditorToolbarComboActionGraph"
void FAssetEditorToolbarComboActionGraph::AddComboActionGraphToolbar(TSharedPtr<FExtender> Extender)
{
check(this->ComboActionGraphEditor.IsValid());
TSharedPtr<FAssetEditor_ComboActionGraph> ComboActionGraphEditorPtr = this->ComboActionGraphEditor.Pin();
TSharedPtr<FExtender> ToolbarExtender = MakeShareable(new FExtender);
ToolbarExtender->AddToolBarExtension("Asset", EExtensionHook::After, ComboActionGraphEditorPtr->GetToolkitCommands(), FToolBarExtensionDelegate::CreateSP( this, &FAssetEditorToolbarComboActionGraph::FillComboActionGraphToolbar ));
ComboActionGraphEditorPtr->AddToolbarExtender(ToolbarExtender);
}
void FAssetEditorToolbarComboActionGraph::FillComboActionGraphToolbar(FToolBarBuilder &ToolbarBuilder)
{
check(this->ComboActionGraphEditor.IsValid());
TSharedPtr<FAssetEditor_ComboActionGraph> MounteaDialogueGraphEditorPtr = this->ComboActionGraphEditor.Pin();
ToolbarBuilder.BeginSection("Util");
{
ToolbarBuilder.AddToolBarButton(FComboActionGraphEditorCommands::Get().AutoArrange,
NAME_None,
LOCTEXT("AutoArrange_Label", "Auto Arrange"),
LOCTEXT("AutoArrange_ToolTip", "ALPHA version!\n\nTries its best to arrange Graph Nodes. Don't judge too harshly please."),
FSlateIcon(FComboInputSlateStyle::GetAppStyleSetName(), "MDSStyleSet.AutoArrange"));
ToolbarBuilder.AddToolBarButton(FComboActionGraphEditorCommands::Get().ValidateGraph,
NAME_None,
LOCTEXT("ValidateGraph_Label", "Validate Graph"),
LOCTEXT("ValidateGraph_ToolTip", "Validates Graph if there are any invalid connections or broken data."),
FSlateIcon(FComboInputSlateStyle::GetAppStyleSetName(), "MDSStyleSet.ValidateGraph"));
}
ToolbarBuilder.EndSection();
}
#undef LOCTEXT_NAMESPACE

Some files were not shown because too many files have changed in this diff Show More