Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 55 56 57 58 59 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Zirrex
сообщение Jul 14 2005, 23:03
Сообщение #1386


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



dumbo, с хартбита я его убрал, и повесил на OnPerception, несколько изменив, и убрав цикл, потому что на самом НПС он уже не нужен.

Один вопрос, если же оставлять скрипт с циклом, как же мне определить правильно "oDefender", если мне не нужен какой-то определенный НПС, а именно НПС, у которого в имени тэга которого только эти слова "npc_guard"? Воспримется ли нормально такой вид тэга?

Neverwinter Script Source
object oDefender = GetObjectByTag(GetStringLeft("npc_guard", 9));

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

Neverwinter Script Source
#include "ahs_sp_spirit"

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

    object oGuard = OBJECT_SELF;
    object oSpirit = GetPlayerSpirit(oPercep);

    string sID = GetName(oPercep) + GetPCPublicCDKey(oPercep);

    // проверка репутации между персонажем и стражником
    if (GetReputation(oPercep, oGuard) > 10)
    {
        // проверка репутации персонажа, если выше -100, остановить
        if (GetLocalInt(oSpirit, "Carma_" + sID) > -100) return;

        // если в имени тэга нет этих слова, остановить
        if (GetStringLeft(GetTag(oGuard), 9) != "npc_guard") return;

        // если персонаж в этих локациях, остановить
        // думаю, лишнее, ибо в этих локациях нет стражников.
        if ((GetTag(GetArea(oPercep)) == "amen_start_sm") ||
            (GetTag(GetArea(oPercep)) == "am_lost_souls_w_sm") ||
            (GetTag(GetArea(oPercep)) == "amen_ht_arena") ||
            (GetTag(GetArea(oPercep)) == "amen_dt_magepl") ||
            (GetTag(GetArea(oPercep)) == "amen_fortress") ||
            (GetTag(GetArea(oPercep)) == "amen_ht_prison"))
        {
            return;
        }

        // проверка дистанции стражника до цели, если больше 10, остановить
        if (GetDistanceToObject(oPercep) > 10.0) return;

        // если переменная существует, остановить
        if (GetLocalInt(oPercep, "PkKiller") == TRUE) return;

        // если стражник не сражается и не говорит, продолжить
        if (!IsInConversation(oGuard) && !GetIsInCombat(oGuard))
        {
            string sMessage;
            int iRandom = d12();

            switch (iRandom)
            {
                case 1: sMessage = "Эй, подождите, у меня к вам неотложный разговор!"; break;
                case 2: sMessage = "Эй, что-то мне лицо ваше не нравится?!"; break;
                case 3: sMessage = "Охрана не дремлет! Оставаться на месте, и не двигаться!"; break;
                case 4: sMessage = "Стоять! Вы арестованы!"; break;
                case 5: sMessage = "Стоять! Малейшее движение, и вы пожалеете, что я вообще вас заметил!"; break;
                case 6: sMessage = "Оставайтесь на месте! Вот так. А теперь поговорим."; break;
                case 7: sMessage = "Погодите, не спешите, надо поговорить."; break;
                case 8: sMessage = "Вот ведь мне как везет сегодня, вы то мне и нужны."; break;
                case 9: sMessage = "Что-то ходят слухи, что вы нарушаете закон!"; break;
                case 10: sMessage = "По-моему я вас где-то видел? Ах да, вы то мне и нужны..."; break;
                case 11: sMessage = "Сегодня у меня удачный день, а у вас видимо, нет..."; break;
                case 12: sMessage = "Кто это тут у нас? Хе-хе, как я погляжу, у вас руки уже дрожат!"; break;
            }

            // Очистить действие игрока и НПС
            AssignCommand(oGuard, ClearAllActions(TRUE));
            AssignCommand(oPercep, ClearAllActions(TRUE));

            // Сбросить открытый диалог у персонажа, если он есть
            AssignCommand(oPercep, ActionStartConversation(oGuard));
            // Очистить все действия у персонажа
            DelayCommand(0.1, AssignCommand(oPercep, ClearAllActions(TRUE)));
            // Начало сценки для персонажа
            DelayCommand(0.2, SetCutsceneMode(oPercep, TRUE));

            // Изменение переменной 'PkKiller' на 1.
            if (GetLocalInt(oPercep, "PkKiller") != TRUE)
            {
                SetLocalInt(oPercep, "PkKiller", TRUE);
            }

            // Стражник подбегает к персонажу
            AssignCommand(oGuard, ActionForceMoveToObject(oPercep, TRUE, 1.0f, 5.0));
            // Стражник говорит фразу персонажу в общий канал
            AssignCommand(oGuard, ActionSpeakString(sMessage, TALKVOLUME_TALK));
            // Стражник открывает персонажу диалог
            AssignCommand(oGuard, ActionStartConversation(oPercep, "am_carma_system", TRUE));
        }
    }
}

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

Не сбежит, диалог то уже запущен. А на выходе и входе в модуль у меня проверяется переменная, если она равна TRUE, то удалить, соответственно НПС снова обратится к персонажу игрока. Если же попробует просто скинуть диалог, отбежав подальше, опять-таки, на данный момент, обижается вся фракция "Defender". Мне такой путь не очень нравится, но пока по-другому не реализовал.

Скрипт смерти был такой изначально, и даже хуже, когда я взялся за модуль. Работая с ним, начал доводить до идеальной работы, и от того скрипта мало уже что осталось. Запутанный он, потому что много всего, что надо учитывать при смерти. К тому же я взял все инклуды, и включил в один кусок скрипта, чтобы легче было разобраться. Буду еще отлаживать, главное, он работает, пока игрок не делает ничего, что может привести к ошибке.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
minion
сообщение Jul 15 2005, 08:56
Сообщение #1387


Level 4
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Эльф



Компилятор выдает мне ошибку: ОШИБКА: МНОГОКРАТНЫЙ СЛУЧАЙ ПОСТОЯННОГО УТВЕРЖДЕНИЯ В ПРЕДЕЛАХ ВЫКЛЮЧАТЕЛЯ в скрипте (место отмечено //*****):
Neverwinter Script Source
/*
Function return the new property of item
*/

itemproperty ReturnNewProperty (object oItem, int nProperty)
{
    object oPlayer = GetFirstPC ();
    itemproperty itemprop;
    switch (nProperty)
    {
        case IP_CONST_DAMAGETYPE_ACID:
        case IP_CONST_DAMAGETYPE_FIRE:
        case IP_CONST_DAMAGETYPE_COLD:
        case IP_CONST_DAMAGETYPE_ELECTRICAL:
        case IP_CONST_DAMAGETYPE_MAGICAL:
        case IP_CONST_DAMAGETYPE_NEGATIVE:
        case IP_CONST_DAMAGETYPE_POSITIVE:
        {
            int nDamBonus = GetLocalInt (oPlayer, "DAMAGE_BONUS");
            itemprop = ItemPropertyDamageBonus (nType, nDamBonus);
            break;
        }
        case CONST_ATTACK_BONUS:
        {
            int nCount = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyAttackBonus (nCount);
            break;
        }
        case CONST_KEEN:
        {
            itemprop = ItemPropertyKeen ();
            break;
        }
        case CONST_SPELL_RESISTANCE:
        {
            int nResist = GetLocalInt (oPlayer, "SPELL_RESIST");
            itemprop = ItemPropertyBonusSpellResistance (nResist);
            break;
        }
        case CONST_TRUE_SEEING:
        {
            itemprop = ItemPropertyTrueSeeing ();
            break;
        }
        case CONST_REGENERATION:
        {
            int nReg = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyRegeneration (nReg);
            break;
        }
        case IP_CONST_ABILITY_CHA: //*****
        case IP_CONST_ABILITY_CON:
        case IP_CONST_ABILITY_DEX:
        case IP_CONST_ABILITY_INT:
        case IP_CONST_ABILITY_STR:
        case IP_CONST_ABILITY_WIS:
        {
            int nCount = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyAbilityBonus (nProperty, nCount);
            break;
        }
        case CONST_HASTE:
        {
            itemprop = ItemPropertyHaste ();
            break;
        }
/*
        case CONST_SPELL_IMMUNE_LEVEL:
        {
            int nCount = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyImmuneToSpellLevel (nCount);
            break;
        }
*/

        case CONST_ONHIT_PROPS:
        {
            int nSaveDC = GetLocalInt (oPlayer, "SAVE_DC");
            int nSpecial = GetLocalInt (oPlayer, "SPECIAL");
            itemprop = ItemPropertyOnHitProps (nProperty, nSaveDC, nSpecial);
            break;
        }
        case CONST_VAMPIRIC_REGENERATION:
        {
            int nVampReg = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyVampiricRegeneration (nVampReg);
            break;
        }
        case ITEM_VISUAL_ACID:
        case ITEM_VISUAL_COLD:
        case ITEM_VISUAL_ELECTRICAL:
        case ITEM_VISUAL_EVIL:
        case ITEM_VISUAL_FIRE:
        case ITEM_VISUAL_HOLY:
        case ITEM_VISUAL_SONIC:
        {
            itemprop = ItemPropertyVisualEffect (nProperty);
            break;
        }
        case CONST_DARKVISION:
        {
            itemprop = ItemPropertyDarkvision ();
            break;
        }
    }
}

Ему не нравится что у меня слишком много case?
Добавлено в [mergetime]1121408064[/mergetime]
И еще. Пусть меч дает бонус силы +12. Могу я получить это +12 следующей ф-ей?
[NSS]
int GetAbilityBonus (object oItem, int nAbility)
{
itemproperty ip = GetFirstItemProperty (oItem);
while (GetIsItemPropertyValid (ip))
{
if (GetItemPropertyType (ip) == nAbility)
{
return GetItemPropertySubType (ip);
}
ip = GetNextItemProperty (oItem);
}
}
Добавлено в [mergetime]1121408138[/mergetime]
И еще. Пусть меч дает бонус силы +12. Могу я получить это +12 следующей ф-ей?
Neverwinter Script Source
int GetAbilityBonus (object oItem, int nAbility)
{
    itemproperty ip = GetFirstItemProperty (oItem);
    while (GetIsItemPropertyValid (ip))
    {
        if (GetItemPropertyType (ip) == nAbility)
        {
            return GetItemPropertySubType (ip);
        }
        ip = GetNextItemProperty (oItem);
    }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
GoingPro)
сообщение Jul 15 2005, 14:32
Сообщение #1388


Level 3
*

Класс: Ниндзя
Характер: Chaotic Evil
Раса: Человек



dumboДа расписал отлично, только я уже понял, метот похож на паскаль :)
Уже все зделал, значение стринг прилипил к предмету невыкидываемуму, затем одтуда счатываю перевожу в Локайшен и кидаю перса туда....Поидеи должно сохраниться после рэбута на шмотке, дома прийду проверю.

А тебе спасибо! :good:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 15 2005, 20:58
Сообщение #1389


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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

Объясни подробнее, что именно ты хочешь сделать?

Если желаешь бонус силы от меча, так пропиши подобное на модульные скрипты. Там есть эвент, который обрабатывает одеваемые и снимаемые вещи. Например так:

На эвент модуля "OnPlayerEquipItem"
Neverwinter Script Source
void main()
{
    object oPC = GetPCItemLastEquippedBy();
    object oItem = GetPCItemLastEquipped();
    string sTag = GetTag(oItem);

    if (sTag == "am_it_sword")
    {
        effect eStrength = SupernaturalEffect(EffectAbilityIncrease(ABILITY_STRENGTH, 12));
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStrength, oPC);
    }
}


