Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Капрал Хикс 561 Опубликовано 12 Июня Поделиться Опубликовано 12 Июня (изменено) @naxac, вопрос как к специалисту. Безлоговый вылет при загрузке любого сохранения, но при этом при перезаходе в игру этот же любой сейв грузится нормально. Я понимаю, что телепатов нет, но хотелось бы знать к чему такие симптомы. Я так понимаю, в сейв пишется что-то непотребное, которое потом грузится нормально... Куда хоть копать в первую очередь? Net_spawn функции, bind-скрипты? Если бы вылет был стабильным, а так-то оно грузится... со второго раза. Изменено 12 Июня пользователем Капрал Хикс Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506599
Norman Eisenherz 354 Опубликовано 13 Июня Поделиться Опубликовано 13 Июня (изменено) @naxac Сменил класс для двух сброшенных артефактов: вылет "нет объекта ГГ" при проверке дистанции в измененном [se_artefact.script]. Как такое может быть, если ГГ грузится первым? Изменено 13 Июня пользователем Norman Eisenherz Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506628
naxac 2 571 Опубликовано 13 Июня Поделиться Опубликовано 13 Июня (изменено) @Norman Eisenherz , ты используешь переменную клиентского актера db.actor. В момент появления серверного объекта артефакта клиентского объекта актера ещё нет. Используй либо серверный объект актера alife():actor(), либо проверку на наличие db.actor. @Капрал Хикс , может быть, на net_destroy какое-нибудь непотребство происходит? В какой-нибудь схеме сбой, или в каком-нибудь биндере?... Ещё, вроде, что-то такое было, если не убрать перед дестроем статик с экрана, добавленный через AddDialogToRender. Изменено 14 Июня пользователем naxac 3 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506634
RayTwitty 561 Опубликовано 18 Июня Поделиться Опубликовано 18 Июня Что-то туплю видимо, давно lua не ковырял Есть локальная функция в модуле: local function myfunc() print("myfunc !!!") end Нужно вызвать ее по имени. Но, имя генерируется в другом месте. Первая мысль была сделать просто ["myfunc"](), но не сработало, как и this["myfunc"]() Так, как сделать? Через loadstring что ли? loadstring(script_name()..".myfunc()")() выглядит как дичь же (но работает, правда не с локальными функциями, что логично) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506773
Norman Eisenherz 354 Опубликовано 18 Июня Поделиться Опубликовано 18 Июня По традиции, через _G: _G[file][fx](arg1, arg2) 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506776
Капрал Хикс 561 Опубликовано 22 Июня Поделиться Опубликовано 22 Июня Такой вопрос... Метод self.start_btn:SetText("") для ui_main_menu.script поддерживает кириллицу вот тут ""? Пробую сослаться на стринговый файл текста с кириллицей - отображает id строки. Пробую вставить в "" кириллицу - отображает кракозябры. Это для текста "нажмите любую клавишу для перехода к игре", для ТЧ, пауза при загрузке игры как в ЗП. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506905
Norman Eisenherz 354 Опубликовано 22 Июня Поделиться Опубликовано 22 Июня При вводе string_id надо добавлять game.translate_string, при прямом вводе – переводить скрипт в кодировку ANSI или Windows-1251. 1 2 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506907
naxac 2 571 Опубликовано 23 Июня Поделиться Опубликовано 23 Июня @Капрал Хикс , если self.start_btn - это статик, а не кнопка, то у него есть метод SetTextST("string_id"), которому game.translate_string не нужно, он автоматически транслирует строку. 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506912
Капрал Хикс 561 Опубликовано 23 Июня Поделиться Опубликовано 23 Июня (изменено) 14 часов назад, Norman Eisenherz сказал: при прямом вводе – переводить скрипт в кодировку ANSI или Windows-1251. Помог этот вариант, мододелам на заметку. Изменено 23 Июня пользователем Капрал Хикс Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506916
Norman Eisenherz 354 Опубликовано 23 Июня Поделиться Опубликовано 23 Июня 16 hours ago, naxac said: если self.start_btn - это статик, а не кнопка, то у него есть метод Так у дочерних классов методов только больше. Где-то попадалось исключение по наследованию родительских методов, но точно не в CUIStatic. 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506926
Капрал Хикс 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня Стоит фишка на использование горячих клавиш Enter и Delete для загрузки/удаления сохранений в соотв. меню. Так вот если курсор не стоит на строке сохранения, при нажатии клавиши подтверждения удаления сохранки вылет: [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ... of chernobyl\gamedata\scripts\ui_load_dialog.script:234: attempt to index local 'item' (a nil value) Как бы доработать скрипт? Скрытый текст -- File: UI_LOAD_DIALOG.SCRIPT -- Description: Load Dialog for STALKER -- Created: 28.10.2004 -- Copyright: 2004 GSC Game World -- Author: Serhiy Vynnychenko (narrator@gsc-game.kiev.ua) -- Version: 0.5 class "load_item" (CUIListItemEx) function load_item:__init() super() self.file_name = "filename" self:SetWndRect (0,0,430,22) local ca = 255 local cr = 216 local cg = 186 local cb = 140 self.fn = CUIStatic () self.fn:SetAutoDelete (true) self:AttachChild (self.fn) self.fn:SetWndRect (0,0,230,22) self.fn:SetText ("filename") self.fn:SetFont (GetFontLetterica18Russian()) self.fn:SetTextColor (ca,cr,cg,cb) self.fage = CUIStatic () self.fage:SetAutoDelete (true) self:AttachChild (self.fage) local shirik = (device().height/device().width > 1.5) local fageX = shirik and 250 or 325 self.fage:SetWndRect (fageX,0,150,22) self.fage:SetText ("fileage") self.fage:SetFont (GetFontLetterica16Russian()) self.fage:SetTextColor (ca,cr,cg,cb) end class "load_dialog" (CUIScriptWnd) function load_dialog:__init() super() self:InitControls() self:InitCallBacks() self:FillList() end function load_dialog:__finalize() end function load_dialog:FillList() local f = getFS() local flist = f:file_list_open_ex("$game_saves$",bit_or(FS.FS_ListFiles,FS.FS_RootOnly),"*.sav") local f_cnt = flist:Size() flist:Sort(FS.FS_sort_by_modif_down) for it=0, f_cnt-1 do local file = flist:GetAt(it) local file_name = string.sub(file:NameFull(), 0, (string.len(file:NameFull()) - 4)) local date_time = "[" .. file:ModifDigitOnly() .. "]" --menu_item = .. self:AddItemToList(file_name, date_time) end end function load_dialog:InitControls() self:Init(0,0,1024,768) local xml = CScriptXmlInit() local ctrl xml:ParseFile("ui_mm_load_dlg.xml") xml:InitStatic("back_video", self) xml:InitStatic("background", self) --xml:InitStatic("newspaper_video", self) self.form = xml:InitStatic("form", self) xml:InitStatic("form:caption", self.form) ctrl = xml:InitStatic("form:picture", self.form) ctrl:SetWindowName("static_pict") xml:InitStatic("form:file_info", self.form) self.file_caption = xml:InitStatic("form:file_caption", self.form) self.file_data = xml:InitStatic("form:file_data", self.form) xml:InitFrame("form:list_frame", self.form) ctrl = xml:InitList("form:list", self.form) ctrl:ShowSelectedItem(true) self:Register(ctrl, "list_window") ctrl = xml:Init3tButton("form:btn_load", self.form) self:Register(ctrl, "button_load") ctrl = xml:Init3tButton("form:btn_delete", self.form) self:Register(ctrl, "button_del") ctrl = xml:Init3tButton("form:btn_cancel", self.form) self:Register(ctrl, "button_back") self.message_box = CUIMessageBoxEx() self:Register(self.message_box,"message_box") end function load_dialog:InitCallBacks() self:AddCallback("button_load", ui_events.BUTTON_CLICKED, self.OnButton_load_clicked, self) self:AddCallback("button_back", ui_events.BUTTON_CLICKED, self.OnButton_back_clicked, self) self:AddCallback("button_del", ui_events.BUTTON_CLICKED, self.OnButton_del_clicked, self) self:AddCallback("message_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnMsgYes, self) self:AddCallback("message_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.OnMsgYes, self) self:AddCallback("list_window", ui_events.LIST_ITEM_CLICKED, self.OnListItemClicked, self) self:AddCallback("list_window", ui_events.WINDOW_LBUTTON_DB_CLICK, self.OnListItemDbClicked, self) end function file_exist(fname) local f = getFS() local flist = f:file_list_open_ex("$game_saves$",bit_or(FS.FS_ListFiles,FS.FS_RootOnly) , fname) local f_cnt = flist:Size() if f_cnt > 0 then return true else return false end end function delete_save_game(filename) local save_file = filename .. ".sav" local dds_file = filename .. ".dds" local f = getFS() f:file_delete("$game_saves$",save_file) if file_exist(dds_file) then f:file_delete("$game_saves$", dds_file) end end function AddTimeDigit(str, dig) if (dig > 9) then str = str .. dig else str = str .. "0" .. dig end return str end function file_data(fname) local f = getFS() local flist = f:file_list_open_ex("$game_saves$",bit_or(FS.FS_ListFiles,FS.FS_RootOnly) , fname .. ".sav") local f_cnt = flist:Size() if f_cnt > 0 then local file = flist:GetAt(0) local sg = CSavedGameWrapper(fname) local y,m,d,h,min,sec,ms = 0,0,0,0,0,0,0 y,m,d,h,min,sec,ms = sg:game_time():get(y,m,d,h,min,sec,ms) local date_time = "" date_time = AddTimeDigit(date_time, h) date_time = date_time .. ":" date_time = AddTimeDigit(date_time, min) date_time = date_time .. " " date_time = AddTimeDigit(date_time, m) date_time = date_time .. "/" date_time = AddTimeDigit(date_time, d) date_time = date_time .. "/" date_time = date_time .. y --string.format("[%d:%d:%d %d]",m,d,h,min,y) local health = string.format("\\n%s %d%s", game.translate_string("ui_inv_health"),sg:actor_health()*100,"%") return game.translate_string("st_level") .. ": " .. game.translate_string(sg:level_name()) .. "\\n" .. game.translate_string("ui_inv_time")..": " .. date_time .. health else return "no file data" end end function load_dialog:OnListItemClicked() local list_box = self:GetListWnd("list_window") if list_box:GetSize()==0 then return end local picture = self:GetStatic("static_pict") local itm_index = list_box:GetSelectedItem() local item = list_box:GetItem(itm_index) if item == nil then self.file_caption:SetText ("") self.file_data:SetText ("") picture:InitTexture ("ui\\ui_noise") return end local item_text = item.fn:GetText() self.file_caption:SetText (item_text) self.file_data:SetText (file_data(item_text)) if file_exist(item_text .. ".sav") ~= true then list_box:RemoveItem(itm_index) return end if file_exist(item_text .. ".dds") then picture:InitTexture(item_text) else picture:InitTexture("ui\\ui_noise") end end function load_dialog:OnListItemDbClicked() self:OnButton_load_clicked() end function load_dialog:OnMsgYes() local list = self:GetListWnd("list_window") local index = list:GetSelectedItem() if index == 4294967295 then return end if self.msgbox_id == 1 then local item = list:GetItem(index) local fname = item.fn:GetText() delete_save_game (fname) list:RemoveItem (index) self:OnListItemClicked() elseif self.msgbox_id == 2 then self:load_game_internal() end self.msgbox_id = 0 end function load_dialog:load_game_internal() local console = get_console() local list = self:GetListWnd("list_window") if list:GetSize()==0 then return end local index = list:GetSelectedItem() if index == 4294967295 then return end local item = list:GetItem(index) local fname = item.fn:GetText() if (alife() == nil) then console:execute ("disconnect") console:execute ("start server(" .. fname .. "/single/alife/load) client(localhost)") else console:execute ("load " .. fname) end end function load_dialog:OnButton_load_clicked() local console = get_console() local list = self:GetListWnd("list_window") if list:GetSize()==0 then return end local index = list:GetSelectedItem() if index == 4294967295 then return end local item = list:GetItem(index) local fname = item.fn:GetText() if (alife() == nil) then if valid_saved_game(fname) then self:load_game_internal() else self.msgbox_id = 0 self.message_box:Init ("message_box_invalid_saved_game") self:GetHolder():start_stop_menu(self.message_box, true) end return end if valid_saved_game(fname) then self.msgbox_id = 2 self.message_box:Init("message_box_confirm_load_save") self:GetHolder():start_stop_menu(self.message_box, true) else self.msgbox_id = 0 self.message_box:Init ("message_box_invalid_saved_game") self:GetHolder():start_stop_menu(self.message_box, true) end end function load_dialog:OnButton_back_clicked() self:GetHolder():start_stop_menu (self.owner, true) --new(show main window) self:GetHolder():start_stop_menu (self,true) self.owner:Show (true) end function load_dialog:OnButton_del_clicked() local list = self:GetListWnd("list_window") if list:GetSize()==0 then return end local index = list:GetSelectedItem() if index == 4294967295 then return end self.msgbox_id = 1 self.message_box:Init("message_box_delete_file_name") self:GetHolder():start_stop_menu(self.message_box, true) end function load_dialog:OnKeyboard(dik, keyboard_action) --virtual function --[[ ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action) DIK_RETURN = 28 WINDOW_KEY_PRESSED = 6 if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then self:GetHolder():start_stop_menu (self.owner, true) --new self:GetHolder():start_stop_menu (self,true) self.owner:Show (true) end return true --]] CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) local bind = dik_to_bind(dik) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_RETURN or dik == DIK_keys.DIK_SPACE then --* Enter/Space self:OnButton_load_clicked() elseif dik == DIK_keys.DIK_DELETE or dik == DIK_keys.DIK_DECIMAL then --* Delete/.(Numpad) self:OnButton_del_clicked() elseif dik == DIK_keys.DIK_ESCAPE or dik == DIK_keys.DIK_HOME then --* Esc/ Home /DIK_BACK - Back Space self:OnButton_back_clicked() end end return true end function load_dialog:AddItemToList(file_name, date_time) local _itm = load_item() _itm.fn:SetText (file_name) _itm.fage:SetText (date_time) local list_box = self:GetListWnd("list_window") list_box:AddItem (_itm) end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506975
RayTwitty 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @Капрал Хикс попробуй все строчки вида if index == 4294967295 then return end заменить на if index == 4294967295 or index == -1 then return end Возможно скрипт написан под обновленный lua. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506978
Капрал Хикс 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @RayTwitty , не помогло, увы. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506979
RayTwitty 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @Капрал Хикс тогда надо дебажить, выводить в лог индекс который выдает GetSelectedItem, смотреть, почему с ним не работает GetItem (получение элемента списка по его номеру) и т.д. Да и вообще, в целом не ясно "если курсор не стоит на строке сохранения" - курсор это что? Фокус мыши не наведен на элемента списка? Или элемент списка не выделен? Просто в каком-то ориг скрипте был момент (наверно save dialog), что вместо GetSelectedItem использовался GetFocusedItem, и там как раз тоже был косяк с тем, что при подвязке хоткеев мышь могла не быть над элементом списка в момент действия. Но тут такого я не вижу. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506980
Капрал Хикс 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня 2 минуты назад, RayTwitty сказал: Или элемент списка не выделен? Именно так, курсор стоит не на строке. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506981
RayTwitty 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @Капрал Хикс при этом какая-нибудь строчка выделена? (закрашен элемент списка полоской на фоне) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506983
Капрал Хикс 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @RayTwitty , не, не выделена. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506984
RayTwitty 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @Капрал Хикс что в таком случае ты хочешь удалить? 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506985
Капрал Хикс 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @RayTwitty , да проблема в том, что клавиша Delete в таком случае нажимается и при подтверждении удаления вылет. Тут бы запретить вызов клавиши Delete при невыделенной строке как-то. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506987
RayTwitty 561 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня 30 минут назад, Капрал Хикс сказал: Тут бы запретить вызов клавиши Delete при невыделенной строке как-то. Тогда вылет по идее должен быть при нажатии визуальной кнопки Удалить, функция та же самая вызывается. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1506988
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти