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

Optymalizacja kodu z prethinka - da się lepiej?


Najlepsza odpowiedź GwynBleidD, 14.07.2015 09:34

Ten kod będzie przy każdym thinku aktualizował rendering gracza, jeśli ten kuca, a wystarczy zaktualizować gdy zaczyna kucać i gdy przestaje kucać. Sprawdzaj oldbutton i reaguj tylko wtedy, gdy nastąpiła zmiana. Wystarczy dodać na początku thinka (po sprawdzeniu czy gracz ma dany perk) to:

if(!((get_user_oldbutton(id) ^ get_user_button(id)) & IN_DUCK))
    return;

Jak to działa? operator ^ to operator XOR, zwróci on jedynkę na danym bicie tylko wtedy, gdy bit w obu porównywanych wartościach jest różny, czyli:

0b00010100
0b00010010
XOR =
0b00000110

W ten sposób zaświecają nam się bity klawiszy, które zostały w danym thinku zmienione. Nas interesuje tylko duck, więc dodatkowo przepuszczamy to przez & i viola ;)

 

Oczywiście przerzuć kod do cmd start, jak sugerują inni.

Przejdź do postu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
9 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 13.07.2015 19:17

Witam, da się jakoś przyspieszyć ten kod? Jakoś logiczne rozkminy mi nie idą ostatnio, a może po prostu się nie da?

new bool:b[33]

public fwPreThink(id)
{
	if(!ma_perk[id])
		return;

	if(get_user_button(id) & IN_DUCK)
	{
		if(!b[id])
		{
			cod_set_user_rendering(id, 50)
			b[id] = true
		}
	}
	else
	{
		if(b[id])
		{
			cod_remove_user_rendering(id)
			b[id] = false
		}
	}
}

  • +
  • -
  • 0

#2 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 13.07.2015 21:34

cmdstart podobno wywołuje się troszeczkę rzadziej niż prethink.


  • +
  • -
  • 0

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#3 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 13.07.2015 23:07

Czym właściwie jest CmdStart?
  • +
  • -
  • 0

#4 tytusek

    Czempion

  • Power User

Reputacja: 229
Wszechwidzący

  • Postów:822
Offline

Napisano 13.07.2015 23:26

http://amxx.pl/topic...k-nie-prethink/tutaj troszkę jest poruszony temat między cmdstart a prethink 


  • +
  • -
  • 0

#5 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 14.07.2015 09:34   Najlepsza odpowiedź

Ten kod będzie przy każdym thinku aktualizował rendering gracza, jeśli ten kuca, a wystarczy zaktualizować gdy zaczyna kucać i gdy przestaje kucać. Sprawdzaj oldbutton i reaguj tylko wtedy, gdy nastąpiła zmiana. Wystarczy dodać na początku thinka (po sprawdzeniu czy gracz ma dany perk) to:

if(!((get_user_oldbutton(id) ^ get_user_button(id)) & IN_DUCK))
    return;

Jak to działa? operator ^ to operator XOR, zwróci on jedynkę na danym bicie tylko wtedy, gdy bit w obu porównywanych wartościach jest różny, czyli:

0b00010100
0b00010010
XOR =
0b00000110

W ten sposób zaświecają nam się bity klawiszy, które zostały w danym thinku zmienione. Nas interesuje tylko duck, więc dodatkowo przepuszczamy to przez & i viola ;)

 

Oczywiście przerzuć kod do cmd start, jak sugerują inni.


  • +
  • -
  • 2

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#6 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 14.07.2015 11:17

Dlaczego mam przerzucić do CmdStart?
I czy jak przerzuce to klawisze mam pobierać przez get_uc()?
  • +
  • -
  • 0

#7 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 14.07.2015 12:17

W moim starym codzie buttony pobierałem tak:

 

new button = get_uc(uc_handle, UC_Buttons);
new oldbutton = get_user_oldbutton(id);

A różnica przy prethinku i cmdstart jest taka, że cmdstart nie wywołuje się co każdą klatkę serwera jak prethink, a dokłądnie ile razy to nie wiem :)


  • +
  • -
  • 0

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#8 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 15.07.2015 09:14

Zmiana też następuje, gdy jesteśmy na kucaka i puszczamy IN_DUCK, wtedy muszę usunąć niewidzialność.

Coś mi nie wychodzi :krecka_dostal: :

public CmdStart(id, uc)
{
    if(!ma_perk[id]) return;

    if((entity_get_int(id, EV_INT_oldbuttons) ^ get_uc(uc, UC_Buttons)) & IN_DUCK)
    {
        cod_set_user_rendering(id, 50)
        return;
    }
    
    cod_remove_user_rendering(id)
}

  • +
  • -
  • 0

#9 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 15.07.2015 12:36

Czytałeś mój post z uwagą, czy przeleciałeś po łebkach? Warunek który Ci podałem sprawdza tylko, czy nastąpiła ZMIANA stanu klawisza. Jeśli taka nastąpiła, powinieneś sprawdzić czy został wciśnięty, czy puszczony tak, jak to robiłeś wcześniej i na podstawie tego podjąć decyzję jak zmieniasz rendering gracza.

 


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#10 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 15.07.2015 13:31

public CmdStart(id, uc)
{
    new button = get_uc(uc_handle, UC_Buttons);
    new oldbutton = get_user_oldbutton(id);
    if(!((oldbutton ^ button(id)) & IN_DUCK))
        return FMRES_IGNORED;

    if(button & IN_DUCK) cod_set_user_rendering(id, 50)
    else cod_remove_user_rendering(id)

    return FMRES_IGNORED;
}

 

Sprawdź :)


GwynBleidD (15.07.2015 17:36):
Power user, a kodu nie umie wstawić...


Jak nie chcesz warna to popraw!

  • +
  • -
  • -1

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.





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

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