Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Редактирование движка
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
Neo][
Цитата(apostol1999 @ 14.07.2016, 19:18) *
P.S запуск, потом черный экран и все

apostol1999, после запуска успевает переключится в полноэкранный режим или только чёрное окно? И всё - это как, приложение падает или остаётся висеть чёрный экран? А с логом какая проблема?
apostol1999
Цитата(Neo][ @ 14.07.2016, 19:32) *

Цитата(apostol1999 @ 14.07.2016, 19:18) *
P.S запуск, потом черный экран и все

apostol1999, после запуска успевает переключится в полноэкранный режим или только чёрное окно? И всё - это как, приложение падает или остаётся висеть чёрный экран? А с логом какая проблема?

Запускается, в полноэкранный режим, и просто висит на черном фоне
Лог не могу скинуть, потому что сижу с мобилки.. А компа рядом нет
ColR_iT
Neo][, на сколько я помню lua_help - это консольная команда в игре. Мне нужно получить эти данные только при наличии xrGame.dll.
RayTwitty
ColR_iT, ты лучше объясни, что вообще хочешь сделать. Хэлп по всем скриптовым методам?

Пока очевидно только одно - то что ты хочешь, нужно писать с нуля.
mortan
Цитата(Neo][ @ 14.07.2016, 17:00) *

mortan, посмотри следующие методы у других объектов:
Код
virtual void    net_Export            (NET_Packet& P);
virtual void    net_Import            (NET_Packet& P);

virtual void    save                (NET_Packet &output_packet);
virtual void    load                (IReader &input_packet);


для того, чтобы понять, что и когда вызывается начни раскручивать отсюда:
Код
CALifeStorageManager::load
CALifeStorageManager::save

спасибо, уже смотрел, часть вопросов отпала, но всё равно есть нюансы: ни у одного из объектов что я смотрел нету сохранения дочерних элементов,сохраняется только родитель. Я тут поковырял всем известный nlc7 и посмотрел как там это сделал товарищ alpet - новый контейнер через объединение двух классов инв бокса и инв предмета,правда там свойства другие, нежели в ЗП, и инв бокс не наследуют прямо все свойства CGameObject. У меня такое не получается из-за конфликта - и инв бокс и инв предмет оба наследуют от CGameObject. Видимо придётся курить ещё раз про наследование и сразу такой вопрос - можно ли как-то перезаписать уже существующие методы у базового класса в дочернем классе?
ColR_iT
RayTwitty, я хочу:
Цитата(ColR_iT @ 12.07.2016, 20:48) *
если ли возможность вернуть список всех методов доступных из Lua, сгруппированных по принадлежности к игровым объектам?
Цитата(ColR_iT @ 14.07.2016, 12:47) *
мне нужен функция в xrGame.dll вида:
Код
extern "C" { __declspec(dllexport) returnType ExportMethods(); }

Возвращающий хотя бы массив строк (в идеале словарь, кажется тип map или std::pair, в общем любом виде доступном для маршалинга) с именами и сигнатурами методов, которые доступны в скриптах Lua. Саму же функцию ExportMethods я буду вызывать в коде C# посредством DllImport.

RayTwitty
ColR_iT, тогда:
Цитата(RayTwitty @ 14.07.2016, 18:46) *
то что ты хочешь, нужно писать с нуля

Neo][
Цитата(ColR_iT @ 14.07.2016, 19:54) *
Neo][, на сколько я помню lua_help - это консольная команда в игре. Мне нужно получить эти данные только при наличии xrGame.dll.

ColR_iT, функция в xrGame просто будет мостом к lua_help.

mortan, тут надо смотреть, как это лучше реализовать. Объект будет знать в каком контейнере он находится или контейнер будет знать свои объекты, или всё вместе.

На вскидку наводящие вопросы: как оружие хранит обвесы? Как артефакт попадает на пояс?

Цитата(mortan @ 14.07.2016, 21:33) *
Видимо придётся курить ещё раз про наследование и сразу такой вопрос - можно ли как-то перезаписать уже существующие методы у базового класса в дочернем классе?

Кури сразу все основы ООП.
Ты говоришь про overriding & hiding, но применяются они для абсолютно разных вещей.
Neo][
apostol1999, какая версия xray? Всётаки глянуть бы в лог. Как вариант можно попробовать оконный режим и разрешение выставь из ряда 4:3
-StalkMen-
ColR_iT,
В чём проблема DO IT ? Где подсмотреть уже подсказали.
mortan
Neo][, ну мнеб избавиться от прикола с "ambiguous access of '%name%' "
Flammable
Цитата(ColR_iT @ 14.07.2016, 12:47) *
Ещё раз повторюсь с вопросом: мне нужен функция в xrGame.dll вида:
Код
extern "C" { __declspec(dllexport) returnType ExportMethods(); }
Возвращающий хотя бы массив строк (в идеале словарь, кажется тип map или std::pair, в общем любом виде доступном для маршалинга) с именами и сигнатурами методов, которые доступны в скриптах Lua. Саму же функцию ExportMethods я буду вызывать в коде C# посредством DllImport.

Возможно, вам подойдет вот это. При запуске игры с параметром -dump_bindings весь внутренний скриптовый API экспортируется в текстовый файл в app_data_root.
Neo][
Цитата(mortan @ 15.07.2016, 01:38) *
Neo][, ну мнеб избавиться от прикола с "ambiguous access of '%name%' "

mortan, при компиляции чтоли?
mortan
Neo][, да, но я правда уже понял что это и буду переписывать код)Опять же это проблема с наследованием: например "ambiguous access of 'ID' ". Спасибо за советы, жаль не могу плюс в репу поставить)
mortan
разобрался немного - добавил для серверного объекта add_offline\online и теперь содержимое отображается если бросить контейнер на землю. Как бы это теперь сделать для отображения в инвентаре.
RayTwitty
Цитата(mortan @ 09.07.2016, 00:35) *
Я тут хочу конт для артов сделать,ибо скриптами не айс.

