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

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

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

MaGoth

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

Вложения

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

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
instance Spell_Firebolt(C_Spell_Proto)
{
time_per_mana = 0;
damage_per_level = SPL_Damage_Firebolt + ATR_INTELLECT;
damagetype = DAM_FIRE;
};

...
тут, идут функции, Spell_Logic_Firebolt и Spell_Cast_Firebolt, в них нет ничего, запускающего горение.
...

Хочется отметить, что ранее огненная стрела не вызывала эффект горения.
мб это было потому, что у огненной стрелы был маг. урон вместо огненного? врядли...
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.333
Баллы
315
Ты прав, в них нет ничего, НО!
Советую хорошенько выучить систему спеллов в г2а, тк там очень много всего, например в VisualFx.dat в классе CFX_BASE есть поле sendAssessMagic
если уставноленно значение 1, то в скрипты(content/gothic) посылается восприятие B_AssessMagic для конкретного заклинания, и вообще, смотри в сторону B_AssessMagic
там прописаны ВСЕ состояния накладываемые от заклинаний, в том числе и ZS_MagicBurn и ZS_MagicBurnShort
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
вставил вывод отладочной инфы в функции:

B_AssessMagic
ZS_MagicBurn

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

Код функции B_AssessMagic, как видно тут нету огненной стрелы...
func void B_AssessMagic()
{
var string concatText;

concatText = ConcatStrings("B_AssessMagic, spell: ",IntToString(Npc_GetLastHitSpellID(self)));
PrintScreen(concatText,10,30,FONT_ScreenSmall,1);

if(Npc_GetLastHitSpellCat(self) == SPELL_BAD)
{
Npc_SendPassivePerc(self,PERC_ASSESSFIGHTSOUND,self,other);
};
if(Npc_GetLastHitSpellID(self) == SPL_Whirlwind)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,ZS_Whirlwind,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_SuckEnergy)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,ZS_SuckEnergy,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_GreenTentacle)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,ZS_Greententacle,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_Swarm)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,ZS_Swarm,0,"");
return;
};
if((Npc_GetLastHitSpellID(self) == SPL_IceCube) || (Npc_GetLastHitSpellID(self) == SPL_IceWave))
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(hero))
{
DAMAGEFREEZE = TRUE;
};
AI_StartState(self,ZS_MagicFreeze,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_ChargeZap)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,ZS_ShortZapped,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_Fear)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
Npc_SetTarget(self,other);
if((self.guild < GIL_SEPERATOR_HUM) && (self.guild != GIL_KDF) && (self.guild != GIL_GUR) && (self.guild != GIL_KDW) && (self.guild != GIL_PAL))
{
AI_StartState(self,ZS_MagicFlee,0,"");
return;
}
else if((self.guild > GIL_SEPERATOR_HUM) && (self.guild != GIL_DRAGON) && (self.guild != GIL_TROLL) && (self.guild != GIL_STONEGOLEM) && (self.guild != GIL_ICEGOLEM) && (self.guild != GIL_FIREGOLEM))
{
AI_StartState(self,ZS_MM_Flee,0,"");
return;
};
};
if(Npc_GetLastHitSpellID(self) == SPL_Firerain)
{
Npc_ClearAIQueue(self);
AI_StartState(self,ZS_MagicBurnShort,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_FIRELIGHT)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,ZS_Pyro,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_CONTROL)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,zs_controlled,0,"");
return;
};
if(Npc_GetLastHitSpellID(self) == SPL_TELEKINESIS)
{
Npc_ClearAIQueue(self);
B_ClearPerceptions(self);
AI_StartState(self,zs_telekinesis,0,"");
return;
};
};
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.333
Баллы
315
Тогда вторая моя догадка верна, нпс "загорается" в функции двига void oCNpc::Burn(int time, float)
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
так как через скрипты этим управлять? и где задается время горения?

C_CanNpcCollideWithSpell

щас еще эту ф-ию проверю...
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.333
Баллы
315
Только в двиге, и скриптом управлять не выйдет скорее всего.
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Почему никак? В классе oCNpc есть переменные
Код:
    var int            fireDamage;                                 // 0x081C int
    var int            fireDamageTimer;                            // 0x0820 zREAL
Вполне возможно, что прописав класс в скриптах получится регулировать горение через него.

И еще, бонус на повреждение за интеллект в Возвращении задан не совсем корректно - противники тоже наносят повреждение в зависимости от интеллекта ГГ. Правильнее было бы это организовать задав бонус в переменных класса C_NPC VAR INT damage [DAM_INDEX_MAX]. При таком раскладе он будет автоматом добавляться при атаке только нужного персонажа с нужным типом повреждения.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
George_M,
И еще, бонус на повреждение за интеллект в Возвращении задан не совсем корректно - противники тоже наносят повреждение в зависимости от интеллекта ГГ. Правильнее было бы это организовать задав бонус в переменных класса C_NPC VAR INT damage [DAM_INDEX_MAX]
Спорный вопрос насчет "правильности".
Фактически за счет этой "неправильности" НПС маги получают автолевелинг (по урону заклом) в зависимости от интеллекта ГГ. :)
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
И еще, бонус на повреждение за интеллект в Возвращении задан не совсем корректно - противники тоже наносят повреждение в зависимости от интеллекта ГГ
А я смотрю что тут что-то не так... в instance прописана переменная ATR_INTELLECT.

насчет VAR INT damage [DAM_INDEX_MAX] - неужели если сделать damage[DAM_INDEX_MAGIC] = ATR_INTELLECT то урон от моего посоха будет возрастать с повышение интеллекта? (блин, а я делал хук в месте загрузки игры и корректировал там параметры посоха) хм, интересно, многие вещи теперь можно элегантно реализовать, надо срочно проверить...

повышаем интеллект на 1 ед:
damage[DAM_INDEX_MAGIC] += 1;

т.е теперь нужно у всех заклинаний убрать переменную ATR_INTELLECT, так как все равно к урону от заклинания добавится damage[DAM_INDEX_MAGIC]?

Спорный вопрос насчет "правильности".
Фактически за счет этой "неправильности" НПС маги получают автолевелинг (по урону заклом) в зависимости от интеллекта ГГ. :)
Так вот в чем заключается баг с ищущими, наносящими большой урон магией ))

Только в двиге, и скриптом управлять не выйдет скорее всего.

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

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Dimmell, о том, что у такого подхода есть именно такая польза я писал в теме по возвращению, когда первый раз заметил в скриптах как все организованно.

насчет VAR INT damage [DAM_INDEX_MAX] - неужели если сделать damage[DAM_INDEX_MAGIC] = ATR_INTELLECT то урон от моего посоха будет возрастать с повышение интеллекта? (блин, а я делал хук в месте загрузки игры и корректировал там параметры посоха) хм, интересно, многие вещи теперь можно элегантно реализовать, надо срочно проверить...

повышаем интеллект на 1 ед:
damage[DAM_INDEX_MAGIC] += 1;

т.е теперь нужно у всех заклинаний убрать переменную ATR_INTELLECT, так как все равно к урону от заклинания добавится damage[DAM_INDEX_MAGIC]?
Я не тестил в Г2, но в Г1 я таким образом делал бонус ловкости к повреждению для стрелкового оружия и менял повреждение от магии. Причем все работало корректно - если у посоха есть повреждение огнем, то он возьмет бонус от огня, а если магией - от магии: все определяется флагом по типу повреждения оружия или заклинания.
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
как узнать вытащил ли Гг оружие, лук, заклинание? что-то вроде callback...
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
повышаем интеллект на 1 ед: damage[DAM_INDEX_MAGIC] += 1;
У меня чисто спортивный интерес - и как это будет работать после 20-30 поднятий урона в игре, сохранении и загрузке сейва. :)
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
как узнать вытащил ли Гг оружие, лук, заклинание? что-то вроде callback...
Корректно практически никак. Разве что на триггер повесить проверку.

У меня чисто спортивный интерес - и как это будет работать после 20-30 поднятий урона в игре, сохранении и загрузке сейва. :)
Нормально будет работать - данные переменные в C_NPC, а он для ГГ сохраняется без извратов. Опять таки, если есть сомнения, то никто не мешает прописать присваивание бонусных повреждений к интеллекту ГГ в инитворде.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
George_M написал(а):
Нормально будет работать - данные переменные в C_NPC, а он для ГГ сохраняется без извратов.
в случае общих и одинаковых damage[DAM_INDEX_MAGIC] - возможно. А если еще кроме магии есть оружие которое использует урон damage[DAM_INDEX_MAGIC] и я не хочу его раскачивать на доп.урон, а мне нужен фиксированный? Как тогда быть?
Корректно практически никак. Разве что на триггер повесить проверку.
функция B_BeliarsWeaponSpecialDamage(other,self);
И получить ссылку на изготовленное оружие otherweap = Npc_GetReadiedWeapon(oth);
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
в случае общих и одинаковых damage[DAM_INDEX_MAGIC] - возможно. А если еще кроме магии есть оружие которое использует урон damage[DAM_INDEX_MAGIC] и я не хочу его раскачивать на доп.урон, а мне нужен фиксированный? Как тогда быть?
Насколько я понял, в готике нет мульти-повреждений, а только 1 вид повреждения. иначе зачем тогда нужна переменная damagetype?
edit: упс, я забыл про флаги (см. код внизу) , но с заклинаниями это не проходит! я вот только что подумал о том чтобы переработать магию воды и сделать каждое заклинание уникальным. чтобы ГГ не выбрасывал руну после того как найдет или сделает мощный аналог.... так вот, ледяная стрела наносит урон холодом (магия) + колющий урон... было бы круто, жаль что в C_SPELL нету повреждений по стихиям...

instance ItMw_1H_Blessed_03(C_Item)
{
.... "ярость инноса"....
damage[DAM_INDEX_EDGE] = Damage_Blessed_1H_3;
damage[DAM_INDEX_FIRE] = 50;
damage[DAM_INDEX_MAGIC] = 20;
damagetype = DAM_EDGE | DAM_FIRE | DAM_MAGIC;
....
};

И еще: const func или var func работают только в классах и для движка? а то в скриптах проверял и так и эдак, не работает...
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
maggi1221,
ты определись что ты хочешь сделать:
- поменять схему прокачки в зависимости от интеллекта (тогда можешь ставить и damage[DAM_INDEX_MAGIC] += 1, проверять по скриптам и выставлять оружие использующее damage[DAM_INDEX_MAGIC] под нормальные параметры, иначе будет убер-пушка с уроном под 500 за счет своего собственного урона + набранный ГГ урон)
- если ты меняешь ГГ статы с увеличением поражающего эффекта damage[DAM_INDEX_MAGIC] += 1 ты точно уверен, что этот эффект не будет использоваться при использовании любого оружия, кулаков или простой палки?
 

George_M

Участник форума
Регистрация
17 Дек 2010
Сообщения
692
Благодарности
18
Баллы
255
Dimmell, какой из бонусов будет использован, задается флагом оружия или типом повреждения заклинания. Если же понадобится сделать ГГ бонус повреждения например огнем при любой атаке, то надо ему задать персональный флаг на тип повреждения - он сидит в том же классе C_NPC. По крайней мере так в Г1.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
George_M,
да мне как-то все равно что там и чем в движке посчитается. :D
Я только знаю что я таким путем не пойду. Те же яйца, только в профиль при использовании переопределенных переменных через инит и урона через B_BeliarsWeaponSpecialDamage(other,self) (и ее аналогов, вызываемых и используемых в любом случае). С маленькой разницей - поштучно (по заклу, оружию и т.д.) я могу более гибко регулировать то, что мне надо. :)
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
я могу более гибко регулировать то, что мне надо
Скажи как?

У меня посох обновляется при загрузке мира. А также при изменении маны, инт.

Далее магия. у всей атакующей магии урон ставится на 1. в instance используется спец. функция, сохраняющая параметры заклинания в массив.

Далее в Spell_ProcessMana устанавливаем глобальные переменные (урон,итд) и в B_AssessMagic выполняем урон по сохраненной глобальной переменной (ставим условия что нпц был атакован игроком,итд)...

При помощи этой системы можно рассчитывать процент, на который увеличится базовый урон заклинания, а не тупо прибавлять к урону интеллект.

hero.damage[DAM_INDEX_MAGIC] не используется...

maggi1221,
ты определись что ты хочешь сделать:
- поменять схему прокачки в зависимости от интеллекта (тогда можешь ставить и damage[DAM_INDEX_MAGIC] += 1, проверять по скриптам и выставлять оружие использующее damage[DAM_INDEX_MAGIC] под нормальные параметры, иначе будет убер-пушка с уроном под 500 за счет своего собственного урона + набранный ГГ урон)
- если ты меняешь ГГ статы с увеличением поражающего эффекта damage[DAM_INDEX_MAGIC] += 1 ты точно уверен, что этот эффект не будет использоваться при использовании любого оружия, кулаков или простой палки?
К сожалению damage[DAM_INDEX_MAGIC] прибавляется и к урону от посохов и к урону от магии, так что приходится вручную все делать.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
maggi1221 написал(а):
Далее в Spell_ProcessMana устанавливаем глобальные переменные (урон,итд) и в B_AssessMagic выполняем урон по сохраненной глобальной переменной (ставим условия что нпц был атакован игроком,итд)...
Dimmell написал(а):
при использовании переопределенных переменных через инит и урона через B_BeliarsWeaponSpecialDamage(other,self) (и ее аналогов, вызываемых и используемых в любом случае)
А в чем отличия? :D
Ну у меня (точнее в оригинале Возвращения) есть минимальный фиксированный урон заклом + урон от интеллекта, у тебя начального урона нет или расчет идет по другой схеме.
Урон посохом мага огня otherweap.damage[DAM_INDEX_FIRE] = DAMAGE_STAB01MAGIC + ATR_INTELLECT; в B_BeliarsWeaponSpecialDamage с переинициализацией при загрузке.
ЗЫ. Что было в 1.12.9 я уже не помню. :D
 
Сверху Снизу