Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в эту темуОткрыть новую тему
> Это не бага, это фича, тонкости, баги и прочее
_kaa_
сообщение Jun 24 2004, 17:14
Сообщение #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
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lazy Ranma
сообщение Jun 25 2004, 08:35
Сообщение #2


Level 3
*

Класс: Тайный Лучник
Характер: Neutral Good
Раса: Эльф
NWN: Скриптинг [PW]



Цитата
В событие OnClientLeave не работают некоторые функции для работы с объектом игрока

Самое интересное, что при этом GetIsPC() возвращает FALSE. Еще состояние "не до конца вышедшего" игрока можно застать не только из OnClientLeave, но из любого другого скрипта, выполняющегося примерно в то же время.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Jun 26 2004, 09:44
Сообщение #3


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Иногда полезно читать лексикон (IMG:style_emoticons/kolobok_light/smile.gif)

При работе функции DestroyObject()объект уничтожится только когда завершится скрипт, вызвавший эту функцию, а до этого момента объект все еще существует. Т.е. получается функция только помечает объект на удаление, а удаляется он сборщиком мусора после завершения скрипта.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 5 2004, 20:12
Сообщение #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)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jul 5 2004, 20:16
Сообщение #5


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Это легко лечится. Ставить повторную проверку компонентов на фразе, что перед крафтом.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Jul 27 2004, 11:21
Сообщение #6


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Очень веселая недокументировання багафича со встроенной БД.
Был баг непонятный, долго копал - что за фигня, в БД одно значение, а читает и возвращает другое.
Стал разбираться.
Вот что оказалось:

SetCampaignInt(string, string, int, object)
Neverwinter Script Source
void SetCampaignInt(
    string sCampaignName,
    string sVarName,
    int nInt,
    object oPlayer = OBJECT_INVALID
);

Переменная 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)
Если добавить в конце переменных любой символ - все работает нормально.
Вот такие веселые грабли.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Jul 28 2004, 08:21
Сообщение #7


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Цитата(Valleo @ Jul 27 2004, 22:05)
Очень интерестная заметка.
Иногда нам нужно, чтобы из функции возвращался стек значений.
Например функция, которая подсчитывает количество членов в партии, находит средний уровень партии. Нам бы нужно и то число, и то, но мы недолго думая создаем функцию, которая заново пересчитает всех членов партии.

Я же нашел более интерестный способ =)

Функции умеют возвращать структуры:
Neverwinter Script Source
struct stTest1
{
    int i1,i2;
    float f1,f2;
    string s1,s2;
    vector v1,v2;
};

struct stTest1 TestFunction(int Param1)
{
    struct stTest1 swTestResult;
    swTestResult.i1 = 1111;
    swTestResult.f1 = 111.111f;
    swTestResult.s1 = "dsfsafsf";
    return swTestResult;
}


Пользуйся, гораздно удобнее.

Сообщение отредактировал _kaa_ - Jul 28 2004, 08:23
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Aug 5 2004, 16:34
Сообщение #8


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Интересный прикол в событии onPhysicalDamage. Есть функция, GetLastWeaponUsed().
Если в руках оружие - возвращает оружие.
Если нет - возвращает наручни или перчатки (!)
Если и их нет - то возвращает OBJECT_INVALID

