Latest Post

Dzień 1 Jak założyć publiczny serwer Minecraft | przez Sama Starkmana

Dom cheatera spalony w Lunie, Ultima Online (2008)
Snidely Whiplash: Notoryczny UO Gold Duper
Strażnicy! Strażnicy!
Definicje granic obszarów UO w Trammel (2012)
  1. Kod areaserv jest genialny. Był wielokrotnie poprawiany i przepisywany, ale w moich późniejszych latach stał się już całkiem “inteligentny”, jeśli chodzi o sposób przewidywania stanu gracza i wstępnego serializowania obiektów, zanim jeszcze doszło do przeniesienia granic.
  2. Jednak niezależnie od tego, jak dobry był kod, my, programiści, wprowadziliśmy do gry tyle złożoności, że źródeł duplikatów nie brakowało – i często nie były to już tylko problemy związane z areaserv. Nie pomogło to, że projektanci gry mogli pisać kod na poziomie produkcyjnym w Wombat (nasz własny język skryptowy oparty na zdarzeniach), który zawierał mnóstwo wrapperów dla kodu zarządzania obiektami C++.
  1. Każdy shard wykonywał sekwencję zamykania/tworzenia kopii zapasowych o określonej godzinie we wczesnych godzinach porannych. (Świetnie, że nie trzeba było naprawiać wycieków pamięci!).
  2. Kompletny stan gry każdego z obszarów był zrzucany z pamięci do dużego binarnego pliku kopii zapasowych – w momencie, gdy dołączyłem do zespołu, ich rozmiar zbliżał się do 4 GB.
  3. Po zakończeniu backupu areaservy wyłączały się, restartowały i przechodziły w stan gotowości, podczas gdy “gameserv” robił to samo. Można pomyśleć, że gameserv to serwer, który koordynuje wszystkie areaservy i przekazuje zalogowanych graczy do właściwego areaservu.
  4. Serwer gier wyłączał się, restartował, a następnie wydawał polecenie, aby każdy areaerv załadował swoją ostatnią znaną dobrą kopię zapasową.
  5. Każdy areaerv załaduje binarną kopię zapasową i odtworzy zapisany wcześniej stan gry; będzie to również wykonać wszelkie wyzwalacze/haki w kodzie skryptowym dla obiektów/mobili, które mówiły “Zrób X, gdy serwer się załaduje”.
  6. [A bunch of other stuff here, including spawning new mobs or daily rares]
  7. Serwery obszarowe informowały o tym, że wszystko jest w porządku i informowały serwer gier, a serwer gier ponownie ogłaszał się na serwerach logowania, że jest dostępny do gry.
  1. Każdy obiekt w grze, po załadowaniu, miał hak do ogólnego skryptu “preload”, który dołączał się, wykonywał i odłączał, zanim pozwolił obiektowi wykonać inne skrypty. Było to bardzo przydatne przy czyszczeniu błędów wdrażania, jeżeli coś zrobiliśmy źle i w trakcie łatania uszkodziliśmy jakieś obiekty w grze.
  2. W skrypcie preload dodałem wyzwalacz ze zdarzeniem “beforeServerLoad”, który sprawdzał typ przedmiotu: jeżeli znajdował się na ustalonej wcześniej liście najdroższych/najrzadszych typów przedmiotów, kontynuował plan.
  3. Jeżeli przedmiot nie posiadał “tagu”, został on teraz utworzony: objvar typu “string”, który zawierał hash aktualnego czasu, identyfikator areaserv i gameserv (oraz inne unikalne dane). Był to naprawdę długi, losowo wyglądający fragment tekstu (większy niż 32-bitowa liczba całkowita), jak “29bb546a415ff874e5129549fe8064249e8f1b2996fa2e7d52879d2ec24e06fd”.
  4. Po uzyskaniu tagu (lub jeśli już go posiadał), wysyłał wiadomość do gameserv (pamiętajmy, że na każdym shardzie był tylko jeden taki tag) i prosił gameserv o umieszczenie go w rejestrze wyszukiwania. Jeśli *tag* istniał już w rejestrze, przedmiot był trwale oznaczany jako “I AM DUPED” (ponownie, z objvar) w jawnym tekście – ponieważ przedstawiciele Działu Obsługi Klienta w kliencie Boga mogli to zobaczyć.
  5. Rejestr lookup utrzymywał się tylko do momentu załadowania wszystkich areaservs, potem był usuwany, aby zaoszczędzić pamięć.

Zarząd

Obsługa klienta

Co twórcy gier online otwierają z każdą łatką.

Community Manager

  1. Skasować dom i całą jego zawartość. Wszystko. Natychmiast. Rekursywnie. *poof*
  2. W wyznaczonym wcześniej prostokątnym obszarze, pasującym do wymiarów domu, powstaje masa nieruchomego “gruzu budowlanego”. Został on zabarwiony na ciemno czarny kolor, aby wyglądał jak pokryty sadzą.
  3. Wśród gruzów wysypać kilka wiecznych “pól ogniowych”.
  4. Stworzyć słomianą kukłę z napisem “Kukła zdrajcy”, aby umieścić ją pośrodku płonących gruzów.
Kolejny dom spalony z sukcesem – z efektem cząsteczkowym

No to fajnie, ale nie róbcie tego więcej

Kilka wyciągniętych wniosków (Satoshi Surprise?)