Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > 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, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Dana
Продолжаем разбор: =)

Написанное мной на OnDeath:
NSS
#include "NW_I0_GENERIC"
void main()
{

object oKiller = GetLastKiller();
int nLevel = GetCharacterLevel(oKiller);
if (GetXP(oKiller)  > ((((nLevel + 1) * nLevel) / 2 * 1000) - 1))
{
    SetXP(oKiller, (((nLevel + 1) * nLevel) / 2 * 1000) - 1);
    SendMessageToPC(oKiller, "Your must LEVEL UP!!!");

}
else
{
    ExecuteScript("nw_c2_default7", OBJECT_SELF);
}
}



Для мобов есть стандартная функция - "nw_c2_default7"

NSS
#include "x2_inc_compon"
#include "x0_i0_spawncond"

void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();
    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

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

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

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


Ничего не пойму sad.gif Вроде бы все работает. Сообщение о поднятии уровня появляется, но...опыт продолжает даваться. При наступлении следующего OnDeath опыт опять приходит в норму (т.е. -1 до след. апа), а затем опять дается. Млин! sad.gif
1) прошу объяснить что не так
2) прошу исправить
3) либо... уважаемый Zirrex выложит версию исправленную и дополненную...(вариант: свою с Амена)... angel.gif
4) может я что не так поняла, но опыт-то проверяется только у "object oKiller = GetLastKiller();"? и коим образом тут остальные участники пати?


Aiwan: Дана, у нас есть специальный BBкод который вставляется нажатием на букву N [nss]. Это как раз код для скриптов НВН. Добро пожаловать. biggrin.gif
Zirrex
Dana, а, стоп, в данном случае опыт будет даваться только тому, кто убил это существо. Для распределения опыта по партии, нужен скрипт иного профиля. Я так написал, потому что не знаю, как у тебя работает скрипт в самом модуле. Может быть уже есть система распределения опыта smile.gif

Не надо ExecuteScript делать, лучше уж так:
NSS
#include "x0_i0_spawncond"

void main()
{
    object oKiller = GetLastKiller();

    int nLevel = GetHitDice(oKiller);

    if (GetXP(oKiller) > ((((nLevel + 1) * nLevel) / 2 * 1000) - 1))
    {
        SetXP(oKiller, (((nLevel + 1) * nLevel) / 2 * 1000) - 1);
        SendMessageToPC(oKiller, "Your must LEVEL UP!!!");
    }
    else
    {
        // Это лишь для примера, по-настоящему нужна система распределения опыта, и желательно своя, а не стандартная
        SendMessageToPC(oKiller, "О боги, меня наградили");
        SetXP(oKiller, 100);
    }

    if (GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }
}

Остальное из скрипта "nw_c2_default7", я выкинул, потому что лишнее, и подходит больше для одиночной игры, чем для сетевого модуля. Тем более понижать мировоззрение за убийство фракции Commoner - это гм... не очень весело smile.gif

Что это - GetCharacterLevel? Есть функция - int GetHitDice(object oCreature)

Да, и не забудь поставить в модульных настройках опцию "XP Scale" в 0, если ты используешь свою систему распределения опыта. Пока она у тебя будет стоять не в 0, то скрипт выдачи опыта на действии "OnDeath" монстра работать будет не совсем верно. Он тебя ограничивает по опыту, а стандартный скрипт игры выдает опыт, минуя это условие.
Daemonix
-fenix-
Спасибо. Скоро проверю. По поводу EventActivate - там было написано, что этот объект надо активировать, вот я и подумал на него...
Dana
продолжим:
Допустим у меня система распределения опыта - всем поровну.
в представленном коде OnDeath моба, как я понимаю, происходит проверка ТОЛЬКО его oKillera.
NSS
if (GetXP(oKiller) > ((((nLevel + 1) * nLevel) / 2 * 1000) - 1))
    {
        SetXP(oKiller, (((nLevel + 1) * nLevel) / 2 * 1000) - 1);
        SendMessageToPC(oKiller, "Your must LEVEL UP!!!");
    }

следовательно надо сделать это для каждого участников пати? иначе получается, можно просто поставить чарf рядом, самому уйти спать, а в это врtмя будет идти прокач. Так?
Aiwan
Можно проверить кто убил. Если я уловил нить вопроса scratch_one-s_head.gif
NSS
if (GetXP(oKiller) > ((((nLevel + 1) * nLevel) / 2 * 1000) - 1))
    {
        if(GetIsPC(oKiller)
        {
          SetXP(oKiller, (((nLevel + 1) * nLevel) / 2 * 1000) - 1);
          SendMessageToPC(oKiller, "Your must LEVEL UP!!!");
        }
    }
dumbo
Aiwan, не, не уловил. pardon.gif

Dana, кусок прямо из Lexicon'a(с легким тюнингом):
NSS
// Get the first PC party member
    object oPartyMember = GetFirstFactionMember(oKiller, TRUE);
    // We stop when there are no more valid PC's in the party.
    while(GetIsObjectValid(oPartyMember) == TRUE)
    {
        // Do something to party member
        if (GetXP(oPartyMember) > ((((nLevel + 1) * nLevel) * 500) - 1))
        {
            SetXP(oPartyMember, (((nLevel + 1) * nLevel) * 500) - 1);
            SendMessageToPC(oPartyMember, "Your must LEVEL UP!!!");
        }
        // Get the next PC member of oPC's faction.
        // If we put anything but oPC into this, it may be a totally
        // unreliable loop!
        oPartyMember = GetNextFactionMember(oKiller, TRUE);
    }
Zirrex
dumbo, интересно, а можно еще больше эту формулу упростить? В принципе, я видел, что деление на 2, а потом умножение на 1000, лишнее, но оставил так.

Dana, я же тебе дал ссылку в ICQ. Подобный код, который написал dumbo, можно вставить внутрь такой системы распределения опыта.

В скрипте "nw_c2_default7" лишь добавится:
NSS
ExecuteScript("xp_system", oKiller);

Сама же система полностью разбирается в скрипте "xp_system". Посмотри эту систему.
Dana
Продолжим извечные «что» да «как». На повестке 2 вопроса.

1)ситуация. Как мне сделать проверку, находится ли в данной локации хотя бы один PC?
2)Посмотрите и исправьте если это требуется мой код (прыжок к лидеру). Это кольцо с уникальной силой для себя. На OnActvateItem модуля. Еще идет проверка на то, у кого находится кольцо. То есть у другого игрока оно не должно работать. (если выпадет в луте)
NSS
void main()
{
object oItem = GetItemActivated();
string sTag = GetTag(oItem );
object oPC = GetItemActivator();
object oLeader = GetFactionLeader(oPC);
location locTarget = GetLocation(oPC);
string sPlayerName = GetPCPlayerName(oPC);

//CALL_LEADER - is a tag of teleport ring with unique power for himself
    if (( sTag == "CALL_LEADER" ) && (sPlayerName == "vasya pupkin"))
    {
        if(GetIsObjectValid(oLeader) == TRUE && oLeader != oPC)
        {
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,    EffectVisualEffect(VFX_IMP_UNSUMMON), locTarget);
            ActionWait(2.0);
            ActionJumpToObject(oLeader);
        }
    }
}
Aiwan
1. Тут надо бы больше параметров. Например когда проверяем? При входе, выходе, триггер... Это просто.

2. В чем проблема?

Вопрос от меня. Что делашь? Шард?

Можно перебрать всех в локации, а можно посмотреть как делает биовар.
NSS
object GetNearestPC(object oTarget=OBJECT_SELF)
{
  object oNearestPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget);
  string sPCName = GetName(oNearestPC);
  return oNearestPC;
  }
Dana
1) проверка, когда выходит PC из локации. на OnExit наверно
2) вроде как разобралась. Надо было через AssignCommand() делать
3) да, шард. По мирам Ю.Никитина. Скриптер пока тока я, да и то начинающий smile.gif
Aiwan
NSS
void main()
{
object oPC = GetExitingObject();
object oPCin = GetFirstObjectInArea(OBJECT_SELF);
if (!GetIsPC(oPC)) return;

while (oPCin!=OBJECT_INVALID) // Пока такой объект есть
{
  if (GetObjectType(oPCin) == OBJECT_TYPE_CREATURE) // Его тип создание
  {
    if (GetIsPC(oPCin)) // если это игрок
    {
      // Тут то что ты хочешь сделать
      // если надо прервать - прерви.
    }
  }
  oPCin = GetNextObjectInArea(OBJECT_SELF); // Берем следующего в локации
  }
}
Zirrex
Можно еще так:
NSS
void main()
{
    object oPC = GetExitingObject();

    if (!GetIsPC(oPC)) return;

    int nPlayer = FALSE;

    object oPlayer = GetFirstPC();

    while (GetIsObjectValid(oPlayer))
    {
        if (GetArea(oPlayer) == OBJECT_SELF)
        {
            nPlayer = TRUE;
            break;
        }
        oPlayer = GetNextPC();
    }

    if (nPlayer)
    {
        // скрипт действия   
    }
}
Dana
Без трудностей никуда. Продолжим. Итак, ситуация: в ивентаре имеется итем дрова (синька “wood”), в палитре – плейс дрова (синька «place_wood»). Выкладывая итем дров из инвентаря, я должна получить плейс дров на земле.

OnUnAquiredItem модуля:

NSS
void main()
{
object oPC = GetModuleItemLostBy();
if (!GetIsPC(oPC)) return;
object oLostItem = GetModuleItemLost();
if (!GetIsObjectValid(oLostItem)) return;

if (GetTag(oLostItem)=="wood")
{
//выкладываем плейс дров
CreateObject(OBJECT_TYPE_PLACEABLE,"place_wood",GetLocation(oPC));
//уничтожаем итем дров
DestroyObject(oLostItem);
}
}

Казалось бы…ан нет! Итем уничтожается, но плейс дров не появляется.
[MoF]Darth_Nick
QUOTE
в ивентаре имеется итем дрова (синька ”wood”),

в том случае надо таг, а не синьку..если таг другой, то
QUOTE
if (GetTag(oLostItem)=="wood")

непрально
так..заметка
перепроверь таги и синьки, я к тому, что у меня работает всё
Dana
ниии... с тэгами все нормуль. не в этом дело sad.gif
-fenix-
Dana, я надеюсь ты в курсе, что объект создается по РесРефу?

Похоже ты хочешь сделать что-то типа отдыха. Не надо мучаться с тем, что уже есть! Посмотри в базе скриптов, там есть скрипт на отдых в дикой местности, как раз с выкладкой дров, ну и прочим.
Очень советую посмотреть темки: База скриптов, Скрипты для новичков, Вопросы и Ответы по Toolsetу.
Dana
ыыыы smile.gif как раз оттуда это и взято. там 2 источника. Очень похожи. smile.gif
а результата нет sad.gif
[MoF]Darth_Nick
http://nwcustom.jino-net.ru/upload/plc_itm_down.rar
наглядно.
береш, ложиш и появляются дрова
-fenix-
Dana, еще раз обращаю твое внимание на то, что объект создается по РесРефу! Это очень частая ошибка начинающих.
Об этом говорится в ВиО
QUOTE

ВОПРОС
CreateObject(...); - создает по Blueprint ResRef или по тэгу?

ОТВЕТЫ
CreateObject(...); - создает по Blueprint ResRef
Создавать можно только итемы, NPC, плейсы, магазины и вейпоинты.

Посмотри в модуле [MoF]Darth_Nick'а , там у дров в палитре и имя и тег и РесРеф "place_wood".
Dana
smile.gif моя вина. исправлиась. действительно делала по тэгу.
теперь все нормально. ПС дрыхнет так, что экран трясется.
Всем спасибо, все свободны... до следующей моей очередной заковырки smile.gif


И снова здравствуйте… С отдыхом все получилось, на радостях даже сделала, что бы дрова из плейсов деревьев добывать можно было smile.gif Итак, продолжим:
1) хочу, что бы при создании плейса костра и в течении всего времени что он у меня полыхает, был звук треска костра. Как я понимаю CreateObject здесь неуместен.
2)так же хочу сделать, чтобы при убийстве какого-либо животного после него оставался итем «Мясо» и через определенное время исчезал (5 сек, 10 сек…). Через инвентарь животного оно конечно остается, но не исчезает. Здесь надо делать генерируемый лут с DestoyObject?
Пока что это все, что меня интересует smile.gif
Заранее благодарна. Навеки ваша. Дана.
Lex
QUOTE(Dana @ Mar 11 2006, 12:44) [snapback]72277[/snapback]
2)так же хочу сделать, чтобы при убийстве какого-либо животного после него оставался итем «Мясо» и через определенное время исчезал (5 сек, 10 сек…). Через инвентарь животного оно конечно остается, но не исчезает. Здесь надо делать генерируемый лут с DestoyObject?

описывалось недавно как это делать. Удаление с указаной задержкой делается в скрипте onDeath. Сначала отчистка инвенторя, потом удаление плейса.
Chess
Еще раз вынужден просить помощи, я уже писал этот вопрос, но не кто не помог, умельцы, подскажите мне ПЛИЗ, как убрать этого пацана, Link Boy его завут, который появляется, когда спать ложишься ? И потом продолжает бегать за тобой с факелом !
И еще, что-нибудь про систему лута, процент выпадения данной вещи из данного моба например, хотяб примерно, как написать такой скрипт ?
Isendel
Брр, ты вообще откуда этого Линк Боя достал? Или он появляется, когда ты в реале спать ложишься, и бегает за тобой с факелом? ph34r.gif crazy.gif

Думаю, с этим вопросом было бы уместнее обратиться сюда - http://www.wrg.ru/forums/index.php?showforum=3
-fenix-
QUOTE(Chess @ Mar 11 2006, 21:03) [snapback]72324[/snapback]
Еще раз вынужден просить помощи, я уже писал этот вопрос, но не кто не помог, умельцы, подскажите мне ПЛИЗ, как убрать этого пацана, Link Boy его завут, который появляется, когда спать ложишься ? И потом продолжает бегать за тобой с факелом !

Эт хто такой и где? shok.gif

QUOTE(Chess @ Mar 11 2006, 21:03) [snapback]72324[/snapback]
И еще, что-нибудь про систему лута, процент выпадения данной вещи из данного моба например, хотяб примерно, как написать такой скрипт ?

Самое простое, это задать шанс выпадения фиксированного шмота. Тобишь ты указываешь в скрипте все шмотки, которые могут выпасть из чела, а потом ставешь для каждой процент.
Вот скажем так на смерть НПС
NSS
void main()
{
string s1 = "РесРеф_первого_итема";
string s2 = "РесРеф_второго_итема";

//Random генерирует случайные числа от 0 до 3, то есть выбирает из четырех чисел.
//мы ставим условие, чтоб объект создавался если выпадет "2", то есть 1 из 4, то есть шанс 25%
if(Random(4)==2)
CreateItemOnObject(s1);
//аналогично
if(Random(4)==2)
CreateItemOnObject(s2);
}

