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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 136 137 138 139 140 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
wirTUS
сообщение Jun 6 2011, 13:36
Сообщение #3426


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



А вот вопрос по NWNx: куда и как он девает бд, созданую скриптом (был поюзан скрипт из примера по odbc)? Поиском обшарил на pwdata весь компьютер, ничего не нашел
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Jun 6 2011, 13:54
Сообщение #3427


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Странный вопрос. Честно говоря, я не помню, как MySQL хранит данные на харде, но зачем это вообще понадобилось? Есть удобный интерфейс для доступа к данным, зачем их физически на харде отлавливать?
Сам мускуль-то поставил? Без него (ну или SQLite/Postgres - но с мускулем проще всего) этот плагин в принципе работать не будет.

Сообщение отредактировал Ilerien - Jun 6 2011, 14:23
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Jun 6 2011, 17:40
Сообщение #3428


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



Там при распаковки NWNx в директорию игры по умолчанию стоит другой тип БД не MySQL, нужно в ручную за коментить в настройках NWNx ее и раскоментить MySQL. Может, в этом проблема?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Jun 6 2011, 17:58
Сообщение #3429


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Я сначала попробовал в ацесс, в mysql попробовал создать скриптом из nwnx'овского демо модуля, на \u nonamedb (поменял в скрипте с pwdata на nonamedb) ругается ERROR 1049 <42000>: Unknown database 'nonamedb'. Предварительно создал nwnx'ом хост и зашел до вылета, скрипт должен был сработать
Цитата
Там при распаковки NWNx в директорию игры по умолчанию стоит другой тип БД не MySQL, нужно в ручную за коментить в настройках NWNx ее и раскоментить MySQL. Может, в этом проблема?
Понял, меняю
Цитата
Я сначала попробовал в ацесс, в mysql попробовал создать скриптом из nwnx'овского демо модуля, на \u nonamedb (поменял в скрипте с pwdata на nonamedb) ругается ERROR 1049 <42000>: Unknown database 'nonamedb'. Предварительно создал nwnx'ом хост и зашел до вылета, скрипт должен был сработать

Поставил настройки под mysql, скорее всего через скрипт получить доступ к БД получится, через mysql идет та же ошибка. С бд в принципе и mysql в частности до вчерашнего дня дела не имел, наверняка где-то тут кроется причина

Сообщение отредактировал wirTUS - Jun 6 2011, 18:27
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Keks
сообщение Jun 7 2011, 21:34
Сообщение #3430


Level 3
*

Класс: Теневой Танцор
Характер: Lawful Neutral
Раса: Человек



я как человек не искушенный в БД через SQLite подключал
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jun 8 2011, 08:57
Сообщение #3431


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

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Цитата
С бд в принципе и mysql в частности до вчерашнего дня дела не имел, наверняка где-то тут кроется причина
Самое простое - взять сборку типа денвера, там есть субд и веб-сервер со специальной мордой для взаимодействия с мусклом. Для разработки - самое то.
Цитата
я как человек не искушенный в БД через SQLite подключал
Если с бд будет взаимодействовать только сервер (т.е. никаких армори, онлайн-списков игроков, пополнения всякой фигни дмами в реальном времени и прочее), то это идеальный вариант. БД будет в файле, так что никакого гемора с настройкой субд и потерей коннекта. Благодаря реконнекту последнее не очень очевидно, но вылезает в виде забавных багов (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Keks
сообщение Jun 8 2011, 21:23
Сообщение #3432


Level 3
*

Класс: Теневой Танцор
Характер: Lawful Neutral
Раса: Человек



Берем любой плагин для БД (я юзаю SQLite Expert Personal version 2.3.49), устанавливаем его на комп, затем берем папочку НВН и дублируем ее (скажем обозвав NWN_Server) в тот же каталог, где стоит клиентская версия, таким образом получается 2 папки, полностью подобные, но с разными названиями. Я работаю только в папке NWN_Server (правлю модуль, создаю ерки и пр.), из нее же запускаю NWNX, а из клиентской папки запускаю только игровой процесс.
Таким образом ставить виртуальные сервера на комп НЕ НАДО. Таким образом уже года 3 все пашет оки.

Цитата
Благодаря реконнекту последнее не очень очевидно, но вылезает в виде забавных багов smile.gif
Если честно, как-то не замечал багов, хотя человек спрашивает для "рабочей машины", т.е. дома делать неискушенному человеку, повторюсь, тут это оптимальный вариант, а для сервера да, лучше MYSQL

З.ы. А отредактировать чара в момент создания артмани и ему подобными можно, т.к. чар создается локально и только после нажатия кнопочки "Играть" в первый раз дублируется на сервере в папке аккаунта. Т.е. изначально чар локален, а следовательно с ним мона делать все, что душе угодно. Выдача плюшек и "всякой фигни" ДМами обрабатывается движком сервера по запросу из ДМклиента, т.ч. таким образом можно редактировать чаров игроку.

Сообщение отредактировал Keks - Jun 8 2011, 21:29
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Talarasha
сообщение Aug 29 2011, 01:02
Сообщение #3433


Level 6
**

Класс: Маг
Характер: Lawful Evil
Раса: Нежить



Вопрос по работе с освещением. В модуле понадобился аналог "призрачного зрения", как в XP2 с кольцом. По определенным причинам смена освещения через смену дня и ночи мне не подошла (не хотелось отказываться от стандартного ночного освещения), поэтому делал руками, через SetTileSourceLightColor(). Проблемы как таковых две - не дает результата применение черного цвета к источнику света (погасить не удается), но здесь, я думаю, ничего не сделать - так во всяком случае лексикон говорит. Во-вторых, не могу после возврата в нормальный режим корректно вернуть цвета, даже с помощью RecomputeStaticLighting(). Сначала думал, что ошибка в алгоритме, которым я запоминаю исходные цвета, но перезаход в область восстанавливает корректно. В чем ошибка, можно ли как-то обойти?

Код для ознакомления:
Neverwinter Script
void EtherealVision(int Color1, int Color2, int Recovery = 0)
{
    object oPC = GetFirstPC();
    object oArea = GetArea(OBJECT_SELF);
    int Height = GetAreaSize(AREA_HEIGHT);
    int Width = GetAreaSize(AREA_WIDTH);
    vector v = Vector(0.0f, 0.0f, 0.0f);
    location Pointer;

    // Main cycle; 10.0f is because Tile functions has it's own coordinate
    // system (we got coordinate of points and tile functions uses coordinate
    // of grid (integer number of squares, first square [0][0] is a bottom left)
    while(v.y < Height * 10.0f)
    {
        v.x = 0.0f;
        while(v.x < Width * 10.0f)
        {
            v = Vector(v.x/10.0, v.y/10.0, 0.0f);
            Pointer = Location(oArea,v,0.0f);
            if(Recovery == 0) // Remember colors
            {
                SetLocalInt(oArea,"TILECOLOR1"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)),
                    GetTileSourceLight1Color(Pointer));
                SetLocalInt(oArea,"TILECOLOR2"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)),
                    GetTileSourceLight2Color(Pointer));
            }
            else // Recover colors if it's a recovery call
            {
                Color1 = GetLocalInt(oArea,"TILECOLOR1"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)));
                Color2 = GetLocalInt(oArea,"TILECOLOR2"+IntToString(FloatToInt(v.x)) + IntToString(FloatToInt(v.y)));
            }
            SetTileSourceLightColor(Pointer,Color1,Color2);
            v = Vector(v.x*10.0, v.y*10.0, 0.0f);
            v.x = v.x + 10.0f;
        }
        v.y = v.y + 10.0f;
    }
    RecomputeStaticLighting(oArea);
}

По "функция(цвет1,цвет2)" включает режим, по "функция(0,0,1)" выключает.

Сообщение отредактировал Talarasha - Aug 29 2011, 01:05
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Aug 29 2011, 10:13
Сообщение #3434


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

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



Динамическое освещение в НВН вообще глючное, и RecomputeStaticLighting работает криво. Видимо, это один из его багов, наряду со свечением у плейсов после его выполнения.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 9 2011, 15:04
Сообщение #3435


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



А как сделать,что бы НПС ходил туда-сюда от сундука к сундуку и совершал анимацию "открыть ключом"?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Sep 9 2011, 17:14
Сообщение #3436


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Ставится на триггер (например, у двери, за которой находится NPC. Наиболее оптимальный метод, ибо NPC начнет ходить только тогда, когда его видят (в зависимости от того, для мультиплеера модуль или нет надо дописывать прерывание похождений, когда перестают видеть)) на событие OnEntered

Neverwinter Script
void main()
{
object
        oNPC = GetNearestObjectByTag("NPCTag", GetEnteringObject()),
//Ходить будет ближайший к игроку NPC c тэгом NPCTag
        oCont1 = GetNearestObjectByTag("Container1Tag", oNPC),
//Обозначаем первый сундук. Это окажется ближайший к NPC сундук с тэгом Container1Tag.
        oCont2 = GetNearestObjectByTag("Container2Tag", oNPC);
//Обозначаем второй сундук. Это окажется ближайший к NPC сундук с тэгом Container2Tag.

vector vPos;
//Для дальнейшего использования

int i = 0;
//Для дальнейшего использования

AssignCommand(oNPC, ClearAllActions(TRUE))
while(i<1)
//1 - количество проходов NPC по маршруту
//[позиция NPC] - первый сундук - второй сундук,
{
  ++i;
  //закомментировать строчку выше - плохая идея, ибо при попытке использования бесконечного цикла
  //nwn благополучно зависает
  AssignCommand(oNPC, ActionMoveToObject(oCont1, FALSE));
  //NPC идет к первому сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont1))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //После того, как NPC подошел к сундуку, идет проигрышь анимации ANIMATION_LOOPING_GET_LOW
  //(можно заменить на цифру 12, см. лексикон на "ANIMATION_* Constant Group") со стандартной
  //скоростью (1.0 - коэффициент скорость относительно начальной скорости анимации, т.е.
  //заменив 1.0 на большее число можно увеличить скорость проигрыша анимации, аналогично можно
  //ее уменьшить) в течение трех секунд (3.0) (коэффициент скорости влияет только на время
  //проигрыша FnF-анимаций, которыми не используется параметр времени проигрыша)
  AssignCommand(oNPC, ActionMoveToObject(oCont2, FALSE));
  //NPC идет ко второму сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont2))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //аналогично предыдущему
}
}

ВНИМАНИЕ:
Neverwinter Script
vPos = GetPosition(oNPC);
возвращает стартовую позицию NPC, а не нынешнюю. Следовательно, "поворачивание" NPC будет работать криво. Чтобы работало прямо, надо найти метод получения вектора местонахождения на момент запроса и заменить GetPosition(oNPC) на него. Есть подозрение, что такая проблема возникла из-за использования стека. Альтернативный метод выпила данной кривоты - удаление "поворотов" из скрипта и расставление сундуков друг напротив друга, желательно строго напротив.

Сообщение отредактировал wirTUS - Sep 9 2011, 17:18
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 9 2011, 21:34
Сообщение #3437


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



Цитата(wirTUS @ Sep 9 2011, 19:14) *
Ставится на триггер (например, у двери, за которой находится NPC. Наиболее оптимальный метод, ибо NPC начнет ходить только тогда, когда его видят (в зависимости от того, для мультиплеера модуль или нет надо дописывать прерывание похождений, когда перестают видеть)) на событие OnEntered

Neverwinter Script
void main()
{
object
        oNPC = GetNearestObjectByTag("NPCTag", GetEnteringObject()),
//Ходить будет ближайший к игроку NPC c тэгом NPCTag
        oCont1 = GetNearestObjectByTag("Container1Tag", oNPC),
//Обозначаем первый сундук. Это окажется ближайший к NPC сундук с тэгом Container1Tag.
        oCont2 = GetNearestObjectByTag("Container2Tag", oNPC);
//Обозначаем второй сундук. Это окажется ближайший к NPC сундук с тэгом Container2Tag.

vector vPos;
//Для дальнейшего использования

int i = 0;
//Для дальнейшего использования

AssignCommand(oNPC, ClearAllActions(TRUE))
while(i<1)
//1 - количество проходов NPC по маршруту
//[позиция NPC] - первый сундук - второй сундук,
{
  ++i;
  //закомментировать строчку выше - плохая идея, ибо при попытке использования бесконечного цикла
  //nwn благополучно зависает
  AssignCommand(oNPC, ActionMoveToObject(oCont1, FALSE));
  //NPC идет к первому сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont1))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //После того, как NPC подошел к сундуку, идет проигрышь анимации ANIMATION_LOOPING_GET_LOW
  //(можно заменить на цифру 12, см. лексикон на "ANIMATION_* Constant Group") со стандартной
  //скоростью (1.0 - коэффициент скорость относительно начальной скорости анимации, т.е.
  //заменив 1.0 на большее число можно увеличить скорость проигрыша анимации, аналогично можно
  //ее уменьшить) в течение трех секунд (3.0) (коэффициент скорости влияет только на время
  //проигрыша FnF-анимаций, которыми не используется параметр времени проигрыша)
  AssignCommand(oNPC, ActionMoveToObject(oCont2, FALSE));
  //NPC идет ко второму сундуку

  vPos = GetPosition(oNPC);
  AssignCommand(oNPC, ActionJumpToLocation(Location(GetArea(oNPC), vPos, 360-GetFacing(oCont2))));
  //Поворачиваем NPC к сундуку

  AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  //аналогично предыдущему
}
}

ВНИМАНИЕ:
Neverwinter Script
vPos = GetPosition(oNPC);
возвращает стартовую позицию NPC, а не нынешнюю. Следовательно, "поворачивание" NPC будет работать криво. Чтобы работало прямо, надо найти метод получения вектора местонахождения на момент запроса и заменить GetPosition(oNPC) на него. Есть подозрение, что такая проблема возникла из-за использования стека. Альтернативный метод выпила данной кривоты - удаление "поворотов" из скрипта и расставление сундуков друг напротив друга, желательно строго напротив.

О-о-огромное спасибо!Я буду теперь равняться на тебя и учиться писать такие же сложные скрипты!Я научусь,будь уверен!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
nepejke
сообщение Sep 10 2011, 08:07
Сообщение #3438


Level 3
*

Класс: Монах
Характер: Lawful Neutral
Раса: Человек



всем привет, поспорил с человеком, насчёт возможности сокращения кода в нвн1.
существует ли возможность, создать отдельный скрипт который будет просчитывать метамагию, кастерлвл, спеллпенетру
дабы не захлямлять этим строчки в скрипте каждого спелла. Так вот, реально ли это всё соединить в 1 инклюд скажем, чтобы не писать в каждом спелле???

цит: "У НОРМАЛЬНЫХ ЛЮДЕЙ, а разрабы нвн по ходу не очень нормальные функция
http://www.nwnlexicon.com/compiled/functio...tlastspell.html - несла бы с собой все нужное от спелла, после того как спелл все посчитает:
Для боевых спеллов это только
getlastspell(dam) - посчитанный урон
getlastspell(dam_type) - тип урона

http://www.nwnlexicon.com/compiled/functio...pellcaster.html - она бы несла с собой такие вещи:
getlastspellcaster(sLevel) - с левел в зависимости от уровня колдующего.
getlastspellcaster(s_meta) - с какой метой пришел спелл
ну и так далее для любых спеллов где что нужно.

Далее, как будет выглядеть только в таком минимуме:
OnSpellCastAt скрипт

Код: [Выделить]
//Make SR Check
if (!MyResistSpell(OBJECT_SELF, getlastspellcaster(sLevel)))
{
//Make metamagic checks
if (getlastspellcaster(s_meta) == METAMAGIC_MAXIMIZE)
{
nDam = getlastspell(dam) + getlastspellcaster(sLevel); //Damage is at max
}
if (getlastspellcaster(s_meta) == METAMAGIC_EMPOWER)
{
nDam = getlastspell(dam) + (getlastspell(dam)/2); //+50% to Damage
}
//здесь же экстенд спелл для длительности, впадлу дописывать. А вот сайлент хуяйлент должны так же отдельно обрабатываться в каком нибудь _onspellcast
//все, посчитали да, теперь эта же функция наносит урон, с утра впадлу искать чем он там наносит будем так
f.damage(nDam, getlastspell(dam_type))
//СЮДА ЖЕ ДОПИСЫВАЮТСЯ ПЕРЕД f.damage все абсорбящие заклинания. Надеюсь понятно да как это происходит?

И в итоге КАЖДЫЙ СПЕЛЛ В НВН получает минус 15 строк не теряя абсолютно своего функционала и возможность вносить в него изменения меняя только циферку, можно дописать в него любые эффекты, и прочее.
Это за вычетом того, что функция потом будет нести в себе абсорбы с защитных спеллов, что разгрузит ту функцию, которая считает абсорбы и прочее, я думаю, что она тоже дублирована раз 50.
Да и сама механика абсорбов сведется к одному таймеру с набором переменных для окончания длительности, а количество абсорбов будет висеть просто на чаре. Это открывает нормальное суммирование эффектов абсорбов и прочее.
Так же ЭТОТ ЕВЕНТ МОЖЕТ ОТВЕЧАТЬ И ЗА ЛЕЧАЩИЕ СПЕЛЛЫ ТЕМ САМЫМ РАЗГРУЗИВ И ИХ.
Вот и посчитай, насколько меньшим и удобным будет код. "


я думаю что это не возможно, что думаете вы?

Сообщение отредактировал nepejke - Sep 10 2011, 08:08
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Sep 10 2011, 15:08
Сообщение #3439


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Нет такой возможности в НВН. Не говоря уж о том, что OnSpellcastAt слот используется совсем для других целей.
Твоя гипотетическая реализация - крайне негибка, стоит придумать нетривиальный спелл, и его реализация немедленно добавит десяток строчек в пухнущий свич общего скрипта по spellid. Биоварская реализация, если и не оптимальна, то близка к этому.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 10 2011, 17:37
Сообщение #3440


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



Цитата(ReZkiy @ Sep 9 2011, 23:34) *
О-о-огромное спасибо!Я буду теперь равняться на тебя и учиться писать такие же сложные скрипты!Я научусь,будь уверен!

А больше нет никаких предложений,люди???ПОМОГИТЕ ЕЩЕ!!!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Sep 10 2011, 18:12
Сообщение #3441


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Цитата
ПОМОГИТЕ ЕЩЕ!!!

Можно попробовать заменить
Neverwinter Script
...ActionPlayAnimation(...));
на
Neverwinter Script
...ActionUnlockObject(oContN));
AssignCommand(oNPC, ActionLockObject(oContN));
и выпилить повороты. Возможно между локом и анлоком красоты ради поставить паузу, опять же при желании можно сделать, чтобы перед тем, как открыть сундук непись посмотрел по сторонам (чтобы он при этом реагировал на игрока - уже сложнее и включает как минимум чек хайда игрока, если он хайдится, аналогично со спрятанностью (Concleated или что-то вроде), проверки на наличие невидимостей и грейтер санкураси и, собственно, реакцию, если игрок будет замечен). А так же вполне возможно, что вообще работать не будет, нету что-то желания проверять.
Цитата
Я буду теперь равняться на тебя и учиться писать такие же сложные скрипты!

