Improved support for enchantgrade (#5975)

Added further support for enchantgrade so that the enchantgrade is not lost during certain processes and can be accessed via script commands.
Also added missing logging support for it.
This commit is contained in:
Lemongrass3110 2021-05-30 00:44:50 +02:00 committed by GitHub
parent 5d92d1a000
commit 3a8e4ffbc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 51 additions and 11 deletions

View File

@ -2916,6 +2916,7 @@ recreate these items perfectly if they are destroyed. Here's what you get:
craftsman.
@inventorylist_expire[] - expire time (Unix time stamp). 0 means never expires.
@inventorylist_bound[] - the bound type of the items (see BOUND_* constants)
@inventorylist_enchantgrade[] - the enchantgrade of the items
@inventorylist_count - the number of items in these lists.
@inventorylist_option_id1[] - first array of random option IDs
@inventorylist_option_value1[] - first array of random option values
@ -3079,6 +3080,15 @@ Returns the count of unidentified items in the player inventory.
If <type> is true the command will identify all the unidentified items as well (default).
If <type> is false the command only returns the count of unidentified items.
---------------------------------------
*getenchantgrade()
This function will return the enchantgrade of the equipment from which the
function is called.
This function is intended for use in item scripts.
---------------------------------------
//
2,1.- End of item-related commands.
@ -7059,6 +7069,7 @@ The label "OnSellItem" sets the following arrays:
@sold_refine - refine count
@sold_attribute - if the item is broken (1) or not (0)
@sold_identify - if the item is identified (1) or not (0)
@sold_enchantgrade - enchantgrade
@sold_card1 - card slot 1
@sold_card2 - card slot 2
@sold_card3 - card slot 3

View File

@ -197,6 +197,7 @@ CREATE TABLE IF NOT EXISTS `picklog` (
`unique_id` bigint(20) unsigned NOT NULL default '0',
`map` varchar(11) NOT NULL default '',
`bound` tinyint(1) unsigned NOT NULL default '0',
`enchantgrade` tinyint unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
INDEX (`type`)
) ENGINE=MyISAM AUTO_INCREMENT=1;

View File

@ -0,0 +1,3 @@
ALTER TABLE `picklog`
`enchantgrade` tinyint unsigned NOT NULL default '0'
;

View File

@ -51,7 +51,7 @@ void auction_save(struct auction_data *auction)
return;
StringBuf_Init(&buf);
StringBuf_Printf(&buf, "UPDATE `%s` SET `seller_id` = '%d', `seller_name` = ?, `buyer_id` = '%d', `buyer_name` = ?, `price` = '%d', `buynow` = '%d', `hours` = '%d', `timestamp` = '%lu', `nameid` = '%u', `item_name` = ?, `type` = '%d', `refine` = '%d', `attribute` = '%d', `enchantgrade`",
StringBuf_Printf(&buf, "UPDATE `%s` SET `seller_id` = '%d', `seller_name` = ?, `buyer_id` = '%d', `buyer_name` = ?, `price` = '%d', `buynow` = '%d', `hours` = '%d', `timestamp` = '%lu', `nameid` = '%u', `item_name` = ?, `type` = '%d', `refine` = '%d', `attribute` = '%d', `enchantgrade` ='%d'",
schema_config.auction_db, auction->seller_id, auction->buyer_id, auction->price, auction->buynow, auction->hours, (unsigned long)auction->timestamp, auction->item.nameid, auction->type, auction->item.refine, auction->item.attribute, auction->item.enchantgrade);
for( j = 0; j < MAX_SLOTS; j++ )
StringBuf_Printf(&buf, ", `card%d` = '%u'", j, auction->item.card[j]);

View File

@ -159,7 +159,7 @@ void inter_storage_checkDB(void) {
if (SQL_ERROR == Sql_Query(sql_handle, "SELECT `id`,`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,"
"`attribute`,`card0`,`card1`,`card2`,`card3`,`option_id0`,`option_val0`,`option_parm0`,`option_id1`,`option_val1`,`option_parm1`,"
"`option_id2`,`option_val2`,`option_parm2`,`option_id3`,`option_val3`,`option_parm3`,`option_id4`,`option_val4`,`option_parm4`,"
"`expire_time`,`bound`,`unique_id`"
"`expire_time`,`bound`,`unique_id`,`enchantgrade`"
" FROM `%s` LIMIT 1;", storage_table.second->table)) {
Sql_ShowDebug(sql_handle);
}else{
@ -334,7 +334,7 @@ bool mapif_parse_itembound_retrieve(int fd)
StringBuf_Init(&buf);
// Get bound items from player's inventory
StringBuf_AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`");
StringBuf_AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`, `enchantgrade`");
for( j = 0; j < MAX_SLOTS; ++j )
StringBuf_Printf(&buf, ", `card%d`", j);
for( j = 0; j < MAX_ITEM_RDM_OPT; ++j ) {
@ -364,12 +364,13 @@ bool mapif_parse_itembound_retrieve(int fd)
SqlStmt_BindColumn(stmt, 6, SQLDT_CHAR, &item.attribute, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 7, SQLDT_UINT, &item.expire_time, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 8, SQLDT_UINT, &item.bound, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 9, SQLDT_INT8, &item.enchantgrade,0, NULL, NULL);
for( j = 0; j < MAX_SLOTS; ++j )
SqlStmt_BindColumn(stmt, 9+j, SQLDT_UINT, &item.card[j], 0, NULL, NULL);
SqlStmt_BindColumn(stmt,10+j, SQLDT_UINT, &item.card[j], 0, NULL, NULL);
for( j = 0; j < MAX_ITEM_RDM_OPT; ++j ) {
SqlStmt_BindColumn(stmt, 9+MAX_SLOTS+j*3, SQLDT_SHORT, &item.option[j].id, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 10+MAX_SLOTS+j*3, SQLDT_SHORT, &item.option[j].value, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 11+MAX_SLOTS+j*3, SQLDT_CHAR, &item.option[j].param, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 11+MAX_SLOTS+j*3, SQLDT_SHORT, &item.option[j].id, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 12+MAX_SLOTS+j*3, SQLDT_SHORT, &item.option[j].value, 0, NULL, NULL);
SqlStmt_BindColumn(stmt, 13+MAX_SLOTS+j*3, SQLDT_CHAR, &item.option[j].param, 0, NULL, NULL);
}
memset(&items, 0, sizeof(items));
while( SQL_SUCCESS == SqlStmt_NextRow(stmt) )

View File

@ -218,7 +218,7 @@ void log_pick(int id, int16 m, e_log_pick_type type, int amount, struct item* it
StringBuf buf;
StringBuf_Init(&buf);
StringBuf_Printf(&buf, "%s INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `map`, `unique_id`, `bound`", LOG_QUERY, log_config.log_pick);
StringBuf_Printf(&buf, "%s INTO `%s` (`time`, `char_id`, `type`, `nameid`, `amount`, `refine`, `map`, `unique_id`, `bound`, `enchantgrade`", LOG_QUERY, log_config.log_pick);
for (i = 0; i < MAX_SLOTS; ++i)
StringBuf_Printf(&buf, ", `card%d`", i);
for (i = 0; i < MAX_ITEM_RDM_OPT; ++i) {
@ -226,8 +226,8 @@ void log_pick(int id, int16 m, e_log_pick_type type, int amount, struct item* it
StringBuf_Printf(&buf, ", `option_val%d`", i);
StringBuf_Printf(&buf, ", `option_parm%d`", i);
}
StringBuf_Printf(&buf, ") VALUES(NOW(),'%u','%c','%u','%d','%d','%s','%" PRIu64 "','%d'",
id, log_picktype2char(type), itm->nameid, amount, itm->refine, map_getmapdata(m)->name[0] ? map_getmapdata(m)->name : "", itm->unique_id, itm->bound);
StringBuf_Printf(&buf, ") VALUES(NOW(),'%u','%c','%u','%d','%d','%s','%" PRIu64 "','%d','%d'",
id, log_picktype2char(type), itm->nameid, amount, itm->refine, map_getmapdata(m)->name[0] ? map_getmapdata(m)->name : "", itm->unique_id, itm->bound, itm->enchantgrade);
for (i = 0; i < MAX_SLOTS; i++)
StringBuf_Printf(&buf, ",'%u'", itm->card[i]);
@ -251,7 +251,7 @@ void log_pick(int id, int16 m, e_log_pick_type type, int amount, struct item* it
return;
time(&curtime);
strftime(timestring, sizeof(timestring), log_timestamp_format, localtime(&curtime));
fprintf(logfp,"%s - %d\t%c\t%u,%d,%d,%u,%u,%u,%u,%s,'%" PRIu64 "',%d\n", timestring, id, log_picktype2char(type), itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], map_getmapdata(m)->name[0]?map_getmapdata(m)->name:"", itm->unique_id, itm->bound);
fprintf(logfp,"%s - %d\t%c\t%u,%d,%d,%u,%u,%u,%u,%s,'%" PRIu64 "',%d,%d\n", timestring, id, log_picktype2char(type), itm->nameid, amount, itm->refine, itm->card[0], itm->card[1], itm->card[2], itm->card[3], map_getmapdata(m)->name[0]?map_getmapdata(m)->name:"", itm->unique_id, itm->bound, itm->enchantgrade);
fclose(logfp);
}
}

View File

@ -2135,6 +2135,7 @@ static int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short*
int key_refine = 0;
int key_attribute = 0;
int key_identify = 0;
int key_enchantgrade = 0;
int key_card[MAX_SLOTS];
int key_option_id[MAX_ITEM_RDM_OPT], key_option_val[MAX_ITEM_RDM_OPT], key_option_param[MAX_ITEM_RDM_OPT];
@ -2144,6 +2145,7 @@ static int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short*
script_cleararray_pc( sd, "@sold_refine" );
script_cleararray_pc( sd, "@sold_attribute" );
script_cleararray_pc( sd, "@sold_identify" );
script_cleararray_pc( sd, "@sold_enchantgrade" );
for( j = 0; j < MAX_SLOTS; j++ )
{// clear each of the card slot entries
@ -2176,6 +2178,7 @@ static int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short*
script_setarray_pc( sd, "@sold_refine", i, sd->inventory.u.items_inventory[idx].refine, &key_refine );
script_setarray_pc( sd, "@sold_attribute", i, sd->inventory.u.items_inventory[idx].attribute, &key_attribute );
script_setarray_pc( sd, "@sold_identify", i, sd->inventory.u.items_inventory[idx].identify, &key_identify );
script_setarray_pc( sd, "@sold_enchantgrade", i, sd->inventory.u.items_inventory[idx].enchantgrade, &key_enchantgrade );
for( j = 0; j < MAX_SLOTS; j++ )
{// store each of the cards from the equipment in the array

View File

@ -13433,6 +13433,7 @@ BUILDIN_FUNC(successremovecards) {
item_tmp.attribute = sd->inventory.u.items_inventory[i].attribute;
item_tmp.expire_time = sd->inventory.u.items_inventory[i].expire_time;
item_tmp.bound = sd->inventory.u.items_inventory[i].bound;
item_tmp.enchantgrade = sd->inventory.u.items_inventory[i].enchantgrade;
for (int j = sd->inventory_data[i]->slots; j < MAX_SLOTS; j++)
item_tmp.card[j]=sd->inventory.u.items_inventory[i].card[j];
@ -13518,6 +13519,7 @@ BUILDIN_FUNC(failedremovecards) {
item_tmp.attribute = sd->inventory.u.items_inventory[i].attribute;
item_tmp.expire_time = sd->inventory.u.items_inventory[i].expire_time;
item_tmp.bound = sd->inventory.u.items_inventory[i].bound;
item_tmp.enchantgrade = sd->inventory.u.items_inventory[i].enchantgrade;
for (int j = sd->inventory_data[i]->slots; j < MAX_SLOTS; j++)
item_tmp.card[j]=sd->inventory.u.items_inventory[i].card[j];
@ -14244,6 +14246,7 @@ BUILDIN_FUNC(getinventorylist)
}
pc_setreg(sd,reference_uid(add_str("@inventorylist_expire"), j),sd->inventory.u.items_inventory[i].expire_time);
pc_setreg(sd,reference_uid(add_str("@inventorylist_bound"), j),sd->inventory.u.items_inventory[i].bound);
pc_setreg(sd,reference_uid(add_str("@inventorylist_enchantgrade"), j),sd->inventory.u.items_inventory[i].enchantgrade);
for (k = 0; k < MAX_ITEM_RDM_OPT; k++)
{
sprintf(randopt_var, "@inventorylist_option_id%d",k+1);
@ -25092,6 +25095,22 @@ BUILDIN_FUNC(refineui){
#endif
}
BUILDIN_FUNC(getenchantgrade){
struct map_session_data *sd;
if( !script_rid2sd( sd ) ){
return SCRIPT_CMD_FAILURE;
}
if( current_equip_item_index == -1 ){
return SCRIPT_CMD_FAILURE;
}
script_pushint( st, sd->inventory.u.items_inventory[current_equip_item_index].enchantgrade );
return SCRIPT_CMD_SUCCESS;
}
#include "../custom/script.inc"
// declarations that were supposed to be exported from npc_chat.cpp
@ -25782,6 +25801,8 @@ struct script_function buildin_func[] = {
BUILDIN_DEF2(rentalcountitem, "rentalcountitem2", "viiiiiii?"),
BUILDIN_DEF2(rentalcountitem, "rentalcountitem3", "viiiiiiirrr?"),
BUILDIN_DEF(getenchantgrade, ""),
#include "../custom/script_def.inc"
{NULL,NULL,NULL},