![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2451
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
Продолжаем разбор: =)
Написанное мной на 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); } Ничего не пойму (IMG:style_emoticons/kolobok_light/sad.gif) Вроде бы все работает. Сообщение о поднятии уровня появляется, но...опыт продолжает даваться. При наступлении следующего OnDeath опыт опять приходит в норму (т.е. -1 до след. апа), а затем опять дается. Млин! (IMG:style_emoticons/kolobok_light/sad.gif) 1) прошу объяснить что не так 2) прошу исправить 3) либо... уважаемый Zirrex выложит версию исправленную и дополненную...(вариант: свою с Амена)... (IMG:style_emoticons/kolobok_light/angel.gif) 4) может я что не так поняла, но опыт-то проверяется только у "object oKiller = GetLastKiller();"? и коим образом тут остальные участники пати? Aiwan: Дана, у нас есть специальный BBкод который вставляется нажатием на букву N [nss]. Это как раз код для скриптов НВН. Добро пожаловать. (IMG:style_emoticons/kolobok_light/biggrin.gif) Сообщение отредактировал Aiwan - Mar 5 2006, 22:13 |
![]()
Сообщение
#2452
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
Dana, а, стоп, в данном случае опыт будет даваться только тому, кто убил это существо. Для распределения опыта по партии, нужен скрипт иного профиля. Я так написал, потому что не знаю, как у тебя работает скрипт в самом модуле. Может быть уже есть система распределения опыта (IMG:style_emoticons/kolobok_light/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 - это гм... не очень весело (IMG:style_emoticons/kolobok_light/smile.gif) Что это - GetCharacterLevel? Есть функция - int GetHitDice(object oCreature) Да, и не забудь поставить в модульных настройках опцию "XP Scale" в 0, если ты используешь свою систему распределения опыта. Пока она у тебя будет стоять не в 0, то скрипт выдачи опыта на действии "OnDeath" монстра работать будет не совсем верно. Он тебя ограничивает по опыту, а стандартный скрипт игры выдает опыт, минуя это условие. |
![]()
Сообщение
#2453
|
|
Level 10 ![]() ![]() ![]() Класс: Мастер Оружия Характер: Lawful Good Раса: Человек ![]() |
-fenix-
Спасибо. Скоро проверю. По поводу EventActivate - там было написано, что этот объект надо активировать, вот я и подумал на него... |
![]()
Сообщение
#2454
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
продолжим:
Допустим у меня система распределения опыта - всем поровну. в представленном коде 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мя будет идти прокач. Так? |
![]()
Сообщение
#2455
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Можно проверить кто убил. Если я уловил нить вопроса (IMG:style_emoticons/kolobok_light/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!!!"); } } |
![]()
Сообщение
#2456
|
|
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
Aiwan, не, не уловил. (IMG:style_emoticons/kolobok_light/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); } |
![]()
Сообщение
#2457
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
dumbo, интересно, а можно еще больше эту формулу упростить? В принципе, я видел, что деление на 2, а потом умножение на 1000, лишнее, но оставил так.
Dana, я же тебе дал ссылку в ICQ. Подобный код, который написал dumbo, можно вставить внутрь такой системы распределения опыта. В скрипте "nw_c2_default7" лишь добавится: NSS ExecuteScript("xp_system", oKiller); Сама же система полностью разбирается в скрипте "xp_system". Посмотри эту систему. |
![]()
Сообщение
#2458
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
Продолжим извечные «что» да «как». На повестке 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); } } } |
![]()
Сообщение
#2459
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
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; } |
![]()
Сообщение
#2460
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
1) проверка, когда выходит PC из локации. на OnExit наверно
2) вроде как разобралась. Надо было через AssignCommand() делать 3) да, шард. По мирам Ю.Никитина. Скриптер пока тока я, да и то начинающий (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#2461
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
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); // Берем следующего в локации } } |
![]()
Сообщение
#2462
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
Можно еще так:
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) { // скрипт действия } } |
![]()
Сообщение
#2463
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
Без трудностей никуда. Продолжим. Итак, ситуация: в ивентаре имеется итем дрова (синька “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); } } Казалось бы…ан нет! Итем уничтожается, но плейс дров не появляется. |
![]()
Сообщение
#2464
|
|
Level 6 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить NWN: Скриптинг [PW] ![]() |
QUOTE в ивентаре имеется итем дрова (синька ”wood”), в том случае надо таг, а не синьку..если таг другой, то QUOTE if (GetTag(oLostItem)=="wood") непрально так..заметка перепроверь таги и синьки, я к тому, что у меня работает всё Сообщение отредактировал [MoF]Darth_Nick - Mar 10 2006, 23:24 |
![]()
Сообщение
#2465
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
ниии... с тэгами все нормуль. не в этом дело (IMG:style_emoticons/kolobok_light/sad.gif)
|
![]()
Сообщение
#2466
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Dana, я надеюсь ты в курсе, что объект создается по РесРефу?
Похоже ты хочешь сделать что-то типа отдыха. Не надо мучаться с тем, что уже есть! Посмотри в базе скриптов, там есть скрипт на отдых в дикой местности, как раз с выкладкой дров, ну и прочим. Очень советую посмотреть темки: База скриптов, Скрипты для новичков, Вопросы и Ответы по Toolsetу. |
![]()
Сообщение
#2467
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
ыыыы (IMG:style_emoticons/kolobok_light/smile.gif) как раз оттуда это и взято. там 2 источника. Очень похожи. (IMG:style_emoticons/kolobok_light/smile.gif)
а результата нет (IMG:style_emoticons/kolobok_light/sad.gif) |
![]()
Сообщение
#2468
|
|
Level 6 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить NWN: Скриптинг [PW] ![]() |
http://nwcustom.jino-net.ru/upload/plc_itm_down.rar
наглядно. береш, ложиш и появляются дрова Сообщение отредактировал [MoF]Darth_Nick - Mar 11 2006, 01:00 |
![]()
Сообщение
#2469
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Dana, еще раз обращаю твое внимание на то, что объект создается по РесРефу! Это очень частая ошибка начинающих.
Об этом говорится в ВиО QUOTE ВОПРОС CreateObject(...); - создает по Blueprint ResRef или по тэгу? ОТВЕТЫ CreateObject(...); - создает по Blueprint ResRef Создавать можно только итемы, NPC, плейсы, магазины и вейпоинты. Посмотри в модуле [MoF]Darth_Nick'а , там у дров в палитре и имя и тег и РесРеф "place_wood". |
![]()
Сообщение
#2470
|
|
Level 2 ![]() Класс: Друид Характер: Lawful Neutral Раса: Полуэльф ![]() |
(IMG:style_emoticons/kolobok_light/smile.gif) моя вина. исправлиась. действительно делала по тэгу.
теперь все нормально. ПС дрыхнет так, что экран трясется. Всем спасибо, все свободны... до следующей моей очередной заковырки (IMG:style_emoticons/kolobok_light/smile.gif) И снова здравствуйте… С отдыхом все получилось, на радостях даже сделала, что бы дрова из плейсов деревьев добывать можно было (IMG:style_emoticons/kolobok_light/smile.gif) Итак, продолжим: 1) хочу, что бы при создании плейса костра и в течении всего времени что он у меня полыхает, был звук треска костра. Как я понимаю CreateObject здесь неуместен. 2)так же хочу сделать, чтобы при убийстве какого-либо животного после него оставался итем «Мясо» и через определенное время исчезал (5 сек, 10 сек…). Через инвентарь животного оно конечно остается, но не исчезает. Здесь надо делать генерируемый лут с DestoyObject? Пока что это все, что меня интересует (IMG:style_emoticons/kolobok_light/smile.gif) Заранее благодарна. Навеки ваша. Дана. Сообщение отредактировал Dana - Mar 11 2006, 12:43 |
![]()
Сообщение
#2471
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Dana @ Mar 11 2006, 12:44) [snapback]72277[/snapback] 2)так же хочу сделать, чтобы при убийстве какого-либо животного после него оставался итем «Мясо» и через определенное время исчезал (5 сек, 10 сек…). Через инвентарь животного оно конечно остается, но не исчезает. Здесь надо делать генерируемый лут с DestoyObject? описывалось недавно как это делать. Удаление с указаной задержкой делается в скрипте onDeath. Сначала отчистка инвенторя, потом удаление плейса. |
![]()
Сообщение
#2472
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Еще раз вынужден просить помощи, я уже писал этот вопрос, но не кто не помог, умельцы, подскажите мне ПЛИЗ, как убрать этого пацана, Link Boy его завут, который появляется, когда спать ложишься ? И потом продолжает бегать за тобой с факелом !
И еще, что-нибудь про систему лута, процент выпадения данной вещи из данного моба например, хотяб примерно, как написать такой скрипт ? |
![]()
Сообщение
#2473
|
|
Level 10 ![]() ![]() ![]() Класс: Бард Характер: Chaotic Good Раса: Эльф ![]() |
Брр, ты вообще откуда этого Линк Боя достал? Или он появляется, когда ты в реале спать ложишься, и бегает за тобой с факелом? (IMG:style_emoticons/kolobok_light/ph34r.gif) (IMG:style_emoticons/kolobok_light/crazy.gif)
Думаю, с этим вопросом было бы уместнее обратиться сюда - http://www.wrg.ru/forums/index.php?showforum=3 |
![]()
Сообщение
#2474
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
QUOTE(Chess @ Mar 11 2006, 21:03) [snapback]72324[/snapback] Еще раз вынужден просить помощи, я уже писал этот вопрос, но не кто не помог, умельцы, подскажите мне ПЛИЗ, как убрать этого пацана, Link Boy его завут, который появляется, когда спать ложишься ? И потом продолжает бегать за тобой с факелом ! Эт хто такой и где? (IMG:style_emoticons/kolobok_light/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); } А вот нормальная систему лута сложнее. Тут надо все вещи разбивать по группам: мечи, щиты, копья..., хорошее состоянее, плохое... и прочее. И условия выпада соответственные. Посмотри в форуме шардов, там вроде есть примеры. |
![]() ![]()
Сообщение
#2475
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
Dana, звук такой же объект, как и все остальные. Его можно поставить в точку появления костра, и после сна удалять. Только я все же больше склоняюсь ко сну, в котором не нужно создавать костер с помощью дров, ибо маг, друид, и т.п. классы, таскать с собой дрова, и тем более рубить дерево топориком, который они даже в руки взять не могут, не очень здорово. Старая идея, которая очень давно была реализована на Экзисе. Причем по сей день жива на некоторых шардах. Если честно, такая идея несколько банальна. Лучше сделать места по всей территории мира, где можно спать. Например, на Мидгарде можно было спать только около костров. Единственный недостаток, костры горели вечно, даже если рядом никого не было. Но такой уж объект. К сожалению поменять ему ключ "горит - не горит" нельзя.
По поводу второго, посмотри внимательно мое сообщение. Chess, днем тебе представлю простенький код по системе лута, а ты уж сам его расширишь. |
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 04:26 |