Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                             local reason = string.format(fmt, ...)
                             error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Пн, 09.06.2014, 11:34 | Сообщение # 496
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Приветствую, народ!
Подскажите пожалуйста с чем связана такая проблема
[cut=Ф-ция]function hit_hud()
if db.actor.health < 0.3 and not has_alife_info("gg_hit") then
alife():create("hit_dop_item", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
db.actor:eat(db.actor:object("hit_dop_item"))
db.actor:give_info_portion("gg_hit")
end
if db.actor.health >= 0.3 and has_alife_info("gg_hit") then
db.actor:disable_info_portion("gg_hit")
end
end
[/cut]
Предмет выдается, однако почему-то сразу не используется
 
denis2000Дата: Пн, 09.06.2014, 12:33 | Сообщение # 497
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

strelok200, Может, как раз, причина в том что: "Предмет не сразу выдается", а уж потом "почему-то сразу не используется".

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Пн, 09.06.2014, 13:50 | Сообщение # 498
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

denis2000, Однако если у ГГ в инвентаре уже есть предмет, то ф-ция нормально сработает

Добавлено (09.06.2014, 13:50)
---------------------------------------------
Т.е. старый предмет используется и новый появится

 
denis2000Дата: Пн, 09.06.2014, 14:25 | Сообщение # 499
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

strelok200, То есть спавнить предмет нужно в функции hit_hud(), а периодически проверять его наличие и задействовать при появлении нужно например в функции bind_stalker.update()

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Пн, 09.06.2014, 19:59 | Сообщение # 500
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

denis2000, Проверять нужно здоровье у ГГ, если коэф. ниже 30%, то сразу же выдавать и использовать предмет

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

Добавлено (09.06.2014, 19:59)
---------------------------------------------
denis2000, Спасибо, немного переделаю систему.
У меня ещё такой вопрос- как рандомно выводить текстуру на худ? Рандомно должно выбираться положение на экране

 
denis2000Дата: Пн, 09.06.2014, 20:05 | Сообщение # 501
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата strelok200 ()
как рандомно выводить текстуру на худ?

Объект(CustomStatic):SetWndRect(Frect():set(X1coord,Y1coord,X2coord,Y2coord)),
где X1coord,Y1coord - координаты левого верхнего угла, X2coord,Y2coord - координаты правого нижнего угла элемента.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
KoshaДата: Чт, 19.06.2014, 22:50 | Сообщение # 502
Отмычка
Пользователи
Сообщений: 32
Награды: 0
Репутация: [ 0 ]

Скажите можно ли скрипт респавна в чн сделать не по смарт_террайну а по координатам?
И условием спавна сделать вход ГГ на локацию?
 
FantomICWДата: Чт, 19.06.2014, 22:54 | Сообщение # 503
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Kosha, а не удобней ли было бы делать респавн через рестриктор?


 
KoshaДата: Чт, 19.06.2014, 22:59 | Сообщение # 504
Отмычка
Пользователи
Сообщений: 32
Награды: 0
Репутация: [ 0 ]

Может и удобнее... Но я так на спортивный интерес хочу попробовать через скрипт)

Хорошо. Тогда прошу задать условие респавна. К примеру, сойдет ли респавн каждый день в 12:00?
FantomICW


И условием спавна сделать вход ГГ на локацию? - писал же выше)


Сообщение отредактировал Kosha - Пт, 20.06.2014, 00:40
 
NIVДата: Пт, 20.06.2014, 10:59 | Сообщение # 505
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте! Я опять про определение нажатия кнопок мыши. С огнестрельным оружием понятно - схема сделана еще в Солянке. А как определять нажатия кнопок мыши для холодного оружия? Ему ведь тоже патроны прописаны, но предыдущая схема, кажется, не работает.

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Пт, 20.06.2014, 11:49 | Сообщение # 506
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата NIV ()
предыдущая схема, кажется, не работает

Не напомните, какая именно предыдущая схема?


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Пт, 20.06.2014, 11:54 | Сообщение # 507
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата denis2000 ()
предыдущая схема
В смысле, Соляночная.

Тогда можно попробовать использовать колбэк weapon_no_ammo, как это я делал здесь, для взрывчатки. denis2000


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
FantomICWДата: Пт, 20.06.2014, 11:55 | Сообщение # 508
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

FantomICW, не хочу в этом случае использовать апдейт актера, так что задействуем немного другие методы.
Сначала создаем свой скрипт с таким наполнением:
Код
level_respawn_enabled = false

function level_respawn()
     if level_respawn_enabled == true and level.name() == "название_уровня" then
         действие_для_респавна
         level_respawn_enabled = false
     end
end    

Дальше проводим работу в bind_stalker.script.
В конец метода net_destroy добавляем:
Код
название_нового_скрипта.level_respawn_enabled = true

В конец метода reinit (хотя, честно, я не уверен, может, стоит прописать не в reinit, а в net_spawn) пишем:
Код
название_нового_скрипта.level_respawn()



 
a4927860Дата: Сб, 21.06.2014, 10:50 | Сообщение # 509
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Добрый день!

Возникли следующие вопросы:
1) можно ли скриптом менять отношение нпс? (цель - сделать нпс френдли на 30 сек)
2) как правильно будет выглядеть цикл-таймер к которому могут обращаться скрипты из других функций (файлов)
Нужно для проверки истечения времени для 9 функций у которых разное время окончания.
[cut=Сейчас я использую проверку в мотиваторе]

Код

    if time_global() - self.last_update > 10000 then
     sr_light.check_light(object)
     hero_ability.ev10()
     self.last_update = time_global()
    end


но она меня абсолютно не устраивает потому как просто раз в 10 сек выполняет действие/

[/cut]

[cut noguest=PS to denis2000, ]нашел хороший звук для твоего аномального костюма
Код
local pos = vector()
pos:mad(device().cam_pos,device().cam_dir,0.75)
pos:mad(pos,device().cam_top,-0.3)
pos:mad(pos,device().cam_right,0.3)
sound_object([[monsters\poltergeist\tele_damage_0]]):play_at_pos(db.actor, vector():set(pos.x,pos.y,pos.z), 1, 1)

[/cut]


Сообщение отредактировал a4927860 - Сб, 21.06.2014, 10:52
 
FantomICWДата: Сб, 21.06.2014, 11:23 | Сообщение # 510
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

a4927860, приветствую.
Во-первых, есть целый набор game_relations.script. Во-вторых, движковые функции в роде:
Код
local npc = get_story_object_id("sid")
npc:set_relation(game_object.friend, db.actor)



 
Поиск: