Dennis_Chikin 3 658 Опубликовано 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 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 Ну, хранение всякого разного в игровом объекте не лишено смысла, когда касается самого объекта. Изрядно всякого мусора в акторе или внешнем хранилище можно бы и не хранить.Очень разумная мысль, но не удержусь от подковырки: "А что же такого именно КПК'шного ты собрался хранить в pstor'е объекта КПК-актора?", что ради этого специальный биндер задействовать решаешься? "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AssAssInSS 1 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 Всем привет! Скажите плиз, есть ли такая статья, где описаны все (ну или почти все) функции скриптов с их описанием и примерами? Зарание спасибо! Ссылка на комментарий
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) AssAssInSS, твой пост является оффтопиком для данного топика. Хотя тема и по скриптам, но не "бюро находок". На форуме (и в инете) существует поиск, которым и можешь воспользоваться. В этом же разделе имеется топик "Справочник по функциям и классам", в котором расписаны все штатные для игры функции и классы (и многое связанное с этим). Ну, а чтобы описать все (ну или почти все) функции скриптов - потребуется перелопатить все известные на сегодня моды и расширители библиотек под все билды и патчи... чего конечно же никто никогда не делал и не сделает. Изменено 15 Декабря 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Серый Волк 841 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Во-первых, не по теме вопрос. Тема несколько для других вопросов (в шапке прочтёшь, каких именно). Во-вторых, цитировать предыдущие посты полностью не нужно! ColR_iT Изменено 15 Декабря 2012 пользователем ColR_iT Новое меню и интерфейс для ЗП, Наличные деньги для SGM 1.7, Новый инвентарь для ЗП, Новые меню для Солянки и Солянки+ООП+К+МА Ссылка на комментарий
Artos 99 Опубликовано 15 Декабря 2012 Поделиться Опубликовано 15 Декабря 2012 (изменено) Серый Волк, к теме скриптов твой вопрос никак не относится... Давным давно известно, что большинство конфигов движок игры считывает на старте игры в виртуальныю память и далее оперирует уже с загруженными ресурсами. Доступ скриптами к таким ресурсам уже невозможен, и только сам движок может что-то менять/изменять. Упомянутое Shredder'ом "наложение" - замазывает уже имеющееся, но не изменяет. Также, упомянутый "X-Ray Extensions" хотя и позволяет отдельные правки в ресурсах игры, но .... пока в основном только для SHoC v1.0006 и скорее в тестовых целях (при чем перезагрузка все вернет в исходное). Ну а учитывая, что "имя" ГГ прописано в достаточно большом кол-ве диалогов, звуковых дорожках, и пр. конфигах - поменять имя под силу только самому моддмейкеру. Пока можно предложить подумать над вариантом с "заменой параметров ГГ" когда после некоего события скриптами заменяются необходимые конфиг-файлы на аналогичные и игра перезагружается (аля переход на др.уровень), но это уже требует знаний и опыта по таким операциям. (если далее вопрос интересует - плз, в тему соотв.ковырялки) P.S. вот и модератор удалил оффтопный вопрос. Ответ очевидно тоже можно через некоторое время удалить. Изменено 15 Декабря 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Старлей 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 пользователем Старлей Ray Of Hope - кооператив сталкера OldStory Ссылка на комментарий
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Buusty 386 Опубликовано 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 Ссылка на комментарий
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
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 Ссылка на комментарий
Artos 99 Опубликовано 16 Декабря 2012 Поделиться Опубликовано 16 Декабря 2012 Gaz24, ответ на вопрос "Что делать?" в этом топике очевиден: "Работать головою, анализировать, искать решение/алгоритм и реализовывать его в кодах!" Не нужно ждать, что в игре можно реализовать все что захотелось и тем более гладко и без сучка и задоринки. Движок игры имеет большое кол-во недоработок и ошибок и скриптами это не поправишь (без сильного гимороя). По сути вопроса: Каждый слот в игре имеет свои нюансы и проецировать один на другой (КПК<=>Detector) не стОит... Собственно слот КПК не предназначен для "вкладывания" в него предмета, т.к. в него с самого старта "вкладывается" КПК актора и там он практически бессменен. Почти(!) также ведет себя и слот детекторов. В чистой игре, если в него что-то попало, то и торчит там до завершения игры. Не зря для детектров сделали возможность "вешать на пояс". В общем в процессе моих ковыряний с детекторами, выяснилось, что детекторы очень легко попадают в свой слот при их покупке/находке (т.е. при овладении актором). Также легко детекторы выбрасываются из слота в рюкзак иль на "землю". А вот положить детектор из рюкзака в слот - это проблема, которая почти всегда заканчивается движковым вылетом. Пока могу посоветовать только - не использовать возможность перекладывания детектора из рюкзака в слот через контексное меню (по ПКМ, т.е. движковыми возможностями), а делать это или своим скриптом или, вначале выбрасывать детектор, и брать его "с земли" в освобожденный слот. Ну или ... ковырять и модифицировать сам движок. ;-) "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 16 Декабря 2012 Поделиться Опубликовано 16 Декабря 2012 Очень разумная мысль, но не удержусь от подковырки: "А что же такого именно КПК'шного ты собрался хранить в pstor'е объекта КПК-актора?", что ради этого специальный биндер задействовать решаешься? Ну, его вообще-то задолго до меня задействовали. Так что пока все заради "совместимости". В идеале - там место для всякого сюжетного и прочих трансмутаций. Ну, то, что выводится в собственно ПДА. Возможно - сюжетные же ньюсы. Имеет смысл кое-что поснимать с инфопоршенов, и перевесить на нормальные переменные. В общем, все, что при отбирании у актора оного ПДА актор теряет. Или, наоборот, приобретает при получении ПДА/флэшек. А вот зомбосталкерам и гниющим трупам - там точно не место. Для этого их собственный custom data прекрасно подходит. Вот ужо доберусь... Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Gaz24 6 Опубликовано 19 Декабря 2012 Поделиться Опубликовано 19 Декабря 2012 (изменено) С вопросом ошибся темой. ColR_iT Изменено 19 Декабря 2012 пользователем ColR_iT Ссылка на комментарий
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 Если же оставляю оригинальный файл - игра просто заканчивается. Пожалуйста, сориентируйте по каким "ключевым словам" искать, чтобы решить проблему. Либо, если есть возможность - подскажите более конкретно, в чем конфликты и как их решить. Заранее благодарю. Ссылка на комментарий
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
VovanDolg 1 Опубликовано 30 Декабря 2012 Поделиться Опубликовано 30 Декабря 2012 Сталкеры наверное все играли LWToD или наподобие, так вот там есть я точно не уверен, но там связано со скриптом, на карте в ПДА когда подходишь к НПС высвечиваются их точки, так классно! может кто подскажет как вытащить из мода это чудо или где можно скачать для чистой ТЧ? Ссылка на комментарий
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. ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
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 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти