Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //===== rAthena Script =======================================
- //= 精煉師 艾達
- //===== By: ==================================================
- //= 天波工作組
- //===== Current Version: =====================================
- //= 2.1
- //===== Compatible With: =====================================
- //= rAthena SVN
- //===== Description: =========================================
- //= 集合多功能為一身的精煉人員
- //===== Additional Comments: =================================
- //= 1.0 第一個版本完成
- //= 2.0 增加各種防爆物品使用(祝福的礦石、鐵匠的祝福、鐵匠的神乎其技)
- //= 2.1 修復精煉等級掉出允許範圍後仍可精煉的錯誤
- //= 修復受祝福的礦石判斷武器/防具錯誤的問題
- //============================================================
- pri_in.gat,63,60,4 script 精煉師 艾達 10078,{callfunc "refines";}
- // ----------------------------------Script Setting--------------------------------------
- function script refines {
- disable_items;
- 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;
- .@REFINE_MIN_LEVEL = 0;
- .@REFINE_MAX_LEVEL = 20;
- .@menu$ = "";
- for(.@i = 1; .@i<getarraysize(.@indices); ++.@i) {
- if(getequipisequiped(.@indices[.@i])) {
- .@menu$ = .@menu$ + F_getpositionname(.@indices[.@i]) + " [" + getequipname(.@indices[.@i]) + "]";
- .@equipped = 1;
- }
- .@menu$ = .@menu$ + ":";
- }
- if (.@equipped == 0) {
- mes "[精煉師 艾達]";
- mes "你身上沒有任何可以精鍊的裝備。";
- close;
- }
- mes "[精煉師 艾達]";
- mes "部分防爆物品有精煉等級的區間限制,詳情請自行查看物品說明。";
- mes " ";
- mes "^FF0000注意事項:選單內的選項,是依照選擇的裝備而顯示。^000000";
- next;
- .@part = .@indices[select(.@menu$)];
- // -- Initialize refine setting --- //
- .@refinereycnt = getequiprefinerycnt(.@part);
- if(.@refinereycnt < 10) {
- setarray .@refineType[0], REFINE_COST_NORMAL, REFINE_COST_ENRICHED;
- setarray .@enriched[0], 0, 1; // * If enriched parameter is set to true, chance to successfully refine the
- // item withenriched material is returned instead.
- setarray .@refpenalty[0], -99, -99; // borken : -99 / borken and downrefitem n: -n / nothing : 0 / downrefitem n : n
- .@arySize = getarraysize(.@refineType);
- for(.@i=0; .@i<.@arySize; .@i++)
- .@materialArray[.@i] = getequiprefinecost(.@part, .@refineType[.@i], REFINE_MATERIAL_ID);
- .@mes$[1] = "使用"+getitemname(.@materialArray[1])+"精鍊時,成功率會比較高唷~";
- .@failmes$[0] = .@failmes$[1] = "失敗懲罰:^E38EFF裝備損毀消失^000000";
- }else{
- setarray .@refineType[0], REFINE_COST_OVER10, REFINE_COST_OVER10_HD;
- setarray .@enriched[0], 0, 1; // * If enriched parameter is set to true, chance to successfully refine the
- // item withenriched material is returned instead.
- setarray .@refpenalty[0], -3, 1; // borken : -99 / borken and downrefitem n: -n / nothing : 0 / downrefitem n : n
- .@arySize = getarraysize(.@refineType);
- for(.@i=0; .@i<.@arySize; .@i++)
- .@materialArray[.@i] = getequiprefinecost(.@part, .@refineType[.@i], REFINE_MATERIAL_ID);
- .@mes$[1] = "使用^0000FF"+getitemname(.@materialArray[1])+"^000000精鍊時,失敗的精鍊處罰等級只有1等唷~";
- .@failmes$[0] = "失敗懲罰:^E38EFF下降3等或損毀消失^000000";
- .@failmes$[1] = "失敗懲罰:^E38EFF下降1等^000000";
- }
- // 高濃縮神之金屬/鋁
- if(.@refinereycnt >= 7 && .@refinereycnt <=9) {
- .@index = getarraysize(.@refineType);
- .@limitLvMin[.@index] = 7;
- .@limitLvMax[.@index] = 9;
- .@refineType[.@index] = REFINE_COST_HD;
- .@enriched[.@index] = 1;
- .@refpenalty[.@index] = 1; // downrefitem 1
- .@materialArray[.@index] = getequiprefinecost(.@part, .@refineType[.@index], REFINE_MATERIAL_ID);
- .@mes$[.@index] = "使用"+getitemname(.@materialArray[.@index])+"精鍊時,失敗的精鍊處罰等級只有1等唷~";
- .@failmes$[.@index] = "失敗懲罰:^E38EFF下降1等^000000";
- }
- // 受祝福的武器/防具礦石
- if(.@refinereycnt >= 6 && .@refinereycnt <=12) {
- .@index = getarraysize(.@refineType);
- if(.@refinereycnt < 10)
- .@refineType[.@index] = REFINE_COST_HD;
- else
- .@refineType[.@index] = REFINE_COST_OVER10_HD;
- .@limitLvMin[.@index] = 6;
- .@limitLvMax[.@index] = 12;
- .@enriched[.@index] = 1;
- .@refpenalty[.@index] = 0; // nothing
- if(getiteminfo(getequipid(.@part), 5) == 2) // Weapon
- .@materialArray[.@index] = 6438; // 受祝福的武器礦石
- else
- .@materialArray[.@index] = 6439; // 受祝福的防具礦石
- .@mes$[.@index] = "使用^0000FF"+getitemname(.@materialArray[.@index])+"^000000精鍊時,失敗不會退階或損壞~";
- .@failmes$[.@index] = "失敗懲罰:^E38EFF不會退階或損壞^000000";
- }
- // 鐵匠的祝福
- if(.@refinereycnt >= 7 && .@refinereycnt <=11) {
- setarray .@needNums_1[0],1,2,3,4,4;
- .@index = getarraysize(.@refineType);
- if(.@refinereycnt < 10)
- .@refineType[.@index] = REFINE_COST_HD;
- else
- .@refineType[.@index] = REFINE_COST_OVER10_HD;
- .@limitLvMin[.@index] = 7;
- .@limitLvMax[.@index] = 11;
- .@enriched[.@index] = 1;
- .@refpenalty[.@index] = 0; // nothing
- .@materialArray[.@index] = 6635;
- .@mes$[.@index] = "使用^0000FF"+getitemname(.@materialArray[.@index])+"^000000精鍊時,失敗不會退階或損壞~";
- .@failmes$[.@index] = "失敗懲罰:^E38EFF不會退階或損壞^000000";
- }
- // 鐵匠的神乎其技
- if(.@refinereycnt >= 12 && .@refinereycnt <=13) {
- setarray .@needNums_2[0],1,2;
- .@index = getarraysize(.@refineType);
- .@refineType[.@index] = REFINE_COST_OVER10_HD;
- .@limitLvMin[.@index] = 12;
- .@limitLvMax[.@index] = 13;
- .@enriched[.@index] = 1;
- .@refpenalty[.@index] = 0; // nothing
- .@materialArray[.@index] = 7650;
- .@mes$[.@index] = "使用^0000FF"+getitemname(.@materialArray[.@index])+"^000000精鍊時,失敗不會退階或損壞~";
- .@failmes$[.@index] = "失敗懲罰:^E38EFF不會退階或損壞^000000";
- }
- // -- Dynamic create menu --- //
- .@menu$ = "";
- .@arySize = getarraysize(.@materialArray);
- for(.@i=0; .@i<.@arySize; .@i++) {
- // 鐵匠的祝福
- if(.@materialArray[.@i] == 6635) {
- if(countitem(.@materialArray[.@i]) >= .@needNums_1[.@refinereycnt - 7] &&
- countitem(getequiprefinecost(.@part, .@refineType[.@i], REFINE_MATERIAL_ID)) > 0)
- .@menu$ += "^000000";
- else
- .@menu$ += "^888888";
- .@menu$ += getitemname(.@materialArray[.@i]) + "^000000"+(.@i!=.@arySize-1?":":"");
- // 鐵匠的神乎其技
- }else if(.@materialArray[.@i] == 7650) {
- if(countitem(.@materialArray[.@i]) >= .@needNums_2[.@refinereycnt - 12] &&
- countitem(getequiprefinecost(.@part, .@refineType[.@i], REFINE_MATERIAL_ID)) > 0)
- .@menu$ += "^000000";
- else
- .@menu$ += "^888888";
- .@menu$ += getitemname(.@materialArray[.@i]) + "^000000"+(.@i!=.@arySize-1?":":"");
- }else
- .@menu$ += (countitem(.@materialArray[.@i])?"^000000":"^888888") + getitemname(.@materialArray[.@i]) + "^000000"+(.@i!=.@arySize-1?":":"");
- }
- mes "[精煉師 艾達]";
- mes "你想使用哪種物品進行精鍊?";
- next;
- .@select = select(.@menu$)-1;
- next;
- if(.@select) {
- mes "[精煉師 艾達]";
- mes ""+.@mes$[.@select]+"";
- next;
- }
- .@refineLvMin = .@limitLvMin[.@select]?.@limitLvMin[.@select]:.@REFINE_MIN_LEVEL;
- .@refineLvMax = .@limitLvMax[.@select]?.@limitLvMax[.@select]:.@REFINE_MAX_LEVEL;
- do{
- //檢查物品可否精鍊
- if(!getequipisequiped(.@part)) { //custom check
- mes "[精煉師 艾達]";
- mes "你說的位置沒穿戴任何裝備,";
- mes "我無法進行精鍊…";
- emotion ET_FRET;
- close;
- }else if(!getequipisenableref(.@part)) {
- mes "[精煉師 艾達]";
- mes "我不認為這件裝備可以精鍊。";
- close;
- }else if (getequiprefinerycnt(.@part) >= .@REFINE_MAX_LEVEL) { //custom check
- mes "[精煉師 艾達]";
- mes "我不能精鍊這樣的東西,";
- mes "因為它超出我個人限定的等級。";
- close;
- }else if(getequiprefinerycnt(.@part) >= 10) {
- .@safe = 10;
- }else{
- switch (getequipweaponlv(.@part)) {
- case 1: .@safe = 7; break;
- case 2: .@safe = 6; break;
- case 3: .@safe = 5; break;
- case 4:
- default: .@safe = 4; break;
- }
- }
- .@type = .@refineType[.@select];
- if(.@refinereycnt >= 10) {
- if(.@type == REFINE_COST_NORMAL)
- .@type = REFINE_COST_OVER10;
- else if(.@type == REFINE_COST_ENRICHED || .@type == REFINE_COST_HD)
- .@type = REFINE_COST_OVER10_HD;
- }else{
- if(.@type == REFINE_COST_OVER10)
- .@type = REFINE_COST_NORMAL;
- else if(.@type == REFINE_COST_OVER10_HD)
- .@type = REFINE_COST_HD;
- }
- .@price = getequiprefinecost(.@part, .@type, REFINE_ZENY_COST);
- .@material[0] = getequiprefinecost(.@part, .@type, REFINE_MATERIAL_ID);
- .@materialNums[0] = 1;
- .@refineitemid = getequipid(.@part); // save id of the item
- .@refinerycnt = getequiprefinerycnt(.@part); // save refinery count
- .@refinePro = getequippercentrefinery(.@part, .@enriched[.@select]); // 精鍊機率
- // 確認精煉物品的可精煉等級範圍
- if(.@refinereycnt > .@refineLvMax)
- callsub L_OverMax, .@materialArray[.@select], .@refineLvMax;
- else if(.@refinereycnt < .@refineLvMin)
- callsub L_BelowMin, .@materialArray[.@select], .@refineLvMin;
- // 受祝福的武器/防具礦石
- if(.@materialArray[.@select] == 6438 || .@materialArray[.@select] == 6439) {
- .@material[0] = .@materialArray[.@select];
- }
- // 鐵匠的祝福
- if(.@materialArray[.@select] == 6635) {
- .@material[1] = .@materialArray[.@select];
- .@materialNums[1] = .@needNums_1[.@refinereycnt - 7];
- }
- // 鐵匠的神乎其技
- if(.@materialArray[.@select] == 7650) {
- .@material[1] = .@materialArray[.@select];
- .@materialNums[1] = .@needNums_2[.@refinereycnt - 12];
- }
- if(.@refinePro==100) set @color$,"^0000FF";
- else set @color$,"^FF0000";
- mes "[精煉師 艾達]";
- mes "精鍊項目:^339900"+getequipname(.@part)+"^000000 ^2F4F4F+"+.@refinerycnt+"^000000 至 ^A0522D+"+(.@refinerycnt+1)+"^000000";
- mes "成功機率:"+.@color$+""+.@refinePro+" %^000000";
- for(.@i=0 ;.@i<getarraysize(.@material); .@i++)
- mes "消耗物品:^6CA6CD"+getitemname(.@material[.@i])+"^000000 x ^8968CD"+.@materialNums[.@i]+"^000000";
- mes "精鍊費用:^B8860B"+callfunc("F_InsertComma",.@price)+"^000000 Zeny";
- mes .@failmes$[.@select];
- next;
- if(select("繼續:取消")==2) close;
- for(.@i=0 ;.@i<getarraysize(.@material); .@i++) {
- if(countitem(.@material[.@i]) < .@materialNums[.@i] || Zeny < .@price) {
- mes "[精煉師 艾達]";
- mes "您的精鍊所需材料或費用不足。";
- close;
- }
- }
- Zeny = Zeny - .@price;
- for(.@i=0 ;.@i<getarraysize(.@material); .@i++)
- delitem .@material[.@i],.@materialNums[.@i];
- // anti-hack
- if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) ||
- callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) {
- emotion ET_FRET;
- mes "[精煉師 艾達]";
- mes "等一下…";
- mes "你覺得我是傻瓜嘛?";
- mes "你要精鍊的東西我並沒有看見阿!";
- close;
- }
- if(.@refinePro > rand(100)) {
- successrefitem .@part;
- if(.@safe < 10) emotion ET_SMILE;
- else emotion ET_BEST;
- mes "[精煉師 艾達]";
- mes "恭喜你,精鍊成功了!";
- mes "我果然是最好的精鍊師。";
- } else {
- .@penalty = .@refpenalty[.@select];
- if(.@penalty == 0) {
- specialeffect2 EF_REPAIRWEAPON;
- mes "精鍊失敗了…";
- mes "但因為有^006400"+getitemname(.@materialArray[.@select])+"^000000,";
- mes "所以裝備沒有損壞。";
- }else{
- if((rand(100) < 80 && .@penalty != -99 && .@penalty < 0) || .@penalty > 0) {
- // downrefitem n
- .@downLevel = .@penalty*(.@penalty<0?-1:1);
- downrefitem .@part, .@downLevel; // Failed refine attempts decrease the item's refine level by 3
- emotion (!rand(5))?ET_MONEY:ET_HUK;
- mes "[精煉師 艾達]";
- mes "我的天阿!";
- mes "精鍊的等級已經下降了"+.@downLevel+"等…";
- }else{
- // borken
- failedrefitem .@part;
- mes "[精煉師 艾達]";
- mes "天啊!我沒有精鍊成功…";
- mes "我不是故意的!";
- close;
- }
- }
- }
- next;
- .@refinereycnt = getequiprefinerycnt(.@part);
- }while(.@refinereycnt < .@REFINE_MAX_LEVEL);
- end;
- L_OverMax:
- mes "[精煉師 艾達]";
- mes "我已經沒辦法替你精煉了!";
- mes "因為^0000FF"+getitemname(getarg(0))+"^000000…";
- mes "只能使用到^0000FF精煉值"+getarg(1)+"等^000000。";
- close;
- L_BelowMin:
- mes "[精煉師 艾達]";
- mes "你的裝備沒辦法繼續精煉!";
- mes "因為^0000FF"+getitemname(getarg(0))+"^000000…";
- mes "只能用於^0000FF精煉值"+getarg(1)+"等以上^000000。";
- close;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement