Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Neverwinter Nights Aurora Toolset _ Скрипты

Автор: Lex Mar 27 2004, 21:58

Все, что связанно со скриптами, постить СЮДА.

Автор: Plut Apr 8 2004, 19:41

Вот бы мне кто разъяснил как катсцены писать... Если будут желающие - пришлю пример с описанием... Интересно очень...

Автор: Aiwan Apr 8 2004, 21:08

Хм... Что именно ты хочешь узнать, Plut ?

Автор: LexSuS Apr 9 2004, 04:24

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

Автор: Aiwan Apr 9 2004, 04:29

Можно сделать ОДИН звук на всю арену и кретить его в каждой новой арене, такой что бы гонялся за РС с оружием можно, но ужасно геморно, дестрой-креет.

Автор: Bot Apr 9 2004, 14:44

Прива. Как сделать рельную проклятую вещь(которая не снимается вообще, а не снимается и тут же ождивается. Пртмер- в кампании друид , превращаясь в минотавра, получает топорик, а снять его не може ВООБЩе). Пока есть вот что:

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 Apr 16 2004, 08:57

2All: как вы уже наверное прочитали мы сейчас начали внутренее тестирование мультиплеерного модуля... и вылез очень наприятный баг... в начале модуля камера глючит и как будто привязана к НПС... короче говоря она не привязана к перцу... А это сами понимаете черевато...
ПОМОГИТЕ НАРОД... help.gif А то блин этот глюк ваще не к месту..

Автор: Lex Apr 18 2004, 17:51

С мультискриптами никто из нас не работал cray.gif cray.gif
Рамна или Вирус могут помочь.
__________________________________
с катсценами: уже ОЧЕНЬ мого раз поднималась эта тема. Более того, на рельсах лежит скрипт ДБ начального мультика. (не в базе, а где-то еще)
__________________________________
о проклятых вещах: знаю только снял - тут-же оделась. Чтобы вообще не снималось..незнаю.

Автор: Auren Apr 19 2004, 12:00

Вообщем описываю ситуацию. Это про с-му смерти. Предположим ПС умирает и на сервере случается рестарт. После него он опять заходит и должен телепортнуться со стартовой зоны на кладбище например. У меня он заходит и лежит мертвый сразу на старте. Ничаво не получается. Я стока уже вариантов перепробывал и ничего=(( Как сделать? Еще вопрос: когда ставлю на он клентер вот такое условие:

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

Возвращает ли GetArea локацию, где стоит точка старта?

Автор: Bot Apr 19 2004, 17:33

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

Добавлено в [mergetime]1082385697[/mergetime]
про прокляты вещицы: на рилмсах добрый человек(Каа вроде) подсказал, что можно не скриптово, а 2да-шно- полиморфить в ПС но в графе веапн писать нужное оружие. Попробую, хотя времени нет ни... вообще нет, короче

Автор: Auren Apr 19 2004, 17:43

Сенк, я уже разобрался=)

Автор: Lex Apr 19 2004, 19:17

Tarre Talliorne, дай ссылку на тот пост Каа, пожалуйста

Автор: Aiwan Apr 19 2004, 20:28

Tarre Talliorne я могу выложить мульты в теме наших скриптов, если надо. Но они не влазят, там например в финале 600 строк кода, а сколько знаков wacko.gif так что кусок могу выложить, вернее два варианта как можно писать.

Автор: Bot Apr 20 2004, 11:58

Aiwan, неа, мне зачем-то, я сам могу катсцену написать (сейчас кстати пишу одну.... шедевр - уже 22000(!) символов). Лучше, чтоли, статью напиши(иногда поражаюсь своей наглости lol.gif ). Что-тто типа Основы Создания КатСцен.

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

И парочка моих вопрософф:
1. Можно ли определять момент кражи как-нибудь иначе, чем через хертбитные проверки наличия итема в инвентор НПС?
2. Можно ли определять уровень ПС проще, чем суммируя все его уровни в разных областях?
3. Точно ли в НВН воспроизведены правила 3 редакции относительно возраста ПС?

Автор: Lex Apr 21 2004, 18:21

1. если ворует Игрок то можно. Модульные скрипты - получение предмета. (не помню, как на инглиш)
2. Имхо, самый простой способ это просумировать левелы по классам (их всего-то три. Слот 1, Слот 2, Слот 3)
3. Нет. Там вообще возраст нафиг не нужен. Даже функции нет GetAge()

Автор: Tomb Apr 22 2004, 08:13

Lex help.gif помоги со скриптами для AI бота...

Автор: Aiwan Apr 22 2004, 08:33

Tomb у Лекса работы по ... unsure.gif Лучше Баал попроси good.gif Он помогет, наверняка.

Автор: Elven king May 4 2004, 00:19

На рельсах уже просил такой скрипт, но попрашу и тут smile.gif
Нужен такой скриптик:
Когда нпц ведет игрока он должен останавливатся если игрок находится от него в четырех метрах и подгонять игрока.

Автор: Aiwan May 4 2004, 08:31

Могу дать свой код, где Стинки ведет игрока к пролому в стене. Годится?

Автор: Elven king May 4 2004, 09:45

Годится. smile.gif

Автор: DBColl May 4 2004, 13:08

2Tarre Talliorne.

Цитата
1. Можно ли определять момент кражи как-нибудь иначе, чем через хертбитные проверки наличия итема в инвентор НПС?
2. Можно ли определять уровень ПС проще, чем суммируя все его уровни в разных областях?


Лекс, теск, я тебя исправлю wink3.gif.
1. Момент кражи. Есть событие OnDisturb - по нему можно смотреть момент изъятия-приема предмета (плэйсэблом, неписью)...
2. Можно. GetHitDice(oPC).

Автор: Aiwan May 4 2004, 13:08

Вейпов должно быть столько сколько я нарисовал, но либо меньше 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 May 4 2004, 15:20

Ну спасибо! good.gif
Теперь опять вопросик, даже два smile.gif
1. Как сделать так чтобы когда все враги в локе будут мертвы, в журнале появляется запись... это наверное просто, но я не догоняю.
2. Непись стоит в хайде, но когда ПК отходит на пять метров, то НПЦ подкрадывается к нему и атакует, как это реализовать?

Автор: DBColl May 4 2004, 17:35

2Elven king
1. Сделать всех врагов в локе в какой-нить пометкой допустим в поле Deity. Проверить всех существ с наличием этой метки GetDeity.
Можно вообще по всякому, и фракцию проверить и еще че-нить... wink3.gif
2. Это сложно. Надо писать скрипт поведения в UserDefined событии. Сейчас нет времени его написать, правлю баги первой части Левора... А вообще если сам прорвешься, то научишься кой-чему в скриптинге AI. Кстати, самая сложная часть скриптинга... Попробуй начать сам. Когда появятся более детальные вопросы - с удовольствием ответим wink3.gif.

Автор: Aiwan May 4 2004, 18:55

Цитата
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 May 6 2004, 14:24

Заинтерисовала идея Элвен Кинга... Начал реализовывать...
Атакует не из хайда (хотя в хайд на долю секунды уходит - когда двигается ко мне - из хайда опять же выходит).
Не подскажите как написать чтобы моб из хайда долбил?
Код писал сам. 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 May 6 2004, 18:25

Попробуй через SetSpawnInCondition(NW_FLAG_STEALTH_MODE); вроде так пишется...

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

GetLastPerceived срабатывает, когда объект увиден-услышан-перестал быть видимым-перестал быть слышимым. Поэтому надо дополнительно проверять.

Автор: 2GoDoom May 7 2004, 10:12

Окей, спасибо! smile.gif
Будем разбираться дальше smile.gif

Автор: Plut May 10 2004, 19:53

Народ, всвязи с моим не оч хорошим знанием правил AD&D, разъясните глупому, как правильно кидаются кости. Например, на убеждение при диалоге.

Автор: 2GoDoom May 10 2004, 21:49

хм... На убеждение при диалоге? Это типа в тех что в Сингле? (обычно кубики там кидаются как укажешь). smile.gif

Автор: Plut May 10 2004, 23:04

Цитата
обычно кубики там кидаются как укажешь

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

Автор: DBColl May 12 2004, 00:26

Это система зовется d20(). Кидается d20() + скилл, против d20() непися.

Автор: 2GoDoom May 13 2004, 16:41

Ага...

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

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

Автор: Sir_Sarles May 25 2004, 20:55

1. Как попросить своего вора обокрасть какого-нибудь гражданина?

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


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

Автор: Aiwan May 25 2004, 21:20

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

Это надо делать свои <CUSTOM>, насколько я знаю. Но я их не делал, посему звиняй. Жди БДа или Лекса с Баалом.

Автор: Sir_Sarles May 26 2004, 08:24

Конкретизирую про вора:
У вас есть хенчмен Томми. Вы сами воровать не умеете.

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

2) Дополнительное условие - чтобы не было
обломов. То биш Томми, получив приказ, кидает кости. Если результат не в его
пользу, то он говорит "облом, сир". Если нормально, то {ворует колечко и т.д.}

Автор: DBColl May 28 2004, 01:11

Сарлес, я когда-то начинал писать эту системку, но боюсь не дописал и она де-то у меня потерялась... На самом деле здесь ничего сложного нет. Один диалоговый скриптик средних размеров. Скажу сразу, кликать мышой, указывая цель вора, не получится. Придется делать что-то вроде "поиска ближайшего нейтрала к PC" и броски костей. Сам я сейчас не сяду писать этот скрипт (банально нет времени), ты уж попробуй сам. Что будет в упор непонятно - спрашивай. Если надо могу расписать по броскам:
[d20 + скилл PickPocket за вора] против [d20 за непися].

Автор: Sir_Sarles May 29 2004, 22:28

Как называются функции "украсть что-то у кого-то" и "получить результат броска?"

Автор: Osiris May 30 2004, 16:31

Начал разбираться в днём и ночью. в 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 May 30 2004, 17:11

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

Код

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


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

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

Само собой это все без квадратных скобок. wink3.gif

Автор: Sir_Sarles May 30 2004, 18:29

В моем модуле, у одного типа есть кольцо регенерации, которое следует украсть. smile.gif На весь модуль это единственный предмет, поддающийся краже, поэтому надо бросить игроку подсказку на эту тему. smile.gif
Спасибо, попробую разобраться

Автор: DBColl May 30 2004, 23:39

Тогда 100% тебе надо писать единичный (не универсальный скрипт!). Это проще. Ты можешь вообще привязаться жестко к скиллу игрока или хенча и написать скрипт через диалог, всплывающий в том месте локи, де ты планируешь украсть это кольцо. Через триггер всплывет wink3.gif. Помоему проще и быстрее всего. В конце диалога проверка скиллов и прочего и соответственно результирующие ветки. Удачи! wink3.gif

Автор: Doc Feert Jun 3 2004, 19:35

Вот http://docfeert.narod.ru/z_cont.html есть пара скриптов.

Автор: Auren Jun 8 2004, 19:59

Вот вопрос. Какая функция(если такая есть) возвращает тип робы. Вообщем ситуация такая: нужен скрипт, который запрещал бы использование предмета, если на ПС одета роба не первого типа.

Автор: Doc Feert Jun 11 2004, 15:41

Такой функции нет.

Автор: Elven king Jun 11 2004, 19:06

Нужен ну ооочень простой скрипт, но я не знаю как его сделать smile.gif
Вобщем игрок наступает на тригер и у него начинается разговор с неписем (это я знаю как сделать)
После разговора этот тригер должен удаляться для того чтобы повторное наступление на тригер не привело к повторному разговору, как это сделать?

Автор: Lex Jun 11 2004, 19:28

удали триггер сразу после наступания
Добавлено в [mergetime]1086971357[/mergetime]
те так:
.....
AssignCommand(oNPC,ActionStartConversation(..));
DestroyObject(OBJECT_SELF,0.5);
.....
Добавлено в [mergetime]1086971480[/mergetime]
надеюсь система триггер-диалог у тебя универсальна, не под каждого НПС отдельный скрипт?

Автор: Elven king Jun 11 2004, 19:58

Нет, скрипт вобще так выгледет:

Код
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 Jun 11 2004, 20:13

из
object oNPC = GetObjectByTag("TAG_SIGILSTUDENT");
сделай
object oNPC = GetNearestObjectByTag(GetTrapKeyTag(OBJECT_SELF));

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

Автор: Aiwan Jun 12 2004, 07:55

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 Может рухнуть набор акций, если у тебя длинный код.

Автор: Lex Jun 12 2004, 16:27

Айв, не говори ерунды, если все через Assign то никакого удаления нет, так как очередь на НПС. Главное удалить триггер не сразу-же а с небольшой задержкой. полсекунды вполне хватает, чтобы длинющую очередь выстроить.

Автор: Aiwan Jun 12 2004, 17:04

Ну это ты знаешь. А он не волокет в тонкостях. Ему нужно просто и что бы было понятно и работало. Дальше он сам сделает как поймет. smile.gif

Автор: _kaa_ Jun 14 2004, 08:35

Вопрос по анимации. Как сделать анимацию атаки? Именно анимацию, а не заставить PC нападать. Констант таких я не нашел, возможно ли это?

Автор: DBColl Jun 14 2004, 11:07

Стандартными способами нельзя. Можно поменять саму анимацию, на одной из существующих констант. То есть выдрать анимацию одиночной атаки (допустим с длинным мечом) и заменить ею одну из существующих анимаций. Само собой без хака не обойтись. Подробнее я к сожалению не смогу объяснить. Надеюсь Айс это сделает smile.gif. [гы, глядя в сторону Айса...]

Автор: _kaa_ Jun 14 2004, 12:57

Не, спасибо. Либо просто - либо никак smile.gif

Автор: Lex Jun 14 2004, 16:52

да, к сожалению констант нет.

Автор: Elven king Jun 16 2004, 12:26

Такой вот вопрос, как вам кажется, как легче создать расовые плюшки для Дроу тоесть чтобы он мог сразу использовать темноту и как сделать волшебный огонь, который просто появляется как эффект вокруг жертвы?

Автор: DBColl Jun 17 2004, 09:46

Мне кажется здесь надо переписать чуток 2да по фитам и магии... По-другому вроде новые спеллы не дать...

Автор: Elven king Jun 17 2004, 11:44

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

Автор: Aiwan Jun 17 2004, 15:35

Elven king слишком пространнственный вопрос. Конкретней ситуацию опиши. Про спелл, можно надеть шкурку на РС. Но для шарда это не очень sad.gif

Автор: Elven king Jun 17 2004, 15:40

Нет, тут не для Шарда, а так для одиночной игры, вся ситуация сосотит в том, что мне нужно реализовать суб расу Дроу, которая как известно обладает двумя способностями(на даный момент хватает только спела).
И можетете ктонибудь сказать какой командой можно одеть эту шкуру?

Автор: aleVandal Jun 17 2004, 18:50

Такой вопрос:
можно ли каким нибудь образом восстановить игроку запомненные, но уже использованные спеллы (без отдыха)?
Ато я в тулсете знаю только возможность уменьшить количество кастов запомненного спелла, а вот обратной возможности так и не нашел... shout.gif

Автор: Aiwan Jun 17 2004, 19:10

2 Vestel

Этот скрипт ставишь на OnEnter локации. Делаешь невидимого монстра с нейтральной фракцией ко всем и делаешь его плотовым. Для диалога немного переделай. Сможешь?

Код

//::///////////////////////////////////////////////
//:: Name
//:: Copyright (c) 2004 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On:
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject(); // GetPCSpeaker();
  if (!GetIsPC(oPC) || GetLocalInt(oPC, "START_PC")) // ДЛЯ ЛОКАЦИИ
       {return;}
  if (GetIsPC(oPC))
    {
    SetLocalInt(oPC, "START_PC", TRUE);
    AssignCommand(oPC, ClearAllActions());
    object oSpeaker=CreateObject(OBJECT_TYPE_CREATURE,"ResRef_невидимого_НПС",GetLocation(oPC),FALSE);
    AssignCommand(oSpeaker, ActionStartConversation(oPC, "dlg_assignskills"));
    }
}


В конце своего диалога на слот Normal и слот Aborted делаешь кусочек кода:
Код
void main()
{
DestroyObject(OBJECT_SELF, 0.5);
}

Автор: Вестель Jun 17 2004, 19:10

Вопрос первый.
При первом входе персонажа на сервер, должен срабатывать скрипт, который начинает с ним диалог (вроде как на Энтарионе "система именных оружий" и т.д). Этот же диалог должен начинаться после каждого ЛевелАпа. Проверка на первость входа идет через стандартное Deity по факту наличия зарезервированных символов в котором и должен запускаться диалог.

С подсказки Aiwan'a была создана НПС (таг: "MCS_TALKMAN"), которой было заданно имя, которая будет вести диалог. Она спрятана в дальнюю локацию с названием "Секретная Лока" (таг: "SECRET_AREA").
При использывании конструкции:

Код
objeсt oMCS=GetObjectByTag("MCS_TALKMAN");
ActionStartConversation(oMCS,"dlg_testdialog",TRUE, TRUE);
диалог не начинается.
Может быть надо как-то указывать, что действие происходит в разных локациях или что? Буду рад любой помощи.

Вопрос второй.
В диалоге должна появляться фраза использующая переменные. Типа
Цитата
"Уже прошло 2.. 3.. 6.. 8.. дней из 11 отпущенных".
Переменную с LocalInt'a я считать могу, а вот, как вставить ее в диалог не разобрался. Может кто-нибудь подсказать?..

Автор: Aiwan Jun 17 2004, 19:20

2 Elven king делаешь шкурку со свойствами. Код впихивай хоть куда.

Код

void main()
{
 object oPC = GetFirstPC();
 DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC)); // если уже висит какая-нибудь шкурка
 object oItm = CreateItemOnObject("ResRef шкурки", oPC, 1);
 AssignCommand(oPC, ActionEquipItem(oItm,  INVENTORY_SLOT_CARMOUR));
}

Автор: Вестель Jun 17 2004, 19:46

В догонку:

как в том же диалоге сделать, чтобы до тех пор пока пользователь не выбрал "Выход" у него были одни и те же фразы?

Скрипт работает, только НПС почему-то не невидимый.. Как сделать? Я в непонятках.. Пробывал на него Перманентный Импрувнутый Инвиз вешать - не помогает..

Автор: DBColl Jun 17 2004, 21:15

Цитата
как в том же диалоге сделать, чтобы до тех пор пока пользователь не выбрал "Выход" у него были одни и те же фразы?

Делаешь Copy строки на которую надо переходить постоянно и вставляешь ее как Paste As Link в конец "цикличных" веток диалога.

Цитата
Скрипт работает, только НПС почему-то не невидимый.. Как сделать? Я в непонятках.. Пробывал на него Перманентный Импрувнутый Инвиз вешать - не помогает..

Не надо инвизов. В палитре есть невидимый непись. Полистай Appearance в свойствах существа. Invisible Creature вроде называется...

Автор: Aiwan Jun 17 2004, 21:36

Вестель как ты представляешь диалог, если твой персонаж за три девять земель? biggrin.gif Тогда уж так:

Код

void main()
{
object oPC = GetFirstPC();
object oMCS=GetObjectByTag("MCS_TALKMAN");
AssignCommand(oMCS, ActionJumpToObject(oPC));
AssignCommand(oMCS, ActionStartConversation(oPC,"dlg_testdialog",TRUE, TRUE));
}

