Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Ilerien
1) Во-первых, джамп в НВНе переносит объект, вызвавший функцию (ты пытаешься перенести триггер). Во-вторых, он сделан криво, перед джампом обязательно вызывать ClearAllActions(TRUE) для нужного объекта. Т. е. в этом случае:
Neverwinter Script
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, JumpToObject(GetWaypointByTag("wp_siegers")));
Для непися аналогично.

2) Я полагаю, эти самые "стандартные скрипты хербита" забивают стек экшенов так, что атака выполняется хз когда smile.gif
ReyBrujo
За перенос объекта огромнейшее спасибо=) подействовало. А вот мои чудаки ни в какую не хотят бежать на врага, даже когда в скрипте хертбита ничего кроме атаки нет... тупо стоят, пока я не подойду к ним.

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



Проверил отношения фракций - все в норме..
Ilerien
Цитата
По плану эти осаждающие должны сразу же бежать бить ближайшего врага. А они тупо появляются, и стоят. Хотя они являются вражеской к защитникам фракцией.
Посмотреть, что возвращает GetNearest Enemy() и GetCurrentAction().
ReyBrujo
Neverwinter Script
// Gets the nearest enemy. Берет ближайшего врага
object GetNearestEnemy(object oSource=OBJECT_SELF, int nNth = 1)
{
    return GetNearestCreature(CREATURE_TYPE_REPUTATION,
                              REPUTATION_TYPE_ENEMY,
                              oSource, nNth);
}


Neverwinter Script
// Get the current action (ACTION_*) that oObject is executing. Берет текущее действие которое исполнЯет объект.
int GetCurrentAction(object oObject=OBJECT_SELF)


Всё! У меня получилось!
Вот на что я изменил хертбит:
#include "nw_i0_generic"
#include "inc_nearest"

Neverwinter Script
void main()
{
    if(GetCurrentAction() != ACTION_ATTACKOBJECT)
    {
    ClearAllActions();
    ActionAttack(GetNearestEnemy());
    }
}


После пессив мода они поползли=)
Ilerien
Цитата
Посмотреть, что возвращает GetNearest Enemy() и GetCurrentAction().
smile.gif Имелось в виду выполнить скрипт:
Neverwinter Script
object oSelf = OBJECT_SELF;
AssignCommand(GetModule(), SpeakString("Action: " + IntToString(GetCurrentAction(oSelf)), TALKVOLUME_SHOUT));
AssignCommand(GetModule(), SpeakString("Nearest enemy: " + GetName(GetNearestEnemy(oSelf)), TALKVOLUME_SHOUT));
Цитата
После пессив мода они поползли=)
Ну значит мое первое предположение в широком смысле верно - что-то забивает стек экшенов.
Rommantic
Доброго времени суток. Боюсь показаться тупым юзером, но у меня не работает встроенный в редактор скрипт "дать награду" что-либо. Не выдаёт ни денег, ни опыта ни вещей. Что у меня неверно? Вот так на данный момент выглядит скрипт:

//::///////////////////////////////////////////////
//:: FileName at_003
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 11.06.2010 17:34:41
//:://////////////////////////////////////////////
void main()
{
// Äàòü ãîâîðÿùåìó îïûò
GiveXPToCreature(GetPCSpeaker(), 10);

}

Вместо абракадабры, соответственно " Дать говорящему опыт"
Lex
маленькая буква "я" в скрипте - древнейшая проблема, о упоминание о которой есть в куче тем.
Убирай русский коммент или, что гораздо лучше, ставь патч Думбо
Rommantic
Благодарю. Страниц море всё читать - никакого времени не хватит ) Честно пролистал первые две страницы этого раздела, не нашёл )

Пойду разбираться с патчем: как и куда втыкать ) Более чем уверен, что будут ещё вопросы, так что моралььно готовьтесь: я тот ещё чайник )) crazy.gif
Aiwan
Rommantic, есть еще версия для печати и поиск по странице. Плюс, есть скрипты для новичков там всяко разно есть то что ищется. Например, Вот тут.

Neverwinter Script
//:://////////////////////////////////////////////
//:: Даем партии ХР
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 18.09.2005
//:://////////////////////////////////////////////
#include "nw_i0_tool"

void main()
{
    RewardPartyXP(150, GetPCSpeaker());
}
Rommantic
Вот,кстати, сразу и вопрос. Если мне нужно написать скрипт оценки наличия определённого количества золота у игрока, где пивать количество золота? Пока что выглядит оно вот так:
Neverwinter Script
//::///////////////////////////////////////////////
//:: FileName sc_002
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 12.06.2010 8:44:20
//:://////////////////////////////////////////////
#include "nw_i0_tool"

int StartingConditional()
{

    // Удостовериться, что в снаряжении персонажа игрока имеются данные предметы
    if(!HasItem (GetPCSpeaker(), "NW_IT_GOLD001") )
        return FALSE;

    return TRUE;
}


Попытался методом тыка, пока что пришёл к такому варианту (компелирует, но не работает):

Neverwinter Script
//::///////////////////////////////////////////////
//:: FileName sc_002
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 12.06.2010 8:44:20
//:://////////////////////////////////////////////
#include "nw_i0_tool"

int StartingConditional()
{

    // Удостовериться, что в снаряжении персонажа игрока имеются данные предметы
    if(!HasItem (GetPCSpeaker(), "NW_IT_GOLD001 (1000)") )
        return FALSE;

    return TRUE;
}


как правильно? unsure.gif
greye
Есть функция GetGold().
Соответственно:
Neverwinter Script
if (GetGold(GetPCSpeaker()) < 1000) {
    return FALSE;
}
return TRUE;
likkil
Доброго времени суток
У меня такой вопросик : вот у меня есть модуль старой версии 1.6 , а так охота в нём покататся на лошадях какие команды мне использовать в скрипте чтоб это было возможно
Aiwan
Цитата(likkil @ Jun 13 2010, 00:22) *
а так охота в нём покататся на лошадях какие команды мне использовать в скрипте чтоб это было возможно

Команда - НО!!! Трогай! - двигаться вперед.
Команда - ТРРРРР! - остановка.
Laajin
likkil
это долгая история
во первых что за модуль...кастомный иль не кастомный - вопрос непонятен
во вторых лошадки появляются только после патча 1.69
до него жалкие попытки покататься на лошадках выливались в тяжелые хаки и муторные системы скриптов.
denis0k
В 1.69 по сути те же хаки (просто включены в ресурсы игры) и те же муторные системы скриптов. Ничего конкретно нативного в коняшках нет - всё тот же геморрой с кастомными анимациями и подменой аппиаранса. Изврат в общем.
wirTUS
Здравствуйте. У меня не работает (или постоянно удаётся, даже при минусовых значениях навыка) проверка убеждения для появления реплики, соотв. фраза всегда доступна в диалоге. Где косяк?
Neverwinter Script
#include "nw_i0_tool"

int StartingConditional()
{
    if(!GetHasSkill(SKILL_PERSUADE, GetPCSpeaker()))
    if(!(AutoDC(DC_MEDIUM, SKILL_PERSUADE, GetPCSpeaker())))
        return FALSE;;

    return TRUE;;
}


А так же http://www.city-of-masters.ru/forums/index...0&start=200 последний пост (18.06.2010)
Aiwan
Попробуй как-то так.
Neverwinter Script
#include "nw_i0_tool"

int StartingConditional()
{
    if(!GetHasSkill(SKILL_PERSUADE, GetPCSpeaker()) || !AutoDC(DC_MEDIUM, SKILL_PERSUADE, GetPCSpeaker()))
        return FALSE;
    return TRUE;
}


У тебя ошибка, во первых две пары дочки тире, во вторых после IF ставится скобка и в скобке выполняется условие. Если скобки не ставить (как у тебя) то будет выполнено только самое первое и одно условие. Твой скрипт можно было записать и так:
Neverwinter Script
#include "nw_i0_tool"