1) Создай производный класс от CInventoryItem, например CArtContainerItem.
2) Подключи в него CInventoryOwner.
3) Создай новый класс CSE_ArtContainerItem, по аналогии с CSE_InventoryBox.
4) Пропиши обработку CArtContainerItem в CUIInventoryWnd в контекстное меню.
5) Напиши ui-окно и вызывай его из контекстного меню инвентаря.
6) ???
7) PROFIT!
mortan
RayTwitty, уже всё сделано,прям почти как ты описал) только предметы в контейнере не видны при загрузке игры или смене локации. Добавил add_online\offline от трейдера как я вот выше написал - теперь если конт лежит на земле при загрузке локации,то предметы отображаются нормально.
mortan
мне нужно заставить контейнер при спавне в рюкзаке актора или в другом контейнере спавнить дочерние предметы и выводить их в онлайн\оффлайн)
mortan
вопрос закрыт,я нашёл решение своей проблемы)
Neo][
Цитата(mortan @ 19.07.2016, 01:36) *
вопрос закрыт,я нашёл решение своей проблемы)

mortan, поделись с другими, может кто-то ещё что-то подобное захочет реализовать smile.gif
mortan
Цитата(Neo][ @ 19.07.2016, 10:33) *

Цитата(mortan @ 19.07.2016, 01:36) *
вопрос закрыт,я нашёл решение своей проблемы)

mortan, поделись с другими, может кто-то ещё что-то подобное захочет реализовать smile.gif

оказалось что мое решение почти в точности копирует решение товарища alpet'a,вот теперь когда я знаю что делать я быстро нашёл такую же правку у него). Достаточно в паре файлов добавить две строки в фунцию:
alife_trader_abstract.cpp
CODE
void add_online_impl (CSE_ALifeDynamicObject *object, const bool &update_registries)
{
NET_Packet tNetPacket;
ClientID clientID;
clientID.set (object->alife().server().GetServerClient() ? object->alife().server().GetServerClient()->ID.value() : 0);

ALife::OBJECT_IT I = object->children.begin();
ALife::OBJECT_IT E = object->children.end();
for ( ; I != E; ++I) {
// this was for the car only
// if (*I == ai().alife().graph().actor()->ID)
// continue;
//
CSE_ALifeDynamicObject *l_tpALifeDynamicObject = ai().alife().objects().object(*I);
CSE_ALifeInventoryItem *l_tpALifeInventoryItem = smart_cast<CSE_ALifeInventoryItem*>(l_tpALifeDynamicObject);
R_ASSERT2 (l_tpALifeInventoryItem,"Non inventory item object has parent?!");
l_tpALifeInventoryItem->base()->s_flags.or(M_SPAWN_UPDATE);
CSE_Abstract *l_tpAbstract = smart_cast<CSE_Abstract*>(l_tpALifeInventoryItem);
object->alife().server().entity_Destroy(l_tpAbstract);

#ifdef DEBUG
// if (psAI_Flags.test(aiALife))
// Msg ("[LSS] Spawning item [%s][%s][%d]",l_tpALifeInventoryItem->base()->name_replace(),*l_tpALifeInventoryItem->base()->s_name,l_tpALifeDynamicObject->ID);
Msg (
"[LSS][%d] Going online [%d][%s][%d] with parent [%d][%s] on '%s'",
Device.dwFrame,
Device.dwTimeGlobal,
l_tpALifeInventoryItem->base()->name_replace(),
l_tpALifeInventoryItem->base()->ID,
object->ID,
object->name_replace(),
"*SERVER*"
);
#endif

// R_ASSERT3 (ai().level_graph().valid_vertex_id(l_tpALifeDynamicObject->m_tNodeID),"Invalid vertex for object ",l_tpALifeInventoryItem->name_replace());
l_tpALifeDynamicObject->o_Position = object->o_Position;
l_tpALifeDynamicObject->m_tNodeID = object->m_tNodeID;
object->alife().server().Process_spawn (tNetPacket,clientID,FALSE,l_tpALifeInventoryItem->base());
l_tpALifeDynamicObject->s_flags.and (u16(-1) ^ M_SPAWN_UPDATE);
l_tpALifeDynamicObject->m_bOnline = true;
if (!l_tpALifeDynamicObject->children.empty())
l_tpALifeDynamicObject->add_online(update_registries);

}

if (!update_registries)
return;

object->alife().scheduled().remove (object);
object->alife().graph().remove (object,object->m_tGraphID,false);
}

alife_dynamic_object.cpp
CODE
void CSE_ALifeInventoryBox::add_online (const bool &update_registries)
{
CSE_ALifeDynamicObjectVisual *object = (this);

NET_Packet tNetPacket;
ClientID clientID;
clientID.set (object->alife().server().GetServerClient() ? object->alife().server().GetServerClient()->ID.value() : 0);

ALife::OBJECT_IT I = object->children.begin();
ALife::OBJECT_IT E = object->children.end();
for ( ; I != E; ++I) {
CSE_ALifeDynamicObject *l_tpALifeDynamicObject = ai().alife().objects().object(*I);
CSE_ALifeInventoryItem *l_tpALifeInventoryItem = smart_cast<CSE_ALifeInventoryItem*>(l_tpALifeDynamicObject);
R_ASSERT2 (l_tpALifeInventoryItem,"Non inventory item object has parent?!");
l_tpALifeInventoryItem->base()->s_flags.or(M_SPAWN_UPDATE);
CSE_Abstract *l_tpAbstract = smart_cast<CSE_Abstract*>(l_tpALifeInventoryItem);
object->alife().server().entity_Destroy(l_tpAbstract);

#ifdef DEBUG
// if (psAI_Flags.test(aiALife))
// Msg ("[LSS] Spawning item [%s][%s][%d]",l_tpALifeInventoryItem->base()->name_replace(),*l_tpALifeInventoryItem->base()->s_name,l_tpALifeDynamicObject->ID);
Msg (
"[LSS][%d] Going online [%d][%s][%d] with parent [%d][%s] on '%s'",
Device.dwFrame,
Device.dwTimeGlobal,
l_tpALifeInventoryItem->base()->name_replace(),
l_tpALifeInventoryItem->base()->ID,
ID,
name_replace(),
"*SERVER*"
);
#endif

l_tpALifeDynamicObject->o_Position = object->o_Position;
l_tpALifeDynamicObject->m_tNodeID = object->m_tNodeID;
object->alife().server().Process_spawn (tNetPacket,clientID,FALSE,l_tpALifeInventoryItem->base());
l_tpALifeDynamicObject->s_flags.and (u16(-1) ^ M_SPAWN_UPDATE);
l_tpALifeDynamicObject->m_bOnline = true;
if (!l_tpALifeDynamicObject->children.empty())
l_tpALifeDynamicObject->add_online(update_registries);

}

CSE_ALifeDynamicObjectVisual::add_online(update_registries);
}
mortan
ещё нужно и оффлайн дописать по аналогии, правда работает и без этого, но лучше устранить потенциальную проблему чем искать и фиксить её потом.
mortan
можно как-то вывести значение fov'a в виде текста в настройках? Я прикрутил туда для него настройку,хотелось бы видеть текущее значение когда двигаешь ползунок.
RayTwitty
mortan,
Код
st:SetText(get_console():get_float("fov"))

