Перейти к контенту

Рекомендуемые сообщения

Dennis_Chikin, функция netpacket_pda_binder.init() вызывается в том случае, если в конфиге секции объекта (например для device_pda) будет прописан параметр:

script_binding = netpacket_pda_binder.init

...

Ну а далее, последовательность вызова движком методов самого биндера можно подсмотреть в xr_motivator.script, где сами разрабы оставили нам комменты:Примечание: Метод 'load' будет вызываться только для объекта(ов) уже сохранявшегося в игре (если был save), т.е. при первом спавне объекта в игру этот метод не вызывается.

 

Ага, спасибо. Это я, как выяснилось, лог не туда воткнул, отчего и получил странный порядок вызываемого.

Ну, хранение всякого разного в игровом объекте не лишено смысла, когда касается самого объекта. Изрядно всякого мусора в акторе или внешнем хранилище можно бы и не хранить.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Ну, хранение всякого разного в игровом объекте не лишено смысла, когда касается самого объекта. Изрядно всякого мусора в акторе или внешнем хранилище можно бы и не хранить.

Очень разумная мысль, но не удержусь от подковырки: "А что же такого именно КПК'шного ты собрался хранить в pstor'е объекта КПК-актора?", что ради этого специальный биндер задействовать решаешься?

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Всем привет! Скажите плиз, есть ли такая статья, где описаны все (ну или почти все) функции скриптов с их описанием и примерами?

Зарание спасибо!

AAssAssInSS.gif
Ссылка на комментарий

AssAssInSS, твой пост является оффтопиком для данного топика. Хотя тема и по скриптам, но не "бюро находок".

На форуме (и в инете) существует поиск, которым и можешь воспользоваться. В этом же разделе имеется топик "Справочник по функциям и классам", в котором расписаны все штатные для игры функции и классы (и многое связанное с этим).

Ну, а чтобы описать все (ну или почти все) функции скриптов - потребуется перелопатить все известные на сегодня моды и расширители библиотек под все билды и патчи... чего конечно же никто никогда не делал и не сделает.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Во-первых, не по теме вопрос. Тема несколько для других вопросов (в шапке прочтёшь, каких именно).

Во-вторых, цитировать предыдущие посты полностью не нужно!

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Серый Волк,

к теме скриптов твой вопрос никак не относится...

Давным давно известно, что большинство конфигов движок игры считывает на старте игры в виртуальныю память и далее оперирует уже с загруженными ресурсами. Доступ скриптами к таким ресурсам уже невозможен, и только сам движок может что-то менять/изменять.

Упомянутое Shredder'ом "наложение" - замазывает уже имеющееся, но не изменяет. Также, упомянутый "X-Ray Extensions" хотя и позволяет отдельные правки в ресурсах игры, но .... пока в основном только для SHoC v1.0006 и скорее в тестовых целях (при чем перезагрузка все вернет в исходное).

Ну а учитывая, что "имя" ГГ прописано в достаточно большом кол-ве диалогов, звуковых дорожках, и пр. конфигах - поменять имя под силу только самому моддмейкеру.

Пока можно предложить подумать над вариантом с "заменой параметров ГГ" когда после некоего события скриптами заменяются необходимые конфиг-файлы на аналогичные и игра перезагружается (аля переход на др.уровень), но это уже требует знаний и опыта по таким операциям.

(если далее вопрос интересует - плз, в тему соотв.ковырялки)

