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

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

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

MaGoth

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

Вложения

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

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Но когда я Марвином присваиваю для ГГ, гильдию

Попробуй поменять гильдию ГГ с помощью CH, или вселись Марвином в непися нужной гильдии. Простое изменение гильдии с помощью Марвина не даёт нужного результата.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
@Vlad_Torop:
Ты немного не так понял расстановку действующих лиц: victim - жертва, self - свидетель, other - убийца. Поэтому в условии получается явная лажа: жертва - овца и вдобавок она не крутой парень, а свидетель - крестьянин. Кстати, а откуда ты взял последнее условие? Ведь правильно должно быть таким: жертва - овца и свидетель - не крутой парень. В игре есть 2 типа крутых парней: с установленной aivar[AIV_ToughGuy] (например, жители портового квартала) и приписанные к гильдиям крутых парней (наёмники, ОнДы, бандиты и пираты). Поэтому если надо исключить из списка свидетелей всех крутых, то используй функцию C_NpcIsToughGuy(self):
Код:
    if((victim.guild == GIL_SHEEP) && !C_NpcIsToughGuy(self))
    {
        if(C_WantToAttackSheepKiller(self,other))
        {
            B_Attack(self,other,AR_SheepKiller,0);
            return;
        }
        else if(C_NpcIsGateGuard(self))
        {
            B_MemorizePlayerCrime(self,other,CRIME_SHEEPKILLER);
        };
    };
А если условие должно быть другим: убийца - не крутой парень, т.е. !C_NpcIsToughGuy(other)?:confused:
 
Последнее редактирование:

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
872
Благодарности
501
Баллы
245
Кстати, а откуда ты взял последнее условие?
Акелловские скрипты,описание условий прочитал в какой-то болванке,не помню кто автор.
Там сказано,что условие victim.aivar[AIV_ToughGuy] == FALSE,означает что овца убита не крутым парнем.

В твоем коде, ты исключаешь "крутых" из списка свидетелей,мне же надо что-бы на "крутого" не кидались,если он убивает овцу.
Попробовал поставить
if((victim.guild == GIL_SHEEP) &&( other.aivar[AIV_ToughGuy] == FALSE))
{
if(C_WantToAttackSheepKiller(self,other))
{
B_Attack(self,other,AR_SheepKiller,0);
return;
};
};
,не помогает.

Попробуй поменять гильдию ГГ с помощью CH, или вселись Марвином в непися нужной гильдии. Простое изменение гильдии с помощью Марвина не даёт нужного результата.
Менял гильдию с помощью перекомпиляции скриптов,не помогает.

Все становится на свои места только если прописать " other.guild != GIL_крутых парней".
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Если всё становится на свои места, тогда покажи свой код.
 

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
872
Благодарности
501
Баллы
245
if((victim.guild == GIL_SHEEP) &&(other.guild != GIL_DJG))
{
if(C_WantToAttackSheepKiller(self,other))
{
B_Attack(self,other,AR_SheepKiller,0);
return;
};
};

PS твой вариант !C_NpcIsToughGuy(other),тоже работает.
А через, other.aivar[AIV_ToughGuy] == FALSE,не хотит.
 
Последнее редактирование:

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
IMHO не слишком удачное решение, т.к. из списка преступников исключаются только ОнДы (а не все крутые парни) и в этом случае свидетель не запоминает преступление. Если нужно сделать так, чтобы на крутых не нападали, но запоминали, что ими была убита овца, надо изменить пару скриптов:
B_AssessMurder.d:
Код:
func void B_AssessMurder()
{
    if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(other))
    {
        return;
    };
    if((Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT) && (Npc_GetDistToNpc(self,victim) > PERC_DIST_INTERMEDIAT))
    {
        return;
    };
    if((Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT) && (Npc_GetHeightToNpc(self,victim) > PERC_DIST_HEIGHT))
    {
        return;
    };
    if(!Npc_CanSeeNpcFreeLOS(self,other) && !Npc_CanSeeNpcFreeLOS(self,victim))
    {
        return;
    };
    if(B_AssessEnemy())
    {
        return;
    };
    if(victim.guild == GIL_SHEEP)
    {
        if(C_WantToAttackSheepKiller(self,other))
        {
            B_Attack(self,other,AR_SheepKiller,0);
            return;
        }
        else if(C_NpcIsGateGuard(self) || C_NpcIsToughGuy(other))
        {
            B_MemorizePlayerCrime(self,other,CRIME_SHEEPKILLER);
        };
    };
    if((other.guild > GIL_SEPERATOR_HUM) && (victim.guild > GIL_SEPERATOR_HUM))
    {
        return;
    };
    if(other.guild > GIL_SEPERATOR_HUM)
    {
        B_Attack(self,other,AR_MonsterMurderedHuman,0);
        return;
    };
    if(victim.guild > GIL_SEPERATOR_HUM)
    {
        return;
    };
    if(self.aivar[AIV_EnemyOverride] == TRUE)
    {
        self.aivar[AIV_EnemyOverride] = FALSE;
        Npc_PerceiveAll(self);
        Npc_GetNextTarget(self);
        if(Hlp_IsValidNpc(other) && !C_NpcIsDown(other))
        {
            B_Attack(self,other,AR_GuildEnemy,0);
            return;
        };
        return;
    };
    if(((Npc_GetAttitude(self,victim) == ATT_HOSTILE) || (Npc_GetAttitude(self,victim) == ATT_ANGRY)) && ((Npc_GetAttitude(self,other) == ATT_FRIENDLY) || (Npc_GetAttitude(self,other) == ATT_NEUTRAL)))
    {
        return;
    };
    if(Npc_IsPlayer(other) && (self.npcType == NPCTYPE_FRIEND))
    {
        return;
    };
    if(!C_WantToAttackMurder(self,other))
    {
        if(C_NpcIsGateGuard(self))
        {
            B_MemorizePlayerCrime(self,other,CRIME_MURDER);
        };
        return;
    };
    if((other.aivar[AIV_DropDeadAndKill] == TRUE) || (victim.aivar[AIV_DropDeadAndKill] == TRUE))
    {
        return;
    };
    if((victim.guild == GIL_DMT) || ((victim.guild == GIL_BDT) && !C_NpcBelongsToBL(victim)))
    {
        return;
    };
    B_Attack(self,other,AR_HumanMurderedHuman,0);
};
C_WantToAttackSheepKiller.d:
Код:
func int C_WantToAttackSheepKiller(var C_Npc slf,var C_Npc oth)
{
    if((slf.guild == GIL_DMT) || (slf.guild == GIL_STRF) || (slf.guild == GIL_BDT) || (slf.guild == GIL_DJG))
    {
        return FALSE;
    };
    if(slf.aivar[AIV_IGNORE_Sheepkiller] == TRUE)
    {
        return FALSE;
    };
    if(Npc_IsPlayer(oth) && (slf.npcType == NPCTYPE_FRIEND))
    {
        return FALSE;
    };
    if(C_NpcHasAttackReasonToKill(oth))
    {
        return FALSE;
    };
    if((other.guild < GIL_SEPERATOR_HUM) && (other.aivar[AIV_ATTACKREASON] != AR_NONE))
    {
        return FALSE;
    };
    if(C_NpcIsGateGuard(slf))
    {
        return FALSE;
    };
    if(C_NpcIsToughGuy(oth))
    {
        return FALSE;
    };
    return TRUE;
};
Я не стану включать это решение в неофициальное обновление, потому что считаю, что любое преступление (в т.ч. и убийство овцы) должно быть наказано не только штрафом.
 
Последнее редактирование:

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
872
Благодарности
501
Баллы
245
IMHO не слишком удачное решение, т.к. из списка преступников исключаются только ОнДы
Понял тебя,просто пытаюсь понять в чем проблема,т.к менял скрипты под себя,и мог что-то важное нечаянно удалить.
Свел скрипт к минимуму,и добавил ради эксперимента:
if((victim.guild == GIL_SHEEP) && !C_NpcIsToughGuy(other))
{
B_Attack(self,other,AR_SheepKiller,0);
};
if((victim.guild == GIL_MEATBUG) && !C_NpcIsToughGuy(other))
{
B_Attack(self,other,AR_HumanMurderedHuman,0);
};
Убиваю жука,свидетели не реагируют,как мне и нужно.
Убиваю овцу,те же свидетели нападают,и даже конкретизация гильдии убийцы в виде
other.guild != GIL_XXX, вместо !C_NpcIsToughGuy(other), не помогает.

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

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
При чём тут мясные жуки? Хочешь сделать их домашними животными? И зачем в случае убийства митбага нужно атаковать с причиной "человек убил человека" (AR_HumanMurderedHuman)?*???* Не лучше ли объединить проверку на принадлежность к GIL_SHEEP и GIL_MEATBUG в один блок условий?
if((victim.guild == GIL_SHEEP) || (victim.guild == GIL_MEATBUG))
{
...
};
Видишь в конце функции C_WantToAttackSheepKiller(slf,oth) дополнительную проверку: если убийца овцы - крутой парень, то вернуть FALSE? Сегодня я убил кучу времени для того, чтобы понять, что условие вида ((victim.guild == GIL_SHEEP) && !C_NpcIsToughGuy(other)) работает довольно криво.:(
 

jackie34

Участник форума
Регистрация
16 Июн 2013
Сообщения
10
Благодарности
0
Баллы
155
Подскажите как отыскать скрипт на "Доспехи Гомеза" в папке с игрой (Готика 2 Возвращение v 1.1)?
p.s. в файлах IT_Armor и IT_Addon_Armor где находятся все остальные доспехи, их нет!
Выручайте народ, очень надо!
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Попробуй запустить поиск по следующим строкам: EBR_ARMOR_H, ebrh.3ds, Hum_EBRS_ARMOR.asc.
 

jackie34

Участник форума
Регистрация
16 Июн 2013
Сообщения
10
Благодарности
0
Баллы
155
Попробуй запустить поиск по следующим строкам: EBR_ARMOR_H, ebrh.3ds, Hum_EBRS_ARMOR.asc.

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

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Вообще-то в скриптах "Возвращения" и модов для него нужно искать другие названия: ITAR_OreBaron_Addon и ITAR_GOMEZ_ADDON.
 

jackie34

Участник форума
Регистрация
16 Июн 2013
Сообщения
10
Благодарности
0
Баллы
155
Вообще-то в скриптах "Возвращения" и модов для него нужно искать другие названия: ITAR_OreBaron_Addon и ITAR_GOMEZ_ADDON.
ITAR_OreBaron_Addon есть, это Доспехи Рудного Барона, а вот ITAR_GOMEZ_ADDON нет, всё уже облазил!
По идеи все скрипты доспехов хранятся в IT_Armor и в IT_Addon_Armor, но там только оригинальные доспехи из Готика 2 Ночь Ворона, как я понял, а вот где из аддона, вопрос?
 
Последнее редактирование:

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Вопрос "на засыпку": во что одеты призрак Гомеза (NONE_104_GOMEZ) и труп Гомеза (ZOMBIE_ADDON_GOMEZ)?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
ITAR_OreBaron_Addon есть, это Доспехи Рудного Барона, а вот ITAR_GOMEZ_ADDON нет, всё уже облазил уже!

Гм, меня терзают смутные сомненья. Ты вручную ищешь, что ли, или таки используешь поиск по проекту Соурсера?

Если используешь поиск, а инстанция, подсказанная Димусом не находится, попробуй поискать текстовые фрагменты, которые пишутся в описании свойств доспеха в инвентаре.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Лично мне не очень нравится система поиска GothicSourcer, поэтому я предпочитаю использовать поиск из FAR manager или Total Commander. Кстати, при декомпиляции скриптов один и тот же объект может иметь название на разных регистрах, например, ITAR_GOMEZ_ADDON и itar_gomez_addon. Движку ZenGin это пофиг, т.к. он является регистронезависимым (исключение - названия waypoint и freepoint, в которых должны быть только заглавные буквы).
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Движку ZenGin это пофиг, т.к. он является регистронезависимым (исключение - названия waypoint и freepoint, в которых должны быть только заглавные буквы).
Это не так, в движке многое зависит от регистра, в том числе и отработка некоторой анимации..
 

jackie34

Участник форума
Регистрация
16 Июн 2013
Сообщения
10
Благодарности
0
Баллы
155
Гм, меня терзают смутные сомненья. Ты вручную ищешь, что ли, или таки используешь поиск по проекту Соурсера?

Если используешь поиск, а инстанция, подсказанная Димусом не находится, попробуй поискать текстовые фрагменты, которые пишутся в описании свойств доспеха в инвентаре.
Искал и в ручную и при помощи GothicSourcer, результатов не добился:(
 

BOPOH32

Участник форума
Регистрация
7 Июл 2014
Сообщения
246
Благодарности
56
Баллы
200
Доброго времени суток! Прошу дать пояснение по скриптам связанных с магией, а конкретнее с рунами! Меня интересует как изменить руны в кругах магии, то есть из 3 круга магии перенести одно заклинание и руну во 2-й круг! И как сделать что-бы в 1-й главе можно было выучить 2 круга у Галлахада(Талиасана), а то наемнику не приятно когда посылают)))) или спрошу проще: в каком скрипте можно изменить принадлежность рун к кругам
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
1. Привязка руны к кругу магии осуществляется параметром mag_circle в инстанции этой руны. Учти, что перевод руны из одного круга в другой потребует изменения диалогов с наставниками, обучающими ГГ её созданию. В качестве образца ребаланса магии рекомендую декомпилировать и изучить скрипты мода "Руны" (альтернативная ссылка).
2. Забудь об этом. Галлахад не должен обучать кругам магии наёмника, потому что это обучение разрешено только для магов (Огня, Воды и некров). Поэтому наёмник и паладин могут использовать только те руны, которые не имеют привязки к кругам магии.
 
Сверху Снизу