где st - статик, в который надо выводить.
mortan
RayTwitty, ай спасибо тебе,добрый молодец)А есть ли коллбэк для изменения значения TrackBar?
RayTwitty
mortan, вроде бы есть, смотри перечисление ui_events. Или можно просто на апдейте окна.
mortan
RayTwitty, для него вызывается BUTTON_CLICKED,щас нашёл.Только как мне вызвать этот статик в другом файле?
код

вот дописал в ui_mm_opt_video это:
CODE
fov_t = xml:InitStatic ("tab_video:cap_fov", self)
handler:Register (fov_t, "fov_cap")
trk = xml:InitTrackBar ("tab_video:track_fov", self)
handler:Register (trk, "trk")

в ui_mm_opt_main.script дописал в коллбэк
CODE
self:AddCallback("trk", ui_events.BUTTON_CLICKED, self.OnFovChange, self)

далее функция:
CODE
function options_dialog:OnFovChange()
fov_cap:SetText(get_console():get_float("fov"))
end


и при изменении ползунка игра валится с ошибкой
gamedata\scripts\ui_mm_opt_main.script:167: attempt to index global 'fov_cap' (a nil value)
Что я делаю не так?

RayTwitty
Цитата(mortan @ 20.07.2016, 03:03) *
Только как мне вызвать этот статик в другом файле?

Там есть примеры работы с элементами окна в разных файлах.

Цитата(mortan @ 20.07.2016, 03:03) *
Что я делаю не так?

Написано же
Цитата
attempt to index global 'fov_cap' (a nil value)

mortan
Цитата(RayTwitty @ 20.07.2016, 03:05) *
Цитата(mortan @ 20.07.2016, 03:03) *
Только как мне вызвать этот статик в другом файле?

Там есть примеры работы с элементами окна в разных файлах.

Цитата(mortan @ 20.07.2016, 03:03) *
Что я делаю не так?

Написано же
Цитата
attempt to index global 'fov_cap' (a nil value)


я так и не понял как статик из первого вызвать. Всё равно nil value )
-StalkMen-
mortan,
fov_cap нигде не объявлен/не присвоено значение.

Можно его в self положить.
macron
Как у вас всё сложно. sad.gif ЗЫ:
RayTwitty
Цитата(macron @ 20.07.2016, 14:29) *
Как у вас всё сложно. ЗЫ:

Шкала под трекбаром одним статиком сделана или под каждое число свой?
macron
Сначала была только шкала. А цифры, каждая отдельно подгонялись и оформлялись.
RayTwitty
Цитата(macron @ 20.07.2016, 15:07) *
А цифры, каждая отдельно подгонялись и оформлялись.

Не знаю, что значит "подгонялись и оформлялись", но если сделано через один статик, то у меня плохие новости - смени разрешение biggrin.gif
macron
Цитата(RayTwitty @ 20.07.2016, 16:24) *
сделано через один статик

Через разные.

Цитата(RayTwitty @ 20.07.2016, 16:24) *
что значит "подгонялись и оформлялись",

Это когда вводишь определенный FOV, а потом под это положение бегунка подстраиваешь координаты текста с цифрами в ui_mm_opt.xml.
mortan
macron, , а нельзя ли в trackbar настроить шаг в скриптах?А то при движении ползунка меняются и тысячные знаки)
RayTwitty,я уже сделал то что хотел,спасибо за помощь,правда для статика ты не указал что нужно ещё TextControl() писать перед SetText)вот что получилось:
картинка

картинка 2

RayTwitty
Цитата(mortan @ 20.07.2016, 17:13) *
правда для статика ты не указал что нужно ещё TextControl() писать перед SetText

Это ты не указал, что работаешь на ЗП smile.gif В ТЧ никаких TextControl нет.

Цитата(mortan @ 20.07.2016, 17:13) *
а нельзя ли в trackbar настроить шаг в скриптах?

В xml есть атрибут step (если я правильно помню). В скрипты его вроде не экспортировали.

З.Ы. возможно, чтобы не округлять до десятых, можно попробовать заюзать get_string вместо get_float. Должен выдать по идее то, что пишет в консоле при вызове.
macron
Цитата(RayTwitty @ 20.07.2016, 18:34) *
В xml есть атрибут step

Да. У меня прописано так:
Цитата
track_cam_fov x="194" y="185" width="261" height="21" step="0.50"

mortan
Цитата(RayTwitty @ 20.07.2016, 17:34) *
З.Ы. возможно, чтобы не округлять до десятых, можно попробовать заюзать get_string вместо get_float. Должен выдать по идее то, что пишет в консоле при вызове.