int StartingConditional()
{
    if(!GetHasSkill(SKILL_PERSUADE, GetPCSpeaker()))
        return FALSE;
    if(!AutoDC(DC_MEDIUM, SKILL_PERSUADE, GetPCSpeaker()))
        return FALSE;
    return TRUE;
}
wirTUS
спс заработало yahoo.gif а как проверить отсутствие навыка (фраза а-ля "я нуб, я не качал убеждение, блеф и запугивание и у меня нет денег. Я должен умереть!)
gennady
Как раз первая проверка в скрипте и есть проверка навыка убедить... А вот дальше идет бросок, записанный в инклюде. Я же пользуюсь своими скриптами проверки необходимого навыка на убеждение + строка в отчете, что там как прошло:
Neverwinter Script
//::///////////////////////////////////////////////
//:: Проверка навыка "УБЕДИТЬ" сложность НОРМАЛЬНО.
//:://////////////////////////////////////////////
int StartingConditional()
{
object oPC = GetPCSpeaker();
int nSkillZ = GetSkillRank(SKILL_PERSUADE, oPC);
int nDC = 2 + d3();

  if(nSkillZ > nDC)
    {
    SendMessageToPC(oPC, "<c у >Убедить</c><c °у> Бросок : "+IntToString(nSkillZ)+" против "+IntToString(nDC)+" </c><c у >УДАЧА</c>");
    return TRUE;
    }
    SendMessageToPC(oPC, "<c у >Убедить</c><c °у> Бросок : "+IntToString(nSkillZ)+" против "+IntToString(nDC)+" </c><cу  >ПРОВАЛ</c>");
    return FALSE;
}
wirTUS
Ещё один глупый вопрос:

есть скрипт (подгон под себя первого скрипта выложенного Aiwan в разделе "Скрипты для новичков") с попыткой перед дестроем из инвентаря сложить всё в сундук



Neverwinter Script
void main()
{
    object oChest = GetObjectByTag("piratechest");
    object oPC = GetEnteringObject(); // Того кто вошел
    object oArmor = GetObjectByTag("item112");

//-----------------В сундук---------------------
        object oItem = GetFirstItemInInventory(oPC); // Первый итем в инвентаре
        while(GetIsObjectValid(oItem)) // Пока такой объект существует
        {
            ActionGiveItem(oItem, oChest);
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC); // Берем другой объект...
        }

//------------------ Убиваем весь инвентарь ------------------------------------
        while(GetIsObjectValid(oItem)) // Пока такой объект существует
        {
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(oPC); // Берем другой объект...
        }

    int i=0;
        while(i<14) // ПОКА i меньше 14. 14 - это количество всех слот у объекта
        {
        ActionGiveItem(GetItemInSlot(i, oPC), oChest);
        i++;
        ActionGiveItem(GetItemInSlot(i, oPC), oChest);
        }

//------------------ Убиваем всю амуницию -------------------------------------
        while(i<14) // ПОКА i меньше 14. 14 - это количество всех слот у объекта
        {
        DestroyObject(GetItemInSlot(i, oPC));
        i++;
        DestroyObject(GetItemInSlot(i, oPC));
        }
        // Было ноль к примеру, станет 1 и т.д.

//  -------------------одёжка-------------------------
        CreateItemOnObject("item112", oPC, 1);
        AssignCommand(oPC, ActionEquipItem(oArmor, INVENTORY_SLOT_CHEST));
}


Проблемы:
1) В сундук ничего не попадает
2) Уничтожаются только неодетые вещи
3) Следует из проблемы 2) - одёжка не одевается (но появляется в инве)

На всякий случай:
1) Скрипт стоит на onenter локации
2) Проверки на повторность захода в локацию etc нету т.к. предусмотрено только одиночное её посещение и модуль планируется сингловый
3)"item112" и тэг и ресреф вещи
4) item 112 ничего не требует для ношения
5) на onclientrun модуля стоит скрипт схожего действия (при надобности запосчу) (он работает) вышеуказанный скрипт не работает и с и без включённого модулестартоовского
greye
Во-первых, ты уничтожаешь вещи при переносе. Логично, что после этого ты ничего не найдёшь в сундуке. Во-вторых, я не особо помню, но ActionGiveItem вроде бы работает только от лица владельцев предмета, т.е. надо либо вешать скрипт на игрока, либо делать AssignCommand.
ReyBrujo
А еще можно использовать CreateItemOnObject вместо ActionGiveItem.
wirTUS
Спасибо, но ни то ни другое не работает (при убирании дестроя он оставляет всё как было, только новую шмотку дает, ни с ассигнкомманд (экшнгивайтем(...)) ни с крейтайтемонобжект сундук пустует sad.gif
Ilerien
Neverwinter Script
void main()
{
    object oChest = GetObjectByTag("piratechest");
    object oPC = GetEnteringObject();
    object oArmor = GetObjectByTag("item112"); //первая ошибка - таким способом можно получить только уже существующий в игре объект, если планируется создавать итем, то так делать нельзя


        object oItem = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItem))
        {
            ActionGiveItem(oItem, oChest); //любой экшен выполняется от лица вызвавшего команду объекта - нужно использовать AssignCommand
            DestroyObject(oItem); //что самое интересное, уничтожается _тот же самый_ итем, который хотим положить в сундук
            oItem = GetNextItemInInventory(oPC);
        }

        //этот блок вообще не нужен - все итемы в инвентаре уже помечены на удаление
        while(GetIsObjectValid(oItem))
        {
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(oPC);
        }

    int i=0;
        while(i<14)
        {
        ActionGiveItem(GetItemInSlot(i, oPC), oChest); //опять AssignCommand
        i++;
        ActionGiveItem(GetItemInSlot(i, oPC), oChest); //зачем дублировать-то?
        }

        while(i<14)
        {
        DestroyObject(GetItemInSlot(i, oPC));
        i++;
        DestroyObject(GetItemInSlot(i, oPC)); //тоже зачем-то дублируется команда
        }


        CreateItemOnObject("item112", oPC, 1);
        AssignCommand(oPC, ActionEquipItem(oArmor, INVENTORY_SLOT_CHEST)); //ага, и пытаемся надеть что угодно, только не созданную предыдущей командой одежду
}

