|
Модостроение. Редактирование и создание скриптов
|
|
| denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вс, 29.05.2016, 20:15 | Сообщение # 781 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Тестирую функцию спавна аномалии.
[cut=Функция]-- 'Спавн аномалии. function create_anomaly(zone_name,zone_radius,x,y,z,lv,gv) if z==nil and lv==nil and gv==nil then local sobj=alife():create(zone_name,level.vertex_position(x),x,y) else local sobj = alife():create(zone_name,vector():set(x,y,z),lv,gv) end local packet = net_packet() packet:w_begin(0) sobj:STATE_Write(packet) packet:r_seek(2) local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local spawn_story_id = packet:r_s32() local shape_count = packet:r_u8() for i = 1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local max_power = packet:r_float() local owner_id = packet:r_s32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32() local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_s32() local new_center = vector():set(0,0,0) owner_id = bit_not(0) restrictor_type = 3 max_power = 0 offline_interactive_radius = 30 artefact_spawn_count = 32 packet:w_begin(0) packet:w_u16(game_vertex_id) packet:w_float(distance) packet:w_s32(direct_control) packet:w_s32(level_vertex_id) packet:w_s32(object_flags) packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(spawn_story_id) packet:w_u8(1) packet:w_u8(0) packet:w_vec3(new_center) packet:w_float(zone_radius) packet:w_u8(restrictor_type) packet:w_float(max_power) packet:w_s32(owner_id) packet:w_u32(enabled_time) packet:w_u32(disabled_time) packet:w_u32(start_time_shift) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_count) packet:w_s32(artefact_position_offset) packet:r_seek(2) sobj:STATE_Read(packet,packet:w_tell()) return sobj end[/cut]
Всякий раз получаю вылет на строке
sobj:STATE_Write(packet)
[cut=Лог]FATAL ERROR
[error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...ld publishing\Зов Припяти\gamedata\scripts\_g.script:1108: attempt to index global 'sobj' (a nil value)
stack trace: [/cut]
Если убрать из функции код
[cut=Код]if z==nil and lv==nil and gv==nil then local sobj=alife():create(zone_name,level.vertex_position(x),x,y) else local sobj = alife():create(zone_name,vector():set(x,y,z),lv,gv) end[/cut]
и оставить одну из двух строк,
local sobj=alife():create(zone_name,level.vertex_position(x),x,y) local sobj = alife():create(zone_name,vector():set(x,y,z),lv,gv)
то функция отлично работает. В обоих вариантах. В чем может быть проблема.
Сообщение отредактировал sergej5500 - Вс, 29.05.2016, 20:18 |
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Вс, 29.05.2016, 22:48 | Сообщение # 782 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 (  ) if z==nil and lv==nil and gv==nil then local sobj=alife():create(zone_name,level.vertex_position(x),x,y) else local sobj = alife():create(zone_name,vector():set(x,y,z),lv,gv) end Ну да к как написано, так и реализовано.
Делается это немного по другому, вот так:
local sobj = nil if z==nil and lv==nil and gv==nil then sobj=alife():create(zone_name,level.vertex_position(x),x,y) else sobj = alife():create(zone_name,vector():set(x,y,z),lv,gv) end
З.Ы. Перепаковка нет-пакета написана неправильно. Как правильно - можно посмотреть в моде Припять. Точка Отсчёта.
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 29.05.2016, 23:16 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| men_stalker | Дата: Ср, 01.06.2016, 15:06 | Сообщение # 783 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| Доброго времени суток, возникла проблема не выдаётся инфопоршень: [cut=info_escape.xml]<info_portion id="c1_shift"></info_portion> <info_portion id="c1_shift_1"></info_portion> <info_portion id="c1_shift_2"></info_portion> [/cut] [cut=esc_c1_shift.ltx][logic] active = sr_idle@zone1
[sr_idle@zone1] on_info = {-c1_shift =dist_to_actor_ge(150)} sr_idle@zone2 %+c1_shift%
[sr_idle@zone2] on_info = {+c1_shift =dist_to_actor_le(150)} sr_idle@zone3 %-c1_shift%
[sr_idle@zone3] on_info = {-c1_shift_1 =dist_to_actor_ge(150)} sr_idle@zone4 %+c1_shift_1%
[sr_idle@zone4] on_info = {+c1_shift_1 =dist_to_actor_le(150)} sr_idle@zone5 %-c1_shift_1%
[sr_idle@zone5] on_info = {-c1_shift_2 =dist_to_actor_ge(150)} sr_idle@zone6 %+c1_shift_2%
[sr_idle@zone6] on_info = {+c1_shift_2 =dist_to_actor_le(150)} sr_idle@zone1 %-c1_shift_2%[/cut] P.S Если проверять через диалог всё нормально
|
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| makdm | Дата: Ср, 01.06.2016, 17:24 | Сообщение # 784 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| men_stalker, биндер обрабатывает логику только тех рестрикторов, которые находятся он-лайн. Ваш рестриктор точно он-лайн?
Терпение...... И все получится!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 01.06.2016, 19:23 | Сообщение # 785 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| men_stalker, Для того чтобы эта логика хоть как то заработала switch_distance должна быть больше контрольной дистанции 150м.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Пн, 06.06.2016, 14:56 | Сообщение # 786 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| denis2000, спасибо помогло. makdm, только хотел задать вопрос рестриктор может быть не он-лайн? Если да, то как он выводится в он-лайн?
Добавлено (06.06.2016, 14:56) --------------------------------------------- Здравствуйте, появился вопрос по дереву апгрейтов оружия у механика
Вот прописал так но у механика ветка на АКМ-74/2У не появлятся и вопрос про строку discount_condlist = %=mech_discount(0.35)% - так можно, без инфопоршня и не надо прописывать =mech_discount(0.35)?
[cut=stalkers_upgrade_info][esc_c1_mehanik]
discount_condlist = %=mech_discount(0.35)%
[esc_c1_mehanik_upgr]
up_sect_firsta_ak74u = true up_sect_firstc_ak74u = true up_sect_firstd_ak74u = true up_sect_firste_ak74u = true
up_sect_secona_ak74u = true up_sect_seconc_ak74u = true up_sect_secone_ak74u = true up_sect_seconf_ak74u = true
up_sect_thirda_ak74u = true up_sect_thirdc_ak74u = true up_sect_thirdd_ak74u = true up_sect_thirde_ak74u = true
up_sect_fourta_ak74u = false up_sect_fourtc_ak74u = false up_sect_fourte_ak74u = false [/cut]
Сообщение отредактировал men_stalker - Пн, 06.06.2016, 14:58 |
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| sergej5500 | Дата: Пн, 06.06.2016, 15:27 | Сообщение # 787 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| men_stalker,
В секции esc_c1_mehanik должен быть список стволов, который механик может прокачивать.
[esc_c1_mehanik] wpn_abakan wpn_ak74 wpn_ak74u ...
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| men_stalker | Дата: Вт, 07.06.2016, 11:45 | Сообщение # 788 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| Здравствуйте, появился вопрос по диалогам. Диалог состоит из двух враз и он стартовый(<start_dialog>esc_c1_start_of_the_guard</start_dialog>), вторая фраза выводит из диалога, однако после первой фразы выскакивает break_dialog
[cut=dialogs_escape]<dialog id="esc_c1_start_of_the_guard"> <dont_has_info>esc_c1_start_of_the_story</dont_has_info> <phrase_list> <phrase id="0"> <text>esc_c1_start_of_the_guard</text> <next>1</next> </phrase> <phrase id="1"> <text>esc_c1_start_of_the_guard</text> <give_info>esc_c1_start_of_the_story_1</give_info> <script_text>dialog_manager.create_bye_phrase</script_text> <action>dialogs.break_dialog</action> <is_final>1</is_final> <give_info>esc_c1_start_of_the_story</give_info> </phrase> </phrase_list> </dialog>[/cut]
Сообщение отредактировал men_stalker - Вт, 07.06.2016, 11:46 |
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 07.06.2016, 15:57 | Сообщение # 789 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Цитата men_stalker (  ) однако после первой фразы выскакивает break_dialog
Уберите из диалога строку <action>dialogs.break_dialog</action>Добавлено (07.06.2016, 15:57) ---------------------------------------------
Цитата makdm (  ) левел вертекс и гейм вертекс ЛЮБОЙ локации в игре можно получить с помощью такой функции.
А как ею пользоваться? Что писать в скрипте? Мой пример:
create_deserve_rukzak(-264.24667358398,-21.472173690796,-278.95037841797,5414,1,"wpn_abakan,wpn_addon_scope,ammo_5.45x39_ap,4")
5414 и 1 - левел и гейм вертексы точки спавна. Что писать вместо них? Как инициировать срабатывание Вашей функции и получить конкретное значение вертексов для локации escape?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Вт, 07.06.2016, 19:39 | Сообщение # 790 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 (  ) А как ею пользоваться? Что писать в скрипте? Так и пишите:
local lv_id, gv_id = get_lvid_gvid_level( "escape" ) create_deserve_rukzak(-264.24667358398,-21.472173690796,-278.95037841797,lv_id,gv_id,"wpn_abakan,wpn_addon_scope,ammo_5.45x39_ap,4")
Функцию get_lvid_gvid_level поместите в _G.script
Терпение...... И все получится!
Сообщение отредактировал makdm - Вт, 07.06.2016, 19:44 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 08.06.2016, 22:55 | Сообщение # 791 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
Попробовал сделать в чистом Зове Припяти функцию принудительного засыпания главного героя после суток бодрствования. Добавил тестовые скрипты в bind_stalker. Их выдачу повесил на функцию actor_binder:update(delta)
[cut=Скрипты]function actor_binder:check_sleep_control_time() if self.last_sleep_control_time == nil then self.last_sleep_control_time = game.get_game_time() end if game.get_game_time():diffSec(self.last_sleep_control_time) > 86400 then xr_effects.disable_ui_only(db.actor, nil) level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.sleep_callback") level.add_pp_effector("surge_fade.ppe", 11, false) _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") self.last_sleep_control_time = game.get_game_time() end if give_info("sleep_active") then self.last_sleep_control_time = game.get_game_time() end end
function sleep_callback() level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.sleep_callback2") local rnd = math.random(6,12) local m = surge_manager.get_surge_manager() if(m.started) then local tf = level.get_time_factor() local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf) if(rnd>(m.surge_time-diff_sec)*tf) then m.time_forwarded = true m.ui_disabled = true m:kill_all_unhided() m:end_surge() end end level.change_game_time(0,0,rnd) level_weathers.get_weather_manager():forced_weather_change() printf("sleep_callback: time forwarded on [%d]", rnd) end[/cut]
Результат неплохой. Игрок засыпает отлично.
После сна в кровати таймер сбрасывается и начинает новый суточный цикл. Возник такой вопрос. Допустим, игрок спал в кровати 1 час. Для полноценного отдыха этого явно недостаточно. Можно ли отследить, сколько времени спал игрок? Если игрок спал 1 час, то на один час уменьшить таймер активности. Как отследить, сколько игрок проспал в постели?
И ещё один вопрос. Как в этой функции вызвать пошатывание игрока и расплывание предметов перед глазами через 20 часов активности? Какие скрипты подойдут?
Сообщение отредактировал sergej5500 - Ср, 08.06.2016, 22:59 |
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 09.06.2016, 08:21 | Сообщение # 792 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) Как отследить, сколько игрок проспал в постели? В функции sleep_callback() параметр rnd = math.random(6,12) В скрипте ui_sleep_dialog.script в функции dream_callback() параметр hours = sleep_control.time_track:GetIValue()
Цитата sergej5500 (  ) вызвать пошатывание игрока и расплывание предметов перед глазами...Какие скрипты подойдут? level.add_complex_effector(Имя_эффекта, ИД_эффекта) конечно. Или по отдельности level.add_pp_effector и level.add_cam_effector
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Чт, 09.06.2016, 09:33 | Сообщение # 793 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000,
За помощь спасибо.
Цитата denis2000 (  ) В функции sleep_callback() параметр rnd = math.random(6,12)
Функция sleep_callback() обеспечивает принудительное засыпание игрока после суток активности. Я спрашивал про сон в постели. Спальное место на Скадовске или Янове.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 09.06.2016, 10:02 | Сообщение # 794 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) Я спрашивал про сон в постели. Спальное место на Скадовске или Янове. Я таки написал оба варианта.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Пт, 10.06.2016, 00:23 | Сообщение # 795 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000,
Попробовал применить параметр hours.
Мои правки.
[cut=bind_stalker] function actor_binder:check_sleep_control() if self.check_sleep_control_time == nil then self.check_sleep_control_time = game.get_game_time() end if game.get_game_time():diffSec(self.check_sleep_control_time) > 86400 then xr_effects.disable_ui(db.actor, nil) level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback") level.add_pp_effector("sleep_fade.ppe", 11, false) db.actor:give_info_portion("actor_is_sleeping") _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") surge_manager.resurrect_skip_message() self.check_sleep_control_time = game.get_game_time() end end
function dream_callback() level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback2") local hours = math.random(6,9) level.change_game_time(0,hours/3600,0) level_weathers.get_weather_manager():forced_weather_change() surge_manager.get_surge_manager().time_forwarded = true if(surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then level.stop_weather_fx() -- level_weathers.get_weather_manager():select_weather(true) level_weathers.get_weather_manager():forced_weather_change() end db.actor.power = 1 printf("dream_callback: time forwarded on [%d]", hours) end
function dream_callback2() xr_effects.enable_ui(db.actor, nil) get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 _G.mus_vol = 0 end[/cut]
Этот код работает. Игрок засыпает принудительно.
[cut=ui_sleep_dialog] function dream_callback() level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "ui_sleep_dialog.dream_callback2") local hours = sleep_control.time_track:GetIValue() level.change_game_time(0,hours,0) level_weathers.get_weather_manager():forced_weather_change() surge_manager.get_surge_manager().time_forwarded = true if(surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then level.stop_weather_fx() -- level_weathers.get_weather_manager():select_weather(true) level_weathers.get_weather_manager():forced_weather_change() end db.actor.power = 1 printf("dream_callback: time forwarded on [%d]", hours) if hours >= 7 then game.get_game_time():diffSec(self.check_sleep_control_time)==60 else game.get_game_time():diffSec(self.check_sleep_control_time) == game.get_game_time():diffSec(self.check_sleep_control_time) - hours*3600 end end
function dream_callback2() xr_effects.enable_ui(db.actor, nil) get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 _G.mus_vol = 0 db.actor:give_info_portion("tutorial_sleep") disable_info("actor_is_sleeping") disable_info("sleep_active") end[/cut]
Получил лог
[cut=Лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...shing\Зов Припяти\gamedata\scripts\xr_effects.script:2850: attempt to index global 'ui_sleep_dialog' (a nil value)
stack trace: [/cut]
Ошибка где то в коде
if hours >= 7 then game.get_game_time():diffSec(self.check_sleep_control_time)==60 else game.get_game_time():diffSec(self.check_sleep_control_time) == game.get_game_time():diffSec(self.check_sleep_control_time) - hours*3600 end
Но я её не вижу.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|