←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Usunięcie dźwięku z granata HE

  • +
  • -
zasepa - zdjęcie 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

Odpowiedz

  • +
  • -
Linux' - zdjęcie 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.

Odpowiedz

  • +
  • -
zasepa - zdjęcie 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

Odpowiedz

  • +
  • -
Linux' - zdjęcie 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);
Odpowiedz

  • +
  • -
Asiap - zdjęcie 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;
} 
Odpowiedz

  • +
  • -
zasepa - zdjęcie 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

Odpowiedz

  • +
  • -
Linux' - zdjęcie 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.

Odpowiedz

  • +
  • -
zasepa - zdjęcie 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?

 

 

Odpowiedz

  • +
  • -
Master Yoga - zdjęcie Master Yoga 19.06.2016

Spoiler

 

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/).

 

 

Odpowiedz

  • +
  • -
zasepa - zdjęcie 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? 

Odpowiedz

  • +
  • -
Linux' - zdjęcie 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();
Odpowiedz

  • +
  • -
zasepa - zdjęcie 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

 

 

 

Odpowiedz

  • +
  • -
zasepa - zdjęcie 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

Odpowiedz