antiblock
diamwall
  • Chatbox

    Did you check out our Discord? https://discord.gg/FFdvMjk9xA
    You don't have permission to chat.
    Load More
  • 0
Sign in to follow this  
Wolvarinhas

Itens desaparecem depois de fechar armazem

Question

Boas manos, eu tou com um erro penso ser no char.cpp que sempre que coloco um item no armazem dame este erro no syserr do core

LoadSafebox: cannot create item vnum 0 id 70000046 (name: MODERADOR)

 

Como podem ver o erro é o item vnum ser 0 que deveria ser o id do item que foi posto no armazem

N percebo porque assume ser 0 se no char.cpp a variavel esta posta corretamente

void CHARACTER::LoadSafebox(int iSize, DWORD dwGold, int iItemCount, TPlayerItem * pItems)
{
	bool bLoaded = false;

	//PREVENT_TRADE_WINDOW
	SetOpenSafebox(true);
	//END_PREVENT_TRADE_WINDOW

	if (m_pkSafebox)
		bLoaded = true;

	if (!m_pkSafebox)
		m_pkSafebox = M2_NEW CSafebox(this, iSize, dwGold);
	else
		m_pkSafebox->ChangeSize(iSize);

	m_iSafeboxSize = iSize;

	TPacketCGSafeboxSize p;

	p.bHeader = HEADER_GC_SAFEBOX_SIZE;
	p.bSize = iSize;

	GetDesc()->Packet(&p, sizeof(TPacketCGSafeboxSize));

	if (!bLoaded)
	{
		for (int i = 0; i < iItemCount; ++i, ++pItems)
		{
			if (!m_pkSafebox->IsValidPosition(pItems->pos))
				continue;

			LPITEM item = ITEM_MANAGER::instance().CreateItem(pItems->vnum, pItems->count, pItems->id);

			if (!item)
			{
				sys_err("cannot create item vnum %d id %u (name: %s)", pItems->vnum, pItems->id, GetName());
				continue;
			}

			item->SetSkipSave(true);
			item->SetSockets(pItems->alSockets);
			item->SetAttributes(pItems->aAttr);

			if (!m_pkSafebox->Add(pItems->pos, item))
			{
				M2_DESTROY_ITEM(item);
			}
			else
				item->SetSkipSave(false);
		}
	}
}

Como podem ver a variavel e o pitens->vnum que vai buscar o vnum do item... Se alguem me pudesse ajudar a resolver isto agradecia :)

Share this post


Link to post
Share on other sites

11 answers to this question

  • 0

Quais são as files que estás a usar de base? clean ou all bugs?

Share this post


Link to post
Share on other sites
antiblock
diamwall
  • 0
18 horas atrás, KB WORK disse:

Quais são as files que estás a usar de base? clean ou all bugs?

Tou a usar as Diablo 2

