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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
    Скрыть объявление
  2. Форум аддона "Возвращение" 2.0:
    — Обсудить игру, почитать о прохождениях и/или разрешить свои вопросы по игре вы можете в одной из тем одноименного форума. Посетить...
    — Прочитать историю изменения и/или скачать последнюю версию аддона "Возвращение", вы можете на страницах наших ресурсов. Скачать...
    Скрыть объявление

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

Тема в разделе "Модостроение", создана пользователем Xentar, 25 фев 2008.

Модераторы: Marvіn, MEG@VOLT
  1. MaGoth

    MaGoth ★★★★★★★★★★★
    Администратор

    Регистрация:
    7 янв 2005
    Сообщения:
    14.654
    Благодарности:
    6.417
    Баллы:
    740
    Пол:
    Мужской
    сцаные костыли, кругом они..
     
  2. Сигвальд

    Сигвальд Участник форума

    Регистрация:
    2 апр 2017
    Сообщения:
    161
    Благодарности:
    29
    Баллы:
    45
    Пол:
    Мужской
    Как поставить условие, что диалога не было?
     
  3. Myxomop

    Myxomop

    Регистрация:
    28 май 2005
    Сообщения:
    2.396
    Благодарности:
    1.768
    Баллы:
    355
    Пол:
    Мужской
    Восклицательный знак (!) в нужное условие.
    Например:
     
    Сигвальд поблагодарил.
  4. Сигвальд

    Сигвальд Участник форума

    Регистрация:
    2 апр 2017
    Сообщения:
    161
    Благодарности:
    29
    Баллы:
    45
    Пол:
    Мужской
    Не успел отредактировать. Так и сделал.

    Вопрос вдогонку.

    У НПЦ в инвентаре есть X предметов, после диалога они подменяются таким же количеством чего-то другого.
    Сложность в том, что X может быть любым числом...

    И как заставить НПС отдать, допустим, все стрелы, если заранее не известно, сколько их у него?

    Готика 1.
     
    Последнее редактирование: 6 дек 2017
  5. Dimus

    Dimus ★★★★★★★
    Модератор

    Регистрация:
    19 июл 2010
    Сообщения:
    3.535
    Благодарности:
    2.022
    Баллы:
    540
    Пол:
    Мужской
    Смотри уроки скриптологии, часть 1, тема 6: Функции
    Открыть спойлер
    int Npc_HasItems (c_npc n0, int itemInstance); - возвращает количество предметов itemInstance у НПС n0.
    Если хочешь, чтобы появилось сообщение о передаче предметов, используй функцию:
    int B_GiveInvItems (C_Npc giver, C_Npc taker, int itemInstance, int amount); - передать указанное кол-во amount предметов itemInstance из инвентаря НПС giver в инвентарь НПС taker.
    А если надо скрытно передать предметы, то функции:
    void Npc_RemoveInvItems (c_npc owner, int itemInstance, int amount); - указанное кол-во amount предметов itemInstance удаляется из инвентаря НПС owner и из игры;
    void CreateInvItems (c_npc n0, int n1, int n2); - создает в инвентаре НПС n0 предметы с ID n1 количеством n2.
     

    Вложения:

    • Vam_tutor.chm
      Размер файла:
      174,7 КБ
      Просмотров:
      10
    Последнее редактирование: 6 дек 2017
    Сигвальд поблагодарил.
  6. Vlad_Torop

    Vlad_Torop Участник форума

    Регистрация:
    2 май 2014
    Сообщения:
    675
    Благодарности:
    408
    Баллы:
    140
    Пол:
    Мужской
    var int VseStreli;//Вводишь переменную
    VseStreli = Npc_HasItems(self,ItRw_Arrow);//присваиваешь ей значение кол-ва предметов у НПС
    далее,делаешь с этой переменной все что хочешь:
    Npc_RemoveInvItems(self,ItRw_Arrow,VseStreli);//удаляешь из инвенторя НПС
    CreateInvItems(self,ItRw_Bolt,VseStreli);//либо заменяешь другими предметами
    B_GiveInvItems(self,other,ItRw_Arrow,VseStreli);//либо передаешь от НПС к ГГ
     
    Сигвальд поблагодарил.
  7. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Салют народ. Готика 2. Такой вопрос, есть ли у нас функция, которая удалит конкретный предмет(один) из зена ?
    Wld_RemoveItem() у меня что-то не работает, сколько я не тестил, ни разу мне единичку не присылал) Буду благодарен, за конкретный, а главное - рабочий пример этой функции, если кто использовал.

    Или может на АСТе есть ? Я посмотрел там список функций, но вроде там нет такой, хотя раньше вроде список был побольше.
     
  8. ElderGamer

    ElderGamer
    Модостроитель

    Регистрация:
    16 апр 2008
    Сообщения:
    1.657
    Благодарности:
    1.037
    Баллы:
    295
    Я не использовал. В скриптах Г1 можно найти упоминание функции, но используется она сомнительным образом в тестовых скриптах:
    Код:
    instance Lester_Bugfixbook(C_Item)
    {
       name = "Schicke Lester nach Hause";
       mainflag = ITEM_KAT_DOCS;
       flags = ITEM_MISSION;
       value = 100;
       visual = "ItWr_Book_02_05.3ds";
       material = MAT_LEATHER;
       scemeName = "MAP";
       on_state[0] = UseLester_Bugfixbook;
    };
    
    
    func void UseLester_Bugfixbook()
    {
       var int nDocID;
       var C_Npc bugfix_lester;
       nDocID = Doc_Create();
       Doc_SetPages(nDocID,2);
       Doc_SetPage(nDocID,0,"Book_Mage_L.tga",0);
       Doc_SetPage(nDocID,1,"Book_Mage_R.tga",0);
       Doc_SetFont(nDocID,-1,"font_10_book.tga");
       Doc_SetMargins(nDocID,0,275,20,30,20,1);
       Doc_PrintLine(nDocID,0,"Zwinge Baal Lukor");
       Doc_PrintLine(nDocID,0,"in den Followmode");
       Doc_PrintLines(nDocID,0,"");
       Doc_PrintLine(nDocID,0,"");
       Doc_PrintLines(nDocID,0,"");
       Doc_PrintLine(nDocID,0,"");
       Doc_SetMargins(nDocID,-1,30,20,275,20,1);
       Doc_PrintLine(nDocID,1,"");
       Doc_PrintLine(nDocID,1,"");
       Doc_PrintLines(nDocID,1,"");
       Doc_PrintLine(nDocID,1,"");
       Doc_PrintLines(nDocID,1,"");
       Doc_Show(nDocID);
       bugfix_lester = Hlp_GetNpc(PC_Psionic);
       Npc_ExchangeRoutine(bugfix_lester,"start");
       Npc_RemoveInvItem(hero,Lester_Bugfixbook);
       Wld_RemoveItem(Lester_Bugfixbook);
    };
    
    Если функция Wld_RemoveItem и работает, то основная сложность заключается в получении ссылки на предмет класса C_ITEM. Эту ссылку можно получить только в особых случаях. Например, ссылку класса C_ITEM возвращают восприятия PERC_ASSESSQUIETSOUND (упавший на землю предмет) и PERC_ASSESSTHEFT (поднятый предмет). Также есть функции, позволяющие получить ссылку на экипированное оружие и доспехи (Npc_GetEquippedMeleeWeapon, Npc_GetEquippedRangedWeapon, Npc_GetEquippedArmor, Npc_GetReadiedWeapon). Или можно получить ссылку на предмет в инвентаре непися с помощью функции Npc_GetInvItem.
     
    Haart поблагодарил.
  9. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Попробовал напрямую удалять, инстансами, как в примере. Все равно ноль шлет)
    Даже зациклил на 1000 итераций, вдруг оно в рандомном месте так удаляет, все равно ни разу единицы не было.
    Попробую еще с уникальной вещью, которая в единственном экземпляре есть... но это мне как-бы мало поможет.
     
  10. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    984
    Благодарности:
    1.051
    Баллы:
    175
    Пол:
    Мужской
    не удалишь ты инстами. функции необходимо передать непосредственно указатель на предмет. по какому признаку движок должен понять какой объект необходимо удалить?
     
  11. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Я пробовал через ищущий огонек удалять, там используется обертка item. Это очень похоже на непосредственный указатель на предмет, но в любом случае, удалять ничего не хочет. Правда я так и не нашел, где она инициализируется, так бы можно было от этого плясать. С этой обертки можно легко получить имя предмета и его прочие характеристики. Можно id получить... но это не то.

    Вроде без расширителей нельзя получить ссылку на предмет в фокусе ? Я не скриптил уже давно, так что не совсем помню)
     
  12. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    984
    Благодарности:
    1.051
    Баллы:
    175
    Пол:
    Мужской
    я не могу ответить на твой вопрос, пока ты не ответишь на мой. если в мире будет 2 копии одного предмета, как он должен выбирать между ними?
     
  13. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Откуда я знаю, я код функции не вижу.) Сидеть догадываться можно долго, а конкретного понятия - ссылка, тут вообще помоему нет.
    Но вообще, по идее, у каждого предмета должен быть свой id, или хеш, или иной идентификатор. Или координаты в конце концов... да много чего можно придумать, другое дело, что доступа к этому у нас нет.
     
  14. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    984
    Благодарности:
    1.051
    Баллы:
    175
    Пол:
    Мужской
    доступ есть ко всему. ТЗ распиши как следует.. какой предмет, зачем его удалять и тд и тп
     
  15. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Да ничего сложного, нпц(не обязательно человек) видит item, item удаляется. А идея вообще, сделать из огонька нечто вроде носильщика, видит вещь - подходит, поднимает, идет к следующей.
     
  16. ElderGamer

    ElderGamer
    Модостроитель

    Регистрация:
    16 апр 2008
    Сообщения:
    1.657
    Благодарности:
    1.037
    Баллы:
    295
    Про то и разговор. Инстанция - она одна на всех, а каждый представитель этой инстанции в игровом мире может иметь свою ссылку класса C_Item.

    Наспех посмотрел скрипты Г2. Кажется, там используется у огонька восприятие PERC_ASSESSITEM. Но вот где оно активируется, я не уловил. :oops:

    Пропиши у огонька анимацию-пустышку поднятия предмета в MDS-скрипте и используй функцию AI_TakeItem в распорядке огонька.
     
    Haart поблагодарил.
  17. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Я подумывал о чем-то таком. Просто не совсем уверен, лезть ли туда, где ничего не понимаю. Попробую конечно, спасибо.
     
  18. Gratt

    Gratt
    Модостроитель

    Регистрация:
    14 ноя 2014
    Сообщения:
    984
    Благодарности:
    1.051
    Баллы:
    175
    Пол:
    Мужской
    придется. это единственный вариант нормальной реализации без косяков и экстендеров.
    потом AI_TakeItem прописываешь в B_GetWispDetectedItem вместо Wld_PlayEffect и все.
     
    Haart поблагодарил.
  19. ElderGamer

    ElderGamer
    Модостроитель

    Регистрация:
    16 апр 2008
    Сообщения:
    1.657
    Благодарности:
    1.037
    Баллы:
    295
    Нет, не использует. Тогда я не понимаю, как он ищет предметы.

    Гм, и здесь могут быть проблемы. Дело в том, что огонёк находится в режиме кулачного боя. И в его MDS-скрипте не прописано анимаций обычного передвижения, не в боевом режиме. А в боевом режиме функция AI_TakeItem может и не сработать. :oops:
     
  20. Haart

    Haart Участник форума

    Регистрация:
    24 окт 2011
    Сообщения:
    128
    Благодарности:
    10
    Баллы:
    170
    Хм, а что хоть примерно делать то ?) Я заглянул в хуманс, нашел такой фрагмент.
    Открыть спойлер

    Код:
    // ---------------------------------------------------------------------------------------------------------------
    // Item AUFHEBEN
                ani            ("c_Stand_2_IGet_1"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    1    9)
                ani            ("c_Stand_2_IGet_2"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    21    29)
                ani            ("c_Stand_2_IGet_3"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    41    49)
                aniComb        ("t_Stand_2_IGet"        1    "s_IGet"        0.1    0.0    M.    "c_Stand_2_IGet_"            3)
    
                ani            ("c_IGet_1"                1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    10    10)
                ani            ("c_IGet_2"                1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    30    30)
                ani            ("c_IGet_3"                1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    50    50)
                aniComb        ("s_IGet"                1    "s_IGet"        0.0    0.0    M.    "c_IGet_"                    3)
    
                ani            ("c_IGet_2_Stand_1"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    11    19)
                ani            ("c_IGet_2_Stand_2"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    31    39)
                ani            ("c_IGet_2_Stand_3"        1    ""                0.0    0.0    .    "Hum_ItemGet_A03.asc"        F    51    59)
                aniComb        ("t_IGet_2_Stand"        1    ""                0.0    0.1    M.    "c_IGet_2_Stand_"            3)


    Переименовал hum на irrlight, затестил - нифига. Потом создал Irrlight_ItemGet_A03.asc, опять нифига. Ладно, поискал на компе, нашел HumanS-c_Stand_2_IGet_1.man и прочие, наделал таких для Irrlight - те что прописаны в mds, но опять нифига. Прямо ощущаю трату времени, лезу туда, где ничего не понимаю.)

    А может не работает как раз из-за этого.)
     
Модераторы: Marvіn, MEG@VOLT

Поделиться этой страницей