Но если этот персонаж будет так же использован другим игроком? Лучше сделай код таким как я написал выше в посте. Создал, дестроил объект.

Автор: Вестель Jun 18 2004, 09:05

Создаваю, дестрою..

Цитата
В палитре есть невидимый непись. Полистай Appearance в свойствах существа. Invisible Creature вроде называется...

Null Human в моей (vts027) версии Toolset'а оно завется.. Но Invisible Creature я искал долго.. Теперь все работает..

Теперь если можно, расскажите по подробнее, как с токенами работать..

Автор: DBColl Jun 18 2004, 15:30

Токены устанавливаются через SetCustomToken(400, "стринг"); // 400 - это пример номера
Затем в диалоге ты просто пишешь <CUSTOM400> и вместо него в игре в диалоге появляется "стринг".

Вот и все wink3.gif.

Автор: Аваддон Jun 18 2004, 16:09

Я для вот думал как сделать такой скриптик ...
Заходит игрок в гостиницу отдохнуть, снимает номерок. Заходит туда и жмет рест. на ресте с него снимаются все шмотки и кладуться в шкаф а сам он рухает спать на коврик. Вокруг него темнеет сон длится минуту. Но это я все знаю как реализовать. Я вот что хотел:
Значит пока он спит рандомно в случае 1 из 40 допустим, включается SetCutScene то несть он не может отменить сон и управлять не может. В коридоре гостиницы появляется воришка, камера переходит к нему, он делает вид что ковыряется в двери, дверка открывается, он вскрывает шкаф со шмотом ПС копается там. После этого воришка убегает, CutScene заканчивается перс в стает и недощитывается в шкафу рандомно 2х вещей.

З.Ы. Но шмотки удалятся только если воришка откроет сундук, потому что вдруг там засаду устроятwink3.gif))

Автор: Aiwan Jun 18 2004, 20:45

Аваддон это можно реализовать, достаточно просто. Во время отдыха запускай функцию Random и как только получишь нужный вариант просто на задержку ставь скрипт, вот кусок кода:

Код

void main()
{
object oPC = GetFirstPC(); // или как надо определи оРС
int i = (Random(100));
if (i < 5)
 {
 DelayCommand(20.0, ExecuteScript("скрипт_сценки", oPC));
 }
}


Но тебе надо будет круто нарисовать катсценку. Вней все вейпы бери GetNearest**** что бы можно было в нескольких местах использовать. Ну и соответственно вейпы и прочее расставь везде.

Автор: Аваддон Jun 18 2004, 21:58

Ага, я вот еще что хотел спросить.
У меня GetObjectByTag отлично работает, а вот GetNearestObjectByTag вообще НОЛЬ! Не работает. Или надо это делать как AssignCommand?
Добавлено в [mergetime]1087585512[/mergetime]
P.S. 1. Зачем нужна задержка?
2.Как я понял Инта рандомно выпадает от 0 до 100, и если она меньше 5 то скрипт пускается? А как сделать чтобы вероятность была 1 из 40?

Автор: Aiwan Jun 18 2004, 22:37

Цитата
У меня GetObjectByTag отлично работает, а вот GetNearestObjectByTag вообще НОЛЬ! Не работает.

Не можеть такого быть. shok.gif Это одно и то же, только второе берет БЛИЖАЙШИЙ объект с таким тегом.
Задержка нужна для красоты crazy.gif просто будет прикольней отдохнуть немного и бац! Сценка.
Ну так посчитай, сделай рандом из 40 и прировняй int к постоянному числу, например 10. Будет твой результат. Но я что то не помню что бы 40 раз отдыхал в игре. Лучше уж 25% или 30...
Добавлено в [mergetime]1087587538[/mergetime]
У тебя объект надеюсь в ЭТОЙ ЛОКАЦИИ где происходит действие кат сценки? :?)

Автор: Аваддон Jun 19 2004, 00:52

Да, только Nearest я так к слову спросил потому что, у меня такая вещь на отдыхе - когда костер разжигаешь - дрова должны изчезнуть. Когда я пишу DestroyObject(GetNearestObjectByTag("rest_wood")); дрова не изчезают хотя я стою рядом с ними, но стоит мне написать DestroyObject(GetObjectByTag("rest_wood")); и бац - все работает.. Не понимаю в чем дело.

Автор: Аваддон Jun 19 2004, 08:27

А, все допер в чем ошибка. Там надо же еще писать от кого ближайший объект lol.gif
А теперь другой вопрос как сделать чтобы объект создавался с задержкой?
Ну например я срубил дерево а через 500сек там еще одно выросло?
Я пытался совместить DelayCommand и CreateObject - бестолку. Написал отдельную функцию - и поставил ее на дилэй - тоже не появляется..вот фигня какая.

Автор: Aiwan Jun 19 2004, 23:52

Вот кусок моей инклюды, работает все как часы. Хочешь просто объект, хочешь с новым тегом крееть.

Код

//::///////////////////////////////////////////////
//:: Name: am_libcutscen
//:: Copyright (c) 2004 WRG!
//:://////////////////////////////////////////////
/*
              БИБЛИОТЕКА ДЛЯ СЦЕН
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan      Aiwan@e-mail.ru
//:: Created On: 22.03.2004
//:://////////////////////////////////////////////

// ФУНКЦИЯ СОЗДАНИЯ ОБЪЕКТА С НОВЫМ ТАГОМ
// int iAnimation = АНИМАЦИЯ ПРИ ПОЯВЛЕНИИ
// string sNewTag = "НОВЫЙ_TAG_ОБЪЕКТА"
void ActionCreateNew(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag);
// ФУНКЦИЯ СОЗДАНИЯ item ОБЪЕКТА
// sItemTemplate - ResRef объекта
// oTarget - у кого создаем объект
// nStackSize - количество в стеке
void ActionCreateItem(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1);
//------------------------------------------------------------------------------
void ActionCreate(int nObjType, string sCreature, location lLoc);

void ActionCreate(int nObjType, string sCreature, location lLoc)
{
   CreateObject(nObjType, sCreature, lLoc);
}

void ActionCreateNew(int nObjType, string sCreature, location lLoc, int iAnimation, string sNewTag)
{
 CreateObject(nObjType, sCreature, lLoc, FALSE, sNewTag);
}

void ActionCreateItem(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)
{
 CreateItemOnObject(sItemTemplate,oTarget, nStackSize);
}
/*void main()
{

}


Код
DelayCommand(30.0, ActionCreate(sCreature, lLoc));

Это кусок кода из скрипта.
Код
   DelayCommand(33.5, ActionCreateItem("key_shop_nouse", oPC, 1));

Это тоже. Все пахает.

Автор: Аваддон Jun 20 2004, 23:01

Спасибоsmile.gif Так так, а кто у нас тут специалист по бд? Или может это не с БД связано...
Вообщем очень заинтересовался, как можно сделать сейф предметов для мультика? Тоесть человек положил в сейф предмет, ззакрыл, получил расписку и ушел. Сервак перезагрузился, он зашел отдал расписку, сказал кодовое слово и получил обратно свои предметы...
Если конечно ни у кого ничего такого не написано, то подайте хотябы идею как реализовать это. Вписывать теги всех вещей - исключено! Их там столько...

Автор: _kaa_ Jun 21 2004, 09:13

Цитата
Спасибо Так так, а кто у нас тут специалист по бд? Или может это не с БД связано...
Вообщем очень заинтересовался, как можно сделать сейф предметов для мультика? Тоесть человек положил в сейф предмет, ззакрыл, получил расписку и ушел. Сервак перезагрузился, он зашел отдал расписку, сказал кодовое слово и получил обратно свои предметы...
Если конечно ни у кого ничего такого не написано, то подайте хотябы идею как реализовать это. Вписывать теги всех вещей - исключено! Их там столько...


Есть несколько способов. Если хочешь именно с распиской за каждую вещь - можно не используя БД сделать сохранение любой вещи, _котороая есть в палитре_, конечно при условии, что у тебя модуль "как у людей" построен и тег==ресрефу.
С БД можно сохранять любые вещи, даже самодельные, выданные ДМ-ом. Расписка и кодовое слово тут не нужны, у каждого игрока свой инвентарь в сундуке (т.е. кто открыл - того сундук и прочитался). Есть ограничения на этот случай тоже.
1) если писать в БД все объекты сразу, то получишь большой лаг (по одному предмету - еще нормально). 2) При удалении из БД объекта размер самой базы не уменьшается и нужна принудителньая упаковка баз данных внешней утилитой.

В другом топике, "Шарды", я выложу пример такого сундука (в течение дня smile.gif )

Автор: Аваддон Jun 21 2004, 19:11

Интересная идея посетила. Вот воры крадут - это нормально ведь у кого то спот не прокачен. Но когда воры крадут в городе где полно охраны это уже прям не охрана а музей восковых фигур. Как можно прописать чтобы охрана становилась хостайл для вора если увидит что вор у кого то крадет?
Может OnHeartBit арены города поставить проверку -какие навыки используются и если используются PickPocket выставлять хостайл?

Автор: Lex Jun 21 2004, 19:40

на дистурб НПС напиши скрипт, чтобы он заорал Воры! Хватаешь ближайшего стражника и атакуешь им игрока. Не надо делать репутацию 0. Это не очень логично.

Автор: Аваддон Jun 21 2004, 19:50

Да но это будет работать если воры обносят НПС а если они обносят других игроков?

Автор: Lex Jun 21 2004, 20:08

тогда незнаю

Автор: DBColl Jun 22 2004, 09:20

Тогда пусть другой игрок ему и стучит по голове, если заметил кражу. Гы. smile.gif

Автор: Аваддон Jun 22 2004, 14:03

О даsmile.gif))

Автор: _kaa_ Jun 22 2004, 16:32

Цитата
Да но это будет работать если воры обносят НПС а если они обносят других игроков?


Вот простой вариант: отслеживать событие модуля OnUnacquire() и проверять, если на вещи стоит флаг stolen - большая вероятность что вещь только что сперли и можно натравить на игрока стражника (в любом случае нечего ходить с краденными вещами).
Правда это событие глючит когда крадут деньги или вещи, которые складываются (подробнее в лексиконе)

Автор: DBColl Jun 22 2004, 17:51

Каа, а почему нельзя ходить с крадеными вещами? Стражники ведь не досматривают! Прикинь картину: ты идешь себе, идешь, появляется патрульный стражник и вдруг набрасывается с криком: "ВОР! Замочу гада!". Достает АК-47 и начинает палить... Хм... понесло...

Все бы ничего, да вот я-то эту вещь поднял с брошеного трупика какого-то игрока... (что сделаешь, если я отыгрываю свой LE). Гы. :ss: crazy.gif

Автор: Аваддон Jun 22 2004, 19:47

Хм а почему на OnUnAquire это же наоборот когда сбрасываешь вещь?! unknw.gif А тогда можно я думаю вот как сделать: Значит на OnAquire ставим проверку приобретенной вещи - если stolen, то проверяем арену, если это город - проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..." и аттачит вора... Или нет...Даже вот что лучше - он вора атачит и на каждом ударе проверяет здоровье. Если здоровье вора <0>-10 то есть вор уже на земле корячится то он типа говорит - пройдемте в отделение, тут ему прибаляется 10хп чтоб ожил и телепортится в камеру тюрьмы smile.gif rolleyes.gif

Автор: Aiwan Jun 22 2004, 22:10

Цитата
проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..."

Лучше кин автоDС на скрытность или воровство твоего РС и гварда. Прошел бросок, можешь пробежаться мимо стражника и отпукаться shok.gif за углом. Нет, тогда кричи: "Эй стой! Что то ты подозрителен!" Старт диалога а там можешь и проверочку делать, типа убедил стражника - отмазался smile.gif Вот стимул качать фиты spiteful.gif

Автор: Аваддон Jun 22 2004, 22:35

Во, Айван ты всегда что то клевое подаешьsmile.gif А если игрок просто закроет диалог?! Есть такая фишка? что тогда делать - нападать?

Автор: Aiwan Jun 23 2004, 09:23

Ты имеешь ввиду это?:

Цитата

Current Files (Normal, Aborted) – эти слоты созданы для того, что бы можно было присвоить какие-то события на прерывание диалога или на простое завершение. Обычно там стоит скрипт «nw_walk_wp» для следования NPC по заданным точкам пути, после диалога.

Ставь туда свой скрипт, можешь хоть на начало диалога занаво, типа прервал, забивай стек команд и старт конверсатион. ДА в принципе, что хочешь влепляй. Можно и атаку, типа, "Ах, ты еще и разговаривать не хочешь!?"

Автор: Вестель Jun 23 2004, 09:26

Цитата
А если игрок просто закроет диалог?! Есть такая фишка? что тогда делать - нападать?

За ухо и об землю!
Действительно хорошая идея: делать противобросок Spot vs. Pick Pocket тех кто находится в 10 метрах.. А если плеер, то выдавать системное сообщение: "Вы заметили, что <Bacja> ворует.." Тогда будет прикольный момент с покрывательством и последующим шантажом. yes3.gif .. А стражник заметивший пускай, сначала предупреждает dirol.gif "Пройдемте в отделение", а при попытке убежать, не отвечать, укастовке начинает ответные действия...

Автор: DBColl Jun 23 2004, 11:34

Ребят, а вы не думали, что можно проверять и устанавливать на каждую приобретенную вещь (в OnAcquire) переменную = Тэг(OBJECT_SELF) + ID хозяина. Тем самым можно дополнительно проверить краденая ли вещь... Но это идея... Возможно и не очень правильная для шарда, но все же...

Автор: _kaa_ Jun 23 2004, 17:40

Цитата
Каа, а почему нельзя ходить с крадеными вещами? Стражники ведь не досматривают! Прикинь картину: ты идешь себе, идешь, появляется патрульный стражник и вдруг набрасывается с криком: "ВОР! Замочу гада!". Достает АК-47 и начинает палить... Хм... понесло...

Все бы ничего, да вот я-то эту вещь поднял с брошеного трупика какого-то игрока... (что сделаешь, если я отыгрываю свой LE). Гы.


Если просто поднимать вещь - флаг stolen не ставится, только когда воруешь.

Цитата
Хм а почему на OnUnAquire это же наоборот когда сбрасываешь вещь?!  А тогда можно я думаю вот как сделать: Значит на OnAquire ставим проверку приобретенной вещи - если stolen, то проверяем арену, если это город - проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..." и аттачит вора... Или нет...Даже вот что лучше - он вора атачит и на каждом ударе проверяет здоровье. Если здоровье вора <0>-10 то есть вор уже на земле корячится то он типа говорит - пройдемте в отделение, тут ему прибаляется 10хп чтоб ожил и телепортится в камеру тюрьмы 


Ага, именно OnAcquireItem. Там можно получить что это за вещь, кто прежний хозяин и кто нынешний. Если вещь stolen, прежний хозяин игрок\НПС и нынешний - игрок, то вещь либо сперли, либо бартером передали. Но баги такие же - на золото не вызывается этот event.
Да, с этим эвентом еще один прикол. Когда игрок заходит на шард - каждая вещь из его инвентаря вызывает этот эвент. Это не бага, это фича smile.gif

Автор: Tarre Talliorne Jun 27 2004, 19:48

Кстати - с реакцией гварда можно сделать проще: фит нокдаун и через 0.1 сек эффект нокдаун - потом изменение отношения на нейтральное и разговор - плати штраф за то-то и то-то. Проще тем, что можно обойтись без тюрьмы... Даже если у игрока нет денег - берут шмотом и дают сдачу :-) , а если и шмоток нет, у игрока начинают рости ДОЛГИ spiteful.gif . А если при диалоге перс нарывается на агрессию и нападает, его всегда можно выруюить заново и удвоить штраф pleasantry.gif . Могу кинуть код (сыроват он еще, но ...) - просто у нас в модуле у части охраны такое поведение biggrin.gif .

Автор: Lex Jun 27 2004, 20:22

в базу кидай

Автор: Tarre Talliorne Jun 28 2004, 10:45

Отшлифую - кину...

Автор: Tarre Talliorne Jun 30 2004, 11:03

Вопроссс: мне нужно определить, висит ли на ПС эффект увеличение КБ, вроде все в порядке - перебираю все эффекты и т.д. но все равно в результате скрипт возвращает 0... Никак не допру, в чем проблема.

Код

       int iResult = 0;
       object oPC = GetPCSpeaker();
       effect eEffect1 = EffectACIncrease(1);
       effect eEffect2 = EffectACIncrease(2);
       effect eEffect3 = EffectACIncrease(3);
       effect eMSD = GetFirstEffect(oPC);
       while (GetIsEffectValid(eMSD))
       {
           if (eMSD == eEffect1 ||
               eMSD == eEffect2 ||
               eMSD == eEffect3  )
           {
           iResult = 1;
           }
       eMSD = GetNextEffect(oPC);
       }
       return iResult;

Автор: DBColl Jun 30 2004, 11:24

Tarre
А кто ж так эффекты сканирует? biggrin.gif
effect eEff = EffectACIncrease(...) - создает новый "экземпляр" эффекта. Это не нужно тебе в данной ситуации.
Надо делать так:

Код

.........
      while (GetIsEffectValid(eMSD))
       {
           if (GetEffectType(eMSD) == EFFECT_TYPE_AC_INCREASE)
              iResult = 1;
           eMSD = GetNextEffect(oPC);
       }
.........

Автор: Tarre Talliorne Jul 2 2004, 16:40

Спасибо... хех, прикол в том, что с визулками все отлимчно работало... Да, кстати, сразу написаля инлюд - через пять минут выложу в базе скриптов smile.gif

Автор: Lex Jul 2 2004, 16:45

у меня эта функция называется DestroyEffect(). уже давно обитает в моей библиотеке.

Автор: Tarre Talliorne Jul 2 2004, 16:49

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

все, выложил я в базе скриптов... смотрите.

Автор: Phantom Jul 6 2004, 07:58

Привет. Может кто подскажет чего: у меня есть прейсибл типа "Факел". Оч красивый, надо заметить. Крепится к стенам домов. Так вот. Я пытаюсь сделать так, чтобы он загорался на ночь и гас днем. Все, соответственно, делается через:

Код

       if((GetIsDusk() && GetLocalInt(OBJECT_SELF,"NW_L_AMION") == 0) ||
           (GetIsNight() && GetLocalInt(OBJECT_SELF,"NW_L_AMION") == 0))
       {
           SetLocalInt(OBJECT_SELF, "iCurrentHour", GetTimeHour());
           object oSelf = OBJECT_SELF;
           PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
           DelayCommand(0.4,SetPlaceableIllumination(oSelf, TRUE));
           SetLocalInt(OBJECT_SELF,"NW_L_AMION",1);
           effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_ORANGE_15);
           ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf);
       }
       else if((GetIsDawn() && GetLocalInt(OBJECT_SELF,"NW_L_AMION") == 1) ||
           (GetIsDay() && GetLocalInt(OBJECT_SELF,"NW_L_AMION") == 1))
       {
           object oSelf = OBJECT_SELF;
           PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
           DelayCommand(i,SetPlaceableIllumination(oSelf, FALSE));
           SetLocalInt(OBJECT_SELF,"NW_L_AMION",0);
           effect eEffect = GetFirstEffect(oSelf);
           while (GetIsEffectValid(eEffect) == TRUE)
           {
               if (GetEffectType(eEffect) == EFFECT_TYPE_VISUALEFFECT)
                   RemoveEffect(oSelf, eEffect);
               eEffect = GetNextEffect(oSelf);
           }

       }


Ну и, конечно, RecomputeStaticLighting(). Его приходится привешивать на "сердцебиение" арены - иначе перерисовывается только некая область около игрока. А в том месте, куда я ставлю ("сердцебиение" арены) - это конкретно тормозит. Помогите. Хочется сделать так, чтобы обновлялся статический свет по всей арене сразу, или может кто еще чего предложит…

Автор: DBColl Jul 6 2004, 12:43

Ты вот что. Воспользуйся SignalEvent'ом. То есть на Хертбите(HB) арены ставишь лишь проверки дня/ночи. Если "что-то" наступило, то сигнал эвент зажигается (к примеру 3000-день/4000-ночь).

Далее пишешь скрипт в UserDefined арены, где идет разбор: если это эвент 3000, то циклом тушим все факелы. Если эвент 4000, то, соотв, зажигаем в цикле.

Тормозит все это из-за "массовой" команды в один момент RecomputeStaticLighting. Сделай, чтобы каждый факел зажигался/тушился через DelayCommand(n/2, RecomputeStaticLighting()), где n - это циклическая переменная, увеличивающаяся для каждого объекта-факела на 1. Этим ты дашь возможность движку просчитывать освещение и в то же время плавно обрабатывать остальные события (эвенты). wink3.gif Удачи!

Автор: Auren Jul 6 2004, 18:23

Ой, ой, ой. Какие вы все умные rolleyes.gif


---------------

Сорри, просто я удрючен portal serverom=((

Автор: DBColl Jul 6 2004, 18:33

Auren[LFL]
Че за оффтоп?!
Конечно умные! Пост завтра удалю. :cruel:

Автор: [MoF]Darth_Nick Jul 7 2004, 02:36

ставится на OnLevelingPlayer(помойму так biggrin.gif )

Код

/*
Created By: [MoF]Darth_Nick
Data Of Creating: 02.07.2004 11:03
Discription: So, this script is do following - when you have a level up, after up
script founding your alignment(GOOD, EVIL, NEUTRAL) and doing something visual effects
for you. Also effects maybe change if you change Constans...Sample:
VFX_FNF_SUMMON_EPIC_UNDEAD - this is first constant of evil leveling, delete that and
enter something yours in the list of constants, an example - VFX_FNF_IMPLOSION.
*/

void main()
{
object oPC = GetPCLevellingUp();

if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
{
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_EPIC_UNDEAD), oPC));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HARM), oPC));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
{
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HOLY_AID), oPC));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUNBEAM), oPC));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL)
{
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SOUND_BURST), oPC));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_X), oPC));
}
}

<small>Добавлено в 02:37</small>
Ставиться на OnEnter тригераа
Код

/*
Created By: [MoF]Darth_Nick
Data Of Creating: 11:37
Discription: Script is stand on a OnEnter of Generic Triger, you also can use it in the
trap, but unexpectandlly is be very other!
*/

void main()
{
object oPC = GetEnteringObject();
effect eBall = EffectVisualEffect(VFX_FNF_FIREBALL);

if (GetIsPC(oPC) == GetCurrentHitPoints(oPC) < 70)
{
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBall, oPC));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oPC));
}
else if (GetIsPC(oPC) == GetCurrentHitPoints(oPC) > 70)
{
FloatingTextStringOnCreature("Heh...This trick is not for me!", oPC);
}
}

<small>Добавлено в 02:39</small>
На OnEnter ловухи
Код

//::///////////////////////////////////////////////////////////
//:: Created By: [MoF]Darth_Nick
//:: Created On: 20.06.2004
//:://////////////////////////////////////////////////////////
/*
Итак, мой первый скрипт!!
Ставиться он на OnEnter ловушки.(Да, да! именно на ловушку,а не на
триггер т.к. если ставить на триггер - то никто и некогда не сможет увидеть,
эту смертельную зону.)
Когда чар на нее наступает на нем "делается" визуальный(!)
эффект имплозии и неизбежная смерть.
Эффекты можно менять изменив вот это - VFX_FNF_IMPLOSION на
другой визуальный эффект.(кажется их кто-то перечислял на 1 странице топика).
З.Ы. это можно использовать для проверки воров(всмысле при вступлении в гильдию).
*/
//:://////////////////////////////////////////////////////////

void main()
{
object oTarget = GetEnteringObject();

DelayCommand(0.1, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_IMPLOSION), oTarget));
DelayCommand(0.1, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
}

Автор: Tarre Talliorne Jul 7 2004, 14:25

Несколько вопрософф:
1. Как убрать только один вид уммуна, если наложен, скажем, 2 или 3? ActionRemoveEffect из базы скриптов убирает все.
2. Какой стандартный скрипт управляет поведением барда в таверне(есть только TalentBardSong из nw_i0_generic, но если использовать этот талант, бард просто использует умение... Просто стоит с эффектом нот над головой. Смотрится не очень. Может, в официале есть то же, но с анимацией, подходящей для пения?)
3. Как лечится катсценовский баг, когда после окончания оной сцены камера переносится внутрь игрока (в позицию 0, -1, -1)
4. Можно ли вешать локалки на вейпы?

Автор: DBColl Jul 7 2004, 16:27

Цитата
1. Как убрать только один вид уммуна, если наложен, скажем, 2 или 3? ActionRemoveEffect из базы скриптов убирает все.

По-моему никак... Я как-то пытался снять один из многих вижуал эффектов, на персе... Не получалось sad.gif.
Цитата
2. Какой стандартный скрипт управляет поведением барда в таверне(есть только TalentBardSong из nw_i0_generic, но если использовать этот талант, бард просто использует умение... Просто стоит с эффектом нот над головой. Смотрится не очень. Может, в официале есть то же, но с анимацией, подходящей для пения?)

А де ты видел, чтобы барды в NWN реально пели? Я че-то не припомню...
Цитата
3. Как лечится катсценовский баг, когда после окончания оной сцены камера переносится внутрь игрока (в позицию 0, -1, -1)

Не ставить скрипт катсцены на OnEnter локации wink3.gif... И на триггер, на который перс попадает сразу же при входе в локу. wink3.gif Не лечится это... У меня не получилось во всяком случае sad.gif.
Цитата
4. Можно ли вешать локалки на вейпы?

Имхо, нет smile.gif. А зачем? shok.gif

Автор: Аваддон Jul 7 2004, 16:34

3. Нет такого бага.
4. Можно

Автор: DBColl Jul 7 2004, 17:17

Цитата
4. Можно

Точно?.. unsure.gif

Автор: Аваддон Jul 7 2004, 17:29

Проверял однакоsmile.gif)

Автор: DBColl Jul 7 2004, 17:38

Цитата
3. Как лечится катсценовский баг, когда после окончания оной сцены камера переносится внутрь игрока (в позицию 0, -1, -1)

А вообще попробуй RestoreCameraFacing(); предварительно (перед сценой) установив StoreCameraFacing();.

Автор: Аваддон Jul 7 2004, 18:07

Интересно, а как сделана система языков?
ну например стоят два полурослика один пишет в толке:
"-halfing: Привет Братишка как дела?"
Другой полурослик это так и видит, а эльф стоящий рядом это видит как:
"Ghbdtn <hfnbirf rfr ltkf?"

Автор: Tarre Talliorne Jul 7 2004, 20:47

Цитата
По-моему никак... Я как-то пытался снять один из многих вижуал эффектов, на персе... Не получалось .

Буду думать... Мож чего-нить придет. Действительно, мне надо убрать один эффект из двух... Вроде мылсь есть, завтра отпишу.

Цитата
А де ты видел, чтобы барды в NWN реально пели? Я че-то не припомню...

Нет. Я в НВН играл только час-полтора в оригинал, час СоУ и полчаса в ХотУ. Просто я хочу, чтоб бард нормально пел. Вообще я так подумал, надо ему в он_перц талант бардсонг + попутная анимация разговора + с ранодмной задержкой разные салюты... Сейчас попробую чего-нибудь сотворить...

Цитата
3. Как лечится катсценовский баг, когда после окончания оной сцены камера переносится внутрь игрока (в позицию 0, -1, -1)

Я залечил так:
Код
DelayCommand(25.00, SetCutsceneMode(oPC, FALSE));
DelayCommand(25.00, AssignCommand(oPC, SetCameraFacing(/*любая позиция камеры*/200.0, 11.0, 35.0, TRANSITION_TYPE_SNAP)));

Все гениталь... тьфу ты, все гениальное просто!.. :-)

Цитата
4. Можно ли вешать локалки на вейпы?
Имхо, нет . А зачем? 

Чистый академический интерес :-)
Добавлено в [mergetime]1089222896[/mergetime]
Аваддон интересный вопрос, кстати. Надо спросить у Ранмы (это на Экзисе было). Стандартными средствами это не реализовать, нужно какое-то извращение...

Автор: DBColl Jul 8 2004, 10:33

Цитата
Я залечил так:

Код
DelayCommand(25.00, SetCutsceneMode(oPC, FALSE));
DelayCommand(25.00, AssignCommand(oPC, SetCameraFacing(/*любая позиция камеры*/200.0, 11.0, 35.0, TRANSITION_TYPE_SNAP)));


Все гениталь... тьфу ты, все гениальное просто!.. :-)

Так ты ж вроде хотел вернуть камеру в первоначальное положение после сцены? Так-то, как ты описал, хех, 100% будет работать... Ты же жестко меняешь после сцены положение. wink3.gif

Автор: _kaa_ Jul 8 2004, 10:42

Цитата
1. Как убрать только один вид уммуна, если наложен, скажем, 2 или 3? ActionRemoveEffect из базы скриптов убирает все.


DBColl прав, сложно убрать какой-то определенный эффект. В некоторых случаях тебе может помочь функции
GetEffectCreator() - кто навесил эффект
GetEffectSubType() - можешь те эффекты, что нужно убрать, вешать с одним из флагов (SUBTYPE_EXTRAORDINARY,SUBTYPE_MAGICAL,SUBTYPE_SUPERNATURAL)
GetEffectSpellId() - возращает номер спелла, вызвавшего эффект. (для вижуал эффекта - мало полезно, но все-же)

Из этого наиболее полезным может оказаться GetEffectSubType(), тебе просто нужно на те эффекты, которые хочешь убрать, вешать флажок SupernaturalEffect(), ExtraordinaryEffect() или MagicalEffect()
LEX: Каа, отличная идея. Всем знать!



Цитата
4. Можно ли вешать локалки на вейпы? 

Вешать локалки можно на любой объект. Вейпоинт - это объект.



Цитата
Аваддон интересный вопрос, кстати. Надо спросить у Ранмы (это на Экзисе было). Стандартными средствами это не реализовать, нужно какое-то извращение...

Делается реакция на onConversation. Вся сложность - сделать так, чтобы игрока все время кто-то слушал. Если не ошибаюсь у Ранмы за каждым игроком летает невидимый моб, который и перевариает все фразы. А вообще - почему бы не попробовать повесить обработку этого события на самого игрока? smile.gif Ведь SetListening() и SetListenPattern() принимают в качестве параметра объект. Вся проблема - будет ли модульный OnUserDefined() срабатывать на onConversation() для PC. Может кто пробовал?

Автор: Tarre Talliorne Jul 8 2004, 16:44

Цитата
Так ты ж вроде хотел вернуть камеру в первоначальное положение после сцены? Так-то, как ты описал, хех, 100% будет работать... Ты же жестко меняешь после сцены положение. 


Я не хотел возвращать в первоначальное!.. Я хотел от бага избавиться. Что и сделал. :-)

Цитата
Делается реакция на onConversation. Вся сложность - сделать так, чтобы игрока все время кто-то слушал. Если не ошибаюсь у Ранмы за каждым игроком летает невидимый моб, который и перевариает все фразы. А вообще - почему бы не попробовать повесить обработку этого события на самого игрока?  Ведь SetListening() и SetListenPattern() принимают в качестве параметра объект. Вся проблема - будет ли модульный OnUserDefined() срабатывать на onConversation() для PC. Может кто пробовал?


В этом вопросе помочь может только сам Ранма.

Цитата
DBColl прав, сложно убрать какой-то определенный эффект. В некоторых случаях тебе может помочь функции
GetEffectCreator() - кто навесил эффект
GetEffectSubType() - можешь те эффекты, что нужно убрать, вешать с одним из флагов (SUBTYPE_EXTRAORDINARY,SUBTYPE_MAGICAL,SUBTYPE_SUPERNATURAL)
GetEffectSpellId() - возращает номер спелла, вызвавшего эффект. (для вижуал эффекта - мало полезно, но все-же)

Из этого наиболее полезным может оказаться GetEffectSubType(), тебе просто нужно на те эффекты, которые хочешь убрать, вешать флажок SupernaturalEffect(), ExtraordinaryEffect() или MagicalEffect()


_kaa_ , спасибо.

Автор: DBColl Jul 8 2004, 18:15

Цитата
Из этого наиболее полезным может оказаться GetEffectSubType(), тебе просто нужно на те эффекты, которые хочешь убрать, вешать флажок SupernaturalEffect(), ExtraordinaryEffect() или MagicalEffect()

Спасибо, Каа. И как я сам не догадался?.. smile.gif Век живи - век учись!..

Автор: Tarre Talliorne Jul 9 2004, 14:25

Хм... Народ, как на ваш взгяд лучше всего организвоавать поведение простолюдинов(имитация рассудочной деятельности в действиях, не связанных с ПС). Моя идея: он спавн составляется список(требование: все простолюдины должны иметь одинаковый тэг и диалог) типа:

Код
object OS = OBJECT_SELF;
object o1= GetNearestObjectByTag(GetTag(OS), OS, 1);
object o2= GetNearestObjectByTag(GetTag(OS), OS, 2);
. . .


Потом. Наш непись поочередно подходит к о1, они смотрят друг на друга

Код
AssignCommand(o1, SetFacing(OS));
AssignCommand(OS, SetFacing(o1));


и начинают диалог. Потом наш непись идет к другому и третьему и т.д.
Система, конечно же не идельна. Есть другие предложения?

Автор: DBColl Jul 9 2004, 15:08

Tarre
А чем тебе не нравится стандартный AMBIENT_ANMATION?

Автор: Tarre Talliorne Jul 9 2004, 15:19

Тот, что отвечает за треп? Он используется, но в другом месте. И вообще хочется до всего дойти самому и создать имитацию кастомный событийности. И сделать лучше, чем биовар (хотя почти ни у кого это не получилось)

Автор: DBColl Jul 9 2004, 17:28

Там достаточно гибко ее можно настроить. Взимодействие непися с другими неписями, с плэйсэблами, районы "гуляния"... Чего не хватает?
Если ты за принципиальность нового, то я тебя понимаю. В свое время сам хотел сделать это... но... подумал, сколько времени на это уйдет и решил, что не надо smile.gif. С меня хватило полного AI хенчши, который, кстати, отлично уже работает smile.gif...

Автор: Tarre Talliorne Jul 9 2004, 19:35

Цитата
Там достаточно гибко ее можно настроить.

Подскажешь? :-)

Автор: Аваддон Jul 10 2004, 09:23

У меня такой вопрос:
Можно ли скриптами поменять APPEARANCE брони? Например сменить Neck? Ну как то био-твари это при крафте делают ведь...

Автор: DBColl Jul 10 2004, 11:14

Цитата
Подскажешь? :-)

Тарре, я думал ты знаешь... unsure.gif Хех. Ладно.
Смотри спавн скрипт любого непися. Посмотри на комментрии внимательно (закомментированные) SetSpawnInCondition... Если непонятно - копни глубже, залезь в инклюд... Там более подробно описано. Уверен, что если ты еще не смотрел туды, то найдешь много вкуснятины smile.gif. Я вон в модуле стандартными раскомметировками настраивал летучих мышей (летают стайно, рандомно взлетая вверх и приземляясь... EffectDisappearAppear), в Проклятии жители города, продавцы, настроены стандартными средствами Биовар. Есть такие вейпы в стандартной палитре - WP_HOME, WP_TAVERN... и прочее. Ими и настраивается все wink3.gif.

Автор: Tarre Talliorne Jul 10 2004, 12:57

Нет, про SetSpawnInCondition() знал и раньше, но с моим английским :-). Лана, попробую. Спасибо.

ЗЫ: EffectDisappearAppear() - попробуй с драконом. Вот такм рельная тема :-)

Автор: DBColl Jul 10 2004, 14:07

Цитата
ЗЫ: EffectDisappearAppear() - попробуй с драконом. Вот такм рельная тема :-)

Пробовали. Давно smile.gif. Круто. wink3.gif.
Цитата
Нет, про SetSpawnInCondition() знал и раньше, но с моим английским :-). Лана, попробую. Спасибо.

А куда ж программер без английского?! unknw.gif Технический нужно понимать. yes3.gif

Автор: Dark Lord Jul 10 2004, 22:00

Долго думал куда притулить этот вопрос решил не плодить тем т.к. вопрос то как раз к скриптам, причем мучает меня довольно таки давно и не только как оказалось меня... (Текст подготавливал заранее - как поему smile.gif)

{Сподвигло меня на задание сего вопроса две вещи : а) окончание работы над такими веселыми вещами как дульные газы и выброс гильз в огнестреле - вроде работает нормально и б) высказанные некоторыми участниками форумов ВРГ мыслей о модерн-модах в различных темах :ss:}

Итак, я долго думал над этой проблеммой ну и не токо думал пытался даже коечто сам сворганить но это нечто что выше моих сил. Итак, цель наша (надеюсь что наша а пока моя) - достичь полного или частичного реализъма стрельбы из автоматического оружия за счет введения стрельбы очередями. Требования к скрипту :
1) объяснить куда и как его совать ! т.е. не сказать "на он-хит боеприпаса" а именно разъяснить как т.к. в редакторе никакой вкалдки скриптов у Айтемов я вообще не нашол sad.gif
2) рассчитан на тяжелый/легкий арбалет (соотв. автомат, пистолет-пулемет)
3) что делает : при выстреле первой стрелы (пули) выстреливает рандомно от 2 до 3-4 пуль (кол-во неважно это легко настроить) причем не точно в противника а (по возможности) так ну... кучно вокруг первой причем желательно чтобы они поражали сразу нескольких неписей (ну это уже наверное грань ненаучной фантастики, т.е. сделать можно но выглядеть будет малореалистично, хотя в реале такое конечно возможно. дело в визуальном воплощении сего) и при этом НЕ все стрелы ТОЧНО попадали в целевого НПС (как например стрела мельфа которая всегда бьет в цель даже огиьая препятствия - от так быть не должно)
4) скрипт должен проверять есть ли в ТЭГЕ оружия (т.е. есть ли вы нем ЭТА СТРОЧКА а не сам тэг такой) строчка "avtomat" или "PP" (например 762_akm_avtomat или 9_mp40_PP - это моя система обозначения оружия и патронов)- ну ясно что это значит - и срабатывать только при наличии этой строчки.
5) если будет удовлетворены хотьябы основные запросы (выпуск нескольких стрел после одной) я буду очень рад.


Варианты релиза как ЙА их вижу :
а) фитом типа быстрого выстрела. Тогда все почти пучком только надо приспособить этот фит к арбалетам, в общем неплохая вещь, я могу даж сам сделать наверно, если вы мне скажете в каком файле находится скрипт фита Рапид Схот и как ввести свой новый фит.

б) спеллом. Вариант не лишен своей харизмы чтоли но имеет (разделяя его с первым вариантом) недостаток : все стрелы-пули только ОДНОМУ неписю, а это имхо нехорошо как-то, зачем тогда очередь - не по груповушке ли пулять ? Спелл надо делать естественно свой по типу той ж стрелы мельфа но вопрос : надо чтоб стрела (пуля) летела точно по прямой. Как ?

в) моделью стрелы-в виде нескольких пуль. Идея прожективная, выглядит этот кентавр не очень. Пробовал. Можно конечно но плохо как-то, в том числе из-за соображения опять же попадания всех пуль в одного челокантропа (без промахов) и годится наверно только для дробовика (там уж выхода нет).

г) какй нето ваш собственный вариант даже не берусь сказать какой.


Подозреваю что вещь для опытного скриптера несложная, но беда в том что я не отношусь к ним sad.gif Плюс объясните или дайте плиз ссылку где сказано где лежат фиты - особенно естественно интересует фит РапидШот и как ихъ клепать.

{Я бросил донимать моделлеров теперь возьмуся за скриптеров lol.gif lol.gif lol.gif spiteful.gif crazy.gif }

Автор: Аваддон Jul 10 2004, 22:06

Фиты если я не ошибаюсь лежат в feats.2da

Автор: Dark Lord Jul 10 2004, 22:16

Ясно что в feats.2da я имел в виду не сами фиты а их скрипты, то как они действуют.

Автор: Tarre Talliorne Jul 11 2004, 09:44

Dark Lord Ни фига то себе... Неа, я, конечно, НВН поковыряю, но... думаю этот вопрос к ДБКоллу и Айс Блейду. Блин. Ужас.

Автор: Dark Lord Jul 11 2004, 13:09

А чо ужас то чо ужас то хочу просто переписать скрипт быстрого выстрела чтобы распространить его на арбалет и увеличить число выстреливаемых стрел... Что такого ужасного ?
Добавлено в [mergetime]1089540633[/mergetime]
А при чем тут АйсБлэйд ? Я не совсем понял, таварищ Айс сам вэд сказал : "Я нэ скриптэр, таварищи !"

Автор: Tarre Talliorne Jul 11 2004, 15:40

Не, просто варианты (а) и (б) явно для 2да специалиста а (в) для моделлера. Скриптерам остается только гипотетический (г)... Ужас в том, что ни обна мылсь насчет этого самого (г) так и не приходит :-)

Автор: Dark Lord Jul 11 2004, 16:01

Цитата
Ужас в том, что ни обна мылсь насчет этого самого (г) так и не приходит :-)


Да, именно. У меня та же проблемма =)

Цитата
а (в) для моделлера


Да, для моделлера, но я и сам кххм.м..м моделлер ! Выложил вариант в) просто чтобы убедить народ в его несостоятельности !

Автор: Lex Jul 11 2004, 18:31

Хм..у меня тут возник вопрос.
Ситуация такая: небольшая (2х4) локация. Дорога между двумя округами. Хочу, чтобы каждый раз, когда там появлялся игрок появлялась группа бандитов.

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

вопросы:
- Можно ли решить проблему только энкаунтером, не создавая скрипт спавна бандитов?
- Что происходит с энкаунтером типа "single shot" после спавна? Удаляется? Убирается флажок "active"?

Автор: Aiwan Jul 11 2004, 22:06

Лекс, можно настроить с интервалом 10 секунд табун орков.

Цитата

СТОЛКНОВЕНИЯ С МОНСТРАМИ.

Пришло время настроить наши встречи с монстрами. В палитре достаточно стандартных encounter-ов, но мы сделаем новый. Работают encounters так же как и триггеры и устанавливаются так же. Запустим Encounter Wizard и сделаем новый encounter, нам предложат выбрать монстров, которые будут появляться при активизации. Если у вас есть свои, то выбирайте их из пользовательской палитры, я сделал из стандартных гоблинов. Выбрал их слева в окне и завершил создание боевки с тегом «AM_ENC_HARD_01». Зайдем в свойства и посмотрим основные параметры.

Basic – из основных свойств нам важны: Difficulty – сложность, Maximum Creatures – максимальное число появляющихся противников, Minimum Creatures – минимальные предел количества, меньше не будет; Spawn Option – каким будет столкновение, одиночным или с промежутками, а может бесконечное количество раз.

Creature list – список противников. Возможно изменить, добавить или убавить. Главное, это параметр CR (Challenge Rating) – это сложность NPC для боя, складывается из общих параметров таких как: уровень, класс, хитпоинты и т.д. Unique – может сделать персонально каждого NPC уникальным при срабатывании боевки. Это значит, например, босс будет один, шаман или колдун, а пехоты можно по несколько одинаковых. При активации encounter-а просчитывается CR в зависимости от уровня игрока, т.е. если наступить на него 1-м уровнем и 10-м, то список и сложность монстров в каждой ситуации будет разные.

Advanced – в этих свойствах нам надо разобраться основательно. Приступим. Фракция encounter-а должна быть враждебной (!) по отношению к тому, кто его активировал. Это значит, если установить фракцию обывателей то, наступив encounter не сработает. А вот если на него наступит монстр, то он запустит его. Поэтому, будьте внимательны с фракцией.  Active – делает  активным или не активным, это нужно, например, для того, что бы в скриптах мы могли его включать-отключать. Encounter Respawns – сколько столкновений будет, это меню активируется, ТОЛЬКО если вы свойствах Basic выберите Spawn Option> Continuous. При Single Shot столкновение произойдет только один раз.

Если оставить наш  encounter, нарисованным на локации как есть, то монстры появятся по всему периметру. Если вам необходимо что бы нападение произошло из заданной точки, то нужно нажать на очерченный encounter правой кнопкой мыши и выбрать пункт «Add spawn point» (Рис. 46.). Появиться стрелка, указывающая на черный треугольник, этот треугольник и будет точкой spawn-а монстров. Точек spawn-а может быть несколько, сделайте их и перетащите мышкой в нужное место.

Изображение

Рис. 46.

Важно! При точках spawn-а монстры будут появляться лицом в ту сторону, в которую направлена самая маленькая сторона, являющаяся основанием равнобедренного  треугольника. И монстры будут появляться только из той точки, которая находится впереди наступившего объекта (NPC, PC)  на область encounter-а. Выглядит это так: вы делаете столкновение и ставите три точки spawn-а в разные стороны. Если вы подойдете с каждой из трех сторон, то противник всегда будет появляться с точки, которая впереди.

В слотах скриптов, новый единственный слот, который мы не разбирали – OnExhausted. Этот слот срабатывает, когда вы выбрали опцию «Single-Shot spawn» и противники перестали появляться (spawn- спавниться) на локации. 


Добавлено в [mergetime]1089572826[/mergetime]
Вот статья, еще не опубликована...

Автор: Lex Jul 12 2004, 09:30

Мне как раз это НЕ НАДО. Надо так: наступил - появились и пока из локи не ушел дальнейшие наступания ни к чему не приводят. Ушел, снова, как попадаешь, наступаешт и дерешся. Во как

Автор: _kaa_ Jul 12 2004, 09:55

imho пока энкаунтер не перебит полностью - новая партия спавниться не должна.
Но в стандартных энкаунтерах есть одна неприятная вещь - если мобы отспавнились, их никто не уберет. Так что хорошей идеей будет доработать стандартный скрипт спавна мобов, чтобы по прошествии некоторого времени проверять - если игроков тут давно не было - убирать мобов. Иначе очень напряжно для шарда, ведь у каждого моба нехилый по объему список скриптов, которые в холостую крутятся. Для примера - посмотри модуль Cormyr'а, там _куча_ спавнов и через сутки-двое сервак просто загибается.
Многие шарды НЕ используют стандартные энкаунтеры (хотя дизайнерам куда проще работать с ними) по причинам глюков и переполнений, которые до сих пор не пофиксили.

Автор: DBColl Jul 12 2004, 12:37

Цитата
Ситуация такая: небольшая (2х4) локация. Дорога между двумя округами. Хочу, чтобы каждый раз, когда там появлялся игрок появлялась группа бандитов.

Лекс, ты "Начало Пути" видел ваще?! biggrin.gif Скажи чем тя не устроило, как это дело выпадает у меня? С глобальной карты...

Автор: 2GoDoom Jul 12 2004, 19:23

Вопрос такой: МОжно ли в НВНе как-то обрабатывать стринги? (то есть отделять от начала стринга 3 символа, добавлять и т.п.)

Автор: Аваддон Jul 12 2004, 19:28

Да, там есть что то вроде GetStringLeft и Right. Там надо стринг вписать и число. Это число отсчитывает буквы слева или справа стринга

Автор: 2GoDoom Jul 12 2004, 21:33

отсчитывает - это значит типа присваивает в переменную букву N слева или справа? Или же она удаляет все до... ?

Автор: Аваддон Jul 12 2004, 21:36

2GoDoom, скачай лексикон и почитайsmile.gif

Автор: Tarre Talliorne Jul 13 2004, 09:59

Цитата
Вопрос такой: МОжно ли в НВНе как-то обрабатывать стринги? (то есть отделять от начала стринга 3 символа, добавлять и т.п.)

Конечно. Набери в филттре string . Вот все операторы.
Смотри: тебе надо отделить от начала 3 стринга , пишешь:
Neverwinter Script Source
GetStringLeft(sYourString, 3);
где sYourString - твой стринг, от которого отделяешь.
Про переменные: нет. Эта функция - string , она - самостоятельная. Напр .
Neverwinter Script Source
SpeakString(GetStringLeft(sYourString, 3));

Автор: DBColl Jul 13 2004, 10:55

Еще есть функция GetSubString(...) - она более привычна для тех кто учился скриптам на основе Си wink3.gif.
Вообще в NWN-скриптинге достаточно гибкая система работы со стрингами. Так что по сути любая проблема с ними решаема wink3.gif.

Автор: Tarre Talliorne Jul 13 2004, 11:11

ОФФТОП: ДБ, ты знаешь, появилась такая штука(hak), как SetName. Рильная вещь. Теперь можно делать отбивание памяти ПС :-)

Автор: DBColl Jul 13 2004, 12:34

ГДЕ???? КОГДА??? В ЧЕМ??? Какой хак? shok.gif shok.gif

Автор: 2GoDoom Jul 13 2004, 14:01

Я тоже о такой фишке не слышал smile.gif

Не... GetSubString - я слышал но мне не привычнее... Мне привычнее str_replace и т.д. smile.gif

Еще вопрос:

Neverwinter Script Source
string sCheck = "1234567890";
int iCheck1 =GetStringLenght(sCheck);


Кусок вырван из всего скрипта... Но ругается именно на вторую строку в приведенном примере. Говорит: PARSING VARIABLE LIST.
Переводить не надо - лучше скажите что это означает и как лечится smile.gif

ЗЫ
Перевод: Анализ листа переменных

Автор: Tarre Talliorne Jul 13 2004, 14:02

С помощью С++ проникают под оболочку НВН и делают такие функции как SetTag, SetName, редактировагние описание и т.д. На ваульте набери SetName.

Автор: 2GoDoom Jul 13 2004, 14:18

Если так - то это супер! Облегается много фишек (и тоже самое создание стац. квестов) smile.gif

Автор: DBColl Jul 13 2004, 14:39

Neverwinter Script Source
string sCheck = "1234567890";
int iCheck1 = GetStringLength(sCheck);

Попробуй так wink3.gif. Найди ошибку в своем коде wink3.gif.

Автор: 2GoDoom Jul 13 2004, 14:51

хы... прокатило smile.gif
а в слудеющей строчке? (та жа ошибка)

int iCheck2 = GetStringLenght(GetTag(GetItemActivatedTarget()));

Автор: Вестель Jul 13 2004, 16:11

Цитата
Кусок вырван из всего скрипта... Но ругается именно на вторую строку в приведенном примере. Говорит: PARSING VARIABLE LIST.
Переводить не надо - лучше скажите что это означает и как лечится

Просто исправляется GetStringLength и все... yes3.gif

Автор: 2GoDoom Jul 13 2004, 17:32

хыхы
дык правильно написано (если рядом поставить - один в один) smile.gif
Добавлено в [mergetime]1089729395[/mergetime]
string sCheck2 = GetStringRight(GetTag(GetItemActivatedTarget(), iCheck2-iCheck1-1);

Терь тута
UNKNOWN STATE IN COMPILER sad.gif

Автор: DBColl Jul 13 2004, 17:42

Цитата
дык правильно написано (если рядом поставить - один в один)

Не правильно.
GetStringLenght - ты писал
GetStringLength - правильно

Цитата
string sCheck2 = GetStringRight(GetTag(GetItemActivatedTarget(), iCheck2-iCheck1-1);

Следи за скобками.
Вот правильно.
Neverwinter Script Source
string sCheck2 = GetStringRight(GetTag(GetItemActivatedTarget()), iCheck2-iCheck1-1);

Элементарные ошибки, а ты и про них спрашиваешь...

Автор: 2GoDoom Jul 13 2004, 19:02

smile.gif
Ну привык я к вашему темному фону - на белом ничег оне вижу smile.gif

ЗЫ
Зато повод получить +ННое кол-во постов smile.gif

Автор: Lex Jul 13 2004, 20:24

Цитата(DBColl @ Jul 12 2004, 09:37)
Лекс, ты "Начало Пути" видел ваще?! biggrin.gif Скажи чем тя не устроило, как это дело выпадает у меня? С глобальной карты...

кидай в меня скрипты.
Видел, но скриптов то не было. smile.gif

Автор: DBColl Jul 14 2004, 10:09

Лекс, ты мне скажи, тебе нужна глобальная карта в модуле? Можно подключить... Тогда проще и случайные боевки прилепить будет...

Автор: Lex Jul 15 2004, 18:39

Нет, мне карта не нужна...если только Айс не сделает большую карту Тсурла и окрестностей, чтобы можно было по ней ходить...
Скрипты стычек мне нужны (точнее просто локи пришли, я гляну). Надеюсь там ты не руками писал спавн-скрипт! Потому как так я тоже могу. Я хочу через энкаунтер.

Автор: Dark Lord Jul 15 2004, 18:59

А мой скромный постинг на предыдущей странице так и остался незамеченным... shout.gif shout.gif shout.gif ДБ будь человеком объясни мне неразумному где ж лежат чертовы фиты вернее их скрипты а лучше - ознакомся с моим постингом выше. Надеюсь на понимание.

Автор: DBColl Jul 15 2004, 19:45

Цитата(Lex @ Jul 15 2004, 18:39)
Нет, мне карта не нужна...если только Айс не сделает большую карту Тсурла и окрестностей, чтобы можно было по ней ходить...

Думаю вряд ли... Ибо рисовать ее все равно придется мне... biggrin.gif
Цитата(Lex @ Jul 15 2004, 18:39)
Скрипты стычек мне нужны (точнее просто локи пришли, я гляну). Надеюсь там ты не руками писал спавн-скрипт! Потому как так я тоже могу. Я хочу через энкаунтер.

Пояснил в асе.
Цитата(Dark Lord @ Jul 15 2004, 18:59)
ДБ будь человеком объясни мне неразумному где ж лежат чертовы фиты вернее их скрипты а лучше - ознакомся с моим постингом выше. Надеюсь на понимание.

Признаюсь, не знаю... Иначе бы ответил сразу. Мне кажется это все-таки ближе Айсу... Хотя я посмотрю, мож и откопаю чего...

Автор: Dark Lord Jul 15 2004, 20:53

Цитата(DBColl @ Jul 15 2004, 19:45)
Признаюсь, не знаю...
crazy.gif crazy.gif crazy.gif crazy.gif crazy.gif

Офигеть. Я в загоне. Убит наповал столь же верно как очередью из калаша :mamba:

Ну хоть где скрипты фитов лежат ты знаешь ? Или айс ? А--а-айс ? :this:

Автор: DBColl Jul 15 2004, 21:30

Скорее всего это все же движковое... Скриптов на фиты нету... Обрати внимание сам и сделай вывод:
Анимация при некоторых фитах есть такая, которой нет даже среди анимационных констант. Среди скриптов я тоже не нашел ничего, что было бы похоже на "обрисовку" фитов... sad.gif

Так что надо ждать Айса или орать в Гильдии...

Автор: Dark Lord Jul 15 2004, 22:15

ФЕрштайн. Я пришел к таким же виводам после ОСНОВАТЕЛЬНОГО потрошения в Биф-анпакере. Тогда хоть расскажи как свой фит сделать такой как я просил...

Автор: DBColl Jul 16 2004, 11:57

unknw.gif
АЙС! shout.gif

Автор: VOLAND Jul 16 2004, 14:27

bad.gif Что нужно делать,чтобы наёмник присоединялся к герою?

Автор: Auren Jul 16 2004, 14:43

См. www.nwnlexicon.com

Lyceum->Tutorial->Advanced Scripting-> Celowin part X Henchmen

Автор: Dark Lord Jul 16 2004, 14:45

Гы... biggrin.gif

// Add oHenchman as a henchman to oMaster
// If oHenchman is either a DM or a player character, this will have no effect.
void AddHenchman(object oMaster, object oHenchman=OBJECT_SELF)

Так понятно ? Только это из стандартной помощи Тулсета (там где подсказки в редакторе скрипта), мог бы и поиском по слову henchman или открыв любой модуль кампаний НвН.

Автор: DBColl Jul 16 2004, 14:50

Цитата(VOLAND @ Jul 16 2004, 14:27)
bad.gif Что нужно делать,чтобы наёмник присоединялся к герою?

Хех, только зашел и уже наблевал. :nono: lol.gif

Автор: Dark Lord Jul 16 2004, 14:58

Цитата(DBColl @ Jul 16 2004, 14:50)
Хех, только зашел и уже наблевал
lol.gif lol.gif lol.gif crazy.gif

Автор: Tarre Talliorne Jul 16 2004, 20:35

Итак, очередные мои вопросы:
1. Есть скрипт:

Neverwinter Script Source
void main()
{
object oObject = GetFirstObjectInArea(OBJECT_SELF);
while (GetIsObjectValid(oObject)&&
       GetObjectType(oObject)==1)
       {
           if (GetTag(oObject)=="bw_prayer")
           {
           AssignCommand(oObject, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 9999.9));
           DelayCommand(1.0, SetCommandable(FALSE, oObject));
           }
       oObject = GetNextObjectInArea(OBJECT_SELF);
       }
}
Он должен заствлять всех созданий в локе (он_энтр которй и стоит этот скрипт) с тэгом "bw_prayer" проигрывать анимацию медитации и при этом не реагировать на действия ПС. Ну, молитвенный транс. Так вот. Анимацию они проигрывают, но все же остаются комэндэйбл, собаки! В чем проблема?

2. Каково расстояние, на котором НПС воспринимает других НПС? Т.е. видит? а слышит?
Добавлено в [mergetime]1089999466[/mergetime]
И не пихайте мне под нос он_перцепшн - я имею ввиду риал. Просто эти футы мне поперек жабр встают уже. Задолбался реакции для АИ писать. Хотя вродь ничего выходит.
Добавлено в [mergetime]1089999564[/mergetime]
VOLAND - ты поклонник Булгакова или действительно ТОТ САМЫЙ?!

Автор: Ragnor Jul 19 2004, 19:16

Есть скрипт:

void main()
{
object OS = OBJECT_SELF;
object oPC = GetLastPerceived();
if (!GetIsPC(oPC)) return;
string s1 = "69687";
string s2 = "68787";
string s3 = "234234324324";
string s4 = "24323324";
string sResult;
while (GetDistanceBetween(OS, oPC)<50.0)
{
switch (Random(4))
{
case 0: sResult = s1; break;
case 1: sResult = s2; break;
case 2: sResult = s3; break;
case 3: sResult = s4; break;
}
float fDelay = IntToFloat(Random(5));
DelayCommand(fDelay, SpeakString(sResult));
DelayCommand(fDelay, PlayAnimation(ANIMATION_FIREFORGET_TAUNT));
}
}

но как сделать чтоб строки появлялись с интервалом 15 секунд

Автор: Аваддон Jul 20 2004, 07:54

пффф... У меня с этим скриптом вообще НВН виситsmile.gif))Попробуй вывод строчек поставить в очередь действий с помощью ActionDoCommand а потом ставь ActionWait(15.0).
Или вообще я не бонял зачем fDelay=IntToFloat ? поставь ее 15 сек.

