Ajutor C++ la search shop

Totalitatea subiectelor care nu respectă regulamentul impus in sectiunea "Probleme şi Întrebări" vor fi stocate aici.
Avatar utilizator
alinjuve23
Nivel 2

Nivel 2
Mesaje: 239
Membru din: 23 Apr 2015, 17:10
Aprecieri: 451  
Mulţumiri: 21  
Medalii

*Problemă/Întrebare: Ajutor C++ la search shop
Tipologie server(PvM / PvP): -
*Resursă folosită: -
*ServerFiles utilizat: Server files clean + src full.
*Syserr: -
Poză: -
*Detalii suplimentare: Vreau sa primesc mesaj in chat cand gaseste item-ul cautat: "A fost gasit" si cand nu gaseste: "Nu a fost gasit".
In chat spune tot timpul: A fost gasit;
Cum pot face ca asta: COfflineShopManager::Instance().SearchInShops(ch, vnum); Sa imi returneze vnum de la item si atunci sa spun if / else?

Sau este alta varianta?
Multumesc de ajutor.

Cod: Selectaţi tot

ACMD(do_search_in_shops)
{
	char arg1[256];
	one_argument(argument, arg1, sizeof(arg1));

	int vnum = 0;
	str_to_number(vnum, arg1);

	int iFloodResult = ch->GetQuestFlag("item_search.flood_check");
	if (iFloodResult)
	{
		if (get_global_time() < iFloodResult + 3) 
		{
			ch->ChatPacket(CHAT_TYPE_INFO, "Asteapta cateva secunde pentru a cauta din nou.");
			return;
		}
	}

	COfflineShopManager::Instance().SearchInShops(ch, vnum);
		if(vnum == 0)
		{
			ch->ChatPacket(CHAT_TYPE_INFO, "Nu a fost gasit.");
			return;
		}
		else
		{
			ch->ChatPacket(CHAT_TYPE_INFO, "A fost gasit.");
			return;
		}
			
}
Avatar utilizator
Moț
Ţepar / Untrusted User

Ţepar / Untrusted User
Mesaje: 2825
Membru din: 03 Apr 2017, 15:00
Aprecieri: 216  
Mulţumiri: 3040  
Discord: Copiază ID
Medalii

posteaza toata functia COfflineShopManager::Instance().SearchInShops(ch, vnum);
Imagine
Afișează semnătura
Avatar utilizator
alinjuve23
Nivel 2

Nivel 2
Mesaje: 239
Membru din: 23 Apr 2015, 17:10
Aprecieri: 451  
Mulţumiri: 21  
Medalii

Aia este toata, asta este primul cmd_general nemodificat. Altceva nu mai este.

http://www.girlshare.ro/3769946352.7
Avatar utilizator
Moț
Ţepar / Untrusted User

Ţepar / Untrusted User
Mesaje: 2825
Membru din: 03 Apr 2017, 15:00
Aprecieri: 216  
Mulţumiri: 3040  
Discord: Copiază ID
Medalii

ce sa fac cu cmd general?
daca nu stiu ce returneaza COfflineShopManager::Instance().SearchInShops(ch, vnum);
tu gandesti?
Imagine
Afișează semnătura
Avatar utilizator
alinjuve23
Nivel 2

Nivel 2
Mesaje: 239
Membru din: 23 Apr 2015, 17:10
Aprecieri: 451  
Mulţumiri: 21  
Medalii

Scuze, nu ma pricep. Credeam ca de cmd_general aveai nevoie.

Aici vad ca este functia: http://www.girlshare.ro/3769946354.9

Cod: Selectaţi tot

void COfflineShopManager::SearchInShops(LPCHARACTER ch, int vnum)
{
	if (!ch)
		return;
	LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
	if (!pSecMap)
		return;
	FSearch f(ch, vnum);
	pSecMap->for_each(f);
	ch->SetQuestFlag("item_search.flood_check", get_global_time());
}
Avatar utilizator
Moț
Ţepar / Untrusted User

Ţepar / Untrusted User
Mesaje: 2825
Membru din: 03 Apr 2017, 15:00
Aprecieri: 216  
Mulţumiri: 3040  
Discord: Copiază ID
Medalii

// cmd_general

Cod: Selectaţi tot

ACMD(do_search_in_shops)
{
	char arg1[256];
	one_argument(argument, arg1, sizeof(arg1));

	int vnum = 0;
	str_to_number(vnum, arg1);

	int iFloodResult = ch->GetQuestFlag("item_search.flood_check");
	if (iFloodResult)
	{
		if (get_global_time() < iFloodResult + 3) 
		{
			ch->ChatPacket(CHAT_TYPE_INFO, "Asteapta cateva secunde pentru a cauta din nou.");
			return;
		}
	}
	bool bFound = false;

	COfflineShopManager::Instance().SearchInShops(ch, vnum, bFound);

	if(bFound) {
		ch->ChatPacket(CHAT_TYPE_INFO, "Ai gasit.");
	}
	else {
		ch->ChatPacket(CHAT_TYPE_INFO, " Nu ai gasit.");
	}
}


// OfflineShopManager

Cod: Selectaţi tot

struct FSearch
{
	FSearch(LPCHARACTER ch, int Vnum, bool &bFound) : m_ch(ch), itemVnum(Vnum), m_bFound(bFound)
	{
	}
	void operator () (LPENTITY ent)
	{
		if (ent->IsType(ENTITY_CHARACTER))
		{
			LPCHARACTER ch = (LPCHARACTER) ent;

			if (ch->GetRaceNum() != 30000)
				return;
			char szQuery[1024];
			sprintf(szQuery,
			"SELECT * FROM %soffline_shop_item WHERE owner_id = %u AND vnum = %d",
			get_table_postfix(), ch->GetOfflineShopRealOwner(), itemVnum);

			std::auto_ptr<SQLMsg> pSearchQuery(DBManager::instance().DirectQuery(szQuery));

			if (pSearchQuery->uiSQLErrno != 0) {
				sys_err("Item Search Query Failed, Error code: %ld", pSearchQuery->uiSQLErrno);
				return;
			}
			if (!pSearchQuery->Get()->uiNumRows){
				return;
			}
			else
			{
				bFound = true;
			}
			CTargetManager::Instance().CreateTarget(m_ch->GetPlayerID(), 9999, ch->GetName(), 3, ch->GetVID(), 0, m_ch->GetMapIndex(), NULL, 1);
		}
	}
	LPCHARACTER m_ch;
	int itemVnum;
	bool m_bFound;
};


void COfflineShopManager::SearchInShops(LPCHARACTER ch, int vnum, bool &bFound)
{
	if (!ch)
		return;
	LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
	if (!pSecMap)
		return;
	FSearch f(ch, vnum, bFound);
	pSecMap->for_each(f);
	ch->SetQuestFlag("item_search.flood_check", get_global_time());
}

sa adaugi si in headerul de la offline shop acel parametru bool &bFound

Cod: Selectaţi tot

void SearchInShops(LPCHARACTER ch, int vnum, bool &bFound)
Imagine
Afișează semnătura
Avatar utilizator
alinjuve23
Nivel 2

Nivel 2
Mesaje: 239
Membru din: 23 Apr 2015, 17:10
Aprecieri: 451  
Mulţumiri: 21  
Medalii

am o eroare la compilare: https://imgur.com/Ot4VlxT

Am adugat in offlineshop_manager.h

Cod: Selectaţi tot

		void			SearchInShops(LPCHARACTER ch, int vnum, bool &bFound);
linia 1068: https://imgur.com/OWLlV27
Ultima oară modificat 19 Iul 2020, 10:24 de către alinjuve23, modificat 1 dată în total.
Avatar utilizator
Moț
Ţepar / Untrusted User

Ţepar / Untrusted User
Mesaje: 2825
Membru din: 03 Apr 2017, 15:00
Aprecieri: 216  
Mulţumiri: 3040  
Discord: Copiază ID
Medalii

Cod: Selectaţi tot

struct FSearch
{
	FSearch(LPCHARACTER ch, int Vnum, bool &bFound) : m_ch(ch), itemVnum(Vnum)
	{
	}
	void operator () (LPENTITY ent)
	{
		if (ent->IsType(ENTITY_CHARACTER))
		{
			LPCHARACTER ch = (LPCHARACTER) ent;

			if (ch->GetRaceNum() != 30000)
				return;
			char szQuery[1024];
			sprintf(szQuery,
			"SELECT * FROM %soffline_shop_item WHERE owner_id = %u AND vnum = %d",
			get_table_postfix(), ch->GetOfflineShopRealOwner(), itemVnum);

			std::auto_ptr<SQLMsg> pSearchQuery(DBManager::instance().DirectQuery(szQuery));

			if (pSearchQuery->uiSQLErrno != 0) {
				sys_err("Item Search Query Failed, Error code: %ld", pSearchQuery->uiSQLErrno);
				return;
			}
			if (!pSearchQuery->Get()->uiNumRows){
				return;
			}
			else
			{
				bFound = true;
			}
			CTargetManager::Instance().CreateTarget(m_ch->GetPlayerID(), 9999, ch->GetName(), 3, ch->GetVID(), 0, m_ch->GetMapIndex(), NULL, 1);
		}
	}
	LPCHARACTER m_ch;
	int itemVnum;
};
Imagine
Afișează semnătura
Avatar utilizator
alinjuve23
Nivel 2

Nivel 2
Mesaje: 239
Membru din: 23 Apr 2015, 17:10
Aprecieri: 451  
Mulţumiri: 21  
Medalii

Imi da aceiasi eroare.
La prima varianta, daca schimbam la linia 1068: bFound = true; cu m_bFound = true; se compileaza fara erori.
Dar in joc apare " Nu ai gasit" indiferent daca gaseste sau nu.

Edit: Mai ai vreo idee? Mersi.
Avatar utilizator
alinjuve23
Nivel 2

Nivel 2
Mesaje: 239
Membru din: 23 Apr 2015, 17:10
Aprecieri: 451  
Mulţumiri: 21  
Medalii

Careva o rezolvare?
Vreau doar un simplu mesaj cand gaseste obiecte si unul cand nu gaseste..
Mersi.
Închis

Înapoi la “Arhivă Probleme şi Întrebări”

  • Informaţie
  • Cine este conectat

    Utilizatori ce ce navighează pe acest forum: Semrush [Bot] și 25 vizitatori