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

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

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

MaGoth

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

Вложения

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

MaGoth

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

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
в скриптах есть файл где реализованы таланты(уровни владений),
Функция прибавки скила за это отвечает.
Там вызывается Npc_SetTalentSkill, которая берет из текста правильное название уровня и заодно обновляет боевые оверлеи согласно этому левелу. Так что следует иметь в виду, что нужны еще анимации 4-го уровня владения. Пример назначения уровня >=90 ниже.
Daedalus:
const string TXT_TALENTS_SKILLS[22] = {
    "",
    "Rookie|Fighter|Master|Legendary"
    ...
    
    
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,0);
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 30) {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,1);
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 60) {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,2);
        };
        if(slf.HitChance[NPC_TALENT_1H] >= 90) {
            Npc_SetTalentSkill(slf,NPC_TALENT_1H,3);
        };
    };
    ...
 

MaGoth

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

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Подскажите, пожалуйста, а что нужно добавить в данный код, чтобы освящённое оружие паладина наносило дополнительный урон именно магией Инноса, т.е. "светом" (как и прочие их заклинания, вроде святой стрелы)?
Код:
instance ItMw_1H_Blessed_02(C_Item)
{
    name = "Освященный меч паладина";
    mainflag = ITEM_KAT_NF;
    flags = ITEM_SWD | ITEM_MISSION;
    material = MAT_METAL;
    value = Value_Blessed_1H_2;
    damageTotal = Damage_Blessed_1H_2;
    damagetype = DAM_EDGE;
    range = Range_Blessed_1H_2;
    cond_atr[2] = ATR_STRENGTH;
    cond_value[2] = Condition_Blessed_1H_2;
    visual = "ItMw_030_1h_PAL_sword_bastard_RAW_01.3DS";
    description = name;
    text[2] = NAME_Damage;
    count[2] = damageTotal;
    text[3] = NAME_Str_needed;
    count[3] = cond_value[2];
    text[4] = NAME_OneHanded;
    text[5] = NAME_Value;
    count[5] = value;
};
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
что нужно добавить в данный код, чтобы освящённое оружие паладина наносило дополнительный урон именно магией Инноса, т.е. "светом"
ничего не сделаешь в готике система магии - гавно.. и есть только один тип урона магический..
с магией оно выглядело бы так::
Daedalus:
damagetype = DAM_EDGE | DAM_MAGIC;

или как в варианте Уризеля с огнем:
Daedalus:
damagetype = DAM_EDGE | DAM_FIRE;
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
тебе надо будет ставить плагин Gratt на юнион который перехватывает урон https://worldofplayers.ru/threads/40376/page-92#post-1136600

внутри функции OnDamage_Hit ты определяешь какое оружие у героя, кто враг и при необходимости наносишь доп урон.
Daedalus:
func int OnDamage_Hit(var int damageTotal)
{

    var C_Item ReadiedWeapon;     

    ReadiedWeapon = Npc_GetReadiedWeapon(self);

    if    C_NpcIsEvil(victim) == TRUE
    {
        if        Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_01) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_01) == TRUE
        {
            damageTotal += SPL_Damage_PalHolyBolt;
        }
        else if Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_02) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_02) == TRUE
        {
            damageTotal += SPL_Damage_PalRepelEvil;
        }
        else if Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_03) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_03) == TRUE
        {
            damageTotal += SPL_Damage_PalDestroyEvil;
        };
    };

    return damageTotal;
};

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

***

внутри функции кстати есть уже item и проверку можно будет сделать напрямую по ней, сократив код на пару строчек. я так пишу по старинке что бы в голове было складно.
Gratt написал(а):
self - атакующий
victim - атакуемый
item - орудие убийства (может быть null)

***

у оружия достаточно много параметров, так например проверку можно сделать по флагу оружия или по типу урона. урон можно полностью посчитать и начислить какой то полный, например от магии, а какой то частичный, например от оружия. можно сделать например не доп урон от магии , а крит от оружия как в Готики 1. или игнорировать защиту. одним словом в рамках данной функцией ограничивать тебя может только фантазия :)

***

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

***

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

