Skocz do zawartości
Witamy na FragArena.pl - Baw sie dobrze!








Volter

[COD NOWY] Jak napisać klasę/perk

Rekomendowane odpowiedzi

Napisano (edytowane)
Witajcie. Dziś nauczę Was, jak stworzyć klasę oraz perk pod serwer Call Of Duty: Modern Warfare 3 (czyt. COD NOWY) od QTM_Peyote. 

Zapewne niektórzy z Was wiedzą, że COD NOWY różni się od starszej wersji jedną istotną rzeczą, a mianowicie klasy oraz perki zawarte są w osobnym pluginie, nie tak jak to było w starej wersji (w samym silniku). Klasy oraz perki dopisuje się do pliku: "plugins_codmod.ini", więcej szczegółów poniżej.
 
 
 
 
1. Podłoże
Oczywiście, bez podłoża nie będziecie mogli programować (czyt. pisać klas i perków). Według mnie, najlepszym (i darmowym) programem do pisania klas/perków jest Notepad++ (ma on wiele zastosowań, ale skupmy się na jednej, przejrzystym pisaniu). Ze względu na to, iż jestem dobrym człekiem, udostępniam Wam poradnik znaleziony w internecie, sam z niego korzystałem. Polecam zastosować się do punktów:

2. Ustawianie stylu (Styl do programowania);

7. TestFX Auto poprawianie tabulacji;

9. Auto podpowiadanie składni;

 

2. AMXX Scripting - wiedza ogólna

Nie zaczynajcie bez ogólnej wiedzy o Scripting'u w języku PAWN. Jest to dość stary język i praktycznie nieużywany (wyjątki: CS 1.6, GTA: SA-MP), więc nie polecam nauki tego języka przyszłym programistom (chyba, że jako podstawa do zrozumienia programowania - wtedy jak najbardziej). Wszystkie dodatki, modyfikacje etc. piszemy w plikach o rozszerzeniu *.sma, a dzięki kompilatorowi, uzyskujemy pliki o rozszerzeniu *.amxx (zakodowane, tylko AMXModX może je odczytać). Niestety (a raczej stety), nie możemy uzyskać kodu źródłowego (czyt. pliku *.sma) z zakodowanego pliku *.amxx - dzięki temu unikamy wielu kradzieży pluginów.

 

3. Kompilator

Jak już wspomniałem w pkt. 2, do sprawdzenia działalności naszego pluginu, będzie potrzebny nam kompilator. Wiele osób korzysta z kompilatora znajdującego się na stronie amxx.pl, lecz posiada on tylko podstawowe biblioteki (tak, biblioteki - powinny się Wam kojarzyć z DirectX), a do klas i perków potrzeba już kilka bibliotek stworzonych przez graczy. O bibliotekach nie musicie nic wiedzieć prócz: kiedy ich użyć. Łapcie link do mojego lokalnego kompilatora, posiada wszystkie biblioteki potrzebne do kompilacji klas i perków. By skompilować plugin, kopiujecie plik *.SMA do folderu: Szybka Kompilacja, po czym uruchamiacie "compile.exe". Jeśli Wasz plugin został dobrze napisany, plik skompilowany *.amxx pojawi się w folderze "compiled". Wgrywanie klas i perków podam pod koniec tego poradnika

 

 

4. Szablon klasy

Piszesz klasę? Nie wiesz, jak zacząć? To proste. Załącz Notepad++ -> Skopiuj poniższy szablon -> Postępuj zgodnie z kolejnymi punktami. Jeśli nie potrzebujesz podpowiedzi, usuń z szablonu wszystko, co jest za "//" - pamiętaj na przyszłość, w języku PAWN "//" oznacza, by pominąć wszystko, co jest w tej linijce za tym znakiem.

Jeśli chcesz wgrać klasę na serwer, nazwa pliku musi być następująca: 

codclass_tutajwpisznazweklasy.amxx

 

// Biblioteki, ich nie ruszamy, znajdują się w każdym pluginie, nie tylko w klasach i perkach
#include <amxmodx> 
#include <amxmisc>
#include <codmod>

