Ejemplo n.º 1
0
/*==========================================
 *
 *------------------------------------------
 */
static int itemdb_read_itemslotcounttable(void)
{
	char *buf, *p;
	int s;

	buf = (char *)grfio_reads("data\\itemslotcounttable.txt", &s);
	if (buf == NULL)
		return -1;
	buf[s] = 0;
	for (p = buf; p - buf < s;){
		int nameid, slot;
		sscanf(p, "%d#%d#", &nameid, &slot);
		if (slot > MAX_SLOTS)
		{
			ShowWarning("itemdb_read_itemslotcounttable: Item %d specifies %d slots, but the server only supports up to %d\n", nameid, slot, MAX_SLOTS);
			slot = MAX_SLOTS;
		}
		itemdb_slot(nameid) = slot;
		p = strchr(p,10);
		if(!p) break;
		p++;
		p = strchr(p,10);
		if(!p) break;
		p++;
	}
	aFree(buf);
	ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", "data\\itemslotcounttable.txt");

	return 0;
}
Ejemplo n.º 2
0
/// Searches for all items in a vending, that match given ids, price and possible cards.
/// @return Whether or not the search should be continued.
bool vending_searchall(struct map_session_data *sd, const struct s_search_store_search *s)
{
	int i, c, slot;
	unsigned int idx, cidx;
	struct item *it;

	if(!sd->state.vending) {
		// not vending
		return true;
	}

	for(idx = 0; idx < s->item_count; idx++) {
		ARR_FIND(0, sd->vend_num, i, sd->status.cart[sd->vending[i].index].nameid == (short)s->itemlist[idx]);
		if(i == sd->vend_num) {
			// not found
			continue;
		}
		it = &sd->status.cart[sd->vending[i].index];

		if(s->min_price && s->min_price > sd->vending[i].value) {
			// too low price
			continue;
		}

		if(s->max_price && s->max_price < sd->vending[i].value) {
			// too high price
			continue;
		}

		if(s->card_count) {
			// check cards
			if(itemdb_isspecial(it->card[0])) {
				// something, that is not a carded
				continue;
			}
			slot = itemdb_slot(it->nameid);

			for(c = 0; c < slot && it->card[c]; c ++) {
				ARR_FIND(0, s->card_count, cidx, s->cardlist[cidx] == it->card[c]);
				if(cidx != s->card_count) {
					// found
					break;
				}
			}

			if(c == slot || !it->card[c]) {
				// no card match
				continue;
			}
		}

		if(!searchstore->result(s->search_sd, sd->vender_id, sd->status.account_id, sd->message, it->nameid, sd->vending[i].amount, sd->vending[i].value, it->card, it->refine)) {
			// result set full
			return false;
		}
	}

	return true;
}
Ejemplo n.º 3
0
/// Searches for all items in a vending, that match given ids, price and possible cards.
/// @return Whether or not the search should be continued.
bool vending_searchall(struct map_session_data* sd, const struct s_search_store_search* s) {
	int i, c, slot;
	unsigned int idx, cidx;
	struct item* it;

	if( !sd->state.vending ) // não vendendo
		return true;

	for( idx = 0; idx < s->item_count; idx++ ) {
		ARR_FIND( 0, sd->vend_num, i, sd->status.cart[sd->vending[i].index].nameid == (short)s->itemlist[idx] );
		if( i == sd->vend_num ) {// não econtrado
			continue;
		}
		it = &sd->status.cart[sd->vending[i].index];

		if( s->min_price && s->min_price > sd->vending[i].value ) {// preço muito baixo
			continue;
		}

		if( s->max_price && s->max_price < sd->vending[i].value ) {// preço muito alto
			continue;
		}

		if( s->card_count ) {// checa cartas
			if( itemdb_isspecial(it->card[0]) ) {// alguma coisa, que não é uma carta
				continue;
			}
			slot = itemdb_slot(it->nameid);

			for( c = 0; c < slot && it->card[c]; c ++ ) {
				ARR_FIND( 0, s->card_count, cidx, s->cardlist[cidx] == it->card[c] );
				if( cidx != s->card_count )
				{// encontrado
					break;
				}
			}

			if( c == slot || !it->card[c] ) {// nenhuma carta equivalente
				continue;
			}
		}

		if( !searchstore->result(s->search_sd, sd->vender_id, sd->status.account_id, sd->message, it->nameid, sd->vending[i].amount, sd->vending[i].value, it->card, it->refine) )
		{// resulta conjunto completo
			return false;
		}
	}

	return true;
}