ソースを参照

Updated tr0n's Quest Board (#3897)

Thanks to @aleos89 !
sigtus 6 年 前
コミット
ed0e068c73
1 ファイル変更239 行追加185 行削除
  1. 239 185
      npc/custom/quests/questboard.txt

+ 239 - 185
npc/custom/quests/questboard.txt

@@ -3,27 +3,28 @@
 //===== By: ==================================================
 //= tr0n
 //===== Current Version: =====================================
-//= 1.4.4
-//===== Compatible With: ===================================== 
-//= rAthena Project
+//= 1.6.5
 //===== Description: =========================================
 //= Easily add collection and hunting quests.
-//===== Additional Comments: =================================  
+//===== Changelogs: ==========================================
 // 1.0.0 Release
 // 1.1.0 Added zeny reward
 // 1.2.0 Rewrote checkmob and killcounter
 // 1.3.1 Added level restriction
 // 1.3.4 Added Reward Item Amount
 // 1.4.4 Added Quest delay
+// 1.5.4 Added repeatable Quests
+// 1.6.4 Added party support
+// 1.6.5 Bug fixes for party support
 //============================================================
+prontera,129,215,5	script	Questboard	4_BOARD3,{
 
-prontera,129,215,5	script	Questboard	857,{
-		
-	if(c_run==1){
+	if(c_run==true){
 		mes "[^FF7700Questboard^000000]";
 		mes "^0000FF"+getd("." + currentquest$ + "_collectionname$")+"^000000";
 		mes "--------------------------------";
-		for( set .@j, 0; .@j < getarraysize(getd("."+ currentquest$ + "_collectionitem")); set .@j,.@j+2) {
+		set .@size, getarraysize(getd("."+ currentquest$ + "_collectionitem"));
+		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
 			mes "^FF0000"+getitemname(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+" - "+countitem(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+"/"+getd("."+currentquest$+"_collectionitem["+(.@j+1)+"]")+" ea.^000000";
 		}
 		mes "--------------------------------";
@@ -37,17 +38,18 @@ prontera,129,215,5	script	Questboard	857,{
 			mes "[^FF7700Questboard^000000]";
 			mes "Quest aborted.";
 			set currentquest$, "";
-			set c_run, 0;
+			set c_run, false;
 			close;
 		}
 		goto L_checkitems;
 	}
-	
-	if(h_run==1){
+
+	if(h_run==true){
 		mes "[^FF7700Questboard^000000]";
 		mes "^0000FF"+getd("." + currentquest$ + "_huntingname$")+"^000000";
 		mes "--------------------------------";
-		for( set .@j, 0; .@j < getarraysize(getd("."+ currentquest$ + "_huntingmob")); set .@j,.@j+2) {
+		set .@size, getarraysize(getd("."+ currentquest$ + "_huntingmob"));
+		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@j)+"]");
 			mes "^FF0000"+strmobinfo(1,getd("."+currentquest$+"_huntingmob["+.@j+"]"))+" - "+getd(currentquest$+"_"+.@currentmob+"_"+(.@j+1)+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
 		}
@@ -61,136 +63,150 @@ prontera,129,215,5	script	Questboard	857,{
 		if(select("Finish:Abort") == 2){
 			mes "[^FF7700Questboard^000000]";
 			mes "Quest aborted.";
-			for(set .@x, 1; .@x < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@x,.@x+2){
+			for(set .@x, 1; .@x < .@size; set .@x,.@x+2){
 				set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]");
 				setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0);
 			}
 			set currentquest$, "";
-			set h_run, 0;
+			set h_run, false;
 			close;
 		}
 		goto L_checkmobs;
 	}
-		
-L_questmenu:
+
 	mes "[^FF7700Questboard^000000]";
 	mes "Select category:";
 	next;
-	
+
 	switch(select((.collection)?"Collection Quests":"",
 				  (.hunting)?"Hunting Quests":"",
 				  "Exit")) {
-	
-case 1:
-	set .@collectmenu$, "";
-	for( set .@i,0; .@i < .collectionquestcount; set .@i,.@i+1) {
-		if (.@i) set .@collectmenu$,.@collectmenu$+":";
-		set .@collectmenu$, .@collectmenu$ + "[" + getd("." +(.@i+1)+"_collectionmin") + " - " + getd("." +(.@i+1)+"_collectionmax") + "] " + getd("." + (.@i+1) + "_collectionname$");
-	}
-	set .@selection,select(.@collectmenu$);
-	if(gettimetick(2) < getd(.@selection + "_collection_delay")){
-		set .@time_left, getd(.@selection + "_collection_delay")-gettimetick(2);
-		mes "[^FF7700Questboard^000000]";
-		if(.@time_left < 60) mes "You have to wait ^0000FF"+.@time_left+" seconds^000000 to do this quest again.";
-		if(.@time_left < 3600) mes "You have to wait ^0000FF"+.@time_left/60+" minutes^000000 to do this quest again.";
-		mes "You have to wait ^0000FF"+.@time_left/60/60+" hours^000000 to do this quest again.";
-		close;
-	}
-	mes "[^FF7700Questboard^000000]";
-	mes "^0000FF"+getd("." + .@selection + "_collectionname$")+"^000000";
-	mes "--------------------------------";
-	for( set .@j, 0; .@j < getarraysize(getd("."+ .@selection + "_collectionitem")); set .@j,.@j+2) {
-		mes "^FF0000"+getitemname(getd("."+.@selection+"_collectionitem["+.@j+"]"))+" - "+getd("."+.@selection+"_collectionitem["+(.@j+1)+"]")+" ea.^000000";
-	}
-	mes "--------------------------------";
-	mes "[Reward]";
-	mes "Item: ^0000FF"+((getd("." +.@selection+"_collectionprize"))?getitemname(getd("." +.@selection+"_collectionprize"))+" - "+getd("." +.@selection+"_collectionamount")+" ea.^000000":"Nothing^000000");
-	mes "Zeny: ^0000FF"+getd("." +.@selection+"_collectionzeny")+"^000000";
-	mes "Base EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+0+"]")+"^000000";
-	mes "Job EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+1+"]")+"^000000";
-	next;
-	if(select("Accept:Decline") == 2){
-		close;
-	}
-	if(BaseLevel >= getd("." +.@selection+"_collectionmin") && BaseLevel <= getd("." +.@selection+"_collectionmax"))
-	{
-		mes "[^FF7700Questboard^000000]";
-		mes "Quest accepted.";
-		set c_run, 1;
-		set currentquest$, .@selection;
-		close;
-	}
-	else
-	{
-		mes "[^FF7700Questboard^000000]";
-		mes "You don't have the required";
-		mes "level to do this quest.";
-		close;
-	}
-	
-case 2:
-	set .@huntmenu$, "";
-	for( set .@i,0; .@i < .huntingquestcount; set .@i,.@i+1) {
-		if (.@i) set .@huntmenu$,.@huntmenu$+":";
-		set .@huntmenu$, .@huntmenu$ + "[" + getd("." +(.@i+1)+"_huntingmin") + " - " + getd("." +(.@i+1)+"_huntingmax") + "] " + getd("." + (.@i+1) + "_huntingname$");
-	}
-	set .@selection,select(.@huntmenu$);
-	if(gettimetick(2) < getd(.@selection + "_hunting_delay")){
-		set .@time_left, getd(.@selection + "_hunting_delay")-gettimetick(2);
-		mes "[^FF7700Questboard^000000]";
-		if(.@time_left < 60) mes "You have to wait ^0000FF"+.@time_left+" seconds^000000 to do this quest again.";
-		if(.@time_left < 3600) mes "You have to wait ^0000FF"+.@time_left/60+" minutes^000000 to do this quest again.";
-		mes "You have to wait ^0000FF"+.@time_left/60/60+" hours^000000 to do this quest again.";
-		close;
-	}
-	mes "[^FF7700Questboard^000000]";
-	mes "^0000FF"+getd("." + .@selection + "_huntingname$")+"^000000";
-	mes "--------------------------------";
-	for( set .@j, 0; .@j < getarraysize(getd("."+ .@selection + "_huntingmob")); set .@j,.@j+2) {
-		mes "^FF0000"+strmobinfo(1,getd("."+.@selection+"_huntingmob["+.@j+"]"))+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
-	}
-	mes "--------------------------------";
-	mes "[Reward]";
-	mes "Item: ^0000FF"+((getd("." +.@selection+"_huntingprize"))?getitemname(getd("." +.@selection+"_huntingprize"))+" - "+getd("." +.@selection+"_huntingamount")+" ea.^000000":"Nothing^000000");
-	mes "Zeny: ^0000FF"+getd("." +.@selection+"_huntingzeny")+"^000000";
-	mes "Base EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+0+"]")+"^000000";
-	mes "Job EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+1+"]")+"^000000";
-	next;
-	if(select("Accept:Decline") == 2){
-		close;
-	}
-	if(BaseLevel >= getd("." +.@selection+"_huntingmin") && BaseLevel <= getd("." +.@selection+"_huntingmax"))
-	{
+
+	case 1:
+		set .@collectmenu$, "";
+		for( set .@i,0; .@i < .collectionquestcount; set .@i,.@i+1){
+			if (.@i) set .@collectmenu$,.@collectmenu$+":";
+			set .@collectmenu$, .@collectmenu$ + "[" + getd("." +(.@i+1)+"_collectionmin") + " - " + getd("." +(.@i+1)+"_collectionmax") + "] " + getd("." + (.@i+1) + "_collectionname$");
+		}
+		set .@selection,select(.@collectmenu$);
+		if(.quest_repeat == true){
+			if(gettimetick(2) < getd(.@selection + "_collection_delay")){
+				set .@time_left, getd(.@selection + "_collection_delay")-gettimetick(2);
+				mes "[^FF7700Questboard^000000]";
+				mes "You have to wait ^0000FF"+Time2Str(.@time_left)+"^000000 to do this quest again.";
+				close;
+			}
+		}
+		else{
+			if(getd(.@selection + "_collection_repeat") == true){
+				mes "[^FF7700Questboard^000000]";
+				mes "You already did this quest.";
+				mes "Please choose another one.";
+				close;
+			}
+		}
 		mes "[^FF7700Questboard^000000]";
-		mes "Quest accepted.";
-		set h_run, 1;
-		set currentquest$, .@selection;
-		close;
-	}
-	else
-	{
+		mes "^0000FF"+getd("." + .@selection + "_collectionname$")+"^000000";
+		mes "--------------------------------";
+		set .@size, getarraysize(getd("."+ .@selection + "_collectionitem"));
+		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
+			mes "^FF0000"+getitemname(getd("."+.@selection+"_collectionitem["+.@j+"]"))+" - "+getd("."+.@selection+"_collectionitem["+(.@j+1)+"]")+" ea.^000000";
+		}
+		mes "--------------------------------";
+		mes "[Reward]";
+		mes "Item: ^0000FF"+((getd("." +.@selection+"_collectionprize"))?getitemname(getd("." +.@selection+"_collectionprize"))+" - "+getd("." +.@selection+"_collectionamount")+" ea.^000000":"Nothing^000000");
+		mes "Zeny: ^0000FF"+getd("." +.@selection+"_collectionzeny")+"^000000";
+		mes "Base EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+0+"]")+"^000000";
+		mes "Job EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+1+"]")+"^000000";
+		next;
+		if(select("Accept:Decline") == 2){
+			close;
+		}
+		if(BaseLevel >= getd("." +.@selection+"_collectionmin") && BaseLevel <= getd("." +.@selection+"_collectionmax")){
+			mes "[^FF7700Questboard^000000]";
+			mes "Quest accepted.";
+			set c_run, true;
+			set currentquest$, .@selection;
+			close;
+		}
+		else{
+			mes "[^FF7700Questboard^000000]";
+			mes "You don't have the required";
+			mes "level to do this quest.";
+			close;
+		}
+
+	case 2:
+		set .@huntmenu$, "";
+		for( set .@i,0; .@i < .huntingquestcount; set .@i,.@i+1){
+			if (.@i) set .@huntmenu$,.@huntmenu$+":";
+			set .@huntmenu$, .@huntmenu$ + "[" + getd("." +(.@i+1)+"_huntingmin") + " - " + getd("." +(.@i+1)+"_huntingmax") + "] " + getd("." + (.@i+1) + "_huntingname$");
+		}
+		set .@selection,select(.@huntmenu$);
+		if(.quest_repeat == true){
+			if(gettimetick(2) < getd(.@selection + "_hunting_delay")){
+				set .@time_left, getd(.@selection + "_hunting_delay")-gettimetick(2);
+				mes "[^FF7700Questboard^000000]";
+				mes "You have to wait ^0000FF"+Time2Str(.@time_left)+"^000000 to do this quest again.";
+				close;
+			}
+		}
+		else{
+			if(getd(.@selection + "_hunting_repeat") == true){
+				mes "[^FF7700Questboard^000000]";
+				mes "You already did this quest.";
+				mes "Please choose another one.";
+				close;
+			}
+		}
 		mes "[^FF7700Questboard^000000]";
-		mes "You don't have the required";
-		mes "level to do this quest.";
+		mes "^0000FF"+getd("." + .@selection + "_huntingname$")+"^000000";
+		mes "--------------------------------";
+		set .@size, getarraysize(getd("."+ .@selection + "_huntingmob"));
+		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
+			mes "^FF0000"+strmobinfo(1,getd("."+.@selection+"_huntingmob["+.@j+"]"))+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
+		}
+		mes "--------------------------------";
+		mes "[Reward]";
+		mes "Item: ^0000FF"+((getd("." +.@selection+"_huntingprize"))?getitemname(getd("." +.@selection+"_huntingprize"))+" - "+getd("." +.@selection+"_huntingamount")+" ea.^000000":"Nothing^000000");
+		mes "Zeny: ^0000FF"+getd("." +.@selection+"_huntingzeny")+"^000000";
+		mes "Base EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+0+"]")+"^000000";
+		mes "Job EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+1+"]")+"^000000";
+		next;
+		if(select("Accept:Decline") == 2){
+			close;
+		}
+		if(BaseLevel >= getd("." +.@selection+"_huntingmin") && BaseLevel <= getd("." +.@selection+"_huntingmax")){
+			mes "[^FF7700Questboard^000000]";
+			mes "Quest accepted.";
+			set h_run, true;
+			set currentquest$, .@selection;
+			close;
+		}
+		else{
+			mes "[^FF7700Questboard^000000]";
+			mes "You don't have the required";
+			mes "level to do this quest.";
+			close;
+		}
+
+	case 3:
 		close;
 	}
-	
-case 3:
-	close;
-	}
-	
+
 L_checkitems:
-	for( set .@k,0; .@k < getarraysize(getd("."+currentquest$+"_collectionitem")); set .@k,.@k+2) {
+	set .@size, getarraysize(getd("."+currentquest$+"_collectionitem"));
+	for( set .@k,0; .@k < .@size; set .@k,.@k+2){
 		if(countitem(getd("."+currentquest$+"_collectionitem["+.@k+"]"))>=getd("."+currentquest$+"_collectionitem["+(.@k+1)+"]")){
 			set .@checkitem,.@checkitem+2;
 		}
 	}
-	if(.@checkitem<getarraysize(getd("."+currentquest$+"_collectionitem"))){
+	if(.@checkitem<.@size){
 		mes "[^FF7700Questboard^000000]";
 		mes "You don't have everything.";
 		close;
 	}
-	for( set .@delcount,0; .@delcount < getarraysize(getd("."+currentquest$+"_collectionitem")); set .@delcount,.@delcount+2) {
+	for( set .@delcount,0; .@delcount < .@size; set .@delcount,.@delcount+2){
 		delitem getd("."+currentquest$+"_collectionitem["+.@delcount+"]"),getd("."+currentquest$+"_collectionitem["+(.@delcount+1)+"]");
 	}
 	mes "[^FF7700Questboard^000000]";
@@ -199,13 +215,15 @@ L_checkitems:
 	set Zeny,Zeny+getd("." +currentquest$+"_collectionzeny");
 	getexp getd("." +currentquest$+"_collectionexp["+0+"]"),getd("." +currentquest$+"_collectionexp["+1+"]");
 	setd(currentquest$ + "_collection_delay"),gettimetick(2)+.quest_delay;
+	setd(currentquest$ + "_collection_repeat"),true;
 	set currentquest$, "";
-	set c_run, 0;
+	set c_run, false;
 	close;
-	
+
 L_checkmobs:
-	set .@goal, (getarraysize(getd("."+currentquest$+"_huntingmob"))/2);
-	for(set .@i, 1; .@i < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@i,.@i+2){
+	set .@size, getarraysize(getd("."+currentquest$+"_huntingmob"));
+	set .@goal, .@size/2;
+	for(set .@i, 1; .@i < .@size; set .@i,.@i+2){
 		set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
 		if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")==getd("."+currentquest$+"_huntingmob["+.@i+"]")){
 			set .@checkmonster, .@checkmonster+1;
@@ -216,7 +234,7 @@ L_checkmobs:
 		}
 		goto L_checkmobs2;
 	}
-	
+
 L_checkmobs2:
 	if(.@checkmonster<.@goal){
 		mes "[^FF7700Questboard^000000]";
@@ -225,7 +243,8 @@ L_checkmobs2:
 	}
 	mes "[^FF7700Questboard^000000]";
 	mes "Congratulation! Here is your Reward.";
-	for(set .@x, 1; .@x < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@x,.@x+2){
+	set .@size, getarraysize(getd("."+currentquest$+"_huntingmob"));
+	for(set .@x, 1; .@x < .@size; set .@x,.@x+2){
 		set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]");
 		setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0);
 	}
@@ -233,92 +252,127 @@ L_checkmobs2:
 	set Zeny, Zeny+getd("." +currentquest$+"_huntingzeny");
 	getexp getd("." +currentquest$+"_huntingexp["+0+"]"),getd("." +currentquest$+"_huntingexp["+1+"]");
 	setd(currentquest$ + "_hunting_delay"),gettimetick(2)+.quest_delay;
+	setd(currentquest$ + "_hunting_repeat"),true;
 	set currentquest$, "";
-	set h_run, 0;
+	set h_run, false;
 	close;
 
 OnNPCKillEvent:
-	if(h_run!=1) end;
-	for(set .@i, 1; .@i < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@i,.@i+2){
+	if(h_run!=true) end;
+	set .@size, getarraysize(getd("."+currentquest$+"_huntingmob"));
+	for(set .@i, 1; .@i < .@size; set .@i,.@i+2){
 		if(killedrid==getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]")){
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
-			if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")>=getd("."+currentquest$+"_huntingmob["+.@i+"]")) end;
-			setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1);
-			dispbottom getd("."+currentquest$+"_huntingname$")+": ["+strmobinfo(1,.@currentmob)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")";
-			end;
+			if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")<getd("."+currentquest$+"_huntingmob["+.@i+"]")){
+				setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1);
+				dispbottom getd("."+currentquest$+"_huntingname$")+": ["+strmobinfo(1,.@currentmob)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")";
+			}
+			if(getcharid(1) != 0 && .party_support == true){
+				getmapxy(.@map1$,.@x1,.@y1);
+				set .@killerid, getcharid(3);
+				set .@currentquest$, currentquest$;
+				getpartymember getcharid(1),1;
+				getpartymember getcharid(1),2;
+				for(set .@j, 0; .@j < $@partymembercount; .@j++){
+					if(isloggedin($@partymemberaid[.@j], $@partymembercid[.@j])){
+						if(h_run==true && $@partymemberaid[.@j] != .@killerid && .@currentquest$ == getvar(currentquest$, $@partymembercid[.@j]) && readparam(HP, $@partymembercid[.@j]) > 0){
+							getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@j]));
+							if(.@map1$ == .@map2$ && distance(.@x1,.@y1,.@x2,.@y2) < .party_range){
+								set .@kill_amt,getvar(getd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount"), $@partymembercid[.@j]);
+								set .@kill_goal,getd("."+.@currentquest$+"_huntingmob["+.@i+"]");
+								if(.@kill_amt<.@kill_goal)
+								{
+									setd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", .@kill_amt+1, $@partymembercid[.@j]);
+									dispbottom getd("."+.@currentquest$+"_huntingname$")+": ["+strmobinfo(1,.@currentmob)+"] ("+(.@kill_amt+1)+"/"+.@kill_goal+")", 0xB6FF00, $@partymembercid[.@j];
+								}
+							}
+						}
+					}
+				}
+			}
+			break;
 		}
-		continue;
 	}
 	end;
-	
+
 OnInit:
 
 	function AddCollection;
 	function AddHunting;
 
-	//Activate/Deactive quest categories here
-	set .collection, 1;
-	set .hunting, 1;
-	
+	//Activate/Deactivate quest categories (true/1 - activated, false/0 - deactivated)
+	set .collection, true;
+	set .hunting, true;
+
 	//Quest Delay (seconds)
 	//24 hours = 86400 seconds
 	set .quest_delay, 0;
-	
+
+	//Activate/Deactivate repeatable quests (true/1 - activated, false/0 - deactivated)
+	set .quest_repeat, true;
+
+	//Activate/Deactivate party support (true/1 - activated, false/0 - deactivated)
+	set .party_support, true;
+
+	//Max range for party support (+- x & y coordinations)
+	set .party_range, 25;
+
 	//Checks if quests are loaded (prevents out of index)
-	if(.questsloaded==1) end;
-		set .questsloaded, 1;
-		
-		//Add Collection Quests here
-		//AddCollection("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Item ID>,<Item Amount>,...);
-		
-		
-		//Add Hunting Quests here
-		//AddHunting("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...);
-		
-		end;
-		
+	if(.questsloaded==true) end;
+	set .questsloaded, true;
+
+	//Add Collection Quests here (You can add as many required items as you want)
+	//AddCollection("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Item ID>,<Item Amount>,...);
 
-function AddCollection {
-	set .collectionquestcount,.collectionquestcount+1;
-	setd ("." +.collectionquestcount+"_collectionname$", getarg(0));
-	setd ("." +.collectionquestcount+"_collectionmin", getarg(1));
-	setd ("." +.collectionquestcount+"_collectionmax", getarg(2));
-	setd ("." +.collectionquestcount+"_collectionprize", getarg(3));
-	setd ("." +.collectionquestcount+"_collectionamount", getarg(4));
-	setd ("." +.collectionquestcount+"_collectionzeny", getarg(5));
-	set .@argcount, 6;
-	set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionexp"));
-	setd ("." +.collectionquestcount+"_collectionexp["+.@size+"]",getarg(.@argcount)); 
-	setd ("." +.collectionquestcount+"_collectionexp["+(.@size+1)+"]",getarg(.@argcount+1)); 
-	set .@argcount, .@argcount+2;
-	while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1) {
+
+	//Add Hunting Quests here (You can add as many required mobs as you want)
+	//AddHunting("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...);
+	end;
+
+
+	function AddCollection{
+		set .collectionquestcount,.collectionquestcount+1;
+		setd ("." +.collectionquestcount+"_collectionname$", getarg(0));
+		setd ("." +.collectionquestcount+"_collectionmin", getarg(1));
+		setd ("." +.collectionquestcount+"_collectionmax", getarg(2));
+		setd ("." +.collectionquestcount+"_collectionprize", getarg(3));
+		setd ("." +.collectionquestcount+"_collectionamount", getarg(4));
+		setd ("." +.collectionquestcount+"_collectionzeny", getarg(5));
+		set .@argcount, 6;
+		set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionexp"));
+		setd ("." +.collectionquestcount+"_collectionexp["+.@size+"]",getarg(.@argcount)); 
+		setd ("." +.collectionquestcount+"_collectionexp["+(.@size+1)+"]",getarg(.@argcount+1)); 
+		set .@argcount, .@argcount+2;
 		set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionitem"));
-		setd ("."+.collectionquestcount+"_collectionitem["+.@size+"]",getarg(.@argcount)); 
-		setd ("."+.collectionquestcount+"_collectionitem["+(.@size+1)+"]",getarg(.@argcount+1));
-		set .@argcount,.@argcount+2;
+		while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){
+			setd ("."+.collectionquestcount+"_collectionitem["+.@size+"]",getarg(.@argcount)); 
+			setd ("."+.collectionquestcount+"_collectionitem["+(.@size+1)+"]",getarg(.@argcount+1));
+			set .@argcount,.@argcount+2;
+			set .@size, .@size+2;
+		}
+		return;
 	}
-	return;
-}
 
-function AddHunting {
-	set .huntingquestcount,.huntingquestcount+1;
-	setd ("." +.huntingquestcount+"_huntingname$", getarg(0));
-	setd ("." +.huntingquestcount+"_huntingmin", getarg(1));
-	setd ("." +.huntingquestcount+"_huntingmax", getarg(2));
-	setd ("." +.huntingquestcount+"_huntingprize", getarg(3));
-	setd ("." +.huntingquestcount+"_huntingamount", getarg(4));
-	setd ("." +.huntingquestcount+"_huntingzeny", getarg(5));
-	set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingexp"));
-	set .@argcount, 6;
-	setd ("." +.huntingquestcount+"_huntingexp["+.@size+"]",getarg(.@argcount));
-	setd ("." +.huntingquestcount+"_huntingexp["+(.@size+1)+"]",getarg(.@argcount+1)); 
-	set .@argcount, .@argcount+2;
-	while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1) {
-		set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingmob"));
-		setd ("."+.huntingquestcount+"_huntingmob["+.@size+"]",getarg(.@argcount)); 
-		setd ("."+.huntingquestcount+"_huntingmob["+(.@size+1)+"]",getarg(.@argcount+1));
+	function AddHunting{
+		set .huntingquestcount,.huntingquestcount+1;
+		setd ("." +.huntingquestcount+"_huntingname$", getarg(0));
+		setd ("." +.huntingquestcount+"_huntingmin", getarg(1));
+		setd ("." +.huntingquestcount+"_huntingmax", getarg(2));
+		setd ("." +.huntingquestcount+"_huntingprize", getarg(3));
+		setd ("." +.huntingquestcount+"_huntingamount", getarg(4));
+		setd ("." +.huntingquestcount+"_huntingzeny", getarg(5));
+		set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingexp"));
+		set .@argcount, 6;
+		setd ("." +.huntingquestcount+"_huntingexp["+.@size+"]",getarg(.@argcount));
+		setd ("." +.huntingquestcount+"_huntingexp["+(.@size+1)+"]",getarg(.@argcount+1)); 
 		set .@argcount, .@argcount+2;
+		set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingmob"));
+		while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){
+			setd ("."+.huntingquestcount+"_huntingmob["+.@size+"]",getarg(.@argcount)); 
+			setd ("."+.huntingquestcount+"_huntingmob["+(.@size+1)+"]",getarg(.@argcount+1));
+			set .@argcount, .@argcount+2;
+			set .@size, .@size+2;
+		}
+		return;
 	}
-	return;
-}
 }