############# Opis Klasy #############
Klasa uzbrojona jest w "Auto-Granatnik" (zamiast standardowego HE) znany z "Gun XP Mod'a" ponadto posiada Desert Eagle'a i jest bardzo wytrzymała.
############# Wymagane moduły #############
<amxmodx>
<codmod>
<colorchat>
<cstrike>
<fakemeta>
<fun>
<xs>
<gunxpmod>
<hamsandwich>
Moduł "gunxpmod.inc" w załączniku (wymagany do kompilacji lokalnej)
############# Instalacja #############
Standardowa
Modele do katalogu "models/valkiria/" lub innego (opisane poniżej)
############# Screen / Filmik #############
1. Screen modelu granatnika
2. Krótki Filmik
Klasa - Angel na potrzeby amxx.pl - YouTube
* W pliku .sma nie ma zaimpletowanej smugi która zostaje za granatem - uzyskane jest to przy pomocy pluginu "Grenade Trail" dostępnym tutaj: http://amxx.pl/topic...-grenade-trail/
* Filmik zaś wyciągnięty został z HLTV dlatego nie ma na nim pokazanego modelu
############# Kod źródłowy #############
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <codmod> #include <colorchat> #include <cstrike> #include <fakemeta> #include <fun> #include <xs> #include <gunxpmod> #include <hamsandwich> #define fm_is_valid_ent(%1) pev_valid(%1) new const nazwa[] = "Angel"; new const opis[] = "Posiada granatnik"; new const bronie = 1<<CSW_DEAGLE | 1<<CSW_HEGRENADE; new const zdrowie = 0; new const kondycja = 0; new const inteligencja = 0; new const wytrzymalosc = 75; new bool:ma_klase[33]; new cvar_maxdis new sprite_trail,g_trail; new const g_he_model[] = "models/valkiria/w_heseek.mdl" new const HE_MDL[] = "models/valkiria/v_heseek2.mdl" new bool:g_NadeSeek[33] public plugin_init() { register_plugin(nazwa, "1.0", "QTM_Peyote"); cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc); cvar_maxdis = register_cvar("heatseekhe_max_dis", "500.0") register_forward(FM_Think, "fwd_think") register_forward(FM_Touch, "fwd_touch") register_forward(FM_SetModel, "fwd_setmodel") register_event("CurWeapon", "Event_CurWeapon", "be", "1=1") register_event("ResetHUD", "ResetHUD", "abe"); RegisterHam(Ham_TakeDamage, "player","fwTakeDamage",0); } public plugin_precache() { sprite_trail = precache_model("sprites/laserbeam.spr") g_trail = precache_model("sprites/smoke.spr"); precache_model(g_he_model) precache_model(HE_MDL) } public cod_class_enabled(id) { ColorChat(id, GREEN, "Klasa stworzona przez Angel przy wspolpracy radim dla sieci XXX"); ma_klase[id] = true; g_NadeSeek[id] = true; ResetHUD(id); } public cod_class_disabled(id) { ma_klase[id] = false; g_NadeSeek[id] = false; set_user_footsteps(id, 1) } public client_connect(id) { g_NadeSeek[id] = false } public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits) { if(!is_user_alive(this) || !is_user_connected(this) || !is_user_connected(idattacker) || get_user_team(this) == get_user_team(idattacker)){ return HAM_IGNORED; } new weapon = get_user_weapon(idattacker); if(weapon ==CSW_HEGRENADE) cod_inflict_damage(idattacker, this, 1.0, 0.038, idinflictor, damagebits) return HAM_IGNORED; } public ResetHUD(id) set_task(0.1, "ResetHUDx", id); public ResetHUDx(id) { if(!is_user_connected(id)) return; if(!ma_klase[id]) return; cs_set_user_bpammo(id, CSW_HEGRENADE, 3); } public Event_CurWeapon(id) { if (!g_NadeSeek[id]) return PLUGIN_CONTINUE; if (!ma_klase[id]) return PLUGIN_CONTINUE; new Gun = read_data(2) if( Gun == CSW_HEGRENADE) { set_pev(id, pev_viewmodel2, HE_MDL) } return PLUGIN_CONTINUE; } public grenade_throw(id,gid,wid) { if(wid != CSW_HEGRENADE || !g_NadeSeek[id] || !ma_klase[id]) return PLUGIN_CONTINUE; Follow(gid,g_trail,10,12,255,0,0,195); return PLUGIN_CONTINUE; } Follow(entity,index,life,width,red,green,blue,alpha) { message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_BEAMFOLLOW); write_short(entity); write_short(index); write_byte(life); write_byte(width); write_byte(red); write_byte(green); write_byte(blue); write_byte(alpha); message_end(); } public fwd_setmodel(ent, model[]) { if(!fm_is_valid_ent(ent)) return FMRES_IGNORED static classname[32]; pev(ent, pev_classname, classname, 31) if(equali(model, "models/w_hegrenade.mdl") && pev(ent, pev_iuser1) == 0) { new id = pev(ent, pev_owner) if(g_NadeSeek[id] || ma_klase[id]) { engfunc(EngFunc_SetModel, ent, g_he_model) set_pev(ent, pev_iuser1, 1) set_pev(ent, pev_iuser2, get_user_team(id)) set_pev(ent, pev_iuser3, 0) return FMRES_SUPERCEDE; } } return FMRES_IGNORED } public fwd_touch(ent, id) { if(!fm_is_valid_ent(ent) || !is_user_alive(id)) return FMRES_IGNORED new classname[32] pev(ent, pev_classname, classname, (32-1)) if(equali(classname, "grenade")) { if((pev(ent, pev_iuser1) != 1)) return FMRES_IGNORED if(get_user_team(id) == pev(ent, pev_iuser2)) return FMRES_IGNORED set_pev(ent, pev_iuser1, 0) set_pev(ent, pev_iuser2, 0) set_pev(ent, pev_iuser3, 0) set_pev(ent, pev_dmgtime, 0.0) //set_pev(ent, pev_movetype, MOVETYPE_FOLLOW) //set_pev(ent, pev_sequence, 0) } return FMRES_IGNORED } public fwd_think(ent) { if(!fm_is_valid_ent(ent)) return FMRES_IGNORED new classname[32] pev(ent, pev_classname, classname, (32-1)) if(equali(classname, "grenade")) { if(pev(ent, pev_iuser1) != 1) return FMRES_IGNORED static Float:nadeorigin[3] pev(ent, pev_origin, nadeorigin) new target = pev(ent, pev_iuser3) if(!is_user_alive(target)) { static players[32], num get_players(players, num, "a") for(new i = 0; i < num; ++i) { new id = players[i] if(get_user_team(id) == pev(ent, pev_iuser2)) continue if(!fm_is_ent_visible(ent, id)) continue static Float:origin[3] pev(id, pev_origin, origin) new Float:maxdistance = get_pcvar_float(cvar_maxdis) new Float:distance = get_distance_f(origin, nadeorigin) if(distance < maxdistance) { set_pev(ent, pev_iuser3, id) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_BEAMFOLLOW) write_short(ent) write_short(sprite_trail) write_byte(30) write_byte(10) write_byte(255) write_byte(0) write_byte(0) write_byte(100) message_end() break } } } else entity_set_follow(ent, target, float(fm_get_speed(ent))) } return FMRES_IGNORED } stock entity_set_follow(entity, target, Float:speed) { if(!fm_is_valid_ent(entity) || !fm_is_valid_ent(target)) return 0 new Float:entity_origin[3], Float:target_origin[3] pev(entity, pev_origin, entity_origin) pev(target, pev_origin, target_origin) new Float:diff[3] diff[0] = target_origin[0] - entity_origin[0] diff[1] = target_origin[1] - entity_origin[1] diff[2] = target_origin[2] - entity_origin[2] new Float:length = floatsqroot(floatpower(diff[0], 2.0) + floatpower(diff[1], 2.0) + floatpower(diff[2], 2.0)) new Float:velocity[3] velocity[0] = diff[0] * (speed / length) velocity[1] = diff[1] * (speed / length) velocity[2] = diff[2] * (speed / length) set_pev(entity, pev_velocity, velocity) return 1 } stock fm_get_speed(entity) { new Float:Vel[3] pev(entity, pev_velocity, Vel) return floatround(vector_length(Vel)) } stock bool:fm_is_ent_visible(index, entity, ignoremonsters = 0) { new Float:start[3], Float:dest[3] pev(index, pev_origin, start) pev(index, pev_view_ofs, dest) xs_vec_add(start, dest, start) pev(entity, pev_origin, dest) engfunc(EngFunc_TraceLine, start, dest, ignoremonsters, index, 0) new Float:fraction get_tr2(0, TR_flFraction, fraction) if (fraction == 1.0 || get_tr2(0, TR_pHit) == entity) return true return false }
(Zdaje sobie sprawę kod źródłowy jest dłuższy niż 200 znaków, jednak jest tutaj wklejony nie po to by drażnić moderatora lecz by zoobrazować niektórym w jaki sposób edytować sobie klasę, co ma zapobiec spamowaniu w temacie banalnymi prośbami)
############# Edytowanie klasy dla początkujących #############
1. Edycja stopki:
* Szukamy:
ColorChat(id, GREEN, "Klasa stworzona przez Angel przy wspolpracy radim dla sieci XXX");
* Następnie frazę "XXX" zamieniamy na nazwę własnej sieci, lub jeśli nie chcemy by po wyborze klasy nie wyświetlało się kto jest jej twórcą i dla kogo została stworzona usuwamy całą linijkę
2. Edycja podstawowych atrybutów klasy:
*Szukamy:
new const nazwa[] = "Angel"; new const opis[] = "Posiada granatnik"; new const bronie = 1<<CSW_DEAGLE | 1<<CSW_HEGRENADE; new const zdrowie = 0; new const kondycja = 0; new const inteligencja = 0; new const wytrzymalosc = 75;
* Wytłumaczenie:
1. Nazwa:
new const nazwa[] = "Angel";Jeśli chcemy by klasa nazywała się inaczej wpisujemy zamiast "Angel" na przykład "Czupakabra"
2. Opis:
new const opis[] = "Posiada granatnik";Tutaj w nawiasie wpisujemy co ma się pojawić jako opis klasy przykładowo "Super, zajeb... mega klasa"
3. Bronie:
new const bronie = 1<<CSW_DEAGLE | 1<<CSW_HEGRENADE;Ta linia odpowiada za broń jaką klasa otrzyma na starcie, lista broni dostępna jest na forum, link: http://amxx.pl/topic...ive-item-speed/
Ważne!
By klasa poprawnie działała wymagane jest by nie usuwać jej:
1<<CSW_HEGRENADE;
4. Statystyki:
new const zdrowie = 0; new const kondycja = 0; new const inteligencja = 0; new const wytrzymalosc = 75;
* Zdrowie -> Tutaj ustawiamy ile startowego HP ma mieć klasa, przykładowo jeśli ustawimy tą statystykę na 20 to klasa będzie mieć 100 (bazowego) + 20 HP - co łącznie da 120 HP na start.
* Kondycja -> Jak szybko postać ma biegać, chyba nie trzeba nic tłumaczyć
* Inteligencja -> O ile % klasa ma mieć zwiększone umiejętności z Perków/Itemów
* Wytrzymałość -> O ile klasa ma mieć zmniejszone obrażenia jakie otrzymuje
5. Ścieżka do modelu granatnika:
* Szukamy:
new const g_he_model[] = "models/valkiria/w_heseek.mdl" new const HE_MDL[] = "models/valkiria/v_heseek2.mdl"Ta linia interesuje nas jeśli chcemy by modele granatnika i granatu pobierało do innego folderu niż ten ustawiony w pluginie zmieniamy frazę "valkiria" na przykładowo "ziomki"
6. Ustalenie ile grantów ma otrzymać klasa:
* Szukamy
cs_set_user_bpammo(id, CSW_HEGRENADE, 3);Jeśli chcemy zmienić ilość grantów które można wystrzelić przy pomocy granatnika wystarczy zmienić zmienną "3" na dowolnie wybraną przez nas liczbę na przykład "5"
Kodu się nie czepiać!
Wiem że napisany anarchicznie ale działa
Wiem że znajdzie się pewnie spora liczba osób które niejako "wyśmieją" to że pokazuję jak edytować klasę, jednak nie należy zapominać o początkujących bo przecież każdy z nas kiedyś zaczynał i zadawał zdawało by się mniej lub bardziej błahe pytania, ja robię to nadal ;D
Na koniec:
1. sma. w załączniku
2. include (.inc) w załączniku
3. modele w załączniku
Polecam kompilację lokalną: temat tutaj:
http://amxx.pl/topic...ilacja-lokalna/
Uwagi, spostrzeżenia, poprawki proszę pisać w tym temacie.
Pozdrawiam Angel