Wolvarinhas 107 Posted March 1, 2018 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
0 KB WORK 19 Posted March 1, 2018 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
0 Wolvarinhas 107 Posted March 2, 2018 (edited) 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 March 2, 2018 by NoNamePT´s (see edit history) Share this post Link to post Share on other sites
0 Karbust 1,143 Posted March 2, 2018 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 Wolvarinhas 107 Posted March 2, 2018 (edited) 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... 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 March 2, 2018 by NoNamePT´s LoadItem (see edit history) Share this post Link to post Share on other sites
0 Karbust 1,143 Posted March 2, 2018 4 minutos atrás, NoNamePT´s disse: 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 Wolvarinhas 107 Posted March 2, 2018 (edited) 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 March 2, 2018 by NoNamePT´s (see edit history) Share this post Link to post Share on other sites
0 Karbust 1,143 Posted March 2, 2018 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 Wolvarinhas 107 Posted March 2, 2018 (edited) 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 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 March 2, 2018 by NoNamePT´s (see edit history) Share this post Link to post Share on other sites
0 KB WORK 19 Posted March 2, 2018 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 Wolvarinhas 107 Posted March 2, 2018 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 NewWars 875 Posted August 10, 2018 Mete aqui a função CreateItem(...) da class ItemManager. Cumprimentos. Share this post Link to post Share on other sites
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