// Informacje ogólne, pokazywane po wpisaniu /klasy
new const nazwa[]   = "Brak"; // Tu wpisujesz nazwę swojej klasy
new const opis[]    = "Opis"; // Tu wpisujesz opis swojej klasy (wyświetlany po wpisaniu /klasy)
new const bronie    = (1<<CSW_KNIFE); // Tu wpisujesz nazwy broni w taki sposób
new const zdrowie   = 0; // Tu wpisujesz, ile ma mieć życia (100 + stała [w tym przypadku 100+0])
new const kondycja  = 0; // Tu wpisujesz, ile ma mieć kondycji (normalny bieg + stala [w tym przypadku brak dodatkowej kondycji])
new const inteligencja = 0; // Tu wpisujesz, ile ma mieć inteligencji (0 + stała [w tym przypadku 0+0])
new const wytrzymalosc = 0; // Tu wpisujesz, ile ma mieć wytrzymałości (0 + stała [w tym przypadku 0+0])

// Nie ruszaj! To ma być w każdej klasie!
new ma_klase[33];

// Główny public, dzięki temu jesteśmy w stanie dodawać nowe modyfikacje np. niewidzialność itp.
public plugin_init()
{
register_plugin(nazwa, "1.0", "Volter"); // Pola "nazwa" nie ruszamy, drugie pole to wersja, a trzecie to autor.
cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc); // Rejestrujemy klasę w silniku COD'a (patrz: Informacje ogólne)
}

// Public mówiący o aktywnej (na danym graczu [id]) klasie
public cod_class_enabled(id)
{
ma_klase[id] = true;
}

// Public mówiący o dezaktywowanej (przez gracza [id]) klasie
public cod_class_disabled(id)
{
ma_klase[id] = false;
}

 

5. Bronie

 

Zapewne kilku z Was zauważyło dość dziwny sposób dodawania broni. Nie będę tego opisywał, po prostu przy dodawaniu broni korzystacie z tabeli NAME.

 

6. Modyfikacje

 

Każdy gracz COD MOD'a wie, że klasa z samymi atrybutami (życie, inteligencja, kondycja oraz wytrzymałość) jest beznadziejna, dlatego podam Wam fragmenty kodu, by uzyskać daną modyfikację (np. niewidzialność, brak grawitacji itp.). Wy jedynie musicie skopiować dany fragment do odpowiedniego miejsca (sugerujcie się szablonem).

 

6.1. Niewidzialność na każdej broni:

 

#include <engine>

public cod_class_enabled(id)
{
    ma_klase[id] = true;
    set_rendering(id,kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 10);  // Mamy przedział 0-255. 0 to jest całkowita niewidzialność, 255 - całkowita widzialność. Edytujemy 10.
}
    
public cod_class_disabled(id)
{
        ma_klase[id] = false;
    set_rendering(id,kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 255);  // Tutaj musimy pozostawić 255. Ustawia to całkowitą widzialność gracza, gdy zmieni klasę.
}

 

6.2. Niewidzialność na nożu:

 

#include <codmod>
#include <engine>

public plugin_init()
{
register_event("CurWeapon","CurWeapon","be", "1=1");
}

public CurWeapon(id)
{
    if(!ma_klase[id])
    return;
    
    new wid = read_data(2)  // Id broni
    if(wid == CSW_KNIFE)
    {
        set_rendering(id,kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 10); // Jeśli ma nóż, jest niewidzialny: przedział 0-255
    }
    else
    {
        set_rendering(id,kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 255); // Jeśli nie, jest widzialny.
    }
}

 

 

6.3. Zmniejszona grawitacja

#include <codmod>
#include <fakemeta>
#include <engine>

public plugin_init()
{
register_event("ResetHUD", "ResetHUD", "abe");
}

public cod_class_enabled(id)
{
    entity_set_float(id, EV_FL_gravity, 300.0/800.0); // Wartość od 0 do 800. Bodajże 400 to standardowa grawitacja.
    ma_klase[id] = true;
}

public cod_class_disabled(id)
{
    entity_set_float(id, EV_FL_gravity, 800.0/800.0);
    ma_klase[id] = false;
}

public ResetHUD(id)
{
    if(ma_klase[id])
        entity_set_float(id, EV_FL_gravity, 300.0/800.0);
} 

 

6.4. Cichobiegi

#include <codmod>
#include <fun>

public cod_class_enabled(id)
{
    set_user_footsteps(id, 1);
    ma_klase[id] = true;
}

public cod_class_disabled(id)
{
    set_user_footsteps(id, 0);
    ma_klase[id] = false;
} 

 

 

6.5. Ubranie wroga

#include <cstrike>

