//===== eAthena Script ======================================= //= Kafra Express - Refining Module //===== By: ================================================== //= Skotlex //===== Current Version: ===================================== //= 2.7 //===== Compatible With: ===================================== //= eAthena SVN R3424+ //===== Description: ========================================= //= Part of the Kafra Express Script Package. //= Does item forging, ore purifying and repairing. //= Can also sell phracon/emveretarcon //===== Additional Comments: ================================= //= See config.txt for configuration. //============================================================ - script keInit_refine -1,{ OnInit: //Load Config donpcevent "keConfig::OnLoadRefine"; end; } function script F_keRefine { function SF_refine; function SF_repair; function SF_purify; function SF_sellOres; do { set @kmenu, select( "- Return", "- Refine Equipment", "- Repair Equipment", "- Buy Ores", "- Purify Ores" ); switch(@kmenu) { case 2: //Refine SF_refine(); break; case 3: //Repair SF_repair(); break; case 4: //Buy Ore SF_sellOres(); break; case 5: //Purify Ore SF_purify(); break; } } while (@kmenu > 1); return; //Subfunction SF_refine, presents the refining menu. function SF_refine { do { set @part, select( "- Cancel upgrading", "- "+getequipname(1), "- "+getequipname(2), "- "+getequipname(3), "- "+getequipname(4), "- "+getequipname(5), "- "+getequipname(6), "- "+getequipname(7), "- "+getequipname(8), "- "+getequipname(9), "- "+getequipname(10) ); set @part, @part-1; if (@part == 0) break; if (getequipisequiped(@part) == 0) { callfunc "F_keIntro", e_swt, "There is nothing to refine there..."; } else if(getequipisenableref(@part) == 0 && $@kerf_refineAll == 0) { callfunc "F_keIntro", -1, "Sorry, this item cannot be refined."; } else if(getequiprefinerycnt(@part) >= $@kerf_maxLv) { callfunc "F_keIntro", -1, "This item cannot be refined further."; break; } else { switch (getequipweaponlv(@part)) { case 0: //Armor set @mat,985; set @cost,$@kerf_armorCost; break; case 1: set @mat,1010; set @cost,$@kerf_weaponLv1Cost; break; case 2: set @mat,1011; set @cost,$@kerf_weaponLv2Cost; break; case 3: set @mat,984; set @cost,$@kerf_weaponLv3Cost; break; default: set @mat,984; set @cost,$@kerf_weaponLv4Cost; break; } set @cost, callfunc("F_keCost",@cost,$@kerf_discount); do { if ($@kerf_safe==0 && getequippercentrefinery(@part) < 100) { if ($@kerf_showChance) { if (select( "- Return ("+(100-getequippercentrefinery(@part))+"% chance refine will fail)", "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2) break; } else { if (select( "- Return (Upgrade not safe, item might break!)", "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2) break; } } else { if (select( "- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)", "- Cancel") != 1) break; } if (getequiprefinerycnt(@part) >= $@kerf_maxLv) { callfunc "F_keIntro", e_ok, "This item has reached it's maximum level."; break; } if (countitem(@mat) < 1) { callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need."; break; } if (!(callfunc("F_keCharge",@cost,$@kerf_discount,1))) { callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny."; break; } delitem @mat,1; if ($@kerf_safe || getequippercentrefinery(@part)>rand(100)) { successrefitem @part; emotion e_rock; } else { failedrefitem @part; callfunc "F_keIntro", e_swt, "...sorry."; break; } } while (1); } } while (@part > 0); return; } //Subfunction: SF_repair() function SF_repair { set @cost,callfunc("F_keCost",$@kerf_repairCost,$@kerf_repairDiscount); do { set @broken1,getbrokenid(1); if(@broken1==NULL) { callfunc "F_keIntro", -1, "You don't need anything repaired for now."; return; } set @broken2,getbrokenid(2); set @broken3,getbrokenid(3); set @broken4,getbrokenid(4); set @broken5,getbrokenid(5); set @broken6,getbrokenid(6); set @broken7,getbrokenid(7); set @broken8,getbrokenid(8); set @broken9,getbrokenid(9); set @broken10,getbrokenid(10); if ($@kerf_repairSteel) set @str$,"- Cancel (Repairing costs "+@cost+"z and 1 "+getitemname(999); else set @str$,"- Cancel (Repairing costs "+@cost+"z)"; set @idRepair, select( @str$, getitemname(@broken1), getitemname(@broken2), getitemname(@broken3), getitemname(@broken4), getitemname(@broken5), getitemname(@broken6), getitemname(@broken7), getitemname(@broken8), getitemname(@broken9), getitemname(@broken10) ); set @idRepair, @idRepair-1; if (@idRepair == 0) break; if ($@kerf_repairSteel && countitem(999) < 1) { callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need."; return; } if (!(callfunc("F_keCharge", $@kerf_repairCost, $@kerf_repairDiscount,1))) { callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny."; return; } if ($@kerf_repairSteel) delitem 999,1; repair(@idRepair); emotion e_lv2; } while (@idRepair > 0); } //Subfunction: SF_purify() function SF_purify { if ($@kerf_purifyAll) { set @submenu, select ( "- Return", "- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")", "- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")", "- Purify "+getitemname(998)+" (need 2 "+getitemname(1002)+")", "- Temper "+getitemname(999)+" (need 5 "+getitemname(998)+", 1 "+getitemname(1003)+")", "- Temper "+getitemname(994)+" (need 10 "+getitemname(990)+")", "- Temper "+getitemname(995)+" (need 10 "+getitemname(991)+")", "- Temper "+getitemname(996)+" (need 10 "+getitemname(992)+")", "- Temper "+getitemname(997)+" (need 10 "+getitemname(993)+")", "- Temper "+getitemname(1000)+" (need 10 "+getitemname(1001)+")" ); } else { set @submenu, select( "- Return", "- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")", "- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")" ); } switch (@submenu) { case 2: //Oridecon set @item, 984; set @rough, 756; set @qty, 5; break; case 3: //Elunium set @item, 985; set @rough, 757; set @qty, 5; break; case 4: //Iron set @item, 998; set @rough, 1002; set @qty, 2; break; case 5: //Steel set @item,999; set @rough,998; set @qty,5; set @rough2,1003; set @qty2,1; set @count,countitem(@rough1); set @count2,countitem(@rough2); if (@count < @qty || @count2 < @qty2) { callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need."; return; } set @count, @count/@qty; set @count2, @count2/@qty2; if (@count2 < @count) set @count,@count2; delitem @rough2,@qty2*@count; break; case 6: //Fire set @item, 994; set @rough, 990; set @qty, 10; break; case 7: //Ice set @item, 995; set @rough, 991; set @qty, 10; break; case 8: //Wind set @item, 996; set @rough, 992; set @qty, 10; break; case 9: //Earth set @item, 997; set @rough, 993; set @qty, 10; break; case 10: //Star set @item, 1000; set @rough, 1001; set @qty, 10; break; default: return; } set @count,countitem(@rough); if (@count < @qty) { callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need."; return; } set @count, @count/@qty; delitem @rough,@qty*@count; getitem @item,@count; emotion e_paper; } //Subfunction: SF_sellOres() function SF_sellOres { do { set @submenu, select( "- Return", "- Buy "+getitemname(1010)+" (200z each)", "- Buy "+getitemname(1011)+" (1000z each)" ); switch (@submenu) { case 2: //Phracon set @mat, 1010; set @cost, 200; break; case 3: //Emveratarcon set @mat, 1011; set @cost, 1000; break; default: return; } input @qty; set @cost,@cost*@qty; if (@qty < 1) { callfunc "F_keIntro", e_pif, "That is NOT a valid quantity..."; } else if (@cost > Zeny) { callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny."; } else if (@cost < 0) { callfunc "F_keIntro", e_swt2, "Sorry, that's too much! Try buying less..."; } else { set Zeny,Zeny-@cost; getitem @mat,@qty; emotion e_paper; } } while (@submenu > 1); } }