Правильно будет так:
Neverwinter Script
void main()
{
    object oChest = GetObjectByTag("piratechest");
    object oPC = GetEnteringObject();
   
    object oNewItem;
    object oItem = GetFirstItemInInventory(oPC);
    while(GetIsObjectValid(oItem))
    {
            if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX)
            {
                oNewItem = CopyItem(oItem, oChest, TRUE); //копируем итем в сундук
                SetDescription(oNewItem, GetDescription(oItem));          
            }
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC);
    }
   
    int i;
    for(i = INVENTORY_SLOT_HEAD; i <= INVENTORY_SLOT_BOLTS; i++)
    {
        oItem = GetItemInSlot(i, oPC);
        oNewItem = CopyItem(oItem, oChest, TRUE);
        SetDescription(oNewItem, GetDescription(oItem));
        DestroyObject(oItem);
    }

    AssignCommand(oPC, ClearAllActions(TRUE)); //чистка стека
    oItem = CreateItemOnObject("item112", oPC);
    AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));

Если ящики так уж критично копировать, в чём я сильно сомневаюсь, то код будет таким:
Neverwinter Script
...
    while(GetIsObjectValid(oItem))
    {
            if(GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
                AssignCommand(oPC, ActionGiveItem(oItem, oChest)); //не знаю, как себя поведет передача полного ящика в таком скрипте - надо тестить
            else
            {
                oNewItem = CopyItem(oItem, oChest, TRUE); //копируем итем в сундук
                SetDescription(oNewItem, GetDescription(oItem));    
                DestroyObject(oItem);     
            }
           
            oItem = GetNextItemInInventory(oPC);
    }
Соответственно, AssignCommand(oPC, ClearAllActions(TRUE)); переедет в начало скрипта.
gennady
Я уже когда-то выкладывал скрипт переноса вещей в ящик. Вот ссылка на пост: http://www.city-of-masters.ru/forums/index...;p=122407&#

В принципе Ilerien, контейнеры, т.е. волшебные сумки нужно переносить оператором ActionGiveItem. Переходят со всем содержимым и в том же раскладе в них вещей. Можно обойтись и этой одной функцией для переноса всех шмоток... Но есть одно НО. Не тестил для НПС, а вот для плейсов теряется переносимый инвентарь. Видно по причине превышения акций...

Поэтому нужно сперва перебрать инвентарь и перенести сумки. Затем скопировать остальной шмот. Да и про золото не стоит забывать, т.к. передать плейсу мы можем не более 50.000 злотых...
Neverwinter Script
// Take nAmount of gold from oCreatureToTakeFrom.
// - nAmount
// - oCreatureToTakeFrom: If this is not a valid creature, nothing will happen.
// - bDestroy: If this is TRUE, the caller will not get the gold.  Instead, the
//  gold will be destroyed and will vanish from the game.
void TakeGoldFromCreature(int nAmount, object oCreatureToTakeFrom, int bDestroy=FALSE)
wirTUS
Большое спасибо благодаря вам всё заработало yahoo.gif yahoo.gif yahoo.gif
bern
Всем доброго дня!
Не нашел нигде одного очень важного для меня скрипта. Тыкните меня пожалуйста носом если где-то на форуме уже обсуждался данный вопрос.

Я хочу сделать небольшой но продуманный мирок по подобию первой Готики. И я хочу сделать чтобы каждый непись имел свой распорядок дня. Для этого мне нужен универсальный шаблон-заготовка.

Например:
9.00 - непись встает(не обязательно с анимацией, достаточно чтобы просто появился возле кровати), потом с вероятностью 50\50 или умывается или ест за столом
9.30 - одевается(меняет одёжку в слоте брони) и идет работать в поле\ идет к лавочке поговорить с соседом и т.д.

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

Думаю и другим модостроителям это пригодится, прошу профи тулсета помочь мне.
Lex
Анимация НПС, часть 1
Анимация НПС, часть 2
+ файл с демонстрационным модулем
Более подробно эту задачу никто не освещал.

но там описана идеальная ситуация (игрок находится на той же локации, что и НПС, НПС не перемещается между локациями). Когда дело доходит до реализации в модуле, то все более сложно и грустно. В итоге система немного более сложная чем описана в статье, но эти изменения можно и самому проделать, в принципе (проверки наличия игрока, телепорты кое-где и тд)
bern
Lex, спасибо! В той статье есть все что мне может понадобится. Пока буду изучать и пробовать. Но еще у меня такой вопрос: можно так сделать чтобы нпс выполняли свой распорядок вне зависимости есть ли игрок в локации? А то заходит главный герой посреди ночи в дом (например чтобы ограбить его) а хозяин вдруг спохватывается из-за стола и бежит в постель быстренько спать, не замечая грабителя, так как должен был лечь 4 часа назад declare.gif
Lex
я именно об этих усложнениях говорил, когда сказал что условия, рассматриваемые в статье идеальные.
Конечно скрипты выполняются пока игрок не на локации. Но гораздо медленнее. И вообще говоря этим баловаться не следует - будут заметные тормоза. Чтобы реализовать описанную тобой ситуацию, надо имхо скриптовать отдельно вход игрока в дом (те на вход игрока НПСу в локе задаются нужные параметры, которые определяются временем и чем там тебе еще надо + производятся нужные действия с НПС - он куда надо телепортируется, запускается анимация и тд).
Если таких мест будет много.. ну сам понимаешь. Другого приличного варианта, чтобы не тормозило, я не нашел. Да и этот не сказать что простой - требует усидчивости и внимания.

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

Каждый сам решает какой уровень детализации ему нужен и что он готов за это заплатить. Но готовых решений круче тех, что я в той статье описал, тебе врядли кто даст. Просто потому что их скорее всего никто и не делал. Я видел пару систем на волте.. но в них реально многовато дыр, требуется серьезная доработка, а по функционалу и удобству они ничем не лучше моего варианта.
bern
Спасибо за столь доходчивый ответ good.gif Теперь все стало понятно. Буду мудровать теперь как все закрутить наиболее реалистично и чтобы не сидеть часами за доработкой деталей которые игрок может даже не заметить. Наверно нужно делать только самые основные анимации, как вы советовали, необходимые по сюжету и которые игрок просто обязан заметитьsmile.gif. Спасибо за ваши советы!
gennady
Почитай еще вот здесь про скрипты ХБ НПС: http://remmgen.narod.ru/tscript3.html#SC_HB
bern
Очень полезное инфо, благодарю. Я сейчас кстати играю в вашу Рыцарскую Сагу. Интересно и продумано, а наиболее понравилось что в близком русской душе стиле сделано good.gif Извиняюсь за спойлер rolleyes.gif
Iceman157
Подскажите плиз как сделать точку респа нпц и героя. В скрипте я не очень разбираюсь, пробовал копировать респ из другого модуля - не получилось. Буду очень благодарен. (Имеется ввиду чтобы ресался после смерти и бежал по вейпоинтам точка1,точка2 и т.д., а не просто одноразовое появление появление)
Iceman157
С игроком разобрался как делать точку респа, но вот НПЦ не хочет ресаться nea.gif . народ помогите плиз, чтобы НПЦ ресался, вот что у НПЦ на OnDeath.
Neverwinter Script
void main()
{
    object oNPC = GetLastRespawnButtonPresser();
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectRe
surrection(),oNPC);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHe
al(GetMaxHitPoints(oNPC)), oNPC);
    RemoveEffects(oNPC);

    string sDestTag = "WP_Death_Hero";

    int iEnteredCastle = GetLocalInt(GetModule(), "EnteredCastle");

    if (iEnteredCastle == TRUE)
    {
        sDestTag = "WP_Death_Hero2";
    }
    if (GetIsObjectValid(GetObjectByTag(sDestTag)))
    {
        object oSpawnPoint = GetObjectByTag(sDestTag);
        AssignCommand(oNPC,JumpToLocation(GetLocation(oSpa
wnPoint)));
    }
    else
    {
    }
}

