Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Lex
Все, что связанно со скриптами, постить СЮДА.
Plut
Вот бы мне кто разъяснил как катсцены писать... Если будут желающие - пришлю пример с описанием... Интересно очень...
Aiwan
Хм... Что именно ты хочешь узнать, Plut ?
LexSuS
вот у меня вопрос: (уже зажовал)
можно ли с помощю скрипта сделать такую фичу:
когда герой вынимает из инветаря определенный итем в руки должен появлятся источник непрерывного звука от героя, а при уберании предмета - должен пропадать звук.
Aiwan
Можно сделать ОДИН звук на всю арену и кретить его в каждой новой арене, такой что бы гонялся за РС с оружием можно, но ужасно геморно, дестрой-креет.
Bot
Прива. Как сделать рельную проклятую вещь(которая не снимается вообще, а не снимается и тут же ождивается. Пртмер- в кампании друид , превращаясь в минотавра, получает топорик, а снять его не може ВООБЩе). Пока есть вот что:
Neverwinter Script Source
//вставить в onUnequip
int isCursed(object oItem)
{
    if (!GetIsObjectValid(oItem))
    { return FALSE; }
    if (GetLocalInt(oItem,"ImmediateUncursed"))
    { return FALSE; }
    else if (GetLocalInt(oItem,"Cursed"))
    { return TRUE; }
    else if (GetStringRight(GetTag(oItem),6) == "Cursed")
    { return TRUE; }
    else
    { return FALSE; }
}

void main()
{
    object oItem = GetPCItemLastUnequipped();
    object oPC = GetPCItemLastUnequippedBy();
    if (isCursed(oItem))
    {

        object oCopy = CopyItem(oItem,oPC,TRUE);
        int nSlot = GetLocalInt(oItem,"InventorySlot");
        if (nSlot != -1)
        {
            if (nSlot == INVENTORY_SLOT_RIGHTHAND)
            {
                object oRightHand = GetItemInSlot(nSlot,oPC);
                object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
                if (isCursed(oRightHand))
                {
                    if (isCursed(oLeftHand))
                    {
                        SetLocalInt(oRightHand,"ImmediateUncursed",1);
                        DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, INVENTORY_SLOT_RIGHTHAND)));
                        DelayCommand(0.1, SetLocalInt(oRightHand, "ImmediateUncursed", 0));
                    }
                    else
                    {
                        DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, INVENTORY_SLOT_LEFTHAND)));
                    }
                }
                else
                {
                    DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, nSlot)));
                }
            }
            else
            {
                object oCurrent = GetItemInSlot(nSlot,oPC);
                if (isCursed(oCurrent))
                {
                    SetLocalInt(oCurrent,"ImmediateUncursed",1);
                    DelayCommand(0.1, SetLocalInt(oCurrent, "ImmediateUncursed", 0));
                }
                DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, nSlot)));
            }
        }
         DestroyObject(oItem,0.01);
    }
}






//вставить в onEquip

void main()
{
    object oItem = GetPCItemLastEquipped();
    object oPC = GetPCItemLastEquippedBy();
    //AssignCommand(oPC,SpeakString("Item Equipped!",TALKVOLUME_SILENT_SHOUT));
    if ((GetLocalInt(oItem,"Cursed") == 1) || (GetStringRight(GetTag(oItem),6) == "Cursed"))
    {
        effect eCurse = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), EffectCurse(2, 2, 2, 2, 4, 2));
        ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCurse,oPC);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY)), oPC);
        int nSlot = 0;
        int nSlotEquipped = -1;
        while ((nSlot < 18) && (nSlotEquipped == -1))
        {
            if (GetItemInSlot(nSlot,oPC) == oItem)
            {
                nSlotEquipped = nSlot;
            }
            nSlot++;
        }
        SetLocalInt(oItem,"InventorySlot",nSlotEquipped);
        FloatingTextStringOnCreature(GetName(oPC) + " equipped a cursed item.",oPC);
    }
}

//а этот файл сохраните под именем nw_s0_remeffect

#include "X0_I0_SPELLS"
#include "x2_inc_spellhook"
void main()
{
if (!X2PreSpellCastCode()){}
    int nSpellID = GetSpellId();
    object oTarget = GetSpellTargetObject();
    int nEffect1;
    int nEffect2;
    int nEffect3;
    int bAreaOfEffect = FALSE;
    effect eVis = EffectVisualEffect(VFX_IMP_REMOVE_CONDITION);
  if(nSpellID == SPELL_REMOVE_BLINDNESS_AND_DEAFNESS)
    {
        nEffect1 = EFFECT_TYPE_BLINDNESS;
        nEffect2 = EFFECT_TYPE_DEAF;
        bAreaOfEffect = TRUE;
    }
    else if(nSpellID == SPELL_REMOVE_CURSE)
    {
        nEffect1 = EFFECT_TYPE_CURSE;
        int nSlot = 0;
        object oItem;
        object oUncursed;
        string sUncursedForm;
        while (nSlot < 18)
        {
            oItem = GetItemInSlot(nSlot,oTarget);
            if ((GetLocalInt(oItem,"Cursed") == 1) || (GetStringRight(GetTag(oItem),6) == "Cursed"))
            {
                sUncursedForm = GetLocalString(oItem,"UncursedVersion");
                if (sUncursedForm == "")
                {
                    sUncursedForm = GetStringLeft(GetStringLowerCase(GetTag(oItem)),GetStringLength(GetTag(oItem)) - 6);
                }
                oUncursed = CreateItemOnObject(sUncursedForm,oTarget);
                if (GetIdentified(oItem))
                {
                    SetIdentified(oUncursed,TRUE);
                }
                SetLocalInt(oItem,"ImmediateUncursed",1);
                DestroyObject(oItem,0.1);
                FloatingTextStringOnCreature(GetName(oItem) + " is no longer cursed.",oTarget,FALSE);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_HOLY_SILENT), oTarget);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_HOLY_SILENT), oTarget);
            }
            nSlot++;
        }
    }
    else if(nSpellID == SPELL_REMOVE_DISEASE || nSpellID == SPELLABILITY_REMOVE_DISEASE)
    {
        nEffect1 = EFFECT_TYPE_DISEASE;
        nEffect2 = EFFECT_TYPE_ABILITY_DECREASE;
    }
    else if(nSpellID == SPELL_NEUTRALIZE_POISON)
    {
        nEffect1 = EFFECT_TYPE_POISON;
        nEffect2 = EFFECT_TYPE_DISEASE;
        nEffect3 = EFFECT_TYPE_ABILITY_DECREASE;
    }

    if (bAreaOfEffect == TRUE)
    {
        effect eImpact = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
        effect eLink;
        spellsGenericAreaOfEffect(OBJECT_SELF, GetSpellTargetLocation(), SHAPE_SPHERE, RADIUS_SIZE_MEDIUM,
            SPELL_REMOVE_BLINDNESS_AND_DEAFNESS, eImpact, eLink, eVis,
            DURATION_TYPE_INSTANT, 0.0,
            SPELL_TARGET_ALLALLIES, FALSE, TRUE, nEffect1, nEffect2);
        return;
    }
     SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID, FALSE));
     RemoveSpecificEffect(nEffect1, oTarget);
    if(nEffect2 != 0)
    {
        RemoveSpecificEffect(nEffect2, oTarget);
    }
    if(nEffect3 != 0)
    {
        RemoveSpecificEffect(nEffect3, oTarget);
    }
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}

// чтобы создать проклЯтую(неснимаемую) вещь, надо просто присвоить ей тэг &#39;XCursed&#39;, где Х - уникальное имя //шмотки. Авторство - CelestialRyan.

