Opublikowano 25 Maja 20241 r 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 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się Prezentacja rozwiązania 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się Aktualizacja 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się Implementacja 📂Lokalizacja pliku: 'common -> tables.h' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'db -> ClientManagerGuild.cpp' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'db -> ClientManager.h' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'db -> ClientManagerPlayer.cpp' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'game -> input_db.cpp' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'game -> input.h' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'game -> guild.cpp' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ♻️Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ♻️Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się Wersja dla EntryCore 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ♻️Zamień 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'game -> guild.h' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamPhaseGame.cpp' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'root -> game.py' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się 📂Lokalizacja pliku: 'root -> interfacemodule.py' 🔍Szukaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się ➕Dodaj 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się Enjoy 😉
Opublikowano 27 Maja 20241 r 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 27 Maja 20241 r przez ExoCarossa
Opublikowano 27 Maja 20241 r Autor Pokaż swoją funkcję 'AddComment'. W zasadzie zostaw ją tak jak masz zamień tylko 'RefreshCommentForce' -> 'RefreshCommentsForAllMembers'.
Opublikowano 27 Maja 20241 r 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 27 Maja 20241 r 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ą.