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

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

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

MaGoth

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

Вложения

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

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
444
Благодарности
264
Баллы
230
А этими переменными баловался?:
userstring[0] = "0.8";
userstring[1] = "1.0";
userstring[2] = "120";
userstring[3] = "90";

Да, пробовал. Здесь вообщем-то нет ничего интересного:
  • userstring[0] - скорость колебаний
  • userstring[1] - амплитуда колебаний
  • userstring[2] - FOV по оси х
  • userstring[3] - FOV по оси y
  • userstring[4] - похоже не используется в данном случае(тестирование провёл).

Пробовал ещё вызвать этот эффект за счёт другого, т.е. примерно так:
Код:
instance SCR_TEST_FOV_01(cfX_BASE)
{
    visname_s = "screenblend.scx";
    userstring[0] = "100000000000";
    userstring[1] = "0 0 0 255";
    userstring[2] = "0";
    userstring[3] = "ts_ViewImage";
    visalphablendfunc_s = "BLEND";
    emfxcreate_s = "TEST_FOV_01";
};
В итоге текстура на экран выводится мгновенно, а морф-эффект ползёт не спеша, что не удивительно.

Ускорение персонажа в 20 раз относительно мирового пространства-времени также не помогает.
Смешной способ, не правда ли? Но он тоже не работает здесь.

Но не всё так плохо! Остановка эффекта происходит гораздо быстрей, примерно за секунду.
Код:
Wld_StopEffect("SCR_TEST_FOV_01");
Это радует.:)
С другой стороны, не знаю как это будет работать, если уже наложено несколько морф-эффектов. Когда-то помнится такое наблюдал и мне как-то не понравилась эта картина...
 
Последнее редактирование:

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.167
Баллы
915
Прошу знатоков детально объяснить, что означают значения, которые возвращает функция C_CanNpcCollideWithSpell(var int spellType):
Код:
const int COLL_DONOTHING = 0; // ничего не делать
const int COLL_DOEVERYTHING = 1; // сделать всё (нанести урон без учёта защиты???)
const int COLL_APPLYDAMAGE = 2; // нанести урон (с учётом защиты???)
const int COLL_APPLYHALVEDAMAGE = 4; // нанести половинный урон (с учётом защиты???)
const int COLL_APPLYDOUBLEDAMAGE = 8; // нанести удвоенный урон (с учётом защиты???)
const int COLL_APPLYVICTIMSTATE = 16; // ??? (не используется)
const int COLL_DONTKILL = 32; // не убивать цель
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
C_CanNpcCollideWithSpell определяет, как будет реагировать конкретный npc, когда в него попадет конкретное заклинание.

COLL_DONOTHING - заклинание не подействует. Например, нельзя поджечь плывущего NPC.
COLL_DOEVERYTHING - полноценный обычный эффект. Полный урон, заморозка, горение и т.д.
COLL_APPLYDAMAGE - заклинание нанесет урон, но не будет вызван обработчик PERC_ASSESSMAGIC, т.е. не будет сопутствующих эффектов. Каменного голема нельзя заморозить или поджечь, охранник не взлетит в смерче.
COLL_APPLYHALVEDAMAGE - то же, плюс будет нанесена только половина урона (огненный шар на огненного голема).
COLL_APPLYDOUBLEDAMAGE - то же, но урон удвоенный (огонь против льда).
COLL_APPLYVICTIMSTATE - предположу, что как COLL_APPLYDAMAGE, но npc запомнит, что на него напали с магией (иначе реагирует как на обычное повреждение). Не используется, может и не работает.
COLL_DONTKILL - в результате действия заклинания npc не умирает, а падает без сознания (кулак ветра, воды, молния)
Возможно, баг, а может специально, но ледяная волна встречается в C_CanNpcCollideWithSpell дважды. В первом случае нет варианта COLL_APPLYDAMAGE, а во втором - есть. Поэтому каменного голема или демона нельзя заморозить ледяным блоком, а волной - можно.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.167
Баллы
915
@НастасьСанна:
Это похоже на какой-то баг, потому что в этой функции из декомпилированных скриптов Акеллы проверка на ледяную волну встречается только в одном блоке if вместе с другими ледяными заклами:
Код:
    if((spellType == SPL_IceCube) || (spellType == SPL_IceWave) || (spellType == SPL_Icebolt))
    {
        if(C_NpcIsDown(self) || C_BodyStateContains(self,BS_SWIM) || C_BodyStateContains(self,BS_DIVE))
        {
            return COLL_DONOTHING;
        };
        if((self.guild == GIL_FIREGOLEM) || (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN) || (self.guild == GIL_Gargoyle) || (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE))
        {
            return COLL_APPLYDOUBLEDAMAGE;
        };
        if((self.guild == GIL_ICEGOLEM) || (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE) || (self.aivar[AIV_MM_REAL_ID] == ID_Icewolf))
        {
            return COLL_APPLYHALVEDAMAGE;
        };
        if((self.guild == GIL_STONEGOLEM) || (self.guild == GIL_SUMMONED_GOLEM) || (self.guild == GIL_DEMON) || (self.guild == GIL_SUMMONED_DEMON) || (self.guild == GIL_TROLL) || (self.guild == GIL_DRAGON))
        {
            return COLL_APPLYDAMAGE;
        };
        return COLL_DOEVERYTHING;
    };
Всё то же самое прописано и в функции из скриптов G2 MDK:
Код:
//----- Eis -----
      
    if (spellType  == SPL_IceCube)
    || (spellTYpe  == SPL_IceWave)
    || (spelltype  == SPL_Icebolt)      
    {
        // wenn im schwimm oder tauchmodus, bewirkt der spell nix
        if (C_NpcIsDown(self))
        || (C_BodyStateContains(self,BS_SWIM))   
        || (C_BodyStateContains(self,BS_DIVE))
        {
            return COLL_DONOTHING;
        };
      
        // feuer wesen erhalten doppelten schaden, kein opfer zs
        if (self.guild == GIL_FIREGOLEM)
        || (self.aivar[AIV_MM_REAL_ID]    ==     ID_FIREWARAN)
        || (self.guild == GIL_GARGOYLE)
        || (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE)
        {
            return COLL_APPLYDOUBLEDAMAGE;
        };
      
        // eis wesen erhalten halben schaden, kein opfer zs      
        if (self.guild == GIL_ICEGOLEM)
        || (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE)
        || (self.aivar[AIV_MM_REAL_ID] == ID_ICEWOLF)
        {
            return COLL_APPLYHALVEDAMAGE;
        };
      
        // grosse monster erhalten nur schaden, kein opfer zs      
        if (self.guild == GIL_STONEGOLEM)
        || (self.guild == GIL_SUMMONED_GOLEM)
        || (self.guild == GIL_DEMON)
        || (self.guild == GIL_SUMMONED_DEMON)
        || (self.guild == GIL_TROLL)
        || (self.guild == GIL_DRAGON) //andere
        {
            return COLL_APPLYDAMAGE;
        };
      
        return COLL_DOEVERYTHING;
    };
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
@НастасьСанна:
Это похоже на какой-то баг, потому что в этой функции из декомпилированных скриптов Акеллы проверка на ледяную волну встречается только в одном блоке if вместе с другими ледяными заклами:
Пардон, я невнимательная. Там первый раз не волна, а копье, SPL_IceLance.
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
444
Благодарности
264
Баллы
230
Есть, называется "переписать движок".
Извините, но вы не правы!
Всё-таки есть способ быстрой смены fov-значений у камеры.
Смысл в том, чтобы запустить два эффекта:
Первый - окончательный эффект fov-камеры. Имеет небольшую задержку и участвует в роли "догоняющего" или "доводящего до конца".
Второй - стартовый эффект. Имеет параметры fov-камеры увеличенные в десятки раз относительно первого, поэтому очень быстрый.
В итоге имеем быстрый старт и "плавный подход" к требуемым значениям.
Главное правильно подогнать все параметры спец. эффектов. Я имею ввиду интерполяцию значений. Результат получается хороший. Скорость "основных изменений" изображения камеры около 0,5 секунды и около двух секунд почти не заметное успокоение эффекта. И работает это, даже если у вас уже наложено несколько морф-эффектов.
 
Последнее редактирование:

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.227
Благодарности
1.910
Баллы
370
Подскажите , что в скриптах нужно прописать , чтобы в готике 1 можно было добывать руду?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Одними скриптами здесь не обойтись. Потребуется правка игрового мира. В свойства ВСЕХ рудных жил нужно внести испраления. Ты готов к такому объёму работы?
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.227
Благодарности
1.910
Баллы
370
Одними скриптами здесь не обойтись. Потребуется правка игрового мира. В свойства ВСЕХ рудных жил нужно внести испраления. Ты готов к такому объёму работы?
Ноу, мне не осилить данный процесс
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
В свойства ВСЕХ рудных жил нужно внести испраления. Ты готов к такому объёму работы?

Добавить одну строку с именем функции? Это можно сделать не открывая Спейсера через Notepad++. Заодно и быстрее будет - поиском сразу все жилы найдешь. :)

ЗЫ. Пардон, уже забыл - целых 2 строки:
типа
useWithItem=string:ItMi_Pan
onStateFunc=string:Herd

thorus1995
почитайте туторы, много интересного найдете. Например - https://worldofplayers.ru/threads/20496/
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Массово изменить вобы в Спейсере можно как описано тут. В Готике 1 тоже должно работать, насколько я помню.

Добавлено:
Хотя, если делать добычу руда по тому же принципу, что и золото в Г2НВ, то все равно придется с каждой жилой поработать, чтобы проверить сколько руды было добыто в данной конкретной жиле.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Это можно сделать не открывая Спейсера через Notepad++

Если не писать что-то типа макроса, то я не уверен, что правка в Блокноте будет быстрее, чем в Спейсере. Кроме того, для некоторых рудных жил требуется прописать не функцию взаимодействия, а функцию запрета использования, поскольку расположены они так, что с ними нельзя нормально взаимодействовать. В Блокноте это оценить невозможно. Ну и компилить мир после правки в Блокноте придётся всё равно Спейсером, равно как и получить ZEN в нескомпилированном виде.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Ну и компилить мир после правки в Блокноте придётся всё равно Спейсером,

вот этого делать как раз таки не надо - проверено и работает в Ребалансе, СнК и прочих модах на их основе. :)
А точки подхода-доступа определяются очень просто - toggle WP в игре. И вся работа занимает намного меньше времени чем через Спейсер. Потом после отладки можно в Спейсере передвинуть/поправить и т.д. Но не обязательно. Если НПС подходят к жиле (напр. в шахте) и нормально становятся-долбят - никаких правок не надо.
ЗЫ. Функция запрета использования - просто не прописываешь саму функцию у этой жилы. :)
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
вот этого делать как раз таки не надо - проверено и работает

Любопытно узнать подробности.

Функция запрета использования - просто не прописываешь саму функцию у этой жилы.

Дело в том, что в Старой Шахте, например, есть жилы, расположенные на высоте в полтора человеческих роста или вообще на потолке коридора. Они берутся в фокус, но взаимодействие по понятным причинам происходит неправильно. Есть жилы, при подходе к которым ГГ начинает скользить, и взаимодействие прерывается. В одном месте взаимодействие с жилой приводит к проваливанию под текстуры. Вот для таких жил и нужно ставить запрет, чтобы ГГ даже не пытался начать взаимодействие.
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.048
Благодарности
1.163
Баллы
340

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Любопытно узнать подробности.

так я делал жилу в Хоринисе рядом с Декстером - из простого визаула жилы (а они там были) методом очень простых манипуляций в блокноте делаем рабочую жилу. Причина была очень простая почему не Спейсером - при работе с зенами Возвращения (не имея мешей) очень элементарно накосячить там, где и не трогал из-за перекомпиляций. Потом на какой-то локации сам делал жилу вместо другого воба и тоже в блокноте, так же делал рабочими наковальни, бревна, вертел и т.д. Так же и первый триггер вставлял в Хоринисе - он там таким и остался (замена FP на триггер) :D
Те, кто играли в Ребаланс может помнят, когда я накосячил с 2.0 - после этого переделывал для 2.1 через блокнот.
Я не работал с Готикой уже 3 года (со Спейсером точно), но в блокноте намного проще найти нужные вещи напр. по визуалу и переименовать/присвоить что надо. Новый ВОБ/МОБ делать - лучше в Спейсере, но если просто заместить имеющийся (и даже скорректировать положение) - проще в блокноте если не знаешь тонкостей Спейсера и не умеешь с ним работать, и если не хочешь "случайно" нарваться на пропажу инстанций/текстур из зенов при перекомпиляции.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
А не проще такие жилы изначально делать обычным вобом, а не мобси?

Если речь идёт о создании новой локации, то да, так и надо делать. Если речь идёт о редактировании существующей и всем давно знакомой локации, то правильнее тоже было бы, конечно, заменить мобси на обычные мобы, но... В данном случае именно ПРОЩЕ поставить запрет. :)


Понял. Ты правил скомпилированный ЗЕН.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Понял. Ты правил скомпилированный ЗЕН.

я не знаю как выглядит "нескомпилированный" ЗЕН и для чего он используется в игре. Поподробнее, плз, где используется в игре нескомпилированный ЗЕН и что это такое?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Поподробнее, плз, где используется в игре нескомпилированный ЗЕН и что это такое?

Спейсер позволяет сохранить ЗЕН, как нескомпилированный. На выходе получается текстовый файл с перечислением всех использованных мешей и объектов с их свойствами. Этот файл открывается и правится обычным Блокнотом или Вордпадом. Из этого нескомпилированного ЗЕНа путём компиляции в Спейсере получается скомпилированный ЗЕН.

В нескомпилированном виде игра использует мини-ЗЕНы огня. Правкой такого мини-ЗЕНа в Блокноте, например, можно добавить переносному факелу ПФХ-эффект дыма и звук потрескивания.

К модератору: похоже, несколько постов из этой темы надо бы перенести в тему по Спейсеру. :)
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Спейсер позволяет сохранить ЗЕН, как нескомпилированный.

я не работал через меши, я работал только с обычными игровыми ЗЕНами, и все, что я писал выше относится к обычным игровым зенам *****.ZEN. При их сохранении спейсер все равно компилирует (при отсутствии напр. в папке _work визуалов - он и скомпилирует без визуалов, будут отсутствовать инстанции в скриптах - пропадут предметы из ЗЕНа), но компилирует он в ЛЮБОМ случае когда сохраняет. Разница только в бинарном виде или другом (уже не помню тонкостей, да они и не принципиальны, ЗЕН одинаково вскрывается блокнотом).
ЗЫ вы хоть раз пробовали вскрыть ЗЕН блокнотом? И пролистать до низу если уж очень пугают кракозябры вначале?

К модератору: похоже, несколько постов из этой темы надо бы перенести в тему по Спейсеру.

эта тема больше имеет отношение к "блокнотингу", чем к спейсеру или скриптингу. :D
 
Последнее редактирование:
Сверху Снизу