Логически - все верно, но не ожидал я такого от биоваре (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Aug 9 2004, 15:10
Сообщение #9


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Не сохраняйте location в БД.
Сохраняется она "правильно" даже в стандартной БД, т.е. ее перезапись не ведет к увеличению размера БД.
НО, сам формат...
Запись выглядит примерно так:
AREA_ID, X,Y,Z,Facing
Проблема с AREA_ID. Он выставляется то ли еще в тулсете, то ли при распаковке и часто меняется при добавлении\удалении локаций. Т.е. после этого location указывает ХЗ куда.
Если очень нужно хранить - задавайте руками (в тулсете, кнопка variable) локальную переменную для локации с номером или же задавайте уникальные теги локациям (не проверял) и с ними работайте.
Если есть возможность обойтись вейпоинтом - так и делайте.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Valleo
сообщение Aug 9 2004, 15:24
Сообщение #10


Level 4
**

Класс: Друид
Характер: Neutral Evil
Раса: Эльф
NWN: Скриптинг [PW]



Вообще легче всего сохранять локу на какой нить плот-итем в инвентаре, который невозможно выкинуть и т.п.
Или же делать LocationToString а потом наоборот.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Aug 9 2004, 22:03
Сообщение #11


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Цитата(Valleo @ Aug 9 2004, 15:24)
Вообще легче всего сохранять локу на какой нить плот-итем в инвентаре, который невозможно выкинуть и т.п.
Или же делать LocationToString а потом наоборот.

Да, если еще написать обратную функцию StringToLocation и следить за уникальностью тегов локаций в модуле - то достаточно просто и надежно получится.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Valleo
сообщение Aug 10 2004, 08:15
Сообщение #12


Level 4
**

Класс: Друид
Характер: Neutral Evil
Раса: Эльф
NWN: Скриптинг [PW]



StringToLocation
Neverwinter Script Source
location StringToLocation(string sLocation)
{
    location lReturnValue;
    object oArea;
    vector vPosition;
    float fOrientation, fX, fY, fZ;

    int iPos, iCount;
    int iLen = GetStringLength(sLocation);

    if (iLen > 0)
    {
        iPos = FindSubString(sLocation, "#AREA#") + 6;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_X#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fX = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Y#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fY = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Z#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fZ = StringToFloat(GetSubString(sLocation, iPos, iCount));

        vPosition = Vector(fX, fY, fZ);

        iPos = FindSubString(sLocation, "#ORIENTATION#") + 13;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount));

        lReturnValue = Location(oArea, vPosition, fOrientation);
    }

    return lReturnValue;
}


LocationToString
Neverwinter Script Source
string LocationToString(location lLocation)
{
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition = GetPositionFromLocation(lLocation);
    float fOrientation = GetFacingFromLocation(lLocation);
    string sReturnValue;

    if (GetIsObjectValid(oArea))
        sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#";

    return sReturnValue;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Dec 5 2004, 23:42
Сообщение #13


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Интересная фишка тут мне вечерком подвернулась, хотя может и старо, но пока нигде не видел.
Сначала маялся чтобы на "OnHeartbeat" в модуле на игрока выполнялся определенный скрипт. Можно конечно замутить GetFirstPC и GetNextPC, в таком случае сервер будет перебирать всех игроков.
Почитал Lексикон и вот что нашел в заметках:
QUOTE
...the PC doesn't have an OnHeartbeat event, if you create a script called "default", it will automatically trigger every PC heartbeat...

Первожу на русский. Дело в том, что у игрока нет эвента OnHearbeat, НО(!) если вы создадите скрипт и назовете его "default" он будет автоматически вписан в OnHeartBeat игрока.
Проверил - работает...
Чудеса да и только, товарищи... :this:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DBColl
сообщение Dec 6 2004, 19:25
Сообщение #14


4-х Кубовый
Иконки Групп

Класс: Некромант
Характер: Lawful Evil
Раса: Человек
NWN: Скриптинг [Sn]
Проклятие Левора



Аваддон
Да ну нафиг!!! Это мега фича!! Сенки! :good:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Dec 6 2004, 21:47
Сообщение #15


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



стоп..а если игроков много...те у всех одинаковый ХБ?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Dec 7 2004, 16:42
Сообщение #16


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Лекс не понял твоего вопроса... У каждого игрока на HB будет включаться этот скрипт:)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Dec 7 2004, 22:19
Сообщение #17


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



все, те одинаковый хб. Но для сингла это не важно. Отличная фича!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lexey aka Hawk
сообщение Dec 8 2004, 14:12
Сообщение #18


Level 6
Иконки Групп

Класс: Фея
Характер: Chaotic Good
Раса: Элементаль
NWN: Маппинг
Gem of the North



Зато интересно для шардостроителей.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Dec 8 2004, 19:31
Сообщение #19


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



я имел ввиду что не важно, что для всех одинаковый. :-) А синглам эта штука тоже будет полезна.. :-)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Тобур
сообщение Dec 9 2004, 20:45
Сообщение #20


Level 2
Иконки Групп

Класс: Монах
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]



QUOTE
Если очень нужно хранить - ... задавайте уникальные теги локациям (не проверял) и с ними работайте.


QUOTE
Вообще легче всего сохранять локу на какой нить плот-итем в инвентаре, который невозможно выкинуть и т.п.
Или же делать LocationToString а потом наоборот.


QUOTE
Да, если еще написать обратную функцию StringToLocation и следить за уникальностью тегов локаций в модуле - то достаточно просто и надежно получится.


Именно так и сделано на Сиале - так что способ проверенный :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Dec 12 2004, 23:37
Сообщение #21


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



В поздних версиях тулсета ввели функцию - поиск по тексту (предметов, существ, плейсов). Но в тайлах такого поиска не сделали. Я работая с большими тайлами, порой забываю в какой группе какой объект находится. Но найти нужный тайл через его название можно.
Заходите на закладку там где этот поиск возможен. Набираете текст, переходите в закладку тайлов и нажимаем F3 :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Feb 1 2005, 20:11
Сообщение #22


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



QUOTE (Аваддон @ Dec 5 2004, 23:42)
Интересная фишка тут мне вечерком подвернулась, хотя может и старо, но пока нигде не видел.
Сначала маялся чтобы на "OnHeartbeat" в модуле на игрока выполнялся определенный скрипт. Можно конечно замутить GetFirstPC и GetNextPC, в таком случае сервер будет перебирать всех игроков.
Почитал Lексикон и вот что нашел в заметках:

Первожу на русский. Дело в том, что у игрока нет эвента OnHearbeat, НО(!) если вы создадите скрипт и назовете его "default" он будет автоматически вписан в OnHeartBeat игрока.
Проверил - работает...
Чудеса да и только, товарищи... :this:

Супер, весьма полезно, хотя тут главное не злоупотреблять :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
rdx
сообщение May 11 2005, 00:54
Сообщение #23


Level 5
Иконки Групп

Класс: Клерик
Характер: Lawful Good
Раса: Человек
NWN: Контент



QUOTE (Аваддон @ Dec 5 2004, 23:42)
Интересная фишка тут мне вечерком подвернулась, хотя может и старо, но пока нигде не видел.
Сначала маялся чтобы на "OnHeartbeat" в модуле на игрока выполнялся определенный скрипт. Можно конечно замутить GetFirstPC и GetNextPC, в таком случае сервер будет перебирать всех игроков.
Почитал Lексикон и вот что нашел в заметках:

Первожу на русский. Дело в том, что у игрока нет эвента OnHearbeat, НО(!) если вы создадите скрипт и назовете его default он будет автоматически вписан в OnHeartBeat игрока.
Проверил - работает...
Чудеса да и только, товарищи... :this:

Еще интереснее, если открыть в какой-нибудь программе файл игрока, например, в 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
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 8 2005, 20:06
Сообщение #24


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



QUOTE (_kaa_ @ Jun 24 2004, 18:14)
Локальные переменные на итемах из инвентаря игрока сохраняются в файле
Для меня это было откровением и нашел я это случайно. Если выставить локальную переменную на итем - она сохраняется в .bic файле игрока, что иногда очень удобно (особенно вместе с настоящими nodrop-итемами, многие вещи так делать гораздо проще, чем юзать БД)

не смог добиться такого эффекта :(
Вешаю в игре локалку на айтем, сохраняю игрока, выхожу. Захожу сохраненным, локалки нету. (делал в сингл-моде)
Или это только под сервером работает?
----------
разобрался: работает только под нвнсервером. :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Sep 10 2005, 10:15
Сообщение #25


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Еще одна, на этот раз неприятная, фича:
После вызова SetItemStackSize стираются локальные переменные на предмете.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

2 страниц V   1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 15:45