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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
Я виду, что остаётся только это. Но на грамотное решение не особо похоже.
вот тебе пример как Пираньи определяю коготь белиара

if (C_ScHasReadiedBeliarsWeapon()
Пост автоматически объединён:

Daedalus:
func int C_IsItemBeliarsWeapon(var C_Item Weap)
{
    if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_Raven))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_01))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_02))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_03))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_04))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_05))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_06))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_07))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_08))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_09))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_10))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_11))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_12))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_13))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_14))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_15))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_16))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_17))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_18))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_19))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_1H_20))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_01))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_02))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_03))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_04))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_05))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_06))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_07))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_08))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_09))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_10))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_11))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_12))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_13))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_14))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_15))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_16))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_17))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_18))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_19))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItMw_BeliarWeapon_2H_20))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_BeliarsRage))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_SuckEnergy))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_GreenTentacle))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_Swarm))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_Skull))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_SummonZombie))
    {
        return TRUE;
    }
    else if(Hlp_IsItem(Weap,ItRu_SummonGuardian))
    {
        return TRUE;
    };
    return FALSE;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
вот тебе пример как Пираньи определяю коготь белиара

if (C_ScHasReadiedBeliarsWeapon()
Это проверка для оружия, которое в игре строго единично, и имеет некоторые присущие лишь ему свойства.
Не лучший пример. Для единичного уникального оружия такое выглядит допустимым, на мой взгляд.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
Это проверка для оружия, которое в игре строго единично, и имеет некоторые присущие лишь ему свойства.
пираньи сделал 40 инстанций меча и проверку по 40 инстанциями перечислив их 40 раз . разве это не костыль?
 
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.197
Благодарности
3.389
Баллы
485
Возможно ли простыми средствами расширить данный список флагов, внеся туда больше типов оружия, типа "ITEM_RPR" (шпаги и рапиры), "ITEN_SPR" (копья), "ITEM_LBOW" (длинные луки) и т.д.?
Символ << это битовое смещение (сдвиг влево). 1 << 10 это десятичное 1024, 1 << 11 это десятичное 2048 и так далее. Данный список флагов тебе не нужен и расширять его не требуется. Можешь добавить любые константы для новых флагов, лишь бы они не совпадали с существующими десятичными:
Daedalus:
const int ITEM_BELIAR_1H = 4;
const int ITEM_BELIAR_2H = 13;
const int ITEM_RPR = 666;
const int ITEM_SPR = 667;
const int ITEM_LBOW = 668;

Потом добавить новые константы к флагам предметов через символ | (существующие лучше не трогать):
Daedalus:
prototype BeliarWeaponPrototype_2H(C_Item)
{
    name = NAME_ADDON_BELIARSWEAPON;
    mainflag = ITEM_KAT_NF;
    flags = ITEM_2HD_SWD | ITEM_BELIAR_2H;

И, наконец, проверять новые флаги в скриптах где нужно:
Daedalus:
var C_Item weapon;
if(Npc_HasReadiedMeleeWeapon(hero))
{
    weapon = Npc_GetReadiedWeapon(hero);
    if(weapon.flags & ITEM_BELIAR_2H)
    {
        return TRUE;
    };
};
return FALSE;

На уровне скриптов ты можешь сделать простую проверку что бы определить какое оружие
Пример, почему так лучше не делать.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
Потом добавить новые константы к флагам предметов через символ | (существующие лучше не трогать):
такое тогда лучше вписать в ID инстанции. что бы потом никто не жаловался что плагин на юнион не работает и не находит новые флаги ;-)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
такое тогда лучше вписать в ID инстанции. что бы потом никто не жаловался что плагин на юнион не работает и не находит новые флаги ;-)
Поясни, пожалуйста?
Потом добавить новые константы к флагам предметов через символ | (существующие лучше не трогать):
Т.е. просто заменить ITEM_SWD на ITEM_DAG (для кинжала, волчьих ножей и т.д.) будет не лучшим вариантом? Стоит прописывать вот таким образом:
3.png

Но почему?
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.237
Баллы
525
Можешь добавить любые константы для новых флагов, лишь бы они не совпадали с существующими десятичными
И, наконец, проверять новые флаги в скриптах где нужно:
Для скриптов это прокатит. Но не для движка. Промежуточные десятичные значения приведут к тому, что будут активны срезу несколько флагов (несколько битов переменной). А по значению битов движок смотрит, как поступить с предметом. Например, в какой слот поместить его при экипировке, в слот лука или в слот одноручного оружия. ;)

В классе C_ITEM есть неиспользуемые параметры. Вес, например. Вот их и можно использовать для дополнительных проверок в скриптах. В мод-фиксе, например, использован для служебных целей такой параметр:
Daedalus:
nameID = "Unique Item";

Это строковая переменная, и её значение можно проверить в скриптах:
Daedalus:
if(Hlp_StrCmp(EquippedWeapon.nameID,"Unique Item"))
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
В классе C_ITEM есть неиспользуемые параметры
Код:
    VAR INT        id                                ;            
    VAR STRING  name,nameID                        ;

id же не используется? :)

человеческий фактор есть везде. в самой инстанции с такой же вероятность можно неправильно вписать флаг. исключение человеческого фактора это вопрос методологии работы.
Необоснованное табуирование и рассуждения про "костыли" прекрасны лишь в литературе, например в романах серии Дюна.
Великий Джихад лишил человечество костылей, – промолвила она. – Это заставило людей развивать свой мозг. И тогда появились школы, развивающие способности человека – именно человеческие способности.
а тут говорить что так не делать, так как вот тут произошло вот то, поэтому давайте делать вот так, а именно: отредактируем старые инстанции, добавим во флаг значение которое не сможет обработать движок, потому что нам кажется что иначе сделать это костыли, и да кстати потребуется новая игра так как предметов вставленных в мир это не коснётся. а дальше классические доводы, не нравится не играй :) а потом это таким же образом сопровождать: кстати в инстанции была опечатка мы её исправили , вставьте новый предмет через марвин. а тут выяснилось тоже была ошибка. и тут тоже придётся начать новую игру. ой у нас баг, сейчас мы еще что нибудь напишем.

так что же лучше? проверка по имеющимся инстанциями или новые данные в старой инстанции? а что лучше сопровождать?
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
В классе C_ITEM есть неиспользуемые параметры. Вес, например. Вот их и можно использовать для дополнительных проверок в скриптах. В мод-фиксе, например, использован для служебных целей такой параметр:
А можно ли просто создать и добавить новый параметр [WeapType], например, с помощью Union?
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.197
Благодарности
3.389
Баллы
485
Т.е. просто заменить ITEM_SWD на ITEM_DAG (для кинжала, волчьих ножей и т.д.) будет не лучшим вариантом?
Может и можно. Я не знаю, какие флаги используются движком и как. Во всяком случае, простое добавление нового флага ко всем Когтям в неофициальном обновлении Г2НВ ничего не сломало.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.408
Благодарности
3.237
Баллы
525
id же не используется?
Вроде бы, нет. Но учше спросить у того, кто зрит в движок. :)

А можно ли просто создать и добавить новый параметр [WeapType], например, с помощью Union?
Насчёт возможностей Юнион не знаю. Но вмешиваться в класс я бы не стал. Тем более, что для проверки в скриптах существующих возможностей достаточно.

Во всяком случае, простое добавление нового флага ко всем Когтям в неофициальном обновлении Г2НВ ничего не сломало.
Можно предположить, что движок проверяет состояние флагов (битов) последовательно. От старшего к младшему или наоборот. Какой-то из найденных флагов (или первый, или последний) будет считаться единственным. Если у тебя ничего не поломалось - это везение. Наверное. :)
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
А можно ли просто создать и добавить новый параметр [WeapType], например, с помощью Union?
если ты хочешь это сделать мини плагином на Юнион который где то в ини файла будет что то брать, то лучше это всё уточнять у того кто этот плагин будет делать.

если ты будешь это реализовать на скриптах используя плагин для OnDamage_Hit то в таком случае определять оружие ты можешь или по флагу как написала D36 или как описал ElderGamer как или "на костылях" как я писал выше.

то есть тебе нужно определиться как это будет реализовано;-)
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
если ты будешь это реализовать на скриптах используя плагин для OnDamage_Hit то в таком случае определять оружие ты можешь или по флагу как написала D36
Пожалуй, попробую сначала данный вариант.

Это значит, что скрипт для "OnDamage_Hit" должен выглядеть примерно так?

Код:
var C_Item weapon;
if(Npc_HasReadiedMeleeWeapon(hero))
{
    weapon = Npc_GetReadiedWeapon(hero);
    if(weapon.flags & ITEM_SWD)
    {
        return TRUE;
    };
};
return FALSE;
 func int OnDamage_Hit(var int OldDamageTotal)
    {

        if    ITEM_RPR (item)
        {
            Hlp_PrintConsole ("Оружие ITEM_SWD");
            
            var int DamageTotal_ITEM_SWD;

            DamageTotal_ITEM_SWD =    item.DamageTotal;
            DamageTotal_ITEM_SWD += (self.attribute[ATR_DEXTERITY] * 6 / 10) ;
            DamageTotal_ITEM_SWD += (self.attribute[ATR_STRENGTH] * 6 / 10) ;
  
            return DamageTotal_ITEM_SWD;
        };

        return OldDamageTotal;
    };

Если да, то будет ли такой расчёт работать и для NPC? Ведь в коде указано "hero".
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
Ведь в коде указано "hero".
в коде указано, герой держит коготь белиара.

должен выглядеть примерно так?

наверное ты хочешь получить что то такое
Daedalus:
// self - атакующий
// victim - атакуемый
// item - орудие убийства (может быть null)
func int OnDamage_Hit(var int OldDamageTotal)
{
    if (item.flags & ITEM_SWD)
    {    
        var int DamageTotal_ITEM_SWD;
        DamageTotal_ITEM_SWD = item.DamageTotal;
        DamageTotal_ITEM_SWD += (self.attribute[ATR_DEXTERITY] * 6 / 10) ;
        DamageTotal_ITEM_SWD += (self.attribute[ATR_STRENGTH] * 6 / 10) ;
        return DamageTotal_ITEM_SWD;
    };
    return OldDamageTotal;
};
Daedalus:
func int OnDamage_Hit(var int OldDamageTotal)
{
    if (item.flags & ITEM_SWD)
    {    
        OldDamageTotal = item.DamageTotal;
        OldDamageTotal += (self.attribute[ATR_DEXTERITY] * 6 / 10) ;
        OldDamageTotal += (self.attribute[ATR_STRENGTH] * 6 / 10) ;
    };
    return OldDamageTotal;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
Daedalus:
func int OnDamage_Hit(var int OldDamageTotal)
{
    if (item.flags & ITEM_SWD)
    {  
        OldDamageTotal = item.DamageTotal;
        OldDamageTotal += (self.attribute[ATR_DEXTERITY] * 6 / 10) ;
        OldDamageTotal += (self.attribute[ATR_STRENGTH] * 6 / 10) ;
    };
    return OldDamageTotal;
};
Так, теперь этот текст достаточно добавить в скрипт Damage_Pal.d? Или как это сделать правильнее?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.003
Благодарности
973
Баллы
295
сначала ты просто проверяешь работает оно или нет. данный код сохрани в файл и добавь в папку авторан вместе с dll oDamageHelper файлом.

после этого можешь приступить к "сделать правильно" :
1) сделать отдельные функции для каждого урона прописав там формулы расчёта урона.
Daedalus:
func int DMG_ItMwDex(var C_Npc slf,var C_Npc victm, var C_Item itm)
{
    var int DamageTotal_ItMwDex;

    DamageTotal_ItMwDex =   itm.DamageTotal;
    DamageTotal_ItMwDex += (slf.attribute[ATR_DEXTERITY] * 6 / 10) ;
    DamageTotal_ItMwDex += (slf.attribute[ATR_STRENGTH] * 6 / 10) ;
 
    return DamageTotal_ItMwDex;
};

2) сделать отдельные функции для определения типа оружия
Daedalus:
func int Npc_IsEquippedItMwDex (var C_Item ItMw)
{
    var int weaponInstance;
    weaponInstance = Hlp_GetInstanceID(ItMw);

    if (weaponInstance == ItMw_1h_Vlk_Sword)       { return true; };
    if (weaponInstance == ItMw_Addon_BanditTrader) { return true; };
    if (weaponInstance == ItMw_Rapier)             { return true; };
    if (weaponInstance == ItMw_Meisterdegen)       { return true; };
        
    return false;
};
3) свести 1 и 2 в функции OnDamage_Hit

то есть на выходе функция для OnDamage_Hit для реализации твоей задумки на мой взгляд должна выглядеть примерно так
Daedalus:
func int OnDamage_Hit(var int OldDamageTotal)
{
    if (Npc_IsEquippedItMwDex(item) == true)    { return  DMG_ItMwDex(self,victim,item); };
    if (Npc_IsEquippedItMw***(item) == true)    { return  DMG_ItMw***(self,victim,item); };
    if (Npc_IsEquippedItMw***(item) == true)    { return  DMG_ItMw***(self,victim,item); };
    if (Npc_IsEquippedItMw***(item) == true)    { return  DMG_ItMw***(self,victim,item); };

    return OldDamageTotal;
};
при этом если вопрос того каким образом индефицировать оружие носит философский характер, то расчёт урона сторона практическая. с DMG_ItMw*** и ты можешь начать ;-)
Пост автоматически объединён:

добавить в скрипт Damage_Pal.d?
его тоже лучше переписать, вынеся проверку в отдельную функцию. собрал всё в один файл.
 

Вложения

  • 2022_07_17_autorun.rar
    150,6 KB · Просмотры: 6
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.930
Благодарности
559
Баллы
275
сначала ты просто проверяешь работает оно или нет. данный код сохрани в файл и добавь в папку авторан вместе с dll oDamageHelper файлом.
1.png

При таких настройках плагин не работает. В чём может быть проблема?
 
Сверху Снизу