Все посты %s в %S - AMK Team
Перейти к контенту

Редактирование движка X-Ray


Rolan

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

Здравствуйте уважаемые.

Вопрос как бы и по движку, но и как бы в Курилку. Но очень интересно, кто и как боролся с такой весчью, как циклические references непосредственно в xray. например:

моя длл импортирует функции из xrLua, функции из моей длл будут импортированы в xrCore. Добавить в VS2012 references из xrCore на мою dll уже нельзя, ибо студия считает что это будет циклическая ссылка, так как xrLua имеет references на xrCore. я решал данную проблемы прямым добавлением my_dll.lib в inputs к линкеру xrCore. Но данный метод, как по мне - кривоват, и часто путает меня самого. А какое правильное решение?

 

p.s. Хочется иметь единую dll с моим кодом для всего solution XR_3DA. в ogse.dll, если я правильно понял, переносились необходимые куски кода непосредственно из движка. если нет - поправьте пожалуйста.

Спасибо за ответы!

Поделиться этим сообщением


Ссылка на сообщение

 

 

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 , дабы разорвать циклическую компиляцию и линковку...

Поделиться этим сообщением


Ссылка на сообщение

возьми на stalkerin.gameru.net для 2008, отконвертируй для 2015, внеси правки в исходный код для поддержки 2015 - и у тебя будет своя версия для vs2015... какие именно изменения в коде - базовые со статьи на сталкерине, а дальше - как не странно , если установлен reshaper - он подскажет...

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

Уважаемые, подскажите пожалуйста, если движком спавниться объект с именем, состоящим только из названия секции  - это что означает? 

Поделиться этим сообщением


Ссылка на сообщение

@Winsor, это значит, что это первый объект вообще в игре с такой секцией.

у меня такое у торговцев в инвентаре... навряд ли они первые :)

Поделиться этим сообщением


Ссылка на сообщение

Уважаемые, каким образом заставить движок перечитать некий скрипт с диска? 

Передается на выполнение таким образом:

ai().script_engine().script_process(ScriptEngine::eScriptProcessorLevel)->add_script("test.testfunc()",true,true);

единственное, что заставило перечитать содержимое test.script - это вызов из скриптов _G.test=nil. Но это уж как то через левое плечо. Как именно с движка сделать аналог _G.test=nil?

Благодарю!

Поделиться этим сообщением


Ссылка на сообщение

Никак не пойму зачем это делать в движке, код в принципе будет идентичен, тебе надо (необязательно, но рекомендую) будет написать что в скриптах что в движке функцию для перегрузки файлов в целом (для луа, хотя необязательно), а не только тех, с которым работает движок, причем что этот функционал можно и расширить на предмет выгрузки/загрузки несуществующих модулей. А так у тебя код некорректный, script_process здесь не нужен, тебе надо либо выставить флаг, либо грохнуть поле на стеке. Я бы пошел вторым вариантом.

пытаюсь придумать некую стандартную функцию для обновления скрипта с диска. делаю в движке - чтобы не зависеть от скриптовой реализации. например - я могу иметь два скрипта, в test2.script делать G._test=nil и иметь test.script с постоянно "свежим" содержимым.на лицо - избыточность, как по мне. вот вопрос о такой функции именно движковой. если в скрипте я понимаю что делать что надо , то со стороны движка - даже не представляю. 

А почему код не корректный? я таким образом отправляю на выполнение кусок кода. 

Поделиться этим сообщением


Ссылка на сообщение

В том то и дело - пробовал process_file(module, true) - не перегружается.

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

 

 

Можешь себе выковырять из моего проекта, когда он выйдет.
- это Prosectors Project? Желаю Вам выпуститься , и не только для того чтобы выковырять :) а просто потому что годные вещи должны увидеть свет.

Поделиться этим сообщением


Ссылка на сообщение

 

 

Можете подсказать в чём может быть проблема и как её можно решить
- у тебя только два варианта

1) медленный - откатывать свои правки по одной , собирать движок, запускать. так ты сможешь найти - что убивает с такой ошибкой движок

2) более быстрый - собрать debug версию движка, и запустить его, например, из под visula studio - так ты сможешь увидеть и стек вызовов при ошибке, и состояние переменных.

Поделиться этим сообщением


Ссылка на сообщение

Уважаемые, как итему в инвентаре ГГ сменить цвет бакгроунда? ТЧ 1.0007 

Ничего умнее CurrentItem()->SetMask(frame_window) с прозрачной текстурой, или текстурой без _back (типа рамочка по краям)... Но коряво это все... и не красиво. 

Поделиться этим сообщением


Ссылка на сообщение
Winsor, оно?

- да, оно. о великий господин, бью челом - скажите хотя бы в каком файле эти изменения делались :)? Пока я отказался от дополнительного статика самого нижнего. Вникаю в CUICellContainer::Draw(). пока не сильно получается :)

