Browse Source

Merge branch 'master' of https://github.com/rathena/rathena

Lemongrass3110 8 years ago
parent
commit
858634112c
2 changed files with 32 additions and 14 deletions
  1. 5 0
      db/packet_db.txt
  2. 27 14
      src/map/storage.c

+ 5 - 0
db/packet_db.txt

@@ -1786,6 +1786,11 @@ packet_keys: 0x01581359,0x452D6FFA,0x6AFB6E2E // [Shakto]
 0x096E,-1,mergeitem_req,2:4 // CZ_REQ_MERGE_ITEM
 0x096F,7,ZC_ACK_MERGE_ITEM,2:4:6 // ZC_ACK_MERGE_ITEM
 0x0974,2,mergeitem_cancel,0 // CZ_CANCEL_MERGE_ITEM
+0x0844,2,cashshopopen,0
+0x0849,16 //clif_cashshop_result
+0x0848,-1,cashshopbuy,2:6:4:10
+0x084a,2,cashshopclose,0
+0x08c9,2,cashshopitemlist,0
 
 //2012-04-18aRagexeRE [Special Thanks to Judas!]
 packet_ver: 31

+ 27 - 14
src/map/storage.c

@@ -204,9 +204,6 @@ int compare_item(struct item *a, struct item *b)
  * @return @see enum e_storage_add
  **/
 static enum e_storage_add storage_canAddItem(struct s_storage *stor, int idx, struct item items[], int amount, int max_num) {
-	if (stor->amount >= stor->max_amount)
-		return STORAGE_ADD_NOROOM; // storage full
-
 	if (idx < 0 || idx >= max_num)
 		return STORAGE_ADD_INVALID;
 
@@ -253,7 +250,7 @@ static enum e_storage_add storage_canGetItem(struct s_storage *stor, int idx, in
  * @param stor : Storage data
  * @param item_data : item to add
  * @param amount : quantity of items
- * @return 0:success, 1:failed
+ * @return 0:success, 1:failed, 2:failed because of room or stack checks
  */
 static int storage_additem(struct map_session_data* sd, struct s_storage *stor, struct item *it, int amount)
 {
@@ -266,7 +263,7 @@ static int storage_additem(struct map_session_data* sd, struct s_storage *stor,
 	data = itemdb_search(it->nameid);
 
 	if( data->stack.storage && amount > data->stack.amount ) // item stack limitation
-		return 1;
+		return 2;
 
 	if( !itemdb_canstore(it, pc_get_group_level(sd)) ) { // Check if item is storable. [Skotlex]
 		clif_displaymessage (sd->fd, msg_txt(sd,264));
@@ -282,7 +279,7 @@ static int storage_additem(struct map_session_data* sd, struct s_storage *stor,
 		for( i = 0; i < stor->max_amount; i++ ) {
 			if( compare_item(&stor->u.items_storage[i], it) ) { // existing items found, stack them
 				if( amount > MAX_AMOUNT - stor->u.items_storage[i].amount || ( data->stack.storage && amount > data->stack.amount - stor->u.items_storage[i].amount ) )
-					return 1;
+					return 2;
 
 				stor->u.items_storage[i].amount += amount;
 				stor->dirty = true;
@@ -296,7 +293,7 @@ static int storage_additem(struct map_session_data* sd, struct s_storage *stor,
 	// find free slot
 	ARR_FIND( 0, stor->max_amount, i, stor->u.items_storage[i].nameid == 0 );
 	if( i >= stor->max_amount )
-		return 1;
+		return 2;
 
 	// add item to slot
 	memcpy(&stor->u.items_storage[i],it,sizeof(stor->u.items_storage[0]));
@@ -354,9 +351,17 @@ void storage_storageadd(struct map_session_data* sd, struct s_storage *stor, int
 	result = storage_canAddItem(stor, index, sd->inventory.u.items_inventory, amount, MAX_INVENTORY);
 	if (result == STORAGE_ADD_INVALID)
 		return;
-	else if (result == STORAGE_ADD_OK && storage_additem(sd,stor,&sd->inventory.u.items_inventory[index],amount) == 0) {
-		pc_delitem(sd,index,amount,0,4,LOG_TYPE_STORAGE);
-		return;
+	else if (result == STORAGE_ADD_OK) {
+		switch( storage_additem(sd, stor, &sd->inventory.u.items_inventory[index], amount) ){
+			case 0:
+				pc_delitem(sd,index,amount,0,4,LOG_TYPE_STORAGE);
+				return;
+			case 1:
+				break;
+			case 2:
+				result = STORAGE_ADD_NOROOM;
+				break;
+		}
 	}
 
 	clif_storageitemremoved(sd,index,0);
@@ -402,12 +407,20 @@ void storage_storageaddfromcart(struct map_session_data *sd, struct s_storage *s
 	enum e_storage_add result;
 	nullpo_retv(sd);
 
-	result = storage_canAddItem(stor, index, sd->cart.u.items_inventory, amount, MAX_INVENTORY);
+	result = storage_canAddItem(stor, index, sd->cart.u.items_inventory, amount, MAX_CART);
 	if (result == STORAGE_ADD_INVALID)
 		return;
-	else if (result == STORAGE_ADD_OK && storage_additem(sd,stor,&sd->cart.u.items_cart[index],amount) == 0) {
-		pc_cart_delitem(sd,index,amount,0,LOG_TYPE_STORAGE);
-		return;
+	else if (result == STORAGE_ADD_OK) {
+		switch( storage_additem(sd, stor, &sd->cart.u.items_cart[index], amount) ){
+			case 0:
+				pc_cart_delitem(sd,index,amount,0,LOG_TYPE_STORAGE);
+				return;
+			case 1:
+				break;
+			case 2:
+				result = STORAGE_ADD_NOROOM;
+				break;
+		}
 	}
 
 	clif_storageitemremoved(sd,index,0);