// Pod new ma_klase
new CT_Skins[4][] = {"sas","gsg9","urban","gign"};
new Terro_Skins[4][] = {"arctic","leet","guerilla","terror"};

public cod_class_enabled(id)
{
    ZmienUbranie(id, 0);
}
        
public cod_class_disabled(id)
{
    ZmienUbranie(id, 1);
}

public ZmienUbranie(id,reset)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE;

    if (reset)
        cs_reset_user_model(id);

    else
    {
        new num = random_num(0,3);
        cs_set_user_model(id, (get_user_team(id) == 1)? CT_Skins[num]: Terro_Skins[num]);
    }

    return PLUGIN_CONTINUE;

} 

 

6.6. Szansa na zrespienie się u wroga

#include <hamsandwich>

public plugin_init()
{
    RegisterHam(Ham_Spawn, "player", "Spawn", 1);
}

public Spawn(id)    
{
if(!is_user_alive(id))
    return;
    
if(!ma_klase[id])
    return;
    
if(random_num(1,2) == 1) // Określasz, ile ma być % szans na zrespienie się u wroga. 1,1 oznacza 100%. 1,2 oznacza 50%. 1,3 oznacza ~34%. 1,4 oznacza 25%. 1,5 oznacza 20% itd, itd.
    {
        new CsTeams:team = cs_get_user_team(id);
        cs_set_user_team(id, (team == CS_TEAM_CT)? CS_TEAM_T: CS_TEAM_CT);
        ExecuteHam(Ham_CS_RoundRespawn, id);
        cs_set_user_team(id, team);
    }

} 

 

 

6.7. Szansa na zabicie z danej broni

#include <hamsandwich>
#include <codmod>
#include <fun>

public plugin_init()
{
    RegisterHam(Ham_TakeDamage, "player", "fwTakeDamage_JedenZ");
}

public cod_class_enabled(id)
{
cod_give_weapon(id, CSW_GLOCK18);
    for(new i=0;i<11;i++)
        give_item(id,"ammo_556nato")
}

public cod_class_disabled(id)
{
    cod_take_weapon(id, CSW_GLOCK18);
}

public fwTakeDamage_JedenZ(this, idInf, idAtt, Float:fDmg, dmgBits)
{
    if(!is_user_alive(idAtt) || !ma_klase[idAtt] || !(dmgBits & (1<<1) ) || random_num(1, 5) != 1 ) // 1, 5 = 20%. 1, 4 = 25%. 1, 3 = 33%. 1, 2 = 50% itd., może być nawet 1, 100 czyli 1%
        return HAM_IGNORED;

    new weapon = get_user_weapon(idAtt);
    
    if(weapon == CSW_GLOCK18)    
        SetHamParamFloat(4, float(get_user_health(this) + 1));
    

    return HAM_HANDLED;
}
// Zamiast CSW_GLOCK dajemy broń, z której chcemy mieć 1/x szans na zabicie. 

 

6.8. Odbijanie pocisków

#include <hamsandwich>
#include <codmod>
#include <engine>

#define DMG_BULLET (1<<1)

new pozostale_strzaly[33];

public plugin_init()
{
RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
RegisterHam(Ham_Spawn, "player", "Spawn", 1);
}

public cod_class_enabled(id, wartosc)
{
    pozostale_strzaly[id] = 1;
}

public cod_class_disabled(id)
{
    ma_klase[id] = false;
    public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
    {
        if(!ma_klase[this])
        return HAM_IGNORED;

        if(pozostale_strzaly[this] > 0 && damagebits & DMG_BULLET)
        {
            pozostale_strzaly[this]--;
            return HAM_SUPERCEDE;
        }
        return HAM_IGNORED;
    }
    public Spawn(id)
    pozostale_strzaly[id] = 1; // Wszedzie, gdzie jest: pozostale_strzaly, zmieniasz wartość, ile pocisków ma odbijać.
} 

 

 

6.9. Rakiety

#include <hamsandwich>
#include <codmod>
#include <engine>

#define DMG_BULLET (1<<1)

new sprite_blast;
new ilosc_rakiet_gracza[33];
new poprzednia_rakieta_gracza[33];

public plugin_init()
{
register_touch("rocket", "*" , "DotykRakiety");
RegisterHam(Ham_Spawn, "player", "fwSpawn_Rakiety", 1);
}

