ソースを参照

NPC Shop fixes:
* Follow up 40c63f40: Fixed #368, warning fixes
* Fixed `pointshop` failed to get temporary player's variable (`@`) as currency.

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>

Cydh Ramdh 10 年 前
コミット
cbdc01271d
2 ファイル変更14 行追加17 行削除
  1. 10 7
      src/map/npc.c
  2. 4 10
      src/map/script.c

+ 10 - 7
src/map/npc.c

@@ -1679,6 +1679,8 @@ uint8 npc_buylist(struct map_session_data* sd, uint16 n, struct s_npc_buy_list *
 						count = pc_readaccountreg(sd, nd->u.shop.pointshop_str);
 					break;
 				case '@':
+					count = pc_readreg(sd, add_str(nd->u.shop.pointshop_str));
+					break;
 				default:
 					count = pc_readglobalreg(sd, nd->u.shop.pointshop_str);
 					break;
@@ -2539,19 +2541,13 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
 	nd->u.shop.count = 0;
 	while ( p ) {
 		unsigned short nameid2, qty = 0;
-		int value, i = 0;
+		int value;
 		struct item_data* id;
 		bool skip = false;
 
 		if( p == NULL )
 			break;
 		switch(type) {
-			case NPCTYPE_SHOP:
-				if (sscanf(p, ",%hu:%d", &nameid2, &value) != 2) {
-					ShowError("npc_parse_shop: (SHOP) Invalid item definition in file '%s', line '%d'. Ignoring the rest of the line...\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer, start - buffer), w1, w2, w3, w4);
-					skip = true;
-				}
-				break;
 			case NPCTYPE_MARKETSHOP:
 #if PACKETVER >= 20131223
 				if (sscanf(p, ",%hu:%d:%hu", &nameid2, &value, &qty) != 3) {
@@ -2560,6 +2556,12 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
 				}
 #endif
 				break;
+			default:
+				if (sscanf(p, ",%hu:%d", &nameid2, &value) != 2) {
+					ShowError("npc_parse_shop: Invalid item definition in file '%s', line '%d'. Ignoring the rest of the line...\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer, start - buffer), w1, w2, w3, w4);
+					skip = true;
+				}
+				break;
 		}
 
 		if (skip)
@@ -2593,6 +2595,7 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
 		
 #if PACKETVER >= 20131223
 		if (nd->u.shop.count && type == NPCTYPE_MARKETSHOP) {
+			uint16 i;
 			// Duplicate entry? Replace the value
 			ARR_FIND(0, nd->u.shop.count, i, nd->u.shop.shop_item[i].nameid == nameid);
 			if (i != nd->u.shop.count) {

+ 4 - 10
src/map/script.c

@@ -16500,7 +16500,7 @@ BUILDIN_FUNC(setunitdata)
 	TBL_PET* pd = NULL;
 	TBL_ELEM* ed = NULL;
 	TBL_NPC* nd = NULL;
-	int type, value;
+	int type, value = 0;
 
 	bl = map_id2bl(script_getnum(st, 2));
 
@@ -19878,7 +19878,9 @@ BUILDIN_FUNC(npcshopupdate) {
 	struct npc_data* nd = npc_name2id(npcname);
 	uint16 nameid = script_getnum(st, 3);
 	int price = script_getnum(st, 4);
-	uint16 stock = 0;
+#if PACKETVER >= 20131223
+	uint16 stock = script_hasdata(st,5) ? script_getnum(st,5) : 0;
+#endif
 	int i;
 
 	if( !nd || ( nd->subtype != NPCTYPE_SHOP && nd->subtype != NPCTYPE_CASHSHOP && nd->subtype != NPCTYPE_ITEMSHOP && nd->subtype != NPCTYPE_POINTSHOP && nd->subtype != NPCTYPE_MARKETSHOP ) ) { // Not found.
@@ -19892,14 +19894,6 @@ BUILDIN_FUNC(npcshopupdate) {
 		return SCRIPT_CMD_FAILURE;
 	}
 
-	if (nd->subtype == NPCTYPE_MARKETSHOP) {
-		FETCH(5, stock);
-	}
-	else if ((price = cap_value(price, 0, INT_MAX)) == 0) { // Nothing to do here...
-		script_pushint(st,1);
-		return SCRIPT_CMD_SUCCESS;
-	}
-
 	for (i = 0; i < nd->u.shop.count; i++) {
 		if (nd->u.shop.shop_item[i].nameid == nameid) {