Jump to content

hikashin-rae

Members
  • Posts

    208
  • Joined

  • Last visited

  • Days Won

    2

Posts posted by hikashin-rae

  1. On 8/9/2021 at 9:12 AM, Eross said:

    Hi ! Im using @whosell and @whobuy on my old server .. apparently something has change since we upgraded to latest rathena ... 

     

    errors are coming since then .. Please help heres my source codes 

     

    Index: atcommand.c
    ===================================================================
    --- atcommand.c	(revision 16082)
    +++ atcommand.c	(working copy)
    @@ -8473,6 +8473,69 @@
     	return 0;
     }
     
    +/*==========================================
    +* @whobuys - List who is buying the item (amount, price, and location).
    +* remake by VoidLess, original by zephyrus_cr
    +* re-edit by deathscythe to work in rAthena
    +*------------------------------------------*/
    +ACMD_FUNC(whobuys)
    +{
    +    char item_name[100];
    +    int item_id, j, count = 0, sat_num = 0;
    +    bool flag = 0; // place dot on the minimap?
    +    struct map_session_data* pl_sd;
    +    struct s_mapiterator* iter;
    +    unsigned int MinPrice = battle_config.vending_max_value, MaxPrice = 0;
    +    struct item_data *item_data;
    +
    +    nullpo_retr(-1, sd);
    +    memset(item_name, '\0', sizeof(item_name));
    +
    +    if (!message || !*message || sscanf(message, "%99[^\n]", item_name) < 1) {
    +        clif_displaymessage(fd, "Input item name or ID (use: @whobuys <name or ID>).");
    +        return -1;
    +    }
    +    if ((item_data = itemdb_searchname(item_name)) == NULL &&
    +        (item_data = itemdb_exists(atoi(item_name))) == NULL)
    +    {
    +        clif_displaymessage(fd, msg_txt(sd, 19)); // Invalid item ID or name.
    +        return -1;
    +    }
    +
    +    item_id = item_data->nameid;
    +
    +    iter = mapit_getallusers();
    +    for( pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter) )
    +    {
    +        if( pl_sd->buyer_id ) //check if player is autobuying
    +        {
    +			for (j = 0; j < pl_sd->buyingstore.slots; j++) {
    +				if(pl_sd->buyingstore.items[j].nameid == item_id) {
    +					snprintf(atcmd_output, CHAT_SIZE_MAX, "ID: %d | Price: %d z | Amount: %d | Buyer: %s | Location: %s (%d,%d)"
    +					,pl_sd->buyingstore.items[j].nameid
    +					,pl_sd->buyingstore.items[j].price
    +					,pl_sd->buyingstore.items[j].amount
    +					,pl_sd->status.name
    +					,mapindex_id2name(pl_sd->mapindex)
    +					,pl_sd->bl.x, pl_sd->bl.y);
    +					if(pl_sd->buyingstore.items[j].price < MinPrice) MinPrice = pl_sd->buyingstore.items[j].price;
    +					if(pl_sd->buyingstore.items[j].price > MaxPrice) MaxPrice = pl_sd->buyingstore.items[j].price;
    +                    clif_displaymessage(fd, atcmd_output);
    +                    count++;
    +                    flag = 1;
    +                }
    +            }
    +            if(flag && pl_sd->mapindex == sd->mapindex){
    +                clif_viewpoint(sd, 1, 1, pl_sd->bl.x, pl_sd->bl.y, ++sat_num, 0xFFFFFF);
    +                flag = 0;
    +            }
    +        }
    +    }
    +    mapit_free(iter);
    +
    +    if(count > 0) {
    +        snprintf(atcmd_output,CHAT_SIZE_MAX, "Found %d ea. Prices from %dz to %dz", count, MinPrice, MaxPrice);
    +        clif_displaymessage(fd, atcmd_output);
    +    } else
    +        clif_displaymessage(fd, "Nobody buying it now.");
    +
    +    return 0;
    +}
    +
     /**
      * Fills the reference of available commands in atcommand DBMap
      **/
    @@ -8717,6 +8780,7 @@
     		ACMD_DEF(charcommands),
     		ACMD_DEF(font),
     		ACMD_DEF(accinfo),
    +		ACMD_DEF(whobuys),
     		/**
     		 * For Testing Purposes, not going to be here after we're done.
     		 **/
    
    
    
    
    
    diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp
    index cab676cce..b7456cda7 100644
    --- a/src/map/atcommand.cpp
    +++ b/src/map/atcommand.cpp
    @@ -8395,6 +8395,152 @@ ACMD_FUNC(mapflag) {
     	return 0;
     }
     
    +/*==========================================
    +* @whosells - List who is vending the item (amount, price, and location).
    +* ported to work in latest rA [Cookie]
    +*------------------------------------------*/
    +ACMD_FUNC(whosells)
    +{
    +   char item_name[100];
    +   int item_id = 0, j, count = 0, sat_num = 0;
    +   int s_type = 1; // search bitmask: 0-name,1-id, 2-card, 4-refine
    +   int refine = 0,card_id = 0;
    +   bool flag = 0; // place dot on the minimap?
    +   struct map_session_data* pl_sd;
    +   struct s_mapiterator* iter;
    +   unsigned int MinPrice = battle_config.vending_max_value, MaxPrice = 0;
    +   struct item_data *item_data;
    +   nullpo_retr(-1, sd);
    +
    +
    +   if (!message || !*message) {
    +    clif_displaymessage(fd, "Use: @whosells (<+refine> )(<item_id>)(<[card_id]>) or @whosells <name>");
    +    return -1;
    +   }
    +   if (sscanf(message, "+%d %d[%d]", &refine, &item_id, &card_id) == 3){
    +    s_type = 1+2+4;
    +   }
    +   else if (sscanf(message, "+%d %d", &refine, &item_id) == 2){
    +    s_type = 1+4;
    +   }
    +   else if (sscanf(message, "+%d [%d]", &refine, &card_id) == 2){
    +    s_type = 2+4;
    +   }
    +   else if (sscanf(message, "%d[%d]", &item_id, &card_id) == 2){
    +    s_type = 1+2;
    +   }
    +   else if (sscanf(message, "[%d]", &card_id) == 1){
    +    s_type = 2;
    +   }
    +   else if (sscanf(message, "+%d", &refine) == 1){
    +    s_type = 4;
    +   }
    +   else if (sscanf(message, "%d", &item_id) == 1 && item_id == atoi(message)){
    +    s_type = 1;
    +   }
    +   else if (sscanf(message, "%99[^\n]", item_name) == 1){
    +    s_type = 1;
    +    if ((item_data = itemdb_searchname(item_name)) == NULL){
    +	    clif_displaymessage(fd, "Not found item with this name");
    +	    return -1;
    +    }
    +    item_id = item_data->nameid;
    +   }
    +   else {
    +    clif_displaymessage(fd, "Use: @whosells (<+refine> )(<item_id>)(<[card_id]>) or @whosells <name>");
    +    return -1;
    +   }
    +
    +   //check card
    +   if(s_type & 2 && ((item_data = itemdb_exists(card_id)) == NULL || item_data->type != IT_CARD)){
    +    clif_displaymessage(fd, "Not found a card with than ID");
    +    return -1;
    +   }
    +   //check item
    +   if(s_type & 1 && (item_data = itemdb_exists(item_id)) == NULL){
    +    clif_displaymessage(fd, "Not found an item with than ID");
    +    return -1;
    +   }
    +   //check refine
    +   if(s_type & 4){
    +    if (refine<0 || refine>10){
    +	    clif_displaymessage(fd, "Refine out of bounds: 0 - 10");
    +	    return -1;
    +    }
    +    /*if(item_data->type != IT_WEAPON && item_data->type != IT_ARMOR){
    +	    clif_displaymessage(fd, "Use refine only with weapon or armor");
    +	    return -1;
    +    }*/
    +   }
    +   iter = mapit_getallusers();
    +   
    +   for( pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter) )
    +   {
    +    if( pl_sd->vender_id ) //check if player is vending
    +    {
    +	    for (j = 0; j < pl_sd->vend_num; j++) {
    +		    if((item_data = itemdb_exists(pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid)) == NULL)
    +			    continue;
    +		    if(s_type & 1 && pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid != item_id)
    +			    continue;
    +    		if(s_type & 2 && ((item_data->type != IT_ARMOR && item_data->type != IT_WEAPON) ||
    +                    (pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[0] != card_id &&
    +                    pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[1] != card_id &&
    +                    pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[2] != card_id &&
    +                    pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[3] != card_id)))
    +                continue;
    +            if(s_type & 4 && ((item_data->type != IT_ARMOR && item_data->type != IT_WEAPON) || pl_sd->cart.u.items_cart[pl_sd->vending[j].index].refine != refine))
    +                continue;
    +            if(item_data->type == IT_ARMOR)
    +                snprintf(atcmd_output, CHAT_SIZE_MAX, "Refine: +%d | ID: %d | Card: [%d] | Price: %d z | Amount: %d  | Seller: %s | Location: %s (%d,%d)"
    +					 ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].refine
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[0]
    +                    ,pl_sd->vending[j].value
    +                    ,pl_sd->vending[j].amount
    +                    ,pl_sd->status.name
    +                    ,mapindex_id2name(pl_sd->mapindex)
    +                    ,pl_sd->bl.x,pl_sd->bl.y);
    +            else if(item_data->type == IT_WEAPON)
    +                snprintf(atcmd_output, CHAT_SIZE_MAX, "Refine: +%d | ID: %d | Cards: [%d,%d,%d,%d] | Price: %d z | Amount: %d | Seller: %s | Location: %s (%d,%d)"
    +					 ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].refine
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[0]
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[1]
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[2]
    +                    ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[3]
    +                    ,pl_sd->vending[j].value
    +                    ,pl_sd->vending[j].amount
    +                    ,pl_sd->status.name
    +                    ,mapindex_id2name(pl_sd->mapindex)
    +                    ,pl_sd->bl.x,pl_sd->bl.y);
    +            else
    +                snprintf(atcmd_output, CHAT_SIZE_MAX, "ID: %d | Price: %d z | Amount: %d | Seller: %s | Location: %s (%d,%d)"
    +					 ,pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid
    +                    ,pl_sd->vending[j].value
    +                    ,pl_sd->vending[j].amount
    +					 ,pl_sd->status.name
    +                    ,mapindex_id2name(pl_sd->mapindex)
    +                    ,pl_sd->bl.x, pl_sd->bl.y);                
    +            if(pl_sd->vending[j].value < MinPrice) MinPrice = pl_sd->vending[j].value;
    +            if(pl_sd->vending[j].value > MaxPrice) MaxPrice = pl_sd->vending[j].value;
    +            clif_displaymessage(fd, atcmd_output);
    +            count++;
    +            flag = 1;
    +    		}
    +            if (flag && pl_sd->mapindex == sd->mapindex) {
    +			//if (flag && pl_sd->bl.m == sd->bl.m) {
    +                clif_viewpoint(sd, 1, 1, pl_sd->bl.x, pl_sd->bl.y, ++sat_num, 0xFFFFFF);
    +                flag = 0;
    +            }
    +        }
    +    }
    +    mapit_free(iter);
    +    if(count > 0) {
    +        snprintf(atcmd_output, CHAT_SIZE_MAX, "Found %d ea. Prices from %dz to %dz.", count, MinPrice, MaxPrice);
    +    clif_displaymessage(fd, atcmd_output);
    +   } else
    +    clif_displaymessage(fd, "Nobody is selling it now.");
    +   return 0;
    +}
    +
     /*===================================
      * Remove some messages
      *-----------------------------------*/
    @@ -10593,6 +10739,7 @@ void atcommand_basecommands(void) {
     		ACMD_DEFR(channel,ATCMD_NOSCRIPT),
     		ACMD_DEF(fontcolor),
     		ACMD_DEF(langtype),
    +		ACMD_DEF(whosells),
     #ifdef VIP_ENABLE
     		ACMD_DEF(vip),
     		ACMD_DEF(showrate),

    whobuy_whosell.patch 10.2 kB · 7 downloads

    I already update my whosell on git try to test it out and give me feedback thank you.  https://github.com/coookie1010/Server-Patches/blob/main/rA-whosell.patch

    • Upvote 1
  2. Sorry for late share.

    I think this is the one you are looking for. I already added the feature you like.
    https://github.com/coookie1010/Server-Patches/commit/02498a59983d7c1fdbfd56a69b33297e73320b14

     

     

    On 12/23/2020 at 2:46 PM, EveeX said:

    Try putting this in pc.cpp function in pc_setpos

    
    	if (strncmp(mapdata->name, "map", strlen(mapdata->name)) == 0) { // in "map" choose the map what you prefeer
    			sd->state.pk = 1;
    	}

    This method is so much harder than the mapflag function.


    you can force a map with mapflag function for example
    prontera mapflag pkarea
     

    • Upvote 1
  3. On 1/29/2021 at 6:23 PM, Haruka Mayumi said:

    No problem.. just a reminder that if you are using cookie-rae diff.. you will most likely encounter the bug wherein VIP accounts would not be able to login any character greater than first slot which is kind of worse than the bug of the previous source modification.. They would be able to create another character if the move character is enabled, they will simply move the first slot character and then create another character on first slot.. 

    Thanks for this explanation. I will add your diff also in vip account fix. 

    i already update in my git.

  4. On 1/19/2021 at 4:37 PM, Chasewalk said:

            if (gettimetick(0) < #GOLDROOM_CD) {

     

    10 minutes ago, kalabasa said:

    when you die or re enter the goldroom the cooldown will start right away

    It is not my code it was from chasewalk. maybe the set value is keeping him reset.

  5. On 1/23/2021 at 9:21 AM, Frost Diver said:

    hello, just tried the script. but i think it got bug where it's always jumped to the same vendor. when i type the command using the item ID or any item ID that are not sell by any vendors, it's still jumped me to the same vendor

    This is from your script request released i just make it works on latest.

    On 1/23/2021 at 9:21 AM, Frost Diver said:

    hello, just tried the script. but i think it got bug where it's always jumped to the same vendor. when i type the command using the item ID or any item ID that are not sell by any vendors, it's still jumped me to the same vendor

    The creator did something on the code why it jump even no one sells. 
    I have a fix code for this and a working correctly.

  6. On 11/30/2020 at 8:23 AM, Gidz Cross said:

    Can someone help me make a checker for @pk command? Or make some script to the the pk state into 1. Thanks!

     

    On 11/30/2020 at 8:23 AM, Gidz Cross said:

    Selected maps?
    ~ Yes. Selected maps. Like PVP Room for example. Imagine player set his pk state to off and warp to pvp room. Players wont be able to attack that guy.

    I already revamp change the script of this base on your explanation if you need just notify me.
     

  7. You can try this 

    set .@time,gettimetick(1);
    		if( .@time1 < #GOLDROOM_CD1 ){
                mes "[ ^C6A518Gold Room Assistant^000000 ]";
                mes "You can only re-enter after ^FF0000"+#GOLDROOM_CD1+"^000000 seconds.";
                mes "Time Gold Room : "+#GOLDROOM_CD1;
                close;
                cutin "",255;
                end;
            }
    		 else if (Zeny < .zeny) {
                mes "[ ^C6A518Gold Room Assistant^000000 ]";
                mes "Sorry, but you can't enter the room.";
                close2;
                cutin "",255;
                end;
            }
            else {
                set #GOLDROOM_CD1,( .@time1 + ( 3600 * 12 ) ); // 12 hours cooldown.
                deltimer strnpcinfo(3)+"::OnKick";
            }
    		Zeny -= .zeny;
            warp "ordeal_1-2",151,154;
            end;

    Screen Shot

    image.png.dc89142026f3a3b03143af3e2774dc35.png

     

    On 1/19/2021 at 8:29 PM, Chasewalk said:

    same bro not to change time.

     

     

×
×
  • Create New...