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

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

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

MaGoth

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

Вложения

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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
А движок увидит ее там вообще?
Ну, я, например, использую эту папку для исходников текстур ВСЕГДА, кроме особых случаев. К особым случаям можно отнести необходимость скомпилить текстуру без MIP-уровней. Тогда нужно использовать вложенную папку NOMIP.

Ну так я и сохраняю (если ты это считаешь компиляцией) тестуры Gomanом.
Я называю компиляцией сохранение текстуры ХХХ.TGA в формате XXX-C.TEX с помощью ГоМана. Возможно, у такого способа есть недостатки, о которых я не знаю, но он работает. Скомпиленную Гоманом текстуру можно предложить движку, и он её примет.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Я называю компиляцией сохранение текстуры ХХХ.TGA в формате XXX-C.TEX с помощью ГоМана. Возможно, у такого способа есть недостатки, о которых я не знаю, но он работает. Скомпиленную Гоманом текстуру можно предложить движку, и он её примет.

Я именно так и делал.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200

Вложения

  • Бронь.jpg
    Бронь.jpg
    42,5 KB · Просмотры: 145

main_hero

Участник форума
Регистрация
16 Июн 2018
Сообщения
4
Благодарности
0
Баллы
150
Заранее извиняюсь за возможные ошибки в постановлении вопроса/выборе не той темы.
Где находятся формулы расчета нанесенного урона с оружия ближнего и дальнего боя? Нужна любая наводка, дальше, думаю, в соурсе найду саму формулу
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
В Соурсере ты это не найдёшь, поскольку формулы прописаны в движке. Но в скриптах можно генерировать дополнительный урон, как в случае с Когтем Белиара.
 

main_hero

Участник форума
Регистрация
16 Июн 2018
Сообщения
4
Благодарности
0
Баллы
150
Появился вопрос, как заменить инстанцию каким-нибудь числовым значением, как узнать такой числовой номер какой-либо инстанции? Например, как в часте скрипта одного мода
b_giveinvitems(self,other,8980,v_goldgiven);
b_giveinvitems(other,self,8364,Npc_HasItems(other,itat_addon_keilerfur));
Тут instance ItMi_Gold(C_ITEM) заменена числом 8980, чтобы не было b_giveinvitems(self,other,itmi_gold,v_goldgiven)
Тогда, при компиляции Соурсером, не выдает ошибки в преобразовании instance в int
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
Появился вопрос, как заменить инстанцию каким-нибудь числовым значением
Что за бред? Синтаксис дедала берет начало из языков типа Паскаля или Си, ни одно имя не имеет права начинаться с цифры. С чего вдруг возникла такая тяга к уродованию кода бессмысленными именами?

как узнать такой числовой номер какой-либо инстанции?
Инстанция и есть разыменованный id, который определяется на этапе сборки. Узнать любой идентификатор по имени можно через парсер.


заменена числом 8980, чтобы не было ...
Тогда, при компиляции Соурсером, не выдает ошибки в преобразовании instance в int ...
То что ты заменишь (нет) имя инстанции на число, не даст ничего нового. Инстанция все равно приведет твое 'число' к строковому формату, а компилятор присвоит для него собственный внутренний id.

Далее каждый созданный объект (предмет, нпс, моб ...) будет иметь свой уникальный адрес в памяти. Чтобы получить родительский идентификатор, от которого и был создан этот объект, пользуйся Hlp_GetInstanceID, результат работы этой функции и передавай в качестве аргумента.
 
Последнее редактирование:

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Хотел создать НПС-монстра - убитого ребенка из скелета гоблина.
По совету ElderGamer создал новую гильдию GIL_GOBBO_FRIENDLY.

Прописал в:
Species.d
swim_time[GIL_GOBBO_FRIENDLY] = swim_time[GIL_GOBBO];
dive_time[GIL_GOBBO_FRIENDLY] = dive_time[GIL_GOBBO];
water_depth_knee[GIL_GOBBO_FRIENDLY] = water_depth_knee[GIL_GOBBO];
water_depth_chest[GIL_GOBBO_FRIENDLY] = water_depth_chest[GIL_GOBBO];
step_height[GIL_GOBBO_FRIENDLY] = step_height[GIL_GOBBO];
jumplow_height[GIL_GOBBO_FRIENDLY] = jumplow_height[GIL_GOBBO];
jumpmid_height[GIL_GOBBO_FRIENDLY] = jumpmid_height[GIL_GOBBO];
jumpup_height[GIL_GOBBO_FRIENDLY] = jumpup_height[GIL_GOBBO];
slide_angle[GIL_GOBBO_FRIENDLY] = slide_angle[GIL_GOBBO];
turn_speed[GIL_GOBBO_FRIENDLY] = turn_speed[GIL_GOBBO];
climb_heading_angle[GIL_GOBBO_FRIENDLY] = climb_heading_angle[GIL_GOBBO];
climb_horiz_angle[GIL_GOBBO_FRIENDLY] = climb_horiz_angle[GIL_GOBBO];
climb_ground_angle[GIL_GOBBO_FRIENDLY] = climb_ground_angle[GIL_GOBBO];
falldown_height[GIL_GOBBO_FRIENDLY] = falldown_height[GIL_GOBBO];
falldown_damage[GIL_GOBBO_FRIENDLY] = falldown_damage[GIL_GOBBO];
fight_range_fist[GIL_GOBBO_FRIENDLY] = fight_range_fist[GIL_GOBBO];
fight_range_base[GIL_GOBBO_FRIENDLY] = fight_range_base[GIL_GOBBO];
fight_range_g[GIL_GOBBO_FRIENDLY] = fight_range_g[GIL_GOBBO];
blood_emitter[GIL_GOBBO_FRIENDLY] = "BFX_Skeleton";
};

Constants.d

заменил const int GIL_EMPTY_D= 15; на const int GIL_GOBBO_FRIENDLY = 15;

Text.d

TXT_GUILDS[ 66] = поменял «D» на "Дружелюбный гоблин",

в Guilds.d ничего не менял, там какая-то непонятная матрица и все.

const int TAB_ANZAHL = 256;

const int GIL_ATTITUDES[256] =
{
2,2,2,2,2,2,2,2,2,0,2,2,3,2,2,2,
2,3,3,3,3,3,2,2,2,0,2,2,3,2,2,2,
2,3,3,3,3,3,2,2,2,0,2,2,3,2,2,2,
2,2,2,2,2,2,2,2,2,0,2,2,3,2,2,2,
2,3,2,2,3,3,2,2,2,0,2,2,3,2,2,2,
2,3,3,3,3,3,2,2,2,0,2,2,3,2,2,2,
2,2,2,2,2,2,3,3,3,0,2,2,3,2,2,2,
2,2,2,2,2,2,3,3,3,0,2,2,3,2,2,2,
2,2,2,2,2,2,2,2,3,0,2,2,3,2,2,2,
0,0,0,0,0,0,0,0,0,3,2,2,0,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0,0,0,0,0,0,0,0,0,2,0,3,0,2,2,2,
3,3,3,3,3,3,3,3,3,0,2,2,3,2,3,2,
2,2,2,2,2,2,2,2,2,0,2,2,2,3,2,2,
2,2,2,3,2,2,2,2,3,0,2,2,3,2,3,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
};

Сам НПС

instance NONE_925_Iva(Mst_Default_Gobbo_Skeleton)
{
name[0] = "Ива";
guild = GIL_GOBBO_FRIENDLY;
id = 925;
voice = 18;
flags = 0;
npcType = npctype_main;
Mdl_SetVisual(self,"Gobbo.mds");
Mdl_SetVisualBody(self,"Gobbo_Skeleton_Body",DEFAULT,DEFAULT,"",DEFAULT,DEFAULT,-1);
Npc_SetToFightMode(self,ItMw_1h_Bau_Mace);
CreateInvItems (self, ItAm_Prot_Fire_01, 1);
damagetype = DAM_EDGE;
fight_tactic = FAI_GOBBO;
daily_routine = Rtn_PreStart_925;
};


func void Rtn_PreStart_925()
{
TA_Stand_WP(8,0,22,0,"NW_XARDAS_TOWER_PATH_01");
TA_Stand_WP(22,0,8,0,"NW_XARDAS_TOWER_PATH_01");
};

НПС стоит как истукан, не реагирует на удары, даже анимация смерти не проигрывается.

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

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
547
Баллы
245
Появился вопрос, как заменить инстанцию каким-нибудь числовым значением, как узнать такой числовой номер какой-либо инстанции?
Никак, так как этот самый номер инстанции создает компилятор при компиляции скрипта. Его можно узнать при декомпиляции, однако на кой это нужно? Ведь если имя заменить номером, то работать все будет до тех пор, пока ты не начнешь менять скрипты. Тогда компилятор будет создавать новые номера для инстанций, переменных и всего прочего в таблице символов дат-файла.
А чтобы правильно все сделать, воспользуйся советом Гратта
пользуйся Hlp_GetInstanceID
То, что мы видим в тексте это какой то кривой декомпил. Не подскажешь какого мода?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
заменил const int GIL_EMPTY_D= 15; на const int GIL_GOBBO_FRIENDLY = 15;
Нужен ли рыбе зонтик, нудисту галстук, а гоблину человеческая гильдия, т.к. её номер меньше разделителя между гильдиями людей и монстров?
const int GIL_SEPERATOR_HUM = 16;
Вдобавок номер этой гильдии совпадает с гильдией
const int GIL_PUBLIC = 15;
причём в комментариях скрипта Constants.d из G2 MDK написано следующее (перевод в скобках):
Код:
const int GIL_EMPTY_D                    = 15    ;    // NICHT VERWENDEN! (НЕ ИСПОЛЬЗОВАТЬ!)
//-----------------------------------------------
const int GIL_PUBLIC                    = 15    ;     // für öffentliche Portalräume (для общедоступных порталов)
//-----------------------------------------------
 
Последнее редактирование:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Тогда, при компиляции Соурсером, не выдает ошибки в преобразовании instance в int
Чтобы соурсер не выдавал таких ошибок, в каталоге \GothicSourcer\GothicSourcer\System есть RedefinedFunc.dsc (открывается блокнотом), в котором есть предопределения типов функций, в данном случае должна быть такая строка: int B_GiveInvItems(instance,instance,int#,int);

TA_Stand_WP(8,0,22,0,"NW_XARDAS_TOWER_PATH_01");
TA_Stand_WP(22,0,8,0,"NW_XARDAS_TOWER_PATH_01");
Как минимум, если глянуть ZS_Stand_WP, из которого сформирован TA_Stand_WP, то можно увидеть в нем анимации, которые применяются только к людям.
 
Последнее редактирование:

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Чтобы соурсер не выдавал таких ошибок, в каталоге \GothicSourcer\GothicSourcer\System есть RedefinedFunc.dsc (открывается блокнотом), в котором есть предопределения типов функций, в данном случае должна быть такая строка: int B_GiveInvItems(instance,instance,int#,int);


Как минимум, если глянуть ZS_Stand_WP, из которого сформирован TA_Stand_WP, то можно увидеть в нем анимации, которые применяются только к людям.

Хм.. Но TA_Stand_WP использует Ур-Шак, я поэтому и взял ее.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
заменил const int GIL_EMPTY_D= 15; на const int GIL_SEC= 15;
Как это сочетается с GIL_GOBBO_FRIENDLY?

в Guilds.d ничего не менял, там какая-то непонятная матрица и все.
Если в мод-ките к Г2 есть немецкие исходники скриптов, посмотри их, не поленись. Там должны быть комментарии, поясняющие, что это за матрица, и на кой она нужна. У твоей новой гильдии там установлены нейтральные отношения с другими человеческими гильдиями.

instance NONE_925_Iva(Mst_Default_Gobbo_Skeleton)
Попробуй создать инстанию на базе класса C_Npc, прописав там всё, что нужно из прототипа Mst_Default_Gobbo_Skeleton. Прототип имеет строку start_aistate, её нужно исключить, раз ты используешь полноценный распорядок.

Этот распорядок предписывает неписю выполнять анимации, например:
Код:
AI_PlayAni(self,"T_STAND_2_LGUARD");
Эти анимации есть у людей, но их нет у гоблинов. Возможно, причина ступора именно в этом. Попробуй в состоянии ZS_Stand_WP поставить условие на проигрывание анимаций. Или нужно создать альтернативное состояние без проигрывания анимаций и назначить его твоему скелетышу.
 

Oxbow

Участник форума
Регистрация
22 Дек 2017
Сообщения
265
Благодарности
33
Баллы
200
Нужен ли рыбе зонтик, нудисту галстук, а гоблину человеческая гильдия, т.к. её номер меньше разделителя между гильдиями людей и монстров?
const int GIL_SEPERATOR_HUM = 16;
Вдобавок номер этой гильдии совпадает с гильдией
const int GIL_PUBLIC = 15;
причём в комментариях скрипта из G2 MDK написано следующее (перевод в скобках):
Код:
const int GIL_EMPTY_D                    = 15    ;    // NICHT VERWENDEN! (НЕ ИСПОЛЬЗОВАТЬ!)
//-----------------------------------------------
const int GIL_PUBLIC                    = 15    ;     // für öffentliche Portalräume (для общедоступных порталов)
//-----------------------------------------------

Блин, а я и не заметил, просто сделал как в туториале Мегавольта.

Разве можно без новой гильдии создать мирного монстра?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Как минимум, если глянуть ZS_Stand_WP, из которого сформирован TA_Stand_WP, то можно увидеть в нем анимации, которые применяются только к людям.
Эти анимации есть у людей, но их нет у гоблинов. Возможно, причина ступора именно в этом.
Тогда почему использование человеческих анимаций в этом состоянии не приводит к ступору у представителя гильдии орков Ур-Шака? Например, я помню, как в авторских скриптах орки летали на своих мечах и топорах, потому что пытались использовать состояние бегства для людей (ZS_Flee), а не монстров (ZS_MM_Flee). Или же это может быть связано с гораздо большими ограничениями на уровне движка для гильдий монстров, нежели для гильдий людей и орков?
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
const int GIL_PUBLIC = 15;
const int GIL_EMPTY_D = 15 ; // NICHT VERWENDEN! (НЕ ИСПОЛЬЗОВАТЬ!)
Если этот скелетыш будет в единственном экземпляре, то, думаю, страшного не случится. Но нужно тестить, конечно.

Разве можно без новой гильдии создать мирного монстра?
Варианты тут разные. Есть, например, призванный скелет гоблина (GIL_SUMMONED_GOBBO_SKELETON). Но там возможно косяки ИИ, нужно тестить.

P. S. Впрочем, кажется я понял, в чём проблема. При входе во многие человеческие состояния неписю предписывается убрать оружие, например, в функции B_ResetAll. Человеческая гильдия позволяет это сделать. Но у гоблина просто нет анимаций вне боевого режима в mds-ке.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Хм.. Но TA_Stand_WP использует Ур-Шак, я поэтому и взял ее.
Действительно, но Ур-Шак при этом не впадает в ступор. Думаю для скриптпатча от Dimus/D36 для состояния ZS_Stand_WP стоит добавить исключение на орка, или написать новое на основе орочьей рутины с почесыванием задницы :D

Т.е. в случае, если для гильдии нет соответствующих анимаций, тогда ZenGin проигнорирует их, но выдаст предупреждения в журнале zSpy?
Не гильдии, а в MDS. А вообще не проверял никогда, но думаю даже если НПЦ не повиснет, то для таких ситуаций все же стоит делать исключения в ZS.
 

main_hero

Участник форума
Регистрация
16 Июн 2018
Сообщения
4
Благодарности
0
Баллы
150
Никак, так как этот самый номер инстанции создает компилятор при компиляции скрипта. Его можно узнать при декомпиляции, однако на кой это нужно? Ведь если имя заменить номером, то работать все будет до тех пор, пока ты не начнешь менять скрипты. Тогда компилятор будет создавать новые номера для инстанций, переменных и всего прочего в таблице символов дат-файла.
А чтобы правильно все сделать, воспользуйся советом Гратта

То, что мы видим в тексте это какой то кривой декомпил. Не подскажешь какого мода?
Глобал мод 1.14. А про возможные проблемы сразу понятно стало, как Гратт ответил . Но спасибо все равно *thumbs up*
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Думаю для скриптпатча от Dimus/D36 для состояния ZS_Stand_WP стоит добавить исключение на орка, или написать новое на основе орочьей рутины с почесыванием задницы :D
Пожалуйста уточни, какие анимации и в каких ZS состояниях можно задействовать для орков? Например, чесать задницу могут только стоящие орки? Например, в состоянии ZS_Stand_WP Ур-шак тупо стоит на месте без дополнительных анимаций. И доступны ли эти анимации для людей-ящеров?
 
Сверху Снизу