Равняться на меня не стоит, не настолько-то из меня и хороший скриптер. Лучше прочитай эту тему и, если еще не прочитал, то "Скрипты новичкам", может найдешь что-нибудь, что пригодится.

Сообщение отредактировал wirTUS - Sep 10 2011, 18:13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 10 2011, 18:23
Сообщение #3442


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



Цитата(wirTUS @ Sep 10 2011, 20:12) *
Можно попробовать заменить
Neverwinter Script
...ActionPlayAnimation(...));
на
Neverwinter Script
...ActionUnlockObject(oContN));
AssignCommand(oNPC, ActionLockObject(oContN));
и выпилить повороты. Возможно между локом и анлоком красоты ради поставить паузу, опять же при желании можно сделать, чтобы перед тем, как открыть сундук непись посмотрел по сторонам (чтобы он при этом реагировал на игрока - уже сложнее и включает как минимум чек хайда игрока, если он хайдится, аналогично со спрятанностью (Concleated или что-то вроде), проверки на наличие невидимостей и грейтер санкураси и, собственно, реакцию, если игрок будет замечен). А так же вполне возможно, что вообще работать не будет, нету что-то желания проверять.

Равняться на меня не стоит, не настолько-то из меня и хороший скриптер. Лучше прочитай эту тему и, если еще не прочитал, то "Скрипты новичкам", может найдешь что-нибудь, что пригодится.

Слушай,это все очень муторно.Можно сделать такой скрипт,что бы он стоял в OnHeartBeat НПС и тот делал нужные мне действия?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Sep 10 2011, 19:22
Сообщение #3443


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Цитата
Слушай,это все очень муторно.

Заменить две строчки и удалить еще четыре - муторно? (IMG:style_emoticons/kolobok_light/shok.gif)
Цитата
Можно сделать такой скрипт

Можно.
Цитата
OnHeartBeat НПС

Хертбит лучше не использовать если есть альтернативы, ввиду того, что он сильно загружает модуль
(IMG:style_emoticons/kolobok_light/offtopic.gif)
Цитата
и тот делал нужные мне действия?