Подскажите что не так, или лучше напишите пожалуйста скрипт.
greye
Цитата(Iceman157 @ Aug 24 2010, 16:27) *
object oNPC = GetLastRespawnButtonPresser();

Просто OBJECT_SELF, ибо не нажимают боты на кнопки...
Iceman157
Цитата(greye @ Aug 24 2010, 18:55) *
Просто OBJECT_SELF, ибо не нажимают боты на кнопки...

Хорошо, понятно, но вот что изменять на OBJECT_SELF не понятно..
Talarasha
Там написано, что. В цитате. Скрипт оперирует переменной oNPC, которая ссылается на мертвый объект. Мертвый объект в скрипте отслеживается функцией GetLastRespawnButtonPresser(), которая возвращает последнего персонажа, который щелкнул кнопку воскрешения. Но воскреснуть с помощью кнопки могут только игроки, а не NPC. Поэтому тебе сказали заменить на OBJECT_SELF, объект, который вызвал событие onDeath - он сам.
Вот это:
Neverwinter Script
object oNPC = GetLastRespawnButtonPresser();

Заменить на:
Neverwinter Script
object oNPC = OBJECT_SELF;
Iceman157
Изменил, но теперь нпц не просто не ресается, теперь его нет вообще =\

Цитата(Iceman157 @ Aug 26 2010, 13:30) *
Изменил, но теперь нпц не просто не ресается после смерти, теперь его нет вообще =\

