Skocz do zawartości
Masz już aplikację Sharegon?

Odkryj wszystkie możliwości. Dowiedz się więcej

Sharegon.pl

Zainstaluj aplikację Sharegon i korzystaj z powiadomień push oraz licznika nowych aktywności bezpośrednio z ekranu głównego.

Aby zainstalować tę aplikację na iOS i iPadOS.
  1. Tap the Share icon in Safari
  2. Przewiń menu i stuknij Dodaj do ekranu początkowego.
  3. Stuknij Dodaj w prawym górnym rogu.
Zainstaluj aplikację Sharegon na Androidzie
  1. Otwórz Sklep Google Play na swoim smarfonie.
  2. Wyszukaj „Sharegon” w pasku wyszukiwania.
  3. Stuknij „Zainstaluj”, aby pobrać aplikację.

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

Nieaktywny

Featured Replies

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 😉

 

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
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);
}

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Konto

Nawigacja

Skonfiguruj powiadomienia push w przeglądarce.

Chrome (Android)
  1. Stuknij ikonę kłódki obok paska adresu.
  2. Wybierz Uprawnienia → Powiadomienia.
  3. Dostosuj swoje preferencje.
Chrome (Desktop)
  1. Kliknij ikonę kłódki na pasku adresu.
  2. Wybierz Ustawienia witryny.
  3. Znajdź Powiadomienia i dostosuj swoje preferencje.