<small>Добавлено в 14:47</small>
LexSuS , можно попробовать на онХертбит мода, но это не есть гут, ибо ресурсы жрет. Попытайся вставалять цикл в онЭкьюп мода(не забудь добавить гетИзОбъектВалид(чтоб пропадал при снимании, хотя можно эзать и онАнэкьюп)).
Tomb
2All: как вы уже наверное прочитали мы сейчас начали внутренее тестирование мультиплеерного модуля... и вылез очень наприятный баг... в начале модуля камера глючит и как будто привязана к НПС... короче говоря она не привязана к перцу... А это сами понимаете черевато...
ПОМОГИТЕ НАРОД... help.gif А то блин этот глюк ваще не к месту..
Lex
С мультискриптами никто из нас не работал cray.gif cray.gif
Рамна или Вирус могут помочь.
__________________________________
с катсценами: уже ОЧЕНЬ мого раз поднималась эта тема. Более того, на рельсах лежит скрипт ДБ начального мультика. (не в базе, а где-то еще)
__________________________________
о проклятых вещах: знаю только снял - тут-же оделась. Чтобы вообще не снималось..незнаю.
Auren
Вообщем описываю ситуацию. Это про с-му смерти. Предположим ПС умирает и на сервере случается рестарт. После него он опять заходит и должен телепортнуться со стартовой зоны на кладбище например. У меня он заходит и лежит мертвый сразу на старте. Ничаво не получается. Я стока уже вариантов перепробывал и ничего=(( Как сделать? Еще вопрос: когда ставлю на он клентер вот такое условие:

if (GetArea(oPC)==GetObjectByTag("lc_startzone"))

Возвращает ли GetArea локацию, где стоит точка старта?
Bot
Насчет мульта ДБ: он там хитренько запрятан dirol.gif даже не помню где нашел его... Кому надо - могу выложить... хотя смысл: если ДБ против-все равно удалит, если за-может выложитьб и целый(там только первых строчек 60)
Добавлено в [mergetime]1082385478[/mergetime]
Auren[LFL] Зачем тебе это? Не проще ли создать локэйшн на месте старта ПС(через ГетЛокэйшН)? А если так, то зачем проверка?

Добавлено в [mergetime]1082385697[/mergetime]
про прокляты вещицы: на рилмсах добрый человек(Каа вроде) подсказал, что можно не скриптово, а 2да-шно- полиморфить в ПС но в графе веапн писать нужное оружие. Попробую, хотя времени нет ни... вообще нет, короче
Auren
Сенк, я уже разобрался=)
Lex
Tarre Talliorne, дай ссылку на тот пост Каа, пожалуйста
Aiwan
Tarre Talliorne я могу выложить мульты в теме наших скриптов, если надо. Но они не влазят, там например в финале 600 строк кода, а сколько знаков wacko.gif так что кусок могу выложить, вернее два варианта как можно писать.
Bot
Aiwan, неа, мне зачем-то, я сам могу катсцену написать (сейчас кстати пишу одну.... шедевр - уже 22000(!) символов). Лучше, чтоли, статью напиши(иногда поражаюсь своей наглости lol.gif ). Что-тто типа Основы Создания КатСцен.

Lex Извини, ссылку кинуть не могу, поищи в теме скрипты на стр. 19(рельсы, конечно).

И парочка моих вопрософф:
1. Можно ли определять момент кражи как-нибудь иначе, чем через хертбитные проверки наличия итема в инвентор НПС?
2. Можно ли определять уровень ПС проще, чем суммируя все его уровни в разных областях?
3. Точно ли в НВН воспроизведены правила 3 редакции относительно возраста ПС?
Lex
1. если ворует Игрок то можно. Модульные скрипты - получение предмета. (не помню, как на инглиш)
2. Имхо, самый простой способ это просумировать левелы по классам (их всего-то три. Слот 1, Слот 2, Слот 3)
3. Нет. Там вообще возраст нафиг не нужен. Даже функции нет GetAge()
Tomb
Lex help.gif помоги со скриптами для AI бота...
Aiwan
Tomb у Лекса работы по ... unsure.gif Лучше Баал попроси good.gif Он помогет, наверняка.
Elven king
На рельсах уже просил такой скрипт, но попрашу и тут smile.gif
Нужен такой скриптик:
Когда нпц ведет игрока он должен останавливатся если игрок находится от него в четырех метрах и подгонять игрока.
Aiwan
Могу дать свой код, где Стинки ведет игрока к пролому в стене. Годится?
Elven king
Годится. smile.gif
DBColl
2Tarre Talliorne.
Цитата
1. Можно ли определять момент кражи как-нибудь иначе, чем через хертбитные проверки наличия итема в инвентор НПС?
2. Можно ли определять уровень ПС проще, чем суммируя все его уровни в разных областях?


Лекс, теск, я тебя исправлю wink3.gif.
1. Момент кражи. Есть событие OnDisturb - по нему можно смотреть момент изъятия-приема предмета (плэйсэблом, неписью)...
2. Можно. GetHitDice(oPC).
Aiwan
Вейпов должно быть столько сколько я нарисовал, но либо меньше 10 ли бо больше чем у меня. Почему? Не знаю, неделю гонял Стинки по вейпам и он гад прыгал на некоторые из них при количестве 10, а так нет. Идет как миленький.
и расчитай скорость так, что бы НПС НЕ ЗАСТРЯЛ и не опаздал на 15 сек до точки. Иначе вы просто прыгнете на следующий вейп и диалог прервется. А так он остановится и продолжите диалог.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: am_pc_stinki_go2
//:://////////////////////////////////////////////
/*
  ПЕРЕДВИЖЕНИЕ оРС ЗА НПС, СКРИПТ СТАВИТСЯ
    НА СТРОКУ В ДИАЛОГЕ oPC (!)

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 20.03.2004
//:://////////////////////////////////////////////
void main()
{
    object oPC = GetPCSpeaker();
    object oStinki = GetObjectByTag("MM_STINKI");
    object oWp01 = GetObjectByTag("WP_STINKI_01");
    object oWp02 = GetObjectByTag("WP_STINKI_02");
    object oWp03 = GetObjectByTag("WP_STINKI_03");
    object oWp04 = GetObjectByTag("WP_STINKI_04");
    object oWp05 = GetObjectByTag("WP_STINKI_05");
    object oWp06 = GetObjectByTag("WP_STINKI_06");
    object oWp07 = GetObjectByTag("WP_STINKI_07");
    object oWp08 = GetObjectByTag("WP_STINKI_08");
    object oWp09 = GetObjectByTag("WP_STINKI_09");
    object oWp10 = GetObjectByTag("WP_STINKI_10");
    object oWp11 = GetObjectByTag("WP_STINKI_11");
    object oDoor = GetObjectByTag("AM_DOOR_FLEG_NO");
    effect eHaste = EffectHaste(); // ЧТО БЫ ИГРОК НЕ ОТСТАВАЛ!

    SetLocalInt(oPC, "STINKI", 3);
    AssignCommand(oStinki, ActionPauseConversation());
    AssignCommand(oPC, ActionForceFollowObject(oStinki, 4.0f));
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHaste, oPC, 9999.0);
    AssignCommand(oStinki, ActionDoCommand(SetCommandable(FALSE, oPC)));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp02, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не отставай!")));
    AssignCommand(oStinki, ActionWait(1.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp03, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp04, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не сильно быстро?")));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp05, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oDoor, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не обращай внимание, нас никто не тронет.")));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp06, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp07, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp08, TRUE, 1.0));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Мы почти пришли!")));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp09, TRUE, 1.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp10, TRUE, 1.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp11, TRUE, 1.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(RemoveEffect(oPC, eHaste)));
    AssignCommand(oStinki, ActionDoCommand(SetCommandable(TRUE, oPC)));
    AssignCommand(oStinki, ActionResumeConversation());
}
Elven king
Ну спасибо! good.gif
Теперь опять вопросик, даже два smile.gif
1. Как сделать так чтобы когда все враги в локе будут мертвы, в журнале появляется запись... это наверное просто, но я не догоняю.
2. Непись стоит в хайде, но когда ПК отходит на пять метров, то НПЦ подкрадывается к нему и атакует, как это реализовать?
DBColl
2Elven king
1. Сделать всех врагов в локе в какой-нить пометкой допустим в поле Deity. Проверить всех существ с наличием этой метки GetDeity.
Можно вообще по всякому, и фракцию проверить и еще че-нить... wink3.gif
2. Это сложно. Надо писать скрипт поведения в UserDefined событии. Сейчас нет времени его написать, правлю баги первой части Левора... А вообще если сам прорвешься, то научишься кой-чему в скриптинге AI. Кстати, самая сложная часть скриптинга... Попробуй начать сам. Когда появятся более детальные вопросы - с удовольствием ответим wink3.gif.
Aiwan
Цитата
1. Как сделать так чтобы когда все враги в локе будут мертвы, в журнале появляется запись... это наверное просто, но я не догоняю

На OnDeath поставь переменную
Neverwinter Script Source
SetLocalInt(oPC, "KILL", GetLocalInt(oPC, "KILL") + 1); // На каждом НПС при смерти будет для оРС +1 переменная
Как только она будет равна количеству твоих враггов, например их 10 в локации...

if (GetLocalInt(oPC, "KILL") >= 10)
{
  AddJournalQuestEntry("TAG_JRNALA", 1, оPC);
}

Это для одиночной компании.

Для крутого шарда сделай так: Поставь в закрытой локе СУПЕР МАНЬЧКИНА НПС с фракцией врага.

И дальше проверка на наличие в локации этих врагов путем сравнивания с Боссом:
Neverwinter Script Source
{
    object oNPC = GetFirstObjectInShape(SHAPE_CUBE, 250.0, GetLocation(GetFirstPC()));
    object oBOSS = GetObjectByTag("KRUSHIMORDA_FACTION_LEADER");
    while (GetIsObjectValid(oNPC))
    {
      if (GetFactionEqual(oNPC, oBOSS))
      {
        return FALSE;
      }
      oNPC = GetNextObjectInShape(SHAPE_CUBE, 250.0, GetLocation(GetFirstPC()));
    }
    return TRUE;
}

// КОД DBColl-a

Можешь вместо

Neverwinter Script Source
// GetFirstObjectInShape
// ВЗЯТЬ
GetFirstObjectInArea
object oArea= GetArea(OBJECT_SELF);  // ТИПА ТУТА smile.gif


В общем кумекай... blum3.gif
2GoDoom
Заинтерисовала идея Элвен Кинга... Начал реализовывать...
Атакует не из хайда (хотя в хайд на долю секунды уходит - когда двигается ко мне - из хайда опять же выходит).
Не подскажите как написать чтобы моб из хайда долбил?
Код писал сам. smile.gif
Код

//Ставиться в OnPerception (При замечении).
void main()
{
object oPC = GetLastPerceived(); //Определяем Объект как ПОСЛЕДНИЙ УВИДЕННЫЙ
if(GetIsPC(oPC)) //Проверяем является увиденный объект ПС
{
ClearAllActions(FALSE); //Убираем все действия из списка действий к моба (кроме АТАКИ - если он уже дерется)
ActionUseSkill(SKILL_HIDE,OBJECT_SELF); //Моб уходит в хайд
ActionWait(1.5); //Ждет долю секунды
ActionMoveToObject(oPC, FALSE, 1.0f); //Медленно двигается к ПС
ActionAttack(oPC, FALSE); //Атакует (Агрессивно)
} else
{
ActionSpeakString("Хух, напугал!", TALKVOLUME_TALK); //Если это не ПС говорит фразу "Хух, напугал!" в talk (разговор).
}
}


Моб - гоблин, 7 вора и 1 шадоуденсер.
DBColl
Попробуй через SetSpawnInCondition(NW_FLAG_STEALTH_MODE); вроде так пишется...

А еще у тебя ошибка в определении Perception. Надо делать дополнительную проверку на GetIsPerseptionSeen();.

GetLastPerceived срабатывает, когда объект увиден-услышан-перестал быть видимым-перестал быть слышимым. Поэтому надо дополнительно проверять.
2GoDoom
Окей, спасибо! smile.gif
Будем разбираться дальше smile.gif
Plut
Народ, всвязи с моим не оч хорошим знанием правил AD&D, разъясните глупому, как правильно кидаются кости. Например, на убеждение при диалоге.
2GoDoom
хм... На убеждение при диалоге? Это типа в тех что в Сингле? (обычно кубики там кидаются как укажешь). smile.gif
Plut
Цитата
обычно кубики там кидаются как укажешь

Вот это я как раз понял. Существуют ли какие-то ограничения, кроме здавого смысла, по поводу того, сколько у какого перса могет быть конретного скилла (типа Persuade)?
DBColl
Это система зовется d20(). Кидается d20() + скилл, против d20() непися.
2GoDoom
Ага...

Цитата
Вот это я как раз понял. Существуют ли какие-то ограничения, кроме здавого смысла, по поводу того, сколько у какого перса могет быть конретного скилла (типа Persuade)?

Если я понял - это имеется ввиду какие ограничения на скилл? smile.gif
Когда я ДМил, через Лето повышал себе все статы - помойму 125 - максимум smile.gif
Sir_Sarles
1. Как попросить своего вора обокрасть какого-нибудь гражданина?

А как самому обокрасть его? Я воров обычно не перевариваю, но сделал
как-то для проверки вора 15 уровня, нарастил ему воровство по максимуму,
а все равно при попытке ограбить происходит облом.


(Спросил в другом месте, но тут вроде более по теме)
Как сделать так, что бы sir/madam (и т.п.) выдавали не "sir" или "мадам",
а другие определенные мной слова?
Aiwan
Цитата
Как сделать так, что бы sir/madam (и т.п.) выдавали не "sir" или "мадам",
а другие определенные мной слова?

Это надо делать свои <CUSTOM>, насколько я знаю. Но я их не делал, посему звиняй. Жди БДа или Лекса с Баалом.
Sir_Sarles
Конкретизирую про вора:
У вас есть хенчмен Томми. Вы сами воровать не умеете.

1) Вы говорите "Томми, проверь этого господина". И он кидается
проверять господина, на которого укажешь мышкой. Либо, если это невозможно,
то он сам определяет ближайшего господина в радиусе 1-5 метров либо
вообще ближайшего. Примерно так.

2) Дополнительное условие - чтобы не было
обломов. То биш Томми, получив приказ, кидает кости. Если результат не в его
пользу, то он говорит "облом, сир". Если нормально, то {ворует колечко и т.д.}
DBColl
Сарлес, я когда-то начинал писать эту системку, но боюсь не дописал и она де-то у меня потерялась... На самом деле здесь ничего сложного нет. Один диалоговый скриптик средних размеров. Скажу сразу, кликать мышой, указывая цель вора, не получится. Придется делать что-то вроде "поиска ближайшего нейтрала к PC" и броски костей. Сам я сейчас не сяду писать этот скрипт (банально нет времени), ты уж попробуй сам. Что будет в упор непонятно - спрашивай. Если надо могу расписать по броскам:
[d20 + скилл PickPocket за вора] против [d20 за непися].
Sir_Sarles
Как называются функции "украсть что-то у кого-то" и "получить результат броска?"
Osiris
Начал разбираться в днём и ночью. в OnSP простолюдинов повесил скрипт


#include "NW_O2_CONINCLUDE"
#include "NW_I0_GENERIC"

void main()
{
SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);
SetListeningPatterns();
WalkWayPoints();
}

Осталось дело за малым, создать дневные и ночные POST-ы, а вот как это сделать я не понимаю. Помогите пожалуйста.

Спасибо.
DBColl
Sir_Sarles А зачем тебе это???
ActionUseSkill(SKILL_PICKPOCKET, ...), но я бы писал собственную функцию с ActionTakeItem(...) с посылом далее кастомного Event'а этому неписю, у которого крадут. Этот эвент и сам процесс кражи обрабатывается уже само собой неписем (можно даже подвязать к OnDisturb непися). Результат броска делаешь сам, внешний. Пример:
Код

if (d20() < d20() + скилл кражи хенча)
{
....... кража удачна
}
else
{
....... облом-с
}


Osiris
Ставишь пост с таким тэгом:
Дневной - POST_[тэг непися]
Ночной - NIGHT_[тэг непися]

Можно тоже самое сделать с вейпами (чтобы ходили по-разному днем и ночью)
Дневной - WP_[тэг непися]_[номер вейпа]
Ночной - WN_[тэг непися]_[номер вейпа]

Само собой это все без квадратных скобок. wink3.gif
Sir_Sarles
В моем модуле, у одного типа есть кольцо регенерации, которое следует украсть. smile.gif На весь модуль это единственный предмет, поддающийся краже, поэтому надо бросить игроку подсказку на эту тему. smile.gif
Спасибо, попробую разобраться
DBColl
Тогда 100% тебе надо писать единичный (не универсальный скрипт!). Это проще. Ты можешь вообще привязаться жестко к скиллу игрока или хенча и написать скрипт через диалог, всплывающий в том месте локи, де ты планируешь украсть это кольцо. Через триггер всплывет wink3.gif. Помоему проще и быстрее всего. В конце диалога проверка скиллов и прочего и соответственно результирующие ветки. Удачи! wink3.gif
Doc Feert
Вот здесь есть пара скриптов.
Auren
Вот вопрос. Какая функция(если такая есть) возвращает тип робы. Вообщем ситуация такая: нужен скрипт, который запрещал бы использование предмета, если на ПС одета роба не первого типа.
Doc Feert
Такой функции нет.
Elven king
Нужен ну ооочень простой скрипт, но я не знаю как его сделать smile.gif
Вобщем игрок наступает на тригер и у него начинается разговор с неписем (это я знаю как сделать)
После разговора этот тригер должен удаляться для того чтобы повторное наступление на тригер не привело к повторному разговору, как это сделать?
Lex
удали триггер сразу после наступания
Добавлено в [mergetime]1086971357[/mergetime]
те так:
.....
AssignCommand(oNPC,ActionStartConversation(..));
DestroyObject(OBJECT_SELF,0.5);
.....
Добавлено в [mergetime]1086971480[/mergetime]
надеюсь система триггер-диалог у тебя универсальна, не под каждого НПС отдельный скрипт?
Elven king
Нет, скрипт вобще так выгледет:
Код
void main()
{
object oPC = GetEnteringObject();
object oNPC = GetObjectByTag("TAG_SIGILSTUDENT");
if (GetIsPC(oPC))
{
AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE));
AssignCommand(oNPC, ActionStartConversation(oPC));
DestroyObject(OBJECT_SELF,0.5);
}
}

А как сделать что бы он был уневерсальным не подскажешь?
Lex
из
object oNPC = GetObjectByTag("TAG_SIGILSTUDENT");
сделай
object oNPC = GetNearestObjectByTag(GetTrapKeyTag(OBJECT_SELF));

тогда этот скрипт будет для любого НПС, если в поле KeyTag ты запишешь ТЭГ нужного тебе НПС для ДАННОГО тригера
Aiwan
Elven king вот простое решение твоей проблемы.

Код

void main()
{
object oPC = GetEnteringObject();
object oNPC = GetObjectByTag("TAG_SIGILSTUDENT");
if (GetIsPC(oPC) && !GetLocalInt(OBJECT_SELF, "STOP"))
  {
  SetLocalInt(OBJECT_SELF, "STOP", TRUE);
  AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE));
  AssignCommand(oNPC, ActionStartConversation(oPC));
  }
}

Удаление триггера черевато боком lol.gif Может рухнуть набор акций, если у тебя длинный код.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2019 Invision Power Services, Inc.