Skocz do zawartości
MAGNET

AchievementsGO - narzędzie do tworzenia własnych osiągnięć

Rekomendowane odpowiedzi

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

20180826182042_1.thumb.jpg.bb86ab079b7f521ca844cbbce61e259c.jpg

20180826182046_1.thumb.jpg.d3f34070562f51f8199693de8774d4b8.jpg

20180826182053_1.thumb.jpg.209dd457dd5d0c94b255261f3dbdc67c.jpg

20180826182105_1.thumb.jpg.80fc359f25e41140b6535096a8d58e1b.jpg

20180826182137_1.thumb.jpg.9e7382d63f1f007e06abd8b528f57bd8.jpg

 

Download

 

GitHub
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

 

Przez MAGNET,

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

Ż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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

"Wystarczy AGO_AddPoint wziąć w warunek sprawdzający flagę." 

Mam pytanie mógł byś pokazać przykład ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
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]);
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Część, będzie jakaś aktualizacja? Może wsparcie dla MySQl?

Przez MAGNET,

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

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie widzę problemu aby takie coś zaimplementować:

 

if (AGO_IsAchievementCompleted(client, AGO_PierwszyAchievement) {
 	AGO_AddPoint(client, AGO_DrugiAchievement); 
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
                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 😛

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...