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

PreThink i wciśnięcie klawisza


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

#1 A może sma?

    Godlike

  • Power User

Reputacja: 546
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 20:19

Siema.
Mam pytanie: chciałem wykryć naciśnięcie IN_ATTACK
Zrobiłem to tak:
public client_PreThink(id)
{
if(!ma_klase[id])
{
return PLUGIN_CONTINUE;
}
if(!is_user_connected(id) || !is_user_alive(id))
{
return PLUGIN_CONTINUE;
}
if(!(get_user_button(id) & IN_ATTACK))
{
return PLUGIN_CONTINUE;
}
switch(tryb[id])
{
case 0:
{
return PLUGIN_CONTINUE;
}
case 1:
{
Funkcja1(id);
}
case 2:
{
Funkcja2(id);
}
}
return PLUGIN_CONTINUE;
}

Problem mam taki: Funkcje wykonują się cały czas, gdy trzymam przycisk ataku. Jak mogę zmienić kod by funkcja była wykonana raz? 1 kliknięcie = 1 wywołanie funkcji
Edit: @Down - działa :] Dziękuje

Użytkownik A może sma? edytował ten post 15.08.2011 20:45

  • +
  • -
  • 0

#2 Goliath

    Godlike

  • Przyjaciel

Reputacja: 1 237
Godlike

  • Postów:2 334
  • GG:
  • Steam:steam
  • Imię:Maciej
  • Lokalizacja:Mońki
Offline

Napisano 15.08.2011 20:37

public client_PreThink(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
{
return PLUGIN_CONTINUE;
}
if(!ma_klase[id])
{
return PLUGIN_CONTINUE;
}
if(!(get_user_button(id) & IN_ATTACK) || get_user_oldbutton(id) & IN_ATTACK)
{
return PLUGIN_CONTINUE;
}
switch(tryb[id])
{
case 0:
{
return PLUGIN_CONTINUE;
}
case 1:
{
Funkcja1(id);
}
case 2:
{
Funkcja2(id);
}
}
return PLUGIN_CONTINUE;
}

  • +
  • -
  • 1

#3 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 843
Czempion

  • Postów:1 485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 15.08.2011 20:40

Powinno byc tak:

public client_PreThink(id)
{
if(!ma_klase[id] || !is_user_alive(id) || !is_user_connected(id))
return PLUGIN_CONTINUE

if((get_user_button(id) & IN_ATTACK) && !(get_user_oldbutton(id) != IN_ATTACK))
{
switch(tryb[id])
{
case 0: {
return PLUGIN_CONTINUE
}
case 1: {
Funkcja1(id)
}
case 2: {
Funkcja2(id)
}
}
}
return PLUGIN_CONTINUE
}

  • +
  • -
  • 1

marwit-0.png


#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 20:46

a najlepiej i poprawnie będzie tak:

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "DarkGL"


public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_forward(FM_CmdStart,"fwd_CmdStart")
}

public fwd_CmdStart(id, uc_handle, seed) {
if(!is_user_alive(id) || !ma_klase[id]){
return FMRES_IGNORED;
}

new buttons = get_uc(uc_handle,UC_Buttons)
new oldbuttons = get_user_oldbutton(id);

if((buttons & IN_ATTACK) && !(oldbuttons & IN_ATTACK))
{
switch(tryb[id])
{
case 0: {
return FMRES_IGNORED;
}
case 1: {
Funkcja1(id)
}
case 2: {
Funkcja2(id)
}
}
}
return FMRES_IGNORED;
}

  • +
  • -
  • 1

#5 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 546
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 20:46

Edit: Ogólnie to sposób Goliatha działa :]

Użytkownik A może sma? edytował ten post 15.08.2011 20:47

  • +
  • -
  • 0

#6 Dwdov

    Profesjonalista

  • Zbanowany

Reputacja: 59
Pomocny

  • Postów:172
  • Imię:Dawid
  • Lokalizacja:Jawor
Offline

Napisano 15.08.2011 20:48

Marwit źle, to są bitsumy nie można tego porównywać przez " != ". Trzeba brać iloczyn ( & ) i wtedy użyć negacji albo na ~IN_ATTACK, albo wziąć to w nawias i dać ! przed nim.

Nie pomagam na PW, tylko na forum.


#7 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 546
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 20:52

A jeszcze takie małe pytanie: czy sposób Darka jest lepszy od sposobu Goliatha?
Tzn. Dark wykorzystał fakemete a Goliath engine... Co jest optymalniejsze?
I można jeszcze zablokować strzał w case 1 i case 2? A w case 0 normalnie strzela?
  • +
  • -
  • 0

#8 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:01

prethink jest wywoływany okolo 100 razy na sekunde cmdstart jest lepszym rozwiązaniem w tym przypadku

Tzn. Dark wykorzystał fakemete a Goliath engine... Co jest optymalniejsze?

tu nie chodzi o wykorzystywany moduł tylko o forwardy których użyliśmy
  • +
  • -
  • 2

#9 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 546
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 21:15

@Dark: Mały błędzik Ci się wkradł: && w linijce:
if((buttons & IN_ATTACK) && !(oldbuttons & IN_ATTACK))
powodowało wywołanie funkcji kilkukrotnie podczas jednego przyciśnięcia
Zmieniłem na || i zadziałało :]
  • +
  • -
  • 0

#10 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:22

jeśli funkcja ma być wywoływana jeden raz podczas wciśnięcia attack to warunek
if((buttons & IN_ATTACK) && !(oldbuttons & IN_ATTACK))
jest poprawny jak dasz tam || funkcja będzie wyoływana przy trzymaniu attack
możesz wtedy napisać po prostu
 if(buttons & IN_ATTACK)

  • +
  • -
  • 1

#11 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:23

kod goliatha mnie zmylił ale patrząc teraz na twój to warunek powinnien być
if(buttons & IN_ATTACK)

  • +
  • -
  • 1

#12 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 546
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 21:31

Yyy... Dark coś namieszałeś w tym warunku :D
if((buttons & IN_ATTACK) || !(oldbuttons & IN_ATTACK)) - to działało (funkcja była wykonywana raz, przy puszczeniu klawisza - trzymałem klawisz 5 sek - po 5 sek była wykonana)
if(buttons & IN_ATTACK) - nie działało w ogóle - po prostu od razu wykonywało funkcję (nawet bez przyciśnięcia...)
  • +
  • -
  • 0

#13 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:38

czyli chcesz wykonac funkcje przy puszczeniu attack tak ?
  • +
  • -
  • 1

#14 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 546
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 21:50

W zasadzie to mi to obojętne czy wykona się funkcja wraz z kliknięciem czy wraz z puszczeniem klawisza.
Chodzi mi o to by funkcja wykonała się tylko jeden raz, nie zależnie od długości trzymania przycisku, ale za każdym razem gdy ktoś kliknie LPM.
Edit: Dobra, już osiągnąłem to co chciałem :] Dziękuję wszystkim za zainteresowanie i pomoc

Użytkownik A może sma? edytował ten post 15.08.2011 22:52

  • +
  • -
  • 0




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

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