Skocz do zawartości
Pamdex

[PLUGIN] MapAndreas 1.2.1

Rekomendowane odpowiedzi

Kilka słów wstępu...
Jako, że znalazłem chwilkę wolnego czasu i posiadam zezwolenie od autora na prezentację wtyczki, postanowiłem ją tutaj opublikować, aby pokazać jej możliwości.
 
Aktualna wersja, oznaczona numerem 1.2.1 posiada kilka poprawek oraz ważną edycję mojego autorswa, którą uzgodniłem wraz z Mauzenem.

 

Oryginalny temat:
http://forum.sa-mp.com/showthread.php?t=275492
 
Czym jest MapAndreas?
MapAndreas jest wtyczką, która pozwala na odczyt najwyższej wartości osi Z dla danej lokalizacji (X, Y) z dołączonej do niej mapy wysokości.
SAfull.jpg
 
Autor: Kalcor
Edycja (za zgodą): Mauzen, Pamdex
Dodatkowe uwagi: Zwracane przez wtyczkę wysokości są wartościami tuż przy ziemi, więc chcąc używać ich do teleportacji, poruszania się botów - należy dodać 1.0 do nich. W kilku miejscach na mapie występują tzw. dziury - czyli tereny, przy których wtyczka wskaże wysokość równą 0.0. UWAGA! W przypadku lokalizacji znajdujących się na terenie zbiorników wodnych, wtyczka zawsze zwraca wysokość równą 0.0!
 
W aktualnej wersji mamy 3 możliwe tryby odczytu danych:
1. MAP_ANDREAS_MODE_FULL
Jest to podstawowy tryb odczytu. Używa około 70 MB RAMu. Jeżeli masz zamiar używać tego trybu na hostingu współdzielonym, zalecam skonsultować się z supportem, czy nie będzie to stanowić problemu.
Charakteryzuje się największą szybkością:

[17:28:09] Starting test "FindZ, MODE_FULL" with 10000000 iterations...
[17:28:10] Test "FindZ, MODE_FULL" finished: 568ms (17605634.0/sec)

[17:28:10] Starting test "FindAverageZ, MODE_FULL" with 10000000 iterations...
[17:28:12] Test "FindAverageZ, MODE_FULL" finished: 1584ms (6313131.5/sec)

Przykładowe zastosowanie:

  • AntyCheat - sprawdzanie czy gracz unosi się w powietrzu
  • Teleportacja - sprawdzenie optymalnej wysokości dla danej pozycji
  • Wyznaczanie trasy -> powstająca wersja PathFinder'a
  • Poruszanie się botów -> RNPC, FCNPC
  • Dynamiczny edytor obiektów - sprawdzenie optymalnej wysokości dla danej pozycji

Dokładność: 1m^2.
Wymaga: SAfull.hmap
 
2. MAP_ANDREAS_MODE_MINIMAL
Jest to dodatkowy tryb odczytu. Używa około 9 MB RAMu.
Charakteryzuje się porównywalną szybkością co podstawowy tryb:

[17:28:13] Starting test "FindZ, MODE_MINIMAL" with 10000000 iterations...
[17:28:14] Test "FindZ, MODE_MINIMAL" finished: 605ms (16528926.0/sec)

[17:28:14] Starting test "FindAverageZ, MODE_MINIMAL" with 10000000 iterations...
[17:28:16] Test "FindAverageZ, MODE_MINIMAL" finished: 1696ms (5896226.5/sec)

Przykładowe zastosowanie:

  • Wykrywanie czy samolot zbliża się do ziemi
  • Automatyczne eventy - spadające z nieba nagrody / walizki itp.

Dokładność: 9m^2
Wymaga: SAmin.hmap
 
3. MAP_ANDREAS_MODE_NOBUFFER
Jest to dodatkowy tryb odczutu. Odczytuje dane bezpośrednio z pliku, więc nie zużywa dodatkowej ilości RAMu. Nie zalecam stosować tego trybu przy częstym odczytywaniu danych.
Największą wadą tego trybu jest jego prędkość odczytu (test z mniejszą ilością iteracji):

[17:28:16] Starting test "FindZ, MODE_NOBUFFER" with 100000 iterations...
[17:28:16] Test "FindZ, MODE_NOBUFFER" finished: 377ms (265251.9/sec)

