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 polecenia 'reload q' powodującego awarię rdzenia gry

Nieaktywny

Featured Replies

Opublikowano

bugfix.webp.0a739ad15af71c44f5367650b6c9e164.webp

 

Witam wszystkim, 🤚

 

Wprowadzenie

Funkcja 'reload q' do przeładowywania wszystkich zadań na serwerze ma krytyczny błąd. Na serwerze testowym możesz nawet nie zauważyć żadnego błędu, ale na serwerze produkcyjnym gdzie jest duża ilość graczy już tak. Gdy gracz będzie miał otworzone zadanie zawierające przycisk i jednocześnie administrator serwera uruchomi polecenie 'reload q' bez wcześniejszego zamknięcia przez gracza okna z zadaniem, rdzeń gry ulegnie awarii po ponownym kliknięciu przycisku przez gracza. 

 

System zadań bazuje na mechanice 'zawieszania i wznowienia'. Oznacza to, że podczas przetwarzania zadania, gdy napotkamy instrukcje wymagające interakcji z graczem, takie jak 'wait()' czy 'select()', przetwarzanie jest chwilowo zawieszone, a aktualny stan zadania zapisywany w dedykowanej zmiennej. Po otrzymaniu odpowiedzi od gracza, przetwarzanie jest wznowione od miejsca, w którym zostało zawieszone.

 

Komplikacje pojawiają przy użyciu komendy 'reload q'. Ta funkcja usuwa wszystkie zadania z pamięci, by następnie wczytuje je ponowie. Konflikt następuje, gdy po tej operacji gracz interaguje z przyciskiem zadania: serwer stara się odtworzyć zawieszony stan zadania za pomocą uprzednio wspomnianej zmiennej. Niestety, zmienna ta pełni funkcję wskaźnika wskazującego na konkretną pozycję w pamięci, gdzie przechowywane są rzeczywiste dane.

 

Z racji operacji przeładowania, te określone miejsca w pamięci stają się niedostępne. Gra, nieświadoma tej zmiany (wskaźnik nadal wskazuje pewną pozycję), dąży do kontynuowania zadania. Konflikt pojawia się, gdy gra próbuje korzystać z danych, do których wskaźnik miał prowadzić, co skutkuje awarią.

 

 

Rozwiązanie:

Aby wyeliminować opisany problem, konieczne jest wyczyszczenie wszystkich wskaźników dla każdego gracza.

 

 

Prezentacja błędu:

Spoiler

 

Rozwiązanie błędu:

Spoiler

 

Implementacja:

📁 Lokalizacja pliku: 'game -> questmanager.cpp'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📁 Lokalizacja pliku: 'game -> questmanager.h'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStreamEvent.cpp'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

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

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

📁 Lokalizacja pliku: 'UserInterface -> PythonNetworkStream.h'

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

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

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

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

 

 🔍 Szukaj

🔐 Ukryta Treść 🔐

 

 Dodaj

🔐 Ukryta Treść 🔐

 

 

 

Edytowane przez Sevence
Aktualizacja rozwiązania

  • 2 tygodnie później...
  • 4 tygodnie później...

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.