Модостроение. Общие вопросы и ответы
|
|
denis2000 | Дата: Сб, 15.06.2013, 11:51 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Помощь тем кто хочет знать больше о игре и модах Если у вас появились вопросы по модостроению в игре S.T.A.L.K.E.R. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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)", ее и надо расскомментировать, должно получиться вот так: Код function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый: Код 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) Второй: Код 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
Посты, для которых есть свои категории, из этой темы будут удаляться или перемещаться в соответсвующую тему. Персональных извещений в ЛС о переносе\удалении поста не будет, ищите сами. Учитывайте, что в системах Ucoz тема не обновляется в статистике при переносе поста. Посты, написанные здесь-же после переноса, будут расцениваться как кросспостинг, со всеми вытекающими
[cut noguest=Первый юбилей нашей темы] Здравствуйте господа модостроители, и все так или иначе причастные к этому. Нашей теме исполнился 1 год. От души поздравляю Всех Вас дорогие друзья, творческих успехов. Хочу так же выразить отдельную благодарность denis2000 и ХОВАН. tracker 23.06.11
[/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
a4927860 | Дата: Сб, 14.06.2014, 22:55 | Сообщение # 451 |
Новичок
Пользователи
Сообщений: 81
| Не работает... если убрать условие target_on ~= nil -- убивает себя, иначе вообще не работает. может я не в то место скрипта мотиватора кладу?
я кладу сюда (выкладываю весь кусок чтобы потом еще раз не переспрашивать)
[cut] Код function motivator_binder:update(delta) object_binder.update(self, delta) if xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] and self.object:best_enemy() == nil then xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] = nil end local object = self.object local object_alive = object:alive() local actor = db.actor update_logic(object) --/ SGM in sgm_modules.module_npc(object,1) --/ SGM out if self.first_update == false then if object_alive == false then death_manager.drop_manager(object):create_release_item() end self.first_update = true end if time_global() - self.last_update > 10000 then sr_light.check_light(object) sgm_modules.get_ammo_for_reload() -- Бесконечные патроны self.last_update = time_global() end if object_alive then local opened_doors = ph_door.try_to_open_door(self.object) utils.copy_table(self.opened_doors, opened_doors) local closed_doors = ph_door.try_to_close_door(self.object, self.opened_doors) for id,v in pairs(closed_doors) do self.opened_doors[id] = nil end end if self.st.state_mgr then if object_alive then self.st.state_mgr:update() if self.st.state_mgr.combat == false and self.st.state_mgr.alife==false --and self.st.state_mgr.planner:current_action_id() == self.st.state_mgr.operators["end"] then trade_manager.update(object) end else self.st.state_mgr = nil end end if object_alive then xr_sound.update(object:id()) xr_meet.process_npc_usability(object) stalker_generic.update_invulnerability(self.object) end local squad = get_object_squad(self.object) if squad ~= nil then if squad:commander_id() == self.object:id() then squad:update() end end object:info_clear() if object_alive then local active_section = db.storage[object:id()].active_section if active_section then object:info_add("section: " .. active_section) end local best_enemy = object:best_enemy() if best_enemy then object:info_add("enemy: " .. best_enemy:name()) end local best_danger = object:best_danger() if best_danger then object:info_add("danger: " .. xr_danger.get_danger_name(best_danger)) end object:info_add(object:name().." ["..object:team().."]["..object:squad().."]["..object:group().."]") if alife():object(object:id()) == nil then return end if squad ~= nil then object:info_add("squad_id: " .. squad:section_name()) if squad.current_action ~= nil then local target = squad.assigned_target_id and alife():object(squad.assigned_target_id) and alife():object(squad.assigned_target_id):name() self.object:info_add("current_action: " .. squad.current_action.name .."["..tostring(target).."]") end end else object:set_tip_text_default() end if rx_ai then rx_ai.npc_update(self.object,self.st) end -- собственно то что вы мне написали -------------------------------------------------------------------------- if self.object:alive() then if actor_target( self.object ) then hero_ability.target_on = self.object:id() else if hero_ability.target_on ~= nil then if hero_ability.target_on == self.object:id() then hero_ability.target_on = nil end end end end ---------------------------------------------------------------- end [/cut]
Сообщение отредактировал a4927860 - Сб, 14.06.2014, 22:57 |
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.06.2014, 00:33 | Сообщение # 452 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| a4927860, у меня всё работает на "пять". Навожу прицел, жму "принять аптечку" и НПС падает мертвым. Ищите у себя ошибку. Всё вам "разжёвано", осталось проглотить.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
suhar_ | Дата: Вс, 15.06.2014, 09:50 | Сообщение # 453 |
Бывалый
Пользователи
Сообщений: 106
| В начале игры в рюкзаке ГГ оружие и защита имеют неполную прочность. Где находится параметр, отвечающий за состояние вещей у ГГ и у НПС?
|
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 15.06.2014, 10:12 | Сообщение # 454 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| suhar_,
За стартовый набор игрока отвечает функция в gamedata\scripts\xr_effects.
[cut=Функция]function damage_actor_items_on_start(actor, npc) local actor = db.actor local obj = actor:object("helm_spectacles") if obj ~= nil then obj:set_condition(0.88) end obj = actor:object("stalker_outfit") if obj ~= nil then obj:set_condition(0.88) end obj = actor:object("wpn_pm") if obj ~= nil then obj:set_condition(0.88) end obj = actor:object("wpn_ak74u") if obj ~= nil then obj:set_condition(0.88) end end[/cut]
Функция "портит" конкретные предметы у игрока. Число в строках obj:set_condition(0.88) определяет износ предмета.
Состояние "трофейного" оружия регулирует файл gamedata\scripts\death_manager. Строки local set_weapon_cond_ST_from=15 local set_weapon_cond_ST_before=65
Числа ограничивают "годность" оружия. 15 - минимальная годность трофеев. 65 - максимальная.
P.S. У Вас эти числа могут быть другими. И список предметов тоже. Я правил эти файлы для своих нужд.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 15.06.2014, 10:21 | Сообщение # 455 |
Новичок
Пользователи
Сообщений: 81
| makdm, Спасибо огромное! И за терпение и за "разжовывание", на самом деле очень редко сейчас можно встретить человека который готов уделять свое время и нервы чтобы когото чемуто научить или подсказать просто так
на самом деле я не спрашиваю (стараюсь по крайне мере) вещей которые можно найти в инете (в том числе на этом форуме (Сухарю вот чуть не ответил хорошо хоть обновил вовремя=)) просто вещи которые для вас являются очевидными - лично для меня в силу недостатка опыта кажутся откровением.
По этому я прошу прощения за глупые на ваш взгляд вопросы.
Сообщение отредактировал a4927860 - Вс, 15.06.2014, 10:35 |
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
suhar_ | Дата: Вс, 15.06.2014, 10:32 | Сообщение # 456 |
Бывалый
Пользователи
Сообщений: 106
| с прочностью стартовых вещей ГГ разобрался, спасибо.
Цитата sergej5500 ( ) Строки local set_weapon_cond_ST_from=15 local set_weapon_cond_ST_before=65 Извиняюсь, я не уточнил. Меня интересует не SGM, а чистый COP. И ещё. Если я спауню в НПСам в инвентарь костюмы; чтобы их повредить нужно вводить новый скрипт по образу повреждения трофейного оружия?
Сообщение отредактировал suhar_ - Вс, 15.06.2014, 13:02 |
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 15.06.2014, 17:23 | Сообщение # 457 |
Новичок
Пользователи
Сообщений: 81
| makdm, denis2000, Простите но я похоже нуждаюсь в вашей помощи больше чем следовало бы...
Я перечитал кмб и тему скриптования, посмотрел откоменченные моды на других форумах, по всему выходит что работать должно на ура, но не работает.
makdm, Написанный вами скрипт я поместил в корень функции function motivator_binder:update(delta) (две оставшиеся части внизу за эндами) Скрипт в Hero_ability - также стоит ваш без изменений.
Я как и раньше не мрошу написать за меня - я прошу помочь мне понять в чем дело, могу выслать файлы с тем чтобы посмотрев их вы не давали бы мне прямого решения а сказали что именно нужно прочесть для устранения неполадки.
Зарание спасибо за ответ.
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.06.2014, 18:55 | Сообщение # 458 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| a4927860, Кроме того что вы сделали необходимо, чтобы функция on_use вызывалась во время приёма аптечки. Для этого необходимо в файле bind_stalker.script после строчки
function actor_binder:use_inventory_item(obj)
написать
Hero_ability.on_use( obj )
Тогда при использовании аптечки ( или любого другого предмета ) будет вызываться функция on_use из файла Hero_ability
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 15.06.2014, 19:04 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
alex_xp_77 | Дата: Вс, 15.06.2014, 19:10 | Сообщение # 459 |
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| Доброго дня !! Решил поменять заставку в меню, но возник вопрос по костру, подскажите как его удалить?? Нашел вариант, на заметку, вдруг понадобится тут :Чтоб он не воспроизводился, т.е. чтоб просто статичная картинка была, то в файле: \gamedata\scripts\ui_main_menu.script закомментируй двойным тире строку xml:InitStatic("fire_movie", self) Вот так: --xml:InitStatic("fire_movie", self)
Сообщение отредактировал alex_xp_77 - Пн, 16.06.2014, 22:04 |
|
|
Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 15.06.2014, 19:15 | Сообщение # 460 |
Новичок
Пользователи
Сообщений: 81
| makdm, давно сделал... не аптечки правда а своего предмета, я начал сюда писать после того как не смог к новому предмету нормально скрипт сделать... Код if find_in_string(item_name,"hero_ability_") then Hero_ability.on_use(obj) end Добавлено (15.06.2014, 19:15) --------------------------------------------- Скрипт в Hero_ability выполняется, но в него не передается (передается с значением nil) target_on
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.06.2014, 19:32 | Сообщение # 461 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата a4927860 ( ) давно сделал... не аптечки правда а своего предмета
a4927860, давайте договоримся( чтобы не было шуму на весь сайт что у вас не получается): вы спрашиваете - мы отвечаем - вы делаете. Я не знаю, что за код вы написали. Я не знаю, где он находится в скриптах. Я не знаю, что такое item_name. Я не знаю, что это за функция find_in_string Так как этого не знает никто кроме вас, то вряд ли будет помощь.
Обычно или делают, как вам подсказывают, или делают сами, тихо и без вопросов. Добавлено (15.06.2014, 19:32) ---------------------------------------------
Цитата a4927860 ( ) Скрипт в Hero_ability выполняется, но в него не передается (передается с значением nil) target_on И как вы определили, что передаётся именно nil ?
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 15.06.2014, 19:37 | Сообщение # 462 |
Новичок
Пользователи
Сообщений: 81
| makdm, так точно товаришь генерал-полковник!
убрал свои условия поставил в корень скрипта function actor_binder:use_inventory_item(obj)
вернул все скрипты в вид который вы дали - эффект тот же - аптечка принята нпс жив.
прошу дальнейших указаний!Добавлено (15.06.2014, 19:37) ---------------------------------------------
Цитата makdm ( ) И как вы определили, что передаётся именно nil ?
если убрать проверку на target_on ~= nil то под функция kill выполняется, умирает правда герой =)
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.06.2014, 19:40 | Сообщение # 463 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата a4927860 ( ) умирает правда герой =) a4927860, тогда под спойлер выкладывайте все скрипты, что вы вставили с указанием файлов, в которых они вписаны. Будем проверять.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 15.06.2014, 20:11 | Сообщение # 464 |
Новичок
Пользователи
Сообщений: 81
| Цитата makdm ( ) выкладывайте все скрипты, что вы вставили с указанием файлов, в которых они вписаны
так точно [cut] файл xr_motivator.script [cut]
в корень функции function motivator_binder:update(delta) [cut] if self.object:alive() then if actor_target(self.object) then hero_ability.target_on = self.object:id() else if hero_ability.target_on ~= nil then if hero_ability.target_on == self.object:id() then hero_ability.target_on = nil end end end end [/cut]
в "самый низ" после завершающих end оригинального файла [cut] function actor_target(object) if db.actor and object then local dangerang = 1/object:position():distance_to(device().cam_pos) local ang = horz_angle(device().cam_dir, object:position():sub(device().cam_pos)) local tgt = ang > -dangerang and ang < dangerang if tgt then return true else return false end end return false end
function horz_angle(vec1,vec2) local x = vec2.x*vec1.x+vec2.z*vec1.z local y = -vec2.z*vec1.x+vec2.x*vec1.z return math.atan2(y,x) end [/cut]
[/cut]
в файл bind_stalker в корень function actor_binder:use_inventory_item(obj) Hero_ability.on_use(obj)
в Hero_ability [cut] target_on = nil
function on_use( sect ) local item_name=sect:section() if item_name=="medkit" and target_on ~= nil then give_object_to_actor("hero_ability_1") local oNpc = level.object_by_id(target_on) if oNpc then oNpc:kill(oNpc) end end
end [/cut] [/cut]Добавлено (15.06.2014, 20:00) --------------------------------------------- я вроде указывал но укажу на всякий случай еще раз CoP + SGM 2.2 + Albor (сильно модифицированны но только в части ltx) Добавлено (15.06.2014, 20:11) --------------------------------------------- могу выложить любые другие куски скриптов если нужно или есть подозрение что в них может быть дело
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 15.06.2014, 20:14 | Сообщение # 465 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| a4927860, всё понятно. У вас файл начинается с заглавной буквы
Hero_ability
А в мотиваторе обращение идёт к файлу с прописной буквы
hero_ability
Исправьте на заглавную и будет вам счастье.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|