Писал скрипты? (IMG:style_emoticons/kolobok_light/biggrin.gif)
(IMG:style_emoticons/kolobok_light/offtopic.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ReZkiy
сообщение Sep 10 2011, 19:55
Сообщение #3444


Level 5
**

Класс: Вор
Характер: Neutral Good
Раса: Человек



Цитата(wirTUS @ Sep 10 2011, 21:22) *
Заменить две строчки и удалить еще четыре - муторно? (IMG:style_emoticons/kolobok_light/shok.gif)

Можно.

Хертбит лучше не использовать если есть альтернативы, ввиду того, что он сильно загружает модуль
(IMG:style_emoticons/kolobok_light/offtopic.gif)

Писал скрипты? (IMG:style_emoticons/kolobok_light/biggrin.gif)
(IMG:style_emoticons/kolobok_light/offtopic.gif)

Молодец,чувство юмора имеется.Я сам в скриптах не очень,поэтому тебя спросил.Можешь такой подкинуть или нет?Только ответь нормально,без этих шуточек.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Sep 11 2011, 02:42
Сообщение #3445


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



Цитата
Я сам в скриптах не очень

Основываясь на весьма посредственных знаниях (!)паскаля, лексиконе, в/о с данного сайта вообще и в/о со страниц 136, 137 и 138 (а так же стр. 133, но тогда я еще по нулям был даже в паскале) данной темы я получил весьма неплохие знания (по моему мнению, ес-сно. На данной странице писали как минимум пять человек, по сравнению с которыми я, имхо, нуб и позорюсь (IMG:style_emoticons/kolobok_light/smile.gif) ) нвскрипта.
Цитата
Можешь такой подкинуть или нет?

Все еще не вижу смысла в использовании ХБ. Если нужно заставить NPC вечно ходить открывать-закрывать сундуки, то первое, что пришло в голову: OnSpawn непися дописывается/ставится скрипт, заставляющий идти к первому сундуку и открыть его. На OnOpen сундука идет проверка, кто открыл, и если это нужный нам непись, то заставляем открывшего закрыть и пойти к другому сундуку, на котором повторяется то же, но учитывая, что сундук другой. Писать за тебя не буду, но попробую понятно привести лексику, что тут понадобится.
Основа
Neverwinter Script
void main() //обозначение, гхм, начала скрипта (на самом деле - процедура, но это сейчас совсем не нужно)
{ //совсем начало скрипта, только после которого можно записывать то, что скрипт делает
} //обозначает конец скрипта (в данном случае)

Переменные, их объявление и математика (возможно, страшно звучит, но пугаться не стоит: все донельзя легко)
Neverwinter Script
//Переменная - буквоциферный идентификатор чего-то (например: цифре, букве, фразе), при помощи которого можно использовать это что-то
//Объявление переменной - "говорим" скрипту, что существует такой-то идентификатор, принадлежащий к такому-то типу (см. ниже)
//Тип переменной - что может идентифицировать переменная (например, целое число). Переменная, принадлежащая к целочисленному типу не может
//обозначать, например, букву.
//Общий вид объявления переменных
/*
[тип переменной] [идентификатор1];
//или
[тип переменной] [идентификатор1] = [значение1];
//или
[тип переменной] [идентификатор1], [идентификатор2];
[другой тип переменной] [идентификатор3], [идентификатор4];
//можно комбинировать, например:
[тип переменной] [идентификатор1] = [значение1], [идентификатор2];
[другой тип переменной] [идентификатор3], [идентификатор4] = [значение2];
*/

//Список типов переменных (возможно, неполный, максимальные и минимальные значения для каждого типа описывал где-то по соседству)
/*
int - целые числа (-1; 0; 1; 2 и т.д.)
float - рациональные числа (-1.0; -0.5; 0.0; 0.5; 1.0 и т.д.)
string - буквы и строки ("a"; "abc"; "abcdefg"; "aaanbhdjfjkdfsljfh" и т.п.)
vector - координаты в трехмерном пространстве. Можно получить при помощи Vector([координата x], [координата y], [координата z]). x, y и z принадлежат float, но не обязательно являются переменными (по сути - использование переменных не обязательно и можно использовать запись Vector(1.0, 3.0, 7.5) (обращаю внимание на большую букву (регистр играет роль): с маленькой буквы получится объявление переменной типа вектор, с большой - получение значения типа вектор из трех координат), но с переменными удобнее.) Далее принадлежность переменной к какому-либо типу буду обозначать [тип] [идентификатор]
location - подробное описание местоположения чего-либо. Аналогично вектору, можно получить при помощи Location(object oArea (об объектах речь далее), vector vPosition, float fOrientation (поворот по градусам, где север - 90 градусов (см. Лексикон SetFacing)));
object - вероятно, наиболее часто используемый в нвскрипте тип. Включает в себя созданий (creature, в т.ч. и игроков), вещи, плэйсы и т.д. За подробностями - в Лексикон, OBJECT_TYPE (кроме того, что включает в себя тип object там еще можно узнать, как обозначить тот или иной подтип объекта для специфических функций, этого требующих (пока не надо))
*/

//Пример объявления переменных и примитивных мат. действий
void main()
{
int nNum = 7, nN = 5, nNumber = 4; //создаем переменные и присваиваем им значения. Т.е. создели целочисленную переменную nNum и задали
int nResult;                                     //(присвоили) ей значение 7
nResult = nNum - nN;               //присвоили переменной nResult значение разности переменных nNum и nN, т.е. nResult = nNum - nN = 7 - 5 = 2
nResult = nResult * nNumber;   //присвоили переменной nResult собственное значение, умноженное на nNumber, т.е. nResult = nResult * 4 = 2 * 4 = 8
nResult = nResult * nNumber;   //повторяем предыдущее действие. НО после предыдущего действия значение переменной nResult изменилось, стало
                                               //равным восьми. Следовательно, теперь nResult = nResult * nNumber = 8 * 4 = 32
//предположим, что это скрипт, стоящий на OnOpen плэйса-контейнера
object oPC = GetLastOpenedBy(); //в таком случае GetLastOpenedBy() будет работать, ее значением будет являться (далее: он(а) возвращает
//значение) объект (наиболее вероятно, что это будет существо, но да не суть важно), открывший контейнер.
object oArea = GetArea(oPC); //GetArea(object oObj) возвращает объект-арию (локацию в плане продукта работы маппера), в которой находится
//объект oObj, в данном случае арию, где находится существо, открывшее контейнер
float fX = 6.0, fY = 7.0 - 1.0, fZ = 16.0/16.0 - 2.0; //да, значением может являться результат математического действия.
vector vPos = Vector(fX, fY, fZ); //три вышеописанных числа были использованы для создания вектора
vPos = GetPosition(oPC); //а теперь мы записали в переменную vPos координаты существа, открывшего контейнер, тем самым удалив предыдущее
vector vPos2 = Vector(fX, fY, fZ); //значение. Но в данном случае его нетрудно восстановить, что только что мы и сделали
location lLoc = Location(oArea, vPos, 90.0); //А теперь, воспользовавшись вышеполученными арией и вектором мы получили  из них локацию,
location lLoc2 = GetLocation(oPC); //совпадающую с локацией открывшего, только с ориентацией на север. А сейчас мы присвоили некой переменной
lLoc = lLoc2; //lLoc2 локацию открывшего контейнер, без изменений. И приравняли к ней переменную lLoc.
}

Условия и логика
Neverwinter Script
/*
Если (на что я очень надеюсь) известны неравенства, то с примитивными условиями и такой же логикой проблем возникнуть не должно.
Как выглядит условие в нвскрипте? Очень просто:
if([условие])
{
[часть скрипта, которая будет выполнена, если условие верно и проигнорирована в противном случае]
}
else
{
[часть скрипта, которая будет выполнена, если условие неверно]
}
Так выглядит условие в полном виде (т.н. полный условный оператор)
Так же можно использовать краткую его версию:
if([условие])
{
[часть скрипта, которая будет выполнена, если условие верно и проигнорирована в противном случае]
}
Теперь: как получить логическое выражение, которое должно быть использовано как условие? Есть несколько вариантов:
1) использовать 0 и 1 как логические выражения (0 - неверное условие (в любом случае), 1 - верное)
2) использовать "неравенства", например, nNum<nN (данное условие будет верно, если переменная nNum меньше, чем nN, следовательно nNum и nN
    должны быть обе одного типа: или int, или float. Ес-сно сравнить локацию и целое число не получится)
   Список для неравенств:
    > строго больше
    < строго меньше
    <= нестрого меньше
    >= нестрого больше
    == равно
    != не равно
*/

//Сложные условия
/*
А что, если нам надо выполнение одновременно нескольких условий? А делать нужно вот что:
if([условие][логическая операция][условие1] ...[логическая операция][условиеN])
{}
Логические операции
||    или
&&  и
==  равно     //логические выражения тоже можно сравнивать, но только при помощи "равно" или "не равно"
!= не равно
Что же это означает? Пример:
условие || условие1
будет считаться верным, если верно только одно из условий. Пример1:
условие && условие 1
будет считаться верным, если верны оба условия одновременно. Пример2:
(условие && условие1) || условие2
будет считаться верным, только если ЛИБО первые два условия будут одновременно верны, ЛИБО если верно ТОЛЬКО третье условие
! считается знаком отрицания, т.е. логическое выражение !(условие) будет верным, только если условие будет неверным. Пример3:
(условие || условие1) && !(условие2)
будет считаться верным, если верно ТОЛЬКО ОДНО из первых двух условий И ОДНОВРЕМЕННО С ЭТИМ НЕ будет верно третье условие
*/

//Пример сложных и не очень условий
void main()
{
int bFlag = FALSE, nN; //0 и 1 можно записывать как FALSE и TRUE соответственно
if(!bFlag)
{
  nN = 100;
  if(nN<100)
  {nN = 100;}
  else
  {nN = 0;}
}
if((nN == 0) && (nN != 1) && !(nN == 1)) //тут написан бред. Достаточно ограничиться лишь nN == 0, т.к. если nN равно нолю, то в любом случае она не
//равна единице. А так же условия nN != 1 и !(nN == 1) - одно и то же.
{nN = 0;} //Бессмысленное действие, т.к. нету смысла приравнивать nN к нолю, если она уже равна нолю (см. пред. условие)
}

Агась, а теперь домашнее задание: посмотреть в Лексиконе функции, названия которых написаны ниже и понять как их использовать
GetLastOpenedBy
GetTag
GetObjectByTag
GetNearestObjectByTag
AssignCommand
ActionMoveToObject
ActionLockObject
ActionUnlockObject
Эти функции понадобятся тебе для твоих хождений по сундукам. Если поймешь, как их использовать (если при этом понял, что я писал выше, хех), то сможешь эти хождения по сундукам написать сам. Если хочешь, чтобы ходящий по сундукам, например, оглядывался по сторонам, перед тем, как открыть сундук, то посмотри ActionPlayAnimation. Если хочешь еще и всяких ништяков вроде свечений и прочего, посмотри effect (это тип, тут, скорее всего, понадобится английский), EffectVisualEffect и ApplyEffectToObject.
Как-то так

Сообщение отредактировал wirTUS - Sep 11 2011, 02:45
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
greye
сообщение Sep 11 2011, 08:48
Сообщение #3446


Level 7
**

Класс: Некромант
Характер: True Neutral
Раса: Нежить



Цитата(wirTUS @ Sep 11 2011, 02:42) *
Все еще не вижу смысла в использовании ХБ. Если нужно заставить NPC вечно ходить открывать-закрывать сундуки, то первое, что пришло в голову: OnSpawn непися дописывается/ставится скрипт, заставляющий идти к первому сундуку и открыть его. На OnOpen сундука идет проверка, кто открыл, и если это нужный нам непись, то заставляем открывшего закрыть и пойти к другому сундуку, на котором повторяется то же, но учитывая, что сундук другой.

Если оставить только вызов на onSpawn, то после любого чиха (диалог, бой) непись перестанет ходить по сундукам.
Ко всему вышесказанному можно просмотреть x0_i0_walkway как пример.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 11 2011, 09:25
Сообщение #3447


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

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



x0_i0_walkway - это просто ад и яркий пример того, как делать нельзя (IMG:style_emoticons/kolobok_light/smile.gif) Там функция запускается из спавна, хертбита и хз чего ещё, а потом ещё рекурсивно вызывает сама себя каждую секунду.

http://www.city-of-masters.ru/forums/index...?showtopic=5123


По теме: хертбит как раз самый простой и изящный вариант, именно для этого он и предназначен, иначе задолбаешься отслеживать все моменты прерывания непися. Чтобы не было тормозов, предусмотрены 2 вещи.

Во-первых, при отсутствии игроков рядом аи выключается. Т.е. скрипты запускаются и сразу выходят на первой строке. Но всякие события всё равно триггерят (те же бесконечные проверки игроков рядом), т.е. выключение аи как бы помогает, но меньше, чем хотелось бы.

Во-вторых, если заморочиться, вместо выключения можно написать деспавн. Я так делал для стражи на шарде. Все остальные неписи были без скриптов, стража - полностью боевая и с точками ходьбы. При выходе игроков из локации стража удалялась, заменяясь простыми вейпоинтами, а при входе - ставилась заново.

Если это сингл, но проще запихнуть в хб и не трахать мозги (IMG:style_emoticons/kolobok_light/smile.gif) Один голый скрипт игру не повесит.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
wirTUS
сообщение Sep 11 2011, 10:21
Сообщение #3448


Level 5
**

Класс: Убийца
Характер: Lawful Evil
Раса: Человек



(IMG:style_emoticons/kolobok_light/offtopic.gif)
Цитата
На данной странице писали как минимум пять человек, по сравнению с которыми я, имхо, нуб и позорюсь

Шесть (IMG:style_emoticons/kolobok_light/biggrin.gif)
(IMG:style_emoticons/kolobok_light/offtopic.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
gennady
сообщение Sep 11 2011, 13:11
Сообщение #3449


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

Класс: Обыватель
Характер: Lawful Good
Раса: Человек
NWN: Модмейкер
Рыцарская Сага



Цитата(denis0k @ Sep 11 2011, 10:25) *
x0_i0_walkway - это просто ад и яркий пример того, как делать нельзя Там функция запускается из спавна, хертбита и хз чего ещё, а потом ещё рекурсивно вызывает сама себя каждую секунду.

+1
Я тоже выкинул неверский WalkWayPoints что сильно улучшило быстродействие.
Про скрипты НВ для сингла даже написал статейку http://remmgen.narod.ru/tscript3.html#SC_HB
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Sep 11 2011, 13:13
Сообщение #3450


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Цитата
Во-вторых, если заморочиться, вместо выключения можно написать деспавн. Я так делал для стражи на шарде. Все остальные неписи были без скриптов, стража - полностью боевая и с точками ходьбы. При выходе игроков из локации стража удалялась, заменяясь простыми вейпоинтами, а при входе - ставилась заново.
Интересный вариант. Надо попробовать их в лимбо кидать (NWNX Funcs умеет), возможно, вместе с проверкой на лимбо будет дешевле, чем пересоздание.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 136 137 138 139 140 > » 
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 25th April 2024 - 22:08