Jump to content
  • 0

@whosell & @whobuy for new rathena


Eross

Question


  • Group:  Members
  • Topic Count:  155
  • Topics Per Day:  0.11
  • Content Count:  349
  • Reputation:   12
  • Joined:  04/05/20
  • Last Seen:  

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

  • Upvote 1
Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 1

  • Group:  Members
  • Topic Count:  3
  • Topics Per Day:  0.00
  • Content Count:  32
  • Reputation:   29
  • Joined:  09/16/20
  • Last Seen:  

20 hours ago, G-RO said:

anyone ? please help

 

 

Change

Try this

Change: item_data = itemdb_searchname(item_name)
Add: item_data = item_db.searchname(item_name)

 

  • Upvote 1
Link to comment
Share on other sites

  • 1

  • Group:  Members
  • Topic Count:  9
  • Topics Per Day:  0.00
  • Content Count:  43
  • Reputation:   2
  • Joined:  01/15/17
  • Last Seen:  

got answers from nitrous last September 8.

Quote

Change struct item_data *itemdata to std::shared_ptr<item_data> item_data

then use

Quote

item_db.find instead of itemdb_exists

 

  • Upvote 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  18
  • Topics Per Day:  0.00
  • Content Count:  208
  • Reputation:   22
  • Joined:  01/14/13
  • Last Seen:  

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

  • 0

  • Group:  Members
  • Topic Count:  155
  • Topics Per Day:  0.11
  • Content Count:  349
  • Reputation:   12
  • Joined:  04/05/20
  • Last Seen:  

11 hours ago, Cookie-rae said:

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

H thankyou sensei ! Do you also have @whobuy ??? Thankyou

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  70
  • Topics Per Day:  0.03
  • Content Count:  164
  • Reputation:   8
  • Joined:  12/30/16
  • Last Seen:  

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 · 18 downloads

 

Error occured on latest rAthena.  please see below. thanks for your help

image.thumb.png.4325109ed688c9ecf1a236feb90037bd.png

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  70
  • Topics Per Day:  0.03
  • Content Count:  164
  • Reputation:   8
  • Joined:  12/30/16
  • Last Seen:  

anyone ? please help

 

On 6/11/2022 at 12:15 AM, G-RO said:

 

Error occured on latest rAthena.  please see below. thanks for your help

image.thumb.png.4325109ed688c9ecf1a236feb90037bd.png

 

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  8
  • Topics Per Day:  0.00
  • Content Count:  91
  • Reputation:   17
  • Joined:  11/24/14
  • Last Seen:  

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