|
14 | 14 | import org.jetbrains.annotations.NotNull; |
15 | 15 | import org.jetbrains.annotations.Nullable; |
16 | 16 | import org.skriptlang.skript.common.properties.expressions.PropExprName; |
| 17 | +import org.skriptlang.skript.lang.converter.Converters; |
17 | 18 | import org.skriptlang.skript.lang.properties.Property.PropertyInfo; |
18 | 19 | import org.skriptlang.skript.lang.properties.handlers.base.ExpressionPropertyHandler; |
19 | 20 |
|
@@ -208,20 +209,38 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { |
208 | 209 | } |
209 | 210 |
|
210 | 211 | // check if delta matches any of the allowed types |
211 | | - for (Class<?> allowedType : allowedTypes) { |
212 | | - // array type, compare to delta |
213 | | - // single type, compare to delta[0] |
214 | | - if ((allowedType.isArray() && allowedType.isInstance(delta)) |
215 | | - || (delta != null && allowedType.isInstance(delta[0]))) { |
216 | | - // if the propertyHaver is allowed, change |
217 | | - @SuppressWarnings("unchecked") |
218 | | - var handler = (ExpressionPropertyHandler<Object, ?>) propertyInfo.handler(); |
219 | | - handler.change(propertyHaver, delta, mode); |
220 | | - return propertyHaver; |
| 212 | + assert delta != null; |
| 213 | + Object[] verifiedDelta = delta; |
| 214 | + Class<?>[] flatAllowedTypes = new Class[allowedTypes.length]; |
| 215 | + for (int i = 0; i < allowedTypes.length; i++) { |
| 216 | + flatAllowedTypes[i] = Utils.getComponentType(allowedTypes[i]); |
| 217 | + } |
| 218 | + boolean tryConverting = false; |
| 219 | + deltaLoop: for (Object object : verifiedDelta) { |
| 220 | + for (Class<?> allowedType : flatAllowedTypes) { |
| 221 | + if (allowedType.isInstance(object)) { |
| 222 | + continue deltaLoop; |
| 223 | + } |
| 224 | + } |
| 225 | + // delta value cannot be mapped to any allowed types |
| 226 | + tryConverting = true; |
| 227 | + } |
| 228 | + if (tryConverting) { |
| 229 | + // typing of delta may not be safe, create a new array |
| 230 | + Object[] newDelta = new Object[verifiedDelta.length]; |
| 231 | + Converters.convert(verifiedDelta, newDelta, flatAllowedTypes); |
| 232 | + for (Object object : newDelta) { |
| 233 | + if (object == null) { // conversion failed |
| 234 | + return null; |
| 235 | + } |
221 | 236 | } |
| 237 | + verifiedDelta = newDelta; |
222 | 238 | } |
223 | | - // no matching types, go next |
224 | | - return null; |
| 239 | + // all values verified, convert |
| 240 | + //noinspection unchecked |
| 241 | + var handler = (ExpressionPropertyHandler<Object, ?>) propertyInfo.handler(); |
| 242 | + handler.change(propertyHaver, verifiedDelta, mode); |
| 243 | + return propertyHaver; |
225 | 244 | }; |
226 | 245 |
|
227 | 246 | if (useCIP) { |
|
0 commit comments