Skocz do zawartości
Pamdex

[PLUGIN] PathFinder 1.0 MT by Pamdex

Rekomendowane odpowiedzi

Witajcie!
Prezentuje wam tutaj moją nową wtyczkę o nazwie: "PathFinder". Jej zadaniem jest wyszukiwanie tras przy użyciu mapy wysokości (MapAndreas).

Podstawowe informacje

  • Wtyczka posiada osobny wątek, w którym wyszukuje trasy
  • Wtyczka posiada kolejkowanie wyszukiwania tras
  • Wtyczka posiada wbudowaną integrację z MapAndreas 1.2.1

Wymagania

  • MapAndreas 1.2.1

Do pobrania tutaj: http://pawno.pl/index.php?/topic/27442-plugin-mapandreas-121/
 
Na czym opiera się wyszukiwanie trasy?
Wyszukiwanie trasy opiera się na implementacji algorytmu Dijkstra oraz wbudowanej integracji z MapAndreas 1.2.1.
 

Tutaj mamy schemat działania Dijkstra

Dijkstras_progress_animation.gif

 

Callback

OnPathCalculated

OnPathCalculated(routeid, success, Float:nodesX[], Float:nodesY[], Float:nodesZ[], nodesSize)

Parametry:

  • routeid <- zwraca ID obliczonej trasy (ustawiamy je w funkcji rozpoczynającej szukanie trasy)
  • success <- zwraca true lub false, zależnie czy wyszukiwanie się powiodło czy nie
  • nodesX <- zwraca pozycje X punktów
  • nodesY <- zwraca pozycje Y punktów
  • nodesZ <- zwraca pozycje Z punktów
  • nodesSize <- zwraca ilość punktów

Przykładowe użycie:

new text[128];
public OnPathCalculated(routeid, success, Float:nodesX[], Float:nodesY[], Float:nodesZ[], nodesSize)
{
    format(text, sizeof(text), "PATH: route: %d success: %d nodesSize: %d", routeid, success, nodesSize);
    SendClientMessageToAll(-1, text);
    if(success)
    {
        for(new i; i < nodesSize; i++)
        {
            CreateDynamicObject(19130, nodesX[i], nodesY[i], nodesZ[i] + 1, 0, 0, 0);
        }
        Streamer_Update(0);
    }
    return 1;
}

UWAGA! Jeżeli obliczanie nie powiodło się, nodesX[], nodesY[], nodesZ[] zawiera tylko 1 index z wartością -1 (nodes_size wtedy wynosi 1)

UWAGA! Pozycja Z jest podawana przy samej ziemi! Aby używać tego do teleportacji/botów należy dodać 1.0
 
Funkcje
PathFinder_Init

PathFinder_Init(mapAndreasAddress, threads = 1);

Parametry:

  • mapAndreasAddress <- adres w pamięci klasy CMapAndreas (zobacz "Używanie w PAWN")
  • threads <- ilość aktywnych wątków (im więcej wątków, tym więcej tras może być obliczanych w tym samym czasie)

Funkcji tej używamy, aby przygotować plugin do działania oraz ustawić maksymalną różnicę wysokości.


PathFinder_FindWay

PathFinder_FindWay(routeid,Float:start_x,Float:start_y,Float:end_x,Float:end_y,step_limit = -1);

Parametry:

  • routeid <- ID trasy
  • start_x <- startowa pozycja X
  • start_y <- startowa pozycja Y
  • end_x <- końcowa pozycja X
  • end_y <- końcowa pozycja Y
  • zDifference <- maksymalna różnica wysokości między punktami (używane podczas obliczania trasy)
  • stepSize <- rozmiar kroku (używane podczas obliczania trasy)
  • stepLimit <- limit kroków przy obliczaniu trasy. Jeżeli ustawisz tutaj -1 wtyczka będzie działać normalnie. Jeżeli ustawisz tutaj inną wartość niż -1, wtyczka będzie szukać trasy do momentu znalezienia celu lub osiągnięcia limitu kroku, co wiąże się z tym, że zostanie zwrócona trasa do najbliżej położonego końca punktu.
  • maxSteps <- główny limit kroków. Jeżeli proces obliczania trasy osiągnie ten limit, szukanie zostanie przerwane z wynikiem negatywnym.

Funkcja ta służy do rozpoczęcia wyszukiwania trasy z pozycji startowej do pozycji końcowej.

 

PathFinder_MapAndreasLock

PathFinder_MapAndreasLock();

Ta funkcja blokuje obliczanie tras, przez co można używać funkcji MapAndreas bez obawy o bezpieczeństwo wątków dodatkowych.

Przykładowe użycie:

new Float:z;
PathFinder_MapAndreasLock(); //Block PathFinder...

//Do MapAndreas command or smth else like RNPC (with MapAndreas class sharing)
for(new i = 0; i < 1000; i++)
{
	MapAndreas_FindZ_For2DCoord(random(6000) - 3000, random(6000) - 3000, z);
	format(text, sizeof(text), "%d -> %f", i, z);
	SendClientMessageToAll(-1, text);
}
PathFinder_MapAndreasUnlock();

 

PathFinder_MapAndreasUnlock

PathFinder_MapAndreasUnlock();

Ta funkcja odblokowuje obliczanie tras.
 

PathFinder_SetTickRate

PathFinder_SetTickRate(rate = 5);

Funkcja służy do ustawienia częstotliwości komunikacji głównego wątku serwera z wątkiem obliczeniowym.
 
Filmik
http://www.youtube.com/watch?v=VtmWDnRoSSg

W skrócie:

  • /path_test - oblicza trasę z bieżącej lokalizacji do pozycji zaznaczonej na mapie,
  • /path_test_size - oblicza trasę z bieżącej lokalizacji do pozycji zaznaczonej na mapie z ustawionym rozmiarem kroku (2),
  • /path_test_limit - oblicza trasę z bieżącej lokalizacji do pozycji zaznaczonej na mapie z aktywnym limitem kroków (30),
  • /path_test_limit_50 - oblicza trasę z bieżącej lokalizacji do wylosowanej pozycji na mapie z aktywnym limitem kroków (10) dla 50 losowań.

Testowane na Windows 7 64bit z procesorem Intel Core i7-4790K.

 
Download
Include, plugin (Windows & Linux), source (bitbucket.org) oraz używany w filmiku pawn.pwn
https://bitbucket.org/Pamdex/pathfinder/downloads
 
Zapraszam do komentowania, zadawania pytań itp.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PathFinder 0.11v - Nowa wersja

  • Kilka poprawek w kodzie (wydajnościowych)
  • Wersja ta jest także dostępna dla linuxa

Dodatkowe info: Source pojawi się jak tylko plugin zostanie wydany na forum sa-mp'a (dzisiaj lub jutro)!

Jeżeli znajdziecie jakieś błędy proszę natychmiast pisać :)!

 

@UP Nie trzeba używać PStreamera. Został on użyty wraz z RNPC jako przykład, do czego może służyć mój plugin.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zapowiada się ciekawie. Ten plugin jest podobny do tego GPS'a Gamer_X'a (jakoś tak :D), tylko nie wymaga tam jakichś dziwnych bibliotek, które nie są na każdym hoście.

 

PS. Mój like był twoim setnym like :P :P

Edytowane przez GtaGamer

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nowy filmik z testowym użyciem PathFinder'a!

Tym razem trasa botów została lekko przeczyszczona (ze zbędnych punktów).

 

Zostało także dodane source (wszystkie pliki + makefile dla linuxa) w pierwszym poście!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Druga wersja moim zdaniem wypadła lepiej niż ta pierwsza.

 

@up

Gdybym ja rozwinął swoją listę żądań, to by zajęła co najmniej 40 linijek. Możew offtopie stwórzmy temat: Czego oczekujesz od Kalcora?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PathFinder 0.12v wydany!

  • Został dodany nowy parametr do PathFinder_Init (maxnodes)
  • Lekkie poprawki w kodzie oraz poprawa błędu z obliczaniem :)

