Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] vexd_pfntouch - za dużo razy się wykonuje


Najlepsza odpowiedź BlackPerfum, 30.06.2014 19:33

Niestety, czas jest źle zrobiony. Powinno być:
 
new times
global_get(glb_time, times)
 
jeżeli już, w innym przypadku wyrzuca błąd [FAKEMETA] Invalid return type.
Ale to najmniejszy problem. Gdy wyrzucę czas, wszystko działa sprawnie, aczkolwiek znowu jest spam 15-25 wiadomości na czacie.

Nie tak:
new times
global_get(glb_time, times)
Tylko tak:
new Float:times
global_get(glb_time, times)
Nigdy w global_get nie sprawdzałem czy czas pobierze bez argumentów (bo tak się dzieje przy pev a global_get jest tak samo opisane jak pev) :D
W założeniu fakmety jest tak:
• 0 arg == int
• 1 arg == float
• 2 arg == string
To dlaczego zrobili inaczej w global_get??
Niestety się przeliczyłem :( Czas jest właśnie po to by nie spamowało xD

Mam nadzieje że tu jest wszystko okey ;D
Spoiler
Przejdź do postu


  • Zamknięty Temat jest zamknięty
6 odpowiedzi w tym temacie

#1 Empiryczny

    Życzliwy

  • Zbanowany

Reputacja: -5
Nowy

  • Postów:30
  • Lokalizacja:Rybnik
Offline

Napisano 30.06.2014 14:16

Witam,

 

Mam taką funkcję:

public vexd_pfntouch(pToucher, pTouched) {
	if ( !get_pcvar_num(cvar_awp_on) )
		return PLUGIN_CONTINUE;
	
	new iTouchId   = pToucher;
	new iPlayerId  = pTouched;
	
	if ( iPlayerId < 0 || iPlayerId > 32 || !is_user_alive( iPlayerId ) )
		return PLUGIN_CONTINUE;
	
	new szClassName[32];
	entity_get_string( iTouchId, EV_SZ_classname, szClassName, 31 );
	
	if ( equal( szClassName, "weaponbox" ) )        // a dropped or already 'fired' weapon
	{
		new szGunModel[32];
		entity_get_string( iTouchId, EV_SZ_model, szGunModel, 31 );
		
		new bool:bHasPrimaryWeapon = check_primary( iPlayerId );
		
		if ( get_entity_flags( iTouchId ) & FL_ONGROUND && !bHasPrimaryWeapon && equal( szGunModel, model_awp ) )
		{
			set_entity_flags( iTouchId, FL_ONGROUND, 0 );
			
			new iTeam = get_user_team( iPlayerId );
			
			if ( iTeam == 1 )   // TERRORIST
			{
				if ( g_iSniperNum[iTeam] < get_pcvar_num(cvar_max_awptt) )
				{
					set_entity_flags( iTouchId, FL_ONGROUND, 1 );
				}
				else
				{
					client_print( iPlayerId, print_chat , "TEST" );
				}
			}
			else
				if ( iTeam == 2 )   // COUNTER-TERRORIST
			{
				if ( g_iSniperNum[iTeam] < get_pcvar_num(cvar_max_awpct) )
				{
					set_entity_flags( iTouchId, FL_ONGROUND, 1 );
				}
				else
				{
					client_print( iPlayerId, print_chat, "TEST" );
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}

polega ona na tym, że jeżeli wejdziemy w, np. AWP (a jest ono ograniczone cvarem na team), to wiadomość "TEST" pojawia się 15 razy na czacie. Czy da się jakoś naprawić, aby funkcja vexd_pfntouch nie wykonywała się tyle razy? A może użyć register_touch? 


Użytkownik Luverde edytował ten post 30.06.2014 14:16


#2 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 30.06.2014 15:51

Polecam hamsanwicha/fakemeta. Kod mozna skrócić. Chyba o to ci chodziło:

//W plugin_init

	RegisterHam(Ham_Touch,"weaponbox","TouchWeaponbox",0)
//

const m_iId = 43

public TouchWeaponbox(WeaponBox,id)
{
	if(pev_valid(WeaponBox) != 2 || pev_valid(id) != 2 || !get_pcvar_num(cvar_awp_on)
	|| pev_valid((WeaponBox = get_pdata_cbase(WeaponBox,35,4))) != 2
	|| get_pdata_int(WeaponBox,m_iId,4) != CSW_AWP)	return HAM_IGNORED
	if(pev(WeaponBox,pev_iuser4) == id)	return HAM_SUPERCEDE
	
	set_pev(WeaponBox,pev_iuser4,id)
	if(!is_user_alive(id) || pev(id,pev_weapons) & 1<<CSW_AWP)	return HAM_IGNORED
	
	new team = get_user_team(id)
	if(g_iSniperNum[iTeam] >= (team == 2 ? get_pcvar_num(cvar_max_awpct):get_pcvar_num(cvar_max_awptt)))
	{
		client_print( id, print_chat , "TEST" );
		return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#3 Empiryczny

    Życzliwy

  • Autor tematu
  • Zbanowany

Reputacja: -5
Nowy

  • Postów:30
  • Lokalizacja:Rybnik
Offline

Napisano 30.06.2014 17:57

Nie działa to kompletnie. Jak nikt nie ma w teamie AWP, to nie można podnosić. A efekt miał być odwrotny. Tak samo, jeżeli ktoś w teamie posiada już AWP, a ktoś inny chce podnieść, to nie wyświetla ma się komunikat o ograniczeniu. Więc coś musi być popiętrolone we wcześniejszych warunkach.

 

W dodatku komunikat się wyświetla, gdy wyrzucimy broń. Dla mnie to za dużo jest tutaj zagmatwane - dobrze byłoby, abyś to opisał, bo masz do tego zdolności i to niezłe jak widziałem :) Może łatwiej byłoby mi tutaj pewne rzeczy zrozumieć, bo przyznam, że z pdatą nie zapoznałem się dobrze.

 

W dodatku jest błąd, bo nie może być g _iSniperNum[iTeam] tylko g_iSniperNum[team]


Użytkownik Luverde edytował ten post 30.06.2014 18:00


#4 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 30.06.2014 18:38

Błęda popełniłem haha.gif I to takiego że... 
//Uchwyt zarejestrowanego eventu
public TouchWeaponbox(WeaponBox  /*id bytu dotykanego*/,id /*id bytu dotykającego*/)
{
	//Rozdzieliłem warunek żeby był bardziej czytelny xD
	if(pev_valid(WeaponBox) != 2)	return HAM_IGNORED
	// Sprawdzam czy byt o id == WeaponBox posiada dane pdata + czy jest poprawny
	
	if(pev_valid(id) != 2)	return HAM_IGNORED
	// Sprawdzam czy byt o id == id posiada dane pdata + czy jest poprawny

	if(~pev(WEaponBox,pev_flags) & FL_ONGROUND)	return HAM_IGNORED
	// Przydało by się sprawdzić czy WeaponBox jest na ziemi aby
	// Gracz który go wyrzuca nie widział komunikatu 
	
	if(pev(id,pev_weapons) & 1<<CSW_AWP)	return HAM_IGNORED
	// Sprawdzam czy id ma awp
	
	if(!get_pcvar_num(cvar_awp_on))	return HAM_IGNORED
	// Sprawdzam twojego cvara
	
	new weapon = get_pdata_cbase(WeaponBox,35,4)
	//Pobieram pierwszy byt zawarty w WeaponBox'ie (na 1 slocie tzn. pobieram id broni w weaponboxie (nie to CSW_ a byta))
	
	
	if(pev_valid(weapon) != 2)	return HAM_IGNORED
	// Sprawdzam czy awp jest poprawne + czy przechowuje dane pdata
	
	if(get_pdata_int(weapon,m_iId,4) != CSW_AWP)	return HAM_IGNORED
	// Sprawdzam czy broń w weaponboxie to awp
	
	//Zapisuje sobie aktualny czas 
	new time = global_get(glb_time)
	
	if(pev(WeaponBox,pev_iuser3) == id && pev(WeaponBox,pev_iuser4)+5 < time)	return HAM_SUPERCEDE
	// Sprawdzam czy ostatni byt który dotnął weaponbox'a to id
	// Oraz czy ostatni czas dotnięcia był poniżej 5 sek temu
	// Jeśli tak to blokuje podniesienie
	// Robie to po to aby gracz który np. wszedł w weapon boxa ale nie mógł go podnieść bo było za dużo awp
	// Za jakiś czas znów mógł w niego wejść np. kiedy ludzie z awp zginą buhahahaha xD
	
	set_pev(WeaponBox,pev_iuser3,id)
	set_pev(WeaponBox,pev_iuser4,time)
	// Zapisuje do wolnego miejsca id bytu dotykającego
	// oraz czas kiedy dotnął
	// Bo pev_iuser1~4 są nie używanymi zmiennymi xD
	// Dlatego warto z nich skożystać w takim wypadku gdyż weaponbox'ów może być i 1970
	// a takich wielkich zmiennych nie chcemy
	
	// Zmieniłem pozycję sprawdzania czy gracz ma awp dlatego nie potrzebuję teraz sprawdzania czy jest żywy
	
	new team = get_user_team(id)
	// Pobieram team gracza
	
	if(g_iSniperNum[team] >= (team == 2 ? get_pcvar_num(cvar_max_awpct):get_pcvar_num(cvar_max_awptt)))
	{
		//Sprawdzam czy jest za dużo awp na dany team
		//Jeśli tak to blokuje podniesienie i pokazuje wiadomość
		
		client_print( id, print_chat , "TEST" );
		return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}
Jeśli chodzi o:

Jak nikt nie ma w teamie AWP, to nie można podnosić. A efekt miał być odwrotny.

Musisz pokazać więcej kodu... Albo sprecyzować wszystkie możliwe wartości które tu nie są pokazane haha.gif
 

Więc coś musi być popientrolone we wcześniejszych warunkach.

Akurat tam są same podstawowe rzeczy
 

W dodatku komunikat się wyświetla, gdy wyrzucimy broń.

Bo przez 1/8921317283217 sekundy dotykamy weaponbox'a haha.gif Poprawione
 
 
Wtf ? Post się 2x wysłał xD

Użytkownik BlackPerfum edytował ten post 30.06.2014 18:46

  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#5 Empiryczny

    Życzliwy

  • Autor tematu
  • Zbanowany

Reputacja: -5
Nowy

  • Postów:30
  • Lokalizacja:Rybnik
Offline

Napisano 30.06.2014 19:22

Niestety, czas jest źle zrobiony. Powinno być:

 

new times
global_get(glb_time, times)
 
jeżeli już, w innym przypadku wyrzuca błąd [FAKEMETA] Invalid return type.
Ale to najmniejszy problem. Gdy wyrzucę czas, wszystko działa sprawnie, aczkolwiek znowu jest spam 15-25 wiadomości na czacie. 

Użytkownik Luverde edytował ten post 30.06.2014 19:23


#6 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 30.06.2014 19:33   Najlepsza odpowiedź

Niestety, czas jest źle zrobiony. Powinno być:
 
new times
global_get(glb_time, times)
 
jeżeli już, w innym przypadku wyrzuca błąd [FAKEMETA] Invalid return type.
Ale to najmniejszy problem. Gdy wyrzucę czas, wszystko działa sprawnie, aczkolwiek znowu jest spam 15-25 wiadomości na czacie.

Nie tak:
new times
global_get(glb_time, times)
Tylko tak:
new Float:times
global_get(glb_time, times)
Nigdy w global_get nie sprawdzałem czy czas pobierze bez argumentów (bo tak się dzieje przy pev a global_get jest tak samo opisane jak pev) :D
W założeniu fakmety jest tak:
• 0 arg == int
• 1 arg == float
• 2 arg == string
To dlaczego zrobili inaczej w global_get??
Niestety się przeliczyłem :( Czas jest właśnie po to by nie spamowało xD

Mam nadzieje że tu jest wszystko okey ;D
Spoiler

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#7 Empiryczny

    Życzliwy

  • Autor tematu
  • Zbanowany

Reputacja: -5
Nowy

  • Postów:30
  • Lokalizacja:Rybnik
Offline

Napisano 30.06.2014 19:50

Jest poważny błąd. Nie pev(WeaponBox,pev_fuser3)+1.0 < times) tylko pev(WeaponBox,pev_fuser3)+1.0 > times)

 

Tak czy siak, problem rozwiązany. Dzięki za pomoc.






Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych