Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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]
 
Voland-777Дата: Пн, 03.07.2017, 12:27 | Сообщение # 2506
Эмиссар
Пользователи
Сообщений: 1702
Награды: 9
Репутация: [ 474 ]

Melarsky, в папке gamedata/configs/misc/trade/order_traders: esc_stalker_trader.ltx - это конфиг торговли Кривоухова, торгаша сталкеров на Кордоне; mar_stalker_trader.ltx - конфиг Мармелюка, торгаша сталкеров на Болотах.

Сообщение отредактировал Voland-777 - Пн, 03.07.2017, 12:28
 
sergej5500Дата: Пн, 03.07.2017, 12:38 | Сообщение # 2507
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата Наблюдатель ()
Уважаемый sergej5500, а не подскажите, плиз, как это сделать?


--переменная-индикатор щелчка включения
local onoff = 0

--*** "замена" батарейки ***
--вызывается из bind_stalker.script
function replacebatt()
if (emergency == 1) then


Функция называется replacebatt. Она должна упоминаться в bind_stalker. Вероятнее всего в функции update(delta).

Её и надо оттуда убрать.

Скорее всего, после такой правки потребуется новая игра.
 
НаблюдательДата: Пн, 03.07.2017, 17:48 | Сообщение # 2508
Ветеран
Пользователи
Сообщений: 400
Награды: 1
Репутация: [ 59 ]

Цитата sergej5500 ()
Функция называется replacebatt. Она должна упоминаться в bind_stalker. Вероятнее всего в функции update(delta).

Её и надо оттуда убрать.

Уважаемый sergej5500, в этом файле аж три функции update(delta):
[cut=Тыц]function init (obj)
xr_motivator.AddToMotivator(obj)
end

function actor_init (npc)
npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}

local weapon_hide = {}
local primary_objects_filled = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.get_weather_manager()
self.surge_manager = surge_manager.get_surge_manager()
--self.actor_detector = xr_detector.actor_detector()
self.last_level_name = nil
self.deimos_intensity = nil
-- self.actor_weapon_on_start = true
self.loaded_active_slot = 3
self.loaded_slot_applied = false
self.last_detective_achievement_spawn_time = nil
self.last_mutant_hunter_achievement_spawn_time = nil
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
-- printf("actor net spawn")
level.show_indicators()
self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
self.weapon_hide_in_dialog = false
weapon_hide = {} -- устанавливаем глобальный дефолтовый флаг.
if object_binder.net_spawn(self,data) == false then
return false
end
db.add_actor(self.object)
db.actor.deimos_intensity = self.deimos_intensity
self.deimos_intensity = nil
if self.st.disable_input_time == nil then
level.enable_input()
end
xr_s.on_game_load() --' Distemper 03.2008 --
self.weather_manager:reset()
--' Загружаем настройки дропа
death_manager.init_drop_settings()
--'Устанавливаем ссылку на таскменеджер
self.task_manager = task_manager.get_task_manager()
self.spawn_frame = device().frame
self.already_jumped = false
self.loaded = false
benchmark.main() --' Distemper 06.2008 --
return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
xr_sound.stop_sounds_by_id(self.object:id())
local board_factions = sim_board.get_sim_board().players
if(board_factions) then
for k,v in pairs (board_factions) do
xr_sound.stop_sounds_by_id(v.id)
end
end
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
level.show_weapon(true)
db.del_actor(self.object)

self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)
self.object:set_callback(callback.use_object, nil)

