• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 572
Последнее редактирование модератором:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Я не настолько продвинут, чтобы читать мысли на расстоянии. ;) Информации недостаточно. Кто это - "те двое"? После какого события они должны исчезнуть? В какой локации происходит действие? и т. д.
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
Я не настолько продвинут, чтобы читать мысли на расстоянии. ;) Информации недостаточно. Кто это - "те двое"? После какого события они должны исчезнуть? В какой локации происходит действие? и т. д.
Мда... Видимо придется раскрыть вам кое какие свои секреты...

Код:
instance NONE_104_FROSIA(Npc_Default)
{
    name[0] = "Фрося";
    guild = GIL_NONE;
    id = 104;
    voice = 14;
    flags = NPC_FLAG_IMMORTAL;
    npcType = NPCTYPE_FRIEND;
    aivar[AIV_ToughGuy] = TRUE;
    aivar[AIV_ToughGuyNewsOverride] = TRUE;
    aivar[AIV_IGNORE_Murder] = TRUE;
    aivar[AIV_IGNORE_Theft] = TRUE;
    aivar[AIV_IGNORE_Sheepkiller] = TRUE;
    aivar[AIV_IgnoresArmor] = TRUE;
    B_SetAttributesToChapter(self,6);
    fight_tactic = FAI_HUMAN_MASTER;
    B_SetNpcVisual(self,MALE,"Zom_Head",0,BodyTex_N,ItAr_Sld_L);
    Mdl_SetModelFatness(self,0);
    Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");
    B_GiveNpcTalents(self);
    B_SetFightSkills(self,30);
    aivar[AIV_MagicUser] = MAGIC_ALWAYS;
    daily_routine = rtn_prestart_104;
    EquipItem(self,ItMw_1h_Vlk_Dagger);
};


func void rtn_prestart_104()
{
    TA_Stand_Sweeping(8,0,14,0,"NW_XARDAS_TOWER_IN1_26");
    TA_Read_Bookstand(14,0,15,0,"NW_XARDAS_TOWER_IN1_28");
    TA_Potion_Alchemy(15,0,16,0,"NW_XARDAS_TOWER_IN1_29");
    TA_Stand_Eating(16,0,17,0,"NW_XARDAS_TOWER_IN1_30");
    TA_Sweep_FP(17,0,18,0,"NW_XARDAS_TOWER_IN1_30");
    TA_Wash_FP(18,0,19,0,"NW_XARDAS_TOWER_IN1_31");
    TA_Sleep(19,0,8,0,"NW_XARDAS_TOWER_IN1_31");
};

func void Rtn_TOT_104()
{
    TA_Stand_Guarding(8,0,23,0,"TOT");
    TA_Stand_Guarding(23,0,8,0,"TOT");
};

Это один НПС.

Вот второй:

Код:
instance NONE_102_KREOL(Npc_Default)
{
    name[0] = "Креол";
    guild = GIL_NONE;
    id = 102;
    voice = 14;
    flags = NPC_FLAG_IMMORTAL;
    npcType = NPCTYPE_FRIEND;
    aivar[AIV_ToughGuy] = TRUE;
    aivar[AIV_ToughGuyNewsOverride] = TRUE;
    aivar[AIV_IGNORE_Murder] = TRUE;
    aivar[AIV_IGNORE_Theft] = TRUE;
    aivar[AIV_IGNORE_Sheepkiller] = TRUE;
    aivar[AIV_IgnoresArmor] = TRUE;
    B_SetAttributesToChapter(self,6);
    fight_tactic = FAI_HUMAN_MASTER;
    B_SetNpcVisual(self,MALE,"Hum_Head_Psionic",Face_N_YBerion,BodyTex_N,ITAR_Xardas);
    Mdl_SetModelFatness(self,0);
    Mdl_ApplyOverlayMds(self,"Humans_Mage.mds");
    B_GiveNpcTalents(self);
    B_SetFightSkills(self,30);
    aivar[AIV_MagicUser] = MAGIC_ALWAYS;
    daily_routine = rtn_prestart_102;
    EquipItem(self,ItMw_1h_Pal_Sword);
};


func void rtn_prestart_102()
{
    TA_Sit_Throne(8,0,14,0,"NW_XARDAS_TOWER_IN1_32");
    TA_Potion_Alchemy(14,0,15,0,"NW_XARDAS_TOWER_IN1_29");
};

func void Rtn_TOT_102()
{
    TA_Stand_Guarding(8,0,23,0,"TOT");
    TA_Stand_Guarding(23,0,8,0,"TOT");
};
А вот их 2 диалога.
Код:
1.
instance DIA_NONE_104_FROSIA_10(C_Info)
{
    npc = none_104_frosia;
    nr = 2;
    condition = dia_none_104_frosia_10_condition;
    information = dia_none_104_frosia_10_info;
    permanent = FALSE;
    description = "Я нашел Велаю";
};


func int dia_none_104_frosia_10_condition()
{
    if(Npc_KnowsInfo(other,dia_bau_842_welaja_7) && (MIS_FROSIA == LOG_Running))
    {
        return TRUE;
    };
};

func void dia_none_104_frosia_10_info()
{
    AI_Output(other,self,"DIA_None_104_Frosia_10_15_00");    //Я нашел Велаю
    MIS_FROSIA = LOG_SUCCESS;
    Log_SetTopicStatus(TOPIC_FROSIA,LOG_SUCCESS);
    B_LogEntry(TOPIC_FROSIA,"Я нашел Велаю, но она не вернется к Фросе");
    B_GivePlayerXP(300);
    AI_Output(self,other,"DIA_None_104_Frosia_10_15_01");    //Да? И что? Где она, с ней все в порядке? Что она сказала?!
    AI_Output(other,self,"DIA_None_104_Frosia_10_15_02");    //Она в порядке, и она присоединилась к наемникам.
    AI_Output(other,self,"DIA_None_104_Frosia_10_15_03");    //Прости, но она больше не вернется к тебе.Ее манит жажда приключений.И она не готова к семейной жизни.
    AI_Output(self,other,"DIA_None_104_Frosia_10_15_04");    //О, Иннос! Моя Велая... Она бросила меня! Зачем мне теперь жить!? Скажу Креолу, чтобы сделал из меня скелета воина!
    AI_Output(self,other,"DIA_None_104_Frosia_10_15_05");    //Вот! Как и обещал! Это тебе за работу!
    CreateInvItems(self,ItPo_Perm_STR,1);
    B_GiveInvItems(self,other,ItPo_Perm_STR,1);
};

2.


instance DIA_NONE_102_KREOL_6(C_Info)
{
    npc = none_102_kreol;
    nr = 2;
    condition = dia_none_102_kreol_6_condition;
    information = dia_none_102_kreol_6_info;
    permanent = FALSE;
    description = "Я поговорил с Фросей";
};


func int dia_none_102_kreol_6_condition()
{
    if(Npc_KnowsInfo(other,dia_none_104_frosia_4))
    {
        return TRUE;
    };
};

func void dia_none_102_kreol_6_info()
{
    AI_Output(other,self,"DIA_None_102_Kreol_6_15_00");    //Я поговорил с Фросей!
    AI_Output(self,other,"DIA_None_102_Kreol_6_14_01");    //И как? Надеюсь ты обьяснил этому криворукому, как надо прибирать мою комнату?
    AI_Output(other,self,"DIA_None_102_Kreol_6_15_02");    //Я думаю, ему стоит дать выходной.Он просто слишком устал.
    AI_Output(self,other,"DIA_None_102_Kreol_6_14_03");    //Хм... Выходной? Ну хорошо. И в правду, пускай отдохнет!Вот, возьми от меня это в подарок,
    MIS_KREOL = LOG_SUCCESS;
    Log_SetTopicStatus(TOPIC_KREOL,LOG_SUCCESS);
    B_LogEntry(TOPIC_KREOL,"Я научил Фросю убираться, Креол остался доволен!");
    B_GivePlayerXP(100);
    CreateInvItems(self,ItPo_Mana_01,1);
    B_GiveInvItems(self,other,ItPo_Mana_01,1);
};

