Jump to content

Question

1 answer to this question

Recommended Posts

  • 0
Posted
6 minutes ago, jkasdhuhu8e4h1u23 said:

hi everyone i would like to ask a support if what should i revise with this script, this works well with hercules emulator, im slowly migrating to rathena, this npc doesnt works in rathena pls see below script. massrefiner.txt

//= Refines many items (2+) at one time.
//============================================================

-    script    Mass_Refiner    FAKE_NPC,{

    mes("Is mass refining");
    mes("For real?");
    mes("I'm kinda confused");
    mes("they said");
    mes("its impossible because it involves more zeny");
    mes("but …");
    mes("its fine but its on your own risk");
    mes("(said by whom)");
    mes("(Also this isnt just some RO)");
    mes("(Fineee... kekekekke)");
    next();

while (true) {
    .@Menu$ = "";
    if (.@j > 0) {
        deletearray(.@Menu);
        .@j = 0;
    }
    
    
    .@weight = 100 * Weight / MaxWeight;
    if( 50 <= .@weight ) {
        mes .n$;
        mes "You are currently at "+ .@weight +" percent of your maximum weight.";
        close;
    }

    getinventorylist();
    for (.@i = 0; .@i < @inventorylist_count; .@i++) {
        .@id = @inventorylist_id[.@i];
        if (.@id == -1)
            continue;

        if (countitem(.@id) < 2)
            continue;

        if (getiteminfo(.@id, ITEMINFO_TYPE) == IT_WEAPON || getiteminfo(.@id, ITEMINFO_TYPE) == IT_ARMOR) {
            // Ignore if accessory or costume
            .@Loc = getiteminfo(.@id, ITEMINFO_LOC);
            if !(.@Loc & EQP_COSTUME_HEAD_TOP) && !(.@Loc & EQP_COSTUME_HEAD_MID) && !(.@Loc & EQP_COSTUME_HEAD_LOW) && (.@Loc != EQP_ACC) {
                // ignore if already in array
                if (array_find(.@Menu, .@id) == -1) {
                    .@Menu$ += sprintf("%s [%d] x%d:", getitemname(.@id), getiteminfo(.@id, ITEMINFO_SLOTS), countitem(.@id));
                    .@Menu[.@j] = .@id;
                    .@j++;
                }
            }
        }
    }

    .@Menu$ += "^008800Help.^000000:";
    .@Menu$ += "^777777Cancel.^000000";

    if (.@j < 1) {
        mes(.@name$);
        mes("I am the mass refiner,");
        mes("but you need to have");
        mes("more than one of a weapon");
        mes("or armor to mass refine.");
        close();
    }

    mes(.@name$);
    mes("Choose an item to mass");
    mes("refine. You must be able");
    mes("to equip it, otherwise");
    mes("I can't help you.");
    next();

    .@i = select(.@Menu$) - 1;
    if (.@i == .@j + 1)
        callsub(S_Cancel);
    else if (.@i == .@j) {
        mes(.@name$);
        mes("My service is mass refining");
        mes("equipment. In order to");
        mes("do so, the following");
        mes("criteria must be met:");
        next();
        mes(.@name$);
        mes("1. You can equip the item.");
        mes("2. You have at least 2");
        mes("of the item.");
        mes("3. The item(s) can be");
        mes("further refined.");
        mes("4. You have enough materials");
        mes("and zeny.");
        next();
        mes(.@name$);
        mes("Prices are as follows:");
        mes("(per refine level and item)");
        mes("^000088Armors:^000000 1x Elunium, 20,000z.");
        mes("^000088Lv1 Weapon:^000000 1x Phracon, 10,000z.");
        mes("^000088Lv2 Weapon:^000000 1x Emveretarcon, 20,000z.");
        mes("^000088Lv3 Weapon:^000000 1x Oridecon, 30,000z.");
        mes("^000088Lv4 Weapon:^000000 1x Oridecon, 40,000z.");
        next();
        continue;
    }

    break;
}

    .@id = .@Menu[.@i];

    switch (getiteminfo(.@id, ITEMINFO_LOC)) {
    case EQP_HEAD_TOP:
        .@Part = EQI_HEAD_TOP;
        break;
    case EQP_HEAD_MID:
        .@Part = EQI_HEAD_MID;
        break;
    case EQP_HEAD_LOW:
        .@Part = EQI_HEAD_LOW;
        break;
    case EQP_ARMOR:
        .@Part = EQI_ARMOR;
        break;
    case EQP_WEAPON:
        .@Part = EQI_HAND_R;
        break;
    case EQP_SHIELD:
        .@Part = EQI_HAND_L;
        break;
    case EQP_GARMENT:
        .@Part = EQI_GARMENT;
        break;
    case EQP_SHOES:
        .@Part = EQI_SHOES;
        break;
    }

    if (getequipid(.@Part) != .@id) {
        if (equip(.@id) != 1) {
            mes(.@name$);
            mes("You need to be able");
            mes("to equip an item to");
            mes("mass refine it.");
            close();
        }
    }

    mes(.@name$);
    mes("When do you want the");
    mes("refine attempts to end?");
    next();
    while (input(.@End, 1, 10) != 0) {
        mes(.@name$);
        mes("Please input a number");
        mes("from 1 to 10.");
        next();
        if (select("Retry.", "^777777Cancel.^000000") == 2)
            callsub(S_Cancel);
    }

    switch (getequipweaponlv(.@Part)) {
    case 0:
        .@material = Elunium;
        .@Price = 20000;
        setarray(.@Chance[1], 100, 100, 100, 100, 60, 40, 40, 20, 20, 9);
        break;
    case 1:
        .@material = Phracon;
        .@Price = 10000;
        setarray(.@Chance[1], 100, 100, 100, 100, 100, 100, 100, 60, 40, 19);
        break;
    case 2:
        .@material = Emveretarcon;
        .@Price = 20000;
        setarray(.@Chance[1], 100, 100, 100, 100, 100, 100, 60, 40, 20, 19);
        break;
    case 3:
        .@material = Oridecon;
        .@Price = 30000;
        setarray(.@Chance[1], 100, 100, 100, 100, 100, 60, 50, 20, 20, 19);
        break;
    case 4:
        .@material = Oridecon;
        .@Price = 40000;
        setarray(.@Chance[1], 100, 100, 100, 100, 60, 40, 40, 20, 20, 9);
        break;
    }

    if (getequipid(.@Part) == .@id)
        unequip(.@Part);

    .@count = countitem(.@id);
    mes(.@name$);
    mes("Please confirm you want");
    mes("to attempt to refine all");
    mesf("^ff0000%d^000000 of your ^ff0000%s^000000 until ^ff0000+%d^000000.", .@count, getitemname(.@id), .@End);
    mes("It will cost you up to");
    mesf("^ff0000%s^000000z and up to", F_PriceString(.@Price * .@End));
    mesf("^ff0000%d %s^000000 per attempt.", .@End, getitemname(.@material));
    next();
    mes(.@name$);
    mes("If you run out of zeny");
    mes("or materials, the process");
    mes("will stop. I recommend");
    mesf("you have at least ^ff0000%d", .@count * .@End);
    mesf("%s^000000 and ^ff0000%s^000000z.", getitemname(.@material), F_PriceString(.@Price * .@End * .@count));
    next();
    if (select("^FF8000Confirm, attempt mass refine.^000000", "^777777Cancel.^000000") == 2)
        callsub(S_Cancel);

    .@j = 0;
    .@count = 0;
    getinventorylistindex();
    for (.@i = 0; .@i < @inventorylist_count; .@i++) {
        if (@inventorylist_id[.@i] == .@id && @inventorylist_refine[.@i] < .@End && @inventorylist_expire[.@i] == 0) {
            .@Index[.@j] = .@i;
            .@j++;
            .@count++;

            .@Card = @inventorylist_card1[.@i];
            if ((.@Card >= 4000 && .@Card < 5000) || (.@Card >= 27000 && .@Card <= 27100))
                .@k++;
        }
    }

    if (.@count == 0) {
        mes(.@name$);
        mes("Hmm...seems all versions");
        mesf("of '%s [%d]' in your", getitemname(.@id), getiteminfo(.@id, ITEMINFO_SLOTS));
        mesf("inventory are already +%d", .@End);
        mes("or higher.");
        close();
    }

    if (.@k > 0) {
        mes(.@name$);
        mes("Hmm...seems one of your");
        mes("items has a card in it.");
        mes("Continue anyway?");
        next();
        if (select("^FF8000Confirm, attempt mass refine.^000000", "^777777Cancel.^000000") == 2)
            callsub(S_Cancel);
    }

    mes(.@name$);
    mes("Attempting mass refine...");
    mes("Press next to continue...");
    next();

    for (.@i = 0; .@i < .@count; .@i++) {
        if (equipidx(.@Index[.@i], .@id) == 0)
            continue;

        if (getequipisenableref(.@Part) == 0 || getequipisidentify(.@Part) == 0 || getequiprefinerycnt(.@Part) >= .@End || getequiprefinerycnt(.@Part) >= 10)
            continue;

        .@refinecnt = .@End - getequiprefinerycnt(.@Part);
        .@endcnt = .@refinecnt;
        .@j = getequiprefinerycnt(.@Part);
        .@k = 0;

        while (.@refinecnt > 0 && getequiprefinerycnt(.@Part) < .@End) {
            .@j++;
            .@k++;
            if (.@Chance[.@j] <= rand(100))
                break;
            else
                .@refinecnt--;
        }

        if (Zeny < .@Price * .@k) {
            mes(.@name$);
            mes("You ran out of Zeny.");
            next();
            break;
        } else if (countitem(.@material) < .@k) {
            mes(.@name$);
            mesf("You ran out of %s.", getitemname(.@material));
            next();
            break;
        }

        Zeny -= .@Price * .@k;
        delitem(.@material, .@k);

        if (.@refinecnt > 0) {
            delitemidx(.@Index[.@i]);
            getitem2(.@id, 1, 1, .@j - 1, 0, 0, 0, 0, 0);
            delitem2(.@id, 1, 1, .@j - 1, 0, 0, 0, 0, 0);
            specialeffect(EF_HIT3, AREA, playerattached());
            specialeffect(EF_REFINEFAIL, AREA, playerattached());
            emotion(e_omg);
            .@Fail++;
        } else {
            successrefitem(.@Part, .@endcnt);
            emotion(e_no1);
            emotion(e_thx, true);
            .@Success++;
        }

        if (getequipid(.@Part) == .@id)
            unequip(.@Part);
        next();
    }

    mes(.@name$);
    mes("Mass refine process");
    mes("complete. Report:");
    mesf("^008800%d success%s.^000000", .@Success, (.@Success == 1) ? "" : "es");
    mesf("^ff0000%d failure%s.^000000", .@Fail, F_IntToPlural(.@Fail));

    close();

S_Cancel:
    mes(F_NpcName(strnpcinfo(NPC_NAME_VISIBLE)));
    mes("You said so...hmm...so be it...");
    close();
}

//=== Duplicates
dewata,210,129,4    duplicate(Mass_Refiner)    Bogart#ama    4_M_DWARF
//turbo_room,93,117,5    duplicate(Blackout_Refiner)    Refiner#turbo    4_M_LGTMAN
//niflheim,186,198,5    duplicate(Blackout_Refiner)    Refiner#nif    4_M_DWARF

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...