![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3521
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Это настройка уничтожения трупа... Лучше вешать команду на модуль, а не крысу. Через: AssignCommand
|
![]()
Сообщение
#3522
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Это тогда на HeartBeat?
|
![]()
Сообщение
#3523
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
Gennady походу имеет в виду, что если крыса (труп) уничтожается моментально после смерти, то по прохождению задержки превышающей остаток раунда в котором это происходит (больше 5 секунд) – скрипту не с чего запуститься т.к. его объект носитель перестает существовать. Чтоб этого избежать, нужно отдавать команду запуска скрипта не по умолчанию, как в продемонстрированном примере (подразумевающую OBJECT_SELF), а через «assign» с указанием лица стороннего объекта запуска, который будет продолжать существовать и после смерти крысы (например от лица вейпоинта респа или локации и т.п.).
|
![]()
Сообщение
#3524
|
|
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг ![]() |
Gennady походу имеет в виду, что если крыса (труп) уничтожается моментально после смерти, то по прохождению задержки превышающей остаток раунда в котором это происходит (больше 5 секунд) – скрипту не с чего запуститься т.к. его объект носитель перестает существовать. Чтоб этого избежать, нужно отдавать команду запуска скрипта не по умолчанию, как в продемонстрированном примере (подразумевающую OBJECT_SELF), а через «assign» с указанием лица стороннего объекта запуска, который будет продолжать существовать и после смерти крысы (например от лица вейпоинта респа или локации и т.п.). лучше вешать действия не на вейпойнты (IMG:style_emoticons/kolobok_light/smile.gif) . не доверяю я им (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#3525
|
|
Level 5 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Человек ![]() |
доброго всем времени суток!
недавно решил, наверное, в 7 раз переделать заново один мой модуль. и внедрить в него стандартную систему имитации жизни (AMBIENT_ANIMATIONS). уже когда-то делал такое, но немного подзабыл, что к чему. короче, столкнулся с такой проблемой: все НПЦ начинают "жить" только после того, как увидят игрока. т.е. они не выходят из домов, пока к ним не заглянет ПК. и это при том, что все, что нужно, подготовлено: все вейпы стоят на местах, все нужные переменные присвоены. ОнСпаун-скрипт тоже отредактирован соответствующим образом. переменная FLAG_CONSTANT, по-идее, должна включать "постоянную" жизнь НПЦ, т.е. они ходят и проигрывают анимции даже, если ПК нет рядом. однако почему-то не работает. как это исправить? |
![]()
Сообщение
#3526
|
|
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг ![]() |
как это исправить? досконально облазить каждое событие перед функцией WalkWayPoints() (IMG:style_emoticons/kolobok_light/smile.gif) , а еще лучше в ней )) |
![]()
Сообщение
#3527
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Хербит отрубается в локациях, где нет игроков. Почему-то, хотя не должен. Бывает так - зашел НПС в дверь и все - обратно не выходит, пока игрок туда не наведается.
Можно извратиться через модульный хербит - на каждого НПС запускать скрипт, а не через их хербит. Больше способов не знаю. |
![]()
Сообщение
#3528
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
Он не «почему-то» отрубается, и это не только с НПС - а так же с объектами имеющими скрипты, визуальными эффектами и всем прочим. Это менеджмент ресурсами виртуальной машины сервера – она вообще может отключаться полностью пока в модуль не зайдет игрок. Обходить его не надо, потому что сделано было не просто так.
Виртуальному миру и не нужно собсно жить без игрока: единственный корректный способ это исправить – это либо составление алгоритмов позволяющих AI снимать в любой запрашиваемый момент времени полную симуляцию состояния объекта и воссоздавать по запросу; либо составление алгоритмов универсального реагирования криттера на внешние условия (ну либо и то и то). Для НПС первый вариант типа: «если время с момента запуска модуля = столько-то, то криттер появится там-то и сделает то-то, имея при себе столько-то чего нада». Второй вариант типа: «если сейчас день, а у криттера нет того-то, то идем туда-то и берем чего нада, если оно есть, то идем куда-то еще и делаем что-то, пока не потратим чего надо, а если сечас ночь, притворяемся мертвым и храпим, пока не потыкают чтобы проверить». (IMG:style_emoticons/kolobok_light/smile.gif) P.S.: ReZkiy, вообще я сейчас этим занимаюсь для онлайн модуля – может есть желание принять участие? |
![]()
Сообщение
#3529
|
|
Level 5 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Человек ![]() |
мне, по большому счету, и не нужно, чтобы НПЦ действовали, пока игрока нет в локации (это лишняя трата ресурсов). мне нужно, чтобы они: 1) ночью сидели дома; 2) днем ходили по городу. и первое, и второе сейчас работает, однако только, если за НПЦ следит игрок. если, скажем, группа НПЦ с наступлением темноты вернулась в дом, то на утро они от туда уже не выйдут, пока к ним не заглянет игрок. вот в этом вся проблема.
|
![]()
Сообщение
#3530
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
Я у себя создавал для этого «базы» для НПС – объекты которые управляют своим типом НПС на локации, на которой помещены. Банально гнезда и норы для животных, которые можно обнаружить и взаимодействовать на своем отдельном уровне.
Такой объект присутствует в модуле всегда и поэтому на него можно повесить скрипты позволяющие свободно удалять/респавнить криттеров без боязни срыва скриптов – в остальном сами криттеры автономны и используют скрипты «онхеартбита». Для «сна» криттеров я использовал команды «аппеар/дисаппеар» и на время ночи у меня птицы например попросту изчезают с локации («расселяясь» по гнездам), появляясь снова днем с учетом текущей популяции (новые птицы порциально спавнятся у гнезд по прохождению определенного периода времени с учетом установленного максимума популяции). Для команды «аппеар/дисаппеар» нет разницы в задержке (секунда или игровая ночь) так что в теории должно работать с НПС и их домами. P.S.: Чтоб не получалось при этом так, что реакция AI воспринималась «тормознутой» - можно поставить заглушку которая при входе игрока на локацию, при условии что на ней уже нету другого игрока, спавнила/перемещала бы невидимые «базы» криттеров в точке присутствия игрока тем самым гарантируя 100% оперативность работы скрипта на ней отвечающего за актуальное местоположение криттера. Сообщение отредактировал Flaristan - Jun 19 2012, 13:15 |
![]()
Сообщение
#3531
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Цитата мне, по большому счету, и не нужно, чтобы НПЦ действовали, пока игрока нет в локации (это лишняя трата ресурсов). мне нужно, чтобы они: 1) ночью сидели дома; 2) днем ходили по городу. и первое, и второе сейчас работает, однако только, если за НПЦ следит игрок. если, скажем, группа НПЦ с наступлением темноты вернулась в дом, то на утро они от туда уже не выйдут, пока к ним не заглянет игрок. вот в этом вся проблема. Нужно делать через хербит модуля или кастомный хербит каждые 6.0 сек на модуле. Там беруться все НПС одной фракции или одного тега и кидаются днем туда, а ночью обратно. Только кушает процесс "перекидования" не мало. |
![]()
Сообщение
#3532
|
|
Level 5 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Человек ![]() |
склепал что-то такое:
Neverwinter Script void main() вроде работает. днем они спавняться, а ночью исчезают. вот только исчезают они по-очереди (в отличии от появления) и с некоторым интервалом. и в это время игра немного подтормаживает, а еще в чат идут сообщения, что-то вроде "TOO MANY COMMANDS".{ object oNPC = GetNearestObjectByTag("NW_COMMALE"); int nTime = GetTimeHour(); int nCount = GetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT"); object oSpawn = GetWaypointByTag("WP_NPC_SPAWN"); location lSpawn = GetLocation(oSpawn); if (nTime >= 8 && nTime <= 18) { while (GetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT") < 8) { CreateObject(OBJECT_TYPE_CREATURE, "commale001", lSpawn); nCount += 1; SetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT", nCount); } } else { while (GetIsObjectValid(oNPC)) { DestroyObject(oNPC); nCount -= 1; SetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT", nCount); } } } П.С. подозреваю, что дело в том, что скрипт пытаеться повторно анигилировать существо, пока оно еще не доконца исчезло, т.е. имеет Valid-статус. что с этим делать? можно было бы поставить задержку на несколько секунд, однако это не ускорит процес дестроинга. Сообщение отредактировал Virake - Jun 19 2012, 17:07 |
![]()
Сообщение
#3533
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
«Слишком много инструкций» и далее таг объекта перегружающего кэш. Стандартное сообщение об ошибке когда происходит аварийная остановка выполнения скрипта – это значит его надо дорабатывать. (IMG:style_emoticons/kolobok_light/smile.gif)
P.S.: Neverwinter Script while (GetIsObjectValid(oNPC)) { DestroyObject(oNPC); nCount -= 1; SetLocalInt(OBJECT_SELF, "SPAWNED_NPC_COUNT", nCount); } Neverwinter Script oTarget = GetFirstObjectInArea(oArea);
while(GetIsObjectValid(oTarget)) { //сюда можно поставить любое условие хоть по тому же тагу if (GetIsPC(oTarget)) { //сюда то что тебе нужно сделать с объектом } oTarget = GetNextObjectInArea(oArea); } Сообщение отредактировал Flaristan - Jun 19 2012, 17:22 |
![]()
Сообщение
#3534
|
|
Level 5 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Человек ![]() |
действительо, теперь работает. спасибо за помощь.
П.С. однако полноценной системой это пока считаться не может. нужно внедрить: 1) чтобы спавнились случайные НПЦ 2) чтобы они спавнились по случайным вейпам 3) чтобы перед дестроингом возвращались к своим спавн-точкам Сообщение отредактировал Virake - Jun 19 2012, 18:04 |
![]()
Сообщение
#3535
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
1. Не сложно реализовать, заменив резреф криттера на стринговую переменную определяющуюся дополнительным блоком скрипта ранее, из списка заготовленных резрефов.
(хотя ИМХО лучше не случайные условия а причинно следственные) 2. То же самое. (и опять таки лучше снабдить кузницу наковальней которая будет респить кузнеца, улицу мусоркой которая будет респить дворника и т.п. – как минимум меньше будет нервотрепки с рендумной неопределенностью) 3. Именно поэтому удобна функция «аппеар/дисаппеар» - она не удаляет/респавнит объект, а переносит его в нужную позицию с какой угодно задержкой при необходимости. (а если просто нужна видимость сворачивания деятельности – то тут перед ним можно поставить парочку контрольных «велков» к нужному объекту, если в локации присутствует ПС; но как правило рано или поздно НПС все равно найдет способ застрять на глазах у ПС и испортить все впечатление от AI – хорошим решением для этого является тематическое преподнесение «дисаппиар» эффекта, например птицы у меня взлетают в воздух прежде чем пропасть) Сообщение отредактировал Flaristan - Jun 19 2012, 19:16 |
![]()
Сообщение
#3536
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Good Раса: Эльф ![]() |
Привет!
И снова я с вопросами о скриптах на респавн мобов! Вот есть рабочий скрипт под НВН1-НВН2(Меня интересует сейчас НВН2), вроде ставиться в OnDeath мобов(Скрипт сохраяеться без ошибок на F7, но ничего не происходит в игре-мобы не спавняться на точку, через заданные 6 секунд в скрипте), что задавать в WayPoint? Код #include "nw_i0_2q4luskan" void main() { object oSelf = OBJECT_SELF; string sResRef = GetResRef(oSelf); string sResPoint = GetLocalString(oSelf, "RESPAWN_POINT"); location lLoc = GetLocation(GetWaypointByTag(sResPoint)); AssignCommand(GetModule(), DelayCommand(6.0f, SetLocalString(CreateObject(OBJECT_TYPE_CREATURE, sResRef, lLoc), "RESPAWN_POINT", sResPoint))); } Подскажите пожалуйста, в чём загвоздка?! Просто я всё подзабыл, помню, что в НВН1-всё получалось-без проблем, но сейчас занялся НВН2, и там не выходит респавн моба на точку, после убийства... Уже второй день мучаюсь, подскажите, пожалуйста... Заранее спасибо! Добавлено позже: Уже сам разобрался... Сообщение отредактировал Sugo77 - Jan 7 2013, 10:29 |
![]()
Сообщение
#3537
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Good Раса: Эльф ![]() |
Добавил позже(Пару дней спустя):
Всё, сам во всём разобрался! Всем спасибо! Всех с праздниками! Пока больше нету вопросов... Хотя есть маленький, про замки, пока никак не могу сообразить, как сделать так, чтобы двери снова закрывать можно было на ключ, без воровских умений, ну чтобы любой класc мог проделывать это с помощью ключа, без прокаченных скиллов... Даже про фракции уже всё вспомнил, и про спавны, и про многое другое, а вот замки пока не научился, не вспомнил как обратно запирать на ключ, без прокаченных скиллов... Может есть какой-то скрипт для выполнения данной задачи? Заранее спасибо! Сообщение отредактировал Sugo77 - Jan 7 2013, 10:44 |
![]()
Сообщение
#3538
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Good Раса: Эльф ![]() |
Подскажите такой скрипт.
Чтобы после убйства моба, не оставался лут, или, чтобы выпавший лут, самостоятельно исчезал, через заданное время. И куда его вставлять? Заранее спасибо! Потому что без скрипта, в тулсете НВН 2-не нашёл другого способа, как такое сделать, изменение Body Bag на None-не помогает, лут всё равно остаётся с убитых мобов. Потчитал форумы на английском, там кто пишет, что, что-то нужно менять в On Death, кто в On Spawn, что-то связанное с Random Treasure, но не один, не написал, что... Добавлю, в On Death мобов у меня ужа забит скрипт на респавн мобов... Промежуточный результат: http://youtu.be/k7bxz0PxKow Сообщение отредактировал Sugo77 - Jan 8 2013, 08:16 |
![]()
Сообщение
#3539
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Neverwinter Script //::////////////////////////////////////////////////// //:: Чистка локации от предметов, слот ХБ //:: Created By: Gennady //:: Name: de_chistka_loc //::////////////////////////////////////////////////// #include \"ludi\" void ChistkaLoc(int iD, object oSelf = OBJECT_SELF) { object oItem = GetFirstObjectInArea(oSelf); int iFut = Day()+iD; int iDes = Day(); SetLocalInt(oSelf, 092;"day\", iFut); while(GetIsObjectValid(oItem)) { if(GetLocalInt(oItem,092;"day\")==0) SetLocalInt(oItem, 092;"day\", iFut); if(GetLocalInt(oItem,092;"day\")<= iDes) { if(GetTag(oItem)==092;"BodyBag\") { object oItemB = GetFirstItemInInventory(oItem); while(GetIsObjectValid(oItemB)) { if(GetPlotFlag(oItemB)==FALSE) DestroyObject(oItemB); oItemB = GetNextItemInInventory(oItem); } } else { if(GetObjectType(oItem)==OBJECT_TYPE_ITEM && GetPlotFlag(oItem)==FALSE) DestroyObject(oItem); } } oItem = GetNextObjectInArea(oSelf); } } //////////////////////////////////////////////////////////////////////////////// void main() { object oPC = GetFirstPC(); object oSelf = OBJECT_SELF; int iD = StringToInt(GetLockKeyTag(oSelf)); if(GetArea(oPC)==GetArea(oSelf)) // если ПС в локе ChistkaLoc(iD); else if(GetLocalInt(oSelf,092;"day\") <= Day() && GetLocalInt(oSelf,092;"day\")!=0) ChistkaLoc(iD); } // Тэг ключа, врямя в днях до удаления предметов Neverwinter Script ///////////////////////////////////////////////
// *** БИБЛИОТЕКА *** #include \"ludi\" /////////////////////////////////////////////// // _______________ Текущий день _______________________________________________ int Day() { int nDay = GetCalendarDay(); int nMes = 28*GetCalendarMonth(); int nYear = GetCalendarYear(); int iDay = 336*nYear+nMes+nDay; return iDay; } Сообщение отредактировал gennady - Jan 9 2013, 16:25 |
![]()
Сообщение
#3540
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
Я так понял вышеприведенный скрипт после заданного промежутка времени чистит все контейнеры на локации, на которой запущен. Однако особенность дефолтных лутбэгов (в НВН1 по крайней мере) такова, что они не подпадают в определение всех имеющихся в распоряжении движка идентификаторов – данный скрипт их не очистит.
Недавно сам такое делал и проверял: носитель лутбэга монстра отвечает определению самого монстра (имеет тот же таг и статус «мертвого существа» - фактически его мертвое тело), но после смерти носителя его лутбэг никакому влиянию не поддается (для стандартных скриптов на существе типа «онхертбита» после его смерти оно перестает «херт-бит» буквально и «ондэф» - это последний эвент которым можно что-то сделать) и его невозможно ничем «подцепить» в скрипте так, чтоб навязать манипуляции с ним. Они не выполняются. Попросту говоря сей объект в игре далее доступен только для ПС – сам движок лутбэг никак не видит. Можно удалить мертвое тело по тагу, заставить его исчезнуть или даже перенести в «лимбо» (что приведет к утрате всяческого доступа к его лутбэгу), но на полу при подсветке по табу все еще можно будет наблюдать силуэт его никуда не девшегося лутбэга. Единственный способ избавиться от стандартного лутбэга – вынуть все содержимое ПС-персонажем вручную. Решается эта дилемма классически заменой дефолтного лутбэга искусственным, который спавнится в момент смерти существа (по триггеру «ондэф») и в который копируются все предметы из инвентаря умирающего существа; последние в свою очередь после копирования тут же удаляются, чтоб очистить инвентарь создающегося трупа и избежать создания дефолтного лутбэга. Далее вы можете скриптами управлять трупом существа и искусственным лутбэгом с его содержимым вполне нормально и как вам заблагорассудится. А так же настроить время автоматического исчезновения трупа через настройки НПС. |
![]()
Сообщение
#3541
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
Попросту говоря сей объект в игре далее доступен только для ПС – сам движок лутбэг никак не видит. Можно удалить мертвое тело по тагу, заставить его исчезнуть или даже перенести в «лимбо» (что приведет к утрате всяческого доступа к его лутбэгу), но на полу при подсветке по табу все еще можно будет наблюдать силуэт его никуда не девшегося лутбэга. Единственный способ избавиться от стандартного лутбэга – вынуть все содержимое ПС-персонажем вручную. Неверно. Все стандартные лутбеги имеют тег "BodyBag", по нему можно получить доступ к объекту (видимому или нет), очистить от итемов и удалить, что и наблюдается в скрипте gennady. Единственное, лутбег ещё не создан на момент срабатывания OnDeath, поэтому его либо приходится искать с задержкой, либо запускать чистку с "внешних" событий. Сообщение отредактировал greye - Jan 10 2013, 09:56 |
![]()
Сообщение
#3542
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
Ну, тогда все еще проще – можно поставить в локации блок на «онхеартбит» с заглушкой на выполнение скажем раз в игровые сутки, который попросту будет очищать все объекты с этим тагом на локации:..
Neverwinter Script void main()
{ object oArea = OBJECT_SELF; object oTarget = GetFirstObjectInArea(oArea); object oItem; if (GetTimeHour() == 0) { if (GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF))== 0) { SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 1); } else { return; } } else { if (GetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF))== 1) { SetLocalInt(OBJECT_SELF, GetTag(OBJECT_SELF), 0); } return; } while(GetIsObjectValid(oTarget)) { if (GetTag(oTarget) == "BodyBag") { oItem = GetFirstItemInInventory(oTarget); while(GetIsObjectValid(oItem)) { DestroyObject(oItem); oItem = GetNextItemInInventory(oTarget); } } oTarget = GetNextObjectInArea(oArea); } } Сообщение отредактировал Flaristan - Jan 10 2013, 10:50 |
![]()
Сообщение
#3543
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
При большой загрузке модуля локациями, больше 100+ и большим кол-вом мобов ии других штук зависает время. Что будет в этом случае?))) - ты используешь GetTimeHour() (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#3544
|
|
Тролль ![]() ![]() ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь ![]() |
Ну это вообще не проблема:
1) счетчик вообще можно поставить принципиально какой удобно; 2) зависающее время в модуле вроде чинят перематывая его искусственно, если оно заедает естественно. |
![]()
Сообщение
#3545
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Good Раса: Эльф ![]() |
1.: gennady , при сохранении Вашего скрипта, указывает на какую-то неточность\ошибку в данной строчке:
int iFut = Day()+iD; И ещё, куда вставляется Ваш скрипт? 2.: А вот скрипт от Flaristan-прекрасно работает под НВН2, но!, уменьшить бы время задержки на исчезновения лута с локации, в его скрипте(Пока не могу дотумкать, как это сделать), а то сутки-это много, мне бы меньше минуты, то есть в секундах(Секунд: 30)... Предпологаю, что что-то связанное с DelayCommand 6.0f(Значение времени, выдернутое мною из скрипта на респавн мобов), но куда это вставить, что на что заменить?, и будет ли это правильно работать в скрипте от Flaristan? Заранее спасибо! Сообщение отредактировал Sugo77 - Jan 10 2013, 20:00 |
![]() ![]() |
Текстовая версия | Сейчас: 5th August 2025 - 19:39 |