На эвент модуля "OnPlayerUnEquipItem"
Neverwinter Script Source
void main()
{
    object oPC = GetPCItemLastUnequippedBy();
    object oItem = GetPCItemLastUnequipped();
    string sTag = GetTag(oItem);

    if (sTag == "am_it_sword")
    {
        effect eEff = GetFirstEffect(oPC);

        while (GetIsEffectValid(eEff))
        {
            if (GetEffectType(eEff) == EFFECT_TYPE_ABILITY_INCREASE &&
                GetEffectSubType(eEff) == SUBTYPE_SUPERNATURAL)
            {
                RemoveEffect(oPC, eEff);
            }
            eEff = GetNextEffect(oPC);
        }
    }

Тут я немного не разобрался, как снять определенный эффект, т.е. в нашем случае снять только эффект изменной силы, поэтому скрипт снятия эффекта универсальный.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
minion
сообщение Jul 15 2005, 21:52
Сообщение #1390


Level 4
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Эльф



Zirrex я хочу сделать кузнеца, который будет зачаровывать вещи за определенную плату. Нечто подобное есть в ХотУ. Но там не зачаровывает характеристики. Вот мне и пришла в голову идея. У меня не получается только зачарование Харизмы и проверка на уже зачарованный бонус (скажем +12 силы на мече).
Вот выкладываю весь инклуд:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name UpdateWeapon.nss
//:: Copyright DSS
//:://////////////////////////////////////////////
/*
        БИБЛИОТЕКА ДЛЯ УЛУЧШЕНИЯ ОРУЖИЯ
*/

//:://////////////////////////////////////////////
//:: Created By:  minion
//:: Created On:  july 2005
//:://////////////////////////////////////////////

//////////////////////////////////////////////////
//                CONSTANTS
//////////////////////////////////////////////////
const int CONST_ATTACK_BONUS = 19000;
const int CONST_KEEN = 19003;
const int CONST_TRUE_SEEING = 19005;
const int CONST_SPELL_RESISTANCE = 19006;
const int CONST_REGENERATION = 19007;
const int CONST_HASTE = 19002;
const int CONST_SPELL_IMMUNE_LEVEL = 18100;
const int CONST_ONHIT_PROPS = 18101;
const int CONST_VAMPIRIC_REGENERATION = 18102;
const int CONST_DARKVISION = 18103;
//////////////////////////////////////////////////
//              FUNCTIONS
//////////////////////////////////////////////////
/*
Вывод отладочного сообщения
*/

void debug (string sMes)
{
    object oPlayer = GetFirstPC ();
    SendMessageToPC (oPlayer, sMes);
}
/*
Function delete all temporary properties from item
*/

void RemoveTemporaryProperties (object oItem, int nDurType = DURATION_TYPE_TEMPORARY)
{
    itemproperty itemprop = GetFirstItemProperty (oItem);
    int nPropDurType;
    while (GetIsItemPropertyValid (itemprop))
    {
        nPropDurType = GetItemPropertyDurationType (itemprop);
        if (nPropDurType == nDurType) RemoveItemProperty (oItem, itemprop);
        itemprop = GetNextItemProperty (oItem);
    }
}
/*
Function return the new property of item
*/

itemproperty ReturnNewProperty (object oItem, int nProperty)
{
    object oPlayer = GetFirstPC ();
    itemproperty itemprop;
    int nCount, nSaveDC, nSpecial;
    if ((nProperty == IP_CONST_DAMAGETYPE_ACID) || (nProperty == IP_CONST_DAMAGETYPE_FIRE) || (nProperty == IP_CONST_DAMAGETYPE_COLD) || (nProperty == IP_CONST_DAMAGETYPE_ELECTRICAL))
    {
        nCount = GetLocalInt (oPlayer, "DAMAGE_BONUS");
        itemprop = ItemPropertyDamageBonus (nProperty, nCount);
    }
    else if ((nProperty == IP_CONST_DAMAGETYPE_MAGICAL) || (nProperty == IP_CONST_DAMAGETYPE_NEGATIVE) || (nProperty == IP_CONST_DAMAGETYPE_POSITIVE))
    {
        nCount = GetLocalInt (oPlayer, "DAMAGE_BONUS");
        itemprop = ItemPropertyDamageBonus (nProperty, nCount);
    }
    else if (nProperty == CONST_ATTACK_BONUS)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyAttackBonus (nCount);
    }
    else if (nProperty == CONST_KEEN)
    {
        itemprop = ItemPropertyKeen ();
    }
    else if (nProperty == CONST_SPELL_RESISTANCE)
    {
        nCount = GetLocalInt (oPlayer, "SPELL_RESIST");
        itemprop = ItemPropertyBonusSpellResistance (nCount);
    }
    else if (nProperty == CONST_TRUE_SEEING)
    {
        itemprop = ItemPropertyTrueSeeing ();
    }
    else if (nProperty == CONST_REGENERATION)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyRegeneration (nCount);
    }
    else if ((nProperty == IP_CONST_ABILITY_CHA) || (nProperty == IP_CONST_ABILITY_CON) ||
            (nProperty == IP_CONST_ABILITY_DEX) || (nProperty == IP_CONST_ABILITY_INT) ||
            (nProperty == IP_CONST_ABILITY_STR) || (nProperty == IP_CONST_ABILITY_WIS))
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyAbilityBonus (nProperty, nCount);
    }
    else if (nProperty == CONST_HASTE)
    {
        itemprop = ItemPropertyHaste ();
    }
/*
    else if (nProperty == CONST_SPELL_IMMUNE_LEVEL)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyImmuneToSpellLevel (nCount);
    }
*/

    else if (nProperty == CONST_ONHIT_PROPS)
    {
        nSaveDC = GetLocalInt (oPlayer, "SAVE_DC");
        nSpecial = GetLocalInt (oPlayer, "SPECIAL");
        itemprop = ItemPropertyOnHitProps (nProperty, nSaveDC, nSpecial);
    }
    else if (nProperty == CONST_VAMPIRIC_REGENERATION)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyVampiricRegeneration (nCount);
    }
    else // По умолчанию будет CONST_DARKVISION
    {
            itemprop = ItemPropertyDarkvision ();
    }
    return itemprop;
}
/*
Function removing matching properties from item
*/

void RemoveMatchingProperties (object oItem, int nType, int nSubType)
{
    itemproperty itemp = GetFirstItemProperty (oItem);
    while (GetIsItemPropertyValid (itemp))
    {
        if (GetItemPropertyType (itemp) == nType)
        {
            if (GetItemPropertySubType (itemp) == nSubType)
            {
                RemoveItemProperty (oItem, itemp);
            }
        }
        itemp = GetNextItemProperty (oItem);
    }
}
/*
Function check PC gold needed for service
*/

int GetGoldForService (int nServ)
{
    int nGoldNeed, nCount, nSaveDC, nSpecial;
    object oPlayer = GetFirstPC ();
    int nMN = GetLocalInt (oPlayer, "MN");
    if ((nServ == IP_CONST_DAMAGETYPE_ACID) || (nServ == IP_CONST_DAMAGETYPE_FIRE) || (nServ == IP_CONST_DAMAGETYPE_COLD) || (nServ == IP_CONST_DAMAGETYPE_ELECTRICAL))
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if ((nServ == IP_CONST_DAMAGETYPE_MAGICAL) || (nServ == IP_CONST_DAMAGETYPE_NEGATIVE) || (nServ == IP_CONST_DAMAGETYPE_POSITIVE))
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_ATTACK_BONUS)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_KEEN)
    {
            nGoldNeed = 70000;
    }
    else if (nServ == CONST_SPELL_RESISTANCE)
    {
            nCount = GetLocalInt (oPlayer, "SPELL_RESIST");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_TRUE_SEEING)
    {
            nGoldNeed = 70000;
    }
    else if (nServ == CONST_REGENERATION)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if ((nServ == IP_CONST_ABILITY_CHA) || (nServ == IP_CONST_ABILITY_CON) ||
            (nServ == IP_CONST_ABILITY_DEX) || (nServ == IP_CONST_ABILITY_INT) ||
            (nServ == IP_CONST_ABILITY_STR) || (nServ == IP_CONST_ABILITY_WIS))
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_HASTE)
    {
            nGoldNeed = 150000;
    }
/*
    else if (nServ == CONST_SPELL_IMMUNE_LEVEL)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
*/

    else if (nServ == CONST_ONHIT_PROPS)
    {
            nSaveDC = GetLocalInt (oPlayer, "SAVE_DC");
            nSpecial = GetLocalInt (oPlayer, "SPECIAL");
            nGoldNeed = (nSaveDC + nSpecial) * nMN / 50;
    }
    else if (nServ == CONST_VAMPIRIC_REGENERATION)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else // По умолчанию будет CONST_DARKVISION
    {
            nGoldNeed = 50000;
    }
    return nGoldNeed;
}
/*
Function add the new property to the item
*/

void AddNewProperty (object oItem, itemproperty itemp)
{
    int nType = GetItemPropertyType (itemp);
    int nSubType = GetItemPropertySubType (itemp);
    RemoveMatchingProperties (oItem, nType, nSubType);
    AddItemProperty (DURATION_TYPE_PERMANENT, itemp, oItem);
    debug ("costtable : " + IntToString (GetItemPropertyCostTable(itemp)));
    debug ("value : " + IntToString (GetItemPropertyCostTableValue (itemp)));
}
/*
Функция проверяет наличие свойства. Если такового
нет возвращает FALSE.
*/

int GetItemHasProperty (object oItem, itemproperty ip)
{
    itemproperty itemp = GetFirstItemProperty (oItem);
    while (GetIsItemPropertyValid (itemp))
    {
        if (GetItemPropertyType (itemp) == GetItemPropertyType (ip))
        {
            if (GetItemPropertySubType (itemp) == GetItemPropertySubType (ip))
            {
                return TRUE;
            }
        }
        itemp = GetNextItemProperty (oItem);
    }
    return FALSE;
}
/*
Функция возвращает бонус характеристики. Если такового
нет, то возвращает -1.
*/

int GetAbilityBonus (object oItem, int nAbility)
{
    int n;
    itemproperty itemp;
    for (n == 1; n < 13; n++)
    {
        itemp = ItemPropertyAbilityBonus (nAbility, n);
        if (GetItemHasProperty (oItem, itemp)) return TRUE;
    }
    return -1;
}

Найдете ошибки пишите.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 18 2005, 01:41
Сообщение #1391


Level 4
**

Класс: Клерик
Характер: Lawful Good
Раса: Человек



сделал простенькую систему вархаузов, стоит сундук,оа onOpen стоит
Neverwinter Script Source
void main()
{
SetLocked(OBJECT_SELF, TRUE);
object oPC = GetLastUsedBy();
int kItems = GetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC));
while (kItems > 0)
    {
    string sItem = GetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems));
    CreateItemOnObject(sItem, OBJECT_SELF, 1);
    kItems = kItems -1;
    }
}


на onClose
Neverwinter Script Source
void main()
{
object oPC = GetLastUsedBy();
int kItems = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
SetLocked(OBJECT_SELF, TRUE);
while(GetIsObjectValid(oItem) == TRUE)
    {
        kItems = kItems + 1;
        string sRes = GetResRef(oItem);
        SetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems), sRes);
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(OBJECT_SELF);
    }
    SetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC), kItems);
}

ве вроди бы работает, только есть две проблемы, во первых траблы со стак предметами, во вторых иногда исчезает какая нибудь одна вещь
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
GoingPro)
сообщение Jul 18 2005, 10:30
Сообщение #1392


Level 3
*

Класс: Ниндзя
Характер: Chaotic Evil
Раса: Человек



Помогите не работает чете =\....Вот скрипт:
На ОнЕкзит
Neverwinter Script Source
string LocationToString(location lLocation)
{
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition = GetPositionFromLocation(lLocation);
    float fOrientation = GetFacingFromLocation(lLocation);
    string sReturnValue;

    if (GetIsObjectValid(oArea))
        sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#";
    return sReturnValue;
}



void main()
{
  object oPC = GetExitingObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  string sReturnValue;
  location lLocation = GetLocation(oPC);
  if (GetIsPC(oPC))
  {
    LocationToString(lLocation);
    SetLocalString(oItem, "Location" + GetPCPlayerName(oPC), sReturnValue);
  }
}


И на ОнЕнтер
Neverwinter Script Source
location StringToLocation(string sLocation)
{
    location lReturnValue;
    object oArea;
    vector vPosition;
    float fOrientation, fX, fY, fZ;

    int iPos, iCount;
    int iLen = GetStringLength(sLocation);

    if (iLen > 0)
    {
        iPos = FindSubString(sLocation, "#AREA#") + 6;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_X#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fX = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Y#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fY = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Z#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fZ = StringToFloat(GetSubString(sLocation, iPos, iCount));

        vPosition = Vector(fX, fY, fZ);

        iPos = FindSubString(sLocation, "#ORIENTATION#") + 13;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount));

        lReturnValue = Location(oArea, vPosition, fOrientation);
    }

    return lReturnValue;
}


void main()
{
  object oPC = GetEnteringObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  location lReturnValue;
  string sLocation = GetLocalString(oItem, "Location" + GetPCPlayerName(oPC));
  if (GetIsPC(oPC))
  {
      StringToLocation(sLocation);
      AssignCommand(oPC, ActionJumpToLocation(lReturnValue));
  }
}


Скрипты упростил на максимум что бы было проще разобраться...
Непонемаю почему он не работает, вроде бы все правильно по логике...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 18 2005, 12:43
Сообщение #1393


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



QUOTE (GoingPro) @ Jul 18 2005, 11:30)
На ОнЕкзит

выражайся точнее. судя по всему, это таки "ОнКлиентЛив" и "ОнКлиентЕнтер"...
что такое Lexicon знаешь? цитата оттуда:
QUOTE
All data that pertains to the player is unavailable (GetPCPlayerName, GetPCPublicCDKey, GetPCIPAddress) and the player has become detatched from the character object, hence GetIsPC returns false. If you want any of this information at time of client leave, you must have already stored this information (on client enter is a good time to do this). Also, due to this, no locals can be stored on the PC at this time.

да и ошибок в скриптах куча. :yes: особенно затейливо у тебя используются переменные, содержащие в имени ReturnValue. :crazy: короче, вот твои main'ы:
OnClientLeave:
Neverwinter Script Source
object oPC = GetExitingObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  SetLocalString(oItem, "Location",LocationToString(GetLocation(oPC)));

OnClientEnter:
Neverwinter Script Source
object oPC = GetEnteringObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  if (oItem == OBJECT_INVALID)
    // если еще нету, создаем.
    CreateItemOnObject("tag_of_item", oPC);
  else
    ActionJumpToLocation(StringToLocation(GetLocalString(oItem, "Location")));

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 18 2005, 19:22
Сообщение #1394


Level 4
**

Класс: Клерик
Характер: Lawful Good
Раса: Человек



Так и не нашел скрипта смерти(ну точно видел, но повторнео найти так и не смог)
написал свой код
Neverwinter Script Source
//ôëàã
    SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes");
    //ëîêàöèÿ
    location lDeath = GetLocation(oPlayer);
    SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath);
    //âàðï â ôóãó
    Raise(oPlayer);
    AssignCommand(oPlayer, ActionJumpToLocation(GetLocation(GetObjectByTag("fugue"))));
     //òðóï
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //óñòàíîâêà ïåðåìåííûõ
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer));
    //ãîëä
    int iGP = GetGold(oPlayer);
    TakeGoldFromCreature(iGP, oPlayer, TRUE);
    CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP);
    //ëóò
    int iSlot;
    int iLoot = d10(1);
    switch (iLoot){
    case 1: iSlot = INVENTORY_SLOT_ARMS;         break;
    case 2: iSlot = INVENTORY_SLOT_BELT;         break;
    case 3: iSlot = INVENTORY_SLOT_BOOTS;        break;
    case 4: iSlot = INVENTORY_SLOT_CLOAK;        break;
    case 5: iSlot = INVENTORY_SLOT_HEAD;         break;
    case 6: iSlot = INVENTORY_SLOT_LEFTHAND;     break;
    case 7: iSlot = INVENTORY_SLOT_LEFTRING;     break;
    case 8: iSlot = INVENTORY_SLOT_NECK;         break;
    case 9: iSlot = INVENTORY_SLOT_RIGHTHAND;    break;
    case 10: iSlot = INVENTORY_SLOT_RIGHTRING;   break;
    default: break;   }

    if (d10(1)>5)             {
object oLoot = GetItemInSlot(iSlot, oPlayer);
     CreateItemOnObject(GetResRef(oLoot), oCorpse);
     DestroyObject(oLoot);

Все компилируется, но отказывается работать, создается труп, в нем лежит итим труп и голд, который у игрока не изымается, игрок воскрешается и остается стоять около трупа :crazy:

Сообщение отредактировал Batkom - Jul 18 2005, 19:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 18 2005, 20:58
Сообщение #1395


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



Batkom, сорри, там на второй странице - вот код.
QUOTE (Lex @ Jan 27 2005, 22:14)
Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп на который переносятся все вещи покойного. Сам труп исчезает через 250 секунд.

"low_plc_loot" - резреф трупа в палитре.


Neverwinter Script Source
//::Created by      Лито
//::Modificated by  Lex
void Clear(object oBag = OBJECT_SELF)
{
object oItem = GetFirstItemInInventory(oBag);
while (GetIsObjectValid(oItem))
  {
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oBag);
  }
DestroyObject(oBag,1.0);
}
void main()
{
string sTemplate = "low_plc_loot";
string sTag = GetTag(OBJECT_SELF);
location lLoc = GetLocation(OBJECT_SELF);
object oloot = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lLoc, TRUE, sTag);
int i = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItem))
    {
    if (GetDroppableFlag(oItem))
      CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    oItem = GetNextItemInInventory(OBJECT_SELF);
    }
oItem = GetItemInSlot(i,OBJECT_SELF);
while (i<14)
    {
    if (GetDroppableFlag(oItem))
      CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    i++;
    oItem = GetItemInSlot(i,OBJECT_SELF);
    }
AssignCommand(oloot,DelayCommand(250.0,Clear(oloot)));
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 19 2005, 03:36
Сообщение #1396


Level 4
**

Класс: Клерик
Характер: Lawful Good
Раса: Человек



Сделал шардовую деф систему: это первая более менее серьезная взаимосвязаная система скриптов которую я написал, потому может не работать(еще не проверял, всевроде компилируется)
Если найдете ошибки, пишите, если все будет работать, выложу в базу скриптов.
Поехали:
Хертбит(работает):
Neverwinter Script Source
//игрока козявит, пока тот окончательно не умрет, козявит в принципе не особо долго, но успеть хелнуть можно
void main()
{
object oPC = GetFirstPC();
effect eDam = EffectDamage(1);
while (GetIsObjectValid(oPC) == TRUE)
{
int iHits = GetCurrentHitPoints(oPC);
if (iHits < 1)
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC);
oPC = GetNextPC();
}
}

onDying(совсем просто, тоже работает)
Neverwinter Script Source
//игроку выдается токен винвентарь, ибо случались попытки альта во время даинга, с последующим созданием нового чара и восстановления хит поинтов старому при совпаденииимен(баг игры, практиковался на gem of the north) при ентере игрок умерщвляется за альт
void main()
{

object oPC = GetLastPlayerDying();
CreateItemOnObject("item034", oPC, 1);

}