Podziękowania dla: [uL]Pottus za znalezienie błędu!

Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam pytanie, czy skoro plugin używa wbudowany MapAndreas do odmierzania wysokości trasy, to jak będę pod jakimś mostem i taki zombiak będzie mnie gonić to jego punkt docelowy będzie na moście czy pod mostem tam gdzie stoję? A i jak to odgrywa gdy stworzę na trasie jakiś obiekt (np. dom) to taki bot przejdzie jak przez masło czy ominie obiekt? Chyba że twój pStreamer jest jakoś specjalnie pod to zmodyfikowany :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@UP Plugin w takiej sytuacji (będąc pod mostkiem) skieruje zombie na górę (niestety). Jeżeli na trasie stworzysz jakiś dom to zombiak/bot/trasa przejdzie przez niego "jak przez masło". Planuje dodać kiedyś jak będę bardzo znudzony obsługę kolizji z obiektami dodanymi (ale to nie będzie szybko).

 

Pracuje nad kodem w PAWN, który oczyści trasę :P!

 

@EDIT! Nowy filmik! Tym razem trasa botów jest czyszczona ze zbędnych punktów w PAWN (kod pokaże potem lub "za maleńkie wsparcie" xD)

 

Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

hmm, bardzo fajna rzecz. Już używam kilku twoich pluginów i skryptów i jak na razie wszystko sprawuje się bardzo dobrze :)

A jeszcze mam takie pytanie, bo ostatnio znalazłem trochę bardzo fajnych pluginów i nie mam pojęcia ile one zjadają pamięci RAM czy procesora, więc czy jest jakiś program do sprawdzania ile w danej chwili tego się wykorzystuje? Jeśli tak to jakie polecasz, bo pewnie jest tego od za**bania, a bardzo potrzebuje tych informacji czy plugin w przyszłości będzie sprawiał problemy swoją obecnością czy nie.

Edytowane przez Orymir2630

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@UP

Menadżer procesów :D

Ja nie wiem co to za problem sprawdzić zużycie pamięci przez plugin. Najwięcej RAM'u zabiera zawsze streamer (mój lub od incognito). Sam PathFinder zużywa bardzo mało pamięci.

 

Jak widać społeczność sa-mp.com nie śpi :D

 

Tutaj mamy użycie mojego pluginu oraz FCNPC:

Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@UP na podstawowych ustawieniach przy twoim kodzie wyjdzie po około 10 sekundach: failed :P Należy wtedy zmienić ilość maxnodes.

@2xUP

Zobacz sobie przykładowy kawałek kodu:

http://forum.sa-mp.com/showpost.php?p=2460493&postcount=37

Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PathFinder 0.14v wydany!

  • została dodana nowa funkcja PathFinder_SetTickRate
  • poprawki w kodzie (związane z przeciążeniem)

Więcej info i download w pierwszym poście!

Edytowane przez Pamdex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znalazłem przypadkiem mini błąd.

 

PathFinder_FindWay z ustawionym limitem kroków zawsze zwraca SUCCES (OnPathCalculated), ale obliczona trasa może być pusta.

 

Ten błąd można naprawić w PAWN, ale ja to poprawię w pluginie.

 


Ten temat jest aktualizowany trochę później od tego, który znajduje się na forum sampa.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam taką myśl. Chcę zrobić, żeby na mapie ustawiał się pickup, nie w wodzie, nie w budynku, tylko np na budynku. Czy mogę do tego wykorzystać twojego pluginu? Jeżeli tak to naprowadzisz mnie, jak?

Możesz, ale nie widzę w tym większego sensu - potrzebujesz do tego tylko MapAndreas.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pracuję nad nową wersją PathFindera:

  • kod zostanie przepisany (prawdopodobnie napiszę swoją własną klasę do wyszukiwania trasy)
  • zostanie usunięty parametr maxnodes (będzie on dynamiczny)
  • zostanie dodany nowy, opcjonalny buffer mode, czyli MapAndreas Full.

Wszystkie zmiany mają na celu zwiększenie wydajności całego pluginu. Samo zastosowanie MapAndreas Full zwiększy szybkość odczytywania pozycji Z o 600%.

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ę.

×