Skip to content
Permalink
Browse files
Buyingstore persistency Beta
Changed the loading process to clean up if there are some leftovers(corrupt tables).

Modified the loading query to also take in the zeny limit as criteria, since it would not make sense to set up an autotrader that already has reached his limit(this case should not be possible, if you do not modify the values in your MySQL table by hand).

Enjoy and do not forget to run the upgrade .sql files.
  • Loading branch information
Lemongrass3110 committed Feb 6, 2014
1 parent ff9b625 commit 996ee3d4e9e50a68ca3455de7e42e4e596a7e5ee
Showing with 145 additions and 145 deletions.
  1. +76 −75 src/map/buyingstore.c
  2. +69 −70 src/map/vending.c
@@ -242,11 +242,13 @@ void buyingstore_close(struct map_session_data* sd)
{
if( sd->state.buyingstore )
{
if(
!sd->state.autotrade &&
Sql_Query( mmysql_handle, "DELETE FROM `%s` WHERE buyingstore_id = %d;", buyingstore_items_db, sd->buyer_id ) != SQL_SUCCESS ||
Sql_Query( mmysql_handle, "DELETE FROM `%s` WHERE `id` = %d;", buyingstore_db, sd->buyer_id ) != SQL_SUCCESS ){
if( !sd->state.autotrade ){
if(
Sql_Query( mmysql_handle, "DELETE FROM `%s` WHERE buyingstore_id = %d;", buyingstore_items_db, sd->buyer_id ) != SQL_SUCCESS ||
Sql_Query( mmysql_handle, "DELETE FROM `%s` WHERE `id` = %d;", buyingstore_db, sd->buyer_id ) != SQL_SUCCESS
){
Sql_ShowDebug(mmysql_handle);
}
}

// invalidate data
@@ -618,95 +620,94 @@ void do_init_buyingstore_autotrade( void ) {
if (Sql_Query(mmysql_handle,
"SELECT `id`, `account_id`, `char_id`, `sex`, `title`, `limit` "
"FROM `%s` "
"WHERE `autotrade` = 1 AND (SELECT COUNT(`buyingstore_id`) FROM `%s` WHERE `buyingstore_id` = `id`) > 0;",
"WHERE `autotrade` = 1 AND `limit` > 0 AND (SELECT COUNT(`buyingstore_id`) FROM `%s` WHERE `buyingstore_id` = `id`) > 0;",
buyingstore_db, buyingstore_items_db ) != SQL_SUCCESS )
{
Sql_ShowDebug(mmysql_handle);
return;
}

if (!(autotrader_count = (uint32)Sql_NumRows(mmysql_handle))) //Nothing to do
return;

// Init autotraders
CREATE(autotraders, struct s_autotrade *, autotrader_count);
if( (autotrader_count = (uint32)Sql_NumRows(mmysql_handle)) > 0 ){
// Init autotraders
CREATE(autotraders, struct s_autotrade *, autotrader_count);

if (autotraders == NULL) { //This is shouldn't happen [Cydh]
ShowError("Failed to initialize buyingstore autotraders!\n");
Sql_FreeResult(mmysql_handle);
return;
}
if (autotraders == NULL) { //This is shouldn't happen [Cydh]
ShowError("Failed to initialize buyingstore autotraders!\n");
Sql_FreeResult(mmysql_handle);
return;
}

// Init each autotrader data
i = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && i < autotrader_count) {
size_t len;
char* data;
// Init each autotrader data
i = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && i < autotrader_count) {
size_t len;
char* data;

CREATE(autotraders[i], struct s_autotrade, 1);
CREATE(autotraders[i], struct s_autotrade, 1);

Sql_GetData(mmysql_handle, 0, &data, NULL); autotraders[i]->buyer_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); autotraders[i]->account_id = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); autotraders[i]->char_id = atoi(data);
Sql_GetData(mmysql_handle, 3, &data, NULL); autotraders[i]->sex = (data[0] == 'F') ? 0 : 1;
Sql_GetData(mmysql_handle, 4, &data, &len); safestrncpy(autotraders[i]->title, data, min(len + 1, MESSAGE_SIZE));
Sql_GetData(mmysql_handle, 5, &data, NULL); autotraders[i]->limit = atoi(data);
autotraders[i]->count = 0;
Sql_GetData(mmysql_handle, 0, &data, NULL); autotraders[i]->buyer_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); autotraders[i]->account_id = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); autotraders[i]->char_id = atoi(data);
Sql_GetData(mmysql_handle, 3, &data, NULL); autotraders[i]->sex = (data[0] == 'F') ? 0 : 1;
Sql_GetData(mmysql_handle, 4, &data, &len); safestrncpy(autotraders[i]->title, data, min(len + 1, MESSAGE_SIZE));
Sql_GetData(mmysql_handle, 5, &data, NULL); autotraders[i]->limit = atoi(data);
autotraders[i]->count = 0;

// initialize player
CREATE(autotraders[i]->sd, struct map_session_data, 1);
// initialize player
CREATE(autotraders[i]->sd, struct map_session_data, 1);

pc_setnewpc(autotraders[i]->sd, autotraders[i]->account_id, autotraders[i]->char_id, 0, gettick(), autotraders[i]->sex, 0);
pc_setnewpc(autotraders[i]->sd, autotraders[i]->account_id, autotraders[i]->char_id, 0, gettick(), autotraders[i]->sex, 0);

autotraders[i]->sd->state.autotrade = 1;
chrif_authreq(autotraders[i]->sd, true);
i++;
}
Sql_FreeResult(mmysql_handle);