public plugin_precache()
{
    sprite_blast = precache_model("sprites/dexplo.spr");
    precache_model("models/rpgrocket.mdl");
}

public client_disconnect(id)
{
    new entRakiety = find_ent_by_class(0, "rocket");
    while(entRakiety > 0)
    {
        if(entity_get_edict(entRakiety, EV_ENT_owner) == id)
            remove_entity(entRakiety);
        entRakiety = find_ent_by_class(entRakiety, "rocket");
    }
}

public cod_class_enabled(id, wartosc)
{
    ilosc_rakiet_gracza[id] = 1; // Tutaj zmieniasz ilość rakiet
}

public cod_class_skill_used(id)
{

    if (!ilosc_rakiet_gracza[id])
    {
        client_print(id, print_center, "Wykorzystales juz wszystkie rakiety!");
    }
    else
    {
        if(poprzednia_rakieta_gracza[id] + 2.0 > get_gametime())
        {
            client_print(id, print_center, "Rakiet mozesz uzywac co 2 sekundy!"); // Zmieniając wartość 2.0, ustalasz po ilu sekundach można użyć następnej rakiety.
        }

        else
        {
            if (is_user_alive(id))
            {
                poprzednia_rakieta_gracza[id] = floatround(get_gametime());
                ilosc_rakiet_gracza[id]--;

                new Float: Origin[3], Float: vAngle[3], Float: Velocity[3];

                entity_get_vector(id, EV_VEC_v_angle, vAngle);
                entity_get_vector(id, EV_VEC_origin , Origin);

                new Ent = create_entity("info_target");

                entity_set_string(Ent, EV_SZ_classname, "rocket");
                entity_set_model(Ent, "models/rpgrocket.mdl");

                vAngle[0] *= -1.0;

                entity_set_origin(Ent, Origin);
                entity_set_vector(Ent, EV_VEC_angles, vAngle);

                entity_set_int(Ent, EV_INT_effects, 2);
                entity_set_int(Ent, EV_INT_solid, SOLID_BBOX);
                entity_set_int(Ent, EV_INT_movetype, MOVETYPE_FLY);
                entity_set_edict(Ent, EV_ENT_owner, id);

                VelocityByAim(id, 1000 , Velocity);
                entity_set_vector(Ent, EV_VEC_velocity ,Velocity);
            }
        }
    }

}

public fwSpawn_Rakiety(id)
{
    if(is_user_alive(id))
        ilosc_rakiet_gracza[id] = 1; // Tutaj również zmieniasz ilość posiadanych rakiet
}

public DotykRakiety(ent)
{
    if (!is_valid_ent(ent))
        return;

    new attacker = entity_get_edict(ent, EV_ENT_owner);


    new Float:fOrigin[3];
    entity_get_vector(ent, EV_VEC_origin, fOrigin);

    new iOrigin[3];
    for(new i=0;i<3;i++)
        iOrigin[i] = floatround(fOrigin[i]);

    message_begin(MSG_BROADCAST,SVC_TEMPENTITY, iOrigin);
    write_byte(TE_EXPLOSION);
    write_coord(iOrigin[0]);
    write_coord(iOrigin[1]);
    write_coord(iOrigin[2]);
    write_short(sprite_blast);
    write_byte(32);
    write_byte(20);
    write_byte(0);
    message_end();

    new entlist[33];
    new numfound = find_sphere_class(ent, "player", 190.0, entlist, 32);

    for (new i=0; i < numfound; i++)
    {
        new pid = entlist[i];

        if (!is_user_alive(pid) || get_user_team(attacker) == get_user_team(pid))
            continue;
        cod_inflict_damage(attacker, pid, 55.0, 0.3, ent, (1<<24)); // Wartość 55.0 oznacza podstawowe DMG, a 0.3 to mnożnik inteligencji, czyli 1 w INT = 0,3DMG.
    }
    remove_entity(ent);
} 

 

6.10. Natychmiastowe przeładowanie

// Nie pamiętam, która biblioteka była potrzebna, tak więc najlepiej wstawić wszystkie, a przy błędach z kompilatora, usunąć niepotrzebne.
#include <codmod>
#include <fun>
#include <hamsandwich>
#include <cstrike>
#include <engine>
#include <fakemeta>

new const max_clip[31] = { -1, 13, -1, 10,  1,  7,  1,  30, 30,  1,  30,  20,  25, 30, 35, 25,  12,  20,
10,  30, 100,  8, 30,  30, 20,  2,  7, 30, 30, -1,  50 };