в консоли тоже пишут тысячные доли если значение меняешь через trackbar. P.S. step в зп криво работает
Winsor
Уважаемые, помогите разобраться с проблемой при чтении нетпакетов итемов... 1.0007.
Для парсинга нетпакета использую m_netpk.
cse_alife_inventory_item - 99% процентов этих итемов , которые лежат в инвентори у ГГ - имеют num_items=0. т.е. полей ph_position, ph_rotation и иже с ними не имеют. в движке это поле заполняется только для итемов, у которых нет парента.
но у некоторого процента итемов из инвентори случайным образом (причем, неважно когда пытаюсь прочитать нетпакет - сразу после создания, спустя сейв/лоад) num_items==255 (либо 233,237) , и при попытке прочитать из скрипта update часть нетпакета
log("before "..prop.name.." "..prop.type)
ret.upd[prop.name] = this["_r_"..prop.type](pk, prop.ver)
log("after "..prop.name.." "..prop.type.." "..ret.upd[prop.name])
кусок лога

нормальный итем:
m_netpk:before num_items h8
m_netpk:after num_items h8 0
ненормальный итем (отличается от предыдущего только визуалом):
m_netpk:before num_items h8
m_netpk:after num_items h8 237
m_netpk:before ph_position f32v3
m_netpk:after ph_position f32v3 79.319160461426 -0.073549270629883 462.92010498047
m_netpk:before ph_rotation q8v16
далее - чтение за границы

получаем чтение за границу нетпакета, так как почему то num_items!=0 а полей ph_position - нет, но при этом парент у итема есть. как такое может быть? само собой - значениям в поле ph_position уже доверять нельзя. да и откуда оно у итема в инвенторе актора?
p.s. грешу, конечно, на m_netpk - поделитесь, пожалуйста, информацией, кто использует альтернативные парсеры... очень не хочется это все с нуля писать. и очень не хочется думать на какой нибуть труднонаходимый глюк движка...
Благодарю за информацию.
mortan
Winsor, можете подсказать а зачем вообще нужно читать нетпакет,разве это задача сервера/игры? Ради его изменения? Я просто не знаю практического применения этому.
mortan
понял,вопрос снимается
mortan
такой вопрос - можно ли через движок поменять значение в xml файле?Интересует именно actor_menu.xml,хочу менять кол-во ячеек в dragdrop'ах в зависимости от кое-каких условий.
Giperion
Цитата(mortan @ 26.07.2016, 15:57) *
такой вопрос - можно ли через движок поменять значение в xml файле?

Через движок можно уж если не все в системе, то по крайней мере многое. А уж какое то там значение - тем более. В движке есть класс сериализации xml, щас не вспомню правда.
RayTwitty
Цитата(mortan @ 26.07.2016, 15:57) *
можно ли через движок поменять значение в xml файле?Интересует именно actor_menu.xml,хочу менять кол-во ячеек в dragdrop'ах в зависимости от кое-каких условий.

Конечно, модифицируй CUIDragDropList (примерное название класса) на динамическое изменение.
mortan
RayTwitty, спасибо,так и сделал,но для этого пришлось убрать из xml строки с ячейками,потом уже в игре эти параметры считываются из конфига предмета)
Vampir35
Подскажите пожалуйста, как экспортировать иммунитеты для инвентарных предметов, чтобы можно было изменять их из скриптов. Или ткните куда посмотреть. Потому как с экспортом всего остального, чего не было на репозитории (sprint_allowed например) я уже разобрался.
ТЧ, репозиторий xp-dev
RayTwitty
https://github.com/Charsi82/xray-1.5.10-201...33?diff=unified
Делаю всё как здесь, выскакивает гадость:
Код
1>src\lstrlib.c(801): error C2143: синтаксическая ошибка: отсутствие ";" перед "тип"

в строчке:
Код
int res = lua_toboolean(L, arg);


Что ему не понравилось?

З.Ы. LuaJIT отсюда.
Neo][
RayTwitty, ну, если делал копипаст и ничего не потерял, и не добавил, тогда ты используешь другую версию студии/настройки компилятора, нежели автор этих строк. В си объявлять переменные можно только в начале блока, попробуй исправить так:

Код
case 'b':
            {
                int res = 0;
                luaL_checktype(L, arg, LUA_TBOOLEAN);
                res = lua_toboolean(L, arg);
                sprintf(buff, "%s", res ? "true" : "false");
                break;
            }
1001v
Цитата(Neo][ @ 29.07.2016, 10:20) *

В си объявлять переменные можно только в начале блока, попробуй исправить так:

Только в С89, по-моему.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.