1. Вопрос должен соответствовать выбранной Вами темы. 2. Изучите то, что уже есть в теме (воспользуйтесь поиском на форуме). 3. Указывайте необходимую информацию: чистая игра ТЧ или с установленным модом (указать какой). 4. Для того, чтобы было понятно в чем ошибка, приводите коды (оформленные соответствующем образом). 5. Вопросы по SDK задаем в этой теме.
Лог: LUA error: ...s.t.a.l.k.e.r\gamedata\scripts\blowout_scheme.script:80: attempt to call field 'blowout_type' (a nil value) Как его лечить? Вот сама 80 строчка в blowout_scheme.script if not amk_mod or (amk_mod and amk_mod.blowout_type()>0) or xr_wounded.is_wounded(npc) then return false end
Стоит отметить что это взято с АМК и поэтому первым делом я заменил оригинальный xr_wounded на Амкашный. Проверил скрипты что менялись на blowout_type - не нашёл. Искала на АМК форуме у двух человек был такой же лог, но им не ответили, то есть проблема висит в воздухе. Помогите решить проблему
Добавлено (16.01.2013, 15:39:56) --------------------------------------------- Немного продвинулся в поиске проблемы, но вот вылет остался, правда уже другой
Порылся в amk_mod.script АМКашном и добавил все секции которые содержали функцию blowout_type в свой amk_mod.script Теперь вот такая проблема
Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...publishing\s.t.a.l.k.e.r\gamedata\scripts\amk.script:523: attempt to index global 'amk_mod' (a nil value) А вот эта 523 строчка в amk.script: amk_mod.first_run()
В общем это какая то функция которая якобы будет вызываться один раз за всю игру
VALERKA, если "по реже", то нужно править анимацию, если совсем убрать, то нужно править в SDK. 1. Преобразовать модель худа ножа wpn_knife_hud из ogf в object. 2. Загрузить модель в Actor Editor. После этого во вкладке Motions (Анимации) ищешь анимку idle. Ниже во вкладке "параметры" найди параметр "speed" и выставь значение в ноль. Этим ты "запретишь" проигрывать анимацию. 3. Затем сделать экспорт в ogf (имя файла должно быть wpn_knife_hud). 4. Добавить модель в игру (соблюдая иерархию папок).
Вот скрин
P.S. п1 делать с помощью converter'а от бардака.
Не столь важно что ты делаешь, важно как ты это делаешь! (Джимми Лансфорд)
Репутация: 16
Регистрация: 01.11.2009
Город: Санкт-Петербург
Callisto, Предложение не прокатило. Спальник так же исчезает.
В бин_сталкере, как я понял больше ничего не должно быть прописано по сну. в майн_слипе меняем это
function sleep(obj) if obj ~= nil then if obj:section() == "sleep_bag" then -- при использоваании спального мешка будет открываться выборочное меню local hud = sleep_ui(get_hud()) -- указываем на class "sleep_ui" (CUIScriptWnd) level.start_stop_menu(hud, true) -- открываем меню end end end
class "sleep_ui" (CUIScriptWnd)
function sleep_ui:__init(owner) super() self.owner = owner self:InitControls() self:InitCallBacks() end
на это
function sleep(obj) local hud = sleep_ui(get_hud()) -- указываем на class "sleep_ui" (CUIScriptWnd) level.start_stop_menu(hud, true) -- открываем меню end
class "sleep_ui" (CUIScriptWnd)
function sleep_ui:__init(owner) super() self.owner = owner self:InitControls() self:InitCallBacks() end
Обидно отказываться от уже почти реализованной идеии
Помогите!!!!! Как подружить это
SoC. Создание ремонт комплектов [править]Создание ремонт комплекта Я опишу пример создания ремонт комплекта для костюмов, а для оружия в конце статьи сделаю пару заметок. Дело в том, что различия в создании ремонт комплектов почти нет. [править]Работа со скриптами 1. В папке scripts создаёте свой скриптовой фаил ваше_название_скрипта.script. Но! Название должно быть написано на английском языке и вместо пробелов должен стоять знак "_". Мой remont_broni.script. 2.Вешаем функцию починки при использовании нашего ремонт комплекта. Для этого в файле scripts\bind_stalker.script находим функцию: function actor_binder:net_destroy() и после строки self.object:set_callback(callback.take_item_from_box, nil) пишем: self.object:set_callback(callback.use_object, nil)) И теперь находим функцию function actor_binder:reinit() и после строки self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) пишем: self.object:set_callback(callback.use_object, self.use_callback, self) После end пишем для трех ремкомплектов function actor_binder:use_callback(obj, who) if obj then if obj:section() == "repair_kit_weapon" then remont_weapon.repair_weapon() end end if obj then if obj:section() == "repair_kit_outfit" then remont_broni.repair_outfit() end end if obj then if obj:section() == "repair_kit_pistol" then remont_pistol.repair_pistol() end end end --- и несколько end тоже рюкзаков проверяй script Syntax Checker Ненужные комплекты можно закомментировать (--) или удалить 3. Добавляем саму функцию ремонта. Для этого в файле ваше_название_скрипта.script пишем: -- Ремонт комплект для костюмов function repair_outfit() local item_s6 = db.actor:item_in_slot(6) --объявляем переменную (item_s6) if item_s6 ~= nil and item_s6:condition() >=0.30 and item_s6:condition() ~=1 then --когда костюм можно чинить (состояние больше или равно 30%) item_s6:set_condition(1) local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_detach_addon]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,0,255,0]Ремонт костюма завершен." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) elseif item_s6 == nil then --когда костюма нет local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: нужно одеть коcтюм." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) elseif item_s6:condition() <0.30 then --когда костюм нельзя чинить (состояние меньше 30%) local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: костюм слишком сильно повреждён." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) elseif item_s6:condition() ==1 then --когда костюм в отличном состояние local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: %c[255,0,255,0]костюм в отличном состояние." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) end end 4. Теперь создаем сам предмет, для чего в items.ltx в конце прописываем следующее ;Ремкомплект для брони [repair_kit_outfit]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\repair kit outfit" $prefetch = 32 class = II_ANTIR ;класс не трогаем! cform = skeleton visual = equipments\item_merger.ogf ;модель description = enc_equipment_repair_kit_outfit ;ссылка на описание в config\text\rus\....xml
inv_name = repair_kit_outfit_name ;ссылка на название в config\text\rus\....xml inv_name_short = repair_kit_outfit_name ;тоже самое, что и inv_name inv_weight = 1.0 ;вес
inv_grid_width = 3 ;ширина иконки inv_grid_height = 2 ;высота иконки inv_grid_x = 9 ;координата x иконки inv_grid_y = 27 ;координата y иконки cost = 3500 ;цена ;всё ниже написанное не трогаем, оно нам и не нужно eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = 1 animation_slot = 4 hud = wpn_vodka_hud 5. Теперь в gamedata\config\text\rus\string_table_enc_equipment.xml прописываем описание предмета <!--------------- Ремкомплект для костюмов -------------------------->
string id="repair_kit_outfit_name"> <text>Ремонтный комплект №6(РКП"Костюм")</text> </string> <string id="enc_equipment_repair_kit_outfit"> <text>Ремонтный комплект полевой №6("Костюм") для быстрой и эффективной починки костюмов. Прошел апробацию на основании длительных испытаний и проверок. При его создании были учтены все особенности использования РКП, устранены недочёты предыдущих образцов. Благодаря оптимизации инструмента, качеству материала и облегченному весу - весьма ценен. РКП поставляется с базовым набором ЗИПа. С его помощью можно увеличить состояние костюма до 100%, если он повреждён не больше 30%. Незаменимая вещь во время вылазки.</text> </string> Всё! Теперь заходим в игру и наслаждаемся. [править]Небольшая заметка 1. Чтобы сделать ремонт комплект для оружия проделываем тоже самое, только переименовываем всё вместо outfit на weapon и в функцие починки ставим слот 1 или 2 (оружейные слота) вместо 6 (слот костюмов). Ещё нужно заменить переменную item_s6 например на item_s1 или item_s2. 2. Число 0.30 - минимальное состояние костюма, следовательно его можно менять на любое вам угодное. Простите за такое оформление, это моя вторая статья. В будущем, если будет больше свободного времени, постораюсь расписать все моменты подробно
С этим
Создание предмета "спальный мешок" Заходим в gamedata\config\misc, ищем файл items.ltx и в конце пишем:
Работа с созданием спального мешка завершена. [править]Название и описание Заходим в gamedata\config\text\rus, находим файл string_table_enc_equipment.xml, открываем его и в самом низу, перед</string_table> пишем:
<string id="sleep_bag"> <text>Спальный мешок</text> </string> <string id="enc_equipment_sleep_bag"> <text>Отличный спальный мешок. Ткань не рвется, устойчивая к воде. Отличная вещь переночевать в Зоне.</text> </string>
Итак с предметом закончили Приступим к главному. [править]Работа со скриптами Заходим в gamedata\scripts, находим файл bind_stalker.script, открываем его, находим функцию function actor_binder:net_destroy()и в колбеках пишем
function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object)
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.next_restrictors_update_time = -10000
self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_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.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, 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_obj, self) -- вот наш колбек end
Так же в этом файле находим функцию function actor_binder:on_item_drop (obj) и после неё пишем:
function actor_binder:use_obj(obj) main_sleep.sleep(obj) end
Должно получиться так:
---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:use_obj(obj) -- функция на использование предмета main_sleep.sleep(obj) -- наш будущий скрипт и функция в нем. end ----------------------------------------------------------------------------------------------------------------------
Теперь в gamedata\scripts создаем файл c названием main_sleep.script, открываем его и пишем:
function sleep(obj) if obj ~= nil then if obj:section() == "sleep_bag" then -- при использоваании спального мешка будет открываться выборочное меню local hud = sleep_ui(get_hud()) -- указываем на class "sleep_ui" (CUIScriptWnd) level.start_stop_menu(hud, true) -- открываем меню end end end
class "sleep_ui" (CUIScriptWnd)
function sleep_ui:__init(owner) super() self.owner = owner self:InitControls() self:InitCallBacks() end
function sleep_ui:__finalize() end
function sleep_ui:InitControls() self:Init(50,50,550,450)
local xml = CScriptXmlInit() xml:ParseFile("ui_sleep.xml") -- настройки будут воспроизводиться в этом xml файле
xml:InitStatic("back_video", self) -- видео сзади
xml:InitStatic("background", self) -- рамка сзади
self:Register(xml:Init3tButton("caption", self),"caption") -- заголовок self:Register(xml:Init3tButton("btn_1", self),"btn_1") -- кнопка на сон одного часа self:Register(xml:Init3tButton("btn_2", self),"btn_2") -- кнопка на сон трех часов self:Register(xml:Init3tButton("btn_3", self),"btn_3") -- кнопка на сон девяти часов if db.actor.health < 0.9 then -- если здоровье упало, то self:Register(xml:Init3tButton("btn_4", self),"btn_4") -- кнопка на выздоровления end self:Register(xml:Init3tButton("btn_quit", self),"btn_quit") -- кнопка выхода end
function sleep_ui:InitCallBacks() self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.sleep_ui1, self) -- кнопка один идет на функцию sleep_ui1 self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.sleep_ui2, self) -- кнопка два идет на функцию sleep_ui2 self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.sleep_ui3, self) -- кнопка три идет на функцию sleep_ui3 if db.actor.health < 0.9 then self:AddCallback("btn_4", ui_events.BUTTON_CLICKED, self.sleep_ui4, self) -- кнопка идет на sleep_ui4 end self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self) -- кнопка идет на выход end
function sleep_ui:OnKeyboard(dik, keyboard_action) -- функция на отмену сна при нажатии клавиши Esc CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then self:on_quit() end if dik == DIK_keys.DIK_NUMPAD1 then self:sleep_ui1() end if dik == DIK_keys.DIK_NUMPAD2 then self:sleep_ui2() end if dik == DIK_keys.DIK_NUMPAD3 then self:sleep_ui3() end if dik == DIK_keys.DIK_NUMPAD4 then self:sleep_ui4() end end return true end
function sleep_ui:sleep_ui1() -- вот функция от кнопки один main_sleep.sleep_one_hour() -- спим один час self:on_quit() -- выход end function sleep_ui:sleep_ui2() -- вот функция от кнопки два main_sleep.sleep_three_hours() -- спим три часа self:on_quit() end function sleep_ui:sleep_ui3() -- вот функция от кнопки три main_sleep.sleep_nine_hours() -- спим девять часов self:on_quit() end function sleep_ui:sleep_ui4() -- функция от кнопкм четыри main_sleep.sleep_health(scale) -- спим до выздоровления self:on_quit() end
function sleep_ui:check_game() -- проверка запущена ли игра local check = false if level.present() and (db.actor ~= nil) and db.actor:alive() then check = true end return check end
function sleep_ui:on_quit() -- вот кнопка выхода self:GetHolder():start_stop_menu(self, true) alife():create("sleep_bag", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спаун мешка обратно end
-- ----------------------------- -- DreamMod v0.1 by Ab@dDon --- -- Edited by Weanchester --- -- -----------------------------
function sleep_one_hour() -- сон один час main_sleep.main(1) end
function sleep_three_hours() -- сон три часа main_sleep.main(3) end
function sleep_nine_hours() -- сон девять часов main_sleep.main(9) end
function sleep_health(scale) -- сон до выздоровления local sleep_time = (1 - db.actor.health)*5.00 main_sleep.main(sleep_time) end
function main(scale) -- основная функция basic_time_factor = level.get_time_factor () -- вычисление стандартной скорости течения времени db.actor:stop_talk() -- если игрок с кем-нибудь говорит, диалог закрывается. Здесь в ней нет смысла, но вдруг кому пригодится db.actor:hide_weapon() -- ГГ прячет оружие в рюкзак level.disable_input() -- отключение управления main_sleep.starter (scale) -- запуск скрипта, перематывающего время end
function starter(scale) -- скрипт перемотки на нужное время local factor = scale * 2650 -- вычисление времени "пробуждения" game.start_tutorial("time_scaling") -- вызов функции перемотки level.set_time_factor(factor) -- собственно сама перемотка end
function dreamer() -- отвечает за сны level.set_time_factor(basic_time_factor) --остановка перемотки. basic_time_factor - стандартная скорость течения времени local dream = dream.sleep_video_name_callback () -- позволяет "показать" сон if dream ~= "" then game.start_tutorial(dream) -- показ одного из трёх снов else game.start_tutorial("without_dream") -- "без сна" end end
function stopper() level.add_cam_effector("camera_effects\\dream.anm", 1, false, "") -- эффект подъема db.actor:restore_weapon() -- ГГ достаёт оружие level.enable_input() -- включается управление level.add_pp_effector("yantar_underground_psi.ppe", 222, false, "") -- эффект подъема if db.actor.health <= 0.60 then -- если хп упало меньше 60, то запускается функция съедания еды main_sleep.eat_food() end end
function eat_food() -- функция съедания еды if db.actor:eat(db.actor:object("conserva")) ~= nil or db.actor:eat(db.actor:object("bread")) ~= nil or db.actor:eat(db.actor:object("kolbasa")) ~= nil then end end
С самым главным работа завершена. Переходим к предпоследнему пункту. [править]Работа с XML-описателем Заходим в gamedata\config\ui, создаем файл с названием ui_sleep.xml, открываем его и пишем:
Всем привет. Вопрос такой: если в процессе игры надо заменить, к примеру, одну дверь на другую (дверка та же , только помятая), то каким образом сие выполнить, в каком направлении копать?
P.S. Дверка динамическая, т.е открываетси и закрываетси.
Сообщение отредактировал Игорь_Го - Воскресенье, 20.01.2013, 04:43:44
function actor_binder:use_obj(obj) if obj then if obj:section() == "repair_kit_outfit" then remont_broni.repair_outfit() end end main_sleep.sleep(obj) end
Парни помогите разобраться! Не могу изменить инвентарь в начале игры с помощью Caracter_desc_general кто знает как это сделать? или изменить выдаваемые в начале стволы у волка????
Stanton, с помощью character_desc_general.xml нельзя изменять предметы в начале игры. Только с помощью спавна. Чтобы Волк в начале игры выдавал необходимое тебе снаряжение, нужен файл escape_dialog.script. В нём ищи строчку function give_weapon_to_actor (trader, actor) Именно эта функция отвечает за то, какое снаряжение выдаёт Волк Меченому в начале игры. Например, допустим, ты хочешь, чтобы Волк выдал Меченому FN-2000 и экзоскелет. Функция выдачи этого снаряжения будет выглядеть вот так:
Код
function give_weapon_to_actor (trader, actor) dialogs.relocate_item_section(trader, "wpn_fn2000", "in") dialogs.relocate_item_section(trader, "exo_outfit", "in") end
Аналогично можешь получать другое оружие или броню.
Сообщение отредактировал valeras_98 - Среда, 23.01.2013, 20:45:11
с помощью character_desc_general.xml нельзя изменять предметы в начале игры
Ошибаешься Правда в all.spawn все равно придеться залезть. Там в секции ГГ стоит запрет на спавн через профиль, убери этот запрет и спавни через character_desc_general.xml
black_stalker1997, В шапке темы есть ссылка на S.T.A.L.K.E.R. Inside Wiki, почитай про логику, в частности про схему meet.
Сообщение отредактировал Callisto - Среда, 23.01.2013, 22:27:49
Callisto, вот этого я не знал. А ведь так гораздо проще спавнить, чем прописывать выдачу оружия Волку. Что ж, учту на будущее, спасибо за то, что просвятила black_stalker1997, а в оригинале разве такого не было? Я, как не подойду к какому-нибудь сталкеру с оружием в руках, всё время эту фразу слышу
Сообщение отредактировал valeras_98 - Среда, 23.01.2013, 22:54:26
Репутация: 16
Регистрация: 01.11.2009
Город: Санкт-Петербург
Callisto, Попробовал, сделать броник и спальник твоим последним способом. вылет
Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...:\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:145: attempt to index global 'main_sleep' (a nil value)
Эксперементировал по-разному, амкшный метод пробовал. Ничего не получается: либо ошибка, либо спальник пропадает. Убил кучу времени. В скриптах профан. С большим желанием хочу либо получить твои файлы, либо кинуть свои для "причесывания". Если есть желание помочь дедушке, каким путем пойдем? Моя электронка [email protected] Еще у меня присутствует bind_stalker.script для FS, нужно ли править его?
Вопрос такой: при экспорте модели с костями (Physique) из макса в СДК модель выворачивается наизнанку что раньше не наблюдалось - в чем может быть причина? P.S. Если убрать "физику", то экспорт нормальный
Shuradan, Надо не эксперементировать, а обдумывать и пытаться понять каждое действие
Спальник+ремонт брони RapidShare Иконки и описание не делала, плюс в архиве подправленный all.spawn, для спавна через профиль актора в character_desc_general.xml, может пригодится Все это для шестого патча
Сообщение отредактировал Callisto - Четверг, 24.01.2013, 22:29:56