//= Le Livre d'Ymir http://www.bookofymir.net/ //= Traduit par Myllena, corrigé par Elianor //===== 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 Gardien PvP#dummy::PVPGateKeeper -1,{ mes "[Gardien PvP]"; mes "Ravi d'être à votre service!"; mes "Je peux vous conduire aux Arènes PvP. Si vous avez des questions à propos des règles ou bien des modes du PvP, adressez-vous à mon collègue s'il vous plaît."; next; switch(select("^FF5533PvP Mode Cauchemar^000000:^3355FFPvP Mode Yoyo^000000:^3355FFPvP Mode Évènement^000000:S'en aller")) { case 1: mes "[Gardien PvP]"; mes "Je suis désolé, mais le Mode Cauchemar est momentanément indisponible."; mes "Veuillez utiliser le Mode Yoyo à la place. Nous nous excusons de la gêne occasionnée."; close; case 2: mes "[Gardien PvP]"; mes "Le prix d'admission est de 500 Zénys."; mes "Souhaitez-vous rejoindre l'Arène de Combat en Mode Yoyo?"; next; switch(select("Oui:Annuler")) { case 1: if (Zeny > 499 && BaseLevel > 30) { set zeny,zeny-500; warp "pvp_y_room",51,23; end; } else { mes "[Gardien PvP]"; mes "Je suis désolé, mais il y a un problème... Vérifiez que vous avez bien les 500 Zénys pour payer le prix d'admission, et que votre Niveau de Base est au moins égal à 31!"; close; } case 2: mes "[Gardien PvP]"; mes "Au cœur de la guerre entre les Hommes et les Monstres, la compétition qui naît entre les hommes encourage chacun d'entre nous à nous améliorer pour devenir plus fort! C'est ce qu'on appelle le PvP."; mes "Si vous voulez vous mesurer à d'autres, revenez quand vous voulez!"; close; } case 3: mes "[Gardien PvP]"; mes "Bienvenue"; mes "Pouvez-vous me montrer vos invitations?"; next; if (countitem(7028) == 0 && countitem(7029) == 0) { mes "[Gardien PvP]"; mes "Eh bien? Vous ne les avez pas? Je suis désolé mais l'Arène de Combat n'est accessible qu'aux personnes qui possèdent des cartons d'invitation."; mes "Si vous n'en possédez pas, vous ne pouvez pas entrer."; close; } mes "[Gardien PvP]"; mes "Très bien, merci. Amusez-vous bien!"; close2; warp "pvp_room",51,23; end; case 4: mes "[Gardien PvP]"; mes "Au cœur de la guerre entre les Hommes et les Monstres, la compétition qui naît entre les hommes encourage chacun d'entre nous à nous améliorer pour devenir plus fort! C'est ce qu'on appelle le PvP."; mes "Si vous voulez vous mesurer à d'autres, revenez quand vous voulez!"; close; } } // Morroc //============================================================ morocc_in,144,138,4 script Informations PvP#moc 84,{ callfunc "F_PVPNarrator","morocc_in",141,139; } morocc_in,144,142,4 duplicate(PVPGateKeeper) Gardien PvP#moc 83,{ // Alberta //============================================================ alberta_in,22,146,4 script Informations PvP#alb 84,{ callfunc "F_PVPNarrator","alberta_in",22,148; } alberta_in,26,146,4 duplicate(PVPGateKeeper) Gardien PvP#alb 83 // Prontera //============================================================ prt_in,56,140,4 script Informations PvP#prt 84,{ callfunc "F_PVPNarrator","prt_in",54,137; } prt_in,52,140,4 duplicate(PVPGateKeeper) Gardien PvP#prt 83 // Geffen //============================================================ geffen_in,67,63,4 script Informations PvP#gef 84,{ callfunc "F_PVPNarrator","geffen_in",70,59; } geffen_in,63,63,4 duplicate(PVPGateKeeper) Gardien PvP#gef 83 // Payon //============================================================ payon_in01,142,50,4 script Informations PvP#pay 84,{ callfunc "F_PVPNarrator","payon_in01",142,46; } payon_in01,140,53,4 duplicate(PVPGateKeeper) Gardien PvP#pay 83 // PVP Yoyo Mode Staff //============================================================ pvp_y_room,86,85,4 script Réceptionniste PvP#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 ]:Annuler")) { 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 "Entrée",0; end; S_CheckPVPRoom: if (getarg(0) >= 128) { mes "[Réceptionniste PvP]"; mes "Cette Arène de Combat a atteint le nombre maximum de combattants."; next; return; } else { warp getarg(1),0,0; end; } } // PVP Nightmare Mode Staff //============================================================ pvp_n_room,30,85,4 script Réceptionniste PvP#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 ]:Annuler")) { 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 "Entrée",0; end; S_CheckPVPRoom: if (getarg(0) >= getarg(2)) { mes "[Réceptionniste PvP]"; mes "Cette Arène de Combat a atteint le nombre maximum de combattants."; next; return; } else { warp getarg(1),0,0; end; } } // Function //============================================================ function script F_PVPNarrator { mes "[Informations PvP]"; mes ( isday() ? "Bonjour" : "Bonsoir" ) + " et bienvenue!"; mes "Je suis responsable du point informations des arènes PvP. Je peux vous en expliquer tous les modes!!"; next; switch(select("Qu'est-ce que le PvP?:Quels sont les modes du PvP?:Quelles sont les règles du PvP?:Sauvegarder.:S'en aller.")) { case 1: mes "[Informations PvP]"; mes "Le terme PvP est l'abréviation de 'Player versus Player', autrement dit Joueur contre Joueur. Les arènes PvP sont un lieu unique où les humains peuvent s'entraîner et engager des duels les uns contre les autres."; next; mes "[Informations PvP]"; mes "Si vous souhaitez essayer, adressez-vous au ^3355FFGardien PvP^000000."; mes "Il vous conduira à l'arène PvP."; next; mes "[Informations PvP]"; mes "Notez bien que pour accéder aux arènes, vous devez avoir atteint un Niveau de Base d'au moins 31. De plus, l'entrée coûte 500 Zénys."; close; case 2: mes "[Informations PvP]"; mes "Il existe deux modes au choix dans le PvP: le Mode Yoyo ou le Mode Cauchemar."; next; mes "[Informations PvP]"; mes "Le Mode Yoyo est absolument sans risque. Vous pouvez expérimenter le PvP sans restriction. Il est cependant recommandé de vous entraîner avant de faire votre première entrée."; next; mes "[Informations PvP]"; mes "Le Mode Cauchemar est très dangereux, il faut donc en connaître les risques! Tout d'abord, vous perdrez de l'expérience si vous êtes vaincu. De plus, vous aurez une faible chance de perdre votre équipement si vous mourez!"; next; mes "[Informations PvP]"; mes "Cependant, si vous arrivez à gagner en Mode Cauchemar, vous en serez grandement récompensé! Donc réfléchissez-y à deux fois avant de vous lancer là-dedans... Bonne chance!"; close; case 3: mes "[Informations PvP]"; mes "Les Réceptionniste PvP peuvent vous conduire aux arènes de combat, en fonction de vos qualifications."; next; mes "[Informations PvP]"; mes "Vous aurez le choix entre cinq arènes PvP. Faites simplement votre choix, et le Réceptionniste PvP vous y conduira!"; next; mes "[Informations PvP]"; mes "Chaque arène peut accueillir un nombre limité de combattants. Ce nombre est spécifié lorsque vous faites votre choix, et indiqué de cette manière: Combattants Présents/Combattants Maximum."; next; mes "[Informations PvP]"; mes "Il existe un système de score caché, qui ne s'applique qu'à l'intérieur des arènes PvP."; next; mes "[Informations PvP]"; mes "Lors de votre première entrée au PvP, votre score sera de 5 points. Si vous gagnez un duel, vous serez récompensé d'1 point."; next; mes "[Informations PvP]"; mes "De la même manière, si vous perdez un duel, votre score diminuera de 5 points! Soyez prudent!"; next; mes "[Informations PvP]"; mes "Lorsque votre score atteint zéro, vous êtes vaincu. Vous serez renvoyé du PvP et votre duel prendra fin!"; next; mes "[Informations PvP]"; mes "Cependant, si tant que votre score ne descend pas sous zéro, vous pourrez continuer de lancer des duels au sein de l'arène."; mes "Vous avez tout compris?"; next; mes "[Informations PvP]"; mes "Les commandes de combat sont les mêmes à l'intérieur de l'arène qu'à l'extérieur. Les contrôles sont exactement les mêmes."; next; mes "[Informations PvP]"; mes "Cependant, une chose vous est impossible à l'intérieur des arènes de combat PvP: vous ne pouvez pas sauvegarder votre position."; mes "Souvenez-vous bien de ces règles... elles vous aideront à assurer votre victoire."; close; case 4: mes "[Informations PvP]"; mes "Votre point de sauvegarde a été enregistré!"; mes "Merci, nous espérons vous revoir très bientôt."; close2; savepoint getarg(0),getarg(1),getarg(2); end; case 5: mes "[Informations PvP]"; mes "Alors que la guerre fait rage entre les Monstres et les Humains, le PvP permet la compétition et nous encourage à nous entraîner pour devenir plus forts!"; mes "Lorsque vous souhaiterez vous mesurer aux autres, nous accepterons votre challenge!"; close; } } // Event Contestant Entrance //============================================================ pvp_room,54,85,4 script Inscriptions#1 105,{ if (countitem(7028) == 0) { mes "[Personnel de l'Arène]"; mes "Hé?! Comment êtes-vous arrivé ici?"; mes "Cette entrée n'est autorisée que pour les combattants."; mes "Pour connaître les détails concernant l'entrée des spectateurs, veuillez vous adresser à mon collègue, à votre droite."; 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("Arène de Combat n°1:Annuler") == 1) { mes "[Personnel de l'Arène]"; mes "'"+ strcharinfo(0) +"'"; mes "êtes-vous prêt?!"; next; if (select("Oui!:Non!") == 1) { mes "[Personnel de l'Arène]"; mes "OK! Je vous envoie dans l'arène."; mes "Bonne chance!"; 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 "[Personnel de l'Arène]"; mes "Revenez quand vous serez prêt."; 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 "Entrée des Combattants",0; end; } // Spectator Entrance //============================================================ - script Entrée Spectateurs#dum::PVPSpectator -1,{ if (countitem(7029) == 0) { mes "[Personnel de l'Arène]"; mes "Ceci est l'entrée des spectateurs."; mes "Si vous souhaitez connaître les modalités d'entrée à l'arène, veuillez vous adresser au comptoir des inscriptions, sur votre gauche."; close; } if (select("Entrer dans l'Arène:Annuler") == 1) { mes "[Personnel de l'Arène]"; mes "Merci de votre participation. Amusez-vous bien!"; 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 "Entrée des Spectateurs",0; end; } pvp_room,62,85,4 duplicate(PVPSpectator) Entrée Spectateurs#1 105 pvp_room,70,85,4 duplicate(PVPSpectator) Entrée Spectateurs#2 105 pvp_room,78,85,4 duplicate(PVPSpectator) Entrée Spectateurs#3 105 pvp_room,86,85,4 duplicate(PVPSpectator) Entrée Spectateurs#4 105 // Spectator Warps //============================================================ - script Personnel de l'Arène#dum::PVPSpecWarp -1,{ OnTouch: mes "[Personnel de l'Arène]"; mes "En quoi puis-je vous aider?"; if (select("Se rendre sur la tribune centrale.:Quitter l'Arène de Combat.") == 1) { warp "pvp_2vs2",38,38; end; } warp "pvp_room",84,39; end; } pvp_2vs2,5,4,0 duplicate(PVPSpecWarp) Personnel de l'Arène#1 45,1,1,{ pvp_2vs2,5,74,0 duplicate(PVPSpecWarp) Personnel de l'Arène#2 45,1,1 pvp_2vs2,74,74,0 duplicate(PVPSpecWarp) Personnel de l'Arène#3 45,1,1 pvp_2vs2,74,5,0 duplicate(PVPSpecWarp) Personnel de l'Arène#4 45,1,1 pvp_2vs2,40,40,0 script Personnel de l'Arène#5 45,1,1,{ set mapmove,0; mes "[Personnel de l'Arène]"; mes "En quoi puis-je vois aider?"; if (select("Se rendre sur les tribunes latérales.:Quitter l'Arène de Combat.") == 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 Sortie#eventpvp 45,4,2,{ OnTouch: mes "[Personnel de l'Arène]"; mes "Vous avez apprécié cette Arène de Combat?"; mes "Où souhaitez-vous aller?"; next; switch(select("Prontera.:Morroc.:Geffen.:Payon.:Alberta.:Annuler.")) { 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; } }