Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - bogu9821

Strony: [1]
1
Spolszczenie by Bractwo Gothica i Team Sefaris

Opis:
Akcja Odysei toczy się w momencie, gdy bezimienny bohater opuszcza Khorinis i wyrusza na Myrtanę.
W tym czasie bohater modyfikacji - Roland, rezyduje w morskiej twierdzy paladynów na Athanos jako jeden z rekrutów.
Wojna z orkami omijała tę wyspę szerokim łukiem, lecz mimo tego nasz bohater marzy o zostaniu paladynem
i postanawia dzielnie stawić czoło zielonoskórym.
Decyduje się na opuszczenie wyspy, aby spełnić swoje marzenie, jednak nie wszystko jest takie proste, jakby się na początku wydawało.
Musi przebyć długą i wyboistą drogę oraz przeżyć wiele ekscytujących i niełatwych przygód.
Poznaje w międzyczasie wrogów królestwa oraz ich zamiary.
Chodzi im o ustanowienie panowania Beliara i zniewolenie wszystkich ludzi lub, jeśli nie jest to możliwe, zniszczenie ich.
Roland szybko zdaje sobie sprawę, że bycie paladynem nie jest celem, ale sposobem.
Podąża więc wybraną przez siebie ścieżką i zdecydowanie sprzeciwia się najeźdźcom i broni niepodległości ludu Królestwa Myrtany.



Instrukcja:
Spoiler
> Modyfikacja po zainstalowaniu będzie włączana przez GothicStarter.exe i można mieć ją zainstalowaną z innymi modami(nie dotyczy modyfikacji Returning). Jeśli nie wiesz czy masz już zainstalowany PlayerKit / SystemPack / Union / DX11 nie jest to problem ponieważ pliki zostaną nadpisane. Jeśli jednak przy instalacji występują problemy, zalecane jest zainstalowanie modyfikacji na czystego Gothica. Po każdym kroku wypadałoby też uruchomić grę i sprawdzić czy wszystko jest w porządku.

UWAGA!
BUNDLE PATCH JEST WYMAGANY DO POPRAWNEJ ROZGRYWKI, NA ZWYKŁYM SYSTEMPACKU MOŻE WYSTĄPIĆ KRYTYCZNY BŁĄD ROZGRYWKI, UNIEWMOŻLIWIAJĄCY WCZYTANIE ŚWIATA (TAMORY).

Masz problem Union fatal ze znakami? Ścieżka do gothica nie może zawierać polskich, ani nietypowych znaków (problem występuje często, gdy ma się zainstalowanego gothica w folderze Gothic II Złota Edycja)

Instalowanie wszelkiego rodzaju pluginów/skryptów uniona (np. przyspieszenie gry, quickloot, quicksave na wielu save, alternatywny system dmg i inne) jest niezalecane z powodu obecności Ikarusa.


#1 - Pobierz i wypakuj zawartość archiwum `Gothic II Patch Bundle` do folderu z grą.
> Paczka zawiera wszystkie pliki do poprawnego działania gry, są to: Player Kit 2.8, System Pack 1.9 oraz Union 1.0j

#2 - Pobierz i wypakuj zawartość archiwum `Odyseja` do folderu z grą.

Na ten moment można już grać w modyfikację. Grę należy uruchomić poprzez GothicStarter.exe i wybrać pozycję Odyseja. Można jednak wgrać kilka dodatkowych rzeczy.

#3 - Pobierz i wypakuj zawartość archiwum Odyseja_skrypty do folderu z grą

#4 - Jeśli chcesz zainstalować niemiecki dubbing - Pobierz i zainstaluj `Odyssee_2.5.1_Speech_1` oraz `Odyssee_2.5.1_Speech_2` do folderu z grą.

#5 - Jeśli chcesz zainstalować dodatkową ścieżkę dźwiękową - Pobierz i wypakuj zawartość archiwum `OdysseeMusic` do folderu z grą.

#6- Jeśli chcesz zainstalować alternatywne grafiki z L'Hivera - Pobierz i wypakuj zawartość archiwum `LHiverGraphicForOdyssee` do folderu data.

#7- Jeśli chcesz zainstalować DirectX 11 - Pobierz i wypakuj zawartość archiwum z `DX11` do folderu system.