[17:28:16] Starting test "FindAverageZ, MODE_NOBUFFER" with 100000 iterations...
[17:28:17] Test "FindAverageZ, MODE_NOBUFFER" finished: 1123ms (89047.1/sec)

Przykładowe zastosowanie:

  • Teleportacja
  • Wykrywanie trasy -> PathFinder (odczyt danych w osobnym wątku)
  • Poruszanie się botów -> RNPC, FCNPC (?)
  • Dynamiczny edytor obiektów

Dokładność: 1m^2.
Wymaga: SAfull.hmap

 

Funkcje:

MapAndreas_Init

native MapAndreas_Init(mode, name[]="", len=sizeof(name));

Jest to najważniejsza funkcja, która odpowiada za wczytanie i konfigurację wtyczki pod odpowiedni tryb odczytu. Jej wywołanie jest wymagane przed innymi funkcjami, aby wtyczka mogła działać poprawnie.

UWAGA! Jeżeli nie podamy opcjonalnej lokalizacji pliku, wtyczka wczyta odpowiedni plik z podstawowej lokalizacji.
 
Parametry:

  • mode -> tryb odczytu (MAP_ANDREAS_MODE_FULL / MAP_ANDREAS_MODE_MINIMAL / MAP_ANDREAS_MODE_NOBUFFER)
  • name[] -> opcjonalna lokalizacja pliku z mapą wysokości (ścieżka musi posiadać nazwę pliku)
  • len -> długość ścieżki

MapAndreas_Unload

native MapAndreas_Unload();

Jest to funkcja odpowiadająca za zwolnienie zasobów używanych przez MapAndreas. Po jej użyciu można ponownie zainicjalizować MapAndreas, jeżeli chcemy dalej korzystać z oferowanych możliwości. Jej wywołanie nie jest wymagane.
 
Parametry:

  • brak

MapAndreas_FindZ_For2DCoord

native MapAndreas_FindZ_For2DCoord(Float:X, Float:Y, &Float:Z);

Jest to funkcja odpowiadająca za odczyt największej możliwej wysokości dla podanej lokalizacji (X, Y).
 
Parametry:

  • Float:X -> pozycja na osi X
  • Float:Y -> pozycja na osi Y
  • &Float:Z -> największa możliwa wysokość dla podanej lokalizacji

MapAndreas_FindAverageZ

native MapAndreas_FindAverageZ(Float:X, Float:Y, &Float:Z);

Jest to funkcja odpowiadająca za odczyt średniej największej możliwej wysokości dla punktów znajdujących się w pobliżu podanej lokalizacji (X, Y)
 
Parametry:

  • Float:X -> pozycja na osi X
  • Float:Y -> pozycja na osi Y
  • &Float:Z -> średnia największa możliwa wysokość dla podanej lokalizacji

MapAndreas_SetZ_For2DCoord

native MapAndreas_SetZ_For2DCoord(Float:X, Float:Y, Float:Z);

Jest to funkcja odpowiadająca za przypisanie największej możliwej wysokości dla podanej lokalizacji. Zmiany są widoczne, aż do czasu zwolnienia pamięci przez wtyczkę*.
UWAGA! Funkcja nie działa przy trybie MAP_ANDREAS_MODE_NOBUFFER - zwraca 0!
Parametr Z musi mieścić się w zakresie 0.0 - 655.35!
 
Parametry:

  • Float:X -> pozycja na osi X
  • Float:Y -> pozycja na osi Y
  • Float:Z -> największa możliwa wysokość dla podanej lokalizacji

*Wyjątek stanowi zapisanie danych, które oferuje funkcja MapAndreas_SaveCurrentHMap(...).
 

MapAndreas_SaveCurrentHMap

native MapAndreas_SaveCurrentHMap(name[]);

Jest to funkcja służąca do zapisu danych mapy przechowywanych w pamięci przez wtyczkę. Służy głównie do zapisu zmian wprowadzonych przez funkcję MapAndreas_SetZ_For2DCoord(...).
UWAGA! Funkcja nie działa przy trybie MAP_ANDREAS_MODE_NOBUFFER - tworzy pusty plik.
 
Parametry:

  • name[] -> lokalizacja zapisywanego pliku (ścieżka musi zawierać nazwę)

MapAndreas_GetAddress

native MapAndreas_GetAddress(); //only for plugins

Jest to funkcja, która zwraca adres klasy CMapAndreas w pamięci - w przypadku braku inicjalizacji pluginu zwraca 0. Funkcja jest skierowana do twórców wtyczek.
Parametry:

  • brak

Używanie możliwości MapAndreas w twojej wtyczce:

Dzięki dodaniu przeze mnie specjalnego konstruktora klasy CMapAndreas oraz stworzeniu nowej funkcji do zwracania adresu tej klasy możemy używać tej klasy w naszych projektach!

 

Aby używać klasy CMapAndreas w naszym projekcie:
1. Dodaj MapAndreas.cpp oraz MapAndreas.h do twojego projektu (bezpośrednio ze źródła wtyczki)
2. Stwórz funkcję do inicjalizacji (przykład):

// native X_Init(mapAndreasAddress);
cell AMX_NATIVE_CALL n_x_init(AMX* amx, cell* params)
{
	...
	CMapAndreas *map = new CMapAndreas((CMapAndreas*)params[1]);
	...
	return 1;
}

3. W kodzie PAWN zainicjalizuj MapAndreas, a następnie twoją wtyczkę:

public OnFilterScriptInit()
{
	...
	MapAndreas_Init(MAP_ANDREAS_MODE_FULL);
	X_Init(MapAndreas_GetAddress());
	...
	return 1;
}

4. Dodaj MapAndreas na samym końcu linijki "plugins" w server.cfg (oraz twoją wtyczkę przed MapAndreas)
5. Dzięki temu posiadasz wskaźnik klasy CMapAndreas, więc możesz z niej śmiało korzystać w swojej wtyczce.
 
Download:
Source, Include, Plugin (.so, .dll), SAfull.hmap, SAmin.hmap
https://dl.dropboxusercontent.com/u/...dreas1.2.1.zip
 
Wszelkie uwagi, błędy, literówki, komentarze proszę pisać w tym temacie.

Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
MapAndreas jest wtyczką, która pozwala na odczyt najwyższej wartości osi Z dla danej lokalizacji (X, Y) z dołączonej do niej mapy wysokości.

Co to oznacza?

 

//Co to jest najwyższa oś Z? Bo chciałbym to zastosować ale nie wiem jak ;<

Edytowane przez ManieQ535

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Andrew Ej w konsoli zrobiłem w OnGameModeInit to co P3TRUS i wyszło mi takie coś: 40603559730759895556.png

Czyli to jest obliczona wysokość?

 

Edit: A możecie mi wytłumaczyć dlaczego to się przydaje? Ale ta wartość to jest wysokość czyli na jakiej wysokości ma się znajdować np. walizka? A jak np. dzięki temu można by zrobić system GPS? Nie łatwiej będzie np. robiąc skrypt na walizke pobrać pozycje admina i obok niego położyć walizke?

 

//Sorry za takie pytania ale chcę pojąć i się nauczyć :D

Edytowane przez ManieQ535

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Niekoniecznie musi to być walizka. Chcesz stworzyć samochód w losowym miejscu na całej mapie. Nie znasz wysokości (czyli de facto osi Z) każdego miejsca na mapie, dlatego możesz przypadkiem stworzyć auto w górach. Dlatego przydaje się tutaj ten plugin, dzięki funkcji można odnaleźć wysokość Z po współrzędnych X i Y.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Lekki odkop, ale dla osób używających MapAndreas jest to ważna informacja :)

 

W aktualnej wersji występuje problem przy odczycie danych z pewnej granicznej pozycji - kończy się to crashem, więc jeżeli używasz losowych kordów polecam dodać w swoim kodzie taki malutki dodatek (na górze):

//MapAndreas Fix
stock MapAndreas_FindZ_For2DCoordEx(Float:x, Float:y, &Float:z) {

    if(x >= 3000.0) x = 2999.0;
    if(x <= -3000.0) x = -2999.0;

    if(y >= 3000.0) y = 2999.0;
    if(y <= -3000.0) y = -2999.0;

    MapAndreas_FindZ_For2DCoord(x,y,z);
}

#define MapAndreas_FindZ_For2DCoord MapAndreas_FindZ_For2DCoordEx
//----------------------------------------------------------------------
Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Fajnie jakbyś spróbował zrobić, żeby MapAndreas_FindZ_For2DCoord znajdowało dobrze Z nawet przy dodanych obiektach

W tym przypadku warto zainteresować się tematem pluginu ColAndreas. Aktualnie nie mam czasu i chęci na rozwijanie pluginów w SA-MP - wyjątek stanowi tutaj tylko PathFinder.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×