Edited by NoNamePT´s (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Pode ser problema a guardar o item na base de dados, ou seja, com a função Save...

 

Verifica se quando o metes no armazém ele guarda o vnum correto na tabela player.item...

Share this post


Link to post
Share on other sites
  • 0
22 minutos atrás, Karbust™ # PT disse:

Pode ser problema a guardar o item na base de dados, ou seja, com a função Save...

 

Verifica se quando o metes no armazém ele guarda o vnum correto na tabela player.item...

GqCYrus.png

 

Como podes ver os itens da safebox ficam todos guardados como 0 mas disto eu ja sabia, porque eu ao colocar o item no armazem ele diz que o vnum é o 0

LoadSafebox: cannot create item vnum 0 id 70000046 (name: MODERADOR)

 

Agora porque!? Eu n sei porque o LoadSafeBox do char.cpp esta todo correto, até pensei que podia ser a variavel pItems->vnum mas não é essa a variavel que ele precisa pra reconhecer o item posto..

Ainda pra mais quando compilo a source da me erro no inventario de loaditem: cannot create item vnum 0 id...  

Edited by NoNamePT´s
LoadItem (see edit history)

Share this post


Link to post
Share on other sites
  • 0
4 minutos atrás, NoNamePT´s disse:

GqCYrus.png

 

Como podes ver os itens da safebox ficam todos guardados como 0 mas disto eu ja sabia, porque eu ao colocar o item no armazem ele diz que o vnum é o 0

LoadSafebox: cannot create item vnum 0 id 70000046 (name: MODERADOR)

 

Agora porque!? Eu n sei porque o LoadSafeBox do char.cpp esta todo correto, até pensei que podia ser a variavel pItems->vnum mas não é essa a variavel que ele precisa pra reconhecer o item posto..

Ainda pra mais quando compilo a source da me erro no inventario de loaditem: cannot create item vnum 0 id...  

 

Se eles são guardados como 0 o erro não está na LoadSafebox, portanto, penso que seja esta a lógica:

 

Quando adicionas um item no armazém ele não é guardado até o fechares:

void CHARACTER::CloseSafebox()
{
	if (!m_pkSafebox)
		return;

	//PREVENT_TRADE_WINDOW
	SetOpenSafebox(false);
	//END_PREVENT_TRADE_WINDOW

	m_pkSafebox->Save();

	M2_DELETE(m_pkSafebox);
	m_pkSafebox = NULL;

	ChatPacket(CHAT_TYPE_COMMAND, "CloseSafebox");

	SetSafeboxLoadTime();
	m_bOpeningSafebox = false;

	Save();
}

E essa função executa esta:

void CSafebox::Save()
{
	TSafeboxTable t;

	memset(&t, 0, sizeof(TSafeboxTable));

	t.dwID = m_pkChrOwner->GetDesc()->GetAccountTable().id;
	t.dwGold = m_lGold;

	db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_SAVE, 0, &t, sizeof(TSafeboxTable));
	sys_log(1, "SAFEBOX: SAVE %s", m_pkChrOwner->GetName());
}

Verifica também esta função:

bool CSafebox::Add(DWORD dwPos, LPITEM pkItem)
{
	if (!IsValidPosition(dwPos))
	{
		sys_err("SAFEBOX: item on wrong position at %d (size of grid = %d)", dwPos, m_pkGrid->GetSize());
		return false;
	}

	pkItem->SetWindow(m_bWindowMode);
	pkItem->SetCell(m_pkChrOwner, dwPos);
	pkItem->Save(); // 강제로 Save를 불러줘야 한다.
	ITEM_MANAGER::instance().FlushDelayedSave(pkItem);

	m_pkGrid->Put(dwPos, 1, pkItem->GetSize());
	m_pkItems[dwPos] = pkItem;

	TPacketGCItemSet pack;

	pack.header	= m_bWindowMode == SAFEBOX ? HEADER_GC_SAFEBOX_SET : HEADER_GC_MALL_SET;
	pack.Cell	= TItemPos(m_bWindowMode, dwPos);
	pack.vnum	= pkItem->GetVnum();
	pack.count	= pkItem->GetCount();
	pack.flags	= pkItem->GetFlag();
	pack.anti_flags	= pkItem->GetAntiFlag();
	thecore_memcpy(pack.alSockets, pkItem->GetSockets(), sizeof(pack.alSockets));
	thecore_memcpy(pack.aAttr, pkItem->GetAttributes(), sizeof(pack.aAttr));

	m_pkChrOwner->GetDesc()->Packet(&pack, sizeof(pack));
	sys_log(1, "SAFEBOX: ADD %s %s count %d", m_pkChrOwner->GetName(), pkItem->GetName(), pkItem->GetCount());
	return true;
}

 

Tenta também ver no syslog quando adicionares o item ao armazém o que ele diz no syslog

Share this post


Link to post
Share on other sites
  • 0

Esta tudo igualzinho mano a unica coisa que diferencia e isto..

 

#ifdef __CHANGELOOK_SYSTEM__
    pack.transmutation = pkItem->GetTransmutation();
