function script F_ShuffleNumbers { deletearray getarg(2); .@static = getarg(0); .@range = getarg(1) +1 - .@static; .@count = getarg(3, .@range); if (.@range <= 0 || .@count <= 0) return 0; if (.@count > .@range) .@count = .@range; for (.@i = 0; .@i < .@range; ++.@i) .@temparray[.@i] = .@i; for (.@i = 0; .@i < .@count; ++.@i) { .@rand = rand(.@range); set getelementofarray( getarg(2), .@i ), .@temparray[.@rand] + .@static; .@temparray[.@rand] = .@temparray[--.@range]; } return .@count; } prontera,152,186,5 script Quest KMob 4_M_02,{ // dispbottom aura_quest_string$; if ( getstrlen( aura_quest_string$ ) ) { for ( .@i = 0; .@i < .questsize; ++.@i ) if ( @aura_quest_tmp[.questsize + .@i] < .questquantity ) break; for ( .@j = 0; .@j < .questitem; ++.@j ) if ( countitem( @aura_quest_tmp[.questsize *2 + .@j] ) < .questcollect ) break; if ( .@i == .questsize && .@j == .questitem ) { mes "Congratulations, you completed the quest!"; ++aura_quest; for ( .@i = 0; .@i < .questitem; ++.@i ) delitem @aura_quest_tmp[.questsize *2 + .@i], .questcollect; // yup, delitem 1st, yup deletearray @aura_quest_tmp; aura_quest_string$ = ""; atcommand "@aura "+ aura_quest; close; } mes "You have not completed the mission!"; for ( .@i = 0; .@i < .questsize; ++.@i ) if ( @aura_quest_tmp[.questsize + .@i] < .questquantity ) mes "Kill: ["+ @aura_quest_tmp[.questsize + .@i] +"/"+ .questquantity +"] "+ getmonsterinfo( @aura_quest_tmp[.@i], MOB_NAME ); for ( .@i = 0; .@i < .questitem; ++.@i ) if ( countitem( @aura_quest_tmp[.questsize *2 + .@i] ) < .questcollect ) mes "Collect: ["+ countitem( @aura_quest_tmp[.questsize *2 + .@i] ) +"/"+ .questcollect +"] "+ getitemname( @aura_quest_tmp[.questsize *2 + .@i] ); next; if ( select ( "OK", "I give up ... its too hard" ) == 1 ) close; aura_quest_string$ = ""; deletearray @aura_quest_tmp; close; } if ( aura_quest ) { mes "Congratulations ~ You have completed this quest."; if ( aura_quest >= 2 ) close; mes "But you are still allow to change to another @aura if you redo this quest"; next; if ( select( "OK let's do it again !", "Nevermind" ) == 2 ) close; } mes "Hello, I now ask you to kill some monsters for me ok?"; if ( select( "Ok", "I do not want..." ) == 2 ) close; next; mes "Okay, go and kill:"; callfunc "F_ShuffleNumbers", 0, .mobsize -1, .@r, .questsize; for ( .@i = 0; .@i < .questsize; ++.@i ) { @aura_quest_tmp[.@i] = .mob[.@r[.@i]]; mes .questquantity +"x "+ getmonsterinfo( @aura_quest_tmp[.@i], MOB_NAME ); aura_quest_string$ += @aura_quest_tmp[.@i] +"#"; } for ( .@i = 0; .@i <= .questsize; ++.@i ) aura_quest_string$ += "#0"; mes "and collect:"; callfunc "F_ShuffleNumbers", 0, .itemsize -1, .@r, .questitem; for ( .@i = 0; .@i < .questitem; ++.@i ) { @aura_quest_tmp[.questsize *2 + .@i] = .item[.@r[.@i]]; mes .questcollect +"x "+ getitemname( @aura_quest_tmp[.questsize *2 + .@i] ); aura_quest_string$ += "#"+ @aura_quest_tmp[.questsize *2 + .@i]; } close; OnPCLoginEvent: if ( aura_quest ) atcommand "@aura "+ aura_quest; if ( getstrlen( aura_quest_string$ ) ) { explode .@a$, aura_quest_string$, "#"; for ( .@i = 0; .@i < .questsize *2 + .questitem; ++.@i ) @aura_quest_tmp[.@i] = atoi( .@a$[.@i] ); } end; OnNPCKillEvent: if ( !getstrlen( aura_quest_string$ ) ) end; for ( .@i = 0; .@i < .questsize; ++.@i ) if ( killedrid == @aura_quest_tmp[.@i] ) break; if ( .@i == .questsize ) end; if ( @aura_quest_tmp[.@i + .questsize] >= .questquantity ) end; ++@aura_quest_tmp[.@i + .questsize]; dispbottom "["+ @aura_quest_tmp[.@i + .questsize] +"/"+ .questquantity +"] "+ getmonsterinfo( @aura_quest_tmp[.@i], MOB_NAME ); aura_quest_string$ = @aura_quest_tmp; for ( .@i = 1; .@i < .questsize *2 + .questitem; ++.@i ) aura_quest_string$ += "#"+ @aura_quest_tmp[.@i]; // dispbottom aura_quest_string$; end; OnInit: setarray .mob, 1001, 1002, 1004, 1005, 1007, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1018, 1019, 1020, 1025, 1031, 1033, 1034, 1036, 1052; // nah ... maybe I should've use SQL mob_db table LOL .mobsize = getarraysize(.mob); // setarray .item, 901,902,904,905,906,907,908,909,910,911,912,913,915,916,917,918,919,920,921,922,923,924,925,926,928,930,931; // ... ok I'm getting lazy... let's do SQL hack // .itemsize = getarraysize(.item); .@itemdroprate = 4000; // any ETC type item drop rate above 40% for ( .@i = 0; .@i < 9; ++.@i ) .@statement$[.@i] = "select distinct drop"+( .@i+1 )+"id from mob_db where drop"+( .@i+1 )+"per >= "+ .@itemdroprate +" and mexp = 0 and drop"+( .@i+1 )+"id in ( select id from item_db where type = "+ IT_ETC +")"; .itemsize = query_sql( implode( .@statement$, " union " ), .item ); .questsize = 5; // pick 5 types randomly .questquantity = 200; // kill 200 mobs * 5 types = 1000 total .questitem = 5; // pick 5 random ETC item types .questcollect = 200; // collect 200 of each items end; }