//Init items on vending list each autotrader
for (i = 0; i < autotrader_count; i++){
struct s_autotrade *at = NULL;
uint16 j;

if (autotraders[i] == NULL)
continue;
at = autotraders[i];

if (SQL_ERROR == Sql_Query(mmysql_handle,
"SELECT `item_id`, `amount`, `price` "
"FROM `%s` "
"WHERE `buyingstore_id` = %d "
"ORDER BY `index` ASC;", buyingstore_items_db, at->buyer_id ) )
{
Sql_ShowDebug(mmysql_handle);
continue;
}

if (!(at->count = (uint32)Sql_NumRows(mmysql_handle))) {
map_quit(at->sd);
continue;
autotraders[i]->sd->state.autotrade = 1;
chrif_authreq(autotraders[i]->sd, true);
i++;
}

//Init the list
CREATE(at->entries, struct s_autotrade_entry *,at->count);
Sql_FreeResult(mmysql_handle);

//Add the item into list
j = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && j < at->count) {
char* data;
CREATE(at->entries[j], struct s_autotrade_entry, 1);
//Init items on vending list each autotrader
for (i = 0; i < autotrader_count; i++){
struct s_autotrade *at = NULL;
uint16 j;

if (autotraders[i] == NULL)
continue;
at = autotraders[i];

if (SQL_ERROR == Sql_Query(mmysql_handle,
"SELECT `item_id`, `amount`, `price` "
"FROM `%s` "
"WHERE `buyingstore_id` = %d "
"ORDER BY `index` ASC;", buyingstore_items_db, at->buyer_id ) )
{
Sql_ShowDebug(mmysql_handle);
continue;
}

Sql_GetData(mmysql_handle, 0, &data, NULL); at->entries[j]->item_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); at->entries[j]->amount = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); at->entries[j]->price = atoi(data);
j++;
if (!(at->count = (uint32)Sql_NumRows(mmysql_handle))) {
map_quit(at->sd);
continue;
}

//Init the list
CREATE(at->entries, struct s_autotrade_entry *,at->count);

