Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Силриен
Всем привет.
Я только-только начал практиковаться в скриптописании под первый NWN, но продвижения пока не большие.
Сейчас появилось пару вопросов.

1. Хочу реализовать следующую ситуацию:
Главный Герой обыскивает труп и находит ключевой предмет. Предмет он кладет к себе в инвентарь. Как только предмет оказывается в инвентаре, происходит проверка не его наличие. Если TRUE, то генерятся монстры из палитры и расставляются не далеко от Главного Героя. Затем, нападают на него.

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

На форуме я ничего подходящего к сожалению не нашел. Если кому не трудно, напишите пожалуйста такие скрипты и //прокомментируйте для пущей пользы в изучении.
greye
Писать ничего не буду, но:
1) Обрати внимание на модульное событие onAcquireItem и функции GetModuleItemAcquired/GetModuleItemAcquiredBy, GetItemPossessedBy, CreateObject;
2) Событие onUsed, функции GetLastUsedBy, JumpToLocation и иже с нею, EffectDamage, GetCurrentHitPoints, ApplyEffectToObject
Laajin
переносит игрока в точку и уронит, и уронит на колени
на OnUsed
Neverwinter Script
object oPC = GetLastUsedByObject();

AssignCommand(oPC, ClearAllActions());// отменяем все действия
AssignCommand(oPC, JumpToObject(GetObjectByTag("ТЭГ ОБЪЕКТА")) );//кидаем в точку

effect eDamage = EffectDamage(d10());// 1д10 дОмага

DelayCommand(5.0f, ApplyEffectToObject(DURATION_TYPE_INTSTANT, eDamage, oPC));
DelayCommand(5.1f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oPC, 6.0f));
Devstvenik
мастера помогите
делают мод, Колизей. В принципе понятно в чем он заключается, ГГ является рабом которого заставляют драться на арене
проблема в том что не могу сделать народ - зрителей, охота чтобы они кричали орали( что уже сделано) и двигались а не стояли как истуканы. Как осуществить их постоянную анимацию??? пожалуйста помогите
Lex
см. функцию ActionPlayAnimation()
в принципе можно на ХБ НПС написать простенький скрипт, который будет заставлять проигрывать НПС рандомную анимацию.
Devstvenik
а можешь написать этот скриптик??? и куда его поставить надо??? плззз
Batkom
Neverwinter Script
void main()
int iEmotion;
int iAnimation;
string sVoice;
iEmotion = d6();
switch (iEmotion)
{
case 1: iAnimation = ANIMATION_FIREFORGET_SALUTE;  sVoice="bla bla bla"; break;
case 2: iAnimation = ANIMATION_FIREFORGET_DRINK;    sVoice="bla bla bla"; break;
case 3: iAnimation = ANIMATION_FIREFORGET_TAUNT;    sVoice="bla bla bla"; break;
case 4: iAnimation = ANIMATION_FIREFORGET_VICTORY1; sVoice="bla bla bla"; break;
case 5: iAnimation = ANIMATION_FIREFORGET_VICTORY2; sVoice="bla bla bla"; break;
case 6: iAnimation = ANIMATION_FIREFORGET_VICTORY3; sVoice="bla bla bla"; break;
}
AssignCommand(OBJECT_SELF, ActionPlayAnimation(iAnimation));
AssignCommand(OBJECT_SELF, ActionSpeakString(sVoice, TALKVOLUME_SHOUT));
}

В свойствах создания есть вкладка скриптов, a там на OnHeartBeat
Lex
ток я бы сделал не d6, а d8 Чтобы они не каждые 6 секунд все дергались, а иногда стояли "столбом". И если фразы не четко привязаны к анимации (пересекаются со смыслом анимации), то для текста я бы сделал отдельный свич (дабы комбинаций анимация-текст было бы больше). Но это косметика, а в целом Batkom написал все верно.
Только AssignCommand(OBJECT_SELF, - делать не нужно, можно сразу
Neverwinter Script
ClearAllAcations(); // ну эт для подстраховки, мало ли что.
ActionPlayAnimation(iAnimation);
ActionSpeakString(sVoice, TALKVOLUME_SHOUT);

и заводить переменную для свича не обязательно, достаточно switch d6()
gennady
Лёш, все верно написал, но тут еще конь не валялся, т.ч. Devstvenik, посмотри еще здесь и напиши, что тебе конкретно нужно: http://remmgen.narod.ru/tscript3.html#SC_HB
Lex
Понятно, что тут еще есть куда двигаться (я в базе выкладывал шаблон для имитации разговора нескольких НПС с фразами и анимацией. Тут вприцнипе тоже самое). Но этим уже автор заниматься должен сам, если оно ему надо. Кстати именно в данном случае, такого решения вполне достаточно, имхо. Это фон, и поэтому дополнительные затраты времени на такие скрипты не стоят потраченных усилий.
Griffon
Для колизея можно добавить и

ANIMATION_LOOPING_MEDITATE
ANIMATION_LOOPING_TALK_FORCEFUL

с заданием времени

float fDurationSeconds = 0.5f

Batkom
QUOTE (Lex @ May 24 2010, 09:18) *
Только AssignCommand(OBJECT_SELF, - делать не нужно, можно сразу
....
и заводить переменную для свича не обязательно, достаточно switch d6()

Вот это не знал, спасибо.
Кстати, так подумал, десяток ниписей в таком колизее мгновенно загадит весь чат. Стоит сделать проверку
Neverwinter Script
if (d6()>5) ActionSpeakString(sVoice, TALKVOLUME_SHOUT);

Можно спикстринг заменить на
Neverwinter Script
PlayVoiceChat(VOICE_CHAT_BATTLECRY1);

или что-то другое из группы VOICE_CHAT_*


У меня есть вопрос:
Сейчас пишу пресловутый распорядок дня для неписей. Имею два пути решения.
1) на onhb у каждого npc стоит проверка времени(day/night) и если никого нет в локации, а ему пора спать, он тихо - мирно прыгает домой.(все равно у npc что-то исполняется на onhb, почему бы не добавить туда еще...)
2) на onhb у плейсибла стоит проверка времени и таблица npc, которым нужно приказать спать. Если проверка успешна, плейсибл обзванивает всех ниписей и расставляет их по домам.
Так, как это дело пишется для шарда, то самое важное тут - быстродействие.
Так вот, что будет работать быстрее?
Ilerien
Быстрее в хб непися, на плейсе или локе лишние ресурсы хавает обход неписей.
Для какого шарда, если не секрет?
Batkom
В том то и вся соль, обход неписей по идее должен совершаться два раза в сутки.

[измините за оффтоп, лирика]
Собственный модуль, не привязанный к забытым королевствам.
Когда-то держал в локальной сети скромненький шардик, менее, чем на сто локаций с несбалансированным рулесетом. Было весело, но года через три шард загнулся. Сейчас вот довожу до ума правила, выкидываю чужие хаки, (из гемовского хака я правда оставил чудную башню и холмики, надеюсь, никто обижаться не будет) рисую локации, балансирую спавны. Акцент собираюсь делать на динамических головоломках в данжах и активном участии ДМ в игре.
Как доваяю до той кондиции, чтобы не стыдно было сервер запускать, выпущу в большой мир.
[/измините за оффтоп, лирика]
virus_found
Цитата(Batkom @ May 24 2010, 21:52) *
[измините за оффтоп, лирика]
Собственный модуль, не привязанный к забытым королевствам.
Когда-то держал в локальной сети скромненький шардик, менее, чем на сто локаций с несбалансированным рулесетом. Было весело, но года через три шард загнулся. Сейчас вот довожу до ума правила, выкидываю чужие хаки, (из гемовского хака я правда оставил чудную башню и холмики, надеюсь, никто обижаться не будет) рисую локации, балансирую спавны. Акцент собираюсь делать на динамических головоломках в данжах и активном участии ДМ в игре.
Как доваяю до той кондиции, чтобы не стыдно было сервер запускать, выпущу в большой мир.
[/измините за оффтоп, лирика]

Желаю удачи. good.gif
Ilerien
Цитата
В том то и вся соль, обход неписей по идее должен совершаться два раза в сутки.
Хм, туплю. В таком случае лучший выход - это псевдохертбит на модуле или локе (ну или на плейсе, но лока лучше) с задержкой, равной половине суток.
Мне это видится так - на загрузке модуля запускается таймер (псевдохербит на малый отрезок времени - раунд или секунду, как удобнее). Когда таймер видит, что время суток сменилось (достигается это с помощью локалки), выкидывается модульный эвент, в обработчике которого перебираются все локи, и для каждой локи происходят соответствующие действия с помеченными неписями. Я бы оформил это как отдельный скрипт, запускаемый из модульного эвента на локе.
Цитата
(из гемовского хака я правда оставил чудную башню и холмики, надеюсь, никто обижаться не будет)
Velmar's Tower 2х2 из Rural+City? smile.gif
Batkom
Я боюсь, что перебор всех лок будет некисло тормозить, попробую обойтись жестким списком или выборкой тэгов из mysql.
Как напишу, выложу тут для проверки.
QUOTE (Ilerien @ May 25 2010, 01:12) *
Velmar's Tower 2х2 из Rural+City?

Именно. В одном из поселений, в этой башне располагается рынок.
gennady
Не знаю как для шарда, а для сингла я писал и на ХБ НПС и на ХБ плейсов. Но прыжки тупили, лучше использовать copy, но и тут есть свои нюансы... Хотя, функция получилась нормальная, можно весь мод впихнуть на один ХБ плейса. Если интересно могу выложить.
Waldgeist
Люди, пожалуйста, помогите: как организовать провал заклинания на всю локацию? Что нужно прописать? Чтобы даже мельчайшие магические атрибуты исчезали.
Ilerien
Цитата
Люди, пожалуйста, помогите: как организовать провал заклинания на всю локацию? Что нужно прописать?
Повесить на локу переменную и проверять её в спеллхуке.
Цитата
Чтобы даже мельчайшие магические атрибуты исчезали.
Вот этого не понял. Стандартные средства позволяют сделать провал заклинаний и только заклинаний.
Waldgeist
О, уи. Я просто имел в виду подобие Пещеры Бехолдеров из Hotu- там, помнится, Лук "Вечность" и Энсеррик лишились своих чудотворных свойств.

Цитата(Waldgeist @ May 25 2010, 20:09) *
О, уи. Я просто имел в виду подобие Пещеры Бехолдеров из Hotu- там, помнится, Лук "Вечность" и Энсеррик лишились своих чудотворных свойств.

А за совет спасибо.
Ilerien
Цитата
О, уи. Я просто имел в виду подобие Пещеры Бехолдеров из Hotu- там, помнится, Лук "Вечность" и Энсеррик лишились своих чудотворных свойств.
Способ для сингла есть - собственно, стащить скрипты из кампании. Не смотрел, как это реализовано, но, полагаю, проходом по инвентарю и удалением большинства свойств со всех предметов.
Lex
если именно в локе - проще сделать 100% шанс провала закла в параметрах данной локации. Оно там же, где имя локи, тэг и тд.
Ilerien
Цитата
если именно в локе - проще сделать 100% шанс провала закла в параметрах данной локации. Оно там же, где имя локи, тэг и тд.
Я что-то в этой жизни пропустил? shok.gif Нет такого в параметрах локи, хоть убей.
Laajin
может быть, имеется ввиду % помех в свойствах локации?
но там эти помехи вроде бы для навыков вида выслушивать/прятаться
Lex
там есть и для навыков и для заклинаний, вроде бы. А если меня глючит и такой вещи нет, то на вход вешать эффект с увеличением шанса провала. Всяко проще, чем спелхук.
Ilerien
Цитата
А если меня глючит и такой вещи нет, то на вход вешать эффект с увеличением шанса провала. Всяко проще, чем спелхук.
Тебя глючит. Спеллхук чуть сложнее, зато на порядок более надёжен.
Batkom
Огромное спасибо. Давно хотел сделать такую штуку, но было лень.
Поковырял компанию, немного переработал оригинальные скрипты.
В дальнейшем собираюсь переделать работу с предметами и сам скрипт под мультиплеер с записью свойств в MySQL
Смысл таков:
На локацию вешается локалинт ITEM_KEY = 0 как счетчик.
В недоступном месте стоит вейпоинт backup_waypoint.
При заходе в локацию, на игрока вешается эффект провала заклинания и прочищаются все эффекты кроме естественных.
С предметами сделано довольно странно, но для сингла сойдет:
1) Предметы копируются к вейпоинту с новыми тегами
2) На оригинальных предметах прочищаются все свойства и устанавливается локалстринг с тегом копии
При выходе из локации с игрока снимаются эффект спеллфейла и полиморфа(иначе нельзя будет восстановить свойства на заполиморфимшеся друле), а потом с предметами происходит следующее:
1) Изымается локалстринг с тегом буферного предмета
2) Копируются все свойства с буферного на оригинальный предмет
3) Буферный предмет уничтожается
Раскомментировал, как мог.
На onEnter локации:
Neverwinter Script
#include "x2_inc_itemprop"

int GetIsAlcohol(object oItem)
{
    itemproperty ip;
    ip = GetFirstItemProperty(oItem);
    if(GetIsItemPropertyValid(GetNextItemProperty(oItem)
))
        return FALSE;
    if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
    {
        if(GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_BEER ||
           GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_SPIRITS ||
           GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_WINE)
            return TRUE;
    }
    return FALSE;
}
int GetIsPoisonAmmo(object oItem)
{
    itemproperty ip;
    ip = GetFirstItemProperty(oItem);
    if(GetIsItemPropertyValid(GetNextItemProperty(oItem)
))
        return FALSE;
    if(IPGetItemHasItemOnHitPropertySubType(oItem, IP_CONST_ONHIT_ITEMPOISON))
        return TRUE;
    return FALSE;
}
int GetIsDyeKit(object oItem)
{
    if(GetBaseItemType(oItem) == BASE_ITEM_MISCSMALL)
    {
        itemproperty ip = GetFirstItemProperty(oItem);
        if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
        {
            int nSubType = GetItemPropertySubType(ip);
            return (nSubType >= 490 && nSubType <= 497);
        }
        return FALSE;
    }
    return FALSE;
}
//Копирует предмет
void RemoveAllProperties(object oItem, object oPC, int nSlot = -1)
{
    if(oPC != OBJECT_INVALID)
    {
        if(oItem == OBJECT_INVALID)//Если не передается предмет, но передается слот, то работать с предетом на слоте
           {
            oItem = GetItemInSlot(nSlot, oPC);
            if(oItem == OBJECT_INVALID)
            return;
           }
           else
            {
            int nType = GetBaseItemType(oItem);
            if(nType == BASE_ITEM_TORCH ||
               nType == BASE_ITEM_TRAPKIT ||
               nType == BASE_ITEM_HEALERSKIT ||
               nType == BASE_ITEM_GRENADE ||
               nType == BASE_ITEM_THIEVESTOOLS ||
               nType == 109 || // crafting stuff
               nType == 110 ||
               nType == 112)
                return;
            }
    }
   
   
    if(GetIsAlcohol(oItem) || GetIsPoisonAmmo(oItem) || GetIsDyeKit(oItem))
        return;
    if(oItem == OBJECT_INVALID)
        return;
    // вейпоинт, куда складываются копии предметов
    //Должен быть недоступен игроку
    object oWP = GetWaypointByTag("backup_waypoint");
    //счетчик предметов, должен быть установлен для объекта выполнения заранее и не должен сбрасываться
    int nKey = GetLocalInt(OBJECT_SELF, "ITEM_KEY");
    nKey++;
    SetLocalInt(OBJECT_SELF, "ITEM_KEY", nKey);
    string sKey = IntToString(nKey);
    object oCopy = CopyObject(oItem, GetLocation(oWP), OBJECT_INVALID, "back_item" + sKey);
    //После копирования на предмет записывается его ключ
    SetLocalString(oItem, "ITEM_KEY", sKey);

    itemproperty ip = GetFirstItemProperty(oItem);
    while(GetIsItemPropertyValid(ip))
    {
        RemoveItemProperty(oItem, ip);
        ip = GetNextItemProperty(oItem);
    }
}
//Убирает эффекты с существа, оставляя естественные эффекты, например EFFECT_TYPE_POISON
void RemoveEffects(object oObject)
{
    effect eEff = GetFirstEffect(oObject);
    while(GetIsEffectValid(eEff))
    {
        int nType = GetEffectType(eEff);
        if(GetEffectSubType(eEff) != SUBTYPE_EXTRAORDINARY &&
           (nType == EFFECT_TYPE_ABILITY_INCREASE ||
           nType == EFFECT_TYPE_AC_INCREASE ||
           nType == EFFECT_TYPE_ATTACK_INCREASE ||
           nType == EFFECT_TYPE_BLINDNESS ||
           nType == EFFECT_TYPE_CHARMED ||
           nType == EFFECT_TYPE_CONCEALMENT ||
           nType == EFFECT_TYPE_CONFUSED ||
           nType == EFFECT_TYPE_CURSE ||
           nType == EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE ||
           nType == EFFECT_TYPE_DAMAGE_INCREASE ||
           nType == EFFECT_TYPE_DAMAGE_REDUCTION ||
           nType == EFFECT_TYPE_DAMAGE_RESISTANCE ||
           nType == EFFECT_TYPE_DAZED ||
           nType == EFFECT_TYPE_DEAF ||
           nType == EFFECT_TYPE_DOMINATED ||
           nType == EFFECT_TYPE_ELEMENTALSHIELD ||
           nType == EFFECT_TYPE_ETHEREAL ||
           nType == EFFECT_TYPE_FRIGHTENED ||
           nType == EFFECT_TYPE_HASTE ||
           nType == EFFECT_TYPE_IMMUNITY ||
           nType == EFFECT_TYPE_IMPROVEDINVISIBILITY ||
           nType == EFFECT_TYPE_INVISIBILITY ||
           nType == EFFECT_TYPE_INVULNERABLE ||
           nType == EFFECT_TYPE_ABILITY_INCREASE ||
           nType == EFFECT_TYPE_NEGATIVELEVEL ||
           nType == EFFECT_TYPE_PARALYZE ||
           nType == EFFECT_TYPE_POLYMORPH ||
           nType == EFFECT_TYPE_REGENERATE ||
           nType == EFFECT_TYPE_SANCTUARY ||
           nType == EFFECT_TYPE_SAVING_THROW_INCREASE ||
           nType == EFFECT_TYPE_SEEINVISIBLE ||
           nType == EFFECT_TYPE_SILENCE ||
           nType == EFFECT_TYPE_SKILL_INCREASE ||
           nType == EFFECT_TYPE_SLOW ||
           nType == EFFECT_TYPE_SPELL_IMMUNITY ||
           nType == EFFECT_TYPE_SPELL_RESISTANCE_INCREASE ||
           nType == EFFECT_TYPE_SPELLLEVELABSORPTION ||
           nType == EFFECT_TYPE_TEMPORARY_HITPOINTS ||
           nType == EFFECT_TYPE_TRUESEEING ||
           nType == EFFECT_TYPE_ULTRAVISION ||
           nType == EFFECT_TYPE_INVULNERABLE))
            RemoveEffect(oObject, eEff);
        eEff = GetNextEffect(oObject);
    }
}

void main()
{
    object oEnter = GetEnteringObject();
    //Если игрок сохранился, вышел из игры и загрузился потом, ничего с ним не делать
    //INSIDE - Локальная переменная для избежания глюков с save\load
    int nInside = GetLocalInt(oEnter, "INSIDE");
    if(nInside == 1) return;
    SetLocalInt(oEnter, "INSIDE", 1);
    RemoveEffects(oEnter);
    effect eSpellFailure = EffectSpellFailure(100, SPELL_SCHOOL_GENERAL);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpellFailure, oEnter);
    object oItem = GetFirstItemInInventory(oEnter);
        while(oItem != OBJECT_INVALID)
        {
            RemoveAllProperties(oItem, oEnter, -1);
            oItem = GetNextItemInInventory(oEnter);
        }
        //Убираем свойства с предметов в слотах экиперовки
        //Если лексикон не врет, то искомые слоты с 0(INVENTORY_SLOT_HEAD) по 13(INVENTORY_SLOT_BOLTS)
        int iSlot = 0;
        while(iSlot<14)
        {
        RemoveAllProperties(OBJECT_INVALID, oEnter, iSlot);
        iSlot++;
        }
}



На onExit:
Neverwinter Script
#include "x2_inc_itemprop"
// Восстанавливаем свойства предметов
void RestoreAllProperties(object oItem, object oPC, int nSlot = -1)
{
   if(oPC != OBJECT_INVALID)
    {
        if(oItem == OBJECT_INVALID)//Если не передается предмет, но передается слот, то работать с предетом на слоте
            oItem = GetItemInSlot(nSlot, oPC);
        if(oItem == OBJECT_INVALID)
            return;
    }
    string sKey = GetLocalString(oItem, "ITEM_KEY");
    object oOriginalItem = GetObjectByTag("back_item" + sKey);
    if(oOriginalItem != OBJECT_INVALID)
    {
        //Копировать все свойства предмета на новый
        IPCopyItemProperties(oOriginalItem, oItem);
        DestroyObject(oOriginalItem);
        DeleteLocalString(oItem, "ITEM_KEY");
    }
}
//Убирает свойства с создания
void RemoveEffects(object oObject)
{
    effect eEff = GetFirstEffect(oObject);
    while(GetIsEffectValid(eEff))
    {
        if(GetEffectType(eEff) == EFFECT_TYPE_SPELL_FAILURE || GetEffectType(eEff) == EFFECT_TYPE_POLYMORPH)
            RemoveEffect(oObject, eEff);
        eEff = GetNextEffect(oObject);
    }
}

void main()
{
    object oExit = GetExitingObject();
    SetLocalInt(oExit, "INSIDE", 0); // Локальная переменная для избежания глюков с save\load
    if(GetObjectType(oExit) == OBJECT_TYPE_CREATURE)
    {
        RemoveEffects(oExit);
        object oItem = GetFirstItemInInventory(oExit);
        float fDelay = 4.0; //Задержка для избежания глюков с прогрузкой, можно увеличить
        while(oItem != OBJECT_INVALID)
        {
            DelayCommand(fDelay, RestoreAllProperties(oItem, oExit, -1));
            oItem = GetNextItemInInventory(oExit);
        }
        //Убираем свойства с предметов в слотах экиперовки
        //Если лексикон не врет, то искомые слоты с 0(INVENTORY_SLOT_HEAD) по 13(INVENTORY_SLOT_BOLTS)
        int iSlot = 0;
        while(iSlot<14)
        {
        DelayCommand(fDelay, RestoreAllProperties(OBJECT_INVALID, oExit, iSlot));
        iSlot++;
        }
       
    }
    }

}
SvetikSM
приветик)

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

попробовала добавить опыт, как написано здесь

Цитата
//-------------------- Уровень игрока для игры в модуле ------------------------
// К примеру нам нужен игрок 5 уровня. Смотрим таблицу уровней и видим,
// что Level 5 = 10000 xp.
{
SetXP(oPC, 10000);
}

ничего не получается, никакого опыта sad.gif

также пробовала деньги добавлять, снова не работает ((

мой мод не очень большой, и много там не нужно, но помогите хотя бы с простыми задачами, пожалуйста unsure.gif

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

2. как сделать, чтобы в диалоге с НПЦ появлялась строчка, что его можно присоединить в отряд? ( в безвыходной ситуации взяла Боддинока Глинка, поменяла ему все диалоги под свой сюжет, но тем не менее остается всегда строчка, что я работаю на Арибет - я не знаю как и где это убрать ... ).

3. ну и наконец, как сделать хотя бы простенький квест? Например непись дает задание, принести ему такой то предмет, и чтобы при подношении ему этого предмета он выдавал бы N-ное количество опыта и золота.
Lex
Цитата(SvetikSM @ May 27 2010, 09:35) *
ничего не получается, никакого опыта sad.gif

как именно написала скрипт и куда его поставила? Процитированный тобой кусок - не является законченным скриптом, это лишь функция.
отвечая на твой первый вопрос, должно быть так:
Neverwinter Script
void main()
{
object oPC = GetFirstPC();
SetXP(oPC , 10000);
}

Этот скрипт нужно поставить в слот модуля, на onEnterPlayer (или как-то так он называется).

по поводу всего остального, прочитай для начала: http://www.city-of-masters.ru/forums/index...?showtopic=1612
SvetikSM
спасибо. с опытом и деньгами разобралась.
со спутником тоже, но не совсем.
вот это я ему прописала:
Цитата
if(GetLocalInt(OBJECT_SELF, "HENCHED") != TRUE) // Проверка, что присоединяется один раз
{
SetLocalInt(OBJECT_SELF, "HENCHED", TRUE); // Вот и установка
AddHenchman(GetPCSpeaker(), OBJECT_SELF); // Добавляем хенча тому игроку, с кем говорит


теперь по завершении диалоги НПЦ входит в отряд. Но, если его на время отлучить из отряда, то второй раз он уже почему то не нанимается, хотя строчка, по которой он должен входить - есть.
что я делаю не так? unsure.gif

Цитата(SvetikSM @ May 27 2010, 15:06) *
спасибо. с опытом и деньгами разобралась.
со спутником тоже, но не совсем.
вот это я ему прописала:


теперь по завершении диалоге НПЦ входит в отряд. Но, если его на время отлучить из отряда, то второй раз он уже почему то не нанимается, хотя строчка, по которой он должен входить - есть.
что я делаю не так? unsure.gif

Lex
Цитата(SvetikSM @ May 27 2010, 12:07) *
теперь по завершении диалоги НПЦ входит в отряд. Но, если его на время отлучить из отряда, то второй раз он уже почему то не нанимается, хотя строчка, по которой он должен входить - есть.
что я делаю не так? unsure.gif

не снимаешь переменную HENCHED. Она в твоей ситуации вообще не нужна, имхо.
Ilerien
Цитата
1. как все таки мне сделать, чтобы при старте модуля игрокам назначался 5-ый уровень?
Если планируется, что играть будет несколько человек одновременно, то про GetFirstPC() во всех скриптах нужно забыть. Например, в скрипте на заход
Neverwinter Script
object oPC = GetEnteringObject();
На мой взгляд, пихать во все скрипты, где нужно получить игрока, GetFirstPC() - крайне вредная привычка даже для сингла.
Batkom
Ага.
Еще вариант: добавить в onhb хенча
Neverwinter Script
if (GetIsPC(GetFactionLeader(OBJECT_SELF))) SetLocalInt(OBJECT_SELF, "HENCHED", FALSE);

Считаю, что проверку HENCHED нужно делать при отображении в диалоге строки "Пойдем со мной"
Lex
Цитата(Batkom @ May 27 2010, 13:32) *
Считаю, что проверку HENCHED нужно делать при отображении в диалоге строки "Пойдем со мной"

там проще проверить, в патии хенч или нет. те переменная тут явно дублирующая.
Цитата(Ilerien @ May 27 2010, 13:30) *
GetFirstPC() - крайне вредная привычка даже для сингла.

для сингла не вредная smile.gif И я не обратил внимание что там про "игроков". тогда да, от GetFirstPC надо отказываться.
Ilerien
Цитата(Lex @ May 27 2010, 13:00) *
для сингла не вредная smile.gif
Ещё какая вредная smile.gif 1) захочется переделать модуль под мультиплеер или хотя бы потестить двумя клиентами -> случится пипец; 2) это ухудшает понимание API и механизма исполнения скриптов; 3) захочет скриптер войти в команду шарда или что-нибудь в этом роде -> придётся переучиваться smile.gif
SvetikSM
эм...
вот так написала
Цитата
{
object oPC = GetEnteringObject();
SetXP(oPC , 10000);
}


но теперь при каждом заходе в игру опыт всегда снижается до 10к, до 5 лвла, даже если герой несколько прокачался вперед.
как это исправить? declare.gif

да, игра планируется не одиночная, а на двух-трех человек.

Цитата
не снимаешь переменную HENCHED. Она в твоей ситуации вообще не нужна, имхо.

спасибо, теперь со спутником всё нормально declare.gif
Ilerien
Цитата
как это исправить?
Neverwinter Script
void main()
{
    object oPC = GetEnteringObject();
    if(GetXP(oPC) < 10000)
        SetXP(oPC, 10000);
}
greye
Neverwinter Script
int nGoldAmount = some_func();
SendMessageToPC(oPlayer, IntToString(nGoldAmount) + " gold to move");
AssignCommand(oPlayer, TakeGoldFromCreature(nGoldAmount, oPlayer, TRUE));

onPlayerDeath, после воскрешения и вообще всё валидное.
В сообщении игроку выводится правильное значение, но деньги забираются все, что есть. В чём проблема?

Вопрос снят...
Batkom
Доброе время суток. Сейчас ваяю крафт. Решил сделать некий конструктор. Однако, дабы избежать перегруженности палитры предметов, было решено генерировать предметы полностью динамически. Застопорился только в одном: Как сменить предмету имя и описание? Это вообще возможно из скриптов?
greye
SetName, SetDescription
Batkom
Спасибо, я балбес, SetName нашел, а вот SetDescription нету. Он в каком-то инклюде?
Ilerien
Нет, в версии 1.69 / в плагине Funcs к NWNX.
Batkom
Чорт, на 1,69 переходить совсем не хочется, много лишнего и с dialog.tlk проблемы. Впрочем, NWNX все равно подключать собирался. Спасибо.
virusman
SetDescription есть в 1.69.
А NWNX уже сам требует 1.69.
Ilerien
Цитата
Чорт, на 1,69 переходить совсем не хочется, много лишнего и с dialog.tlk проблемы.
Actually, никаких проблем. Полностью переведённый dialog.tlk для 1.69. А лишнее же всегда можно не использовать, верно?
Вернул на место ссылку на плейграунд. Алсо, не первый случай, когда ссылки на плейграунд начинают магическим образом вести на вpг. Достойный способ потешить самолюбие, ничего не скажешь.
Batkom
Ух-ты!
Вот спасибо. (впрочем, я еще конечно поканителюсь с переходом на 1.69, конечно, не известно, чем это грозит, главное, чтобы с тайлсетом ничего не стряслось)
ReyBrujo
Вот один из моих скриптиков, который я использовал как спец-атаку монстра (в моем случае дракона).
Действует он так :
1. Проставляем переменные.
2. Чекаем локацию НПЧ на наличие валидных созданий - врагов.
3. Если враг ,- НПЧ ,- то парализуем его на 10-20 сек.
4. Если враг ПЧ - парализуем на 10-20 сек и колдуем на него заклинание огненного шара.
5. Записываем локальную переменную специальных атак.

Может, кому - то понадобится. =)

Neverwinter Script
/////////////////////////////////////////////////////
//////        /////    //////  //  //            //
/////        //  //  //      //  //            ///
////          /////    /////    /////          ////
///          //  //  //          //          /////
//            //  //  //////  /////          //////
/////////////////////////////////////////////////////
// Copyright © Rey Brujo, ma-zi-la@hotmail.com  //
// Created By: ReyBrujo, City Of Masters          //
// Created On: 06/06/2010                          //
/////////////////////////////////////////////////////

