![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2396
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
Noah, простой скрипт, взята функция "Талента" лечения из инклуда "x0_i0_talent":
NSS if (GetActionMode(oPercep, ACTION_MODE_PARRY) == TRUE) { if (TalentHealingSelf()) { // Подлечиться; } } Чтобы заработал скрипт, необходимо добавить в инвентарь противника бутылки лечения. Сработает, когда у противника жизни станет меньше половины полной жизни, а напавший войдет в режим парирования. All Всем, кто программирует, известен цикл "for", позволяющий сделать счетчик из числа, границы которого для Вот сложения, вычитания, и т.д., описываются в шапке цикла. Есть универсальный цикл для снятия вещей с персонажа: NSS for (i = 0; i < NUM_INVENTORY_SLOTS; i++) { oItem = GetItemInSlot(i, oPC); if (GetIsObjectValid(oItem)) AssignCommand(oPC, ActionUnequipItem(oItem)); } Сам цикл работает без проблем, к нему претензий нет, но не срабатывает при каждом новом проходе функция, ради который весь цикл и создавался, "ActionUnequipItem" (выполняется только 4 раза). Экспериментальным путем удалось установить, что в стэке может одновременно находиться лишь 4 действия. Т.е., если эти действия еще не выполнились, то все последующие окажутся вне стэка, и соответственно, не выполнятся. Что же делать? Ведь данный цикл раньше работал отлично. Тогда я решил немного перехитрить скрипт, заставив цикл выполняться не 1 раз, а 4 раза. Как бы проверяя, а точно ли все вещи сняты?! В итоге получилось следующее: NSS void TakeItemsFromPC(object oPC) { int k = GetLocalInt(oPC, "DropThings"); if (k > 3) { DeleteLocalInt(oPC, "DropThings"); AssignCommand(oPC, ClearAllActions()); return; } int i; object oItem; for (i = 0; i < 14; i++) { oItem = GetItemInSlot(i, oPC); if (GetIsObjectValid(oItem)) { AssignCommand(oPC, ActionUnequipItem(oItem)); } } SetLocalInt(oPC, "DropThings", ++k); DelayCommand(0.2, TakeItemsFromPC(oPC)); } void main() { TakeItemsFromPC(GetPCSpeaker()); } Не уверен, что это лучшее решение, но вещи снимаются все, правда не за 1 цикл. У меня возник вопрос, можно ли как-нибудь эту операцию осуществить иначе? Сообщение отредактировал Zirrex - Jul 12 2006, 00:56 |
![]()
Сообщение
#2397
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Chaotic Neutral Раса: Полуэльф ![]() |
Спасиб,Zirrex!1.B скриптах для новичков Айван приводил подобный скрипт,глянь.2.Как скриптом добавить крылья,хвост или костяну руку?Иль отобрать!Или это только через 2dа?
|
![]()
Сообщение
#2398
|
|
Level 12 ![]() Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] ![]() |
В стеке может находиться достаточно много действий, чтобы забыть об их количестве, если дело не касается катсценок, попробуй очистить стэк существа перед перебором.
По другому - копировать вещи CopyItem'ом в инвернтарь существа, а из слотов - удалять. Действия - побоку. |
![]()
Сообщение
#2399
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Вообще в стеке может быть 75 действий. Просто сам скрипт может в одном из блоков очищать акции. РС надо время на то что бы снять предмет. Попробуй накидать акций, повесить на каждую задержку в полсекунды и закройстек РС.
|
![]()
Сообщение
#2400
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
QUOTE(Noah @ Jul 12 2006, 05:43) [snapback]87624[/snapback] 2.Как скриптом добавить крылья,хвост или костяну руку?Иль отобрать!Или это только через 2dа? Читать эту ссылку. От себя, как известно такие свойства появляются на эпическом уровне, у определенных классов, (например, светящиеся глаза, у монаха) значит попробуй добавить NPC несколько лишних уровней. |
![]()
Сообщение
#2401
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
azathoth, да, я думал про такой вариант, тем более, что он работает отлично, но что случилось с нашим циклом, вот что я хотел узнать. Ведь работал он раньше правильно, теперь же нет.
Aiwan, может быть оно и так, только не для варианта с циклом. Потом, если делать задержку на действие, то это лишит код цикла, и придется все 13 вещей, если они есть, перечислить в одинаковом коде, только каждая строчка будет выполняться с некоторой задержкой. Что, согласись, все же не очень здорово, потому что аналогичную операцию может выполнить и цикл, если бы не одно но. Ладно, если иных вариантов нету, я остановлюсь на своем, потому что он работает нормально. Вообще странно, если максимально действий может быть 75, то куда же они деваются, или просто не успевают выполняться? |
![]()
Сообщение
#2402
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
QUOTE(Dik Morris @ Jul 12 2006, 09:36) [snapback]87631[/snapback] Читать эту ссылку. От себя, как известно такие свойства появляются на эпическом уровне, у определенных классов, (например, светящиеся глаза, у монаха) значит попробуй добавить NPC несколько лишних уровней. Крылья: SetCreatureWingType Хвост: SetCreatureTailType Рука/нога/голова/всё остальное: SetCreatureBodyPart Работает только в 1.67. Сообщение отредактировал virusman - Jul 12 2006, 08:55 |
![]()
Сообщение
#2403
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
2 Zirrex. Они не успевают выполниться.
Лично я копирую все шмотки в сундук и оттуда назад. Все остальное геммор, так как многие события вшиты в движок. Я это говорю к тому что столкнулся с проблемой одеть-снять проклятые вещи в модуле. |
![]()
Сообщение
#2404
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Zirrex, функции одевания и снятия шмоток сами по себе длинные, наверно в движок вшита сопутствующая анимация. Можно попробовать блокировать стек, чтобы исключить возможность сбоя кода. Но все же лучше через Copy и Destroy. Эти функции более быстрые, и можно использовать даже в бою. А вот одеть в бою шмотку – большой геморрой!
NSS void main()
{ object oPC = GetFirstPC(); int i; object oItem = GetItemInSlot(i, oPC); for (i = 0; i < NUM_INVENTORY_SLOTS; i++) { oItem = GetItemInSlot(i, oPC); if (GetIsObjectValid(oItem)) { CopyItem(oItem, oPC); DestroyObject(oItem); } } } // Снимаем все шмотки с героя ему в рюкзак Сообщение отредактировал gennady - Jul 12 2006, 12:21 |
![]()
Сообщение
#2405
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
gennady, в такой цепочке есть один недостаток, если скрипт начнет выполняться, а игрок в этот момент покинет сервер, может произойти известная неприятность, а именно, размножение вещей. Мой вариант хоть и не идеален, потому что заставляет выполняться цикл 4 раза, но, если его немного модифицировать, добавив проверку, а есть ли вообще цель, с которой надо работать, то цикл лишь остановится на полпути, когда цель исчезнет. Вещи же останутся либо на персонаже, либо в инвентаре, но не размножатся.
Чтобы правильно работала такая цепочка, как копирование и удаление, необходимо делать метки на удаляемые вещи, и в момент входа на сервер, проверять, есть ли у персонажа подобные вещи. Если есть, удалять. Скрипт можно укоротить: NSS void main() { object oPC = // тому-то, GetFirstPC не подходит, потому что модуль мультиплейерный int i; object oItem; // object oItem = GetItemInSlot(i, oPC); // лишняя строчка for (i = 0; i < 14; i++) // невидимые объекты нам проверять не нужно, поэтому граница на 14 вещи. { oItem = GetItemInSlot(i, oPC); if (GetIsObjectValid(oItem)) { CopyItem(oItem, oPC); DestroyObject(oItem); } } } Aiwan, осуществляешь копирование через сундук, чтобы персонажу не выводились надписи, что вещь потеряна? Тоже вариант. |
![]()
Сообщение
#2406
|
|
Level 2 ![]() Класс: Маг Характер: Chaotic Evil Раса: Полуэльф ![]() |
Опять же доброго времени суток. Бился я с SQLGetData - так ничего и не получилось. Скрипт все время выдает "пусто", что я не так сделал? Почему скрипт не работает?
NSS #include "aps_include"
void main() { object oPC = GetLastUsedBy(); string sPlayer=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); string sChar=SQLEncodeSpecialChars(GetName(oPC)); string sSQL="SELECT * FROM `nwn_stast` WHERE playername = '"+sPlayer+"' AND charname = '"+sChar+"'"; SQLExecDirect(sSQL); string sName = SQLGetData(0); string sName1 = SQLGetData(1); if(SQLFetch()) { if (sName == sPlayer) { SendMessageToPC(oPC, "sName 0"); } if (sName1 == sPlayer) { SendMessageToPC(oPC, "sName 1"); } } else {SendMessageToPC(oPC, "Пусто");} } |
![]()
Сообщение
#2407
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
QUOTE(OxCom @ Jul 12 2006, 18:01) [snapback]87663[/snapback] Опять же доброго времени суток. Бился я с SQLGetData - так ничего и не получилось. Скрипт все время выдает "пусто", что я не так сделал? Почему скрипт не работает? NSS #include "aps_include" void main() { object oPC = GetLastUsedBy(); string sPlayer=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); string sChar=SQLEncodeSpecialChars(GetName(oPC)); string sSQL="SELECT * FROM `nwn_stast` WHERE playername = '"+sPlayer+"' AND charname = '"+sChar+"'"; SQLExecDirect(sSQL); string sName = SQLGetData(0); string sName1 = SQLGetData(1); if(SQLFetch()) { if (sName == sPlayer) { SendMessageToPC(oPC, "sName 0"); } if (sName1 == sPlayer) { SendMessageToPC(oPC, "sName 1"); } } else {SendMessageToPC(oPC, "Пусто");} } 1. Посмотри лог nwnx_odbc. 2. Повтори тот же самый запрос вне НВНа. |
![]()
Сообщение
#2408
|
|
Level 2 ![]() Класс: Маг Характер: Chaotic Evil Раса: Полуэльф ![]() |
В логе только запрос. Получения инфы там не записано. Вне НВНа все работает.
|
![]()
Сообщение
#2409
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
QUOTE(OxCom @ Jul 12 2006, 19:36) [snapback]87668[/snapback] В логе только запрос. Получения инфы там не записано. Вне НВНа все работает. Поставь в nwnx.ini debuglevel в разделе этого плагина побольше. NWNX инициализируется в модуле? |
![]()
Сообщение
#2410
|
|
Level 2 ![]() Класс: Маг Характер: Chaotic Evil Раса: Полуэльф ![]() |
Вот жеж я балда. самое главное и забыл (IMG:style_emoticons/kolobok_light/smile.gif) ) SQLInit();
Спасибо. |
![]() ![]()
Сообщение
#2411
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
Мне нужно чтобы после смерти всех врагов в области заработал нужный мне скрипт.
Может, кто выложите, если нетрудно? |
![]()
Сообщение
#2412
|
|
Level 4 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить ![]() |
После убийства 10 врагов, открывается нужный скрипт. (Число измени, по желанию)
На onDeath мобов: NSS void main() { object oKiller = GetLastKiller(); // Проверка, если НПЦ убил игрок, или хенч, if (GetIsPC(oKiller) || GetIsPC(GetHenchman(oKiller))) { if (GetLocalInt(oKiller, "Death_hostile") == 10) { ExecuteScript("Название нужного скрипта", Тот кто открывает его); } SetLocalInt(oKiller, "Death_hostile", GetLocalInt(oKiller, "Death_hostile")+1); } } ЗЫ: не проверял, но по идеи все должно работать. (IMG:style_emoticons/kolobok_light/biggrin.gif) |
![]()
Сообщение
#2413
|
|
Level 6 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить NWN: Скриптинг [PW] ![]() |
QUOTE Мне нужно чтобы после смерти всех врагов в области заработал нужный мне скрипт. QUOTE После убийства 10 врагов, открывается нужный скрипт. (Число измени, по желанию) геморой(а если динамичное число? О_о)..GetFirstObjectInArea,GetNextObjectInArea проще Сообщение отредактировал [MoF]Darth_Nick - Jul 31 2006, 20:11 |
![]()
Сообщение
#2414
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
лучше на он_спавн всех врагов добавлять в какой-то список, и потом проверять их существование..
а не GetFirstObjectInArea ./ GetObjectByTag / ets особенно для PW o_O загрузка проца прыгает до <цензура> (IMG:style_emoticons/kolobok_light/shok.gif) |
![]()
Сообщение
#2415
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
на onspawn мобов в локе
NSS object oArea = GetArea(OBJECT_SELF); SetLocalInt(oArea, "mob_count", GetLocalInt(oArea, "mob_count")+1); на ondeath моба NSS object oArea = GetArea(OBJECT_SELF); int mob_count = GetLocalInt(oArea, "mob_count")-1; // 1 was killed now SetLocalInt(oArea, "mob_count", mob_count); if(mob_count <= 0) SendMessageToPC(GetLastDamager(OBJECT_SELF), "You killed all!"); |
![]()
Сообщение
#2416
|
|
Level 1 Класс: Некромант Характер: Chaotic Good Раса: Полуэльф ![]() |
Всем доброго времени суток! Делая свой модуль сегодня, я столкнулся с проблемкой..
В самом модуле у меня идёт стандартное пенальти на экспу и деньги при смерти, но мне нужно, чтоб в определеннойй арее за смерть ничего не снимали. Сколько не парился, никак не получилось, чар респавнится с потерей опыта и денег и в стандартном месте (мне нужно, чтоб он воскресал в той арее где смерть не дает пенальти). По сему решил я к вам обратиться, может наставите на путь истинный (IMG:style_emoticons/kolobok_light/declare.gif) ))) Вот собственно финальный вариант того, что у меня получилось (вернее не получилось!) NSS void main()
{ object oRespawner = GetLastRespawnButtonPresser(); object oSpawnPoint = GetObjectByTag("portal"); object oSpawnPoint2 = GetObjectByTag("soznanie_portal"); object oArea = GetArea(oSpawnPoint2); if (GetArea(oRespawner) == oArea) { AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint2))); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner); RemoveEffect(oRespawner, EffectDeath()); } else; int nXP = GetXP(oRespawner); int nPenalty = 50 * GetHitDice(oRespawner); int nHD = GetHitDice(oRespawner); int nMin = ((nHD * (nHD - 1)) / 2) * 1000; int nNewXP = nXP - nPenalty; if (nNewXP < nMin) nNewXP = nMin; SetXP(oRespawner, nNewXP); int nGoldToTake = FloatToInt(0.10 * GetGold(oRespawner)); if (nGoldToTake > 10000) { nGoldToTake = 10000; } AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint))); AssignCommand(oRespawner, TakeGoldFromCreature(nGoldToTake, oRespawner, TRUE)); DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oRespawner, FALSE)); DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oRespawner, FALSE)); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner); RemoveEffect(oRespawner, EffectDeath()); } |
![]()
Сообщение
#2417
|
|
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
NSS RemoveEffect(oRespawner, EffectDeath()); } else; //^(IMG:style_emoticons/kolobok_light/i-m_so_happy.gif) ^ мдя обрами скобочками блок скрипта с выдачей пенальти и убери ";" после else. либо в первом блоке после RemoveEffect(..) поставь "return;". морду какую-то самодовольную вставило вместо пары галочек(^)... |
![]()
Сообщение
#2418
|
|
Level 4 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить ![]() |
Первое что увидал:
NSS else; Делай так: NSS else { // Выражение } dumbo, пардон не заметил. (IMG:style_emoticons/kolobok_light/pleasantry.gif) (IMG:style_emoticons/kolobok_light/biggrin.gif) Сообщение отредактировал Waromon - Aug 3 2006, 21:04 |
![]()
Сообщение
#2419
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
NSS RemoveEffect(oRespawner, EffectDeath()); - лишнееа так - вместо елсе лучше поставь NSS if (GetArea(oRespawner) == oArea) {
... return; } // тут было else; |
![]()
Сообщение
#2420
|
|
Level 1 Класс: Некромант Характер: Chaotic Good Раса: Полуэльф ![]() |
От спасибо вам, все работает! Ещё один маленький шажок для меня в познаниях скриптинга))
А, вот ещё никак не могу разобраться: Скрипт на ОнДэф одного перца. Когда он умирает, должны исчезнуть плэйсеблы лучи (иметируют своего рода клетку) и ловушка. Так же другой перец, находящийся в самой как бы клетке должен подбежать ко мне и сдестроиться. Из этого всего почему-то работает только ActionForceMoveToObject и DestroyObject oRad.. Ну и переменная начисляется. NSS void main()
{ object oKiller = GetLastKiller(); object oRays = GetObjectByTag("gore_ray"); object oTrap = GetObjectByTag("gore_trap"); object oRad = GetObjectByTag("radost"); AssignCommand(oRays, ActionDoCommand(DestroyObject(oRays))); AssignCommand(oTrap, ActionDoCommand(DestroyObject(oTrap))); AssignCommand(oRad, ActionForceMoveToObject(oKiller, TRUE, 1.0, 5.0)); AssignCommand(oRad, ActionDoCommand(DestroyObject(oRad))); DelayCommand(0.5, SetCommandable(FALSE, oRad)); DelayCommand(0.5, SetCommandable(FALSE, oRays)); DelayCommand(0.5, SetCommandable(FALSE, oTrap)); SetLocalInt(oKiller, "cleanmind", GetLocalInt(oKiller, "cleanmind") + 1); } Сообщение отредактировал xHageN - Aug 4 2006, 12:11 |
![]() ![]() |
Текстовая версия | Сейчас: 23rd July 2025 - 17:08 |