Opublikowano 25 Maja 20241 r Cześć,✋ Opis problemu Dzisiaj, po zgłoszeniu przez , 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ę 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 Tylko zalogowani Zaloguj się, aby wyświetlić chronioną treść Ten post zawiera treści dostępne tylko dla członków. Zaloguj się lub utwórz konto, aby odblokować całą zawartość tego posta. Zaloguj się Utwórz konto ➕Dodaj 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'db -> ClientManagerGuild.cpp' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'db -> ClientManager.h' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'db -> ClientManagerPlayer.cpp' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'game -> input_db.cpp' 🔍Szukaj ➕Dodaj 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'game -> input.h' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'game -> guild.cpp' 🔍Szukaj ♻️Zamień 🔍Szukaj ➕Dodaj 🔍Szukaj ♻️Zamień Wersja dla EntryCore 🔍Szukaj ♻️Zamień 📂Lokalizacja pliku: 'game -> guild.h' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamPhaseGame.cpp' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'root -> game.py' 🔍Szukaj ➕Dodaj 📂Lokalizacja pliku: 'root -> interfacemodule.py' 🔍Szukaj ➕Dodaj 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 W dniu 27.05.2024 o 07:12, Sevence napisał(a): Pokaż swoją funkcję 'AddComment'. Spoiler CKod został skopiowanyvoid 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 CKod został skopiowanyvoid AddComment(LPCHARACTER ch, const std::string& str);
Opublikowano 27 Maja 20241 r Autor Sprawdź tak: CKod został skopiowanyvoid 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