Отступление:
Народ, если что не так, то сорри, писал на дежурстве, одним
глазом спал, другой рукой писал :)), просот более времени не
могу найти кроме как на ночных дежурствах, если что пишите
критику, недовольства и т.д.
По многочисленным порсьбам, сегодня мы с вами займемся созданием
НПС. Для начала давайте придумаем кого будем делать?
Я предлагаю сделать девочку, симпатичную такую, может даже с
бантиков, а то как бывает идешь бывало по землям британии видешь
вроде симпатичная, а оказывается это подросток трансвестит. Вот,
а эта хоть и компьютерная, зато натуралка.
И так, давайте начнем с АИ.
ЗЫ Сразу сории за Англицкий :))
// A girl script by Slayer - Last Updated 23 ноября 2002
// mailto: slayer@dinfo.ru
// Добрая милая девушка, чего так сильно не хватает в УО
use os;
use uo;
use npc;
use util;
use cfgfile;
// ну тут все обычно и понятно
include "include/randname"; //- используем для названиея по
имени :)
include "include/sysevent"; //- нужные нам ивенты
include "include/client"; //- тут всякие звучки, анимация и т.д.
include "include/objtype"; //- типы объектов
include "include/dist"; //- изназвания понятно
include "include/vetement"; //- чтобы одеть девушку
const MONEY := 0xeed; //- между делом девочка будет всякой
шмалью торговать, жить то на что то надо.
global me :=self(); //- ну тут чтоб короче писать
global flag := 0; //- это просто вспомогательная
program girl()
if( me.name[""] )
me.graphic := 401; me.gender := 1;
SetName ( me , RandomName( me ));
EquipFromTemplate( me , "girl" );
endif
// Тут смотрим, если в npcdesk имя ей не дали, то ставим ей имя,
тело и одеваем
set_priority(10);//- приоритетность, ну это пока вам не надо
EnableEvents( EVID_ITEM_GIVEN ); //- включили событие, что если
девушке дадут подарок.
EnableEvents( EVID_ITEM_SPEECH,3 ); // чтоб даровать ей слух
EnableEvents( EVID_ENGAGED + EVID_DAMAGED ); //- эти события на
тот случай если ее кто нить обидет
EnableEvents( EVID_ENTEREDAREA + EVID_LEFTAREA,3);//- это для
всех входящих и выходящих в зоне 3 тайтлов от девушки.
var mnext_wander := ReadGameClock() + 30;
var mwanders := 11;
// данные преобразования, чтобы девушка не стояла как тополь на
плющихе
while (1)
Local ev;
ev := os::wait_for_event( 5 ); //ждать событие
if (ev)
case (ev.type)
EVID_SPEECH:
mwanders := 0;
mnext_wander := readgameclock()+60;
if (ev.text["hi"] or ev.text["hail"])
//тобишь, если внешний источник изрек Hi или Hail то на них
будет реакция? другие слова пропускаются.
TurnToward( ev.source );
//поварачиваемся лицом к говорящему, не говрить же с ним жопой.
if(ev.gender == 1)
say("Hail big man! You want take a funny?");
else
say("I'm greeting you my lady!");
endif
//Пусть девушка поприветствует игрока
elseif (ev.text["miserable"] or ev.text["bich"] or ev.text["fuck
off"])
say("You are hybrid. God curses you and you will die as a
cat!!!");
// Если милое создание хотят обидеть - не беда, ответим!
elseif(ev.text["sex"]or ev.text["funny"]or ev.text["baby"])
say("Ooo, yes, come to me baby!");
endif
EVID_ITEM_GIVEN:
//Событие, если на девушки перетащат какой то предмет.
mwanders := 0;
mnext_wander := readgameclock()+60;
var amo := GetAmount (ev.item);
//Смотрим какое количество дают
if((ev.item.objtype = 0xeed) and (amo >= 500) )
//Смотрим, если то что дали является деньгами и их более 500
SubtractAmount( ev.item, CInt(amo));
//Удаляем то что нам дали
flag := 1ж
TurnToward( ev.source );
say("Ou, you are fanny!!");
//Ставим флажок, что деньги уплаченв, поварачиваемся и
благодарим
MoveCharacterToLocation(me,
ev.source.x-1,ev.source.y,ev.source.z);
//Переносим девушку поближе к игроку(что то не захотела она у
меня пешком к нему топать :) )
TurnToward( ev.source );
sendsysmessage( ev.source, "Long Kiss", 3, 93 );
PerformAction(me, 0x0020 );
//проигрывем анимацию, какую сами увидете
PlaySoundEffect( ev.source, 0x0032);
//из client берем номер звучка и играем его
if(ev.source.gendr ==1)
PlaySoundEffect( ev.source, 0x014c);
else
PlaySoundEffect( ev.source, 0x0151);
endif
sleep(2);
PerformAction(me, 0x0020 );
PlaySoundEffect( ev.source, 0x01cb);
sleep(2);
PerformAction(me, 0x0020 );
PlaySoundEffect( ev.source, 0x01cb);
sleep(2);
PerformAction(me, 0x0020 );
PlaySoundEffect( ev.source, 0x01cb);
sleep(2);
PlaySoundEffect( ev.source, 0x0031);
sleep(1);
PerformAction(me, ANIM_HIT );
sleep(1);
if(ev.source.gendr ==1)
PlaySoundEffect( ev.source, 0x014c);
else
PlaySoundEffect( ev.source, 0x0151);
endif
PlaySoundEffect(ev.source , SFX_SPELL_HEAL );
sendsysmessage(ev.source,":-E~~~~~~~~~~~");
else
// Automatically take cash
if ( (ev.item.objtype = MONEY))
ConsumeSubstance(ev.backpack, ev.item, CInt(GetAmount
(ev.item)));
say("If you want sacki sacki, you must pay more");
// Если дали денег, но мало просто заберем их и обругаем игрока
:))
endif
endif
EVID_ENTEREDAREA:
greeting();
//Ежели кто приблизится ближе 3 тайтлов, выполнится функция
приветствия, о ней ниже
EVID_LEFTAREA:
If(flag==1)
say("call to me!!!");
else
say("Go away ananist!!!!");
endif
//Смотрим, если денег девушке дали, пожелать счастливого пути,
если нет, буркнуть просто катись. это будет если игрок отойдет
дальше 3 тайтлов, мы такой радиус установили в самом начале
EVID_ENGAGED:
EVID_DAMAGED:
while(dist(me,ev.source)<10)
RunAwayFrom( ev.source );
endwhile
//Если кто то выбрал ее в качестве цели или ударил, она по идее
должна убегать, но ИМХО она забивает на все и дает по морде.
endcase
endif
if (ReadGameClock() >= mnext_wander)
mwanders:=mwanders+1;
wander();
mnext_wander := ReadGameClock() + 10;
if (mwanders>10)
mwanders := 0;
endif
endif
endwhile
endprogram
function greeting()
var sp:=RandomInt(6);
case(sp)
0: say("Hey, come to me, I'm looking somphinc for you.");
sleep(3);
1: say("Hey, a realy big tits to me!");
sleep(3);
2: say("Ou? you looking is very tied.");
sleep(3);
3: say("Come with me, it will fantastic!");
sleep(3);
4: say("Hello, good sir, could you spare some gold with me,
please?");
sleep(3);
5: say("If you want I have a girlfriend.");
sleep(10);
endcase
// Ну тут думаю все понятно?
endfunction
Вот, вобщем то не сложно. Теперь мозги у нее есть, теперь
создадим ее образ, пойдемте в ../config/npcdesc.cfg
и вставте следующую шнягу:
NpcTemplate girl ее темплэйт, так вы ее будете в игре вызывать
{
Name - имя рандомом, мы про это уже говорили
script girl - скрипт котором она думает что же делать.
Все что ниже довольно понятно, я остановлюсь лишь на паре
моментов.
ObjType 0x190
Color 33784
TrueColor 33784
Gender 1
Strength 200
Intelligence 200
Dexterity 200
Life 200
Mana 200
Stamina 200
Privs invul
Settings invul
TitleSuffix ", a Girl" - Это будет прописано после имени на
папердоле
AnimalLore 50
Cooking 100
Herding 40
Peacemaking 120
DetectingHidden 80
Provocation 120
Lockpicking 40
Snooping 70
Musicianship 60
Begging 30
CProp MerchantType sgirl - тип вещей которыми девушка торгует,
он прописывается в файле mrcspawn
CProp Equipt sgirl - новомодное шмотье, последний писк в веспере
alignment good - тут можно сделать ее красной и серой
guardignore 1 - гварды ее не трогают
Wrestling 100
AttackAttribute Wrestling
AttackSpeed 80
AttackDamage 50d100
Cprop AR i50
Attackhitscript :combat:npchitscript
}
Теперь перейдем в mrcspawn и там напишем:
Например будет она у нас бабушкиным золотишком приторговывать.
merchanttype girl это то, что мы прописывали в итемдеске
{
Sells gems - продает группу объектов камни
Sells jewelry - украшения
Buys jewelry - покупает украшения, камни не купит
}
Теперь само описание групп которые девушка покупает и продает
productgroup jewelry
{
item 0x1085 3 указываем объект и количество которое будет в
наличии
item 0x1086 3
item 0x1087 3
item 0x1088 3
item 0x1089 3
item 0x108a 3
}
productgroup gems
{
Item 0xF0F 5
Item 0xF10 5
Item 0xF11 5
Item 0xF13 5
Item 0xF15 5
Item 0xF16 5
Item 0xF18 5
Item 0xF25 5
Item 0xF30 5
}
Вот, впроде, все. Если что пишите, все переделаем и поправим.
Статью прислал: Slayer
Comments:
Рапота нат Ашипками - Quester (Anonymous) at 11:37:5 PM on
11/23/2002
flag := 1ж
:)
А еще я не понял что делает wander()... откель она?
os::wait_for_event( 5 ) - TYM6O4KA (Anonymous) at 12:03:31 PM on
11/24/2002
ну ты и ждать ивента поставил цифру, 5 - так и сервак лагать
начнет
comment - Atrus (Anonymous) at 11:53:18 PM on 11/25/2002
2 Quester: wander - функция из npc.em npc иногда делает шаг
вперед, периодически поворачивает. Предназначена для
беспорядочного шляния энписи в указанной области.
2 TYM6O4KA: Почему лагать? Мало? Ведь в процессе wait_for_event
процесс в спячку уходит?
HELP - Crushkov (Anonymous) at 03:44:58 PM on 4/3/2003
У меня 1 проблема скачал пол 094 а когда начинаю вендоров
ставить
они не реагируют на слова bank и buy объясни плиззз
mailto: - тРоЯн (Anonymous) at 11:41:47 AM on 9/27/2004
напиши вендор буй или по имен гаркни ему