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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

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

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

MaGoth

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

Вложения

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
То что пишу я - минимальное условие, чтобы не поломать игру. А не тонкости самого эффекта, о которых пишешь ты. Если пользователь после ухода в другую локацию приостановит эффект того же отравления, а при возвращении триггер возобновится, то это никуда негодный триггер. Такой эффект должен работать независимо от локации.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
чтобы не поломать игру
тогда в самом триггере надо ставить дополнительную проверку на игровое время и делать выход. это всё равно нужно делать даже из соображений того что герой может лечь поспать.

То что пишу я - минимальное условие, чтобы не поломать игру.
это сильно субъективно что есть "ломать игру".
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.641
Баллы
625
огда в самом триггере надо ставить дополнительную проверку на игровое время и делать выход. это всё равно нужно делать даже из соображений того что герой может лечь поспать.
Ну если человек будет заморачиваться, то почему нет. Это можно сделать как через проверку на игровое время, так и непосредственно через функции сна, изменяя состояния конкретных триггеров (вплоть до реализации удобного интерфейса по обработке активных эффектов). Как инструмент триггер может использоваться по разному, в зависимости от идеи и навыков кодера. Но в конечном счете реализация не должна противоречить теории. Я бы не хотел после десятка часов игры вернуться в какой-нибудь мир и случайно сдохнуть, запустив давно забытый локальный триггер на отравление :)
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Hello, i want to replace Gothic's 1 and Gothic's 2 default fight animation with 10 % (For Gothic 1) and 60% (For Gothic 2) for two handend and one handed weapons but i even don't know how to start with it, can someone help me? Thanks.
Daedalus:
func void B_AddFightSkill (var C_NPC slf, var int talent, var int percent)
{
    if (talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] = slf.HitChance[NPC_TALENT_1H] + percent;
       
        if (slf.HitChance[NPC_TALENT_1H] >=0)        {    Npc_SetTalentSkill (slf, NPC_TALENT_1H, 2);        };
    };
   
    if (talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] = slf.HitChance[NPC_TALENT_2H] + percent;
       
        if (slf.HitChance[NPC_TALENT_2H] >=0)        {    Npc_SetTalentSkill (slf, NPC_TALENT_2H, 2);        };
    };
   
    if (talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] = slf.HitChance[NPC_TALENT_BOW] + percent;
       
        if (slf.HitChance[NPC_TALENT_BOW] >=0)        {    Npc_SetTalentSkill (slf, NPC_TALENT_BOW, 2);    };
    };
   
    if (talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] = slf.HitChance[NPC_TALENT_CROSSBOW] + percent;
       
        if (slf.HitChance[NPC_TALENT_CROSSBOW] >=0)    {    Npc_SetTalentSkill (slf, NPC_TALENT_CROSSBOW, 2);    };
    };
};
 

jp4003

Участник форума
Регистрация
9 Дек 2022
Сообщения
8
Благодарности
0
Баллы
20
Daedalus:
func void B_AddFightSkill (var C_NPC slf, var int talent, var int percent)
{
    if (talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] = slf.HitChance[NPC_TALENT_1H] + percent;
      
        if (slf.HitChance[NPC_TALENT_1H] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_1H, 2); };
    };
  
    if (talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] = slf.HitChance[NPC_TALENT_2H] + percent;
      
        if (slf.HitChance[NPC_TALENT_2H] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_2H, 2); };
    };
  
    if (talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] = slf.HitChance[NPC_TALENT_BOW] + percent;
      
        if (slf.HitChance[NPC_TALENT_BOW] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_BOW, 2); };
    };
  
    if (talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] = slf.HitChance[NPC_TALENT_CROSSBOW] + percent;
      
        if (slf.HitChance[NPC_TALENT_CROSSBOW] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_CROSSBOW, 2); };
    };
};
Okay, and what i have to do with it for work with zModelProtoExtender?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех.
Подскажите, пожалуйста, возможно ли через скрипты и GothicSourcer немного расширить меню персонажа?
Я имею в виду, например, добавить туда вывод защиты не только "от оружия" и "от стрел", но "от рубящего"/"от колющего"/"от дробящего" и т.п.
 

jp4003

Участник форума
Регистрация
9 Дек 2022
Сообщения
8
Благодарности
0
Баллы
20
Daedalus:
func void B_AddFightSkill (var C_NPC slf, var int talent, var int percent)
{
    if (talent == NPC_TALENT_1H)
    {
        slf.HitChance[NPC_TALENT_1H] = slf.HitChance[NPC_TALENT_1H] + percent;
      
        if (slf.HitChance[NPC_TALENT_1H] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_1H, 2); };
    };
  
    if (talent == NPC_TALENT_2H)
    {
        slf.HitChance[NPC_TALENT_2H] = slf.HitChance[NPC_TALENT_2H] + percent;
      
        if (slf.HitChance[NPC_TALENT_2H] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_2H, 2); };
    };
  
    if (talent == NPC_TALENT_BOW)
    {
        slf.HitChance[NPC_TALENT_BOW] = slf.HitChance[NPC_TALENT_BOW] + percent;
      
        if (slf.HitChance[NPC_TALENT_BOW] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_BOW, 2); };
    };
  
    if (talent == NPC_TALENT_CROSSBOW)
    {
        slf.HitChance[NPC_TALENT_CROSSBOW] = slf.HitChance[NPC_TALENT_CROSSBOW] + percent;
      
        if (slf.HitChance[NPC_TALENT_CROSSBOW] >=0) { Npc_SetTalentSkill (slf, NPC_TALENT_CROSSBOW, 2); };
    };
};
Thank you so much, im used parser extender and now it working fine, love you
 

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210

Вложения

  • изображение_2022-12-09_144719103.png
    изображение_2022-12-09_144719103.png
    339,7 KB · Просмотры: 34
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех. Вопрос по скриптам неоф. обнолвения:
- Подскажите, пожалуйста, какие строки тут необходимо закомментировать чтобы в игре НЕ появлялись некоторые трупы охотников на драконов?
Daedalus:
...

var int EnterOW_Kapitel4;

func void B_ENTER_OLDWORLD_Kapitel_4()
{
    if(EnterOW_Kapitel4 == FALSE)
    {
        if(!Npc_IsDead(Engrom))
        {
            Engrom_isAlive_Kap4 = TRUE;
            B_StartOtherRoutine(Engrom,"Obsessed");
            AI_Teleport(Engrom,"OW_SAWHUT_MOLERAT_MOVEMENT");
            CreateInvItems(Engrom,ItAt_TalbinsLurkerSkin,1);
            if(hero.guild == GIL_KDF)
            {
                CreateInvItems(Engrom,ITWR_DementorObsessionBook_MIS,1);
            }
            else
            {
                B_KillNpc(VLK_4131_Engrom);
            };
            EngromIsGone = TRUE;
        };
        if(MIS_Kervo_KillLurker == LOG_SUCCESS)
        {
            B_RemoveNpc(STRF_1115_Geppert);
            B_RemoveNpc(STRF_1116_Kervo);
        }
        else
        {
            B_KillNpc(STRF_1115_Geppert);
            B_KillNpc(STRF_1116_Kervo);
            Wld_InsertNpc(Lurker,"OW_DJG_VORPOSTEN_01");
        };
        if(!Npc_IsDead(Sengrath))
        {
            B_RemoveNpc(PAL_267_Sengrath);
            Wld_InsertNpc(PAL_275_DeadSengrath,"OC1");
            B_KillNpc(PAL_275_DeadSengrath);
            Sengrath_Missing = TRUE;
        };
        B_RemoveNpc(VLK_4106_Dobar);
        B_RemoveNpc(VLK_4107_Parlaf);
        if(TschuessBilgot == TRUE)
        {
            B_RemoveNpc(VLK_4120_Bilgot);
        };
        Wld_InsertNpc(DJG_730_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_730_ToterDrachenjaeger);
        Wld_InsertNpc(DJG_735_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_735_ToterDrachenjaeger);
        Wld_InsertNpc(DJG_736_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_736_ToterDrachenjaeger);
        Wld_InsertNpc(DJG_737_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_737_ToterDrachenjaeger);
        Wld_InsertNpc(DJG_738_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_738_ToterDrachenjaeger);
        Wld_InsertNpc(DJG_739_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_739_ToterDrachenjaeger);
        Wld_InsertNpc(DJG_740_ToterDrachenjaeger,"OC1");
        B_KillNpc(DJG_740_ToterDrachenjaeger);
        B_StartOtherRoutine(Brutus,"Meatbugs");
        Wld_InsertNpc(Meatbug_Brutus1,"OC_FOLTER_SHARP");
        Wld_InsertNpc(Meatbug_Brutus2,"OC_FOLTER_SHARP");
        Wld_InsertNpc(Meatbug_Brutus3,"OC_FOLTER_SHARP");
        Wld_InsertNpc(Meatbug_Brutus4,"OC_FOLTER_SHARP");
        if(SLD_Sylvio_is_alive == TRUE)
        {
            Wld_InsertNpc(DJG_700_Sylvio,"OC1");
        };
        ...
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех вновь. Вопрос по скриптам неоф. обновления Г2 НВ:
- Хочу внедрить напарника для охранника склада порта, который будет подменять его по ночам. Подскажите, пожалуйста, возможно ли настроить напарника, используя лишь те FP и WP, которые уже есть в игре, прописав им рутина по аналогии со стражниками в нижнем городе? Или лучше править мир, добавляя каждому NPC свои WP/FP, а также кровати и т.д.?

Речь об этом парне:
Daedalus:
instance MIL_328_Miliz(Npc_Default)
{
    name[0] = "Охранник";
    guild = GIL_NONE;
    id = 328;
    voice = 8;
    flags = 0;
    npcType = npctype_main;
    aivar[AIV_DropDeadAndKill] = TRUE;
    aivar[AIV_ToughGuy] = TRUE;
    aivar[AIV_ToughGuyNewsOverride] = TRUE;
    aivar[AIV_IGNORE_Murder] = TRUE;
    aivar[AIV_IGNORE_Theft] = TRUE;
    aivar[AIV_IGNORE_Sheepkiller] = TRUE;
    B_SetAttributesToChapter(self,2);
    fight_tactic = FAI_HUMAN_STRONG;
    EquipItem(self,ITMW_1H_SWORD_LONG_01);
    B_CreateAmbientInv(self);
    B_CreateItemToSteal(self,35,ItKe_Storage,1);
    B_SetNpcVisual(self,MALE,"Hum_Head_Bald",Face_N_NormalBart17,BodyTex_N,ITAR_Leather_L);
    Mdl_SetModelFatness(self,0);
    Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");
    B_GiveNpcTalents(self);
    B_SetDifFightSkills(self,35,10,5,15);
    daily_routine = Rtn_Start_328;
};


func void Rtn_Start_328()
{
    TA_Stand_Guarding(8,0,23,0,"NW_CITY_HABOUR_HUT_03_IN_05");
    TA_Stand_Guarding(23,0,8,0,"NW_CITY_HABOUR_HUT_03_IN_05");
};
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
возможно ли настроить напарника
Вопрос с вейпоинтами, фрипоинтами и кроватями не единственный в данном случае. Во-первых, у парня есть диалоги, и нужно решить, как с ними поступить. Будет ли ночной вариант охранника реагировать на ГГ? Во-вторых, у парня в инвентаре лежит ключ от сундука с квестовым предметом. Должен ли такой же ключ присутствовать в инвентаре сменщика?

Или лучше править мир
Если есть такая возможность, то это лучше. Для выполнения распорядка охранника там используется фрипоинт "STAND". Он там один. Если нет свободного фрипоинта, то при смене караула сменщик останется на вейпоинте и будет использовать его в качестве указателя направления, куда нужно повернуться. Если вейпоинт смотрит в нужную сторону, то всё в порядке. Если нет, то лучше внести правки в файл игрового мира.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Во-первых, у парня есть диалоги, и нужно решить, как с ними поступить. Будет ли ночной вариант охранника реагировать на ГГ?
Для ночного охранника, думаю, можно просто впихнуть диалоги и реакции ополченцев (когда ГГ ночью заходит в казармы). Или вообще лишь базовое "Тебе сюда нельзя" и атаку, если ГГ не сваливает.

Во-вторых, у парня в инвентаре лежит ключ от сундука с квестовым предметом. Должен ли такой же ключ присутствовать в инвентаре сменщика?
Нет, второй ключ не нужен, ведь дневной охранник будет спать в этом же здании.

Если есть такая возможность, то это лучше. Для выполнения распорядка охранника там используется фрипоинт "STAND". Он там один.
Ладно, тогда сначала надо настроить распорядок дневного охранника.
 

iLoveHeavyMetal

Участник форума
Регистрация
15 Авг 2019
Сообщения
1.158
Благодарности
1.228
Баллы
280
Чем открываются скрипты dll Готики 3 ?
 

iLoveHeavyMetal

Участник форума
Регистрация
15 Авг 2019
Сообщения
1.158
Благодарности
1.228
Баллы
280
iLoveHeavyMetal, Ну если ты считаешь, что dll - скрипты, то забудь про свою задумку.
Файлы в папке scripts с расширением dll, лучше бы прогу назвал.
Пост автоматически объединён:

Я попытался через визуал студио, дикомпилятора вроде не хватает.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.901
Благодарности
6.777
Баллы
1.625
Файлы в папке scripts с расширением dll, лучше бы прогу назвал.
Пост автоматически объединён:

Я попытался через визуал студио, дикомпилятора вроде не хватает.
Повторяю:
если ты считаешь, что dll - скрипты, то забудь про свою задумку.
Сначала узнай, что такое файл с расширением dll, а потом уже задавай вопросы на счет скриптинга.
Что касается проги - читай раздел внимательно. В восьмой теме по важности, все есть.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Чем открываются скрипты dll Готики 3 ?
Я не знаю, как работать с библиотеками. Но если ввести твой вопрос в поисковик, исключив из него название игры, поисковик выдаст кучу ссылок на статьи. Не думаю, что даже очень компетентный человек даст тебе здесь более подробный и развёрнутый ответ, нежели то, что содержится в тех статьях.

И да, могу предположить, что в dll-файлах лежат не скрипты.
 

iLoveHeavyMetal

Участник форума
Регистрация
15 Авг 2019
Сообщения
1.158
Благодарности
1.228
Баллы
280
Я не знаю, как работать с библиотеками. Но если ввести твой вопрос в поисковик, исключив из него название игры, поисковик выдаст кучу ссылок на статьи. Не думаю, что даже очень компетентный человек даст тебе здесь более подробный и развёрнутый ответ, нежели то, что содержится в тех статьях.

И да, могу предположить, что в dll-файлах лежат не скрипты.
Спасибо, жаль не открываются данные библиотеки тем что предлагает гугл, визуал студио открывает, dll из корневой папки, с этим даже можно работать, то что в папке scripts открывает, но там просто св-ва, данные не показывает. Файлы dll из папки scripts работают в связке с ини файлами. Есть несколько настроек ини в распоряжении, но нет для них библиотек , хотелось как то понять как это работает на структуру взглянуть.
Есть ини с настройками скорости атак нпс в боях на аренах, он с обычными dll из папки scripts не работает.
 
Сверху Снизу