Skocz do zawartości
Mr_Auto

Tworzenie prostego bot'a (NPC)

Rekomendowane odpowiedzi

Najpierw potrzebujemy nagrania w formacie .rec, najprostszy sposób to użycie skryptu npc_record komendy:

/rec [*nazwa] - startuje nagrywanie zachowania w pojeździe

/ofrecord [*nazwa] - startuje nagrywanie zachowania na nogach

/stoprec - zatrzymuje/kończy nagrywanie

po zakończeniu nagrywania (/stoprec) w pliku scriptfiles znajdziemy plik nazwa.rec, przenosimy go do folderu npcmodes/recordings

Teraz uruchamiamy program PAWNO, klikamy NEW (ikonka białej karki papieru), kasujemy wszystko by została nam tylko pierwsza linijka oznaczona jako 1.

Na górze dajemy:

#include <a_npc>
jest to includ do stosowania tylko dla bot'ów następnie potrzebujemy standardowej linijki main, można w niej wpisać informacje w print/printf że np. uruchomiono bota, ale można zostawić tak jak jest:
main()return;
Teraz musimy uruchomić nagranie, jeśli to bot który będzie biegać (chodzić) to będziemy używali public OnNPCConnect(myplayerid), czyli tak:
public OnNPCConnect(myplayerid)

{

	StartRecordingPlayback(PLAYER_RECORDING_TYPE_ONFOOT,"nazwa");

}
wystarczy zmienić "nazwa" na nazwę nagrania, możemy też użyć public OnNPCSpawn() , wtedy będzie to bardziej dokładne Uwaga! nazwa nagrania może być inna niż tego pliku który właśnie tworzymy, funkcja StartRecordingPlayback uruchamia odtwarzanie zachowań bota zapisanych w pliku .rec Jeśli nasz bot będzie się poruszać jakimś pojazdem start powinniśmy dać dopiero gdy wejdzie do pojazdu, czyli OnNPCEnterVehicle
public OnNPCEnterVehicle(vehicleid, seatid)

{

	StartRecordingPlayback(PLAYER_RECORDING_TYPE_ONFOOT,"nazwa");

}
tu tak samo jak wyżej, nazwa zmieniamy na nazwę pliku z nagraniem (bez końcówki .rec) Powinniśmy tez ustawić co ma się dziać jeśli bot opuści pojazd (np. przez przypadek teleportowaliśmy naszego bota do nas), czyli public OnNPCExitVehicle
public OnNPCExitVehicle()

{

	StopRecordingPlayback();

}
po taki kodzie jeśli bot opuści pojazd zatrzyma się odtwarzanie nagrania i nie będzie się ruszał Teraz musimy określić co ma się dziać z botem po zakończeniu nagrania/ po wykonaniu swojej pracy, służy do tego public OnRecordingPlaybackEnd, ja dodam by ponownie odtworzył trasę
public OnRecordingPlaybackEnd()

{

	StartRecordingPlayback(PLAYER_RECORDING_TYPE_DRIVER,"nazwa");

}
w miejsce nazwa wpisujemy tak jak wyżej, jest to rozwiązanie dla bota który jeździ pojazdem, jeśli ma to być bot który np. biega to zmieniamy: PLAYER_RECORDING_TYPE_DRIVER na PLAYER_RECORDING_TYPE_ONFOOT teraz zapisujemy i kompilujemy plik w folderze npcmodes Wszystkie funkcje możecie znaleźć w a_npc, wymienię kilka ważniejszych: StartRecordingPlayback - to już powiedziałem, uruchamia nagranie z pliku .rec StopRecordingPlayback - zatrzymuje nagranie (aktualne, nie można odtworzyć 2 nagrań na raz) PauseRecordingPlayback - zatrzymuje (na chwilę, pauzuje) nagranie ResumeRecordingPlayback - wznawia nagranie zatrzymane powyższą funkcją Końcowe objaśnienia co do tego pliku Sam plik bez żadnych public'ków itp. z samym #include <a_npc> i main to już jest bot !! tyle że nie będzie on wykonywał żadnych ruchów (coś jak boty w kasynach czy sklepach), bot nie ma przypisanego pliku .rec dlatego możemy dla jednego bota nagrać kilka akcji i potem odtwarzać, ten plik to tylko konfiguracja zachowania, wszystkie cechy zewnętrzne typu wygląd itp. nadamy mu dopiero w zwykłym skrypcie czy mapie Konfiguracja bota: (ustawienia na serwerze) otóż ludzie myślą że do bota potrzeba specjalnego skryptu... otóż wcale nie, powiem więcej lepiej jest dodać bota w mapce niż osobnym skrypcie bo najprawdopodobniej i tak mapę nieco będziemy musieli przerobić. Dlatego opiszę jak bota dodać do mapy, na początek przechodzimy do public'ka OnGameModeInit lub OnFilterScriptInit, musimy podłączyć naszego bota i nadać mu jakąś nazwę (nick)
ConnectNPC("Nick","nazwa");
w miejsce Nick, wpisujemy jaki ma mieć nick nasz bot, najlepiej wpisać coś prostego, w miejsce nazwa wpisujemy nazwę pliku .amx (nie nagrania !! ) który utworzyliśmy w folderze npcmodes Teraz w public'ku OnPlayerConnect na początku dajemy taki kod:
if(IsPlayerNPC(playerid)) return 1;
nie jest to wymagane jeśli skrypt jest tylko dla bota, dzięki temu np. bot nie zostanie wyrzucony przez system rejestracji itp. polecam dodać taką formułkę do wszystkich skryptów które robią jakieś operacje na graczach Następnie public OnPlayerRequestClass
if(IsPlayerNPC(playerid))

{

	new playername[MAX_PLAYER_NAME];

	GetPlayerName(playerid, playername, sizeof(playername));

	if(!strcmp(playername, "Nick", false))

	{

		SetSpawnInfo(playerid,69,255,1462.0745,2630.8787,10.8203,0.0,0,0,0,0,0,0);

	}

	return 1;

}
po kolei, sprawdzamy czy gracz jest botem (NPC) jeśli tak tworzymy zmienną z tablicą, pobieramy imię gracza/nick i przypisujemy go do tej zmiennej, sprawdzamy (if) czy imię/nick gracza zgadza się z "Nick" (należy podaj dokładnie taką samą nazwę) dałem tu false by sprawdzano także wielkość liter (można zmienić na true, ale polecam zostawić tak jak jest) i używamy funkcji SetSpawnInfo można poczytać na wiki co oznaczają dane argumenty, i return 1; by dalsza cześć kodu była tylko dla zwykłych graczy. Uwaga: SetSpawnInfo ma argumenty X,Y,Z, jeśli bot jest kierowcą to praktycznie są to argumenty mało ważne, ale na wszelki wypadek pozycja powinna być jak najbliższa tej w której zaczęliśmy nagrywać jeżeli mamy już wybrany skin to pozostaje nam kilka rzeczy końcowych, otóż jeśli nasz bot jest kierowcą trzeba mu stworzyć pojazd, nie ma całkowicie znaczenia czy nagrywaliśmy zachowanie bota infernusem czy traktorem, bot i tak będzie jechał z nagraną prędkość itp. (nie jestem pewien ale chyba jeśli nagramy bota np. w samolocie a potem stworzymy pojazd jako samochód to bot będzie latał samochodem :P ) Co do pojazdu to standardowo, na górze mapy
new pojazd;
i w OnGameModeInit lub OnFilterScriptInit
pojazd = AddStaticVehicle(402, 1700.7551, -1953.6531, 14.8756, 200.0, -1, -1);// LS
po wsadzeniu bota do pojazdu będzie nim mógł jeździć tylko i wyłącznie bot, co więcej bot nie może wywalić gracza z pojazdu ani odwrotnie, gracz w pojeździe bota może być tylko pasażerem Ostatnia ważna część kodu to public OnPlayerSpawn (nieobowiązkowe dla botów biegających/chodzących)
if(IsPlayerNPC(playerid))

{

	new playername[MAX_PLAYER_NAME];

	GetPlayerName(playerid, playername, sizeof playername);


	if(!strcmp(playername, "Nick", false))

	{

		PutPlayerInVehicle(playerid, pojazd, 0);

		SetPlayerColor(playerid, 0xFFFFFFFF);

	}

	return 1;

}

początek jest dokładnie taki sam, w miejsce "Nick" wpisujemy imię/nick bota nadany na początku, następnie mamy PutPlayerInVehicle(playerid,pojazd); czyli wrzucamy naszego bota do wcześniej utworzonego pojazdu (w tym momencie odtworzy się public w pliku bota o nazwie OnNPCEnterVehicle) i SetPlayerColor, dzięki temu bot nad głową będzie miał swój nick/swoje imię oraz id. I na koniec return 1; by reszta kodu była tylko dla zwykłych graczy Bot jest jak zwykły gracz, możemy mu nadawać animacje itp. (choć niektóre funkcje mogą nie działać np. nie jestem pewny co do zamrożenia gracza). Uwagi jeśli bot jeździ pojazdem to nie wyrzucajmy go z niego bo już go wsadzimy go z powrotem (chyba że napiszemy taką komendę), nie wiem dokładnie ale chyba można zrobić by bot był widziany jak normalny gracz (chodzi o te kolorki na radarze/mapie) za pomocą pewnej funkcji. Dodatek, funkcja zwracająca id bot'a (podajesz nazwę):
FindNPC(imie[])

{

	new id=-1;

	new playername[MAX_PLAYER_NAME];

	for(new i = GetMaxPlayers() - 1; i >= 0; i--)

	{

		GetPlayerName(i, playername, sizeof playername);

		if(IsPlayerNPC(i) && !strcmp(playername, imie, false))

		{

			id=i;

			break;

		}

	}

	return id;

}
używamy tak:
FindNPC("Bot")

nazwa bota musi być dokładnie taka jaką nadaliśmy mu na początku (łącznie z wielkością liter) jeśli funkcja nie znajdzie bot'a o takim nick'u/imieniu zwraca -1.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

trzeba stworzyc

	dcmd_rec(playerid,params[])
	{
	    new nazwa[32];
	    if(IsPlayerAdmin(playerid))
	    {
	        if(sscanf(params,"s",nazwa)) return SendClientMessage(playerid,SZARY,"Wpisz /rec [nazwa]");
	        StartRecordingPlayerData(playerid,2,nazwa);
	        SendClientMessage(playerid,ZIELONY,"Zaczoles nagrywac bedac nie w pojezdzie...");
		}
		else
		{
		    SendClientMessage(playerid,CZERWONY,"Nie jestes Adminem...");
		}
		return 1;
	}
//------------------------------------------------------------------------------
	dcmd_recve(playerid,params[])
	{
	    new nazwa[32];
	    if(IsPlayerAdmin(playerid))
	    {
	        if(sscanf(params,"s",nazwa)) return SendClientMessage(playerid,SZARY,"Wpisz /recve [nazwa]");
	        StartRecordingPlayerData(playerid,1,nazwa);
	        SendClientMessage(playerid,ZIELONY,"Zaczoles nagrywac bedac w pojezdzie...");
		}
		else
		{
		    SendClientMessage(playerid,CZERWONY,"Nie jestes Adminem...");
		}
		return 1;
	}
//------------------------------------------------------------------------------
	dcmd_recstop(playerid,params[])
	{
	    #pragma unused params
	    if(IsPlayerAdmin(playerid))
	    {
	        StopRecordingPlayerData(playerid);
			SendClientMessage(playerid,ZIELONY,"Zatrzymales narywanie...");
		}
		else
		{
		    SendClientMessage(playerid,CZERWONY,"Nie jestes Adminem...");
		}
		return 1;
	}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

FindNPC(imie[])
{
    for(new id, gmax = GetMaxPlayers(); id != GetMaxPlayers(); id++)
    {
        if(IsPlayerNPC(i) && !strcmp(PlayerName(i), imie, false))
            return i;
    }
    return INVALID_PLAYER_ID;
}

Tak nie lepiej ta funkcja ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam..Naprawde dobry poradnik ale moge prośić o pomoc bo wciąż próboje mam to co tu ale nadal nie widać

bota..:(

Moje Gadu Gadu to 25050348

Lub prosze mi wyslac pliki to bota z poradnikiem na

profalcon@o2.pl

Będe wdzięczny

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A ustawiłeś liczbę botów w configu serwera na 1 lub więcej? (zależy ile masz tych botów, jak zero to będzie tylko incoming connection a bota nie wpuści na serwer.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#pragma tabsize 0

#include <a_samp>
#include <core>
#include <float>

#include "../include/gl_common.inc"

//-------------------------------------------------

public OnPlayerCommandText(playerid, cmdtext[])
{
	new cmd[256];
	new idx;
	cmd = strtok(cmdtext, idx);

	if(!IsPlayerAdmin(playerid)) return 0; 

 	if(strcmp(cmd, "/rec", true) == 0) {
	    new tmp[512];
      	tmp = strtok(cmdtext, idx);
		if(!strlen(tmp)) {
			SendClientMessage(playerid,0xFF0000FF,"Użyj: /rec [nazwa]");
			return 1;
		}
		if(!IsPlayerInAnyVehicle(playerid)) {
            SendClientMessage(playerid,0xFF0000FF,"Nagrywanie w pojeździe");
			return 1;
		}
		StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_DRIVER,tmp);
		SendClientMessage(playerid,0xFF0000FF,"Nagrywanie rozpoczęte.");
		return 1;
	}


 	if(strcmp(cmd, "/ofrec", true) == 0) {
	    new tmp[512];
      	tmp = strtok(cmdtext, idx);
		if(!strlen(tmp)) {
			SendClientMessage(playerid,0xFF0000FF,"Użyj: /ofrec [nazwa]");
			return 1;
		}
 		if(IsPlayerInAnyVehicle(playerid)) {
            SendClientMessage(playerid,0xFF0000FF,"Wyjdź z pojazdu i użyj komendy /ofrec.");
			return 1;
		}
		StartRecordingPlayerData(playerid,PLAYER_RECORDING_TYPE_ONFOOT,tmp);
		SendClientMessage(playerid,0xFF0000FF,"Nagrywanie rozpoczęte.");
		return 1;
	}


	if(strcmp(cmd, "/stoprec", true) == 0) {
		StopRecordingPlayerData(playerid);
		SendClientMessage(playerid,0xFF0000FF,"Nagrywanie zatrzymane.");
		return 1;
	}

	return 0;
}

I to wszystko aby nagrywać ;p

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

poradnik 10-1 nie ma opisane jak zrobić by nagrywać trzeba zalogowac sie do rcona i /loadfs npc_record i dopiero mozna zacząc nagrywac nie uzyje tego poradnika bo nie jest dobrze napisany ;p dziekuje dowidzenia

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@bialyxd napisałeś najmniej skomplikowaną rzecz, załadowanie skryptu do nagrywania ...

jak ktoś tego nie wie to niech się za tworzenie NPC nie bierze

nie uzyje tego poradnika bo nie jest dobrze napisany ;p dziekuje dowidzenia

może napisz co jest źle według ciebie

p.s nie żebym cie chciał obrazić ale końcówka twego postu wygląda jak byś był jakimś neokidem

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Polecam również zajrzeć tutaj ;)

Nie zajmują slotów, przydatne na serwerach z nie wielką ilością slotów, oraz nie trzeba robić nagrania ;)

mi się te boty nie podobają za bardzo, tyle że można do nich niby strzelać, ale dziwnie się zachowują, Team sa:mp mógłby się postarać i zrobić porządne boty które można np. przejechać, zabić, inaczej które są jak prawdziwi gracze

a i te NPC które są wbudowane i te z tego pluginu zachowują się bardziej jak obiekty

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

C:\Documents and Settings\Kacper\Moje dokumenty\Downloads\samp\pawno\Kopia (12) new.pwn(45) : error 029: invalid expression, assumed zero

C:\Documents and Settings\Kacper\Moje dokumenty\Downloads\samp\pawno\Kopia (12) new.pwn(45) : error 004: function "OnPlayerConnect" is not implemented

C:\Documents and Settings\Kacper\Moje dokumenty\Downloads\samp\pawno\Kopia (12) new.pwn(51) : error 030: compound statement not closed at the end of file (started at line 47)

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

Pomocy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tera mam 2

C:\Documents and Settings\Kacper\Moje dokumenty\Downloads\samp\pawno\Kopia (12) new.pwn(42) : error 029: invalid expression, assumed zero

C:\Documents and Settings\Kacper\Moje dokumenty\Downloads\samp\pawno\Kopia (12) new.pwn(42) : error 004: function "OnPlayerConnect" is not implemented

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

2 Errors.

#include <a_samp>

#if defined FILTERSCRIPT


#else

main()
{
	print("\n----------------------------------");
	print(" Blank Gamemode by your name here");
	print("----------------------------------\n");
}

#endif

public OnGameModeInit()
{
	// Don't use these lines if it's a filterscript
ConnectNPC("kapciowat","kapciowat");
return 1;
}



public OnPlayerRequestClass(playerid)
{
if(IsPlayerNPC(playerid))
{
new playername[30];
GetPlayerName(playerid,playername,sizeof(playername));
if(!strcmp(playername,"kapciowat",false))
{ SetSpawnInfo(playerid,69,255,1462.0745,2630.8787,10.8203,0.0,-1,-1,-1,-1,-1,-1);
}
return 1;
}

public OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
}
return 1;
}

Pomocy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

po pierwsze nie korzystaj z przykładów sa:mp'a (chodzi mi o to #if #else #endif) po drugie jeśli to mapa to używasz funkcji OnGameModeInit jeśli skrypt (filterscript) to używasz OnFilterScriptInit i nie używasz main

na końcu masz jedną klamrę otwierającą { i dwie zamykające }}

to co tam jest jest bez sensu, jeśli gracz jest botem to return 1 a jeśli nie jest to też return 1;

#include <a_samp>


public OnFilterScriptInit()
{
	ConnectNPC("kapciowat","kapciowat");
	return 1;
}



public OnPlayerRequestClass(playerid)
{
	if(IsPlayerNPC(playerid))
	{
		new playername[30];
		GetPlayerName(playerid, playername, sizeof(playername));
		if(!strcmp(playername, "kapciowat"))
		{
			SetSpawnInfo(playerid, 69, 255, 1462.0745, 2630.8787, 10.8203,0.0,-1,-1,-1,-1,-1,-1);
		}
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/rec [*nazwa] - startuje nagrywanie zachowania w pojeździe

/ofrecord [*nazwa] - startuje nagrywanie zachowania na nogach

/stoprec - zatrzymuje/kończy nagrywanie

te komendy nie dziłają

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×