Konwersja map i skryptów z wersji 0.1b do 0.2.x w SA:MP
From GTAMScripting
Witaj w poradniku jak przekonwertowac twoją mapkę z SA-MP 0.1b do 0.2.x i pozbyć się błedów z nowym kompilatorem
Większość z was może mieć problem jak dostosować swoją mapkę do nowych standardów w SA-MP 0.2.x i nowego kompilatora. Przedstawię wam krok po kroku co trzeba wykonać i jak pozbyć się błędów. Y_less - jeden z developerów przygotował już jakiś czas temu nowy kompilator z którym mogą wystąpić problemy. Poprawił on w nim przede wszystkim współpracę z komendami typu: dcmd które przy starym kompilatorze przestawały działać lub wykonywały się w kółko. Poprawił też inny problem z pustymi: print i printf Jak widzicie najważniejsza jest niezawodność i dlatego warto kożystać z nowego kompilatora. Jednak pokażę wam kilka przykładów, które powodują błedy.
Przykład - funkcje:
W SA-MP 0.1b funkcje można było dać na 3 sposoby:
- 1. dając przed funkcją wyraz: public np.:
public ZwrocNazweGracza(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, sizeof (pname));
return pname;
}
- 2. dając przed funkcją wyraz: stock np.:
stock ZwrocNazweGracza(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, sizeof (pname));
return pname;
}
- 3. Lub jeśli użyliśmy jej gdzieś wczesniej w kodzie nie poprzedzać żadnym wyrazem, przykład:
ZwrocNazweGracza(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, sizeof (pname));
return pname;
}
W nowym kompilatorze jeśli chcemy użyć funkcji z pierwszym sposobem musim ją zaforwardować tzn. poprzedzić ją na początku mapy/skryptu - przykład:
forward public ZwrocNazweGracza(playerid);
i niżej dać funkcję:
public ZwrocNazweGracza(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, sizeof (pname));
return pname;
}
Lecz wyskoczy nam error, czemu ? Ponieważ w funkcji, return zwraca nam coś innego niż 0 lub 1 dlatego musimy zrobić to inaczej. Jeśli już gdzieś w kodzie np. komendzie wykożystaliśmy tą funkcję możemy się całkowicie pozbyć wyrazu public przed funkcją i dać samą funkcję tak jak w przykładzie 3 wyżej, przykład:
ZwrocNazweGracza(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, sizeof (pname));
return pname;
}
Albo zrobić to drugim sposobem tak jak w przykładzie 2. Dać przed nazwą funkcji wyraz: stock i nie musimy forwardować funkcji jeśli jeszcze jej nie użyliśmy. Może ona sobie być nieużyta i nie wyskoczy nam bład kompilatora. Najlepiej używać funkcji z przykładu 3 czyli bez żadnych wyrazów poprzedzających, ponieważ działają one nienzacznie szybciej, a jeśli mamy duża mapę to możemy ją przyśpieszyć i nie będzie nam lagować.
Wyjaśnienie:
- stock - funkcja która nie jest wykożystana i jest omijana przez kompilator
- public - funkcja która jest wywołana przez ,,timer" i nie wykożystana bezpośrednio. Zawsze potrzebuje forwardowania
Jak zrobić forward ?
Najlepiej umieścić go na początku mapy przed funkcją. Najpierw piszemy: forward a potem całą nazwę funkcji z public lub bez np.:
forward MojaNazwaFunkcji();
lub:
forward public MojaNazwaFunkcji();
Najczęstsze błędy które pojawiają się w nowym kompilatorze:
warning 217: loose indentation To jest błąd który można bardzo prosto wyeliminować. Najczęściej gdy kompilowaliście pierwszy raz swoją mapę z 0.1b nowym kompilatorem wykoczyło wam bardzo dużo błedów tego typu. Co należy zrobić? Daj to: #pragma tabsize 0 na samej górze swojego moda pod definicjami #include albo najlepiej wrzuć to do pliku includes który znajduje się domyślnie w: .../includes/a_samp.inc - otwórz go i wklej pod: #pragma tabsize 4 dzięki temu nie będziesz musiał dawać tego w każdej mapie.
warning 235: public function lacks forward declaration Oznacza to, że funkcja nie jest zaforwardowana. Najlepiej przed nazwą funkcji gdzie występuje public daj stock lub daj forward na górze mapki/skryptu lub przed funkcją. Jeśli wykożystałeś już gdzieś daną funkcję to nie musisz dawać ani stock ani public i nie musisz jej forwardować. Będzie działać to nieznacznie szybciej ;)
Uwaga!
Każda funkcja na którą został wywołany timer, musi być zaforwardowana!
