123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584 |
- //===== rAthena Script =======================================
- //= Renewal Refining NPCs
- //===== By: ==================================================
- //= rAthena Dev Team
- //===== Current Version: =====================================
- //= 1.4
- //===== Compatible With: =====================================
- //= rAthena Project
- //===== Description: =========================================
- //= Renewal-specific refining NPCs and material merchants.
- //===== Additional Comments: =================================
- //= 1.0 Moved some scripts to Renewal file, optimized "Austry" NPC. [Euphy]
- //= 1.0a Added 'disable_items' command. [Euphy]
- //= 1.1 Added Malangdo Refiner "Clink". [Euphy]
- //= 1.2 Added official success calculation, thanks to Helvetica.
- //= The safe/multiple refine feature is now functional. [Euphy]
- //= 1.3 Updated to match the latest official script. [Euphy]
- //= 1.4 Added correct safe refines. [Haruna]
- //= 1.5 Added Refine UI [Atemo, Lemongrass]
- //============================================================
- // +11 and above Refiners
- //============================================================
- prt_in,90,72,5 script Vestri#prt 4_M_DWARF,{
- if( getbattleflag( "feature.refineui" ) ){
- mes "[Vestri]";
- mes "I'm the most skillful blacksmith!";
- close2;
- refineui();
- end;
- }else{
- callfunc "refinenew","Vestri",0;
- end;
- }
- }
- morocc_in,64,41,5 duplicate(Vestri#prt) Vestri#moc 4_M_DWARF
- payon_in01,18,132,3 duplicate(Vestri#prt) Vestri#pay 4_M_DWARF
- //============================================================
- // +11 and above Refiner Function
- //============================================================
- //= To allow auto safe refining/multiple refining set the
- //= second argument to '1' in the function call.
- //= If you enable this function, be sure to edit the value of
- //= .@safe to the max safe refine in refine.yml as well.
- //=
- //= On official servers, if an item is unsuccessfully refined
- //= it will break at a 20% rate and downgrade at an 80% rate.
- //============================================================
- function script refinenew {
- .@npc_name$ = getarg(0);
- disable_items;
- mes "["+ .@npc_name$ +"]";
- mes "I am the best Armsmith ever!";
- mes "I don't refine normal, boring items.";
- mes "I only refine items that are Level 10 or higher.";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "Anyway, you may use my services if your item is Level 10 or higher.";
- mes "What do you want me to refine?";
- next;
- setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW;
- for(.@i = 1; .@i<=10; ++.@i) {
- if (getequipisequiped(.@indices[.@i])) {
- .@menu$ = .@menu$ + F_getpositionname(.@indices[.@i]) + "-[" + getequipname(.@indices[.@i]) + "]";
- .@equipped = 1;
- }
- .@menu$ = .@menu$ + ":";
- }
- if (.@equipped == 0) {
- mes "["+ .@npc_name$ +"]";
- mes "I don't think I can refine any items you have...";
- close;
- }
- .@part = .@indices[ select(.@menu$) ];
- if (!getequipisequiped(.@part)) { //custom check
- mes "["+ .@npc_name$ +"]";
- mes "You're not wearing";
- mes "anything there that";
- mes "I can refine.";
- emotion ET_FRET;
- close;
- }
- if (!getequipisenableref(.@part)) {
- mes "["+ .@npc_name$ +"]";
- mes "I don't think I can";
- mes "refine this item at all...";
- close;
- }
- .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
- if (.@refinerycnt < 10) {
- mes "["+ .@npc_name$ +"]";
- mes "I said I don't work with items that are lower than Level 10.";
- close;
- }
- if (.@refinerycnt >= 20) { //custom check
- mes "["+ .@npc_name$ +"]";
- mes "I can't refine this";
- mes "any more. This is as";
- mes "refined as it gets!";
- close;
- }
- .@refineitemid = getequipid(.@part); // save id of the item
- setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3);
- .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST);
- .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID);
- .@safe = 10;
- .@itemtype = getiteminfo( .@refineitemid, ITEMINFO_TYPE );
-
- if( .@itemtype == IT_WEAPON ){
- .@article$ = "a";
- .@type$ = "weapon";
- }else if( .@itemtype == IT_ARMOR ){
- .@article$ = "an";
- .@type$ = "armor";
- }else{
- // TODO:
- close;
- }
- mes "["+ .@npc_name$ +"]";
- mes "Hmm " + .@article$ + " " + .@type$ + ", is that ok?";
- mes "If you want to refine this " + .@type$ + ",";
- mes "I will need 1 ^003366" + getitemname(.@material) + "^000000 and " + callfunc("F_InsertComma",.@price) + " zeny.";
- mes "Are you sure you want to continue?";
- next;
- if (select("Yes:No") == 2) {
- mes "["+ .@npc_name$ +"]";
- mes "Hm... if you mind... never mind...";
- close;
- }
- if (getarg(1) != 1) {
- if (getequippercentrefinery(.@part) < 100) {
- mes "["+ .@npc_name$ +"]";
- mes "This "+.@type$+" already has been refined several times.";
- mes "It could be destroyed if I try again.";
- mes "It won't break for sure, but there is has a small chance.";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "You could be ^FF0000lowering the upgrade level^000000 of the "+.@type$+",";
- mes "or if it breaks, you will lose ^FF0000any cards^000000 or special properties added to it.";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "Do you still want me to refine it?";
- mes "I think I have given you enough warning.";
- next;
- if(select("Yes.:No.") == 2) {
- mes "["+ .@npc_name$ +"]";
- mes "Well, no challenge is one way to go...";
- mes "No risk... that could be wise.";
- close;
- }
- }
- if (countitem(.@material) < 1 || Zeny < .@price) {
- mes "["+ .@npc_name$ +"]";
- mes "Hm. You don't seem to have enough money or "+getitemname(.@material)+".";
- mes "Please come back when you have them.";
- close;
- }
- Zeny = Zeny - .@price;
- delitem .@material,1;
- // anti-hack
- if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) ||
- callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
- mes "["+ .@npc_name$ +"]";
- emotion ET_FRET;
- mes "Wait a second...";
- mes "Do you think I'm stupid?!";
- mes "You switched the item while I wasn't looking! Get out of here!";
- close;
- }
- if (getequippercentrefinery(.@part) > rand(100)) {
- mes "Clang! Clang! Clang! Clang!";
- successrefitem .@part;
- next;
- emotion ET_BEST;
- mes "["+ .@npc_name$ +"]";
- mes "Good! Succes!!!";
- mes "I am the best Armsmith.";
- close;
- } else {
- if (rand(100) < 80) {
- mes "["+ .@npc_name$ +"]";
- mes "Clang! Clang! Clang! Clang!";
- downrefitem .@part,3; // Failed refine attempts decrease the item's refine level by 3
- next;
- emotion (!rand(5))?ET_MONEY:ET_HUK;
- mes "["+ .@npc_name$ +"]";
- mes "Ahhh!!!";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "Oh my god!";
- mes "The upgrade level has dropped...";
- } else {
- mes "["+ .@npc_name$ +"]";
- mes "Clang! Clang! Clang!";
- failedrefitem .@part;
- next;
- emotion (!rand(5))?ET_MONEY:ET_HUK;
- mes "["+ .@npc_name$ +"]";
- mes "Hmmm!";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "Oh my! I've failed to refine stuff...";
- mes "I didn't mean it!";
- }
- mes "I could have made a mistake even though I am the best Armsmith ever.";
- mes "It just wasn't meant to be.";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "I will do a better job next time! Don't worry!";
- close;
- }
- }
- // New +11 and above Refining Functions ========================
- if (.@refinerycnt < .@safe) {
- mes "["+ .@npc_name$ +"]";
- mes "I can refine this to the safe limit or a desired number of times. It's your choice.";
- next;
- .@menu2 = select("To the safe limit, please.","I'll decide how many times.","I've changed my mind...");
- } else
- .@menu2 = 2;
- switch(.@menu2){
- case 1:
- .@refinecnt = .@safe - .@refinerycnt;
- break;
- case 2:
- mes "["+ .@npc_name$ +"]";
- mes "How many times would you like me to refine your item?";
- next;
- input .@refinecnt;
- .@refinecheck = .@refinecnt + .@refinerycnt;
- if (.@refinecnt < 1 || .@refinecheck > 20) {
- mes "["+ .@npc_name$ +"]";
- mes "I can't refine this item that many times.";
- close;
- }
- if (.@refinecheck > .@safe) {
- .@refinecheck = .@refinecheck - .@safe;
- mes "["+ .@npc_name$ +"]";
- mes "This will try to refine the equipment " + .@refinecheck + " times past the safe limit. Your equipment may be destroyed... is that ok?";
- next;
- if(select("Yes...","No...") == 2){
- mes "["+ .@npc_name$ +"]";
- mes "You said so... So be it.";
- close;
- }
- }
- break;
- case 3:
- mes "["+ .@npc_name$ +"]";
- mes "You said so... So be it.";
- close;
- }
- .@fullprice = .@price * .@refinecnt;
- mes "["+ .@npc_name$ +"]";
- mes "That will cost you " + .@refinecnt + " " + getitemname(.@material) + " and " + .@fullprice + " Zeny. Is that ok?";
- next;
- if(select("Yes:No...") == 2){
- mes "["+ .@npc_name$ +"]";
- mes "You said so... So be it.";
- close;
- }
- if (countitem(.@material) < .@refinecnt || Zeny < .@fullprice) {
- mes "["+ .@npc_name$ +"]";
- mes "Hm. You don't seem to have enough money or "+getitemname(.@material)+".";
- mes "Please come back when you have them.";
- close;
- }
- Zeny = Zeny - .@fullprice;
- delitem .@material,.@refinecnt;
- while(.@refinecnt){
- if (getequipisequiped(.@part) == 0) {
- mes "["+ .@npc_name$ +"]";
- mes "Look here... you don't have any items on...";
- close;
- }
- // anti-hack
- if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) ||
- callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt))
- close;
- if (getequipid(.@part) != .@refineitemid || (.@menu2 == 1 && getequippercentrefinery(.@part) < 100)) {
- mes "["+ .@npc_name$ +"]";
- mes "Clang... No, but did you imagine I could be so stupid?!";
- mes "You changed it...";
- mes "Get out before I stun you with my Hammer!!";
- close;
- }
- if (getequippercentrefinery(.@part) > rand(100)) {
- mes "Clang! Clang! Clang! Clang!";
- successrefitem .@part;
- .@refinecnt = .@refinecnt - 1;
- next;
- } else {
- if (rand(100) < 80) {
- mes "["+ .@npc_name$ +"]";
- mes "Clang! Clang! Clang! Clang!";
- downrefitem .@part,3; // Failed refine attempts decrease the item's refine level by 3
- next;
- emotion (!rand(5))?ET_MONEY:ET_HUK;
- mes "["+ .@npc_name$ +"]";
- mes "Ahhh!!!";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "Oh my god!";
- mes "The upgrade level has dropped...";
- } else {
- mes "["+ .@npc_name$ +"]";
- mes "Clang! Clang! Clang!";
- failedrefitem .@part;
- next;
- emotion (!rand(5))?ET_MONEY:ET_HUK;
- mes "["+ .@npc_name$ +"]";
- mes "Hmmm!";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "Oh my! I've failed to refine stuff...";
- mes "I didn't mean it!";
- }
- mes "I could have made a mistake even though I am the best Armsmith ever.";
- mes "It just wasn't meant to be.";
- next;
- mes "["+ .@npc_name$ +"]";
- mes "I will do a better job next time! Don't worry!";
- close;
- }
- .@refinerycnt = getequiprefinerycnt(.@part);
- }
- emotion ET_BEST;
- mes "["+ .@npc_name$ +"]";
- mes "Good! Succes!!!";
- mes "I am the best Blacksmith.";
- close;
- }
- // Ori/Elu to Carnium/Bradium Refiners
- //============================================================
- - script Austri#ref -1,{
- if (checkweight(1201,1) == 0) {
- mes "- Wait a minute !! -";
- mes "- Currently you're carrying -";
- mes "- too many items with you. -";
- mes "- Please try again -";
- mes "- after you lose some weight. -";
- close;
- }
- mes "[Austri]";
- mes "If you bring me 3";
- mes "Oridecon or Elunium";
- mes "I can exchange them for";
- mes "Bradium or Carnium.";
- mes "Just give me 50,000z.";
- next;
- switch(select("Oridecon to Bradium.:Elunium to Carnium.:Purified Bradium to Carnium.:No thanks.")) {
- case 1:
- setarray .@i[0],984,3,6224; //Oridecon -> Bradium
- break;
- case 2:
- setarray .@i[0],985,3,6223; //Elunium -> Carnium
- break;
- case 3:
- setarray .@i[0],6090,1,6223; //Purified_Bradium -> Carnium
- break;
- case 4:
- mes "[Austri]";
- mes "Hmm...";
- close;
- }
- if (countitem(.@i[0]) >= .@i[1] && Zeny >= 50000) {
- delitem .@i[0],.@i[1];
- Zeny = Zeny - 50000;
- getitem .@i[2],1;
- mes "[Austri]";
- if (.@i[0] == 6090) {
- mes "Refining with Refined Bradium";
- mes "can be a little expensive.";
- mes "I can exchange it for some Carnium.";
- } else
- mes "Ok! Here's your "+getitemname(.@i[2])+".";
- mes "Take it and use it well.";
- close;
- }
- mes "[Austri]";
- mes "You better not be trying";
- mes "to cheat me because you";
- mes "don't have enough money";
- mes "or "+getitemname(.@i[0])+".";
- close;
- }
- prt_in,85,71,5 duplicate(Austri#ref) Austri#prt 826
- payon_in01,14,125,5 duplicate(Austri#ref) Austri#pay 826
- morocc_in,60,38,5 duplicate(Austri#ref) Austri#moc 826
- // Malangdo Refiner
- //============================================================
- malangdo,224,172,6 script Clink#mal_normal 544,{
- disable_items;
- mes "[Clink]";
- mes "My cool dad Holink said I have the world's greatest refine hammer!!";
- mes "Meow Meow~";
- mes "Who do you think I am?";
- mes "Yes!!! You!! You want to refine?";
- next;
- setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW;
- for(.@i = 1; .@i<=10; set .@i,.@i+1)
- .@menu$ = .@menu$ + ( getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) +"-[Empty]" ) +":";
- .@part = .@indices[ select(.@menu$) ];
- if (!getequipisequiped(.@part)) {
- mes "[Clink]";
- switch(.@part) {
- case EQI_HEAD_TOP:
- mes "Dad said. There's no cure for stupidity...";
- break;
- case EQI_ARMOR:
- mes "There's nothing to see here!!";
- break;
- case EQI_HAND_L:
- mes "What an arrogant left hand this is!";
- break;
- case EQI_HAND_R:
- mes "What an arrogant right hand this is!";
- break;
- case EQI_GARMENT:
- mes "Get that dirty thing off my face!!";
- break;
- case EQI_SHOES:
- mes "Kyaong~! Do not provoke me.";
- break;
- case EQI_ACC_L:
- case EQI_ACC_R:
- mes "Where is the accessory?";
- break;
- case EQI_HEAD_MID:
- case EQI_HEAD_LOW:
- mes "Are you talking about the other head part?";
- break;
- }
- close;
- }
- if (!getequipisenableref(.@part)) {
- mes "[Clink]";
- mes "This can't be refined!!";
- close;
- }
- .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count
- if (.@refinerycnt >= 10) {
- mes "[Clink]";
- mes "Perfect refining. Did I do this for you?";
- close;
- }
-
- .@refineitemid = getequipid(.@part); // save id of the item
- setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3);
- .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST);
- .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID);
- .@itemtype = getiteminfo( .@refineitemid, ITEMINFO_TYPE );
- mes "[Clink]";
- if( .@itemtype == IT_ARMOR ){
- switch( getequiparmorlv( .@part ) ){
- case 1: // Armor
- .@type$ = "armor";
- mes "Hmm, an armor refine? Someone like you?";
- break;
- default:
- // TODO:
- close;
- }
- }else if( .@itemtype == IT_WEAPON ){
- switch( getequipweaponlv( .@part ) ){
- case 1: // Level 1 Weapon
- .@type$ = "weapon";
- mes "A level 1 weapon?";
- mes "Urr... Annoying... Okay, let's try...";
- break;
- case 2: // Level 2 Weapon
- .@type$ = "weapon";
- mes "A level 2 weapon?";
- break;
- case 3: // Level 3 Weapon
- .@type$ = "weapon";
- mes "Woot!! A level 3 weapon? Impressive~";
- break;
- case 4: // Level 4 Weapon
- .@type$ = "weapon";
- mes "Wow!... A level 4 weapon~!!";
- break;
- default:
- // TODO:
- close;
- }
- }else{
- // TODO:
- close;
- }
- mes "You need ^ff9999"+getitemname(.@material)+"^000000 and ^ff9999"+.@price+"^000000 Zeny. Do you have them?";
- next;
- if(select("Yes, I do!!:Forget about it!!") == 2) {
- mes "[Clink]";
- mes "I knew it!!";
- mes "I knew you were not worth trying my magical refining hammer for.";
- close;
- }
- if (getequippercentrefinery(.@part) < 100) {
- mes "[Clink]";
- mes "Wow!!";
- mes "This "+.@type$+" has been refined quite a bit, huh?";
- mes "You do know that this might break, right?";
- next;
- mes "[Clink]";
- mes "If you break the "+.@type$+", you can never use it again.";
- mes "Cards and enchant effects...";
- mes "the ^ff0000whole thing will disappear^000000.";
- mes "You still up for this~?";
- next;
- if(select("Yes, I am!!:Forget about it!!") == 2) {
- mes "[Clink]";
- mes "I knew it!!";
- mes "You can't even take this big step. Don't think about refining...";
- close;
- }
- }
- if (countitem(.@material) == 0 || Zeny < .@price) {
- mes "[Clink]";
- mes "Hey you!! Didn't I tell you";
- mes "that you need ^ff9999"+getitemname(.@material)+"^000000 and ^ff9999"+.@price+"^000000 Zeny??!!";
- close;
- }
- delitem .@material,1;
- Zeny = Zeny-.@price;
- // anti-hack
- if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) ||
- callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
- mes "[Clink]";
- emotion ET_FRET;
- mes "Wait a second...";
- mes "Do you think I'm stupid?!";
- mes "You switched the item while I wasn't looking! Get out of here!";
- close;
- }
- if (getequippercentrefinery(.@part) <= rand(100)) {
- failedrefitem .@part;
- mes "[Clink]";
- mes "Cry Hammer!! Cry!!!";
- next;
- switch(rand(1,5)) {
- case 1: emotion ET_CRY; break;
- case 2: emotion ET_PROFUSELY_SWEAT; break;
- case 3: emotion ET_KEK; break;
- case 4: emotion ET_SCRATCH; break;
- case 5: emotion ET_BIGTHROB; break;
- }
- mes "[Clink]";
- mes "Huh?! I failed?!";
- next;
- mes "[Clink]";
- mes "Arrgg~ It's all~ Broken...? What a pity~";
- next;
- mes "[Clink]";
- mes "Hey...!! Get me another one.";
- mes "This is not possible.";
- mes "How can my hammer fail from refining?";
- close;
- }
- successrefitem .@part;
- mes "[Clink]";
- mes "Cry Hammer!! Cry!!!";
- next;
- emotion ET_CHUP;
- mes "[Clink]";
- mes "Ok!! Perfect!!";
- mes "There's nothing I can't refine";
- mes "with this special hammer.";
- mes "You can praise me!!";
- mes "What a day!!";
- close;
- }
|