Автор: Tarre Talliorne Jul 20 2004, 09:15

Т.е. хочешь, чтоб строчки выводились с промежутком в 15 сек, а не по ходу обработки цикла? Тогда делай зарубки на времени: надыбай в базе скриптов на рельсах функцию времени в секундах. Затем заводишь локалку, при начале скрипта присваиваешь ей значение текущего времени в секундах. А к цикул добавляешь условие: если текущее время минус та локалка больше 15. Вот и все.
Добавлено в [mergetime]1090304527[/mergetime]
И вообще зачем тебе это? Разные анимации НПС можно сделать с помощью спавн-флагов, а твоя насмешка ИМХО вообще не нужна...

Автор: DBColl Jul 20 2004, 10:07

Тарре, попробуй:

Neverwinter Script Source
void main()
{
    object oObject = GetFirstObjectInArea(OBJECT_SELF);
    while (GetIsObjectValid(oObject) && GetObjectType(oObject)==1)      
    {
        if (GetTag(oObject)=="bw_prayer")          
         {
             AssignCommand(oObject, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 9999.9));                    AssignCommand(DelayCommand(1.0, SetCommandable(FALSE, oObject)));
        }      
         oObject = GetNextObjectInArea(OBJECT_SELF);      
    }
}

Автор: Ice Blade Jul 20 2004, 10:08

Dark Lord & Co Ну вы даёте млин. biggrin.gif подобный фит "нормально" сделать в принцепе нельзя:
- Сама система ДнД реализованная в НВН, не позволяет так вести огонь очередями, разве что если стрельба является своего рода mass effect-ом.
- сколько раз можно объяснять, что есть два типа фитов: активные - т.е те что действуют как заклинания (песня барда там, или дыхание дракона) и пасивные - т.е те которые работают сами по себе например та же специализация в оружии или приведённый тобой быстрый выстрел, разница в том что первые имеют скрипт (он же спелл), вторые используют всякие genеric и вызовы движка,- т.е редактированию не подлежат sad.gif, единственное что позволенно это использовать самопальные константы фитов в модульных скриптах.

Что можно сделать? в теории:
В ХотУ у оружия появилось свойство onHitCastSpell(конечно по умолчанию, никаких арбалетов или луков там не предусмотренно, - но это поправимо smile.gif ) Суть, идеи - данное свойство выполнит скрипт помимо всего дав нашим скриптерам location цели, с помощью которого они без труда смогут расчитать массовые повреждения в округе. Но возникает проблемма с визуальным оформлением, в частности как заставить заставить все эти пули попасть в цель?.
Выхода я "пока" 2-а:
1. Делать это дело невидимым smile.gif, помнишь как в старых игрушках огонь из ствола и искры из цели, но ничего между ними.
2. Извращения с системами частиц - что в принцепе может дать тот самый "ожидаемый" результат, но потребует мнооооого гемороя.

Автор: Dark Lord Jul 20 2004, 12:18

В общем ясно сделать полноценно очередь даже в форме быстрого выстрела с увеличенным числом пуль нельзя. Ладно, если понадобится сделаю пулей из нескольких частей (роем пуль) и анимацией самого випона. Кстати, Айс, растолкуй как сделать вот такое :

есть в инвентарике объект, штык, вернее багинет. Есть винтарик. Задача : с помощью УникПауэра на штыке нацепить его на винтарик. Ну все ясно да : проверитьт есть ли в инвентаре винтарик с нужным тегом, удалить штык удаолить винтарик и дать копье сделанное в форме винтарика. У копья УникПауэр который возвращает винтарик и штык. НО ! На одну и ту же винтовку можно надеть разные штыки ! Более того штык и винтарик могут быть КВЕСТОВЫМИ ! Т.е. надо как-то "запоминать" образы винтарика и штыка а затем их восстанавливать в инвентаре причем уже из ДРУГОВО скрипа. ВОТ как ? Заодно расскажи как повесить ЮникПауэр ибо стыдно но до сих пор не допер sad.gif скрип написать на уник пауэр так-то смог а вот проверить повесив немогу...

Автор: Ragnor Jul 20 2004, 12:56

У меня такой вопрос: Как сделать так, чтобы стояло 5 камней и от них друг к другу отходил луч, или чтобы он был направлен на NPC.

Автор: Tarre Talliorne Jul 20 2004, 16:39

Подробней, пожалуйста. Вообще, эффект луча - это VFX_BEAM_*** , напр. VFX_BEAM_COLD.

Автор: DBColl Jul 20 2004, 16:50

EffectBeam(...);

Автор: Ragnor Jul 20 2004, 17:42

А как сделать чтобы он от камней был направлен на НПС.

Автор: Tarre Talliorne Jul 20 2004, 20:13

Neverwinter Script Source
effect EffectBeam(
    int nBeamVisualEffect,
    object oEffector,
    int nBodyPart,
    int bMissEffect = FALSE
);


nBeamVisualEffect
VFX_BEAM_* константа, озбозначающая эффект, напр. VFX_BEAM_COLD.

oEffector
эффектор (ПС, НПС, камни)

nBodyPart
часть тела, в которую эффект направлен

bMissEffect
оставь как есть

Автор: Ragnor Jul 20 2004, 22:17

Большое спасибо yes3.gif

Автор: Tarre Talliorne Jul 20 2004, 22:48

Всегда пожалуйста. Приятно иметь дело с вежливым человеком. Все ведь за "спасибо" работаем...

Автор: Ragnor Jul 20 2004, 22:54

Наверное я прогоняю, но мне пишет "неправильная переменная", если не сложно напишите пример.

Автор: Tarre Talliorne Jul 20 2004, 23:41

Могу ошибаться (пишу в отрыве от тулсета), но вроде так, где oPC - твой ПС, oStone - твой камень.

Neverwinter Script Source
ApplyEffectToObject(1, EffectBeam(VFX_BEAM_COLD, oStone, 1), oPC);

Автор: Ragnor Jul 21 2004, 09:16

bad.gif Неполучается у меня, или пишет нет точки с запятой, или нет левой скобки,(хотя это всё на месте),или пишет потеря анализатора переменной, или просто ничего в игре не происходит, напишите скрипт уже с переменными, и куда его ставить.

Автор: DBColl Jul 21 2004, 09:42

Попробуй на OnHeartbeat камня...

Neverwinter Script Source
object oPC = GetFirstPC();
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oPC);

Автор: _kaa_ Jul 21 2004, 11:11

Цитата(DBColl @ Jul 21 2004, 09:42)
Попробуй на OnHeartbeat камня...
Neverwinter Script Source
object oPC = GetFirstPC();
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oPC);

Если я правильно помню - камень обязан быть НЕ static, иначе ничего не выйдет. Хотя это было давно, до 1.3х и может что-то изменилось smile.gif

Автор: Ragnor Jul 21 2004, 14:30

Спасибо, скрипт работает отлично, но мне нужно чтобы он на НПС был направлен, а не на ПК

Автор: Аваддон Jul 21 2004, 14:37

Тогда

Neverwinter Script Source
object oNPC = GetNearestObjectByTag("TAG_NPC",OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oNPC);


TAG_NPC это тэг твоего НеПиСя. Придумай ему что нить оригинальное

Автор: M@ster_o_B Jul 21 2004, 17:41

Помогите! Срочно! Плиииззз!
Написал совсем детский скрипт на OnUsed стула

Neverwinter Script Source
void main()
{
object oPC = GetPCSpeaker();
object oChair = OBJECT_SELF;
AssignCommand(oPC, ActionSit(oChair));
}


Вроде простой, но он не работает! Скрипт должен сажать перса на стул при его использовании. Перс к стулу подходит но на него не садится!

Автор: Auren Jul 21 2004, 17:44

object oPC = GetLastUsedBy();

А фапще лучше фот:

Neverwinter Script Source
void main()
{
   object oPC = GetLastUsedBy();
   object oChair = OBJECT_SELF;
   if (GetIsPC(oPC))
   {
   if (GetIsObjectValid(oChair) && !GetIsObjectValid (GetSittingCreature(oChair)))
       {
       AssignCommand(oPC, ActionSit(oChair));
       }
   }
}

Автор: M@ster_o_B Jul 21 2004, 18:18

Auren, большое сенькс! Заменил GetPCSpeaker на GetLastUsedBy и все заработало! Но я так и не понял в чем разница!

Автор: Tarre Talliorne Jul 21 2004, 18:25

GetPCSpeaker(); - это ПС, участвующий в диалоге.
А GetLastUsedBy(); - это последний использовавший стул.

Автор: M@ster_o_B Jul 21 2004, 18:29

Цитата
GetPCSpeaker(); - это ПС, участвующий в диалоге.

То, что только в диалоге я не знал. Спасибо, Тарр, разъяснил!

Автор: Tarre Talliorne Jul 21 2004, 18:45

Для всех:
Обращайте внимание в первую очередь на ее(функции) название и описание (чтобы увидеть его, клините 2 раз по функции, описание появится в субокне редактора). Назначение можно понять уже на этой стадии.
пример: GetPCSpeaker(. . . );
get - вернуть
PC - ПСплейер
Speaker - говорящий.
Итого: вернуть ПС, участвующего в диалоге. Все просто.

Если назначение функции вам непонятно, смотрите в Лексиконе. Если у вас его нет, обязательно скачайте, без него у вас не получиться освоить скриптинг даже на среднем уровне.

Цитата
То, что только в диалоге я не знал. Спасибо, Тарр, разъяснил!

Всегда рад помочь.

Автор: Dark Lord Jul 23 2004, 19:59

ВОПРОС ! Какое событие происходит (если происходит) при ЗАКАНЧИВАНИИ стрел в обойме заряженной в слот и как его отследить ? Очень надою. shout.gif
Добавлено в [mergetime]1090602099[/mergetime]
Ну или хотя бы при заряжании в СЛОТ очередной обоймы при заканчивании старой.

Автор: Tarre Talliorne Jul 23 2004, 21:09

Хех. Авто перезарядку делаешб? :-)
Как я разумею, каждый раз когда ты берешь стрелу из пучка, срабатывает событие на избятие этой вещи из инвентаря. Тебе надо отследить последнюю стрелу... Хм... Тогда делай так: на это событие ставь фильтр "Если в слоте стрел больше ничего нет", то ДЕЙСТВИЕ. В твоем случае - взять в этот слот еще одну пачку стрел.
Не проверял, но имхо должно работать.

Автор: Dark Lord Jul 23 2004, 22:22

Попробую завтрась. Не, вообще я делаю пятизарядный арбалет. Пока арбалет spiteful.gif А то ну что это такое - закончился магазин бластера - а на темпе стрельбы смена магазина не отразилась... bad.gif Надо ввести смену магазина как полное действие. Почему биотвари не сделали пятизарядный арбалет ? pleasantry.gif beee.gif
Добавлено в [mergetime]1090610916[/mergetime]
Да, и еще

Цитата(Dark Lord @ Jul 20 2004, 12:18)
В общем ясно сделать полноценно очередь даже в форме быстрого выстрела с увеличенным числом пуль нельзя. Ладно, если понадобится сделаю пулей из нескольких частей (роем пуль) и анимацией самого випона. Кстати, Айс, растолкуй как сделать вот такое :

есть в инвентарике объект, штык, вернее багинет. Есть винтарик. Задача : с помощью УникПауэра на штыке нацепить его на винтарик. Ну все ясно да : проверитьт есть ли в инвентаре винтарик с нужным тегом, удалить штык удаолить винтарик и дать копье сделанное в форме винтарика. У копья УникПауэр который возвращает винтарик и штык. НО ! На одну и ту же винтовку можно надеть разные штыки ! Более того штык и винтарик могут быть КВЕСТОВЫМИ ! Т.е. надо как-то "запоминать" образы винтарика и штыка а затем их восстанавливать в инвентаре причем уже из ДРУГОВО скрипа. ВОТ как ? Заодно расскажи как повесить ЮникПауэр ибо стыдно но до сих пор не допер  скрип написать на уник пауэр так-то смог а вот проверить повесив немогу...


Добавлено в [mergetime]1090611811[/mergetime]
Цитата(Tarre Talliorne @ Jul 23 2004, 21:09)
срабатывает событие на избятие этой вещи из инвентаря


Вот это совсем не факт, надо проверить. СТрелы- то остаются в инвентаре ! Они просто пеемещаются в слот ! Ну ладнось завтра проверю отпостю.

Автор: DBColl Jul 23 2004, 23:40

У меня есть такой чувак в модуле. Он стреляет по мишени, после 6 выстрелов идет к мишени, "собирает" стрелы, перезаряжается...

(Aiwan: по секрету, этого чувака когда-то делал Баал :ss: )

Эээ... Короче, ты для кого делаешь, для PC или NPC?

Автор: Dark Lord Jul 24 2004, 11:38

Для ПС и для НПС, для всех у кого будет ЗВ-дистантное оружие !

Автор: DBColl Jul 24 2004, 15:19

Цитата(DBColl @ Jul 23 2004, 23:40)
(Aiwan: по секрету, этого чувака когда-то делал Баал)

Этого чувака делал я. wink3.gif С нуля. Бааловский меня не устроил.

Автор: Dark Lord Jul 24 2004, 16:03

Ну такъ ?

Автор: Tarre Talliorne Jul 24 2004, 19:01

Цитата
Вот это совсем не факт, надо проверить. СТрелы- то остаются в инвентаре ! Они просто пеемещаются в слот ! Ну ладнось завтра проверю отпостю.

А тебя не смущает, что ИНВЕНТАРЬ это одно, а СЛОТЫ - это другое? :-) Попробуй, ЧТО вернет фёст айтем ин инвентори, если в инвентаре ничего нет, а в слотах дофига шмота. Правильно, OBJECT_INVALID.

Автор: Dark Lord Jul 24 2004, 20:27

Гмм... Действительно ! Пасиба Тарре за идею good.gif

Автор: Tarre Talliorne Jul 24 2004, 20:39

Всегда пожалуйста.

Автор: Dark Lord Jul 24 2004, 22:02

А тогда, как реализовать этакую задержку во время боя ? Имеются идеи как справоцировать ПС произвести некие действия именно когда заканчивается обойма ПРИЧЕМ ИМЕННО С ЦЕЛЬЮ НЕКОТОРОЙ ПАУЗЫ НА "СМЕНУ МАГАЗИНА" - но !желательно конечно чтобы это была своя анимация симены магазина на ! не будет ли эта анимация СРЕДИ БОЯ отображаться как-то не так ? если будет то лучше прросто задержка в действиях ПС (без тайцм-стопа ! просто прекращение атаки на время "перезаряжания" = 1 полное действие !! )

Автор: Tarre Talliorne Jul 25 2004, 12:01

Попробуй так: ловишь событие окончания обоймы, кидаешь на игрока очистку акций, а затем делэй на 1 сек. Все гениальное просто (гениальность не гарантирую, но простота налицо :-) )

Автор: Dark Lord Jul 25 2004, 14:47

Цитата(Tarre Talliorne @ Jul 25 2004, 12:01)
делэй на 1 сек


Энто как ? МОжно отсюда поподробнее ? ЧТо за делей ? И на что он влияет ? Только на акции ПК чтоли ?

Автор: DBColl Jul 25 2004, 16:01

Делэй, это задержка относительно того момента, когда срабатывает данный скрипт. Т.е. если в твоем событии стоит:
DelayCommand(3.0, некая команда); то сработает она через 3 секунды.
DelayCommand(3.0, некий Action); попытается занестись в стек акций через 3 секунды.

Автор: Аваддон Jul 25 2004, 19:54

Вот что хотел спросить. Как можно оорганизовать хотсайл по саб расам? Допустим если в эльфийский городок прибегает игрок с саб расой Drow.
Он юзер дефайнед ставится проверка саб расы? И сразу делать действие - атака?
Хм так ладно, а вот еще что хотел спросить. Можно сделать так чтоб при заходе на шард у игрока с саб расой дроу автоматом выставлялся хостайл на игроков с остальными расами?

Автор: DBColl Jul 25 2004, 20:18

Цитата(Аваддон @ Jul 25 2004, 19:54)
Хм так ладно, а вот еще что хотел спросить. Можно сделать так чтоб при заходе на шард у игрока с саб расой дроу автоматом выставлялся хостайл на игроков с остальными расами?

А с чем собсна проблемы-то? На онентер что нельзя репутацию зааджастить в цикле, ко всем игрокам? unknw.gif

Автор: Dark Lord Jul 25 2004, 22:23

Цитата(Аваддон @ Jul 25 2004, 19:54)
. Можно сделать так чтоб при заходе на шард у игрока с саб расой дроу автоматом выставлялся хостайл на игроков с остальными расами?


Хмм... А зачем ? В смысле смысл самого скрипта ? Или это секрет :ss:

Автор: DBColl Jul 25 2004, 23:15

Dark Lord
Ну вроде ж как Дроу - враждебная раса. Реализм. Какие секреты? biggrin.gif

Автор: Auren Jul 25 2004, 23:21

См. Nordok. Вот смысл

Автор: Valleo Jul 26 2004, 01:17

Тут описана хостайловая система на дроу - если дроу видят эльфа то атакуют. ЗЫ: у НПС-дроу должна быть своя фракция.
Используетсямоя система субрасс, которая работает на шарде Энтарион 1.01. Позже, как зпустим 2.0 я выложу всю систему сюда.

Все "SUBRASE_SUB_" заменить на свое... нужное вам =)

Скрипт смотрит стелс, хайд и т.п. и делает чеки.
Ставится на OnPerception дроу...
Используется стандартный AI скрипт "nw_c2_default2".

Neverwinter Script Source
#include "val_subrace_func" //свою систему субрас

void main()
{
object oPC = GetLastPerceived();

//Check is oPC is PC-Player
if(!GetIsPC(oPC) || GetIsDM(oPC))
  {
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }

int iRacial = GetRacialType(oPC);
int iSubRace = SubraseDefineSubrase(oPC);

if(GetLastPerceptionSeen() == TRUE)
  {
  if(iRacial == RACIAL_TYPE_ELF && iSubRace == SUBRASE_SUB_DROW)
  {
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
  else if(iRacial == RACIAL_TYPE_DWARF && iSubRace == SUBRASE_SUB_DUERGAR)
  {
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
  else if(iRacial == RACIAL_TYPE_ELF)
  {
  if(GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED) SpeakString("От менz не спрzчешьсz, трус!");
  AdjustReputation(oPC, OBJECT_SELF, -100);
  AdjustReputation(OBJECT_SELF, oPC, -100);
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
  else
  {
  if(GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED)
    {
    SpeakString("Странно, что это существо нижшей рассы пытаетсzспрzтатьсz! В атаку!");
    AdjustReputation(oPC, OBJECT_SELF, -100);
    AdjustReputation(OBJECT_SELF, oPC, -100);
    }
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
  }
else if(GetLastPerceptionHeard() == TRUE)
  {
  if(GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED)
  {
  SpeakString("Я что то слышал...");
  ActionMoveToObject(oPC,TRUE);
  ActionSpeakString("Вот здесь... Хммм...");
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
  else
  {
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
  }
else
  {
  ExecuteScript("nw_c2_default2", OBJECT_SELF);
  return;
  }
}

Автор: DBColl Jul 26 2004, 01:23

Цитата(Valleo @ Jul 26 2004, 01:17)
нижшей рассы

Извини, может я придираюсь, но в 2-х словах 2 ошибки.
Правильно - "низшей расы".

Автор: Valleo Jul 26 2004, 01:33

Ой ну это ляпнуто у меня клава кривая буквы западают на и в запале чего тока не напечатаешь =)

ЗЫ: а на OnEnter модуля кинуть цикл GetFerstPC....GetNextPC и сверять субрасы??

Автор: Shad Jul 26 2004, 07:46

Пара вопросов по скриптам... рад что нашёл где могу задать:

1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.

2. Как сделать AreaOfEffect, не подверженную диспеллу?// Прописывание её при наложении как ExtraordinaryEffect не помогает...

4. Как узнать, использовался ли при текущем ударе талант-фит Improved Disarm// (например. Power Attack или Expertise легко определить - это режимы...). Это в скрипте для спец-атаки в OnHitCastSpell - одновременно с Дизармом не должно использоваться, по задумке.

При скриптовании и вообще работе с редактором вопросов возникает много, но я выбрал самые труднорешаемые для меня сейчас. Возможно кто уже сталкивался, подскажите.

Автор: Tarre Talliorne Jul 26 2004, 11:20

1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.[QUOTE]
На сколько я знаю, единственный способ (и то в ХотУ) это юзать EffectRest (все эффекты завершенного отдыха, только мгновенно)

Автор: 2GoDoom Jul 26 2004, 13:11

У мя тоже вопрос smile.gif
1. Как узнать ResRef конверсейшна? (если это и есть название которое даешь при создании то см. второе)
2. Почему не запускает конверсейшн:

Neverwinter Script Source
if(sTag=="FUR_BOSS") {
  if(GetIsObjectValid(GetItemActivatedTarget())) {
  SetLocalString(oPC, "furniture", GetResRef(GetItemActivatedTarget()));
  ActionStartConversation(oPC, "cc_fur_boss", TRUE); //Не пашет
  } else
   {
    FloatingTextStringOnCreature("Данную вещицу можно использовать только на предмет!", oPC, FALSE); //Пашет если не на объект щелкнул
   }

ОШИБОК КОМПИЛЯТОР НЕ ВЫДАЕТ!

Автор: aleVandal Jul 26 2004, 14:35

Цитата
Как в скрипте восстановить количество кастов спелла

- функция ForceRest(object oCreature) - но учти, что она востанавливает не только спелы, но и хиты и фиты.
Так что последние перед вызовом функции сохраняешь, а потом восстанавливаешь.

Автор: Aiwan Jul 26 2004, 16:10

Цитата(2GoDoom @ Jul 26 2004, 16:11)
ОШИБОК КОМПИЛЯТОР НЕ ВЫДАЕТ!


Neverwinter Script Source
AssignCommand(oNPC, ActionStartConversation(oPC, "cc_fur_boss", TRUE));


Твой скрипт на OBJECT_SELF ?
То как ты поставил команду возможно только для OBJECT_SELF, все остальные должны юзать функцию AssignCommand (Тому кто должен сделать, то то то то...)

Автор: Аваддон Jul 26 2004, 18:19

Тут вопрос назрел. Допустим есть сабраса Вампир. Как сделать чтоб он лечился кровью я знаю. А вот как сделать чтоб для него были пагубны вские Healers Kit и Poition'ы ?
Добавлено в [mergetime]1090855183[/mergetime]
Внести изменения в скрипт отвечающий за спелл лечения?

Автор: Aiwan Jul 26 2004, 19:08

Shad твои вопросы выше среднего. Я с таким не сталкивался, а крутые скриптеры мнрогие отдыхают. Если не ответят на все вопросы сейчас, попозже подними их еще раз. И добро пожаловать к нам на форум wink3.gif

Автор: 2GoDoom Jul 26 2004, 22:12

Аваддон, выбирай сабрасу на основе расы андеад.
Или же выдавай шкуру андеда (хотя кажись не в ней дело).
Добавлено в [mergetime]1090869202[/mergetime]
А... Точно.. Упустил из виду
Спасибо, Айв smile.gif

Автор: Аваддон Jul 27 2004, 00:16

2GoDoom,
Чего то я вообще не догнал. Конкретнее smile.gif

Автор: Shad Jul 27 2004, 01:28

Цитата
Пара вопросов по скриптам... рад что нашёл где могу задать:

1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.

2. Как сделать AreaOfEffect, не подверженную диспеллу?// Прописывание её при наложении как ExtraordinaryEffect не помогает...

4. Как узнать, использовался ли при текущем ударе талант-фит Improved Disarm// (например. Power Attack или Expertise легко определить - это режимы...). Это в скрипте для спец-атаки в OnHitCastSpell - одновременно с Дизармом не должно использоваться, по задумке.
(Вопрос снят - GetLastAttackType(object): возвращает тип последней аттаки _по object_ (вопреки описанию)).


Цитата(Aiwan @ Jul 26 2004, 19:08)
Shad_ твои вопросы выше среднего. Я с таким не сталкивался, а крутые скриптеры мнрогие отдыхают. Если не ответят на все вопросы сейчас, попозже подними их еще раз. И добро пожаловать к нам на форум wink3.gif

Ок. smile.gif

А про ForceRest я тоже думал... только сложно выходит (для сервера), особенно если перед тем обкастовка... всякие неестественности как бы не произошли. Еще была идея к спеллу фит привязать, и его потом восстанавливать - но как-то через левое ухо получается.

Автор: 2GoDoom Jul 27 2004, 12:17

Аввадон, запусти обычный модуль (локально) с кучкой зомби (они то UNDEAD по рассе и шкурка UNDEAD'а на них натянута) - и попробуй их полечить клериком smile.gif

Автор: Аваддон Jul 27 2004, 13:41

Ну эту фишку что мертвых можно лечить только негативом я еще с балдуры знаю. Ты мне скажи конкретно что с саб расой вампир делать? Это не НПС! Это у игрока такая саб раса. С нпс то все проще.

Автор: Tarre Talliorne Jul 29 2004, 15:52

Цитата
Тут вопрос назрел. Допустим есть сабраса Вампир. Как сделать чтоб он лечился кровью я знаю. А вот как сделать чтоб для него были пагубны вские Healers Kit и Poition'ы ?

Думаю, такой вариант прокатит:
1. Для пойшнов. Выход только один: отлавливаем событие "принятия на грудь" зелья и кидаем на Пс нужные нам эффекты. Для ПС модульное событие потери предмета, а для НВН- on_disturbed. Только надо проверять, выпил ПС\НПС зелье или положил на землю...
2. Для заклов. Здесь все немного сложнее: в скриптэдиторе жмешь опер, кликаешь скрипты кампаний НВН, в свитке выбираешь spell'ы. И по названиям находишь скрипты заклов лечения, их редактируешь как тебе надо и перезаписываешь.

Автор: Аваддон Jul 29 2004, 19:23

Так собсна гря также и с поишенами дело обстоит они ведь просто напросто кастуют спелл лечения.

Автор: balrog Aug 4 2004, 22:20

Я тута гляжу собрались такие крутые скриптеры такого уже напридумывали =) А могли бы вы мои ошибки в скриптах подправить, а?
http://www.wrg.ru/forums/index.php?showtopic=370 <== тяпать сюда .... там всё что я написал .... будте добры помогите ошибки в скриптах исправить ... коегде дописать кое где зачеркнуть .... вам это займёт всего нетого - пару минут yes3.gif

А ещё! ищу хорошего скриптера каторому не впадлу написать пару скриптиков - пишите

СПАСИБО ЗА ВНЕМАНИЕ.

Автор: Tarre Talliorne Aug 6 2004, 18:47

Цитата
http://www.wrg.ru/forums/index.php?showtopic=370 <== тяпать сюда ....

Пости сюда все скрипты. Если хочешь создать отдельную комнату для своей команды - обращайся к Айвану.

Цитата
ЕСТЬ НОВАЯ ИДЕЯ!!! Игрок берёт в аренду здание под магазин, Нанемает продавца, пишет ему текст диалога, но вот как сделать так, шобы продавец продовал то, что игрок ему передаст из своего инвентаря (с учётом того, шо продавец ничего не скупает!) ПОМОГИТЕ!!!

Самая простая реализация - ПС оставляет в сундуке то, что должен получить НПС - продавец.

Автор: Aiwan Aug 15 2004, 00:41

Цитата

Окей, скажем так - есть некоторые скрипты, которые больше не используются и не обновляются с тех пор, как в них исчезла нужда (например, система помощников была полностью заменена как в SoU, так и в HotU). Я перекомпилировал все те скрипты, что поставлялись с "ордами", перед выпуском, чтобы удостовериться, что все необходимые скрипты компилируются без проблем. Проблема в 99.9% всех случаев "Я не могу скомпилировать из-за этого include-файла" - из-за перезаписанных стандартных скриптов в модуле или каталоге override. Если один скрипт где-нибудь внизу лестницы зависимостей перезаписан в модуле, он не будет обновляться, когда игра патчится, если вы вручную его не удалите, тем самым ломая все зависящие от него скрипты. В общем, вам лучше не менять include-файлы Bioware, если вы не знаете, что это за собой повлечёт. Если вы настаиваете на использовании старых наборов скриптов (напрмер, старого ИИ наёмников/помощников), вам придётся переписать всю цепочку зависимостей в модуле.

pleasantry.gif Мы это съели и выплюнули чуть не подавившись год назад...

Автор: gor Sep 13 2004, 23:11

Кто-нибудь делал марширующий взвод солдат? smile.gif
В смысле, чтобы ровно передвигались и не спотыкались

Автор: Aiwan Sep 14 2004, 08:51

У... Это очень сложно. moil.gif Помоему почти нельзя, только если натыкать кучу вейпов и пинать каждого к следующему, но это мега геммор ИМХО.

Автор: Dark Lord Sep 14 2004, 13:19

Брр... Сделать всех одним кричем. Лучше плайсом и его двигать. Вот и усе. Не конечно если надо чтобы каждый еще и диалог имел - то ето другое. Ну а так то....
Добавлено в [mergetime]1095157295[/mergetime]
Только анимацию сложно делать, и - учитывая что в НВН поворот осужествляется наскоко я помню *без* анимации - очень интересно посмотреть как такой крич будет поворачиваться crazy.gif А если просто прошагать да по красной плозади клонной - тада именно - одним кричем или плайсом всех солдат.

Автор: Аваддон Sep 14 2004, 16:03

А мона сделать много тригеров и вейпов. И как солдать на него наступает - проверять че за солдат и направлять его к определенному вейпу

Автор: DBColl Sep 14 2004, 17:51

Брррр... Гемор. Не стоит свеч. Имхо.

Автор: Lex Sep 14 2004, 18:59

Самый наименее геморный способ - ActionForceFollowObject
Добавлено в [mergetime]1095177569[/mergetime]
качество не охти, но зато никаких трудностей

Автор: DBColl Sep 14 2004, 19:31

В ногу они все равно шагать не будут biggrin.gif.

Автор: gor Sep 22 2004, 03:17

QUOTE
Сделать всех одним кричем. Лучше плайсом и его двигать.


Что есть "кричем?"

QUOTE
А мона сделать много тригеров и вейпов. И как солдать на него наступает - проверять че за солдат и направлять его к определенному вейпу


Хм, наверное, так что-то получится. Да, геморно yes.gif

QUOTE
Брррр... Гемор. Не стоит свеч. Имхо.


СтОит. Заходишь в город, а там сурово - война, все идут на фронт. Сразу настраивает на нужный лад.

QUOTE
Самый наименее геморный способ - ActionForceFollowObject


Нет. Будут спотыкаться, споткнувшись тормозить и стоять на месте.
Надо, чтобы просто шла вооруженная группа и было видно, что это организованная единица. Навороченной анимации - не обязательно.

2DBColl. Насчет карты, как в Леворе. Можно сделать так? На плане карта боя, кругом войска - их мышкой перекидываешь, в общем, стратегия. К примеру, оборона города во второй части ХотУ - с такойкартойбысмотрелась







Автор: DBColl Sep 22 2004, 10:42

QUOTE (gor @ Sep 22 2004, 03:17)
Что есть "кричем?"

Creature.
QUOTE (gor @ Sep 22 2004, 03:17)
Хм, наверное, так что-то получится. Да, геморно

Не получится. Все равно будет сбоить. this.gif
QUOTE (gor @ Sep 22 2004, 03:17)
СтОит. Заходишь в город, а там сурово - война, все идут на фронт. Сразу настраивает на нужный лад.

Можно не толпой отправлять. А по частям. По 3 чела допустим. Тогда можно хорошо сделать. И лад тоже будет нужный wink.gif. Если еще экран взрывами потрясывать.
Есть на самом деле куча способов ОБОЗНАЧИТЬ военные действия и утыкаться в то, что практически не реализуемо не стоит. Лучше подумать хорошенько и попробовать другие методы wink.gif.
QUOTE (gor @ Sep 22 2004, 03:17)
Надо, чтобы просто шла вооруженная группа и было видно, что это организованная единица. Навороченной анимации - не обязательно.

Имхо, как сказал Dark Lord это получится только если делать ВСЮ толпу одним кричем с одинаковой анимацией... Но смотреться будет не лучшим образом, когда при наведении мыши будет подсвечиваться ВСЯ толпа... Потому ЛУЧШЕ забить на это. Пробовать другие способы. yes.gif
QUOTE (gor @ Sep 22 2004, 03:17)
2DBColl. Насчет карты, как в Леворе. Можно сделать так? На плане карта боя, кругом войска - их мышкой перекидываешь, в общем, стратегия. К примеру, оборона города во второй части ХотУ - с такой картой бы смотрелась

Не знаю... А оно надо? Хех. Может и можно как-то сделать, если подумать. Но я бы не стал гемориться со стратегией... НВН не для того заточен buba.gif.

Автор: Shad Sep 24 2004, 01:32

Вот, несколько вопросов возникло... под пол-ворого ночи. Кто знает - подскажите:
1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.
2. Как сделать AreaOfEffect, не подверженную диспеллу?// Прописывание её при наложении как ExtraordinaryEffect не помогает...
3. Как сделать, чтобы Item свободно левитировал в воздухе, и чтобы его из воздуха можно было взять?//Редакторе висит, в игре падает вниз.
4. Как сделать, чтобы работали фиты на Creature Weapon - Improved Critical, Overwhelming Critical, например. У меня не работают.
5. Как сделать, чтобы Creature Weapon наносил одновременно разные типы физического урона (Режущий и колющий и дробящий сразу).// Когда ставлю такие свойства на оружме, или эффект на существо - урон растет но остаетья того же типа, что на базовом предмете оружии.

Автор: Twin Oct 1 2004, 04:47

У меня не работает DelayCommand, если я вызываю его из onDeath и указанное время больше чем примерно 5.0f. Попробуйте вписать себе в onDeath любого НПС следующее:

Neverwinter Script Source
#include "x2_inc_compon"
#include "x0_i0_spawncond"

void DoSpawn2();

void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();

    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if ( nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL) )
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    // Call to allies to let them know we're dead
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    DelayCommand( 20.0f, DoSpawn2());
    SendMessageToPC(GetFirstPC(), "debug 1");

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    if ( GetSpawnInCondition(NW_FLAG_DEATH_EVENT) )
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }

    craft_drop_items(oKiller);
}

void DoSpawn2()
{
    SendMessageToPC(GetFirstPC(), "debug2");
}


Смысловой нагрузки в DoSpawn2() нет, т.к. у нас идет типа отладка. Проблема в том, что у меня "debug2" не пишет, если понизить время в DelayCommand до 5.0f то напишет, но мне то нужно таймер больше чем минуты делать. Почему так происходит я не знаю, еще очень мало работаю с тулсетом. Может кто подскажет как мне реализовать таймер после убийства НПС, причем я должен иметь доступ к свойствам убиваемого НПС (только для чтения, не для записиsmile.gif).

Автор: Aiwan Oct 1 2004, 05:38

Твоя функция вызывается скорее всего ПОСЛЕ разрушения твоего НПС. Вот посему он ее и не находит после 5 секунд.
Добавлено в [mergetime]1096598585[/mergetime]
Если ты хочешь какой то набор действий, то лучше запускай через DelayCommand отдельный скрипт.

Автор: Twin Oct 1 2004, 07:24

Aiwan
Ок, на счет разрушения. Если ты говоришь так, значит так. Я это допускал. Но объясни мне, как может DelayCommand зависить от существования OBJECT_SELF'а? Это же бред. 5 секунд, примерно изчезают останки с карты и появляется лут, видимо этот отрезок и является ключевым. Но его править не размуно. Опять же, выходит такой кривой движок, если DelayCommand перестает работать после уничтожения объякта, вызвавшего его? Ведь DoSpawn2() никакого отношения к OBJECT_SELF'у не имеет. Не приятно, что через такую жопу всё... swoon.gif

Автор: Lex Oct 1 2004, 09:25

Ты вешаень на НПС команду с зедержкой на 20 сек. А если через 20 сек нет этого НПС, то все. Твоя команда потерялась, так как нет объекта, к которому была привязка..все логично

Автор: DBColl Oct 1 2004, 10:33

Лекс, абсолютно прав в своем ответе. И все действительно ЛОГИЧНО.

QUOTE (Twin @ Oct 1 2004, 04:47)
Проблема в том, что у меня "debug2" не пишет, если понизить время в DelayCommand до 5.0f то напишет, но мне то нужно таймер больше чем минуты делать. Почему так происходит я не знаю, еще очень мало работаю с тулсетом. Может кто подскажет как мне реализовать таймер после убийства НПС, причем я должен иметь доступ к свойствам убиваемого НПС (только для чтения, не для записи).

А вот в этом случае я бы тебе советовал делать перед смертью
SetDestroyable(OBJECT_SELF, ...); - чтобы не пропадал труп!
Весь инвентарь выкидывал в какой-то лут-контейнер рядом... И уже на этот контейнер можно повесить конструкцию:

AssignCommand(oLoot, DelayCommand(30.0, действие));

Затем сразу можно Destroy'ить тело wink.gif.
<small>Добавлено в 10:38</small>
QUOTE
DelayCommand( 20.0f, DoSpawn2());

QUOTE (Twin @ Oct 1 2004, 07:24)
Опять же, выходит такой кривой движок, если DelayCommand перестает работать после уничтожения объякта, вызвавшего его? Ведь DoSpawn2() никакого отношения к OBJECT_SELF'у не имеет. Не приятно, что через такую жопу всё...

Это как это НЕ ИМЕЕТ??? swoon.gif ИМЕЕТ! yes.gif
Замени свою конструкцию на
Neverwinter Script Source
AssignCommand(oKiller, DelayCommand(20.0, ExecuteScript("скрипт с DoSpawn2()")));

...и увидишь разницу. wink.gif

Автор: Aiwan Oct 1 2004, 11:31

QUOTE (Twin @ Oct 1 2004, 10:24)
Я это допускал. Но объясни мне, как может DelayCommand зависить от существования OBJECT_SELF'а? Это же бред.

Ты не прав. Посмотри, твоя команда
Neverwinter Script Source
DelayCommand( 20.0f, DoSpawn2());

Вызывает функцию, которая прописана в скрипте объекта OBJECT_SELF.
ТЫ ВЫЗЫВАЕШЬ эту функцию через 10 секунд, например, а функции УЖЕ НЕТ! Так как она была прописана на НПС а он дестроился. Все это будет работать так скрипт с именем DoSpawn2:
Neverwinter Script Source
void DoSpawn2()
{
    SendMessageToPC(GetFirstPC(), "debug2");
}


Будет запускаться таким образом:

Neverwinter Script Source
#include "x2_inc_compon"
#include "x0_i0_spawncond"

void DoSpawn2();

void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();

    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if ( nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL) )
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    // Call to allies to let them know we're dead
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    DelayCommand( 20.0f,  ExecuteScript("DoSpawn2", GetFirstPC()));
    SendMessageToPC(GetFirstPC(), "debug 1");

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    if ( GetSpawnInCondition(NW_FLAG_DEATH_EVENT) )
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }

    craft_drop_items(oKiller);
}

Автор: Lex Oct 1 2004, 18:59

на такую халаву все горазды отвечать (и я в том числе).
А вот на 5 вопросов Shadа никто ответить даже не пытался..признаюсь, что некоторые (вопросы) ставят меня в тупик.

Автор: Twin Oct 2 2004, 01:43

Ох, сорри. wink.gif Просто мне очень хотелось верить в то что DelayCommand работает на низком уровне и уж априори не является свойством объекта. Ну нет так нет. smile.gif Я в тулсете ноль, хотя после ваших ответов уже с палочкой. yes.gif Спасибо.

2 DBColl:
Я писал авто-респаун НПСей для PW не через энкаунтеры, а по событию смерти. Лут их мне не был нужен, лиш resref и тэг. В итоге так и реализовал, как ты советывал, вешая DelayCommand на "системный" плэйс (чтоб ДМ мог его разломать и все респауны прекратились lol.gif).

Автор: Aiwan Oct 2 2004, 08:30

Shad Пропустил твой пост... тока нашел...

QUOTE (Shad @ Sep 24 2004, 04:32)
3. Как сделать, чтобы Item свободно левитировал в воздухе, и чтобы его из воздуха можно было взять?//Редакторе висит, в игре падает вниз.

Никак. Вся инфа об итемах и простых предметах на арене находится в вайлах локации. А изменение координаты Z можно лишь через тулсет. Но можно сделать невидимый объект на уровне тайлов, с возможностью ходить по нему. Тогда это будет невидимый объект - пъедестал, который будет тормозом для игрока. Есть еще способ, он проще но есть но. Делаешь в Махе два предмета с разными координатами и размерами. Например как картины в НВН. Основание далеко внизу а макушка видимая вверху, в виде pls объекта. Затем дестрой-крет в инвентаре твой итем. Но Объект будет активным скорее всего весь, так что тут свои изъяны.
А вообще, сделать что то в НВН красиво и без изврата не возможно.
QUOTE (Shad @ Sep 24 2004, 04:32)
4. Как сделать, чтобы работали фиты на Creature Weapon - Improved Critical, Overwhelming Critical, например. У меня не работают.
5. Как сделать, чтобы Creature Weapon наносил одновременно разные типы физического урона (Режущий и колющий и дробящий сразу).// Когда ставлю такие свойства на оружме, или эффект на существо - урон растет но остаетья того же типа, что на базовом предмете оружии.

Это все редактирование 2Да. Что именно и возможно ли все что ты просишь я не знаю. Но из логики работы с редактором могу сказать только одно. Любое действие, то бишь тот же урон, есть такой же Action как и многое другое. Следовательно он становится в очередь при механике боя, при расчете кубиков. И поэтому он возможен только один, а не вся куча критикалов. Ведь правила ДнД вшиты круто в движок и многое не выдрать.

И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов. Подумай десять раз, стоит ли твой гемморой стольких свечь или нет?

п.с. Не обижайся, если я резковато ответил yes.gif А вообще, чем занят? wink.gif Может поделишься инфой?

Автор: Elven king Oct 4 2004, 17:53

Такая прозьбы, для опытных мастеров:
Кто исправит мой скрипт для отдыха, а то я уже голову сломал и так, и эдак пробовал, но нифига не выходит sad.gif Помогите!
Вот собстна сам скрипт:
rest

CODE
void DestroyFirecamp(object oCampFire=OBJECT_SELF)
{
// Создаем обгорелое пятно на месте костра и гасим костер
 object oLandMark=CreateObject(OBJECT_TYPE_PLACEABLE,"plc_weathmark",GetLocation(oCampFire));
// Пятно исчезает через 120 секунд (2 реальных минуты, 1 игровой час). Менять по вкусу
 AssignCommand(oLandMark,DelayCommand(120.0,DestroyObject(oLandMark)));
 DestroyObject(oCampFire);
}

void ApplyRestEffect(object oTarget=OBJECT_SELF)
{
// Создаем эффекты сна. Функцию править по вкусу.
 effect eSleep=EffectBlindness();

 if (GetRacialType(oTarget)==RACIAL_TYPE_ELF)
 {
// Эльфы едят и пьют другое
object FindFood(object oTarget=OBJECT_SELF)
{
 object oEnum=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oEnum) && (GetTag(oELEnum)!="FOODELVEN"))
     oEnum=GetNextItemInInventory(oTarget);
 return oEnum;
}
object FindWater(object oTarget=OBJECT_SELF)
{
 object oELWATER=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oELWATER) && (GetTag(oELWATER)!="WATERELVEN"))
     oEnum=GetNextItemInInventory(oTarget);
 return oELWATER;
}


     // Эффект сна на 30 секунд. Менять по желанию.
 ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oTarget,30.0);
}

object FindFood(object oTarget=OBJECT_SELF)
{
 object oEnum=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="FOOD"))
     oEnum=GetNextItemInInventory(oTarget);
 return oEnum;
}
object FindWater(object oTarget=OBJECT_SELF)
{
 object oWATER=GetFirstItemInInventory(oTarget);
 while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="WATER"))
     oWATER=GetNextItemInInventory(oTarget);
 return oEnum;
}


makecamp (вешать на OnUsed дров)
CODE
#include "rest"

void main()
{
 object oPC=GetLastUsedBy();
 if (!GetIsPC(oPC)) return;
 object oTorch=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
 if (GetIsObjectValid(oTorch) &&
        (GetTag(oTorch) == "NW_IT_TORCH001") &&
// Флаг, висящий на области (например в таверне) и позволяющий отдыхать бесплатно
        (GetLocalInt(GetArea(oPC),"NoCampArea") != TRUE)) {
     object oFire=CreateObject(OBJECT_TYPE_PLACEABLE,"campfire",GetLocation(OBJECT_SELF));
     DestroyObject(OBJECT_SELF);
// Огонь гаснет через 900 секунд (15 реальных минут или 7,5 игровых часов)
// Менять по желаю
     AssignCommand(oFire,DelayCommand(900.0,DestroyFirecamp(oFire)));
 } else {
     CreateItemOnObject("wood",oPC);
     DestroyObject(OBJECT_SELF);
 }
}


dropwood (вешать OnUnAquiredItem модуля)
CODE
void main()
{
 object oPC=GetModuleItemLostBy();
 if (!GetIsPC(oPC)) return;
 object oItem=GetModuleItemLost();
 if (!GetIsObjectValid(oItem)) return;
 string sResRef=GetTag(oItem);
 if (sResRef=="WOOD")
 {
     if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem)))) {
         CreateObject(OBJECT_TYPE_PLACEABLE,"woodpile",GetLocation(oItem));
         DestroyObject(oItem);
     }
 }
}

resteffect (вешать на OnRested модуля)

CODE
#include "rest"

void main()
{
 object oPC=GetLastPCRested();
 if (GetCurrentAction(oPC)!=ACTION_REST) return;
 int iFreeRest=GetLocalInt(GetArea(oPC),"FreeRestArea");
 if (iFreeRest) ApplyRestEffect(oPC);
 else {
     object oCampFire=GetNearestObjectByTag("campfire",oPC);
// нельзя отдыхать дальше 3 метров от костра (расстояние менять по вкусу)
     if (GetIsObjectValid(oCampFire) && (GetDistanceBetween(oPC,oCampFire)<=3.0))
{
         object oFood=FindFood(oPC);
         if (GetIsObjectValid(oFood)) {
             DestroyObject(oFood);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
object oWATER=FindWater(oPC);
         if (GetIsObjectValid(oWATER)) {
             DestroyObject(oWATER);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо попить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
}
object oELFood=FindFood(oPC);
         if (GetIsObjectValid(oFood)) {
             DestroyObject(oELFood);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
object oELWATER=FindELWater(oPC);
         if (GetIsObjectValid(oELWATER)) {
             DestroyObject(oELWATER);
             ApplyRestEffect(oPC);
         } else {
             FloatingTextStringOnCreature("Мне надо попить",oPC,FALSE);
             AssignCommand(oPC,ClearAllActions());
         }
     } else {
         FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions());
     }
 }
}

Автор: DBColl Oct 4 2004, 21:06

Хех, ты бы хоть написал, что ты от него хочешь... Хехехе... Во дал! А то, "кто исправит"! Я балдю! lol.gif lol.gif crazy.gif

Автор: Aiwan Oct 4 2004, 21:23

Алучше сделай тестовый модуль и выложи его. С итемами и скриптами. yes.gif

Автор: Elven king Oct 4 2004, 22:55

Вобщем скрип на отдых...
Смысл скрипта вот в чем: игрок кладет из инвентаря дрова, на землю потом поджигает их факелом - появляется модель костра, потом возле костра игрок нажимает rest и тогда скрипт проверяет есть ли у PC еда и вода, если PC эльф, то скрипт проверяет есть ли эльфийская вода или эльфийский паек...
ЗЫ. Выложить модуль пока времени нету... Но постараюсь найти его. smile.gif

Автор: Lex Oct 4 2004, 23:02

нужен не весль модуль, а только кусочек, где это все вставлено.

Похоже на стандартный отдых. На Эксисе такой точно был (кроме эльфийской части)

Автор: Аваддон Oct 9 2004, 00:14

Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелыsmile.gif

Автор: Aiwan Oct 9 2004, 07:03

Аваддон это можно в ХоТУ скриптовыми командами. Какими точно и как я не знаю, не сталкивался.

Автор: Shad Oct 9 2004, 08:47

QUOTE (Аваддон @ Oct 9 2004, 00:14)
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелыsmile.gif

В фильтре функций (правое окно редактора скриптов) вводишь light, это основные функции инклуды не нужны. Надо будет пробежать по всем тийлам, на нужных SetTileSourceLightColor(location lTileLocation, int nSourceLight1Color, int nSourceLight2Color). По-моему, просто по координатам, преобразовываем вектор в location... Вообще то я тоже с этим не сталкивался, но, наверно, можно ставить SourceLightColor даже не на нужных, а на всех (не уверен что легко выделить нужные) - там где нет SourceLight (светильников, факелов) это просто даст нулевой эффект, наверное.

Автор: Shad Oct 9 2004, 08:58

Привет, Aiwan. А я уже почти и перестал надеятся.(вру)

QUOTE (Aiwan @ Oct 2 2004, 08:30)
Shad Пропустил твой пост... тока нашел...

Никак. Вся инфа об итемах и простых предметах на арене находится в вайлах локации. А изменение координаты Z можно лишь через тулсет. Но можно сделать невидимый объект на уровне тайлов, с возможностью ходить по нему. Тогда это будет невидимый объект - пъедестал, который будет тормозом для игрока. Есть еще способ, он проще но есть но. Делаешь в Махе два предмета с разными координатами и размерами. Например как картины в НВН. Основание далеко внизу а макушка видимая вверху, в виде pls объекта. Затем дестрой-крет в инвентаре твой итем. Но Объект будет активным скорее всего весь, так что тут свои изъяны.

Спс. Я сам не догадался перейти на уровень редактирования моделей. Мне больше второй способ понравился, но, ты прав, новые модели в хак я ещё пять раз подумаю прежде чем добавлять. yes.gif
QUOTE (Aiwan @ Oct 2 2004, 08:30)
А вообще, сделать что то в НВН красиво и без изврата не возможно.

Иногда, да. Это ключевой момент, так удивительно когда вроде бы простая и хорошая идея требует какой-то, мм.. , очень затейливойswoon.gif реализации.

QUOTE (Aiwan @ Oct 2 2004, 08:30)
Это все редактирование 2Да. Что именно и возможно ли все что ты просишь я не знаю. Но из логики работы с редактором могу сказать только одно. Любое действие, то бишь тот же урон, есть такой же Action как и многое другое. Следовательно он становится в очередь при механике боя, при расчете кубиков. И поэтому он возможен только один, а не вся куча критикалов. Ведь правила ДнД вшиты круто в движок и многое не выдрать.


Мм. Фиты связанные с критическими ударами работяют нормально с оружием которое берётся в руку/руки, какая то странная дискриминация для оружия существ... Что подозрительно, что стандартные (!) Elder * Elemental-ы, например, имеют этот самый фит Creature Weapon - Improved Critical (что кстати соответствует и AD&D 3rd Ed MM), но он, определённо, не действует.
Про Action... Действительно ли для разных типов физ. урона невозможны отдельные "действия"? Ведь для стихийных судя по всему существуют. Мм. Если я правильно ли понимаю...: тут для всех типов физического урона есть одна на всех "ячейка", и при расчёте только идентификатор одного из них проходит как параметр этого "действия"?

QUOTE (Aiwan @ Oct 2 2004, 08:30)
И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов. Подумай десять раз, стоит ли твой гемморой стольких свечь или нет?


Чем дальше, тем больше убеждаюсь что ты прав. Началось всё месяца два (уже три) назад с уверенности, что для участия в чём-то надо хоть мало-мальски разобраться в тулсете. Надумал, взялся изучать. Повторюсь, так удивительно когда вроде бы простая и хорошая идея требует какой-то, мм.. , очень затейливойswoon.gif реализации. А от идеи отказываться как-то не хосется. Вот и думаю, и спрашиваю. В итоге наверно это никому не будет нужно.

QUOTE (Aiwan @ Oct 2 2004, 08:30)
п.с. Не обижайся, если я резковато ответил  yes.gif

Нп. Молчание горазду хуже. yes.gif

QUOTE (Aiwan @ Oct 2 2004, 08:30)
А вообще, чем занят? wink.gif

Рисовал спелл один... был такой в BG2:ToB - Вызов элементалей, с ним в комплекте Великий вызов их же. Ждал его а IWD2, ждал в NWN... Эхх... Вот, думаю, заодно и разберусь как и что.

QUOTE (Aiwan @ Oct 2 2004, 08:30)
Может поделишься инфой?

У меня всё что есть, это в основном:
туториалы по ссылкам на www.wrg.ru и Realms.ru, в том числе и статьи
"В ПОМОЩЬ СОЗДАТЕЛЮ ПРИКЛЮЧЕНИЙ" ... хорошая последовательная и структурированная штука.
+ NWN Lexicon April2004
+ Eligio Sacateca Custom Content v3.0
+ CEPBuilders Guide&Standards
...хотя учился я в основном на комментариях от Bioware.
Вот и всё. То что намутил с заклинанием (вместо 2х получилось 3, но это не важно) - наверно скоро выложу где-то здесь. Хотя вот нашел одну совсем простую вроде ошибку... это наверно единственное без чего работа просо не будет применима - это не обойти и не обойтись без него:

6. Как заставить отображаться SubRad-спеллы, если они относятся к спеллу взятому через фит?//Когда мастер-спелл повешен на посохе (том самом, что упорно не хочет летать), всё работает норм. Когда взят Epic Spell - нет. Привязка SubRad-спеллов к фиту судя по всему осуществляется в spells.2da столбец FeatID, используя формулу FeatID_для_мастер-спелла + k*65536. Вот это k мне и не даётся так сразу - SubRad-спеллы в радиальном меню не появляются.

Да, спс ещё раз, Aiwan. Пока ElemLab.rar (щас найду где тут Upload) не вполне работает. Но, ты прав, yes.gif я уже устал исправлять, пока не узнаю что работка кому-то интересна. wink.gif

Автор: Aiwan Oct 9 2004, 10:02

2 Shad я уж думал ты пропал biggrin.gif

QUOTE (Shad @ Oct 9 2004, 11:58)
Если я правильно ли понимаю...: тут для всех типов физического урона есть одна на всех "ячейка", и при расчёте только идентификатор одного из них проходит как параметр этого "действия"?

dntknw.gif biggrin.gif

Я думал ты делаешь проект. Или делаешь? Жаль, что много людей интересуются разными вещами и очень мало, а точнее почти никто sad.gif , не доделал свой проект. Это связано не с трудностями тулсета, а с переоценкой возможностей или пропажей интереса.

Автор: Shad Oct 10 2004, 08:17

QUOTE (Aiwan @ Oct 9 2004, 10:02)
2 Shad  я уж думал ты пропал  biggrin.gif


dntknw.gif   biggrin.gif

Я думал ты делаешь проект. Или делаешь? Жаль, что много людей интересуются разными вещами и очень мало, а точнее почти никто sad.gif , не доделал свой проект. Это связано не с трудностями тулсета, а с переоценкой возможностей или пропажей интереса.

Нет, Aiwan, я толко начал редактор изучать. Хочу поработать с командой шарда Siala - мне нравится их жёстко маниакальный подход.

Автор: Аваддон Oct 14 2004, 17:49

Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации?

Автор: DBColl Oct 14 2004, 18:37

QUOTE (Аваддон @ Oct 14 2004, 17:49)
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации?

В Проклятье Левора эта система живет в хертбите модуля. Однако это:
1. Сингл. По сему не приходится перебирать чаров.
2. Для создания несильной загруженности, проверки снижены до односложных-вложенных условий (без && и ||). Типа
Neverwinter Script Source
if (GetFormatTimeLastRest(oPC)+15часов > GetFormatTime())
{
   if (!GetHasWakeEffect(oPC))
   {
       ............. и т.д.
   }
}

Автор: Shad Oct 17 2004, 00:47

QUOTE (Shad @ Oct 9 2004, 08:58)
Пока ElemLab.rar (щас найду где тут Upload) не вполне работает. Но, ты прав, я уже устал исправлять, пока не узнаю что работка кому-то интересна.

Адрес изменился:
ftp://81.176.64.171/upload/NWN/ElemLab_Demo01.rar

Автор: Aiwan Oct 17 2004, 08:22

Shad щас, гляну yes.gif
Ой блин! sclerosis.gif У меня ж нету Тулсета... swoon.gif Но солью все равно biggrin.gif

Автор: Shad Oct 19 2004, 00:36

QUOTE (Aiwan @ Oct 17 2004, 08:22)
Shad  щас, гляну  yes.gif 
Ой блин! sclerosis.gif У меня ж нету Тулсета...  swoon.gif  Но солью все равно  biggrin.gif

Напиши, как оно. Интересно... rolleyes.gif

Автор: Черный Ярл Oct 19 2004, 01:40

Мир вам!

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

Автор: baskan Oct 23 2004, 14:37

Ай нид хелп..
Вот скрипт и тут есть фича с регистрацией аккаунта на шарде..так вот как ее отсечь без вреда скрипту?(ка я понял там еще есть некоторые действия)

CODE
void main()
{
PGSModuleClientEnterEvent (GetEnteringObject());
object oPC = GetEnteringObject();
object oEmote = GetItemPossessedBy(oPC, ITEM_TYPE_EMOTEWAND);
object oDMring = GetItemPossessedBy(oPC, "dmfi_onering");
object oObject = GetItemPossessedBy(oPC, sSTR_013);
object pl;
string sName = GetPCPlayerName(oPC);
string sFName = GetName(oPC);
string sDMName = GetPCPlayerName(oPC);
string sKey = GetCampaignString(SECURITY, sName);
string sPL1 = GetCampaignString(SECURITY, sName+"player1");
string sPL2 = GetCampaignString(SECURITY, sName+"player2");
string sPL3 = GetCampaignString(SECURITY, sName+"player3");
int iAlignment = GetAlignmentGoodEvil(oPC);
int a;
int b;
int d;
int iDHP;
int iMHP = GetMaxHitPoints(oPC);
int nomer=StringToInt(GetDeity(oPC));
int prenomer=0;
if (GetIsPC(oPC) && !GetIsDM(oPC))
{
 SetPlotFlag(oPC, FALSE);
 SendMessageToPC(oPC, sSTR_005);
 //
 if (sPL1==sFName) {prenomer=1;}
 else if (sPL2==sFName) {prenomer=2;}
 else if (sPL3==sFName) {prenomer=3;};
 //
 if ((nomer==0)&&(prenomer!=0)&&(GetCampaignString(CHAR_DATA,sName+"player"+IntToString(prenomer)+"VISIT")==""))
 {
 SetCampaignString(CHAR_DATA,sName+"player"+IntToString(prenomer)+"VISIT","TRUE");
 SetDeity(oPC,IntToString(prenomer));
 nomer=prenomer;
 a=0;
 for (d = 1; d <=GetCampaignInt("player_list","count"); d++)
 {
 if (a==1) continue;
 if (GetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")))!=sName){}
 else {a=1;};
 };

 if (a!=1)
 {
 SetCampaignInt("player_list","count",(GetCampaignInt("player_list","count")+1));
 SetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")),sName);
 };
 };
 //
 if ( (GetPCPublicCDKey(oPC) == sKey)&&(nomer==prenomer)&&(nomer!=0))
 {
  if (oEmote == OBJECT_INVALID) CreateItemOnObject(ITEM_TYPE_EMOTEWAND, oPC, 1);

   switch (iAlignment)
   {
   case ALIGNMENT_GOOD:
   if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 1) SetCampaignInt(GOOD_EVIL,sFName+sName,1);
   break;
   case ALIGNMENT_EVIL:
   if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 2) SetCampaignInt(GOOD_EVIL,sFName+sName,2);
   break;
   default:
   if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 3) SetCampaignInt(GOOD_EVIL,sFName+sName,3);
   break;
   }


   pl = GetFirstPC();
   b = GetCampaignInt(GOOD_EVIL,sFName+sName);
   while ( pl != OBJECT_INVALID)
   {
   if ((!GetIsDM(pl))&&(pl!=oPC))
   {
   a = GetCampaignInt(GOOD_EVIL,GetName(pl)+GetPCPlayerName(pl));
   if ((a!=b)&&(a!=2)&&(b!=2)) ActionDoCommand(SetPCDislike(oPC,pl));
   };
   pl=GetNextPC();
   }
  //ExecuteScript ("ats_client_enter",oPC);

 SetLocalString(oPC,"acc",GetPCPlayerName(oPC));

 int iHP = StringToInt(GetCampaignString(CHAR_DATA,GetPCPlayerName(oPC)+"player"+IntToString(nomer)+"HP"));
 if (iHP != 0)
 {
 if (iHP<iMHP){iDHP=iMHP-iHP;ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDHP), oPC);}
 else if (iHP>iMHP) {iDHP=iHP-iMHP; ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectTemporaryHitpoints(iDHP), oPC,30.0);}
 };

 if (GetIsDead(oPC))
 {
 SetLocalInt(oPC,"autokill",1);
 location lLoc = GetCampaignLocation("bd_locations",sFName+sName);
 AssignCommand(oPC,ActionJumpToLocation(lLoc));
 };

 /*Vnesenie akkauntov v spisok player_list
 a=0;
 for (d = 1; d <=GetCampaignInt("player_list","count"); d++)
 {
 if (a==1) continue;
 if (GetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")))!=sName){}
 else {a=1;};
 };

 if (a!=1)
 {
 SetCampaignInt("player_list","count",(GetCampaignInt("player_list","count")+1));
 SetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")),sName);
 };
 */

 }
 else{BootPC(oPC); SetLocalInt(oPC,"bootexit",1);}
}
else if (GetIsDM(oPC))
 {
  if (GetCampaignString(DM_VAULT, sDMName) == GetPCPublicCDKey(oPC))
  {
   SendMessageToPC(oPC, sSTR_038);
   if (oDMring == OBJECT_INVALID) { CreateItemOnObject("dmfi_onering", oPC, 1); }
  }

  else
  {
  BootPC(oPC);
  PrintString("Someone with IP: " + GetPCIPAddress(oPC) + " tryed to enter as a DM '" + GetPCPlayerName(oPC) + "'!");
  }
 }
}

