Skocz do zawartości

Naprawa błędu usuwania postaci – postać nie jest usuwana z gildii i komentarze pozostają

Opublikowano

image.png.a144663d4007d16872d3413c4a1a8bf3.png

 

Cześć,

 

Opis problemu

Dzisiaj, po zgłoszeniu przez @WhiteBambo88, odkryliśmy poważny błąd. który dotyczy nie tylko EntryCore, ale wszystkich źródeł. Do tej pory nie wydano publicznie poprawki. Podczas usuwania postaci, rekord dotyczący członków gildii są czyszczone jedynie w bazie danych, bez przesyłania odpowiednich informacji do serwera i klienta gry. W rezultacie gracz pozostaje w gildii aż do restartu serwera, a jego komentarze nigdy nie zostają usunięte.

 

Przyczyna problemu

Podczas usuwania postaci nie jest przesyłany odpowiedni pakiet do serwera gry, który powinien informować o konieczności usunięcia komentarzy gildii powiązanych z tą postacią. W efekcie zmiany są wprowadzane tylko w bazie danych, co prowadzi do niespójności danych między serwerem gry a bazą danych.

 

Dziękuję @WhiteBambo88 za zgłoszenie i pomoc w odkryciu tego problemu. 🙏

 

Aktualizacja

  • Rozwiązano problem z usuwaniem wszystkim komentarzy zamiast tylko postaci, która została usunięta,
  • Wdrożono automatyczne odświeżanie komentarzy po usunięciu postaci,
  • Nowa funkcja pobierająca nazwą gracza przez id 'GetCharacterName',
  • Teraz usuwanie w kliencie gry będzie wysyłać zmiany do wszystkich gracz gildii., 
  • Dodawanie komentarza jest wysyłane do wszystkich aktywnych członków gildii,

 

Prezentacja błędu

 

Prezentacja rozwiązania

 

Aktualizacja

 

Implementacja

📂Lokalizacja pliku: 'common -> tables.h'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 🔍Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'db -> ClientManagerGuild.cpp'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'db -> ClientManager.h'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'db -> ClientManagerPlayer.cpp'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'game -> input_db.cpp'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 🔍Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'game -> input.h'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'game -> guild.cpp'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

🔐 Ukryta Treść 🔐


♻️Zamień

🔐 Ukryta Treść 🔐

 

 🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

🔐 Ukryta Treść 🔐

 

♻️Zamień

🔐 Ukryta Treść 🔐

 

 

Wersja dla EntryCore

 

 🔍Szukaj

🔐 Ukryta Treść 🔐

 

 ♻️Zamień

🔐 Ukryta Treść 🔐

 

 

📂Lokalizacja pliku: 'game -> guild.h'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

 📂Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamPhaseGame.cpp'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

 📂Lokalizacja pliku: 'root -> game.py'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

 📂Lokalizacja pliku: 'root -> interfacemodule.py'

 

🔍Szukaj

🔐 Ukryta Treść 🔐

 

Dodaj

🔐 Ukryta Treść 🔐

 

 

Enjoy 😉

 

Featured Replies

Opublikowano

potężna zmiana ❤️

Opublikowano
  • Premium

#EntryCore coraz lepsze

Opublikowano
Spoiler

🔍Szukaj

void CGuild::AddComment(LPCHARACTER character, const std::string& comment)

 

DBManager::instance().FuncAfterQuery(std::bind(&CGuild::RefreshCommentForce, this, character->GetPlayerID()), query.c_str());

 

♻️Zamień

DBManager::instance().FuncAfterQuery(std::bind(&CGuild::RefreshCommentsForAllMembers, this), query.c_str());

guild.cpp:1042:95: error: use of undeclared identifier 'query'
        DBManager::instance().FuncAfterQuery(std::bind(&CGuild::RefreshCommentsForAllMembers, this), query.c_str());

Moge usunać query skoro i tak go nie ma w funkcji czy trzeba inaczej to zrobić?

Edytowane przez ExoCarossa

Opublikowano
  • Autor

Pokaż swoją funkcję 'AddComment'. W zasadzie zostaw ją tak jak masz zamień tylko 'RefreshCommentForce' -> 'RefreshCommentsForAllMembers'. 

Opublikowano
2 minuty temu, Sevence napisał(a):

Pokaż swoją funkcję 'AddComment'. 

Spoiler
void CGuild::AddComment(LPCHARACTER ch, const std::string& str)
{
	auto now = std::chrono::steady_clock::now();
	if (now - lastCommentTime < FloodProtectionInterval)
	{
		auto remainingTime = std::chrono::duration_cast<std::chrono::seconds>(FloodProtectionInterval - (now - lastCommentTime)).count();
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("NOTIFICATION_ADD_COMMEND_GUILD_FLOOD_PROTECTION_%lld"), remainingTime);
		return;
	}

	lastCommentTime = now;
  
	if (str.length() > GUILD_COMMENT_MAX_LEN)
		return;

	if (checkForWhitespaceOnlyOrEmpty(str))
	{
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("NOTIFICATION_EMPTY_COMMENT_GUILD"));
		return;
	}

	char text[GUILD_COMMENT_MAX_LEN * 2 + 1];
	DBManager::instance().EscapeString(text, sizeof(text), str.c_str(), str.length());

	DBManager::instance().FuncAfterQuery(std::bind(&CGuild::RefreshCommentsForAllMembers, this), query.c_str());
			"INSERT INTO guild_comment%s(guild_id, name, notice, content, time) VALUES(%u, '%s', %d, '%s', NOW())", 
			get_table_postfix(), m_data.guild_id, ch->GetName(), (str[0] == '!') ? 1 : 0, text);
}

 

Spoiler
void		AddComment(LPCHARACTER ch, const std::string& str);

 

Opublikowano
  • Autor

Sprawdź tak: 

void CGuild::AddComment(LPCHARACTER ch, const std::string& str)
{
	auto now = std::chrono::steady_clock::now();
	if (now - lastCommentTime < FloodProtectionInterval)
	{
		auto remainingTime = std::chrono::duration_cast<std::chrono::seconds>(FloodProtectionInterval - (now - lastCommentTime)).count();
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("NOTIFICATION_ADD_COMMEND_GUILD_FLOOD_PROTECTION_%lld"), remainingTime);
		return;
	}

	lastCommentTime = now;
  
	if (str.length() > GUILD_COMMENT_MAX_LEN)
		return;

	if (checkForWhitespaceOnlyOrEmpty(str))
	{
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("NOTIFICATION_EMPTY_COMMENT_GUILD"));
		return;
	}

	char text[GUILD_COMMENT_MAX_LEN * 2 + 1];
	DBManager::instance().EscapeString(text, sizeof(text), str.c_str(), str.length());

	char query[1024];
	snprintf(query, sizeof(query),
			 "INSERT INTO guild_comment%s (guild_id, name, notice, content, time) VALUES (%u, '%s', %d, '%s', NOW())", 
			 get_table_postfix(), m_data.guild_id, ch->GetName(), (str[0] == '!') ? 1 : 0, text);

	DBManager::instance().FuncAfterQuery(std::bind(&CGuild::RefreshCommentsForAllMembers, this), query);
}

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...