Skocz do zawartości

Problem z komendą 'event_manager update' w systemie Menadżera Eventów DracaryS

Opublikowano

Siema ostatnio dodałem se menadżera eventow od dracarysa i mam problem, komenda nie działa.

Wpisuje komendę /event_manager update i nic się nie dzieje, okno jak puste tak dalej jest , dopiero po restarcie serwera załapuje.

Pliki to marty sama 5.8 a system wyciągałem z plików ava2.

Mam też paczkę z neta ale ten kod praktycznie identyczny.

 

 

Z góry dzięki za pomoc ❤️ 

Featured Replies

Opublikowano
Godzinę temu, Av3rneS napisał(a):

Siema ostatnio dodałem se menadżera eventow od dracarysa i mam problem, komenda nie działa.

Wpisuje komendę /event_manager update i nic się nie dzieje, okno jak puste tak dalej jest , dopiero po restarcie serwera załapuje.

Pliki to marty sama 5.8 a system wyciągałem z plików ava2.

Mam też paczkę z neta ale ten kod praktycznie identyczny.

 

 

Z góry dzięki za pomoc ❤️ 

Szklana kula mówi ze czegoś brakuje 

Opublikowano
  • Autor
8 minut temu, Kamil506 napisał(a):

Szklana kula mówi ze czegoś brakuje 

Tylko pytanie czego, w syslogu normalnie widnieje że komenda została użyta 

Opublikowano
45 minut temu, Av3rneS napisał(a):

Tylko pytanie czego, w syslogu normalnie widnieje że komenda została użyta 

Syssery wszedzie sprawdzone? Syslog w momencie wywolania komendy sprawdzony?

Opublikowano
  • Autor
Teraz, Kamil506 napisał(a):

Syssery wszedzie sprawdzone? Syslog w momencie wywolania komendy sprawdzony?

Ta, wszędzie czysto w syssersch, w syslogach widnieje że komenda została wywołana ale bez skutku.

Opublikowano
40 minut temu, Av3rneS napisał(a):

Ta, wszędzie czysto w syssersch, w syslogach widnieje że komenda została wywołana ale bez skutku.

No to pozostaje szklana kula albo dodac od nowa

Opublikowano

To dołącz kod systemu o którym mowa w jaki sposób liczysz że ktoś ci pomoże bez dołączenia kodu? Może mamy jeszcze szukać w necie system, który sobie dodałeś i rozkminiać czy to ten czy może inny. 

Opublikowano
  • Autor
11 godzin temu, Sevence napisał(a):

To dołącz kod systemu o którym mowa w jaki sposób liczysz że ktoś ci pomoże bez dołączenia kodu? Może mamy jeszcze szukać w necie system, który sobie dodałeś i rozkminiać czy to ten czy może inny. 

Już podrzucam go 

event_manager.rar

Opublikowano

Zerknąłem kod i musimy sprawdzić parę kwestii z tego co widać ta komenda wysyła pakiet do DB. Trzeba będzie się zorientować, czy on w ogóle jest wysyłany i odbierany poprawnie przez proces DB to tak na sam początek. Pamiętaj, że kolejność pakietów ma znaczenie zwłaszcza gdy nie jest do niego przypisana konkretna stała wartość. Nie mniej zawsze staraj się zachować taką samą strukturę. Do rzeczy, pakiet HEADER_GD_EVENT_MANAGER wywołuje funkcję w clientmanagerze RecvEventManagerPacket sprawdź, czy faktycznie zostaje odbierany dodając log, będziemy wtedy wiedzieć czy komunikacja z db działa poprawnie. 

 

	if (subIndex == EVENT_MANAGER_UPDATE)
		InitializeEventManager(true);

 

Tu możesz dodać: 

	if (subIndex == EVENT_MANAGER_UPDATE)
	{
		sys_log(0, "EVENT_MANAGER: Odbieram request.");
		InitializeEventManager(true);
	}

 

