1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\flagsys_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\shared.gsh;
15 function filter( &
array, b_keep_keys, func_filter, arg1, arg2, arg3, arg4, arg5 )
23 if ( IsString( key ) || IsWeapon( key ) )
26 if ( isdefined( b_keep_keys ) && !b_keep_keys )
56 function remove_dead( &
array, b_keep_keys )
58 return filter(
array, b_keep_keys, &_filter_dead );
63 return isdefined( val );
77 a_keys = GetArrayKeys(
array );
79 for ( i = a_keys.size - 1; i >= 0; i-- )
87 else if ( !isdefined(
array[ key ] )
88 || ( !b_keep_empty_arrays && IsArray(
array[ key ] ) && !
array[ key ].size ) )
90 ArrayRemoveIndex(
array, key );
98 function filter_classname( &
array, b_keep_keys, str_classname )
100 return filter(
array, b_keep_keys, &_filter_classname, str_classname );
103 function get_touching( &
array, b_keep_keys )
105 return filter(
array, b_keep_keys, &IsTouching );
123 foreach ( key, val
in array )
154 function delete_all( &
array, is_struct )
158 if ( isdefined( ent ) )
164 else if ( isdefined( ent.__vtable ) )
186 function notify_all( &
array, str_notify )
188 foreach ( elem
in array )
190 elem notify( str_notify );
211 function thread_all( &entities, func, arg1, arg2, arg3, arg4, arg5, arg6 )
213 Assert( isdefined( entities ),
"Undefined entity array passed to array::thread_all" );
214 Assert( isdefined( func ),
"Undefined function passed to array::thread_all" );
216 if ( IsArray( entities ) )
218 if ( isdefined( arg6 ) )
220 foreach ( ent
in entities )
222 ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
225 else if ( isdefined( arg5 ) )
227 foreach ( ent
in entities )
229 ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 );
232 else if ( isdefined( arg4 ) )
234 foreach ( ent
in entities )
236 ent thread [[ func ]]( arg1, arg2, arg3, arg4 );
239 else if ( isdefined( arg3 ) )
241 foreach ( ent
in entities )
243 ent thread [[ func ]]( arg1, arg2, arg3 );
246 else if ( isdefined( arg2 ) )
248 foreach ( ent
in entities )
250 ent thread [[ func ]]( arg1, arg2 );
253 else if ( isdefined( arg1 ) )
255 foreach ( ent
in entities )
257 ent thread [[ func ]]( arg1 );
262 foreach ( ent
in entities )
264 ent thread [[ func ]]();
290 function thread_all_ents( &entities, func, arg1, arg2, arg3, arg4, arg5 )
292 Assert( isdefined( entities ),
"Undefined entity array passed to util::array_ent_thread" );
293 Assert( isdefined( func ),
"Undefined function passed to util::array_ent_thread" );
295 if ( IsArray( entities ) )
299 keys = GetArrayKeys( entities );
300 for ( i = 0; i < keys.size; i++ )
329 function run_all( &entities, func, arg1, arg2, arg3, arg4, arg5, arg6 )
331 Assert( isdefined( entities ),
"Undefined entity array passed to array::run_all" );
332 Assert( isdefined( func ),
"Undefined function passed to array::run_all" );
334 if ( IsArray( entities ) )
336 if ( isdefined( arg6 ) )
338 foreach ( ent
in entities )
340 ent [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
343 else if ( isdefined( arg5 ) )
345 foreach ( ent
in entities )
347 ent [[ func ]]( arg1, arg2, arg3, arg4, arg5 );
350 else if ( isdefined( arg4 ) )
352 foreach ( ent
in entities )
354 ent [[ func ]]( arg1, arg2, arg3, arg4 );
357 else if ( isdefined( arg3 ) )
359 foreach ( ent
in entities )
361 ent [[ func ]]( arg1, arg2, arg3 );
364 else if ( isdefined( arg2 ) )
366 foreach ( ent
in entities )
368 ent [[ func ]]( arg1, arg2 );
371 else if ( isdefined( arg1 ) )
373 foreach ( ent
in entities )
375 ent [[ func ]]( arg1 );
380 foreach ( ent
in entities )
403 function exclude(
array, array_exclude )
407 if ( IsArray( array_exclude ) )
409 foreach ( exclude_item
in array_exclude )
411 ArrayRemoveValue( newarray, exclude_item );
416 ArrayRemoveValue( newarray, array_exclude );
434 function add( &
array, item, allow_dupes =
true )
436 if ( isdefined( item ) )
438 if ( allow_dupes || !IsInArray(
array, item ) )
457 function add_sorted( &
array, item, allow_dupes =
true )
459 if ( isdefined( item ) )
461 if ( allow_dupes || !IsInArray(
array, item ) )
463 for ( i = 0; i <=
array.size; i++ )
467 ArrayInsert(
array, item, i );
490 s_tracker = SpawnStruct();
491 s_tracker._wait_count = 0;
495 if ( isdefined( ent ) )
501 if ( s_tracker._wait_count > 0 )
503 s_tracker waittill(
"waitlogic_finished" );
519 function wait_till_match( &
array, str_notify, str_match, n_timeout )
523 s_tracker = SpawnStruct();
524 s_tracker._array_wait_count = 0;
528 if ( isdefined( ent ) )
530 s_tracker._array_wait_count++;
531 ent thread
util::timeout( n_timeout, &_waitlogic_match, s_tracker, str_notify, str_match );
532 ent thread
util::timeout( n_timeout, &_waitlogic_death, s_tracker );
536 if ( s_tracker._array_wait_count > 0 )
538 s_tracker waittill(
"array_wait" );
542 function _waitlogic_match( s_tracker, str_notify, str_match )
544 self endon(
"death" );
545 self waittillmatch( str_notify, str_match );
546 update_waitlogic_tracker( s_tracker );
549 function _waitlogic_death( s_tracker )
551 self waittill(
"death" );
552 update_waitlogic_tracker( s_tracker );
555 function update_waitlogic_tracker( s_tracker )
557 s_tracker._array_wait_count--;
558 if ( s_tracker._array_wait_count == 0 )
560 s_tracker notify(
"array_wait" );
567 function flag_wait( &
array, str_flag )
573 for ( i = 0; i <
array.size; i++ )
577 if ( isdefined( ent ) && !ent
flag::get( str_flag ) )
591 function flagsys_wait( &
array, str_flag )
597 for ( i = 0; i <
array.size; i++ )
616 function flagsys_wait_any_flag( &
array, ... )
622 for ( i = 0; i <
array.size; i++ )
626 if ( isdefined( ent ) )
629 foreach ( str_flag
in vararg )
651 function flagsys_wait_any( &
array, str_flag )
661 wait_any(
array, str_flag );
667 function flag_wait_clear( &
array, str_flag )
673 for ( i = 0; i <
array.size; i++ )
678 ent waittill( str_flag );
688 function flagsys_wait_clear( &
array, str_flag, n_timeout )
696 for ( i = 0; i <
array.size; i++ )
701 ent waittill( str_flag );
719 function wait_any(
array, msg, n_timeout )
723 s_tracker = SpawnStruct();
727 if ( isdefined( ent ) )
729 level thread
util::timeout( n_timeout, &_waitlogic2, s_tracker, ent, msg );
733 s_tracker endon(
"array_wait" );
738 function _waitlogic2( s_tracker, ent, msg )
740 s_tracker endon(
"array_wait" );
744 ent endon(
"death" );
748 s_tracker notify(
"array_wait" );
751 function flag_wait_any(
array, str_flag )
753 self endon(
"death" );
763 wait_any(
array, str_flag );
779 keys = GetArrayKeys(
array );
780 return array[ keys[RandomInt( keys.size )] ];
793 function randomize(
array )
795 for ( i = 0; i <
array.size; i++ )
797 j = RandomInt(
array.size );
814 function clamp_size(
array, n_size )
817 for ( i = 0; i < n_size; i++ )
838 for ( i =
array.size - 1; i >= 0; i-- )
840 a_array2[ a_array2.size ] =
array[ i ];
849 function remove_keys(
array )
853 foreach ( _, val
in array )
855 if ( isdefined( val ) )
867 function swap( &
array, index1, index2 )
874 function pop( &
array, index, b_keep_keys =
true )
878 if ( !isdefined( index ) )
880 keys = GetArrayKeys(
array );
884 if ( isdefined(
array[index] ) )
888 ArrayRemoveIndex(
array, index, b_keep_keys );
895 function pop_front( &
array, b_keep_keys =
true )
897 keys = GetArrayKeys(
array );
898 index = keys[ keys.size - 1 ];
899 return pop(
array, index, b_keep_keys );
902 function push( &
array, val, index )
904 if ( !isdefined( index ) )
908 foreach ( key
in GetArrayKeys(
array ) )
910 if ( IsInt( key ) && ( key >= index ) )
917 ArrayInsert(
array, val, index );
920 function push_front( &
array, val )
937 function get_closest( org, &
array, dist )
939 assert( 0,
"Deprecated function. Use 'ArrayGetClosest' instead." );
954 function get_farthest( org, &
array, dist = undefined )
956 assert( 0,
"Deprecated function. Use 'ArrayGetFarthest' instead." );
959 function closerFunc( dist1, dist2 )
961 return dist1 >= dist2;
964 function fartherFunc( dist1, dist2 )
966 return dist1 <= dist2;
980 function get_all_farthest( org, &
array, a_exclude, n_max, n_maxdist )
986 if ( isdefined( n_maxdist ) )
988 a_ret = ArraySort(
a_ret, org,
false, n_max, n_maxdist );
1010 function get_all_closest( org, &
array, a_exclude, n_max, n_maxdist )
1016 if ( isdefined( n_maxdist ) )
1018 a_ret = ArraySort(
a_ret, org,
true, n_max, n_maxdist );
1028 function alphabetize( &
array )
1030 return sort_by_value(
array,
true );
1045 function sort_by_value( &
array, b_lowest_first =
false )
1047 return merge_sort(
array, &_sort_by_value_compare_func, b_lowest_first );
1050 function _sort_by_value_compare_func( val1, val2, b_lowest_first )
1052 if ( b_lowest_first )
1074 function sort_by_script_int( &
a_ents, b_lowest_first =
false )
1076 return merge_sort(
a_ents, &_sort_by_script_int_compare_func, b_lowest_first );
1079 function _sort_by_script_int_compare_func( e1, e2, b_lowest_first )
1081 if ( b_lowest_first )
1083 return e1.script_int < e2.script_int;
1087 return e1.script_int > e2.script_int;
1091 function merge_sort( ¤t_list, func_sort, param )
1093 if ( current_list.size <= 1 )
1095 return current_list;
1101 middle = current_list.size / 2;
1103 for ( x = 0; x < middle; x++ )
1108 for ( ; x < current_list.size; x++ )
1113 left = merge_sort( left, func_sort, param );
1114 right = merge_sort( right, func_sort, param );
1116 result = merge( left, right, func_sort, param );
1121 function merge( left, right, func_sort, param )
1127 while ( li < left.size && ri < right.size )
1129 b_result = undefined;
1131 if ( isdefined( param ) )
1133 b_result = [[ func_sort ]]( left[ li ], right[ ri ], param );
1137 b_result = [[ func_sort ]]( left[ li ], right[ ri ] );
1152 while ( li < left.size )
1158 while ( ri < right.size )
1180 function insertion_sort( &
a, compareFunc, val )
1189 for (i=0;i<
a.size;i++)
1191 if ([[compareFunc]](
a[i],val)<=0)
1193 ArrayInsert(
a,val,i);
1215 function spread_all( &entities, func, arg1, arg2, arg3, arg4, arg5 )
1217 Assert( isdefined( entities ),
"Undefined entity array passed to array::spread_all_ents" );
1218 Assert( isdefined( func ),
"Undefined function passed to array::spread_all_ents" );
1220 if ( IsArray( entities ) )
1222 foreach ( ent
in entities )
1224 if( isdefined(ent) )
1248 function wait_till_touching( &
a_ents, e_volume )
1250 while ( !is_touching(
a_ents, e_volume ) )
1266 function is_touching( &
a_ents, e_volume )
1270 if ( !e_ent IsTouching( e_volume ) )
1288 function contains( array_or_val, value )
1290 if ( isArray ( array_or_val ) )
1292 foreach( element
in array_or_val )
1294 if ( element === value )
1303 return array_or_val === value;
1310 function _filter_dead( val )
1312 return IsAlive( val );
1315 function _filter_classname( val, arg )
1317 return IsSubStr( val.classname, arg );
1321 function quickSort(
array, compare_func)
1323 return quickSortMid(
array, 0,
array.size -1, compare_func);
1326 function quickSortMid(
array, start,
end, compare_func)
1331 if(!IsDefined(compare_func))
1332 compare_func = &quickSort_compare;
1334 if (
end - start >= 1)
1340 while ( [[ compare_func ]](
array[i], pivot) && i <= end && k > i)
1342 while ( ![[ compare_func ]](
array[k], pivot) && k >= start && k >= i)
1348 array = quickSortMid(
array, start, k - 1, compare_func);
1357 function quicksort_compare(left, right)