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

Помощь тем кто хочет знать больше о игре и модах

Если у вас появились вопросы по модостроению в игре 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]
 
a4927860Дата: Сб, 14.06.2014, 22:55 | Сообщение # 451
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Не работает...
если убрать условие 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
 
makdmДата: Вс, 15.06.2014, 00:33 | Сообщение # 452
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

a4927860, у меня всё работает на "пять". Навожу прицел, жму "принять аптечку" и НПС падает мертвым.
Ищите у себя ошибку. Всё вам "разжёвано", осталось проглотить. dry


Терпение......
И все получится!
 
suhar_Дата: Вс, 15.06.2014, 09:50 | Сообщение # 453
Бывалый
Пользователи
Сообщений: 106
Награды: 0
Репутация: [ 0 ]

В начале игры в рюкзаке ГГ оружие и защита имеют неполную прочность. Где находится параметр, отвечающий за состояние вещей у ГГ и у НПС?
 
sergej5500Дата: Вс, 15.06.2014, 10:12 | Сообщение # 454
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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. У Вас эти числа могут быть другими. И список предметов тоже. Я правил эти файлы для своих нужд.
 
a4927860Дата: Вс, 15.06.2014, 10:21 | Сообщение # 455
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

makdm, Спасибо огромное!
И за терпение и за "разжовывание", на самом деле очень редко сейчас можно встретить человека который готов уделять свое время и нервы чтобы когото чемуто научить или подсказать просто так happy

на самом деле я не спрашиваю (стараюсь по крайне мере) вещей которые можно найти в инете (в том числе на этом форуме (Сухарю вот чуть не ответил хорошо хоть обновил вовремя=)) просто вещи которые для вас являются очевидными - лично для меня в силу недостатка опыта кажутся откровением.

По этому я прошу прощения за глупые на ваш взгляд вопросы.


Сообщение отредактировал a4927860 - Вс, 15.06.2014, 10:35
 
suhar_Дата: Вс, 15.06.2014, 10:32 | Сообщение # 456
Бывалый
Пользователи
Сообщений: 106
Награды: 0
Репутация: [ 0 ]

с прочностью стартовых вещей ГГ разобрался, спасибо.

Цитата sergej5500 ()
Строки local set_weapon_cond_ST_from=15 local set_weapon_cond_ST_before=65

Извиняюсь, я не уточнил. Меня интересует не SGM, а чистый COP.
И ещё. Если я спауню в НПСам в инвентарь костюмы; чтобы их повредить нужно вводить новый скрипт по образу повреждения трофейного оружия?


Сообщение отредактировал suhar_ - Вс, 15.06.2014, 13:02
 
a4927860Дата: Вс, 15.06.2014, 17:23 | Сообщение # 457
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

makdm, denis2000, Простите но я похоже нуждаюсь в вашей помощи больше чем следовало бы...

Я перечитал кмб и тему скриптования, посмотрел откоменченные моды на других форумах, по всему выходит что работать должно на ура, но не работает.

makdm, Написанный вами скрипт я поместил в корень функции function motivator_binder:update(delta) (две оставшиеся части внизу за эндами)
Скрипт в Hero_ability - также стоит ваш без изменений.

Я как и раньше не мрошу написать за меня - я прошу помочь мне понять в чем дело, могу выслать файлы с тем чтобы посмотрев их вы не давали бы мне прямого решения а сказали что именно нужно прочесть для устранения неполадки.

Зарание спасибо за ответ.
 
makdmДата: Вс, 15.06.2014, 18:55 | Сообщение # 458
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
alex_xp_77Дата: Вс, 15.06.2014, 19:10 | Сообщение # 459
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Доброго дня !! Решил поменять заставку в меню, но возник вопрос по костру, подскажите как его удалить??
Нашел вариант, на заметку, вдруг понадобится тут :Чтоб он не воспроизводился, т.е. чтоб просто статичная картинка была,
то в файле: \gamedata\scripts\ui_main_menu.script
закомментируй двойным тире строку xml:InitStatic("fire_movie", self)
Вот так:
--xml:InitStatic("fire_movie", self)




Сообщение отредактировал alex_xp_77 - Пн, 16.06.2014, 22:04
 
a4927860Дата: Вс, 15.06.2014, 19:15 | Сообщение # 460
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

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

 
makdmДата: Вс, 15.06.2014, 19:32 | Сообщение # 461
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата a4927860 ()
давно сделал... не аптечки правда а своего предмета


a4927860, давайте договоримся( чтобы не было шуму на весь сайт что у вас не получается): вы спрашиваете - мы отвечаем - вы делаете.
Я не знаю, что за код вы написали. Я не знаю, где он находится в скриптах. Я не знаю, что такое item_name. Я не знаю, что это за функция find_in_string
Так как этого не знает никто кроме вас, то вряд ли будет помощь.

Обычно или делают, как вам подсказывают, или делают сами, тихо и без вопросов. smile

Добавлено (15.06.2014, 19:32)
---------------------------------------------

Цитата a4927860 ()
Скрипт в Hero_ability выполняется, но в него не передается (передается с значением nil) target_on

И как вы определили, что передаётся именно nil ?


Терпение......
И все получится!
 
a4927860Дата: Вс, 15.06.2014, 19:37 | Сообщение # 462
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

makdm, так точно товаришь генерал-полковник!

убрал свои условия поставил в корень скрипта function actor_binder:use_inventory_item(obj)

вернул все скрипты в вид который вы дали - эффект тот же - аптечка принята нпс жив.

прошу дальнейших указаний!

Добавлено (15.06.2014, 19:37)
---------------------------------------------

Цитата makdm ()
И как вы определили, что передаётся именно nil ?


если убрать проверку на target_on ~= nil то под функция kill выполняется, умирает правда герой =)
 
makdmДата: Вс, 15.06.2014, 19:40 | Сообщение # 463
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата a4927860 ()
умирает правда герой =)

a4927860, тогда под спойлер выкладывайте все скрипты, что вы вставили с указанием файлов, в которых они вписаны. Будем проверять.


Терпение......
И все получится!
 
a4927860Дата: Вс, 15.06.2014, 20:11 | Сообщение # 464
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Цитата 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)
---------------------------------------------
могу выложить любые другие куски скриптов если нужно или есть подозрение что в них может быть дело

 
makdmДата: Вс, 15.06.2014, 20:14 | Сообщение # 465
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

a4927860, всё понятно.
У вас файл начинается с заглавной буквы

Hero_ability

А в мотиваторе обращение идёт к файлу с прописной буквы

hero_ability

Исправьте на заглавную и будет вам счастье.


Терпение......
И все получится!
 
Поиск: