Skocz do zawartości
Drogi Gościu. Nie jesteś zalogowany, bądź zarejestrowany na naszym forum, ale pomimo tego możesz tworzyć wątki i odpowiadać w tematach, z tym że wszystkie Twoje wiadomości będą musiały zostać ręcznie zatwierdzone przez Administratora. Z tego powodu zachęcamy Cię do założenia konta (bądź zalogowania), aby uniknąć tych ograniczeń.

Propozycja: Umożliwienie otwierania skrzyń po otwarciu enderchesta


ArturCyferki

Wyróżnione odpowiedzi

Propozycja: Umożliwienie otwierania skrzyń po otwarciu enderchesta
 

Twój nick (z serwera): artur3126
Propozycja dotyczy (tytuł): Umożliwienie otwierania skrzyń po otwarciu enderchesta
Opis propozycji: Proponuję usunięcie ograniczenia uniemożliwiającego otwarcie dowolnej skrzyni przez 5 sekund po otwarciu Enderchesta.

Dowiedziałem się już, że zostało to wprowadzone, aby zapobiec klonowaniu itemów przy użyciu Enderchesta.

Jest to jednak pierwszy serwer, na którym spotkałem się z takim ograniczeniem - oznacza to, że każdy inny serwer znalazł jakiś sposób, aby temu zapobiec, zatem jest to możliwe.

 

Wnioskuję o zablokowanie klonowania itemów w inny sposób i usunięcie tego ograniczenia, gdyż jest ono niezwykle irytujące.

 

Jeżeli jest to zadanie przerastające możliwości deweloperów serwera, to służę pomocą - mam spore doświadczenie w programowaniu i zajmowałem się kilka lat serwerami Minecraft. Jestem przekonany że wspólnymi siłami uda się wypracować jakieś rozwiązanie.
Dodatkowe ss'y2023-05-13-13-31-44.png

  • XD 1
Odnośnik do komentarza
Udostępnij na innych stronach

KidMod

Na tak. Mimo ,że te 5 sekund to mało to i tak jest to irytujące.

Odnośnik do komentarza
Udostępnij na innych stronach

Po fakcie, iż na serwerze jest większy EnderChest dla VIP/SVIP oraz po fakcie że jest komenda /ec niedostępna dla graczy, wnioskuję, że serwer korzysta z tego pluginu:

https://www.spigotmc.org/resources/custom-enderchest.8868/ bądź jego modyfikacji i najprawdopodobniej także z zapisu do bazy danych MySQL. Możliwość klonowania itemów wynika najprawdopodobniej z tego, że zapisywanie do bazy MySQL odbywa się asynchronicznie, niezależnie od odczytu (który jest "ważniejszy"), więc możliwe jest, że nastąpi taka sytuacja:

  1. odczyt zawartości EnderChest
  2. Zakolejkowanie zapisu informacji o tym, że nastąpiło wyjęcie czegoś z Enderchest
  3. odczyt zawartości EnderChest
    • odczytana została "stara" zawartość EnderChest
  4. Zapis informacji o tym, że nastąpiło wyjęcie czegoś z Enderchest

Opóźnienie 5 sekund ma przed tym zapobiec, jednak nie zawsze zapobiegnie - jeżeli baza w danym momencie będzie bardzo obciążona zapytaniami, 5 sekund może nie wystarczyć na zapis.

Niezbyt logiczne jest ograniczenie na otwieranie innych skrzyń, a nie samego enderchesta. Prawdopodobnie ma to zapobiec identycznej sytuacji w momencie włożenia czegoś do EnderChesta, jednak aby temu zapobiec, wystarczy zabrać item od gracza w momencie zakolejkowania zapisu do bazy.

 

Szczerze mówiąc, zetknąłem się już raz z identycznym problemem, gdy ludzie na moim serwerze FiveM kopiowali itemy przy użyciu schowków w autach, które częściowo sam pisałem.

 

Rozwiązania tego problemu są następujące:

  1. zapis synchroniczny
    • banalne do implementacji
    • może spowodować ogromne opóźnienia w otwieraniu EnderChesta przez graczy, gdy akurat ktoś wrzuca do niego dużo rzeczy, a baza jest przymulona
  2. wstrzymywanie możliwości korzystania z EnderChest do momentu zapisu wszystkich spowodowanych przez danego gracza zmian
    • implementacja dosyć łatwa
      • dla każdego gracza trzymamy liczbę zakolejkowanych zmian
      • zwiększamy ją o 1 w momencie zakolejkowania czegoś
      • zmniejszamy ją o 1 na callbacku asynchronicznym od bazy
    • spowoduje drobne opóźnienie w ponownym otwarciu EnderChesta po krótkiej chwili
  3. przechowywanie zmian lokalnie w pamięci do momentu ich zapisania
    • implementacja średnio-trudna
      • gdy gracz wkłada coś do EC, zapisujemy informację w tablicy, że tej rzeczy ma ileś więcej (w zależności od tego, ile włożył)
      • gdy gracz wyjmuje coś z EC, zapisujemy informację w tablicy, że tej rzeczy ma ileś mniej (w zależności od tego, ile wyjął)
      • przy każdym "renderowaniu" EnderChesta musimy uwzględnić te zmiany
      • po każdym callbacku od bazy należy zmiany te usunąć z ww. tablic
    • brak jakichkolwiek dodatkowych opóźnień

Mam nadzieję, że te wskazówki implementacyjne pomogą deweloperom szybciej rozwiązać problem 🙂

Edytowane przez artur3126
dokładniejsze rozpisanie rozwiązania 3
Odnośnik do komentarza
Udostępnij na innych stronach

M7kRaFt.gif

Propozycja została wstępnie zaakceptowana!

Propozycja została skierowana bezpośrednio do serwerowego Technika celem weryfikacji możliwości jej implementacji.

image.png.b7bfc30b280605c9e35cbc2e863fe916.png

Odnośnik do komentarza
Udostępnij na innych stronach

  • 8 miesięcy później...
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...