summaryrefslogtreecommitdiff
path: root/src/char/int_storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/char/int_storage.c')
-rw-r--r--src/char/int_storage.c272
1 files changed, 33 insertions, 239 deletions
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
index 0d31800fe..130df5515 100644
--- a/src/char/int_storage.c
+++ b/src/char/int_storage.c
@@ -37,11 +37,11 @@
#include <stdio.h>
#include <stdlib.h>
-struct inter_storage_interface inter_storage_s;
+static struct inter_storage_interface inter_storage_s;
struct inter_storage_interface *inter_storage;
/// Save storage data to sql
-int inter_storage_tosql(int account_id, const struct storage_data *p)
+static int inter_storage_tosql(int account_id, const struct storage_data *p)
{
int i = 0, j = 0;
bool matched_p[MAX_STORAGE] = { false };
@@ -71,7 +71,7 @@ int inter_storage_tosql(int account_id, const struct storage_data *p)
&& (p_it = &VECTOR_INDEX(p->item, j)) != NULL
&& cp_it->nameid == p_it->nameid
&& cp_it->unique_id == p_it->unique_id
- && memcmp(p_it->card, cp_it->card, sizeof(short) * MAX_SLOTS) == 0
+ && memcmp(p_it->card, cp_it->card, sizeof(int) * MAX_SLOTS) == 0
&& memcmp(p_it->option, cp_it->option, 5 * MAX_ITEM_OPTIONS) == 0);
if (j < VECTOR_LENGTH(p->item)) {
@@ -165,7 +165,7 @@ int inter_storage_tosql(int account_id, const struct storage_data *p)
}
/// Load storage data to mem
-int inter_storage_fromsql(int account_id, struct storage_data *p)
+static int inter_storage_fromsql(int account_id, struct storage_data *p)
{
StringBuf buf;
char* data;
@@ -235,16 +235,27 @@ int inter_storage_fromsql(int account_id, struct storage_data *p)
}
/// Save guild_storage data to sql
-int inter_storage_guild_storage_tosql(int guild_id, const struct guild_storage *p)
+static bool inter_storage_guild_storage_tosql(int guild_id, const struct guild_storage *p)
{
nullpo_ret(p);
+
+ if (SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `guild_id` FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id)) {
+ Sql_ShowDebug(inter->sql_handle);
+ return false;
+ } else if (SQL->NumRows(inter->sql_handle) < 1) {
+ // guild doesn't exist
+ SQL->FreeResult(inter->sql_handle);
+ return false;
+ }
+ SQL->FreeResult(inter->sql_handle);
+
chr->memitemdata_to_sql(p->items, guild_id, TABLE_GUILD_STORAGE);
ShowInfo ("guild storage save to DB - guild: %d\n", guild_id);
- return 0;
+ return true;
}
/// Load guild_storage data to mem
-int inter_storage_guild_storage_fromsql(int guild_id, struct guild_storage* p)
+static int inter_storage_guild_storage_fromsql(int guild_id, struct guild_storage* p)
{
StringBuf buf;
char* data;
@@ -304,237 +315,35 @@ int inter_storage_guild_storage_fromsql(int guild_id, struct guild_storage* p)
//---------------------------------------------------------
// storage data initialize
-int inter_storage_sql_init(void)
+static int inter_storage_sql_init(void)
{
return 1;
}
// storage data finalize
-void inter_storage_sql_final(void)
+static void inter_storage_sql_final(void)
{
return;
}
// q?f[^?
-int inter_storage_delete(int account_id)
+static int inter_storage_delete(int account_id)
{
if( SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `account_id`='%d'", storage_db, account_id) )
Sql_ShowDebug(inter->sql_handle);
return 0;
}
-int inter_storage_guild_storage_delete(int guild_id)
+static int inter_storage_guild_storage_delete(int guild_id)
{
if( SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `guild_id`='%d'", guild_storage_db, guild_id) )
Sql_ShowDebug(inter->sql_handle);
return 0;
}
-//---------------------------------------------------------
-// packet from map server
-
-int mapif_load_guild_storage(int fd, int account_id, int guild_id, char flag)
-{
- if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `guild_id` FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id) )
- Sql_ShowDebug(inter->sql_handle);
- else if( SQL->NumRows(inter->sql_handle) > 0 )
- {// guild exists
- WFIFOHEAD(fd, sizeof(struct guild_storage)+13);
- WFIFOW(fd,0) = 0x3818;
- WFIFOW(fd,2) = sizeof(struct guild_storage)+13;
- WFIFOL(fd,4) = account_id;
- WFIFOL(fd,8) = guild_id;
- WFIFOB(fd,12) = flag; //1 open storage, 0 don't open
- inter_storage->guild_storage_fromsql(guild_id, WFIFOP(fd,13));
- WFIFOSET(fd, WFIFOW(fd,2));
- return 0;
- }
- // guild does not exist
- SQL->FreeResult(inter->sql_handle);
- WFIFOHEAD(fd, 12);
- WFIFOW(fd,0) = 0x3818;
- WFIFOW(fd,2) = 12;
- WFIFOL(fd,4) = account_id;
- WFIFOL(fd,8) = 0;
- WFIFOSET(fd, 12);
- return 0;
-}
-int mapif_save_guild_storage_ack(int fd, int account_id, int guild_id, int fail)
-{
- WFIFOHEAD(fd,11);
- WFIFOW(fd,0)=0x3819;
- WFIFOL(fd,2)=account_id;
- WFIFOL(fd,6)=guild_id;
- WFIFOB(fd,10)=fail;
- WFIFOSET(fd,11);
- return 0;
-}
-
-//=========================================================
-// Account Storage
-//---------------------------------------------------------
-/**
- * Parses account storage load request from map server.
- * @packet 0x3010 [in] <account_id>.L
- * @param fd [in] file/socket descriptor
- * @return 1 on success, 0 on failure.
- */
-int mapif_parse_AccountStorageLoad(int fd)
-{
- int account_id = RFIFOL(fd, 2);
-
- Assert_ret(fd > 0);
- Assert_ret(account_id > 0);
-
- mapif->account_storage_load(fd, account_id);
-
- return 1;
-}
-
-/**
- * Loads the account storage and send to the map server.
- * @packet 0x3805 [out] <account_id>.L <struct item[]>.P
- * @param fd [in] file/socket descriptor.
- * @param account_id [in] account id of the session.
- * @return 1 on success, 0 on failure.
- */
-int mapif_account_storage_load(int fd, int account_id)
-{
- struct storage_data stor = { 0 };
- int count = 0, i = 0, len = 0;
-
- Assert_ret(account_id > 0);
-
- VECTOR_INIT(stor.item);
- count = inter_storage->fromsql(account_id, &stor);
-
- len = 8 + count * sizeof(struct item);
-
- WFIFOHEAD(fd, len);
- WFIFOW(fd, 0) = 0x3805;
- WFIFOW(fd, 2) = (uint16) len;
- WFIFOL(fd, 4) = account_id;
- for (i = 0; i < count; i++)
- memcpy(WFIFOP(fd, 8 + i * sizeof(struct item)), &VECTOR_INDEX(stor.item, i), sizeof(struct item));
- WFIFOSET(fd, len);
-
- VECTOR_CLEAR(stor.item);
-
- return 1;
-}
-
-/**
- * Parses an account storage save request from the map server.
- * @packet 0x3011 [in] <packet_len>.W <account_id>.L <struct item[]>.P
- * @param fd [in] file/socket descriptor.
- * @return 1 on success, 0 on failure.
- */
-int mapif_parse_AccountStorageSave(int fd)
-{
- int payload_size = RFIFOW(fd, 2) - 8, account_id = RFIFOL(fd, 4);
- int i = 0, count = 0;
- struct storage_data p_stor = { 0 };
-
- Assert_ret(fd > 0);
- Assert_ret(account_id > 0);
-
- count = payload_size/sizeof(struct item);
-
- VECTOR_INIT(p_stor.item);
-
- if (count > 0) {
- VECTOR_ENSURE(p_stor.item, count, 1);
-
- for (i = 0; i < count; i++) {
- const struct item *it = RFIFOP(fd, 8 + i * sizeof(struct item));
-
- VECTOR_PUSH(p_stor.item, *it);
- }
-
- p_stor.aggregate = count;
- }
-
- inter_storage->tosql(account_id, &p_stor);
-
- VECTOR_CLEAR(p_stor.item);
-
- mapif->sAccountStorageSaveAck(fd, account_id, true);
-
- return 1;
-}
-
-/**
- * Sends an acknowledgement for the save
- * status of the account storage.
- * @packet 0x3808 [out] <account_id>.L <save_flag>.B
- * @param fd [in] File/Socket Descriptor.
- * @param account_id [in] Account ID of the storage in question.
- * @param flag [in] Save flag, true for success and false for failure.
- */
-void mapif_send_AccountStorageSaveAck(int fd, int account_id, bool flag)
-{
- WFIFOHEAD(fd, 7);
- WFIFOW(fd, 0) = 0x3808;
- WFIFOL(fd, 2) = account_id;
- WFIFOB(fd, 6) = flag ? 1 : 0;
- WFIFOSET(fd, 7);
-}
-
-//=========================================================
-// Guild Storage
-//---------------------------------------------------------
-int mapif_parse_LoadGuildStorage(int fd)
-{
- RFIFOHEAD(fd);
-
- mapif->load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6),1);
-
- return 0;
-}
-
-int mapif_parse_SaveGuildStorage(int fd)
-{
- int guild_id;
- int len;
-
- RFIFOHEAD(fd);
- guild_id = RFIFOL(fd,8);
- len = RFIFOW(fd,2);
-
- if (sizeof(struct guild_storage) != len - 12) {
- ShowError("inter storage: data size mismatch: %d != %"PRIuS"\n", len - 12, sizeof(struct guild_storage));
- } else {
- if (SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `guild_id` FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id)) {
- Sql_ShowDebug(inter->sql_handle);
- } else if(SQL->NumRows(inter->sql_handle) > 0) {
- // guild exists
- SQL->FreeResult(inter->sql_handle);
- inter_storage->guild_storage_tosql(guild_id, RFIFOP(fd,12));
- mapif->save_guild_storage_ack(fd, RFIFOL(fd,4), guild_id, 0);
- return 0;
- }
- SQL->FreeResult(inter->sql_handle);
- }
- mapif->save_guild_storage_ack(fd, RFIFOL(fd,4), guild_id, 1);
-
- return 0;
-}
-
-int mapif_itembound_ack(int fd, int aid, int guild_id)
-{
-#ifdef GP_BOUND_ITEMS
- WFIFOHEAD(fd,8);
- WFIFOW(fd,0) = 0x3856;
- WFIFOL(fd,2) = aid;/* the value is not being used, drop? */
- WFIFOW(fd,6) = guild_id;
- WFIFOSET(fd,8);
-#endif
- return 0;
-}
-
//------------------------------------------------
//Guild bound items pull for offline characters [Akinari]
//Revised by [Mhalicot]
//------------------------------------------------
-int mapif_parse_ItemBoundRetrieve_sub(int fd)
+static bool inter_storage_retrieve_bound_items(int char_id, int account_id, int guild_id)
{
#ifdef GP_BOUND_ITEMS
StringBuf buf;
@@ -543,9 +352,6 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
int j, i=0, s=0, bound_qt=0;
struct item items[MAX_INVENTORY];
unsigned int bound_item[MAX_INVENTORY] = {0};
- int char_id = RFIFOL(fd,2);
- int aid = RFIFOL(fd,6);
- int guild_id = RFIFOW(fd,10);
StrBuf->Init(&buf);
StrBuf->AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`, `unique_id`");
@@ -562,12 +368,12 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
Sql_ShowDebug(inter->sql_handle);
SQL->StmtFree(stmt);
StrBuf->Destroy(&buf);
- return 1;
+ return false;
}
memset(&item, 0, sizeof(item));
SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &item.id, sizeof item.id, NULL, NULL);
- SQL->StmtBindColumn(stmt, 1, SQLDT_SHORT, &item.nameid, sizeof item.nameid, NULL, NULL);
+ SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &item.nameid, sizeof item.nameid, NULL, NULL);
SQL->StmtBindColumn(stmt, 2, SQLDT_SHORT, &item.amount, sizeof item.amount, NULL, NULL);
SQL->StmtBindColumn(stmt, 3, SQLDT_UINT, &item.equip, sizeof item.equip, NULL, NULL);
SQL->StmtBindColumn(stmt, 4, SQLDT_CHAR, &item.identify, sizeof item.identify, NULL, NULL);
@@ -578,7 +384,7 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
SQL->StmtBindColumn(stmt, 9, SQLDT_UINT64, &item.unique_id, sizeof item.unique_id, NULL, NULL);
/* Card Slots */
for (j = 0; j < MAX_SLOTS; ++j)
- SQL->StmtBindColumn(stmt, 10 + j, SQLDT_SHORT, &item.card[j], sizeof item.card[j], NULL, NULL);
+ SQL->StmtBindColumn(stmt, 10 + j, SQLDT_INT, &item.card[j], sizeof item.card[j], NULL, NULL);
/* Item Options */
for (j = 0; j < MAX_ITEM_OPTIONS; ++j) {
SQL->StmtBindColumn(stmt, 10 + MAX_SLOTS + j * 2, SQLDT_INT16, &item.option[j].index, sizeof item.option[j].index, NULL, NULL);
@@ -594,7 +400,7 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
if (i == 0) { //No items found - No need to continue
StrBuf->Destroy(&buf);
SQL->StmtFree(stmt);
- return 0;
+ return true;
}
//First we delete the character's items
@@ -627,7 +433,7 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
Sql_ShowDebug(inter->sql_handle);
SQL->StmtFree(stmt);
StrBuf->Destroy(&buf);
- return 1;
+ return false;
}
// Removes any view id that was set by an item that was removed
@@ -661,7 +467,7 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
Sql_ShowDebug(inter->sql_handle);
SQL->StmtFree(stmt);
StrBuf->Destroy(&buf);
- return 1;
+ return false;
}
#undef CHECK_REMOVE
}
@@ -702,29 +508,16 @@ int mapif_parse_ItemBoundRetrieve_sub(int fd)
Sql_ShowDebug(inter->sql_handle);
SQL->StmtFree(stmt);
StrBuf->Destroy(&buf);
- return 1;
+ return false;
}
StrBuf->Destroy(&buf);
SQL->StmtFree(stmt);
-
- //Finally reload storage and tell map we're done
- mapif->load_guild_storage(fd,aid,guild_id,0);
-
- // If character is logged in char, disconnect
- chr->disconnect_player(aid);
#endif
- return 0;
-}
-
-void mapif_parse_ItemBoundRetrieve(int fd)
-{
- mapif->parse_ItemBoundRetrieve_sub(fd);
- /* tell map server the operation is over and it can unlock the storage */
- mapif->itembound_ack(fd,RFIFOL(fd,6),RFIFOW(fd,10));
+ return true;
}
-int inter_storage_parse_frommap(int fd)
+static int inter_storage_parse_frommap(int fd)
{
RFIFOHEAD(fd);
switch(RFIFOW(fd,0)){
@@ -754,4 +547,5 @@ void inter_storage_defaults(void)
inter_storage->delete_ = inter_storage_delete;
inter_storage->guild_storage_delete = inter_storage_guild_storage_delete;
inter_storage->parse_frommap = inter_storage_parse_frommap;
+ inter_storage->retrieve_bound_items = inter_storage_retrieve_bound_items;
}