![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3311
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Цитата Хочется ругаться трехъетажным (на биотварей) Обещаю, это только начало (IMG:style_emoticons/kolobok_light/biggrin.gif)
|
![]()
Сообщение
#3312
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Обещаю, это только начало (IMG:style_emoticons/kolobok_light/biggrin.gif) Спасибо, обнадежил. (IMG:style_emoticons/kolobok_light/biggrin.gif) А главное, опять прав! Нарисовал тригеры зоны отдыха и все снова пошло наперекосяк. Но это ерунда, надеюсь, благодаря вашим с Мелиссой подсказкам все налажу. По крайней мере, когда хоть примерно видишь, куда двигаться, это гораздо более иначе, чем смотреть на глюки и хлопать глазами ничего не понимая. Спасибо! Дико извиняюсь, что напрочь зафлудил тему, но необходимо сказать: denis0k, отдельное спасибо за последнюю подсказку. Все оказалось даже еще проще. Не требуется нигде писать "if (!GetIsAreaNatural(GetArea(oPC)))", достаточно пометить любую локацию как "тип земли - искусственный". Ерунда получалась в основном из-за того, что я пытаюсь сочинить робинзонаду, скачав с WRG замечательную систему крафта PaiNt_craft. Ну и, понятно, у меня локи все поля-леса и прочие тропики. Помечать их как искусственные не сразу придет в голову. (IMG:style_emoticons/kolobok_light/unsure.gif) Так что зря я гнал на биоварей... хотя нет, они не этим, так многим другим заслужили! |
![]()
Сообщение
#3313
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Да у Биоварей полно пасхалок. Однажды я неделю бился над проблемой, в маленьких локациях спавнились одни и те же монстры в случайных генерациях. После недельного выноса мозга, оказалось, движок генерит случайные числа исходя из данных тайлов в локации. Это значит, если я тупо скопировал пять локаций 4х4 тайла, то в них будут тупо выпадать одинаковые "случайные" числа а это значит одинаковые монстры. Вот такие пироги.
|
![]()
Сообщение
#3314
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Удивительный факт в том, что сделать нормальный рандом вообще проще, чем городить свой. Там в параметре просто время указывается, оно каждую секунду уникально, но биовари замутили туда данные локации. Это телодвижение должно иметь какой-то смысл (IMG:style_emoticons/kolobok_light/smile.gif) Ну либо я ищу чёрную кошку в тёмной комнате, которой там нет, и они просто рукожопые индусы, во что тоже можно поверить, т.к. их SWTOR не имеет юникода в чатике, да и вообще глючит, если ставить в папку с русскими символами в пути (IMG:style_emoticons/kolobok_light/biggrin.gif)
|
![]()
Сообщение
#3315
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
С позволения мастеров продолжу веселить их дурацкими вопросами. Но что делать, если поиск и в темах, и расширенный по всему форуму ответа не дал...
Можно ли скриптом заставить героя вытаскивать из инвентаря определенный (по тегу, рефу, богу, черту ets) вид оружия и имитировать атаку на плейс? Именно имитировать, а не атаковать всерьез. У меня по команде Neverwinter Script AssignCommand(oPC, DelayCommand(0.5, ActionEquipMostDamagingMelee())); // Далее - атака. понятно, что произошло. Герой-тестер выхватил из инвентаря самое крутое оружие, которое имел и разнес горемычный булыжник с воплем "Я раздавлю тебя!". А это был не просто булыжник, а целый "выход горной породы", из него каменной киркой кремень для робинзонады добывать, а герой с ним так непочтительно. (Что любопытно, орал, негодяй, по-русски (IMG:style_emoticons/kolobok_light/biggrin.gif) ). Нет, можно было защитить булыгу галкой "сюжет", но тогда жалобный дефолтный скулеж героя и постоянно всплывающее "оружие неэффективно" бесит и портить всю атмосферу. В константах такого понятия как "анимация атаки", ПМСМ, вообще не существует. Что применить наиболее похожее? Я нашел только "ANIMATION_LOOPING_TALK_FORCEFUL", но это вроде то же самое, что галка на "говорить убедительно" в графе "другие действия" диалога? Попробовал применить. Получилось, сорри за каламбур, неубедительно... Заранее благодарен. З.Ы. Понимаю, что пост скорее для темы "вопросы новичков", но я вроде как 9 лет на форуме, хотя бы и с перерывом... Впрочем если уважаемый модератор перенесет пост туда - никаких вопросов. Пока писал, подумал... такое случается... Не обязательно имитировать, можно и натурально атаковать. Поставлю этой булыге максимум ХП, нарисую рядом пару-тройку таких-же. Атаковать будет с перекурами, присаживаясь и жалуясь на тяжелую жизнь шахтера, это я умею (и написать, и пожаловаться (IMG:style_emoticons/kolobok_light/biggrin.gif) ). Главное, чтобы выхватывал из инвентаря именно каменную кирку (простой молот без бонусов), а не "каменный нож +1". Вот как это сделать - без понятия... |
![]()
Сообщение
#3316
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Атаковать можно невидимого монстра или невидимый плейс, естесвенно с плотовым флажком.
Насчет того, что бы одеть нужный меч в нужный слот. В модуле Монета Судьбы, посмотри скрипты проклятых и сюжетных комплектов броней. Именно в них прописано, в какой слот РС одевает предмет с нужным тегом. НВН нет и я по памяти это не напишу. Там все сделано, как тебе нужно. Идет проверка инвентаря, потом снимается с игрока все в боевых слотах, и одевается комплект уникальных. А если комплект проклят, то снять предмет нельзя. Ради интереса кинь в обычную локу кучу уникального оружия и по надевай его увидишь эффект поймешь как работает. п.с. Вспомнил, это касается в основном проклятых вещей. Комплект ты сам одеваешь. |
![]()
Сообщение
#3317
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Спасибо, уважаемый Мастер! Уже копаюсь в хаках "am_x2_main.hak" и "am_x2_weapon.hak" (модельки тоже интересны) и сокрушаюсь, почему сам до этого не додумался. Основную проблему вряд ли этим решу. Не припоминаю, чтобы проклятое оружие само (то есть по приказу скрипта, ясен пень) прыгало в руку. Вроде бы это один раз делает Эсмерик-меч. Но, во-первых не факт, что я помню правильно (в Хорды, в отличие от "Монетки", которую юзаю довольно часто, играл лет десять тому). Во-вторых, рыться в дефолтных скриптах биотварей?! Может, я лучше пойду вагон уголечка разгрузить, нервных затрат на порядки меньше и точно знаешь, что рано или поздно результат будет. (IMG:style_emoticons/kolobok_light/swoon.gif)
Тем не менее уверен, что накопаю много полезного (в хаках "Монетки", не подумайте, что в "Хордах" (IMG:style_emoticons/kolobok_light/biggrin.gif) ). Отдельное спасибо за привычку коротко комментировать практически каждый скрипт. Да, "кровавый меч Lexа" тоже, пожалуй, стоит глянуть? И можно попросить еще одну подсказку, уважаемые мастера? Где поискать что-то похожее на скрипт выдачи вещей с палитры, но с процентным шансом? То есть мой робинзон долбит эту булыгу (монстра, плейс - не суть) и у него 90% шанса добыть кремень, 9% на то, что выпадет к примеру, малахит, и 1% - изумруд или алмаз, тоже не суть. И последний (на сегодня) вопрос. Наверное, конкретно к Вам, уважаемый Aiwan. Систему PaiNt_craft я, похоже, ниасилил (или она меня, подробности в соответствующей теме на WGR). Скрипты крафта придется занимать у доброй тети Опары и дяди Железнорукого. А вопрос насчет таблички "craftingrecipes.2da". Когда не надо брать за крафт деньги и не требуется нескольких дней (робинзон же, сам же все крафтит и сам себе, ясен пень не платит) что надо писать в соответствующих графах таблички: нули, пять звездочек, "NONE" или еще что? Потому что замена в Великом Плейсе Крафта CRAFT_HEALPER "WP" на "INSTANT", которую обещал так рано покинувший нас DBColl, не работает. По крайней мере, в моем модуле не работатет. Ответьте, если припомните, конечно. Если нет, сам проверю, муторно, но понятно что делать. Спасибо. |
![]()
Сообщение
#3318
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Не припоминаю, чтобы проклятое оружие само (то есть по приказу скрипта, ясен пень) прыгало в руку. Вроде бы это один раз делает Эсмерик-меч. В монетке при попытке снять проклятую вещь, ее вставят в тот же слот где была. Порядок слотов был где-то указан, там есть функция типа экипировать вещь и количество слот как параметр в этой функции. Если мне склероз не изменяет. Включая шкурку у существа и РС. Крафт не мой, я там даже не пытался разбираться. Если была проблема, я сразу обращался к хозяину скриптов. И можно попросить еще одну подсказку, уважаемые мастера? Где поискать что-то похожее на скрипт выдачи вещей с палитры, но с процентным шансом? То есть мой робинзон долбит эту булыгу (монстра, плейс - не суть) и у него 90% шанса добыть кремень, 9% на то, что выпадет к примеру, малахит, и 1% - изумруд или алмаз, тоже не суть. В ПЛ посмотри на ящиках и сундуках, выпадают плотовые вещи с рандомом. Например, в пещере Рэджика, там в зависимости от евила и класса дается уникальная шмотка. Отдельное спасибо за привычку коротко комментировать практически каждый скрипт. Это сделано по двум причинам, для себя и для таких случаев как сейчас. (IMG:style_emoticons/kolobok_light/snoozer_17.gif) |
![]()
Сообщение
#3319
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Ай да Aiwan! Ай да ... почти Пушкин, скажем так...
Спасибо огромное. Вот он, скрипт: Neverwinter Script object oPC = GetFirstPC(); object oItem=GetItemPossessedBy(oPC, "ITM_MOLOT"); object oBul = GetObjectByTag("BULYGA"); void main() { AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_RIGHTHAND)); DelayCommand(0.0,ActionPauseConversation()); DelayCommand(1.0,AssignCommand (oPC,ActionAttack(oBul))); DelayCommand(2.0,AssignCommand (oPC,ActionAttack(oBul)));; DelayCommand(4.0,ActionResumeConversation()); } И правда простой, как мычание. Пять минут писанины и еще пять на проверку в модуле "Полигон". Ясен пень, тут еще много чего до ума доводить, эффект замедления вешать, давать в инвентарь вещички с палитры, "перекуривать" и т.п., но уж с этим я худо-бедно справлюсь. Главное, что удалось впихнуть эту злополучную "кирку" в этот неладный SLOT_RIGHTHAND. Остальное преодолимо. Спасибо насчет подсказки про пещеру Реджика. Пойду гляну... З.Ы. Сорри за офтоп. Aiwan, у тебя что вообще никакого невера? Даже ПЛ и родной "Монетки"? То есть никакой ностальжи, никаких сантиментов? Не-нет, подпись твою я вижу, вопрос риторический... Понимаю, достал, но исключительно чтобы закрыть вопрос и по нему больше никого не дергать. Нашел подходящий скрипт. Здесь, в старой базе. Переделать под свои нужды отказалось нетрудно. Автор, кстати, некий Aiwan, возможно, слышали? (IMG:style_emoticons/kolobok_light/biggrin.gif) З.Ы.Ы. Последняя реплика "приклеилась" к общему посту, потому поясняю: речь о скрипте рандома с шансом. |
![]()
Сообщение
#3320
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
З.Ы. Сорри за офтоп. Aiwan, у тебя что вообще никакого невера? Даже ПЛ и родной "Монетки"? То есть никакой ностальжи, никаких сантиментов? Не-нет, подпись твою я вижу, вопрос риторический... Я полностью ушел в реал, игр нет совсем. Точнее по инерции еще качаю иногда, но дальше установки не идет (IMG:style_emoticons/kolobok_light/smile.gif) Из игр остался только симулятор радиоуправляемых моделей ну и с сыном в НХЛ играю на PS4. (IMG:style_emoticons/kolobok_light/wink3.gif) |
![]()
Сообщение
#3321
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Aiwan, вопрос лично к тебе. Он может казаться странным, а в свете того, что на дворе 2017 год, так и вовсе нелепым, но тем не менее...
Решал дать денек отдыха своему робинзону и сел поиграть. Представь себе, в ПЛ. Такое иногда случается. Во всяком случае, со мной. Так вот, минут за 10 игры мне пришлось трижды вызывать диспетчер задач, чтобы он прихлопнул НВН. Как только на Прокампур опускалась ночь, я нервно нажимал кнопку быстрого сохранения чуть ли не каждую минуту... А все из-за печально-знаменитого непися-бандита. Он спавмится, подвешивает игру и идет по своим делам. Вместо того, чтобы нападать на героя, как это и задумано, изображает бродячего непися-обывателя. Вот скрипт на последнем слоте бандита: Neverwinter Script #include "nw_i0_generic" #include "mm_common" void main() { int nEvent = GetUserDefinedEventNumber(); if (nEvent == 1002) { object oPC = GetLastPerceived(); if (GetIsPC(oPC) && GetLastPerceptionSeen() && GetTag(OBJECT_SELF) == "SEWER1_BANDIT1") { SpeakString(ya("Это же то животное, что на менйа плюнуло!.. Убью!!!")); AssignCommand(oPC, PlaySound("vs_nhalorm1_bat2")); object oNPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF); // AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHIN G, 1.0f, 6.0f)); DelayCommand(1.0f, AssignCommand(oNPC, SpeakString("Хе-хе-хе..."))); AssignCommand(oNPC, AssignCommand(oPC, PlaySound("vs_fvengaum_haha"))); return; } else if (GetIsPC(oPC) && GetLastPerceptionSeen() && GetTag(OBJECT_SELF) != "SEWER1_BANDIT1") { if (!GetIsInCombat() && !IsInConversation(OBJECT_SELF)) { SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS, FALSE); SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMA TIONS, FALSE); if (Random(4) == 0) SpeakString("Эй ты, стой!.."); SetCutsceneMode(oPC); vector vD = GetPosition(OBJECT_SELF) - GetPosition(oPC); float fDir = VectorToAngle(vD); AssignCommand(oPC, ClearAllActions()); AssignCommand(oPC, SetCameraFacing(fDir, 8.0, 50.0, CAMERA_TRANSITION_TYPE_MEDIUM)); AssignCommand(oPC, SetFacing(fDir)); ClearAllActions(); ActionForceMoveToObject(oPC, TRUE); ActionDoCommand(SetCommandable(TRUE)); ActionDoCommand(SetCutsceneMode(oPC, FALSE)); ActionStartConversation(oPC, "bandit", TRUE, FALSE); DelayCommand(0.1, SetCommandable(FALSE)); } } } //Дальше реплики драки, которые тут не играют значения и не имеют роли Так вот, вопрс: что именно и куда вписать, чтобы эта чертова "ClearAllActions();" соскочила с героя, если: - бандит отошел далеко и уж точно не нападет. или - просто не нападает, допустим, 10-15 секунд реального времени. К примеру, достаточно будет написать в конце перед тремя галками: "DelayCommand(22.0,ActionResumeConversation()) ;" или надо как-то более иначе? Разумеется, я и сам могу покопаться, (исправил же в свое время "легендарный" квест с доилкой!). Но: У меня нет твоего опыта, а следовательно, уверенности что делаю правильно. С моей кармой скорее получится усугубить, чем исправить. Проверять сложно, эти бандюки то пропадают неделями, то вдруг начинают лезть из всех щелей, как тараканы. Во-вторых, ты, наверное, единственный из команды создателей ПЛ, который еще активен на форуме ГМ. Кого еще спрашивать? З.Ы. Ради прикола: самая дисциплинированная непись в ПЛ - бандит. Он накогда не лезет в триггер на сточной канаве. То есть если он отспавмился, а между ним и героем эта канава - все! Считай, висяк гарантирован. А простые быватели шастают по этим канавам как придется, и плевать им на триггеры... З.Ы.Ы. Так что лучше второй вариант, тупо на время. А то ПС и бандит могут часами стоять рядышком и любоваться друг на друга через канаву... |
![]()
Сообщение
#3322
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Во первых, к этому скрипту подрублены две инклюды, а это тоже скрипты. Причем вторая инклюда кастомная от ДБа наверное. ДБ автор скрипта и я никогда не лазил в нем и не проверял его (IMG:style_emoticons/kolobok_light/smile.gif) Так как я и ДБ это как юный падаван и джедай (IMG:style_emoticons/kolobok_light/smile.gif) Если хочется узнать что и как работает, разбирайся сам. Для этого, после каждого действа поставь в скрипт событие, типа в командную строку сообщение или текст над НПС. Тогда ты будешь видеть, что происходит и где затык случается. Найди в монетке мой скрипт am_inc_debug, там простые условия для отладки скриптов. Добавляй из него функции в скрипты и проверяй отлаживай работу.
Прописывается она так Neverwinter Script #include "am_inc_debug" Вот такой скрипт надо создать в палитре скриптов, он будет браться автоматически. Neverwinter Script //:://///////////////////////////////////////////// //:: Name: am_inc_common //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* БИБЛИОТЕКА ДЛЯ ОТЛАДКИ СКРИПТОВ */ //::////////////////////////////////////////////// //:: Created By: Aiwan Aiwan@e-mail.ru //:: Created On: 30.05.2005 //::////////////////////////////////////////////// // СООБЩЕНИЯ ДЛЯ ПРОВЕРКИ (ИСПОЛЬЗУЮТСЯ В СЛУЖЕБНЫХ ЦЕЛЯХ ДЛЯ ОТЛАДКИ КОДА СКРИПТОВ) // А ТАК ЖЕ ДЛЯ ДМ-ов // LocalInt - "DEBAG_PC" на модуле, отключит дебаг игрокам // LocalInt - "DEBAG_DM" на модуле, отключит дебаг DM-ам void Debug(string message); // Выводит в Debug: TAG, ResRef и Name объекта. void DebugObject(object oObject); //------------------------------------------------------------------------------ void Debug(string message) { object oPC = GetFirstPC(); if (!GetLocalInt(GetModule(), "DEBAG_PC")) { SendMessageToPC(oPC, "Debag message: "+message); } if (!GetLocalInt(GetModule(), "DEBAG_DM")) { SendMessageToAllDMs("Debag message to DMs: "+message); } } void DebugObject(object oObject) { string sTag = GetTag(oObject); string sResRef = GetResRef(oObject); string sName = GetName(oObject); Debug ("TAG = "+sTag+", ResRef = "+sResRef+", Name = "+sName+"."); } /* void main(){} Что такое инклюда есть в моем мануале, почитай, если забыл. Пример использования: Neverwinter Script //:://////////////////////////////////////////////////
//:: X0_CH_HEN_DEATH //:: Copyright © 2002 Floodgate Entertainment //::////////////////////////////////////////////////// /* OnDeath handler for henchmen ONLY. Causes them to respawn at (in order of preference) the respawn point of their master or their own starting location. */ //::////////////////////////////////////////////////// //:: Created By: Naomi Novik //:: Created On: 10/09/2002 //::////////////////////////////////////////////////// #include "x0_i0_henchman" #include "am_inc_debug" #include "am_inc_cutscene" void main() { // Handle a bunch of stuff to keep us from running around, // dying again, etc. PreRespawnSetup(); // Call for healing DelayCommand(0.5, VoiceHealMe(TRUE)); // Get our last master object oPC = GetLastMaster(); object oSelf = OBJECT_SELF; // Clear dialogue events ClearAllDialogue(oPC, OBJECT_SELF); ClearAllActions(); SetLocalLocation(oSelf, "POINT_DEATH", GetLocation(oSelf)); //-------------------------------------------------------------------------- // Если РС умер или у нас отключен дебаг, то помощник умрет. В противном // случае воскреснет рядом. //-------------------------------------------------------------------------- if(!GetIsObjectValid(oPC) || GetIsDead(oPC) == TRUE) { if(GetTag(GetItemInSlot(INVENTORY_SLOT_NECK,oSelf))= ="AM_MNECK_AZUTH") { effect eEffect1 = EffectVisualEffect(VFX_FNF_SOUND_BURST_SILENT); AssignCommand(oSelf, ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect1, oSelf)); DelayCommand(0.7, RespawnHenchman()); DelayCommand(0.9, PostRespawnCleanup()); DelayCommand(1.5, AddCutEffects(oSelf)); DelayCommand(3.0, AssignCommand(oSelf, JumpToObject(GetWaypointByTag("AM_WP_AZUTH_RESPAWN")))); DelayCommand(6.0, RemoveCutEffects(oSelf)); Debug("Алишан в храме Азута. Забирайте ее там."); return; } if(!GetLocalInt(GetModule(), "DEBAG_PC")) { DelayCommand(1.0, RespawnHenchman()); DelayCommand(1.5, PostRespawnCleanup()); DelayCommand(1.9, AssignCommand(oSelf, JumpToLocation(GetLocalLocation(oSelf, "POINT_DEATH")))); DelayCommand(2.1, AddHenchman(GetFirstPC(), oSelf)); Debug("ВЫ В РЕЖИМЕ ТЕСТА. ВАШ ПОМОЩНИК НЕУБИВАЕМ."); return; } else //-------------------------------------------------------------------------- // Умерла, так умерла... =) //-------------------------------------------------------------------------- { SetPlotFlag(OBJECT_SELF,FALSE); SetImmortal(OBJECT_SELF, FALSE); SetIsDestroyable(TRUE, FALSE, FALSE); DestroyObject(OBJECT_SELF, 0.2); } } } |
![]()
Сообщение
#3323
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Мдя... как сложно то все. Я ведь всерьез думал, что две строчки кода приписать - и все океюшки будет. (IMG:style_emoticons/kolobok_light/vava.gif)
Теперь понятно, почему Ви в госпиталь уложили. Нет, Каетан тоже, конечно, хороша, но против Ви... Ладно, раз джедая нет, падавану не до этого - фиг с ним, с бандитом. Не полному же чайнику (это обо мне, если что) его отлаживать. Да еще после джедая. Не настолько я самонадеян. В конце-концов, не так часто играю в ПЛ, прокампурское начало пережить можно. А вот за подсказку методы - спасибо большое. Воспользуюсь неприменно. Как раз именно то, чего мне не хватает. Делаю все больше по интуиции и методом тыка. А эти тыки отнимают слишком много времени и нервов. Спасибо. |
![]()
Сообщение
#3324
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Всем здрасьте.
Вопрос не то чтобы очень тупой, разве что в перспективе. Облазил просторы нета, но нигде не нашел ответа на простой вопрос - где найти мод, позволяющий в оригинальной компании первого NWN нанимать более одного стандартного хенча одновременно. Аддоны все стоят, но нужно чтобы можно было собрать партию именно в самой первой компании. Есть масса отсылок на SetMaxHenchman (который не факт что будет работать в ОС), и большое количество дохлых ссылок на этот вопрос, в частности на форум биоваров. Но рабочего мода не нашел нигде. К сожалению, даже henchai 1.08 такой возможности не добавляет. Очень, очень прискорбно. Вроде бы вопрос решил. Всего то надо было отредактировать скрипт диалога (nw_ch_action13), он общий для всех хенчей, добавить туда SetMaxHenchmen и выкинуть зануление текущего хенча. Теперь гуляю в оригинальной кампании со своей небольшой армией. |
![]()
Сообщение
#3325
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Теперь другой вопрос.
Получилось сделать так что все хенчи теперь корректно переходят между главами, при этом не теряя снарягу, которую выдал им ранее. Проблема в том что для этого пришлось отредактировать скрипты в каждом чаптере оригинальной кампании. А они, как известно, из папки Override не подсасываются, приходится лезть в nwm файлы, что очень не нравится. Можно ли как то оверрайдить скрипты глобально, не редактируя модули? Я так понимаю - хак паки тоже требуют подключения через тулсет в сам модуль? И в догонку. Можно ли скриптом поправить пенальти к экспе за большую команду? В оригинальной кампании нвн2 размер партии не влияет на количество получаемого опыта, в нвн1 же каждый хенч, саммон и фамильяр откушивает изрядный кусок. А при большой партии вообще достаются крохи. Это как то настраивается? |
![]()
Сообщение
#3326
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
хакпаки или оверрайд, если не хочется менять именно скрипты в модуле
Цитата И в догонку. Можно ли скриптом поправить пенальти к экспе за большую команду? В оригинальной кампании нвн2 размер партии не влияет на количество получаемого опыта, в нвн1 же каждый хенч, саммон и фамильяр откушивает изрядный кусок. А при большой партии вообще достаются крохи. Это как то настраивается? В оригинале используется стандартная система опыта по днд 3.0, но с пониженным процентом, она редактируется через свойства модуля в тулсете. Если хочется вносить разные штуки - нужно писать свою систему опыта и запускать ее на смерть моба, но для этого придется менять скрипты и как-то их подгружать одним из способов выше, если нет желания менять именно скрипты модуля. |
![]()
Сообщение
#3327
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
хакпаки или оверрайд, если не хочется менять именно скрипты в модуле Так в том и вопрос, как это сделать не меняя сам модуль модуль. Хакпаки нужно натягивать в модуль через тулсет, а оверрайд вообще перекрывает только Core скрипты, не скрипты модуля. Получается, собственно, что кроме как редактированием модуля кампании никак не обойтись. Обидно, потому что правок мало - только сохранение хенчей в базу данных компании при завершении чаптера и восстановление при начале нового. Бегаю с модом Henchman Inventory and Battle AI Mod, обвешивать хенчей хабаром приходится самому, потому терять его между чаптерами совсем не радует. Сам скрипт, отвечающий за наем нескольких хенчей, относится к Core и оверрайдится без проблем. А вот скрипты начала/конца чаптеров, разумеется, оверрайдить не выходит. Цитата В оригинале используется стандартная система опыта по днд 3.0, но с пониженным процентом, она редактируется через свойства модуля в тулсете. Если хочется вносить разные штуки - нужно писать свою систему опыта и запускать ее на смерть моба, но для этого придется менять скрипты и как-то их подгружать одним из способов выше, если нет желания менять именно скрипты модуля. Да, так и сделал, повесил на смерть моба, только не свою систему опыта а пересчет Experience point scale (SetModuleXPScale) в зависимости от размера партии. Т.е. при размере группы 1 он равен 10, как и в дефолтной кампании, и увеличивается на 2 с каждым новым членом группы, включая саммонов. Не совсем точная замена, но разница там пренебрежительна. Поскольку евент генерится до того как фактически начисляется экспа - всегда имею достаточно скомпенсированное значение. К сожалению, способ не самый изящный, надеялся что этот функционал просто можно отключить в настройках модуля, как в NWN2. К счастью, по крайней мере скрипт, висящий на этом евенте, оверрайдится без проблем. |
![]()
Сообщение
#3328
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Приоритет овера наивысший. Либо это баг, либо какая-то непонятная фича. Я синглом никогда не занимался, не знаю.
Цитата Не совсем точная замена, но разница там пренебрежительна. Экспа менялась от патча к патчу ещё. Оригинальную кампанию можно было закончить от ~15 до 20-го уровня, смотря на каком патче проходить.
|
![]()
Сообщение
#3329
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Приоритет овера наивысший. Либо это баг, либо какая-то непонятная фича. Я синглом никогда не занимался, не знаю. Экспа менялась от патча к патчу ещё. Оригинальную кампанию можно было закончить от ~15 до 20-го уровня, смотря на каком патче проходить. Это не TES, оверрайд папка не имеет наивысшего приоритета, модульные скрипты перекрывают. Мнения патчей я менять не собираюсь, всего лишь хочу вернуть нормально начисление экспы на одного перса. |
![]()
Сообщение
#3330
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Ага, посмотрел вики, овер действительно в приоритете на 3-м месте из 4. Забавно, но я отчётливо помню, как через него в своё время менял шардовые ресурсы (IMG:style_emoticons/kolobok_light/smile.gif) Тогда да, вариант всего один - правка модулей.
|
![]()
Сообщение
#3331
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
там какая-то кривая схема что-то типа того
хакпак -> оверрайд (частично) -> модуль -> биф но при некоторых моментах оверрайд становится на первое место Сообщение отредактировал Melisse - Dec 22 2017, 11:26 |
![]()
Сообщение
#3332
|
|
Level 1 Класс: Волшебник Характер: Lawful Evil Раса: Человек ![]() |
Добрый день.. в полку новичков прибыло)
Попробовал переписать заклинание и при тестах столкнулся с парой проблем решить которые не получается, уверен что где то допустил банальные ошибки. Проблема в том что эффект Weird() срабатывет одновременно рандомное кол-во раз в одну и ту же цель. Т.е. появляется от 1го до 5-6 духов и на цель накладывается соответствующее кол-во эффектов. Собственно вот скрипт OnHeartbeat Код #include "NW_I0_SPELLS"
#include "x0_i0_spells" #include "x2_inc_spellhook" #include "x0_i0_position" #include "x0_i0_match" object oTarget; object oCaster = GetAreaOfEffectCreator(); location RandomLocation (object oTarget, float fRadius, int iLine = TRUE) { if (!iLine) fRadius = IntToFloat(Random(FloatToInt(fRadius))); float iXO = VectorMagnitude(GetPosition(oTarget)) * cos(VectorToAngle(GetPosition(oTarget))); float iYO = VectorMagnitude(GetPosition(oTarget)) * sin(VectorToAngle(GetPosition(oTarget))); float fRndomAngle = IntToFloat(Random(360)); location lNewLoc = Location(GetArea(oTarget),Vector(iXO + fRadius * cos(fRndomAngle),iYO + fRadius * sin(fRndomAngle)),360.0); return lNewLoc; } void CreatePhantom() { location lRandom = RandomLocation(oTarget, 8.0, TRUE); object oPhantom = CreateObject(OBJECT_TYPE_CREATURE, "nw_wraith", lRandom, FALSE, ""); ActionDoCommand(TurnToFaceObject(oTarget, oPhantom)); SetImmortal(oPhantom, TRUE); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectEntangle(), oPhantom); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHaste(), oPhantom); DelayCommand(1.0, AssignCommand(oPhantom, ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER, oTarget, PROJECTILE_PATH_TYPE_DEFAULT))); DestroyObject(oPhantom, 2.0); } void ApplyEffect() { int nAbility = GetCasterAbilityModifier(oCaster); int nSpellFocus; if (GetHasFeat(FEAT_EPIC_SPELL_FOCUS_ILLUSION, oCaster)) { nSpellFocus = 6; } else if (GetHasFeat(FEAT_GREATER_SPELL_FOCUS_ILLUSION, oCaster)) { nSpellFocus = 4; } else if (GetHasFeat(FEAT_SPELL_FOCUS_ILLUSION, oCaster)) { nSpellFocus = 2; } else { nSpellFocus = 0; } int nSpellDC = 19 + nAbility + nSpellFocus; int fSchool; if (GetHasFeat(FEAT_EPIC_SPELL_FOCUS_ILLUSION, oCaster)) { fSchool = 3; } else if (GetHasFeat(FEAT_GREATER_SPELL_FOCUS_ILLUSION, oCaster)) { fSchool = 2; } else if (GetHasFeat(FEAT_SPELL_FOCUS_ILLUSION, oCaster)) { fSchool = 1; } else { fSchool = 1; } int nRounds = d2(fSchool); effect eFrightened = EffectFrightened(); effect eParalyzed = EffectParalyze(); effect ePetrified = EffectPetrify(); effect eVisFrightened = EffectVisualEffect(218); effect eVisParalyzed = EffectVisualEffect(232); effect eVisPetrified = EffectVisualEffect(351); effect elFrightened = EffectLinkEffects(eVisFrightened, eFrightened); effect elParalyzed = EffectLinkEffects(eVisParalyzed, eParalyzed); effect elPetrified = EffectLinkEffects(eVisPetrified, ePetrified); int nRandom = Random(3); if(!MySavingThrow(SAVING_THROW_WILL, oTarget, nSpellDC, SAVING_THROW_TYPE_NONE, oCaster)) { if(nRandom == 0) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, elFrightened, oTarget, RoundsToSeconds(nRounds)); } else if(nRandom == 1) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, elParalyzed, oTarget, RoundsToSeconds(nRounds)); } else { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, elPetrified, oTarget, RoundsToSeconds(nRounds)); } } } void Weird() { CreatePhantom(); DelayCommand(2.5, ApplyEffect()); } void main() { oTarget = GetFirstInPersistentObject(); while(GetIsObjectValid(oTarget)) { if(GetIsPC(oTarget)) { SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_WEIRD)); if(!GetHasSpellEffect(SPELL_WEIRD,oTarget)) { Weird(); } } oTarget = GetNextInPersistentObject(); } } |
![]()
Сообщение
#3333
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
GetFirstInPersistentObject/GetNextInPersistentObject используется для поиска существ внутри триггеров, вряд ли это то, что нужно для заклинания. Ну и чтобы оно точно искало этих существ, все равно функции нужны параметры.
Для спеллов обычно берут GetFirstObjectInShape. |
![]()
Сообщение
#3334
|
|
Level 1 Класс: Волшебник Характер: Lawful Evil Раса: Человек ![]() |
Дело в том что я делал по аналогии со стандартными заклинаниями Боиварей.. к примеру вот это заклинание http://nwn.wikia.com/wiki/Stonehold работает с такими же функциями.
Кроме того.. когда я сделал пару тестов и они меня вообще в тупик загнали. 1. Добавил для проверки еще один эффект ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); и он срабатывает такое же рандомное кол-во раз как и Weird()... но Код void main() { //float fDelay1 = GetRandomDelay(6.0, 12.0); oTarget = GetFirstInPersistentObject(); while(GetIsObjectValid(oTarget)) { if(GetIsPC(oTarget)) { SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_WEIRD)); if(!GetHasSpellEffect(SPELL_WEIRD, oTarget)) { //DelayCommand(fDelay1, Weird()); [b]ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); Weird();[/b] } } oTarget = GetNextInPersistentObject(); } } но если убрать эффект Weird(), то ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); работает как часы.. Код void main() { //float fDelay1 = GetRandomDelay(6.0, 12.0); oTarget = GetFirstInPersistentObject(); while(GetIsObjectValid(oTarget)) { if(GetIsPC(oTarget)) { SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_WEIRD)); if(!GetHasSpellEffect(SPELL_WEIRD, oTarget)) { //DelayCommand(fDelay1, Weird()); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); [b]//Weird();[/b] } } oTarget = GetNextInPersistentObject(); } } Вышло сузить область поиска ошибки.. Использовал все туже функцию ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oTarget); для проверки Сама по себе она работает правильно. В паре с void CreatePhantom() обе работают криво, а вот в паре с void ApplyEffect() обе работают отлично. Логично что конфликт где то в функции void CreatePhantom(), но не пойму что в ней может быть не так. Все.. извеняюсь за стену текста, проблема вроде решена, помогла минимальная задержка 0.2 перед функцией CreatePhantom() Код void Weird()
{ DelayCommand(0.2, CreatePhantom()); DelayCommand(2.7, ApplyEffect()); } |
![]()
Сообщение
#3335
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Рекомендую вставить какой-то вывод в лог в цикле и посмотреть, сколько раз этот цикл срабатывает, на ком и почему. Что-то типа вывода GetName(oTarget) через SendMessage.
|
![]() ![]() |
Текстовая версия | Сейчас: 7th July 2025 - 11:22 |