А вот нормальная систему лута сложнее. Тут надо все вещи разбивать по группам: мечи, щиты, копья..., хорошее состоянее, плохое... и прочее. И условия выпада соответственные.
Посмотри в форуме шардов, там вроде есть примеры.
Zirrex
Dana, звук такой же объект, как и все остальные. Его можно поставить в точку появления костра, и после сна удалять. Только я все же больше склоняюсь ко сну, в котором не нужно создавать костер с помощью дров, ибо маг, друид, и т.п. классы, таскать с собой дрова, и тем более рубить дерево топориком, который они даже в руки взять не могут, не очень здорово. Старая идея, которая очень давно была реализована на Экзисе. Причем по сей день жива на некоторых шардах. Если честно, такая идея несколько банальна. Лучше сделать места по всей территории мира, где можно спать. Например, на Мидгарде можно было спать только около костров. Единственный недостаток, костры горели вечно, даже если рядом никого не было. Но такой уж объект. К сожалению поменять ему ключ "горит - не горит" нельзя.

По поводу второго, посмотри внимательно мое сообщение.

Chess, днем тебе представлю простенький код по системе лута, а ты уж сам его расширишь.
Chess
Isendel, Не смешно !

Zirrex, Спасибо !

-fenix-, Спасибо, понятно объяснил ! Буду пробовать расширить, тока дождусь скрипт Zirrexa !!!
Lex
QUOTE(Zirrex @ Mar 12 2006, 03:52) [snapback]72368[/snapback]
Dana, звук такой же объект, как и все остальные. Его можно поставить в точку появления костра, и после сна удалять.

кинь скрипт по созданию звука из палитры в указанной точке. CreateObject отказывается звуки делать.
Dana
Доброго времени суток.

1) Действительно хотелось бы посмотреть на скрипт по CreateObject для звука smile.gif

2) Дровишки же добывать можено и без топорика – благо у всех есть руки, а деревца-то суховатенькие у меня. Наломают в 5 секунд, грынпысовцы.Ыыыы. smile.gif
Дык.. промблема: деревца-то ломаются..(дестроятся), но… как мне сделать, что бы они опять потом респились через N-ный промежуток времени? Дабы не закончились дровишки на шарде smile.gif Что-то на событие OnUsed (когда дерево превращается…дерево превращается..превращается…в элегантную вязанку дровишек. Детроится одним словом), CreateObject не хочет становиться.

Кусочек кода на OnUsed плейса дерева (РесРеф дерева - deadtree001, woodpile001 - дровишки)

NSS
void main()
{
object oPC = GetLastUsedBy();
object oTree = OBJECT_SELF;
    if (GetIsPC(oPC)==TRUE)
    {
    AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0));
    CreateObject(OBJECT_TYPE_PLACEABLE,"woodpile001",GetLocation(oTree));
    DelayCommand(100.0, CreateObject(OBJECT_TYPE_PLACEABLE,"deadtree001",GetLocation(OBJECT_SELF),TRUE));//это должен быть респаун дерева
    DestroyObject(oTree);
    }
}


пишет, что декларация не соответствует описанию.
Справляйте меня smile.gif


Забыла smile.gif
В тулсете можно на НПС повесить крылья (демона, ангела и т.д.). Можно ли так сделать для ПС? Допустим на доспехи или еще-как-нить? Вот, к пирмеру у Ученика Красного Дракона по-моему имеются крылышки.
Lex
классическая ошибка.. CreateObject нельзя засунуть в DelayCommand. Обойти можно так:
NSS
void CreateObjectVoid(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{
CreateObject(nObjectType,sTemplate,lLocation,bUseAppearAnimation,sNewTag);
}
void main()
{
object oPC = GetLastUsedBy();
object oTree = OBJECT_SELF;
    if (GetIsPC(oPC)==TRUE)
    {
    AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0));
    CreateObject(OBJECT_TYPE_PLACEABLE,"woodpile001",GetLocation(oTree));

    DelayCommand(100.0, CreateObjectVoid(OBJECT_TYPE_PLACEABLE,"deadtree001",GetLocation(OBJECT_SELF),TRUE));
    DestroyObject(oTree);
    }
}


однако это все равно не сработает. Ты вешаешь на объект операцию, а объект удаляешь. Так что операция у тя тож пропадет. Самый простой тут вариант это..хм.. ну скажем так:
NSS
void CreateObjectVoid(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{
CreateObject(nObjectType,sTemplate,lLocation,bUseAppearAnimation,sNewTag);
}
void main()
{
object oPC = GetLastUsedBy();
object oTree = OBJECT_SELF;
    if (GetIsPC(oPC)==TRUE)
    {
    AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0));
    CreateObject(OBJECT_TYPE_PLACEABLE,"woodpile001",GetLocation(oTree));
    AssignCommand(GetArea(OBJECT_SELF),DelayCommand(100.0, CreateObjectVoid(OBJECT_TYPE_PLACEABLE,"deadtree001",GetLocation(OBJECT_SELF),TRUE)));
    DestroyObject(oTree,1.5);
    }
}

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

