Jump to content
  • 0

Hello, Can anybody help me fix my Dynamic Shop?


Question

Posted (edited)
Hello,

I used Euphy and Emistry's shop, i find them complicated for me. as some people can use the shop and buy stuffs w/o pods/tcgs, i really cant help seeing buggers buying stuffs. =(  instead i use this, the problem is, my character moves even im already inside the shop and also i want to use an specific currency/badges to buy in the shop, that i can easily put more shop but different items in it. please help me guys!!!



//===== rAthena Script =======================================
//= Dynamical Shop 
//===== By ===================================================
//= lllchrislll
//===== Version ==============================================
//= 1.0 - Script Created
//        - Nearly forgot the "OnBuyItem" part (Q.Q)
//        - Added the possibility to edit the price limit.
//= 1.1 - Added more Currency options
//      - Added possiblity to use pre-defined items + prices,
//        which are always in the shop, see 'OnInit:' > $cash_pre_it and $cash_pre_p
//      - Fixed an bug about the price limit
//      - Changed all $cash variables to .cash
//===== Compatible With ======================================
//= Every rAthena SVN 
//===== Tested With ==========================================
//= rAthena SQL 11.06.2015 - Updated Revision
//===== Description ==========================================
//= This Shop can be changed dynamically ingame and has four
//  payment methods, to choose from: Zeny, Cash Points, Custom Variable and Item.
//= Also you can edit the Price Limit as long it doesn't exceed
//    the server's default settings in the conf/script_athena.conf
//    > input_max_value. By default I put it on 10,000,000, near
//    line 76 you can find a small hint, which value is the max,
//    if it isn't noted inside of that file already.
//===== Comments =============================================
//= Thanks to Elysium:
//  > Bug about the price limit
//  > Modification request about more currency options
//===========================================================
itemmall,175,76,4    script    Cash Shop    100,{
function ShopStuff;

// Reading Currency Display Name
switch(.CR) {
    case 0: set .Cur_N$,"None"; break;
    case 1: set .Cur_N$,"Zeny"; set @Cur_O$,"Zeny"; break;
    case 2: set .Cur_N$,"Cash Points"; set @Cur_O$,"#CASHPOINTS"; break;
    case 3: set .Cur_N$,.CR_Name$; set @Cur_O$,""+.CR_Var$; break;
    case 4: set .Cur_N$,getitemname(.CR_Item); break;
}

if(.first) ShopStuff(5);

if(getgmlevel() >= .gm) {
    set @shop,0;
    mes .n$;
    mes "Hello, "+strcharinfo(0)+".";
    mes "Current Currency: "+.Cur_N$;
    while(1) {
        if(@shop) {
            close2;
            break;
        }
        // Reading Currency Display Name
        switch(.CR) {
            case 0: set .Cur_N$,"None"; break;
            case 1: set .Cur_N$,"Zeny"; set @Cur_O$,"Zeny"; break;
            case 2: set .Cur_N$,"Cash Points"; set @Cur_O$,"#CASHPOINTS"; break;
            case 3: set .Cur_N$,.CR_Name$; set @Cur_O$,""+.CR_Var$; break;
            case 4: set .Cur_N$,getitemname(.CR_Item); break;
        }
        next;
        mes .n$;
        mes "How can I help you?";
        next;
        switch(select("- Shop Settings:- Reset Shop:- Open Shop:- Nothing")) {

            case 1:
            mes .n$;
            mes "What do you want view?";
            next;
            if(select("- Shop Managment:- Currency Setting") - 1) {
                mes .n$;
                mes "What now?";
                mes "^FF0000Note: On currency change I will delete every entry in the shop you have made so far.^000000";
                switch(select("- Change currency (Current - "+.Cur_N$+"):- Set Price Limit:- Nothing")) {
                    case 1:
                    next;
                    mes .n$;
                    mes "Please choose from the menu below, which currency I should use:";
                    switch(select("- Zeny:- Cash Points:- Custom Variable:- Items")) {
                        
                        default: set .CR,@menu; break;
                        
                        case 3:
                        next;
                        mes .n$;
                        mes "Please write the name of the Custom Variable and the display name for the players:";
                        mes "^FF0000Note: You have to be aware of the variable name itself, like PvPPoints.^000000";
                        mes "^FF0000Note: Max letters for variable name: 10, 20 for display name!^000000";
                        next;
                        if(input(.@CR_Var$,1,10) != 0) {
                            mes .n$;
                            mes "Error: Either the variable name is too long or too short. Please try again.";
                            continue;
                        }
                        if(input(.@CR_Name$,1,20) != 0) {
                            mes .n$;
                            mes "Error: Either the display name is too long or too short. Please try again.";
                            continue;
                        }
                        mes .n$;
                        mes "Variable Name: "+.@CR_Var$;
                        mes "Variable Display Name: "+.@CR_Name$;
                        mes "Is this correct?";
                        if(select("- Yes:- No") - 1) continue;
                        next;
                        mes .n$;
                        mes "Custom Variable will now be used as currency.";
                        set .CR_Var$,.@CR_Var$;
                        set .CR_Name$,.@CR_Name$;
                        set .CR,3;
                        break;
                        
                        case 4:
                        next;
                        mes .n$;
                        mes "Please write the id of the item you want to use:";
                        next;
                        if(input(.@item,501,.last_id) != 0) {
                            mes .n$;
                            mes "The id you have put is either too low or too high.";
                            continue;
                        }
                        if(getitemname(.@item) == "null" || getitemname(.@item) == "") {
                            mes .n$;
                            mes "The item you requested doesn't exist.";
                            continue;
                        }
                        mes .n$;
                        mes "Chosen Item: "+getitemname(.@item);
                        mes "Is that correct?";
                        if(select("- Yes:- No") - 1) continue;
                        set .CR_Item,.@item;
                        set .CR,4;
                        break;
                    }
                    deletearray .cash_it[0],128;
                    deletearray .cash_p[0],128;
                    ShopStuff(4);
                    continue;
                    break;
                
                    case 2:
                    next;
                    mes .n$;
                    mes "Current Setting: "+.limit;
                    mes "Change?";
                    if(select("- Yes:- No") - 1) continue;
                    next;
                    mes .n$;
                    mes "Please type the new value:";        
                    
                    // ========= Changing Max Limit of 10,000,000 ============ //
                    // 10,000,000 is the default setting for the max input.
                    // To change that open the conf/script_athena.conf and 
                    // edit the value of "input_max_value:" to "2147483647",
                    // which is the highest value possible.
                    // Then you only need to change it here :D.
                    // ======================================================= //
                    
                    mes "Note: But you can't go higher than the server setting of 10,000,000.";
                    next;
                    if(input(@n_lim,1,10000000) != 0) {
                        mes .n$;
                        mes "Invalid Value, max 10,000,000.";
                        continue;
                    }
                    mes .n$;
                    mes "New Limit has been set.";
                    set .limit,@n_lim;
                    continue;
                    break;
                    
                    case 3:
                    continue;
                    break;
                }
            }
            if(!.CR) {
                mes .n$;
                mes "I'm sorry, but I don't know with which Currency I should trade yet.";
                mes "Please choose an currency first.";
                continue;
            }
            if(!.limit) {
                mes .n$;
                mes "You haven't set an price limit yet.";
                continue;
            }
            mes .n$;
            if(getarraysize(.cash_it) < 1) {
                mes "There is no item in the Shop yet.";
            } else {
                mes "There are currently the following "+getarraysize(.cash_it)+" Items in the Shop:";
                mes "============================";
                for ( set .@i,0; .@i < getarraysize(.cash_it); set .@i,.@i + 1) {
                    mes getitemname(.cash_it[.@i])+" (ID: "+.cash_it[.@i]+")";
                    mes "Price:"+.cash_p[.@i]+" "+.Cur_N$;
                    mes ( (.cash_it[.@i+1] != 0)?"---------------------------------":"============================");
                }
            }
            next;
            switch(select("- Add Items:- Edit Items:- Delete Items:- Nothing")) {
                case 1:
                mes .n$;
                if(getarraysize(.cash_it) >= 128) {
                    mes "The Shop is full, please remove an item first.";
                    continue;
                }
                mes "Please type the Item ID you want to add:";
                mes "Max is 128 Items.";
                next;
                if(input(.@item,501,.last_id) != 0) {
                    mes .n$;
                    mes "The id you have put is either too low or too high.";
                    continue;
                }
                if(getitemname(.@item) == "null" || getitemname(.@item) == "") {
                    mes .n$;
                    mes "The item you requested doesn't exist.";
                    continue;
                }
                mes .n$;
                mes "Chosen Item: "+getitemname(.@item);
                mes " ";
                mes "Now input the price it should have, the current currency is \""+.Cur_N$+"\".";
                mes "Maximum is "+.limit;
                next;
                if(input(.@price,1,.limit) != 0) {
                    mes .n$;
                    mes "You have put an invalid price.";
                    mes "Maximum is "+.limit;
                    continue;
                }
                mes .n$;
                mes "Price: "+.@price+" "+.Cur_N$;
                mes "Is that correct?";
                if(select("- Yes:- No") - 1) continue;
                ShopStuff(1,0,.@item,.@price);
                continue;
                break;
                
                case 2:
                mes .n$;
                if(getarraysize(.cash_it) < 1) {
                    mes "There is no Item to edit.";
                    mes "Please add one first :D.";
                    continue;
                }
                mes "Please choose the item you want to edit:";
                mes "Format: Name (Current Price)";
                next;
                set @ed_list$,"";
                for ( set .@e,0; .@e < getarraysize(.cash_it); set .@e,.@e + 1)
                    set @ed_list$,@ed_list$ + "- "+getitemname(.cash_it[.@e])+" ("+.cash_p[.@e]+")" + ( (.cash_it[.@e+1])?":":"");
                    
                set @ed,select(@ed_list$) - 1;
                
                mes .n$;
                mes "Chosen Item: "+ getitemname(.cash_it[@ed]);
                mes "Price: "+ .cash_p[@ed]+" "+.Cur_N$;
                mes "Correct?";
                if(select("- Yes:- No") - 1) continue;
                next;
                mes .n$;
                mes "What do you want to edit?";
                next;
                if(select("- Item ID:- Price") - 1) {
                    mes .n$;
                    mes "Input the new price:";
                    next;
                    if(input(.@price,1,.limit) != 0) {
                        mes .n$;
                        mes "You have put an invalid price.";
                        mes "Maximum is "+.limit;
                        continue;
                    }
                    mes .n$;
                    mes "Chosen Price: "+.@price+" "+.Cur_N$;
                    mes "Correct?";
                    if(select("- Yes:- No") - 1) continue;
                    ShopStuff(3,@ed,.cash_it[@ed],.@price);
                    
                } else {
                    mes .n$;
                    mes "Input the new item id:";
                    next;
                    if(input(.@item,501,.last_id) != 0) {
                        mes .n$;
                        mes "The id you have put is either too low or too high.";
                        continue;
                    }
                    if(getitemname(.@item) == "null" || getitemname(.@item) == "") {
                        mes .n$;
                        mes "The item you requested doesn't exist.";
                        continue;
                    }
                    mes .n$;
                    mes "Chosen Item: "+getitemname(.@item);
                    mes "Correct?";
                    if(select("- Yes:- No") - 1) continue;
                    ShopStuff(3,@ed,.@item,.cash_p[@ed]);
                }    
                continue;
                break;
                
                case 3:
                mes .n$;
                if(getarraysize(.cash_it) < 1) {
                    mes "There is no Item to remove.";
                    mes "Please add one first :D.";
                    continue;
                }
                mes "Please choose the item you want to remove:";
                mes "Format: Name (Current Price)";
                next;
                set @r_list$,"";
                for ( set .@e,0; .@e < getarraysize(.cash_it); set .@e,.@e + 1)
                    set @r_list$,@r_list$ + "- "+getitemname(.cash_it[.@e])+" ("+.cash_p[.@e]+")" + ( (.cash_it[.@e+1])?":":"");
                    
                set @re,select(@r_list$) - 1;
                
                mes .n$;
                mes "Chosen Item: "+ getitemname(.cash_it[@re]);
                mes "Price: "+ .cash_p[@re]+" "+.Cur_N$;
                mes "Correct?";
                if(select("- Yes:- No") - 1) continue;
                ShopStuff(2,@ed);
                continue;
                break;
                
                case 4:
                continue;
                break;
            }
            
            case 2:
            mes .n$;
            mes "Do you really want to reset the shop?";
            if(select("- Yes:- No") - 1) continue;
            ShopStuff(4);
            continue;
            break;
            
            case 3:
            set @shop,1;
            break;
            
            case 4:
            close;
        }
    }
}
if(!.CR) {
    mes .n$;
    mes "I'm sorry, but I don't know with which Currency I should trade yet.";
    close;
}
if(getarraysize(.cash_it) < 1) {
    mes .n$;
    mes "There are no items to purchase yet.";
    mes "Please come back as soon as I have some.";
    close;
}
dispbottom strnpcinfo(1)+": Accepted Payment Method: "+.Cur_N$;
if(.CR < 4)
    dispbottom strnpcinfo(1)+": You have "+getd(""+@Cur_O$)+" "+.Cur_N$;
else 
    dispbottom strnpcinfo(1)+": You have "+countitem(.CR_Item)+" "+.Cur_N$;
dispbottom strnpcinfo(1)+": Notice: Discount Skill won't work at me, you'll have to pay the full price.";
callshop "Dynam_Shop",1;
npcshopattach "Dynam_Shop";
end;

OnBuyItem:
for ( set .@b,0; .@b < getarraysize(@bought_nameid); set .@b,.@b + 1) {
    for ( set .@l,0; .@l < getarraysize(.cash_it); set .@l,.@l + 1) {
        if(@bought_nameid[.@b] == .cash_it[.@l]) {
            if(checkweight(.cash_it[.@l],@bought_quantity[.@b]) == 1) {
                set @cost,.cash_p[.@l]*@bought_quantity[.@b];
                set @total,@total+@cost;
            } else {
                dispbottom "Cash Shop: You would be overweight, please remove some items or buy less.";
                set @cost,0;
                set @total,0;
                deletearray @bought_nameid[0],128;
                deletearray @bought_quantity[0],128;
                end;
            }
        }
    }
}
if(.CR < 4 && (@total > getd(""+@Cur_O$) ) ) set .@f,1;
if(.CR == 4 && (@total > countitem(.CR_Item) ) ) set .@f,1;
if(.@f) {
    dispbottom strnpcinfo(1)+": You don't have the required "+.Cur_N$;
    dispbottom strnpcinfo(1)+": You need "+@total +" "+.Cur_N$+".";
    set @cost,0;
    set @total,0;
    deletearray @bought_nameid[0],128;
    deletearray @bought_quantity[0],128;
    end;
}

if(.CR < 4)
    setd(""+@Cur_O$),getd(""+@Cur_O$)  - @total;
else 
    delitem .CR_Item,@total;

for ( set .@s,0; .@s < getarraysize(@bought_nameid); set .@s,.@s + 1) {
    getitem @bought_nameid[.@s],@bought_quantity[.@s];
    dispbottom strnpcinfo(1)+": You have succesfully purchased "+@bought_quantity[.@s]+"x "+getitemname(@bought_nameid[.@s])+".";
}
dispbottom strnpcinfo(1)+": You have paied "+@total+"x "+.Cur_N$+".";
    
set @cost,0;
set @total,0;
deletearray @bought_nameid[0],128;
deletearray @bought_quantity[0],128;
end;

function    ShopStuff    {
// ==================================================== //
// getarg(0):
//    * 1 - Add
//    * 2 - Remove
//    * 3 - Edit
//    * 4 - Delete Shop
//    * 5 - Shop Creation
// getarg(1): Array Position for Edit & Remove
// getarg(2): Item ID
// getarg(3): Price
// ==================================================== //
//debugmes "getarg(0): "+getarg(0,0)+", getarg(1): "+getarg(1,0)+", getarg(2): "+getarg(2,0)+", getarg(3): "+getarg(3,0);
    // =========== Item Adding ============ //
    if(getarg(0) == 1) {
        npcshopadditem "Dynam_Shop",getarg(2),getarg(3);
        setarray .cash_it[getarraysize(.cash_it)],getarg(2);
        setarray .cash_p[getarraysize(.cash_p)],getarg(3);
        
    // =========== Item Removal ============ //    
    } else if(getarg(0) == 2) {
        npcshopdelitem "Dynam_Shop",.cash_it[getarg(1)];
        deletearray .cash_it[getarg(1)],1;
        deletearray .cash_p[getarg(1)],1;
        
    // =========== Item Edit ============ //
    } else if(getarg(0) == 3) {
        setarray .cash_it[getarg(1)],getarg(2);
        setarray .cash_p[getarg(1)],getarg(3);
        // Re-Create Shop after Edit
        npcshopitem "Dynam_Shop",.cash_it[0],.cash_p[0];
        for ( set .@s,1; .@s < getarraysize(.cash_it); set .@s,.@s + 1) 
                npcshopadditem "Dynam_Shop",.cash_it[.@s],.cash_p[.@s];
                
    // =========== Reset Shop ============ //                
    } else if(getarg(0) == 4) {
        npcshopitem "Dynam_Shop",512,10;
        set .first,1;

    // =========== Shop Creation ============ //        
    } else if(getarg(0) == 5) {
        ShopStuff(4);
        npcshopdelitem "Dynam_Shop",512;
        // Adding pre-defined items to the shop array
        for ( set .@s,0; .@s < getarraysize(.cash_pre_it); set .@s,.@s + 1) {
            setarray .cash_it[getarraysize(.cash_it)],.cash_pre_it[.@s];
            setarray .cash_p[getarraysize(.cash_p)],.cash_pre_p[.@s];        
        }
        // Adding items to the shop
        for ( set .@s,0; .@s < getarraysize(.cash_it); set .@s,.@s + 1) 
            npcshopadditem "Dynam_Shop",.cash_it[.@s],.cash_p[.@s];
        set .first,0;
    }
    return;
}

OnInit:
set .n$,"["+strnpcinfo(1)+"]";
set .gm,80; // General Access Level
set .first,1; // First Shop Creation
set .last_id,30000; // Highest Item ID
if(getarraysize($cash_it) > 0) {
    deletearray $cash_it,128;
    deletearray $cash_p,128;
    deletearray $cash_pre_it,128;
    deletearray $cash_pre_p,128;
}
// Pre-Defined Items in the Shop, they are always in it!
setarray .cash_pre_it[0],2792,2793,2374,2375,2357,2524,2421,2115,2729;
setarray .cash_pre_p[0],100,100,100,100,100,100,100,100,100;
end;
}
-    shop    Dynam_Shop    -1,512:-1

 