//Add the item into list
j = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && j < at->count) {
char* data;
CREATE(at->entries[j], struct s_autotrade_entry, 1);

Sql_GetData(mmysql_handle, 0, &data, NULL); at->entries[j]->item_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); at->entries[j]->amount = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); at->entries[j]->price = atoi(data);
j++;
}
items += j;
Sql_FreeResult(mmysql_handle);
}
items += j;
Sql_FreeResult(mmysql_handle);
}

ShowStatus("Done loading '"CL_WHITE"%d"CL_RESET"' autotraders with '"CL_WHITE"%d"CL_RESET"' items.\n", autotrader_count, items);
ShowStatus("Done loading '"CL_WHITE"%d"CL_RESET"' autotraders with '"CL_WHITE"%d"CL_RESET"' items.\n", autotrader_count, items);
}
}

// Everything is loaded fine, their entries will be reinserted once they are loaded
@@ -302,7 +302,7 @@ bool vending_openvending(struct map_session_data* sd, const char* message, const
int vending_skill_lvl;
char message_sql[MESSAGE_SIZE*2];

nullpo_retv(sd);
nullpo_retr(false,sd);

if ( pc_isdead(sd) || !sd->state.prevend || pc_istrading(sd))
return false; // can't open vendings lying dead || didn't use via the skill (wpe/hack) || can't have 2 shops at once
@@ -555,87 +555,86 @@ void do_init_vending_autotrade( void ) {
return;
}

if (!(autotrader_count = (uint32)Sql_NumRows(mmysql_handle))) //Nothing to do
return;

// Init autotraders
CREATE(autotraders, struct s_autotrade *, autotrader_count);
if( (autotrader_count = (uint32)Sql_NumRows(mmysql_handle)) > 0 ){
// Init autotraders
CREATE(autotraders, struct s_autotrade *, autotrader_count);

if (autotraders == NULL) { //This is shouldn't happen [Cydh]
ShowError("Failed to initialize vending autotraders!\n");
Sql_FreeResult(mmysql_handle);
return;
}
if (autotraders == NULL) { //This is shouldn't happen [Cydh]
ShowError("Failed to initialize vending autotraders!\n");
Sql_FreeResult(mmysql_handle);
return;
}

// Init each autotrader data
i = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && i < autotrader_count) {
size_t len;
char* data;
// Init each autotrader data
i = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && i < autotrader_count) {
size_t len;
char* data;

CREATE(autotraders[i], struct s_autotrade, 1);
CREATE(autotraders[i], struct s_autotrade, 1);

Sql_GetData(mmysql_handle, 0, &data, NULL); autotraders[i]->vendor_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); autotraders[i]->account_id = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); autotraders[i]->char_id = atoi(data);
Sql_GetData(mmysql_handle, 3, &data, NULL); autotraders[i]->sex = (data[0] == 'F') ? 0 : 1;
Sql_GetData(mmysql_handle, 4, &data, &len); safestrncpy(autotraders[i]->title, data, min(len + 1, MESSAGE_SIZE));
autotraders[i]->count = 0;
Sql_GetData(mmysql_handle, 0, &data, NULL); autotraders[i]->vendor_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); autotraders[i]->account_id = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); autotraders[i]->char_id = atoi(data);
Sql_GetData(mmysql_handle, 3, &data, NULL); autotraders[i]->sex = (data[0] == 'F') ? 0 : 1;
Sql_GetData(mmysql_handle, 4, &data, &len); safestrncpy(autotraders[i]->title, data, min(len + 1, MESSAGE_SIZE));
autotraders[i]->count = 0;

// initialize player
CREATE(autotraders[i]->sd, struct map_session_data, 1);
// initialize player
CREATE(autotraders[i]->sd, struct map_session_data, 1);

pc_setnewpc(autotraders[i]->sd, autotraders[i]->account_id, autotraders[i]->char_id, 0, gettick(), autotraders[i]->sex, 0);
pc_setnewpc(autotraders[i]->sd, autotraders[i]->account_id, autotraders[i]->char_id, 0, gettick(), autotraders[i]->sex, 0);

