No więc czy da się zhookować naciśnięcie +use nie sprawdzając tego w każdej game frame?
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.
|
hook +use
#1
Napisano 23.11.2015 22:53
#2
Napisano 23.11.2015 23:15
https://wiki.alliedm...d_.2Battack.3FF
Jutro wrzucę jeszcze inne sposoby
#4
Napisano 24.11.2015 14:42
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;
}
Użytkownik plx211 edytował ten post 24.11.2015 14:44
#5
Napisano 24.11.2015 17:28
moznaby zrobic z tego stocka z callfuncem ![]()
anyway chodzilo mi o wykrycie +use bez potrzeby sprawdzania jego nacisniecia co ramke ![]()
#6
Napisano 24.11.2015 17:38
AddCommandListener(hook, "+use");
public Action:hook(client, const String:command[], argc)
{
}
jak ktoś może niech sprawdzi i da info
#7
Napisano 24.11.2015 17:53
Wracajać do "callback'a" mogli byśmy stworzyć /biblioteke oparty na methodmap umilajacy pisanie skryptow
#8
Napisano 24.11.2015 18:03
niby tak, ale hookowanie kilkudziesieciu faktów sprawdzajac co ramke nie bedzie optymalne do uzycia jesli ktos wykorzysta moze 25% z nich
#10
Napisano 24.11.2015 18:53
#11
Napisano 24.11.2015 19:47
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? ![]()
Użytkownik grankee edytował ten post 24.11.2015 19:49
#12
Napisano 24.11.2015 21:16
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
#13
Napisano 25.11.2015 23:07
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 ![]()
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych


Dodatki SourceMod