onPlayerDeath(как не странно, тоже работает)
Neverwinter Script Source
#include "nw_i0_plot"


void Raise(object oPlayer)
{
        effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);

        effect eBad = GetFirstEffect(oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);

        //Search for negative effects
        while(GetIsEffectValid(eBad))
        {
            if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
                GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
                GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
                GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
                {
                    //Remove effect if it is negative.
                    RemoveEffect(oPlayer, eBad);
                }
            eBad = GetNextEffect(oPlayer);
        }

        SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}

void main()
{

    object oPlayer = GetLastPlayerDied();
    string sArea = GetTag(GetArea(oPlayer));
//если наарене, то варпает к флажку arenaspawn
    if (sArea == "arena")
    {

        Raise(oPlayer);

        object oSpawnPoint = GetObjectByTag("arenaspawn");
        AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSpawnPoint))));

        return;
    }

  
    //Флажок
    SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes");
    //Локация
    location lDeath = GetLocation(oPlayer);
    SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath);
    //Варп в фугу, флажок respawn
    Raise(oPlayer);
    AssignCommand(oPlayer, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn")))));
     //Создание трупака и итима трупака в нем
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //Установка переменных
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPlayer), "yes");
    //Взять золото и положить в труп
    int iGP = GetGold(oPlayer);
    AssignCommand(oPlayer, TakeGoldFromCreature(iGP, oPlayer, TRUE));
    CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP);
    //Вывалить рандомную вещичку из екиперовки если не повезет
    int iSlot;
    int iLoot = d10(1);
    switch (iLoot){
    case 1: iSlot = INVENTORY_SLOT_ARMS;         break;
    case 2: iSlot = INVENTORY_SLOT_BELT;         break;
    case 3: iSlot = INVENTORY_SLOT_BOOTS;        break;
    case 4: iSlot = INVENTORY_SLOT_CLOAK;        break;
    case 5: iSlot = INVENTORY_SLOT_HEAD;         break;
    case 6: iSlot = INVENTORY_SLOT_LEFTHAND;     break;
    case 7: iSlot = INVENTORY_SLOT_LEFTRING;     break;
    case 8: iSlot = INVENTORY_SLOT_NECK;         break;
    case 9: iSlot = INVENTORY_SLOT_RIGHTHAND;    break;
    case 10: iSlot = INVENTORY_SLOT_RIGHTRING;   break;
    default: break;   }

    if (d10(1)>5)             {
object oLoot = GetItemInSlot(iSlot, oPlayer);
     CreateItemOnObject(GetResRef(oLoot), oCorpse);
     DestroyObject(oLoot);
     }}

OnEnter в фуге
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if(GetIsPC(oPC))
{
//превращаем игрока в духа
effect eGhost = EffectPolymorph(POLYMORPH_TYPE_SPECTRE, TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPC);
//отбираем токен если он есть
object oItem = GetItemPossessedBy(oPC, "deathtoken");
if (GetIsObjectValid(oItem)) DestroyObject(oItem);
}
}


на OnExit в фуге
Neverwinter Script Source
void main()
{
object oPC = GetExitingObject();
effect eEf = GetFirstEffect(oPC);
//снимаем полиморф а заодно и все остальное
while (GetIsEffectValid(eEf))
{
RemoveEffect(oPC, eEf);
eEf = GetNextEffect(oPC);
}
//ищем труп с запомненойлокации и дестроим трупак в инвентаре пласибла, а потом сам пласибл, по умолчанию лут выпадает в виде мешочка
location lCorpse = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC));
object oCorpse = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lCorpse, 1);
if (GetTag(oCorpse) == "playercorpse")
    {
    object oItemcorpse = GetFirstItemInInventory(oCorpse);
    while(GetIsObjectValid(oItemcorpse))
        {
        if(GetTag(oItemcorpse) == "corpseitem") DestroyObject(oItemcorpse);
        oItemcorpse = GetNextItemInInventory(oCorpse);
        }
    }
    DelayCommand(1.0, DestroyObject(oCorpse));
//ставим флажок в выключеное состояние
SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC),"no");
//говорим, что больше у игрока нет трупа
SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC), "no");

на onenter в модуль
Neverwinter Script Source
void main()
{
//проверяем альтнулся ли игрок, если да, умерщвляем
object oPC = GetEnteringObject();
if (HasItem(oPC, "deathtocken"))
{
effect death = EffectDeath(TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, death, oPC);
}
//проверяем флажок и наличие у игрока трупа(в теории локальные переменные после рестарта обнуляются)
if((GetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC)) == "yes")&&(GetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC))!="yes"))
{
//летим в фугу
AssignCommand(oPC, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn")))));
    //создаем трупак и итем трупак
    location lDeath = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC));
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //показываем кто хозяин всего этого великолепия
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPC));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPC));
}
}

при открытии инвентаря трупа
Neverwinter Script Source
void main()
{
string sMaster = GetLocalString(OBJECT_SELF, "master");
SpeakString("Здесь покоится " + sMaster, TALKVOLUME_TALK);
}

на закрытие инвентаря трупа
Neverwinter Script Source
void main()
{
//проверяем инвентарь трупа, если итем труп есть, дестроим плесибл труп
int i = 0;
object oItemcorpse = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItemcorpse))
    {
    if(GetTag(oItemcorpse) == "corpseitem") i=1;
    oItemcorpse = GetNextItemInInventory(OBJECT_SELF);
    }
    if(i=0) DestroyObject(OBJECT_SELF);
}

Ну помоему стандартный скрипт на OnActivateItem
Neverwinter Script Source
void main()
{
    ExecuteScript(GetTag(GetItemActivated()), OBJECT_SELF);
}

Предмет трупак имеет свойство ыть использованным один раз скрипт называется в честь тега предмета а именно corpseitem
Neverwinter Script Source
void main()
{
//если не было рестарта, то происходит уже выше описанная процедура создания трупа, если был, ничего не происходит и труп просто исчезает, нужно бежать за нормальным
location lPlace = GetItemActivatedTargetLocation();
string sMaster = GetLocalString(GetItemActivated(), "master");
if (sMaster != "")
    {
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lPlace);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    SetLocalString(oCorpse, "master", sMaster);
    SetLocalString(oItemcorpse, "master", sMaster);
    }
}