Edited by srhmike
codebox

8 answers to this question

Recommended Posts

  • 0
Posted

as @Technoken said use code box, 

as he mentioned its easy to make npc's with diff item id's 

understand better i am giving some examples 

prontera,162,182,1	itemshop	Emperium	494,512,714:10

in the above shop need 512 as requirement to sell items

you can change the item id and make number of shops as u need you can aslo use pointshop,cashshop, as well for your requirement 

  • Upvote 1
  • 0
Posted
8 minutes ago, pinyinhuo said:

Thank you so much @Cyro and @Technoken.

is it possible i could use a gold coin/mithril coin when buying in those shops?

prontera,162,182,1	itemshop	Emperium	494,7720,714:10

for gold coin

prontera,162,182,1	itemshop	Emperium	494,674,714:10

for mythril coin 

  • Upvote 1
  • 0
Posted
12 hours ago, Cyro said:

prontera,162,182,1	itemshop	Emperium	494,7720,714:10

for gold coin


prontera,162,182,1	itemshop	Emperium	494,674,714:10

for mythril coin 

@Cyro, Thank you for your never ending support! it worked like magic! <3

  • 0
Posted
24 minutes ago, pinyinhuo said:

Hello, can this appear as gold coin's aswell? sry!!!! ._.

gold shop.jpg

which?

its already gold coin shop

prontera,162,182,1 itemshop Emperium3 494,7720,714:10

  • 0
Posted (edited)
5 hours ago, Cyro said:

which?

its already gold coin shop

prontera,162,182,1 itemshop Emperium3 494,7720,714:10

I mean the (red colored message) "You do not have enough Kafra Credit Points." can be changed to something like "You do not have enough Gold Coin." thank you so much @Cyrofor quick response. :)

Edited by pinyinhuo

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...