Usunięcie dźwięku z granata HE
zasepa
12.06.2016
Witam
Chodzi oto że nwm jak usunąć dźwięk z granata HE podczas jego wybuchu. Czyli dźwięk wybuchu.
Chodzi mi tutaj o programowe w pluginie jego usunięcie.
Problem jest tylko z HE bo on z tego co widzę inaczej się zachowuje niż pozostałe granaty. Z nimi było to proste.
Lecz na HE nic nie działa. Bo jak jakoś udało mi się go zablokować to całkowiecie ze nie wybuchł.
Proszę o pomoc
Linux'
13.06.2016
Samego dzwieku nigdy nie mialem okazji usuwac, bo i po co. Natomiast wydaje mi sie, ze bedzie to wygladac w podobny sposob jak z dzwiekami noza. Zarejestruj emitsound, wykryj odpowiedni dzwiek i go zablokuj.
zasepa
14.06.2016
W tym rzecz ze ta blokada w emit sound nie działa. Dlatego napisałem temat czy może ktoś zna inny sposób.
Proszę o pomoc
Linux'
14.06.2016
W takim razie wychwyc think granata w hamsandwich badz model lub dzwiek w fakemeta i zablokuj jego funkcje po opuszczeniu na ziemie. Stworz recznie efekt wybuchu, wtedy nie bedzie dzwieku wiec efekt zamierzony.
Przykladowy kod na blokade funkcji granata. Przed stworzeniem enta, po wykryciu funkcji dodajesz
entity_set_vector(ent, EV_VEC_origin, Float:{9999.9, 9999.9, 9999.9}); entity_set_int(ent, EV_INT_flags, FL_KILLME);
Asiap
14.06.2016
#include <amxmodx> #include <fakemeta> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "Asiap123" new g_szSoundsExplosion[] = "weapons/explode3.wav, weapons/explode4.wav, weapons/explode5.wav" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_forward(FM_EmitSound, "EmitSound"); } public EmitSound(iEnt, iChannel, szSound[], Float:fVolume, Float:fAttn, iFlag, iPitch) { if(GetGrenadeType(iEnt) != CSW_HEGRENADE) { return FMRES_IGNORED; } for(new i; i < sizeof g_szSoundsExplosion; i++) { if(!equali(g_szSoundsExplosion, szSound)) { continue; } engfunc(EngFunc_EmitSound, iEnt, iChannel, szSound, fVolume, fAttn, SND_STOP, iPitch); return FMRES_SUPERCEDE; } return FMRES_IGNORED; } GetGrenadeType(iEnt) { static szClass[9]; pev(iEnt, pev_classname, szClass, 8); if(!equal(szClass, "grenade") || get_pdata_bool(iEnt, 385)) { return PLUGIN_CONTINUE; } static usEvent; if(!(usEvent = get_pdata_short(iEnt, 228))) { return CSW_FLASHBANG; } static m_usHgrenExplo; if(!m_usHgrenExplo) { m_usHgrenExplo = engfunc(EngFunc_PrecacheEvent, 1, "events/createexplo.sc"); } return usEvent == m_usHgrenExplo ? CSW_HEGRENADE : CSW_SMOKEGRENADE; }
zasepa
15.06.2016
Asiap - niestety ale nie działa. A dokładniej w tym miejscu: Po prostu ten dźwięk nie zostaje z ciszony. nic się nie zmienia
engfunc(EngFunc_EmitSound, iEnt, iChannel, szSound, fVolume, fAttn, SND_STOP, iPitch);
Po za tym skąd wziąłeś takie nazwy dzwięków:?
weapons/explode3.wav, weapons/explode4.wav, weapons/explode5.wav
Ja wcześniej dodałem instrukcje wyświetlającą mi ścieżkę:
ColorChat(0, GREEN, "Channel: %d, Sciezka: %s", channel, sound);
I u mnie ścieżka przy wybuchu tego granatu to:
weapons/debris2.wav
A nie to co podałeś, ale mniejsza oto bo bez tego sprawdzania również nie działa.
Linux - tak tylko że nie mam pojęcia jak zrobić ten wybuch. Nie wiem jak zadawać dmg graczom w obrębie wagowo odległości oraz pokazanie spritesa. Nawet nwm jak ten sprites się nazywa(co pokazuje wybuch) i jak go w tym przypadku wyświetlić.
Zablokowanie wybuchu jest bardzo łatwe akurat.
Bo po prostu chce zamienić ten dźwięk na inny. Wiec muszę tego usunąć
A i przy okazji mam pytanie chodzi mi o dźwięki. Mam plik dźwiękowy w formacie .wav i gdy go emituje w cs to nie ma wysokich tonów tylko niskie. Tak jak byśmy zwiększyli jego głośność np w audacity. Jest tam suwak którym możemy zwiększyć decybele, czy coś takiego. Mimo że gdy na PC go odtwarzam to jest wszystko dobrze. Na czym może polegać problem? Czemu cs inaczej go odtwarza?
Pozdrawiam
Linux'
19.06.2016
Blokujac sciezki typu
weapons/debris2.wav
nie blokujesz wybuchu lecz dzwieki typu uzycia granatu a to nie to samo. Dzwieki wybuchu np
weapons/explode4.wav
znajduja sie w folderze valve/sound i one odpowiadaja za dzwieki wybuchow lecz nie zablokujesz ich po stronie gracza (tak jak np dzwieku strzalu).
Jesli chcesz wywolac efekt sprite wybuchu, wstawiasz do funkcji wybuchu np taki kod
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();
iOrigin to jego pozycja, pobierasz ja np za pomoca funkcji pev(index, pev_origin, iOrigin). Sprite_blast to lokalizacja do sprite, ktory zostanie wyswietlony w trakcie tworzenia wybuchu. Do precache dodajesz np
sprite_blast = precache_model("sprites/dexplo.spr");
(oczywiscie pierw jeszcze trzeba utworzyc zmienna globalna, w tym wypadku sprite_blast).
Dalej jesli chodzi o zadane obrazenia, to po prostu sprawdzasz w petli czy gracz znajduje sie blizej niz okreslona odleglosc od pozycji enta (iorigin). Nizej przyklad
new Float:player_origin[3]; for(new i = 1; i <= max_players; i ++) { if(!is_user_alive(i)) continue; pev(i, pev_origin, player_origin); if(get_distance_f(iOrigin, player_origin) <= 50.0) { } }
funkcja get_distance_f sluzy do odmierzania odleglosci miedzy pozycja x a y. W tym wypadku funkcja bedzie wykonywana jesli gracz znajdzie sie blizej niz 50 unitow w odleglosci enta.
Teraz w funkcji wykonujesz kod na obrazenia, ustawiasz stala wartosc jesli ma na stale zadawac np 40 dmg lub po prostu obrazenia (np 100-odleglosc). Spowoduje to taki sam efekt obrazen, jak wyglada to np z he. Do zadanych obrazen uzyj funkcji
ExecuteHam(Ham_TakeDamage, id, ent, ent, 40.0, 1);
Nie chcialo mi sie pisac z tego gotowego pluginu, ale mysle ze sie polapiesz. Poczytaj dokumentacje o funkcjach ktorych ci podalem i troche poradnikow na temat tworzenia bytow, to dasz sobie rade.
zasepa
19.06.2016
Bardzo dziękuje za pomoc.
Tego potrzebowałem
Tak chce zrobić aby był podobny do HE. tylko z innymi dźwiękami.
Kod jest dla mnie zrozumiały. Lecz muszę jeszcze poczytać o:
ExecuteHam(Ham_TakeDamage, id, ent, ent, 40.0, 1);
Bo czemu tu jest 2 razy "ent" wiem ze id to osoba atakująca a ent to ofiara, 40.0 to dmg , a 1 to nwm
Jeszcze raz bardzo dziękuje
Ale jeszcze nie została udzielona odpowiedz na moje kolejne pytanie więc powtarzam je:
Mam pytanie chodzi mi o dźwięki. Mam plik dźwiękowy w formacie .wav i gdy go emituje w cs to nie ma wysokich tonów tylko niskie. Tak jak byśmy zwiększyli jego głośność np w audacity. Jest tam suwak którym możemy zwiększyć decybele, czy coś takiego. Mimo że gdy na PC go odtwarzam to jest wszystko dobrze. Na czym może polegać problem? Czemucs inaczej go odtwarza?
Master Yoga
19.06.2016
Zacznijmy od tego, że CS to nie odtwarzacz muzyki. Z tego co pamiętam nie otwiera on nawet plików muzycznych z szybkością transmisji bitów większą niż 700 kb/s z hakiem.
ExecuteHam(Ham_TakeDamage, id, ent, ent, 40.0, 1);
W skrócie funkcja ta wywołuje wydarzenie z "kanapki" ( hamsandwich ).
Bo czemu tu jest 2 razy "ent" wiem ze id to osoba atakująca a ent to ofiara, 40.0 to dmg , a 1 to nwm
Mylisz się . Parametr ID to index gracza, który otrzyma dane obrażenia ( parametr 5 ).
Parametr 3 to byt zadający obrażenia. ( Najczęściej ten byt jest równy atakującemu ( parametr 4 ) stąd to drugie "ent" ).
Choć w przypadku np. granatu byt zadający obrażenia przyjmuję wartość inną niż parametr 4 ( atakujący ).
Ostatni parametr to rodzaj obrażeń. W tym temacie znajdziesz więcej informacji na ten temat ( https://amxx.pl/topi...881-damagebits/).
zasepa
20.06.2016
Wszystko jest dobrze ale pojawił się jeden problem
Gdy zastosowałem kod:
message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_EXPLOSION); write_coord(iOrigin[0]); write_coord(iOrigin[1]); write_coord(iOrigin[2]); write_short(sprite_he_explode); write_byte(32); write_byte(20); write_byte(0); message_end();
To granat standardowo wybucha. Gdy zakomentuję powyższy kod to mój kod się wykonuje i poprawnie blokuje granat oraz jest mój dźwięk, itp
Więc czy można jakoś inaczej wyświetlić spritesa wybuchu?
Linux'
20.06.2016
Wszystko jest dobrze ale pojawił się jeden problem
Gdy zastosowałem kod:
message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_EXPLOSION); write_coord(iOrigin[0]); write_coord(iOrigin[1]); write_coord(iOrigin[2]); write_short(sprite_he_explode); write_byte(32); write_byte(20); write_byte(0); message_end();To granat standardowo wybucha. Gdy zakomentuję powyższy kod to mój kod się wykonuje i poprawnie blokuje granat oraz jest mój dźwięk, itp
Więc czy można jakoś inaczej wyświetlić spritesa wybuchu?
message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin); write_byte(TE_SPRITE) write_coord(iOrigin[0]); write_coord(iOrigin[1]); write_coord(iOrigin[2]); write_short(sprite_id); write_byte(5); // scale write_byte(200); // alpha message_end();
zasepa
21.06.2016
Zadziałało ale jak trochę zmieniłem na tak:
message_begin(MSG_BROADCAST, SVC_TEMPENTITY); write_byte(TE_SPRITE) write_coord(iOrigin[0]); write_coord(iOrigin[1]); write_coord(iOrigin[2]); write_short(sprite_he_explode); write_byte(90); // scale write_byte(200); // alpha message_end();
Co do zadawania obrażeń to działa tylko że pokazuje ze zostało się zabity bronią którą trzymamy po rzuceniu granata. Zmieniłem te damagebits na HE(dorobiłem define) ale bezskutecznie.
Ale ważne ze działa.
Dziękuje za pomoc
zasepa
21.06.2016
Hmm dopiero teraz zauważyłem ale ten efekt wybuchu jest płaski. chodzi oto że wygląda jak ściana i obraca się według mnie.
Gdy użyłem pliku "sprites/eexplo.spr" który domyślnie znajduje się w folderze z gra.
Da się jakoś to naprawić aby ten efekt był 3d?
Pozdrawiam