Форум Pawn.Wiki - Воплоти мечту в реальность!: Учимся делать бота с помощью FC_NPC - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Учимся делать бота с помощью FC_NPC Делаем NPC
Оценка: ***** 2 Голосов

#1
Пользователь офлайн   SparrowCrew 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Доброго времени суток, с вами SparrowCrew, и это мой первый урок(так что в случае чего тапки не кидать). После выхода SAMP'a версии 0.3.7 появилась возможность создавать актеров, но все же по сравнению с FC_NPC их функционал давольно таки скован. В этом уроке мы создадим бота с помощью плагина FC_NPC.

new MyFirstBot = FCNPC_Create("MyBOT");


Здесь мы создали бота с именем "MyBOT", и привязали его к нашей переменной "MyFirstBot". Но мы только создали бота, теперь нам нужно его заспавнить.
FCNPC_Spawn(MyFirstBot, 307, 1326.23, 458.394, 15.36);


И вот, бот заспавнен. Давайте разберем функцию FCNPC_Spawn. MyFirstBot - ID заспавненого бота, 307 - скин, в котором будет появляться бот, 1326.23, 458.394, 15.36 - координаты спавна, по X, Y и Z.

Отлично. У нас есть заспавненый бот. Но он еще ничего не делает, просто стоит. Давайте его чему-нибудь научим. Для этого используем кэлбэк FCNPC_OnSpawn, он вызывается, как вы догадались, когда спавнится наш NPC:
FCNPC_OnSpawn(npcid)
{
	FCNPC_GoTo(MyFirstBot, 2732.13, 123.42, 32.12, MOVE_TYPE_RUN, 10.0, 0);
}


Теперь наш бот пойдет в точку с координатами, которые я взял из головы. Давайте разберем функцию FCNPC_GoTo: MyFirstBot - как вы догадались, ID бота, 2732.13, 123.42, 32.12 - координаты, куда пойдет наш бот, по X, Y, Z, MOVE_TYPE_RUN - тип передвижения, у нас он бег. Есть еще 3 типа - MOVE_TYPE_WALK - шаг, MOVE_TYPE_SPRINT - спринт, MOVE_TYPE_DRIVE - вождение, возможно, только если наш NPC находится за рулем автомобиля. Следующий параметр - скорость передвижения, у нас она 10.0, и последний параметр - использовать ли ZMap. Поясню: ZMap - это дополнение к плагину. Без него игрок будет проходить сквозь объекты, что не очень удобно, но ZMap потребляет слишком много памяти, из-за чего будут лаги, поэтому лучше его не использовать.

И вот, у нас есть бот который идет не пойми куда. Давайте его убьем. Но для этого, нужно сначала дать ему жизни - вставьте FCNPC_SetHealth(MyFitstBot, [колиество HP]); в кэлбэк спавна. Теперь у бота есть определенное количество жизни, но мы не прописали ему получение дамага. Для этого используем кэлбэк FCNPC_OnTakeDamage, он имеет 3 параметра - ID NPC, ID того, кто наносит дамаг и ID оружия, из которого наносят дамаг. Используем последний параметр для определения урона из каждого оружия. Для этого используем оператор switch:
FCNPC_OnTakeDamage(npcid, damagerid, weaponid)
{
	switch(weaponid)
	{
	    case 0: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 3);
	    case 1: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 5);
	    case 2: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 7);
	    case 3: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 6);
	    case 4: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 8);
	    case 5: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 10);
	    case 6: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 10);
	    case 7: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 9);
	    case 8: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 15);
	    case 14: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 0.5);
	    case 15: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 5);
	    case 16: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 70);
	    case 18: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 5);
	    case 22: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 11);
	    case 23: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 11);
	    case 24: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 45);
	    case 25: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 50);
	    case 26: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 50);
	    case 27: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 65);
	    case 28: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 10);
	    case 29: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 15);
	    case 30: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 27);
	    case 31: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 23);
	    case 32: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 15);
	    case 33: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 55);
	    case 34: FCNPC_SetHealth(npcid, FCNPC_GetHealth(npcid) - 70);
	}
	if(FCNPC_GetHealth(npcid) < 1) FCNPC_Kill(npcid);
	return 1;
}


Так же прошу обратить внимание на строку if(FCNPC_GetHealth(npcid) < 1) FCNPC_Kill(npcid);. Здесь у нас стоит проверка, что если HP бота < 1, то он умирает. Иначе HP нашего бота попусту уйдет в минус, но сам бот не умрет.

Все. Теперь у нас есть бот, умеет ходить, и которого мы можем убить. Ждите новый уроков.

Автор - SparrowCrew
12

#2
Пользователь офлайн   suza 

  • suza
  • Вставить ник
  • Раскрыть информацию
Прикольно. +.
0

#3
Пользователь офлайн   Витёк 

  • Banned
  • Вставить ник
  • Раскрыть информацию
+ :rolleyes:

#4
Пользователь офлайн   .evoxxx 

  • Liberty Inc.
  • Вставить ник
  • Раскрыть информацию
Хорошо, я еще на официальном форуме смотрел, что эта вещица много чего творит, можно еще и ботов зомби сделать :D, а хорошо было бы если бы ты еще все функции этого чудо плагина выложил, хорошо было бы :D
0

#5
Пользователь офлайн   Витёк 

  • Banned
  • Вставить ник
  • Раскрыть информацию
а как например чтобы он ещё обратно шол

#6
Пользователь офлайн   SparrowCrew 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSnoopDy (10 июля 2015 - 15:20) писал:

Хорошо, я еще на официальном форуме смотрел, что эта вещица много чего творит, можно еще и ботов зомби сделать :D, а хорошо было бы если бы ты еще все функции этого чудо плагина выложил, хорошо было бы :D

Без проблем, буду свободен - запилю :)

Просмотр сообщенияВитёк (10 июля 2015 - 15:23) писал:

а как например чтобы он ещё обратно шол

Получаем и записываем позицию бота в переменные(аналогично GetPlayerPos(), FCNPC_GetPosition(npcid, &x, &y, &z);), ставим проверку, если его координаты = координатам точки, в которую бот шел, направляем его в начальную позицию.
0

#7
Пользователь офлайн   Витёк 

  • Banned
  • Вставить ник
  • Раскрыть информацию
спс за урок ато с записью бота не очень удобно :rolleyes:

Сообщение отредактировал Витёк: 11 июля 2015 - 08:36


#8
Пользователь офлайн   W1nStoN 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
+ полезный урок :)

Сообщение отредактировал W1nStoN: 11 июля 2015 - 08:26

0

#9
Пользователь офлайн   Stich 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Весьма полезно. Плюс твой.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика