1414import ch .njol .skript .structures .StructVariables .DefaultVariables ;
1515import ch .njol .skript .util .StringMode ;
1616import ch .njol .skript .util .Utils ;
17+ import com .google .common .base .Preconditions ;
18+ import org .skriptlang .skript .util .IndexTrackingTreeMap ;
1719import ch .njol .skript .variables .Variables ;
1820import ch .njol .util .Kleenean ;
1921import ch .njol .util .Pair ;
@@ -446,7 +448,7 @@ private T[] getConvertedArray(Event event) {
446448 }
447449
448450 private void set (Event event , @ Nullable Object value ) {
449- Variables .setVariable ("" + name .toString (event ), value , event , local );
451+ Variables .setVariable (name .toString (event ), value , event , local );
450452 }
451453
452454 private void setIndex (Event event , String index , @ Nullable Object value ) {
@@ -456,6 +458,33 @@ private void setIndex(Event event, String index, @Nullable Object value) {
456458 Variables .setVariable (name .substring (0 , name .length () - 1 ) + index , value , event , local );
457459 }
458460
461+ public int size (Event event ) {
462+ Preconditions .checkState (list , "Cannot get the size of a single variable" );
463+ Map <?, ?> map = (Map <?, ?>) getRaw (event );
464+ if (map == null )
465+ return 0 ;
466+
467+ int size = map .size ();
468+ if (map .containsKey (null )) // if we're trying to get the size of {_list::*}, exclude {_list} from being counted
469+ size --;
470+
471+ if (!(map instanceof IndexTrackingTreeMap <?> indexTrackingMap )) {
472+ for (Object value : map .values ()) {
473+ if (value instanceof Map <?, ?> sublist && !sublist .containsKey (null ))
474+ size --;
475+ }
476+ return size ;
477+ }
478+
479+ Collection <String > sublistIndices = indexTrackingMap .mapIndices ();
480+ for (String sublistIndex : sublistIndices ) {
481+ if (!((Map <?, ?>) map .get (sublistIndex )).containsKey (null ))
482+ size --;
483+ }
484+
485+ return size ;
486+ }
487+
459488 @ Override
460489 public Class <?> @ Nullable [] acceptChange (ChangeMode mode ) {
461490 if (!list && mode == ChangeMode .SET )
@@ -494,22 +523,6 @@ public void change(Event event, Object @NotNull [] delta, ChangeMode mode, @NotN
494523 public void change (Event event , Object @ Nullable [] delta , ChangeMode mode ) throws UnsupportedOperationException {
495524 switch (mode ) {
496525 case DELETE :
497- if (list ) {
498- ArrayList <String > toDelete = new ArrayList <>();
499- Map <String , Object > map = (Map <String , Object >) getRaw (event );
500- if (map == null )
501- return ;
502- for (Entry <String , Object > entry : map .entrySet ()) {
503- if (entry .getKey () != null ){
504- toDelete .add (entry .getKey ());
505- }
506- }
507- for (String index : toDelete ) {
508- assert index != null ;
509- setIndex (event , index , null );
510- }
511- }
512-
513526 set (event , null );
514527 break ;
515528 case SET :
@@ -594,6 +607,13 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) thro
594607 }
595608 } else {
596609 assert mode == ChangeMode .ADD ;
610+ if (map instanceof IndexTrackingTreeMap <Object > indexTrackingMap ) {
611+ for (Object value : delta ) {
612+ int index = indexTrackingMap .nextOpenIndex ();
613+ setIndex (event , String .valueOf (index ), value );
614+ }
615+ return ;
616+ }
597617 int i = 1 ;
598618 for (Object value : delta ) {
599619 if (map != null )
0 commit comments