Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Melisse
Да, без сомнения очень удобно, только кэш вылетает на 110+ точек в тми, потому что ты сначала кэшируешь, потом еще 2 раза гоняешь по точкам запросы, но идея очень клевая. При некоторых изменениях позволяет запустить фишки аля обливион/скайрим - нпц ходят и делают свои дела, а не стоят истуканами.

По поводу поиска пути я могу добавить то что проблемы бывают даже тайлах без объектов plc. Поиск пути просто очень криво работает и кушает много ресурсов, На стандартных тайлах работает лучше, чем на кастомных. Но сильные проблемы начинаются когда на тайлах размещают плэйсы, просто у проходимости там 3 вида видимо, те что на объектах и дверях наслаиваются на тайлы и каким-то образом часто глючат. Думаю система сродни таковой с 2да файлами - сначала загружаются все стандартные, потом то что в хаках переписыват стандартные, и сверху переписывается все это тем что в овверррайде. smile.gif
В любом случае, по проверкам, поиск пути всегда затрачивает в 10 раз больше времени чем самый сложный скрипт и очень часто выдает что путь не найден, особенно плохо работает для нпц.
Flaristan
Цитата(denis0k @ May 21 2015, 06:55) *
Ну грибочки через GetNearestCreature ты всё равно не найдёшь smile.gif

Но если это просто грубый пример, то возможности нвскрипта всё равно не позволят сделать такой поиск пути адекватным. Даже в сингле можно было заставить ИИ тупить, если для прохода в соседнюю комнату персонажу приходилось делать крюк через пол-локации. Поиск пути автоматически проваливался, и персонаж утыкался носом в стену.

Единственный работающий вариант, который я нашёл, - натыкать везде вейпоинтов, связать их локалками (а-ля podbot для cs) и ходить по ним, привязывая к ним все прочие объекты. Нужен гриб? Ищем ближайшие к грибу и неписю вейпоинты и прокладываем кратчайший путь по какому-нить A* или Дейкстре. Правда на вложенных циклах нвскрипт стопудово вылетит в тми, поэтому часть логики придётся вынести наружу, я считал это в mysql, очень удобно - сразу и кэшировать можно. Со временем при неизменных вейпоинтах база данных наполняется маршрутами, и даже считать не надо.
Ну так он и на объекты есть. А вообще смотря какие грибочки же. biggrin.gif

Я потому и приписал, что теоретически. Однако в других играх же есть это! Про "носом в стену" отпишу ниже.

С вейпоинтами у меня есть реализация в тренлагере своего модуля - там стражи по задумке патрулируют периметр интерьера и полностью автономный маршрутизатор не подошел, т.к. тогда они делали это хаотично (не используя прогулочные дорожки и часто застревая по текстурным закоулкам), а не так, как положено патрульным по идее. Однако даже и с вейпоинтами система не выглядит просто и тупо "из пункта-А в пункт-Б" и потребовалось писать отдельно АИ-деблокатор для ситуаций, когда неписи к примеру заходили случайно за забор, застревая в нем и прочих других текстурах. Там это было сделать легко - НПС теперь просто в случае длительной блокировки "перепрыгивает" через него.
Так же на 2 этаже есть пару неписей, которых по задумке нужно было жестко привязать к своим позициям, причем оставляя им при этом возможность реагировать на внешние условия и покидать свои "рабочие места". Проблема состояла в том, что одно из таких мест было в сложном "Г"-образном закутке обставленном большими и малыми плейсеблами. То есть для нормального НВН-ского АИ ситуация практически неразрешимая без мини-телепорта, как со стражниками. Но такие методы я всегда оставляю на крайний случай и мне таки удалось написать очень удачный АИ-деблокиратор и научить НПС "обходить" любые сложные препятствия, не "перепрыгивая" их и без сильных ресурсозатрат. smile.gif Успешно использую модификации этого деблокатора для всех прочих АИ модуля.

Цитата(Melisse @ May 21 2015, 15:39) *
Да, без сомнения очень удобно, только кэш вылетает на 110+ точек в тми, потому что ты сначала кэшируешь, потом еще 2 раза гоняешь по точкам запросы, но идея очень клевая. При некоторых изменениях позволяет запустить фишки аля обливион/скайрим - нпц ходят и делают свои дела, а не стоят истуканами.

По поводу поиска пути я могу добавить то что проблемы бывают даже тайлах без объектов plc. Поиск пути просто очень криво работает и кушает много ресурсов, На стандартных тайлах работает лучше, чем на кастомных. Но сильные проблемы начинаются когда на тайлах размещают плэйсы, просто у проходимости там 3 вида видимо, те что на объектах и дверях наслаиваются на тайлы и каким-то образом часто глючат. Думаю система сродни таковой с 2да файлами - сначала загружаются все стандартные, потом то что в хаках переписыват стандартные, и сверху переписывается все это тем что в овверррайде. smile.gif
В любом случае, по проверкам, поиск пути всегда затрачивает в 10 раз больше времени чем самый сложный скрипт и очень часто выдает что путь не найден, особенно плохо работает для нпц.
Именно такой у меня подход к АИ не только и сколько НПС, а всех мобов в модуле, и такие системы мне очень нужны для качественной реализации.
Конечно большинство АИ (особенно самых примитивных существ) сводится к рендумной ходьбе, но и в большинстве случаев же оно дополняется комплексом ситуативных функций - к примеру:
- АИ крыс включает в себя помимо стандартной ходьбы и агрессии "санитарный комплекс" (уничтожение трупов съедобных существ), "собирательский" (различают и подбирают еду с земли в виде итемов), "поведенческий" (боятся дневного света или света факела), "стайный" (если есть возможности - крыса может вызвать подмогу в неравном бою из крысиной норы поблизости), "поисковый" (система отрабатывает дополнительные органы чувств у моба - обоняние), ну и конечно "АИ-деблокираторы" (у крыс стоит на данный момент самый реакционный деблокиратор среди мобов, позволяющий им почти моментально находить путь даже из "П"-образных тупиков по вектору движения, обходя их по кривой);
- АИ термитов для сравнения включает в себя помимо стандартной ходьбы и модифицированной агрессии (не агрятся перманентно - только временно "отгоняют" приблизившихся к ним посторонних) тот же "санитарный комплекс", "собирательский" без ограничения (собирают любой лут с пола в виде итемов, а так же обчищают лутбэги мобов), "поведенческий" (носят все собранное в свой "муравейник" который выступает чем-то вроде склада, который может при желании обнести РС, как не запертый сундучок), имеют самый простой и топорный "АИ-деблокиратор" среди имеющихся мобов в угоду отыгрыша своего биологического вида. smile.gif
У других типов мобов АИ попроще, но тоже обязательно имеет свои поведенческие особенности олицетворяющие собсно вид криттера наряду со скином его модельки в игре.

Я давно понял, что писать стационарный АИ бесполезно. Программирование жесткого алгоритм поведения, основанного на константах вроде конкретных объектов - рано или поздно ведет к "носу в стенке". Поэтому АИ я пишу всегда по принципу "десантника" - ориентирующееся в любой обстановке, в каком бы ни оказался моб-хозяин. Собственно крысы в модуле и есть у меня эдакие "десантники" - только они высаживаются не с воздуха, а из-под земли.
АИ чаще всего имеет "свободный поиск", позволяющий монстру бродить в случайных направлениях, исследуя локацию, блок "агрессии" (различающийся главным образом от рода вида/фракции - травоядный/хищник/всеядный и от вида конкретного монстра) и батарею "поведенческих" блоков (чем сложнее "отыгрываемый" вид - тем их больше), которые прерывают свободный поиск, как только АИ видит поддающуюся его обработке ситуацию. Таким образом возможно включать в поведенческие блоки встроенные "задания", которые позволят отрабатывать НПС/мобу весьма сложные поведенческие акты (типа "грибочков"). Например термиты завладев какими-либо вещами включают свой АИ-блок транспортировки их к ближайшей своей норе; будучи заблокированными по дороге к ней - переходят автоматически к блоку АИ-деблокиратора; сложив все имеющиеся у себя вещи в нору, снова переходят в режим свободного поиска и исследуют локацию, и т.д...
denis0k
Цитата
Однако в других играх же есть это!
Другие игры пишут не биовари smile.gif Что ещё ожидать от программистов, у которых игры даже 2010+ года не используют юникод и глючат при установке в папку с кириллицей в имени? biggrin.gif
Flaristan
Цитата(denis0k @ May 21 2015, 21:56) *
Другие игры пишут не биовари smile.gif Что ещё ожидать от программистов, у которых игры даже 2010+ года не используют юникод и глючат при установке в папку с кириллицей в имени? biggrin.gif
Но сама игра то вышла годной! prankster2.gif
Aztec2012
Доброго времени суток!

Как сделать доступными для навешивания на предметы заклинания монстров? В spells.2da похожего не нашёл.

Заранее спасибо.
Melisse
Потому что в спелл.2да ничего нет angel.gif

Тебе нужен следующий 2да файл: iprp_spells.2da
Заносишь туда нужный спелл.
Описание столбцов:
Порядковый номер|Метка (для тебя)|Название из тлк |уровень каста| врожденый уровень(круг видимо)| стоимость на итеме|номер спелла из spell.2da| используется ли снадобьями| используется ли вандами | используется ли всеми остальными итемами|последняя графа отвечает за иконку.


а в itemprops.2da можно вообще редактировать какие куда можно наносить свойства.
Aztec2012
Спасибо.

Навесил через Spells.2da заклинания монстров на чародея, но появились у него далеко не все заклинания.
RusIvan
Прошу помочь реализовать идею призыва монстров через диалог на объекте. Создал нужный объект, путевую точку, призываемое существо, использовал простейший скрипт из призыва существа (из 2-й главы кампании, алтарь в лесу призывает медведя). Но монстр упорно не желает появляться. Что я делаю не так?
NumberOne
RusIvan, не знаю точно, какой скрипт ты использовал, но зайдя в свои наработки, я нашел вот это:

Код
#include "nw_i0_2q4luskan"

void main()
{
object oWP = GetWaypointByTag("ТОЧКА ПРИЗЫВА");

location lTarget = GetLocation(oWP);

DelayCommand(0.5, CreateObjectVoid(OBJECT_TYPE_CREATURE, "МОНСТР", lTarget));
}


И ради интереса, скинь скрипт, который у тебя упорно не призывает.
StasMokos
Пожалуйста, скажите, сюда кто-то заходит еще и сможет помочь? shout.gif
Melisse
Я захожу, чем тебе помочь?
Heather
Можно ли скриптом зажечь факелы, которые висят на стене? Факелы часть тайлсета.
Я помню, что был тут скрипт, позволяющий изменить освещение тайла, но нужно именно, чтобы факелы загорались... Если это возможно, конечно.
Melisse
Возможно, даже цвет можно задать. Освещение тайлов тоже можно менять, но, конечно же, есть очень неприятный баг с факелами тайлов, их нельзя погасить smile.gif
за работу с тайлами отвечают следующие функции:

Neverwinter Script
void SetTileMainLightColor(location lTileLocation, int nMainLight1Color, int nMainLight2Color);
void SetTileSourceLightColor(location lTileLocation, int nSourceLight1Color, int nSourceLight2Color);

int GetTileMainLight1Color(location lTile);
int GetTileMainLight2Color(location lTile);
int GetTileSourceLight1Color(location lTile);
int GetTileSourceLight2Color(location lTile);

void RecomputeStaticLighting(object oArea);


переменные TILE_MAIN_LIGHT_COLOR_* и TILE_SOURCE_LIGHT_COLOR_ *

Несколько нюансов использования из личного опыта:
1. Почему-то мне удавалось сменить освещение только через цикл.
2. void RecomputeStaticLighting(object oArea); делать в области обязательно, иначе ничего не выйдет.
3. Почему-то у меня не считывалась локация через GetArea(), пришлось возвращать локацию через GetObjectByTag().

Пример "из жизни":
Neverwinter Script
object oArea = GetObjectByTag("BRN_01A", 0); // твоя Area, берем ее через GetObjectByTag()
    vector vTile = Vector(0.0, 0.0, 0.0);
    location lTile = Location(oArea, vTile, 0.0); // тут расчет тайлов в локации начинается
    float fx = 0.0;
    float fy = 0.0;

    float fTileH = IntToFloat(GetAreaSize(AREA_HEIGHT, oArea)); // считываем размеры
    float fTileW = IntToFloat(GetAreaSize(AREA_WIDTH, oArea));

    while ((fx < fTileH) && (fy < fTileW)) // цикл - бежим по тайлам
    {
        vTile = Vector(fx, fy, 0.0);
        lTile = Location(oArea, vTile, 0.0);
        SetTileMainLightColor (lTile, TILE_MAIN_LIGHT_COLOR_BLACK, TILE_MAIN_LIGHT_COLOR_BLACK); // Это вроде освещение тайлов
        SetTileSourceLightColor (lTile, TILE_MAIN_LIGHT_COLOR_WHITE, TILE_MAIN_LIGHT_COLOR_WHITE); // Вот это вроде - факелы
        fx = fx + 1.0;

        if(fx >= fTileH)
        {
            fy = fy + 1.0;
            fx = 0.0;
        }
    }

    RecomputeStaticLighting(oArea); // Меняем освещение
Heather
Цитата
очень неприятный баг с факелами тайлов, их нельзя погасить

А если они изначально погашены? Они включатся?
Меня очень пугают все эти векторы.. прям бррр...
Попробую сделать по-твоему скрипту. Спасибо!
Melisse
Цитата
А если они изначально погашены? Они включатся?

Должны

Цитата
Попробую сделать по-твоему скрипту. Спасибо!

Попробуй, но я точно не помню правильно ли написала все, т.к. щас под рукой нет тулсета
Heather
Melisse, твой скрипт очень хорошо сработал! Благодарю безмерно!
Факелы зажглись, но на все локации. А можно сделать лишь в кусочке? Я хотела, чтобы РС заходил в комнату и зажигались огни, потом заходил в следующую и там зажигались....
Melisse
Вообще это скрипт не мой, он из нвн-лексикона. Другое дело что я писала его по памяти, поэтому я и сказала что он может не сработать smile.gif В кл тоже был использован.
Касательно вопроса:
Честно - я не знаю. Не пробовала.
Наверное - возможно.
Думается 2 варианта:
1. Это посчитать какие это именно тайлы по номеру в локации и соответственно зажигать только их
2. Можно попробовать разместить в центре нужных тайлов невидимый объект и проверять, есть ли он.
Примерно так:
Neverwinter Script
***** кусок скрипта ****
  while ((fx < fTileH) && (fy < fTileW)) // цикл - бежим по тайлам
    {
        vTile = Vector(fx, fy, 0.0);
        lTile = Location(oArea, vTile, 0.0);
        object oTilePlace = GetNearestObjectToLocation (OBJECT_TYPE_PLACEABLE, lTile, 1);   
        float fDist = GetDistanceBetweenLocations (lTile, GetLocation(oTilePlace)); //  Надо аккуратно поставить, методом тыка, чтобы считывались.
       
         if(fDist != -1.0f && fDist < 9.0f)
        {
            SetTileMainLightColor (lTile, TILE_MAIN_LIGHT_COLOR_BLACK, TILE_MAIN_LIGHT_COLOR_BLACK);
            SetTileSourceLightColor (lTile, TILE_MAIN_LIGHT_COLOR_WHITE, TILE_MAIN_LIGHT_COLOR_WHITE);
        }

        fx = fx + 1.0;

        if(fx >= fTileH)
        {
            fy = fy + 1.0;
            fx = 0.0;
        }
    }

