![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
В этой теме предлагаю постить "странности" скриптов, различные тонкости эвентов, функций и т.п.
Локальные переменные на итемах из инвентаря игрока сохраняются в файле Для меня это было откровением и нашел я это случайно. Если выставить локальную переменную на итем - она сохраняется в .bic файле игрока, что иногда очень удобно (особенно вместе с настоящими nodrop-итемами, многие вещи так делать гораздо проще, чем юзать БД) Событие модуля OnAcquireItem вызывается при _входе_ игрока на шард для _каждой_ вещи из его инвентаря Тоже самое и с событием OnPlayerEquipItem - оно вызывается при входе игрока на шард для каждой одетой на персонажа вещи В событие OnClientLeave не работают некоторые функции для работы с объектом игрока GetPlayername, GetPCIPAddress и некоторые другие. Но локальные переменные читать можно, так что если вам нужны эти данные - занесите их в переменные при входе игрока на шард Событие OnUnAcquireItem вызывается при _попытке_ продажи итема в магазин, даже если эта вещь не покупается Если нет денег у НПС-покупателся, возможно и на plot\stolen то же самое будет. Вероятно что и OnAcquireItem будет вызываться. Бага функции TakeGoldFromCreature() Надо дополнительно проверять текущее действие, if (GetCurrentAction(oPC) == ACTION_DROPITEM) {чит} Т.е. можно задать действие "выложить деньги на землю", некоторое время сервер будет считать, что все деньги по прежнему у вас. если сервер в это время отнимает деньги у игрока функцией TakeGoldFromCreature() - при небольшом навыке на землю упадет _вся_ сумма, не учитывая те, что забрали функцией. Баг особо опасен для банков (IMG:style_emoticons/kolobok_light/smile.gif) (так делались первые миллионы на Эксизе, когда только появился первый банк) Сообщение отредактировал _kaa_ - Jun 24 2004, 17:51 |
![]()
Сообщение
#2
|
|
Level 3 ![]() Класс: Тайный Лучник Характер: Neutral Good Раса: Эльф NWN: Скриптинг [PW] ![]() |
Цитата В событие OnClientLeave не работают некоторые функции для работы с объектом игрока Самое интересное, что при этом GetIsPC() возвращает FALSE. Еще состояние "не до конца вышедшего" игрока можно застать не только из OnClientLeave, но из любого другого скрипта, выполняющегося примерно в то же время. |
![]()
Сообщение
#3
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Иногда полезно читать лексикон (IMG:style_emoticons/kolobok_light/smile.gif)
При работе функции DestroyObject()объект уничтожится только когда завершится скрипт, вызвавший эту функцию, а до этого момента объект все еще существует. Т.е. получается функция только помечает объект на удаление, а удаляется он сборщиком мусора после завершения скрипта. |
![]()
Сообщение
#4
|
|
Level 10 ![]() ![]() ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек NWN: Скриптинг [PW] ![]() |
Скорее не баг, а недодуманность скриптеров в Стандартном Крафте.
Проверял на версии 1.62. Когда у вас есть материал для ловушек, напрмер сустав скелета(Skeleton's Knuckle) Жмем на Crafting Skills, в диалоге выбираете Craft Traps. В следующем диалоге доступна маленькая ловушка с негативной энергией. Не закрывая диалог открываем инвентарь и выкладываем сустав скелета. Жмем - сделать маленькую негативную ловуку - вуаля: Сустав лежит рядом с вами на земле а у вас в инвентаре (если был прокачан скилл crafting traps) свежая ловушечка. Ай да раздолье плутам(IMG:style_emoticons/kolobok_light/smile.gif) )) З.Ы. С оружием и броней такое уже не прокатило(IMG:style_emoticons/kolobok_light/sad.gif) |
![]()
Сообщение
#5
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Это легко лечится. Ставить повторную проверку компонентов на фразе, что перед крафтом.
|
![]()
Сообщение
#6
|
|||
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Очень веселая недокументировання багафича со встроенной БД. Был баг непонятный, долго копал - что за фигня, в БД одно значение, а читает и возвращает другое. Стал разбираться. Вот что оказалось: SetCampaignInt(string, string, int, object)
Переменная sVarName - это имя поля в базе данных. Но если оно оканчивается на цифру - начинаются сюрпризы. Скажем если мы читаем из БД три переменных: `xp_1` `xp_11` `xp_111` а в самой базе есть только одна запись - `xp_11`= 10. При чтение `xp_1` вернет значение переменой `xp_11`, 10, При чтение `xp_11` тоже вернет значение переменой `xp_11`, 10, При чтение `xp_111` вернет 0. Блеск, правда? (IMG:style_emoticons/kolobok_light/smile.gif) Если добавить в конце переменных любой символ - все работает нормально. Вот такие веселые грабли. |
||
![]()
Сообщение
#7
|
|||
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Цитата(Valleo @ Jul 27 2004, 22:05) Очень интерестная заметка. Иногда нам нужно, чтобы из функции возвращался стек значений. Например функция, которая подсчитывает количество членов в партии, находит средний уровень партии. Нам бы нужно и то число, и то, но мы недолго думая создаем функцию, которая заново пересчитает всех членов партии. Я же нашел более интерестный способ =) Функции умеют возвращать структуры:
Пользуйся, гораздно удобнее. Сообщение отредактировал _kaa_ - Jul 28 2004, 08:23 |
||
![]()
Сообщение
#8
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Интересный прикол в событии onPhysicalDamage. Есть функция, GetLastWeaponUsed().
Если в руках оружие - возвращает оружие. Если нет - возвращает наручни или перчатки (!) Если и их нет - то возвращает OBJECT_INVALID Логически - все верно, но не ожидал я такого от биоваре (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#9
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Не сохраняйте location в БД.
Сохраняется она "правильно" даже в стандартной БД, т.е. ее перезапись не ведет к увеличению размера БД. НО, сам формат... Запись выглядит примерно так: AREA_ID, X,Y,Z,Facing Проблема с AREA_ID. Он выставляется то ли еще в тулсете, то ли при распаковке и часто меняется при добавлении\удалении локаций. Т.е. после этого location указывает ХЗ куда. Если очень нужно хранить - задавайте руками (в тулсете, кнопка variable) локальную переменную для локации с номером или же задавайте уникальные теги локациям (не проверял) и с ними работайте. Если есть возможность обойтись вейпоинтом - так и делайте. |
![]()
Сообщение
#10
|
|
Level 4 ![]() ![]() Класс: Друид Характер: Neutral Evil Раса: Эльф NWN: Скриптинг [PW] ![]() |
Вообще легче всего сохранять локу на какой нить плот-итем в инвентаре, который невозможно выкинуть и т.п.
Или же делать LocationToString а потом наоборот. |
![]()
Сообщение
#11
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Цитата(Valleo @ Aug 9 2004, 15:24) Вообще легче всего сохранять локу на какой нить плот-итем в инвентаре, который невозможно выкинуть и т.п. Или же делать LocationToString а потом наоборот. Да, если еще написать обратную функцию StringToLocation и следить за уникальностью тегов локаций в модуле - то достаточно просто и надежно получится. |
![]()
Сообщение
#12
|
|||||
Level 4 ![]() ![]() Класс: Друид Характер: Neutral Evil Раса: Эльф NWN: Скриптинг [PW] ![]() |
StringToLocation
LocationToString
|
||||
![]()
Сообщение
#13
|
|||
Level 10 ![]() ![]() ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек NWN: Скриптинг [PW] ![]() |
Интересная фишка тут мне вечерком подвернулась, хотя может и старо, но пока нигде не видел. Сначала маялся чтобы на "OnHeartbeat" в модуле на игрока выполнялся определенный скрипт. Можно конечно замутить GetFirstPC и GetNextPC, в таком случае сервер будет перебирать всех игроков. Почитал Lексикон и вот что нашел в заметках:
Первожу на русский. Дело в том, что у игрока нет эвента OnHearbeat, НО(!) если вы создадите скрипт и назовете его "default" он будет автоматически вписан в OnHeartBeat игрока. Проверил - работает... Чудеса да и только, товарищи... :this: |
||
![]()
Сообщение
#14
|
|
4-х Кубовый ![]() Класс: Некромант Характер: Lawful Evil Раса: Человек NWN: Скриптинг [Sn] Проклятие Левора ![]() |
Аваддон
Да ну нафиг!!! Это мега фича!! Сенки! :good: |
![]()
Сообщение
#15
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
стоп..а если игроков много...те у всех одинаковый ХБ?
|
![]()
Сообщение
#16
|
|
Level 10 ![]() ![]() ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек NWN: Скриптинг [PW] ![]() |
Лекс не понял твоего вопроса... У каждого игрока на HB будет включаться этот скрипт:)
|
![]()
Сообщение
#17
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
все, те одинаковый хб. Но для сингла это не важно. Отличная фича!
|
![]()
Сообщение
#18
|
|
Level 6 ![]() Класс: Фея Характер: Chaotic Good Раса: Элементаль NWN: Маппинг Gem of the North ![]() |
Зато интересно для шардостроителей.
|
![]()
Сообщение
#19
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
я имел ввиду что не важно, что для всех одинаковый. :-) А синглам эта штука тоже будет полезна.. :-)
|
![]()
Сообщение
#20
|
|||||||
Level 2 ![]() Класс: Монах Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] ![]() |
Именно так и сделано на Сиале - так что способ проверенный :) |
||||||
![]()
Сообщение
#21
|
|
Level 10 ![]() ![]() ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек NWN: Скриптинг [PW] ![]() |
В поздних версиях тулсета ввели функцию - поиск по тексту (предметов, существ, плейсов). Но в тайлах такого поиска не сделали. Я работая с большими тайлами, порой забываю в какой группе какой объект находится. Но найти нужный тайл через его название можно.
Заходите на закладку там где этот поиск возможен. Набираете текст, переходите в закладку тайлов и нажимаем F3 :) |
![]()
Сообщение
#22
|
|||
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Супер, весьма полезно, хотя тут главное не злоупотреблять :) |
||
![]()
Сообщение
#23
|
|||
Level 5 ![]() Класс: Клерик Характер: Lawful Good Раса: Человек NWN: Контент ![]() |
Еще интереснее, если открыть в какой-нибудь программе файл игрока, например, в nwn explorer. Там есть поля ScriptHeartbeat, ScriptOnNotice, ScriptSpellAt, ..Attacked, ..Damaged, ..Disturbed, ..EndRound, ..Dialogue, ..Spawn, ..Rested, ..Death, ..UserDefine, ..OnBlocked. И напротив всех них стоит (что бы вы думали?) - default ! Учитывая наличия разных плагинов к nwnx типа leto и подобных, а так же возможности редактировать эти поля вручную .. :yes: На неделе обязательно проверю, будут ли функционировать скрипты, прикрепленные к этим событиям. Очень хотелось бы :yahoo: Возможно, конечно, что эти значения ни на что не влияют, и нвн все равно будет привязывать только скрипт с именем default Добавлено Проверил, эти поля появляются только если зайти в модуль (т.е. не сразу после создания), и перезаписываются нвн, так что их подредактировать не удастся. А скрипт default исполняется еще как минимум при смерти игрока. Сообщение отредактировал rdx - May 11 2005, 12:34 |
||
![]()
Сообщение
#24
|
|||
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
не смог добиться такого эффекта :( Вешаю в игре локалку на айтем, сохраняю игрока, выхожу. Захожу сохраненным, локалки нету. (делал в сингл-моде) Или это только под сервером работает? ---------- разобрался: работает только под нвнсервером. :) |
||
![]()
Сообщение
#25
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
Еще одна, на этот раз неприятная, фича:
После вызова SetItemStackSize стираются локальные переменные на предмете. |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2025 - 18:14 |