MAGNET 5 1 Napisano 26 Sierpnia 2018 Dostępna jest nowa wersja pluginu. Kliknij, aby przejść...Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Opis Jest to banalnie prosty w obsłudze plugin, który pozwala na tworzenie własnych osiągnięć (Achievementów). Wszystko oparte jest na SQLite i stworzone w bardzo intuicyjny sposób. Wystarczy wgrać plugin na serwer i próbować swoich sił ? Komendy !ac - otwieru menu główne silnika AchievementsGO Przykład achievementu: Spoiler #include <sourcemod> #include <AchievementsGO> int AGO_Bomb; public OnPluginStart() { HookEvent("bomb_planted", Event_BombPlanted); } public void AGO_OnRegisterAchievements() { AGO_Bomb = AGO_AddAchievement("Boom!", "Plant 5 bombs", "Pyro path", 5); } public Action Event_BombPlanted(Handle event, const char[] name, bool dontBroadcast) { int attackerId = GetClientOfUserId(GetEventInt(event, "userid")); AGO_AddPoint(attackerId, AGO_Bomb); } Do stworzenia Achievementu wymagana jest tylko jedna funkcja - AGO_AddAchievement. Podajemy w niej kolejno: Nazwę osiągnięcia, opis, katalog oraz cel - to wszystko ? Osiągnięcia można wkładać w "foldery" - wystarczy podać jego nazwę w trzecim argumencie. W grze katalog oznaczony jest przez znak '>'. Jeżeli chcemy żeby dane osiągnięcie nie znajdowało się w żadnym folderze, po prostu zostawiamy to pole puste ("") Później wystarczy aktualizować status osiągnięcia (dodawać punkty), przy użyciu np. AGO_AddPoint Plugin posiada masę natywów i forwardów, aby w prosty sposób tworzyć własne osiągnięcia: Spoiler /** * Dodaje nowe osiągnięcie. Operacja musi byc przeprowadzona wewnątrz AGO_OnRegisterAchievements() * aby wszystko załadowało się poprawnie * * @param Name Nazwa achievementa (max 64 znaki) * @param Description Krótki opis (max 128 znaków) * @param Category Kategoria Achievementa. Jeśli chcesz aby znajdował się w głownej sekcji, pozostaw puste ("") * @param Value Ustawia cel, które achievement musi spełnić aby go zaliczyć * @return ID achievementa, -1 w razie porażki lub zawiera niedozwolone znaki. */ native int AGO_AddAchievement(char[] Name, char[] Description, char[] Category, int Value); /** * Dodaje punkt do osiągnięcia gracza * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @return Aktualny progress achievementa lub -1 w razie niepowodzenia. */ native int AGO_AddPoint(int client, int IdOfAchievement); /** * Dodaje punkty do osiągnięcia gracza * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @param amount Ilość punktów, jaka ma być przydzielona * @return Aktualny progress achievementa lub -1 w razie niepowodzenia. */ native int AGO_AddPoints(int client, int IdOfAchievement, int amount); /** * Usuwa jeden punkt z osiągnięcia gracza * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @return Aktualny progress achievementa lub -1 w razie niepowodzenia. */ native int AGO_RemovePoint(int client, int IdOfAchievement); /** * Usuwa punkty z osiągnięcia gracza * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @param amount Ilość punktów, która ma być zabrana * @return Aktualny progress achievementa lub -1 w razie niepowodzenia. */ native int AGO_RemovePoints(int client, int IdOfAchievement, int amount); /** * Resetuje progress achievementa gracza do zera * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @return Aktualny progress achievementa lub -1 w razie niepowodzenia. */ native int AGO_ResetPoints(int client, int IdOfAchievement); /** * Zwracaa nazwe achievementu na podstawie jego indexu * * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @param tab Tablica na nazwe * @param size Rozmiar tablicy * @return 0 w razie powodzenia. Jesli sie nie udalo: -1, a tablica zawiera: "NOT FOUND" */ native void AGO_GetNameByIndex(int IdOfAchievement, char[] tab, int size); /** * Zwraca index Achievementa na podstawie jego nazwy * * @param name Tablica z nazwą Achievmentu * @return Index Achievementa. Jeśli nie znaleziono -1 */ native int AGO_GetIndexByName(char[] name); /** * Zwraca opis Achievementa na podstawie jego indexu * * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @param tab Tablica na opis * @param size Rozmiar tablicy * @return 0 w razie powodzenia. Jesli sie nie udalo: -1, a tablica zawiera: "NOT FOUND" */ native void AGO_GetDescriptionByIndex(int IdOfAchievement, char[] tab, int size); /** * Zwraca aktualny progress Achievementu gracza * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @return Progress. Jeśli się nie udało, -1 */ native int AGO_GetAchievementProgress(int client, int IdOfAchievement); /** * Sprawdza, czy dany Achievement gracza został ukończony * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) * @return 1: ukończony, 0: nieukończony, -1: porażka */ native int AGO_IsAchievementCompleted(int client, int IdOfAchievement); /** * Zwraca ilość aktywnych achievementów * * @return Ilość achievementów */ native int AGO_GetAmountOfAchievements(); /** * Sprawdza, czy tabele SQL zostały poprawnie utworzony * * @return 1: Tabele utworzone, 0: nieutworzone */ native int AGO_AreTablesCreated(); /** * Wywoływany, kiedy wszystkie Achievementy zostały poprawnie załadowane do silnika */ forward void AGO_OnAllAchievementsLoaded(); /** * Wywoływane, gdy Achievement został ukończony przez gracza * * @param client ID gracza * @param IdOfAchievement ID achievementa (uzyskane z funkcji AGO_AddAchievement()) */ forward void AGO_OnAchievementAccomplished(int client, int IdOfAchievement); /** * Wywoływany, kiedy silnik jest gotowy ma ładowanie Achievementów. Może się to odbywać wyłącznie w tym miejscu */ forward void AGO_OnRegisterAchievements(); Informacja o ukończonym osiągnięciu pokazywana jest w hint'ie, oraz na say'u wszystkim graczom. Screeny Spoiler Download GitHubHej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! Cytuj Przez MAGNET, 26 Sierpnia 2018 Trochę obszerniejszy przykład tworzenia własnych osiągnięć przedstawiony jest na GitHubie Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Sqower Napisano 24 Stycznia 2019 A jak dodać to na flage ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 24 Stycznia 2019 Żeby dany achievement można było zdobywać tylko jeśli masz daną flagę? Wystarczy AGO_AddPoint wziąć w warunek sprawdzający flagę. Jeśli chcesz aby dostęp do achievementów miały tylko osoby z daną flagą, warunkiem na flagę należałoby objąć menu główne a także natywy do dodawania punktów Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Sqower Napisano 24 Stycznia 2019 To chyba tą 1 opcje wybiorę ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Sqower Napisano 25 Stycznia 2019 "Wystarczy AGO_AddPoint wziąć w warunek sprawdzający flagę." Mam pytanie mógł byś pokazać przykład ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET 1 Napisano 25 Stycznia 2019 public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) { int victimId = GetClientOfUserId(event.GetInt("userid")); int attackerId = GetClientOfUserId(event.GetInt("attacker")); if(GetUserFlagBits(attackerId) & TWOJA_FLAGA) for (int i = 0; i < 3; i++) AGO_AddPoint(attackerId, AGO_Zabij[i]); } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Sqower Napisano 26 Stycznia 2019 Dzięki bardzo Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Chittek Napisano 15 Lutego 2019 Good ? Dobry plugin ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
rafalpazder Napisano 17 Marca 2019 Część, będzie jakaś aktualizacja? Może wsparcie dla MySQl? Cytuj Przez MAGNET, 17 Marca 2019 Cóż, mógłbym dodać takie wsparcie, ale ten plugin został napisany w sposób, który nie jest optymalny na MySQL. W SQLite ilość wysyłanych zapytań nie ma znaczenia, ponieważ wszystko odbywa się na tej samej maszynie. W przypadku MySQL wysłanie pojedynczego zapytania trwa trochę czasu, gdyż musi ono dojść do bazy i z niej wrócić. AchievementsGO zostało napisane w oparciu o dużą ilość zapytań. Dlaczego chcesz mieć to w formie MySQL? Żeby prowadzić jakiś ranking? Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
rafalpazder Napisano 17 Marca 2019 I jeszcze jedno pytanie - po co jest ta pętla? for (int i = 0; i < 3; i++) AGO_AddPoint(attackerId, AGO_Zabij[i]); U mnie to wyglada tak że daje graczom za dużo punktów....... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 17 Marca 2019 W tym przykładzie stworzyłem 3 Achievementy, gdzie każdy kolejny wymaga zdobycia większej ilości punktów - stąd dodaje punkty do wszystkich trzech Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Lyyu Napisano 25 Grudnia 2019 a da rade jakoś plugin po Polsku ustawić ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
BobPixel 1 Napisano 16 Kwietnia 2020 Przetestowane i ogólnie wszystko fajnie siupa w przyszłości można byłoby dodać opcję do pluginu na zasadzie jeśli masz wykonany 1 osiągniecie (Achievement) to dopiero wtedy możesz wykonywać 2 i tak dalej anaglocznie. Tylko nie wiem w sumie czy nie wymagałoby to większej ingerencji w kodzie. Pozderkii Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET 1 Napisano 16 Kwietnia 2020 Nie widzę problemu aby takie coś zaimplementować: if (AGO_IsAchievementCompleted(client, AGO_PierwszyAchievement) { AGO_AddPoint(client, AGO_DrugiAchievement); } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Gość Napisano 16 Kwietnia 2020 if(AGO_IsAchievementCompleted(attacker, AGO_ID[4]) != 1) { for (int k = 0; k < 5; k++) { if(AGO_IsAchievementCompleted(attacker, AGO_ID[k]) == 0) { AGO_AddPoint(attacker, AGO_ID[k]); break; } } } Ja mam to tak rozwiązane przy tablicach z misjami w różnych pluginach 😛 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach