// my improved counting sort, idea from keyworld <3 // http://herc.ws/board/topic/4321-help-me-improve-this-merge-sort-algorithm/?do=findComment&comment=28247 // callfunc "counting_sort_index_desc", , , ; function script counting_sort_index_desc { .@total = .@size = getarg( 2, getarraysize( getarg(0) ) ); copyarray .@arr, getarg(0), .@size; for ( .@i = 0; .@i < .@size; ++.@i ) { setd ".@index_"+ .@arr[.@i] +"["+( .@tmp[.@arr[.@i]] )+"]", .@i; ++.@tmp[.@arr[.@i]]; } for ( ; .@size; --.@size ) { .@index = getarraysize(.@tmp) -1; --.@tmp[.@index]; .@out[.@total - .@size] = getd( ".@index_"+ .@index +"["+( .@tmp[.@index] )+"]" ); } copyarray getarg(1), .@out, .@total; return; } prontera,150,180,5 script Top Hunter 1_F_MARIA,{ if ( .start == false ) { mes "registration closed"; close; } if ( getgmlevel() >= 99 ) { // GMs should skip registration. MAKE SURE Turn this off if you are debugging this script with GM account warp "guild_vs2", 49,49; end; } if ( .register_count >= 100 ) { mes "only accept 100 registration"; close; } .register_aid[.register_count++] = getcharid(3); warp "guild_vs2", 0,0; end; OnInit: bindatcmd "tophunter", strnpcinfo(0)+"::OnStart", 99,100; end; OnStart: OnClock1030: // put all start timer here OnClock2314: .start = true; mapwarp "guild_vs2", "prontera", 156,191; announce "Top Hunter event started ~ accepting registrations ", bc_all; sleep 20000; // 20 seconds to register, to debug this script of course announce "Top Hunter event registration closed", bc_all; .start = false; if ( .register_count < 3 ) { announce "Top Hunter event aborted ... not enough players to start this event", bc_all; mapwarp "guild_vs2", "prontera", 156,191; end; } sleep 3000; monster "guild_vs2", 0,0, "this", 1002, 30, strnpcinfo(3)+"::OnMobDead"; monster "guild_vs2", 0,0, "this", 1002, 20, strnpcinfo(3)+"::OnMobDead"; monster "guild_vs2", 0,0, "this", 1002, 10, strnpcinfo(3)+"::OnMobDead"; sleep 60000; // event runs 60 seconds mapannounce "guild_vs2", "Top Hunter: Times Up~", bc_all; killmonsterall "guild_vs2"; sleep 3000; freeloop true; // here comes the magic ~ save all participants killcount into a temporary array for ( .@i = 0; .@i < .register_count; ++.@i ) { attachrid .register_aid[.@i]; .@aid[.@i] = .register_aid[.@i]; .@name$[.@i] = strcharinfo(0); .@killed[.@i] = @tophunter_killcount; @tophunter_killcount = 0; } detachrid; // magic !! sort the array from biggest number to smallest number, output in index format callfunc "counting_sort_index_desc", .@killed, .@s, .register_count; /* announce "Top hunter Script Debugging Mode - List all players' killcount sorted", bc_all; for ( .@i = 0; .@i < .register_count; ++.@i ) announce "No."+( .@i +1 )+" : "+ .@name$[ .@s[.@i] ] +" ["+ .@aid[ .@s[.@i] ]+"] with "+ .@killed[ .@s[.@i] ]+" kills.", bc_all; announce " ====== ", bc_all; */ for ( .@i = 0; .@i < 3; ++.@i ) { if ( .@killed[ .@s[.@i] ] ) { // must make at least 1 kill .@winnername$[.@i] = .@name$[ .@s[.@i] ]; getitem 501, 10, .@aid[ .@s[.@i] ]; // give 10 red potions to these winners } } if ( .@killed[.@s[0]] )// make sure even the top place has score a kill announce "Top Hunter: The Top Hunters are ["+ implode( .@winnername$, "],[" )+"] !", bc_all; else announce "Top Hunter: WOOT ! Every one just come in here and AFK ??", bc_all; freeloop false; sleep 5000; mapwarp "guild_vs2", "prontera", 156,191; deletearray .register_aid; .register_count = 0; end; OnMobDead: ++@tophunter_killcount; if ( !mobcount( strcharinfo(3), strnpcinfo(3)+"::OnMobDead" ) ) awake strnpcinfo(0); end; OnPCLogoutEvent: if ( strcharinfo(3) == "guild_vs2" ) { for ( .@i = 0; .@i < .register_count; ++.@i ) { if ( getcharid(3) == .register_aid[.@i] ) { deletearray .register_aid[.@i], 1; --.register_count; } } } end; } guild_vs2 mapflag nowarp guild_vs2 mapflag nowarpto guild_vs2 mapflag noteleport guild_vs2 mapflag nosave SavePoint guild_vs2 mapflag nomemo guild_vs2 mapflag nopenalty guild_vs2 mapflag noicewall guild_vs2 mapflag nobranch