Witam !
Dzisiaj pokażę wam jak napisać nowy achievement do expmoda by striker
http://amxx.pl/topic/88605-expmod-by-striker-mcpr0/
W tym poradniku będę używać najnowszej wersji, czyli 1.9.7 fixed
Ok, co będzie potrzebne ?
Plik .inc expmod_achievements AMXX Pawn Studio ( Bądź jakiś inny edytor np. tekstowy) Kompilator
Ok zaczynamy !:
1. Dopisujemy nowe include a mianowicie:
#include <expmod_achievements>
czyli nasz kod powinien wyglądać już tak:
#include <amxmodx>
#include <amxmisc>
#include <expmod_achievements>
#define PLUGIN "Nazwa pluginu"
#define VERSION "1.0"
#define AUTHOR "Autor"
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
}
2. Tworzymy wszystkie zmienne globalne, jakie bedziemy używać w tym achievemencie
//Jest to przykładowe
new const szNameI[] = "Nazwa Poziomu I"; // Np Killer I
new const szNameII[] = "Nazwa Poziomu II"; // Np Killer II
new const szNameIII[] = "Nazwa Poziomu III"; // Np Killer II
new const szDescI[] = "Opis Poziomu I"; //Np Zabij 10 wrogów
new const szDescII[] = "Opis Poziomu II"; //Np Zabij 15 Wrogów
new const szDescIII[] = "Opis Poziomu III"; //Np Zabij 20 Wrogów
new szAwardI = 100; //Nagroda za osiągnięcie 1 poziomu tego osiągnięcia
new szAwardII = 500; // -- || -- 2 -- || --
new szAwardIII = 2500; // -- || -- 3 -- || --
new szLvlI = 0; // Od którego poziomu bedzie aktywowany Poziom I tego osiągnięcia
new szLvlII = 70; // -- || -- Poziom 2 -- || --
new szLvlIII = 160; // -- || -- Poziom 3 -- || --
new szNeedI = 10; // Ile czego potrzeba zeby zrobic cos z szDescI[] tutaj w tym przypadku będzie to 10 wrogów
new szNeedII = 15; // -- || --
new szNeedIII = 20; // -- || -
new enabled[33][3]; // Tworzy zmienną która będzie przechowywać wartości czy dany poziom jest aktywny i gracz może wykonywać tę osiągnięcie
new ach[3]; // id 3 poziomów achievementa
Wiem, że to wygląda strasznie, ale naprawdę jest proste

3. Rejestrujemy ten achievement
Do plugin_init dajemy
ach[0] = exp_register_achI(szNameI, szDescI, szLvlI, szAwardI, szNeedI)
ach[1] = exp_register_achII(szNameII, szDescII, szLvlII, szAwardII, szNeedII)
ach[2] = exp_register_achIII(szNameIII, szDescIII, szLvlIII, szAwardIII, szNeedIII)
Czyli nasz cały dotychczasowy kod powinien wyglądać tak:
#include <amxmodx>
#include <amxmisc>
#include <expmod_achievements>
#define PLUGIN "ExpMod Achievement Killer"
#define VERSION "1.0"
#define AUTHOR "PaTrIcKx"
new const szNameI[] = "Nazwa Poziomu I"; // Np Killer I
new const szNameII[] = "Nazwa Poziomu II"; // Np Killer II
new const szNameIII[] = "Nazwa Poziomu III"; // Np Killer II
new const szDescI[] = "Opis Poziomu I"; //Np Zabij 10 wrogów
new const szDescII[] = "Opis Poziomu II"; //Np Zabij 15 Wrogów
new const szDescIII[] = "Opis Poziomu III"; //Np Zabij 20 Wrogów
new szAwardI = 100; //Nagroda za osiągnięcie 1 poziomu tego osiągnięcia
new szAwardII = 500; // -- || -- 2 -- || --
new szAwardIII = 2500; // -- || -- 3 -- || --
new szLvlI = 0; // Od którego poziomu bedzie aktywowany Poziom I tego osiągnięcia
new szLvlII = 70; // -- || -- Poziom 2 -- || --
new szLvlIII = 160; // -- || -- Poziom 3 -- || --
new szNeedI = 10; // Ile czego potrzeba zeby zrobic cos z szDescI[] tutaj w tym przypadku będzie to 10 wrogów
new szNeedII = 15; // -- || --
new szNeedIII = 20; // -- || -
new enabled[33][3]; // Tworzy zmienną która będzie przechowywać wartości czy dany poziom jest aktywny i gracz może wykonywać tę osiągnięcie
new ach[3]; // id 3 poziomów achievementa
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
ach[0] = exp_register_achI(szNameI, szDescI, szLvlI, szAwardI, szNeedI)
ach[1] = exp_register_achII(szNameII, szDescII, szLvlII, szAwardII, szNeedII)
ach[2] = exp_register_achIII(szNameIII, szDescIII, szLvlIII, szAwardIII, szNeedIII)
4. Sprawdzamy, czy gracz ma odblokowany achievment:
public achievement_enabled(id, achid, achlvl)
{
if(achid == ach[0] && achlvl == 1) // Jezeli wyslane id achievmenta jest równe naszemu zarejestrowanemu i poziom jest równy 1 to gracz może wykonywać Poziom I
enabled[id][0] = 1;
if(achid == ach[1] && achlvl == 2) // Itd.
enabled[id][1] = 1;
if(achid == ach[2] && achlvl == 3)
enabled[id][2] = 1;
}
public achievement_disabled(id, achid, achlvl)
{
if(achid == ach[0] && achlvl == 1) // Jezeli wyslane id achievmenta jest równe naszemu zarejestrowanemu i poziom jest równy 1 to gracz nie może wykonywać Poziomu I
enabled[id][0] = 0;
if(achid == ach[1] && achlvl == 2 && enabled[id][0] == 0) // itd.
enabled[id][1] = 0;
if(achid == ach[2] && achlvl == 3 && enabled[id][1] == 0)
enabled[id][2] = 0;
}
5. Reszta kodu.
Nasza reszta kody w tym tutku. To wychwycenie zabicie gracza przez naszego "id" i sprawdzenie jaki Poziom wykonuje danego achievemntu, po czym dodanie postępu.
do plugin_init
register_event("DeathMsg", "DeathMsg", "a");
i na końcu kodu:
public DeathMsg()
{
new atakujacy = read_data(1) // Id naszego "id" czyli atakującego który zabił kogoś
new id = read_data(2) // Id zabitego
if(!is_user_connected(atakujacy) || is_user_hltv(atakujacy)) // Jeżeli gracz nie jest połączony ( atakujący ) albo jest HLTV to przerwij
return PLUGIN_CONTINUE
if(atakujacy != id && get_user_team(atakujacy) != get_user_team(id)) // Jeżeli atakujący nie zabił siebie i zabił członka innej dróżyny
{
if(enabled[atakujacy][0] == 1) // Jeżeli wykonuje Poziom I
exp_set_achievement_progress(atakujacy, ach[0], 1, exp_get_achievement_progress(atakujacy, ach[0], 1)+1) // Ustaw postęp: atakującemu, id achievementa, poziom tego achievementa, postęp ( pobierz postęp, i dodaj 1 )
else if(enabled[atakujacy][1] == 1) // Itd..
exp_set_achievement_progress(atakujacy, ach[1], 2, exp_get_achievement_progress(atakujacy, ach[1], 2)+1) // Itd
else if(enabled[atakujacy][2] == 1)
exp_set_achievement_progress(atakujacy, ach[2], 3, exp_get_achievement_progress(atakujacy, ach[2], 3)+1)
}
return PLUGIN_CONTINUE
}
6. Skompilowanie i dodanie do plugins-expmod.ini
WAŻNE!
Teraz jest w prawdzie najważniejsze. Więc zrób "prawie" dokładnie to co ja:
przypuśćmy, że nazwałeś ten ach : expmod_ach_nowy.amxx
Pytanie: Gdzie go dodać ?
Odpowiedź: Masz takie coś w plugins-expmod:
expmod_ach_knife_master.amxx debug ; Nazwa achievementa odpowiada za achievement, tzn knife_master - zabij z noża
expmod_ach_glock_master.amxx debug ; Zabij z Glocka X wrogów
expmod_ach_usp_master.amxx debug ; Zabij z USP X wrogów
expmod_ach_p228_master.amxx debug ; itd...
expmod_ach_deagle_master.amxx debug ; ...
expmod_ach_elite_master.amxx debug
expmod_ach_fiveseven_master.amxx debug
expmod_ach_xm1014_master.amxx debug
expmod_ach_m3_master.amxx debug
expmod_ach_tmp_master.amxx debug
expmod_ach_mac10_master.amxx debug
expmod_ach_mp5_master.amxx debug
expmod_ach_ump45_master.amxx debug
expmod_ach_p90_master.amxx debug
expmod_ach_famas_master.amxx debug
expmod_ach_galil_master.amxx debug
expmod_ach_scout_master.amxx debug
expmod_ach_ak47_master.amxx debug
expmod_ach_m4a1_master.amxx debug
expmod_ach_sg552_master.amxx debug
expmod_ach_aug_master.amxx debug
expmod_ach_sg550_master.amxx debug
expmod_ach_g3sg1_master.amxx debug
expmod_ach_m249_master.amxx debug
expmod_ach_he_master.amxx debug ; Zabij z granata
expmod_ach_headshot.amxx debug ; Zabij HeadShotem
expmod_ach_killer.amxx debug ; Zabij
expmod_ach_stzelanie_w_powietrzu.amxx debug ; Zabij w powietrzu
expmod_ach_stzelanie_kleczac.amxx debug ; Zabij klęcząc
expmod_ach_saper.amxx debug ; Rozbrój pakę
expmod_ach_bomberman.amxx debug ; Podsadź pakę
expmod_ach_nalogowiec.amxx debug ; Zadaj dmg
expmod_ach_bohater.amxx debug ; Uratowanie hostów
w pliku Uwaga.txt widnieje taka informacja:
Dodawając achievement, zawsze dodawaj go na końcu. Tak samo z mi[..]...
A więc na końcu czyli
po
expmod_ach_nalogowiec.amxx debug ; Zadaj dmg expmod_ach_bohater.amxx debug ; Uratowanie hostów
dajemy
expmod_ach_nowy.amxx debug ; Debug nie jest obowiązkowe
To zapobiegnie pewnego rodzaju bugom, złym zapisom, wczytaniom i nie wiadomo czemu jescze
7. Zapisujemy, wrzucamy na serwa i sprwadzamy nasze cudo
To Tyle w tym poradniku, zapewne wiem, że jest nie przejrzyście i estetycznie za co Przepraszam. Jak jest nie zrozumiałe proszę o napisanie tego w komentarzu a postaram się napisać go od nowa, tak aby było przejrzyście i zrozumiale.
Poradnik by PaTrIcKx firmy SGT Comapny Group © Spółka z ograniczoną odpowiedzialnością
na potrzeby amxx.pl