hook +use
grankee
23.11.2015
No więc czy da się zhookować naciśnięcie +use nie sprawdzając tego w każdej game frame?
plx211
23.11.2015
https://wiki.alliedm...d_.2Battack.3FF
Jutro wrzucę jeszcze inne sposoby
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.
grankee
24.11.2015
moznaby zrobic z tego stocka z callfuncem
anyway chodzilo mi o wykrycie +use bez potrzeby sprawdzania jego nacisniecia co ramke
mastah7991
24.11.2015
AddCommandListener(hook, "+use");
public Action:hook(client, const String:command[], argc) { }
jak ktoś może niech sprawdzi i da info
plx211
24.11.2015
Wracajać do "callback'a" mogli byśmy stworzyć /biblioteke oparty na methodmap umilajacy pisanie skryptow
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
Linux'
24.11.2015
To tak jak mowie, tylko emitsound. Optymalniejszej opcji nie ma, poniewaz nie ma zamiennika cmdstart
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.
plx211
24.11.2015
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
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