Jump to content
  • 0

NPC Trader Merging


nasagnilac

Question


  • Group:  Members
  • Topic Count:  89
  • Topics Per Day:  0.02
  • Content Count:  232
  • Reputation:   15
  • Joined:  11/02/13
  • Last Seen:  

We are trying to transfer NPC Trader of Hercules to rAthena but we received an error if we will use the item name.
rathena_trader.png.6dd4c56fc04eb396bb5266afc7c51203.png

This is the code that cause the error. It means it doesn't allow Item name in sellitem scriptcommand.

prontera,73,134,5	trader	Milk Merchant#prt1	4_F_01,{
OnInit:
	sellitem Milk;
end;
}

But if we use this format there is no problem at all.

prontera,73,134,5	trader	Milk Merchant#prt1	4_F_01,{
OnInit:
	sellitem 519;
end;
}


So this is the current sellitem script command code.

/**
 * @call sellitem <Item_ID>,{,price{,qty}};
 *
 * adds <Item_ID> (or modifies if present) to shop
 * if price not provided (or -1) uses the item's value_sell
 **/
BUILDIN_FUNC(sellitem) {
	struct npc_data *nd;
	struct item_data *it;
	int i = 0, id = script_getnum(st,2);
	int value = 0;
	int qty = 0;
	int rental = 0; // Judas Bound/Rental
	int bound = 0; // Judas Bound/Rental
	
	if( !(nd = map_id2nd(st->oid)) ) {
		ShowWarning("buildin_sellitem: trying to run without a proper NPC!\n");
		return false;
	} else if ( !(it = itemdb_exists(id)) ) {
		ShowWarning("buildin_sellitem: unknown item id '%d'!\n",id);
		return false;
	}
	
	value = script_hasdata(st,3) ? script_getnum(st, 3) : it->value_buy;
	if( value == -1 )
		value = it->value_buy;
		
	if( !nd->u.scr.shop )
		npc_trader_update(nd->src_id?nd->src_id:nd->bl.id);
	else {/* no need to run this if its empty */
		for( i = 0; i < nd->u.scr.shop->items; i++ ) {
			if( nd->u.scr.shop->item[i].nameid == id )
				break;
		}
	}
	
	if( i != nd->u.scr.shop->items ) {
		nd->u.scr.shop->item[i].value = value;
		nd->u.scr.shop->item[i].qty   = qty;
	} else {
		for( i = 0; i < nd->u.scr.shop->items; i++ ) {
			if( nd->u.scr.shop->item[i].nameid == 0 )
				break;
		}

		// Judas Bound/Rental
		rental = script_getnum(st, 4);
		bound = script_getnum(st, 5);

		if (rental > 0) {
			bound = 0;
		}
		else {
			if (bound > 4) {
				ShowWarning("buildin_sellitem: Can't add %s (%s/%s), bound is out of range!\n", it->name, nd->exname, nd->path);
				return false;
			}
		}
		
		if( i == nd->u.scr.shop->items ) {
			if( nd->u.scr.shop->items == USHRT_MAX ) {
				ShowWarning("buildin_sellitem: Can't add %s (%s/%s), shop list is full!\n", it->name, nd->exname, nd->path);
				return false;
			}
			i = nd->u.scr.shop->items;
			RECREATE(nd->u.scr.shop->item, struct npc_item_list, ++nd->u.scr.shop->items);
		}
		
		nd->u.scr.shop->item[i].nameid	= it->nameid;
		nd->u.scr.shop->item[i].value	= value;
		nd->u.scr.shop->item[i].qty	    = qty;
	}
	
	return SCRIPT_CMD_SUCCESS;
}

But judas made an adjustments using this new code and you need to add " " on the item name.
 

BUILDIN_FUNC(sellitem) {
	struct npc_data *nd;
	struct item_data *it;
-	int i = 0, id = script_getnum(st,2);
+	int i = 0, id;
	int value = 0;
	int qty = 0;
	int rental = 0; // Judas Bound/Rental
	int bound = 0; // Judas Bound/Rental

+	// Resolve Item
+	struct script_data *someItem = script_getdata(st, 2);
+	get_val(st, someItem);

+	if (data_isint(someItem)) {
+		id = script_getnum(st, 2);
+	}
+	else if (data_isstring(someItem)) {
+		const char* str = script_getstr(st, 2);
+		struct item_data *testData = itemdb_searchname(str);
+		id = testData->nameid;
+	}
	
	if( !(nd = map_id2nd(st->oid)) ) {
		ShowWarning("buildin_sellitem: trying to run without a proper NPC!\n");
@ -24308,7 +24321,7 @@ struct script_function buildin_func[] = {
	//
	/* New Shop Support */
	BUILDIN_DEF(openshop,"?"),
-	BUILDIN_DEF(sellitem,"i?????"), // Judas Bound/Rental
+	BUILDIN_DEF(sellitem,"??????"), // Judas Bound/Rental

Anyone know how can we use the item name instead of using the new code.

Edited by nasagnilac
Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...