*****
greye
Цитата(Melisse @ Jan 20 2016, 10:42) *
2. Можно попробовать разместить в центре нужных тайлов невидимый объект и проверять, есть ли он.

Если на нужных тайлах разместить, например, вейпоинты с одинаковым тегом (новый тег в каждой комнате), можно использовать следующую функцию:
Neverwinter Script
void lightMarkedTiles(string tag, object area) {
    int n = 0;
    object marker = GetObjectByTag(tag, n);
    while (GetIsObjectValid(marker)) {
        location lTile = GetLocation(marker);

        SetTileMainLightColor (lTile, TILE_MAIN_LIGHT_COLOR_BLACK, TILE_MAIN_LIGHT_COLOR_BLACK);
        SetTileSourceLightColor (lTile, TILE_MAIN_LIGHT_COLOR_WHITE, TILE_MAIN_LIGHT_COLOR_WHITE); 

        marker = GetObjectByTag(tag, ++n);
    }
    RecomputeStaticLighting(area);
}
Heather
Интересно... Сегодня вечером попробуй пошаманить, тем более, что вейпойнт и объект у меня в данном тайле уже стоят.
Melisse
Вот, кстати, вариант который предложил greye более оптимизирован и проще smile.gif
Heather
Цитата
вариант который предложил greye

Это кусок скрипта или целый? Вы простите, я ж совсем дерево, я даже не поняла, тэг-то куда вписывать? -__-
greye
Цитата(Heather @ Jan 23 2016, 00:18) *
Это кусок скрипта или целый? Вы простите, я ж совсем дерево, я даже не поняла, тэг-то куда вписывать? -__-

Это функция, которую можно использовать. В предположении, что факелы в комнате зажигаются по триггеру, полный скрипт мог бы выглядеть следующим образом:
Neverwinter Script
void lightMarkedTiles(string tag, object area) {
    int n = 0;
    object marker = GetObjectByTag(tag, n);
    while (GetIsObjectValid(marker)) {
        location lTile = GetLocation(marker);

        SetTileMainLightColor (lTile, TILE_MAIN_LIGHT_COLOR_BLACK, TILE_MAIN_LIGHT_COLOR_BLACK);
        SetTileSourceLightColor (lTile, TILE_MAIN_LIGHT_COLOR_WHITE, TILE_MAIN_LIGHT_COLOR_WHITE);

        marker = GetObjectByTag(tag, ++n);
    }
    RecomputeStaticLighting(area);
}

void main() {
    string tag = ...; // задать тег можно разными способами: вписать прямо в скрипт, считать из локальной переменной или вовсе поставить триггеру тот же тег и использовать его
    lightMarkedTiles(tag, GetArea(OBJECT_SELF));
}
Heather
В общем, пробовала я пробовала, ничего не выходило с этими факелами.
Либо зажигаются все, либо вообще ничего.
Муж помог, в итоге вышло вот так:
Neverwinter Script
location GetTileLocation(location loc)
{

    vector vec = GetPositionFromLocation( loc );
    float fNewX = IntToFloat( FloatToInt( vec.x/10.0 ) );
    float fNewY = IntToFloat( FloatToInt( vec.y/10.0 ) );
    float fNewZ = IntToFloat( FloatToInt( vec.z/10.0 ) );
    vector vNew = Vector( fNewX, fNewY, fNewZ );
    location lNew = Location( GetAreaFromLocation( loc ),
        vNew, GetFacingFromLocation( loc ) );
    return lNew;
}
Feron
QUOTE (Heather @ Mar 7 2016, 22:21) *
В общем, пробовала я пробовала, ничего не выходило с этими факелами.
Либо зажигаются все, либо вообще ничего.
Муж помог, в итоге вышло вот так:
Neverwinter Script
location GetTileLocation(location loc)
{

    vector vec = GetPositionFromLocation( loc );
    float fNewX = IntToFloat( FloatToInt( vec.x/10.0 ) );
    float fNewY = IntToFloat( FloatToInt( vec.y/10.0 ) );
    float fNewZ = IntToFloat( FloatToInt( vec.z/10.0 ) );
    vector vNew = Vector( fNewX, fNewY, fNewZ );
    location lNew = Location( GetAreaFromLocation( loc ),
        vNew, GetFacingFromLocation( loc ) );
    return lNew;
}


