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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 55 56 57 58 59 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
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);
          }
    }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 26 2005, 22:00
Сообщение #1411


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

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



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

Простое условие:
Neverwinter Script Source
if (GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX) return;

не действует? Ведь в данном случае ты выкладываешь не книгу, а сумку, и она уже является объектом "oItem".
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 27 2005, 05:01
Сообщение #1412


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

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



Zirrex не работает :( я уже пробовал...
Neverwinter Script Source
if (GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX) return;

К тому же если в инвентаре три книги, то скрипт запустится три раза. Где-то ответ должен быть... Не хотелось бы прятать от игрока сумки.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 27 2005, 09:31
Сообщение #1413


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

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



Aiwan, собственно, с какой стати, это же не цикл. У меня в модуле выкладывается тело из инвентаря, и при выкладывании тут же создается невидимый объект, куда тело и вкладывается. Лежит себе спокойно и не удаляется ничего. Правда, у меня условие, что если выкладываются такие-то тэги, то ничего с ними не делать. Но тут ведь первой выкладывается всегда сумка, почему этот скрипт берет в расчет вещи в ней, хм...

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

Забавно, одна только эта команда "!GetHasInventory" уже должна тормозить скрипт, но видимо она тормозит на сумке, но выполняется на остальных вещах. А если делать проверку на сумку не в самом скрипте, а снаружи?

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

Сообщение отредактировал Zirrex - Jul 27 2005, 09:33
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 27 2005, 14:15
Сообщение #1414


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

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



Zirrex , спасибо. Я уже сам разобрался. Короче работает это так:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnItemUnAcquireScript  am_mod_unacquire
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  OnItemUnAcquireScript
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 26.07.2005
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "am_inc_debug"
void main()
{
    object oItem = GetModuleItemLost(); // Сам Item объект
    object oPC = GetModuleItemLostBy(); // Тот кто выложил его
    object oPossessor = GetItemPossessor(oItem); // Тот кому достается объект
    string sTagItem = GetTag(oItem); // Таг Item-a
    string sTagPossessor = GetTag(oPossessor); // Таг нового хозяина
    // -------------------------------------------------------------------------
    //
    // -------------------------------------------------------------------------
    if (GetStringLeft(sTagItem, 10) =="AM_IT_BOOK") // Первые 10 знаков тага книг
    {
    if (sTagPossessor == GetTag(GetArea(oItem)) ||
        GetObjectType(oPossessor) == OBJECT_TYPE_PLACEABLE)
        {
          return;
        }
          else
        {
          object oBook;
          location lLoc = GetLocation(oItem);
          oBook=CreateObject(OBJECT_TYPE_PLACEABLE, "am_plc_usedbook1", lLoc);
          // Присвоим строку равную ResRef-у, что бы потом создать такую же книгу
          SetLocalString(oBook, "PUT_DOWN_BOOK", GetResRef(oItem));
          DestroyObject(oItem);
        }
    }
}


Как работает этот код я не могу понять, так как определить объект которому принадлежат книги после того как онтейнер выложен НЕВОЗМОЖНО. Мож я туплю :xz: Но шкаф, получаемый книги дебагится, а объект кому отдаем книги кладя на землю сумку нет. Вот от этого и вся байда. Не знаю почему, но работает вот этот код... :crazy: два дня с утра до вечера я мучался :lol: :lol:

Neverwinter Script Source
if (sTagPossessor == GetTag(GetArea(oItem)) ||
        GetObjectType(oPossessor) == OBJECT_TYPE_PLACEABLE)
        {
          return;
        }

Добавлено в [mergetime]1122463094[/mergetime]
Итог: итем можно класть в ящики, сундуки и сумку на локу и просто. Если чисто сам итем кладешь на локу то он десторится и получается плейс. Ну а превратить обратно его в книгу-итем 5 секунд.
Добавлено в [mergetime]1122463375[/mergetime]
Странно, но при такой проверке ареа не пеленгуется как получатель итема... И при поклаже сумки не пеленгуется, но проверяется :D Мда.
Добавлено в [mergetime]1122467318[/mergetime]
Neverwinter Script Source
if (sTagPossessor == GetTag(GetArea(oItem)) ||
        GetObjectType(oPossessor) == OBJECT_TYPE_PLACEABLE ||
        GetObjectType(oPossessor) == OBJECT_TYPE_STORE ||
        GetIsAssociate(oPC, oPossessor))
        {
          return;
        }

Еще надо на магазин и хеньчей проверить... Теперь все пахаеть как часы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 27 2005, 16:13
Сообщение #1415


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

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



У меня почемуто в кутсценке один NPC не хочет говорить фразы. Все действия совершает, а фраза над ним не появляется, однако она отображается в информационном окне(или как оно правельно называется). Пишу через DelayCommand-> AssignCommand-> SpeakString.
Над другими NPC фраза отображается, в чем тут дело?
Привести скрипт не могу, ибо пишу сценку на конкурс.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 27 2005, 21:35
Сообщение #1416


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

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



-fenix-, а ты сделай "ActionSpeakString". И внимательно проверь, верен ли объект, которого ты просишь произнести фразу.

Aiwan, я обычно такое дерево использую, чтобы не строить большое условие:

Neverwinter Script Source
void DropItemDestroy(object oItem)
{
    if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem))))
    {
        DestroyObject(oItem);
    }
}

void ActionDropItem(object oItem, object oPC, object oPossessor)
{
    switch (GetObjectType(oPossessor))
    {
        // Передать вещь существу
        case OBJECT_TYPE_CREATURE: break;

        // Продать вещь
        case OBJECT_TYPE_STORE: SetLocalInt(oItem, "ASG_PWCLEANSTORE", TRUE); break;

        // Положить вещь в контейнер
        case OBJECT_TYPE_PLACEABLE: break;

        // Выбросить вещь на локацию
        default:
        if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem))))
            DelayCommand(60.0, DropItemDestroy(oItem));
        break;
    }
}

void main()
{
    object oItem = GetModuleItemLost();
    object oPC = GetModuleItemLostBy();
    object oPossessor = GetItemPossessor(oItem);

    ActionDropItem(oItem, oPC, oPossessor);
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 27 2005, 22:00
Сообщение #1417


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

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



QUOTE (Zirrex @ Jul 27 2005, 21:35)
-fenix-, а ты сделай "ActionSpeakString". И внимательно проверь, верен ли объект, которого ты просишь произнести фразу.

И с ней не делает И тег я раз 10 проверял!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Мефистофель
сообщение Jul 28 2005, 01:27
Сообщение #1418


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

Класс: Страж Тьмы
Характер: Lawful Good
Раса: Баатезу



-fenix-
Сделай лучше так. есть ряд преимуществ. Можно добавить голос, можно добавить анимацию.
диалог заранее напиши. а тег в скрипт поставиш.
DelayCommand(3.5, AssignCommand(oNPC, ActionStartConversation(oNPC, "Тег диалога", FALSE,FALSE)));

Добавлено в [mergetime]1122503616[/mergetime]
Люди помогите позарез нужен скрипт на смерть босса.
Значит так когда босс будет присмерти пойдёт кутсцена.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 28 2005, 08:53
Сообщение #1419


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

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



Мефистофель, самое простое, найти сценку, когда ты сражаешься в одиночной версии игры с Арибет. Помнишь момент, ты ее бьешь, у нее становится мало жизни, и тут она просит о пощаде, бой обрывается, Арибет завязывает диалог. Посмотри, как там сделано, и выполни по оригиналу, только c использованием кутсцены.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 28 2005, 13:38
Сообщение #1420


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

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



QUOTE (Мефистофель @ Jul 28 2005, 01:27)
-fenix- Сделай лучше так. есть ряд преимуществ. Можно добавить голос, можно добавить анимацию. диалог заранее напиши. а тег в скрипт поставиш. DelayCommand(3.5, AssignCommand(oNPC, ActionStartConversation(oNPC, "Тег диалога", FALSE,FALSE)));

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

Мефистофель использовать ActionStartConversation в кутсценах, можно только иногда. Скажем у меня есть 15 отдельныйх фраз для NPC и там звуки с движениями на них. Это мне нужно сделать 15 веток в разговоре! А если мне вдруг не понравился звук или движение или опечатка в словах - это мне надо выходить в редактор разговора и там все править! К тому же скорость и длительность анимации там установленны кажись по дефолту. Короче уж лучше я все это в коде буду писать, так оно ИМХО удобнее!!!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 14th July 2025 - 16:16