Hi peoples, i bad speak to English! I have problems to SRC Vending 11 lvl! 1)
4>..\src\map\clif.c(15546): error C2065: USESKILL_FAIL_LEVEL: необъявленный идентификатор
2)
4>..\src\map\skill.c(10091): error C2065: USESKILL_FAIL_LEVEL: необъявленный идентификатор
4>..\src\map\skill.c(10091): error C2198: clif_skill_fail: слишком мало аргументов для вызова
4>..\src\map\skill.c(10104): error C2065: USESKILL_FAIL_LEVEL: необъявленный идентификатор
3)
4>..\src\map\vending.c(224): error C2065: LOG_TYPE_VENDING: необъявленный идентификатор
4>..\src\map\vending.c(224): warning C4047: функция: "char *" отличается по уровням косвенного обращения от "int"
4>..\src\map\vending.c(224): warning C4024: log_zeny: различные типы для формального и фактического параметров 2
I have to 3ceam To mod:
[spoiler]Index: conf/battle/feature.conf
===================================================================
--- conf/battle/feature.conf (revision 15154)
+++ conf/battle/feature.conf (working copy)
@@ -26,3 +26,12 @@
// Search stores (Note 1)
// Requires: 2010-08-03aRagexeRE or later
feature.search_stores: on
+
+// Enable or disable extended vending system? (Note 1)
+extended_vending: yes
+// Show currency's name in vending board? (Note 1)
+show_item_vending: yes
+// Show more info about buying? (Note 1)
+ex_vending_info: yes
+// Item ID for Zeny. Set to 0 if you don't want use Zeny.
+item_zeny: 30000
\ No newline at end of file
Index: conf/msg_athena.conf
===================================================================
--- conf/msg_athena.conf (revision 15154)
+++ conf/msg_athena.conf (working copy)
@@ -535,5 +535,16 @@
//...
650: Unknown Job
+// Extended Vending system
+700: You do not have enough CashPoint
+701: You do not have enough items
+702: Seller has not enough space in your inventory
+703: Seller can not take all the item
+704: You have selected: %s
+705: You've opened %s's shop. Sale is carried out: %s
+706: Current Currency: %s
+707: %s has bought '%s' in the amount of %d. Revenue: %d %s
+708: Full revenue from %s is %d %s
+
//Custom translations
import: conf/import/msg_conf.txt
Index: db/item_db2.txt
===================================================================
--- db/item_db2.txt (revision 15154)
+++ db/item_db2.txt (working copy)
@@ -61,3 +61,6 @@
//==================================================================
//2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,0xFFFFFFFE,7,0,16,,0,1,0,{},{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
//7170,Tuxedo,Tuxedo,5,43000,,10,,0,,0,0xFFFFFFFE,7,1,16,,0,1,0,{},{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
+
+// Vending system
+30000,Zeny,Zeny,3,,10,10,,,,,,,,,,,,,{},{},{}
\ No newline at end of file
Index: db/item_vending.txt
===================================================================
--- db/item_vending.txt (revision 0)
+++ db/item_vending.txt (working copy)
@@ -0,0 +1,11 @@
+// Specific items for Vending System
+// Format: ItemID
+
+// TCG Card
+7227
+// Mithril Coin
+// 674
+// Silver Coin
+// 675
+// Bronze Coin
+// 673
\ No newline at end of file
Index: db/skill_db.txt
===================================================================
--- db/skill_db.txt (revision 15154)
+++ db/skill_db.txt (working copy)
@@ -83,7 +83,7 @@
38,0,0,0,0,0,0,10,0,no,0,0,0,none,0, MC_OVERCHARGE,Overcharge
39,1,0,0,0,0,0,10,0,no,0,0,0,none,0, MC_PUSHCART,Pushcart
40,1,6,4,0,0x1,0,1,1,no,0,0,0,none,0, MC_IDENTIFY,Item Appraisal
-41,1,6,4,0,0x1,0,10,1,no,0,0,0,none,0, MC_VENDING,Vending
+41,1,6,4,0,0x1,0,11,1,no,0,0,0,none,0, MC_VENDING,Vending
42,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0, MC_MAMMONITE,Mammonite
43,0,0,0,0,0,0,10,0,no,0,0,0,none,0, AC_OWL,Owl's Eye
44,0,0,0,0,0,0,10,0,no,0,0,0,none,0, AC_VULTURE,Vulture's Eye
Index: db/skill_tree.txt
===================================================================
--- db/skill_tree.txt (revision 15154)
+++ db/skill_tree.txt (working copy)
@@ -79,7 +79,7 @@
5,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
5,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
5,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-5,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+5,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
5,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
5,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
5,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -210,7 +210,7 @@
10,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
10,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
10,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-10,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+10,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
10,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
10,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
10,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -486,7 +486,7 @@
18,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
18,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
18,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-18,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+18,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
18,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
18,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
18,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -658,7 +658,7 @@
23,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
23,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
23,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-23,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+23,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
23,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
23,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
23,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
@@ -807,7 +807,7 @@
4006,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4006,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4006,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4006,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4006,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4006,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4006,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
4006,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -955,7 +955,7 @@
4011,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4011,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4011,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4011,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4011,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4011,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4011,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
4011,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -1276,7 +1276,7 @@
4019,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4019,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4019,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4019,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4019,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4019,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4019,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
4019,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -1507,7 +1507,7 @@
4028,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4028,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4028,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4028,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4028,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4028,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4028,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
4028,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -1642,7 +1642,7 @@
4033,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4033,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4033,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4033,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4033,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4033,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4033,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
4033,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -1926,7 +1926,7 @@
4041,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4041,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4041,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4041,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4041,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4041,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4041,153,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#Cart Revolution#
4041,154,1,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#Change Cart#
@@ -2095,7 +2095,7 @@
4045,38,10,37,3,0,0,0,0,0,0,0,0 //MC_OVERCHARGE#Overcharge#
4045,39,10,36,5,0,0,0,0,0,0,0,0 //MC_PUSHCART#Pushcart#
4045,40,1,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#Item Appraisal#
-4045,41,10,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
+4045,41,11,39,3,0,0,0,0,0,0,0,0 //MC_VENDING#Vending#
4045,42,10,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#Mammonite#
4045,43,10,0,0,0,0,0,0,0,0,0,0 //AC_OWL#Owl's Eye#
4045,44,10,43,3,0,0,0,0,0,0,0,0 //AC_VULTURE#Vulture's Eye#
Index: src/map/battle.c
===================================================================
--- src/map/battle.c (revision 15154)
+++ src/map/battle.c (working copy)
@@ -4023,6 +4023,11 @@
{ "bg_magic_attack_damage_rate", &battle_config.bg_magic_damage_rate, 60, 0, INT_MAX, },
{ "bg_misc_attack_damage_rate", &battle_config.bg_misc_damage_rate, 60, 0, INT_MAX, },
{ "bg_flee_penalty", &battle_config.bg_flee_penalty, 20, 0, INT_MAX, },
+// Extended Vending system
+ { "extended_vending", &battle_config.extended_vending, 1, 0, 1, },
+ { "show_item_vending", &battle_config.show_item_vending, 1, 0, 1, },
+ { "ex_vending_info", &battle_config.ex_vending_info, 1, 0, 1, },
+ { "item_zeny", &battle_config.item_zeny, 0, 0, MAX_ITEMDB, },
};
Index: src/map/battle.h
===================================================================
--- src/map/battle.h (revision 15154)
+++ src/map/battle.h (working copy)
@@ -497,6 +497,12 @@
int bg_magic_damage_rate;
int bg_misc_damage_rate;
int bg_flee_penalty;
+
+ // Extended Vending system
+ int extended_vending;
+ int show_item_vending;
+ int ex_vending_info;
+ int item_zeny;
} battle_config;
void do_init_battle(void);
Index: src/map/clif.c
===================================================================
--- src/map/clif.c (revision 15154)
+++ src/map/clif.c (working copy)
@@ -5280,7 +5280,24 @@
clif_notify_playerchat(sd, buf);
}
+void clif_displaymessagecolor(struct map_session_data *sd, const char* msg, unsigned long color)
+{
+ int fd;
+ unsigned short len = strlen(msg) + 1;
+ nullpo_retv(sd);
+
+ color = (color & 0x0000FF) << 16 | (color & 0x00FF00) | (color & 0xFF0000) >> 16; // RGB to BGR
+ fd = sd->fd;
+ WFIFOHEAD(fd, len+12);
+ WFIFOW(fd,0) = 0x2C1;
+ WFIFOW(fd,2) = len+12;
+ WFIFOL(fd,4) = 0;
+ WFIFOL(fd,8) = color;
+ memcpy(WFIFOP(fd,12), msg, len);
+ WFIFOSET(fd, WFIFOW(fd,2));
+}
+
/// Send broadcast message in yellow or blue without font formatting (ZC_BROADCAST).
/// 009a <packet len>.W <message>.?B
void clif_broadcast(struct block_list* bl, const char* mes, int len, int type, enum send_target target)
@@ -11015,7 +11032,7 @@
/// 01ae <name id>.W
void clif_parse_SelectArrow(int fd,struct map_session_data *sd)
{
- if (sd->menuskill_id != AC_MAKINGARROW)
+ if (sd->menuskill_id != AC_MAKINGARROW && sd->menuskill_id != MC_VENDING)
return;
if (pc_istrading(sd)) {
//Make it fail to avoid shop exploits where you sell something different than you see.
@@ -11023,7 +11040,14 @@
sd->menuskill_val = sd->menuskill_id = 0;
return;
}
- skill_arrow_create(sd,RFIFOW(fd,2));
+ switch( sd->menuskill_id ) {
+ case AC_MAKINGARROW:
+ skill_arrow_create(sd,RFIFOW(fd,2));
+ break;
+ case MC_VENDING: // Extended Vending system
+ skill_vending(sd,RFIFOW(fd,2));
+ break;
+ }
sd->menuskill_val = sd->menuskill_id = 0;
}
@@ -11701,11 +11725,18 @@
/// 1 = open
void clif_parse_OpenVending(int fd, struct map_session_data* sd)
{
+ struct item_data *item = itemdb_exists(sd->vend_loot);
short len = (short)RFIFOW(fd,2) - 85;
const char* message = (char*)RFIFOP(fd,4);
bool flag = (bool)RFIFOB(fd,84);
const uint8* data = (uint8*)RFIFOP(fd,85);
+ char out_msg[1024];
+ if(battle_config.extended_vending && battle_config.show_item_vending && sd->vend_loot && item->nameid != ITEMID_ZENY){
+ memset(out_msg, '\0', sizeof(out_msg));
+ strcat(strcat(strcat(strcat(out_msg,"["),item->jname),"] "),message);
+ }
+
if( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM )
return;
if( map[sd->bl.m].flag.novending ) {
@@ -11719,7 +11750,10 @@
if( message[0] == '\0' ) // invalid input
return;
- vending_openvending(sd, message, flag, data, len/8);
+ if(battle_config.extended_vending && battle_config.show_item_vending && sd->vend_loot && item->nameid != ITEMID_ZENY)
+ vending_openvending(sd, out_msg, flag, data, len/8);
+ else
+ vending_openvending(sd, message, flag, data, len/8);
}
@@ -15778,7 +15812,43 @@
ShowDump(RFIFOP(fd,0), packet_len);
}
+// Extended Vending system
+int clif_vend(struct map_session_data *sd, int skill_lv)
+{
+ struct item_data *item;
+ int c, i, d = 0;
+ int fd;
+ nullpo_ret(sd);
+
+ fd = sd->fd;
+
+ WFIFOHEAD(fd, 8 * 8 + 8);
+ WFIFOW(fd,0) = 0x1ad;
+ if(battle_config.item_zeny){
+ WFIFOW(fd, d * 2 + 4) = ITEMID_ZENY;
+ d++;
+ }
+ for( c = d, i = 0; i < ARRAYLENGTH(item_vend); i ++ ) {
+
+ if((item = itemdb_exists(item_vend[i].itemid)) != NULL && item->nameid != ITEMID_ZENY){
+ WFIFOW(fd, c * 2 + 4) = item->nameid;
+ c++;
+ }
+ }
+ if( c > 0 ) {
+ sd->menuskill_id = MC_VENDING;
+ sd->menuskill_val = skill_lv;
+ WFIFOW(fd,2) = c * 2 + 4;
+ WFIFOSET(fd, WFIFOW(fd, 2));
+ } else {
+ clif_skill_fail(sd,MC_VENDING,USESKILL_FAIL_LEVEL,0);
+ return 0;
+ }
+
+ return 1;
+}
+
/// Main client packet processing function
static int clif_parse(int fd)
{
Index: src/map/clif.h
===================================================================
--- src/map/clif.h (revision 15154)
+++ src/map/clif.h (working copy)
@@ -561,6 +561,7 @@
void clif_notify_chat(struct block_list* bl, const char* message, send_target target);
void clif_notify_playerchat(struct map_session_data* sd, const char* message);
void clif_displaymessage(const int fd, const char* mes);
+void clif_displaymessagecolor(struct map_session_data *sd, const char* msg, unsigned long color);
void clif_displayformatted(struct map_session_data* sd, const char* fmt, ...);
void clif_disp_onlyself(struct map_session_data *sd, const char *mes, int len);
void clif_disp_message(struct block_list* src, const char* mes, int len, enum send_target target);
@@ -719,4 +720,8 @@
void clif_open_search_store_info(struct map_session_data* sd);
void clif_search_store_info_click_ack(struct map_session_data* sd, short x, short y);
+// Extended Vending system
+int clif_vend(struct map_session_data *sd, int skill_lv);
+#define VEND_COLOR 0x00FFFF // Cyan
+
#endif /* _CLIF_H_ */
Index: src/map/itemdb.c
===================================================================
--- src/map/itemdb.c (revision 15154)
+++ src/map/itemdb.c (working copy)
@@ -689,7 +689,29 @@
return true;
}
+// Extended Vending system
+static bool itemdb_read_vending(char* fields[], int columns, int current)
+{
+ struct item_data* id;
+ int nameid;
+ nameid = atoi(fields[0]);
+ if( ( id = itemdb_exists(nameid) ) == NULL )
+ {
+ ShowWarning("itemdb_read_vending: Invalid item id %d.\n", nameid);
+ return false;
+ }
+
+ if( id->type == IT_ARMOR || id->type == IT_WEAPON )
+ {
+ ShowWarning("itemdb_read_vending: item id %d cannot be equipment or weapon.\n", nameid);
+ return false;
+ }
+
+ item_vend[current].itemid = nameid;
+ return true;
+}
+
/*======================================
* Applies gender restrictions according to settings. [Skotlex]
*======================================*/
@@ -1007,6 +1029,7 @@
sv_readdb(db_path, "item_trade.txt", ',', 3, 3, -1, &itemdb_read_itemtrade);
sv_readdb(db_path, "item_delay.txt", ',', 2, 2, MAX_ITEMDELAYS, &itemdb_read_itemdelay);
sv_readdb(db_path, "item_buyingstore.txt", ',', 1, 1, -1, &itemdb_read_buyingstore);
+ sv_readdb(db_path, "item_vending.txt", ',', 1, 1, ARRAYLENGTH(item_vend), &itemdb_read_vending); // Extended Vending system
}
/*==========================================
@@ -1059,6 +1082,7 @@
itemdb_other->clear(itemdb_other, itemdb_final_sub);
memset(itemdb_array, 0, sizeof(itemdb_array));
+ memset(item_vend,0,sizeof(item_vend)); // Extended Vending system
// read new data
itemdb_read();
Index: src/map/itemdb.h
===================================================================
--- src/map/itemdb.h (revision 15154)
+++ src/map/itemdb.h (working copy)
@@ -6,6 +6,9 @@
#include "../common/mmo.h" // ITEM_NAME_LENGTH
+// 32k array entries in array (the rest goes to the db)
+#define MAX_ITEMDB 0x8000
+
#define MAX_RANDITEM 11000
// The maximum number of item delays
@@ -92,6 +95,12 @@
int qty; //Counts amount of items in the group.
};
+struct s_item_vend {
+ int itemid;
+};
+
+struct s_item_vend item_vend[MAX_INVENTORY];
+
struct item_data* itemdb_searchname(const char *name);
int itemdb_searchname_array(struct item_data** data, int size, const char *str);
struct item_data* itemdb_load(int nameid);
@@ -149,4 +158,7 @@
void do_final_itemdb(void);
int do_init_itemdb(void);
+// Extended Vending system
+#define ITEMID_ZENY battle_config.item_zeny
+
#endif /* _ITEMDB_H_ */
Index: src/map/pc.h
===================================================================
--- src/map/pc.h (revision 15154)
+++ src/map/pc.h (working copy)
@@ -424,6 +424,10 @@
// temporary debugging of bug #3504
const char* delunit_prevfile;
int delunit_prevline;
+
+ // Extended Vending system
+ int vend_loot;
+ int vend_lvl;
};
//Update this max as necessary. 55 is the value needed for Super Baby currently
Index: src/map/skill.c
===================================================================
--- src/map/skill.c (revision 15154)
+++ src/map/skill.c (working copy)
@@ -10,6 +10,7 @@
#include "../common/utils.h"
#include "../common/ers.h"
+#include "atcommand.h" // get_atcommand_level()
#include "skill.h"
#include "map.h"
#include "path.h"
@@ -4332,8 +4333,40 @@
{ //Prevent vending of GMs with unnecessary Level to trade/drop. [Skotlex]
if ( !pc_can_give_items(pc_isGM(sd)) )
clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
- else
- clif_openvendingreq(sd,2+skilllv);
+ else {
+ if(battle_config.extended_vending && skilllv > 10){
+ struct item_data *item;
+
+ char output[1024];
+ int c = 0, i, d = 0;
+ sd->vend_lvl = skilllv;
+
+ if(battle_config.item_zeny)
+ d++;
+
+ for( c = d, i = 0; i < ARRAYLENGTH(item_vend); i ++ ) {
+ if((item = itemdb_exists(item_vend[i].itemid)) != NULL && item->nameid != ITEMID_ZENY)
+ c++;
+ }
+ if(c > 1)
+ clif_vend(sd,sd->vend_lvl);
+ else {
+ if(c) {
+ item = itemdb_exists(battle_config.item_zeny?battle_config.item_zeny:item_vend[0].itemid);
+ sd->vend_loot = item->nameid;
+ sprintf(output,msg_txt(706),itemdb_jname(sd->vend_loot));
+ clif_displaymessagecolor(sd,output,VEND_COLOR);
+ clif_openvendingreq(sd,1+sd->vend_lvl);
+ } else {
+ sd->vend_loot = 0;
+ clif_openvendingreq(sd,1+sd->vend_lvl);
+ }
+ }
+ } else {
+ sd->vend_loot = 0;
+ clif_openvendingreq(sd,2+skilllv);
+ }
+ }
}
break;
@@ -10319,6 +10352,36 @@
return 1;
}
+// Extended Vending system
+int skill_vending(struct map_session_data *sd, int nameid)
+{
+ struct item_data *item;
+ char output[1024];
+
+ nullpo_ret(sd);
+
+ if(nameid <= 0) {
+ clif_skill_fail(sd,MC_VENDING,USESKILL_FAIL_LEVEL,0);
+ return 0;
+ }
+
+ if(nameid > MAX_ITEMDB)
+ return 0;
+
+ sd->vend_loot = nameid;
+ item = itemdb_exists(nameid);
+ sprintf(output,msg_txt(704),item->jname);
+ clif_displaymessagecolor(sd,output,VEND_COLOR);
+
+ if ( !pc_can_give_items(pc_isGM(sd)) )
+ clif_skill_fail(sd,MC_VENDING,USESKILL_FAIL_LEVEL,0);
+ else {
+ clif_openvendingreq(sd,2+sd->vend_lvl);
+ }
+
+ return 0;
+}
+
/*==========================================
*
*------------------------------------------*/
Index: src/map/skill.h
===================================================================
--- src/map/skill.h (revision 15154)
+++ src/map/skill.h (working copy)
@@ -1548,4 +1548,7 @@
UNT_MAX = 0x190
};
+// Extended Vending system
+int skill_vending( struct map_session_data *sd, int nameid);
+
#endif /* _SKILL_H_ */
Index: src/map/vending.c
===================================================================
--- src/map/vending.c (revision 15154)
+++ src/map/vending.c (working copy)
@@ -47,6 +47,7 @@
void vending_vendinglistreq(struct map_session_data* sd, int id)
{
struct map_session_data* vsd;
+ char output[1024]; // Extended Vending system
nullpo_retv(sd);
if( (vsd = map_id2sd(id)) == NULL )
@@ -60,6 +61,12 @@
return;
}
+ // Extended Vending system
+ if(battle_config.extended_vending && vsd->vend_loot){
+ sprintf(output,msg_txt(705),vsd->status.name, itemdb_jname(vsd->vend_loot));
+ clif_displaymessagecolor(sd,output,VEND_COLOR);
+ }
+
sd->vended_id = vsd->vender_id; // register vending uid
clif_vendinglist(sd, id, vsd->vending);
@@ -121,16 +128,57 @@
vend_list[i] = j;
z += ((double)vsd->vending[j].value * (double)amount);
- if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
- {
- clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
- return;
- }
- if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
- {
- clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
- return;
+ // Extended Vending system
+ if(battle_config.extended_vending){
+ if(vsd->vend_loot == ITEMID_ZENY || !vsd->vend_loot) {
+ if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
+ {
+ //clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
+ return;
+ }
+ if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
+ {
+ clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
+ return;
+ }
+ } else {
+ int k, loot_count = 0, vsd_w = 0;
+ for(k = 0; k < MAX_INVENTORY; k++)
+ if(sd->status.inventory[k].nameid == vsd->vend_loot)
+ loot_count += sd->status.inventory[k].amount;
+
+ if( z > loot_count || z < 0)
+ {
+ clif_displaymessagecolor(sd,msg_txt(701),VEND_COLOR);
+ return;
+ }
+
+ if(pc_inventoryblank(vsd) <= 0)
+ {
+ clif_displaymessagecolor(sd,msg_txt(702),VEND_COLOR);
+ return;
+ }
+
+ vsd_w += itemdb_weight(vsd->vend_loot) * (int)z;
+
+ if(vsd_w + vsd->weight > vsd->max_weight)
+ {
+ clif_displaymessagecolor(sd,msg_txt(703),VEND_COLOR);
+ return;
+ }
+ }
+ } else {
+ if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
+ {
+ clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
+ return;
+ }
+ if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
+ {
+ clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
+ return;
+ }
}
w += itemdb_weight(vsd->status.cart[idx].nameid) * amount;
if( w + sd->weight > sd->max_weight )
@@ -167,20 +215,49 @@
}
}
- //Logs (V)ending Zeny [Lupus]
- log_zeny(vsd, LOG_TYPE_VENDING, sd, (int)z);
+ // Extended Vending system
+ if(battle_config.extended_vending){
+ if(vsd->vend_loot == ITEMID_ZENY || !vsd->vend_loot) {
+ //Logs (V)ending Zeny [Lupus]
+ log_zeny(vsd, LOG_TYPE_VENDING, sd, (int)z);
+ pc_payzeny(sd, (int)z);
+ if( battle_config.vending_tax )
+ z -= z * (battle_config.vending_tax/10000.);
+ pc_getzeny(vsd, (int)z);
+ } else {
+ for( i = 0; i < MAX_INVENTORY; i++)
+ if(sd->status.inventory[i].nameid == vsd->vend_loot)
+ {
+ struct item *item;
+ item = &sd->status.inventory[i];
+ pc_additem(vsd,item,(int)z);
+ }
+ pc_delitem(sd,pc_search_inventory(sd, vsd->vend_loot),(int)z,0,6);
+ }
+ } else {
+ //Logs (V)ending Zeny [Lupus]
+ log_zeny(vsd, LOG_TYPE_VENDING, sd, (int)z);
+ pc_payzeny(sd, (int)z);
+ if( battle_config.vending_tax )
+ z -= z * (battle_config.vending_tax/10000.);
- pc_payzeny(sd, (int)z);
- if( battle_config.vending_tax )
- z -= z * (battle_config.vending_tax/10000.);
- pc_getzeny(vsd, (int)z);
+ pc_getzeny(vsd, (int)z);
+ }
for( i = 0; i < count; i++ )
{
short amount = *(uint16*)(data + 4*i + 0);
short idx = *(uint16*)(data + 4*i + 2);
+ const char *item_name;
+
+ double rev = 0.;
idx -= 2;
+ if(battle_config.ex_vending_info){ // Extended Vending system
+ item_name = itemdb_jname(vsd->status.cart[idx].nameid);
+ rev = ((double)vsd->vending[vend_list[i]].value * (double)amount);
+ }
+
//Logs sold (V)ending items [Lupus]
log_pick(&vsd->bl, LOG_TYPE_VENDING, vsd->status.cart[idx].nameid, -amount, &vsd->status.cart[idx]);
log_pick( &sd->bl, LOG_TYPE_VENDING, vsd->status.cart[idx].nameid, amount, &vsd->status.cart[idx]);
@@ -195,11 +272,20 @@
if( battle_config.buyer_name )
{
char temp[256];
- sprintf(temp, msg_txt(265), sd->status.name);
+ if(battle_config.ex_vending_info) // Extended Vending system
+ sprintf(temp, msg_txt(707), sd->status.name, item_name, amount, (int)(rev -= rev * (battle_config.vending_tax/10000.)), vsd->vend_loot?itemdb_jname(vsd->vend_loot):"Zeny");
+ else
+ sprintf(temp, msg_txt(265), sd->status.name);
clif_disp_onlyself(vsd,temp,strlen(temp));
}
}
+ if(battle_config.ex_vending_info){ // Extended Vending system
+ char temp[256];
+ sprintf(temp, msg_txt(708), sd->status.name, (int)z, vsd->vend_loot?itemdb_jname(vsd->vend_loot):"Zeny");
+ clif_disp_onlyself(vsd,temp,strlen(temp));
+ }
+
// compact the vending list
for( i = 0, cursor = 0; i < vsd->vend_num; i++ )
{
[/spoiler]
Help me please!!
up