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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
или как то по другому надо устанавливать TRADE_VALUE_MULTIPLIER ?
Daedalus:
func void DIA_Bosper_Trade_Info ()
{
    Hlp_PrintConsole("DIA_Bosper_Trade_Info..");
    TRADE_VALUE_MULTIPLIER  = 1;
    DIA_Bosper_Trade_Info_old();
};
 

Вложения

  • autorun.zip
    612 байт · Просмотры: 1

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Приветствую всех, хочется организовать дополнительный эффект Когтю Белиара, чтобы при убийстве (не оглушении) противника Когтем у ГГ восполнялось здоровье (если убито живое существо) или мана (если убита нежить/голем или т.п. магическое существо) в размере 20% от макс. HP убитого.
Хвала WoOliN - нашёлся рабочий вариант через ZS_Dead.d:
Daedalus:
func void ZS_Dead()
{
    var C_Item readyweap;
    self.aivar[AIV_RANSACKED] = FALSE;
    self.aivar[AIV_PARTYMEMBER] = FALSE;
    B_StopLookAt(self);
    AI_StopPointAt(self);
    
    if(C_ScHasReadiedBeliarsWeapon()
    && (hero.attribute[ATR_HITPOINTS] > 0)
    && (hero.attribute[ATR_HITPOINTS] < hero.attribute[ATR_HITPOINTS_MAX])
    && !C_NpcIsUndead(self))
    {
        Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",self,hero,0,0,0,FALSE);
        Npc_ChangeAttribute(hero,ATR_HITPOINTS,(self.attribute[ATR_HITPOINTS_MAX] / 5));
    };
    ...

Подскажите, пожалуйста, как правильно прописать рост процента поглощаемого НР соответственно уровню прокачки Когтя Белиара (BeliarWeapCurrentLvL)?

Я попробовал данный вариант, но он не срабатывает:
Daedalus:
func void ZS_Dead()
{
    var C_Item readyweap;
    var int BeliarWeapSuckEnergy;
    BeliarWeapSuckEnergy = BeliarWeapCurrentLvL / 100;
    self.aivar[AIV_RANSACKED] = FALSE;
    self.aivar[AIV_PARTYMEMBER] = FALSE;
    B_StopLookAt(self);
    AI_StopPointAt(self);
    
    if(C_ScHasReadiedBeliarsWeapon()
    && (hero.attribute[ATR_HITPOINTS] > 0)
    && (hero.attribute[ATR_HITPOINTS] < hero.attribute[ATR_HITPOINTS_MAX])
    && !C_NpcIsUndead(self))
    {
        Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",self,hero,0,0,0,FALSE);
        Npc_ChangeAttribute(hero,ATR_HITPOINTS,(self.attribute[ATR_HITPOINTS_MAX] * BeliarWeapSuckEnergy));
    };
    ...
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
KirTheSeeker, ZS_Dead не трогай вообще. Оставь эту функцию в покое, и верни ее в первоначальное состояние.
Тебе нужна функция B_DragonKillCounter, вот в ней проводи все свои манипуляции.
Что такое BeliarWeapSuckEnergy ?
Я знаю, что есть вот такое: BeliarWeapCurrentLvL
И тебе нужно чтобы восполнялось а не прибавлялось. Соответственно вот так:
Npc_ChangeAttribute(hero,ATR_HITPOINTS,(self.attribute * BeliarWeapCurrentLvL));
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
процент высасывания
Это целое число. А ты пытаешься из неё сделать процент, то есть не целое число. Так не получится. Или используй новую переменную как целое число или используй тип float.
Пост автоматически объединён:

Ещё посмотри что у тебя внутри проверки C_ScHasReadiedBeliarsWeapon
Self или hero
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Если брать вот это:
в размере 20% от макс. HP убитого.
+ то, что написал я, + то что написал MW 7,
То это примерно получается так:
в B_DragonKillCounter добавляешь:
BeliarWeapSuckEnergy = current_dragon.attribute[ATR_HITPOINTS_MAX] / 5;
Npc_ChangeAttribute(hero,ATR_HITPOINTS, BeliarWeapSuckEnergy) ;
Примерно так...
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
@KirTheSeeker, ты Дункана Маклауда добавляешь? :rolleyes:
Нет, просто хочется, чтобы функционал заклинаний Когтя как-то присутствовал и в мече.
Пост автоматически объединён:

Такой вариант не работает:

Daedalus:
func void B_DragonKillCounter(var C_Npc current_dragon)
{   
    var int BeliarWeapSuckEnergy;
    BeliarWeapSuckEnergy = current_dragon.attribute[ATR_HITPOINTS_MAX] / 5;
    
    if(C_ScHasReadiedBeliarsWeapon()
    && (hero.attribute[ATR_HITPOINTS] > 0)
    && (hero.attribute[ATR_HITPOINTS] < hero.attribute[ATR_HITPOINTS_MAX])
    && !C_NpcIsUndead(self))
    {
        Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",self,hero,0,0,0,FALSE);
        Npc_ChangeAttribute(hero,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    };
    ...
В чём может быть проблема?
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
Вот тут:
Daedalus:
    && !C_NpcIsUndead(self))
    {
        Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",self,hero,0,0,0,FALSE);
        Npc_ChangeAttribute(hero,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    };
Яж говорю, что все SELF'ы - это current_dragon
вот так должно быть:
Daedalus:
    && !C_NpcIsUndead(current_dragon))
    {
        Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",current_dragon,hero,0,0,0,FALSE);
        Npc_ChangeAttribute(hero,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    };
 

MW 7


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

Daedalus:
// slf - жертва
// oth - агрессор
func void C_BeliarWeapSuckEnergy(var C_Npc slf,var C_Npc oth)
{   
    // выход если
    if (Npc_IsPlayer(oth) == false)                                            { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] <= 0)                                    { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] >= oth.attribute[ATR_HITPOINTS_MAX])    { return FALSE; };
    if (C_ScHasReadiedBeliarsWeapon() == false)                                { return FALSE; };
    if (C_NpcIsUndead(slf) == true)                                            { return FALSE; };
    
    
    var int BeliarWeapSuckEnergy;
    BeliarWeapSuckEnergy = slf.attribute[ATR_HITPOINTS_MAX] * BeliarWeapCurrentLvL / 100;
    
    Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",slf,oth,0,0,0,FALSE);
    Npc_ChangeAttribute(oth,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    //oth.attribute[ATR_HITPOINTS] += BeliarWeapSuckEnergy;
    
    return true;
};
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
там еще надо проверку делать на то что убийца это герой.

Daedalus:
// slf - жертва
// oth - агрессор
func void C_BeliarWeapSuckEnergy(var C_Npc slf,var C_Npc oth)
{  
    // выход если
    if (Npc_IsPlayer(oth) == false)                                            { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] <= 0)                                    { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] >= oth.attribute[ATR_HITPOINTS_MAX])    { return FALSE; };
    if (C_ScHasReadiedBeliarsWeapon() == false)                                { return FALSE; };
    if (C_NpcIsUndead(slf) == true)                                            { return FALSE; };
   
   
    var int BeliarWeapSuckEnergy;
    BeliarWeapSuckEnergy = slf.attribute[ATR_HITPOINTS_MAX] * BeliarWeapCurrentLvL / 100;
   
    Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",slf,oth,0,0,0,FALSE);
    Npc_ChangeAttribute(oth,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    //oth.attribute[ATR_HITPOINTS] += BeliarWeapSuckEnergy;
   
    return true;
};
На такой вариант отладчик ругается:
Daedalus:
func void C_BeliarWeapSuckEnergy(var C_Npc slf,var C_Npc oth)
{   
    // выход если
  [B][COLOR=rgb(255, 0, 0)]  if (Npc_IsPlayer(oth) == false)                                            { return FALSE; };[/COLOR][/B]
    if (oth.attribute[ATR_HITPOINTS] <= 0)                                    { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] >= oth.attribute[ATR_HITPOINTS_MAX])    { return FALSE; };
    if (C_ScHasReadiedBeliarsWeapon() == false)                                { return FALSE; };
    if (C_NpcIsUndead(slf) == true)                                            { return FALSE; };
    
    
    var int BeliarWeapSuckEnergy;
    BeliarWeapSuckEnergy = slf.attribute[ATR_HITPOINTS_MAX] * BeliarWeapCurrentLvL / 100;
    
    Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",slf,oth,0,0,0,FALSE);
    Npc_ChangeAttribute(oth,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    //oth.attribute[ATR_HITPOINTS] += BeliarWeapSuckEnergy;
    
    return true;
};

func void B_DragonKillCounter(var C_Npc current_dragon)
{       
   ...

1.png
Не понимаю что ему там не нравится.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
func int C_BeliarWeapSuckEnergy
При таком варианте игра запустилась, но высасывания всё ещё не происходит (ни прибавки, ни визуального эффекта).
Попробую поменять все slf на current_dragon... Хотя нет, это же другая функция.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
а где ты вызываешь C_BeliarWeapSuckEnergy ?
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
а где ты вызываешь C_BeliarWeapSuckEnergy ?
В том же B_DragonKillCounter.d, но до func void B_DragonKillCounter.
Daedalus:
var int SwampDragonIsDead;
var int RockDragonIsDead;
var int FireDragonIsDead;
var int IceDragonIsDead;

// slf - жертва
// oth - агрессор
func int C_BeliarWeapSuckEnergy(var C_Npc slf,var C_Npc oth)
{   
    // выход если
    if (Npc_IsPlayer(oth) == false)                                            { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] <= 0)                                    { return FALSE; };
    if (oth.attribute[ATR_HITPOINTS] >= oth.attribute[ATR_HITPOINTS_MAX])    { return FALSE; };
    if (C_ScHasReadiedBeliarsWeapon() == false)                                { return FALSE; };
    if (C_NpcIsUndead(slf) == true)                                            { return FALSE; };
    
    
    var int BeliarWeapSuckEnergy;
    BeliarWeapSuckEnergy = slf.attribute[ATR_HITPOINTS_MAX] * BeliarWeapCurrentLvL / 100;
    
    Wld_PlayEffect("SPELLFX_SUCKENERGY_BLOODFLY",slf,oth,0,0,0,FALSE);
    Npc_ChangeAttribute(oth,ATR_HITPOINTS,BeliarWeapSuckEnergy);
    //oth.attribute[ATR_HITPOINTS] += BeliarWeapSuckEnergy;
    
    return true;
};

func void B_DragonKillCounter(var C_Npc current_dragon)
{           
    ...
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.000
Благодарности
969
Баллы
295
у тебя скрипты неоф. обновления от D36 ?
Пост автоматически объединён:

попробуй

func void B_DragonKillCounter(var C_Npc current_dragon)
{
C_BeliarWeapSuckEnergy (current_dragon, other) ;
...
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.928
Благодарности
557
Баллы
275
Сверху Снизу