Talarasha
Я вообще удивляюсь, как это у тебя компилируется. В базовой библиотеке нет функции RemoveEffects, а никаких инклюдов не указано. Не говоря уже про условия, вероятно вырванные из оригинального скрипта?
Neverwinter Script
void main()
{
    object oSpawn = GetObjectByTag("WP_SPAWN"); // Тэг точки спавна

    SetIsDestroyable(FALSE,TRUE,FALSE);
    DelayCommand(3.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectR
esurrection(),OBJECT_SELF));
    DelayCommand(3.2,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectH
eal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);
    //DelayCommand(3.2,RemoveEffects(OBJECT_SELF));
    DelayCommand(3.2,JumpToObject(oSpawn));
}

Все сохранить и повесить на onDeath объекта.
Закомментированный DelayCommand раскомментируешь, когда найдешь, откуда берется функция.

Для общего развития:
1)NPC не может быть воскрешен, если ему об этом не сказано с помощью SetIsDestroyable(*,TRUE,*);
2)Когда скрипт висит на onDeath, не нужно использовать AssignCommand, он итак выполняется объектом, вызвавшим событие.
3)Мертвые тела - не переносятся через JumpToObject.
4)В этом скрипте предполагается, что нужно воскрешение именно этого конкретного экземпляра NPC. Если бы мне понадобился респ, я бы сделал его через CopyObject.
Iceman157
Ну RemoveEffects берется из #include "nw_i0_plot" , забыл написать.
А вот твоя строка
Neverwinter Script
DelayCommand(3.2,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectH
eal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);

Выдаёт ошибку. ИМХО не компелируется.
Talarasha
Neverwinter Script
DelayCommand(3.2,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectH
eal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF));

Скобка пропущена.
Полностью тогда будет так:
Neverwinter Script
#include "nw_i0_plot"

void main()
{
    object oSpawn = GetObjectByTag("WP_SPAWN"); // Тэг точки спавна

    SetIsDestroyable(FALSE,TRUE,FALSE);
    DelayCommand(3.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectR
esurrection(),OBJECT_SELF));
    DelayCommand(3.2,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectH
eal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF));
    DelayCommand(3.2,RemoveEffects(OBJECT_SELF));
    DelayCommand(3.2,JumpToObject(oSpawn));
}
Iceman157
Ооооо... хых. Спасибо тебе большое =) Работает.
bern
Добрый вечер, уважаемые модмейкеры и те кто этому учится rolleyes.gif .

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

Магия переменных.

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

1. Встреча каравана на большой дороге.

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