В 5- ой главе оба этих НПС должны исчезнуть из башни Ксардаса. Собственно, как и он!
 
Последнее редактирование модератором:

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.167
Баллы
915
@Kreol Nekromant:
Не вижу в этом сложности, морра. Если тебе нужно, чтобы Креол и Фрося исчезли из башни Ксардаса в начале главы 5, то измени скрипт Story\B_Story\B_EnterNewWorld.d:
Код:
func void B_ENTER_NEWWORLD_Kapitel_5()
{
 if(EnterNW_Kapitel5 == FALSE)
 {
  <...>
  B_RemoveNpc(NONE_102_KREOL);
  B_RemoveNpc(NONE_104_FROSIA);
  EnterNW_Kapitel5 = TRUE;
 };
};
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
@Kreol Nekromant:
Не вижу в этом сложности, морра. Если тебе нужно, чтобы Креол и Фрося исчезли из башни Ксардаса в начале главы 5, то измени скрипт Story\B_Story\B_EnterNewWorld.d:
Код:
func void B_ENTER_NEWWORLD_Kapitel_5()
{
if(EnterNW_Kapitel5 == FALSE)
{
  <...>
  B_RemoveNpc(NONE_102_KREOL);
  B_RemoveNpc(NONE_104_FROSIA);
  EnterNW_Kapitel5 = TRUE;
};
};
Спасибо. Все заработало. Оказывается при привязке к главе нужно использовать этот файл а не стартап... Значит смогу я и НПС поставить нового с началом новой главы.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625
Kreol Nekromant,

Пользуйся пожалуйста тегом
Код:
[code]
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Посмотри, как изменился твой пост с приведёнными кусками кода после редактирования модератором. ;)
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
Посмотри, как изменился твой пост с приведёнными кусками кода после редактирования модератором. ;)
Все равно ниче не понял. Я в этом отношении человек бестолковый, ибо на форуме пишу вообще первый раз в жизни, я на форумах вообще то не сижу, и здешних обычаев не знаю...общаюсь в основном в соц сетях, там с этим делом значительно удобнее и проще, просто сейчас у меня период отдыха от сетей, и я туда не захожу, вот и пишу здесь) Я не против, если администрация будет редактировать мои вопросы))
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.937
Благодарности
1.450
Баллы
465
Я в этом отношении человек бестолковый, ибо на форуме пишу вообще первый раз в жизни, я на форумах вообще то не сижу, и здешних обычаев не знаю...
Тогда стоит прочитать это

Я не против, если администрация будет редактировать мои вопросы
В какой-то момент администрация будет против::)
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
Тогда стоит прочитать это


В какой-то момент администрация будет против::)
И тут скриптология какая то)) Да ладно не долго вам терпеть меня осталось, с понедельника уже уйду в соцсеть)

Посмотри, как изменился твой пост с приведёнными кусками кода после редактирования модератором. ;)
А вы мне не могли бы показать, как делать функцию обучения, взял для своего персонажа переписал обучение с Ли а он не учит, а просто повторяет левый диалог. Не буду уж скидывать скрипт, ибо верховным Гуру сие не нравится...
 
Последнее редактирование модератором:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
как делать функцию обучения
Гм, похоже, нужно, первым делом, рассказать, что в Соурсере есть замечательная функция - поиск по проекту. Используй поиск, и всё тайное станет явным. Такие вещи, как диалоги с обучением, в скриптах игры найти нетрудно. Смотри, разбирайся и делай также. ;)
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
Еще вопрос: Что нужно написать в условии, чтобы данный диалог появлялся в определенное время?
Код:
instance DIA_None_103_Skorpio_Noc(C_Info)
{
    npc = none_103_skorpio;
    nr = 2;
    condition = DIA_None_103_Skorpio_Noc_condition;
    information = DIA_None_103_Skorpio_Noc_info;
    permanent = FALSE;
    important = FALSE;
    description = "Ну, что, ты готов?";
};


func int DIA_None_103_Skorpio_Noc_condition()
{
    if (MIS_Skorpio == LOG_Running)
    {
        return TRUE;
    };
};

func void DIA_None_103_Skorpio_Noc_info()
{
    AI_Output(other,self,"DIA_None_103_Skorpio_Noc_15_00");    //Ну, что, ты готов?
    AI_Output(self,other,"DIA_None_103_Skorpio_Noc_05_01");    //Да! Я готов! Пошли.
    AI_StopProcessInfos(self);
    Npc_ExchangeRoutine(self,"skorpiomission");
Гм, похоже, нужно, первым делом, рассказать, что в Соурсере есть замечательная функция - поиск по проекту. Используй поиск, и всё тайное станет явным. Такие вещи, как диалоги с обучением, в скриптах игры найти нетрудно. Смотри, разбирайся и делай также. ;)
Да, все, решил уже проблему. Перепутал названия инстанций в одном месте..
 
Последнее редактирование модератором:

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
870
Благодарности
499
Баллы
230
Что нужно написать в условии, чтобы данный диалог появлялся в определенное время?
Если имеется в виду определенное время суток,то :
if(Wld_IsTime(ч,м,ч,м));,где ч.м это проверка на час,минуту начала и час,минуту окончания.
Есть еще функция Wld_GetDay(),определяющая срабатывание действий по прошествии некоторого количества дней с тех пор как состоялся определенный диалог.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.851
Благодарности
6.728
Баллы
1.625

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
Ну вот.... а я думал, что в наших рядах пополнение...
Слишком тяжелые у вас тут порядки. ))

Господа, добавил в игру новые виды еды, в частности 2 новых вида мяса, но почему то их нельзя жарить. Подскажите пожалуйста место и содержание MOBSI диалога для жарки мяса. Вот скрипты этих деликатесов.
Код:
instance ItFoMuttonRaw1(C_Item)
{
    name = "Мясо падальщика";
    mainflag = ITEM_KAT_FOOD;
    flags = ITEM_MULTI;
    value = Value_Rawmeat;
    visual = "ItFoMuttonRaw.3DS";
    material = MAT_LEATHER;
    scemeName = "MEAT";
    on_state[0] = Use_RawMeat;
    description = name;
    text[1] = "Восстанавливает 3% жизненной энергии";
    text[5] = NAME_Value;
    count[5] = Value_Rawmeat;
};


func void Use_Raw1Meat()
{
    var int hpres;
    hpres = 0 + ((self.attribute[ATR_HITPOINTS_MAX] * 3) / 100);
    Npc_ChangeAttribute(self,ATR_HITPOINTS,hpres);
    if(self.attribute[ATR_HITPOINTS] > self.attribute[ATR_HITPOINTS_MAX])
    {
        self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];
    };
};


instance ItFoMuttonRaw2(C_Item)
{
    name = "Мясо болотной крысы";
    mainflag = ITEM_KAT_FOOD;
    flags = ITEM_MULTI;
    value = Value_Rawmeat;
    visual = "ItFoMuttonRaw.3DS";
    material = MAT_LEATHER;
    scemeName = "MEAT";
    on_state[0] = Use_RawMeat;
    description = name;
    text[1] = "Восстанавливает 5% жизненной энергии";
    text[5] = NAME_Value;
    count[5] = Value_Rawmeat;
};


func void Use_Raw2Meat()
{
    var int hpres;
    hpres = 0 + ((self.attribute[ATR_HITPOINTS_MAX] * 5) / 100);
    Npc_ChangeAttribute(self,ATR_HITPOINTS,hpres);
    if(self.attribute[ATR_HITPOINTS] > self.attribute[ATR_HITPOINTS_MAX])
    {
        self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];
    };
};
 
Последнее редактирование модератором:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
пожалуйста место и содержание MOBSI диалога
Учись пользоваться поиском. Сейчас для пробы ввёл в поисковик запрос "MOBSI диалог". 5 секунд, и в моём распоряжении несколько туторов на эту тему. ;) Зачем в 101-й раз писать одно и то же? Всё уже написано.
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
Учись пользоваться поиском. Сейчас для пробы ввёл в поисковик запрос "MOBSI диалог". 5 секунд, и в моём распоряжении несколько туторов на эту тему. ;) Зачем в 101-й раз писать одно и то же? Всё уже написано.
Этот, что в поиске, я и сам видел. Но мне то нужно не зелье готовить а мясо на плите! А диалогов с "плитой" я не находил ни через один поиск уж простите)
 

Beowulf

Участник форума
Регистрация
21 Ноя 2010
Сообщения
1.937
Благодарности
1.450
Баллы
465
А диалогов с "плитой" я не находил ни через один поиск уж простите)
Это потому что в оригинале их нет.

Но мне то нужно не зелье готовить а мясо на плите!
Включай соображалку и делай свой мобси-диалог по аналогии;)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
А чем изготовление зелья принципиально отличается от жарки мяса? Особенно, если для жарки используется плита, а не сковородка на костерке.

Вот функция и диалоги жарки мяса из мод-фикса к Г1:
Код:
instance PC_Pan_1(C_Info)
{
   npc = PC_Hero;
   nr = 1;
   condition = PC_Pan_1_Condition;
   information = PC_Pan_1_Info;
   important = 0;
   permanent = 1;
   description = "Пожарить 1 кусок мяса.";
};

func int PC_Pan_1_Condition()
{
   if(PLAYER_MOBSI_PRODUCTION == MOBSI_Pan)
   {
     return TRUE;
   };
};

func void PC_Pan_1_Info()
{
   AI_StopProcessInfos(self);
   self.aivar[AIV_INVINCIBLE] = FALSE;
   PLAYER_MOBSI_PRODUCTION = MOBSI_PanEnd;
   PLAYER_MOBSI_TIMER = 10;
};


instance PC_Pan_10(C_Info)
{
   npc = PC_Hero;
   nr = 1;
   condition = PC_Pan_10_Condition;
   information = PC_Pan_10_Info;
   important = 0;
   permanent = 1;
   description = "Пожарить 10 кусков мяса.";
};

func int PC_Pan_10_Condition()
{
   if((PLAYER_MOBSI_PRODUCTION == MOBSI_Pan) && (Npc_HasItems(self,ItFoMuttonRaw) >= 9))
   {
     return TRUE;
   };
};

func void PC_Pan_10_Info()
{
   AI_StopProcessInfos(self);
   self.aivar[AIV_INVINCIBLE] = FALSE;
   Npc_RemoveInvItems(self,ItFoMuttonRaw,9);
   CreateInvItems(self,ItFoMutton,9);
   PLAYER_MOBSI_PRODUCTION = MOBSI_PanEnd;
   PLAYER_MOBSI_TIMER = 30;
};


instance PC_Pan_All(C_Info)
{
   npc = PC_Hero;
   nr = 1;
   condition = PC_Pan_All_Condition;
   information = PC_Pan_All_Info;
   important = 0;
   permanent = 1;
   description = "Пожарить все мясо.";
};

func int PC_Pan_All_Condition()
{
   if((PLAYER_MOBSI_PRODUCTION == MOBSI_Pan) && (Npc_HasItems(self,ItFoMuttonRaw) != 9))
   {
     return TRUE;
   };
};

func void PC_Pan_All_Info()
{
   AI_StopProcessInfos(self);
   self.aivar[AIV_INVINCIBLE] = FALSE;
   var int Mutton;
   Mutton = Npc_HasItems(self,ItFoMuttonRaw);
   Npc_RemoveInvItems(self,ItFoMuttonRaw,Mutton);
   CreateInvItems(self,ItFoMutton,Mutton);
   PLAYER_MOBSI_PRODUCTION = MOBSI_PanEnd;
   if(Mutton < 10)
   {
     PLAYER_MOBSI_TIMER = 10;
   }
   else if(Mutton < 30)
   {
     PLAYER_MOBSI_TIMER = 30;
   }
   else
   {
     PLAYER_MOBSI_TIMER = 60;
   };
};


func void pan_s1()
{
   if(Npc_IsPlayer(self) && !GothicEngine)
   {
     if(Npc_HasItems(self,ItFoMuttonRaw) > 0)
     {
       var int Mutton;
       var int Work1;
       var int Work2;
       var string Piece;
       Mutton = Npc_HasItems(self,ItFoMuttonRaw) + 1;
       Work1 = Mutton - (Mutton/10)*10;
       Work2 = Mutton - (Mutton/100)*100;
       if(Work1 == 1) && (Work2 != 11)
       {
         Piece = "кусок";
       }
       else if(((Work1 == 2) || (Work1 == 3) || (Work1 == 4)) && (Work2 != 12) && (Work2 != 13) && (Work2 != 14))
       {
         Piece = "куска";
       }
       else
       {
         Piece = "кусков";
       };
       PC_Pan_All.description = "Пожарить все мясо (";
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description,IntToString(Mutton));
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description," ");
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description,Piece);
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description,").");
       self.aivar[AIV_INVINCIBLE] = TRUE;
       PLAYER_MOBSI_PRODUCTION = MOBSI_Pan;
       AI_ProcessInfos(hero);
     }
     else
     {
       AI_Wait(self,1);
       B_StopUseMob(self,"PAN");
     };
   };
};

Диалоги написаны для сковороды. У неё есть такая особенность, что один кусок сырого мяса удаляется из инвентаря и один кусок жареного мяса добавляется туда в процессе выполнения анимаций взаимодействия со сковородой. Это учитывается в диалогах. Для плиты это не актуально. Также в мод-фиксе происходит пост-обработка взаимодействия в циклической функции, автоматически завершающая взаимодействие по истечении выдержки времени. На это тоже можешь не обращать внимание.
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
А чем изготовление зелья принципиально отличается от жарки мяса? Особенно, если для жарки используется плита, а не сковородка на костерке.

Вот функция и диалоги жарки мяса из мод-фикса к Г1:
Код:
instance PC_Pan_1(C_Info)
{
   npc = PC_Hero;
   nr = 1;
   condition = PC_Pan_1_Condition;
   information = PC_Pan_1_Info;
   important = 0;
   permanent = 1;
   description = "Пожарить 1 кусок мяса.";
};

func int PC_Pan_1_Condition()
{
   if(PLAYER_MOBSI_PRODUCTION == MOBSI_Pan)
   {
     return TRUE;
   };
};

func void PC_Pan_1_Info()
{
   AI_StopProcessInfos(self);
   self.aivar[AIV_INVINCIBLE] = FALSE;
   PLAYER_MOBSI_PRODUCTION = MOBSI_PanEnd;
   PLAYER_MOBSI_TIMER = 10;
};


instance PC_Pan_10(C_Info)
{
   npc = PC_Hero;
   nr = 1;
   condition = PC_Pan_10_Condition;
   information = PC_Pan_10_Info;
   important = 0;
   permanent = 1;
   description = "Пожарить 10 кусков мяса.";
};

func int PC_Pan_10_Condition()
{
   if((PLAYER_MOBSI_PRODUCTION == MOBSI_Pan) && (Npc_HasItems(self,ItFoMuttonRaw) >= 9))
   {
     return TRUE;
   };
};

func void PC_Pan_10_Info()
{
   AI_StopProcessInfos(self);
   self.aivar[AIV_INVINCIBLE] = FALSE;
   Npc_RemoveInvItems(self,ItFoMuttonRaw,9);
   CreateInvItems(self,ItFoMutton,9);
   PLAYER_MOBSI_PRODUCTION = MOBSI_PanEnd;
   PLAYER_MOBSI_TIMER = 30;
};


instance PC_Pan_All(C_Info)
{
   npc = PC_Hero;
   nr = 1;
   condition = PC_Pan_All_Condition;
   information = PC_Pan_All_Info;
   important = 0;
   permanent = 1;
   description = "Пожарить все мясо.";
};

func int PC_Pan_All_Condition()
{
   if((PLAYER_MOBSI_PRODUCTION == MOBSI_Pan) && (Npc_HasItems(self,ItFoMuttonRaw) != 9))
   {
     return TRUE;
   };
};

func void PC_Pan_All_Info()
{
   AI_StopProcessInfos(self);
   self.aivar[AIV_INVINCIBLE] = FALSE;
   var int Mutton;
   Mutton = Npc_HasItems(self,ItFoMuttonRaw);
   Npc_RemoveInvItems(self,ItFoMuttonRaw,Mutton);
   CreateInvItems(self,ItFoMutton,Mutton);
   PLAYER_MOBSI_PRODUCTION = MOBSI_PanEnd;
   if(Mutton < 10)
   {
     PLAYER_MOBSI_TIMER = 10;
   }
   else if(Mutton < 30)
   {
     PLAYER_MOBSI_TIMER = 30;
   }
   else
   {
     PLAYER_MOBSI_TIMER = 60;
   };
};


func void pan_s1()
{
   if(Npc_IsPlayer(self) && !GothicEngine)
   {
     if(Npc_HasItems(self,ItFoMuttonRaw) > 0)
     {
       var int Mutton;
       var int Work1;
       var int Work2;
       var string Piece;
       Mutton = Npc_HasItems(self,ItFoMuttonRaw) + 1;
       Work1 = Mutton - (Mutton/10)*10;
       Work2 = Mutton - (Mutton/100)*100;
       if(Work1 == 1) && (Work2 != 11)
       {
         Piece = "кусок";
       }
       else if(((Work1 == 2) || (Work1 == 3) || (Work1 == 4)) && (Work2 != 12) && (Work2 != 13) && (Work2 != 14))
       {
         Piece = "куска";
       }
       else
       {
         Piece = "кусков";
       };
       PC_Pan_All.description = "Пожарить все мясо (";
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description,IntToString(Mutton));
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description," ");
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description,Piece);
       PC_Pan_All.description = ConcatStrings(PC_Pan_All.description,").");
       self.aivar[AIV_INVINCIBLE] = TRUE;
       PLAYER_MOBSI_PRODUCTION = MOBSI_Pan;
       AI_ProcessInfos(hero);
     }
     else
     {
       AI_Wait(self,1);
       B_StopUseMob(self,"PAN");
     };
   };
};

Диалоги написаны для сковороды. У неё есть такая особенность, что один кусок сырого мяса удаляется из инвентаря и один кусок жареного мяса добавляется туда в процессе выполнения анимаций взаимодействия со сковородой. Это учитывается в диалогах. Для плиты это не актуально. Также в мод-фиксе происходит пост-обработка взаимодействия в циклической функции, автоматически завершающая взаимодействие по истечении выдержки времени. На это тоже можешь не обращать внимание.
Спасибо, конечно, но не знаю, смогу ли я это реализовать. В первый раз не зная теории это практически не возможно. Ну чтож, значит мое мясо будет употребляться только сырым. Ничего страшного))
 
Сверху Снизу