![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3276
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
там есть и для навыков и для заклинаний, вроде бы. А если меня глючит и такой вещи нет, то на вход вешать эффект с увеличением шанса провала. Всяко проще, чем спелхук.
|
![]()
Сообщение
#3277
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата А если меня глючит и такой вещи нет, то на вход вешать эффект с увеличением шанса провала. Всяко проще, чем спелхук. Тебя глючит. Спеллхук чуть сложнее, зато на порядок более надёжен.
|
![]()
Сообщение
#3278
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Good Раса: Человек ![]() |
Огромное спасибо. Давно хотел сделать такую штуку, но было лень.
Поковырял компанию, немного переработал оригинальные скрипты. В дальнейшем собираюсь переделать работу с предметами и сам скрипт под мультиплеер с записью свойств в MySQL Смысл таков: На локацию вешается локалинт ITEM_KEY = 0 как счетчик. В недоступном месте стоит вейпоинт backup_waypoint. При заходе в локацию, на игрока вешается эффект провала заклинания и прочищаются все эффекты кроме естественных. С предметами сделано довольно странно, но для сингла сойдет: 1) Предметы копируются к вейпоинту с новыми тегами 2) На оригинальных предметах прочищаются все свойства и устанавливается локалстринг с тегом копии При выходе из локации с игрока снимаются эффект спеллфейла и полиморфа(иначе нельзя будет восстановить свойства на заполиморфимшеся друле), а потом с предметами происходит следующее: 1) Изымается локалстринг с тегом буферного предмета 2) Копируются все свойства с буферного на оригинальный предмет 3) Буферный предмет уничтожается Раскомментировал, как мог. На onEnter локации: Neverwinter Script #include "x2_inc_itemprop" int GetIsAlcohol(object oItem) { itemproperty ip; ip = GetFirstItemProperty(oItem); if(GetIsItemPropertyValid(GetNextItemProperty(oItem) )) return FALSE; if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL) { if(GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_BEER || GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_SPIRITS || GetItemPropertySubType(ip) == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_WINE) return TRUE; } return FALSE; } int GetIsPoisonAmmo(object oItem) { itemproperty ip; ip = GetFirstItemProperty(oItem); if(GetIsItemPropertyValid(GetNextItemProperty(oItem) )) return FALSE; if(IPGetItemHasItemOnHitPropertySubType(oItem, IP_CONST_ONHIT_ITEMPOISON)) return TRUE; return FALSE; } int GetIsDyeKit(object oItem) { if(GetBaseItemType(oItem) == BASE_ITEM_MISCSMALL) { itemproperty ip = GetFirstItemProperty(oItem); if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL) { int nSubType = GetItemPropertySubType(ip); return (nSubType >= 490 && nSubType <= 497); } return FALSE; } return FALSE; } //Копирует предмет void RemoveAllProperties(object oItem, object oPC, int nSlot = -1) { if(oPC != OBJECT_INVALID) { if(oItem == OBJECT_INVALID)//Если не передается предмет, но передается слот, то работать с предетом на слоте { oItem = GetItemInSlot(nSlot, oPC); if(oItem == OBJECT_INVALID) return; } else { int nType = GetBaseItemType(oItem); if(nType == BASE_ITEM_TORCH || nType == BASE_ITEM_TRAPKIT || nType == BASE_ITEM_HEALERSKIT || nType == BASE_ITEM_GRENADE || nType == BASE_ITEM_THIEVESTOOLS || nType == 109 || // crafting stuff nType == 110 || nType == 112) return; } } if(GetIsAlcohol(oItem) || GetIsPoisonAmmo(oItem) || GetIsDyeKit(oItem)) return; if(oItem == OBJECT_INVALID) return; // вейпоинт, куда складываются копии предметов //Должен быть недоступен игроку object oWP = GetWaypointByTag("backup_waypoint"); //счетчик предметов, должен быть установлен для объекта выполнения заранее и не должен сбрасываться int nKey = GetLocalInt(OBJECT_SELF, "ITEM_KEY"); nKey++; SetLocalInt(OBJECT_SELF, "ITEM_KEY", nKey); string sKey = IntToString(nKey); object oCopy = CopyObject(oItem, GetLocation(oWP), OBJECT_INVALID, "back_item" + sKey); //После копирования на предмет записывается его ключ SetLocalString(oItem, "ITEM_KEY", sKey); itemproperty ip = GetFirstItemProperty(oItem); while(GetIsItemPropertyValid(ip)) { RemoveItemProperty(oItem, ip); ip = GetNextItemProperty(oItem); } } //Убирает эффекты с существа, оставляя естественные эффекты, например EFFECT_TYPE_POISON void RemoveEffects(object oObject) { effect eEff = GetFirstEffect(oObject); while(GetIsEffectValid(eEff)) { int nType = GetEffectType(eEff); if(GetEffectSubType(eEff) != SUBTYPE_EXTRAORDINARY && (nType == EFFECT_TYPE_ABILITY_INCREASE || nType == EFFECT_TYPE_AC_INCREASE || nType == EFFECT_TYPE_ATTACK_INCREASE || nType == EFFECT_TYPE_BLINDNESS || nType == EFFECT_TYPE_CHARMED || nType == EFFECT_TYPE_CONCEALMENT || nType == EFFECT_TYPE_CONFUSED || nType == EFFECT_TYPE_CURSE || nType == EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE || nType == EFFECT_TYPE_DAMAGE_INCREASE || nType == EFFECT_TYPE_DAMAGE_REDUCTION || nType == EFFECT_TYPE_DAMAGE_RESISTANCE || nType == EFFECT_TYPE_DAZED || nType == EFFECT_TYPE_DEAF || nType == EFFECT_TYPE_DOMINATED || nType == EFFECT_TYPE_ELEMENTALSHIELD || nType == EFFECT_TYPE_ETHEREAL || nType == EFFECT_TYPE_FRIGHTENED || nType == EFFECT_TYPE_HASTE || nType == EFFECT_TYPE_IMMUNITY || nType == EFFECT_TYPE_IMPROVEDINVISIBILITY || nType == EFFECT_TYPE_INVISIBILITY || nType == EFFECT_TYPE_INVULNERABLE || nType == EFFECT_TYPE_ABILITY_INCREASE || nType == EFFECT_TYPE_NEGATIVELEVEL || nType == EFFECT_TYPE_PARALYZE || nType == EFFECT_TYPE_POLYMORPH || nType == EFFECT_TYPE_REGENERATE || nType == EFFECT_TYPE_SANCTUARY || nType == EFFECT_TYPE_SAVING_THROW_INCREASE || nType == EFFECT_TYPE_SEEINVISIBLE || nType == EFFECT_TYPE_SILENCE || nType == EFFECT_TYPE_SKILL_INCREASE || nType == EFFECT_TYPE_SLOW || nType == EFFECT_TYPE_SPELL_IMMUNITY || nType == EFFECT_TYPE_SPELL_RESISTANCE_INCREASE || nType == EFFECT_TYPE_SPELLLEVELABSORPTION || nType == EFFECT_TYPE_TEMPORARY_HITPOINTS || nType == EFFECT_TYPE_TRUESEEING || nType == EFFECT_TYPE_ULTRAVISION || nType == EFFECT_TYPE_INVULNERABLE)) RemoveEffect(oObject, eEff); eEff = GetNextEffect(oObject); } } void main() { object oEnter = GetEnteringObject(); //Если игрок сохранился, вышел из игры и загрузился потом, ничего с ним не делать //INSIDE - Локальная переменная для избежания глюков с save\load int nInside = GetLocalInt(oEnter, "INSIDE"); if(nInside == 1) return; SetLocalInt(oEnter, "INSIDE", 1); RemoveEffects(oEnter); effect eSpellFailure = EffectSpellFailure(100, SPELL_SCHOOL_GENERAL); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpellFailure, oEnter); object oItem = GetFirstItemInInventory(oEnter); while(oItem != OBJECT_INVALID) { RemoveAllProperties(oItem, oEnter, -1); oItem = GetNextItemInInventory(oEnter); } //Убираем свойства с предметов в слотах экиперовки //Если лексикон не врет, то искомые слоты с 0(INVENTORY_SLOT_HEAD) по 13(INVENTORY_SLOT_BOLTS) int iSlot = 0; while(iSlot<14) { RemoveAllProperties(OBJECT_INVALID, oEnter, iSlot); iSlot++; } } На onExit: Neverwinter Script #include "x2_inc_itemprop"
// Восстанавливаем свойства предметов void RestoreAllProperties(object oItem, object oPC, int nSlot = -1) { if(oPC != OBJECT_INVALID) { if(oItem == OBJECT_INVALID)//Если не передается предмет, но передается слот, то работать с предетом на слоте oItem = GetItemInSlot(nSlot, oPC); if(oItem == OBJECT_INVALID) return; } string sKey = GetLocalString(oItem, "ITEM_KEY"); object oOriginalItem = GetObjectByTag("back_item" + sKey); if(oOriginalItem != OBJECT_INVALID) { //Копировать все свойства предмета на новый IPCopyItemProperties(oOriginalItem, oItem); DestroyObject(oOriginalItem); DeleteLocalString(oItem, "ITEM_KEY"); } } //Убирает свойства с создания void RemoveEffects(object oObject) { effect eEff = GetFirstEffect(oObject); while(GetIsEffectValid(eEff)) { if(GetEffectType(eEff) == EFFECT_TYPE_SPELL_FAILURE || GetEffectType(eEff) == EFFECT_TYPE_POLYMORPH) RemoveEffect(oObject, eEff); eEff = GetNextEffect(oObject); } } void main() { object oExit = GetExitingObject(); SetLocalInt(oExit, "INSIDE", 0); // Локальная переменная для избежания глюков с save\load if(GetObjectType(oExit) == OBJECT_TYPE_CREATURE) { RemoveEffects(oExit); object oItem = GetFirstItemInInventory(oExit); float fDelay = 4.0; //Задержка для избежания глюков с прогрузкой, можно увеличить while(oItem != OBJECT_INVALID) { DelayCommand(fDelay, RestoreAllProperties(oItem, oExit, -1)); oItem = GetNextItemInInventory(oExit); } //Убираем свойства с предметов в слотах экиперовки //Если лексикон не врет, то искомые слоты с 0(INVENTORY_SLOT_HEAD) по 13(INVENTORY_SLOT_BOLTS) int iSlot = 0; while(iSlot<14) { DelayCommand(fDelay, RestoreAllProperties(OBJECT_INVALID, oExit, iSlot)); iSlot++; } } } } Сообщение отредактировал Batkom - May 27 2010, 00:59 |
![]() ![]()
Сообщение
#3279
|
|
Level 1 Класс: Обыватель Характер: Lawful Neutral Раса: Человек ![]() |
приветик)
делаю свой первый в жизни мод)) до этого модостроем не занималась вообще. по началу всё достаточно просто получалось, сделала участки, разместила монстров, неписей, прописала диалоги, переходы между локациями... но вот дело дошло до скриптов, и тут совсем ничего не понятно (IMG:style_emoticons/kolobok_light/sad.gif) попробовала добавить опыт, как написано здесь Цитата //-------------------- Уровень игрока для игры в модуле ------------------------ // К примеру нам нужен игрок 5 уровня. Смотрим таблицу уровней и видим, // что Level 5 = 10000 xp. { SetXP(oPC, 10000); } ничего не получается, никакого опыта (IMG:style_emoticons/kolobok_light/sad.gif) также пробовала деньги добавлять, снова не работает (( мой мод не очень большой, и много там не нужно, но помогите хотя бы с простыми задачами, пожалуйста (IMG:style_emoticons/kolobok_light/unsure.gif) 1. как все таки мне сделать, чтобы при старте модуля игрокам назначался 5-ый уровень? 2. как сделать, чтобы в диалоге с НПЦ появлялась строчка, что его можно присоединить в отряд? ( в безвыходной ситуации взяла Боддинока Глинка, поменяла ему все диалоги под свой сюжет, но тем не менее остается всегда строчка, что я работаю на Арибет - я не знаю как и где это убрать ... ). 3. ну и наконец, как сделать хотя бы простенький квест? Например непись дает задание, принести ему такой то предмет, и чтобы при подношении ему этого предмета он выдавал бы N-ное количество опыта и золота. |
![]()
Сообщение
#3280
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
ничего не получается, никакого опыта sad.gif как именно написала скрипт и куда его поставила? Процитированный тобой кусок - не является законченным скриптом, это лишь функция. отвечая на твой первый вопрос, должно быть так: Neverwinter Script void main() { object oPC = GetFirstPC(); SetXP(oPC , 10000); } Этот скрипт нужно поставить в слот модуля, на onEnterPlayer (или как-то так он называется). по поводу всего остального, прочитай для начала: http://www.city-of-masters.ru/forums/index...?showtopic=1612 |
![]()
Сообщение
#3281
|
|
Level 1 Класс: Обыватель Характер: Lawful Neutral Раса: Человек ![]() |
спасибо. с опытом и деньгами разобралась.
со спутником тоже, но не совсем. вот это я ему прописала: Цитата if(GetLocalInt(OBJECT_SELF, "HENCHED") != TRUE) // Проверка, что присоединяется один раз { SetLocalInt(OBJECT_SELF, "HENCHED", TRUE); // Вот и установка AddHenchman(GetPCSpeaker(), OBJECT_SELF); // Добавляем хенча тому игроку, с кем говорит теперь по завершении диалоги НПЦ входит в отряд. Но, если его на время отлучить из отряда, то второй раз он уже почему то не нанимается, хотя строчка, по которой он должен входить - есть. что я делаю не так? (IMG:style_emoticons/kolobok_light/unsure.gif) спасибо. с опытом и деньгами разобралась. со спутником тоже, но не совсем. вот это я ему прописала: теперь по завершении диалоге НПЦ входит в отряд. Но, если его на время отлучить из отряда, то второй раз он уже почему то не нанимается, хотя строчка, по которой он должен входить - есть. что я делаю не так? (IMG:style_emoticons/kolobok_light/unsure.gif) |
![]()
Сообщение
#3282
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
теперь по завершении диалоги НПЦ входит в отряд. Но, если его на время отлучить из отряда, то второй раз он уже почему то не нанимается, хотя строчка, по которой он должен входить - есть. что я делаю не так? unsure.gif не снимаешь переменную HENCHED. Она в твоей ситуации вообще не нужна, имхо. |
![]()
Сообщение
#3283
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата 1. как все таки мне сделать, чтобы при старте модуля игрокам назначался 5-ый уровень? Если планируется, что играть будет несколько человек одновременно, то про GetFirstPC() во всех скриптах нужно забыть. Например, в скрипте на заходNeverwinter Script object oPC = GetEnteringObject(); На мой взгляд, пихать во все скрипты, где нужно получить игрока, GetFirstPC() - крайне вредная привычка даже для сингла.
Сообщение отредактировал Ilerien - May 27 2010, 12:31 |
![]()
Сообщение
#3284
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Good Раса: Человек ![]() |
Ага.
Еще вариант: добавить в onhb хенча Neverwinter Script if (GetIsPC(GetFactionLeader(OBJECT_SELF))) SetLocalInt(OBJECT_SELF, "HENCHED", FALSE); Считаю, что проверку HENCHED нужно делать при отображении в диалоге строки "Пойдем со мной" Сообщение отредактировал Batkom - May 27 2010, 12:41 |
![]()
Сообщение
#3285
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Считаю, что проверку HENCHED нужно делать при отображении в диалоге строки "Пойдем со мной" там проще проверить, в патии хенч или нет. те переменная тут явно дублирующая. GetFirstPC() - крайне вредная привычка даже для сингла. для сингла не вредная (IMG:style_emoticons/kolobok_light/smile.gif) И я не обратил внимание что там про "игроков". тогда да, от GetFirstPC надо отказываться. |
![]()
Сообщение
#3286
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
для сингла не вредная (IMG:style_emoticons/kolobok_light/smile.gif) Ещё какая вредная (IMG:style_emoticons/kolobok_light/smile.gif) 1) захочется переделать модуль под мультиплеер или хотя бы потестить двумя клиентами -> случится пипец; 2) это ухудшает понимание API и механизма исполнения скриптов; 3) захочет скриптер войти в команду шарда или что-нибудь в этом роде -> придётся переучиваться (IMG:style_emoticons/kolobok_light/smile.gif)
Сообщение отредактировал Ilerien - May 27 2010, 13:21 |
![]() ![]()
Сообщение
#3287
|
|
Level 1 Класс: Обыватель Характер: Lawful Neutral Раса: Человек ![]() |
эм...
вот так написала Цитата { object oPC = GetEnteringObject(); SetXP(oPC , 10000); } но теперь при каждом заходе в игру опыт всегда снижается до 10к, до 5 лвла, даже если герой несколько прокачался вперед. как это исправить? (IMG:style_emoticons/kolobok_light/declare.gif) да, игра планируется не одиночная, а на двух-трех человек. Цитата не снимаешь переменную HENCHED. Она в твоей ситуации вообще не нужна, имхо. спасибо, теперь со спутником всё нормально (IMG:style_emoticons/kolobok_light/declare.gif) |
![]()
Сообщение
#3288
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата как это исправить? Neverwinter Script void main()
{ object oPC = GetEnteringObject(); if(GetXP(oPC) < 10000) SetXP(oPC, 10000); } |
![]()
Сообщение
#3289
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
Neverwinter Script int nGoldAmount = some_func(); SendMessageToPC(oPlayer, IntToString(nGoldAmount) + " gold to move"); AssignCommand(oPlayer, TakeGoldFromCreature(nGoldAmount, oPlayer, TRUE)); onPlayerDeath, после воскрешения и вообще всё валидное. В сообщении игроку выводится правильное значение, но деньги забираются все, что есть. В чём проблема? Вопрос снят... Сообщение отредактировал greye - May 30 2010, 22:38 |
![]()
Сообщение
#3290
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Good Раса: Человек ![]() |
Доброе время суток. Сейчас ваяю крафт. Решил сделать некий конструктор. Однако, дабы избежать перегруженности палитры предметов, было решено генерировать предметы полностью динамически. Застопорился только в одном: Как сменить предмету имя и описание? Это вообще возможно из скриптов?
|
![]()
Сообщение
#3291
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
SetName, SetDescription
|
![]()
Сообщение
#3292
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Good Раса: Человек ![]() |
Спасибо, я балбес, SetName нашел, а вот SetDescription нету. Он в каком-то инклюде?
|
![]()
Сообщение
#3293
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Нет, в версии 1.69 / в плагине Funcs к NWNX.
|
![]()
Сообщение
#3294
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Good Раса: Человек ![]() |
Чорт, на 1,69 переходить совсем не хочется, много лишнего и с dialog.tlk проблемы. Впрочем, NWNX все равно подключать собирался. Спасибо.
Сообщение отредактировал Batkom - Jun 1 2010, 22:25 |
![]()
Сообщение
#3295
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
SetDescription есть в 1.69.
А NWNX уже сам требует 1.69. |
![]()
Сообщение
#3296
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата Чорт, на 1,69 переходить совсем не хочется, много лишнего и с dialog.tlk проблемы. Actually, никаких проблем. Полностью переведённый dialog.tlk для 1.69. А лишнее же всегда можно не использовать, верно?Вернул на место ссылку на плейграунд. Алсо, не первый случай, когда ссылки на плейграунд начинают магическим образом вести на вpг. Достойный способ потешить самолюбие, ничего не скажешь. Сообщение отредактировал Ilerien - Jun 7 2010, 19:13 |
![]()
Сообщение
#3297
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Good Раса: Человек ![]() |
Ух-ты!
Вот спасибо. (впрочем, я еще конечно поканителюсь с переходом на 1.69, конечно, не известно, чем это грозит, главное, чтобы с тайлсетом ничего не стряслось) |
![]()
Сообщение
#3298
|
|
Level 2 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Вот один из моих скриптиков, который я использовал как спец-атаку монстра (в моем случае дракона).
Действует он так : 1. Проставляем переменные. 2. Чекаем локацию НПЧ на наличие валидных созданий - врагов. 3. Если враг ,- НПЧ ,- то парализуем его на 10-20 сек. 4. Если враг ПЧ - парализуем на 10-20 сек и колдуем на него заклинание огненного шара. 5. Записываем локальную переменную специальных атак. Может, кому - то понадобится. =) Neverwinter Script ///////////////////////////////////////////////////// ////// ///// ////// // // // ///// // // // // // /// //// ///// ///// ///// //// /// // // // // ///// // // // ////// ///// ////// ///////////////////////////////////////////////////// // Copyright © Rey Brujo, ma-zi-la@hotmail.com // // Created By: ReyBrujo, City Of Masters // // Created On: 06/06/2010 // ///////////////////////////////////////////////////// void main() { object oNPC = OBJECT_SELF; // NPC object oPC = GetFirstPC(); // Player int nHP = (GetCurrentHitPoints() / GetMaxHitPoints())*100; // Hit Points (in (IMG:style_emoticons/kolobok_light/wacko.gif) int nSAtt = GetLocalInt(oNPC, "specatt"); // Special Attack integer int nNHP = 50; if(nHP < nNHP && nSAtt >= 1) { nSAtt -= 1; object oCreature = GetFirstObjectInArea(GetArea(oNPC)); while(GetIsObjectValid(oCreature)) // Check for valid creatures (enemies). If it exists - cast chosen spells/effects. { // NPC // if(GetObjectType(oCreature) == OBJECT_TYPE_CREATURE && GetIsEnemy(oCreature) == TRUE && GetIsPC(oCreature) == FALSE) { ClearAllActions(TRUE); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oCreature, 10.0+Random(10)); } // PC // if(GetObjectType(oCreature) == OBJECT_TYPE_CREATURE && GetIsEnemy(oCreature) == TRUE && GetIsPC(oCreature) == TRUE) { ClearAllActions(TRUE); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oCreature, 10.0+Random(10)); ClearAllActions(TRUE); SetFacingPoint(GetPosition(oPC)); ActionDoCommand(ActionCastSpellAtObject(SPELL_FIRE BALL, oPC, METAMAGIC_EMPOWER, TRUE)); ActionWait(0.5); } oCreature = GetNextObjectInArea(GetArea(oNPC)); // Continue checking } SetLocalInt(oNPC, "specatt", nSAtt); // Set number of special attacks } } Тот скрипт, который я выложил в прошлом посте - это только часть моего плана спец атаки. Если кто-то может, подскажите, как сделать, чтобы дракон взлетал, висел немного(можно без висения), пускал несколько огненных шаров (любым способом) и опускался нормально на землю. Я пробовал такое сделать, но мой дракон либо только взлетал и исчезал в облаках (дизаппир-аппир), либо просто взлетал - садился (рассоединенные дизаппир и аппир с клиром действий), либо просто тупил. Еще одно забыл сказать - действие происходит только если у НПК хп меньше чем nNHP % (у меня поставлено 50) И еще одно - не забудьте в переменные НПЧ поставить переменную specatt, которая больше 0. Этот скрипт ставится на хертбит монстра (IMG:style_emoticons/kolobok_light/wacko.gif) |
![]()
Сообщение
#3299
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
Два варианта:
1. тебе нужно изучить 3д макс и там сделать свою анимацию. 2. На nwn vault я видел хек пак где сделаны летающие драконы, впринципе можно сделать чтобы происходила замена модели - стоящего на лапах, на летящего в воздухе, а потом наоборот. честно говоря боле вариантов я не вижу, потому что функции аппер-дизаппер они по другому работать не могут. Сообщение отредактировал Laajin - Jun 7 2010, 08:10 |
![]()
Сообщение
#3300
|
|
Level 2 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Вот начал делать собственный мультиплеерный модуль. Никак не могу сделать две вещи - скрипт на вход(игрок заходит, его должно перенести на вейпоинт) и скрипт, который бы при создании НПЧ давал им команду атаки ближайшего врага.
Пока что есть вот что: 1. (ОнЕнтер триггера под точкой входа) Neverwinter Script void main() { //////////// MY SCRIPTS //////////// //--------------------------------// //////////////////////////////////// object oPC = GetEnteringObject(); object oGame = GetObjectByTag("GAME"); object oGuard = GetObjectByTag("NW_ELFRANGER001"); object oSieger = GetObjectByTag("NW_DROWCLER001"); int nPlayers = GetLocalInt(oGame, "players"); int nGuards = GetLocalInt(oGame, "guards"); int nSiegers = GetLocalInt(oGame, "siegers"); if(GetIsPC(oPC) == TRUE) { SetLocalInt(oGame, "players", nPlayers+1); //Set number of players to +1 if(nGuards>nSiegers) {//Set number of siegers to +1 JumpToObject(GetWaypointByTag("wp_siegers")); SetStandardFactionReputation(STANDARD_FACTION_HOST ILE, 100, oPC); SetStandardFactionReputation(STANDARD_FACTION_DEFE NDER, 0, oPC); SetLocalInt(oGame, "siegers", nSiegers+1); SpeakString(IntToString(nSiegers)); } else {//Set number of guards to +1 JumpToObject(GetWaypointByTag("wp_guards")); SetStandardFactionReputation(STANDARD_FACTION_HOST ILE, 0, oPC); SetStandardFactionReputation(STANDARD_FACTION_DEFE NDER, 100, oPC); SetLocalInt(oGame, "guards", nGuards+1); SpeakString(IntToString(nGuards)); } ///////// OTHER SCRIPTS ///////// //-----------------------------// ///////////////////////////////// // ITEMS // CreateItemOnObject("potion001", oPC); CreateItemOnObject("potion001", oPC); CreateItemOnObject("potion001", oPC); CreateItemOnObject("potion001", oPC); CreateItemOnObject("potion001", oPC); } } 2. (Хертбит. Инклюд "inc_nearest" просто перенаправляет на "x0_i0_enemy" (чтобы удобнее было искать =) )) Neverwinter Script #include "nw_i0_generic" #include "inc_nearest" void main() { ////////////////////////////////////////// // тут обычные скрипты хертбита // ////////////////////////////////////////// if(GetCurrentAction() != ACTION_ATTACKOBJECT) { ActionAttack(GetNearestEnemy(), TRUE); } } В первом скрипте всё, кроме джамп ту вейпоинт работает нормально. С вейпом проблем вроде-бы нет. А во втором скрипте я долго пытался намутить, один раз что-то получилось, но тогда у мну вылетел тулсет, а я не помню, что сделал. |
![]() ![]() |
Текстовая версия | Сейчас: 28th April 2025 - 02:21 |