Linki:
Spoiler

Pliki do pobrania i changelog:
Sefaris



Discord do zgłaszania błędów: Sefaris lub Kajma

Solucja: Klik

Lista kodów na npc(niektóre nazwy mogą się różnić, bo jest to niemiecka lista, ale i tak powinno to być pomocne): Klik



Galeria:
Spoiler











Kontrybutorzy:
Spoiler
metek58
Tłumacz

smox
Tłumacz

kobal
Tłumacz

Nefario
Organizacja tłumaczenia

bogu9821
Organizacja tłumaczenia

AhnBael
Wsparcie techniczne

Taliasan
Wsparcie techniczne

OwcaZagady
Grafiki

Klodiaa
Grafiki

plaq
Korekty

Jastrząb
Porady

Kajma
Promocja

Duch
Promocja

Simon Said
Prezentacja światów

Archi
Prezentacja światów

Sebastian
Programista, wykończenie

Franisz
Grafik, wykończenie

Zipperiusz
Korekty, wykończenie, tłumacz

Kredensik
Tłumacz

Washion
Tester, Tłumacz

Tulipan
Tester

Arek
Tester

Buzka
Tester

HeIISinki
Tester

Solace
Tester

JkB
Tester

Exalté
Tester

Tavertix
Tester

Fabiosek
Tester

2
Skrypty / [G2NK] Kradzież kieszonkowa z Gothic 1
« dnia: 2019-06-24, 17:49 »
Niewiele osób wie o tym, że kradzież kieszonkowa z pierwszej części egzystuje także w zmodyfikowanym silniku, na którym "chodzi" druga część. (potrzebny Ikarus & Lego lub Union, jednakże tutaj pokazuję jak to osiągnąć tym pierwszym.)

Oczywiście nie liczcie na gotowca. Będziecie musieli trochę pogłówkować i przenieść skrypty AI z G1 (w stylu ostrzegania przez innych npc'tów przed kradzieżą itp.), lub napisać swoje własne. ;)

Na początku musimy mieć możliwość wywołania z silnika metody oCNpc::OpenSteal(), bo ona robi za nas całą robotę.
Konwencja wywołania tejże metody to __thiscall, więc do jej wywołania będziemy musieli użyć funkcji z ikarusa CALL__thiscall(var int this, var int adr);
Teraz pokażę wam przykład wywołania funkcji w konwencji wywołania __thiscall, abyście skumali jak się to robi.

Wywołanie w c++ wygląda tak:
player->OpenSteal();
Jak można zauważyć, metoda taka potrzebuje jakiegoś obiektu, by zostać wywołana i właśnie wskaźnik this wskazuje na ten obiekt podczas wywołania.

Tutaj można zobaczyć jak takie wywołanie przykładowej metody (void __thiscall oCNpc::IdentifyAllMushrooms()) wygląda w ikarusie (wywołanie różni się trochę od tego, czy metoda zwraca wartość i czy ma jakieś argumenty):
Spoiler
//adres do metody
const int oCNpc__IdentifyAllMushrooms = 7639008;
//adres do obiektu gracza
const int oCNpc__player_G2 = 11216516;
//funkcja MEM_ReadInt(var int adr) zamienia adres na wskaźnik.
var int player; player = MEM_ReadInt(oCNpc__player_G2);
CALL__thiscall(player,oCNpc__IdentifyAllMushrooms);

I to ta cała "czarna magia". Możemy wreszcie wracać do sedna.

Wiedzcie, że będziecie musieli sami wywołać metodę oCNpc::OpenSteal() po następnym kroku.

Następnym krokiem będzie zhookowanie metody oCAIHuman::StandActions (aby nie musieć wywoływać tego w nieodpowiednim czasie. Metoda ta wykonuje się podczas interakcji gracza.). Bez wchodzenia w szczegóły pozwala nam to na wywołanie naszego kod chwilę przed/po/w trakcie wywoływania kodu z silnika.

Potrzebujemy do tego adresu metody, przynajmniej 5 bajtów do których możemy się "zahaczyć" (tak zwany hook len) i nowej funkcji.
Na szczęście nie musimy szukać sami adresów i lenów.
Znajdziecie je tutaj ->  Klik
Otwieramy plik odpowiednim programem i ukazuje się wam takie okno:
Spoiler
Najważniejsze w tej chwili elementy tabeli to: Address, HookLen i name
Szukamy więc (ctrl+f) metody oCAIHuman::StandActions.
Zapamiętujemy hooklen i kopiujemy adres, po czym konwertujemy go z szesnastkowego na system dziesiętny na przykład przy użyciu tej strony (chyba, że ktoś jest taki dobrym matematykiem i to sam obliczy w kilka sekund  :ok:) -> Klik

Dobra, mamy już wszystko, więc możemy wkraczać do kolejnego etapu - zhookowanie metody oCAIHuman::StandActions i wywołanie oCNpc::OpenSteal().

Deklarujemy sobie kolejne stałe z adresami:
const int oCAIHuman__Walkmode_offset = 356;
const int oCNpc__focusvob_offset = 2476;
Następnie tworzymy sobie nową funkcje, np. oCAIHuman_StandActions_Hook.

W funkcji tej tworzymy zmienną typu int i musimy przypisać do niej wartość z klasy oCAIHuman ze zmiennej, przechowywującej wartość, która mówi jaki styl chodzenia ma dany npc.
Właściwie zmienna ta pełni zdanie boola, bo przyjmuje tylko wartości 0 lub 1, bo zastosowaliśmy operator==
var int b_IsSneaking; b_IsSneaking = (MEM_ReadInt(ECX+oCAIHuman__Walkmode_offset /*wyliczony rozmiar bajtów do pola (zmiennej) z klasy oCAIHuman*/) == 2);
W konwencji wywołania __thiscall, this znajduje się w rejestrze komputera o nazwie ECX, więc stąd to ECX.

Później sprawdzamy, czy b_IsSneaking wynosi 1 i w klamrach deklarujemy kolejne zmienne, które właściwie są wskaźnikami do gracza i na npc, na którego patrzy.
var int player; player = MEM_ReadInt(oCNpc__player_G2);
var int fcsVob; fcsVob = MEM_ReadInt(player+oCNpc__focusvob_offset/*wyliczony rozmiar bajtów do pola (zmiennej) z klasy oCAIHuman*/);

I teraz trzeba sprawdzić, czy fcsVob nie równa 0, bo jeżeli nie mamy npc zfocusowanego, to wartość wynosi on 0.
Od razu sprawdzimy też, czy jest on npctem, a nie jakimś kufrem czy czymś w tym stylu.
Pozwala nam na to funkcja z ikarusa Hlp_Is_oCNpc(var int obj). I tutaj w ciele ifa musicie właśnie wywołać metodę oCNpc::OpenSteal, tak jak pokazałem u góry. Pomocniczno napiszę: this = player.
if(Hlp_Is_oCNpc(fcsVob)) {
   //tutaj wywołujesz oCNpc::OpenSteal
};

Na koniec najlepiej stworzyć nową funkcję, która będzie służyła do inicjowania hooków, którą wywołujemy w init_global po zainicjowania LeGo!.
Ma mieć ona taką strukturę:
func void InitHooks()
{
     const int init = 0;
     if(!init)
     {
          //hooki
          init = true; // przeciwdziała to tworzeniu nadmiernych obiektów z hookami
     };
};
 

No to hookujemy metodę oCAIHuman::StandActions z funkcją przez nas stworzoną w ten sposób (oczywiście dajemy to do InitHooks):
HookEngineF(adresMetody,HookLen,NaszaFunkcja);
UWAGA! Aby kradzież nie kończyła się ciągłą porażką, musisz dać graczowi talent 6 w przedziale od 0 do 100.
Szansa na kradzież polega na sprawdzaniu, czy (pseudo)losowa liczba z przedziału od 0 do 99 jest mniejsza od talentu gracza!


Warto jeszcze zaznaczyć, że istnieje taka funkcja jak G_CanSteal w  \Content\Story\G_Functions\G_CanSteal.d, dzięki której możemy dodać dodatkowe warunki potrzebne do kradzieży.

Efekty możemy zauważyć tutaj:
Spoiler

Dziękuję za uwagę i mam nadzieję, że ktoś coś zrozumiał z moich prób tłumaczenia.  :D

Strony: [1]
Do góry