#endif
    pack.bind = pkItem->GetBind();

que tem a mais no

bool CSafebox::Add(DWORD dwPos, LPITEM pkItem)

Mas isso n influencia em nada no vnum do item..

E tens razão o problema esta quando fecho o armazem ele ao enviar pra base de dados envia como 0 o vnum, mas agora o porque!?

Eu tambem veriifiquei os logs ele mostra a linha do Syserr que enviou pro syserr do channel

SYSERR: Mar  2 11:00:40.575537 :: Entergame: LoadSafebox: cannot create item vnum 0 id 70000046 (name: MODERADOR)

 

 

Note: Se eu compilar a source dame um novo erro de LoadItem, e dentro de jogo os itens nao carregam no inventorio das personagens, será possivel ser uma variavel global!?

Edited by NoNamePT´s (see edit history)

Share this post


Link to post
Share on other sites
  • 0
6 minutos atrás, NoNamePT´s disse:

Esta tudo igualzinho mano a unica coisa que diferencia e isto..

 


#ifdef __CHANGELOOK_SYSTEM__
    pack.transmutation = pkItem->GetTransmutation();
#endif
    pack.bind = pkItem->GetBind();

que tem a mais no


bool CSafebox::Add(DWORD dwPos, LPITEM pkItem)

Mas isso n influencia em nada no vnum do item..

E tens razão o problema esta quando fecho o armazem ele ao enviar pra base de dados envia como 0 o vnum, mas agora o porque!?

Eu tambem veriifiquei os logs ele mostra a linha do Syserr que enviou pro syserr do channel

SYSERR: Mar  2 11:00:40.575537 :: Entergame: LoadSafebox: cannot create item vnum 0 id 70000046 (name: MODERADOR)

 

 

Note: Se eu compilar a source dame um novo erro de LoadItem, e dentro de jogo os itens nao carregam no inventorio das personagens, será possivel ser uma variavel global!?

 

17 minutos atrás, Karbust™ # PT disse:

Tenta também ver no syslog quando adicionares o item ao armazém o que ele diz no syslog

 

Quando adicionas alguma coisa ao armazém isso fica registado no syslog...

 

Se te dá erro a compilar posta aqui o erro,não sabemos onde dá o erro... E se te dá erro aqui (ou aviso?) como consegues entrar no jogo? Pergunto isto porque se dá erro a compilar não obtens o ficheiro game, com erro não avança, ao contrário de avisos...

Share this post


Link to post
Share on other sites
  • 0
3 minutos atrás, Karbust™ # PT disse:

 

 

Quando adicionas alguma coisa ao armazém isso fica registado no syslog...

 

Se te dá erro a compilar posta aqui o erro,não sabemos onde dá o erro... E se te dá erro aqui (ou aviso?) como consegues entrar no jogo? Pergunto isto porque se dá erro a compilar não obtens o ficheiro game, com erro não avança, ao contrário de avisos...

Mano não me da erros ao compilar..

Quando compilo o game e coloco no bin aparece novos erros e o tamanho do ficheiro e maior que o anterior entendes? o que me diz que a source não é a mesma que veio com as files...

 

E o erro que me aparece e no load dos itens ele assume que o vnum tambem é 0 :7_sweat_smile:

O servidor n é meu porque se fosse eu fazia com uma clean e ia implementando as cenas aos poucos, mas os rapazes ja traduziram isto tudo e tal..  Era fixe se conseguisse corrigir

Edited by NoNamePT´s (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Mano pega numas files clean e substitui as funções que te estão a dar problemas 

Share this post


Link to post
Share on other sites
  • 0
1 hora atrás, KB WORK disse:

Mano pega numas files clean e substitui as funções que te estão a dar problemas 

Se soubesse as funções nem precisava de umas clean eu corrigia, o problema é saber de onde vêm o erro..

Share this post


Link to post
Share on other sites
  • 0

Mete aqui a função CreateItem(...) da class ItemManager.

 

Cumprimentos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this