Jeśli request jest odbierany pakiet powinien przesłać zainicjowane dane do game tak więc dalej sprawdźmy czy odpowiedź z game poprawnie jest odbierana. To jest realizowane przez pakiet HEADER_DB_EVENT_MANAGER, które wywołuje EventManager w input_db oczywiście. Dodaj do niej parę logów aby sprawdzić czy poprawnie odbieramy dane po wysłaniu żądania do db i wysłaniu danych do game. 

 

void CInputDB::EventManager(const char* c_pData)
{
	CHARACTER_MANAGER& chrMngr = CHARACTER_MANAGER::Instance();
	sys_log(0, "EVENT_MANAGER: game odbiera pakiecik z db");
	
	const BYTE subIndex = *(BYTE*)c_pData;
	
	sys_log(0, "EVENT_MANAGER: subindex: %d", subIndex);
	
	c_pData += sizeof(BYTE);
	if (subIndex == EVENT_MANAGER_LOAD)
	{
		chrMngr.ClearEventData();
		sys_log(0, "EVENT_MANAGER: ładowanie");
		const BYTE dayCount = *(BYTE*)c_pData;
		c_pData += sizeof(BYTE);
		
		sys_log(0, "EVENT_MANAGER: Ładowanie %d dni", dayCount);

		const bool updateFromGameMaster = *(bool*)c_pData;
		c_pData += sizeof(bool);

		for (DWORD x = 0; x < dayCount; ++x)
		{
			const BYTE dayIndex = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			const BYTE dayEventCount = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			sys_log(0, "EVENT_MANAGER: Ladowanie dni %d eventday %d", dayIndex, dayEventCount);

			if (dayEventCount > 0)
			{
				std::vector<TEventManagerData> m_vec;
				m_vec.resize(dayEventCount);
				thecore_memcpy(&m_vec[0], c_pData, dayEventCount*sizeof(TEventManagerData));
				c_pData += dayEventCount * sizeof(TEventManagerData);
				chrMngr.SetEventData(dayIndex, m_vec);

			}
		}
		if (updateFromGameMaster)
		{
			chrMngr.UpdateAllPlayerEventData();
			sys_log(0, "EVENT_MANAGER: aktualizacja do wszystkich graczy");
		}
	}
	else if (EVENT_MANAGER_EVENT_STATUS == subIndex)
	{
		const WORD& eventID = *(WORD*)c_pData;
		c_pData += sizeof(WORD);
		const bool& eventStatus = *(bool*)c_pData;
		c_pData += sizeof(bool);
		const int& endTime = *(int*)c_pData;
		c_pData += sizeof(int);
		chrMngr.SetEventStatus(eventID, eventStatus, endTime);
	}
}

 

Jeśli na tym etapie wszystko jest okey i dane są poprawnie ładowane z db i game odbiera ten pakiet to wywoływana jest funkcja UpdateAllPlayerEventData więc lecimy tam i dodaj log żeby zobaczyć czy wywołuje funkcje. 

void CHARACTER_MANAGER::UpdateAllPlayerEventData()
{
	sys_log(0, "EVENT_MANAGER: Zapłon odpalony wysyłamy do graczy");

	TEMP_BUFFER buf;
	CompareEventSendData(&buf);
	const DESC_MANAGER::DESC_SET& c_ref_set = DESC_MANAGER::instance().GetClientSet();
	for (const auto& desc : c_ref_set)
	{
		if (!desc->GetCharacter())
			continue;
		desc->Packet(buf.read_peek(), buf.size());
	}
}

 

Dalej widzimy że idzie CompareEventSendData dodaj kolejne logi 

void CHARACTER_MANAGER::CompareEventSendData(TEMP_BUFFER* buf)
{  
	sys_log(0, "EVENT_MANAGER: zaczynam");
	const BYTE dayCount = m_eventData.size();
	sys_log(0, "EVENT_MANAGER: Dni %d", dayCount);

	const BYTE subIndex = EVENT_MANAGER_LOAD;
	const int cur_Time = time(NULL);
	TPacketGCEventManager p;
	p.header = HEADER_GC_EVENT_MANAGER;
	p.size = sizeof(TPacketGCEventManager) + sizeof(BYTE)+sizeof(BYTE)+sizeof(int);
	for (const auto& [dayIndex, dayData] : m_eventData)
	{
		const BYTE dayEventCount = dayData.size();
		sys_log(0, "EVENT_MANAGER: dni %d dnievent %d", dayIndex, dayEventCount);
		p.size += sizeof(BYTE) + sizeof(BYTE) + (dayEventCount * sizeof(TEventManagerData));
	}
	buf->write(&p, sizeof(TPacketGCEventManager));
	buf->write(&subIndex, sizeof(BYTE));
	buf->write(&dayCount, sizeof(BYTE));
	buf->write(&cur_Time, sizeof(int));
	for (const auto& [dayIndex, dayData] : m_eventData)
	{
		const BYTE dayEventCount = dayData.size();
		buf->write(&dayIndex, sizeof(BYTE));
		buf->write(&dayEventCount, sizeof(BYTE));
		if (dayEventCount > 0)
			buf->write(dayData.data(), dayEventCount * sizeof(TEventManagerData));
	}
	sys_log(0, "EVENT_MANAGER: poszłoooo");
}

 

A z tego miejsca to już leci pakiet do klienta obstawiam, że gdzieś na etapie komunikacji db <-> game jest problem. Pododawaj logi i debugujemy problem kolejne działania będą zależne od wyniku i prawdopodobnie już na tym etapie wyjdzie błąd. Wpisujesz komendę w grze i w sys_log game i db wyszukujesz EVENT_MANAGER i patrzysz. 

 

  • Sevence zmienił(a) tytuł na Problem z komendą 'event_manager update w systemie Menadżera Eventów DracaryS
Opublikowano
  • Autor
Godzinę temu, Sevence napisał(a):

Zerknąłem kod i musimy sprawdzić parę kwestii z tego co widać ta komenda wysyła pakiet do DB. Trzeba będzie się zorientować, czy on w ogóle jest wysyłany i odbierany poprawnie przez proces DB to tak na sam początek. Pamiętaj, że kolejność pakietów ma znaczenie zwłaszcza gdy nie jest do niego przypisana konkretna stała wartość. Nie mniej zawsze staraj się zachować taką samą strukturę. Do rzeczy, pakiet HEADER_GD_EVENT_MANAGER wywołuje funkcję w clientmanagerze RecvEventManagerPacket sprawdź, czy faktycznie zostaje odbierany dodając log, będziemy wtedy wiedzieć czy komunikacja z db działa poprawnie. 

 

	if (subIndex == EVENT_MANAGER_UPDATE)
		InitializeEventManager(true);

 

Tu możesz dodać: 

	if (subIndex == EVENT_MANAGER_UPDATE)
	{
		sys_log(0, "EVENT_MANAGER: Odbieram request.");
		InitializeEventManager(true);
	}

 

Jeśli request jest odbierany pakiet powinien przesłać zainicjowane dane do game tak więc dalej sprawdźmy czy odpowiedź z game poprawnie jest odbierana. To jest realizowane przez pakiet HEADER_DB_EVENT_MANAGER, które wywołuje EventManager w input_db oczywiście. Dodaj do niej parę logów aby sprawdzić czy poprawnie odbieramy dane po wysłaniu żądania do db i wysłaniu danych do game. 

 

void CInputDB::EventManager(const char* c_pData)
{
	CHARACTER_MANAGER& chrMngr = CHARACTER_MANAGER::Instance();
	sys_log(0, "EVENT_MANAGER: game odbiera pakiecik z db");
	
	const BYTE subIndex = *(BYTE*)c_pData;
	
	sys_log(0, "EVENT_MANAGER: subindex: %d", subIndex);
	
	c_pData += sizeof(BYTE);
	if (subIndex == EVENT_MANAGER_LOAD)
	{
		chrMngr.ClearEventData();
		sys_log(0, "EVENT_MANAGER: ładowanie");
		const BYTE dayCount = *(BYTE*)c_pData;
		c_pData += sizeof(BYTE);
		
		sys_log(0, "EVENT_MANAGER: Ładowanie %d dni", dayCount);

		const bool updateFromGameMaster = *(bool*)c_pData;
		c_pData += sizeof(bool);

		for (DWORD x = 0; x < dayCount; ++x)
		{
			const BYTE dayIndex = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			const BYTE dayEventCount = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			sys_log(0, "EVENT_MANAGER: Ladowanie dni %d eventday %d", dayIndex, dayEventCount);

			if (dayEventCount > 0)
			{
				std::vector<TEventManagerData> m_vec;
				m_vec.resize(dayEventCount);
				thecore_memcpy(&m_vec[0], c_pData, dayEventCount*sizeof(TEventManagerData));
				c_pData += dayEventCount * sizeof(TEventManagerData);
				chrMngr.SetEventData(dayIndex, m_vec);

			}
		}
		if (updateFromGameMaster)
		{
			chrMngr.UpdateAllPlayerEventData();
			sys_log(0, "EVENT_MANAGER: aktualizacja do wszystkich graczy");
		}
	}
	else if (EVENT_MANAGER_EVENT_STATUS == subIndex)
	{
		const WORD& eventID = *(WORD*)c_pData;
		c_pData += sizeof(WORD);
		const bool& eventStatus = *(bool*)c_pData;
		c_pData += sizeof(bool);
		const int& endTime = *(int*)c_pData;
		c_pData += sizeof(int);
		chrMngr.SetEventStatus(eventID, eventStatus, endTime);
	}
}

 

Jeśli na tym etapie wszystko jest okey i dane są poprawnie ładowane z db i game odbiera ten pakiet to wywoływana jest funkcja UpdateAllPlayerEventData więc lecimy tam i dodaj log żeby zobaczyć czy wywołuje funkcje. 

void CHARACTER_MANAGER::UpdateAllPlayerEventData()
{
	sys_log(0, "EVENT_MANAGER: Zapłon odpalony wysyłamy do graczy");

	TEMP_BUFFER buf;
	CompareEventSendData(&buf);
	const DESC_MANAGER::DESC_SET& c_ref_set = DESC_MANAGER::instance().GetClientSet();
	for (const auto& desc : c_ref_set)
	{
		if (!desc->GetCharacter())
			continue;
		desc->Packet(buf.read_peek(), buf.size());
	}
}

 

Dalej widzimy że idzie CompareEventSendData dodaj kolejne logi 

void CHARACTER_MANAGER::CompareEventSendData(TEMP_BUFFER* buf)
{  
	sys_log(0, "EVENT_MANAGER: zaczynam");
	const BYTE dayCount = m_eventData.size();
	sys_log(0, "EVENT_MANAGER: Dni %d", dayCount);

	const BYTE subIndex = EVENT_MANAGER_LOAD;
	const int cur_Time = time(NULL);
	TPacketGCEventManager p;
	p.header = HEADER_GC_EVENT_MANAGER;
	p.size = sizeof(TPacketGCEventManager) + sizeof(BYTE)+sizeof(BYTE)+sizeof(int);
	for (const auto& [dayIndex, dayData] : m_eventData)
	{
		const BYTE dayEventCount = dayData.size();
		sys_log(0, "EVENT_MANAGER: dni %d dnievent %d", dayIndex, dayEventCount);
		p.size += sizeof(BYTE) + sizeof(BYTE) + (dayEventCount * sizeof(TEventManagerData));
	}
	buf->write(&p, sizeof(TPacketGCEventManager));
	buf->write(&subIndex, sizeof(BYTE));
	buf->write(&dayCount, sizeof(BYTE));
	buf->write(&cur_Time, sizeof(int));
	for (const auto& [dayIndex, dayData] : m_eventData)
	{
		const BYTE dayEventCount = dayData.size();
		buf->write(&dayIndex, sizeof(BYTE));
		buf->write(&dayEventCount, sizeof(BYTE));
		if (dayEventCount > 0)
			buf->write(dayData.data(), dayEventCount * sizeof(TEventManagerData));
	}
	sys_log(0, "EVENT_MANAGER: poszłoooo");
}

 

A z tego miejsca to już leci pakiet do klienta obstawiam, że gdzieś na etapie komunikacji db <-> game jest problem. Pododawaj logi i debugujemy problem kolejne działania będą zależne od wyniku i prawdopodobnie już na tym etapie wyjdzie błąd. Wpisujesz komendę w grze i w sys_log game i db wyszukujesz EVENT_MANAGER i patrzysz. 

 

Dodałem to 

 

if (subIndex == EVENT_MANAGER_UPDATE)
	{
		sys_log(0, "EVENT_MANAGER: Odbieram request.");
		InitializeEventManager(true);
	}

Ale po wpisaniu komendy czy nawet bez w sys logu pusto o tym.

Opublikowano

Dodałeś wszystkie logi? Jakie ci się pojawiają? Dodaj wszystkie bo musimy wiedzieć w którym miejscu jest problem skompiluj game i db i daj znać co wypluwa. 

Opublikowano
  • Autor
Godzinę temu, Sevence napisał(a):

Dodałeś wszystkie logi? Jakie ci się pojawiają? Dodaj wszystkie bo musimy wiedzieć w którym miejscu jest problem skompiluj game i db i daj znać co wypluwa. 

DB nic nie wypluwa a z channeli mam to 

pierwszy screen jest ze startu serwera a drugi podczas użycia komendy 

IMG_2082.png.ff9962e548df9530c085fd92f4fb492e.pngIMG_2081.png.883990fa0aa8d518eff741b29080f083.png

Edytowane przez Av3rneS

Opublikowano

To skoro masz tylko tyle logów, wychodzi na to że warunek updateFromGameMaster się nie wykonuje, a właśnie tam jest wywołanie z wysyłaniem pakietu do wszystkich. Wygląda na to że flaga updateFromGameMaster nie jest ustawiana. Sprawdźmy to jeszcze podczas odbierania pakietu. I może to głupie pytanie, ale czy wykonujesz polecenie na postaci z GM, a może tylko na włączonym test serwerze? Jeśli na testowym to spróbuj na normalnym trybie z dodanym GM. 

 

void CInputDB::EventManager(const char* c_pData)
{
	CHARACTER_MANAGER& chrMngr = CHARACTER_MANAGER::Instance();
	sys_log(0, "EVENT_MANAGER: game odbiera pakiecik z db");
	
	const BYTE subIndex = *(BYTE*)c_pData;
	
	sys_log(0, "EVENT_MANAGER: subindex: %d", subIndex);
	
	c_pData += sizeof(BYTE);
	if (subIndex == EVENT_MANAGER_LOAD)
	{
		chrMngr.ClearEventData();
		sys_log(0, "EVENT_MANAGER: ładowanie");
		const BYTE dayCount = *(BYTE*)c_pData;
		c_pData += sizeof(BYTE);
		
		sys_log(0, "EVENT_MANAGER: Ładowanie %d dni", dayCount);

		const bool updateFromGameMaster = *(bool*)c_pData;
		c_pData += sizeof(bool);
		
		sys_log(0, "EVENT_MANAGER: UpdateFromGameMaster: %d", updateFromGameMaster);

		for (DWORD x = 0; x < dayCount; ++x)
		{
			const BYTE dayIndex = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			const BYTE dayEventCount = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			sys_log(0, "EVENT_MANAGER: Ladowanie dni %d eventday %d", dayIndex, dayEventCount);

			if (dayEventCount > 0)
			{
				std::vector<TEventManagerData> m_vec;
				m_vec.resize(dayEventCount);
				thecore_memcpy(&m_vec[0], c_pData, dayEventCount*sizeof(TEventManagerData));
				c_pData += dayEventCount * sizeof(TEventManagerData);
				chrMngr.SetEventData(dayIndex, m_vec);

			}
		}
		sys_log(0, "EVENT_MANAGER: tu jestem");
		if (updateFromGameMaster)
		{
			chrMngr.UpdateAllPlayerEventData();
			sys_log(0, "EVENT_MANAGER: aktualizacja do wszystkich graczy");
		}
	}
	else if (EVENT_MANAGER_EVENT_STATUS == subIndex)
	{
		const WORD& eventID = *(WORD*)c_pData;
		c_pData += sizeof(WORD);
		const bool& eventStatus = *(bool*)c_pData;
		c_pData += sizeof(bool);
		const int& endTime = *(int*)c_pData;
		c_pData += sizeof(int);
		chrMngr.SetEventStatus(eventID, eventStatus, endTime);
	}
}

 

Jeszcze w DB dodaj log w InitializeEventManager

bool CClientManager::InitializeEventManager(bool updateFromGameMaster)
{
	sys_log(0, "EVENT_MANAGER: GM: %d", updateFromGameMaster);
  • Sevence zmienił(a) tytuł na Problem z komendą 'event_manager update' w systemie Menadżera Eventów DracaryS
Opublikowano
  • Autor
Godzinę temu, Sevence napisał(a):

To skoro masz tylko tyle logów, wychodzi na to że warunek updateFromGameMaster się nie wykonuje, a właśnie tam jest wywołanie z wysyłaniem pakietu do wszystkich. Wygląda na to że flaga updateFromGameMaster nie jest ustawiana. Sprawdźmy to jeszcze podczas odbierania pakietu. I może to głupie pytanie, ale czy wykonujesz polecenie na postaci z GM, a może tylko na włączonym test serwerze? Jeśli na testowym to spróbuj na normalnym trybie z dodanym GM. 

 

void CInputDB::EventManager(const char* c_pData)
{
	CHARACTER_MANAGER& chrMngr = CHARACTER_MANAGER::Instance();
	sys_log(0, "EVENT_MANAGER: game odbiera pakiecik z db");
	
	const BYTE subIndex = *(BYTE*)c_pData;
	
	sys_log(0, "EVENT_MANAGER: subindex: %d", subIndex);
	
	c_pData += sizeof(BYTE);
	if (subIndex == EVENT_MANAGER_LOAD)
	{
		chrMngr.ClearEventData();
		sys_log(0, "EVENT_MANAGER: ładowanie");
		const BYTE dayCount = *(BYTE*)c_pData;
		c_pData += sizeof(BYTE);
		
		sys_log(0, "EVENT_MANAGER: Ładowanie %d dni", dayCount);

		const bool updateFromGameMaster = *(bool*)c_pData;
		c_pData += sizeof(bool);
		
		sys_log(0, "EVENT_MANAGER: UpdateFromGameMaster: %d", updateFromGameMaster);

		for (DWORD x = 0; x < dayCount; ++x)
		{
			const BYTE dayIndex = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			const BYTE dayEventCount = *(BYTE*)c_pData;
			c_pData += sizeof(BYTE);

			sys_log(0, "EVENT_MANAGER: Ladowanie dni %d eventday %d", dayIndex, dayEventCount);

			if (dayEventCount > 0)
			{
				std::vector<TEventManagerData> m_vec;
				m_vec.resize(dayEventCount);
				thecore_memcpy(&m_vec[0], c_pData, dayEventCount*sizeof(TEventManagerData));
				c_pData += dayEventCount * sizeof(TEventManagerData);
				chrMngr.SetEventData(dayIndex, m_vec);

			}
		}
		sys_log(0, "EVENT_MANAGER: tu jestem");
		if (updateFromGameMaster)
		{
			chrMngr.UpdateAllPlayerEventData();
			sys_log(0, "EVENT_MANAGER: aktualizacja do wszystkich graczy");
		}
	}
	else if (EVENT_MANAGER_EVENT_STATUS == subIndex)
	{
		const WORD& eventID = *(WORD*)c_pData;
		c_pData += sizeof(WORD);
		const bool& eventStatus = *(bool*)c_pData;
		c_pData += sizeof(bool);
		const int& endTime = *(int*)c_pData;
		c_pData += sizeof(int);
		chrMngr.SetEventStatus(eventID, eventStatus, endTime);
	}
}

 

Jeszcze w DB dodaj log w InitializeEventManager

bool CClientManager::InitializeEventManager(bool updateFromGameMaster)
{
	sys_log(0, "EVENT_MANAGER: GM: %d", updateFromGameMaster);

To jest z kanałów 

 

Feb  7 12:09:21 :: EVENT_MANAGER: game odbiera pakiecik z db
Feb  7 12:09:21 :: EVENT_MANAGER: subindex: 0
Feb  7 12:09:21 :: EVENT_MANAGER: ?adowanie
Feb  7 12:09:21 :: EVENT_MANAGER: ?adowanie 2 dni
Feb  7 12:09:21 :: EVENT_MANAGER: UpdateFromGameMaster: 0
Feb  7 12:09:21 :: EVENT_MANAGER: Ladowanie dni 6 eventday 1
Feb  7 12:09:21 :: EVENT_MANAGER: Ladowanie dni 7 eventday 1
Feb  7 12:09:21 :: EVENT_MANAGER: tu jestem
 

I występuje zaraz po starcie kanału

 

 

a to z DB 

 

EVENT_MANAGER: GM: 0
 

 

 

Próbowałem i na test serwerze i bez z nadanym gm 

Opublikowano

Okey to już sporo wiemy, wygląda na to że jest problem w komunikacji. I ten warunek się wcale nie wykonuje: 

	if (subIndex == EVENT_MANAGER_UPDATE)
	{
		sys_log(0, "EVENT_MANAGER: Odbieram request.");
		InitializeEventManager(true);
	}

 

Musisz jeszcze dodać parę logów, co się dzieje podczas wywołania komendy oraz przy odbiorze. 

	else if (vecArgs[1] == "update")
	{
		if (!ch->IsGM())
			return;
		const BYTE subHeader = EVENT_MANAGER_UPDATE;
		//db_clientdesc->DBPacketHeader(HEADER_GD_EVENT_MANAGER, 0, sizeof(BYTE));
		//db_clientdesc->Packet(&subHeader, sizeof(BYTE));
		
		sys_log(0, "EVENT_MANAGER: EVENT_MANAGER_UPDATE enum value: %d", EVENT_MANAGER_UPDATE);
		sys_log(0, "EVENT_MANAGER: subHeader value: %d", subHeader);
		db_clientdesc->DBPacket(HEADER_GD_EVENT_MANAGER, 0, &subHeader, sizeof(BYTE));

		ch->ChatPacket(CHAT_TYPE_INFO, "successfully update!");
	}

 

Do client managera

void CClientManager::RecvEventManagerPacket(const char* data)
{
	sys_log(0, "EVENT_MANAGER: Received subIndex: %d", subIndex);
	sys_log(0, "EVENT_MANAGER: EVENT_MANAGER_UPDATE value: %d", EVENT_MANAGER_UPDATE);
	sys_log(0, "EVENT_MANAGER: EVENT_MANAGER_LOAD value: %d", EVENT_MANAGER_LOAD);
	sys_log(0, "EVENT_MANAGER: Finiszer: %d", (subIndex == EVENT_MANAGER_UPDATE));
	
	const BYTE subIndex = *(BYTE*)data;
	data += sizeof(BYTE);
	if (subIndex == EVENT_MANAGER_UPDATE)
		InitializeEventManager(true);
	else if (subIndex == EVENT_MANAGER_REMOVE_EVENT)
	{
		const WORD index = *(WORD*)data;
		data += sizeof(WORD);

		if (m_EventManager.size())
		{
			for (auto it = m_EventManager.begin(); it != m_EventManager.end(); ++it)
			{
				for (DWORD j = 0; j < it->second.size(); ++j)
				{
					TEventManagerData& eventPtr = it->second[j];
					if (eventPtr.eventID == index)
					{
						eventPtr.endTime = time(0);
						UpdateEventManager();
						char szQuery[QUERY_MAX_LEN];
						snprintf(szQuery, sizeof(szQuery), "UPDATE player.event_table SET endTime = NOW() WHERE id = %u", index);
						std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
						return;
					}
				}
			}
		}
	}
}

 

Prawdopodobnie subindex będzie miał niewłaściwą wartość prze co InitializeEventManager nie zostanie ustawiony na true i dalsze kroki się nie wykonują. Możesz wrzucić tu jeszcze swoje tables.h, input_db.cpp, clientmanagera, ale pierwsze zdebuguj jeszcze te kwestie abyśmy wiedzieli dokładnie, ale jest duża szansa że właśnie zobaczymy niepoprawne subindex. 

 

Opublikowano

Porównaj kod z Zenarisem, stamtąd działa poprawnie.

Opublikowano

mam ten sam problem z logów nic nie wychodzi tyle że komenda do serwera idzie

Opublikowano
18 godzin temu, Perez napisał(a):

mam ten sam problem z logów nic nie wychodzi tyle że komenda do serwera idzie

No, debugujesz, debugujesz i w końcu dochodzisz do źródła problemu. Czekamy aż koleżka podrzuci więcej logów. 

Opublikowano
  • Autor
W dniu 7.02.2025 o 11:50, Sevence napisał(a):

Okey to już sporo wiemy, wygląda na to że jest problem w komunikacji. I ten warunek się wcale nie wykonuje: 

	if (subIndex == EVENT_MANAGER_UPDATE)
	{
		sys_log(0, "EVENT_MANAGER: Odbieram request.");
		InitializeEventManager(true);
	}

 

Musisz jeszcze dodać parę logów, co się dzieje podczas wywołania komendy oraz przy odbiorze. 

	else if (vecArgs[1] == "update")
	{
		if (!ch->IsGM())
			return;
		const BYTE subHeader = EVENT_MANAGER_UPDATE;
		//db_clientdesc->DBPacketHeader(HEADER_GD_EVENT_MANAGER, 0, sizeof(BYTE));
		//db_clientdesc->Packet(&subHeader, sizeof(BYTE));
		
		sys_log(0, "EVENT_MANAGER: EVENT_MANAGER_UPDATE enum value: %d", EVENT_MANAGER_UPDATE);
		sys_log(0, "EVENT_MANAGER: subHeader value: %d", subHeader);
		db_clientdesc->DBPacket(HEADER_GD_EVENT_MANAGER, 0, &subHeader, sizeof(BYTE));

		ch->ChatPacket(CHAT_TYPE_INFO, "successfully update!");
	}

 

Do client managera

void CClientManager::RecvEventManagerPacket(const char* data)
{
	sys_log(0, "EVENT_MANAGER: Received subIndex: %d", subIndex);
	sys_log(0, "EVENT_MANAGER: EVENT_MANAGER_UPDATE value: %d", EVENT_MANAGER_UPDATE);
	sys_log(0, "EVENT_MANAGER: EVENT_MANAGER_LOAD value: %d", EVENT_MANAGER_LOAD);
	sys_log(0, "EVENT_MANAGER: Finiszer: %d", (subIndex == EVENT_MANAGER_UPDATE));
	
	const BYTE subIndex = *(BYTE*)data;
	data += sizeof(BYTE);
	if (subIndex == EVENT_MANAGER_UPDATE)
		InitializeEventManager(true);
	else if (subIndex == EVENT_MANAGER_REMOVE_EVENT)
	{
		const WORD index = *(WORD*)data;
		data += sizeof(WORD);

		if (m_EventManager.size())
		{
			for (auto it = m_EventManager.begin(); it != m_EventManager.end(); ++it)
			{
				for (DWORD j = 0; j < it->second.size(); ++j)
				{
					TEventManagerData& eventPtr = it->second[j];
					if (eventPtr.eventID == index)
					{
						eventPtr.endTime = time(0);
						UpdateEventManager();
						char szQuery[QUERY_MAX_LEN];
						snprintf(szQuery, sizeof(szQuery), "UPDATE player.event_table SET endTime = NOW() WHERE id = %u", index);
						std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
						return;
					}
				}
			}
		}
	}
}

 

Prawdopodobnie subindex będzie miał niewłaściwą wartość prze co InitializeEventManager nie zostanie ustawiony na true i dalsze kroki się nie wykonują. Możesz wrzucić tu jeszcze swoje tables.h, input_db.cpp, clientmanagera, ale pierwsze zdebuguj jeszcze te kwestie abyśmy wiedzieli dokładnie, ale jest duża szansa że właśnie zobaczymy niepoprawne subindex. 

 

Z tego co tutaj dalej żaden z syslogow mi się nie pokazuje 😄

 

btw sorki za brak odpowiedzi ale no time było 

  • Poly zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.