Хизер, у нас как-то была задача сделать атмосферное и эффективное освещение для логова наемников. Я не знаю точно для какого сценического элемента тебе надо, но если тебе нужен переход от тьмы к светы за счет зажигания факелов, то думаю это может подойти. Это пример, где наемник может зажечь в темном логове факела и осветить всю локацию.

Вот так выглядит это (Видео на YouTube).

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

CODE
void FadeIn(int nIteration, object oArea)
{
    int nAmount = GetFogAmount(FOG_TYPE_MOON, oArea);
    if(nAmount <= 0 || nIteration > 15)
    {
        SetFogAmount(FOG_TYPE_MOON, 0, oArea);
        SetFogAmount(FOG_TYPE_SUN, 0, oArea);
        SetFogColor(FOG_TYPE_MOON, FOG_COLOR_BLACK, oArea);
        return;
    }
    else
    {
        int nNew = GetFogAmount(FOG_TYPE_MOON, oArea) - 10;
        if(nNew < 0)
            nNew = 0;
        SetFogAmount(FOG_TYPE_MOON, nNew, oArea);
        SetFogAmount(FOG_TYPE_SUN, nNew, oArea);
        DelayCommand(0.2, FadeIn(++nIteration, oArea));
    }
}

void FadeOut(int nIteration, object oArea)
{
    int nAmount = GetFogAmount(FOG_TYPE_MOON, oArea);
    if(nAmount >= 100 || nIteration > 15)
    {
        SetFogAmount(FOG_TYPE_MOON, 100, oArea);
        return;
    }
    else
    {
        SetFogAmount(FOG_TYPE_MOON, GetFogAmount(FOG_TYPE_MOON, oArea) + 10, oArea);
        SetFogAmount(FOG_TYPE_SUN, GetFogAmount(FOG_TYPE_SUN, oArea) + 10, oArea);
        DelayCommand(0.2, FadeOut(++nIteration, oArea));
    }
}


Если есть куда пристроить, я могу тебе маленькую локацию подвала с одним факелом прислать в котором рычажком сможшь включать выключать свет.
Heather
Цитата
Я не знаю точно для какого сценического элемента тебе надо

Мне надо, чтобы заходя в комнату, зажигались факелы на стенах. Не светильники-объекты, а часть тайла. Без рычагов, без кнопок и действий. По триггеру.
Собственно, тот скрипт, что я выложила, работает ровно так, как надо. Но спасибо за предложение. =)
Feron
QUOTE (Heather @ Mar 10 2016, 21:59) *
Мне надо, чтобы заходя в комнату, зажигались факелы на стенах. Не светильники-объекты, а часть тайла. Без рычагов, без кнопок и действий. По триггеру.
Собственно, тот скрипт, что я выложила, работает ровно так, как надо. Но спасибо за предложение. =)


Я понял. Показал не ради загораемого факела плейсбла а на случай, если дополнительно к обновлению освещения тайла хочется добавить повышение освещения во всей локации.
ud4ever
Подскажите, пожалуйста, скорее всего кто-либо сталкивался. Как отключить бартер в модуле?
Aiwan
Цитата(ud4ever @ Mar 22 2016, 00:52) *
Подскажите, пожалуйста, скорее всего кто-либо сталкивался. Как отключить бартер в модуле?