autotraders[i]->sd->state.autotrade = 1;
chrif_authreq(autotraders[i]->sd, true);
i++;
}
Sql_FreeResult(mmysql_handle);

//Init items on vending list each autotrader
for (i = 0; i < autotrader_count; i++){
struct s_autotrade *at = NULL;
uint16 j;

if (autotraders[i] == NULL)
continue;
at = autotraders[i];

if (SQL_ERROR == Sql_Query(mmysql_handle,
"SELECT `cartinventory_id`, `amount`, `price` "
"FROM `%s` "
"WHERE `vending_id` = %d "
"ORDER BY `index` ASC;", vending_items_db, at->vendor_id ) )
{
Sql_ShowDebug(mmysql_handle);
continue;
}

if (!(at->count = (uint32)Sql_NumRows(mmysql_handle))) {
map_quit(at->sd);
continue;
autotraders[i]->sd->state.autotrade = 1;
chrif_authreq(autotraders[i]->sd, true);
i++;
}

//Init the list
CREATE(at->entries, struct s_autotrade_entry *,at->count);
Sql_FreeResult(mmysql_handle);

//Add the item into list
j = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && j < at->count) {
char* data;
CREATE(at->entries[j], struct s_autotrade_entry, 1);
//Init items on vending list each autotrader
for (i = 0; i < autotrader_count; i++){
struct s_autotrade *at = NULL;
uint16 j;

if (autotraders[i] == NULL)
continue;
at = autotraders[i];

if (SQL_ERROR == Sql_Query(mmysql_handle,
"SELECT `cartinventory_id`, `amount`, `price` "
"FROM `%s` "
"WHERE `vending_id` = %d "
"ORDER BY `index` ASC;", vending_items_db, at->vendor_id ) )
{
Sql_ShowDebug(mmysql_handle);
continue;
}

Sql_GetData(mmysql_handle, 0, &data, NULL); at->entries[j]->cartinventory_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); at->entries[j]->amount = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); at->entries[j]->price = atoi(data);
j++;
if (!(at->count = (uint32)Sql_NumRows(mmysql_handle))) {
map_quit(at->sd);
continue;
}

//Init the list
CREATE(at->entries, struct s_autotrade_entry *,at->count);

//Add the item into list
j = 0;
while (SQL_SUCCESS == Sql_NextRow(mmysql_handle) && j < at->count) {
char* data;
CREATE(at->entries[j], struct s_autotrade_entry, 1);

Sql_GetData(mmysql_handle, 0, &data, NULL); at->entries[j]->cartinventory_id = atoi(data);
Sql_GetData(mmysql_handle, 1, &data, NULL); at->entries[j]->amount = atoi(data);
Sql_GetData(mmysql_handle, 2, &data, NULL); at->entries[j]->price = atoi(data);
j++;
}
items += j;
Sql_FreeResult(mmysql_handle);
}
items += j;
Sql_FreeResult(mmysql_handle);
}

ShowStatus("Done loading '"CL_WHITE"%d"CL_RESET"' autotraders with '"CL_WHITE"%d"CL_RESET"' items.\n", autotrader_count, items);
ShowStatus("Done loading '"CL_WHITE"%d"CL_RESET"' autotraders with '"CL_WHITE"%d"CL_RESET"' items.\n", autotrader_count, items);
}
}

// Everything is loaded fine, their entries will be reinserted once they are loaded

2 comments on commit 996ee3d

@exneval
Copy link

@exneval exneval commented on 996ee3d Feb 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i don't see the upgrade .sql from last 4 commits...

@Lemongrass3110
Copy link
Member Author

@Lemongrass3110 Lemongrass3110 commented on 996ee3d Feb 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry somehow I missed to commit the file.
Thanks for mentioning.

It is fixxed in 899f3c1.

Please sign in to comment.