Вложения

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

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.301
Благодарности
4.636
Баллы
625
и чем же оно будет отличаться ?! имхо ничем, та же ересь..
Тем что Wld_PlayEffect по своей сути и "кастует" спелл. Тут главное закодить красиво, а система нормальная. Создал частицу -> задал ей параметры и урон -> отправил в противника. А для чего-то большего да, плагин выше.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
с магией оно выглядело бы так:
damagetype = DAM_EDGE | DAM_MAGIC;
В этом случае при расчёте урона не будет учитываться значение силы. Во всяком случае, движок Г1 так работает.

или как в варианте Уризеля с огнем:
damagetype = DAM_EDGE | DAM_FIRE;
Если пройдёт урон огнём (работает рандом), пробивающий защиту жертвы от огня, последует скоротечное снижение здоровья жертвы до нуля.

и чем же оно будет отличаться ?! имхо ничем, та же ересь..
И зачем же тогда разрабы так заморочились? ;)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
А для чего-то большего да, плагин выше.
так речь и шла про стандарные решения на голых скриптах.. или я чего не понял в его вопросах ?!

И зачем же тогда разрабы так заморочились? ;)
как по мне это не существенно.. и по сути ни на что не влияет и ничего не меняет..
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
В этом случае при расчёте урона не будет учитываться значение силы. Во всяком случае, движок Г1 так работает.
значение силы будет учитываться если ты добавишь ущерб от оружия, то есть DAM_EDGE или DAM_BLUNT. в Уризеля ущерба от оружия нет, по причине указанной в комментах в MDK

Daedalus:
//    damageType                =    DAM_EDGE|DAM_FIRE|DAM_MAGIC;//Templer sollten sofort tot sein
    damageType                =    DAM_FIRE|DAM_MAGIC;
//    damageType                =    DAM_MAGIC;
//    damage[DAM_INDEX_EDGE]    =      1;                        //Templer sollten sofort tot sein
    damage[DAM_INDEX_FIRE]    =     30;
    damage[DAM_INDEX_MAGIC]    =    120;
    //damage[DAM_INDEX_MAGIC]    =    150;

***

так речь и шла про стандарные решения на голых скриптах..
Это тоже можно сделать. но оно будет ощутимо больше и не будет так просто и понятно, как с плагином Gratt
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Я как-то для эксперимента пытался ставить смешанный урон режущий/дробящий у оружия. Думал, что урон проходит одновременно, и тот, и тот. На самом деле, как я потом понял, рандомно выпадает либо один вид урона, либо другой. Не два одновременно. И, вроде бы, тогда урон оружия уменьшался. Я для себя сделал вывод, что причина в том, что перестаёт учитываться значение силы. Ну, может быть, я тогда сделал неправильный вывод. Не знаю. :)

А в приведённом примере - да, если бы разрабы прописали Уризелю ещё и режущий урон, то с некоторой вероятностью он выпадал бы и не наносил урона одним Стражам в храме Спящего или не убивал бы других Стражей.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
На самом деле, как я потом понял, рандомно выпадает либо один вид урона, либо другой
там дело в индексе урона. урон от огня лучше вообще убрать, а поджигать жертву при реакции попадания через Wld_PlayEffect. они же кстати так и не доделали и эффект от комбо удара B_SpecialCombatDamageReaction.

если огрубить то конкретно уризель проще переделать на манер когтя Белиара, в том числе из-за необходимости доп проверок для Темплаеров и шамана нежити в храме.

***

Пираньи могли бы просто переводить тамплиеров апокалипсиса из ZS_Unconscious в ZS_Dead, сделав соответствующую проверку в ZS_Unconscious на мир и гильдию или тупо по айди НПС, их там не так много . Но это нам спустя 20 лет легко на эту тему рассуждать конечно :)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
тебе надо будет ставить плагин Gratt на юнион который перехватывает урон https://worldofplayers.ru/threads/40376/page-92#post-1136600