Dana, крылья этому классу прописаны в 2da. Если ты хочешь каким-то классам, хотя бы субрасам, добавить крылья, то надо это прописать в том же 2da. Сам хочу подобное сделать, да все не соберусь, иных проблем в модуле хватает.

Не обязательно в дерево сразу помещать объект дров. Их можно случайным образом оставлять в "теле" в момент уничтожения дерева. Например, игрок уничтожил дерево, осталось 2-3 кусочка дерева. И при каждом уничтожении их будет разное количество. Как судьба улыбнется smile.gif

Что касается скрипта, не стоит вешать такой код на условие "OnUsed", если уж и делать подобный код, то на действие "OnDeath". Как правильно написал Lex, сделай свою функцию, которая будет срабатывать через определенный промежуток времени. Мне так пришлось делать с функцией "CopyObject". Тоже не признает задержки, однако своя функция c командой "DelayCommand" работает идеально:

NSS
void CopyItems(object oItem, location lLocation, object oOwner, string sTag)
{
    CopyObject(oItem, lLocation, oOwner, sTag);
    DelayCommand(0.1, DestroyObject(oItem));
}

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

В принципе, у меня есть иная идея, но пока что не опробованная скриптово. Сделать систему спавна объектов, которые исчезают с локации. При входе и выходе игрока с локации, проверять, есть ли эти объекты вообще. Одно но, чтобы не делать кучу объектов, деревьям надо давать уникальные тэги в момент их создания. Т.е., например, деревьев на всей локации 20. Первое дерево именуем так "tree_01", далее 02, 03 и т.д. Но я не говорю о том, что надо делать в палитре 20 объектов одного и того же дерева, а лишь менять тэг одному объекту в момент создания дерева. Иначе говоря, тебе придется создавать все деревья в момент первого входа персонажа на локацию с деревьями, а не размещать их заранее в редакторе. В редакторе придется только сделать точки появления для деревьев, чтобы в дальнейшем на них создать деревья. Чтобы деревья не смотрели все в одну сторону (обычно всегда их случайно кручу, чтобы придать локации уникальность), в скрипте надо случайно указывать направление в момент размещения объекта.

Далее, когда дерево уничтожат, при переходе игрока с локации на локацию, проверить, какого дерева не хватает. Если такое найдется, пересоздать его с тем тэгом, который освободится.
Lex
QUOTE(Zirrex @ Mar 12 2006, 03:52) [snapback]72368[/snapback]
Dana, звук такой же объект, как и все остальные. Его можно поставить в точку появления костра, и после сна удалять.

© ты smile.gif

а вообще..
в данном варианте с костором проигрывать звук конечно можно, но фигово это. Не знаешь время, звук проигрывается для кого-то и тд. Есть конечно вариант ставить звук в локации изначально (который на всю локацию) и включать/выключать его при зажигании/тушении костра. Но это тоже криво smile.gif
Zirrex
Lex, о чем и речь. Именно так у меня в модуле и срабатывает один звук при определенном действии. И что странно, он звучит столь тихо (хотя игрок находится в одном шаге от источника), что его купол пришлось сделать чуть ли не на всю локацию. То ли просто сам звук тихий, то ли ему нужно скриптово громкость менять.

Я просто подумал, ведь НПС и игроки могут издавать звуки, то почему аналогичный звук не может издавать костер? Хотя, если уж быть честным, было бы проще, если у объектов можно было выставлять различные звуки в их свойствах.
Aiwan
QUOTE(Lex @ Mar 13 2006, 05:22) [snapback]72487[/snapback]
Есть конечно вариант ставить звук в локации изначально (который на всю локацию) и включать/выключать его при зажигании/тушении костра. Но это тоже криво

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

Тоже все сижу и жду код, как креетить звук на локе. biggrin.gif

QUOTE(Zirrex @ Mar 13 2006, 12:20) [snapback]72515[/snapback]
Именно так у меня в модуле и срабатывает один звук при определенном действии. И что странно, он звучит столь тихо (хотя игрок находится в одном шаге от источника), что его купол пришлось сделать чуть ли не на всю локацию. То ли просто сам звук тихий, то ли ему нужно скриптово громкость менять.

Тут я что-то не догнал. pardon.gif Моя лошадь как всегда позно скачет. О чем? Подробней... Вопрос просто тоже важнецкий.
Existor
QUOTE(Zirrex @ Mar 13 2006, 10:20) [snapback]72515[/snapback]
И что странно, он звучит столь тихо (хотя игрок находится в одном шаге от источника), что его купол пришлось сделать чуть ли не на всю локацию. То ли просто сам звук тихий, то ли ему нужно скриптово громкость менять.

В нвне, афаик, на громкость точечного источника звука влияет не только положение чара, а еще и положение камеры относительно центра сферы звучания. Так как большинство игроков предпочитают отдалять камеру на максимум, они зачастую пропускают мимо ушей звуковое оформление локации.
Я предпочитаю по этому поводу не беспокоиться. Кому надо, тот итак все услышит и оценит.
Dana
Возможно немножко не туда пишу, но не судите строго. Коротко мне в двух строчках о работе с форматом 2da. Нашла прогу для данного формата. Как я понимаю, мне нужне файл 2dasource.zip. Выбираю там интересующий меня фалик. чего-то там меняю, а потом...?
что потом то? никуда не надо? в override или хак какой-нить?
З.Ы. не стирайте это сообщение с этого топика )) я и так устала по форуму прыгать.
maximal_up
Dana, на форуме есть раздел, посвящённый 2да. В двух словах это не описать. Каждой таблице сответствует определённый тип параметров. Т.е. в одной таблице описывается оружие, в другой классы, в третьей портреты и т.п.

