Packet cleanups - const and casts (#8422)

This commit is contained in:
Lemongrass3110 2024-06-20 14:33:47 +02:00 committed by GitHub
parent 5f16a06f2f
commit 1ca634df1d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 537 additions and 571 deletions

View File

@ -248,7 +248,7 @@ int8 buyingstore_create( map_session_data* sd, int zenylimit, unsigned char resu
Sql_ShowDebug(mmysql_handle);
StringBuf_Destroy(&buf);
clif_buyingstore_myitemlist(sd);
clif_buyingstore_myitemlist( *sd );
clif_buyingstore_entry( *sd );
idb_put(buyingstore_db, sd->status.char_id, sd);
@ -313,7 +313,7 @@ void buyingstore_open(map_session_data* sd, uint32 account_id)
}
// success
clif_buyingstore_itemlist(sd, pl_sd);
clif_buyingstore_itemlist( *sd, *pl_sd );
}
/**

View File

@ -438,7 +438,7 @@ static void cashshop_read_db( void ){
* @param item_list Array of item ID
* @return true: success, false: fail
*/
bool cashshop_buylist( map_session_data* sd, uint32 kafrapoints, int n, struct PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list ){
bool cashshop_buylist( map_session_data* sd, uint32 kafrapoints, int n, const PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list ){
uint32 totalcash = 0;
uint32 totalweight = 0;
int i,new_;

View File

@ -14,12 +14,14 @@
#include <common/mmo.hpp> // t_itemid
#include <common/timer.hpp> // ShowWarning, ShowStatus
#include "clif.hpp"
class map_session_data;
void do_init_cashshop( void );
void do_final_cashshop( void );
void cashshop_reloaddb( void );
bool cashshop_buylist( map_session_data* sd, uint32 kafrapoints, int n, struct PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list );
bool cashshop_buylist( map_session_data* sd, uint32 kafrapoints, int n, const PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list );
// Taken from AEGIS (CASH_SHOP_TAB_CODE)
enum e_cash_shop_tab : uint16{

File diff suppressed because it is too large Load Diff

View File

@ -824,7 +824,7 @@ void clif_fixpos( block_list& bl );
void clif_npcbuysell( map_session_data& sd, npc_data& nd );
void clif_buylist( map_session_data& sd, npc_data& nd );
void clif_selllist( map_session_data& sd );
void clif_npc_market_open(map_session_data *sd, struct npc_data *nd);
void clif_npc_market_open( map_session_data& sd, npc_data& nd );
void clif_parse_NPCMarketClosed(int fd, map_session_data *sd);
void clif_parse_NPCMarketPurchase(int fd, map_session_data *sd);
void clif_scriptmes( map_session_data& sd, uint32 npcid, const char *mes );
@ -927,8 +927,8 @@ void clif_skill_estimation(map_session_data *sd,struct block_list *dst);
void clif_skill_warppoint( map_session_data* sd, uint16 skill_id, uint16 skill_lv, const char* map1, const char* map2 = "", const char* map3 = "", const char* map4 = "" );
void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result );
void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result );
void clif_skill_produce_mix_list(map_session_data *sd, int skill_id, int trigger);
void clif_cooking_list(map_session_data *sd, int trigger, uint16 skill_id, int qty, int list_type);
void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger );
void clif_cooking_list( map_session_data& sd, int trigger, uint16 skill_id, int qty, int list_type );
void clif_produceeffect(map_session_data* sd,int flag, t_itemid nameid);
@ -994,9 +994,9 @@ void clif_changed_dir(struct block_list *bl, enum send_target target);
void clif_openvendingreq( map_session_data& sd, uint16 num );
void clif_showvendingboard( map_session_data& sd, enum send_target target = AREA_WOS, struct block_list* tbl = nullptr );
void clif_closevendingboard(struct block_list* bl, int fd);
void clif_vendinglist( map_session_data* sd, map_session_data* vsd );
void clif_vendinglist( map_session_data& sd, map_session_data& vsd );
void clif_buyvending( map_session_data& sd, uint16 index, uint16 amount, e_pc_purchase_result_frommc result );
void clif_openvending(map_session_data* sd, int id, struct s_vending* vending);
void clif_openvending( map_session_data& sd );
void clif_vendingreport( map_session_data& sd, uint16 index, uint16 amount, uint32 char_id, int32 zeny );
void clif_movetoattack( map_session_data& sd, block_list& bl );
@ -1238,17 +1238,17 @@ void clif_showdigit(map_session_data* sd, unsigned char type, int value);
/// Buying Store System
void clif_buyingstore_open(map_session_data* sd);
void clif_buyingstore_open_failed(map_session_data* sd, unsigned short result, unsigned int weight);
void clif_buyingstore_myitemlist(map_session_data* sd);
void clif_buyingstore_myitemlist( map_session_data& sd );
void clif_buyingstore_entry( map_session_data& sd, struct block_list* tbl = nullptr );
void clif_buyingstore_disappear_entry( map_session_data& sd, struct block_list* tbl = nullptr );
void clif_buyingstore_itemlist(map_session_data* sd, map_session_data* pl_sd);
void clif_buyingstore_itemlist( map_session_data& sd, map_session_data& pl_sd );
void clif_buyingstore_trade_failed_buyer(map_session_data* sd, short result);
void clif_buyingstore_update_item(map_session_data* sd, t_itemid nameid, unsigned short amount, uint32 char_id, int zeny);
void clif_buyingstore_delete_item(map_session_data* sd, short index, unsigned short amount, int price);
void clif_buyingstore_trade_failed_seller(map_session_data* sd, short result, t_itemid nameid);
/// Search Store System
void clif_search_store_info_ack(map_session_data* sd);
void clif_search_store_info_ack( map_session_data& sd );
void clif_search_store_info_failed(map_session_data* sd, unsigned char reason);
void clif_open_search_store_info(map_session_data* sd);
void clif_search_store_info_click_ack(map_session_data* sd, short x, short y);
@ -1368,7 +1368,7 @@ void clif_attendence_response( map_session_data *sd, int32 data );
void clif_weight_limit( map_session_data* sd );
void clif_guild_storage_log( map_session_data* sd, std::vector<struct guild_log_entry>& log, enum e_guild_storage_log result );
void clif_guild_storage_log( map_session_data& sd, std::vector<struct guild_log_entry>& log, enum e_guild_storage_log result );
void clif_camerainfo( map_session_data* sd, bool show, float range = 0.0f, float rotation = 0.0f, float latitude = 0.0f );

View File

@ -225,7 +225,6 @@
parseable_packet(0x018a,4,clif_parse_QuitGame,2);
packet(0x018b,4);
packet(0x018c,29);
packet(0x018d,-1);
parseable_packet( HEADER_CZ_REQMAKINGITEM, sizeof( struct PACKET_CZ_REQMAKINGITEM ), clif_parse_ProduceMix, 0 );
packet( HEADER_ZC_ACK_REQMAKINGITEM, sizeof( PACKET_ZC_ACK_REQMAKINGITEM ) );
parseable_packet(0x0190,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
@ -769,7 +768,6 @@
// 2005-10-10aSakexe
#if PACKETVER >= 20051010
packet(0x020e,32);
packet(0x025a,-1);
parseable_packet( HEADER_CZ_REQ_MAKINGITEM, sizeof( struct PACKET_CZ_REQ_MAKINGITEM ), clif_parse_Cooking, 0 );
#endif
@ -1533,18 +1531,14 @@
packet(0x0810,3);
parseable_packet(0x0811,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
//packet(0x0812,86);
//packet(0x0813,6);
//packet(0x0815,-1);
//packet(0x0817,-1);
//packet(0x0818,6);
//packet(0x0819,4);
#endif
// 2010-03-09aRagexeRE
#if PACKETVER >= 20100309
packet(0x0813,-1);
//packet(0x0815,6);
packet(0x0818,-1);
//packet(0x0819,10);
//packet(0x081A,4);
//packet(0x081B,4);
@ -1975,7 +1969,6 @@
parseable_packet(0x09CE,102,clif_parse_GM_Item_Monster,2);
parseable_packet(0x09D4,2,clif_parse_NPCShopClosed,0);
//NPC Market
packet(0x09D5,-1);
parseable_packet( HEADER_CZ_NPC_MARKET_PURCHASE, -1, clif_parse_NPCMarketPurchase, 0 );
packet(0x09D7,-1);
parseable_packet(0x09D8,2,clif_parse_NPCMarketClosed,0);
@ -2001,11 +1994,6 @@
packet(0x09DD,-1); // ZC_NOTIFY_STANDENTRY10
#endif
// 2014-02-05bRagexeRE
#if PACKETVER >= 20140205
packet(0x09DA,-1);
#endif
// 2014-10-08Ragexe
#if PACKETVER >= 20141008
parseable_packet(0x9FB, -1, clif_parse_pet_evolution, 2, 4); // CZ_PET_EVOLUTION

View File

@ -2274,7 +2274,7 @@ int guild_gm_changed(int guild_id, uint32 account_id, uint32 char_id, time_t tim
* @param sd Player who breaks the guild
* @param name Guild name
*/
int guild_break( map_session_data& sd, char* name ){
int guild_break( map_session_data& sd, const char* name ){
struct unit_data *ud;
int i;
#ifdef BOUND_ITEMS

View File

@ -93,7 +93,7 @@ int guild_send_message(map_session_data *sd, const char *mes, size_t len);
int guild_recv_message( int guild_id, uint32 account_id, const char *mes, size_t len );
int guild_send_dot_remove(map_session_data *sd);
int guild_skillupack(int guild_id,uint16 skill_id,uint32 account_id);
int guild_break( map_session_data& sd, char* name );
int guild_break( map_session_data& sd, const char* name );
int guild_broken(int guild_id,int flag);
bool guild_gm_change(int guild_id, uint32 char_id, bool showMessage = false );
int guild_gm_changed(int guild_id, uint32 account_id, uint32 char_id, time_t time);

View File

@ -2229,7 +2229,7 @@ int npc_click(map_session_data* sd, struct npc_data* nd)
}
sd->npc_shopid = nd->bl.id;
clif_npc_market_open(sd, nd);
clif_npc_market_open( *sd, *nd );
}
#endif
break;
@ -2914,7 +2914,7 @@ e_purchase_result npc_buylist( map_session_data* sd, std::vector<s_npc_buy_list>
}
/// npc_selllist for script-controlled shops
static int npc_selllist_sub(map_session_data* sd, int list_length, PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list, struct npc_data* nd)
static int npc_selllist_sub(map_session_data* sd, int list_length, const PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list, struct npc_data* nd)
{
char npc_ev[EVENT_NAME_LENGTH];
char card_slot[NAME_LENGTH];
@ -2994,7 +2994,7 @@ static int npc_selllist_sub(map_session_data* sd, int list_length, PACKET_CZ_PC_
///
/// @param item_list 'n' pairs <index,amount>
/// @return result code for clif_parse_NpcSellListSend
uint8 npc_selllist(map_session_data* sd, int list_length, PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list)
uint8 npc_selllist(map_session_data* sd, int list_length, const PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list)
{
double z;
int i,skill;

View File

@ -1581,7 +1581,7 @@ struct npc_data* npc_checknear(map_session_data* sd, struct block_list* bl);
int npc_buysellsel(map_session_data* sd, int id, int type);
e_purchase_result npc_buylist(map_session_data* sd, std::vector<s_npc_buy_list>& item_list);
static int npc_buylist_sub(map_session_data* sd, std::vector<s_npc_buy_list>& item_list, struct npc_data* nd);
uint8 npc_selllist(map_session_data* sd, int list_length, PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list);
uint8 npc_selllist(map_session_data* sd, int list_length, const PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list);
e_purchase_result npc_barter_purchase( map_session_data& sd, std::shared_ptr<s_npc_barter> barter, std::vector<s_barter_purchase>& purchases );
void npc_parse_mob2(struct spawn_data* mob);
struct npc_data* npc_add_warp(char* name, short from_mapid, short from_x, short from_y, short xs, short ys, unsigned short to_mapindex, short to_x, short to_y);

View File

@ -1163,6 +1163,7 @@ DEFINE_PACKET_HEADER(CZ_PARTY_JOIN_REQ_ACK, 0x2c7);
DEFINE_PACKET_HEADER(ZC_NOTIFY_CHAT, 0x8d)
DEFINE_PACKET_HEADER(ZC_ITEM_ENTRY, 0x9d)
DEFINE_PACKET_HEADER(ZC_MVP_GETTING_ITEM, 0x10a)
DEFINE_PACKET_HEADER(ZC_MAKABLEITEMLIST, 0x18d)
DEFINE_PACKET_HEADER(CZ_REQMAKINGITEM, 0x18e)
DEFINE_PACKET_HEADER(ZC_ACK_REQMAKINGITEM, 0x18f)
#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
@ -1177,6 +1178,8 @@ DEFINE_PACKET_HEADER(ZC_PC_CASH_POINT_ITEMLIST, 0x287)
DEFINE_PACKET_HEADER(ZC_CASH_TIME_COUNTER, 0x298)
DEFINE_PACKET_HEADER(ZC_CASH_ITEM_DELETE, 0x299)
DEFINE_PACKET_HEADER(CZ_SKILL_SELECT_RESPONSE, 0x443)
DEFINE_PACKET_HEADER(ZC_MYITEMLIST_BUYING_STORE, 0x813)
DEFINE_PACKET_HEADER(ZC_ACK_ITEMLIST_BUYING_STORE, 0x818)
DEFINE_PACKET_HEADER(ZC_FAILED_TRADE_BUYING_STORE_TO_SELLER, 0x824)
DEFINE_PACKET_HEADER(CZ_SSILIST_ITEM_CLICK, 0x83c)
DEFINE_PACKET_HEADER(ZC_ACK_SCHEDULER_CASHITEM, 0x8ca)

View File

@ -696,7 +696,7 @@ int party_member_added(int party_id,uint32 account_id,uint32 char_id, int flag)
}
/// Party member 'sd' requesting kick of member with <account_id, name>.
bool party_removemember( map_session_data& sd, uint32 account_id, char* name ){
bool party_removemember( map_session_data& sd, uint32 account_id, const char* name ){
// Party locked.
if( map_getmapflag( sd.bl.m, MF_PARTYLOCK ) ){
clif_displaymessage( sd.fd, msg_txt( &sd, 227 ) );

View File

@ -69,7 +69,7 @@ bool party_invite( map_session_data& sd, map_session_data* tsd );
void party_member_joined( map_session_data& sd );
int party_member_added(int party_id,uint32 account_id,uint32 char_id,int flag);
bool party_leave( map_session_data& sd, bool showMessage = false );
bool party_removemember( map_session_data& sd, uint32 account_id, char *name );
bool party_removemember( map_session_data& sd, uint32 account_id, const char *name );
int party_removemember2(map_session_data *sd,uint32 char_id,int party_id);
int party_member_withdraw(int party_id, uint32 account_id, uint32 char_id, char *name, enum e_party_member_withdraw type);
bool party_isleader( map_session_data* sd );

View File

@ -15524,7 +15524,7 @@ static void pc_macro_punishment(map_session_data &sd, e_macro_detect_status styp
* @param image_size: Captcha image size
* @param captcha_answer: Answer to captcha
*/
void pc_macro_captcha_register(map_session_data &sd, uint16 image_size, char captcha_answer[CAPTCHA_ANSWER_SIZE]) {
void pc_macro_captcha_register(map_session_data &sd, uint16 image_size, const char captcha_answer[CAPTCHA_ANSWER_SIZE]) {
nullpo_retv(captcha_answer);
sd.captcha_upload.cd = nullptr;
@ -15553,7 +15553,7 @@ void pc_macro_captcha_register(map_session_data &sd, uint16 image_size, char cap
* @param upload_size: Captcha size
* @param upload_data: Image data
*/
void pc_macro_captcha_register_upload(map_session_data &sd, uint16 upload_size, char *upload_data) {
void pc_macro_captcha_register_upload(map_session_data &sd, uint16 upload_size, const char *upload_data) {
nullpo_retv(upload_data);
memcpy(&sd.captcha_upload.cd->image_data[sd.captcha_upload.upload_size], upload_data, upload_size);
@ -15620,7 +15620,7 @@ TIMER_FUNC(pc_macro_detector_timeout) {
* @param sd: Player data
* @param captcha_answer: Captcha answer entered by player
*/
void pc_macro_detector_process_answer(map_session_data &sd, char captcha_answer[CAPTCHA_ANSWER_SIZE]) {
void pc_macro_detector_process_answer(map_session_data &sd, const char captcha_answer[CAPTCHA_ANSWER_SIZE]) {
nullpo_retv(captcha_answer);
const std::shared_ptr<s_captcha_data> cd = sd.macro_detect.cd;

View File

@ -1737,12 +1737,12 @@ void pc_attendance_claim_reward( map_session_data* sd );
void pc_jail(map_session_data &sd, int32 duration = INT_MAX);
// Captcha Register
void pc_macro_captcha_register(map_session_data &sd, uint16 image_size, char captcha_answer[CAPTCHA_ANSWER_SIZE]);
void pc_macro_captcha_register_upload(map_session_data & sd, uint16 upload_size, char *upload_data);
void pc_macro_captcha_register(map_session_data &sd, uint16 image_size, const char captcha_answer[CAPTCHA_ANSWER_SIZE]);
void pc_macro_captcha_register_upload(map_session_data & sd, uint16 upload_size, const char *upload_data);
// Macro Detector
TIMER_FUNC(pc_macro_detector_timeout);
void pc_macro_detector_process_answer(map_session_data &sd, char captcha_answer[CAPTCHA_ANSWER_SIZE]);
void pc_macro_detector_process_answer(map_session_data &sd, const char captcha_answer[CAPTCHA_ANSWER_SIZE]);
void pc_macro_detector_disconnect(map_session_data &sd);
// Macro Reporter

View File

@ -10961,13 +10961,13 @@ BUILDIN_FUNC(itemskill)
BUILDIN_FUNC(produce)
{
int trigger;
TBL_PC* sd;
map_session_data* sd;
if( !script_rid2sd(sd) )
return SCRIPT_CMD_SUCCESS;
trigger=script_getnum(st,2);
clif_skill_produce_mix_list(sd, -1, trigger);
clif_skill_produce_mix_list( *sd, -1, trigger );
return SCRIPT_CMD_SUCCESS;
}
/*==========================================
@ -10976,13 +10976,13 @@ BUILDIN_FUNC(produce)
BUILDIN_FUNC(cooking)
{
int trigger;
TBL_PC* sd;
map_session_data* sd;
if( !script_rid2sd(sd) )
return SCRIPT_CMD_SUCCESS;
trigger=script_getnum(st,2);
clif_cooking_list(sd, trigger, AM_PHARMACY, 1, 1);
clif_cooking_list( *sd, trigger, AM_PHARMACY, 1, 1 );
return SCRIPT_CMD_SUCCESS;
}
@ -17995,7 +17995,7 @@ BUILDIN_FUNC(callshop)
}
sd->npc_shopid = nd->bl.id;
clif_npc_market_open(sd, nd);
clif_npc_market_open( *sd, *nd );
script_pushint(st,1);
return SCRIPT_CMD_SUCCESS;
}
@ -22537,11 +22537,11 @@ BUILDIN_FUNC(showdigit)
* makerune <% success bonus>{,<char_id>};
**/
BUILDIN_FUNC(makerune) {
TBL_PC* sd;
map_session_data* sd;
if (!script_charid2sd(3,sd))
return SCRIPT_CMD_FAILURE;
clif_skill_produce_mix_list(sd,RK_RUNEMASTERY,24);
clif_skill_produce_mix_list( *sd, RK_RUNEMASTERY, 24 );
sd->itemid = script_getnum(st,2);
return SCRIPT_CMD_SUCCESS;
}

View File

@ -220,7 +220,7 @@ void searchstore_query(map_session_data* sd, unsigned char type, unsigned int mi
if( !sd->searchstore.items.empty() ) {
// present results
clif_search_store_info_ack(sd);
clif_search_store_info_ack( *sd );
// one page displayed
sd->searchstore.pages++;
@ -229,7 +229,7 @@ void searchstore_query(map_session_data* sd, unsigned char type, unsigned int mi
searchstore_clear(sd);
// update uses
clif_search_store_info_ack(sd);
clif_search_store_info_ack( *sd );
// notify of failure
clif_search_store_info_failed(sd, SSI_FAILED_NOTHING_SEARCH_ITEM);
@ -259,7 +259,7 @@ void searchstore_next(map_session_data* sd)
return;
// present results
clif_search_store_info_ack(sd);
clif_search_store_info_ack( *sd );
// one more page displayed
sd->searchstore.pages++;

View File

@ -8554,7 +8554,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AM_PHARMACY:
if(sd) {
clif_skill_produce_mix_list(sd,skill_id,22);
clif_skill_produce_mix_list( *sd, skill_id, 22 );
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
}
break;
@ -10930,7 +10930,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case GC_CREATENEWPOISON:
if( sd )
{
clif_skill_produce_mix_list(sd,skill_id,25);
clif_skill_produce_mix_list( *sd, skill_id, 25 );
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
}
break;
@ -12115,7 +12115,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sd->skill_lv_old = skill_lv;
if( skill_id != GN_S_PHARMACY && skill_lv > 1 )
qty = 10;
clif_cooking_list(sd,(skill_id - GN_MIX_COOKING) + 27,skill_id,qty,skill_id==GN_MAKEBOMB?5:6);
clif_cooking_list( *sd, ( skill_id - GN_MIX_COOKING ) + 27, skill_id, qty, skill_id == GN_MAKEBOMB ? 5 : 6 );
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
}
break;
@ -12837,9 +12837,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
sd->skill_lv_old = skill_lv;
if (skill_id == MT_M_MACHINE)
clif_cooking_list(sd, 31, skill_id, 1, 7);
clif_cooking_list( *sd, 31, skill_id, 1, 7 );
else // BO_BIONIC_PHARMACY
clif_cooking_list(sd, 32, skill_id, 1, 8);
clif_cooking_list( *sd, 32, skill_id, 1, 8 );
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
}
break;

View File

@ -714,7 +714,7 @@ enum e_guild_storage_log storage_guild_log_read( map_session_data* sd ){
enum e_guild_storage_log ret = storage_guild_log_read_sub( sd, log, MAX_GUILD_STORAGE_LOG_PACKET );
clif_guild_storage_log( sd, log, ret );
clif_guild_storage_log( *sd, log, ret );
return ret;
}

View File

@ -94,7 +94,7 @@ void vending_vendinglistreq(map_session_data* sd, int id)
sd->vended_id = vsd->vender_id; // register vending uid
clif_vendinglist( sd, vsd );
clif_vendinglist( *sd, *vsd );
}
/**
@ -384,7 +384,7 @@ int8 vending_openvending( map_session_data& sd, const char* message, const uint8
Sql_ShowDebug(mmysql_handle);
StringBuf_Destroy(&buf);
clif_openvending(&sd,sd.bl.id,sd.vending);
clif_openvending( sd );
clif_showvendingboard( sd );
idb_put(vending_db, sd.status.char_id, &sd);