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

Wywoływanie komend na bocie


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

#1 csMaster

    Wszechwiedzący

  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 13:32

Czy da się wywołać komendę amx_ban na bocie ?

client_cmd i console_cmd nie działają. engclient_cmd też raczej nie zadziała jeśli wpiszę całą komendę w drugim parametrze funkcji. amx_ban ma 3 argumenty a engclient_cmd może dołączyć do komendy tylko dwa.


  • +
  • -
  • 0

#2 Robiin

    Godlike

  • Support Team

Reputacja: 1 121
Super Hero

  • Postów:2 073
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 26.01.2019 14:22

Z tego co widzę, komenda amx_ban nie ma sprawdzania, czy gracz jest HLTV, botem etc. więc powinna działać na boty.


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#3 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 16:20

Może mnie nie zrozumiałeś, chodzi mi o to żeby bot stworzony przez EngFunc_CreateFakePlayer z uprawnieniami do banowania wpisał w konsole amx_ban z wszystkimi argumentami.


  • +
  • -
  • 0

#4 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 26.01.2019 17:16

Może to głupie, ale dlaczego nie użyć server_cmd?

 

Jest jakis konkretny powod dlaczego chcesz zeby konkretny fake player to wykonal?


  • +
  • -
  • 0

#5 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 17:42

Tak, bo inne pluginy też używają server_cmd i nie wiedziałbym czy to wykonał bot, jakiś inny plugin czy jakiś właściciel lub opiekun przez konsole serwera.


  • +
  • -
  • 0

#6 Robiin

    Godlike

  • Support Team

Reputacja: 1 121
Super Hero

  • Postów:2 073
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 26.01.2019 17:55

Client_cmd przyjmuje jako argument tablicę, więc zwyczajnie ją sformatuj przed jej użyciem?

new command[64];

formatex(command, charsmax(command), "amx_ban ^"%i^" ^"%s^"", 0, "powod bana");

client_cmd(entity, command);

Jeśli nie o to Ci chodzi, to chyba nie rozumiem o co.


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#7 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 17:59

Zrobiłem to w ten sposób:

client_cmd(bot, "amx_ban #%i %i ^"%s^"", get_user_userid(id), czas, powod);

bot - identyfikator bota

Ale bot będąc na serwerze nie robił kompletnie nic, tylko wrzucał informacje na say że kogoś banuje ale nic na chat'cie ani na hud od amxbans  nie było i też nikt nie dostawał bana.


  • +
  • -
  • 0

#8 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 26.01.2019 18:19

Zawsze możesz do server_cmd dodać token jakiś po którym rozpoznasz to.

 

 

Patrzyłeś na amxclient_cmd?

/**
 * Execute a command from the client without actually sending it to the client's
 * DLL. This triggers plugin command hooks.
 *
 * @note This emulates a client command on the server side, and is an excellent
 *       tool to force a client to do certain actions related to the game.
 * @note The command has to stand alone in the command parameter, only add
 *       arguments using the designated parameters.
 * @note Commands emulated using this function will trigger other plugin's
 *       command hooks. For an alternative that doesn't, see engclient_cmd()
 *
 * @param index         Client index, use 0 to execute from all clients
 * @param command       Client command to execute on
 * @param arg1          Optional command arguments
 * @param arg2          Optional command arguments
 *
 * @noreturn
 * @error           If a single client is specified and the index is not within
 *                  the range of 1 to MaxClients, an error will be thrown.
 */
native amxclient_cmd(index, const command[], const arg1[] = "", const arg2[] = "");

Spróbuj jeszcze ten engclient_cmd (sformatuj tablice tak jak asior mówił), bo korzysta  z tego samego mechanizmu co amxclient_cmd, tyle że nie powiadamia innych pluginów (tu moze byc problem)

 

Ostatecznie amx_ban jako natyw z parametrem mówiącym czy to bot czy nie

 


  • +
  • -
  • 0

#9 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 18:34

Próbowałem z engclient_cmd jako drugi parametr wstawić sformatowaną wcześniej tablicę z komendą ale nic to nie dało.

Nie chce dodawać jakiejś notki że użył tego bot. Wtedy mógłbym użyć log_amx lub log_to_file i bym was tu nie męczył. Ale w amxbans dalej będzie że serwer kogoś zbanował a jeśli ktoś nie będzie miał dostępu do serwera to będzie musiał mnie pytać czy to ja kogoś zbanowałem lub wyrzuciłem z serwera czy to zrobił bot.


Użytkownik csMaster edytował ten post 26.01.2019 18:39

  • +
  • -
  • 0

#10 Robiin

    Godlike

  • Support Team

Reputacja: 1 121
Super Hero

  • Postów:2 073
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 26.01.2019 18:46


static cell AMX_NATIVE_CALL client_cmd(AMX *amx, cell *params) /* 2 param */
{
	int len;
	char* cmd = format_amxstring(amx, params, 2, len);
	cmd[len++] = '\n';
	cmd[len] = 0;

	if (params[1] == 0)
	{
		for (int i = 1; i <= gpGlobals->maxClients; ++i)
		{
			CPlayer* pPlayer = GET_PLAYER_POINTER_I(i);
			if (!pPlayer->IsBot() && pPlayer->initialized /*&& pPlayer->ingame*/)
				CLIENT_COMMAND(pPlayer->pEdict, "%s", cmd);
		}
	} else {
		int index = params[1];
		
		if (index < 1 || index > gpGlobals->maxClients)
		{
			LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d", index);
			return 0;
		}
		
		CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
		
		if (!pPlayer->IsBot() && pPlayer->initialized /*&& pPlayer->ingame*/)
			CLIENT_COMMAND(pPlayer->pEdict, "%s", cmd);
	}
	
	return len;
}

:)

 

Jak na moje najlepiej będzie dorobić sobie natyw do bansa i tam operować dalej na danych w nim zawartych. Pozbywasz się problemu z wykonaniem komendy, a efekt jest taki sam (jeśli dobrze wykonasz handler natywu, rzecz jasna).


Użytkownik aSiorr edytował ten post 26.01.2019 18:48

  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#11 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 26.01.2019 18:49

Ciężko mi powiedzieć, bo nigdy się nie bawiłem takimi rzeczami.

 

Coś znalazłem na alliedach, może trzeba coś jeszcze ustawić temu clientowi, żeby jakoś był widziany przez komende?

 

 

Spoiler

 

 

Może coś w funkcji banującej filtruje i bot nie spełnia warunku? zobacz cmdBan w amxbansie

O fladze nie mówie, bo pewnie przydzieliłeś mu.

 

Sprawdź ten amxclient_cmd


Rivit (26.01.2019 18:51):
Pan wyżej mnie ubiegł. My bad nie sprawdziłem źródła, a zawsze to robie

Użytkownik TibacK edytował ten post 26.01.2019 18:51

  • +
  • -
  • 0

#12 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 18:54

amx_ban raczej nie jest problemem.

client_cmd i console_cmd nie działają jeśli chce je wpisać bot, tak samo będzie z każdą komendą którą w ten sposób każe mu wykonać.

 

@DarkGL nie bardzo rozumiem jak można by dorobić funkcje banującą żeby adminem banującym był bot (który może mieć różny nick) i żeby nie niszczyć struktury komendy amx_ban.

Musiałbym cały czas w parametrze wpisywać nick tego bota.


Użytkownik csMaster edytował ten post 26.01.2019 19:01

  • +
  • -
  • 0

#13 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 26.01.2019 19:06

Generalnie to sie sprowadza do dorobienia natywu w amxbansie.

Robisz natyw, do funkcji cmdBan, który jest jakby wrapperem na funkcję cmdBan z amxbansa

Spoiler

 

 

Tylko zamiast używac read_args() + parse() to pobierasz sobie te wartości z parametrów w natywie.

Innymi słowy - to co w komendzie podajesz jako argumenty, bedzie kolejnymi parametrami w wywołaniu natywu np.

special_amx_ban(bot, get_user_userid(id), czas, powod);

Rivit (26.01.2019 19:07):
Anyway, sprawdź ten amxclient_cmd, bo on używa innej metody niż client_cmd. Nie wiem czy jest w wersji 1.8.3 czy 1.9 :/

Użytkownik TibacK edytował ten post 26.01.2019 19:08

  • +
  • -
  • 0

#14 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 19:15

Fajnie, będę przez kolejne pół godziny tłumaczył botowi że teraz ma używać amxclient_cmd zamiast engclient_cmd i zmieniał wszystko w bazie danych a mimo to najprawdapodobniej nic to nie da, bo natyw weźmie wszystko za jeden argument.

Zresztą nawet nie mam include w którym byłby ten amx_clientcmd.


Użytkownik csMaster edytował ten post 26.01.2019 19:16

  • +
  • -
  • 0

#15 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 26.01.2019 19:23

To zostaw sobie engclient_cmd które nie działa i najlepiej nic nie rób...

 

Dałem notke odnośnie 1.8.3 i 1.9. Sprawdziłem teraz - jest w 1.8.3 już

 

Natyw to najprostsze rozwiązanie (chyba, że amxclient_cmd będzie działać), ale skoro nie chcesz zaakceptować podanych rozwiązań i masz jakieś nieuargumentowane problemy z tym, że ktoś Ci mówi co i jak


Użytkownik TibacK edytował ten post 26.01.2019 19:35

  • +
  • -
  • 0

#16 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 19:28

Ale to nie ma prawa zadziałać... engclient_cmd działa na botach ale może mieć maksymalnie 2 argumenty (czyli parametry 3 i 4). Jeśli podałem całą komendę w 2 parametrze to nie działała, tak samo będzie z amxclient_cmd. amx_kick już z engclient_cmd działa bo ma tylko 2 parametry i się mieszczą. Zresztą na serwerze pisze że ta funkcja nie istnieje a aktualizacja amxmodx groziłaby mi utratą graczy, a już dość dużo straciliśmy po ostatnim włamaniu.


  • +
  • -
  • 0

#17 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 26.01.2019 19:34

Widzę, oni zrobili tam tylko 2 parametry :o Sam nie wiem czemu nawet.

 

Zostaje natyw


  • +
  • -
  • 0

#18 Robiin

    Godlike

  • Support Team

Reputacja: 1 121
Super Hero

  • Postów:2 073
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 26.01.2019 19:49

engclient_cmd działa tak:

 

Spoiler

 

 

Więc jeśli indeks bota < 1 albo indeks bota > 32 to nie przejdzie on tego warunku:


		if (index < 1 || index > gpGlobals->maxClients)
		{
			LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d", index);
			return 0;
		}

Tym samym najlepszym rozwiązaniem będzie zrobienie natywu. Możesz poprowadzić prosty natyw do osobnego forwardu, a w nim dopiero przygotować sobie dane i wywołać manualnie cmdBan, albo napisać funkcję banowania inaczej - tak jak Ci będzie odpowiadać.


Użytkownik aSiorr edytował ten post 26.01.2019 19:51

  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#19 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 19:54

Yyy... byłby ktoś taki miły i mi ją napisał ? Już sam nie wiem jak to zrobić, a nie chcę żeby cały amxbans przestał działać :/

@DarkGL bot zajmuje slot i ma index 1-32, jak testowałem to na local to miał id 2.


  • +
  • -
  • 0

#20 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 26.01.2019 23:53

Czy tu gdzieś jest błąd ?

Spoiler

 

Zanim dodałem te 2 funkcje wszystko było dobrze, ale teraz jeśli wpiszę amx_slap nick 10 to wyskakuje błąd z clamp ...


  • +
  • -
  • 0




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

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