Winsor 178 Опубликовано 13 Июня 2016 Здравствуйте уважаемые. Вопрос как бы и по движку, но и как бы в Курилку. Но очень интересно, кто и как боролся с такой весчью, как циклические references непосредственно в xray. например: моя длл импортирует функции из xrLua, функции из моей длл будут импортированы в xrCore. Добавить в VS2012 references из xrCore на мою dll уже нельзя, ибо студия считает что это будет циклическая ссылка, так как xrLua имеет references на xrCore. я решал данную проблемы прямым добавлением my_dll.lib в inputs к линкеру xrCore. Но данный метод, как по мне - кривоват, и часто путает меня самого. А какое правильное решение? p.s. Хочется иметь единую dll с моим кодом для всего solution XR_3DA. в ogse.dll, если я правильно понял, переносились необходимые куски кода непосредственно из движка. если нет - поправьте пожалуйста. Спасибо за ответы! Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 16 Июня 2016 pragma once. - pragma once позволяет решить циклические ссылки при компиляции. а при линковке как можно обойти данную проблему?lib1 exports func1 lib2 exports struct2 lib2 uses func1 lib3 uses func1 , struct2 in func3 lib3 exports func3 lib1 uses func3 и усе насколько я понимаю - придется скопировать код struct2 и/или func1 в lib3 , дабы разорвать циклическую компиляцию и линковку... Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 27 Июня 2016 возьми на stalkerin.gameru.net для 2008, отконвертируй для 2015, внеси правки в исходный код для поддержки 2015 - и у тебя будет своя версия для vs2015... какие именно изменения в коде - базовые со статьи на сталкерине, а дальше - как не странно , если установлен reshaper - он подскажет... 1 Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 8 Августа 2016 Уважаемые, подскажите пожалуйста, если движком спавниться объект с именем, состоящим только из названия секции - это что означает? Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 19 Августа 2016 @Winsor, это значит, что это первый объект вообще в игре с такой секцией. у меня такое у торговцев в инвентаре... навряд ли они первые Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 19 Сентября 2016 Уважаемые, каким образом заставить движок перечитать некий скрипт с диска? Передается на выполнение таким образом: ai().script_engine().script_process(ScriptEngine::eScriptProcessorLevel)->add_script("test.testfunc()",true,true); единственное, что заставило перечитать содержимое test.script - это вызов из скриптов _G.test=nil. Но это уж как то через левое плечо. Как именно с движка сделать аналог _G.test=nil? Благодарю! Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 19 Сентября 2016 Никак не пойму зачем это делать в движке, код в принципе будет идентичен, тебе надо (необязательно, но рекомендую) будет написать что в скриптах что в движке функцию для перегрузки файлов в целом (для луа, хотя необязательно), а не только тех, с которым работает движок, причем что этот функционал можно и расширить на предмет выгрузки/загрузки несуществующих модулей. А так у тебя код некорректный, script_process здесь не нужен, тебе надо либо выставить флаг, либо грохнуть поле на стеке. Я бы пошел вторым вариантом. пытаюсь придумать некую стандартную функцию для обновления скрипта с диска. делаю в движке - чтобы не зависеть от скриптовой реализации. например - я могу иметь два скрипта, в test2.script делать G._test=nil и иметь test.script с постоянно "свежим" содержимым.на лицо - избыточность, как по мне. вот вопрос о такой функции именно движковой. если в скрипте я понимаю что делать что надо , то со стороны движка - даже не представляю. А почему код не корректный? я таким образом отправляю на выполнение кусок кода. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 19 Сентября 2016 В том то и дело - пробовал process_file(module, true) - не перегружается. А зачем в движок - как всегда воспаленный разум подсказал идею постоянно запущенной игры как некого эмулятора жизни, на который можно влиять, поменяв в одном скрипте одну строчку, не перегружая игру. т.е. движок читает один и тот же файл, с набором инструкций, меняя его в онлайне - я управляю процессом.конечный игрок не имеет влияния на мир, только как наблюдатель. я понимаю - бред. но... Можешь себе выковырять из моего проекта, когда он выйдет. - это Prosectors Project? Желаю Вам выпуститься , и не только для того чтобы выковырять а просто потому что годные вещи должны увидеть свет. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 20 Сентября 2016 Можете подсказать в чём может быть проблема и как её можно решить - у тебя только два варианта1) медленный - откатывать свои правки по одной , собирать движок, запускать. так ты сможешь найти - что убивает с такой ошибкой движок 2) более быстрый - собрать debug версию движка, и запустить его, например, из под visula studio - так ты сможешь увидеть и стек вызовов при ошибке, и состояние переменных. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 21 Сентября 2016 Уважаемые, как итему в инвентаре ГГ сменить цвет бакгроунда? ТЧ 1.0007 Ничего умнее CurrentItem()->SetMask(frame_window) с прозрачной текстурой, или текстурой без _back (типа рамочка по краям)... Но коряво это все... и не красиво. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 23 Сентября 2016 (изменено) Winsor, оно? - да, оно. о великий господин, бью челом - скажите хотя бы в каком файле эти изменения делались ? Пока я отказался от дополнительного статика самого нижнего. Вникаю в CUICellContainer::Draw(). пока не сильно получается У Вас это сделано движком? или внешним скриптом? Изменено 23 Сентября 2016 пользователем Winsor Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 28 Октября 2016 одна функция CalculateTriangle - так а чем закончился Ваш поиск решения? 1 1 Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 1 Ноября 2016 @Карлан, с самим CUIInventoryCellItem ничего странного нету. а вот в CUICellItem есть подозрение, что очень много времени занимает построение списка чилдов (PushChild/PopChild). У Вас 200 итемов разных, или группируются по каким либо признакам? Ну и зависит, с какого окна это все вызвали - как по мне, просто CUIInventoryWnd работает быстрее, чем CUITradeWnd. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 21 Ноября 2016 (изменено) 1. убрать безлимит и сделать всего одну ячейку размером на весь инвентарь (можно с надписью "СПИНА") по аналогии с оружейными слотами (по сути инвентарь превратится в третий слот для единственного предмета - рюкзака, а при попытке положить предмет другого типа или еще один предмет - аналогия с оружейными слотами, вещь просто возвращается на место. все что написано далее - относиться к ТЧ. Количество ячеек не влияет на количество итемов в них. есть класс CUIDragDropListEx (на нем реализован любое визуальное отображение итемов в инвентаре)- ему все равно, сколько в нем ячеек прорисовано. хоть один итем на 5х5 ячеек. т.е. контролировать количество CUICellItem-ов в одном отдельно взятом CUIDragDropListEx - это задача не CUICellItem. Посмотрите, как реализована функция CUIInventoryWnd::ToSlot - вот там ответ на Ваш вопрос - "аналогия с оружейными слотами, вещь просто возвращается на место". реализация самого рюкзака на спине - 1) это отдельное окно, опять таки с CUIDragDropListEx 2) у того же CUIDragDropListEx его заполнение выполняется с помощью цепочки SetItem - в нем Вы сможете по каким либо признакам разрешать или запрещать добавлять итемы в CUICellContainer. Получить CInventoryItem с CUICellItem можно по полю m_pData 3) отображение в рюкзаке - я бы добавил для CUICellItem какой нибудь признак, отображать ли его в инвентаре, или в рюкзаке. единственное - надо выбрать либо из существующих, что сохраняются в сейве, либо добавить в класс CInventoryItem свой признак. я бы использовал m_eItemPlace - он сохраняется в сейве и подходит для такой задачи. Изменено 21 Ноября 2016 пользователем Winsor 1 1 Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 23 Ноября 2016 право на жизнь и даже реализуема - Да, почему нет. классы необходимые для этого есть. единственная проблема, над которой я сейчас размышляю - это научить CUIDragDropListEx принимать в себя не InventoryItems, а просто визуал объекта, секцию. спицифическое такое желание. Подходит ли это для ЗП? скорее всего да, разницы в классах я не изучал, но не думаю что очень сильно различаются. Можно ли такое сделать если принудительно в оффлайн\онлайн отправить - все зависит от того как Вы храните информацию о апгрейдах. в идеале - это отдельный список, который можно обнулять, и на основании которого у Вас применяются какие то свойства. если это отдельные поля объектов - то проще придумать наследуемую функцию, которая обнуляет эти параметры в своем классе и вызывает inherited. так что от архитектуры зависит. Иногда и отдельные функции под каждое свойство - проще чем то что я написал. 1 Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 24 Ноября 2016 писать обратный код либо спавнить новый итем учтите только что большинство классов построены с атрибутом nocopyable, поэтому просто воспользоваться клонированием нельзя, надо писать свои методы переноса свойств старого итема на новый. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 30 Ноября 2016 (изменено) но тут свой разделитель задать нельзя. почему нельзя??? _GetItem (cmd_line,i,m_params,'/'); в то же движке обычным поиском. для std::string есть функция erase. // string::erase #include <iostream> #include <string> int main () { std::string str ("This is an example sentence."); std::cout << str << '\n'; // "This is an example sentence." str.erase (10,8); // ^^^^^^^^ std::cout << str << '\n'; // "This is an sentence." str.erase (str.begin()+9); // ^ std::cout << str << '\n'; // "This is a sentence." str.erase (str.begin()+5, str.end()-9); // ^^^^^ std::cout << str << '\n'; // "This sentence." return 0; } Изменено 30 Ноября 2016 пользователем Winsor Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 13 Декабря 2016 Товарищи... каким образом из окна инвентаря CUIInventoryWnd можно перезарядить неактивное оружие? которое стоит в слоте? CUIGameSP* pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame()); pGameSP->InventoryMenu->GetHolder()->StartStopMenu(pGameSP->InventoryMenu,true); //прячем окно инвентаря m_pInv->ProcessSlotAction(true,weapon->GetSlot()); //делаем активным слот с оружием //а дальше магия - оружие достается, но не играет ни анимация, ни идет перезарядка. //не работает так m_pInv->Items_SetCurrentEntityHud(true); weapon->Action(kWPN_RELOAD, CMD_START); //или так CHudItem* pHudItem = smart_cast<CHudItem*>(m_pInv->ActiveItem()); if (pHudItem) { pHudItem->OnStateSwitch(CWeapon::eReload); }; //или так weapon->OnStateSwitch(CWeapon::eReload); //или так weapon->SetState(CWeapon::eReload); //или так weapon->Reload(); если после активации оружия в слоте (оно разряжено) нажать выстрел, зайти/выйти в главное меню - то CWeapon::eReload состояние применяется... а как сделать это кодом? Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 28 Декабря 2016 В ТЧ 1.0007 hud_adjust_mode аналогично используется только в debug версии движка. Ка пользоваться? Собрать движок в debug configuration, с консоли сказать , например, hud_adjust_mode 1. Более подробно о этом режиме в файле xr_3da\xrGame\ui\UIMainIngameWnd.cpp, как сохранять - разбираться там же. сам параметр сохраняется в user.ltx. Поделиться этим сообщением Ссылка на сообщение
Winsor 178 Опубликовано 10 Января 2017 Не надо никакой таблички. просто нужно в нескольких местах сделать правильные вызовы калбека. Для ТЧ 1.0007 1) CInventory::Slot здесь, например, у меня сразу 3-и вызова калбека - перемещение из пояса,перемещение из рюкзака, перемещение в слот 2)CInventory::Belt - перемещение из слота, перемещение из рюкзака, перемещение на пояс 3) CInventory::Ruck - перемещение из слота, перемещение из пояса, перемещение в рюкзак 4) CInventory::Eat - перемещение из рюкзака в результате это выглядит как вызов одного и того же калбека с двумя параметрами - итем и константа, говорящая что с ним произошло. для скрипта - это прицепленый калбек для любого НПС (в том числе и для актора) с проверкой на второй параметр. p.s. Ну раз тема "Редактирование движка" - то понятно, что это все делается при наличии исходников. В каких либо других вариантах (отдельные патчи exe) - это может быть реализовано по другому. 2 Поделиться этим сообщением Ссылка на сообщение