Jump to content

[0.3] Konverzace s NPC


7.Host

Recommended Posts

 

Předem upozorňuju že to neni můj tut ,ale přeložil jsem to ze samp fóra. Přidal jsem poznámky apod.

 

 

V tomto tutoriálu si ukážeme jak na konverzaci s NPC ve hře

 

Nejprve přidáme nahoru do modu forward:

forward GetClosestPlayer(p1);

 

Nynní si přidáme někam mezi publici nebo na konec modu:

public GetClosestPlayer(p1)
{
new x,Float:dis,Float:dis2,person;
person = -1;
dis = 99999.99;
for (x=0;x	{
	if(IsPlayerConnected(x)) //pokud je hráč připojený
	{
		if(x != p1)
		{
			dis2 = GetDistanceBetweenPlayers(x,p1);
			if(dis2 < dis && dis2 != -1.00)
			{
				dis = dis2;
				person = x;
			}
		}
	}
}
return person;
}

 

To umožní aby funkci mohl používat nejbližší hráč

 

Ok, nynní přejdeme k funkci OnPlayerText

 

Do public OnPlayerText si vložíme:

new bot = GetClosestPlayer(playerid); //vytvoříme nového bota

 

a

new name[24];
GetPlayerName(bot, bot, 24); //jméno bota

 

Nynní jsme si nastavili jméno bota ,ale script stále ještě neví že je to bot

 

takže ještě si dáme:

if(IsPlayerNPC(bot)) //pokud neni hráč ale NPC

 

Tím jsme si nastavili podmínku že musí být bot takže následující funkce bude fungovat jen s boty

Ted si nastavíme že když hráč napíše ahoj bot odpoví:

if(!strcmp(text,"ahoj",true)) //když hráč napíše ahoj

 

Pokud hráč napíše "ahoj" bez uvozovek tak bot odpoví:

POZNÁMKA: stále vkládáme do OnPlayerText

 

{
format(to_others,přesný počet znaků,"%s: Ahoj, jak se máš?",name); // %s = jméno bota teré jste si nastavili
SetPlayerChatBubble(bot,to_others,vaše barva,35.0,10000); //v chatu se zobrazí bublina

 

Takže, bot odpoví Ahoj, jak se máš a v chatu se zobrazí bublina. Jistě jste si všichni všimli že tato funkce je nová

 

Počet znaků úvádějte přesně určuje totiž velikost bubliny

 

Nakonec by script mohl vypadat nějak takto:

public OnPlayerText(playerid, text[])
{
new bot = GetClosestPlayer(playerid); //vytvoříme nového bota
new name[24];
       GetPlayerName(bot, botnik, 24); //jméno bota
if(IsPlayerNPC(bot)) //pokud neni hráč ale NPC
{
if(!strcmp(text,"Ahoj botniku",true))
{
format(to_others,27,"%s: Ahoj, nezajdem na pivo?",name);
SetPlayerChatBubble(bot,to_others,COLOR_GREEN,35.0,10000);
	}
return 1;
}

 

Chcete aby váš bot odpovídal na víc otázek?(by 7Hot)

public OnPlayerText(playerid, text[])
{
new bot = GetClosestPlayer(playerid); //vytvoříme nového bota
new name[24];
       GetPlayerName(bot, botnik, 24); //jméno bota
if(IsPlayerNPC(bot)) //pokud neni hráč ale NPC
{
if(!strcmp(text,"Ahoj botniku",true)) //zpráva kterou musí hráč napsat
{
format(to_others,27,"%s: Ahoj, nezajdem na pivo?",name); //NPC odpoví...
SetPlayerChatBubble(bot,to_others,COLOR_GREEN,35.0,10000); //barva a pozice bubliny
	}
       if(!strcmp(text,"botniku kde najdu prikazy?",true))
{
format(to_others,16,"%s: /commands :)",name);
SetPlayerChatBubble(bot,to_others,COLOR_GREEN,35.0,10000);
	}
       if(!strcmp(text,"botniku das mi hp?",true))
{
format(to_others,18,"%s: ani náhodou :D",name);
SetPlayerChatBubble(bot,to_others,COLOR_GREEN,35.0,10000);
	}
return 1;
}

 

Jak udělat aby každý NPC odpovídal náhodně?

 

Ok, určitě nechcete aby vaše NPC odpovídali stále na jednu věc ne?

 

Takže využijeme randomu

 

Do public OnPlayerText si vložte:

new RandR = random(4) //vytvoří nový random

 

pokud nastavíte random(4) znamená to že bot může odpovídat 3 různé věci

 

Mělo by to vypadat nějak takto:

public OnPlayerText(playerid, text[])
{
new bot = GetClosestPlayer(playerid);
new name[24];
       new RandR = random(4); //vytvoříme si random
       GetPlayerName(botnik, name, 24); //jméno bota
if(IsPlayerNPC(bot)) //pokud neni hráč ale NPC
{
if(!strcmp(text,"ahoj, jsi chytry bot?",true))
{
       if(RandR == 1)
       {
format(to_others, 39,"%s: Ahoj, nejsem chytrý bot. Bohužel :(",name);
SetPlayerChatBubble(bot,to_others,COLOR_RED,35.0,10000);
	}
       else if(RandR == 2) //a tak dále...
return 1;
}

Doufám že se vám můj TUT líbil. Prosím nechte si kecy typu "tohle dokáže každá lama" apod. Docela jsem předělal tut ze samp fora a přidal hodně poznámek. Odkaz: http://forum.sa-mp.com/index.php?topic=120953.0

Link to comment
Share on other sites

neviete pojde registracka z 0.2X na 0.3 ? A preco mi ukazuje ze v SLOZKE INCLUDE nemam includ DUDB a pritom mam a vzdy mi to hadze :x

 

zřejmě ještě používáš starý pawno program ( na 0.2x ) › spusť nový ze složky pawno se serverem 0.3 a pak už můžeš spouštět ostatní své soubory normálně - mě to tak funguje

Link to comment
Share on other sites

FreeWall":108khexo]
neviete pojde registracka z 0.2X na 0.3 ? A preco mi ukazuje ze v SLOZKE INCLUDE nemam includ DUDB a pritom mam a vzdy mi to hadze :x

 

zřejmě ještě používáš starý pawno program ( na 0.2x ) › spusť nový ze složky pawno se serverem 0.3 a pak už můžeš spouštět ostatní své soubory normálně - mě to tak funguje

 

 

Nj + do složky include přidat dudb pokud tam ještě neni ...

Link to comment
Share on other sites

  • 1 month later...

sry za stari post ale som to skuzal a nejde to pisen

 

C:\Documents and Settings\sovak\Desktop\Sovak\server\filterscripts\botik.pwn(133) : error 017: undefined symbol "to_others"

C:\Documents and Settings\sovak\Desktop\Sovak\server\filterscripts\botik.pwn(134) : error 017: undefined symbol "to_others"

C:\Documents and Settings\sovak\Desktop\Sovak\server\filterscripts\botik.pwn(138) : error 017: undefined symbol "to_others"

C:\Documents and Settings\sovak\Desktop\Sovak\server\filterscripts\botik.pwn(139) : error 017: undefined symbol "to_others"

C:\Documents and Settings\sovak\Desktop\Sovak\server\filterscripts\botik.pwn(143) : error 017: undefined symbol "to_others"

C:\Documents and Settings\sovak\Desktop\Sovak\server\filterscripts\botik.pwn(144) : error 017: undefined symbol "to_others"

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

 

 

6 Errors.

 

Link to comment
Share on other sites

  • 3 months later...

prepacte za otvorenie topicu ale hodi mi to errory

 

(87) : error 030: compound statement not closed at the end of file (started at line 52)
(15) : error 004: function "GetDistanceBetweenPlayers" is not implemented

 

 

cele to mam takto

 

 

#include

#define COLOR_RED 0xE10000AA

forward GetClosestPlayer(p1);

public GetClosestPlayer(p1)

{

new x,Float:dis,Float:dis2,person;

person = -1;

dis = 99999.99;

for (x=0;x

{

if(IsPlayerConnected(x)) //pokud je hráč připojený

{

if(x != p1)

{

dis2 = GetDistanceBetweenPlayers(x,p1);

if(dis2 < dis && dis2 != -1.00)

{

dis = dis2;

person = x;

}

}

}

}

return person;

}

forward GetDistanceBetweenPlayers(playerid,playerid2);

 

#if defined FILTERSCRIPT

 

public OnFilterScriptInit()

{

print("\n--------------------------------------");

print(" Blank Filterscript by your name here");

print("--------------------------------------\n");

return 1;

}

 

public OnFilterScriptExit()

{

return 1;

}

public OnGameModeInit()

{

// Don't use these lines if it's a filterscript

SetGameModeText("Blank Script");

AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);

return 1;

}

#endif

public OnPlayerText(playerid, text[])

{

new bot = GetClosestPlayer(playerid); //vytvoříme nového bota

new botnik[MAX_PLAYERS];

new to_others[MAX_PLAYERS];

new name[24];

GetPlayerName(bot, botnik, 24); //jméno bota

if(IsPlayerNPC(bot)) //pokud neni hráč ale NPC

{

if(!strcmp(text,"Ahoj botniku",true)) //zpráva kterou musí hráč napsat

{

format(to_others,27,"%s: Ahoj, nezajdem na pivo?",name); //NPC odpoví...

SetPlayerChatBubble(bot,to_others,COLOR_RED,35.0,10000); //barva a pozice bubliny

}

if(!strcmp(text,"botniku kde najdu prikazy?",true))

{

format(to_others,16,"%s: /commands :)",name);

SetPlayerChatBubble(bot,to_others,COLOR_RED,35.0,10000);

}

if(!strcmp(text,"botniku das mi hp?",true))

{

format(to_others,18,"%s: ani náhodou :D",name);

SetPlayerChatBubble(bot,to_others,COLOR_RED,35.0,10000);

}

return 1;

}

/*

public GetDistanceBetweenPlayers(playerid,playerid2){

new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;

new Float:tmpdis;

GetPlayerPos(playerid,x1,y1,z1);

GetPlayerPos(playerid2,x2,y2,z2);

tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));

return floatround(tmpdis);

}

*/

 

 

nj je to v new pawno pretoze som to skusal spravit ale nejde

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...