Читайте тут: http://www.wrg.ru/forums/index.php?showforum=24
Там можно найти очень много полезного.
[MoF]Darth_Nick
2dasource.zip - не советую, выдерй nwn explorer'ом каким-нить из патченного\простого ХОТУ.
прога не обязательна, пойдет и ворд пад\блокнот
оверрайд - для себя, хак - для шарда\сервера
Aiwan
QUOTE(Existor @ Mar 13 2006, 16:40) [snapback]72536[/snapback]
В нвне, афаик, на громкость точечного источника звука влияет не только положение чара, а еще и положение камеры относительно центра сферы звучания. Так как большинство игроков предпочитают отдалять камеру на максимум, они зачастую пропускают мимо ушей звуковое оформление локации.

Меня интересует другое. КАК СКРИПТОМ СОЗДАТЬ ЗВУКОВОЙ ОБЪЕКТ НА ЛОКЕ.
Zirrex
Chess, система конечно не идеальна, но на ее основе можно сделать неплохую систему дропа различных вещей. Самое главное, это формула, а остальное уже гораздо проще. Данный пример рассматривает дроп металлической краски с довольно маленьким шансом выпадения. Чтобы увеличить шанс, достаточно изменить величину "DROPPROCENT" или же число 1.4. Одно но, я старался подобрать число 1.4 таким образом, чтобы получаемый шанс не вылезал за 0 или 100. Конечно, если монстр 40 уровня, а персонаж 1-го уровня, то число уйдет в минус, но тогда число нужно пересчитать таким образом, чтобы даже при такой разнице в уровнях число не уходило в минус. При числе 0.43 и максимальном уровне 20, число даже при разнице в уровнях 1 к 20 не будет уходить в минус. Также величина этого числа зависит, насколько сильно будет изменяться шанс по мере роста персонажа над уровнем монстра или наоборот.

NSS
int GetIsMonsterDrop(object oOwner)
{
    object oMod = GetModule();

    object oKiller = GetLastKiller();

    int nLevelP = GetHitDice(oKiller);
    int nLevelM = GetHitDice(OBJECT_SELF);

    float fChance = IntToFloat(GetLocalInt(oMod, "DROPPROCENT")); // к примеру - 55

    // Расчет случайного числа
    float fRandom = IntToFloat(Random(100)) + (IntToFloat(Random(100)) / 100.00);
    // Подсчет разницы в уровнях между персонажем и противником
    float fLevel = (IntToFloat(nLevelP) - IntToFloat(nLevelM));
    float fConst = (fLevel * fLevel);
    // Расчет основного шанса выпадения
    float fProcent = ((fChance - (1.4 * fConst)) + IntToFloat(Random(100))) / 100.00;

    if (fProcent >= fRandom)
    {
        return TRUE;
    }
    return FALSE;
}

void main()
{
    object oKiller = GetLastKiller();
    object oCreature = OBJECT_SELF;

    if (GetLastKiller() == oCreature) return;

    if (GetRacialType(oCreature) == RACIAL_TYPE_ANIMAL ||
        GetRacialType(oCreature) == RACIAL_TYPE_ABERRATION ||
        GetRacialType(oCreature) == RACIAL_TYPE_MAGICAL_BEAST ||
        GetRacialType(oCreature) == RACIAL_TYPE_BEAST ||
        GetRacialType(oCreature) == RACIAL_TYPE_VERMIN)
    {
        SetIsDestroyable(FALSE, FALSE, FALSE);
        DelayCommand(1.0, SetIsDestroyable(TRUE, FALSE, FALSE));
    }
    else
    {
        // Простые функции, которые запрещают на некоторое время
        // исчезновение трупа.
        SetIsDestroyable(FALSE, FALSE, FALSE);
        DelayCommand(30.0, SetIsDestroyable(TRUE, FALSE, FALSE));

        // Расчет шанса выпадения
        if (GetIsMonsterDrop(oKiller))
        {
            int nDye = Random(17) + 1;

            switch (nDye)
            {
                case 1: CreateItemOnObject("x2_it_dyeM03", oCreature); break;
                case 2: CreateItemOnObject("x2_it_dyeM00", oCreature); break;
                case 3: CreateItemOnObject("x2_it_dyeM31", oCreature); break;
                case 4: CreateItemOnObject("x2_it_dyeM16", oCreature); break;
                case 5: CreateItemOnObject("x2_it_dyeM40", oCreature); break;
                case 6: CreateItemOnObject("x2_it_dyeM28", oCreature); break;
                case 7: CreateItemOnObject("x2_it_dyeM24", oCreature); break;
                case 8: CreateItemOnObject("x2_it_dyeM32", oCreature); break;
                case 9: CreateItemOnObject("x2_it_dyeM18", oCreature); break;
                case 10: CreateItemOnObject("x2_it_dyeM10", oCreature); break;
                case 11: CreateItemOnObject("x2_it_dyeM42", oCreature); break;
                case 12: CreateItemOnObject("x2_it_dyeM02", oCreature); break;
                case 13: CreateItemOnObject("x2_it_dyeM25", oCreature); break;
                case 14: CreateItemOnObject("x2_it_dyeM37", oCreature); break;
                case 15: CreateItemOnObject("x2_it_dyeM08", oCreature); break;
                case 16: CreateItemOnObject("x2_it_dyeM36", oCreature); break;
                case 17: CreateItemOnObject("x2_it_dyeM48", oCreature); break;
            }
        }
    }
}


Aiwan, а почему бы не попробовать эту функцию? Если посмотреть описание функции "SoundObjectSetPosition":
QUOTE

This function can be used to change the position of the sound object that is placed in the module. For instance, a sound of moaning could be placed on a player when they open a chest.

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

NSS
void main()
{
    vector vPlayer = GetPosition(GetLastDisturbed());
    // location in vector format
    object mySound = GetObjectByTag("CryptMoans");
    SoundObjectSetPosition(mySound, vPlayer);
}

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

Когда загорается костер, помещать звук в точку, где стоит игрок, и проигрывать до тех пор, пока игрок спит. Идея не опробована, но чем черт не шутит?
Chess
Zirrex, примного благодарен ! Буду разбераться !

NSS
void main()
{
    object oMod = GetModule();
    object oPC = GetEnteringObject();
      if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME"))
      {return;}
      {
  SetLocalInt(oMod, "START_GAME", TRUE);
  TakeGoldFromCreature(GetGold(oPC),oPC,TRUE);
        object oItem = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItem))
        {
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC);
        }

        int i=0;
        while(i<14)
        {
        DestroyObject(GetItemInSlot(i, oPC));
        i++;
        }
        object oItemCr = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItemCr))
            {
            SetIdentified(oItemCr,TRUE);
            oItemCr = GetNextItemInInventory(oPC);
            }

        GiveGoldToCreature(oPC, 250);
        CreateItemOnObject("item", oPC, 1);
        CreateItemOnObject("item001", OPc, 1);
        AssignCommand(oPC, ActionEquipMostEffectiveArmor());
        }
        }

Этот скрипт у меня стоит на OnEnterClient, вот проблема, когда я перезапускаю сервак, он выполняет этот скрипт по новой... Подскажите, как исправить, чтоб этот скрипт выполнялся всего один раз, при первом входе в модуль...
Zirrex
Chess, убери "GetLocalInt(oMod, "START_GAME")". Это лишнее. Когда рестартуется сервер, то у тебя эта переменная сбрасывается в 0. Даже если у входящего персонажа опыт не 0, но переменная 0, то скрипт выполнится. Соответственно не нужна функция "SetLocalInt(oMod, "START_GAME", TRUE);"

Не совсем понял, зачем тебе этот цикл:
NSS
object oItemCr = GetFirstItemInInventory(oPC);

while(GetIsObjectValid(oItemCr))
{
    SetIdentified(oItemCr,TRUE);
    oItemCr = GetNextItemInInventory(oPC);
}

если ты верхней командой и так все удалил из инвентаря. В итоге получается что-то вроде этого скрипта:

NSS
void main()
{
    object oPC = GetEnteringObject();

    if (GetIsDM(oPC)) return;

    if (!GetXP(oPC)) // опыт равен 0
    {
        TakeGoldFromCreature(GetGold(oPC), oPC, TRUE);

        object oItem = GetFirstItemInInventory(oPC);

        while (GetIsObjectValid(oItem))
        {
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC);
        }

        int i = 0;

        while (i < 15)
        {
            DestroyObject(GetItemInSlot(i, oPC));
            i++;
        }

        GiveGoldToCreature(oPC, 250);

        CreateItemOnObject("item", oPC, 1);
        CreateItemOnObject("item001", oPC, 1);

        SetXP(oPC, 1);

        AssignCommand(oPC, ActionEquipMostEffectiveArmor());
    }
}
Lex
со скриптами в соотв. тему плиз.
-fenix-
QUOTE(Zirrex @ Mar 13 2006, 22:52) [snapback]72582[/snapback]
Правда, звук предварительно придется разместить на закрытой локации, которая служит для хранения каких-либо вещей или просто для теста.

При этом мы не видим в параметрах функции oArea, а в лексиконе читаем "assumes CryptMoans Sound is placed nearby this script placed in the OnDisturbed section of the chest"!!!
Вариант тут один - в каждой локе ставить данный звук.
Aiwan
Zirrex, черти сколько бился. Уже надоело давно. Думал есть готовое решение. В любом случае спасибо за инфу.
Chess
Возможно ли написать скрипт, который при загрузке в локу определенную, сканировал чара на класс, фокусировку на оружие, и загружал скрипт на выдачу рандомного шмота, но по результатам сканирования, например Воин с фокусом на топор, загружаешься в локу, у воина в инвентаре Тяжелая Броня и Топор.
З.Ы. это просто вопрос, скрипты не обязательны, сам подумаю если такое возможно, а от подсказок не откажусь :-)
Archangel
QUOTE(Chess @ Mar 14 2006, 22:03) [snapback]72686[/snapback]

Возможно ли написать скрипт, который при загрузке в локу определенную, сканировал чара на класс, фокусировку на оружие, и загружал скрипт на выдачу рандомного шмота, но по результатам сканирования, например Воин с фокусом на топор, и после загрузке в локу у тебя в рюкзаке лежит Фулик и топор ?
З.Ы. это просто вопрос, скрипты не обязательны, сам подумаю если можно, а от подсказок не откажусь :-)

Ну, если это только вопрос... То тогда ответ положительный. Да, можно.
Надо написать скриптик и поставить его на OnEnter локи.
Тока локалку не забудь, а то будешь давать предметы каждый раз при входе в локу.
Ну, а если вдруг все таки понадобится скрипт, то это не ко мне.
Не, ну, конечно, я могу вдоволь постебаться над собой во время его написания. Но себя жалко. И инет, которого вообще нету нифиха...biggrin.gif
Chess
Не боись Archangel, не потривожу :-)
Но спасибо, что ответил на вопрос...





Извините за очень тупой вопрос, но может есть у кого ссылочка или на компе перевод Функций Тулсета ?
С Инглишем туган, всю жизнь немецкий учил, я пытаюсь конечно разбираться, словарь из рук не убераю,
но не все есть в словаре... Хотяб самые основные функции, если не сложно...
Archangel
QUOTE(Chess @ Mar 15 2006, 00:16) [snapback]72696[/snapback]

Извините за очень тупой вопрос, но может есть у кого ссылочка или на компе перевод Функций Тулсета ?
С Инглишем туган, всю жизнь немецкий учил, я пытаюсь конечно разбираться, словарь из рук не убераю,
но не все есть в словаре... Хотяб самые основные функции, если не сложно...

Ну как такового перевода вроде нет. А вообще на сайте есть часть переведенного Лексикона. Должно помочь.
Вот ссылочка
azathoth
QUOTE(Chess @ Mar 14 2006, 20:03) [snapback]72686[/snapback]
Возможно ли написать скрипт, который при загрузке в локу определенную, сканировал чара на класс, фокусировку на оружие, и загружал скрипт на выдачу рандомного шмота, но по результатам сканирования, например Воин с фокусом на топор, загружаешься в локу, у воина в инвентаре Тяжелая Броня и Топор.


Ответ: Возможно.

А если без шуток, то писать его довольно долго, если учитывать все варианты соответствия оружия-классов-фитов. Свой я посеял, а новый писать - кучу времени нужно. Вот советы:
1. Вместо проверки на класс делай проверку на Weapon/Armor Proficiency, так как их можно взять дополнительно фитом или получить от расы.
2. Не забудь про размер (Size category) рас, так, например, пузаны и гномы не смогут тягать косу.
3. В НВН, да и в D&D вообще вариант меч+щит выигрывает перед двуручниками и дуалом (да и щитом могут пользоваться не все).

В первой кампании НВН был подобный скрипт, но он учитывал только фокус на оружия, увеличивая шанс попадания в сундук предпочитаемого орудия убийства. Может быть стоит сделать нечто подобное? А для брони и щита много писать не надо.
[MoF]Darth_Nick
QUOTE
А если без шуток, то писать его довольно долго

правда? 19 строк занимает ф-ция, которая возвращает фокус на оружие(если фокус есть ессенно)

NSS
int dnGetWF(object oPC)
{
    if(GetHasFeat(FEAT_WEAPON_FOCUS_CLUB ,oPC))
        return FEAT_WEAPON_FOCUS_CLUB ;
    if(GetHasFeat(FEAT_WEAPON_FOCUS_DWAXE,oPC))
        return FEAT_WEAPON_FOCUS_DWAXE;
    if(GetHasFeat(FEAT_WEAPON_FOCUS_WHIP,oPC))
        return FEAT_WEAPON_FOCUS_WHIP;

    int i;

    for(i=90; i<128; i++)
    {
        if(GetHasFeat(i,oPC))
            return i;
    }

    return FALSE;
}


QUOTE
если учитывать все варианты соответствия оружия-классов-фитов

зачем? не когда не видел игроков трятящих фиты просто так

QUOTE
сканировал чара на класс

NSS
// A creature can have up to three classes.  This function determines the
// creature's class (CLASS_TYPE_*) based on nClassPosition.
// - nClassPosition: 1, 2 or 3
// - oCreature
// * Returns CLASS_TYPE_INVALID if the oCreature does not have a class in
//   nClassPosition (i.e. a single-class creature will only have a value in
//   nClassLocation=1) or if oCreature is not a valid creature.
int GetClassByPosition(int nClassPosition, object oCreature=OBJECT_SELF)


© toolset

QUOTE
и загружал скрипт на выдачу рандомного шмота, но по результатам сканирования, например Воин с фокусом на топор

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