Jakiś czas temu Demonical Monk zaczął pracować nad narzędziem które umieszczone w katalogu z Gothicem, sprytnie wstrzykiwałoby do silnika swój kod i rozszerzało go o nowe funkcje. Działanie jest analogiczne jak w przypadku g2ext - nie mam pojęcia jakie są różnice, bo ani ja, ani Monk nigdy go nie używaliśmy. Właściwie to kiedy zaczynał tworzyć gtools, nawet nie wiedział że już podobny pakiet istnieje.
Zaletą tego narzędzia jest prostota jego użycia - po prostu umieszczamy w katalogu "system" kilka plików, a w pliku .ini moda dodajemy parametr włączający nowe funkcje. Odtąd możemy korzystać w skryptach z nowych funkcji zewnętrznych (externali), których wcześniej nie było. Dają one nowe możliwości, których część dawał do tej pory jedynie Ikarus - jednak on opierał się na niezwykle skomplikowanym wykorzystywaniu luk w systemie skryptów, co było niezwykle nieefektywne. Można to porównać z tapetowaniem pokoju obklejając go znaczkami pocztowymi. Wszystko robił komputer, więc najczęściej nie widzi się jak fatalne jest to rozwiązanie, jednak nieraz wiąże się ze sporym spadkiem wydajności i różnymi bugami. W przypadku gtools funkcje zaimplementowane są natywnie, więc działają z podobną prędkością jak normalne komponenty silnika.
Projekt jest we wczesnej fazie rozwoju, chociaż wielu niezwykle przydatnych funkcji można już spokojnie używać. Bardzo mile widziane są wszelkie komentarze czy propozycje nowych funkcji. Obecnie opracowana wersja jest przeznaczona do g2nk, jednak najprawdopodobniej zostanie też stworzony port do g1.
Przykładowe funkcje:
1. Odpalanie określonej funkcji po minięciu określonego odcinka czasu. Jeśli jako funkcję do odpalenia wybierzemy tą w której umieściliśmy samo polecenie, powstanie pętla z opóźnieniem czasowym - mechanizm analogiczny do tzw.
tick tocków, jednak działający bardziej elegancko, w każdym świecie i nie zawieszający gry nawet przy znacznym obciążeniu - jest to spowodowane tym, że czas do ponownego wywołania jest liczony dopiero od końca wywołania poprzedniego.
Prototyp wygląda następująco:
func int gtl_setTimeout(var string name, var int time, var int argument)
Pierwszy argument to nazwa funkcji do wywołania, drugi to czas za który ma to nastąpić (w milisekundach), a trzeci to liczba, która zostanie przekazana jako argument do wywoływanej funkcji.
Przykładowo:
func void opoznionaFunkcja (var int argument) {
Print(IntToString(argument));
gtl_setTimeout("opozionaFunkcja", 1000, argument + 1);
};
Funkcja raz wywołana będzie odtąd co sekundę wyświetlała na ekranie coraz większe liczby. Prawda że proste?
Osobiście wywaliłbym ostatni argument, bo nie wszystkie wywoływane funkcje potrzebują przekazania im czegoś jako argumentu, a nawet jeśli, to nie zawsze akurat jeden. A równie dobrze można robić to za pomocą zmiennych globalnych, czego i tak pewnie często nie będzie można uniknąć. Jednak decyzja należy do Monka.
2. Pobieranie
obiektu z silnika znajdującego się pod danym adresem. Funkcja ta pełni ważną rolę w Ikarusie, wiele osób na pewno z niej nieraz korzystało. Pozwala choćby uzyskać dostęp do wyświetlanych na ekranie pasków i je modyfikować.
Przykład:
func void something() {
var oCGame game;
game = gtl_getInstanceByPtr(11208836);
game.testMode = 1;
}
Włączy tryb testowy (marvin).
Oczywiście tak jak w przypadku Ikarusa należy umieścić w skryptach odpowiednie definicje klas. Można je pożyczyć choćby właśnie z Ikarusa, są w pełni kompatybilne.
3. Wywoływanie takiego efektu, jaki miałoby wpisanie danego tekstu w
konsolę. Jest to prosty sposób na ułatwienie sobie pracy przez skrypterów - wiele przydatnych funkcji jest dostępnych przez konsolę, a nie przez skrypty. Ta funkcja rozwiązuje ten problem.
Przykład:
gtl_evalConsole("zhighqualityrenderer");
Wyłączy upraszczanie widocznego w oddali terenu.
To tylko kilka przykładowych funkcji. Jest ich znacznie więcej, chociaż część dopiero tworzona. Więcej można poznać na podlinkowanym poniżej wiki.