public plugin_init()
{
register_forward(FM_CmdStart, "CmdStart");
}

public CmdStart(id, uc_handle)
{
    if(!is_user_alive(id) || !ma_klase[id])
        return FMRES_IGNORED;
    
    new buttons = get_uc(uc_handle, UC_Buttons);
    new oldbuttons = pev(id, pev_oldbuttons);
    new clip, ammo, weapon = get_user_weapon(id, clip, ammo);
    
    if(max_clip[weapon] == -1 || !ammo)
        return FMRES_IGNORED;
    
    if((buttons & IN_RELOAD && !(oldbuttons & IN_RELOAD) && !(buttons & IN_ATTACK)) || !clip)
    {
        cs_set_user_bpammo(id, weapon, ammo-(max_clip[weapon]-clip));
        new new_ammo = (max_clip[weapon] > ammo)? clip+ammo: max_clip[weapon]
        set_user_clip(id, new_ammo);
    }
    
    return FMRES_IGNORED;
}

stock set_user_clip(id, ammo)
{
    new weaponname[32], weaponid = -1, weapon = get_user_weapon(id, _, _);
    get_weaponname(weapon, weaponname, 31);
    while ((weaponid = engfunc(EngFunc_FindEntityByString, weaponid, "classname", weaponname)) != 0)
        if (pev(weaponid, pev_owner) == id) {
        set_pdata_int(weaponid, 51, ammo, 4);
        return weaponid;
    }
    return 0;
} 

 

6.11. Widzenie niewidzialnych
 

#include <codmod>
#include <fakemeta>
#include <hamsandwich>

public plugin_init()
{
        register_forward(FM_AddToFullPack, "FwdAddToFullPack", 1)
}

public FwdAddToFullPack(es_handle, e, ent, host, hostflags, player, pSet)
{
        if(!is_user_connected(host) || !is_user_connected(ent))
                return;
                
        if(!ma_klase[host])
                return;
                
        set_es(es_handle, ES_RenderAmt, 255.0);
} 

 

 

6.12. Wieksze DMG z broni

#include <codmod>
#include <hamsandwich>

#define DMG_BULLET (1<<1)

public plugin_init()
{
        RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
}

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
        if(!is_user_connected(idattacker))
                return HAM_IGNORED;

        if(!ma_klase[idattacker])
                return HAM_IGNORED;

        if(get_user_team(this) != get_user_team(idattacker) && get_user_weapon(idattacker) == CSW_P90 && damagebits & DMG_BULLET) // CSW_P90 - zamiast tego wpisujesz broń, z jakiej ma być większe DMG.

                cod_inflict_damage(idattacker, this, 15.0, 0.0, idinflictor, damagebits); // Pierwsza wartość: 15.0 odpowiada za dodatkowe DMG, nie biorąc pod uwagę inteligencji, czyli np. z AWP bijesz po 105. Dasz tam wartość 15, to będziesz bił po 120. Druga wartość: w tym przypadku 0.0, odpowiada ilości dodatkowych DMG za 1 pkt inteligencji. Jeśli ustawimy tam wartość 1.0, za 1 INT będziemy bić o 1 DMG więcej.



        return HAM_IGNORED;

} 

 

 

6.13. Multi skok

#include <fakemeta>

new skoki[33];

public plugin_init()
{
register_forward(FM_CmdStart, "CmdStart");
}

public CmdStart(id, uc_handle)

{

    if(!is_user_alive(id) || !ma_klase[id])

        return FMRES_IGNORED;

    

    new flags = pev(id, pev_flags);

    

    if((get_uc(uc_handle, UC_Buttons) & IN_JUMP) && !(flags & FL_ONGROUND) && !(pev(id, pev_oldbuttons) & IN_JUMP) && skoki[id])

    {

        skoki[id]--;

        new Float:velocity[3];

        pev(id, pev_velocity,velocity);

        velocity[2] = random_float(265.0,285.0);

        set_pev(id, pev_velocity,velocity);

    }

    else if(flags & FL_ONGROUND)

        skoki[id] = 2; // W tym miejscu zmieniasz ilość skoków.

    

    return FMRES_IGNORED;

} 

 

6.14. Niewidzialność podczas kucania z każdą bronią oraz z bronią wybraną

#include <codmod>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>

public plugin_init()
{
register_forward(FM_PlayerPreThink, "fwPrethink_Niewidzialnosc", 1);
}

public cod_class_disabled(id)
{
set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255);
}

public fwPrethink_Niewidzialnosc(id)
{
if(!ma_klase[id])
  return;
new button = get_user_button(id);
if( button & IN_DUCK && get_user_weapon(id) == CSW_KNIFE) // Niewidzialność podczas kucania na nożu. Jeśli chcemy na innej broni zmieniamy CSW_KNIFE na inną broń. Jeśli chcemy niewidzialność podczas kucania (każda broń), usuwamy: "&& get_user_weapon(id) == CSW_KNIFE"
{
  set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 10);
}
else
{
  set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255);
}
} 

 

6.15. 1/1 z PPM z Knife

#include <hamsandwich>
#include <engine>

#define DMG_BULLET (1<<1)

public plugin_init()
{
RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
}

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
    if(!is_user_connected(idattacker))
    return HAM_IGNORED;

    if(!ma_klase[idattacker])
    return HAM_IGNORED;

    if(get_user_weapon(idattacker) == CSW_KNIFE && damagebits & DMG_BULLET && !(get_user_button(idattacker) & IN_ATTACK))

    cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);


    return HAM_IGNORED;

}  

 

 

6.16 Longjumb

#include <amxmodx>
#include <amxmisc>
#include <codmod>
#include <fakemeta>


new Float:ostatni_skok[33];


public cod_class_skill_used(id)
{
new flags = pev(id, pev_flags);

if(flags & FL_ONGROUND && get_gametime() > ostatni_skok[id]+4.0)
{
  ostatni_skok[id] = get_gametime();
  new Float:velocity[3];
  velocity_by_aim(id, 666+cod_get_user_intelligence(id), velocity);
  velocity[2] = random_float(265.0,285.0);
  set_pev(id, pev_velocity, velocity);
}
}

 

6.16 SpeedBroni



#include <fakemeta_util>
#include <hamsandwich>


public plugin_init() {
    

    register_event("CurWeapon","eventCurWeapon", "b")
}







public eventCurWeapon(id)
{
    if(!g_bMaKlase[id])
        return PLUGIN_CONTINUE

    new iWeapon = read_data(2);
    new iEnt;

    static Float:fSpeedMultiplier = 0.2; // Ta wartosc oznacza przelicznik ktory okresla szybkosc wystrzelenia pojedynczej kuli

    if(iWeapon == CSW_M4A1)
    {
        iEnt = fm_find_ent_by_owner(-1, "weapon_m4a1", id) //ta wartosc oznacza M4 mozemy ja dowolnie zmienic

        set_pdata_float( iEnt, 46, ( get_pdata_float(iEnt, 46, 4) * fSpeedMultiplier), 4 );
        set_pdata_float( iEnt, 47, ( get_pdata_float(iEnt, 47, 4) * fSpeedMultiplier), 4 );
    }

    return PLUGIN_CONTINUE
}

 

7. Szablon perku

 

Piszesz perk? Nie wiesz, jak zacząć? To proste. Załącz Notepad++ -> Skopiuj poniższy szablon -> Postępuj zgodnie z kolejnymi punktami. Jeśli nie potrzebujesz podpowiedzi, usuń z szablonu wszystko, co jest za "//" .


 

Jeśli chcesz wgrać perk na serwer, nazwa pliku musi być następująca: 

codperk_tutajwpisznazweperku.amxx

 

 

// Biblioteki, tego nie ruszamy! To są standardowe biblioteki dla perków COD'a
#include <amxmodx>
#include <amxmisc>
#include <codmod>

// Informacje wyświetlane po wpisaniu /perki
new const perk_name[] = "Nazwa"; // Nazwa perku
new const perk_desc[] = "Opis"; // Opis perku

// To musi być w każdym perku, nie ruszaj!
new bool:ma_perk[33];

public plugin_init()
{
    register_plugin(perk_name, "1.0", "Volter"); // perk_name zostawiasz, 1.0 to wersja, a "Volter" to autor. Można zmieniać do woli
    cod_register_perk(perk_name, perk_desc); // Rejestrujemy perk, nie ruszaj! Zawsze musi być!
}

// Jeśli gracz posiada dany perk to...
public cod_perk_enabled(id)
{
    ma_perk[id] = true;
}