внутри функции OnDamage_Hit ты определяешь какое оружие у героя, кто враг и при необходимости наносишь доп урон.
Daedalus:
func int OnDamage_Hit(var int damageTotal)
{

    var C_Item ReadiedWeapon;   

    ReadiedWeapon = Npc_GetReadiedWeapon(self);

    if    C_NpcIsEvil(victim) == TRUE
    {
        if        Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_01) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_01) == TRUE
        {
            damageTotal += SPL_Damage_PalHolyBolt;
        }
        else if Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_02) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_02) == TRUE
        {
            damageTotal += SPL_Damage_PalRepelEvil;
        }
        else if Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_03) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_03) == TRUE
        {
            damageTotal += SPL_Damage_PalDestroyEvil;
        };
    };

    return damageTotal;
};
Что-то я не понял как это должно работать.
Два файла из архива просто кидаются в Gothic II/System/Autorun, насколько я могу судить. Я так и сделал, но пока не заметил каких-либо изменений по урону в игре.
Что необходимо добавить/убрать?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
KirTheSeeker, а ты кого бил? там проверка стоит на силы зла ;-)
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
Если тебе нужно что то большое, например спецэффекты или какое нибудь отравление , то ты это лучше сделать после получения основного урона неписью в рамках назначенной реакции. Если брать пример выше, то эту часть
Daedalus:
{
            damageTotal += SPL_Damage_PalDestroyEvil;
        };

Ты можешь заменить на эту
Daedalus:
   {
    Npc_PercEnable      (victim,    PERC_ASSESSDAMAGE,    B_AssessDamage_ItMw_2H_Blessed_03);
    };

и в рамках B_AssessDamage_ItMw_2H_Blessed_03 наносишь ему доп урон, накладываешь какие то визуальные эффекты переводишь в какие то состояния, вообщем делаешь всё что тебе придет в голову. в твоём примере я бы сделал доп эффект как от заклинания паладина.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
KirTheSeeker, а ты кого бил? там проверка стоит на силы зла ;-)
Орков, разумеется.
Если тебе нужно что то большое, например спецэффекты или какое нибудь отравление , то ты это лучше сделать после получения основного урона неписью в рамках назначенной реакции. Если брать пример выше, то эту часть
Нет, наложение паладинских заклинаний при атаке меня вполне устраивает, разве что с первого варианта (неосвящённый клинок) логичнее кажется убрать.
Единственное, необходим какой-то визуальный эффект, который будет ясно сигнализировать о прохождении урона. Скажем, тот же стандартный "сине-белый всполох" как при попадании святой стрелы, - чтобы он появлялся на враге.
Пока что я не заметил, чтобы урон от заклинаний как-то проявлялся, но попробую ещё потестировать.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
приведу тот же код с доп эффектами
Daedalus:
func int OnDamage_Hit(var int damageTotal)
{

    var C_Item ReadiedWeapon;      

    ReadiedWeapon = Npc_GetReadiedWeapon(self);

    if    C_NpcIsEvil(victim) == TRUE
    {
        if        Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_01) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_01) == TRUE
        {
            //damageTotal += SPL_Damage_PalHolyBolt;
        }
        else if Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_02) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_02) == TRUE
        {
            //damageTotal += SPL_Damage_PalRepelEvil;
        }
        else if Hlp_IsItem(ReadiedWeapon , ItMw_1H_Blessed_03) == TRUE
        ||        Hlp_IsItem(ReadiedWeapon , ItMw_2H_Blessed_03) == TRUE
        {
            Npc_PercEnable      (victim,    PERC_ASSESSDAMAGE,    B_AssessDamage_Blessed_03);
        };
    };

    return damageTotal;
};



func void B_AssessDamage_Blessed_03 ()
{
    Npc_ClearAIQueue    (self);
    B_ClearPerceptions    (self);
    if    Npc_IsDead       (self)
    {
        return;
    };
 
    B_MagicHurtNpc (hero,self,(SPL_Damage_PalRepelEvil - self.protection[PROT_MAGIC]) );
    Wld_PlayEffect        ("spellFX_PalRepelEvil_COLLIDE", self, self, 0, 0, DAM_MAGIC, FALSE);
    //AI_StartState        (self, ZS_Blessed, 0, "");
};

проверил с "Гневом Инноса", всё работает.
Пост автоматически объединён:

можно обратить внимание на то что урон можно нанести и через Wld_PlayEffect, но тут он сделан отдельно через B_MagicHurtNpc, что бы дать возможность его дополнительно настроить через доп проверки и условия.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Пока что я не заметил, чтобы урон от заклинаний как-то проявлялся, но попробую ещё потестировать.
Итак, я был не прав - дополнительный урон всё же наносится, но почему-то только оркам. По зомби и скелетам не проходит.
Тем не менее, вне зависимости от показателя защиты от магии, и обычным и элитным оркам "Гнев Инноса" наносит лишь 15 ед. доп-о урона.
проверил с "Гневом Инноса", всё работает.
И как много урона наносится?
 
Сверху Снизу