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/
Dennis_Chikin 3 664 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Dennis_Chikin, функция netpacket_pda_binder.init() вызывается в том случае, если в конфиге секции объекта (например для device_pda) будет прописан параметр: script_binding = netpacket_pda_binder.init ... Ну а далее, последовательность вызова движком методов самого биндера можно подсмотреть в xr_motivator.script, где сами разрабы оставили нам комменты:Примечание: Метод 'load' будет вызываться только для объекта(ов) уже сохранявшегося в игре (если был save), т.е. при первом спавне объекта в игру этот метод не вызывается. Ага, спасибо. Это я, как выяснилось, лог не туда воткнул, отчего и получил странный порядок вызываемого. Ну, хранение всякого разного в игровом объекте не лишено смысла, когда касается самого объекта. Изрядно всякого мусора в акторе или внешнем хранилище можно бы и не хранить. Изменено 15 Декабря 2012 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747109
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 Ну, хранение всякого разного в игровом объекте не лишено смысла, когда касается самого объекта. Изрядно всякого мусора в акторе или внешнем хранилище можно бы и не хранить.Очень разумная мысль, но не удержусь от подковырки: "А что же такого именно КПК'шного ты собрался хранить в pstor'е объекта КПК-актора?", что ради этого специальный биндер задействовать решаешься? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747199
AssAssInSS 1 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 Всем привет! Скажите плиз, есть ли такая статья, где описаны все (ну или почти все) функции скриптов с их описанием и примерами? Зарание спасибо! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747214
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) AssAssInSS, твой пост является оффтопиком для данного топика. Хотя тема и по скриптам, но не "бюро находок". На форуме (и в инете) существует поиск, которым и можешь воспользоваться. В этом же разделе имеется топик "Справочник по функциям и классам", в котором расписаны все штатные для игры функции и классы (и многое связанное с этим). Ну, а чтобы описать все (ну или почти все) функции скриптов - потребуется перелопатить все известные на сегодня моды и расширители библиотек под все билды и патчи... чего конечно же никто никогда не делал и не сделает. Изменено 15 Декабря 2012 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747218
Серый Волк 841 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Во-первых, не по теме вопрос. Тема несколько для других вопросов (в шапке прочтёшь, каких именно). Во-вторых, цитировать предыдущие посты полностью не нужно! ColR_iT Изменено 15 Декабря 2012 пользователем ColR_iT Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747271
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Серый Волк, к теме скриптов твой вопрос никак не относится... Давным давно известно, что большинство конфигов движок игры считывает на старте игры в виртуальныю память и далее оперирует уже с загруженными ресурсами. Доступ скриптами к таким ресурсам уже невозможен, и только сам движок может что-то менять/изменять. Упомянутое Shredder'ом "наложение" - замазывает уже имеющееся, но не изменяет. Также, упомянутый "X-Ray Extensions" хотя и позволяет отдельные правки в ресурсах игры, но .... пока в основном только для SHoC v1.0006 и скорее в тестовых целях (при чем перезагрузка все вернет в исходное). Ну а учитывая, что "имя" ГГ прописано в достаточно большом кол-ве диалогов, звуковых дорожках, и пр. конфигах - поменять имя под силу только самому моддмейкеру. Пока можно предложить подумать над вариантом с "заменой параметров ГГ" когда после некоего события скриптами заменяются необходимые конфиг-файлы на аналогичные и игра перезагружается (аля переход на др.уровень), но это уже требует знаний и опыта по таким операциям. (если далее вопрос интересует - плз, в тему соотв.ковырялки) P.S. вот и модератор удалил оффтопный вопрос. Ответ очевидно тоже можно через некоторое время удалить. Изменено 15 Декабря 2012 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747277
Старлей 88 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Я опять про спавн предметов в ящик: local spawn_item1 = { "Имя предмета который спауним(если несколько то через запятую)"}local function spawn_item_to_box(items_table, count, inv_box_story_id)local inv_box = alife():object(get_story_object_id(inv_box_story_id))for i = 1,count doalife():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)endendfunction spawn_item_to_treasure(actor, obj, p)spawn_item_to_box(spawn_item1, 1, "Стори айди тайника")end Вылетает с руганью на get_story_object_id, якобы не знает что это за функция, чем исправить, не подскажете? Изменено 15 Декабря 2012 пользователем Старлей Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747300
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Старлей, перешел бы ты в топик соотв.ковырялки, чтобы и тебе было бы попонятнее и нам не гадать, что за куски ты понадергал и во что пытаешься их слепить... Судя по кускам, ты пытаешься спавнить в некий ящик по выбранному story_id. Однако приведенные куски кодов не взаимосвязаны (один spawn_item1 уже кого угодно в ступор вгонит). Функция get_story_object_id появилась в ЗП (CoP) и требует соответствующей обвязки в виде story_objects.script. Так что, если у тебя не ЗП, то не копипасть то, что не пригодно, а лучше разберись как правильно спавнить имеющимися у тебя средствами. - получить объект по его story_id не сложно, примеров сотни (хотя бы через: level_object_by_sid); - получить игровой идентификатор (ID -> inv_box.id) от объекта - еще проще; - что за секцию предмета ты используешь из неведомой для нас items_table - разбирайся сам. (скрипты нужно понимать, а не пытаться использовать в темную, да еще и кусками из разных источников) Изменено 15 Декабря 2012 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747305
Buusty 387 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 Я опять про спавн предметов в ящик... Смотри, как "простенько и со вкусом" Сяк заспавнил винторез в inventory_box (в данном случае - в сейф), имеющий свой ID - [4428] ; cse_abstract properties section_name = inventory_box name = level_prefix_inventory_box_sak position = -128.889999389648,5,-204.460006713867 direction = 0,-1.57000005245209,0 ; cse_alife_object properties game_vertex_id = 621 distance = 0.100000001490116 level_vertex_id = 110680 object_flags = 0xffffff3b story_id = 9115 ; cse_visual properties visual_name = physics\box\seif_01 Функция - function agroprom_wpm() local obj = alife():story_object(9115) alife():create("wpn_vintorez_m1",obj.position, obj.m_level_vertex_id, obj.m_game_vertex_id, obj.id) end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747317
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Buusty, "свой ID" имеет каждый объект в игре (игровой идентификатор), а в данном случае ты подразумеваешь SID (story_id). Ну и совсем простенько будет так: function agroprom_wpm() local se_obj = alife():story_object(9115) if se_obj then alife():create("wpn_vintorez_m1", vector(), 0, 0, se_obj.id) end end (это с учетом подстраховки на отсутствие ящика и необязательности детализировать координаты при спавне владельцу) Изменено 15 Декабря 2012 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747323
Gaz24 6 Опубликовано 16 Декабря 2012 Поделиться Опубликовано 16 Декабря 2012 Эксперементировал со скриптами мода "Скриптовая эмуляция невидимых слотов". Вместо ПДА взял слот для детектора. Если убрать детектор в рюкзак все нормально, а когда поместить его обратно в слот, то возникает безлоговый вылет. Что делать? local debug = false --true -- система размещения кнопок ( true - вкл.\ false - выкл.)local rec_wnd = nillocal initial = falselocal TBtn = {}-- нож бинокль болт ПДА фонарик -- координаты кнопок {x,y}local slots = { {80,50},{220,50},{4000,50},{730,50},{880,50}}----------------------------------------------------------------------------------class "BkgrWnd" (CUIScriptWnd)function BkgrWnd:__init(owner) super()self.owner = ownerself:Init(0, 0, 1024, 768)self.ClickBtn={}self.ClickBtn[1] = function()local item = db.actor:item_in_slot(0)if item then spawn_item_in_inv("fake_"..item:section()) del_item(item:id()) end TBtn["check_button_1"]:Show(false)endself.ClickBtn[2]=function()local item = db.actor:item_in_slot(4)if item then spawn_item_in_inv("fake_"..item:section()) del_item(item:id()) end TBtn["check_button_2"]:Show(false)endself.ClickBtn[3]=function()news_manager.send_tip(db.actor, "руки прочь от болта!" )endself.ClickBtn[4]=function()local item = db.actor:item_in_slot(8)if item then spawn_item_in_inv(item:section()) del_item(item:id()) end TBtn["check_button_4"]:Show(false)endself.ClickBtn[5]=function()local item = db.actor:object("device_torch")if item then spawn_item_in_inv("fake_device_torch") del_item(item:id()) end TBtn["check_button_5"]:Show(false)endself:InitControls()endfunction BkgrWnd:__finalize() endfunction BkgrWnd:InitControls()clear_table(TBtn)self.bkgr_static=CUIStatic()self.bkgr_static:Init("ui\\ui_inv_quick_slots",10, 0, 1024, 100)self.bkgr_static:ClipperOn()self.stat = CUIStatic()self.stat:AttachChild(self.bkgr_static)self.stat:Init(0, 0, 1024, 768)self.owner:AttachChild(self.stat)for k,v in pairs (slots) dolocal name="check_button_"..kself.btn = CUIButton()self.btn:SetAutoDelete(false)self.btn:SetWindowName(name)self:Register(self.btn)self.stat:AttachChild(self.btn)TBtn[name]= self.btninit_btn(k)self:AddCallback(name,ui_events.WINDOW_LBUTTON_DB_CLICK, self.ClickBtn[k], self)endinitial = trueendfunction BkgrWnd:ClickBtnStepUp()self.step=self.step*2if self.step>200 then self.step=128 end--news_manager.send_tip(db.actor,"шаг= "..self.step)self.btn:SetText("кнопка "..self.num_btn.." шаг "..self.step)endfunction BkgrWnd:ClickBtnStepDn()self.step=self.step/2if self.step==1 then self.step=2 end--news_manager.send_tip(db.actor,"шаг= "..self.step)self.btn:SetText("кнопка "..self.num_btn.." шаг "..self.step)endfunction BkgrWnd:ClickNxtBtn()self.num_btn=self.num_btn+1if self.num_btn>#slots then self.num_btn=1 endself.btn:SetText("кнопка "..self.num_btn.." шаг "..self.step)--news_manager.send_tip(db.actor,"скорректируем положение кнопки "..self.num_btn)endfunction BkgrWnd:ClickBtnUp()slots[self.num_btn][2]=slots[self.num_btn][2]-self.stepif slots[self.num_btn][2]<0 then slots[self.num_btn][2]=768+slots[self.num_btn][2] endinit_btn(self.num_btn)endfunction BkgrWnd:ClickBtnDwn()slots[self.num_btn][2]=slots[self.num_btn][2]+self.stepif slots[self.num_btn][2]>768 then slots[self.num_btn][2]=-768+slots[self.num_btn][2] endinit_btn(self.num_btn)endfunction BkgrWnd:ClickBtnLft()slots[self.num_btn][1]=slots[self.num_btn][1]-self.stepif slots[self.num_btn][1]<0 then slots[self.num_btn][1]=1024+slots[self.num_btn][1] endinit_btn(self.num_btn)endfunction BkgrWnd:ClickBtnRt()slots[self.num_btn][1]=slots[self.num_btn][1]+self.stepif slots[self.num_btn][1]>1024 then slots[self.num_btn][1]=-1024+slots[self.num_btn][1] endinit_btn(self.num_btn)end-- инициализация с учетом размеров иконки статикаfunction init_btn(num,sec)local function sections(num)if num==1 thenlocal item=db.actor:item_in_slot(0)if item then return item:section() else return endelseif num==2 thenlocal item=db.actor:item_in_slot(4)if item then return item:section() else return endelseif num==3 thenelseif num==4 thenlocal item=db.actor:item_in_slot(8)if item then return item:section() else return endelseif num==5 thenlocal item=db.actor:item_in_slot(9)if item then return "device_torch" else return endendendlocal btn=TBtn["check_button_"..num]if not btn then rec_wnd = BkgrWnd(level.main_input_receiver()) endbtn=TBtn["check_button_"..num]local sect = sec or sections(num)if sect thenlocal ini=system_ini()local x=ini:r_u32(sect, "inv_grid_x")*50local y=ini:r_u32(sect, "inv_grid_y")*50local width=ini:r_u32(sect, "inv_grid_width")*50local height=ini:r_u32(sect, "inv_grid_height")*50btn:InitTexture("ui\\ui_icon_equipment")btn:SetOriginalRect(x,y,width,height)btn:SetStretchTexture(true)local h=50 -- высота кнопки 50 пикселовlocal w=h*width/height -- ширина пропорциональна соотношению высоты и ширины инвентарной иконки.btn:Init(slots[num][1]-w/2,slots[num][2]-h/2,w,h)btn:Show(true)elsebtn:Init(slots[num][1],slots[num][2],0,0)endendfunction BkgrWnd:ShowWnd()if initial and rec_wnd.stat~= nil thenrec_wnd.stat:Show(true)endendfunction BkgrWnd:HideWnd()if initial and rec_wnd.stat~= nil thenrec_wnd.stat:Show(false)endendfunction BkgrWnd:DetachWnd()self.owner:DetachChild(self.stat)-- self:AttachChild(self.stat)initial = falseend--------------------------------------------------------------------------function on_eat(sect)local items_for_0_slot={ -- кулаки,ножи,перчатки...["fake_wpn_knife"]=true,["fake_wpn_fist"]=true,["fake_wpn_fist_m"]=true}if items_for_0_slot[sect] thenreinit_button_1(string.sub(sect,6,-1)) returnendlocal items_for_4_slot={ -- бинокли...["fake_wpn_binoc"]=true,["fake_wpn_binoc1"]=true}if items_for_4_slot[sect] thenreinit_button_2(string.sub(sect,6,-1)) returnendif sect=="fake_device_torch" thenif db.actor:object("device_torch") thenspawn_item_in_inv("fake_device_torch")elsespawn_item_in_inv("device_torch") init_btn(5,"device_torch")endendendfunction reinit_button_1(sect)local item=db.actor:item_in_slot(0)if item thendb.actor:drop_item(item) spawn_item_in_inv("fake_"..item:section())del_item(item:id())endspawn_item_in_inv(sect)init_btn(1,sect)endfunction reinit_button_2(sect)local item=db.actor:item_in_slot(4)if item thendb.actor:drop_item(item) spawn_item_in_inv("fake_"..item:section())del_item(item:id())endspawn_item_in_inv(sect)init_btn(2,sect)endfunction spawn_item_in_inv( sect )alife():create(sect,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),0)endfunction del_item(id)if id thenlocal sobj=alife():object(id)if sobj then alife():release(sobj,true) endendend---------------------------------------------------------------------------------------------function on_info(info_id)if info_id == "ui_inventory" thenif not initial thenrec_wnd = BkgrWnd(level.main_input_receiver())endif not rec_wnd.stat:IsShown() thenrec_wnd:ShowWnd()endelseif info_id == "ui_inventory_hide" thenif rec_wnd thenrec_wnd:DetachWnd()endendend Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747348
Artos 99 Опубликовано 16 Декабря 2012 Поделиться Опубликовано 16 Декабря 2012 Gaz24, ответ на вопрос "Что делать?" в этом топике очевиден: "Работать головою, анализировать, искать решение/алгоритм и реализовывать его в кодах!" Не нужно ждать, что в игре можно реализовать все что захотелось и тем более гладко и без сучка и задоринки. Движок игры имеет большое кол-во недоработок и ошибок и скриптами это не поправишь (без сильного гимороя). По сути вопроса: Каждый слот в игре имеет свои нюансы и проецировать один на другой (КПК<=>Detector) не стОит... Собственно слот КПК не предназначен для "вкладывания" в него предмета, т.к. в него с самого старта "вкладывается" КПК актора и там он практически бессменен. Почти(!) также ведет себя и слот детекторов. В чистой игре, если в него что-то попало, то и торчит там до завершения игры. Не зря для детектров сделали возможность "вешать на пояс". В общем в процессе моих ковыряний с детекторами, выяснилось, что детекторы очень легко попадают в свой слот при их покупке/находке (т.е. при овладении актором). Также легко детекторы выбрасываются из слота в рюкзак иль на "землю". А вот положить детектор из рюкзака в слот - это проблема, которая почти всегда заканчивается движковым вылетом. Пока могу посоветовать только - не использовать возможность перекладывания детектора из рюкзака в слот через контексное меню (по ПКМ, т.е. движковыми возможностями), а делать это или своим скриптом или, вначале выбрасывать детектор, и брать его "с земли" в освобожденный слот. Ну или ... ковырять и модифицировать сам движок. ;-) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747403
Dennis_Chikin 3 664 Опубликовано 16 Декабря 2012 Поделиться Опубликовано 16 Декабря 2012 Очень разумная мысль, но не удержусь от подковырки: "А что же такого именно КПК'шного ты собрался хранить в pstor'е объекта КПК-актора?", что ради этого специальный биндер задействовать решаешься? Ну, его вообще-то задолго до меня задействовали. Так что пока все заради "совместимости". В идеале - там место для всякого сюжетного и прочих трансмутаций. Ну, то, что выводится в собственно ПДА. Возможно - сюжетные же ньюсы. Имеет смысл кое-что поснимать с инфопоршенов, и перевесить на нормальные переменные. В общем, все, что при отбирании у актора оного ПДА актор теряет. Или, наоборот, приобретает при получении ПДА/флэшек. А вот зомбосталкерам и гниющим трупам - там точно не место. Для этого их собственный custom data прекрасно подходит. Вот ужо доберусь... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-747515
Gaz24 6 Опубликовано 19 Декабря 2012 Поделиться Опубликовано 19 Декабря 2012 (изменено) С вопросом ошибся темой. ColR_iT Изменено 19 Декабря 2012 пользователем ColR_iT Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-748047
ubersan 0 Опубликовано 25 Декабря 2012 Поделиться Опубликовано 25 Декабря 2012 Методом сравнения файлом и "вычисления" нужных строк кода интегрировал в Zenobian мод схему "Компаньоны", все запустилось и нужные ветки диалога в игре появились, но при попытке выбрать нужную в диалоге игра вываливается с такой ошибкой: dialogs.script:314: attempt to call global 'load_variable' (a nil value) На этой строке в файле dialogs.script такой код: local dead_friends = load_variable("dead_fr", 0) Также попробовал тем же способом интегрировать в Zenobian Freeplay Mod 1.3 от DEXXX. scripts/bind_stalker.script scripts/ogsm_freeplay.script scripts/sr_aes_deadzone.script scripts/sr_timer.script scripts/xr_effects.script config/gameplay/info_l19stanciya.xml config/ui/ui_credits.xml config/ui/ui_movies.xml spawns/all.spawn Нашел отличия, которые (на мой неопытный взгляд) имеют отношение к фриплею, и воспроизвел их в оригинальных файлах. При этом если я заменяю файл all.spawn на "фриплейный" - после финальных титров игра вылетает с таким логом: xr_gulag.script:1056: attempt to index field '?' (a nil value) В xr_gulag.scritp на 1056-й строке находится такой код: self.Job[jobN].object = nil Если же оставляю оригинальный файл - игра просто заканчивается. Пожалуйста, сориентируйте по каким "ключевым словам" искать, чтобы решить проблему. Либо, если есть возможность - подскажите более конкретно, в чем конфликты и как их решить. Заранее благодарю. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-749287
Artos 99 Опубликовано 25 Декабря 2012 Поделиться Опубликовано 25 Декабря 2012 (изменено) ubersan, ключевые слова в данном случае - "учиться, учиться и учиться" основам программирования, а конкретно языку Lua и моддингу игры. Ты пытаешься соединить в единое скрипты (сценарии) от разных авторов. В простейших случаях, порою простое совмещение строк прокатывает, однако в более сложных случаях, когда сценарии или конфликтуют или имеют ветвления - без написания своего обобщеного сценария (алгоритма) никак не обойтись.! 1-ая твоя проблема в том, что тобою взят вариант мода "Компаньоны", расчитанный не на чистую игру, а на мод АМК, в котором как раз и введена функция load_variable. Т.о. ты просто напросто совмещаешь недостаточные куски, которые не могут составить единое целое, и требуется еще нечто, что осталось в моде АМК. Выхода тут два: а) взять версию мода "Компаньоны", расчитанную на чистую игру, т.е. имеющую заведомо все необходимое относительно оригинальной игры и совмещать с Zenobian модом. б) Совмещая, контролировать наличие всех необходимых скриптов/функций и при необходимости добавлять их (из АМК-мода или писать заново). 2-ая ошибка, связанная с совмещением Freeplay Mod'а, посерьезнее и тут уже оговорка в "неопытности взгляда" как раз и является причиной неудачи. В данном случае только или изучать моддинг и приемы, или искать того, кто за тебя это сделает. Пояснением тебе пары иль даже десятка строк/параметров/секций тут уже не обойтись, а на бОльшее врядли кто будет тратить свое время, тем более ваша беседа будет на разных языках. Подсовывать вслепую в какой-либо мод файл all.spawn'а от другого мода ни к чему хорошему не может привести. Если в all.spawn внесены правки, то тут требуется совмещать не только скрипты, а и все остальное, т.е. конфиги/модели/текстуры/... Короче, анализировать и добавлять/менять то, что отсутствует... Единых рецептов тут нет и не может быть. P.S. Прочитал твои слова из "Разговоры о модах": Если вдруг есть опытный (или в процессе получения опыта) скриптер, который тоже считает подход и концепцию мода Zenobian правильными и хотел бы развивать и дорабатывать мод - с удовольствием с ним бы пообщался на эту тему. ИМХО: 1. Подход и концепцию может развивать и дорабатывать только сам автор мода (Z.E.N.). Любой, кто возьмется за это со стороны - будет уже развивать не авторскую, а свою концепцию со своим подходом. Если их будет двое - то с большой вероятностью появится и треться концепция... 2. Учитывая, что с момента создания Zenobian мода прошло уже немало лет и моддинг для Сталкера уже очень далеко продвинулся, вероятность что ремейк на мод будет в концепции автора - под большим сомнением... Тем более, если уровень знаний, опыта и мышления "как программиста" тех, кто будет продолжать будет ниже чем самого автора. 3. Помнится, за продолжение и развитие именно Zenobian мода под названием "Add-on for S.T.A.L.K.E.R." взялся Мутант, он же ака Блонди, он же Сергей Червинский, он же Black Shize Team. Но недавно проект накрылся, тут можно найти следы и бетку... Изменено 25 Декабря 2012 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-749289
VovanDolg 1 Опубликовано 30 Декабря 2012 Поделиться Опубликовано 30 Декабря 2012 Сталкеры наверное все играли LWToD или наподобие, так вот там есть я точно не уверен, но там связано со скриптом, на карте в ПДА когда подходишь к НПС высвечиваются их точки, так классно! может кто подскажет как вытащить из мода это чудо или где можно скачать для чистой ТЧ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-749981
Desertir 202 Опубликовано 30 Декабря 2012 Поделиться Опубликовано 30 Декабря 2012 Столкнулся с такой проблемой. При создании окна со списком не всегда доступны элементы списка, которые я туда добавляю. Точнее не "не всегда", а при определенном условии, если игра на паузе или не загружен уровень, то все в порядке. Если создать окно непосредственно во время игры, то никакие элементы списка я не могу получить. Я так понимаю, то ли это сборщик мусора, то ли я не правильно делаю. Пока решил проблему сохранением элемента списка непосредственно в списке (а ля таблица). Упрощенный пример кода, который демонстрирует эту проблему под спойлером. class "bug" (CUIScriptWnd)function bug:__init(owner) super()self:Init(0,0,1024,768)self.bg = CUIFrameWindow()self.bg:Init("ui_tablist_textbox",128,128,256,320)self.list = CUIListWnd()self.list:Init(138,138,172,172)self.list:EnableScrollBar(true)self.list:ShowSelectedItem(true)self:AttachChild(self.bg)self:AttachChild(self.list)self:Register(self.list,"list")self:AddCallback("list",ui_events.LIST_ITEM_CLICKED,self.start,self)self:reset_list()if owner thenself.owner = ownerself.owner:GetHolder():start_stop_menu(self,true)self.owner:GetHolder():start_stop_menu(self.owner,true)elselevel.start_stop_menu(self,true)endendfunction bug:start()local sel_item = self:get_sel_item()if not sel_item then pcon("item not exist") return endlocal name = sel_item:GetText()pcon(name)endfunction bug:reset_list()local t = {"Kardon","Svalka","Agroprom","Bar","Yantar","Military","Pripyat","Chernobyl"}self.list:RemoveAll()for _,value in pairs(t) doself.list[value] = CUIListItemEx()self.list[value]:SetText(value)self.list:AddItem(self.list[value])--local a = CUIListItem()--a:SetText(value)--self.list:AddItem(a)endendfunction bug:get_sel_item()local sel_index = self.list:GetSelectedItem()local sel_item = self.list:GetItem(sel_index)return sel_itemendfunction bug:OnKeyboard(dik,keyboard_action)CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)if dik == DIK_keys.DIK_ESCAPE thenif self.owner thenself:GetHolder():start_stop_menu(self.owner,true)self:GetHolder():start_stop_menu(self,true)elselevel.start_stop_menu(self,true)endendreturn trueend В таком виде работает всегда. Т.е. объект элемента списка сохраняется и никуда не вышвыривается. Если закомментить строки self.list[value] = CUIListItemEx() self.list[value]:SetText(value) self.list:AddItem(self.list[value]) и раскомментить 3 строки ниже них, то работает только в главном меню. Очевидно и понятно, что переменная a существует только в своем блоке, но почему элемент не сохраняется методом AddItem? Или список в принципе рассчитан на работу только в главном меню и его составляющих? Как обойтись без такого шаманства self.list[value] = CUIListItemEx() если мне нужно создавать окно в игре, а не в главном меню? PS: pcon - вывод в лог, в качестве owner выступает объект главного меню, если запущено в нем. Если окно запущено в игре, owner = nil. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-749987
Malandrinus 615 Опубликовано 30 Декабря 2012 Поделиться Опубликовано 30 Декабря 2012 (изменено) Desertir, При создании окна со списком не всегда доступны элементы списка, А что значит недоступны? У меня был эффект, что, хоть элемент и добавлялся и не пропадал, но его было не получить штатными средствами. Потому я их тоже сохранял, чтобы потом получать по индексу из своей таблицы. Кстати классы CUIListItemEx и CUIListItem, вообще говоря предназначены для создания скриптового класса на их основе. Т.е. надо делать так: class "my_list_item" (CUIListItemEx) function my_list_item:__init(arg1, arg2) super() -- добавляю свои элемент на окно списка end -- создаю элемент списка local list_item = my_list_item(123.45, "qwerty") Изменено 30 Декабря 2012 пользователем malandrinus Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-750124
Artos 99 Опубликовано 30 Декабря 2012 Поделиться Опубликовано 30 Декабря 2012 (изменено) Desertir, сделаю предположение: То, что во 2-ом варианте (с раскомментированными) строками у тебя не запоминаются итемы - следствие путаницы с типами того, что приаттачиваешь. Посмотри сам, вначале ты создаешь объект (self.list), инициализируешь его, выполняешь общие для него установки и приаттачиваешь. При чем(!), собственно листинг у тебя пуст. А вот потом уже ты вызываешь self:reset_list(), где и заполняешь листинг. В 1-ом варианте, ты оперируешь именно элементами созданного объекта (self.list[value]), А во 2-ом - оперируешь некими создаваемыми локальными объектами, которые приаттачиваешь... Как минимум это совершенно разные сущности. Иначе: В 1-м случае ты создаешь именно поле 'value' и ему присваиваешь некий объект с установленным значением, и этот объект добавляешь в листинг, а во 2-ом - создаешь локальный объект, задаешь ему значение параметра и добавляешь этот объект в листинг. Т.о. объекты то ты добавишь в обоих случаях, а вот поля в листинге (по которым и производится выбор) создаются только в 1-ом. Так что у тебя нет доступа потому, что нет собственно соответствия добавленных объектов полям листинга. --- Всех с наступающим Новым Годом! Успехов в моддинге и во всем остальном! :ny_z_1: Изменено 30 Декабря 2012 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/242/#findComment-750148
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти