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

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

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

MaGoth

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

Вложения

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

Pinic

Участник форума
Регистрация
14 Июн 2013
Сообщения
128
Благодарности
13
Баллы
185
Не подскажите, какую нибудь статью или что то типа того, как добавить новое умение, например ковку брони?
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Не подскажите, какую нибудь статью или что то типа того, как добавить новое умение, например ковку брони?

Такой, насколько я знаю, нет. Но все довольно просто.

1. Пишешь диалог с неписем типа "Научи меня ковать доспехи!". В ходе диалога снимаешь у ГГ очки обучения (hero.lp -= 5; например).

2. В Story_Globals создаешь переменную, например var int MakingArmor;

3. В диалоге пишешь MakingArmor = TRUE;

4. Дальше юзаешь урок по работе с МОВ-объектами, создаешь строку "Создать доспех" и в условие ставишь MakingArmor == TRUE.

Минус разве в том, что в окне характеристик это умение отображаться не будет.
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
А как сделать чтоб отображалась?

По памяти точного ответа не дам. Надо шарить по menu.dat и по скриптах Gothic.dat (по массивах с текстами... вроде файлы Text.d и топу подобное). Поиск одного из умений (например алхимии) поможет найти, что надо.
 

Pinic

Участник форума
Регистрация
14 Июн 2013
Сообщения
128
Благодарности
13
Баллы
185
Спасибо зава посмотрю И последний вопрос: как через диалог поменять нпсу распорядок дня или чтобы он шел на другой вайпоинт?
 

Pinic

Участник форума
Регистрация
14 Июн 2013
Сообщения
128
Благодарности
13
Баллы
185
Jr13San А зачем так заморачиваться, если можно просто удалить строчку *eventTag (1 "DEF_EXCHANGE_ITEM" "ZS_LEFTHAND" "ItFoMutton") из humans.mds и соответствующие .man анимации?
соответствующие .man анимации? Это какая анимация как именно называется фаил? И удолять через блокнот?
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.450
Благодарности
780
Баллы
375
Спасибо зава посмотрю И последний вопрос: как через диалог поменять нпсу распорядок дня или чтобы он шел на другой вайпоинт?

Прописать в диалоге строчку, меняющую распорядок дня НПС. Пример из оригинальных скриптов:
func void DIA_Cornelius_RealStory_Info()
{
AI_Output(other,self,"DIA_Cornelius_RealStory_15_00");//Так что произошло на самом деле?
AI_Output(self,other,"DIA_Cornelius_RealStory_13_01");//Я не видел, что произошло. Я получил золото за то, что обвиню этого наемника.
AI_Output(self,other,"DIA_Cornelius_RealStory_13_02");//В нынешние времена каждый сам за себя. А мне нужны были деньги.
AI_Output(other,self,"DIA_Cornelius_RealStory_15_03");//Кто заплатил тебе?
AI_Output(self,other,"DIA_Cornelius_RealStory_13_04");//Тебе достаточно того, что я сказал. Он убьет меня, если я проговорюсь.
AI_Output(other,self,"DIA_Cornelius_RealStory_15_05");//Ты готов подтвердить сказанное тобой перед лордом Хагеном?
AI_Output(self,other,"DIA_Cornelius_RealStory_13_06");//Я пока еще не выжил из ума. Я не собираюсь оставаться в городе.
if(Npc_HasItems(self,ItWr_CorneliusTagebuch_Mis) >= 1)
{
AI_Output(self,other,"DIA_Cornelius_RealStory_13_07");//Я дам тебе мой дневник, он послужит достаточным доказательством.
B_GiveInvItems(self,other,ItWr_CorneliusTagebuch_Mis,1);
};
B_LogEntry(TOPIC_RescueBennet,"Корнелиус солгал. Ему заплатили, чтобы упечь Беннета в тюрьму. Но он не говорит мне, кто подкупил его. Он весь дрожит от страха.");
CorneliusFlee = TRUE;
AI_StopProcessInfos(self);
Npc_ExchangeRoutine(self,"FLEE");
};
Жирным выделена строка, отвечающая за смену распорядка дня после разговора.
 

Мільтен

Участник форума
Регистрация
27 Июн 2008
Сообщения
862
Благодарности
427
Баллы
265
Спасибо зава посмотрю И последний вопрос: как через диалог поменять нпсу распорядок дня или чтобы он шел на другой вайпоинт?

Дополню ответ Хелдара незначительным нюансом, о котором, бывает, забывают: в приведенном примере у непися, которому меняем распорядок дня, указанный распорядок дня (FLEE) должен существовать.
 

Pinic

Участник форума
Регистрация
14 Июн 2013
Сообщения
128
Благодарности
13
Баллы
185
По памяти точного ответа не дам. Надо шарить по menu.dat и по скриптах Gothic.dat (по массивах с текстами... вроде файлы Text.d и топу подобное). Поиск одного из умений (например алхимии) поможет найти, что надо.
Пошарил в menu.dat, в скрипте Menu_Status вроде бы оно, но серовно нечего не понял, может помочь кто нибудь?
 

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

Участник форума
Регистрация
6 Дек 2012
Сообщения
351
Благодарности
521
Баллы
325
Навыки в меню персонажа отображаются только и исключительно через эти переменные
  1. индексы массива навыков NPC_TALENT_... в Constants.d
  2. названия навыков TXT_TALENTS[...] в Text.d
  3. названия уровней владения навыком TXT_TALENTS_SKILLS[...] в Text.d (пишутся через |, например "Новичок|Боец|Мастер")
К сожалению, их количество ограничено 21, больше добавить нельзя. Но в оригинальных скриптах есть еще 2-3 свободных. В них и прописываем свой навык.

Задавать его уровень будем через функции Npc_SetTalentSkill и Npc_SetTalentValue. Первый задает в процентах, второй - в единицах (какую подпись брать из TXT_TALENTS_SKILLS), причем для одного навыка можно одновременно задать и значение в %, и в единицах.

В самом меню Menu_Status.d описывается расположение этих навыков на экране. Например, мы добавили 21-й навык. Дописываем в инстанцию MENU_STATUS(C_MENU_DEF)
Код:
    items[58] = "MENU_ITEM_TALENT_21_TITLE";  //название навыка
    items[59] = "MENU_ITEM_TALENT_21_SKILL";  //навык в единицах
    items[60] = "MENU_ITEM_TALENT_21";  //навык в %
Соответственно, если % или единицы не нужны, опускаем одну из строчек. В конец файла дописываем, где они будут располагаться на экране. Думаю, там по образцу все понятно.
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Здравствуйте. Делал квест по уроку из https://worldofplayers.ru/threads/36468/. Поставил оба квеста. Проблема в следующем. Если у ГГ в инвентаре есть кольцо, нужное по второму квесту, то строчка "Вот, я принес тебе кольцо!", возникает даже если квест не взят. Как такое исправить?
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.340
Благодарности
3.187
Баллы
525
Функция, указанная в строчке condition инстанции диалога, разрешает или запрещает появление данной опции диалога. В этой функции нужно прописать два условия. Условие 1 - состоявшийся диалог взятия квеста. Условие 2 - наличие кольца в инвентаре ГГ. Эти условия должны быть объединены логической функцией "И" (хххх && хххх).

Взятие квеста можно контролировать по состоявшемуся диалогу, в ходе которого этот квест берётся (функция Npc_KnowsInfo(other, ххххх)). В некоторых случаях этот вариант не прокатит. Иногда нужно сделать диалог взятия квеста многоразовым с возможностью выбрать вариант "да" или "нет". В этом случае нужно завести особую глобальную переменную, которая будет изменяться по ходу продвижения квеста в инстанциях диалогов квеста. Например, взял ГГ квест - переменная получила значение "LOG_RUNNING" (1), сдал ГГ квест - переменная получила значение "LOG_SUCSESS" (2), провалил квест - переменная получает значение "LOG_FAILED" (3). Возможны и другие значения, если того требует квест с большим количеством стадий или многовариантным исходом.
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.450
Благодарности
780
Баллы
375
Здравствуйте. Делал квест по уроку из https://worldofplayers.ru/threads/36468/. Поставил оба квеста. Проблема в следующем. Если у ГГ в инвентаре есть кольцо, нужное по второму квесту, то строчка "Вот, я принес тебе кольцо!", возникает даже если квест не взят. Как такое исправить?
В условиях диалога, который отвечает за сдачу квеста, пропиши
if(MIS_*название твоего квеста* == LOG_Running)
 

107-й

Участник форума
Регистрация
18 Дек 2011
Сообщения
59
Благодарности
3
Баллы
155
Всем привет!
Помогите пожалуйста исправить руну.
Руна из возвращения, вторая руна Стражей.
Наносит почему-то тройной урон, и маны жрёт больше чем должна.
Инстанция:
Код:
instance ITRU_TPLSTRIKE_01(C_Item)
{
    name = NAME_Rune;
    mainflag = ITEM_KAT_RUNE;
    flags = 0;
    value = VALUE_RU_TPLMEDIUMSTRIKE;
    visual = "ItAr_Rune_11.3DS";
    material = MAT_STONE;
    spell = SPL_TPLMEDIUMSTRIKE;
    wear = WEAR_EFFECT;
    effect = "SPELLFX_WEAKGLIMMER";
    description = NAME_SPL_TPLMEDIUMSTRIKE;
    text[0] = NAME_TPLSPELL;
    text[1] = NAME_Manakosten;
    count[1] = SPL_COST_TPLMEDIUMSTRIKE;
    text[2] = NAME_Dam_Magic;
    count[2] = SPL_DAMAGE_TPLMEDIUMSTRIKE;
    text[5] = NAME_Value;
    count[5] = value;
};
Далее из VISUALFX.dat
Файл VisualFxInst:
Код:
instance SPELLFX_TPLMEDIUMSTRIKE(CFX_BASE_PROTO)
{
    visname_s = "MFX_REPELEVIL_INIT";
    emtrjmode_s = "FIXED";
    emtrjoriginnode = "ZS_RIGHTHAND";
    emtrjtargetnode = "BIP01 FIRE";
    emtrjloopmode_s = "NONE";
    emtrjeasefunc_s = "LINEAR";
    emactioncollstat_s = "COLLIDE CREATE";
    emactioncolldyn_s = "COLLIDE CREATEONCE";
    emfxcollstat_s = "spellFX_TplMediumStrike_COLLIDE";
    emfxcolldyn_s = "spellFX_TplMediumStrike_COLLIDEDYNFX";
    emtrjtargetrange = 20;
    emtrjtargetelev = 0;
    emtrjdynupdatedelay = 20000;
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_KEY_INIT(C_PARTICLEFXEMITKEY)
{
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_KEY_CAST(C_PARTICLEFXEMITKEY)
{
    emtrjmode_s = "TARGET";
    emtrjeasevel = 800;
    sfxid = "MFX_DestroyUndead_Cast";
    emcreatefxid = "spellFX_TplMediumStrike_TRAIL";
    sfxisambient = 1;
    emcheckcollision = 1;
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_KEY_COLLIDE(C_PARTICLEFXEMITKEY)
{
    emtrjeasevel = 0.0001;
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_TRAIL(CFX_BASE_PROTO)
{
    emtrjeasevel = 800;
    visname_s = "MFX_REPELEVIL_TRAIL";
    visalpha = 1;
    emtrjmode_s = "TARGET";
    emcheckcollision = 1;
    emactioncollstat_s = "COLLIDE";
    emactioncolldyn_s = "COLLIDE";
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_TRAIL_COLLIDE(C_PARTICLEFXEMITKEY)
{
    emtrjeasevel = 1e-006;
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_COLLIDE(CFX_BASE_PROTO)
{
    emtrjoriginnode = "BIP01";
    visname_s = "MFX_RepelEvil_COLLIDE";
    emtrjmode_s = "FIXED";
    emtrjdynupdatedelay = 0;
    lightpresetname = "AURA";
    sfxid = "MFX_DESTROYUNDEAD_COLLIDE";
    sfxisambient = 1;
};
 
instance SPELLFX_TPLMEDIUMSTRIKE_COLLIDEDYNFX(CFX_BASE_PROTO)
{
    emtrjoriginnode = "BIP01";
    visname_s = "MFX_RepelEvil_COLLIDE";
    emtrjmode_s = "FIXED";
    emtrjdynupdatedelay = 0;
    lightpresetname = "AURA";
    sfxid = "MFX_DESTROYUNDEAD_COLLIDE";
    sfxisambient = 1;
};

Из PARTICLEFX.DAT
Файл PfxInstMagic:
Код:
instance MFX_REPELEVIL_INIT(C_PARTICLEFX)
{
    ppsvalue = 40;
    ppsscalekeys_s = "1";
    ppsislooping = 1;
    ppsissmooth = 1;
    ppsfps = 2;
    shptype_s = "POINT";
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
    shpisvolume = 1;
    shpdim_s = "100";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2;
    dirmode_s = "RAND";
    dirfor_s = "OBJECT";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180;
    dirangleelev = -90;
    velavg = 0.001;
    lsppartavg = 2000;
    lsppartvar = 500;
    flygravity_s = "0 -0.0000001 0";
    visname_s = "HEAVENLIGHT.TGA";
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18;
    vistexaniislooping = 2;
    vistexcolorstart_s = "255 0 0";
    vistexcolorend_s = "0 255 255";
    vissizestart_s = "1 50";
    vissizeendscale = 3;
    visalphafunc_s = "ADD";
    visalphastart = 255;
    useemittersfor = 1;
};
 
instance MFX_REPELEVIL_CAST(C_PARTICLEFX)
{
    ppsvalue = 40;
    ppsscalekeys_s = "1";
    ppsislooping = 1;
    ppsissmooth = 1;
    ppsfps = 2;
    shptype_s = "POINT";
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
    shpisvolume = 1;
    shpdim_s = "100";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2;
    dirmode_s = "RAND";
    dirfor_s = "OBJECT";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180;
    dirangleelev = -90;
    velavg = 0.001;
    lsppartavg = 4000;
    lsppartvar = 1000;
    flygravity_s = "0 -0.0000001 0";
    visname_s = "HEAVENLIGHT.TGA";
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18;
    vistexaniislooping = 1;
    vistexcolorstart_s = "255 255 255";
    vistexcolorend_s = "225 0 255";
    vissizestart_s = "1 50";
    vissizeendscale = 10;
    visalphafunc_s = "ADD";
    visalphastart = 255;
    useemittersfor = 1;
};
 
instance MFX_REPELEVIL_TRAIL(C_PARTICLEFX)
{
    ppsvalue = 200;
    ppsscalekeys_s = "1";
    ppsislooping = 1;
    ppsissmooth = 1;
    ppsfps = 2;
    shptype_s = "POINT";
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
    shpdim_s = "5";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2;
    dirmode_s = "RAND";
    dirfor_s = "OBJECT";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180;
    dirangleelev = -90;
    velavg = 0.02;
    velvar = 0.01;
    lsppartavg = 2000;
    flygravity_s = "0 0.00005 0";
    visname_s = "GLOWWORM.TGA";
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18;
    vistexaniislooping = 1;
    vistexcolorstart_s = "255 255 255";
    vistexcolorend_s = "255 255 255";
    vissizestart_s = "2 2";
    vissizeendscale = 4;
    visalphafunc_s = "ADD";
    visalphastart = 255;
};
 
instance MFX_REPELEVIL_COLLIDE(C_PARTICLEFX)
{
    ppsvalue = 30;
    ppsscalekeys_s = "1";
    ppsissmooth = 1;
    ppsfps = 1;
    shptype_s = "POINT";
    shpfor_s = "object";
    shpoffsetvec_s = "0 0 0";
    shpdistribtype_s = "RAND";
    shpisvolume = 1;
    shpdim_s = "100";
    shpscalekeys_s = "1";
    shpscaleislooping = 1;
    shpscaleissmooth = 1;
    shpscalefps = 2;
    dirmode_s = "RAND";
    dirfor_s = "OBJECT";
    dirmodetargetfor_s = "OBJECT";
    dirmodetargetpos_s = "0 0 0";
    dirangleheadvar = 180;
    dirangleelev = -90;
    velavg = 0.001;
    lsppartavg = 4000;
    lsppartvar = 1000;
    flygravity_s = "0 -0.0000001 0";
    visname_s = "HEAVENLIGHT.TGA";
    visorientation_s = "VELO";
    vistexisquadpoly = 1;
    vistexanifps = 18;
    vistexaniislooping = 2;
    vistexcolorstart_s = "255 0 0";
    vistexcolorend_s = "0 255 255";
    vissizestart_s = "1 50";
    vissizeendscale = 10;
    visalphafunc_s = "ADD";
    visalphastart = 255;
    useemittersfor = 1;
};

В чём тут может быть проблема?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.563
Благодарности
4.157
Баллы
915
А как насчёт содержимого скриптов AI\Magic\Spells\spell_tplmediumstrike.d и AI\AI_Intern\AI_Constants.d (константы SPL_COST_TPLMEDIUMSTRIKE - расход маны и SPL_DAMAGE_TPLMEDIUMSTRIKE - базовый урон)?
 

107-й

Участник форума
Регистрация
18 Дек 2011
Сообщения
59
Благодарности
3
Баллы
155
А как насчёт содержимого скриптов AI\Magic\Spells\spell_tplmediumstrike.d и AI\AI_Intern\AI_Constants.d (константы SPL_COST_TPLMEDIUMSTRIKE - расход маны и SPL_DAMAGE_TPLMEDIUMSTRIKE - базовый урон)?
spell_tplmediumstrike.d
Код:
instance SPELL_TPLMEDIUMSTRIKE(C_Spell_Proto)
{
    time_per_mana = 0;
    damage_per_level = SPL_DAMAGE_TPLMEDIUMSTRIKE + ATR_INTELLECT;
    damagetype = DAM_MAGIC;
    targetCollectRange = 1200;
};
 
 
func int spell_logic_tplmediumstrike(var int manaInvested)
{
    if(self.attribute[ATR_MANA] >= SPL_COST_TPLMEDIUMSTRIKE)
    {
        return SPL_SENDCAST;
    }
    else
    {
        return SPL_SENDSTOP;
    };
    return SPL_SENDSTOP;
};
 
func void spell_cast_tplmediumstrike()
{
    if(Npc_IsPlayer(self) && (PLAYERISTRANSFER == TRUE) && (PLAYERISTRANSFERDONE == FALSE))
    {
        b_transferback(self);
    };
    if(Npc_IsPlayer(self) && (MIS_RUNEMAGICNOTWORK == LOG_Running) && (TESTRUNEME == FALSE) && !Npc_GetActiveSpellIsScroll(self))
    {
        if((FIREMAGERUNESNOT == TRUE) || (WATERMAGERUNESNOT == TRUE) || (GURUMAGERUNESNOT == TRUE) || (PALADINRUNESNOT == TRUE))
        {
            B_LogEntry(TOPIC_RUNEMAGICNOTWORK,"Как интересно! В отличие от Пирокара и других прочих магов, я могу использовать рунную магию. Что бы это значило?!");
        }
        else
        {
            B_LogEntry(TOPIC_RUNEMAGICNOTWORK,"Как интересно! В отличие от Пирокара, я могу использовать рунную магию. Что бы это значило?!");
        };
        TESTRUNEME = TRUE;
    };
    self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_COST_TPLMEDIUMSTRIKE;
    self.aivar[AIV_SelectSpell] += 1;
};

AI_Constants.d
Код:
const int SPL_COST_TPLMEDIUMSTRIKE = 30;
const int SPL_DAMAGE_TPLMEDIUMSTRIKE = 140;

При этом маны жрёт 40, вместо 30, а урон примерно 450 вместо 140.
При этом если смотреть на шкалу врага, то урон как будто наносится 2 раза, это визуально, но по цифрам получается что 3 раза урон наносится. Примерно 420-450.
Но иногда урон проскакивает примерно 220.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.563
Благодарности
4.157
Баллы
915
Пожалуйста уточни следующее:
1. Ты пытаешься модифицировать это заклинание или перенести его в другой мод?
2. Какое у ГГ значение атрибута "интеллект" (переменная ATR_INTELLECT)?
3. Был ли сделан выбор в пользу стихии Камня? Тогда заклинания Стражей будут наносить удвоенный урон - смотри скрипт AI\Magic\C_CanNpcCollideWithSpell.d:
if((spellType == SPL_BERZERK) || (spellType == SPL_WindFist) || (spellType == SPL_CONTROL) || (spellType == SPL_Whirlwind) || (spellType == SPL_TPLLIGHTSTRIKE) || (spellType == SPL_TPLMEDIUMSTRIKE) || (spellType == SPL_TPLHEAVYSTRIKE) || (spellType == SPL_TPLSUPERSTRIKE))
{
if(self.protection[PROT_MAGIC] == IMMUNE)
{
self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];
return COLL_DONOTHING;
};
if(CHOOSESTONE == TRUE)
{
return COLL_APPLYDOUBLEDAMAGE;
}
else
{
return COLL_DOEVERYTHING;
};
};
4. В "Возвращении" v1.1 (т.е. без дополнительных патчей или модов) проблем с этим заклинанием нет?
 

107-й

Участник форума
Регистрация
18 Дек 2011
Сообщения
59
Благодарности
3
Баллы
155
Пожалуйста уточни следующее: 1. Ты пытаешься модифицировать это заклинание или перенести его в другой мод? 2. Какое у ГГ значение атрибута "интеллект" (переменная ATR_INTELLECT)? 3. Был ли сделан выбор в пользу стихии Камня? Тогда заклинания Стражей будут наносить удвоенный урон - смотри скрипт AI\Magic\C_CanNpcCollideWithSpell.d:
1. Я делаю патч на мод Dimmella "Slash'n Craft". В теме о багах, писали про этот косяк с руной. Хочется исправить её, чтобы работала корректно.
2. Интеллект = 20.
3. Нет, выбор стихии не был сделан.
4. Этого я не знаю.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.563
Благодарности
4.157
Баллы
915
Хмм... Не знаю, что сказать, т.к. я не изучал скриптов SnC v1.0.F8 (только неофициального обновления v1.12.9).
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Ребята, делаю квест. По квесту необходимо, чтоб при появлении определенного предмета, в моем случае фрагмента плитки, начинался квест.

Дальнейшее общение по квесту, зависит от гильдии ГГ. Я сделал зацикленный триггер, прописал диалоги, но... я никак не могу сделать старт квеста. Ведь обычно квесты берутся через диалог, либо, как с хроманином, через прочтение документа.

Вот мой скрипт триггера, как я понимаю, старт должен идти через него.




Код:
func void EVT_TABLEFRAGMENT_01_FUNC()
{
if((hero.guild == GIL_KDF) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_01,"Я нашел фрагмент таблички. Надо бы показать его Пирокару");
}
else if((hero.guild == GIL_NOV) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_01,"Я нашел фрагмент таблички. Надо бы показать его Пирокару");
}
else if((hero.guild == GIL_MIL) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_02,"Я нашел фрагмент таблички. Надо бы показать его лорду Хагену");
}
else if((hero.guild == GIL_PAL) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_02,"Я нашел фрагмент таблички. Надо бы показать его лорду Хагену");
}
else if((hero.guild == GIL_SLD) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_03,"Я нашел фрагмент таблички. Надо бы показать его Ли");
}
else if((hero.guild == GIL_DJG) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_03,"Я нашел фрагмент таблички. Надо бы показать его Ли");
}
else if((hero.guild == GIL_KDW) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_04,"Я нашел фрагмент таблички. Надо бы показать его Ватрасу");
}
else if((hero.guild == GIL_NDW) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_04,"Я нашел фрагмент таблички. Надо бы показать его Ватрасу");
}
else if((hero.guild == GIL_KDM) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_05,"Я нашел фрагмент таблички. Надо бы показать его Ксардасу");
}
else if((hero.guild == GIL_NDM) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_05,"Я нашел фрагмент таблички. Надо бы показать его Ксардасу");
}
else if((hero.guild == GIL_GUR) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_06,"Я нашел фрагмент таблички. Надо бы показать его идолу Орану");
}
else if((hero.guild == GIL_SEK) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_06,"Я нашел фрагмент таблички. Надо бы показать его идолу Орану");
}
else if((hero.guild == GIL_TPL) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_07,"Я нашел фрагмент таблички. Надо бы показать его Гор На Кошу");
}
else
{
Wld_SendTrigger("NGSTPLFR_TRG_01");
};
};

И еще вопрос. Можно ли сократить выше приведенный скрипт, написав не

Код:
if((hero.guild == GIL_KDF) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_01,"Я нашел кусок таблички. Надо бы показать его Пирокару");
}
else if((hero.guild == GIL_NOV) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0))
{
B_LogEntry(TOPIC_NgStPlFr_01_01,"Я нашел кусок таблички. Надо бы показать его Пирокару");
}

а

Код:
if(((hero.guild == GIL_KDF) || (hero.guild == GIL_NOV) && (Npc_HasItems(hero,ItMi_Ng_Stone_Plate_Fragment_02) > 0)))
{
B_LogEntry(TOPIC_NgStPlFr_01_01,"Я нашел фрагмент таблички. Надо бы показать его Пирокару");
 
Сверху Снизу