log("--------->"..tostring(_G.amb_vol))
log("--------->"..tostring(_G.mus_vol))
if(_G.amb_vol~=0) then
get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
end
if(_G.mus_vol~=0) then
get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
_G.mus_vol = 0
end
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end
xrs_dyn_music.finish_theme()
xr_s.on_actor_destroy()
object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
object_binder.reinit(self)
local npc_id = self.object:id()
db.storage[npc_id] = { }
self.st = db.storage[npc_id]
self.st.pstor = nil

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
self.object:set_callback(callback.task_state, self.task_callback, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
self.object:set_callback(callback.use_object, self.use_inventory_item, self)
end
----------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
-- Отметки на карте
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
if sell_bye == true then
game_stats.money_trade_update (money)
else
game_stats.money_trade_update (-money)
end

--===============================================================
--============ Звук при продаже/покупке предмета ================
--===============================================================
local snd_obj
snd_obj = sound_object([[interface\inv_dengi]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
--===============================================================
--===============================================================

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
printf("on_item_take [%s]", obj:name())
if isArtefact(obj) then
local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
if anomal_zone ~= nil then
anomal_zone:on_artefact_take(obj)
else
bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
end
local artefact = obj:get_artefact()
artefact:FollowByPath("NULL",0,vector():set(500,500,500))
xr_statistic.inc_founded_artefacts_counter(obj:id())
--[[
local s_art = alife():object(obj:id())
if(s_art) then
xr_statistic.inc_founded_artefacts_counter(s_art:section_name())
else
xr_statistic.inc_founded_artefacts_counter()
end
]]
end
treasure_manager.get_treasure_manager():on_item_take(obj:id())


--===============================================================
--=============== Звук при подбирании предмета ==================
--===============================================================
local snd_obj
snd_obj = sound_object([[interface\inv_belt]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
--===============================================================
--===============================================================

end
----------------------------------------------------------------------------------------------------------------------

--###################################################################
function actor_binder:on_item_drop (obj)
--- устанавливаем свой рюкзак для помещения в него хабара ---
if obj:section()=="inv_ruck" then
-- запомним id объекта
self.rr_id=obj:id() --создаем новую классовую переменную
end
-------------------------------------------------------------
end

function actor_binder:take_item_from_box(box, item)
local box_name = box:name()
------------------ убираем рюкзак ---------------------------
if box:section() == "active_ruck" and box:is_inv_box_empty() then
level.map_remove_object_spot(box:id(), "habar") -- убираем с тайника метку
alife():release(alife():object(box:id()), true) -- удаляем тайник
alife():create("inv_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавним рюкзак в инвентарь
end
-------------------------------------------------------------
end
--###################################################################

function actor_binder:use_inventory_item(obj)
if(obj) then
local s_obj = alife():object(obj:id())

--********************************************************
--Использование предметов из инвентаря актора

-- КОНСЕРВЫ #################################################
if(s_obj) and (s_obj:section_name()=="conserva") then
if db.actor:object("wpn_knife") == nil then
news_manager.send_tip(db.actor, game.translate_string("st_no_knife"))
alife():create("conserva", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
else
local snd_obj
snd_obj = sound_object([[interface\inv_konserva]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
end
end
if(s_obj) and (s_obj:section_name()=="bichki") then
if db.actor:object("wpn_knife") == nil then
news_manager.send_tip(db.actor, game.translate_string("st_no_knife"))
alife():create("bichki", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
else
local snd_obj
snd_obj = sound_object([[interface\inv_konserva]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
end
end

-- АНАБИОТИК #################################################
if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then
if not (surge_manager.actor_in_cover()) then
local sm = surge_manager.get_surge_manager()
if sm.started then
--give_info("anabiotic_in_process")
--------- surge counter ---------
if not has_alife_info("surge_outdoor_1") then
db.actor:give_info_portion("surge_outdoor_1")
elseif has_alife_info("surge_outdoor_1") and not has_alife_info("surge_outdoor_2") then
db.actor:give_info_portion("surge_outdoor_2")
elseif has_alife_info("surge_outdoor_2") and not has_alife_info("surge_outdoor_3") then
db.actor:give_info_portion("surge_outdoor_3")
end
---------------------------------
xr_effects.disable_ui_only(db.actor, nil)
level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_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")
surge_manager.stop_surge()
brodiaga.asp()
else
alife():create("drug_anabiotic", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
news_manager.send_tip(db.actor, game.translate_string("st_anabiotic_nosurge"))
end
else
alife():create("drug_anabiotic", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
news_manager.send_tip(db.actor, game.translate_string("st_anabiotic_indoor"))
end
end

-- СПАЛЬНИК #################################################
if(s_obj) and (s_obj:section_name()=="spalnik") then
if (surge_manager.actor_in_cover()) then
ui_sleep_dialog.sleep()
give_info("sleep_active")
else
if not has_alife_info("surge_outdoor_3") then
news_manager.send_tip(db.actor, game.translate_string("st_spalnik_nosleep"))
else
ui_sleep_dialog.sleep()
give_info("sleep_active")
end
end
-- Спавним предмет актору в инвентарь
alife():create("spalnik", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

-- РЕМКОМПЛЕКТ #################################################
if(s_obj) and (s_obj:section_name()=="remkomplekt") then
if db.actor:item_in_slot(2)~= nil then
local gun1 = db.actor:item_in_slot(2)
gun1:set_condition(1.0)
end
if db.actor:item_in_slot(3)~= nil then
local gun1 = db.actor:item_in_slot(3)
gun1:set_condition(1.0)
end
if db.actor:item_in_slot(7)~= nil then
local gun1 = db.actor:item_in_slot(7)
gun1:set_condition(1.0)
end
if db.actor:item_in_slot(12)~= nil then
local gun1 = db.actor:item_in_slot(12)
gun1:set_condition(1.0)
end
local text = "Ваше снаряжение успешно отремонтировано!"
local texture = "ui_iconsTotal_esc_blockpost_case_to_trader"
local news_text = "%c[255,60,255,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
end

-- РЕМКОМПЛЕКТ-2 ###############################################
if(s_obj) and (s_obj:section_name()=="pochinka") then
if db.actor:item_in_slot(2)~= nil then
local gun1 = db.actor:item_in_slot(2)
local hp1 = gun1:condition() + 0.25
gun1:set_condition(hp1)
end
if db.actor:item_in_slot(3)~= nil then
local gun1 = db.actor:item_in_slot(3)
local hp1 = gun1:condition() + 0.25
gun1:set_condition(hp1)
end
if db.actor:item_in_slot(7)~= nil then
local gun1 = db.actor:item_in_slot(7)
local hp1 = gun1:condition() + 0.25
gun1:set_condition(hp1)
end
if db.actor:item_in_slot(12)~= nil then
local gun1 = db.actor:item_in_slot(12)
local hp1 = gun1:condition() + 0.25
gun1:set_condition(hp1)
end
local text = "Ваше снаряжение немного улучшено!"
local texture = "ui_inGame2_Instrumenti"
local news_text = "%c[255,60,255,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
end

-- ГИТАРА #################################################
if(s_obj) and (s_obj:section_name()=="gitara") then
brodiaga.play_gitar()
end
if(s_obj) and (s_obj:section_name()=="gitara2") then
brodiaga.play_gitar()
end
if(s_obj) and (s_obj:section_name()=="gitara3") then
brodiaga.play_gitar()
end
if(s_obj) and (s_obj:section_name()=="gitara4") then
brodiaga.play_gitar()
end
if(s_obj) and (s_obj:section_name()=="gitara5") then
brodiaga.play_gitar()
end

-- РАЦИЯ #################################################
if(s_obj) and (s_obj:section_name()=="reinforcement") then
local m_game_vertex = db.actor:game_vertex_id()
local lvert = game_graph():vertex(m_game_vertex)
local lid = lvert:level_id()
local mlevel = alife():level_name(lid)
local m_s_level = mlevel
if game.translate_string(m_s_level) == "Лаборатория X8" or game.translate_string(m_s_level) == "Путепровод «Припять-1»" then
local text = "Вы не можете вызвать отряд под землей!"
local texture = "ui_inGame2_Radiopomehi"
local news_text = "%c[255,255,60,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
alife():create("reinforcement", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
else
if has_alife_info("jup_b207_freedom_wins") or has_alife_info("vstup_to_svoboda") then
brodiaga.spawn_near_me("sim_default_freedom_4")
brodiaga.spawn_near_me("sim_default_freedom_4")
brodiaga.spawn_near_me("sim_default_freedom_4")
brodiaga.spawn_near_me("sim_default_freedom_4")
brodiaga.spawn_near_me("sim_default_freedom_4")
local text = "Вызван отряд «Свободы»!"
local texture = "ui_npc_u_freedom_4"
local news_text = "%c[255,60,255,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
elseif has_alife_info("jup_b207_duty_wins") or has_alife_info("vstup_to_dolg") then
brodiaga.spawn_near_me("sim_default_duty_4")
brodiaga.spawn_near_me("sim_default_duty_4")
brodiaga.spawn_near_me("sim_default_duty_4")
brodiaga.spawn_near_me("sim_default_duty_4")
brodiaga.spawn_near_me("sim_default_duty_4")
local text = "Вызван отряд «Долга»!"
local texture = "ui_npc_u_dolg_4"
local news_text = "%c[255,60,255,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
else
local text = "Вызван отряд сталкеров!"
brodiaga.spawn_near_me("sim_default_stalker_4")
brodiaga.spawn_near_me("sim_default_stalker_4")
brodiaga.spawn_near_me("sim_default_stalker_4")
brodiaga.spawn_near_me("sim_default_stalker_4")
brodiaga.spawn_near_me("sim_default_stalker_4")
local texture = "ui_npc_u_neutral_3"
local news_text = "%c[255,60,255,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
end
end
end

-- ЗАМЕНА БАТАРЕЕК В ФОНАРИКЕ #############################
if(s_obj) and (s_obj:section_name()=="batareyka") then
xr_statistic.torch_rec()
end

-- АКТИВАТОР ВЫБРОСА ######################################
if(s_obj) and (s_obj:section_name()=="avd") then
local m_game_vertex = db.actor:game_vertex_id()
local lvert = game_graph():vertex(m_game_vertex)
local lid = lvert:level_id()
local mlevel = alife():level_name(lid)
local m_s_level = mlevel
if game.translate_string(m_s_level) == "Лаборатория X8" or game.translate_string(m_s_level) == "Путепровод «Припять-1»" then
local text = "Вы не можете вызвать выброс, будучи под землей!"
local texture = "ui_inGame2_Radiopomehi"
local news_text = "%c[255,255,60,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
alife():create("avd", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
else
local snd_obj
snd_obj = sound_object([[device\pda\pda_alarm]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
local m = surge_manager.get_surge_manager()
if not m.started then
m:start(true)
else
local text = "Выброс уже начался! Использование прибора на данный момент бессмысленно."
local texture = "ui_inGame2_Radiopomehi"
local news_text = "%c[255,255,60,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
alife():create("avd", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end
end
end

-- КЕЙС С ХАБАРОМ #########################################
if(s_obj) and (s_obj:section_name()=="habar_case") then
habar_case.spawn()
end

-- СИГАРЕТНАЯ ЗАВИСИМОСТЬ #################################
if(s_obj) and ((s_obj:section_name()=="marlboro") or (s_obj:section_name()=="belomor") or (s_obj:section_name()=="captain")) then
xr_statistic.sigaret_otpustilo()
end

--********************************************************
end
end

function anabiotic_callback()
level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
local rnd = math.random(35,45)
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/60) 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("anabiotic_callback: time forwarded on [%d]", rnd)
end

------ Просыпаемся после анабиотика ---------
function anabiotic_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
disable_info("anabiotic_in_process")
xr_sound.set_sound_play(db.actor:id(), "spat")
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _state)
if _state ~= task.fail then
if _state == task.completed then
news_manager.send_task(db.actor, "complete", _task)
else
news_manager.send_task(db.actor, "new", _task)
end
end
task_manager.task_callback(_task, _state)
end

----------------------------------------------------------------------------------------------------------------------

function actor_binder:update(delta)
object_binder.update(self, delta)

if string.find(command_line(), "-designer") then
return
end

if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
jump_level.try_to_jump()
self.already_jumped = true
return
end

-- Вызов апдейта переноса игрока проводником
if travel_func ~= nil then
travel_func()
end

-- DEBUG slowdown
--slowdown.update()
local time = time_global()
game_stats.update (delta, self.object)



--###################################################################
-------- RUKZAK ---------
if self.rr_id~=nil then
-- пытаемся получить объект по id
local se_obj=alife():object(self.rr_id)
-- проверяем, что объекта нет
if se_obj==nil or se_obj:section_name()~="inv_ruck" then
local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
level.map_add_object_spot_ser(ruck.id, "habar", "%c[255,23,255,23]Мой хабар")
local text = "Тайник успешно заложен!"
local texture = "ui_iconsTotal_found_thing" --"ui_inGame2_Mesta_evakuatsii"
local news_text = "%c[255,60,255,60]"..text
local news_caption = game.translate_string("st_tip")
db.actor:give_game_news(news_caption, news_text, texture, 0, 12*1000)
end
-- сбросим переменную
self.rr_id=nil
end
-------------------------
--###################################################################


-- апдейт погоды
self.weather_manager:update()

self:check_detective_achievement()
self:check_mutant_hunter_achievement()

--' Апдейт саундменеджера
xr_sound.update(self.object:id())

-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end

-- Апдейт прятание оружия игрока во время диалога
if self.object:is_talking() then
if self.weapon_hide_in_dialog == false then
self.object:hide_weapon()
printf("hiding weapon!!!")
self.weapon_hide_in_dialog = true
end
else
if self.weapon_hide_in_dialog == true then
printf("restoring weapon!!!")
self.object:restore_weapon()
self.weapon_hide_in_dialog = false
end
end
-- Апдейт прятание оружия игрока в зоне sr_no_weapon
if check_for_weapon_hide_by_zones() == true then
if self.weapon_hide == false then
printf("hiding weapon!!!")
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
printf("restoring weapon!!!")
self.object:restore_weapon()
self.weapon_hide = false
end
end

-- обновление пси-антенны
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end
--[[
--' Вывод сообщения о большой радиации
if self.object.radiation >= 0.7 then
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static == nil then
hud:AddCustomStatic("cs_radiation_danger", true)
hud:GetCustomStatic("cs_radiation_danger"):wnd():TextControl():SetTextST("st_radiation_danger")
end
else
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static ~= nil then
hud:RemoveCustomStatic("cs_radiation_danger")
end
end
]]--

if self.bCheckStart then
printf("SET DEFAULT INFOS")
if not has_alife_info("global_dialogs") then
self.object:give_info_portion("global_dialogs")
end
if not has_alife_info("level_changer_icons") then
self.object:give_info_portion("level_changer_icons")
end
self.bCheckStart = false

-- if self.actor_weapon_on_start == true then
-- db.actor:activate_slot(3)
-- self.actor_weapon_on_start = false
-- end
end
-- device().precache_frame == 0 and
if not self.loaded_slot_applied then
self.object:activate_slot(self.loaded_active_slot)
self.loaded_slot_applied = true
end

xr_s.on_actor_update(delta)

if(self.surge_manager) then
if(self.f_surge_manager_loaded ~= true) then
self.surge_manager:initialize()
self.f_surge_manager_loaded = true
end
if(self.surge_manager.levels_respawn[level.name()]) then
self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
end
self.surge_manager:update()
end
-- Апдейт доступности для симуляции.
simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

if not self.loaded then
get_console():execute("dump_infos")
self.loaded = true
end
treasure_manager.get_treasure_manager():update()

if not(primary_objects_filled) then
pda.fill_primary_objects()
primary_objects_filled = true
end
pda.fill_sleep_zones()

--##############################################
-- Апдейт скриптовой логики (бродяга)
brodiaga.player_update()
trade_stages.tovar_update()
geophysics.gf_update()
credits.cr_update()
torch.torch_update()
speceffects.effects_update()
xr_statistic.sigaret_zavisimost()
sublocation_musics.slm_update()
--##############################################

--********** Использование минигана только в экзоскелете! ***********
local mgun = db.actor:active_item()
local bron = db.actor:item_in_slot(7)
if mgun ~= nil and mgun:section() == "wpn_m134" then
if bron ~= nil then
if not (bron:section()=="exo_outfit" or bron:section()=="exo_servo" or bron:section()=="exo_dolg" or bron:section()=="exo_svoboda" or bron:section()=="exo_monolith" or bron:section()=="exo_merc") then
db.actor:activate_slot(6)
brodiaga.minigtimer()
end
else
db.actor:activate_slot(6)
brodiaga.minigtimer()
end
end
--********************************************************************


end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
set_save_marker(packet, "save", false, "actor_binder")
object_binder.save(self, packet)
--' Сохраняем уровень сложности
packet:w_u8(level.get_game_difficulty())
--' Сохраняем данные об отключенном вводе
if self.st.disable_input_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end
xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)
release_body_manager.get_release_body_manager():save(packet)
self.surge_manager:save(packet)
sr_psy_antenna.save( packet )
packet:w_bool(sim_board.get_sim_board().simulation_started)

xr_sound.actor_save(packet)
packet:w_stringZ(tostring(self.last_level_name))
xr_statistic.save(packet)
treasure_manager.get_treasure_manager():save(packet)

local n = 0
for k,v in pairs(db.script_ids) do
n = n + 1
end
packet:w_u8(n)
for k,v in pairs (db.script_ids) do
packet:w_u16(k)
packet:w_stringZ(v)
end
task_manager.get_task_manager():save(packet)

-- packet:w_bool(self.actor_weapon_on_start)

packet:w_u8(self.object:active_slot())

local deimos_exist = false
for k,v in pairs(db.zone_by_name) do
if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
deimos_exist = true
packet:w_bool(true)
packet:w_float(db.storage[v:id()].sr_deimos.intensity)
end
end
if not deimos_exist then
packet:w_bool(false)
end

if self.last_detective_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
end
if self.last_mutant_hunter_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
end
set_save_marker(packet, "save", true, "actor_binder")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
set_save_marker(reader, "load", false, "actor_binder")
object_binder.load(self, reader)
--' Загружаем уровень сложности
local game_difficulty = reader:r_u8()
printf("load game_difficulty %s", tostring(game_difficulty))
get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
local stored_input_time = reader:r_u8()
if stored_input_time == true then
self.st.disable_input_time = utils.r_CTime(reader)
end
xr_logic.pstor_load_all(self.object, reader)
self.weather_manager:load(reader)
release_body_manager.get_release_body_manager():load(reader)
-- self.surge_manager:initialize()
self.surge_manager:load(reader)
self.f_surge_manager_loaded = true
sr_psy_antenna.load(reader)
sim_board.get_sim_board().simulation_started = reader:r_bool()

xr_sound.actor_load(reader)
local n = reader:r_stringZ()
if(n~="nil") then
self.last_level_name = n
end
xr_statistic.load(reader)
treasure_manager.get_treasure_manager():load(reader)
n = reader:r_u8()
for i = 1,n do
db.script_ids[reader:r_u16()] = reader:r_stringZ()
end

task_manager.get_task_manager():load(reader)

-- self.actor_weapon_on_start = reader:r_bool()

self.loaded_active_slot = reader:r_u8()

self.loaded_slot_applied = false

local b = reader:r_bool()
if(b) then
self.deimos_intensity = reader:r_float()
end

local stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
end
stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
end
set_save_marker(reader, "load", true, "actor_binder")
end

--*************************************************************
--* Подспаун вещей в ящики *
--*************************************************************
local detective_achievement_items = { "medkit",
"antirad",
"bandage"}

local mutant_hunter_achievement_items = { "ammo_5.45x39_ap",
"ammo_5.56x45_ap",
"ammo_9x39_ap",
"ammo_5.56x45_ap",
"ammo_12x76_zhekan"}

local function spawn_achivement_items(items_table, count, inv_box_story_id)
local inv_box = alife():object(get_story_object_id(inv_box_story_id))
for i = 1,count do
alife():create(items_table[math.random(#items_table)],
inv_box.position,
inv_box.m_level_vertex_id,
inv_box.m_game_vertex_id,
inv_box.id)
end
end

function actor_binder:check_detective_achievement()
if not has_alife_info("detective_achievement_gained") then
return
end
if self.last_detective_achievement_spawn_time == nil then
self.last_detective_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
self.last_detective_achievement_spawn_time = game.get_game_time()
end
end

function actor_binder:check_mutant_hunter_achievement()
if not has_alife_info("mutant_hunter_achievement_gained") then
return
end
if self.last_mutant_hunter_achievement_spawn_time == nil then
self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
end

end

----------------------------------------------------------------------------------------------------------------------

function check_for_weapon_hide_by_zones()
for k,v in pairs(weapon_hide) do
if v == true then
return true
end
end
return false
end

-- Weapon functions
function hide_weapon(zone_id)
printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
weapon_hide[zone_id] = true
end

function restore_weapon(zone_id)
printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
weapon_hide[zone_id] = false
end[/cut]
Подскажите, плиз, недалёкому, что именно править. Буду весьма признателен.
 
sergej5500Дата: Пн, 03.07.2017, 18:03 | Сообщение # 2509
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Наблюдатель,

Попробуй убрать строку

torch.torch_update()
 
НаблюдательДата: Вт, 04.07.2017, 12:30 | Сообщение # 2510
Ветеран
Пользователи
Сообщений: 400
Награды: 1
Репутация: [ 59 ]

Цитата sergej5500 ()
Попробуй убрать строку

torch.torch_update()

Приветствую Всех! Премного благодарен, уважаемый sergej5500, таки сработало! Thank you so much! smile
 
Korvin_MelarskyДата: Вт, 04.07.2017, 21:29 | Сообщение # 2511
Боец штурмового отряда
Военные сталкеры
Сообщений: 80
Награды: 1
Репутация: [ 45 ]

такой вопрос - а ТТХ объектов типа nimble откуда берутся?
дано - в списке оружия есть куча с приставкой Nimble но в папке weaponsих нет. не понятно как их балансить и откуда они цепляют ТТХ,
Сигероус 2.2+пак Енота


Сталкер: Зов Припяти 1602 + SGM 2.2 + оружейная сборка Енота
 
asd123Дата: Вт, 04.07.2017, 21:33 | Сообщение # 2512
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Melarsky, пример СВУ:
Код
[wpn_svu_nimble]:wpn_svu,mod_svu_nimble_damage,cost_wpn_svu_nimble
$spawn                  = "weapons\wpn_svu_nimble"
class                   = WP_SVU
inv_name  = st_wpn_svu_nimble
description  = st_wpn_svu_nimble_descr
grenade_class           = ammo_vog-25
ammo_mag_size  = 10
fire_modes              = 1
scope_status            = 1
silencer_status  = 0
grenade_launcher_status    = 0
launch_speed   = 0
fire_dispersion_base    = 0.12  
control_inertion_factor = 1.6f
cam_return  = 0
cam_relax_speed         = 5
cam_relax_speed_ai      = 360
cam_dispersion          = 1.5
cam_dispersion_inc    = 1.5    
cam_dispersion_frac    = 1.0    
cam_max_angle           = 12.0   
cam_max_angle_horz    = 3.0    
cam_step_angle_horz     = 1.5
PDM_disp_base           = 1.8
PDM_disp_vel_factor     = 3.5
PDM_disp_accel_factor  = 3.5
PDM_disp_crouch   = 1.0
PDM_disp_crouch_no_acc  = 1.0
zoom_cam_relax_speed    = 5
zoom_cam_relax_speed_ai = 120.75
zoom_cam_dispersion     = 0.45
zoom_cam_dispersion_inc = 0.45
zoom_cam_dispersion_frac= 1.0
zoom_cam_max_angle      = 10.0
zoom_cam_max_angle_horz = 5.0
zoom_cam_step_angle_horz= 1.5
fire_dispersion_condition_factor = 8
grenade_flame_particles = weapons\generic_weapon01


Вот тут указано, что данная винтовка берёт ТТХ(и всё остальное) от своей "матери", то бишь стандартной СВУ. После чего в ней прописано, что изменяет эта модель в отличии от стандартной: smile
Код
[wpn_svu_nimble]:wpn_svu,...


В SGM 2.2. ТТХ всего вооружения находятся в файле w_sections.ltx.


У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Вт, 04.07.2017, 21:35
 
Voland-777Дата: Вт, 04.07.2017, 21:40 | Сообщение # 2513
Эмиссар
Пользователи
Сообщений: 1702
Награды: 9
Репутация: [ 474 ]

Цитата asd123 ()
В SGM 2.2. ТТХ всего вооружения находятся в файле w_sections.ltx.

А также конфиги тактик для оружия, звуков и партиклов.


Сообщение отредактировал Voland-777 - Вт, 04.07.2017, 21:41
 
Sergeant_FoxДата: Чт, 06.07.2017, 14:52 | Сообщение # 2514
Разработчик вооружения
Военные сталкеры
Сообщений: 10668
Награды: 16
Репутация: [ 539 ]

Доброго всем! Вопрос: мне нужно дернуть локацию сталкера (агропром) для 3д редактора. Какой софт для этого нужен и как делать?
 
denis2000Дата: Чт, 06.07.2017, 14:58 | Сообщение # 2515
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Sergeant_Fox, X-Ray Tools convertor, читаем мануал к программе.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Чт, 06.07.2017, 23:31 | Сообщение # 2516
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер.

С помощью горячей клавиши в Зове Припяти заспавнил предмет stationary_mgun


Получилось вот это.





Пользоваться как либо этим аппаратом нельзя. Предлагает "открыть дверь". Но ничего не происходит.

Как можно воспользоваться этой штукой в игре?


Сообщение отредактировал sergej5500 - Чт, 06.07.2017, 23:32
 
ДизельДата: Пт, 07.07.2017, 06:21 | Сообщение # 2517
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

sergej5500, в движке вырезано ActorMountedWeapon.cpp.

Можно тут пострелять - должно быть активно. http://www.amk-team.ru/forum....1055355


andreyholkin

Сообщение отредактировал Дизель - Пт, 07.07.2017, 06:29
 
Korvin_MelarskyДата: Сб, 08.07.2017, 10:10 | Сообщение # 2518
Боец штурмового отряда
Военные сталкеры
Сообщений: 80
Награды: 1
Репутация: [ 45 ]

кто-нибудь может подсказать мод из которого можно вырезать револьверы и мосинку, желательно, чтоб их без конфликтов можно было вставить в СГМ 2.2 с оруженой сборкой Енота

Сталкер: Зов Припяти 1602 + SGM 2.2 + оружейная сборка Енота
 
Sergeant_FoxДата: Сб, 08.07.2017, 10:12 | Сообщение # 2519
Разработчик вооружения
Военные сталкеры
Сообщений: 10668
Награды: 16
Репутация: [ 539 ]

Melarsky, Все есть в сталкер Зов Чернобыля.
 
Korvin_MelarskyДата: Сб, 08.07.2017, 11:04 | Сообщение # 2520
Боец штурмового отряда
Военные сталкеры
Сообщений: 80
Награды: 1
Репутация: [ 45 ]

еще вопрос - в файлах торговцев нашел [supplies_stage_??] ?? = 1-20
это я так понимаю сменяющийся ассортимент?
т.е. один раз зашел - торговец тебе продает выборку из [supplies_stage_01] например. другой - из [supplies_stage_20]??
моя догадка верна?

и далее - непонятно как эти сапплай стейдж чередуются. по кругу от 1-20? или рандомно?


Сталкер: Зов Припяти 1602 + SGM 2.2 + оружейная сборка Енота
 
Поиск: