//===== rAthena Script =======================================//= Dungeon Party System//===== By ===================================================//= lllchrislll//===== Version ==============================================//= 1.0 - Initial Release// - Fixxed an bug with warping to the Start Point - Thanks to Azeroth for the bug report// - Removed "set .pt_max" and replaced it with "MAX_PARTY" in the checks//===== Compatible With ======================================//= rAthena SQL 11.06.2015 Rev+//===== Tested With ==========================================//= rAthena SQL 11.06.2015 Rev//===== Description ==========================================//= Additional EXP Bonus (in Percent) based on Dungeon's Difficulty// - Difficulties: Easy, Medium, Hard// - EXP Rates: 50%, 100%, 150% (changeable)//= Dungeon Warp Service// - Warp to the Entrance only//= Party Settings dynamically changeable// - Quantity of Parties in 1 Dungeon//= Party Join Feature// - Requesting to join an existing Party, on accept the Leader can decide// to which member the applicant will be warped to//= Dungeon Rewards:// - Regular Dungeon Points (On/Off Function)// Base Points*Difficulty of Dungeon// - MvP Dungeon Points (On/Off Function)// Per slain MvP, you gain "x" Points (changeable)// Different kind of Points are: Custom Character Permanent Variable for Exchanger or #CASHPOINTS// - Dungeon Points Exchanger//===== Credits ==============================================//= To the author of the "Ultimate Warper" from the eAthena Board.// Since no header was included and I forgot the name of him/her,// I couldn't ask the permission to use an part of the script.// I used the map coordinates.//===== Notes ============================================//= Aldebaran and Clock Tower Dungeon: I splitted those two apart, even though they are connected//= Glastheim: I put the NPC duplicate at the main map, because the// dungeon is connected with each other, so it was difficult to decide// where to put the "Exit"//===== ToDo List ============================================//= Thinking if my funtion "SyncPartyData" is useful or not about the memory usage//============================================================prontera,151,185,4 script Dungeon Party Service 110,{mes .n$;mes "Hello, "+strcharinfo(0)+"!";mes "How can I help you?";next;switch(select("- Dungeon Menu:- Information:- "+ ( (.dg_rew == 1)?"Points Exchanger:- Nothing":"Nothing") )) { case 1: if(getd("$@pty_"+getcharid(1)+"_m$[0]") == "") { set @join,0; if(!getcharid(1)) { mes .n$; mes "Do you want to join a party?"; if(getarraysize(.pty_id) < 1) { mes "But since there is no party yet you could join, you need to create one yourself."; mes "Also you require 2 or more members to use the Dungeon Party Service."; close; } next; if(select("- Yes:- No") - 1) { mes .n$; mes "Then you need to create one first, also you require 2 and more members to use the Dungeon Party Service."; close; } next; mes .n$; mes "Please choose the dungeon first, then the party you want to join in."; set @join,1; next; } if(!@join) { if(strcharinfo(0) != getpartyleader(getcharid(1))) { mes .n$; mes "Only the party leader can register your party for the Dungeon Party Service."; close; } getpartymember(getcharid(1),2); for ( set .@p,0; .@p < $@partymembercount; set .@p,.@p + 1) if(isloggedin($@partymemberaid[.@p]) == 1) // Member logged in? set .@ct,.@ct + 1; if(.@ct < 2) { mes .n$; mes "A party requires 2 members minimum to use the Dungeon Party Service."; close; } set .@partyct,$@partymembercount; } set .men_dung$,""; // =============== Creating Dungeon Menu =============== for ( set .@du,0; .@du < getarraysize(.dungn$); set .@du,.@du + 1) { setd(".@"+.dungpre$[.@du]+"_ct"),0; // ========== Dungeon Party Counter ========= for( set .@i,0; .@i < getarraysize(.pty_id); set .@i,.@i + 1) { // Checking if the current Party is in this dungeon if(getd("$@pty_"+.pty_id[.@i]+"$") == .dungpre$[.@du]) setd(".@"+.dungpre$[.@du]+"_ct"),getd(".@"+.dungpre$[.@du]+"_ct") + 1; } set .men_dung$,.men_dung$ + "- "+.dungn$[.@du] +" ("+getd(".@"+.dungpre$[.@du]+"_ct")+"/"+.pt_limit+") (Min.Level - "+getd("."+.dungpre$[.@du]+"$[1]")+")"+ ( (.dungn$[.@du+1] != "")?":":""); } mes .n$; mes "Now please choose the dungeon your party wants to go:"; set @d,select( .men_dung$ ) - 1; next; mes .n$; mes "Dungeon: "+.dungn$[@d]; mes "Difficulty: "+( (getd("."+.dungpre$[@d]+"$[0]") == "1")?"Easy":( (getd("."+.dungpre$[@d]+"$[0]") == "2")?"Medium":"Hard") ); mes "Minimum Level: "+getd("."+.dungpre$[@d]+"$[1]"); mes "Existing Parties: "+getd(".@"+.dungpre$[@d]+"_ct"); if(@join) { next; mes .n$; if(BaseLevel < atoi(getd("."+.dungpre$[@d]+"$[1]"))) { mes "I'm sorry, but you don't meet the level requirement, which is "+getd("."+.dungpre$[@d]+"$[1]")+"!"; mes "Please try an other dungeon or level up until you reach that level."; close; } mes "I will now list the available parties:"; mes " "; for ( set .@l,0; .@l < getarraysize(.pty_id); set .@l,.@l + 1) { getpartymember(.pty_id[.@l]); if(getd("$@pty_"+.pty_id[.@l]+"$") == .dungpre$[@d] && $@partymembercount < MAX_PARTY) { mes "==================="; mes "Party Name: "+getpartyname(.pty_id[.@l]); mes "Leader: "+getpartyleader(.pty_id[.@l]); mes "Current Members: "+$@partymembercount; setarray .@pty_list[getarraysize(.@pty_list)],.pty_id[.@l]; set .@pty_menu$,.@pty_menu$ + "- "+getpartyname(.pty_id[.@l]) + ( (.pty_id[.@l+1] != 0)?":":""); mes ( (.pty_id[.@l+1] != 0)?"":"==================="); } } if(getarraysize(.@pty_list) < 1) { next; mes .n$; mes "I'm sorry, but there is no party on this map."; close; } mes " "; mes "Please choose, which party you want to send an application at:"; set .@p,select(.@pty_menu$) - 1; if(isloggedin(getpartyleader(.@pty_list[.@p],1),getpartyleader(.@pty_list[.@p],2)) == 1) { mes "I will send now an request to the party leader with your Level and Class."; mes "Please wait until the leader will accept or decline your request."; mes "If the leader doesn't respond in any way, please try to PM him/her by yourself."; mes "The leader's name is ["+getpartyleader(.@pty_list[.@p])+"]."; close2; set .@req_id,getcharid(0); // Creating Applicant array for the party setarray getd("$@req_"+.@pty_list[.@p]+"_id["+getarraysize(getd("$@req_"+.@pty_list[.@p]+"_id"))+"]"),.@req_id; // Applicant Info setarray getd("$@req_"+.@req_id+"$[0]"),strcharinfo(0),""+BaseLevel+"/"+JobLevel,"Class: "+jobname(Class); detachrid; attachrid(getpartyleader(.@pty_list[.@p],1)); announce .n$+": The player ["+getd("$@req_"+.@req_id+"$[0]")+"] with Level "+getd("$@req_"+.@req_id+"$[1]")+", "+getd("$@req_"+.@req_id+"$[2]")+" requests to join your party. You can accept/decline by sending an whisper to me via "NPC:Party_Join" and as text "List". There you gain additional information.",bc_self; end; } else { mes "It seems like that the party leader of "+getpartyname(.@pty_list[@p])+" isn't online."; mes "Please try another party."; close; } } next; mes .n$; if(getd(".@"+.dungpre$[@d]+"_ct") > .pt_limit) { mes "I'm sorry, but this dungeon already reached the maximum of parties it can hold."; mes "Please choose a different one."; close; } mes "I will now check the levels of your party members. Please wait...."; getpartymember(getcharid(1),1); for ( set .@l,0; .@l < $@partymembercount; set .@l,.@l + 1) // Checking Level of each party member if(readparam(11,""+strcharinfo(0,$@partymembercid[.@l])) < atoi(getd("."+.dungpre$[@d]+"$[1]"))) set .@l_ct,.@l_ct + 1; next; mes .n$; if(.@l_ct > 0) { mes "It seems like "+.@l_ct+" of your members haven't reached the required level for this dungeon."; mes "Please choose either a different dungeon or try to level up your members with lower level."; mes "The minimum level for this dungeon is "+getd("."+.dungpre$[@d]+"$[1]")+"!"; close; } mes "Your party will recieve an bonus of "+.exp[atoi(getd("."+.dungpre$[@d]+"$[0]"))]+"%."; mes "I will warp you and your party now to the "+.dungn$[@d]+ ( (compare(.dungn$[@d],"Dungeon") == 1)?" ":" Dungeon "); mes "Happy leveling!!!"; close2; // Saving Account and Character ID about Party Members callfunc "SyncPartyData",getcharid(1); // Saving Array Index of the Dungeon for .dungpre$ or .dungn$ setd(".pty_"+getcharid(1)+"_ix"),@d; // Used to save the Leveling Maps of the party for ( set .@d,3; .@d < getarraysize(getd("."+.dungpre$[@d]+"$")); set .@d,.@d + 4) setarray getd("$@pty_"+getcharid(1)+"_m$["+getarraysize(getd("$@pty_"+getcharid(1)+"_m$"))+"]"),""+getd("."+.dungpre$[@d]+"$["+.@d+"]"); // Saving Dungeon Prefix setd("$@pty_"+getcharid(1)+"$"),""+.dungpre$[@d]; // Setting Start Point setarray getd(".pty_"+getcharid(1)+"_st$[0]"),""+getd("."+.dungpre$[@d]+"$[3]"),""+getd("."+.dungpre$[@d]+"$[4]"),""+getd("."+.dungpre$[@d]+"$[5]"); // Setting Check Point variable to the 1st level of the dungeon, used to update the Start Point when reaching a new map setd(".pty_"+getcharid(1)+"_cp"),1; // Warping Party ... warpparty getd(".pty_"+getcharid(1)+"_st$[0]")+".gat",atoi(getd(".pty_"+getcharid(1)+"_st$[1]")),atoi(getd(".pty_"+getcharid(1)+"_st$[2]")),getcharid(1); // Debug Messages if(.debug) { for ( set .@b,0; .@b < getarraysize(getd("$@pty_"+getcharid(1)+"_m$")); set .@b,.@b + 1) debugmes "Leveling Map Array - ["+.@b+"]: "+getd("$@pty_"+getcharid(1)+"_m$["+.@b+"]"); debugmes "Dungeon Prefix: "+getd("$@pty_"+getcharid(1)+"$"); debugmes "Start Point Array - [0]:"+getd(".pty_"+getcharid(1)+"_st$[0]")+", [1]: "+getd(".pty_"+getcharid(1)+"_st$[1]")+", [2]: "+getd(".pty_"+getcharid(1)+"_st$[2]"); debugmes "Check Point: "+getd(".pty_"+getcharid(1)+"_cp"); debugmes "WarpParty - Array: "+getd(".pty_"+getcharid(1)+"_st$[0]")+".gat,"+atoi(getd(".pty_"+getcharid(1)+"_st$[1]"))+","+atoi(getd(".pty_"+getcharid(1)+"_st$[2]")); } setarray .pty_id[getarraysize(.pty_id)],getcharid(1); // Loading Dungeon NPC, if it is not loaded yet if(.debug) debugmes .n$+": Loading Dungeon NPC, if it is not loaded yet"; if(getvariableofnpc(.DGN_Load,"DG Party Progress#"+getd("$@pty_"+getcharid(1)+"$")) == 0) { donpcevent "DG Party Progress#"+getd("$@pty_"+getcharid(1)+"$")+"::OnDGLoad"; if(.debug) debugmes .n$+": Dungeon NPC - "DG Party Progress#"+getd("$@pty_"+getcharid(1)+"$")+"" - Status: "+( (getvariableofnpc(.DGN_Load,"DG Party Progress#"+getd("$@pty_"+getcharid(1)+"$")) == 1)?"Online":"Offline"); } break; // ============ Party is already registered ============== } else { mes .n$; mes "How can I help you?"; next; switch(select("- Remove Party from list:- Warp Options:- "+( (.dg_rew == 1)?"Dungeon Reward":"Nothing") )) { case 1: mes .n$; if(strcharinfo(0) != getpartyleader(getcharid(1))) { mes "I'm sorry, but only your party leader can can do this."; close; } mes "Do you really want to delete your party from my list?"; mes "You won't be able to gain any bonus EXP until you re-register your party!"; next; if(select("- Yes:- No") - 1) close; if(.dg_rew == 1 && getd("$@pty_"+getcharid(1)+"_rew") == 1) { mes .n$; mes "I'm sorry, but you still haven't collected your reward from the completed dungeon."; close; } close2; for ( set .@p,0; .@p < getarraysize(getd("$@pt_"+getcharid(1)+"_maid")); set .@p,.@p + 1) { set .@p_aid,getd("$@pt_"+getcharid(1)+"_maid["+.@p+"]"); // Current selected Member's Account ID set .@p_cid,getd("$@pt_"+getcharid(1)+"_mcid["+.@p+"]"); // Current selected Member's Character ID if(isloggedin(.@p_aid,.@p_cid) == 1 && .@p_aid != getpartyleader(getcharid(1),1)) { dispbottom .n$+": Your party leader wants to remove your party from my list, so....",0x00FF00,.@p_cid; dispbottom .n$+": I will warp you all in 10 seconds to your Save Points.",0x00FF00,.@p_cid; } } goto OnPartyDelete; end; case 2: mes .n$; mes "Do you want to be warped to one of your party members or to the start point?"; if(select("- To my comrades:- Start Point") - 1) { close2; warp getd(".pty_"+getcharid(1)+"_st$[0]")+".gat",atoi(getd(".pty_"+getcharid(1)+"_st$[1]")),atoi(getd(".pty_"+getcharid(1)+"_st$[2]")); end; } next; mes .n$; mes "Please select to which party member you want to be warped to:"; next; set .@pty_ml$,""; callfunc "SyncPartyData",getcharid(1); for ( set .@p,0; .@p < getarraysize(getd("$@pt_"+getcharid(1)+"_maid")); set .@p,.@p + 1) { set .@p_aid,getd("$@pt_"+getcharid(1)+"_maid["+.@p+"]"); // Current selected Member's Account ID set .@p_cid,getd("$@pt_"+getcharid(1)+"_mcid["+.@p+"]"); // Current selected Member's Character ID if(isloggedin(.@p_aid,.@p_cid) == 1) { // Member logged in? getmapxy(@map$,@mapx,@mapy,0,strcharinfo(0,.@p_cid)); for ( set .@c,0; .@c < getarraysize(getd("$@pty_"+getcharid(1)+"_m$")); set .@c,.@c + 1) if(@map$ == getd("$@pty_"+getcharid(1)+"_m$["+.@c+"]")) { // Member on an leveling Map as registered? set .@pty_ml$,.@pty_ml$ + "- "+strcharinfo(0,.@p_cid) + ( (.@p_aid) == getpartyleader(getcharid(1),1)?" (Leader)":"")+":"; setarray .@pty_mlc[getarraysize(.@pty_mlc)],.@p_cid; } } } if(.@pty_ml$ == "") { mes .n$; mes "I'm sorry, but no member of your party has been found on the dungeon map."; close; } set .@pm,select(.@pty_ml$) - 1; mes .n$; mes strcharinfo(0,.@pty_mlc[.@pm]) + ( (.@pty_mlc[.@pm] == getpartyleader(getcharid(1),2))?" (Leader)":""); mes "Correct?"; if(select("- Yes:- No") - 1) close; close2; atcommand "@warpto "+strcharinfo(0,.@pty_mlc[.@pm]); end; // Dungeon Reward case 3: if(!.dg_rew) close; mes .n$; if(strcharinfo(0) != getpartyleader(getcharid(1))) { mes "I'm sorry, but only your party leader can can do this."; close; } mes "Hello!"; mes "Let me check, if you have completed an dungeon to claim an reward."; next; mes .n$; if(getd("$@pty_"+getcharid(1)+"_rew") != 1) { mes "I'm sorry, but it seems like your party didn't complete an dungeon yet."; mes "Come again, when you did."; close; } mes "Congratulation for completing the dungeon, "+.dungn$[getd(".pty_"+getcharid(1)+"_ix")]+"!"; mes "I will now reward you and your party with "+set(.@res, (.dg_pts*atoi(getd("."+.dungpre$[getd(".pty_"+getcharid(1)+"_ix")]+"$[0]") ) ))+"x Dungeon Points."; mes "To reuse my service, please register your party again for the next dungeon."; close2; callfunc "SyncPartyData",getcharid(1); for ( set .@p,0; .@p < getarraysize(getd("$@pt_"+getcharid(1)+"_maid")); set .@p,.@p + 1) { set .@p_aid,getd("$@pt_"+getcharid(1)+"_maid["+.@p+"]"); // Current selected Member's Account ID set .@p_cid,getd("$@pt_"+getcharid(1)+"_mcid["+.@p+"]"); // Current selected Member's Character ID if(isloggedin(.@p_aid,.@p_cid) == 1) { setd(""+.dg_var$),getd(""+.dg_var$) + .@res,.@p_cid; if(.@p_aid != getpartyleader(getcharid(1),1) ) { dispbottom .n$+": For completing the dungeon, "+.dungn$[getd(".pty_"+getcharid(1)+"_ix")]+", you will be rewarded with "+.@res+"x Dungeon Points!",0x00FF00,.@p_cid; dispbottom .n$+": Also just in case you are still in the dungeon, I will warp you to Prontera!",0x00FF00,.@p_cid; } } } goto OnPartyDelete; end; } } break; case 2: mes .n$; mes "I can offer my Dungeon Party Service to any Party, which uses my Dungeon Warp Service, which allows the party to recieve more EXP based on the dungeons difficulty."; mes "For each Dungeon exists an party limit, how many parties can be in one Dungeon at once. Which is "+.pt_limit; mes "Also every Dungeon has a Level Requirement, which each party member must have reached!"; next; mes .n$; if(.dg_rew == 1) { mes "[====== Dungeon Rewards ======]"; mes "Depending on the Dungeon's Difficulty, you can get different amount of rewards."; mes "Currently you can gain "+.dg_pts+" Dungeon Points multiplied by "1" for Easy, by "2" for Medium, by "3" for Hard, Dungeons."; if(.mvp_rew == 1) { mes " "; mes "Also you can gain special points for each MvP your party kills:"; mes .mvp_pts +"x "+( (.mvp_rew == 1)?"MvP Points":"Cash Points")+", which also be multiplied by the difficulty of the Dungeon."; } } next; mes .n$; mes "[=== EXP Rates per Difficulty ===]"; mes "Easy: "+.exp[1]+"%"; mes "Medium: "+.exp[2]+"%"; mes "Hard: "+.exp[3]+"%"; close; // Dungeon Points Exchanger, if .dg_rew == 1 case 3: if(!.dg_rew) close; mes .n$; mes "Which points do you want to exchange?"; mes "Your Dungeon Points: "+getd(""+.dg_var$); mes "Your MvP Points: "+getd(""+.mvp_var$); next; switch(select("- Dungeon Points:- MvP Points")) { case 1: mes .n$; mes "Please choose the item you want your points to exchange to:"; mes "Format: Amount x Item (Price per Exchange)"; next; set .@b,select(.ex_m$) - 1; mes .n$; mes "You have selected "+.dg_ex_am+"x "+getitemname(.dg_ex[.@b])+"."; mes "Is that correct?"; if(select("- Yes:- No") - 1) close; next; mes .n$; mes "Now type the how often you want to exchange:"; mes "Price per exchange: "+.dg_ex_cost[.@b]; mes "Your Dungeon Points: "+getd(""+.dg_var$); // Setting exchange limit based on the current points you have set .@l,(getd(""+.dg_var$)/.dg_ex_cost[.@b]); mes "Maximum possible: "+.@l+", based on your current points."; next; if(input(.@buy,1,.@l) != 0) { mes .n$; mes "It seems like you put either a 0 or more than "+.@l+", which is the maximum you could exchange based on your points."; close; } mes .n$; getitem .dg_ex[.@b],.dg_ex_am[.@b]; setd(""+.dg_var$),getd(""+.dg_var$) - (.@buy*.dg_ex_cost[.@b]); mes "Your exchange has been completed."; mes "See you again for the next exchange."; break; case 2: mes .n$; if(!.mvp_rew) { mes "I'm sorry, but this exchange service is not currently available duo the fact MvP Points not being gainable."; mes "Please come back another time."; close; } mes "Please choose the item you want your points to exchange to:"; mes "Format: Amount x Item (Price per Exchange)"; next; set .@b,select(.ex_mvp_m$) - 1; mes .n$; mes "You have selected "+.mvp_ex_am+"x "+getitemname(.mvp_ex[.@b])+"."; mes "Is that correct?"; if(select("- Yes:- No") - 1) close; next; mes .n$; mes "Now type the how often you want to exchange:"; mes "Price per exchange: "+.mvp_ex_cost[.@b]; mes "Your MvP Points: "+getd(""+.mvp_var$); // Setting exchange limit base on the current points you have set .@l,(getd(""+.mvp_var$)/.mvp_ex_cost[.@b]); mes "Maximum possible: "+.@l+", based on your current points."; next; if(input(.@buy,1,.@l) != 0) { mes .n$; mes "It seems like you put either a 0 or more than "+.@l+", which is the maximum you could exchange based on your points."; close; } mes .n$; getitem .mvp_ex[.@b],.mvp_ex_am[.@b]; setd(""+.mvp_var$),getd(""+.mvp_var$) - (.@buy*.mvp_ex_cost[.@b]); mes "Your exchange has been completed."; mes "See you again for the next exchange."; break; } case 4: close;}end;OnPartyDelete:sleep2 10000;if(getd("$@pty_"+getcharid(1)+"_rew") != 1) warpparty "prontera.gat",156,191,getcharid(1);setd(".pty_"+getcharid(1)+"_ix"),0;setd("$@pty_"+getcharid(1)+"$"),"";setd("$@pty_"+getcharid(1)+"_rew"),0;deletearray getd(".pty_"+getcharid(1)+"_st$[0]"),128;setd(".pty_"+getcharid(1)+"_cp"),0;deletearray getd("$@pt_"+getcharid(1)+"_maid[0]"),128;deletearray getd("$@pt_"+getcharid(1)+"_mcid[0]"),128;for ( set .@m,0; .@m < getarraysize(getd("$@pty_"+getcharid(1)+"_m$")); set .@m,.@m + 1) deletearray getd("$@pt_"+getcharid(1)+"_"+getd("$@pty_"+getcharid(1)+"_m$["+.@m+"]")+"_mct"),128;deletearray getd("$@pty_"+getcharid(1)+"_m$"),128;for ( set .@d,0; .@d < getarraysize(.pty_id); set .@d,.@d + 1) if(getcharid(1) == .pty_id[.@d]) deletearray .pty_id[.@d],1;end;OnInit:// =============== NPC Name ===============set .n$,"["+strnpcinfo(1)+"]";// =============== Debug Mode ===============// * (Debug Messages in Map Server)// > 0: Off// > 1: On set .debug,0; // ============== Party Settings ================== //set .pt_limit,2; // x Parties per Dungeon// ============== Dungeon Settings ================== //setarray .exp[1],50,100,150; // EXP Rate in % for Difficulty: Easy/Medium/Hard// Dungeon Reward > 0 = Off, 1 = Onset .dg_rew,1; if(.dg_rew == 1) { set .dg_var$,"DG_Pts"; set .dg_pts,10; // Base Dungeon Points, will be multiplied by Difficulty // Dungeon Points Exchanger: // > Item IDs setarray .dg_ex[0],512; // > How many items you get per exchange? setarray .dg_ex_am[0],10; // > How much does one exchange cost? setarray .dg_ex_cost[0],2; // Creating exchange menu for ( set .@m,0; .@m < getarraysize(.dg_ex); set .@m,.@m + 1) set .ex_m$,.ex_m$ + "- "+.dg_ex_am[.@m]+"x "+getitemname(.dg_ex[.@m])+" ("+.dg_ex_cost[.@m]+")"+ ( (.dg_ex[.@m+1] != 0)?":":""); // MvP Reward for each MvP > 0 = Off, 1 = Permanent Character Variable, 2 = #CASHPOINTS set .mvp_rew,1; if(.mvp_rew == 1) { set .mvp_var$,"MvP_Pts"; set .mvp_pts,1; // Base MvP Points, will also be multiplied by Difficulty // MvP Points Exchanger: // > Item IDs setarray .mvp_ex[0],512; // > How many items you get per exchange? setarray .mvp_ex_am[0],10; // > How much does one exchange cost? setarray .mvp_ex_cost[0],2; for ( set .@m,0; .@m < getarraysize(.mvp_ex); set .@m,.@m + 1) set .ex_mvp_m$,.ex_mvp_m$ + "- "+.mvp_ex_am[.@m]+"x "+getitemname(.mvp_ex[.@m])+" ("+.mvp_ex_cost[.@m]+")"+ ( (.mvp_ex[.@m+1] != 0)?":":""); }}// =============== Dungeon Names ===============setarray .dungn$[0],"Cursed Abbey","Aldebaran Dungeon","Abyss Lake","Amatsu Dungeon","Ayothaya Dungeon","Bylan","Clock Tower","Coal Mine","Culvert","Einbech Dungeon","Gefenia","Geffen Dungeon","Glast Heim","Gonyrun Dungeon","Ice Dungeon","Labyrinth","Juperos","Kiel Academy","Lightalzen Bio Lab","Louyang Dungeon","Magma Dungeon","Odin Temple","Orc Dungeon","Payon Dungeon","Pyramid Dungeon","Sphinx Dungeon","Sunken Ship Dungeon","Thanatos Tower","Toy Factory Dungeon","Turtle Dungeon","Thor Volcano Dungeon";// =============== Dungeon Prefixes ===============setarray .dungpre$[0],"abbey","alde","abyss","amat","ayot","bylan","c_tow","coal","culv","einb","gefia","gefd","glas","gonr","iced","maze","jupe","kiel","lhz","louy","magma","odin","orcsd","pay","pyram","sphinx","pirate","thana","toy","turtle","thor_v";// =============== Dungeon Data ===============// = Format: Difficulty ,Level Requirement, Mob Counter Level 1,Map Name Level 1, Map X, Map Y, Mob Counter Level 2,....// = Difficulty: 1 = Easy, 2 = Medium, 3 = Hard// = Level: 1 = None, 2+ = Requirement// - ToDO: Adding Renewal Checksetarray .abbey$[0],"1","1","20","abbey01","51","14","20","abbey02","150","11","20","abbey03","120","10";setarray .alde$[0],"1","1","20","alde_dun01","197","25","20","alde_dun02","262","41","20","alde_dun03","276","53","20","alde_dun04","130","130";setarray .abyss$[0],"1","1","20","abyss_01","264","271","20","abyss_02","275","270","20","abyss_03","116","27";setarray .amat$[0],"1","1","20","ama_dun01","227","10","20","ama_dun02","32","43","20","ama_dun03","119","15";setarray .ayot$[0],"1","1","20","ayo_dun01","9","149","20","ayo_dun02","230","235";setarray .bylan$[0],"1","1","20","iz_dun00","168","168","20","iz_dun01","41","37","20","iz_dun02","236","204","20","iz_dun03","32","63","20","iz_dun04","26","27";setarray .c_tow$[0],"1","1","20","c_tower1","200","163","20","c_tower2","268","26","20","c_tower3","64","148","20","c_tower4","32","63";setarray .coal$[0],"1","1","20","mjo_dun01","52","17","20","mjo_dun02","381","343","20","mjo_dun03","302","261";setarray .culv$[0],"1","1","20","prt_sewb1","132","248","20","prt_sewb2","19","19;","20","prt_sewb3","180","169","20","prt_sewb4","100","92","20";setarray .einb$[0],"1","1","20","ein_dun01","22","18","20","ein_dun02","292","290";setarray .gefia$[0],"1","1","20","gefenia01","59","167","20","gefenia02","201","35","20","gefenia03","264","236","20","gefenia04","33","270";setarray .gefd$[0],"1","1","20","gef_dun00","104","100","20","gef_dun01","115","236","20","gef_dun02","106","132","20","gef_dun03","203","200";setarray .glas$[0],"1","1","20","gl_church","156","8","20","gl_chyard","147","15","20","gl_in01","121","59","20","gl_cas01","199","29","20","gl_cas02","104","25","20","gl_knt01","150","10","20","gl_knt02","157","287","20","gl_step","117","124","20","gl_sew01","258","255","20","gl_sew01","258","255","20","gl_sew02","108","291","20","gl_sew03","171","273","20","gl_dun01","133","271","20","gl_dun02","224","274","20","gl_prison","14","70","20","gl_prison1","150","14";setarray .gonr$[0],"1","1","20","gon_dun01","143","59","20","gon_dun02","17","114","20","gon_dun03","68","9";setarray .iced$[0],"1","1","20","ice_dun01","157","14","20","ice_dun02","151","155","20","ice_dun03","149","22","20","ice_dun04","34","139";setarray .maze$[0],"1","1","20","prt_maze01","176","7","20","prt_maze02","103","18","20","prt_maze03","23","8";setarray .jupe$[0],"2","65","20","juperos_01","99","92","20","juperos_02","34","59","20","jupe_core","150","285";setarray .kiel$[0],"2","1","20","kh_dun01","28","226","20","kh_dun02","41","198";setarray .lhz$[0],"2","60","20","lhz_dun01","151","286","20","lhz_dun02","18","148","20","lhz_dun03","140","136";setarray .louy$[0],"2","50","20","lou_dun01","218","196","20","lou_dun02","282","20","20","lou_dun03","165","37";setarray .magma$[0],"2","60","20","mag_dun01","126","69","20","mag_dun02","47","32";setarray .odin$[0],"3","70","20","odin_tem01","98","144","20","odin_tem02","22","181","20","odin_tem03","121","51";setarray .orcsd$[0],"1","1","20","orcsdun01","32","169","20","orcsdun02","21","185";setarray .pay$[0],"1","1","20","pay_dun00","22","180","20","pay_dun01","19","33","20","pay_dun02","19","63","20","pay_dun03","155","159","20","pay_dun04","201","204";setarray .pyram$[0],"1","1","20","moc_pryd01","192","9","20","moc_pryd02","10","192","20","moc_pryd03","100","92","20","moc_pryd04","181","11","20","moc_pryd05","94","96","20","moc_pryd06","192","8";setarray .sphinx$[0],"1","1","20","in_sphinx1","192","9","20","in_sphinx2","149","81","20","in_sphinx3","210","54","20","in_sphinx4","10","222","Level 5","in_sphinx5","100","99";setarray .pirate$[0],"1","1","20","treasure01","69","24","20","treasure02","102","27";setarray .thana$[0],"1","1","20","tha_t01","150","36","20","tha_t02","150","36","20","tha_t03","220","158","20","tha_t04","59","143","20","tha_t05","62","11","20","tha_t06","89","221","20","tha_t07","35","166","20","tha_t08","93","148","20","tha_t09","29","107","20","tha_t10","159","138","20","tha_t11","19","20","20","tha_t12","130","52","5";setarray .toy$[0],"1","40","20","xmas_dun01","205","16","20","xmas_dun02","129","133";setarray .turtle$[0],"2","50","20","tur_dun01","161","34","20","tur_dun02","148","256","20","tur_dun03","132","190","20","tur_dun04","100","192";setarray .thor_v$[0],"3","90","20","thor_v01","21","228","20","thor_v02","75","205","20","thor_v03","34","272";// Mapflagsfor ( set .@d,0; .@d < getarraysize(.dungn$); set .@d,.@d + 1) for ( set .@p,3; .@p < getarraysize(getd("."+.dungpre$[.@d]+"$")); set .@p,.@p + 4) { setmapflag getd("."+.dungpre$[.@d]+"$["+.@p+"]"),mf_nowarp; }if(.debug) debugmes "Starting Global Timer for Party Member Sync";initnpctimer; // Timer for re-copying Party Member Dataend;OnNPCKillEvent:if(!getcharid(1)) end;if(getmapflag(strcharinfo(3),mf_pvp) == 1 || getmapflag(strcharinfo(3),mf_gvg) == 1) end; // On PvP or GvG Maps = No effectif(getd("$@pty_"+getcharid(1)+"$") == "") end; // Not registered at the NPC.if(strcharinfo(3) != getd("$@pty_"+getcharid(1)+"_m$["+@map+"]")) for ( set .@m,0; .@m < getarraysize(getd("$@pty_"+getcharid(1)+"_m$")); set .@m,.@m + 1) if(strcharinfo(3) != getd("$@pty_"+getcharid(1)+"_m$["+.@m+"]")) // Member is on the leveling map? set .@f,1; else { set .@f,0; set @map,.@m; }if(.@f) end;// Checking if the Start Point Map is the same as the current one, if not update the Start Point array and Check Point variableif(getpartyleader(getcharid(1),4) != getd("$@pty_"+getcharid(1)+"_m$["+(getd(".pty_"+getcharid(1)+"_cp")-1)+"]") ) for ( set .@s,3; .@s < getarraysize(getd("."+getd("$@pty_"+getcharid(1)+"$")+"$")); set .@s,.@s + 4) if(getpartyleader(getcharid(1),4) == getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+.@s+"]")) { // Checking if the current index is higher than the current _cp variable if(set(.@cp,(.@s+1)/4) > getd(".pty_"+getcharid(1)+"_cp")) { // Updating _cp variable to new index setd(".pty_"+getcharid(1)+"_cp"),.@cp; // Setting new Start Point setarray getd("$@pty_"+getcharid(1)+"_st$[0]"),getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+.@s+"]"),getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+(.@s+1)+"]"),getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+(.@s+2)+"]"); } }// Reading EXP values from Mob Database set .@expr,.exp[atoi(getd("."+.dungpre$[getd(".pty_"+getcharid(1)+"_ix")]+"$[0]"))];set .@bexp,(getmonsterinfo(killedrid,3)*.@expr)/100;set .@jexp,(getmonsterinfo(killedrid,4)*.@expr)/100;// Increasing Party Mob Counterif(getd("$@pt_"+getcharid(1)+"_"+strcharinfo(3)+"_mct") < atoi(getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+( (4*(.@m+1)) - 2)+"]"))) setd("$@pt_"+getcharid(1)+"_"+strcharinfo(3)+"_mct"),getd("$@pt_"+getcharid(1)+"_"+strcharinfo(3)+"_mct") + 1;// Reading party arrays and setting a temporar npc variable for better overviewfor ( set .@p,0; .@p < getarraysize(getd("$@pt_"+getcharid(1)+"_maid")); set .@p,.@p + 1) { set .@c_aid,getd("$@pt_"+getcharid(1)+"_maid["+.@p+"]"); // Current selected Member's Account ID set .@c_cid,getd("$@pt_"+getcharid(1)+"_mcid["+.@p+"]"); // Current selected Member's Character ID // Check if the selected member is still in the same party as before if(getcharid(1,strcharinfo(0,.@c_cid)) != getcharid(1)) callfunc "SyncPartyData",getcharid(1); // Current selected Character ID is not the same as the one attached // wouldn't make sense, since it was called by the attached player if(getcharid(0) != .@c_cid) { // Member logged in? if(isloggedin(.@c_aid,.@c_cid) == 0) continue; // Member is alive if(readparam(5,strcharinfo(0,.@c_cid)) < 1) continue; // Member is on the same Map as the one who killed something if(strcharinfo(3,.@c_cid) != strcharinfo(3)) continue; } if(getd("$@pt_"+getcharid(1)+"_"+strcharinfo(3)+"_mct") < atoi(getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+( (4*(.@m+1)) - 2)+"]"))) dispbottom .n$+": Mobs Killed on "+strcharinfo(3)+": "+getd("$@pt_"+getcharid(1)+"_"+strcharinfo(3)+"_mct") +"/"+getd("."+getd("$@pty_"+getcharid(1)+"$")+"$["+( (4*(.@m+1)) - 2)+"]")+"!",0x00FF00,.@c_cid; else dispbottom .n$+": You're Party has reached the required mob quantity to proceed to the next level or visit the "DG Party Progress" NPC to complete the Dungeon.",0x00FF00,.@c_cid; getexp .@bexp,.@jexp,.@c_cid; dispbottom .n$+": Recieved Bonus: "+.@expr+"% - Base EXP: "+.@bexp+"/Job EXP: "+.@jexp,0x00FF00,.@c_cid; // Killed MvP > rewarding with points if .mvp_rew > 0 if(getmonsterinfo(killedrid,22) != 0 && .mvp_rew > 0) { set .@m_res,.mvp_pts*atoi(getd("."+.dungpre$[getd(".pty_"+getcharid(1)+"_ix")]+"$[0]")); switch(.mvp_rew) { case 1: setd(""+.mvp_var$),getd(""+.mvp_var$) + .@m_res,.@c_cid; break; case 2: set #CASHPOINTS,#CASHPOINTS + .@m_res,.@c_cid; break; } dispbottom .n$+": Recieved MVP Points: "+.@m_res+"x "+ ( (.mvp_rew == 1)?"MvP Points":"Cash Points")+".",0x00FF00,.@c_cid; }}end;// Re-copying Party Member Data every 5 MinutesOnTimer300000:stopnpctimer;if(.debug) debugmes "OnTimer Executed at 5 Minute:";if(getarraysize(.pty_id) > 0) { for ( set .@t,0; .@t < getarraysize(.pty_id); set .@t,.@t + 1) { if(.debug) debugmes "Synchronizing Member Data of Party ID"+.pty_id[.@t]; callfunc "SyncPartyData",.pty_id[.@t]; sleep 2500; }}if(.debug) debugmes "Restarting Timer....";initnpctimer;end;OnPCLogoutEvent:if(!getcharid(1)) end; // Not in a Party > Just in Caseif(getd("$@pty_"+getcharid(1)+"_m$[0]") == "") end; // Not registered at the NPC > same as aboveif(getpartyleader(getcharid(1),1) != getcharid(3)) end; // Attached player is not party leaderif(.debug) debugmes "Party Leader logged off, changing leader:";set .@pty_id,getcharid(1);set .@pty_lead,getpartyleader(getcharid(1),1);if(.debug) debugmes "Party ID: "+.@pty_id+", Party Leader Acc ID:"+ .@pty_lead;for ( set .@p,0; .@p < getarraysize(getd("$@pt_"+.@pty_id+"_maid")); set .@p,.@p + 1) { set .@c_aid,getd("$@pt_"+.@pty_id+"_maid["+.@p+"]"); // Current selected Member's Account ID set .@c_cid,getd("$@pt_"+.@pty_id+"_mcid["+.@p+"]"); // Current selected Member's Character ID if(.debug) debugmes "Current Acc and Char ID: "+.@c_aid+", "+.@c_cid; // Member is logged in and is not the current Party Leader if(isloggedin(.@c_aid,.@c_cid) == 1 && .@c_aid != .@pty_lead) { if(.debug) debugmes "Changing Leader of party "+.@pty_id+" to "+.@c_cid; party_changeleader(.@pty_id,.@c_cid); break; }}end;}// Function to Re-Copy the Account ID and Character ID for each Party Member in an arrayfunction script SyncPartyData {// ============================================// getarg(0) = Party ID// ============================================getpartymember(getarg(0),1);getpartymember(getarg(0),2);copyarray getd("$@pt_"+getarg(0)+"_maid[0]"),$@partymemberaid[0],$@partymembercount;copyarray getd("$@pt_"+getarg(0)+"_mcid[0]"),$@partymembercid[0],$@partymembercount;if(getd("$@pt_"+getarg(0)+"_maid[0]") == 0) debugmes .n$+": Copy Array for Party ID "+getarg(0)+" failed. Use "setarray"!!!";return;}// ======================= Party Join Feature - NPC =====================- script Party_Join -,{OnInit:set .n$,getvariableofnpc(.n$,"Dungeon Party Service");end;OnWhisperGlobal:if(!getcharid(1)) end;if(getmapflag(strcharinfo(3),mf_pvp) == 1 || getmapflag(strcharinfo(3),mf_gvg) == 1) end; // On PvP or GvG Maps = No effectif(strcharinfo(0) != getpartyleader(getcharid(1))) end;// List of the requestersif(@whispervar0$ == "List" || @whispervar0$ == "list") { if(getarraysize(getd("$@req_"+getcharid(1)+"_id")) < 1) { dispbottom .n$+": I'm sorry, but there are no applicants to list!",0x00FFFF; end; } dispbottom .n$+": I will now list the requesters, which want to join your party.",0x00FFFF; dispbottom .n$+": Each requester gets an number, like 1.<Name>.",0x00FFFF; dispbottom .n$+": With this number, you have to re-pm me, but instead of "List", you have to use "Join" or "Abort"."Accept" or "Decline" does also work.",0x00FFFF; dispbottom .n$+": After "Join"/"Accept" or "Abort"/"Decline", you have to add "#<Number of requester>".",0x00FFFF; dispbottom "==================="; dispbottom "- Number: Name, Level:, Class",0xFF2200; for ( set .@r,0; .@r < getarraysize(getd("$@req_"+getcharid(1)+"_id")); set .@r,.@r + 1) dispbottom "- "+(.@r+1)+": "+getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@r+"]")+"$[0]")+", "+getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@r+"]")+"$[1]")+", "+getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@r+"]")+"$[2]"),0xFF2200; dispbottom "==================="; dispbottom .n$+": I will now list here your party members, also with a number, to warp the chosen player to that party member.",0x00FFFF; dispbottom .n$+": To let the player warp to one of your party members add after the number of the player "#<Number of Member>".",0x00FFFF; dispbottom .n$+": So it would look something like this: "Join#1#1", this would let the 1st requester in the list to the 1st party member, most cases you.",0x00FFFF; dispbottom .n$+": Note: If you use "Abort"/"Decline" the number of the party member won't take effect, of course.",0x00FFFF; dispbottom "==================="; getpartymember(getcharid(1)); set @partyct,$@partymembercount; copyarray @partymemb$[0],$@partymembername$[0],@partyct; dispbottom "- Number: Member Name:",0xFF2200; for ( set .@p,0; .@p < @partyct; set .@p,.@p + 1) if(isloggedin(getcharid(3,@partymemb$[.@p]),getcharid(0,@partymemb$[.@p])) == 1) // Member logged in? dispbottom "- "+(.@p+1)+"."+@partymemb$[.@p] + ( (@partymemb$[.@p] == getpartyleader(getcharid(1)))?" (Leader)":""),0xFF2200; dispbottom "===================";// Accepting requesters} else if(compare(@whispervar0$,"Accept") == 1 || compare(@whispervar0$,"Join") == 1) { if(@whispervar1$ == "" || @whispervar2$ == "") { dispbottom .n$+": Either you didn't put the requesters number or the number of the party member he should be warped to!"; end; } // In case the leader logged of, the "@" variables were deleted if(@partymemb$[atoi(@whispervar2$)-1] == "") { dispbottom .n$+": An bug has occured, in which I couldn't find the list for your party members."; dispbottom .n$+": Possible Bug: You logged off or disconnected. Please repeat the previous step."; end; } set .@nr,atoi(@whispervar1$)-1; message getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")+"$[0]"),.n$+": Your request has been accepted, you will be warped to the party member chosen from the leader."; party_addmember(getcharid(1),getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")); sleep2 2000; charcommand "#warpto ""+strcharinfo(0,getd("$@req_"+getcharid(1)+"_id["+.@nr+"]"))+"" "+@partymemb$[atoi(@whispervar2$)-1]; // Resync of Party Member Data callfunc "SyncPartyData",getcharid(1); // Deleting applicant from application list deletearray getd("$@req_"+getcharid(1)+"_id["+.@nr+"]"),1; deletearray getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")+"$[0]"),128; // Declining requesters} else if(compare(@whispervar0$,"Decline") == 1 || compare(@whispervar0$,"Abort") == 1) { if(@whispervar1$ == "") { dispbottom .n$+": You didn't put the requesters number!"; end; } set .@nr,atoi(@whispervar1$)-1; if(isloggedin(getcharid(3,strcharinfo(0,getd("$@req_"+getcharid(1)+"_id["+.@nr+"]"))),getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")) != 0) message getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")+"$[0]"),.n$+": I'm sorry, but your request has been declined."; dispbottom .n$+": The applicant ["+getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")+"$[0]")+"] has been deleted from the list."; deletearray getd("$@req_"+getcharid(1)+"_id["+.@nr+"]"),1; deletearray getd("$@req_"+getd("$@req_"+getcharid(1)+"_id["+.@nr+"]")+"$[0]"),128;} else dispbottom .n$+": I'm not sure, what you wanted from me, but I can't do that."; end;}// ======================= Inside Dungeon NPC =====================- script Dungeon Guard#main::DG_Main 110,{if(!getcharid(1)) end;set .@n$,"["+strnpcinfo(1)+"]";mes .@n$;if(getpartyleader(getcharid(1)) != strcharinfo(0)) { mes "Only the party leader can talk to me!"; close;}if(getd("$@pty_"+getcharid(1)+"_m$[0]") == "") { mes "You didn't register your party for the Dungeon Party Service."; close;}if(getarraysize(getd("."+strnpcinfo(2)+"$")) < 1) { mes "An bug has occured, please contact an GM."; mes "But talk to me again!!"; set .debug,1; close2; goto OnDGLoad;}mes "Here is your party's progress so far:";for ( set .@m,0; .@m < getarraysize(getd("$@pty_"+getcharid(1)+"_m$")); set .@m,.@m + 1) { mes "On the "+(.@m + 1)+". Level (Map: "+getd("$@pty_"+getcharid(1)+"_m$["+.@m+"]")+"),"; for ( set .@n,3; .@n < getarraysize(getd("."+strnpcinfo(2)+"$")); set .@n,.@n + 4) { if(getd("$@pty_"+getcharid(1)+"_m$["+.@m+"]") != getd("."+strnpcinfo(2)+"$["+.@n+"]")) continue; mes "your party has killed "+getd("$@pt_"+getcharid(1)+"_"+getd("$@pty_"+getcharid(1)+"_m$["+.@m+"]")+"_mct")+"/"+atoi(getd("."+strnpcinfo(2)+"$["+(.@n-1)+"]")); if(getd("$@pt_"+getcharid(1)+"_"+getd("$@pty_"+getcharid(1)+"_m$["+.@m+"]")+"_mct") < atoi(getd("."+strnpcinfo(2)+"$["+(.@n-1)+"]")) ) set .@kc,.@kc + 1; }}if(.@kc) { next; mes .@n$; mes "But to complete the dungeon, your party still has to kill some more monsters."; mes "Please go back to the specific levels and kill the rest of the monsters."; close;}next;mes .@n$;mes "Congratulation!";mes "You have completed the dungeon.";if(getvariableofnpc(.dg_rew,"Dungeon Party Service") == 1) { mes "Please visit the "Dungeon Party Service" for your rewards."; setd("$@pty_"+getcharid(1)+"_rew"),1;}mes "You*re party will now be warped to Prontera.";close2;warpparty "prontera",156,191,getcharid(1);end;OnDGLoad:set .DGN_Load,1;while(getvariableofnpc(getd("."+strnpcinfo(2)+"$["+.@n+"]"),"Dungeon Party Service") != "") { setarray getd("."+strnpcinfo(2)+"$["+.@n+"]"),getvariableofnpc(getd("."+strnpcinfo(2)+"$["+.@n+"]"),"Dungeon Party Service"); if(.debug) debugmes strnpcinfo(0)+": getvariableofnpc:"+ getvariableofnpc(getd("."+strnpcinfo(2)+"$["+.@n+"]"),"Dungeon Party Service"); set .@n,.@n + 1; sleep 100;}if(.debug) set .debug,0;end;}// ======================= Start of Dungeon Exit - NPC Duplicates =====================//dungeon_map,x,y,facing duplicate(DG_Main) DG Party Progress#<dungeon array prefix> 110// NOTE: Don't change the "DG Party Progress" part of the npc names unless you change it everywhere in the script,// just search for it and exchange it with the new name.// You can add more dungeons as you like, except instance dungeons, which aren't supported by this script.// 1.: Take a look at the OnInit: above with the dungeon settings.// 2.: Add your dungeon data like the others.// 3.: Add an NPC Duplicate like below.// 4.: Restart the server/ @reloadscriptabbey03,234,216,4 duplicate(DG_Main) DG Party Progress#abbey 110abyss_03,98,103,4 duplicate(DG_Main) DG Party Progress#abyss 110ama_dun03,120,223,4 duplicate(DG_Main) DG Party Progress#amat 110ayo_dun02,149,246,4 duplicate(DG_Main) DG Party Progress#ayot 110iz_dun04,130,222,4 duplicate(DG_Main) DG Party Progress#bylan 110 c_tower4,82,138,4 duplicate(DG_Main) DG Party Progress#c_tow 110alde_dun04,165,268,4 duplicate(DG_Main) DG Party Progress#alde 110mjo_dun03,34,52,4 duplicate(DG_Main) DG Party Progress#coal 110prt_sewb4,34,52,4 duplicate(DG_Main) DG Party Progress#culv 110ein_dun02,25,88,4 duplicate(DG_Main) DG Party Progress#einb 110gefenia04,160,30,4 duplicate(DG_Main) DG Party Progress#gefia 110gef_dun03,119,104,4 duplicate(DG_Main) DG Party Progress#gefd 110glast_01,191,120,4 duplicate(DG_Main) DG Party Progress#glas 110gon_dun03,99,183,4 duplicate(DG_Main) DG Party Progress#gonr 110ice_dun03,149,116,4 duplicate(DG_Main) DG Party Progress#iced 110prt_maze03,177,89,4 duplicate(DG_Main) DG Party Progress#maze 110jupe_core,150,129,4 duplicate(DG_Main) DG Party Progress#jupe 110kh_dun02,129,98,4 duplicate(DG_Main) DG Party Progress#kiel 110lhz_dun02,150,145,4 duplicate(DG_Main) DG Party Progress#lhz 110lou_dun03,170,153,4 duplicate(DG_Main) DG Party Progress#louy 110mag_dun02,43,44,4 duplicate(DG_Main) DG Party Progress#magma 110odin_tem03,278,236,4 duplicate(DG_Main) DG Party Progress#odin 110orcsdun02,77,88,4 duplicate(DG_Main) DG Party Progress#orcsd 110pay_dun04,120,116,4 duplicate(DG_Main) DG Party Progress#pay 110moc_pryd06,97,59,4 duplicate(DG_Main) DG Party Progress#pyram 110in_sphinx5,100,149,4 duplicate(DG_Main) DG Party Progress#sphinx 110treasure02,101,166,4 duplicate(DG_Main) DG Party Progress#pirate 110tha_t12,136,65,4 duplicate(DG_Main) DG Party Progress#thana 110xmas_dun02,134,134,4 duplicate(DG_Main) DG Party Progress#toy 110tur_dun04,92,100,4 duplicate(DG_Main) DG Party Progress#turtle 110thor_v03,151,162,4 duplicate(DG_Main) DG Party Progress#thor_v 110// ======================= End of NPC Duplicates =====================// ======================= End of Script =====================
helo.. i need some help for fixing this script.