←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

hook +use

  • +
  • -
grankee's Photo grankee 23.11.2015

No więc czy da się zhookować naciśnięcie +use nie sprawdzając tego w każdej game frame?

Quote

  • +
  • -
plx211's Photo plx211 23.11.2015

Przypadkiem przypomniało mi się to:
https://wiki.alliedm...d_.2Battack.3FF

Jutro wrzucę jeszcze inne sposoby ;)
Quote

  • +
  • -
Linux''s Photo Linux' 24.11.2015

Jeszcze mozna sprobowac wykryc uzycie za pomoca dzwieku.
Quote

  • +
  • -
plx211's Photo plx211 24.11.2015

Pierwsze testowane, reszta nie :)

Wszystkie dadzą wynik:

start +use
+use
+use
+use
+use
+use
stop +use

Różnią się prawdopodobnie częstotliwością.

 

1) OnPlayerRunCmd

#include <sourcemod>

bool useState[MAXPLAYERS+1] = {false, ...};

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float[3] vel, float[3] angles, int &weapon) {
  if (buttons & IN_USE) {
    if (!useState[client]) {
        useState[client] = true;
        PrintToChat(client, "start +use");
    }
  } else {
    if (useState[client]) {
      useState[client] = false;
      PrintToChat(client, "stop +use");
    }
  }
  
  
  if (buttons & IN_USE) {
    PrintToChat(client, "+use");
  }
  
  return Plugin_Continue;
}

2) OnGameFrame

#include <sourcemod>

bool useState[MAXPLAYERS+1] = {false, ...};

public void OnGameFrame() {
  for (int client = 1; client <= MaxClients; client++) {
    if (isValidClient(client)) {
      if (GetClientButtons(client) & IN_USE) {
        if (!useState[client]) {
          useState[client] = true;
          PrintToChat(client, "start +use");
        }
      } else {
        if (useState[client]) {
          useState[client] = false;
          PrintToChat(client, "stop +use");
        }
      }

      if (GetClientButtons(client) & IN_USE) {
        PrintToChat(client, "+use");
      }
    }
  }
}

stock bool isValidClient(int client) {
    if (!( 1 <= client <= MaxClients ) || !IsClientInGame(client)) 
        return false; 
    return true; 
}

3) PreThink

#include <sourcemod>

bool useState[MAXPLAYERS+1] = {false, ...};

public void OnClientPutInServer(int client) {
  SDKHook(client, SDKHook_PreThink, preThink);
}

public void OnClientDisconnect(int client) {
  SDKUnhook(client, SDKHook_PreThink, preThink);
}

public void preThink(int client) {
  if (GetClientButtons(client) & IN_USE) {
    if (!useState[client]) {
      useState[client] = true;
      PrintToChat(client, "start +use");
    }
  } else {
    if (useState[client]) {
      useState[client] = false;
      PrintToChat(client, "stop +use");
    }
  }

  if (GetClientButtons(client) & IN_USE) {
    PrintToChat(client, "+use");
  }  
}

stock bool isValidClient(int client) {
    if (!( 1 <= client <= MaxClients ) || !IsClientInGame(client)) 
        return false; 
    return true; 
}

Edited by plx211, 24.11.2015 14:44.
Quote

  • +
  • -
grankee's Photo grankee 24.11.2015

moznaby zrobic z tego stocka z callfuncem :)

 

anyway chodzilo mi o wykrycie +use bez potrzeby sprawdzania jego nacisniecia co ramke :)

Quote

  • +
  • -
mastah7991's Photo mastah7991 24.11.2015

AddCommandListener(hook, "+use"); 

public Action:hook(client, const String:command[], argc)
{
}

jak ktoś może niech sprawdzi i da info 

 
Quote

  • +
  • -
plx211's Photo plx211 24.11.2015

+use (i innetypu +attack2) sa kompresowane do 1 zmiennej 4bajtowej (32 klawisze mozna tak w malej paczce). Dlatego @mastash to nie zadziała.

Wracajać do "callback'a" mogli byśmy stworzyć /biblioteke oparty na methodmap umilajacy pisanie skryptow ;)
Quote

  • +
  • -
grankee's Photo grankee 24.11.2015

niby tak, ale hookowanie kilkudziesieciu faktów sprawdzajac co ramke nie bedzie optymalne do uzycia jesli ktos wykorzysta moze 25% z nich

Quote

  • +
  • -
Linux''s Photo Linux' 24.11.2015

To tak jak mowie, tylko emitsound. Optymalniejszej opcji nie ma, poniewaz nie ma zamiennika cmdstart :(

Quote

  • +
  • -
plx211's Photo plx211 24.11.2015

@linux zobacz na ten 1 kod co dałem :)
Quote

  • +
  • -
grankee's Photo grankee 24.11.2015

Ja tam nie słyszę dźwięku kiedy wdusze klawisz, tzn nie z gry, a jedynie z klawiatury bo rozklekotana. Trzebaby zhookowac jakos emit sound. W amxx pamietam to dzialalo.

 

 

plx wiem ze to tylko przyklad i dyskusja o czyms innym, ale martwi mnie wszechobecny nawyk nadupcania zmiennych globalnych, w 70% przypadkow sa one niepotrzebne.

Czemu ludzie nie korzystają z dobrodziejstwa zmiennej statycznej? :(


Edited by grankee, 24.11.2015 19:49.
Quote

  • +
  • -
plx211's Photo plx211 24.11.2015

Poniewaz nie każdy dzieli kod na pliki :)

Ja używam static gdy tylko robię to co wyżej napisałem.

Zbaczamy z tematu, nie da sie wychwycic use z dzwieku (chyba) w sm
Quote

  • +
  • -
grankee's Photo grankee 25.11.2015


Poniewaz nie każdy dzieli kod na pliki

Ja używam static gdy tylko robię to co wyżej napisałem.

 

Złe podejście. Używasz zmiennej statycznej jak musisz, a jak nie to globalnej.

Powinno być odwrotnie :)

Quote