void main()
{
object oNPC = OBJECT_SELF; // NPC
object oPC = GetFirstPC(); // Player
int nHP = (GetCurrentHitPoints() / GetMaxHitPoints())*100; // Hit Points (in wacko.gif
int nSAtt = GetLocalInt(oNPC, "specatt"); // Special Attack integer
int nNHP = 50;

if(nHP < nNHP && nSAtt >= 1)
    {
    nSAtt -= 1;
    object oCreature = GetFirstObjectInArea(GetArea(oNPC));
    while(GetIsObjectValid(oCreature)) // Check for valid creatures (enemies). If it exists - cast chosen spells/effects.
        {
        // NPC //
        if(GetObjectType(oCreature) == OBJECT_TYPE_CREATURE && GetIsEnemy(oCreature) == TRUE && GetIsPC(oCreature) == FALSE)
            {
            ClearAllActions(TRUE);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oCreature, 10.0+Random(10));
            }

        // PC //
        if(GetObjectType(oCreature) == OBJECT_TYPE_CREATURE && GetIsEnemy(oCreature) == TRUE && GetIsPC(oCreature) == TRUE)
            {
            ClearAllActions(TRUE);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oCreature, 10.0+Random(10));
            ClearAllActions(TRUE);
            SetFacingPoint(GetPosition(oPC));
            ActionDoCommand(ActionCastSpellAtObject(SPELL_FIRE
BALL, oPC, METAMAGIC_EMPOWER, TRUE));
            ActionWait(0.5);
            }
        oCreature = GetNextObjectInArea(GetArea(oNPC)); // Continue checking
        }
    SetLocalInt(oNPC, "specatt", nSAtt); // Set number of special attacks
    }
}


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

Еще одно забыл сказать - действие происходит только если у НПК хп меньше чем nNHP % (у меня поставлено 50)

И еще одно - не забудьте в переменные НПЧ поставить переменную specatt, которая больше 0.

Этот скрипт ставится на хертбит монстра wacko.gif
Laajin
Два варианта:
1. тебе нужно изучить 3д макс и там сделать свою анимацию.
2. На nwn vault я видел хек пак где сделаны летающие драконы, впринципе можно сделать чтобы происходила замена модели - стоящего на лапах, на летящего в воздухе, а потом наоборот.

честно говоря боле вариантов я не вижу, потому что функции аппер-дизаппер они по другому работать не могут.
ReyBrujo
Вот начал делать собственный мультиплеерный модуль. Никак не могу сделать две вещи - скрипт на вход(игрок заходит, его должно перенести на вейпоинт) и скрипт, который бы при создании НПЧ давал им команду атаки ближайшего врага.
Пока что есть вот что:
1. (ОнЕнтер триггера под точкой входа)
Neverwinter Script
void main()
{
//////////// MY SCRIPTS ////////////
//--------------------------------//
////////////////////////////////////
object oPC = GetEnteringObject();
object oGame = GetObjectByTag("GAME");
object oGuard = GetObjectByTag("NW_ELFRANGER001");
object oSieger = GetObjectByTag("NW_DROWCLER001");
int nPlayers = GetLocalInt(oGame, "players");
int nGuards = GetLocalInt(oGame, "guards");
int nSiegers = GetLocalInt(oGame, "siegers");
if(GetIsPC(oPC) == TRUE)
{
SetLocalInt(oGame, "players", nPlayers+1); //Set number of players to +1
if(nGuards>nSiegers)
{//Set number of siegers to +1
JumpToObject(GetWaypointByTag("wp_siegers"));
SetStandardFactionReputation(STANDARD_FACTION_HOST
ILE, 100, oPC);
SetStandardFactionReputation(STANDARD_FACTION_DEFE
NDER, 0, oPC);
SetLocalInt(oGame, "siegers", nSiegers+1);
SpeakString(IntToString(nSiegers));
}
else
{//Set number of guards to +1
JumpToObject(GetWaypointByTag("wp_guards"));
SetStandardFactionReputation(STANDARD_FACTION_HOST
ILE, 0, oPC);
SetStandardFactionReputation(STANDARD_FACTION_DEFE
NDER, 100, oPC);
SetLocalInt(oGame, "guards", nGuards+1);
SpeakString(IntToString(nGuards));
}
///////// OTHER SCRIPTS /////////
//-----------------------------//
/////////////////////////////////

// ITEMS //
CreateItemOnObject("potion001", oPC);
CreateItemOnObject("potion001", oPC);
CreateItemOnObject("potion001", oPC);
CreateItemOnObject("potion001", oPC);
CreateItemOnObject("potion001", oPC);
}
}


2. (Хертбит. Инклюд "inc_nearest" просто перенаправляет на "x0_i0_enemy" (чтобы удобнее было искать =) ))
Neverwinter Script
#include "nw_i0_generic"
#include "inc_nearest"

void main()
{
//////////////////////////////////////////
// тут обычные скрипты хертбита //
//////////////////////////////////////////
    if(GetCurrentAction() != ACTION_ATTACKOBJECT)
    {
    ActionAttack(GetNearestEnemy(), TRUE);
    }
}


В первом скрипте всё, кроме джамп ту вейпоинт работает нормально. С вейпом проблем вроде-бы нет.
А во втором скрипте я долго пытался намутить, один раз что-то получилось, но тогда у мну вылетел тулсет, а я не помню, что сделал.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.