TheDoctor0 / CoDMod

Call of Duty Mod for Counter-Strike 1.6 (AMXX 1.8.3 / 1.9 / 1.10).
http://codmod.5v.pl/
MIT License
11 stars 4 forks source link

Odnośnie tworzenia klas i perków #105

Closed masterofencode closed 4 years ago

masterofencode commented 4 years ago

Z poprzednim codem było o tyle proste że już z miejsca wiedziało się jak pisać i jak robić klasy czy też perki Otóż mam problem i generalnie nie odnajduje się w tym obecnie :D

#include <amxmodx>
#include <cod>

#define PLUGIN "CoD Item Ciemne Okulary"
#define VERSION "1.0"
#define AUTHOR "O'Zone"

#define NAME        "Ciemne Okulary"
#define DESCRIPTION "Nie dzialaja na ciebie flashe. Dostajesz 2 flashe"

new itemActive;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);

    cod_register_item(NAME, DESCRIPTION);

    register_message(get_user_msgid("ScreenFade"), "message_screen_fade");
}

public cod_item_enabled(id, value)
{
    cod_give_weapon(id, CSW_FLASHBANG, 2);

    set_bit(id, itemActive);
}

public cod_item_spawned(id, respawn)
{
    if (!respawn) {
        cod_give_weapon(id, CSW_FLASHBANG, 2);
    }
}

public cod_item_disabled(id)
    rem_bit(id, itemActive);

public message_screen_fade(msgType, msgID, id)
{
    if (get_bit(id, itemActive) && get_msg_arg_int(4) == 255 && get_msg_arg_int(5) == 255 && get_msg_arg_int(6) == 255) {
        return PLUGIN_HANDLED;
    }

    return PLUGIN_CONTINUE;
}

I teraz tak jak zrobić by działało tak aby widziało nie widzialnych

TheDoctor0 commented 4 years ago

Pierwsze co zalecam, to zaznajomienie się z i używanie dokumentacji.

Swojego CoDa napisałem z myślą o tym, żeby generalnie tworzenie klas i itemów było prostsze z racji możliwości wykorzystania bardzo bogatej funkcjonalności, którą udostępnia sam silnik. Zresztą klasy i itemy jakie są dorzucone do paczki mają na celu przede wszystkim pokazanie jak powinno się je tutaj pisać, a niekonieczne od razu używać na serwerze. Wystarczy je sobie poprzeglądać.

Jeśli chodzi o moc widzenia niewidzialnych, zobacz sobie item Sokole Oko.

masterofencode commented 4 years ago

@TheDoctor0 dobrze zaznajomie się z dokumentacją

masterofencode commented 4 years ago

Co do obrażeń 1/1 czyli natychmiastowe zabicie gdzie to jest wspominiane w dokumentacji?

TheDoctor0 commented 4 years ago

Natyw cod_kill_player.

masterofencode commented 4 years ago

@TheDoctor0 takie pytanie mam i może to błąd jest ale co jakiś czas resetuje wszystkim level statystyki itp i pytanie co może nie tak być

TheDoctor0 commented 4 years ago

To co zostanie zapisane w bazie danych samo nie znika. Radziłbym sprawdzić logi, bo równie dobrze, któryś z adminów może je resetować jedną z trzech dostępnych komend: _cod_resetdata, _cod_reset_statsdata, _cod_reset_alldata. Możesz też zerknąć w cvary statystyk, _csstatsrank powinien być ustawiony na 0, a _csstatsmaxsize najlepiej na 99999.

masterofencode commented 4 years ago

csstats_maxsize chodzi ci o dodanie do amxx.cfg? co do tych tych komend da jakoś rade ustawić że tylko może korzystać z tego ktoś z flagą ADMIN_IMMUNITY?

masterofencode commented 4 years ago

A co do logów nic specjalnego nie pokazuje mi tylko tyle co błąd z połączeniem z bazą ale to robiłem wcześniej

TheDoctor0 commented 4 years ago

Cvary csstats_rank i csstats_maxsize już są w amxx.cfg, ale ich domyślna konfiguracja jest zupełnie inna. Jeśli chodzi o komendy do resetowania, wymagana jest flaga ADMIN_ADMIN, czyli "y".

masterofencode commented 4 years ago

tylko żaden z adminów nie ma takiej flagi

masterofencode commented 4 years ago

a csstats_rank mam ustawione na 0

TheDoctor0 commented 4 years ago

No po powiem szczerze, że chyba jedynym rozsądnym wytłumaczeniem byłoby to, że ktoś wyczyścił ci bazę danych.

masterofencode commented 4 years ago

wyłączyłem cod_reset_data, cod_reset_stats_data, cod_reset_all_data i zobaczymy co będzie dalej

masterofencode commented 4 years ago

@TheDoctor0 takie pytanie mam do cb o chodzi z tym że używałem na serwerze każdego pluginu na hasło na nick zapisują sie dane lecz po zmianie mapy trzeba od nowa robić oczywiście wyłączyłem odczytywanie cod_account itp i no nic nie działa :D a chciałbym żeby jednak ci gracze konto mieli jednakże przy wpisaniu dopiero /konto by mogli sobie zalozyc i wpisywac jak juz założą i żeby dane się zapisywało i żeby były odczytywane czy istnieje sposób jakiś żeby to zrobić właśnie z cod_account ale nie chce by wymuszało tą rejestracje przy wejściu na serwer tylko by można było sobie kiedy sie chce to zrobić pod komendą /konto przypomne że usunąłem !cod_check_account(id) ze silnika oraz cod_clans itp wywaliłem !cod_check_account(id) ponieważ irytowało mnie że i tak trzeba posiadać konto żeby z tego korzystać gdy ustawiłem cod_accounts_enabled "0" to wiadomo nie działało bo szukałem innego rozwiązania właśnie z tym /konto by nie wymuszało zaraz po wejściu na serwer i zadziałać tutaj tylko i wyłączonie komendą masz pomysł jak to ogarnąć?

TheDoctor0 commented 4 years ago

Właściwie po to jest opcja "Gość" - chcesz grać bez konta, nie ma problemu, ale mimo wszystko jego założenie jest zalecane. Jeśli chcesz, aby konta były bardziej opcjonalne pozamieniaj w kodzie playerData[id][STATUS] < LOGGED na playerData[id][STATUS] == NOT_LOGGED Sprawi to, że tylko gracze, którzy posiadają już zarejestrowane konto będą musieli się logować.

masterofencode commented 4 years ago

@TheDoctor0 a co z tym wymaganiem jeśli chodzi o używanie chociażby menu klas zostawić tak jak jest tak? bez !cod_check_account(id) bo to usunąłem mianowicie w tych linijkach if (!is_user_connected(id) || !cod_check_account(id)) return PLUGIN_HANDLED;

plus usunąłem z cod.inc native cod_check_account(id); i jak to będzie wyglądało jeśli zmienie playerData[id][STATUS] == NOT_LOGGED będzie to wyglądało tak że dopóki nie zdecyduje i nie wpisze /konto to nie będzie tego wymuszać tak? tylko działanie będzie jak wymieniłem wyżej?

TheDoctor0 commented 4 years ago

Jeśli usuniesz odwołania do natywu _cod_checkaccount, to całość właściwie nie ma sensu. Ktoś mógłby wbić sobie pod danym nickiem i robić co mu się żywnie podoba (zalogowany czy nie), np. przelać koledze cały honor, rozwiązać klan itd. Także tutaj radzę wrócić do stanu początkowego.

Tak, ta modyfikacja warunków sprawi, że dla graczy nic nie będzie wymuszane do momentu, aż nie założą sobie własnoręcznie konta w menu /konto.

masterofencode commented 4 years ago

Dzięki to przywróce do stanu początkowego

masterofencode commented 4 years ago

@TheDoctor0 Raczej jak przywróce to nie będzie ingerowało w baze że cofnie lvl itp? raczej tak nie powinno być

TheDoctor0 commented 4 years ago

W żadnym wypadku. To nie są zmiany, które w jakikolwiek sposób dotykają bazy i zawartej w niej danych.

masterofencode commented 4 years ago

@TheDoctor0 nadal wymusza zalozenie hasla jak sie wejdzie na serwer

masterofencode commented 4 years ago

playerData[id][STATUS] < LOGGED przy ctrl + f to jak wpisuje to wyszukuje mi jeszcze we funkcjach niektórych to i wtedy zmienić to na playerData[id][STATUS] == NOT_LOGGED ?

TheDoctor0 commented 4 years ago

Tak, musisz zamienić wszędzie.

Możesz sobie także dodatkowo zmienić: if (!get_user_team(id) && playerData[id][STATUS] == LOGGED) { na: if (!get_user_team(id) && (playerData[id][STATUS] == LOGGED || playerData[id][STATUS] == NOT_REGISTERED)) { Wtedy menu systemu nie rejestracji nie pokaże się w przypadku, gdy dane będą dość długo ładowane i od razu przejdzie do wyboru drużyny.

masterofencode commented 4 years ago

@TheDoctor0 Zaraz zobacze jak będzie śmigać

masterofencode commented 4 years ago

działa tylko że jak się zarejestrujemy to przechodzi do wybierania teamu gdzie to wyłączyć?

TheDoctor0 commented 4 years ago

Dokładnie tam, gdzie można by się tego spodziewać, czyli w funkcji _register_confirmationhandle. Są to oczywiście linijki:

client_cmd(id, "chooseteam");
engclient_cmd(id, "chooseteam");
masterofencode commented 4 years ago

oki to zakomentuje je pytanie teraz takie chce dodac eliminator rozrzutu do klasy i użyłem tego cod_get_user_recoil_eliminator(id, ALL, CLASS); i nie działa

TheDoctor0 commented 4 years ago

No i nie ma prawa działa - get pobiera, set ustawia. Powinieneś użyć cod_set_user_recoil_eliminator(id, true, CLASS).

masterofencode commented 4 years ago

@TheDoctor0 i teraz śmiga

masterofencode commented 4 years ago

@TheDoctor0 jak zablokować na klasie używanie danych perków albo perku? żeby poprostu nie działały na niej? albo nwm ignorowały ten perk że nie dostają

TheDoctor0 commented 4 years ago

Forward cod_check_item. Możesz sobie zajrzeć do itemu Cień, gdzie jest zaprezentowana blokada dla klasy Komandos.

masterofencode commented 4 years ago

chodzi tylko o tą funkcje? public cod_item_check(id) { new className[MAX_NAME];

cod_get_user_class_name(id, className, charsmax(className));

if (contain(className, "Komandos") != -1) {
    return COD_STOP;
}

return COD_CONTINUE;

}

TheDoctor0 commented 4 years ago

Tak, dokładnie o nią chodzi. W skrócie sprawdzane jest tutaj czy nazwa aktualnej klasy gracza zawiera słowo "Komandos". Jeśli tak, to zwracane jest COD_STOP, co blokuje dostęp do tego itemu.

masterofencode commented 4 years ago

@TheDoctor0 A jakby wyglądał kod jeśli chcialbym dać klasie model postaci oraz model broni?

TheDoctor0 commented 4 years ago

Jeśli chodzi o model broni, możesz przeanalizować kod pluginu skinów. Zmiana modelu postaci nie jest w żaden sposób wspierana - możesz ewentualnie wykorzystać plugin [CS] Player Models API, z którego korzystają chociażby JailBreak mody.

masterofencode commented 4 years ago

A jakbym skorzystał z generatora klas na amxx i kod z właśnie tych modeli umieścił w swojej klasie?

masterofencode commented 4 years ago

co do vipa chciałem ostatnio dodać skoki oraz przywitanie dla niego i pottem wgl nie działał a jakbym dodał właśnie do public cod_class_changed(id, class) i public cod_spawned(id, respawn) ten kod? cod_set_user_multijumps(id, 2, ALL) coś takiego?

masterofencode commented 4 years ago

@TheDoctor0 + jedna rzecz tez

include

include

define PLUGIN "CoD Item Boskie P90"

define VERSION "1.0"

define AUTHOR "O'Zone"

define NAME "Boskie P90"

define DESCRIPTION "Dostajesz P90, ktore ma nieskonczona amunicje i brak rozrzutu"

public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR);

cod_register_item(NAME, DESCRIPTION);

}

public cod_item_check(id) { new className[MAX_NAME];

cod_get_user_class_name(id, className, charsmax(className));

if (contain(className, "Klasa") != -1) {
    return COD_STOP;
}

return COD_CONTINUE;    

}

public cod_item_enabled(id, value) { cod_give_weapon(id, CSW_P90);

cod_set_user_unlimited_ammo(id, true, ITEM, 1<<CSW_P90);
cod_set_user_recoil_eliminator(id, true, ITEM, 1<<CSW_P90);

}

public cod_item_disabled(id) cod_take_weapon(id, CSW_P90);

nie odczytuje wgl tej blokady na klase

TheDoctor0 commented 4 years ago

@masterofencode, if (contain(className, "Klasa") != -1) { return COD_STOP; } Masz klasę o nazwie Klasa? Tutaj trzeba podać faktyczną nazwę klasy (lub jej fragment), dla której chcesz zablokować ten item.

Co do podwójnego skoku dla VIPa: cod_set_user_multijumps(id, 2, ALL) To w żadnym wypadku nie zadziała, bo ALL zgodnie z dokumentacją nie może być tutaj wykorzystywanym argumentem. W tym konkretnym wypadku polecałbym raczej użycie: cod_add_user_multijumps(id, 2, ADDITIONAL); Możesz do dopisać np. w cod_flags_changed po sprawdzeniu flagi VIPa, a w remove_vip dorzucić: cod_add_user_multijumps(id, -2, ADDITIONAL);

masterofencode commented 4 years ago

Oki jeśli nazwe klasa użyłem tak dal przykładu

masterofencode commented 4 years ago

I wlaśnie gdy podaje nazwe klasy dla perku i tak przez tą klase jest używane

TheDoctor0 commented 4 years ago

Dajesz sobie ten przedmiot z poziomu menu admina? Tam restrykcje są pomijane, linia 256: cod_set_user_item(selectedPlayer[id], selected, RANDOM, true); Zgodnie z dokumentacją odpowiada za to czwary parametr.

masterofencode commented 4 years ago

Nie ogólnie jak ludzie sobie dropią to zawużyłem ale również z poziomu admina też jak daje

TheDoctor0 commented 4 years ago

Wklej na https://gist.github.com/ kod pluginu klasy + kod przedmiotu i podaj tutaj linki. Jak będę miał wieczorem czas, to sprawdzę na serwerze testowym, czy jestem w stanie zreplikować problem.

masterofencode commented 4 years ago

https://gist.github.com/masterofencode/c6dfba89575fd43799ba7a62d56f51f0

TheDoctor0 commented 4 years ago

Nie jestem w stanie zreplikować problemu na serwerze testowym, przedmiot jest blokowany prawidłowo. Klasa i item skopiowane 1:1, skompilowane i przetestowane na wersji 1.5.0.

masterofencode commented 4 years ago

@TheDoctor0 gdzie ustawia się limit statystyk? jeśli chodzi o umiejętności do klas

TheDoctor0 commented 4 years ago

cod_mod.sma linia 1263:

new statsLimit = cvarPointsLimitEnabled ? (cvarLevelLimit * cvarPointsPerLevel / 5) : 0;

A zatem limit po maksymalny level dzielony przez 5. Można go też wyłączyć przestawiając cvar cod_points_limit na 0.

masterofencode commented 4 years ago

@TheDoctor0 i jak wyłacze limit to jak to wtedy będzie wyglądac?

TheDoctor0 commented 4 years ago

W jedną statystykę będzie można władować ile punktów się chce - czego specjalnie nie polecam, bo ich balans zasadniczo opiera się na limicie.