// Jeśli gracz wyrzucił perk to...    
public cod_perk_disabled(id)
{
    ma_perk[id] = false;
} 

 

8. Modyfikacje

Niestety, tym razem nie podam gotowców. Większość modyfikacji macie wypisanych w pkt. 6. Nie obawiajcie się, w punkcie 9. podam Wam sposób, jak przerobić klasę na perk. Sugerujcie się tamtym sposobem, działa to na takiej zasadzie, lecz tutaj będzie mniej zmieniania.

 

9. Przerobienie klasy na perk

 

Tak, jak obiecałem, podaję sposób, jak przerobić klasę na perk. Niekiedy trzeba pomyśleć głową, ale najczęściej wystarczy zastosować się do poniższych rad:

1. Załącz kod interesującej Cię klasy (codclass_*.sma)

2. Biblioteki zostaw w spokoju, nie zmieniaj ich!

3. Zmień szablon klasy na szablon perku (pamiętaj, by nie zmieniać bibliotek!)

4. Wciśnij CTRL+F oraz przejdź do zakładki Zamień

5. W polu "Szukany tekst" (S) wpisz: klase, a w polu "Zamień na:" (Z) wpisz: perk, po czym wciśnij "Zamień wszystkie"

6. W polu S wpisz: class, a w polu Z wpisz: perk, po czym wciśnij "Zamień Wszystkie"

7. W polu S wpisz: klasa, a w polu Z wpisz: perk, po czym wciśnij "Zamień Wszystkie"

8. Skompiluj plugin lokalnym kompilatorem (patrz pkt. 3).

*** UWAGA! Nie przejmuj się, jeżeli nie będziesz mógł/mogła spełnić pkt. 5, 6 lub 7. Wtedy pomijasz ten punkt

 

 

10. Jak wgrać klasę lub perk na serwer?

 

To proste. Ściągasz program do FTP (ja osobiście używam WinSCP), łączysz się z FTP (dane znajdziesz na Pukawce lub innej serwerowni, w której kupiłeś/aś serwer), wgrywasz silnik COD'a (tutaj linku nie podam, iż na internecie znajduje się wiele silników, jak i paczek. Każdy wybierze to, co lubi), po czym wchodzisz w taki plik:

cstrike/addons/amxmodx/configs/plugins-codmod.ini 

 

Pamiętaj, by plik ten otworzyć w Notepad++! Struktura tego pliku jest następująca: 

;Call of Duty Mod
QTM_CodMod.amxx // Tutaj wpisujesz swoją wersję silnika, nazwa może się różnić, lecz zazwyczaj jest to QTM_CodMod.amxx


;Inne // Tutaj wpisujesz pluginy, które nie są ani klasami, ani perkami, lecz wymagają wpisania ich w to miejsce (instrukcja instalacji pluginu)
*.amxx

;Klasy

//Mega Premium Flaga *, tutaj wpisujesz sobie klasy Mega Premium (jeżeli Twój serwer posiada tylko klasy Premium, zostawiasz sobie tylko tabelę z klasami Premium)
codclass_*.amxx

//Max Premium Flaga *, tutaj wpisujesz sobie klasy Max Premium (jeżeli Twój serwer posiada tylko klasy Premium, zostawiasz sobie tylko tabelę z klasami Premium)
codclass_*.amxx

//Normal Premium Flaga *, tutaj wpisujesz sobie klasy Premium (jeżeli Twój serwer posiada tylko klasy Premium, zostawiasz sobie tylko tabelę z klasami Premium)
codclass_*.amxx

/////////////////Klasy Normalne///////////

codclass_*.amxx



;Perki  // Lista perków, kolejność na tej liście oznacza kolejność na serwerze pod komendą /perki
codperk_*.amxx


;Zalecane na samym dole // Pluginy, które w instrukcji miały wpisane, by były na samym dole
*.amxx 

 

 

Naciskasz na nim PPM --> Podgląd/Edycja --> i wypełniasz według własnego uznania. Potem wyłączasz Notepad++, a w WinSCP, gdy spyta, czy przesłać plik naciskasz: "Tak". Teraz pozostało Ci zrestartować serwer (lub zmienić mapę) i sprawdzić interesującą Cię klasę lub perk.

 

Wydaje mi się, że to wszystko.

 

 

Zakaz kopiowania bez mojej zgody

 

Copyright©Volter

Edytowane przez Volter
  • Super 3

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


  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...