У Вас это сделано движком? или внешним скриптом?

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

одна функция CalculateTriangle
- так а чем закончился Ваш поиск решения?
  • Согласен 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

@Карлан, с самим CUIInventoryCellItem ничего странного нету. а вот в CUICellItem есть подозрение, что очень много времени занимает построение списка чилдов (PushChild/PopChild). У Вас 200 итемов разных, или группируются по каким либо признакам? Ну и зависит, с какого окна это все вызвали - как по мне, просто CUIInventoryWnd работает быстрее, чем CUITradeWnd.

Поделиться этим сообщением


Ссылка на сообщение
1. убрать безлимит и сделать всего одну ячейку размером на весь инвентарь (можно с надписью "СПИНА") по аналогии с оружейными слотами (по сути инвентарь превратится в третий слот для единственного предмета - рюкзака, а при попытке положить предмет другого типа или еще один предмет - аналогия с оружейными слотами, вещь просто возвращается на место.

все что написано далее - относиться к ТЧ.

Количество ячеек не влияет на количество итемов в них. есть класс CUIDragDropListEx (на нем реализован любое визуальное отображение итемов в инвентаре)- ему все равно, сколько в нем ячеек прорисовано. хоть один итем на 5х5 ячеек. т.е. контролировать количество CUICellItem-ов в одном отдельно взятом CUIDragDropListEx - это задача не CUICellItem. Посмотрите, как реализована функция CUIInventoryWnd::ToSlot - вот там ответ на Ваш вопрос - "аналогия с оружейными слотами, вещь просто возвращается на место".

реализация самого рюкзака на спине - 

1) это отдельное окно, опять таки с CUIDragDropListEx 

2) у того же CUIDragDropListEx  его заполнение выполняется с помощью цепочки SetItem - в нем Вы сможете по каким либо признакам разрешать или запрещать добавлять итемы в CUICellContainer. Получить CInventoryItem с CUICellItem можно по полю m_pData

3) отображение в рюкзаке - я бы добавил для CUICellItem какой нибудь признак, отображать ли его в инвентаре, или в рюкзаке. единственное - надо выбрать либо из существующих, что сохраняются в сейве, либо добавить в класс CInventoryItem свой признак. я бы использовал m_eItemPlace - он сохраняется в сейве и подходит для такой задачи. 

Изменено пользователем Winsor
  • Спасибо 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

право на жизнь и даже реализуема
- Да, почему нет. классы необходимые для этого есть. единственная проблема, над которой я сейчас размышляю - это научить CUIDragDropListEx принимать в себя не InventoryItems, а просто визуал объекта, секцию. спицифическое такое желание. :)

Подходит ли это для ЗП? скорее всего да, разницы в классах я не изучал, но не думаю что очень сильно различаются.

 

 

Можно ли такое сделать если принудительно в оффлайн\онлайн отправить
- все зависит от того как Вы храните информацию о апгрейдах. в идеале - это отдельный список, который можно обнулять, и на основании которого у Вас применяются какие то свойства. если это отдельные поля объектов - то проще придумать наследуемую функцию, которая обнуляет эти параметры в своем классе и вызывает inherited. так что от архитектуры зависит. Иногда и отдельные функции под каждое свойство - проще чем то что я написал.
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

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

Поделиться этим сообщением


Ссылка на сообщение
но тут свой разделитель задать нельзя.

почему нельзя???

_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;
}

 

 

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

Поделиться этим сообщением


Ссылка на сообщение

Товарищи... каким образом из окна инвентаря 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 состояние применяется... а как сделать это кодом?

Поделиться этим сообщением


Ссылка на сообщение

В ТЧ 1.0007 hud_adjust_mode аналогично используется только в debug версии движка. Ка пользоваться? Собрать движок в debug configuration, с консоли сказать , например, hud_adjust_mode 1. Более подробно о этом режиме в файле xr_3da\xrGame\ui\UIMainIngameWnd.cpp, как сохранять - разбираться там же. сам параметр сохраняется в user.ltx.

Поделиться этим сообщением


Ссылка на сообщение

Не надо никакой таблички. просто нужно в нескольких местах сделать правильные вызовы калбека. Для ТЧ 1.0007

1) CInventory::Slot

здесь, например, у меня сразу 3-и вызова калбека - перемещение из пояса,перемещение из рюкзака, перемещение в слот

2)CInventory::Belt - перемещение из слота, перемещение из рюкзака, перемещение на пояс

3) CInventory::Ruck  - перемещение из слота, перемещение из пояса, перемещение в рюкзак

4) CInventory::Eat  - перемещение из рюкзака

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

p.s. Ну раз тема "Редактирование движка" - то понятно, что это все делается при наличии исходников. В каких либо других вариантах (отдельные патчи exe)  - это может быть реализовано по другому.

  • Нравится 2

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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