//===== eAthena Script ======================================= //= PvP NPCs //===== By: ================================================== //= kobra_k88; L0ne_W0lf //===== Current Version: ===================================== //= 1.5 //===== Compatible With: ===================================== //= eAthena SVN //===== Description: ========================================= //= [Aegis Conversion] //= PvP NPCs that are found in the Inns in major cities. //= Includes Yoyo Mode, Nightmare Mode, and Event Mode //= //= Breakdown of function "F_PVPNarrator" //= arg(0): Map to save player on //= arg(1): X position on getarg(0) map to save player //= arg(2): Y position on getarg(0) map to save player //===== Additional Comments: ================================= //= 1.1 Fixed arena names for Nightmare mode. Added room limit //= check.[kobra_k88] //= 1.2 Fixed the bug that you aways savepoint in geffen.[shadowlady] //= 1.2a Added PvP Narrator function. Using args for Fight //= Square Helpers. [kobra_k88] //= 1.3 Rescripted to Aegis 10.3 standards. [L0ne_W0lf] //= Removed all receptioned for Yoyo mode, with the //= exception of the "Free for all" mode. //= Added PVP event NPCs. //= 1.4 Corrected NPC names to fall within proper restrictions. [L0ne_W0lf] //= 1.5 Duplicates now spawn from floating NPCs. [L0ne_W0lf] //============================================================ // Floating NPC //============================================================ - script Gate Keeper#dummy::PVPGateKeeper -1,{ mes "[Gate Keeper]"; mes "Glad to be of service."; mes "I will open the PVP fight"; mes "square for you! If you have"; mes "any questions about the PVP"; mes "modes or rules, Please ask"; mes "the Narrator..."; next; switch(select("^FF5533' PvP Nightmare Mode'^000000:^3355FF' PvP Yoyo Mode'^000000:^3355FF' PvP Event Mode'^000000:Quit")) { case 1: mes "[Gate Keeper]"; mes "I am sorry, but currently the Nightmare mode service is not available."; mes "Please use the Yoyo mode instead. We apologize for the inconvenience."; close; case 2: mes "[Gate Keeper]"; mes "The admission fee is 500 Zeny."; mes "Do you want to move"; mes "to the Yoyo Mode"; mes "fight square?"; next; switch(select("Move:Cancel")) { case 1: if (Zeny > 499 && BaseLevel > 30) { set zeny,zeny-500; warp "pvp_y_room",51,23; end; } else { mes "[Gate Keeper]"; mes "Excuse me, but"; mes "did you not come prepared?"; mes "Double check that you have the"; mes "500 Zeny entrance fee, and"; mes "that you are at least level 31!"; close; } case 2: mes "[Gate Keeper]"; mes "In this war between Monsters"; mes "and Humans. This competition"; mes "between people, The PVP Mode!"; mes "Encourages us all to become"; mes "stronger. Come again."; mes "We welcome your challenge!"; close; } case 3: mes "[Gate Keeper]"; mes "Welcome"; mes "Please double check"; mes "That you have the admission or viewing ticket!"; next; if (countitem(7028) == 0 && countitem(7029) == 0) { mes "[Gate Keeper]"; mes "Eh? You don't have it? Then I"; mes "am sorry, this fight square is"; mes "only for people who have"; mes "admission or viewing tickets."; mes "You cannot come in without it."; close; } mes "[Gate Keeper]"; mes "Yes, thank you for participating. Have fun!"; close2; warp "pvp_room",51,23; end; case 4: mes "[Gate Keeper]"; mes "In this war between Monsters"; mes "and Humans. This competition"; mes "between people, The PVP Mode!"; mes "Encourages us all to become"; mes "stronger. Come again."; mes "We welcome your challenge!"; close; } } // Morroc //============================================================ morocc_in,144,138,4 script PVPNarrator#moc 84,{ callfunc "F_PVPNarrator","morocc_in",141,139; } morocc_in,144,142,4 duplicate(PVPGateKeeper) Gate Keeper#moc 83,{ // Alberta //============================================================ alberta_in,22,146,4 script PVP Narrator#alb 84,{ callfunc "F_PVPNarrator","alberta_in",22,148; } alberta_in,26,146,4 duplicate(PVPGateKeeper) Gate Keeper#alb 83 // Prontera //============================================================ prt_in,56,140,4 script PVPNarrator#prt 84,{ callfunc "F_PVPNarrator","prt_in",54,137; } prt_in,52,140,4 duplicate(PVPGateKeeper) Gate Keeper#prt 83 // Geffen //============================================================ geffen_in,67,63,4 script PVPNarrator#gef 84,{ callfunc "F_PVPNarrator","geffen_in",70,59; } geffen_in,63,63,4 duplicate(PVPGateKeeper) Gate Keeper#gef 83 // Payon //============================================================ payon_in01,142,50,4 script PVPNarrator#pay 84,{ callfunc "F_PVPNarrator","payon_in01",142,46; } payon_in01,140,53,4 duplicate(PVPGateKeeper) Gate Keeper#pay 83 // PVP Yoyo Mode Staff //============================================================ pvp_y_room,86,85,4 script Fight Square Reception#1 105,{ set .@mapcount_1,getmapusers("pvp_y_8-1"); set .@mapcount_2,getmapusers("pvp_y_8-2"); set .@mapcount_3,getmapusers("pvp_y_8-3"); set .@mapcount_4,getmapusers("pvp_y_8-4"); set .@mapcount_5,getmapusers("pvp_y_8-5"); while(1) { switch(select("Prontera [ "+.@mapcount_1+" / 128 ]:Izlude [ "+.@mapcount_2+" / 128 ]:Payon [ "+.@mapcount_3+" / 128 ]:Alberta [ "+.@mapcount_4+" / 128 ]:Morroc [ "+.@mapcount_5+" / 128 ]:Cancel")) { case 1: callsub S_CheckPVPRoom,@mapcount_1,"pvp_y_8-1"; break; case 2: callsub S_CheckPVPRoom,@mapcount_2,"pvp_y_8-2"; break; case 3: callsub S_CheckPVPRoom,@mapcount_3,"pvp_y_8-3"; break; case 4: callsub S_CheckPVPRoom,@mapcount_4,"pvp_y_8-4"; break; case 5: callsub S_CheckPVPRoom,@mapcount_5,"pvp_y_8-5"; break; case 6: close; } } OnInit: waitingroom "Free For All",0; end; S_CheckPVPRoom: if (getarg(0) >= 128) { mes "[PVP Fight Square Reception Staff]"; mes "This map is currently full."; next; return; } else { warp getarg(1),0,0; end; } } // PVP Nightmare Mode Staff //============================================================ pvp_n_room,30,85,4 script Fight Square Reception#2 105,{ set .@mapcount_1,getmapusers("pvp_n_8-1"); set .@mapcount_2,getmapusers("pvp_n_8-2"); set .@mapcount_3,getmapusers("pvp_n_8-3"); set .@mapcount_4,getmapusers("pvp_n_8-4"); set .@mapcount_5,getmapusers("pvp_n_8-5"); while(1) { switch(select("Sandwich [ "+.@mapcount_1+" / 64 ]:Lock on [ "+.@mapcount_2+" / 32 ]:Four Room [ "+.@mapcount_3+" / 32 ]:Under cross [ "+.@mapcount_4+" / 32 ]:Compass Room [ "+.@mapcount_5+" / 32 ]:Cancel")) { case 1: callsub S_CheckPVPRoom,@mapcount_1,"pvp_n_8-1",64; break; case 2: callsub S_CheckPVPRoom,@mapcount_2,"pvp_n_8-2",32; break; case 3: callsub S_CheckPVPRoom,@mapcount_3,"pvp_n_8-3",32; break; case 4: callsub S_CheckPVPRoom,@mapcount_4,"pvp_n_8-4",32; break; case 5: callsub S_CheckPVPRoom,@mapcount_5,"pvp_n_8-5",32; break; case 6: close; } } OnInit: waitingroom "Free For All",0; end; S_CheckPVPRoom: if (getarg(0) >= getarg(2)) { mes "[PVP Fight Square Reception Staff]"; mes "This map is currently full."; next; return; } else { warp getarg(1),0,0; end; } } // Function //============================================================ function script F_PVPNarrator { mes "[PVP Narrator]"; mes "Hello and welcome!"; mes "I am in charge of"; mes "explaining the PVP Mode."; mes "I am the PVP Narrator!"; next; switch(select("What is PVP?:What are the PVP Modes?:What are the rules for PVP?:Save Position.:End Dialog.")) { case 1: mes "[PVP Narrator]"; mes "In short form"; mes "PVP means,"; mes "' Player VS Player Mode '"; mes "It's a unique place for people"; mes "To duel with each other."; next; mes "[PVP Narrator]"; mes "Just tell the"; mes "^3355FFGate Keeper^000000"; mes "That you want to try. He will"; mes "let you into the PVP square."; next; mes "[PVP Narrator]"; mes "But, You need to be at"; mes "least level 31. And you"; mes "must pay the 500 zeny"; mes "entrance fee in order to"; mes "To enter a PVP Fight Square."; close; case 2: mes "[PVP Narrator]"; mes "When you are qualified, You"; mes "can choose one of two Modes."; mes "Yoyo Mode, Or"; mes "Nightmare Mode."; next; mes "[PVP Narrator]"; mes "Yoyo Mode is risk free."; mes "You can experience PVP"; mes "without any restriction or"; mes "punishment. It is recommended"; mes "that you practice your skills"; mes "here before you move on."; next; mes "[PVP Narrator]"; mes "Nightmare Mode is very"; mes "dangerous! Please use caution."; mes "You will lose some of your real"; mes "EXP when you are defeated. And"; mes "There is a small chance that"; mes "you will drop some equipment."; next; mes "[PVP Narrator]"; mes "However, if you win, the"; mes "rewards can be great!"; mes "To avoid misunderstanding."; mes "You should think it over"; mes "twice before you go there..."; mes "Good Luck!"; close; case 3: mes "[PVP Narrator]"; mes "Each of the Fight squares"; mes "have a row of Narrators to"; mes "choose from based on your"; mes "qualifications."; next; mes "[PVP Narrator]"; mes "Each Narrator will ask"; mes "which of the five PVP maps"; mes "you wish to go to."; mes "Choose, and go in!"; next; mes "[PVP Narrator]"; mes "Each map has a limitation on"; mes "the number of people who can"; mes "participate. So you will see"; mes "figures in the corner showing"; mes "'Attendee/total'."; next; mes "[PVP Narrator]"; mes "Also, there is a hidden EXP"; mes "value in PVP mode. This EXP"; mes "score will only apply inside"; mes "of the PVP zone, so do not"; mes "worry."; next; mes "[PVP Narrator]"; mes "Every player's EXP at the"; mes "beginning is usually 5 points."; mes "If you win, you will"; mes "increse your EXP by 1 point"; next; mes "[PVP Narrator]"; mes "In the same way, when you"; mes "lose... Your EXP will"; mes "drop by 5 points."; mes "So be careful!"; next; mes "[PVP Narrator]"; mes "When you are defeated"; mes "And your EXP is equal"; mes "to or less than 0,"; mes "You will be removed from PVP"; mes "And your duel is finished!"; next; mes "[PVP Narrator]"; mes "However, If your EXP is more"; mes "than 0. You can still get help"; mes "Through other players healing..."; mes "Do you get it?"; next; mes "[PVP Narrator]"; mes "The fighting commands inside of"; mes "PVP Are the same as the normal."; mes "All the basic controls are the"; mes "same."; next; mes "[PVP Narrator]"; mes "However, there is one thing..."; mes "Within the PVP fight square,"; mes "And in the PVP fighting zones"; mes "You cannot save your position."; mes "Remember well... These rules"; mes "can help to ensure your victory."; close; case 4: mes "[PVP Narrator]"; mes "Position saved..."; mes "Successfully."; mes "Thank you very much, We"; mes "will see you again soon."; close2; savepoint getarg(0),getarg(1),getarg(2); end; case 5: mes "[PVP Narrator]"; mes "In this war between Monsters"; mes "and Humans. This competition"; mes "between people, The PVP Mode!"; mes "Encourages us all to become"; mes "stronger. Come again."; mes "We welcome your challenge!"; close; } } // Event Contestant Entrance //============================================================ pvp_room,54,85,4 script Registration Staff#1 105,{ if (countitem(7028) == 0) { mes "[PVP Combat Square Register Staff]"; mes "Eh? How did you get in here?"; mes "This is the entrance for players only."; mes "For details about viewers please proceed to the Register Staff on your right."; close; } if (.pvp_close_n_room == 1 && .pvp_close_s_room == 1 && .pvp_close_w_room == 1 && .pvp_close_e_room == 1) { Set .pvp_close_n_room,0; Set .pvp_close_s_room,0; Set .pvp_close_w_room,0; Set .pvp_close_e_room,0; } if (select("Combat Square one :Cancel") == 1) { mes "[PVP Combat Square Register Staff]"; mes "'"+ strcharinfo(0) +"'"; mes "Are you ready?!"; next; if (select("Yes!:No!") == 1) { mes "[PVP Combat Square Register Staff]"; mes "OK! I will send you inside"; mes "Good luck!"; close2; delitem 7028,1; //Invite_For_Duel while(1) { switch(rand(1,4)) { case 1: if (.pvp_close_n_room == 0) { set .pvp_close_n_room,1; warp "pvp_2vs2",40,59; end; } case 2: if (.pvp_close_s_room == 0) { set .pvp_close_s_room,1; warp "pvp_2vs2",59,40; end; } case 3: if (.pvp_close_w_room == 0) { set .pvp_close_w_room,1; warp "pvp_2vs2",20,40; end; } case 4: if (.pvp_close_e_room == 0) { set .pvp_close_e_room,1; warp "pvp_2vs2",40,20; end; } } } } mes "[PVP Combat Square Register Staff]"; mes "Come back anytime you are ready."; close; } close; OnInit: Set .pvp_close_n_room,0; Set .pvp_close_s_room,0; Set .pvp_close_w_room,0; Set .pvp_close_e_room,0; waitingroom "Combat Square players entrance only",0; end; } // Spectator Entrance //============================================================ - script Spectator's Entrance#dum::PVPSpectator -1,{ if (countitem(7029) == 0) { mes "[PVP Compete Square Register Staff]"; mes "This is the entrance for viewers."; mes "For details about players entrance please proceed to the Register Staff on your left."; close; } if (select("Compete Square one:Cancel") == 1) { mes "[PVP Combat Square Register Staff]"; mes "You got it, thanks for participating. Have fun!"; close2; delitem 7029,1; //Admission_For_Duel switch(rand(1,4)) { case 1: warp "pvp_2vs2",39,7; end; case 2: warp "pvp_2vs2",39,73; end; case 3: warp "pvp_2vs2",7,39; end; case 4: warp "pvp_2vs2",73,39; end; } } close; OnInit: waitingroom "Compete Square viewer's entrance",0; end; } pvp_room,62,85,4 duplicate(PVPSpectator) Spectator's Entrance#1 105 pvp_room,70,85,4 duplicate(PVPSpectator) Spectator's Entrance#2 105 pvp_room,78,85,4 duplicate(PVPSpectator) Spectator's Entrance#3 105 pvp_room,86,85,4 duplicate(PVPSpectator) Spectator's Entrance#4 105 // Spectator Warps //============================================================ - script Combat Square Staff#dum::PVPSpecWarp -1,{ OnTouch: mes "[Combat Square Staff]"; mes "May I help you?"; if (select("To the center viewer seat.:Leave Combat Square.") == 1) { warp "pvp_2vs2",38,38; end; } warp "pvp_room",84,39; end; } pvp_2vs2,5,4,0 duplicate(PVPSpecWarp) Combat Square Staff#1 45,1,1,{ pvp_2vs2,5,74,0 duplicate(PVPSpecWarp) Combat Square Staff#2 45,1,1 pvp_2vs2,74,74,0 duplicate(PVPSpecWarp) Combat Square Staff#3 45,1,1 pvp_2vs2,74,5,0 duplicate(PVPSpecWarp) Combat Square Staff#4 45,1,1 pvp_2vs2,40,40,0 script Combat Square Staff#5 45,1,1,{ set mapmove,0; mes "[Combat Square Staff]"; mes "May I help you?"; if (select("To the side viewer seat.:Leave Combat Square.") == 1) { switch(rand(1,4)) { case 1: warp "pvp_2vs2",39,7; end; case 2: warp "pvp_2vs2",39,73; end; case 3: warp "pvp_2vs2",7,39; end; case 4: warp "pvp_2vs2",73,39; end; } } warp "pvp_c_room",84,39; end; } // PVP Area Exit warp //============================================================ pvp_room,51,19,0 script out#eventpvp 45,4,2,{ OnTouch: mes "[Combat Square Staff]"; mes "Did you have fun in Combat Square?"; mes "May I ask where you want to go?"; next; switch(select("prontera.:morocc.:geffen.:payon.:alberta.:Cancel.")) { case 1: warp "prontera",107,60; end; case 2: warp "morocc",157,96; end; case 3: warp "geffen",120,36; end; case 4: warp "payon",96,100; end; case 5: warp "alberta",41,243; end; case 6: close; } }