P.S. вот и модератор удалил оффтопный вопрос. Ответ очевидно тоже можно через некоторое время удалить.

 

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Я опять про спавн предметов в ящик:


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 do
alife():create(items_table[math.random(#items_table)],
inv_box.position,
inv_box.m_level_vertex_id,
inv_box.m_game_vertex_id,
inv_box.id)
end
end

function spawn_item_to_treasure(actor, obj, p)
spawn_item_to_box(spawn_item1, 1, "Стори айди тайника")
end

 

 

Вылетает с руганью на get_story_object_id, якобы не знает что это за функция, чем исправить, не подскажете?

Изменено пользователем Старлей
Ссылка на комментарий

Старлей, перешел бы ты в топик соотв.ковырялки, чтобы и тебе было бы попонятнее и нам не гадать, что за куски ты понадергал и во что пытаешься их слепить...

Судя по кускам, ты пытаешься спавнить в некий ящик по выбранному story_id. Однако приведенные куски кодов не взаимосвязаны (один spawn_item1 уже кого угодно в ступор вгонит).

Функция get_story_object_id появилась в ЗП (CoP) и требует соответствующей обвязки в виде story_objects.script. Так что, если у тебя не ЗП, то не копипасть то, что не пригодно, а лучше разберись как правильно спавнить имеющимися у тебя средствами.

- получить объект по его story_id не сложно, примеров сотни (хотя бы через: level_object_by_sid);

- получить игровой идентификатор (ID -> inv_box.id) от объекта - еще проще;

- что за секцию предмета ты используешь из неведомой для нас items_table - разбирайся сам.

 

(скрипты нужно понимать, а не пытаться использовать в темную, да еще и кусками из разных источников)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Я опять про спавн предметов в ящик...

Смотри, как "простенько и со вкусом" Сяк заспавнил винторез в 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

 

Ссылка на комментарий

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

(это с учетом подстраховки на отсутствие ящика и необязательности детализировать координаты при спавне владельцу)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Эксперементировал со скриптами мода "Скриптовая эмуляция невидимых слотов". Вместо ПДА взял слот для детектора. Если убрать детектор в рюкзак все нормально, а когда поместить его обратно в слот, то возникает безлоговый вылет. Что делать?

 


local debug = false --true -- система размещения кнопок ( true - вкл.\ false - выкл.)
local rec_wnd = nil
local initial = false
local 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 = owner
self: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)
end

self.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)
end

self.ClickBtn[3]=function()
news_manager.send_tip(db.actor, "руки прочь от болта!" )
end

self.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)
end

self.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)
end

self:InitControls()
end

function BkgrWnd:__finalize() end

function 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) do

local name="check_button_"..k
self.btn = CUIButton()
self.btn:SetAutoDelete(false)
self.btn:SetWindowName(name)
self:Register(self.btn)
self.stat:AttachChild(self.btn)
TBtn[name]= self.btn

init_btn(k)

self:AddCallback(name,ui_events.WINDOW_LBUTTON_DB_CLICK, self.ClickBtn[k], self)

end

initial = true
end

function BkgrWnd:ClickBtnStepUp()
self.step=self.step*2
if self.step>200 then self.step=128 end
--news_manager.send_tip(db.actor,"шаг= "..self.step)
self.btn:SetText("кнопка "..self.num_btn.." шаг "..self.step)
end

function BkgrWnd:ClickBtnStepDn()
self.step=self.step/2
if self.step==1 then self.step=2 end
--news_manager.send_tip(db.actor,"шаг= "..self.step)
self.btn:SetText("кнопка "..self.num_btn.." шаг "..self.step)
end

function BkgrWnd:ClickNxtBtn()
self.num_btn=self.num_btn+1
if self.num_btn>#slots then self.num_btn=1 end
self.btn:SetText("кнопка "..self.num_btn.." шаг "..self.step)
--news_manager.send_tip(db.actor,"скорректируем положение кнопки "..self.num_btn)
end

function BkgrWnd:ClickBtnUp()
slots[self.num_btn][2]=slots[self.num_btn][2]-self.step
if slots[self.num_btn][2]<0 then slots[self.num_btn][2]=768+slots[self.num_btn][2] end
init_btn(self.num_btn)
end

function BkgrWnd:ClickBtnDwn()
slots[self.num_btn][2]=slots[self.num_btn][2]+self.step
if slots[self.num_btn][2]>768 then slots[self.num_btn][2]=-768+slots[self.num_btn][2] end
init_btn(self.num_btn)
end

function BkgrWnd:ClickBtnLft()
slots[self.num_btn][1]=slots[self.num_btn][1]-self.step
if slots[self.num_btn][1]<0 then slots[self.num_btn][1]=1024+slots[self.num_btn][1] end
init_btn(self.num_btn)
end

function BkgrWnd:ClickBtnRt()
slots[self.num_btn][1]=slots[self.num_btn][1]+self.step
if slots[self.num_btn][1]>1024 then slots[self.num_btn][1]=-1024+slots[self.num_btn][1] end
init_btn(self.num_btn)
end

-- инициализация с учетом размеров иконки статика
function init_btn(num,sec)

local function sections(num)
if num==1 then
local item=db.actor:item_in_slot(0)
if item then return item:section() else return end
elseif num==2 then
local item=db.actor:item_in_slot(4)
if item then return item:section() else return end
elseif num==3 then

elseif num==4 then
local item=db.actor:item_in_slot(8)
if item then return item:section() else return end

elseif num==5 then
local item=db.actor:item_in_slot(9)
if item then return "device_torch" else return end
end
end

local btn=TBtn["check_button_"..num]
if not btn then rec_wnd = BkgrWnd(level.main_input_receiver()) end
btn=TBtn["check_button_"..num]
local sect = sec or sections(num)
if sect then
local ini=system_ini()
local x=ini:r_u32(sect, "inv_grid_x")*50
local y=ini:r_u32(sect, "inv_grid_y")*50
local width=ini:r_u32(sect, "inv_grid_width")*50
local height=ini:r_u32(sect, "inv_grid_height")*50
btn: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)

else
btn:Init(slots[num][1],slots[num][2],0,0)
end

end

function BkgrWnd:ShowWnd()
if initial and rec_wnd.stat~= nil then
rec_wnd.stat:Show(true)
end
end


function BkgrWnd:HideWnd()
if initial and rec_wnd.stat~= nil then
rec_wnd.stat:Show(false)
end
end

function BkgrWnd:DetachWnd()
self.owner:DetachChild(self.stat)
-- self:AttachChild(self.stat)
initial = false
end

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

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] then
reinit_button_1(string.sub(sect,6,-1)) return
end

local items_for_4_slot={ -- бинокли...
["fake_wpn_binoc"]=true,
["fake_wpn_binoc1"]=true
}
if items_for_4_slot[sect] then
reinit_button_2(string.sub(sect,6,-1)) return
end

if sect=="fake_device_torch" then
if db.actor:object("device_torch") then
spawn_item_in_inv("fake_device_torch")
else
spawn_item_in_inv("device_torch") init_btn(5,"device_torch")
end
end
end

function reinit_button_1(sect)
local item=db.actor:item_in_slot(0)
if item then
db.actor:drop_item(item) spawn_item_in_inv("fake_"..item:section())
del_item(item:id())
end
spawn_item_in_inv(sect)
init_btn(1,sect)
end

function reinit_button_2(sect)
local item=db.actor:item_in_slot(4)
if item then
db.actor:drop_item(item) spawn_item_in_inv("fake_"..item:section())
del_item(item:id())
end
spawn_item_in_inv(sect)
init_btn(2,sect)
end

function spawn_item_in_inv( sect )
alife():create(sect,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),0)
end

function del_item(id)
if id then
local sobj=alife():object(id)
if sobj then alife():release(sobj,true) end
end
end

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

function on_info(info_id)
if info_id == "ui_inventory" then
if not initial then
rec_wnd = BkgrWnd(level.main_input_receiver())
end
if not rec_wnd.stat:IsShown() then
rec_wnd:ShowWnd()
end

elseif info_id == "ui_inventory_hide" then

if rec_wnd then
rec_wnd:DetachWnd()
end
end
end

 

Ссылка на комментарий

Gaz24, ответ на вопрос "Что делать?" в этом топике очевиден: "Работать головою, анализировать, искать решение/алгоритм и реализовывать его в кодах!"

Не нужно ждать, что в игре можно реализовать все что захотелось и тем более гладко и без сучка и задоринки. Движок игры имеет большое кол-во недоработок и ошибок и скриптами это не поправишь (без сильного гимороя).

 

По сути вопроса: Каждый слот в игре имеет свои нюансы и проецировать один на другой (КПК<=>Detector) не стОит...

Собственно слот КПК не предназначен для "вкладывания" в него предмета, т.к. в него с самого старта "вкладывается" КПК актора и там он практически бессменен.

Почти(!) также ведет себя и слот детекторов. В чистой игре, если в него что-то попало, то и торчит там до завершения игры. Не зря для детектров сделали возможность "вешать на пояс".

В общем в процессе моих ковыряний с детекторами, выяснилось, что детекторы очень легко попадают в свой слот при их покупке/находке (т.е. при овладении актором). Также легко детекторы выбрасываются из слота в рюкзак иль на "землю". А вот положить детектор из рюкзака в слот - это проблема, которая почти всегда заканчивается движковым вылетом.

Пока могу посоветовать только - не использовать возможность перекладывания детектора из рюкзака в слот через контексное меню (по ПКМ, т.е. движковыми возможностями), а делать это или своим скриптом или, вначале выбрасывать детектор, и брать его "с земли" в освобожденный слот.

Ну или ... ковырять и модифицировать сам движок. ;-)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Очень разумная мысль, но не удержусь от подковырки: "А что же такого именно КПК'шного ты собрался хранить в pstor'е объекта КПК-актора?", что ради этого специальный биндер задействовать решаешься?

 

Ну, его вообще-то задолго до меня задействовали. Так что пока все заради "совместимости".

 

В идеале - там место для всякого сюжетного и прочих трансмутаций. Ну, то, что выводится в собственно ПДА. Возможно - сюжетные же ньюсы. Имеет смысл кое-что поснимать с инфопоршенов, и перевесить на нормальные переменные.

В общем, все, что при отбирании у актора оного ПДА актор теряет. ;) Или, наоборот, приобретает при получении ПДА/флэшек.

 

А вот зомбосталкерам и гниющим трупам - там точно не место. Для этого их собственный custom data прекрасно подходит. Вот ужо доберусь...

Ссылка на комментарий

Методом сравнения файлом и "вычисления" нужных строк кода интегрировал в 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

Если же оставляю оригинальный файл - игра просто заканчивается.

 

Пожалуйста, сориентируйте по каким "ключевым словам" искать, чтобы решить проблему. Либо, если есть возможность - подскажите более конкретно, в чем конфликты и как их решить. Заранее благодарю.

Ссылка на комментарий

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. Но недавно проект накрылся, тут можно найти следы и бетку...

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Сталкеры наверное все играли LWToD или наподобие, так вот там есть я точно не уверен, но там связано со скриптом, на карте в ПДА когда подходишь к НПС высвечиваются их точки, так классно! может кто подскажет как вытащить из мода это чудо или где можно скачать для чистой ТЧ?

Ссылка на комментарий

Столкнулся с такой проблемой. При создании окна со списком не всегда доступны элементы списка, которые я туда добавляю. Точнее не "не всегда", а при определенном условии, если игра на паузе или не загружен уровень, то все в порядке. Если создать окно непосредственно во время игры, то никакие элементы списка я не могу получить. Я так понимаю, то ли это сборщик мусора, то ли я не правильно делаю. Пока решил проблему сохранением элемента списка непосредственно в списке (а ля таблица). Упрощенный пример кода, который демонстрирует эту проблему под спойлером.


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 then
self.owner = owner
self.owner:GetHolder():start_stop_menu(self,true)
self.owner:GetHolder():start_stop_menu(self.owner,true)
else
level.start_stop_menu(self,true)
end
end

function bug:start()
local sel_item = self:get_sel_item()
if not sel_item then pcon("item not exist") return end
local name = sel_item:GetText()
pcon(name)
end

function bug:reset_list()
local t = {"Kardon","Svalka","Agroprom","Bar","Yantar","Military","Pripyat","Chernobyl"}
self.list:RemoveAll()
for _,value in pairs(t) do
self.list[value] = CUIListItemEx()
self.list[value]:SetText(value)
self.list:AddItem(self.list[value])
--local a = CUIListItem()
--a:SetText(value)
--self.list:AddItem(a)
end
end

function bug:get_sel_item()
local sel_index = self.list:GetSelectedItem()
local sel_item = self.list:GetItem(sel_index)
return sel_item
end

function bug:OnKeyboard(dik,keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if dik == DIK_keys.DIK_ESCAPE then
if self.owner then
self:GetHolder():start_stop_menu(self.owner,true)
self:GetHolder():start_stop_menu(self,true)
else
level.start_stop_menu(self,true)
end
end
return true
end

 

В таком виде работает всегда. Т.е. объект элемента списка сохраняется и никуда не вышвыривается. Если закомментить строки

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

Ссылка на комментарий

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")

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Desertir, сделаю предположение:

То, что во 2-ом варианте (с раскомментированными) строками у тебя не запоминаются итемы - следствие путаницы с типами того, что приаттачиваешь.

Посмотри сам, вначале ты создаешь объект (self.list), инициализируешь его, выполняешь общие для него установки и приаттачиваешь. При чем(!), собственно листинг у тебя пуст. А вот потом уже ты вызываешь self:reset_list(), где и заполняешь листинг.

В 1-ом варианте, ты оперируешь именно элементами созданного объекта (self.list[value]), А во 2-ом - оперируешь некими создаваемыми локальными объектами, которые приаттачиваешь... Как минимум это совершенно разные сущности.

Иначе: В 1-м случае ты создаешь именно поле 'value' и ему присваиваешь некий объект с установленным значением, и этот объект добавляешь в листинг, а во 2-ом - создаешь локальный объект, задаешь ему значение параметра и добавляешь этот объект в листинг.

Т.о. объекты то ты добавишь в обоих случаях, а вот поля в листинге (по которым и производится выбор) создаются только в 1-ом. Так что у тебя нет доступа потому, что нет собственно соответствия добавленных объектов полям листинга.

 

---

Всех с наступающим Новым Годом! Успехов в моддинге и во всем остальном! :ny_z_1:

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...