Skocz do zawartości

Rekomendowane odpowiedzi

Dostępna jest nowa wersja pluginu. Kliknij, aby przejść...

 

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

 

 

Sygnatura użytkownika

Użytkowniku! Pamiętaj, że nic tak nie motywuje jak porządna łapka w górę!

Nie mówię tylko o sobie - honoruj każdego, kto na to zasługuje 🙂

YouTube | SteamGitHub | MailboxGO | AchievementsGO | MuteGO

  • Lubię to!
  • Dobry pomysł!
Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • 4 miesiące temu...

Ż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

Sygnatura użytkownika

Użytkowniku! Pamiętaj, że nic tak nie motywuje jak porządna łapka w górę!

Nie mówię tylko o sobie - honoruj każdego, kto na to zasługuje 🙂

YouTube | SteamGitHub | MailboxGO | AchievementsGO | MuteGO

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]);
}

 

Sygnatura użytkownika

Użytkowniku! Pamiętaj, że nic tak nie motywuje jak porządna łapka w górę!

Nie mówię tylko o sobie - honoruj każdego, kto na to zasługuje 🙂

YouTube | SteamGitHub | MailboxGO | AchievementsGO | MuteGO

  • Lubię to!
Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • 3 tygodnie później...
  • 1 miesiąc temu...

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

Sygnatura użytkownika

Użytkowniku! Pamiętaj, że nic tak nie motywuje jak porządna łapka w górę!

Nie mówię tylko o sobie - honoruj każdego, kto na to zasługuje 🙂

YouTube | SteamGitHub | MailboxGO | AchievementsGO | MuteGO

Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • 9 miesięcy temu...
  • 3 miesiące temu...

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

  • Kocham to
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); 
}

 

Sygnatura użytkownika

Użytkowniku! Pamiętaj, że nic tak nie motywuje jak porządna łapka w górę!

Nie mówię tylko o sobie - honoruj każdego, kto na to zasługuje 🙂

YouTube | SteamGitHub | MailboxGO | AchievementsGO | MuteGO

  • Kocham to
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 😛

Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ostatnio przeglądający ten temat (5 użytkowników)

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ć grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...