88import ch .njol .skript .lang .Expression ;
99import ch .njol .skript .lang .ExpressionType ;
1010import ch .njol .skript .lang .SkriptParser .ParseResult ;
11+ import ch .njol .skript .registrations .Classes ;
1112import ch .njol .skript .util .Color ;
1213import ch .njol .skript .util .ColorRGB ;
13- import ch .njol .skript .util .Utils ;
1414import ch .njol .util .Kleenean ;
1515import org .bukkit .event .Event ;
1616import org .bukkit .inventory .meta .ItemMeta ;
1717import org .bukkit .inventory .meta .components .CustomModelDataComponent ;
1818import org .jetbrains .annotations .Nullable ;
1919
20+ import java .lang .reflect .Array ;
2021import java .util .ArrayList ;
2122import java .util .Arrays ;
2223import java .util .List ;
24+ import java .util .function .IntFunction ;
2325
2426@ Name ("Custom Model Data" )
2527@ Description ({
@@ -65,20 +67,20 @@ private enum CMDType {
6567 COLORS (Color .class ),
6668 ALL (Float .class , Boolean .class , String .class , Color .class );
6769
68- private final Class <?> supertype ;
6970 private final Class <?>[] types ;
7071
7172 CMDType (Class <?>... returns ) {
7273 this .types = returns ;
73- this .supertype = Utils .getSuperType (returns );
7474 }
7575 }
7676
7777 private CMDType dataType ;
78+ private Class <?> returnType ;
7879
7980 @ Override
8081 public boolean init (Expression <?>[] expressions , int matchedPattern , Kleenean isDelayed , ParseResult parseResult ) {
8182 dataType = CMDType .values ()[parseResult .mark ];
83+ returnType = Classes .getSuperClassInfo (dataType .types ).getC ();
8284 //noinspection unchecked
8385 setExpr ((Expression <? extends ItemType >) expressions [0 ]);
8486 return true ;
@@ -97,11 +99,12 @@ protected Object[] get(Event event, ItemType[] source) {
9799 }
98100
99101 CustomModelDataComponent component = meta .getCustomModelDataComponent ();
102+ IntFunction <Object []> arrayConstructor = n -> (Object []) Array .newInstance (getReturnType (), n );
100103 return switch (dataType ) {
101104 case SINGLE_INT -> throw new IllegalStateException ("Unreachable state for SINGLE_INT!" );
102- case FLOATS -> component .getFloats ().toArray (Float []:: new );
103- case FLAGS -> component .getFlags ().toArray (Boolean []:: new );
104- case STRINGS -> component .getStrings ().toArray (String []:: new );
105+ case FLOATS -> component .getFloats ().toArray (arrayConstructor );
106+ case FLAGS -> component .getFlags ().toArray (arrayConstructor );
107+ case STRINGS -> component .getStrings ().toArray (arrayConstructor );
105108 case COLORS ->
106109 component .getColors ().stream ().map (ColorRGB ::fromBukkitColor ).toList ().toArray (ColorRGB []::new );
107110 case ALL -> {
@@ -110,17 +113,17 @@ protected Object[] get(Event event, ItemType[] source) {
110113 data .addAll (component .getFlags ());
111114 data .addAll (component .getStrings ());
112115 data .addAll (component .getColors ().stream ().map (ColorRGB ::fromBukkitColor ).toList ());
113- yield data .toArray (Object []:: new );
116+ yield data .toArray (arrayConstructor );
114117 }
115118 };
116119 }
117- throw new IllegalStateException ( "Unreachable state! Either source was an empty array or something horrible happened." );
120+ return ( Object []) Array . newInstance ( getReturnType (), 0 );
118121 }
119122
120123 @ Override
121124 public Class <?> @ Nullable [] acceptChange (ChangeMode mode ) {
122125 return switch (mode ) {
123- case ADD , REMOVE , REMOVE_ALL , SET , DELETE , RESET -> {
126+ case ADD , REMOVE , SET , DELETE , RESET -> {
124127 // convert to array types to allow plural changes.
125128 Class <?>[] arrayClasses = new Class [dataType .types .length ];
126129 for (int i = 0 ; i < dataType .types .length ; i ++) {
@@ -296,7 +299,7 @@ public boolean isSingle() {
296299
297300 @ Override
298301 public Class <?> getReturnType () {
299- return dataType . supertype ;
302+ return returnType ;
300303 }
301304
302305 @ Override
0 commit comments