![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#26
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Стремление к универсальности в порядке вещей, если есть несколько скриптов, которые делают примерно одно и то же, и есть возможность собрать их в один, не урезая функциональность (возможно, просто с добавлением каких-то объектов типа тех же вейпов либо с привязкой к тегу/рефу/...), то делать это надо (IMG:style_emoticons/kolobok_light/smile.gif)
Не понял, зачем в последнем скрипте тебе DeleteLocalString(), имя прекрасно поменяется и так (IMG:style_emoticons/kolobok_light/smile.gif) И лишний мэйн (IMG:style_emoticons/kolobok_light/declare.gif) |
![]()
Сообщение
#27
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Цитата Не понял, зачем в последнем скрипте тебе DeleteLocalString(), имя прекрасно поменяется и так Ilerien ты не поверишь - не меняется! И вообще творятся "чудеса" всяческие! У меня три "Невера" - "Шадоу", (собственно, ради ПЛ), мой старый "Хордес" и версия 1.69, свежепропатченная. Так вот, одни и те же скрипты то работают, то нет!. И ладно бы еще в разных версиях. Бывает, что не срабатывают в одной и той же версии, но в разных модах! (К примеру, на "Полигоне" все прекрасно, а копирую в "Сказку" и получаю большую фигу!) И ладно бы еще какие навороты с фильмами или вроде того... Нет, "глючат" детские скрипты проверки ветки диалога и тому подобное. Только один пример, для наглядности. В "совершены действия" диалога ставлю Neverwinter Script void main() { object oPC = GetFirstPC(); object oNpc = GetObjectByTag("NPC_TAG"); SetLocalInt(oNpc, "talked", 1); } Или еще проще: Neverwinter Script void main() { SetLocalInt(OBJECT_SELF, "talked", 1); } А потом проверяю, что этот самый "talked" действительно 1, не больше и не меньше: Neverwinter Script int StartingConditional() { int iResult; iResult = GetLocalInt(GetObjectByTag("NPC_TAG"), "talked") == 1; return iResult; } Так вот, на "Полигоне" ветка диалога открывается прекрасно, проверял на нескольких неписях неоднократно. А в "Сказке" то же самое, один в один - не работает. И подобных примеров у меня - множество, каждый описывать - никаких форумов не хватит... Может, наши гуру расскажут что-то полезное об этих, так сказать "универсальных" скриптовых глюках? Ну, которые встречаются наиболее часто. Если не совсем по теме просьба, прошу прощения. Но, думаю, такой "ликбез" для новичков будет полезен. Спасибо P.S. Дабы не отнимать зря время мастеров, объясню сразу: ошибки с настроиками пользователя, свойствами модуля, подключением хаков - исключены. В "Сказке" и "Полигоне" они абсюлютно идентичны. Причины в чем-то другом... |
![]()
Сообщение
#28
|
|
Level 1 Класс: Обыватель Характер: True Neutral Раса: Эльф ![]() |
Хмм. я тоже придложу два простеньких скрипта для новичков. Возможно вы скажете что они СЛИШКОМ простые, но такие мелочи как мне кажется делают игру более правдоподобной и приятной
Итак Я называю его "не лезь - убьет". Что-то вроде ловушки, но без спаса на рефлекс и срабатывает ПОСЛЕ разрушение\убийства объекта. Для замены количества\типа урона меняем DAMAGE_TYPE_SONIC на DAMAGE_TYPE_COLD (например) А циферку 300 в скрипте - на нужное количество урона Neverwinter Script void main()
{ object oPC = GetLastKiller(); while (GetIsObjectValid(GetMaster(oPC))) { oPC=GetMaster(oPC); } if (!GetIsPC(oPC)) return; int DoOnce = GetLocalInt(oPC, GetTag(OBJECT_SELF)); if (DoOnce==TRUE) return; SetLocalInt(oPC, GetTag(OBJECT_SELF), TRUE); effect eEffect; eEffect = EffectDamage(300, DAMAGE_TYPE_SONIC, DAMAGE_POWER_NORMAL); ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC); } |
![]()
Сообщение
#29
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
первый скрипт убрал, тк в НВН2 есть стандартный более гибкий скрипт по сдвигу элаймента, использующий параметры.
по второму: если нужно убийство игрока, лучше использовать не повреждения, а EffectDeath. А то у игрока может быть больше хитов или быть 100% имун на какой-то тип урона. |
![]()
Сообщение
#30
|
|
Level 1 Класс: Обыватель Характер: True Neutral Раса: Эльф ![]() |
можно заменить альтернативно: ставим урон на 10000 и выбераем божественный урон. Против божественной нет иммунов. Итого выходит:
Neverwinter Script void main() { object oPC = GetLastKiller(); while (GetIsObjectValid(GetMaster(oPC))) { oPC=GetMaster(oPC); } if (!GetIsPC(oPC)) return; int DoOnce = GetLocalInt(oPC, GetTag(OBJECT_SELF)); if (DoOnce==TRUE) return; SetLocalInt(oPC, GetTag(OBJECT_SELF), TRUE); effect eEffect; eEffect = EffectDamage(10000, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_NORMAL); ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC); } Ну а это уже собственно с EffectDeath, как заказывали(IMG:style_emoticons/kolobok_light/smile.gif) Без спасов, без ДЦ - просто смерть Neverwinter Script void main() { object oPC = GetLastKiller(); while (GetIsObjectValid(GetMaster(oPC))) { oPC=GetMaster(oPC); } if (!GetIsPC(oPC)) return; object oTarget; oTarget = oPC; effect eEffect; eEffect = EffectDeath(); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 60.0f); } Да, кстате, если в этой строчке заменить слово Death на любой другой эффект - скрипт будет работать. eEffect = EffectDeath(); Например если заменить на Curse - будет курсить статы, а если например на Ability Decrease - будет курсить ловкость. Надеюсь кому-то пригодиться |
![]()
Сообщение
#31
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
в первом посте темы указано, для чего она создана и что сюда писать. Вопросы - в других темах.
|
![]() ![]()
Сообщение
#32
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
можно ли зделать так, чтобы войдя в установленую тригером локацию, над игроком появилась надпись секунды на 3. а потом ищезла и не появлялась.Я хочу зделать чёто типо когда я вхожу куданибуть,например в комнату и ГГ говорил например:милая комнатка.
|
![]()
Сообщение
#33
|
|
Level 2 ![]() Класс: Обыватель Характер: Lawful Good Раса: Полуэльф ![]() |
tyrrael, можно просто сделать так:
Neverwinter Script void main() { object oPC = GetEnteringObject(); // Существо, которое вошло в триггер if (GetIsPC(oPC)) // Проверяем, является ли существо игроком { AssignCommand(oPC, SpeakString("Милая комнатка!")); // Пусть игрок скажет фразу // Следующая строка удаляет триггер. Она нужна, чтобы в следующий раз игрок ничего не сказал. // Если игрок должен говорить каждый раз, как входит в триггер, то строку удаляем :-) DestroyObject(OBJECT_SELF); } } Скрипт ставится на событие OnEnter триггера. Сообщение отредактировал Deirel - Oct 4 2010, 21:23 |
![]()
Сообщение
#34
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
а можете по подробней сказать как зделать чтобы npc тупо ходили по локации днём и ночью шли в свои дома и стояли там до дня а потом опять ходили по городу
|
![]()
Сообщение
#35
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
а можете по подробней сказать как зделать чтобы npc тупо ходили по локации днём и ночью шли в свои дома и стояли там до дня а потом опять ходили по городу а еще кушали, какали, ходили на работу, занимались сексом... Да, мы знаем, как это делать! Подробности в этой теме, в сообщении №16. |
![]()
Сообщение
#36
|
|
Отверженный ![]() ![]() ![]() ![]() Класс: Теневой Танцор Характер: Neutral Good Раса: Баатезу ![]() |
а еще кушали, какали, ходили на работу, занимались сексом... Да, мы знаем, как это делать! Подробности в этой теме, в сообщении №16. (IMG:style_emoticons/kolobok_light/lol.gif) |
![]()
Сообщение
#37
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Наверное, многим известно, что к 1.69 галочка "No interrupt", регулирующая, может ли игрок тем или иным образом прервать диалог, перестала работать. Что очень плохо для синглплеерных модулей - зачастую преждевременное прерывание диалога может либо разрушить всю игровую логику, либо нагрузить скриптера кучей лишних проверок. Чтобы этого избежать, можно воспользоваться функционалом катсцен.
Стандартные OnConversation всех NPC в конечном итоге приводят к NW_C2_DEFAULT4, который и надо поменять следующим образом, добавив две строчки (выделены жирным): Neverwinter Script //::////////////////////////////////////////////////// //:: NW_C2_DEFAULT4 /* Default OnConversation event handler for NPCs. */ //::////////////////////////////////////////////////// //:: Copyright © 2002 Floodgate Entertainment //:: Created By: Naomi Novik //:: Created On: 12/22/2002 //::////////////////////////////////////////////////// #include "nw_i0_generic" void main() { // * if petrified, jump out if (GetHasEffect(EFFECT_TYPE_PETRIFY, OBJECT_SELF) == TRUE) { return; } // * If dead, exit directly. if (GetIsDead(OBJECT_SELF) == TRUE) { return; } // See if what we just 'heard' matches any of our // predefined patterns int nMatch = GetListenPatternNumber(); object oShouter = GetLastSpeaker(); if (nMatch == -1) { // Not a match -- start an ordinary conversation if (GetCommandable(OBJECT_SELF)) { ClearActions(CLEAR_NW_C2_DEFAULT4_29); SetCutsceneMode(GetFirstPC()); //ДОБАВЛЕНО BeginConversation(); } else // * July 31 2004 // * If only charmed then allow conversation // * so you can have a better chance of convincing // * people of lowering prices if (GetHasEffect(EFFECT_TYPE_CHARMED) == TRUE) { ClearActions(CLEAR_NW_C2_DEFAULT4_29); SetCutsceneMode(GetFirstPC()); // ДОБАВЛЕНО BeginConversation(); } } // Respond to shouts from friendly non-PCs only else if (GetIsObjectValid(oShouter) && !GetIsPC(oShouter) && GetIsFriend(oShouter)) { object oIntruder = OBJECT_INVALID; // Determine the intruder if any if(nMatch == 4) { oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER"); } else if (nMatch == 5) { oIntruder = GetLastHostileActor(oShouter); if(!GetIsObjectValid(oIntruder)) { oIntruder = GetAttemptedAttackTarget(); if(!GetIsObjectValid(oIntruder)) { oIntruder = GetAttemptedSpellTarget(); if(!GetIsObjectValid(oIntruder)) { oIntruder = OBJECT_INVALID; } } } } // Actually respond to the shout RespondToShout(oShouter, nMatch, oIntruder); } // Send the user-defined event if appropriate if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE)); } } Необходимо также поменять стандартный скрипт выхода из диалога nw_walk_wp, чтобы отменить повешанную ранее катсцену: Neverwinter Script #include "NW_I0_GENERIC" void main() { DelayCommand(1.2f,SetCutsceneMode(GetFirstPC(),FALSE)); WalkWayPoints(); } Задержка в 1.2f здесь необязательна, но избавляет от резкого рывка камеры по выходу из диалога. По такому же принципу меняются и все другие скрипты. Например, скрипт для размещаемых объектов x0_startconv: Neverwinter Script void main()
{ SetCutsceneMode(GetFirstPC()); ActionStartConversation(GetLastUsedBy()); } Сообщение отредактировал Talarasha - Jul 30 2011, 18:54 |
![]()
Сообщение
#38
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
Послушайте,пожалуйста.
Мой случай происходит дома у НПС.Мне нужно,что бы этот NPC подбежал и сам начал разговор. Мне не нужен весь скрипт,только часть.Вот я например - сделал триггер,когда герой на него наступает,над НПС появляется текст "Оу,к нам гости!",он подбегает ко мне и тупо стоит.А мне нужно,что бы появилась панель разговора.Как это осуществить? П.С. Aiwan,спасибо за руководство игроделу.Помогает несказанно. Вот скрипт,который я позаимствовал у "Bioware Corp.",предварительно отредактировав. Здесь наш НПС сидит на полу и сфокусирован на любом обьекте перед ним,просто нужно его создать и указать TAG в скрипте. void main() { int nAnim = ANIMATION_LOOPING_SIT_CROSS; object oFocus = GetNearestObjectByTag([ТAG=на котором сфокусирован НПС]); SetLocalObject(OBJECT_SELF, "FOCUS", oFocus); SetLocalInt(OBJECT_SELF, "ANIMATED", nAnim); ActionPlayAnimation(nAnim, 1.0, 9999.9); } Проверял!Работает! Послушайте,пожалуйста. Мой случай происходит дома у НПС.Мне нужно,что бы этот NPC подбежал и сам начал разговор. Мне не нужен весь скрипт,только часть.Вот я например - сделал триггер,когда герой на него наступает,над НПС появляется текст "Оу,к нам гости!",он подбегает ко мне и тупо стоит.А мне нужно,что бы появилась панель разговора.Как это осуществить? П.С. Aiwan,спасибо за руководство игроделу.Помогает несказанно. Вот скрипт,который я позаимствовал у "Bioware Corp.",предварительно отредактировав. Здесь наш НПС сидит на полу и сфокусирован на любом обьекте перед ним,просто нужно его создать и указать TAG в скрипте. Neverwinter Script void main() { int nAnim = ANIMATION_LOOPING_SIT_CROSS; object oFocus = GetNearestObjectByTag([ТAG=на котором сфокусирован НПС]); SetLocalObject(OBJECT_SELF, "FOCUS", oFocus); SetLocalInt(OBJECT_SELF, "ANIMATED", nAnim); ActionPlayAnimation(nAnim, 1.0, 9999.9); } Проверял!Работает! |
![]()
Сообщение
#39
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Lawful Evil Раса: Человек ![]() |
1) Извиняюсь за оффтоп
2) Эта тема не для задавания вопросов, но публикации скриптов, которые могут помочь новичкам для 3) Ответ - посмотри на лексиконе (онлайн-версия, там же вроде можно и скачать) материал по ActionStartConversation - это процедура (по лексикону - функция) начала разговора. Так же там имеет смысл посмотреть Function Category - Conversation. А так же имеет смысл просто туда заглядывать, архиполезный материал у них там, хех 4) Написал бы в ЛС/ICQ, но первое пока не доступно ReZkiy, второе же не указано в профиле. Еще раз извиняюсь за оффтоп |
![]()
Сообщение
#40
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
1) Извиняюсь за оффтоп 2) Эта тема не для задавания вопросов, но публикации скриптов, которые могут помочь новичкам для 3) Ответ - посмотри на лексиконе (онлайн-версия, там же вроде можно и скачать) материал по ActionStartConversation - это процедура (по лексикону - функция) начала разговора. Так же там имеет смысл посмотреть Function Category - Conversation. А так же имеет смысл просто туда заглядывать, архиполезный материал у них там, хех 4) Написал бы в ЛС/ICQ, но первое пока не доступно ReZkiy, второе же не указано в профиле. Еще раз извиняюсь за оффтоп Простите за оффтоп,danila_alekseevich@mail.ru.Спасибо,с твоей помощью разобрался!У тебя есть готовые модули?Или пробники?Присылай,я посмотрю.Сам пока только втянулся в процесс,мой модуль еще в ранней стадии.Извиняюсь за оффтоп. |
![]()
Сообщение
#41
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
Мастера!Подскажите пожалуйста,что нужно в этой ситуации:
Я сделал внешне эффект заклинания на пещере некроманта.(Увядание,только эффект) Что нужно делать,что бы этот эффект исчезал после смерти некроманта??? |
![]()
Сообщение
#42
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
Если кому нужно: Мой личный скрипт мертвого.
Neverwinter Script //::///////////////////////////////////////////////////
//:: Created By: Script Wizard //:: Created On: 12/08/2011 //:://///////////////////////////////////////////////// void main() { KillAndReplaceDecorative(OBJECT_SELF); } |
![]()
Сообщение
#43
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата Если кому нужно: Мой личный скрипт мертвого. Твой "личный скрипт" не содержит ничего, кроме вызова несуществующей функции. Он ничего не сделает и даже не скомпилируется. Подозреваю, что вызов ты просто стащил с чужого модуля, а реализацию (или содержащий ее инклюд) выписать не догадался (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) . Цитата Подскажите пожалуйста,что нужно в этой ситуации: На OnDeath-событие некроманта надо вставить конструкцию по поиску и удалению нужного эффекта. Эффект ищется перебором всех доступных (пока GetIsEffectValid() текущего эффекта выдает истину), удаление делается функцией RemoveEffect() (она работает не только для creature). Пример можно посмотреть в лексиконе: RemoveEffect(). Сообщение отредактировал Talarasha - Sep 3 2011, 09:25 |
![]()
Сообщение
#44
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
Твой "личный скрипт" не содержит ничего, кроме вызова несуществующей функции. Он ничего не сделает и даже не скомпилируется. Подозреваю, что вызов ты просто стащил с чужого модуля, а реализацию (или содержащий ее инклюд) выписать не догадался (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) . На OnDeath-событие некроманта надо вставить конструкцию по поиску и удалению нужного эффекта. Эффект ищется перебором всех доступных (пока GetIsEffectValid() текущего эффекта выдает истину), удаление делается функцией RemoveEffect() (она работает не только для creature). Пример можно посмотреть в лексиконе: RemoveEffect(). Зачем мне воровать?У меня есть у кого спросить.У меня он работает.ОТЛИЧНО работает.Почти все термины,переменные,образцы - английский язык.Если его перевести для себя все - нужно только уметь соединять правильно,поэтому я очень долго мучаюсь даже с простыми наборами... ЗАБЫЛ!Слот OnSpawn - вот куда подходит моя муть. Сообщение отредактировал ReZkiy - Sep 3 2011, 14:06 |
![]()
Сообщение
#45
|
|
Level 6 ![]() ![]() Класс: Маг Характер: Lawful Evil Раса: Нежить ![]() |
Цитата ЗАБЫЛ!Слот OnSpawn - вот куда подходит моя муть. Возьми любого NPC и выставь в этот слот свой скрипт, как он написан. Увидишь, что он не работает. По очень простой причине не работает - потому что это просто ничего не значащий набор букв до тех пор, пока в скрипт не добавлена реализация этой функции напрямую или инклюдом. Конкретно у тебя используется вызов ф-ции из инклюда x0_i0_corpses, автор Naomi Novik, и без подключения этого инклюда скрипт не будет компилироваться. Реализацию ф-ции интересующиеся могут посмотреть там же. Суть ее отличия - убийство таргета без учета "plot"-флага. Цитата Почти все термины,переменные,образцы - английский язык.Если его перевести для себя все - нужно только уметь соединять правильно,поэтому я очень долго мучаюсь даже с простыми наборами... Складываются в вижу слова не, смысл предложение. Сообщение отредактировал Talarasha - Sep 3 2011, 15:16 |
![]()
Сообщение
#46
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
Возьми любого NPC и выставь в этот слот свой скрипт, как он написан. Увидишь, что он не работает. По очень простой причине не работает - потому что это просто ничего не значащий набор букв до тех пор, пока в скрипт не добавлена реализация этой функции напрямую или инклюдом. Конкретно у тебя используется вызов ф-ции из инклюда x0_i0_corpses, автор Naomi Novik, и без подключения этого инклюда скрипт не будет компилироваться. Реализацию ф-ции интересующиеся могут посмотреть там же. Суть ее отличия - убийство таргета без учета "plot"-флага. Складываются в вижу слова не, смысл предложение. Какая версия Невервинтера у тебя?Ъ У меня работает,когда компливировал он мне выдал "Ошибка!Файл существует с данным содержанием существует!Заменить?"я и заменил.У меня работает. Сообщение отредактировал ReZkiy - Sep 4 2011, 12:51 |
![]()
Сообщение
#47
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
ЗАБЫЛ!Слот OnSpawn - вот куда подходит моя муть. У меня работает. А по каким признакам ты определил, что это работает? (IMG:style_emoticons/kolobok_light/rolleyes.gif) |
![]()
Сообщение
#48
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
А по каким признакам ты определил, что это работает? (IMG:style_emoticons/kolobok_light/rolleyes.gif) Дохлый валяется. Люди!А можно сделать так,что бы в трактире НПС сидел на указанной точке (WayPoint)а то когда лавку делаешь,там и столы и стулья уже есть,но пустые и сесть на них нельзя.Вопрос - На кой черт они там стоят если на них не сядешь??? |
![]()
Сообщение
#49
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Цитата А можно сделать так,что бы в трактире НПС сидел на указанной точке (WayPoint)а то когда лавку делаешь,там и столы и стулья уже есть,но пустые и сесть на них нельзя. В месте посадки создаётся невидимый плейс со скриптом стула. Скрипт стула тут раз 100 думаю выкладывали.
|
![]()
Сообщение
#50
|
|
Level 5 ![]() ![]() Класс: Вор Характер: Neutral Good Раса: Человек ![]() |
|
![]() ![]() |
Текстовая версия | Сейчас: 28th April 2025 - 01:05 |