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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Инструкция OnDamage_Hit – модернизация урона [модостроение]

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.913
Благодарности
918
Баллы
275
освященные "Слезами Инноса" клинки паладина "изгоняют зло"
Ещё немного практики что бы закрепить теоретические знания:) Попробуем сделать магическим меч паладина после его освещения слезами инноса. Предположим он у нас будет изгонять Зло. Механику и проверку в данном примере я использую Пираней.

сделаем проверку на инстанцию оружия и на то является ли жертва врагом Паладина:
Daedalus:
func int OnDamage_Hit(var int OldDmgTotal)
{ 
    var string msg;
    if (Hlp_IsItem(item, ItMw_1H_Blessed_03) == TRUE)
    || (Hlp_IsItem(item, ItMw_2H_Blessed_03) == TRUE)
    {
        if (C_NpcIsEvil(victim) == TRUE)
        {
теперь проверю будет ли "Зло изгнано", если к ущербу добавить урон от заклинания "Repel Evil", защиту от магии в данном примере я учитывать не буду, так как это не подразумевает механика Пираней
Daedalus:
            var int NewDmgTotal;
            NewDmgTotal = OldDmgTotal + SPL_Damage_PalRepelEvil;
            //NewDmgTotal -= victim.protection[PROT_MAGIC];
            if (NewDmgTotal >= victim.attribute[ATR_HITPOINTS])
            {

если зло удаётся "изгнать" то наложим визуальный эффект от спела "Repel Evil", выведем информацию в отладчик для самоконтроля и вернём новый ущерб.

Daedalus:
                Wld_PlayEffect        ("spellFX_PalRepelEvil_COLLIDE", victim, victim, 0, 0, DAM_MAGIC, FALSE);
                msg = Str_Format("OnDamage_Hit[%s]: RepelEvi hit %s", victim.name, item.name);
                msg = Str_Format("%s [%i --> %i]", msg, OldDmgTotal, NewDmgTotal);
                Hlp_PrintConsole(msg);
                return NewDmgTotal;

старый ущерб для зла которое не получилось изгнать, и еще немного информации в отладчик и старый ущерб всем остальным врагам
Daedalus:
            };
        };
        return OldDmgTotal;
        msg = Str_Format("OnDamage_Hit[%s]: RepelEvi hit %s", victim.name, item.name);
        msg = Str_Format("%s [%i !-> %i]", msg, OldDmgTotal, NewDmgTotal);
        Hlp_PrintConsole(msg);
    };
    return OldDmgTotal;
};
 

Вложения

  • OnDamage_Hit_Blessed.zip
    631 байт · Просмотры: 13
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.898
Благодарности
534
Баллы
275
Приветствую. Возможно прописать через Union изменение принципа действия магического/огненного оружия дальнего боя, а именно:
- Чтобы вместо ограниченных/создаваемых стрел/болтов эти орудия расходовали, скажем, по 5 ед. маны. Т.е. сам снаряд из игры вообще убрать оставив лишь оружие, боезапас которого зависит от маны. Это позволит "воину" полноценно атаковать магией/огнём, а также даст дополнительную причину для прокачки данного атрибута.
?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.913
Благодарности
918
Баллы
275
а с меткостью как быть? :)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.898
Благодарности
534
Баллы
275
а с меткостью как быть? :)
Ты про%-ы навыка? За что они отвечают для арбалета? Шанс попадания?
Если так, то пока оставить как в оригинале. Пока нет нормально работающего Union-плагина на FreeAim.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.913
Благодарности
918
Баллы
275
KirTheSeeker, то есть у тебя огненный/магический лук будет иметь шанс на промах? в таком случае отнимать ману у героя будет логичнее при попадание :) так же можно "крафтить" стрелы. то есть сделать заклинание которое обычные стрелы будет превращать в огненные. или их изготавливать где нибудь. ну и накладывать какой то эффект можно при попадание. стрела молнии может например шокировать как спелл шаровая молния.
 