2. Крафтинг, ремесла и навыки.

Изучив за неимоверные испытания навык алхимии у алхимика, игрок получает +1 к переменной навыка "алхимия" yahoo.gif - сразу отображение в соответствующем разделе дневника, созданном зараннее модмейкером. Это открывает возможности к созданию зелий через диалог со столом алхимика rolleyes.gif Очевидно, что все возможные виды зелий нужно прописать в диалоге алхим. стола и поставить ограничения по навыку через переменные. Так и с другими ремеслами и вообще с чем душа пожелает.

3. Лут с монстров.

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

Также за каждое действие в игре игроку можно давать репутацию, звания (убил столько-то монстров, создал столько-то мечей, помог столько-то бабушкам, отнял завтрак у столько-то школьников rolleyes.gif ) Короче, поле для фантазии crazy.gif . От этого будут зависеть различные аспекты игры - отношение различных персонажей, возможность взять в компанию определенных спутников, дающиеся игроку квесты и т.д. Да, это не быстро воплотить в жизнь и местами не так уж и просто, но возможности игры можно расширить значительно. Главная фича - отображение всей инфы в дневнике, используя возможность замены текста в его разделах. Не нужно программировать новые навыки, ремесла и т.д.

Да, возможно это не совсем хорошая услуга для тех людей, кто хочет научиться программировать Невер по настоящему, но это выход для тех кто хочет сделать интересный полифункциональный мод, не располагая большими знаниями программирования. Здесь на форуме есть все необходимые готовые скрипты и ответы по различным манипуляциям с переменными и ветками дневника. Так что можно дерзать и дорогу осилит идущий biggrin.gif

Если модераторы захотят, это можно сделать отдельной темой и туда уже кидать необходимые по ходу скрипты и отвечать на вопросы. Для удобства rolleyes.gif
bern
Скажите, как можно добавить +1 или другое число к переменной, учитывая ее текущее значение, а не устанавливая конкретное значение? И можно ли через скрипт добавить запись в дневник?
Laajin
Neverwinter Script
int nNum = GetLocalInt(.... , ".....");

SetLocalInt(.... , ".....", nNum++);



если нужно определенное число тогда
Neverwinter Script
int nNum = GetLocalInt(.... , ".....");
nNum += 4;
SetLocalInt(.... , ".....", nNum);


На ваулте есть модули переведенные Аваддоном (прошу прощения если не правильно написал имя)по крафтингу, системы банкинга и Гильдинга
Имхо, проще изменить что-то чем писать с 0.
например 1, 2, 3
Talarasha
Цитата
И можно ли через скрипт добавить запись в дневник?

Чем спрашивать на форуме, быстрее и проще вскрыть ту же prelude.mod и посмотреть скрипт на заход.

Neverwinter Script
AddJournalQuestEntry("TAG", #, oPC, TRUE, TRUE);

TAG - тэг журнальной ветки, # - номер записи, oPC - игрок, на которого вешать, можно например GetPCSpeaker() - если в диалоге. Проверка номера ветки делается через локальную переменную:
Neverwinter Script
GetLocalInt(oPC, "NW_JOURNAL_ENTRYTAG")

Нужно только помнить, что имя переменной формируется методом NW_JOURNAL_ENTRY+TAG, т.е. первая часть так и остается, а вместо TAG пишем тэг журнальной ветки.
greye
Цитата(Laajin @ Oct 26 2010, 12:10) *
int nNum = GetLocalInt(.... , ".....");
SetLocalInt(.... , ".....", nNum++);

Постфиксное инкрементирование (var_name++) увеличит содержимое переменной, но вернёт _предыдущее_ значение. Т.е. в данном случае значение локальной переменной не изменится.
Правильно либо
Neverwinter Script
SetLocalInt(<object>, <var_name>, ++nNum);

, либо
Neverwinter Script
SetLocalInt(<object>, <var_name>, nNum + 1);
.
Laajin
сколько занимался нвн то

Neverwinter Script
int nNum;

while(nNum < 10)
{



nNum++;
}


всегда работало
PaiNt
Цитата(Laajin @ Oct 26 2010, 23:19) *
сколько занимался нвн то

Neverwinter Script
int nNum;

while(nNum < 10)
{



nNum++;
}


всегда работало

Я вот поидее сам также пользуюсь но поидее должно работать и так?
Neverwinter Script
int nNum;
while( nNum++ < 10)
{
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.