Что вы имеете в виду? Подробнее задачу опишите.
ud4ever
Цитата(Aiwan @ Mar 22 2016, 08:51) *
Что вы имеете в виду? Подробнее задачу опишите.

задача заключается в том чтобы при попытке совершить бартер он либо не работал, либо сразу отменялся для того чтобы у игроков не было возможности дюпить внутриигровые шмотки с его помощью
Melisse
На модульное событие потери вещи проверяй
1. Вещь существует (может удалилась)
2. Вещь не в инвентаре плэйса или существа
2. Вещь не выложена на пол
4. Вот и наш Бартер - отменяем действие
5. ????
6. PROFIT!
denis0k
Я конечно не очень силён в дюпе... Но по логике нужно 2 события - передать итем второму игроку, дать ему сохраниться с ним и завалить сервер, пока не сохранился первый игрок. Передать можно через пол. А для завала сервера уже не важно - сработает ваш бартер или нет, если валить будут бартером. Уверен, есть и другие способы, не так давно был разговор про откат через полиморф.
Feron
Цитата(denis0k @ Mar 23 2016, 09:48) *
Я конечно не очень силён в дюпе...


Тебе везет, завидую. Помимо описанного способа дюпа в котором не важно, как передается, есть завязанный на бартере дюп. Основной лечится nwnx-ом.

@Melisse - все верно, только отмена действия это не совсем то, что может помочь, ибо действие уже будет произведено и бартер не закроется, а это то, о чем попросили.

Самый простой и железный способ отменить любую попытку бартера без танцев с бубном это сохранение чара через ExportSingleCharacter на потере вещи, по принципу, как описал Melisse для определения ситуации бартера. При этом вещь вернется в бекпак персонажу. Там есть побочных эффект, что вещь нельзя до рестарта будет выложить еще раз - но это не страшно. А вообще, как правильно написали - если стоит фикс антипрозрачности через nwnх, то бартер безобиден для дюпа.

Можешь просто на каждой потере сохранять чара, по перфомансу это тебе не удари и поможет со случаеми, который описал denis0k. При этом у тебя могут быть ситуации потери вещи, а не дюпа. Полностью засинхронизировать сохранение персонажей, чтобы не было дюпа или потерь вещей невозможно. Есть всегда, что в момент записи будет рестарт и там будет глюк. Это редко, но может быть.

Если нужна помощь в конкретных кусках кода - обращайся. Так же могу поделиться всеми защитами от Дюпа. От всех известных дюпов есть в наличии решения, включая полиморфы.
StasMokos
Я надеюсь, что здесь кто-то есть, потому что очень нужна ваша помощь.
Такой вопрос: при установлении int в начале скрипта может быть такое, что он не перезаписывается в дальнейшем под условием?
Это на контейнере, если что.

Пример

Neverwinter Script
int lut1;

if (Type == "lut_sm")
  int lut1 = 35;
 
if (lut1 >> 12)
  делается что-то;


При этом если проверять в первом условии переменные, то int равен 35, а не 0. Почему после первой проверки и, соответственно, во второй проверке он равен 0?
Что я не понимаю?((
Aiwan
А весь скрипт большой? Кусок мало что говорит.

Он может не перезаписываться под твоим же условием.
Aiwan
Neverwinter Script
if (lut1 >> 12)
Если это условие просто БОЛЬШЕ, то должно быть так:
Neverwinter Script
if (lut1 > 12)
Heather
Привет! Всех с праздниками!
Помогите, пожалуйста, с очень простой штукой! Хочу, чтобы в катсцене говорили имя игрока (через SpeakString), но не могу найти, как его задать. Что-то типа<PCName>... В Лексиконе искала, не нашла, бикоз май инглиш из нот гуд smile.gif
greye
Цитата(Heather @ May 7 2017, 12:48) *
Привет! Всех с праздниками!
Помогите, пожалуйста, с очень простой штукой! Хочу, чтобы в катсцене говорили имя игрока (через SpeakString), но не могу найти, как его задать. Что-то типа<PCName>... В Лексиконе искала, не нашла, бикоз май инглиш из нот гуд smile.gif

Neverwinter Script
string playerName = GetName(GetFirstPC());
Heather
greye, спасибо!
Elendion
Уважаемые господа, как сделать, чтобы нужных неписей нельзя было оттолкнуть в стороны движением игрока?
Melisse
Я знаю только такой вариант - нужно на ОнСпавн наложить "эффект духа" на НПЦ, чтобы через него можно было проходить и он не учитывался поиском пути.
Heather
Вроде, если НПС нейтральный к игроку (т.е. подсвечивается синим, а не зеленым), то он не будет отскакивать.
denis0k
Какова цель?

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

Если чтобы игрок не мог куда-то пройти, то красиво - никак. При умении можно сквозь двери проходить. Если некрасиво - за неписём поставить триггер и телепортировать игрока назад.
Elendion
Спасибо за ответы выше. Появилась новая загвоздка х)
Мне нужно, чтобы игрок брал коробку, она клалась в инвентарь и он мог её снова выложить в виде той же коробки. Я реализовал то, чтобы на OnUse коробки она исчезала и давала предмет, но не знаю как её выложить в том же формате из инвентаря, получается просто мешочек.
denis0k
Цитата(Elendion @ Aug 27 2017, 22:06) *
Спасибо за ответы выше. Появилась новая загвоздка х)
Мне нужно, чтобы игрок брал коробку, она клалась в инвентарь и он мог её снова выложить в виде той же коробки. Я реализовал то, чтобы на OnUse коробки она исчезала и давала предмет, но не знаю как её выложить в том же формате из инвентаря, получается просто мешочек.
Обратная процедура - на событие потери итема (on item unacquired), итем удаляется, а по координатам итема создаётся плейсебл-коробка.

Нашёл в старых скриптах:
CODE
object oItem = GetModuleItemLost();
location lLoc = GetLocation(oItem);
string sTag = GetTag(oItem);

if (sTag == "тег итема")
{
if (GetIsObjectValid(GetAreaFromLocation(lLoc))) // есть локация => выложили на пол, а не передали/продали
{
CreateObject(OBJECT_TYPE_PLACEABLE, "тег плейсебла", lLoc);
DestroyObject(oItem);
}

return;
}
Elendion
При создании скрипта выдает ошибку о том, что неправильный конец оператора.
denis0k
Цитата(Elendion @ Aug 28 2017, 09:34) *
При создании скрипта выдает ошибку о том, что неправильный конец оператора.
Это вырезка из скрипта smile.gif Внутри void main() {} надо вставлять. Кусок скопирован из рабочего скрипта.

Или вариант 2: удалить русский коммент. Непатченный компилятор агрится на букву "я" smile.gif
Elendion
Еще раз огромное спасибо. Я попытался сделать диалог со следами, как в кампании, взял принцип оттуда, но не выходит. Почему?
Melisse
ты покажи что конкретно не получается
Aiwan
Цитата(Elendion @ Aug 29 2017, 13:51) *
Еще раз огромное спасибо. Я попытался сделать диалог со следами, как в кампании, взял принцип оттуда, но не выходит. Почему?

Плохо умеешь писать скрипты.
Elendion
На OnUsed следов прикрепил стандартный скрипт x1_placeablecon, подсмотрел как в кампании и прикрутил диалог. Или все-таки надо еще отдельно какой-то скрипт использовать?

Я сам себя загнал в угол, извиняюсь, нашел ошибку.

Есчо глупейший вопрос. Нужен скрипт, чтобы игрок умирал и смог воскреснуть только через время (например 30 секунд), + потеря золота и опыта без потери уровня.

Или чтобы после смерти он попадал в локацию чистилища и при разговоре с духом появлялся в том же месте где и умер, но с потерей золота и опыта.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.