Jump to content
  • 0

Hello, Can anybody help me fix my Dynamic Shop?


pinyinhuo

Question


  • Group:  Members
  • Topic Count:  23
  • Topics Per Day:  0.01
  • Content Count:  54
  • Reputation:   0
  • Joined:  12/26/12
  • Last Seen:  

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
Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

  • Group:  Members
  • Topic Count:  27
  • Topics Per Day:  0.01
  • Content Count:  505
  • Reputation:   126
  • Joined:  04/04/16
  • Last Seen:  

Please use codebox or spoiler next time when pasting long codes.

You can use itemshop and pointshop but you would have to separate each npc with different currency.

Check this link https://github.com/rathena/rathena/blob/master/doc/script_commands.txt#L275

  • Upvote 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  8
  • Topics Per Day:  0.00
  • Content Count:  1137
  • Reputation:   290
  • Joined:  04/29/13
  • Last Seen:  

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
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  23
  • Topics Per Day:  0.01
  • Content Count:  54
  • Reputation:   0
  • Joined:  12/26/12
  • Last Seen:  

Thank you so much @Cyro and @Technoken.

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

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  8
  • Topics Per Day:  0.00
  • Content Count:  1137
  • Reputation:   290
  • Joined:  04/29/13
  • Last Seen:  

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
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  23
  • Topics Per Day:  0.01
  • Content Count:  54
  • Reputation:   0
  • Joined:  12/26/12
  • Last Seen:  

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

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  23
  • Topics Per Day:  0.01
  • Content Count:  54
  • Reputation:   0
  • Joined:  12/26/12
  • Last Seen:  

4 hours ago, pinyinhuo said:

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

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

gold shop.jpg

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  8
  • Topics Per Day:  0.00
  • Content Count:  1137
  • Reputation:   290
  • Joined:  04/29/13
  • Last Seen:  

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

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  23
  • Topics Per Day:  0.01
  • Content Count:  54
  • Reputation:   0
  • Joined:  12/26/12
  • Last Seen:  

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
Link to comment
Share on other sites

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.

×
×
  • Create New...