Автор: DBColl Oct 23 2004, 15:01

Черный Ярл

QUOTE (Черный Ярл @ Oct 19 2004, 01:40)
Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры. Вообще это реализуемо? Если да, то как?

Мне кажется, что это нельзя отследить... Хотя... есть идейка хитренькая...
У моба надо скрипт на OnDamage вешать. При каждом полученном неписем повреждении скрипт на нем анализирует максимальный "некритический" удар damager'а. Сравнивает с полученным повреждением и если оно больше, чем максимальный "некритический" удар, значит это КРИТ. Запускаем кастом функцию. drag.gif

Автор: Aiwan Oct 23 2004, 18:10

Shad я посмотрел твой модуль. МОЛОДЕЦ! good.gif
Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю crazy.gif Но то что видел у тебя мне понравилось!

Автор: Shad Oct 25 2004, 04:06

QUOTE (Aiwan @ Oct 23 2004, 18:10)
Shad  я посмотрел твой модуль. МОЛОДЕЦ!  good.gif
Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю  crazy.gif  Но то что видел у тебя мне понравилось!

Спасибо, Aiwan. yes.gif Значит я не зря старался. biggrin.gif Осталость применение найти.
П.С. Можно удалять посты о модуле, дабы тему не зафлуживать.

Автор: Aiwan Oct 25 2004, 10:01

Все нормально. Если уж наши слова спам, то я Испанский Летчик pilot.gif
Может ты бы оформил свой модуль как ссылку и в тему полезных ссылок поставил?

Автор: baskan Oct 25 2004, 17:52

Вопросик..

В каком модульном свойстве стоит система лута? unsure.gif

Автор: DBColl Oct 25 2004, 18:35

Лут не в модульных свойствах. Он в OnDeath крича.

Автор: baskan Oct 25 2004, 21:19

QUOTE (DBColl @ Oct 25 2004, 18:35)
Лут не в модульных свойствах. Он в OnDeath крича.

Ясно..Спасибо yahoo.gif

Автор: Тобур Oct 25 2004, 23:38

Не подскажут ли мастера тулсета: Как сделать цикл перебора всех карт в модуле? Что-то я рылся в функция, рылся - ничего не нашел. Вся беда в том, что невозможно присваивать свою величину перепенной типа object sad.gif

Автор: Aiwan Oct 26 2004, 00:04

А нельзя циклом прогнать объекты, и определить их тип как area?

Автор: Shad Oct 26 2004, 01:19

Тобур Если можно достучатся до файлов на диске, ResRef-ы карт в файле module.ifo хранятся подряд, возможно это можно использовать.
Можно использовать объекты со специфическим тегом ("sequence_xx") и пробегать по ним.

Автор: DBColl Oct 26 2004, 03:34

Shad
До ерф-файлов и module.ifo из игры не достучаться.

QUOTE (Тобур @ Oct 25 2004, 23:38)
Вся беда в том, что невозможно присваивать свою величину перепенной типа object

??? Это что значит нельзя?! Кто сказал такую чушь? SetLocalObject(...) нельзя делать??? Или я не понял?.. this.gif unsure.gif
QUOTE (Aiwan @ Oct 26 2004, 00:04)
А нельзя циклом прогнать объекты, и определить их тип как area?

Это будет слишком долго (если модуль довольно объемный)... Вообще имхо ЛУЧШИЙ вариант - поставить в КАЖДОЙ локе вейп с одинаковым тэгом, допустим "WP_ID_AREA". Потом просто циклом перебираем:
Neverwinter Script Source
object oWP, oArea;
while (GetIsObjectValid(oWP = GetObjectByTag("WP_ID_AREA", n)))
{
    oArea = GetArea(oWP);
    ....//здесь делаешь с локой то, что тебе надо от перебора
    n++;
}

Автор: Тобур Oct 26 2004, 07:41

QUOTE (DBColl @ Oct 26 2004, 03:34)
??? Это что значит нельзя?! Кто сказал такую чушь? SetLocalObject(...) нельзя делать??? Или я не понял?.. this.gif  unsure.gif

Эхх , если бы все было так просто sad.gif
скриптик
object oMod = GetModule();
int i = 1;
SetLocalObject(oMod,"CurMap",i);
компилируется с ошибкой ERROR: DECLARATION DOES NOT MATCH PARAMETERS, хотя в Лексиконе ясно сказано "object - An integer that represents a particular object in the world (essentially a pointer to a real object)".

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

Через ресрефы тоже плохо - они все разные, через расставленные вэйпоинты - тоже: их надо расставлять.

Объясню для чего мне нужен цикл по картам: дело в том, что на Сиале при сохранении положения персонажа, запоминается тэг локации. Если тэг одинаковый у двух карт, то с восстановлением положения могут быть проблемы. Так как карт у нас около 470, просматривать в тулсете тэг очень долго и муторно. Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение.

Автор: DBColl Oct 26 2004, 09:30

QUOTE (Тобур @ Oct 26 2004, 07:41)
Объясню для чего мне нужен цикл по картам: дело в том, что на Сиале при сохранении положения персонажа, запоминается тэг локации. Если тэг одинаковый у двух карт, то с восстановлением положения могут быть проблемы.

Хех, так в чем проблема запоминать НЕ ТЭГ ЛОКИ, а ЕЕ ОБЪЕКТ?! Уникально. Независимо от тэга?.. Возвращение перса опять-таки делать не по тэгу локи, а по ее объекту...
Добавлено в [mergetime]1098772792[/mergetime]
К тому же, обрати внимание на функцию ObjectToString(object oObj); wink.gif yes.gif

Автор: Baal Oct 26 2004, 10:51

QUOTE (Тобур @ Oct 26 2004, 04:41)

object oMod = GetModule();
int i = 1;
SetLocalObject(oMod,"CurMap",i);

Это мне вобще непонятно wacko.gif Как это объекту можно присвоить числовое значение? swoon.gif

Автор: Тобур Oct 26 2004, 18:49

QUOTE (DBColl @ Oct 26 2004, 09:30)
Хех, так в чем проблема запоминать НЕ ТЭГ ЛОКИ, а ЕЕ ОБЪЕКТ?! Уникально. Независимо от тэга?.. Возвращение перса опять-таки делать не по тэгу локи, а по ее объекту...
<small>Добавлено в [mergetime]1098772792[/mergetime]</small>
К тому же, обрати внимание на функцию ObjectToString(object oObj); wink.gif yes.gif

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

QUOTE
QUOTE (Тобур @ Oct 26 2004, 04:41)

object oMod = GetModule();
int i = 1;
SetLocalObject(oMod,"CurMap",i);


Это мне вобще непонятно  Как это объекту можно присвоить числовое значение? 


Я же специально привел ссылку из лексикона - object содержит в себе натуральное число (иначе говоря просто номер объекта). Весь вопрос в том и состоит - как переменной типа object присвоить этот самый номер.

Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту.

Короче, я понял, что тут никто толкового сказать не может sad.gif

Автор: DBColl Oct 27 2004, 00:19

QUOTE (Тобур @ Oct 26 2004, 18:49)
Короче, я понял, что тут никто толкового сказать не может

Спасибо за твою благодарность в сторону наших попыток помочь. Либо ты слишком умный, либо слишком много у нас времени и главное ДАННЫХ, которые ты представил в своей задаче... dntknw.gif this.gif Но так, как ты говоришь и высказываешь мнение о пытающихся помочь - не делается. Здесь, на форуме ВРГ, никто никому ничего не должен, а потерпеть и выудить решение все равно можно. Увы, твое терпение коротко...
QUOTE (Тобур @ Oct 26 2004, 18:49)
Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту.

Мне не нравится немного, что ты "еще раз повторяешь: НЕТУ РЕШЕНИЯ! ЧТО ВЫ МУЧАЕТЕСЬ?". Как будто, задавая вопрос и отвечая сам же на него потом нам, ты говоришь: НУ ВЫ И... КАК ВЫ МОГЛИ ПОДУМАТЬ ТОЛЬКО, ЧТО Я ТАКОГО НЕ ПРОБОВАЛ ДЕЛАТЬ?..
QUOTE (Тобур @ Oct 26 2004, 18:49)
Потому что при добавлении новой карты все индексы перестраиваются и со сменой версии модуля игрок может оказаться или не там, где выходил или вообще в стартовой локации.

Вообще-то индексы не перестраиваются. Они дописываются к последнему элементу.
QUOTE (Тобур @ Oct 26 2004, 18:49)
Главный мой вопрос - как присвоить переменной типа Object какое то значение, не не пользуясь ссылкой.

Ты бы лучше ПОДРОБНО объяснил задачу, а не задавал вопрос, ОТРИЦАТЕЛЬНЫЙ ответ на который, ты сам заранее уже знаешь и ждешь чтобы тебе его просто подтвердили.

Не спеши с выводами, а потерпи и решение придет. wink.gif

Я понял, тебе надо будет пробегать таким циклом по поиску лок лишь ОДИН раз, на старте модуля? Или я опять не догнал?

Автор: Shad Oct 27 2004, 00:34

QUOTE (Тобур @ Oct 26 2004, 07:41)
Через ресрефы тоже плохо - они все разные

Можно сохранять ResRef для подтверждения правильности локации.
Но если пройти по модулю нужно один раз за версию - вопрос перешел в разряд теретических. Ведь какой-никакой метод, ты говришь, уже нашел.

Автор: DBColl Oct 27 2004, 00:46

QUOTE (Тобур @ Oct 26 2004, 07:41)
Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение.

Шо цэ есть, ЗАДВОЕНИЕ? unsure.gif
Добавлено в [mergetime]1098827906[/mergetime]
QUOTE (Shad @ Oct 27 2004, 00:34)
Можно сохранять ResRef для подтверждения правильности локации.

Вот-вот. Отлично Shad! yes.gif good.gif

Автор: Тобур Oct 27 2004, 07:52

Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН.
Решение я нашел такое: Я сохраняю в БД какую-то локацию, потом каким-то внешним редактором (в моем случае FoxPro) правлю DBF файл и соэдаю в нем 64000 записи с последовательно увеличивающимся индексом и названием переменной (В моем случае MAP1 , 2 и т.д.), в которой присутствует индекс. Затем в скрипте загрузки модуля вставляю следующий текст:

void CheckAreaTag()
{
object oMod = GetModule();
int iCur = GetLocalInt(oMod,"CurCount");
if (iCur < 64000)
{
WriteTimestampedLogEntry(" ~ Continue ~ "+IntToString(iCur));
int iBegin = iCur;
iCur = iCur +2000;
SetLocalInt(oMod,"CurCount",iCur);
object oArea;
object oTemp;
location lLoc;
string sVarName;
int i;
for (i = iBegin; i < iCur; i++)
{
sVarName = "MAP"+IntToString(i);
lLoc = GetCampaignLocation("TEST",sVarName);
oArea = GetAreaFromLocation(lLoc);
if (GetIsAreaNatural(oArea)!=AREA_INVALID)
WriteTimestampedLogEntry(sVarName + " id "+IntToString(i)+" ; "+"object "+ObjectToString(oArea)+" ; "+GetTag(oArea)+" ; "+GetName(oArea)+" ; "+GetResRef(oArea));
}
DelayCommand(2.0f, CheckAreaTag());

}
else
WriteTimestampedLogEntry(" ~ End ~ "+ IntToString(iCur));

}
void main()
{
WriteTimestampedLogEntry(" ~ Begin check area tag ~ ");
CheckAreaTag();
}

Получившийся текстовый лог-файл открываю в Exсel-e и сохраняю как таблицу (поля я специально разделяю знаком ; , так как Exсel понимает этот знак как разделитель. Дальше уже в Exсel-e можно сортировать , фильтровать и анализировать записи. Таким же образом можно получить сводную информацию обо всех объектах, находящихся на картах в модуле (не в палитре), например о НПС и плэйсэйблах

Автор: Aiwan Oct 27 2004, 09:41

Тобур даже я вчера до двух ночи голову ломал. wink.gif Зря ты так drag.gif

QUOTE (Тобур @ Oct 27 2004, 10:52)
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН.

Все ок! wink.gif ТО что ты сейчас сказал настолько важно, к примеру для меня crazy.gif Ты даже не представляешь yes.gif Заходи к нам почаще! drag.gif Все плохое забыли good.gif И молодец, что победил проблему. Кинь ее в базу скриптов, очень людям поможешь.

Автор: DBColl Oct 27 2004, 17:53

Тобур
Все ок wink.gif. Ты - взрослый человек. good.gif

По делу... А дальше что? Ну есть у тебя экселевский файл. И что с ним делать дальше? Я думал тебе данные нужны для обратного использования потом в скрипте... unsure.gif

Автор: Тобур Oct 27 2004, 19:28

Изначально моя цель была найти карты, у которых совпадают тэги. Для этого мне надо было получить список тэгов всех карт в модуле - я его получил, хоть и извращенным способом. После этого достаточно отсортировать в экселе таблицу по полю тэга и пробежаться взглядом по ней, чтобы найти задвоенность (дубляж) тэга. Я нашел в 470 картах 4 дубляжа - это тот результат, который я и хотел получить smile.gif

Автор: aleVandal Oct 27 2004, 19:40

Менее извратный способ - создать 2дашку и забивать в нее таги(или ресрефы) локаций. Всего то делов остается - пробежать все строчки одного столбца( с тагами карт ) crazy.gif

Автор: Shad Oct 28 2004, 01:07

Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт.

Автор: DBColl Oct 28 2004, 12:28

QUOTE (Shad @ Oct 28 2004, 01:07)
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт.

А следуя из этого, программульку-анализатор на Сях или Дельфях написать - как 2 пальца... wink.gif

Автор: altrush Oct 30 2004, 12:42

Вопрос. Как убрать ВСЕ из инвентаря (нет ли функции соответствующей, аль чето такого)? umnik.gif

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)