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

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


Rolan

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

или находился, в зависимости от места вызова

перемещение из различных мест внутри инвентаря отслеживается без проблем

 

методы в оригинале, который бы говорил, где предмет находился до перемещения - InBelt/InRuck - используют итераторы, единственный более быстрый - это InSlot. т.е. для того чтобы определить место, где предмет был - необходимо

1) доэкспортировать методы аналогичные InBelt/InSlot/InRuck в скрипты

2) контролировать вызов калбека строго ДО удаления предмета из списков

3) забыть о асинхронных таймерах при обработке этого калбека из скрипта

4) Вам все равно придется делать вызовы калбека на перед каждым изменением положения предмета, ибо после m_ruck.erase(it); InRuck уже никак не скажет где предмет был...

 

 Возьмем например CInventory::Slot - функция помещения предмета в слот. в ней два итератора - по рюкзаку и по поясу. Причем они вызываются последовательно, а не через ИЛИ и удаление предмета это просто erase из списка (не Drop, не REJECT_PARENT). т.е. для того чтобы сказать однозначно откуда был убран предмет в моем случае надо вызвать один и тот же калбек со второй константой 

callMovingCallback(pIItem,InventoryPlaceChange::removeFromBelt);
или
callMovingCallback(pIItem,InventoryPlaceChange::removeFromRuck);

в Вашем случае, дабы разделить эти две операции и узнать однозначно где был предмет необходимо вызвать два разных калбека? Далее, помещение этого же предмета непосредственно в слот

callMovingCallback(pIItem,InventoryPlaceChange::putToSlot);

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

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


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

 

 

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

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


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

Уважаемые знающие, что нужно в движке ТЧ добавить, чтобы работал шейдер selflight на худе оружия? Изменения в рендере, или где то в худе (CHUDTarget::Render) ?

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


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

KD же фиксил на репозитории XR-DEV

Что именно? Если касаемо рендера там очень много всяких добавлений, какое из них касается шейдера самосвечения? Если худ оружия - разницы я не заметил. Я готов признать полную несостоятельность свою и пасть ниц пред знающим - но Вы конкретно знаете - что именно правилось, можете меня ткнуть? Или так - вот в каком то репозитарии кто-то что-то поправил и все у них заработало, наверное. У меня уже на 3-и листа такой информации.... :(

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

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


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

Или от какого-то другого ?

В основном UpdateCondition выполняется на главном апдейте CEntityAlive::shedule_Update. т.е. для Вашего класса , если Вы хотите использовать shedule_Update - Вам необходимо свой класс наследовать от CInventoryItemObject. CInventoryItem не имеет в предках CObject и не подходит для Вашей задачи.

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

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


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

Уважаемые знающие, а какой элемент отвечает в движке за рисование анимации приседания? как сделать более "плавное" приседание? для ТЧ
 

void CActor::g_cl_CheckControls(u32 mstate_wf, Fvector &vControlAccel, float &Jump, float dt)
...skip...
if (isActorAccelerated(mstate_wf, IsZoomAimingMode()))
{
     Crouched = character_physics_support()->movement()->ActivateBoxDynamic(1);
}
...skip...

Вот собственно "присели", но какие бы параметры я в ActivateBoxDynamic не передавал - "плавности" не добавляется... 
Спасибо за Ваши советы!

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


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

 

 

Чисто, логика: если ни чего не меняется - может не там меняешь ?
ActivateBoxDynamic - в нем происходит какая то магия с физическими координатами тела. я ж не против, что не там. а где там?

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


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

 

 

Помощь нужна: как сделать массив(таблицу) произвольного размера? Типа такого: строка = строка строка = строка строка = строка
xr_vector не подойдет - это аналог std::vector. для Вашей задачи необходимо использовать std::map - в xray аналог - xr_map. для ключей и значений можно использовать как shared_str (память выделяется один раз и храниться до тех пор пока есть хоть одна ссылка на эту строку) так и xr_string (аналог std::string).

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


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

Уважаемые , есть ли у кого распаковщик ресурсов ЛА? почему то некоторые архивы распаковываются, а некоторые нет. У меня в стандартной установке распаковываются архивы до dba - далее все с ошибкой распаковки.

Спасибо за помощь!

  • Сомнительно 1

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


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

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

Благодарю!

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


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

ТЧ 1.0007 rc1
Уважаемые знающие, подскажите место, хотя бы приблизительно - что в движке отвечает за "выбрасывание" активного предмета по kDROP?
есть некая
g_PerformDrop()/pItem->SetDropManual    (TRUE);
 - но я не увидел, где именно и чем меняются координаты объекта, что он вылетает по такой "красивой дуге".
Благодарю за информацию!

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


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

Уважаемые знающие, вопрос про серверные объекты.

создаю некий клиентский класс

class CGBox:public CInventoryItemObject

експортирую в скрипты

Скрытый текст

void CGBox::script_register(lua_State *L)
{
	module(L)
		[
			class_<CGBox, CGameObject>("CGBox")
			.def(constructor<>())
		];
}

регистрирую в class_registrator.script

cs_register(object_factory, "CGBox", "se_gbox.se_gbox", "CL_GBOX_S", "game_box_s")

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

class "se_gbox"    (cse_alife_item)

Так вот вопросы -

1) почему у меня для итема данного класса (CL_GBOX_S) в упор не хотят вызываться методы on_unregister/on_register/keep_saved_data_anyway/on_spawn ? при этом __init/STATE_Read/STATE_Write вызываются.

2) как в биндере объекта (object_binder) из скриптов "увидеть" переход offline/online? Для этого же объекта почему то из биндера не вызываются методы net_export/net_import. При переходе в офлайн вызывается net_destroy, но он же вызывается и при обычном release()

Благодарю!

p.s. зачем все это - дабы в момент перехода в оффлайн сохранить данные клиентского скриптового объекта в серверный, при онлайн - обратно.

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

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


Ссылка на сообщение
46 минут назад, Zagolski сказал:

то вешай сразу на движковый класс

что именно вешать? почему то из скриптового движкового класса не вызываются методы нужные... или я немного не понял Ваш ответ.

 

p.s. так же выяснил что, если класс наследован от CInventoryitemObject и лежит в инвентаре актора - в онлайн он не переводиться (т.е. для него не вызываются движковый метод CSE_ALifeDynamicObject::add_online)

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

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


Ссылка на сообщение
3 минуты назад, Zagolski сказал:

Не нужно ничего в скриптах регистрировать никаких классов. В движке в clsid_game.h новый класс регистрируй как какой-нибудь O_GBOX, на него в игре свой предмет и цепляй. В ТЧ для большинства так нужно делать.

До определенного момента хватало биндера (object_binder). Но приспичило мне сохранять некие данные в нетпакете класса. save/load работают , но если выбросить такой предмет на землю - то при переходе offline/online методы save/load не вызываются. т.е. задача именно из скриптов увидеть этот переход.

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


Ссылка на сообщение
14 часов назад, Дизель сказал:

включать черно-белое изображение

пост процесс, аналогично работе ПНВ. Где то на просторах интернета даже валялся (вроде на сталкерине) файлик с черно-белым постпроцессом.

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


Ссылка на сообщение
21 час назад, Карлан сказал:

по первому вопросу текстом не знаю как быстро описать

можно не быстро, главное - понять что не так.

21 час назад, Карлан сказал:

Мое хранилище умеет это делать (различать факт того, когда объект удален, от факта, когда объект просто ушел в оффлайн) , пример использования можешь в m_items.script посмотреть.

посмотрел очень внимательно. не увидел ничего, что относилось бы к проверке такого факта. Есть, конечно write_pstor, но она у Вас движковая - мне ничем не поможет. единственное что хоть как то наводит на мыслб о отличии удаляется объект или переходит в офлайн - это local sobj = sim:object(obj:id()). Хотя по коду движка серверный объект всегда удаляется позже клиентского (ну во всяком случае такая очередность удаления объекта и сообщения GE_DESTROY)... Не смог найти... :(

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


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

Уважаемые... Наверное, многие сталкивались с необходимостью изменить аи-сетку. Собственно при работе с уже существующим спавном - помогает universal_acdc -update. А что делать со скриптовым create()? Вариант - переснимать координаты - не подходит, ибо когда таких объектов 100 - это еще реально. А вот когда 9000 - это жестоко. Кто нибудь пытался облегчить решение этой проблемы со стороны движка?

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


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

Уважаемые, можно ли где то найти исходники vertex.exe , который идет в комплекте с universal_acdc? в ридми написано что использовались исходники xray_re, но в самом xray_re я такой утилиты не нашел.

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


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

1) Если у Вас компилятор поддерживает c++11 (например VS2015) - можно воспользоваться функцией std::stoi. Причем данная функция гарантированно генерирует исключение при некорректной строке ввода и Вы можете перехватить это исключение и работать далее с входящей строкой как с "нечисло".

2) Если нет поддержки c++11 - используйте функцию strtol, вторым параметром в которую передается "контрольная строка", через которую можно проверить , удалось ли преобразование или нет. Вот небольшой пример

Скрытый текст

bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &temp, 0);
    if (temp == str || *temp != '\0' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE))
        rc = false;
    return rc;
}

 

3) или же Вы можете воспользоваться банальной проверкой - вся ли входящая строка является числом.например функцией std::isdigit в цикле по символьно по story_id , либо string::find_first_not_of, либо если у Вас с++11 all_of.

 

p.s. Функция atoi чрезвычайно не рекомендуема к использованию в с++.

 

  • Спасибо 2

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


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

есть такая утилита - WinLister. Бесплатная - находите дам окно MSCTFIME UI  и нажимаете F2 . Без диспетчера задач и перезагрузки... Оставляет его IME подсистема ввода винды. Началось это с какого то апдейта винды.

  • Спасибо 1
  • Полезно 2

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


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

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