Кусок райздеда(nw_s0_raisdead)
Neverwinter Script Source
object oTarget = GetSpellTargetObject();
    string sMaster = GetLocalString(oTarget, "master");
if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE))
    {
    object oRaise = GetFirstPC();
    while(GetIsObjectValid(oRaise))
        {
        if(GetPCPlayerName(oRaise) == sMaster)
            {
            AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget)));
            DelayCommand(1.0, DestroyObject(oTarget));
            effect eDamage = EffectDamage(GetCurrentHitPoints(oRaise)-1);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oRaise);
            }
          object oRaise = GetNextPC();
        }
    }

Кусок ресуректа(nw_s0_resserec)
Neverwinter Script Source
object oTarget = GetSpellTargetObject();
    string sMaster = GetLocalString(oTarget, "master");
if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE))
    {
    object oRaise = GetFirstPC();
    while(GetIsObjectValid(oRaise))
        {
        if(GetPCPlayerName(oRaise) == sMaster)
            {
            AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget)));
            DelayCommand(1.0, DestroyObject(oTarget));
            }
          object oRaise = GetNextPC();
        }
    }


Вот собственно и все, надеюсь ничего не пропустил.
Не судите строго, не идеально, зато сам :D .

Сообщение отредактировал Batkom - Jul 19 2005, 04:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 19 2005, 03:59
Сообщение #1397


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



Batkom, тут пока негде искать ошибки. советую таки не изобретать велосипед, а вопользоватся готовыми(которые, правда, порой оказываются инвалидными колясками): идешь сюда вводишь в поле title слово death и жмешь enter.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 19 2005, 04:03
Сообщение #1398


Level 4
**

Класс: Клерик
Характер: Lawful Good
Раса: Человек



сорри за то, что было сначала, теперь все полностью
Добавлено в [mergetime]1121767396[/mergetime]
тестинг показал, что при выходе из игры попутно выполняется скрипт выходаиз фуги....это не хорошо, можно ли сделать из него инклуд? (я правда никогда инклуды не делал)
Добавлено в [mergetime]1121773445[/mergetime]
игрок не воскрешается :unsure:
пишет, что ошибка скрипта реса, слишком много инструкций

Добавлено в [mergetime]1121777505[/mergetime]
не работают флажки, что не делай, игрок либо все время в фуге, либо все время живой при перезаходе и рестарте
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmey
сообщение Jul 21 2005, 11:01
Сообщение #1399


Level 4
**

Класс: Маг
Характер: Chaotic Evil
Раса: Дракон



Люди! Мне нужна такая хреновина: Например, с моим персом идет напарник. Мне надо, чтобы в определенном месте он остановился, и сказав типа "Я дальше не пойду" выбыл из компаниии уже НЕ ПРИСОЕДИНЯЛСЯ НИКОГДА.

и ещё: как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ?

......(я маг начинающий, в скриптах разбираюсь кое-как) заранее спасибо :crazy:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 21 2005, 12:07
Сообщение #1400


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



zmey, есть функция
Neverwinter Script Source
void RemoveHenchman(object oMaster, object oHenchman=OBJECT_SELF)

где
oMaster - это тот от кого уходит хенчмен
oHenchman - это хенчмен, каторый уходит

То, что ты хочешь можно сделать с помощью тригера и скрипта на нем проверяющего кто наступил. Рисуешь тригер и на ОнЭнтер ставишь скрипт
Neverwinter Script Source
void main()
{
object oMaster = GetEnteringObject();
object oHenchman = GetHenchman(oMaster);

if (GetIsPC (oMaster) && !GetLocalInt(OBJECT_SELF, "TRIGER") == 1)
  {
  AssignCommand(oHenchman, ActionSpeakString("Я дальше не пойду"));
  RemoveHenchman(oMaster, oHenchman);
  SetLocalInt(OBJECT_SELF, "TRIGER", 1);
  SetLocalInt(oHenchman, "TRUS", 1); // устанавливаем локалку, а на ветке   
  // диалога, где хенча можно обратно взять, ставим проверку на эту локалку
  }
}

QUOTE (zmey @ Jul 21 2005, 11:01)
как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ?

Вот функция

Neverwinter Script Source
void ActionMoveToLocation(location lDestination, int bRun=FALSE)
// location lDestination - задается сама локация, куда идти
// int bRun - собственно TRUE включает бег, FALSE отключает бег...

С помощью нее кидаешь непися куда хочешь.

Сообщение отредактировал -fenix- - Jul 21 2005, 12:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmey
сообщение Jul 21 2005, 12:25
Сообщение #1401


Level 4
**

Класс: Маг
Характер: Chaotic Evil
Раса: Дракон



fenix, спасибо!!! :crazy:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
BoB4ik
сообщение Jul 21 2005, 19:07
Сообщение #1402


Level 2
*

Класс: Обыватель
Характер: Chaotic Good
Раса: Человек



Ребята, мне очень нужен Trueseeing скрипт(чтобы допустим ставил вместо него еффект See Invisibility и +20 к споту),я сам скриптить не умею, искал в разных местах, не нашел, а без него, воры у меня на шарде практически не встречаются...
Помогите пожалуйста, буду благодарен.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 21 2005, 22:14
Сообщение #1403


Level 4
**

Класс: Клерик
Характер: Lawful Good
Раса: Человек



я например заменил трусы на заклинание превращения цели в слабое существо(корова, пингвин, крыса, курица), если не прокинет спас по воле. Имхо так интереснее.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 22 2005, 08:56
Сообщение #1404


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



BoB4ik ищи в модуле скрипт "nw_s0_truesee". Изменяем код:

Neverwinter Script Source
#include "x2_inc_spellhook"

void main()
{
    if (!X2PreSpellCastCode())
    {
        return;
    }

    //Declare major variables
    object oTarget = GetSpellTargetObject();
    effect eVis = EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT);
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
//    effect eSight = EffectTrueSeeing();
//->
    effect eSight = EffectSeeInvisible();
//<-
    effect eLink = EffectLinkEffects(eVis, eSight);
    effect eSpot = EffectSkillIncrease(SKILL_SPOT, 20);
    eLink = EffectLinkEffects(eLink, eDur);
//->
    eLink = EffectLinkEffects(eLink, eSpot);
//<-
    //Fire cast spell at event for the specified target
//    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_TRUE_SEEING, FALSE));
//->
    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SEE_INVISIBILITY, FALSE));
//<-
    int nDuration = GetCasterLevel(OBJECT_SELF);
    int nMetaMagic = GetMetaMagicFeat();

    //Enter Metamagic conditions
    if (nMetaMagic == METAMAGIC_EXTEND)
    {
        nDuration = nDuration * 2; //Duration is +100%
    }
    //Apply the VFX impact and effects
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration));
}

Стрелочками я указал, что добавил нового в скрипт. А воры почему не встречаются, просто незаметны? :D
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
BoB4ik
сообщение Jul 22 2005, 10:45
Сообщение #1405


Level 2
*

Класс: Обыватель
Характер: Chaotic Good
Раса: Человек



Спасибо Тебе, Зиррекс!
Сейчас исправлю:)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DEM
сообщение Jul 24 2005, 20:06
Сообщение #1406


Level 7
**

Класс: Маг
Характер: Lawful Neutral
Раса: Эльф



Вот у меня вопрос... как сделать так, если монстр далеко убежал от определённой точки гоняясь за игроком, предположим на X футов, он вернёться назад.
Можно ли сделать, что бы НеПиСь давал квест на убийство монстра, а этот монстр появился бы в какой нибудь локации (наугад из трёх определённых)...
И как сделать что бу если у героя здоровье 0, он не погибал, а экран темнел и он оказывался в определённой локе (например больница), его вещи находились в определённом ящики и отнялось пару золотых...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 25 2005, 06:19
Сообщение #1407


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



QUOTE (DEM @ Jul 24 2005, 20:06)
Вот у меня вопрос... как сделать так, если монстр далеко убежал от определённой точки гоняясь за игроком, предположим на X футов, он вернёться назад. Можно ли сделать, что бы НеПиСь давал квест на убийство монстра, а этот монстр появился бы в какой нибудь локации (наугад из трёх определённых)... И как сделать что бу если у героя здоровье 0, он не погибал, а экран темнел и он оказывался в определённой локе (например больница), его вещи находились в определённом ящики и отнялось пару золотых...

Угу... А еще напишите мне всю эту систему, и скажите что куда поставить чтоб все заработало.
Получая сразу все готовые скрипты - сложно будет научится скриптить. Даже исходя из //комментариев.
Скачай NWScripts Лексикон, чуть-чуть английского и все будет окей.

1.Про расстояние: Проверить расстояние до объекта можно функцией GetDistanceToObject. Между третьими объектами - GetDistanceBetween. Сделай проверку на расстояние до атакера (игрока). Или же окружи монстра триггером и при выходе за зону тригерра - очищай список действий(ClearAllActions), и отправляй его на вэйпоинт (ActionMoveToObject).

2. Чтобы монстр появлялся в разных точках.. Сделай три разных точки. Потом сделай Интегер равный случайному числу (Random(макс. значение)). И делай проверку... Если int равен 1 - монстра в первую точку(JumpToObject на монстра или же CreateObject на той самой точке), если 2, то во вторую итд.

3. Когда у игрока здоровье от 0 до -11 - идет скрипт OnPlayerDying - правь в свойствах модуля. Так же поправь там OnPlayerDeath - некоторые сильные монстры могут так звездануть что игрок скопытится мгновенно.

4. Вещи перебросить можно таким способом. Задаешь циклический алгоритм на перебирание вещей у игрока в инвентаре (в начале функции предмет из инвентаря = GetFirstItemInInventory). Затем - CopyItem в тот самый ящик, и DestroyObject этого предмета в инвентаре у самого игрока. В конце цикла предмент из инвентаря = GetNextItemInInventory.

5. Пару золотых убрать так TakeGoldFromCreature (Кол-во золота, Игрок).

Удачи... Почитай описание функций - разберешься!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DEM
сообщение Jul 25 2005, 09:57
Сообщение #1408


Level 7
**

Класс: Маг
Характер: Lawful Neutral
Раса: Эльф



Спасибо... я бы прочитал лексикон, да вот учил не английский :vava: :swoon: :this:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 25 2005, 10:54
Сообщение #1409


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



DEM Учи. Иначе будет тяжко в скриптинге. Да там англ. базовый на уровне 5го класса.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 26 2005, 20:01
Сообщение #1410


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Привет всем. Запарился я тут с одной траблой... Есть книга Итем и есть книга плэйсебл. Я при выкладывании итема книги из инвентаря создаю плэйс на его месте. Так вот. Все работает и прочее. Но когда я выкладываю в сумке, все книги удаляются... Хоть 10 хоть 1. Никак контейнер не реагирует на мой код. Я знаю и таг его и ресреф... Видать это движковое что то. Как обмануть? Скрипт стоит на слоте модуля OnUnAcquireItem.

Neverwinter Script Source
#include "x2_inc_switches"
#include "am_inc_debug"
void main()
{
    object oItem = GetModuleItemLost(); // Сам Item объект
    object oPC = GetModuleItemLostBy(); // Тот кто выложил его
    object oItemBy =  GetItemPossessor(oItem); // Тот кому достается объект
    string sTagItem = GetTag(oItem); // Таг Item-a
    string sTagItemBy = GetTag(oItemBy); // Таг нового хозяина
    // -------------------------------------------------------------------------
    //
    // -------------------------------------------------------------------------
    if (GetStringLeft(sTagItem, 10) =="AM_IT_BOOK") // Первые 10 знаков тага книг
    {
        // ВОТ ТУТ БЫ ПРОВЕРКУ, ЧТО ТИПА ЕСЛИ КНИГА В КОНТЕЙНЕРЕ ТО return;
        location lLoc = GetLocation(oItem);
        if (!GetHasInventory(oItemBy)) // Если нет инвентаря туда, куда кладем
          {
            object oBook = CreateObject(OBJECT_TYPE_PLACEABLE, "am_plc_usedbook1", lLoc);
            // Присвоим стоку равную ResRef-у, что бы потом создать такую же книгу
            SetLocalString(oBook, "PUT_DOWN_BOOK", GetResRef(oItem));
            DestroyObject(oItem);
          }
    }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 55 56 57 58 59 > » 
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 4th May 2025 - 08:06