Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

[Pamoka] NPC boto kūrimas


Silver_Star

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 4184 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

NPC bot'as - netikras žaidėjas. Jūs parašote jo veiksmus, o jis tai atlieka serveryje. ( Pavyzdžiui.: važinėja taxi, vaikšto po miestą ir panašiai. )

įrašome NPC boto veiksmus

Visų pirma mums reikia įrašyti jo veiksmus. Įsijungiame serverį ir prisijungiame kaip rcon adminas. ( /rcon login slaptažodis ). Tada rašome /rcon loadfs npc_record. Viskas. Lyg ir pasiruošėme įrašinėjimui, tik dabar truputį plačiau apie komandas...

* /vrecord pavadinimas - įrašinėja veiksmus, kurie atliekami sėdint transporte.

* /ofrecord pavadinimas - įrašinėja veiksmus, kurie atliekami stovint ant kojų.

* /stoprecord - sustabdo įrašinėjimą.

Tarkim, kad aš pasirinkau, kad mano NPC bot'as važinėtų po miestą. Taigi, įlipu i automobilį ir parašau /vrecord TaksiVairuotojas.

Pavažinėsiu po miestą ir kai man užtenka maršruto, rašau /stoprecord.

Viskas. Uždarome serverį.

Aplanke scriptfiles/ mano atveju bus failas TaksiVairuotojas.rec.

Jį reikia perkelti į /npcmodes/recordings/.

Kontroliuojame NPC botą

Ko gero pastebėjote, kad npcmodes kataloge yra daug įrašų. Tai yra "mini" skriptukai kurie galbūt padės Jums tvarkyti savo NPC botus.

Na, o mes darome įviešis "žaidiant?".

Atsidarome pawno programą, spaudžiame File, o tada New.

Visą šš ten ištriname, ir įklijuojame kodą, esantį apačioje..

#define RECORDING "TaksiVairuotojas" //Jūsų failo pavadinimas.
#define RECORDING_TYPE 1 //1 reiškia, kad veiksmas vyko transporte, o 2 reiškia, kad veiksmas buvo ant kojų.

#include 
main(){}
public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);

#if RECORDING_TYPE == 1
   public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
   public OnNPCExitVehicle() StopRecordingPlayback();
#else
   public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif

Dabar paaiškinsiu kiekvieną funkciją...

---------------------------------------------------------------------

#define RECORDING "TaksiVairuotojas" //Jūsų failo pavadinimas.

Kaip ir komentaras sako, kad čia reikia įrašyti mūsų failo pavadinimą. Pavadinimas turi būti be galūnės. Mūsų failas buvo TaksiVairuotojas.rec, taigi mes įrašome "TaksiVairuotojas"

---------------------------------------------------------------------

#define RECORDING_TYPE 1 //1 reiškia, kad veiksmas vyko transporte, o 2 reiškia, kad veiksmas buvo ant kojų.

Ką daro ši funkcija, ko gero supratote iš komentaro... Jeigu Jūs įrašinėjote veiksmą ant kojų, įrašome 2, o jeigu transporte - įrašome 1. Mano atveju buvom Taksi automobilyje ( transporte ), taigi rašome 1.

---------------------------------------------------------------------

#include 

SA-MP NPC botų funkcijos.

---------------------------------------------------------------------

public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);

OnRecordingPlaybackEnd callback'as yra NPC botų funkcijose, kuri priklauso a_npc includ'ui. Ši funkcija mūsų NPC boto veiksmus kartoja. Kai mūsų įrašas baigiasi, ši funkcija tą įraša paleidžia iš naujo. Pasaka be galo... :]

---------------------------------------------------------------------

public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);

Dar viena funkcija, priklausanti NPC botų funkcijoms. Ji pradeda įrašinėti, kai NPC botas atsisėda į transportą.

---------------------------------------------------------------------

public OnNPCExitVehicle() StopRecordingPlayback();

Ir dar viena funkcija. Ji nutraukia įrašinėjimą, jeigu NPC botas dėl kaškokios priežasties išlipa iš transporto.

---------------------------------------------------------------------

public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);

Ši funkcija neišsiskiria iš kitų... Ji taip pat NPC botų funkcijose yra. Ji pradeda rodyti mūsų įrašytus veiksmus, kai NPC botas būna paleidžiamas serveryje.

---------------------------------------------------------------------

Prijungiame NPC botą į serverą

Mes turime "mini" skriptą. Taip pat turime ir savo NPC botą. Dabar mums reikia savo NPC bot'ą įkelti i GameMod'ą ar FilterScript'?.

ConnectNPC funkcija padės mums tai padaryti.

Panagrinėkime tai truputį...

Viskas turi atrodyti:

ConnectNPC("Martin_M","TaksiVairuotojas");

Dabar paaiškinsiu.

Martin_M - mūsų NPC boto vardas. Taip jūs galėsite prijungti daugybė NPC botų. Svarbiausia, kad būtų skirtingi vardai.

TaksiVairuotojas - mūsų įrašo pavadinimas ( be .rec galųnės ).

Ką gi... Dabar pamėginkime padaryti mūsų NPC boto prisijungimą į serverį, kai GameMod'as ar FilterScript'as užkraunamas.

Jeigu jungiate NPC botą GameMod'e, tada rašome...

public OnGameModeInit()
{
   print("NPC botas GameMod'e prijungtas");
   ConnectNPC("Martin_M","TaksiVairuotojas");
   return 1;
}

O, jeigu jungiame į FilterScript'ą, rašome..

public OnFilterScriptInit()
{
   print("NPC botas FilterScript'e prijungtas");
   ConnectNPC("Martin_M","TaksiVairuotojas");
   return 1;
}

---------------------------------------------------------------------

Ką gi. Mano NPC bot'as važinėjo su Taksi. Tai man reikia sukurti automobilį, kuriuo jis važinėjo.

GameMod'o ar FilterScript'o viršuje, rašome...

new TaksiMasina;

Ir dabar OnGameModeInit turėtų atrodyti šitaip...

public OnGameModeInit()
{
   print("NPC botas GameMod'e prijungtas");
   ConnectNPC("Martin_M","TaksiVairuotojas");
   TaksiMasina = CreateVehicle(420, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000);
   return 1;
}

O jeigu, NPC bot'ą kuriate FilterScript'e, tada turi atrodyti šitaip..

FilterScript'o viršuje:

new TaksiMasina;

O OnFilterScriptInit turi atrodyti šitaip...

public OnFilterScriptInit()
{
   print("NPC botas FilterScript'e prijungtas");
   ConnectNPC("Martin_M","TaksiVairuotojas");
   MyFirstNPCVehicle = CreateVehicle(420, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000);
   return 1;
}

DĖMESIO!! Jeigu Jūsų NPC boto veiksmai buvo ant kojų, o ne transporte, šitą dalį praleiskite.

PASTABA: Transpoto vieta nėra svarbi. Vistiek transportas būna nuteleportuotas NPC botui, kai įrašas pradedamas rodyti.

---------------------------------------------------------------------

Ir liko paskutinis žingsnis, kad galėtumėme NPC bot'ą pamatyti žaidime. Tai - pasodinti NPC bot'ą į jam sukurtą transportą.

Tai darome, naudodamiesi OnPlayerSpawn...

PASTABA: Jeigu Jūsų NPC boto veiksmai buvo ant kojų, o ne transporte, šitą dalį praleiskite.

OnPlayerSpawn turi atrodyti šitaip...

public OnPlayerSpawn(playerid)
{
   if(IsPlayerNPC(playerid)) //Tikrina, ar žaidėjas paleistas kaip NPC botas.
   {
       new npcname[MAX_PLAYER_NAME];
       GetPlayerName(playerid, npcname, sizeof(npcname)); //Gauna NPC boto vardą.
       if(!strcmp(npcname, "Martin_M", true)) //Tikrina, ar NPC boto vardas Martin_M
       {
           PutPlayerInVehicle(playerid, TaksiMasina, 0); //Pasodina NPC botą į jam sukurtą transportą.
       }
       return 1;
   }
   //Visa kita paprastam žaidėjui.
   return 1;
}

Jeigu mes norime pridėti dar vieną NPC botą, tai nėra sunku.  Tiesiog mums reikia pridėti

if(!strcmp(npcname, "KitasNPCvardas", true))
       {
           PutPlayerInVehicle(playerid, KitaMasina, 0);
           return 1;
       }

Taigi, 2 NPC botams, viskas turi atrodyti šitaip..

public OnPlayerSpawn(playerid)
{
   if(IsPlayerNPC(playerid)) //Tikrina, ar žaidėjas paleistas kaip NPC botas.
   {
       new npcname[MAX_PLAYER_NAME];
       GetPlayerName(playerid, npcname, sizeof(npcname)); //Gauna NPC boto vardą.
       if(!strcmp(npcname, "Martin_M", true)) //Tikrina, ar NPC boto vardas Martin_M
       {
           PutPlayerInVehicle(playerid, TaksiMasina, 0); //Pasodina NPC botą į jam sukurtą transportą.
       }
       if(!strcmp(npcname, "KitasNPCvardas", true))
       {
           PutPlayerInVehicle(playerid, KitaMasina, 0);
           return 1;
       }
       return 1;
   }
   //Visa kita paprastam žaidėjui.
   return 1;
}

Viskas. Dabar sukompiliuokite GameMod'ą ar FilterScript'ą paspausdami F5 ir pirmyn tikrinti NPC boto. Jis važinės taip, kaip Jūs jį įrašėte. Sveikinu! Jūs sukūrėte savo NPC botą!

Šaltinis http://www.gta-online.lt

  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 1 mėnesio...

Sveiki bandziau padaryti FilterScripte ir kazkaip nesigavo klaidos :

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(15) : warning 235: public function lacks forward declaration (symbol "OnRecordingPlaybackEnd")

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(15) : error 017: undefined symbol "StartRecordingPlayback"

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(18) : warning 235: public function lacks forward declaration (symbol "OnNPCEnterVehicle")

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(18) : error 017: undefined symbol "StartRecordingPlayback"

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(19) : warning 235: public function lacks forward declaration (symbol "OnNPCExitVehicle")

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(19) : error 017: undefined symbol "StopRecordingPlayback"

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(42) : error 021: symbol already defined: "main"

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(86) : error 017: undefined symbol "TaksiMasina"

C:\Users\Ultimate\Desktop\VISKAS KAS SU SA_MP\SVG\gamemodes\NPCBOTAS.pwn(258) : warning 203: symbol is never used: "MyFirstNPCVehicle"

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

5 Errors.

// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT

#include 
#include 
main(){}

#define RECORDING "TaksiVairuotojas" //Jusu failo pavadinimas.
#define RECORDING_TYPE 1 //1 reiškia, kad veiksmas vyko transporte, o 2 reiškia, kad veiksmas buvo ant koju.


new MyFirstNPCVehicle;

public OnRecordingPlaybackEnd() StartRecordingPlayback(RECORDING_TYPE, RECORDING);

#if RECORDING_TYPE == 1
   public OnNPCEnterVehicle(vehicleid, seatid) StartRecordingPlayback(RECORDING_TYPE, RECORDING);
   public OnNPCExitVehicle() StopRecordingPlayback();
#else
   public OnNPCSpawn() StartRecordingPlayback(RECORDING_TYPE, RECORDING);
#endif

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
print("NPC botas FilterScript'e prijungtas");
   ConnectNPC("Martin_M","TaksiVairuotojas");
   MyFirstNPCVehicle = CreateVehicle(420, 0.0, 0.0, 5.0, 0.0, 3, 3, 5000);
return 1;
}

public OnFilterScriptExit()
{
return 1;
}

#else

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

#endif

public OnGameModeInit()
{
return 1;
}

public OnGameModeExit()
{
return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}

public OnPlayerConnect(playerid)
{
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
return 1;
}

public OnPlayerSpawn(playerid)
{
   if(IsPlayerNPC(playerid)) //Tikrina, ar žaidejas paleistas kaip NPC botas.
   {
       new npcname[MAX_PLAYER_NAME];
       GetPlayerName(playerid, npcname, sizeof(npcname)); //Gauna NPC boto varda.
       if(!strcmp(npcname, "Martin_M", true)) //Tikrina, ar NPC boto vardas Martin_M
       {
           PutPlayerInVehicle(playerid, TaksiMasina, 0); //Pasodina NPC bota i jam sukurta transporta.
       }
       return 1;
   }
   //Visa kita paprastam žaidejui.
   return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}

public OnVehicleSpawn(vehicleid)
{
return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
return 1;
}

public OnPlayerText(playerid, text[])
{
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/mycommand", cmdtext, true, 10) == 0)
{
	// Do something here
	return 1;
}
return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
return 1;
}

public OnRconCommand(cmd[])
{
return 1;
}

public OnPlayerRequestSpawn(playerid)
{
return 1;
}

public OnObjectMoved(objectid)
{
return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
return 1;
}

public OnPlayerExitedMenu(playerid)
{
return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
return 1;
}

public OnPlayerUpdate(playerid)
{
return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
return 1;
}

Jei Galite Padekite Istaisyti scripta ? kas pades + 2 Rep taskai ;) laukiu pagalbos

Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 1 metų...

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 4184 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...