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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

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

MaGoth

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

Вложения

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

Kreol Nekr

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

Нет но есть планы. Хотел бы узнать можно ли вызывать скрипт или функцию из скрипта через плагин?
Хочу сделать такое: бинд клавиши в плагине, по нажатию клавишы выполняется нужный скрипт.

Я проверил вставку предметов, с позицией PC_HERO - глючит, предмет вставляется внутри персонажа и он не может двигаться.

В идеале я бы хотел вызывать в плагине (dll) функции скриптов, такие как Wld_InsertNpс (потому что я так и не осилил сделать это при помощи функций и классов AST).

if (KeyClick(KEY_F2)) - это вроде как работает при подключённом AST.dll (да я использую)
Не знаю, я не пользуюсь расширителями. Мне и так нормально. Просто удивительно, как вы смогли без расширителя привязать проверку на нажатие кнопки...
 

Inomoz

Участник форума
Регистрация
20 Авг 2017
Сообщения
6
Благодарности
0
Баллы
150
Не знаю, я не пользуюсь расширителями. Мне и так нормально. Просто удивительно, как вы смогли без расширителя привязать проверку на нажатие кнопки...
ну по факту я использую библиотеку AST.dll и скомпилированые скрипты (GothisSourcer 3.15 +), просто видимо не так понял.
 

Kreol Nekr

Участник форума
Регистрация
21 Ноя 2014
Сообщения
229
Благодарности
109
Баллы
190
ну по факту я использую библиотеку AST.dll и скомпилированые скрипты (GothisSourcer 3.15 +), просто видимо не так понял.
У меня была она, но почему то мод вылетал в переходных триггерах. Я делал с помощью АСТ рендер предметов. Точнее, мне делали)) Но по скольку готика не работала как надо, я пока что отказался от расширителя...
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
В идеале я бы хотел вызывать в плагине (dll) функции скриптов
[скрипт]
Код:
func void CallBack (var string message)
{
    Hlp_MessageBox (message, "My CallBack func");
};

[плагин]
Код:
void Loop ()
{
    if (KeyClick(KEY_F2))
    {
        int sym_index = parser->GetIndex("CallBack");
        if (sym_index != -1)
            parser->CallFunc (sym_index, "Called from dll");
    }
}
потому что я так и не осилил сделать это при помощи функций и классов AST
Код:
// index - id of instance, posPoint - start pos of range, 0.0f - delay
oCNpc* npc = ogame->GetSpawnManager()->SpawnNpc(index, posPoint, 0.0f);
 
Последнее редактирование:

Inomoz

Участник форума
Регистрация
20 Авг 2017
Сообщения
6
Благодарности
0
Баллы
150
[скрипт]
Код:
func void CallBack (var string message)
{
    Hlp_MessageBox (message, "My CallBack func");
};

Спасибо огромное за примеры, моды и C/C++ для меня темный лес, на первый взгляд все понятно (коллбек и спавн менеджер).
index - я так понял id нпц
posPoint - видел в примерах AST как определять позицию камеры (или типо того). Думаю разберусь.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
а до плагинов особых знаний сишки и не надо, весь гемор зарыт в ядре. пользовательский интерфейс не сложнее скрипта, если не проще.

любая инстанция в скриптах по сути и есть идентификатор, по которому движок цепляет инфу в конструктор средствами парсера.

zCVob и любой его наследник имеет матрицу из которой выковыривает положение объекта в мире. соответственно он же валиден и для неписей, предметов, воба камеры, пфх и много чего еще, и позиция определяется структурой из 3х float координат XYZ - zVEC3 (zPOINT3, zVec3D).
 

Kreol Nekr

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

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
При компиляции вылазит ошибка: Операция сравнения возможна только в "if" выражении.

Конкретно, на строку gorn.aivar[AIV_FINDABLE] == TRUE;. Она там, последняя которая, вообще не лишняя?

Код:
instance ORG_801_Lares_BringListAnteil(C_Info)
{
    npc = Org_801_Lares;
    nr = 2;
    condition = ORG_801_Lares_BringListAnteil_Condition;
    information = ORG_801_Lares_BringListAnteil_Info;
    permanent = 0;
    description = "Так конвой уже разбит? А где моя доля?";
};


func int ORG_801_Lares_BringListAnteil_Condition()
{
    if(Npc_KnowsInfo(hero,ORG_801_Lares_BringListBack))
    {
        return 1;
    };
};

func void ORG_801_Lares_BringListAnteil_Info()
{
    var C_Npc gorn;
    AI_Output(other,self,"ORG_801_Lares_BringListAnteil_15_00");    //Так конвой уже разбит? А где моя доля?
    AI_Output(self,other,"ORG_801_Lares_BringListAnteil_11_01");    //Поговори с Горном. Он отдаст тебе твою долю.
    gorn = Hlp_GetNpc(PC_Fighter);
    if(gorn.aivar[AIV_FINDABLE] == TRUE)
    {
        AI_Output(other,self,"ORG_801_Lares_BringListAnteil_15_02");    //Я знаю Горна. Он не член шайки. Он наемник и работает на магов.
        AI_Output(self,other,"ORG_801_Lares_BringListAnteil_11_03");    //Да, все верно.
        AI_Output(other,self,"ORG_801_Lares_BringListAnteil_15_04");    //Так он в деле?
        AI_Output(self,other,"ORG_801_Lares_BringListAnteil_11_05");    //Чем меньше знаешь, тем крепче спишь. Просто иди к нему и забери свою долю.
    };
    B_LogEntry(CH1_JoinNC,"Горн, наемник, каким-то образом принимал участие в налете на конвой. От него-то я и получу свою долю.");
    gorn.aivar[AIV_FINDABLE] == TRUE;
};
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.125
Благодарности
3.218
Баллы
485
==, !=, >=, <= - сравнение
= - назначение
В данном случае нужно gorn.aivar[AIV_FINDABLE] = TRUE;
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
upload_2017-11-26_22-53-24.png
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Подскажите. Квест от снафа. Завершение

Код:
func void DIA_Snaf_ZutatenSuccess_Info()
{
    AI_Output(other,self,"DIA_Snaf_ZutatenSuccess_15_00");    //Я достал все, что тебе нужно!
    AI_Output(self,other,"DIA_Snaf_ZutatenSuccess_01_01");    //Отлично! Осталось только добавить это в котел, и рагу будет готово... Погоди...
    CreateInvItems(other,ItFo_Plants_mushroom_01,3);
    B_GiveInvItems(other,self,ItFo_Plants_mushroom_01,8);
    Npc_RemoveInvItems(self,ItFo_Plants_mushroom_01,8);
    Npc_RemoveInvItems(other,ItAt_Meatbug_01,3);
    CreateInvItems(self,ItFoMeatbugragout,3);
    B_GiveInvItems(self,other,ItFoMeatbugragout,3);

Как я понял
CreateInvItems(other,ItFo_Plants_mushroom_01,3); - У Снафа в инвентаре появляются три гриба.
B_GiveInvItems(other,self,ItFo_Plants_mushroom_01,8);
Npc_RemoveInvItems(self,ItFo_Plants_mushroom_01,8);
Npc_RemoveInvItems(other,ItAt_Meatbug_01,3); - У Снафа из инвентаря забирается три гриба.
CreateInvItems(self,ItFoMeatbugragout,3); - В инвентарь ГГ добавляется три порции рагу.
B_GiveInvItems(self,other,ItFoMeatbugragout,3); - Вроде как Снаф передает ГГ три порции рагу.

Не понял с тем, что не выделено. Понятно, что это адские грибы, но почему их 8 и где изъятие мяса жука.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
где ты откопал эти скрипты??

тут порядок инстанций другой. self - это снаф.

func void AI_Output(var C_NPC npc, var C_NPC target, var string nameWAV);
гг - other
снаф - self

AI_Output(other,self,"DIA_Snaf_ZutatenSuccess_15_00"); гг (other) говорит снафу (self)
AI_Output(self,other,"DIA_Snaf_ZutatenSuccess_01_01"); снаф (self) говорит гг (other)
CreateInvItems(other,ItFo_Plants_mushroom_01,3); у гг появляется 3 гриба
B_GiveInvItems(other,self,ItFo_Plants_mushroom_01,8); гг передает 8 грибов снафу
Npc_RemoveInvItems(self,ItFo_Plants_mushroom_01,8); грибы у снафа пропадают
Npc_RemoveInvItems(other,ItAt_Meatbug_01,3); пропадает мясо жука
CreateInvItems(self,ItFoMeatbugragout,3); у снафа появляется готовая жрачка
B_GiveInvItems(self,other,ItFoMeatbugragout,3); снаф дает эту жрачку

либо для гарантии что удалятся все (вряд ли), либо изначально планировалось 8 и этот момент проглядели когда правили.

где изъятие мяса жука
ItAt_Meatbug_01 это и есть мясо жука, а не гриб. вопрос только почему нет передачи через Give....
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.236
Благодарности
2.575
Баллы
455
Npc_RemoveInvItems(other,ItAt_Meatbug_01,3); - У Снафа из инвентаря забирается три гриба.
У ГГ(other) из инвентаря удаляется три тушки мясного жука.

либо изначально планировалось 8
Хитрый математический костыль с уравнением чтобы передать 8 предметов через функцию B_GiveInvItems , которая так и напишет - "передано 8 предметов". Потому как если через эту функцию передавать 3 тушки и 5 грибов - текстовая информация будет наложена одна на другую.
 
Последнее редактирование модератором:

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
а толку если напишет конкретно про гриб? тогда уж создавать инсту с названием "Грибы и мясо жука" и ее пихать в инвентарь.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.236
Благодарности
2.575
Баллы
455

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.281
Благодарности
4.581
Баллы
625
а, ну тогда гуд
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
сцаные костыли, кругом они..
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Как поставить условие, что диалога не было?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.236
Благодарности
2.575
Баллы
455

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Не успел отредактировать. Так и сделал.

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

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

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

Готика 1.
 
Последнее редактирование модератором:
Сверху Снизу