//================= Hercules Script ======================================= //= _ _ _ //= | | | | | | //= | |_| | ___ _ __ ___ _ _| | ___ ___ //= | _ |/ _ \ '__/ __| | | | |/ _ \/ __| //= | | | | __/ | | (__| |_| | | __/\__ \ //= \_| |_/\___|_| \___|\__,_|_|\___||___/ //================= License =============================================== //= This file is part of Hercules. //= http://herc.ws - http://github.com/HerculesWS/Hercules //= //= Copyright (C) 2012-2020 Hercules Dev Team //= Copyright (C) Joseph //= Copyright (C) Euphy //= Copyright (C) Elias (og2) //= Copyright (C) L0ne_W0lf //= Copyright (C) kobra_k88 //= //= Hercules is free software: you can redistribute it and/or modify //= it under the terms of the GNU General Public License as published by //= the Free Software Foundation, either version 3 of the License, or //= (at your option) any later version. //= //= This program is distributed in the hope that it will be useful, //= but WITHOUT ANY WARRANTY; without even the implied warranty of //= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //= GNU General Public License for more details. //= //= You should have received a copy of the GNU General Public License //= along with this program. If not, see . //========================================================================= //= PvP NPCs //================= Description =========================================== //= PvP NPCs that are found in the Inns in major cities. //= Includes Yoyo Mode, Nightmare Mode, and Event Mode. //================= Current Version ======================================= //= 2.5 //========================================================================= //== Information =========================================== - script PVP Narrator::pvpe FAKE_NPC,{ mes "[PVP Narrator]"; mes "Hello and welcome!"; mes "I am in charge of"; mes "explaining the PVP Modes."; 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, 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 enter the PVP square."; next; mes "[PVP Narrator]"; mes "But, you need to be at"; mes "least level 31. And you"; mes "must pay 500 zeny entrance fee in order"; mes "to enter a PVP fight square."; break; case 2: mes "[PVP Narrator]"; mes "When you are qualified, you"; mes "can choose one of the two modes."; mes "Yoyo Mode or 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 be cautious,"; mes "you will lose some of your"; 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 twice"; mes "before you go there..."; mes "Good Luck!"; break; case 3: mes "[PVP Narrator]"; mes "Each of the fight squares"; mes "have a row of Narrators and"; mes "choose them 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, it will"; mes "increase 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 PVP fighting zones,"; mes "you cannot save your position."; mes "Remember well... These rules"; mes "can help to ensure your victory."; break; case 4: mes "[PVP Narrator]"; mes "Position successfully saved..."; mes "Thank you very much!"; mes "We will see you again soon."; if(strnpcinfo(NPC_MAP) == "morocc_in") { savepoint "morocc_in",141,139; } if(strnpcinfo(NPC_MAP) == "alberta_in") { savepoint "alberta_in",22,148; } if(strnpcinfo(NPC_MAP) == "prt_in") { savepoint "prt_in",54,137; } if(strnpcinfo(NPC_MAP) == "geffen_in") { savepoint "geffen_in",70,59; } if(strnpcinfo(NPC_MAP) == "payon_in01") { savepoint "payon_in01",142,46; } break; case 5: mes "[PVP Narrator]"; mes "With war raging between monsters"; mes "and humans, this competition"; mes "among people - PVP -"; mes "encourages us all to get"; mes "stronger. Come again,"; mes "we welcome your challenge!"; break; } close; } morocc_in,144,138,4 duplicate(pvpe) PVP Narrator#pe1 4_M_02 alberta_in,22,146,4 duplicate(pvpe) PVP Narrator#pe2 4_M_02 prt_in,56,140,4 duplicate(pvpe) PVP Narrator#pe3 4_M_02 geffen_in,67,63,4 duplicate(pvpe) PVP Narrator#pe4 4_M_02 payon_in01,142,50,4 duplicate(pvpe) PVP Narrator#pe5 4_M_02 geffen_in,67,63,4 duplicate(pvpe) PVP Narrator#pe6 4_M_02 //== Mode Select =========================================== - script Gate Keeper::gkut FAKE_NPC,{ 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."; break; 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)) { Zeny -= 500; callsub L_Warp,"pvp_y_room"; } 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 "With war raging between monsters"; mes "and humans, this competition"; mes "among people - PVP -"; mes "encourages us all to get"; 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(Invite_For_Duel) == 0) && (countitem(Admission_For_Duel) == 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!"; if (Zeny >= 500) Zeny -= 500; callsub L_Warp,"pvp_room"; break; case 4: mes "[Gate Keeper]"; mes "With war raging between monsters"; mes "and humans, This competition"; mes "among people - PVP -"; mes "encourages us all to get"; mes "stronger. Come again,"; mes "we welcome your challenge!"; break; } close; L_Warp: .@map$ = getarg(0); if (RENEWAL) { switch(rand(1,10)) { case 1: warp .@map$,34,38; break; case 2: warp .@map$,46,38; break; case 3: warp .@map$,58,38; break; case 4: warp .@map$,70,38; break; case 5: warp .@map$,82,38; break; case 6: warp .@map$,82,58; break; case 7: warp .@map$,65,58; break; case 8: warp .@map$,49,58; break; case 9: warp .@map$,33,58; break; case 10: warp .@map$,52,24; break; } } else warp .@map$,51,23; return; } morocc_in,144,142,4 duplicate(gkut) Gate Keeper#gke1 4_M_01 alberta_in,26,146,4 duplicate(gkut) Gate Keeper#gke2 4_M_01 prt_in,52,140,4 duplicate(gkut) Gate Keeper#gke3 4_M_01 geffen_in,63,63,4 duplicate(gkut) Gate Keeper#gke4 4_M_01 payon_in01,140,53,4 duplicate(gkut) Gate Keeper#gke5 4_M_01 //== PVP Warper Function =================================== // Note: The warper NPCs are in the pre-re/re paths. //callfunc "F_PVP_FSRS"{,,}; function script F_PVP_FSRS { if (getargcount()) { if (BaseLevel < getarg(0) || BaseLevel > getarg(1)) { mes "[PVP Fight Square Reception Staff]"; mes "Sorry, but you base level has to be between LV "+getarg(0)+" and LV "+getarg(1)+"."; close; } } if (strnpcinfo(NPC_MAP) == "pvp_y_room") { .@base$ = "pvp_y_"+strnpcinfo(NPC_NAME_HIDDEN); setarray .@maps$[0], .@base$+"-1", .@base$+"-2", .@base$+"-3", .@base$+"-4", .@base$+"-5"; setarray .@name$[0], "Prontera", "Izlude", "Payon", "Alberta", "Morroc"; setarray .@Limit[0], 128, 128, 128, 128, 128; } else { setarray .@maps$[0], "pvp_n_8-1", "pvp_n_8-2", "pvp_n_8-3", "pvp_n_8-4", "pvp_n_8-5"; setarray .@name$[0], "Sandwich", "Lock on", "Four Room", "Under cross", "Compass Room"; setarray .@Limit[0], 64, 32, 32, 32, 32; } for (.@i = 0; .@i<5; ++.@i) .@menu$ += .@name$[.@i]+" ["+getmapusers(.@maps$[.@i])+" / "+.@Limit[.@i]+"]:"; .@menu$ += "Cancel."; .@i = select(.@menu$)-1; if (.@i == 5) close; if (getmapusers(.@maps$[.@i]) >= .@Limit[.@i]) { mes "[PVP Fight Square Reception Staff]"; mes "This map is currently full."; close; } warp .@maps$[.@i],0,0; end; } //== Event Contestant Entrance ============================= pvp_room,54,85,4 script Registration Staff#1 8W_SOLDIER,{ if (countitem(Invite_For_Duel) == 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; } .@size = getarraysize(.warp_x); if (.@size == 0) { setarray .warp_x,40,59,20,40; setarray .warp_y,59,40,40,20; } if (select("Combat Square one", "Cancel") == 1) { mes "[PVP Combat Square Register Staff]"; mes "'"+ strcharinfo(PC_NAME) +"'"; 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 Invite_For_Duel,1; .@rand = rand(.@size); warp "pvp_2vs2", .warp_x[.@rand], .warp_y[.@rand]; deletearray .warp_x[.@rand],1; deletearray .warp_y[.@rand],1; end; } mes "[PVP Combat Square Register Staff]"; mes "Come back anytime you are ready."; close; } close; OnInit: waitingroom "Combat Square players entrance only",0; end; } //== Spectator Entrance ==================================== - script Spectator's Entrance#dum::PVPSpectator FAKE_NPC,{ if (countitem(Admission_For_Duel) == 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 Admission_For_Duel,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; } } close; OnInit: waitingroom "Compete Square viewer's entrance",0; end; } pvp_room,62,85,4 duplicate(PVPSpectator) Spectator's Entrance#1 8W_SOLDIER pvp_room,70,85,4 duplicate(PVPSpectator) Spectator's Entrance#2 8W_SOLDIER pvp_room,78,85,4 duplicate(PVPSpectator) Spectator's Entrance#3 8W_SOLDIER pvp_room,86,85,4 duplicate(PVPSpectator) Spectator's Entrance#4 8W_SOLDIER //== Spectator Warps ======================================= - script Combat Square Staff#dum::PVPSpecWarp FAKE_NPC,{ 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 WARPNPC,1,1 pvp_2vs2,5,74,0 duplicate(PVPSpecWarp) Combat Square Staff#2 WARPNPC,1,1 pvp_2vs2,74,74,0 duplicate(PVPSpecWarp) Combat Square Staff#3 WARPNPC,1,1 pvp_2vs2,74,5,0 duplicate(PVPSpecWarp) Combat Square Staff#4 WARPNPC,1,1 pvp_2vs2,40,40,0 script Combat Square Staff#5 WARPNPC,1,1,{ mes "[Combat Square Staff]"; mes "May I help you?"; switch(select("To the side viewer seat.", "Leave Combat Square.")) { case 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; } case 2: warp "pvp_c_room",84,39; end; } } //== PVP Area Exit warp ==================================== pvp_room,51,19,0 script out#eventpvp WARPNPC,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; } }