KirTheSeeker

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.913
Благодарности
918
Баллы
275
тогда данный плагин тебе не поможет :)
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.913
Благодарности
918
Баллы
275
Коготь Белиара "крадёт" жизни за удар
пару дней назад в известном топике поднимался вопрос о воровстве жизней при смерти НПС. в связи с чем я решил привести пример кода как "воровать" жизни за удар.
Daedalus:
//self - атакующий
//victim - атакуемый // жертва
//item - орудие убийства (может быть null)

func int OnDamage_Hit(var int OldDmgTotal)
{
    if (Hlp_StrCmp(item.name,NAME_ADDON_BELIARSWEAPON)) // коготь белиара
    {
        if (victim.guild < GIL_SEPERATOR_HUM)    // жертва человек
        {
            var int SuckEnergy;
            var int BeliarChance;
         
            // высчитываем сколько жизней отнимит удар
            if (OldDmgTotal > victim.attribute[ATR_HITPOINTS])
            {
                OldDmgTotal = victim.attribute[ATR_HITPOINTS];
            };
         
            // защита от Акеллы
            if item.count[3] != 0
            && item.count[3] != item.damageTotal
            {
                BeliarChance = item.count[3];
            }
            else if item.count[4] != 0
            &&         item.count[4] != item.damageTotal
            {
                BeliarChance = item.count[4];
            };        
            // BeliarChance принимает значение от 12 до 50. значение кратно 2.

            SuckEnergy = OldDmgTotal * BeliarChance / 200; // крадём от 6% до 25% от фактического урона
         
            if (SuckEnergy < 1)
            {
                SuckEnergy = 1;    // доп защита
            };

            Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",victim,self,0,0,0,FALSE);
            //Wld_PlayEffect("spellFX_SuckEnergy_SlowTime",victim,self,0,0,0,FALSE);
            self.attribute[ATR_HITPOINTS] += SuckEnergy;
 
            if (self.attribute[ATR_HITPOINTS] > self.attribute[ATR_HITPOINTS_MAX])
            {
                self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];
            };
         
            // отладка
            Hlp_PrintConsole(Str_Format("OnDamage_Hit[%s]: OldDmgTotal %i, BeliarChance %i, SuckEnergy %i", victim.name, OldDmgTotal, BeliarChance, SuckEnergy));
        };
    };
    return OldDmgTotal;
};

из кода выше хотел бы обратить внимание на следующее :
1) проверку по имени if (Hlp_StrCmp(item.name,NAME_ADDON_BELIARSWEAPON)) и поблагодарить ElderGamer , который когда то помог осознать глубину глубин :-D
2) процент (шанс) удара молнии я беру напрямую из item предмета. если вы что то пишите под себя и точно знаете что в инстанции предмета есть полезные для вас данные, смело берите это напрямую оттуда ;-D
3) делайте защиту от дураков. не стесняйтесь. лучше перестраховаться чем узнать что бывает "отрицательный рост".
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.898
Благодарности
534
Баллы
275
освященные "Слезами Инноса" клинки паладина "изгоняют зло"
Ещё немного практики что бы закрепить теоретические знания:) Попробуем сделать магическим меч паладина после его освещения слезами инноса. Предположим он у нас будет изгонять Зло. Механику и проверку в данном примере я использую Пираней.

сделаем проверку на инстанцию оружия и на то является ли жертва врагом Паладина:
Daedalus:
func int OnDamage_Hit(var int OldDmgTotal)
{
    var string msg;
    if (Hlp_IsItem(item, ItMw_1H_Blessed_03) == TRUE)
    || (Hlp_IsItem(item, ItMw_2H_Blessed_03) == TRUE)
    {
        if (C_NpcIsEvil(victim) == TRUE)
        {
теперь проверю будет ли "Зло изгнано", если к ущербу добавить урон от заклинания "Repel Evil", защиту от магии в данном примере я учитывать не буду, так как это не подразумевает механика Пираней
Daedalus:
            var int NewDmgTotal;
            NewDmgTotal = OldDmgTotal + SPL_Damage_PalRepelEvil;
            //NewDmgTotal -= victim.protection[PROT_MAGIC];
            if (NewDmgTotal >= victim.attribute[ATR_HITPOINTS])
            {

если зло удаётся "изгнать" то наложим визуальный эффект от спела "Repel Evil", выведем информацию в отладчик для самоконтроля и вернём новый ущерб.

Daedalus:
                Wld_PlayEffect        ("spellFX_PalRepelEvil_COLLIDE", victim, victim, 0, 0, DAM_MAGIC, FALSE);
                msg = Str_Format("OnDamage_Hit[%s]: RepelEvi hit %s", victim.name, item.name);
                msg = Str_Format("%s [%i --> %i]", msg, OldDmgTotal, NewDmgTotal);
                Hlp_PrintConsole(msg);
                return NewDmgTotal;

старый ущерб для зла которое не получилось изгнать, и еще немного информации в отладчик и старый ущерб всем остальным врагам
Daedalus:
            };
        };
        return OldDmgTotal;
        msg = Str_Format("OnDamage_Hit[%s]: RepelEvi hit %s", victim.name, item.name);
        msg = Str_Format("%s [%i !-> %i]", msg, OldDmgTotal, NewDmgTotal);
        Hlp_PrintConsole(msg);
    };
    return OldDmgTotal;
};
Подскажи, пожалуйста, как по данной методике прописать доп.урон магией для всех одноручных версий Когтя Белиара?
В B_ScHasBeliarsWeapon.d есть функция, которая, насколько я понимаю, объединяет все одноручные версии:
Daedalus:
func int C_ScHas1HBeliarsWeapon()
{
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_01))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_02))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_03))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_04))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_05))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_06))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_07))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_08))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_09))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_10))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_11))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_12))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_13))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_14))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_15))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_16))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_17))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_18))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_19))
    {
        return TRUE;
    };
    if(Npc_HasItems(hero,ItMw_BeliarWeapon_1H_20))
    {
        return TRUE;
    };
    return FALSE;
};

Но я не понимаю как её можно вписать, например, сюда:
Daedalus:
func int OnDamage_Hit(var int OldDmgTotal)
{   
    var string msg;
    
    //  Коготь Белиара 1H
    if (C_ScHas1HBeliarsWeapon = TRUE)
    && (self.attribute[ATR_MANA] >= 10)
    {   
        var int NewDmgTotal_1H_BeliarWeapon;
        NewDmgTotal_1H_BeliarWeapon = onDamage_ScalinglHit(self, victim, item, 50, 40);
        if (SPL_Damage_Deathbolt > victim.protection[PROT_MAGIC])
        {
            NewDmgTotal_1H_BeliarWeapon += SPL_Damage_Deathbolt;
            NewDmgTotal_1H_BeliarWeapon -= victim.protection[PROT_MAGIC];
            self.attribute[ATR_MANA] -= 10;
        };
        Wld_PlayEffect  ("spellFX_Deathbolt_COLLIDE", victim, victim, 0, 0, DAM_MAGIC, FALSE);
        return NewDmgTotal_1H_BeliarWeapon;
    };
    else if (self.attribute[ATR_HITPOINTS] >= 10)
    {   
        var int NewDmgTotal_1H_BeliarWeapon;
        NewDmgTotal_1H_BeliarWeapon = onDamage_ScalinglHit(self, victim, item, 50, 40);
        if (SPL_Damage_Deathbolt > victim.protection[PROT_MAGIC])
        {
            NewDmgTotal_1H_BeliarWeapon += SPL_Damage_Deathbolt;
            NewDmgTotal_1H_BeliarWeapon -= victim.protection[PROT_MAGIC];
            self.attribute[ATR_HITPOINTS] -= 10;
        };
        Wld_PlayEffect  ("spellFX_Deathbolt_COLLIDE", victim, victim, 0, 0, DAM_MAGIC, FALSE);
        return NewDmgTotal_1H_BeliarWeapon;
    };
    ...
}
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.913
Благодарности
918
Баллы
275
Но я не понимаю как её можно вписать, например, сюда:
а я не понимаю как за три года можно не освоить синтаксис
Daedalus:
//self - атакующий
//victim - атакуемый // жертва
//item - орудие убийства (может быть null)
func int OnDamage_Hit(var int OldDmgTotal)
{
    // КОГОТЬ БЕЛИАРА НАЧАЛО
    if (Hlp_StrCmp(item.name,NAME_ADDON_BELIARSWEAPON)) // все коготи белиара
    {
        if (item.flags & ITEM_SWD) // 1H
        {
            // у героя есть мана или ХП
            if (self.attribute[ATR_MANA]        >= 10)
            || (self.attribute[ATR_HITPOINTS]    >= 10)
            {
                var int NewDmgTotal_1H_BeliarWeapon;
                NewDmgTotal_1H_BeliarWeapon = onDamage_ScalinglHit(self, victim, item, 50, 40);
                if (SPL_Damage_Deathbolt > victim.protection[PROT_MAGIC])
                {
                    NewDmgTotal_1H_BeliarWeapon += SPL_Damage_Deathbolt;
                    NewDmgTotal_1H_BeliarWeapon -= victim.protection[PROT_MAGIC];
                       Wld_PlayEffect  ("spellFX_Deathbolt_COLLIDE", victim, victim, 0, 0, DAM_MAGIC, FALSE);
                    
                    if (self.attribute[ATR_MANA] >= 10)
                    {
                        self.attribute[ATR_MANA] -= 10;
                    }
                    else
                    {
                        self.attribute[ATR_HITPOINTS] -= 10;    // если у героя 10 хп, то отнимает 10 и получаем 0 хп
                        if (self.attribute[ATR_HITPOINTS] < 1)
                        {
                            self.attribute[ATR_HITPOINTS] = 1; // бережёного бог бережёт сказала монашка
                        };
                    };
                };
                return NewDmgTotal_1H_BeliarWeapon;
            };
        };
      
        if (item.flags & ITEM_2HD_SWD) // 2H
        {
      
        };
    };
    // КОГОТЬ БЕЛИАРА КОНЕЦ
  
  
  
    //...
    //....
    //....
    return OldDmgTotal;
};
Пост автоматически объединён:

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

а может быть даже так
Daedalus:
//self - атакующий
//victim - атакуемый // жертва
//item - орудие убийства (может быть null)
func int OnDamage_Hit(var int OldDmgTotal)
{
    // КОГОТЬ БЕЛИАРА НАЧАЛО
    if (Hlp_StrCmp(item.name,NAME_ADDON_BELIARSWEAPON)) // все коготи белиара
    {
        if (item.flags & ITEM_SWD) // 1H
        {
            var int NewDmgTotal_1H_BeliarWeapon;
            NewDmgTotal_1H_BeliarWeapon = onDamage_ScalinglHit(self, victim, item, 50, 40);
            
            // у героя есть мана или ХП
            if (self.attribute[ATR_MANA]        >= 10)
            || (self.attribute[ATR_HITPOINTS]    >= 10)
            {

                if (SPL_Damage_Deathbolt > victim.protection[PROT_MAGIC])
                {
                    NewDmgTotal_1H_BeliarWeapon += SPL_Damage_Deathbolt;
                    NewDmgTotal_1H_BeliarWeapon -= victim.protection[PROT_MAGIC];
                    Wld_PlayEffect  ("spellFX_Deathbolt_COLLIDE", victim, victim, 0, 0, DAM_MAGIC, FALSE);
                    
                    if (self.attribute[ATR_MANA] >= 10)
                    {
                        self.attribute[ATR_MANA] -= 10;
                    }
                    else
                    {
                        self.attribute[ATR_HITPOINTS] -= 10;    // если у героя 10 хп, то отнимает 10 и получаем 0 хп
                        if (self.attribute[ATR_HITPOINTS] < 1)
                        {
                            self.attribute[ATR_HITPOINTS] = 1; // бережёного бог бережёт сказала монашка
                        };
                    };
                };
            };
            return NewDmgTotal_1H_BeliarWeapon;
        };
      
        if (item.flags & ITEM_2HD_SWD) // 2H
        {
      
        };
    };
    // КОГОТЬ БЕЛИАРА КОНЕЦ
 
 
 
    //...
    //....
    //....
    return OldDmgTotal;
};
 
Последнее редактирование:

KirTheSeeker

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

а может быть даже так
Да, всё работает. Благодарю!
 
Сверху Снизу