Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
MAGNET

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

Recommended Posts

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!

 

 

  • Lubię to! 2
  • Dobry pomysł! 1
  • Kocham to! 1
By MAGNET,

Trochę obszerniejszy przykład tworzenia własnych osiągnięć przedstawiony jest na GitHubie

Share this post


Link to post
Share on other sites

Ż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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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]);
}

 

  • Lubię to! 1

Share this post


Link to post
Share on other sites

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

By 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?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...