![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#4861
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Я захожу, чем тебе помочь?
|
![]()
Сообщение
#4862
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
Можно ли скриптом зажечь факелы, которые висят на стене? Факелы часть тайлсета.
Я помню, что был тут скрипт, позволяющий изменить освещение тайла, но нужно именно, чтобы факелы загорались... Если это возможно, конечно. |
![]()
Сообщение
#4863
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Возможно, даже цвет можно задать. Освещение тайлов тоже можно менять, но, конечно же, есть очень неприятный баг с факелами тайлов, их нельзя погасить (IMG:style_emoticons/kolobok_light/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); // Меняем освещение Сообщение отредактировал Melisse - Jan 14 2016, 13:30 |
![]()
Сообщение
#4864
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
Цитата очень неприятный баг с факелами тайлов, их нельзя погасить А если они изначально погашены? Они включатся? Меня очень пугают все эти векторы.. прям бррр... Попробую сделать по-твоему скрипту. Спасибо! Сообщение отредактировал Heather - Jan 14 2016, 13:32 |
![]()
Сообщение
#4865
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Цитата А если они изначально погашены? Они включатся? Должны Цитата Попробую сделать по-твоему скрипту. Спасибо! Попробуй, но я точно не помню правильно ли написала все, т.к. щас под рукой нет тулсета |
![]()
Сообщение
#4866
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
Melisse, твой скрипт очень хорошо сработал! Благодарю безмерно!
Факелы зажглись, но на все локации. А можно сделать лишь в кусочке? Я хотела, чтобы РС заходил в комнату и зажигались огни, потом заходил в следующую и там зажигались.... |
![]()
Сообщение
#4867
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Вообще это скрипт не мой, он из нвн-лексикона. Другое дело что я писала его по памяти, поэтому я и сказала что он может не сработать (IMG:style_emoticons/kolobok_light/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; } } ***** Сообщение отредактировал Melisse - Jan 20 2016, 09:46 |
![]()
Сообщение
#4868
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
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); } Сообщение отредактировал greye - Jan 20 2016, 10:43 |
![]()
Сообщение
#4869
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
Интересно... Сегодня вечером попробуй пошаманить, тем более, что вейпойнт и объект у меня в данном тайле уже стоят.
|
![]()
Сообщение
#4870
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Вот, кстати, вариант который предложил greye более оптимизирован и проще (IMG:style_emoticons/kolobok_light/smile.gif)
Сообщение отредактировал Melisse - Jan 20 2016, 14:00 |
![]()
Сообщение
#4871
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
Цитата вариант который предложил greye Это кусок скрипта или целый? Вы простите, я ж совсем дерево, я даже не поняла, тэг-то куда вписывать? -__- |
![]()
Сообщение
#4872
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
Это кусок скрипта или целый? Вы простите, я ж совсем дерево, я даже не поняла, тэг-то куда вписывать? -__- Это функция, которую можно использовать. В предположении, что факелы в комнате зажигаются по триггеру, полный скрипт мог бы выглядеть следующим образом: 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)); } |
![]()
Сообщение
#4873
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
В общем, пробовала я пробовала, ничего не выходило с этими факелами.
Либо зажигаются все, либо вообще ничего. Муж помог, в итоге вышло вот так: 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; } |
![]()
Сообщение
#4874
|
|
Level 3 ![]() Класс: Обыватель Характер: True Neutral Раса: Человек NWN: Модмейкер Сиала ![]() |
В общем, пробовала я пробовала, ничего не выходило с этими факелами. Либо зажигаются все, либо вообще ничего. Муж помог, в итоге вышло вот так: 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)); } } Если есть куда пристроить, я могу тебе маленькую локацию подвала с одним факелом прислать в котором рычажком сможшь включать выключать свет. Сообщение отредактировал Feron - Mar 10 2016, 15:06 |
![]()
Сообщение
#4875
|
|
Level 5 ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Модмейкер История дома Салливан ![]() |
Цитата Я не знаю точно для какого сценического элемента тебе надо Мне надо, чтобы заходя в комнату, зажигались факелы на стенах. Не светильники-объекты, а часть тайла. Без рычагов, без кнопок и действий. По триггеру. Собственно, тот скрипт, что я выложила, работает ровно так, как надо. Но спасибо за предложение. =) Сообщение отредактировал Heather - Mar 10 2016, 21:00 |
![]()
Сообщение
#4876
|
|
Level 3 ![]() Класс: Обыватель Характер: True Neutral Раса: Человек NWN: Модмейкер Сиала ![]() |
Мне надо, чтобы заходя в комнату, зажигались факелы на стенах. Не светильники-объекты, а часть тайла. Без рычагов, без кнопок и действий. По триггеру. Собственно, тот скрипт, что я выложила, работает ровно так, как надо. Но спасибо за предложение. =) Я понял. Показал не ради загораемого факела плейсбла а на случай, если дополнительно к обновлению освещения тайла хочется добавить повышение освещения во всей локации. |
![]()
Сообщение
#4877
|
|
Level 3 ![]() Класс: Бард Характер: Neutral Evil Раса: Человек ![]() |
Подскажите, пожалуйста, скорее всего кто-либо сталкивался. Как отключить бартер в модуле?
|
![]()
Сообщение
#4878
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
|
![]()
Сообщение
#4879
|
|
Level 3 ![]() Класс: Бард Характер: Neutral Evil Раса: Человек ![]() |
|
![]()
Сообщение
#4880
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
На модульное событие потери вещи проверяй
1. Вещь существует (может удалилась) 2. Вещь не в инвентаре плэйса или существа 2. Вещь не выложена на пол 4. Вот и наш Бартер - отменяем действие 5. ???? 6. PROFIT! Сообщение отредактировал Melisse - Mar 22 2016, 09:33 |
![]()
Сообщение
#4881
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Я конечно не очень силён в дюпе... Но по логике нужно 2 события - передать итем второму игроку, дать ему сохраниться с ним и завалить сервер, пока не сохранился первый игрок. Передать можно через пол. А для завала сервера уже не важно - сработает ваш бартер или нет, если валить будут бартером. Уверен, есть и другие способы, не так давно был разговор про откат через полиморф.
|
![]()
Сообщение
#4882
|
|
Level 3 ![]() Класс: Обыватель Характер: True Neutral Раса: Человек NWN: Модмейкер Сиала ![]() |
Я конечно не очень силён в дюпе... Тебе везет, завидую. Помимо описанного способа дюпа в котором не важно, как передается, есть завязанный на бартере дюп. Основной лечится nwnx-ом. @Melisse - все верно, только отмена действия это не совсем то, что может помочь, ибо действие уже будет произведено и бартер не закроется, а это то, о чем попросили. Самый простой и железный способ отменить любую попытку бартера без танцев с бубном это сохранение чара через ExportSingleCharacter на потере вещи, по принципу, как описал Melisse для определения ситуации бартера. При этом вещь вернется в бекпак персонажу. Там есть побочных эффект, что вещь нельзя до рестарта будет выложить еще раз - но это не страшно. А вообще, как правильно написали - если стоит фикс антипрозрачности через nwnх, то бартер безобиден для дюпа. Можешь просто на каждой потере сохранять чара, по перфомансу это тебе не удари и поможет со случаеми, который описал denis0k. При этом у тебя могут быть ситуации потери вещи, а не дюпа. Полностью засинхронизировать сохранение персонажей, чтобы не было дюпа или потерь вещей невозможно. Есть всегда, что в момент записи будет рестарт и там будет глюк. Это редко, но может быть. Если нужна помощь в конкретных кусках кода - обращайся. Так же могу поделиться всеми защитами от Дюпа. От всех известных дюпов есть в наличии решения, включая полиморфы. Сообщение отредактировал Feron - Mar 28 2016, 10:11 |
![]()
Сообщение
#4883
|
|
Level 3 ![]() Класс: Воин Характер: True Neutral Раса: Эльф ![]() |
Я надеюсь, что здесь кто-то есть, потому что очень нужна ваша помощь.
Такой вопрос: при установлении int в начале скрипта может быть такое, что он не перезаписывается в дальнейшем под условием? Это на контейнере, если что. Пример Neverwinter Script int lut1; if (Type == "lut_sm") int lut1 = 35; if (lut1 >> 12) делается что-то; При этом если проверять в первом условии переменные, то int равен 35, а не 0. Почему после первой проверки и, соответственно, во второй проверке он равен 0? Что я не понимаю?(( Сообщение отредактировал Aiwan - Mar 5 2017, 13:39 |
![]()
Сообщение
#4884
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
А весь скрипт большой? Кусок мало что говорит.
Он может не перезаписываться под твоим же условием. |
![]()
Сообщение
#4885
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Neverwinter Script if (lut1 >> 12) Если это условие просто БОЛЬШЕ, то должно быть так:Neverwinter Script if (lut1 > 12)
|
![]() ![]() |
Текстовая версия | Сейчас: 20th August 2025 - 02:42 |